dm-ldap-adapter 0.2.0
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.
- data/History.txt +10 -0
- data/MIT-LICENSE +20 -0
- data/Manifest.txt +24 -0
- data/README-example.markdown +18 -0
- data/README.txt +188 -0
- data/Rakefile +35 -0
- data/example/identity_map.rb +76 -0
- data/example/posix.rb +166 -0
- data/ldap-commands.txt +14 -0
- data/lib/adapters/ldap_adapter.rb +244 -0
- data/lib/adapters/memory_adapter.rb +79 -0
- data/lib/adapters/simple_adapter.rb +198 -0
- data/lib/dummy_ldap_resource.rb +60 -0
- data/lib/ldap/digest.rb +23 -0
- data/lib/ldap/ldap_facade.rb +210 -0
- data/lib/ldap/ldap_facade_mock.rb +56 -0
- data/lib/ldap/version.rb +3 -0
- data/lib/ldap_resource.rb +107 -0
- data/spec/assiociations_ldap_adapter_spec.rb +164 -0
- data/spec/authentication_ldap_adapter_spec.rb +37 -0
- data/spec/ldap_adapter_spec.rb +213 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +147 -0
- data/test.ldif +46 -0
- metadata +110 -0
@@ -0,0 +1,164 @@
|
|
1
|
+
$LOAD_PATH << File.dirname(__FILE__)
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
[
|
5
|
+
:default,
|
6
|
+
:ldap,
|
7
|
+
:memory
|
8
|
+
].each do |adapter|
|
9
|
+
|
10
|
+
describe "A #{DataMapper.repository(adapter).adapter.class.name}" do
|
11
|
+
|
12
|
+
puts "#{DataMapper.repository(adapter).adapter.class.name}"
|
13
|
+
|
14
|
+
before do
|
15
|
+
|
16
|
+
DataMapper.repository(adapter) do
|
17
|
+
User.all(:login.like => "b%").destroy!
|
18
|
+
Group.all(:name.like => "test_%").destroy!
|
19
|
+
@user1 = User.create(:login => "black", :name => 'Black', :age => 0)
|
20
|
+
@user2 = User.create(:login => "brown", :name => 'Brown', :age => 25)
|
21
|
+
@user3 = User.create(:login => "blue", :name => 'Blue', :age => nil)
|
22
|
+
|
23
|
+
@group1 = Group.create(:name => "test_root_group")
|
24
|
+
@group2 = Group.create(:name => "test_admin_group")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
after do
|
29
|
+
DataMapper.repository(adapter) do
|
30
|
+
@user1.destroy
|
31
|
+
@user2.destroy
|
32
|
+
@user3.destroy
|
33
|
+
|
34
|
+
@group1.destroy
|
35
|
+
@group2.destroy
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should successfully save an object' do
|
40
|
+
DataMapper.repository(adapter) do
|
41
|
+
@group1.new_record?.should be_false
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'should be able to get the object' do
|
46
|
+
DataMapper.repository(adapter) do
|
47
|
+
Group.get(@group1.id).should == @group1
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'should be able to get all the objects' do
|
52
|
+
DataMapper.repository(adapter) do
|
53
|
+
Group.all(:name.like => "test_%").should == [@group1, @group2]
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'should be able to have a user' do
|
58
|
+
DataMapper.repository(adapter) do
|
59
|
+
# the next load prevent strange errors
|
60
|
+
@user1 = User.get!(@user1.id)
|
61
|
+
@user1.groups << @group1
|
62
|
+
@user1.save
|
63
|
+
User.get(@user1.id).groups.should == [@group1]
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'should be able to delete a user' do
|
68
|
+
DataMapper.repository(adapter) do
|
69
|
+
# the next load prevent strange errors
|
70
|
+
@user1 = User.get!(@user1.id)
|
71
|
+
@user1.groups << @group1
|
72
|
+
@user1.save
|
73
|
+
@user1.groups.delete(@group1)
|
74
|
+
@user1.save
|
75
|
+
User.get(@user1.id).groups.should == []
|
76
|
+
@user1.groups << @group1
|
77
|
+
@user1.groups << @group2
|
78
|
+
@user1.save
|
79
|
+
@user1.groups.delete(@group1)
|
80
|
+
@user1.save
|
81
|
+
User.get(@user1.id).groups.should == [@group2]
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'should be able to have users and remove them again' do
|
86
|
+
DataMapper.repository(adapter) do
|
87
|
+
# the next load prevent strange errors
|
88
|
+
@user1 = User.get!(@user1.id)
|
89
|
+
@user1.groups << @group1
|
90
|
+
@user1.save
|
91
|
+
User.get(@user1.id).groups.should == [@group1]
|
92
|
+
@user1.groups << @group2
|
93
|
+
@user1.save
|
94
|
+
User.get(@user1.id)
|
95
|
+
@user1.groups.should == [@group1, @group2]
|
96
|
+
@user1.groups.delete(@group1)
|
97
|
+
@user1.save
|
98
|
+
User.get(@user1.id).groups.should == [@group2]
|
99
|
+
@user1.groups.delete(@group2)
|
100
|
+
@user1.save
|
101
|
+
User.get(@user1.id).groups.should == []
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'should be able to have two users' do
|
106
|
+
DataMapper.repository(adapter) do
|
107
|
+
# the next load prevent strange errors
|
108
|
+
@user1 = User.get!(@user1.id)
|
109
|
+
@user1.groups << @group1
|
110
|
+
@user1.groups << @group2
|
111
|
+
@user1.save
|
112
|
+
User.get(@user1.id).groups.should == [@group1, @group2]
|
113
|
+
@user2.groups << @group1
|
114
|
+
@user2.save
|
115
|
+
end
|
116
|
+
DataMapper.repository(adapter) do
|
117
|
+
User.get(@user2.id).groups.should == [@group1]
|
118
|
+
User.get(@user1.id).groups.should == [@group1, @group2]
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
it 'should raise an not found error' do
|
123
|
+
lambda do
|
124
|
+
User.get!(4711)
|
125
|
+
end.should raise_error(DataMapper::ObjectNotFoundError)
|
126
|
+
end
|
127
|
+
|
128
|
+
it 'should be able to have two users in one group' do
|
129
|
+
DataMapper.repository(adapter) do
|
130
|
+
@user1 = User.get!(@user1.id)
|
131
|
+
@user1.groups << @group1
|
132
|
+
@user1.groups << @group2
|
133
|
+
@user1.groups.should == [@group1, @group2]
|
134
|
+
@user2.groups << @group1
|
135
|
+
end
|
136
|
+
DataMapper.repository(adapter) do
|
137
|
+
User.get(@user1.id).groups.should == [@group1, @group2]
|
138
|
+
User.get(@user2.id).groups.should == [@group1]
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
it 'should be able to delete a user from a group' do
|
143
|
+
DataMapper.repository(adapter) do
|
144
|
+
size = GroupUser.all.size
|
145
|
+
@user1 = User.get!(@user1.id)
|
146
|
+
@user1.groups << @group1
|
147
|
+
@user1.groups << @group2
|
148
|
+
@user2.groups << @group1
|
149
|
+
GroupUser.all.size.should == size + 3
|
150
|
+
end
|
151
|
+
DataMapper.repository(adapter) do
|
152
|
+
@user1 = User.get!(@user1.id)
|
153
|
+
@user1.groups.delete(@group1)
|
154
|
+
User.get(@user1.id).groups.should == [@group2]
|
155
|
+
User.get(@user2.id).groups.should == [@group1]
|
156
|
+
@user2 = User.get!(@user2.id)
|
157
|
+
@user2.groups.delete(@group1)
|
158
|
+
User.get(@user1.id).groups.should == [@group2]
|
159
|
+
User.get(@user2.id).groups.should == []
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
end
|
164
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
$LOAD_PATH << File.dirname(__FILE__)
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe DataMapper.repository(:ldap).adapter do
|
5
|
+
|
6
|
+
describe 'user authentication' do
|
7
|
+
|
8
|
+
before do
|
9
|
+
DataMapper.repository(:ldap) do
|
10
|
+
@user = User.create(:login => "beige", :name => 'Beige')
|
11
|
+
@user.password = "asd123"
|
12
|
+
@user.save
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
after do
|
17
|
+
DataMapper.repository(:ldap) do
|
18
|
+
@user.destroy
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should successfully authenticate' do
|
23
|
+
DataMapper.repository(:ldap) do
|
24
|
+
@user.authenticate("asd123").should be_true
|
25
|
+
@user.password = "asd"
|
26
|
+
@user.save
|
27
|
+
@user.authenticate("asd").should be_true
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should not authenticate' do
|
32
|
+
DataMapper.repository(:ldap) do
|
33
|
+
@user.authenticate("asdasd").should be_false
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,213 @@
|
|
1
|
+
$LOAD_PATH << File.dirname(__FILE__)
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
[
|
5
|
+
:default,
|
6
|
+
:ldap,
|
7
|
+
:memory
|
8
|
+
].each do |adapter|
|
9
|
+
|
10
|
+
puts "#{DataMapper.repository(adapter).adapter.class.name}"
|
11
|
+
|
12
|
+
describe "A #{DataMapper.repository(adapter).adapter.class.name}" do
|
13
|
+
|
14
|
+
before do
|
15
|
+
DataMapper.repository(adapter) do
|
16
|
+
@user1 = User.create(:login => "black", :name => 'Black', :age => 0)
|
17
|
+
@user2 = User.create(:login => "brown", :name => 'Brown', :age => 25)
|
18
|
+
@user3 = User.create(:login => "blue", :name => 'Blue', :age => nil)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
after do
|
23
|
+
DataMapper.repository(adapter) do
|
24
|
+
@user1.destroy
|
25
|
+
@user2.destroy
|
26
|
+
@user3.destroy
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should successfully save an object' do
|
31
|
+
DataMapper.repository(adapter) do
|
32
|
+
@user1.new_record?.should be_false
|
33
|
+
User.first(:login => @user1.login).new_record?.should be_false
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should log when trying to create an entity with already used key' do
|
38
|
+
DataMapper.repository(adapter) do
|
39
|
+
#p User.all
|
40
|
+
lambda { User.create(:login => "black", :name => 'Black', :age => 0) }.should raise_error
|
41
|
+
#p User.all
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'should be able to get all the objects' do
|
46
|
+
DataMapper.repository(adapter) do
|
47
|
+
User.all(:login.like => "b%").should == [@user1, @user2, @user3]
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'should be able to search for objects with equal value' do
|
52
|
+
DataMapper.repository(adapter) do
|
53
|
+
User.all(:name => "Brown").should == [@user2]
|
54
|
+
User.all(:age => 25).should == [@user2]
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'should be able to search for objects included in an array of values' do
|
59
|
+
DataMapper.repository(adapter) do
|
60
|
+
User.all(:age => [ 25, 50, 75, 100 ]).should == [@user2]
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
#it 'should be able to search for objects included in a range of values' do
|
65
|
+
# User.all(:age => 25..100).should == [@user2]
|
66
|
+
#end
|
67
|
+
|
68
|
+
it 'should be able to search for objects with nil value' do
|
69
|
+
DataMapper.repository(adapter) do
|
70
|
+
User.all(:age => nil, :name.like => "B%").should == [@user3]
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
if adapter != :default
|
75
|
+
it 'should be able to search for objects with not equal value' do
|
76
|
+
DataMapper.repository(adapter) do
|
77
|
+
User.all(:age.not => 25, :name.like => "B%").should == [@user1, @user3]
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'should be able to search for objects not included in an array of values' do
|
82
|
+
DataMapper.repository(adapter) do
|
83
|
+
User.all(:age.not => [ 25, 50, 75, 100 ], :name.like => "B%").should == [@user1, @user3]
|
84
|
+
end
|
85
|
+
end
|
86
|
+
else
|
87
|
+
puts
|
88
|
+
puts "NOTE"
|
89
|
+
puts "=================================================="
|
90
|
+
puts
|
91
|
+
puts "sqlite3 handles NULL different from values, i.e."
|
92
|
+
puts "select * from users where name = 'sd';"
|
93
|
+
puts "and"
|
94
|
+
puts "select * from users where name != 'sd';"
|
95
|
+
puts "gives the same result when all names are NULL !!!"
|
96
|
+
puts
|
97
|
+
puts "=================================================="
|
98
|
+
puts
|
99
|
+
end
|
100
|
+
|
101
|
+
it 'should be able to search for objects with not equal value' do
|
102
|
+
DataMapper.repository(adapter) do
|
103
|
+
User.all(:age.not => nil, :name.like => "B%").should == [@user1, @user2]
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
# it 'should be able to search for objects not included in a range of values' do
|
108
|
+
# User.all(:age.not => 25..100).should == [@user1, @user3]
|
109
|
+
# end
|
110
|
+
|
111
|
+
# it 'should be able to search for objects with not nil value' do
|
112
|
+
# User.all(:age.not => 25, :name.like => "B%").should == [@user1, @user2]
|
113
|
+
# end
|
114
|
+
|
115
|
+
it 'should be able to search for objects that match value' do
|
116
|
+
DataMapper.repository(adapter) do
|
117
|
+
User.all(:name.like => 'Bl%').should == [@user1, @user3]
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
#it 'should be able to search for objects with value greater than' do
|
122
|
+
# User.all(:age.gt => 0).should == [@user2]
|
123
|
+
#end
|
124
|
+
|
125
|
+
#it 'should be able to search for objects with value greater than or equal to' do
|
126
|
+
# User.all(:age.gte => 0).should == [@user1, @user2]
|
127
|
+
#end
|
128
|
+
|
129
|
+
#it 'should be able to search for objects with value less than' do
|
130
|
+
# User.all(:age.lt => 1).should == [@user1]
|
131
|
+
#end
|
132
|
+
|
133
|
+
#it 'should be able to search for objects with value less than or equal to' do
|
134
|
+
# User.all(:age.lte => 0).should == [@user1]
|
135
|
+
#end
|
136
|
+
|
137
|
+
it 'should be able to update an object' do
|
138
|
+
DataMapper.repository(adapter) do
|
139
|
+
@user1 = User.get(@user1.id)
|
140
|
+
@user1.age = 10
|
141
|
+
@user1.save
|
142
|
+
User.get(@user1.id).age.should == 10
|
143
|
+
@user1.age = 70
|
144
|
+
@user1.save
|
145
|
+
User.get(@user1.id).age.should == 70
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
it 'should be able to update an object with nil' do
|
150
|
+
DataMapper.repository(adapter) do
|
151
|
+
@user1 = User.get(@user1.id)
|
152
|
+
@user1.age = nil
|
153
|
+
@user1.save
|
154
|
+
User.get(@user1.id).age.should be_nil
|
155
|
+
@user1.age = 70
|
156
|
+
@user1.save
|
157
|
+
User.get(@user1.id).age.should == 70
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
it 'should be able to destroy an object' do
|
162
|
+
DataMapper.repository(adapter) do
|
163
|
+
size = User.all.size
|
164
|
+
@user1.destroy
|
165
|
+
User.all.size.should == size - 1
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
it 'should work with transactions' do
|
170
|
+
DataMapper.repository(adapter) do
|
171
|
+
User.transaction do
|
172
|
+
user = User.get(@user3.id)
|
173
|
+
user.name = "B new"
|
174
|
+
user.save
|
175
|
+
User.get(@user3.id).name.should == 'B new'
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
if DataMapper.repository(adapter).adapter.respond_to? :open_ldap_connection
|
181
|
+
|
182
|
+
it 'should use one connection for several actions' do
|
183
|
+
DataMapper.repository(adapter) do
|
184
|
+
DataMapper.repository.adapter.open_ldap_connection do
|
185
|
+
hash = DataMapper.repository.adapter.instance_variable_get(:@ldap_connection).current.hash
|
186
|
+
User.all
|
187
|
+
DataMapper.repository.adapter.instance_variable_get(:@ldap_connection).current.hash.should == hash
|
188
|
+
user = User.get(@user3.id)
|
189
|
+
DataMapper.repository.adapter.instance_variable_get(:@ldap_connection).current.hash.should == hash
|
190
|
+
user.name = "another name"
|
191
|
+
user.save
|
192
|
+
DataMapper.repository.adapter.instance_variable_get(:@ldap_connection).current.hash.should == hash
|
193
|
+
end
|
194
|
+
DataMapper.repository.adapter.instance_variable_get(:@ldap_connection).current.hash.should_not == hash
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
it 'should use new connection for each action' do
|
199
|
+
DataMapper.repository(adapter) do
|
200
|
+
hash = DataMapper.repository.adapter.instance_variable_get(:@ldap_connection).current.hash
|
201
|
+
User.all
|
202
|
+
|
203
|
+
DataMapper.repository.adapter.instance_variable_get(:@ldap_connection).current.hash.should_not == hash
|
204
|
+
user = User.get(@user3.id)
|
205
|
+
DataMapper.repository.adapter.instance_variable_get(:@ldap_connection).current.hash.should_not == hash
|
206
|
+
user.name = "yet another name"
|
207
|
+
user.save
|
208
|
+
DataMapper.repository.adapter.instance_variable_get(:@ldap_connection).current.hash.should_not == hash
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end
|
213
|
+
end
|
data/spec/spec.opts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--colour
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,147 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
|
3
|
+
require 'slf4r/ruby_logger'
|
4
|
+
gem 'data_objects', "0.9.11"
|
5
|
+
require 'pathname'
|
6
|
+
$LOAD_PATH << Pathname(__FILE__).dirname.parent.expand_path + 'lib'
|
7
|
+
|
8
|
+
require 'ldap_resource'
|
9
|
+
#require 'ldap_facade_mock' # uncomment this to use the mock facade
|
10
|
+
require 'adapters/ldap_adapter'
|
11
|
+
require 'adapters/memory_adapter'
|
12
|
+
|
13
|
+
DataMapper.setup(:default, 'sqlite3::memory:')
|
14
|
+
DataMapper.setup(:ldap, {
|
15
|
+
:adapter => 'ldap',
|
16
|
+
:host => 'localhost',
|
17
|
+
:port => '389',
|
18
|
+
:base => "dc=example,dc=com",
|
19
|
+
:bind_name => "cn=admin,dc=example,dc=com",
|
20
|
+
:password => "behappy"
|
21
|
+
})
|
22
|
+
DataMapper.setup(:memory, {:adapter => 'memory'})
|
23
|
+
|
24
|
+
class User
|
25
|
+
include DataMapper::Resource
|
26
|
+
property :id, Integer, :serial => true, :field => "uidnumber"
|
27
|
+
property :login, String, :field => "uid", :unique_index => true
|
28
|
+
property :hashed_password, String, :field => "userpassword", :access => :private
|
29
|
+
property :name, String, :field => "cn"
|
30
|
+
property :mail, String
|
31
|
+
property :age, Integer, :field => "postalcode"
|
32
|
+
property :alive, Boolean, :field => "gecos"
|
33
|
+
|
34
|
+
has n, :roles#, :child_key => [:memberuid]
|
35
|
+
|
36
|
+
has n, :group_users, :child_key => [:memberuid]
|
37
|
+
# has n, :groups, :through => :group_users, :mutable => true#, :child_key => [:gidnumber], :parent_key => [:memberuid]
|
38
|
+
|
39
|
+
def groups
|
40
|
+
groups = GroupUser.all(:memberuid => id).collect{ |gu| gu.group }
|
41
|
+
def groups.user=(user)
|
42
|
+
@user = user
|
43
|
+
end
|
44
|
+
groups.user = self
|
45
|
+
def groups.<<(group)
|
46
|
+
unless member? group
|
47
|
+
GroupUser.create(:memberuid => @user.id, :gidnumber => group.id)
|
48
|
+
super
|
49
|
+
end
|
50
|
+
self
|
51
|
+
end
|
52
|
+
def groups.delete(group)
|
53
|
+
gu = GroupUser.first(:memberuid => @user.id, :gidnumber => group.id)
|
54
|
+
if gu
|
55
|
+
gu.destroy
|
56
|
+
super
|
57
|
+
end
|
58
|
+
end
|
59
|
+
groups
|
60
|
+
end
|
61
|
+
|
62
|
+
dn_prefix { |user| "uid=#{user.login}"}
|
63
|
+
|
64
|
+
treebase "ou=people"
|
65
|
+
|
66
|
+
ldap_properties do |user|
|
67
|
+
properties = { :objectclass => ["inetOrgPerson", "posixAccount", "shadowAccount"], :loginshell => "/bin/bash", :gidnumber => "10000" }
|
68
|
+
properties[:sn] = "#{user.name.sub(/.*\ /, "")}"
|
69
|
+
properties[:givenname] = "#{user.name.sub(/\ .*/, "")}"
|
70
|
+
properties[:homedirectory] = "/home/#{user.login}"
|
71
|
+
properties
|
72
|
+
end
|
73
|
+
|
74
|
+
def password=(password)
|
75
|
+
attribute_set(:hashed_password, Ldap::Digest.ssha(password, "--#{Time.now}--#{login}--")) if password
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
class Role
|
80
|
+
include DataMapper::Resource
|
81
|
+
property :id, Integer, :serial => true, :field => "gidnumber"
|
82
|
+
property :name, String, :field => "cn"
|
83
|
+
|
84
|
+
# multivalue_field "memberuid"
|
85
|
+
|
86
|
+
dn_prefix { |role| "cn=#{role.name}" }
|
87
|
+
|
88
|
+
treebase "ou=groups"
|
89
|
+
|
90
|
+
ldap_properties {{ :objectclass => "posixGroup"}}
|
91
|
+
|
92
|
+
belongs_to :user, :child_key => [:memberuid]
|
93
|
+
end
|
94
|
+
|
95
|
+
class Group
|
96
|
+
include DataMapper::Resource
|
97
|
+
property :id, Integer, :serial => true, :field => "gidnumber"
|
98
|
+
property :name, String, :field => "cn"
|
99
|
+
|
100
|
+
dn_prefix { |group| "cn=#{group.name}" }
|
101
|
+
|
102
|
+
treebase "ou=groups"
|
103
|
+
|
104
|
+
ldap_properties {{ :objectclass => "posixGroup"}}
|
105
|
+
|
106
|
+
has n, :users, :child_key => [:gidnumber]
|
107
|
+
# has n, :users, :through => :group_users
|
108
|
+
end
|
109
|
+
|
110
|
+
class GroupUser
|
111
|
+
include DataMapper::Resource
|
112
|
+
|
113
|
+
dn_prefix { |group_user| "cn=#{group_user.group.name}" }
|
114
|
+
|
115
|
+
treebase "ou=groups"
|
116
|
+
|
117
|
+
multivalue_field :memberuid
|
118
|
+
|
119
|
+
ldap_properties do |group_user|
|
120
|
+
{:cn=>"#{group_user.group.name}", :objectclass => "posixGroup"}
|
121
|
+
end
|
122
|
+
|
123
|
+
#property :id, Integer, :serial => true
|
124
|
+
#property :user_id, Integer, :key => true, :field => "memberuid"
|
125
|
+
#property :group_id, Integer, :key => true#, :field => "gidnumber"
|
126
|
+
property :memberuid, Integer, :key => true#, :field => "memberuid"
|
127
|
+
property :gidnumber, Integer, :key => true#, :field => "gidnumber"
|
128
|
+
# belongs_to :group, :child_key => [:gidnumber]
|
129
|
+
|
130
|
+
def group
|
131
|
+
Group.get!(gidnumber)
|
132
|
+
end
|
133
|
+
|
134
|
+
def group=(group)
|
135
|
+
gidnumber = group.id
|
136
|
+
end
|
137
|
+
|
138
|
+
def user
|
139
|
+
User.get!(memberuid)
|
140
|
+
end
|
141
|
+
|
142
|
+
def user=(user)
|
143
|
+
memberuid = user.id
|
144
|
+
end
|
145
|
+
# belongs_to :user, :child_key => [:memberuid]
|
146
|
+
end
|
147
|
+
DataMapper.auto_migrate!(:default)
|