dm-ldap-adapter 0.3.2 → 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +7 -0
- data/Manifest.txt +1 -3
- data/README.txt +6 -4
- data/lib/adapters/ldap_adapter.rb +3 -2
- data/lib/ldap/array.rb +9 -0
- data/lib/ldap/net_ldap_facade.rb +1 -1
- data/lib/ldap/ruby_ldap_facade.rb +2 -2
- data/lib/ldap/version.rb +1 -1
- data/spec/assiociations_ldap_adapter_spec.rb +5 -5
- data/spec/multi_value_attributes_spec.rb +14 -2
- data/spec/sorting_spec.rb +47 -0
- data/spec/spec_helper.rb +1 -1
- metadata +3 -7
- data/net-ldap.txt +0 -11
- data/ruby-ldap.txt +0 -11
- data/test.db +0 -0
data/History.txt
CHANGED
data/Manifest.txt
CHANGED
@@ -18,14 +18,12 @@ lib/ldap/net_ldap_facade.rb
|
|
18
18
|
lib/ldap/ruby_ldap_facade.rb
|
19
19
|
lib/ldap/version.rb
|
20
20
|
lib/ldap_resource.rb
|
21
|
-
net-ldap.txt
|
22
|
-
ruby-ldap.txt
|
23
21
|
spec/assiociations_ldap_adapter_spec.rb
|
24
22
|
spec/authentication_ldap_adapter_spec.rb
|
25
23
|
spec/ldap_adapter_spec.rb
|
26
24
|
spec/multi_repository_spec.rb
|
27
25
|
spec/multi_value_attributes_spec.rb
|
26
|
+
spec/sorting_spec.rb
|
28
27
|
spec/spec.opts
|
29
28
|
spec/spec_helper.rb
|
30
|
-
test.db
|
31
29
|
test.ldif
|
data/README.txt
CHANGED
@@ -16,7 +16,9 @@ the usecase for that implementation was using an ldap server for user authentica
|
|
16
16
|
|
17
17
|
=== low level ldap library
|
18
18
|
|
19
|
-
the ldap library which does the actual ldap protocol stuff is [http://rubyforge.org/projects/net-ldap]
|
19
|
+
the ldap library which does the actual ldap protocol stuff is [http://rubyforge.org/projects/net-ldap] which is the default. the other ldap library is [http://rubyforge.org/projects/ruby-ldap]. these libraries are behind a facade, if you want to use the ruby-ldap library you need to require the right facade before the ldap-adapter:
|
20
|
+
|
21
|
+
require 'ldap/ruby_ldap_facade'
|
20
22
|
|
21
23
|
=== examples
|
22
24
|
|
@@ -26,9 +28,9 @@ the 'example/identity_map.rb' shows the usage of identity maps, see also below.
|
|
26
28
|
|
27
29
|
== FEATURES/PROBLEMS:
|
28
30
|
|
29
|
-
* the net-ldap has some issues with not closing the connections when an exception/error got raised
|
31
|
+
* the net-ldap has some issues with not closing the connections when an exception/error got raised, with limit the search result to 126 entries which gets fixed by making consecutives searches and collect the result.
|
30
32
|
|
31
|
-
* error from the ldap server are only logged and do not raise any exceptions (to be changed in next release)
|
33
|
+
* error from the ldap server are only logged and do not raise any exceptions (to be changed in next release) with one exception: when creating a new ldap entry a duplicated entry will raise DataMapper::PersistenceError
|
32
34
|
|
33
35
|
== SYNOPSIS:
|
34
36
|
|
@@ -165,7 +167,7 @@ staying with posix example there the groups has a memberuid attribute BUT unlike
|
|
165
167
|
|
166
168
|
=== ldap attributes with many values
|
167
169
|
|
168
|
-
let's say your LDAP has multiple email values for a users then you can define your resource class like that using the type LdapArray for such multivalue fields
|
170
|
+
let's say your LDAP has multiple email values for a users then you can define your resource class like that using the type *LdapArray* for such multivalue fields
|
169
171
|
|
170
172
|
class User
|
171
173
|
include DataMapper::Resource
|
@@ -271,12 +271,13 @@ module DataMapper
|
|
271
271
|
# @return [Array<DataMapper::Resource]
|
272
272
|
# the array of found resources
|
273
273
|
# @see SimpleAdapter#read_resources
|
274
|
-
def read_resources(query)
|
274
|
+
def read_resources(query)
|
275
|
+
order_by = query.order.first.property.field
|
275
276
|
field_names = query.fields.collect {|f| f.field }
|
276
277
|
result = ldap.read_objects(query.model.treebase,
|
277
278
|
query.model.key.collect { |k| k.field },
|
278
279
|
to_ldap_conditions(query),
|
279
|
-
field_names)
|
280
|
+
field_names, order_by)
|
280
281
|
if query.model.multivalue_field
|
281
282
|
props_result = []
|
282
283
|
result.each do |props|
|
data/lib/ldap/array.rb
CHANGED
@@ -3,6 +3,15 @@ module DataMapper
|
|
3
3
|
class LdapArray < DataMapper::Type
|
4
4
|
primitive Array
|
5
5
|
default Proc.new { Array.new }
|
6
|
+
|
7
|
+
def self.dump(value, property)
|
8
|
+
value || []
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.load(value, property)
|
12
|
+
value || []
|
13
|
+
end
|
14
|
+
|
6
15
|
end
|
7
16
|
end
|
8
17
|
Property::TYPES << Types::LdapArray unless Property::TYPES.member? Types::LdapArray
|
data/lib/ldap/net_ldap_facade.rb
CHANGED
@@ -63,7 +63,7 @@ module Ldap
|
|
63
63
|
# @param key_fields Array of fields which carries the integer unique id(s) of the entity
|
64
64
|
# @param Array of conditions for the search
|
65
65
|
# @return Array of Hashes with a name/values pair for each attribute
|
66
|
-
def read_objects(treebase, key_fields, conditions, field_names)
|
66
|
+
def read_objects(treebase, key_fields, conditions, field_names, order_field = nil)
|
67
67
|
filters = []
|
68
68
|
conditions.each do |cond|
|
69
69
|
c = cond[2]
|
@@ -83,7 +83,7 @@ module Ldap
|
|
83
83
|
# @param key_fields Array of fields which carries the integer unique id(s) of the entity
|
84
84
|
# @param Array of conditions for the search
|
85
85
|
# @return Array of Hashes with a name/values pair for each attribute
|
86
|
-
def read_objects(treebase, key_fields, conditions, field_names)
|
86
|
+
def read_objects(treebase, key_fields, conditions, field_names, order_field = '')
|
87
87
|
filters = []
|
88
88
|
conditions.each do |cond|
|
89
89
|
c = cond[2]
|
@@ -169,7 +169,7 @@ module Ldap
|
|
169
169
|
@ldap2.search("#{treebase},#{@ldap2.base}",
|
170
170
|
LDAP::LDAP_SCOPE_SUBTREE,
|
171
171
|
filter.to_s == "" ? "(objectclass=*)" : filter.to_s.gsub(/\(\(/, "(").gsub(/\)\)/, ")"),
|
172
|
-
field_names) do |res|
|
172
|
+
field_names, false, 0, 0, order_field) do |res|
|
173
173
|
|
174
174
|
map = to_map(res)
|
175
175
|
#puts map[key_field.to_sym]
|
data/lib/ldap/version.rb
CHANGED
@@ -92,7 +92,7 @@ require 'spec_helper'
|
|
92
92
|
@user1.groups << @group2
|
93
93
|
@user1.save
|
94
94
|
User.get(@user1.id)
|
95
|
-
@user1.groups.should == [@group1, @group2]
|
95
|
+
@user1.groups.sort{|g1, g2| g1.id <=> g2.id}.should == [@group1, @group2]
|
96
96
|
@user1.groups.delete(@group1)
|
97
97
|
@user1.save
|
98
98
|
User.get(@user1.id).groups.should == [@group2]
|
@@ -109,13 +109,13 @@ require 'spec_helper'
|
|
109
109
|
@user1.groups << @group1
|
110
110
|
@user1.groups << @group2
|
111
111
|
@user1.save
|
112
|
-
User.get(@user1.id).groups.should == [@group1, @group2]
|
112
|
+
User.get(@user1.id).groups.sort{|g1, g2| g1.id <=> g2.id}.should == [@group1, @group2]
|
113
113
|
@user2.groups << @group1
|
114
114
|
@user2.save
|
115
115
|
end
|
116
116
|
DataMapper.repository(adapter) do
|
117
117
|
User.get(@user2.id).groups.should == [@group1]
|
118
|
-
User.get(@user1.id).groups.should == [@group1, @group2]
|
118
|
+
User.get(@user1.id).groups.sort{|g1, g2| g1.id <=> g2.id}.should == [@group1, @group2]
|
119
119
|
end
|
120
120
|
end
|
121
121
|
|
@@ -130,11 +130,11 @@ require 'spec_helper'
|
|
130
130
|
@user1 = User.get!(@user1.id)
|
131
131
|
@user1.groups << @group1
|
132
132
|
@user1.groups << @group2
|
133
|
-
@user1.groups.should == [@group1, @group2]
|
133
|
+
@user1.groups.sort{|g1, g2| g1.id <=> g2.id}.should == [@group1, @group2]
|
134
134
|
@user2.groups << @group1
|
135
135
|
end
|
136
136
|
DataMapper.repository(adapter) do
|
137
|
-
User.get(@user1.id).groups.should == [@group1, @group2]
|
137
|
+
User.get(@user1.id).groups.sort{|g1, g2| g1.id <=> g2.id}.should == [@group1, @group2]
|
138
138
|
User.get(@user2.id).groups.should == [@group1]
|
139
139
|
end
|
140
140
|
end
|
@@ -33,7 +33,8 @@ describe DataMapper.repository(:ldap).adapter.class do
|
|
33
33
|
|
34
34
|
before :each do
|
35
35
|
DataMapper.repository(:ldap) do
|
36
|
-
|
36
|
+
Contact.all(:login => "beige").destroy!
|
37
|
+
@contact = Contact.new(:login => "beige", :name => 'Beige')
|
37
38
|
@contact.password = "asd123"
|
38
39
|
@contact.save
|
39
40
|
end
|
@@ -72,7 +73,7 @@ describe DataMapper.repository(:ldap).adapter.class do
|
|
72
73
|
end
|
73
74
|
|
74
75
|
it 'should get an LdapArray on retrieving collection' do
|
75
|
-
|
76
|
+
DataMapper.repository(:ldap) do
|
76
77
|
@contact.mail.should == []
|
77
78
|
|
78
79
|
@contact.mail << "email1"
|
@@ -96,5 +97,16 @@ describe DataMapper.repository(:ldap).adapter.class do
|
|
96
97
|
@contact.mail.should == []
|
97
98
|
end
|
98
99
|
end
|
100
|
+
|
101
|
+
it 'should allow to replace the LdapArray' do
|
102
|
+
DataMapper.repository(:ldap) do
|
103
|
+
@contact = Contact.get(@contact.id)
|
104
|
+
@contact.mail.should == []
|
105
|
+
@contact.mail = ['foo', 'bar']
|
106
|
+
@contact.save
|
107
|
+
@contact = Contact.get(@contact.id)
|
108
|
+
@contact.mail.should == ['foo', 'bar']
|
109
|
+
end
|
110
|
+
end
|
99
111
|
end
|
100
112
|
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
$LOAD_PATH << File.dirname(__FILE__)
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
if Object.const_defined?('LDAP')
|
5
|
+
describe DataMapper.repository(:ldap).adapter do
|
6
|
+
|
7
|
+
describe 'belongs_to association' do
|
8
|
+
|
9
|
+
before do
|
10
|
+
DataMapper.repository(:ldap) do
|
11
|
+
User.all.destroy!
|
12
|
+
@user1 = User.create(:login => "black", :name => 'Black', :age => 0)
|
13
|
+
@user2 = User.create(:login => "brown", :name => 'Brown', :age => 25)
|
14
|
+
@user3 = User.create(:login => "blue", :name => 'Blue', :age => nil)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
after do
|
19
|
+
DataMapper.repository(:ldap) do
|
20
|
+
@user1.destroy
|
21
|
+
@user2.destroy
|
22
|
+
@user3.destroy
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should sort descending without order option' do
|
27
|
+
DataMapper.repository(:ldap) do
|
28
|
+
expected = User.all().sort do |u1, u2|
|
29
|
+
u1.id <=> u2.id
|
30
|
+
end
|
31
|
+
User.all.should == expected
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'should sort descending with order option' do
|
36
|
+
DataMapper.repository(:ldap) do
|
37
|
+
expected = User.all().sort do |u1, u2|
|
38
|
+
u1.login <=> u2.login
|
39
|
+
end
|
40
|
+
User.all(:order => [:login]).should == expected
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
else
|
46
|
+
puts 'skip sorting spec for non "ruby-ldap" library'
|
47
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -6,8 +6,8 @@ require 'do_sqlite3'
|
|
6
6
|
require 'pathname'
|
7
7
|
$LOAD_PATH << Pathname(__FILE__).dirname.parent.expand_path + 'lib'
|
8
8
|
|
9
|
+
#require 'ldap/ruby_ldap_facade'
|
9
10
|
require 'ldap_resource'
|
10
|
-
#require 'ldap_facade_mock' # uncomment this to use the mock facade
|
11
11
|
require 'adapters/ldap_adapter'
|
12
12
|
require 'adapters/memory_adapter'
|
13
13
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dm-ldap-adapter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- mkristian
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-07-03 00:00:00 +05:30
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -64,8 +64,6 @@ extra_rdoc_files:
|
|
64
64
|
- Manifest.txt
|
65
65
|
- README.txt
|
66
66
|
- ldap-commands.txt
|
67
|
-
- net-ldap.txt
|
68
|
-
- ruby-ldap.txt
|
69
67
|
files:
|
70
68
|
- History.txt
|
71
69
|
- MIT-LICENSE
|
@@ -87,16 +85,14 @@ files:
|
|
87
85
|
- lib/ldap/ruby_ldap_facade.rb
|
88
86
|
- lib/ldap/version.rb
|
89
87
|
- lib/ldap_resource.rb
|
90
|
-
- net-ldap.txt
|
91
|
-
- ruby-ldap.txt
|
92
88
|
- spec/assiociations_ldap_adapter_spec.rb
|
93
89
|
- spec/authentication_ldap_adapter_spec.rb
|
94
90
|
- spec/ldap_adapter_spec.rb
|
95
91
|
- spec/multi_repository_spec.rb
|
96
92
|
- spec/multi_value_attributes_spec.rb
|
93
|
+
- spec/sorting_spec.rb
|
97
94
|
- spec/spec.opts
|
98
95
|
- spec/spec_helper.rb
|
99
|
-
- test.db
|
100
96
|
- test.ldif
|
101
97
|
has_rdoc: true
|
102
98
|
homepage: http://dm-ldap-adapter.rubyforge.org
|
data/net-ldap.txt
DELETED
data/ruby-ldap.txt
DELETED
data/test.db
DELETED
Binary file
|