dm-ldap-adapter 0.2.0

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