Commit 54594ab9 authored by Niko's avatar Niko Committed by Michael Kozono

Lookup for users in LDAP based on their e-mail by their e-mail-address instead of only uid.

parent 1ea531ad
---
title: "Allow OAuth to auto link LDAP users via email address"
merge_request: 33767
author: Niko Wenselowski
type: changed
...@@ -150,6 +150,7 @@ module Gitlab ...@@ -150,6 +150,7 @@ module Gitlab
def find_ldap_person(auth_hash, adapter) def find_ldap_person(auth_hash, adapter)
Gitlab::Auth::Ldap::Person.find_by_uid(auth_hash.uid, adapter) || Gitlab::Auth::Ldap::Person.find_by_uid(auth_hash.uid, adapter) ||
Gitlab::Auth::Ldap::Person.find_by_email(auth_hash.uid, adapter) || Gitlab::Auth::Ldap::Person.find_by_email(auth_hash.uid, adapter) ||
Gitlab::Auth::Ldap::Person.find_by_email(auth_hash.email, adapter) ||
Gitlab::Auth::Ldap::Person.find_by_dn(auth_hash.uid, adapter) Gitlab::Auth::Ldap::Person.find_by_dn(auth_hash.uid, adapter)
rescue Gitlab::Auth::Ldap::LdapConnectionError rescue Gitlab::Auth::Ldap::LdapConnectionError
nil nil
......
...@@ -230,6 +230,7 @@ RSpec.describe Gitlab::Auth::OAuth::User do ...@@ -230,6 +230,7 @@ RSpec.describe Gitlab::Auth::OAuth::User do
end end
context "and no account for the LDAP user" do context "and no account for the LDAP user" do
context 'when the LDAP user is found by UID' do
before do before do
allow(Gitlab::Auth::Ldap::Person).to receive(:find_by_uid).and_return(ldap_user) allow(Gitlab::Auth::Ldap::Person).to receive(:find_by_uid).and_return(ldap_user)
...@@ -266,6 +267,22 @@ RSpec.describe Gitlab::Auth::OAuth::User do ...@@ -266,6 +267,22 @@ RSpec.describe Gitlab::Auth::OAuth::User do
end end
end end
context 'when the LDAP user is found by email address' do
before do
allow(Gitlab::Auth::Ldap::Person).to receive(:find_by_uid).and_return(nil)
allow(Gitlab::Auth::Ldap::Person).to receive(:find_by_email).with(uid, any_args).and_return(nil)
allow(Gitlab::Auth::Ldap::Person).to receive(:find_by_email).with(info_hash[:email], any_args).and_return(ldap_user)
oauth_user.save
end
it 'creates the LDAP identity' do
identities_as_hash = gl_user.identities.map { |id| { provider: id.provider, extern_uid: id.extern_uid } }
expect(identities_as_hash).to include({ provider: 'ldapmain', extern_uid: dn })
end
end
end
context "and LDAP user has an account already" do context "and LDAP user has an account already" do
let!(:existing_user) { create(:omniauth_user, name: 'John Doe', email: 'john@example.com', extern_uid: dn, provider: 'ldapmain', username: 'john') } let!(:existing_user) { create(:omniauth_user, name: 'John Doe', email: 'john@example.com', extern_uid: dn, provider: 'ldapmain', username: 'john') }
...@@ -791,7 +808,7 @@ RSpec.describe Gitlab::Auth::OAuth::User do ...@@ -791,7 +808,7 @@ RSpec.describe Gitlab::Auth::OAuth::User do
end end
end end
describe '.find_by_uid_and_provider' do describe '._uid_and_provider' do
let!(:existing_user) { create(:omniauth_user, extern_uid: 'my-uid', provider: 'my-provider') } let!(:existing_user) { create(:omniauth_user, extern_uid: 'my-uid', provider: 'my-provider') }
it 'normalizes extern_uid' do it 'normalizes extern_uid' do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment