Navigation Menu

Skip to content

Commit

Permalink
SECURITY: Users can pick non-avatar uploads.
Browse files Browse the repository at this point in the history
  • Loading branch information
tgxworld committed Dec 18, 2018
1 parent 899caf3 commit 5c2e194
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 16 deletions.
8 changes: 1 addition & 7 deletions lib/guardian/user_guardian.rb
Expand Up @@ -3,19 +3,13 @@ module UserGuardian

def can_pick_avatar?(user_avatar, upload)
return false unless self.user

return true if is_admin?

# can always pick blank avatar
return true if !upload

return true if user_avatar.contains_upload?(upload.id)
return true if upload.user_id == user_avatar.user_id || upload.user_id == user.id

UserUpload.exists?(
upload_id: upload.id,
user_id: [upload.user_id, user.id]
)
UserUpload.exists?(upload_id: upload.id, user_id: user.id)
end

def can_edit_user?(user)
Expand Down
23 changes: 14 additions & 9 deletions spec/components/guardian/user_guardian_spec.rb
Expand Up @@ -14,8 +14,8 @@
Fabricate.build(:admin, id: 3)
end

let :user_avatar do
UserAvatar.new(user_id: user.id)
let(:user_avatar) do
Fabricate(:user_avatar, user: user)
end

let :users_upload do
Expand Down Expand Up @@ -54,19 +54,24 @@
it "can not set uploads not owned by current user" do
expect(guardian.can_pick_avatar?(user_avatar, users_upload)).to eq(true)
expect(guardian.can_pick_avatar?(user_avatar, already_uploaded)).to eq(true)

UserUpload.create!(
upload_id: not_my_upload.id,
user_id: not_my_upload.user_id
)

expect(guardian.can_pick_avatar?(user_avatar, not_my_upload)).to eq(false)
expect(guardian.can_pick_avatar?(user_avatar, nil)).to eq(true)
end

it "can handle uploads that are associated but not directly owned" do
yes_my_upload = not_my_upload
UserUpload.create!(upload_id: yes_my_upload.id, user_id: user_avatar.user_id)
expect(guardian.can_pick_avatar?(user_avatar, yes_my_upload)).to eq(true)

UserUpload.destroy_all
UserUpload.create!(
upload_id: not_my_upload.id,
user_id: user_avatar.user_id
)

UserUpload.create!(upload_id: yes_my_upload.id, user_id: yes_my_upload.user_id)
expect(guardian.can_pick_avatar?(user_avatar, yes_my_upload)).to eq(true)
expect(guardian.can_pick_avatar?(user_avatar, not_my_upload))
.to eq(true)
end
end

Expand Down

0 comments on commit 5c2e194

Please sign in to comment.