Skip to content

Commit d855678

Browse files
committed
Evaluate the desired badge for an achievement via a whitelist. Don't generate the class via direct string parameter
1 parent 9850591 commit d855678

File tree

2 files changed

+24
-10
lines changed

2 files changed

+24
-10
lines changed

app/controllers/achievements_controller.rb

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,26 @@ class AchievementsController < ApplicationController
66
respond_to :json, only: [:award]
77

88
def show
9-
@badge = Badge.find(params[:id])
9+
show_achievements_params = params.permit(:id, :username)
10+
11+
@badge = Badge.find(show_achievements_params[:id])
1012
@user = @badge.user
11-
return redirect_to(destination_url) if @badge && @user.username.downcase != params[:username].downcase
13+
return redirect_to(destination_url) if @badge && @user.username.downcase != show_achievements_params[:username].downcase
1214
end
1315

1416
def award
15-
provider = (User::LINKABLE_PROVIDERS & params.keys).first
17+
18+
award_params = params.permit(:badge, :twitter, :linkedin, :github, :date)
19+
20+
provider = pick_a_provider(award_params)
1621

1722
if provider.nil?
1823
render_404
1924
else
20-
if @api_access.can_award?(params[:badge])
21-
user = User.with_username(params[provider], provider)
22-
badge = params[:badge].constantize.new(user, Date.strptime(params[:date], '%m/%d/%Y'))
23-
badge.generate_fact!(params[:badge], params[provider], provider)
25+
if @api_access.can_award?(award_params[:badge])
26+
user = User.with_username(award_params[provider], provider)
27+
badge = badge_class_factory(award_params[:badge].to_s).new(user, Date.strptime(award_params[:date], '%m/%d/%Y'))
28+
badge.generate_fact!(award_params[:badge], award_params[provider], provider)
2429
unless user.nil?
2530
user.award_and_add_skill badge
2631
user.save!
@@ -35,11 +40,18 @@ def award
3540
end
3641

3742
private
43+
3844
def ensure_valid_api_key
39-
@api_key = params[:api_key]
45+
@api_key = params.permit(:api_key)[:api_key]
4046
@api_access = ApiAccess.for(@api_key) unless @api_key.nil?
4147
return render json: { message: "no/invalid api_key provided. get your api_key from coderwall.com/settings" }.to_json if @api_access.nil?
4248
end
4349

50+
def badge_class_factory(requested_badge_name)
51+
BADGES_LIST.select { |badge_name| badge_name == requested_badge_name }.first.constantize
52+
end
4453

45-
end
54+
def pick_a_provider(award_params)
55+
(User::LINKABLE_PROVIDERS & award_params.keys.select { |key| %w{twitter linkedin github}.include?(key) }).first
56+
end
57+
end

config/initializers/badges.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,6 @@
22

33
dynamic_badges.each do |klass|
44
klass.constantize.load_badges
5-
end
5+
end
6+
7+
BADGES_LIST ||= ObjectSpace.enum_for(:each_object, class << BadgeBase; self; end).map(&:to_s) - %w{BadgeBase}

0 commit comments

Comments
 (0)