Skip to content
Snippets Groups Projects
Commit 1d3889eb authored by Patricio Cano's avatar Patricio Cano
Browse files

Fix identity and user retrieval when special characters are used

parent 1cf45407
No related branches found
No related tags found
No related merge requests found
Loading
Loading
@@ -12,6 +12,7 @@
 
class Identity < ActiveRecord::Base
include Sortable
include CaseSensitivity
belongs_to :user
 
validates :provider, presence: true
Loading
Loading
Loading
Loading
@@ -14,7 +14,7 @@ module Gitlab
# LDAP distinguished name is case-insensitive
identity = ::Identity.
where(provider: provider).
where('lower(extern_uid) = ?', uid.mb_chars.downcase.to_s).last
iwhere(extern_uid: uid.mb_chars.to_s).last
identity && identity.user
end
end
Loading
Loading
@@ -31,7 +31,7 @@ module Gitlab
 
def find_by_uid_and_provider
self.class.find_by_uid_and_provider(
auth_hash.uid.downcase, auth_hash.provider)
auth_hash.uid, auth_hash.provider)
end
 
def find_by_email
Loading
Loading
Loading
Loading
@@ -64,7 +64,7 @@ module Gitlab
 
# If a corresponding person exists with same uid in a LDAP server,
# set up a Gitlab user with dual LDAP and Omniauth identities.
if user = Gitlab::LDAP::User.find_by_uid_and_provider(ldap_person.dn.downcase, ldap_person.provider)
if user = Gitlab::LDAP::User.find_by_uid_and_provider(ldap_person.dn, ldap_person.provider)
# Case when a LDAP user already exists in Gitlab. Add the Omniauth identity to existing account.
user.identities.build(extern_uid: auth_hash.uid, provider: auth_hash.provider)
else
Loading
Loading
Loading
Loading
@@ -42,6 +42,21 @@ describe Gitlab::LDAP::User, lib: true do
end
end
 
describe '.find_by_uid_and_provider' do
it 'retrieves the correct user' do
special_info = {
name: 'John Åström',
email: 'john@example.com',
nickname: 'jastrom'
}
special_hash = OmniAuth::AuthHash.new(uid: 'CN=John Åström,CN=Users,DC=Example,DC=com', provider: 'ldapmain', info: special_info)
special_chars_user = described_class.new(special_hash)
user = special_chars_user.save
expect(described_class.find_by_uid_and_provider(special_hash.uid, special_hash.provider)).to eq user
end
end
describe :find_or_create do
it "finds the user if already existing" do
create(:omniauth_user, extern_uid: 'my-uid', provider: 'ldapmain')
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment