dm-ldap-adapter 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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)
|