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.
@@ -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
@@ -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)