Class: LdapFluff::ActiveDirectory::MemberService

Inherits:
GenericMemberService show all
Defined in:
lib/ldap_fluff/ad_member_service.rb

Overview

Naughty bits of active directory ldap queries

Defined Under Namespace

Classes: GIDNotFoundException, UIDNotFoundException

Instance Attribute Summary

Attributes inherited from GenericMemberService

#ldap

Instance Method Summary collapse

Methods inherited from GenericMemberService

#find_by_dn, #find_group, #find_user, #get_groups, #get_login_from_entry, #get_logins, #get_netgroup_users, #group_filter, #name_filter

Constructor Details

#initialize(ldap, config) ⇒ MemberService

Returns a new instance of MemberService.



5
6
7
8
# File 'lib/ldap_fluff/ad_member_service.rb', line 5

def initialize(ldap, config)
  @attr_login = (config. || 'samaccountname')
  super
end

Instance Method Details

#_get_domain_func_levelObject

return the domain functionality level, default to 0



28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/ldap_fluff/ad_member_service.rb', line 28

def _get_domain_func_level
  return @domain_functionality if defined?(@domain_functionality)

  @domain_functionality = 0

  search = @ldap.search(:base => "", :scope => Net::LDAP::SearchScope_BaseObject, :attributes => ['domainFunctionality'])
  if !search.nil? && !search.first.nil?
    @domain_functionality = search.first[:domainfunctionality].first.to_i
  end

  @domain_functionality
end

#_groups_from_ldap_data(payload) ⇒ Object

return the :memberof attrs + parents, recursively



42
43
44
45
46
47
48
49
50
# File 'lib/ldap_fluff/ad_member_service.rb', line 42

def _groups_from_ldap_data(payload)
  data = []
  unless payload.nil?
    first_level = payload[:memberof]
    total_groups, = _walk_group_ancestry(first_level, first_level)
    data = get_groups(first_level + total_groups).uniq
  end
  data
end

#_walk_group_ancestry(group_dns = [], known_groups = []) ⇒ Object

recursively loop over the parent list



53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/ldap_fluff/ad_member_service.rb', line 53

def _walk_group_ancestry(group_dns = [], known_groups = [])
  set = []
  group_dns.each do |group_dn|
    search = @ldap.search(:base => group_dn, :scope => Net::LDAP::SearchScope_BaseObject, :attributes => ['memberof'])
    next unless !search.nil? && !search.first.nil?
    groups = search.first[:memberof] - known_groups
    known_groups                += groups
    next_level, _new_known_groups = _walk_group_ancestry(groups, known_groups)
    set                         += next_level
    set                         += groups
    known_groups                += next_level
  end
  [set, known_groups]
end

#class_filterObject



68
69
70
# File 'lib/ldap_fluff/ad_member_service.rb', line 68

def class_filter
  Net::LDAP::Filter.eq("objectclass", "group")
end

#find_user_groups(uid) ⇒ Object

get a list [] of ldap groups for a given user try to use msds-memberOfTransitive if it is supported, otherwise do a recursive loop



12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/ldap_fluff/ad_member_service.rb', line 12

def find_user_groups(uid)
  user_data = find_user(uid).first

  if _get_domain_func_level >= 6
    user_dn = user_data[:distinguishedname].first
    search = @ldap.search(:base => user_dn, :scope => Net::LDAP::SearchScope_BaseObject, :attributes => ['msds-memberOfTransitive'])
    if !search.nil? && !search.first.nil?
      return get_groups(search.first['msds-memberoftransitive'])
    end
  end

  # Fall back to recursive lookup
  _groups_from_ldap_data(user_data)
end