ldap_fluff 0.4.6 → 0.4.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 11ad7cdc6f2febae65680c15ad1649f54f949085
4
- data.tar.gz: a34667350a400be3b50742c34b7e4d269a4e4e9c
3
+ metadata.gz: cb5468e64650eb4e6401f65f96bb3e789a22c357
4
+ data.tar.gz: db56c2456bbdb72e9314f53a0e536deb18c2b812
5
5
  SHA512:
6
- metadata.gz: 250bdde42a707b3d253f93430e45d6979326f6ab58e67af99798b4e5a05df67f5bd1a4c1aa8888155480f16890c0ae5d9ecc1ed731cb7e60f0db9460a2f077a1
7
- data.tar.gz: 1f605000dd7800eebb73a76c0ceab30cba2f039378a87a17b470c8d92ba246c61ca99928e1308017946c834f3ac19661e874aacb585dd99b0cbd505bdf028eb3
6
+ metadata.gz: 8133e1177808f3e230be45307582563b78c938159a68ece937c667053cc5fc86f3076da3ad81956ed568dff0ddc3d755afa3f6c9ca26bf40f02855bde8c7c8ce
7
+ data.tar.gz: cb8ea2d582fc0353fc3336091e10893a0c95766f60f43d71a8ece0591bc72dc72176afb465a5d6480de524ec2212b89bcc927664a541321c10dd9c377be3ce24
@@ -51,7 +51,9 @@ Your global configuration must provide information about your LDAP host to funct
51
51
  encryption: # blank, :simple_tls, or :start_tls
52
52
  base_dn: # base DN for LDAP auth, eg dc=redhat,dc=com
53
53
  group_base: # base DN for your LDAP groups, eg ou=Groups,dc=redhat,dc=com
54
- server_type: # type of server. default == posix. :active_directory, :posix, :free_ipa
54
+ use_netgroups: # false by default, use true if you want to use netgroup triples,
55
+ # supported only for server type :free_ipa and :posix
56
+ server_type: # type of server. default == :posix. :active_directory, :posix, :free_ipa
55
57
  ad_domain: # domain for your users if using active directory, eg redhat.com
56
58
  service_user: # service account for authenticating LDAP calls. required unless you enable anon
57
59
  service_pass: # service password for authenticating LDAP calls. required unless you enable anon
@@ -61,7 +63,7 @@ Your global configuration must provide information about your LDAP host to funct
61
63
  You can pass these arguments as a hash to LdapFluff to get a valid LdapFluff object.
62
64
 
63
65
  ldap_config = { :host => "freeipa.localdomain", :port => 389, :encryption => nil, :base_dn => "DC=mydomain,DC=com",
64
- :group_base => "DC=groups,DC=mydomain,DC=com", :attr_login => "uid", :server_type => :freeipa,
66
+ :group_base => "DC=groups,DC=mydomain,DC=com", :attr_login => "uid", :server_type => :free_ipa,
65
67
  :service_user => "admin", :search_filter => "(objectClass=*)", :service_pass => "mypass",
66
68
  :anon_queries => false }
67
69
 
@@ -7,5 +7,7 @@ require 'ldap_fluff/active_directory'
7
7
  require 'ldap_fluff/ad_member_service'
8
8
  require 'ldap_fluff/posix'
9
9
  require 'ldap_fluff/posix_member_service'
10
+ require 'ldap_fluff/posix_netgroup_member_service'
10
11
  require 'ldap_fluff/freeipa'
11
12
  require 'ldap_fluff/freeipa_member_service'
13
+ require 'ldap_fluff/freeipa_netgroup_member_service'
@@ -4,7 +4,7 @@ require 'active_support/core_ext/hash'
4
4
  class LdapFluff::Config
5
5
  ATTRIBUTES = %w[host port encryption base_dn group_base server_type service_user
6
6
  service_pass anon_queries attr_login search_filter
7
- instrumentation_service ]
7
+ instrumentation_service use_netgroups]
8
8
  ATTRIBUTES.each { |attr| attr_reader attr.to_sym }
9
9
 
10
10
  DEFAULT_CONFIG = { 'port' => 389,
@@ -13,7 +13,8 @@ class LdapFluff::Config
13
13
  'group_base' => 'dc=company,dc=com',
14
14
  'server_type' => :free_ipa,
15
15
  'anon_queries' => false,
16
- 'instrumentation_service' => nil }
16
+ 'instrumentation_service' => nil,
17
+ 'use_netgroups' => false }
17
18
 
18
19
  def initialize(config)
19
20
  raise ArgumentError unless config.respond_to?(:to_hash)
@@ -20,35 +20,24 @@ class LdapFluff::FreeIPA < LdapFluff::Generic
20
20
  end
21
21
  end
22
22
 
23
- # In freeipa, a simple user query returns a full set
24
- # of nested groups! yipee
25
- #
26
- # gids should be an array of group common names
27
- #
28
- # returns true if owner is in ALL of the groups if all=true, otherwise
29
- # returns true if owner is in ANY of the groups
30
- def is_in_groups(uid, gids = [], all = true)
31
- service_bind
32
- groups = @member_service.find_user_groups(uid)
33
- if all
34
- return groups & gids == gids
35
- else
36
- return groups & gids != []
37
- end
38
- end
39
-
40
23
  private
41
24
 
42
25
  def users_from_search_results(search, method)
43
26
  # Member results come in the form uid=sampleuser,cn=users, etc.. or gid=samplegroup,cn=groups
44
27
  users = []
45
28
 
46
- search.send(method).each do |member|
47
- type = member.downcase.split(',')[1]
48
- if type == 'cn=users'
49
- users << @member_service.get_logins([member])
50
- elsif type == 'cn=groups'
51
- users << users_for_gid(member.split(',')[0].split('=')[1])
29
+ members = search.send(method)
30
+
31
+ if method == :nisnetgrouptriple
32
+ users = @member_service.get_netgroup_users(members)
33
+ else
34
+ members.each do |member|
35
+ type = member.downcase.split(',')[1]
36
+ if type == 'cn=users'
37
+ users << @member_service.get_logins([member])
38
+ elsif type == 'cn=groups'
39
+ users << users_for_gid(member.split(',')[0].split('=')[1])
40
+ end
52
41
  end
53
42
  end
54
43
 
@@ -1,6 +1,5 @@
1
1
  require 'net/ldap'
2
2
 
3
- # handles the naughty bits of posix ldap
4
3
  class LdapFluff::FreeIPA::MemberService < LdapFluff::GenericMemberService
5
4
 
6
5
  def initialize(ldap, config)
@@ -19,6 +18,19 @@ class LdapFluff::FreeIPA::MemberService < LdapFluff::GenericMemberService
19
18
  get_groups(user[0][:memberof])
20
19
  end
21
20
 
21
+ # extract the group names from the LDAP style response,
22
+ # return string will be something like
23
+ # CN=bros,OU=bropeeps,DC=jomara,DC=redhat,DC=com
24
+ def get_groups(grouplist)
25
+ grouplist.map(&:downcase).collect do |g|
26
+ if g.match(/.*?ipauniqueid=(.*?)/)
27
+ @ldap.search(:base => g)[0][:cn][0]
28
+ else
29
+ g.sub(/.*?cn=(.*?),.*/, '\1')
30
+ end
31
+ end.compact
32
+ end
33
+
22
34
  class UIDNotFoundException < LdapFluff::Error
23
35
  end
24
36
 
@@ -0,0 +1,14 @@
1
+ require 'net/ldap'
2
+
3
+ class LdapFluff::FreeIPA::NetgroupMemberService < LdapFluff::FreeIPA::MemberService
4
+
5
+ def find_user_groups(uid)
6
+ groups = []
7
+ @ldap.search(:filter => Net::LDAP::Filter.eq('objectClass', 'nisNetgroup'), :base => @group_base).each do |entry|
8
+ members = get_netgroup_users(entry[:nisnetgrouptriple])
9
+ groups << entry[:cn][0] if members.include? uid
10
+ end
11
+ groups
12
+ end
13
+ end
14
+
@@ -13,7 +13,8 @@ class LdapFluff::Generic
13
13
  @attr_login = config.attr_login
14
14
  @base = config.base_dn
15
15
  @group_base = (config.group_base.empty? ? config.base_dn : config.group_base)
16
- @member_service = self.class::MemberService.new(@ldap, config)
16
+ @use_netgroups = config.use_netgroups
17
+ @member_service = create_member_service(config)
17
18
  end
18
19
 
19
20
  def user_exists?(uid)
@@ -42,13 +43,29 @@ class LdapFluff::Generic
42
43
  def users_for_gid(gid)
43
44
  return [] unless group_exists?(gid)
44
45
  search = @member_service.find_group(gid).last
45
-
46
- method = [:member, :memberuid, :uniquemember].find { |m| search.respond_to? m } or
47
- return []
48
-
46
+ method = select_member_method(search)
47
+ return [] if method.nil?
49
48
  users_from_search_results(search, method)
50
49
  end
51
50
 
51
+ # returns whether a user is a member of ALL or ANY particular groups
52
+ # note: this method is much faster than groups_for_uid
53
+ #
54
+ # gids should be an array of group common names
55
+ #
56
+ # returns true if owner is in ALL of the groups if all=true, otherwise
57
+ # returns true if owner is in ANY of the groups
58
+ def is_in_groups(uid, gids = [], all = true)
59
+ service_bind
60
+ groups = @member_service.find_user_groups(uid).sort
61
+ gids = gids.sort
62
+ if all
63
+ return groups & gids == gids
64
+ else
65
+ return (groups & gids).any?
66
+ end
67
+ end
68
+
52
69
  def includes_cn?(cn)
53
70
  filter = Net::LDAP::Filter.eq('cn', cn)
54
71
  @ldap.search(:base => @ldap.base, :filter => filter).present?
@@ -62,6 +79,22 @@ class LdapFluff::Generic
62
79
  end
63
80
 
64
81
  private
82
+ def select_member_method(search_result)
83
+ if @use_netgroups
84
+ :nisnetgrouptriple
85
+ else
86
+ [:member, :memberuid, :uniquemember].find { |m| search_result.respond_to? m }
87
+ end
88
+ end
89
+
90
+ def create_member_service(config)
91
+ if @use_netgroups
92
+ self.class::NetgroupMemberService.new(@ldap, config)
93
+ else
94
+ self.class::MemberService.new(@ldap, config)
95
+ end
96
+ end
97
+
65
98
  def class_name
66
99
  self.class.name.split('::').last
67
100
  end
@@ -71,6 +104,8 @@ class LdapFluff::Generic
71
104
  if method == :memberuid
72
105
  # memberuid contains an array ['user1','user2'], no need to parse it
73
106
  members
107
+ elsif method == :nisnetgrouptriple
108
+ @member_service.get_netgroup_users(members)
74
109
  else
75
110
  @member_service.get_logins(members)
76
111
  end
@@ -8,6 +8,7 @@ class LdapFluff::GenericMemberService
8
8
  @ldap = ldap
9
9
  @base = config.base_dn
10
10
  @group_base = (config.group_base.empty? ? config.base_dn : config.group_base)
11
+ @search_filter = nil
11
12
  begin
12
13
  @search_filter = Net::LDAP::Filter.construct(config.search_filter) unless (config.search_filter.nil? || config.search_filter.empty?)
13
14
  rescue Net::LDAP::LdapError => error
@@ -57,6 +58,11 @@ class LdapFluff::GenericMemberService
57
58
  grouplist.map(&:downcase).collect { |g| g.sub(/.*?cn=(.*?),.*/, '\1') }
58
59
  end
59
60
 
61
+ def get_netgroup_users(netgroup_triples)
62
+ return [] if netgroup_triples.nil?
63
+ netgroup_triples.map { |m| m.split(',')[1] }
64
+ end
65
+
60
66
  def get_logins(userlist)
61
67
  userlist.map(&:downcase!)
62
68
  [@attr_login, 'uid', 'cn'].map do |attribute|
@@ -10,18 +10,6 @@ class LdapFluff::Posix < LdapFluff::Generic
10
10
  @ldap.bind
11
11
  end
12
12
 
13
- # returns whether a user is a member of ALL or ANY particular groups
14
- # note: this method is much faster than groups_for_uid
15
- #
16
- # gids should be an array of group common names
17
- #
18
- # returns true if owner is in ALL of the groups if all=true, otherwise
19
- # returns true if owner is in ANY of the groups
20
- def is_in_groups(uid, gids = [], all = true)
21
- service_bind
22
- (gids.empty? || @member_service.times_in_groups(uid, gids, all) > 0)
23
- end
24
-
25
13
  private
26
14
 
27
15
  def users_from_search_results(search, method)
@@ -29,16 +17,21 @@ class LdapFluff::Posix < LdapFluff::Generic
29
17
  # we have to look for OUs or posixGroups within the current group scope,
30
18
  # i.e: cn=ldapusers,ou=groups,dc=example,dc=com -> cn=myusers,cn=ldapusers,ou=gr...
31
19
 
32
- groups = @ldap.search(:base => search.dn,
33
- :filter => Net::LDAP::Filter.eq('objectClass','posixGroup') |
34
- Net::LDAP::Filter.eq('objectClass', 'organizationalunit') |
35
- Net::LDAP::Filter.eq('objectClass', 'groupOfUniqueNames') |
36
- Net::LDAP::Filter.eq('objectClass', 'groupOfNames'))
37
-
20
+ if @use_netgroups
21
+ filter = Net::LDAP::Filter.eq('objectClass', 'nisNetgroup')
22
+ else
23
+ filter = Net::LDAP::Filter.eq('objectClass','posixGroup') |
24
+ Net::LDAP::Filter.eq('objectClass', 'organizationalunit') |
25
+ Net::LDAP::Filter.eq('objectClass', 'groupOfUniqueNames') |
26
+ Net::LDAP::Filter.eq('objectClass', 'groupOfNames')
27
+ end
28
+ groups = @ldap.search(:base => search.dn, :filter => filter)
38
29
  members = groups.map { |group| group.send(method) }.flatten.uniq
39
30
 
40
31
  if method == :memberuid
41
32
  members
33
+ elsif method == :nisnetgrouptriple
34
+ @member_service.get_netgroup_users(members)
42
35
  else
43
36
  @member_service.get_logins(members)
44
37
  end
@@ -18,8 +18,7 @@ class LdapFluff::Posix::MemberService < LdapFluff::GenericMemberService
18
18
  # note : this method is not particularly fast for large ldap systems
19
19
  def find_user_groups(uid)
20
20
  groups = []
21
- @ldap.search(:filter => Net::LDAP::Filter.eq('memberuid', uid),
22
- :base => @group_base).each do |entry|
21
+ @ldap.search(:filter => Net::LDAP::Filter.eq('memberuid', uid), :base => @group_base).each do |entry|
23
22
  groups << entry[:cn][0]
24
23
  end
25
24
  groups
@@ -0,0 +1,16 @@
1
+ require 'net/ldap'
2
+
3
+ # handles the naughty bits of posix ldap
4
+ class LdapFluff::Posix::NetgroupMemberService < LdapFluff::Posix::MemberService
5
+
6
+ # return list of group CNs for a user
7
+ def find_user_groups(uid)
8
+ groups = []
9
+ @ldap.search(:filter => Net::LDAP::Filter.eq('objectClass', 'nisNetgroup'), :base => @group_base).each do |entry|
10
+ members = get_netgroup_users(entry[:nisnetgrouptriple])
11
+ groups << entry[:cn][0] if members.include? uid
12
+ end
13
+ groups
14
+ end
15
+
16
+ end
@@ -0,0 +1,68 @@
1
+ require 'lib/ldap_test_helper'
2
+
3
+ class TestIPANetgroupMemberService < MiniTest::Test
4
+ include LdapTestHelper
5
+
6
+ def setup
7
+ netgroups_config
8
+ super
9
+ @ipams = LdapFluff::FreeIPA::NetgroupMemberService.new(@ldap, netgroups_config)
10
+ end
11
+
12
+ def basic_user
13
+ @ldap.expect(:search, ipa_user_payload, [:filter => ipa_name_filter("john")])
14
+ end
15
+
16
+ def basic_group
17
+ @ldap.expect(:search, ipa_netgroup_payload('broze'), [:filter => ipa_group_filter("broze"), :base => @config.group_base])
18
+ end
19
+
20
+ def test_find_user
21
+ basic_user
22
+ @ipams.ldap = @ldap
23
+ assert_equal ipa_user_payload, @ipams.find_user('john')
24
+ @ldap.verify
25
+ end
26
+
27
+ def test_find_missing_user
28
+ @ldap.expect(:search, nil, [:filter => ipa_name_filter("john")])
29
+ @ipams.ldap = @ldap
30
+ assert_raises(LdapFluff::FreeIPA::MemberService::UIDNotFoundException) do
31
+ @ipams.find_user('john')
32
+ end
33
+ end
34
+
35
+ def test_find_user_groups
36
+ response = ipa_netgroup_payload('bros', ['(,john,)', '(,joe,)'])
37
+ @ldap.expect(:search, response, [:filter => Net::LDAP::Filter.eq('objectClass', 'nisNetgroup'),
38
+ :base => @config.group_base])
39
+
40
+ @ipams.ldap = @ldap
41
+ assert_equal(['bros'], @ipams.find_user_groups('john'))
42
+ @ldap.verify
43
+ end
44
+
45
+ def test_find_no_user_groups
46
+ response = ipa_netgroup_payload('bros', ['(,joe,)'])
47
+ @ldap.expect(:search, response, [:filter => Net::LDAP::Filter.eq('objectClass', 'nisNetgroup'),
48
+ :base => @config.group_base])
49
+ @ipams.ldap = @ldap
50
+ assert_equal([], @ipams.find_user_groups('john'))
51
+ @ldap.verify
52
+ end
53
+
54
+ def test_find_group
55
+ basic_group
56
+ @ipams.ldap = @ldap
57
+ assert_equal(ipa_netgroup_payload('broze'), @ipams.find_group('broze'))
58
+ end
59
+
60
+ def test_find_missing_group
61
+ @ldap.expect(:search, nil, [:filter => ipa_group_filter("broze"), :base => @config.group_base])
62
+ @ipams.ldap = @ldap
63
+ assert_raises(LdapFluff::FreeIPA::MemberService::GIDNotFoundException) do
64
+ @ipams.find_group('broze')
65
+ end
66
+ end
67
+
68
+ end
@@ -83,6 +83,12 @@ class TestIPA < MiniTest::Test
83
83
  assert_equal(@ipa.is_in_groups("john", %w(bros buds), false), true)
84
84
  end
85
85
 
86
+ def test_is_in_all_groupss
87
+ service_bind
88
+ bigtime_user
89
+ assert_equal(true, @ipa.is_in_groups("john", %w(broskies bros), true))
90
+ end
91
+
86
92
  def test_isnt_in_all_groups
87
93
  service_bind
88
94
  basic_user
@@ -29,6 +29,10 @@ module LdapTestHelper
29
29
  @config ||= LdapFluff::Config.new config_hash
30
30
  end
31
31
 
32
+ def netgroups_config
33
+ @config ||= LdapFluff::Config.new config_hash.merge(:use_netgroups => true)
34
+ end
35
+
32
36
  def service_bind
33
37
  @ldap.expect(:bind, true)
34
38
  get_test_instance_variable.ldap = @ldap
@@ -99,13 +103,17 @@ module LdapTestHelper
99
103
  end
100
104
 
101
105
  def posix_user_payload
102
- [{ :cn => ["bros"] }]
106
+ [{ :cn => ["john"] }]
103
107
  end
104
108
 
105
109
  def posix_group_payload
106
110
  [{ :cn => ["broze"] }]
107
111
  end
108
112
 
113
+ def posix_netgroup_payload(cn, netgroups=[])
114
+ [{ :cn => [cn], :nisnetgrouptriple => netgroups }]
115
+ end
116
+
109
117
  def ipa_user_payload
110
118
  @ipa_user_payload_cache ||= begin
111
119
  entry_1 = Net::LDAP::Entry.new
@@ -120,6 +128,10 @@ module LdapTestHelper
120
128
  [{ :cn => 'group' }, { :memberof => ['cn=group,dc=internet,dc=com', 'cn=bros,dc=internet,dc=com'] }]
121
129
  end
122
130
 
131
+ def ipa_netgroup_payload(cn, netgroups=[])
132
+ [{ :cn => [cn], :nisnetgrouptriple => netgroups }]
133
+ end
134
+
123
135
  private
124
136
 
125
137
  def get_test_instance_variable
@@ -18,11 +18,19 @@ class TestPosixMemberService < MiniTest::Test
18
18
  end
19
19
 
20
20
  def test_find_user_groups
21
- user = posix_user_payload
21
+ user = posix_group_payload
22
22
  @ldap.expect(:search, user, [:filter => @ms.name_filter('john'),
23
23
  :base => config.group_base])
24
24
  @ms.ldap = @ldap
25
- assert_equal ['bros'], @ms.find_user_groups('john')
25
+ assert_equal ['broze'], @ms.find_user_groups('john')
26
+ @ldap.verify
27
+ end
28
+
29
+ def test_find_no_groups
30
+ @ldap.expect(:search, [], [:filter => @ms.name_filter("john"),
31
+ :base => config.group_base])
32
+ @ms.ldap = @ldap
33
+ assert_equal [], @ms.find_user_groups('john')
26
34
  @ldap.verify
27
35
  end
28
36
 
@@ -0,0 +1,74 @@
1
+ require 'lib/ldap_test_helper'
2
+
3
+ class TestPosixNetgroupMemberService < MiniTest::Test
4
+ include LdapTestHelper
5
+
6
+ def setup
7
+ netgroups_config
8
+ super
9
+ @ms = LdapFluff::Posix::NetgroupMemberService.new(@ldap, netgroups_config)
10
+ end
11
+
12
+ def test_find_user
13
+ user = posix_user_payload
14
+ @ldap.expect(:search, user, [:filter => @ms.name_filter('john'),
15
+ :base => config.base_dn])
16
+ @ms.ldap = @ldap
17
+ assert_equal posix_user_payload, @ms.find_user('john')
18
+ @ldap.verify
19
+ end
20
+
21
+ def test_find_user_groups
22
+ response = posix_netgroup_payload('bros', ['(,john,)', '(,joe,)'])
23
+ @ldap.expect(:search, response, [:filter => Net::LDAP::Filter.eq('objectClass', 'nisNetgroup'),
24
+ :base => config.group_base])
25
+
26
+ @ms.ldap = @ldap
27
+ assert_equal ['bros'], @ms.find_user_groups('john')
28
+ @ldap.verify
29
+ end
30
+
31
+ def test_find_no_user_groups
32
+ response = posix_netgroup_payload('bros', ['(,joe,)'])
33
+ @ldap.expect(:search, response, [:filter => Net::LDAP::Filter.eq('objectClass', 'nisNetgroup'),
34
+ :base => config.group_base])
35
+
36
+ @ms.ldap = @ldap
37
+ assert_equal [], @ms.find_user_groups('john')
38
+ @ldap.verify
39
+ end
40
+
41
+ def test_user_exists
42
+ user = posix_user_payload
43
+ @ldap.expect(:search, user, [:filter => @ms.name_filter('john'),
44
+ :base => config.base_dn])
45
+ @ms.ldap = @ldap
46
+ assert @ms.find_user('john')
47
+ @ldap.verify
48
+ end
49
+
50
+ def test_user_doesnt_exists
51
+ @ldap.expect(:search, nil, [:filter => @ms.name_filter('john'),
52
+ :base => config.base_dn])
53
+ @ms.ldap = @ldap
54
+ assert_raises(LdapFluff::Posix::MemberService::UIDNotFoundException) { @ms.find_user('john') }
55
+ @ldap.verify
56
+ end
57
+
58
+ def test_group_exists
59
+ group = posix_netgroup_payload('broze')
60
+ @ldap.expect(:search, group, [:filter => @ms.group_filter('broze'),
61
+ :base => config.group_base])
62
+ @ms.ldap = @ldap
63
+ assert @ms.find_group('broze')
64
+ @ldap.verify
65
+ end
66
+
67
+ def test_group_doesnt_exists
68
+ @ldap.expect(:search, nil, [:filter => @ms.group_filter('broze'),
69
+ :base => config.group_base])
70
+ @ms.ldap = @ldap
71
+ assert_raises(LdapFluff::Posix::MemberService::GIDNotFoundException) { @ms.find_group('broze') }
72
+ @ldap.verify
73
+ end
74
+ end
@@ -29,18 +29,12 @@ class TestPosix < MiniTest::Test
29
29
  def test_isnt_in_groups
30
30
  service_bind
31
31
  basic_user
32
- md = MiniTest::Mock.new
33
- md.expect(:times_in_groups, 0, ['john', %w(bros), true])
34
- @posix.member_service = md
35
- assert_equal(@posix.is_in_groups('john', %w(bros), true), false)
32
+ assert_equal(@posix.is_in_groups('john', %w(broskies), true), false)
36
33
  end
37
34
 
38
35
  def test_is_in_groups
39
36
  service_bind
40
37
  basic_user
41
- md = MiniTest::Mock.new
42
- md.expect(:times_in_groups, 1, ['john', %w(bros), true])
43
- @posix.member_service = md
44
38
  assert_equal(@posix.is_in_groups('john', %w(bros), true), true)
45
39
  end
46
40
 
@@ -127,7 +121,7 @@ class TestPosix < MiniTest::Test
127
121
  @ldap.expect(:search,
128
122
  [nested_group],
129
123
  [{ :base => group.dn,
130
- :filter => Net::LDAP::Filter.eq('objectClass','posixGroup') |
124
+ :filter => Net::LDAP::Filter.eq('objectClass', 'posixGroup') |
131
125
  Net::LDAP::Filter.eq('objectClass', 'organizationalunit') |
132
126
  Net::LDAP::Filter.eq('objectClass', 'groupOfUniqueNames') |
133
127
  Net::LDAP::Filter.eq('objectClass', 'groupOfNames')}])
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ldap_fluff
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.6
4
+ version: 0.4.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jordan O'Mara
@@ -13,7 +13,7 @@ authors:
13
13
  autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2017-02-22 00:00:00.000000000 Z
16
+ date: 2017-06-30 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: net-ldap
@@ -94,19 +94,23 @@ files:
94
94
  - lib/ldap_fluff/error.rb
95
95
  - lib/ldap_fluff/freeipa.rb
96
96
  - lib/ldap_fluff/freeipa_member_service.rb
97
+ - lib/ldap_fluff/freeipa_netgroup_member_service.rb
97
98
  - lib/ldap_fluff/generic.rb
98
99
  - lib/ldap_fluff/generic_member_service.rb
99
100
  - lib/ldap_fluff/ldap_fluff.rb
100
101
  - lib/ldap_fluff/posix.rb
101
102
  - lib/ldap_fluff/posix_member_service.rb
103
+ - lib/ldap_fluff/posix_netgroup_member_service.rb
102
104
  - test/ad_member_services_test.rb
103
105
  - test/ad_test.rb
104
106
  - test/config_test.rb
105
107
  - test/ipa_member_services_test.rb
108
+ - test/ipa_netgroup_member_services_test.rb
106
109
  - test/ipa_test.rb
107
110
  - test/ldap_test.rb
108
111
  - test/lib/ldap_test_helper.rb
109
112
  - test/posix_member_services_test.rb
113
+ - test/posix_netgroup_member_services_test.rb
110
114
  - test/posix_test.rb
111
115
  homepage: https://github.com/theforeman/ldap_fluff
112
116
  licenses:
@@ -128,17 +132,19 @@ required_rubygems_version: !ruby/object:Gem::Requirement
128
132
  version: '0'
129
133
  requirements: []
130
134
  rubyforge_project:
131
- rubygems_version: 2.5.2
135
+ rubygems_version: 2.4.5
132
136
  signing_key:
133
137
  specification_version: 4
134
138
  summary: LDAP querying tools for Active Directory, FreeIPA and POSIX-style
135
139
  test_files:
136
- - test/ad_member_services_test.rb
137
- - test/ldap_test.rb
138
- - test/config_test.rb
139
- - test/posix_member_services_test.rb
140
140
  - test/ipa_member_services_test.rb
141
+ - test/config_test.rb
142
+ - test/posix_netgroup_member_services_test.rb
143
+ - test/ipa_test.rb
141
144
  - test/lib/ldap_test_helper.rb
142
145
  - test/ad_test.rb
146
+ - test/ipa_netgroup_member_services_test.rb
147
+ - test/ldap_test.rb
148
+ - test/ad_member_services_test.rb
143
149
  - test/posix_test.rb
144
- - test/ipa_test.rb
150
+ - test/posix_member_services_test.rb