Adapt tests to refactoring

- Use smarter instance methods
- Support multiple LDAP servers
parent 4ef74844
...@@ -6,19 +6,19 @@ ...@@ -6,19 +6,19 @@
module Gitlab module Gitlab
module LDAP module LDAP
class Access class Access
attr_reader :adapter, :provider attr_reader :adapter, :provider, :user, :ldap_user
def self.open(provider, &block) def self.open(user, &block)
Gitlab::LDAP::Adapter.open(provider) do |adapter| Gitlab::LDAP::Adapter.open(user.provider) do |adapter|
block.call(self.new(provider, adapter)) block.call(self.new(user, adapter))
end end
end end
def self.allowed?(user) def self.allowed?(user)
self.open(user.provider) do |access| self.open(user) do |access|
if access.allowed?(user) if access.allowed?
access.update_permissions(user) access.update_permissions
access.update_email(user) access.update_email
user.last_credential_check_at = Time.now user.last_credential_check_at = Time.now
user.save user.save
true true
...@@ -28,12 +28,13 @@ module Gitlab ...@@ -28,12 +28,13 @@ module Gitlab
end end
end end
def initialize(provider, adapter=nil) def initialize(user, adapter=nil)
@provider = provider
@adapter = adapter @adapter = adapter
@user = user
@provider = user.provider
end end
def allowed?(user) def allowed?
if Gitlab::LDAP::Person.find_by_dn(user.extern_uid, adapter) if Gitlab::LDAP::Person.find_by_dn(user.extern_uid, adapter)
!Gitlab::LDAP::Person.disabled_via_active_directory?(user.extern_uid, adapter) !Gitlab::LDAP::Person.disabled_via_active_directory?(user.extern_uid, adapter)
else else
...@@ -47,31 +48,28 @@ module Gitlab ...@@ -47,31 +48,28 @@ module Gitlab
@adapter ||= Gitlab::LDAP::Adapter.new(provider) @adapter ||= Gitlab::LDAP::Adapter.new(provider)
end end
def get_ldap_user(user) def ldap_user
@ldap_user ||= Gitlab::LDAP::Person.find_by_dn(user.extern_uid, adapter) @ldap_user ||= Gitlab::LDAP::Person.find_by_dn(user.extern_uid, adapter)
end end
def update_permissions(user) def update_permissions
if sync_ssh_keys? if sync_ssh_keys?
update_ssh_keys(user) update_ssh_keys
end end
# Skip updating group permissions # Skip updating group permissions
# if instance does not use group_base setting # if instance does not use group_base setting
return true unless group_base.present? return true unless group_base.present?
update_ldap_group_links(user) update_ldap_group_links
if admin_group.present? if admin_group.present?
update_admin_status(user) update_admin_status
end end
end end
# Update user ssh keys if they changed in LDAP # Update user ssh keys if they changed in LDAP
def update_ssh_keys(user) def update_ssh_keys
# Get LDAP user entry
ldap_user = get_ldap_user(user)
user.keys.ldap.where.not(key: ldap_user.ssh_keys).each do |deleted_key| user.keys.ldap.where.not(key: ldap_user.ssh_keys).each do |deleted_key|
Rails.logger.info "#{self.class.name}: removing LDAP SSH key #{deleted_key.key} from #{user.name} (#{user.id})" Rails.logger.info "#{self.class.name}: removing LDAP SSH key #{deleted_key.key} from #{user.name} (#{user.id})"
unless deleted_key.destroy unless deleted_key.destroy
...@@ -81,7 +79,7 @@ module Gitlab ...@@ -81,7 +79,7 @@ module Gitlab
(ldap_user.ssh_keys - user.keys.ldap.pluck(:key)).each do |key| (ldap_user.ssh_keys - user.keys.ldap.pluck(:key)).each do |key|
Rails.logger.info "#{self.class.name}: adding LDAP SSH key #{key.inspect} to #{user.name} (#{user.id})" Rails.logger.info "#{self.class.name}: adding LDAP SSH key #{key.inspect} to #{user.name} (#{user.id})"
new_key = LDAPKey.new(title: "LDAP - #{ldap_config['sync_ssh_keys']}", key: key) new_key = LDAPKey.new(title: "LDAP - #{ldap_config.ssh_sync_key}", key: key)
new_key.user = user new_key.user = user
unless new_key.save unless new_key.save
Rails.logger.error "#{self.class.name}: failed to add LDAP SSH key #{key.inspect} to #{user.name} (#{user.id})\n"\ Rails.logger.error "#{self.class.name}: failed to add LDAP SSH key #{key.inspect} to #{user.name} (#{user.id})\n"\
...@@ -91,16 +89,12 @@ module Gitlab ...@@ -91,16 +89,12 @@ module Gitlab
end end
# Update user email if it changed in LDAP # Update user email if it changed in LDAP
def update_email(user) def update_email
uid = user.extern_uid if ldap_user.try(:email)
ldap_user = get_ldap_user(user)
gitlab_user = ::User.where(provider: 'ldap', extern_uid: uid).last
if gitlab_user && ldap_user && ldap_user.email
ldap_email = ldap_user.email.last.to_s.downcase ldap_email = ldap_user.email.last.to_s.downcase
if (gitlab_user.email != ldap_email) if (user.email != ldap_email)
gitlab_user.update(email: ldap_email) user.update(email: ldap_email)
else else
false false
end end
...@@ -109,8 +103,8 @@ module Gitlab ...@@ -109,8 +103,8 @@ module Gitlab
end end
end end
def update_admin_status(user) def update_admin_status
admin_group = Gitlab::LDAP::Group.find_by_cn(ldap_config['admin_group'], adapter) admin_group = Gitlab::LDAP::Group.find_by_cn(ldap_config.admin_group, adapter)
if admin_group.has_member?(Gitlab::LDAP::Person.find_by_dn(user.extern_uid, adapter)) if admin_group.has_member?(Gitlab::LDAP::Person.find_by_dn(user.extern_uid, adapter))
unless user.admin? unless user.admin?
user.admin = true user.admin = true
...@@ -125,9 +119,9 @@ module Gitlab ...@@ -125,9 +119,9 @@ module Gitlab
end end
# Loop throug all ldap conneted groups, and update the users link with it # Loop throug all ldap conneted groups, and update the users link with it
def update_ldap_group_links(user) def update_ldap_group_links
gitlab_groups_with_ldap_link.each do |group| gitlab_groups_with_ldap_link.each do |group|
active_group_links = group.ldap_group_links.where(cn: cns_with_access(get_ldap_user(user))) active_group_links = group.ldap_group_links.where(cn: cns_with_access)
if active_group_links.any? if active_group_links.any?
group.add_users([user.id], fetch_group_access(group, user, active_group_links)) group.add_users([user.id], fetch_group_access(group, user, active_group_links))
...@@ -144,7 +138,7 @@ module Gitlab ...@@ -144,7 +138,7 @@ module Gitlab
end end
# returns a collection of cn strings to which the user has access # returns a collection of cn strings to which the user has access
def cns_with_access(ldap_user) def cns_with_access
@ldap_groups_with_access ||= ldap_groups.select do |ldap_group| @ldap_groups_with_access ||= ldap_groups.select do |ldap_group|
ldap_group.has_member?(ldap_user) ldap_group.has_member?(ldap_user)
end.map(&:cn) end.map(&:cn)
......
...@@ -6,24 +6,24 @@ module Gitlab ...@@ -6,24 +6,24 @@ module Gitlab
# Source: http://ctogonewild.com/2009/09/03/bitmask-searches-in-ldap/ # Source: http://ctogonewild.com/2009/09/03/bitmask-searches-in-ldap/
AD_USER_DISABLED = Net::LDAP::Filter.ex("userAccountControl:1.2.840.113556.1.4.803", "2") AD_USER_DISABLED = Net::LDAP::Filter.ex("userAccountControl:1.2.840.113556.1.4.803", "2")
def self.find_by_uid(uid, adapter=nil) attr_accessor :entry, :provider
adapter ||= Gitlab::LDAP::Adapter.new
def self.find_by_uid(uid, adapter)
adapter.user(Gitlab.config.ldap.uid, uid) adapter.user(Gitlab.config.ldap.uid, uid)
end end
def self.find_by_dn(dn, adapter=nil) def self.find_by_dn(dn, adapter)
adapter ||= Gitlab::LDAP::Adapter.new
adapter.user('dn', dn) adapter.user('dn', dn)
end end
def self.disabled_via_active_directory?(dn, adapter=nil) def self.disabled_via_active_directory?(dn, adapter)
adapter ||= Gitlab::LDAP::Adapter.new
adapter.dn_matches_filter?(dn, AD_USER_DISABLED) adapter.dn_matches_filter?(dn, AD_USER_DISABLED)
end end
def initialize(entry) def initialize(entry, provider)
Rails.logger.debug { "Instantiating #{self.class.name} with LDIF:\n#{entry.to_ldif}" } Rails.logger.debug { "Instantiating #{self.class.name} with LDIF:\n#{entry.to_ldif}" }
@entry = entry @entry = entry
@provider = provider
end end
def name def name
...@@ -47,9 +47,8 @@ module Gitlab ...@@ -47,9 +47,8 @@ module Gitlab
end end
def ssh_keys def ssh_keys
ssh_keys_attribute = Gitlab.config.ldap['sync_ssh_keys'].to_sym if config.sync_ssh_keys? && entry.respond_to?(config.ssh_sync_key)
if entry.respond_to?(ssh_keys_attribute) entry[config.ssh_sync_key.to_sym]
entry[ssh_keys_attribute]
else else
[] []
end end
...@@ -61,12 +60,12 @@ module Gitlab ...@@ -61,12 +60,12 @@ module Gitlab
@entry @entry
end end
def adapter # def adapter
@adapter ||= Gitlab::LDAP::Adapter.new # @adapter ||= Gitlab::LDAP::Adapter.new
end # end
def config def config
@config ||= Gitlab.config.ldap @config ||= Gitlab::LDAP::Config.new(provider)
end end
end end
end end
......
...@@ -14,8 +14,9 @@ module Gitlab ...@@ -14,8 +14,9 @@ module Gitlab
def authenticate(login, password) def authenticate(login, password)
# Check user against LDAP backend if user is not authenticated # Check user against LDAP backend if user is not authenticated
# Only check with valid login and password to prevent anonymous bind results # Only check with valid login and password to prevent anonymous bind results
return nil unless ldap_conf.enabled && login.present? && password.present? return nil unless ldap_conf.enabled? && login.present? && password.present?
binding.pry
ldap_user = adapter.bind_as( ldap_user = adapter.bind_as(
filter: user_filter(login), filter: user_filter(login),
size: 1, size: 1,
......
...@@ -24,6 +24,11 @@ FactoryGirl.define do ...@@ -24,6 +24,11 @@ FactoryGirl.define do
admin true admin true
end end
trait :ldap do
provider 'ldapmain'
extern_uid 'my-ldap-id'
end
factory :admin, traits: [:admin] factory :admin, traits: [:admin]
end end
......
This diff is collapsed.
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