dm-ldap-adapter 0.4.1 → 0.4.2

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 CHANGED
@@ -1,3 +1,13 @@
1
+ version 0.4.2
2
+ =============
3
+
4
+ * Serial fieldnames are case insensitive now, i.e. allow capital as well
5
+
6
+ version 0.4.1
7
+ =============
8
+
9
+ * mutliline values inside Ldap::Array
10
+
1
11
  version 0.3.5
2
12
  =============
3
13
 
data/Manifest.txt CHANGED
@@ -6,7 +6,6 @@ Manifest.txt
6
6
  README-example.markdown
7
7
  README.txt
8
8
  Rakefile
9
- example/identity_map.rb
10
9
  example/posix.rb
11
10
  ldap-commands.txt
12
11
  lib/adapters/ldap_adapter.rb
data/README.txt CHANGED
@@ -46,8 +46,6 @@ or
46
46
 
47
47
  see 'example/posix.rb' for user/group setup works with default installation of openldap on ubuntu (just change your password as needed in the code)
48
48
 
49
- the 'example/identity_map.rb' shows the usage of identity maps, see also below.
50
-
51
49
  == FEATURES/PROBLEMS:
52
50
 
53
51
  * 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.
@@ -62,7 +60,7 @@ there are three parts which makes the DN of a model, the base from the ldap conn
62
60
 
63
61
  class User
64
62
  include DataMapper::Resource
65
- property :id, Serial, :field => "uidnumber"
63
+ property :id, Serial, :field => "uidNumber"
66
64
  dn_prefix { |user| "uid=#{user.login}"}
67
65
  treebase "ou=people"
68
66
  end
@@ -77,7 +75,7 @@ for example the ldap posixGroup has more attributes than the model class, it nee
77
75
 
78
76
  class Group
79
77
  include DataMapper::Resource
80
- property :id, Serial, :field => "gidnumber"
78
+ property :id, Serial, :field => "gidNumber"
81
79
  property :name, String, :field => "cn"
82
80
  dn_prefix { |group| "cn=#{group.name}" }
83
81
  treebase "ou=groups"
@@ -169,8 +167,8 @@ staying with posix example there the groups has a memberuid attribute BUT unlike
169
167
 
170
168
  class GroupUser
171
169
  include DataMapper::Resource
172
- property :memberuid, String, :key => true
173
- property :gidnumber, Integer, :key => true
170
+ property :memberUid, String, :key => true
171
+ property :gidNumber, Integer, :key => true
174
172
  dn_prefix { |group_user| "cn=#{group_user.group.name}" }
175
173
  treebase "ou=groups"
176
174
  ldap_properties do |group_user|
@@ -187,14 +185,14 @@ let's say your LDAP has multiple email values for a users then you can define yo
187
185
 
188
186
  class User
189
187
  include DataMapper::Resource
190
- property :id, Serial, :field => "uidnumber"
188
+ property :id, Serial, :field => "uidNumber"
191
189
  property :login, String, :field => "uid", :unique_index => true
192
190
  property :mail, LdapArray
193
191
 
194
192
  dn_prefix { |user| "uid=#{user.login}"}
195
193
  treebase "ou=people"
196
194
  ldap_properties do |user|
197
- properties = { :objectclass => ["inetOrgPerson", "posixAccount", "shadowAccount"], :loginshell => "/bin/bash", :gidnumber => "10000" }
195
+ properties = { :objectclass => ["inetOrgPerson", "posixAccount", "shadowAccount"], :loginshell => "/bin/bash", :gidNumber => "10000" }
198
196
  properties
199
197
  end
200
198
  end
data/Rakefile CHANGED
@@ -9,7 +9,7 @@ require 'spec/rake/spectask'
9
9
  require 'pathname'
10
10
 
11
11
  Hoe.spec('dm-ldap-adapter') do |p|
12
- p.version = "0.4.1"
12
+ p.version = "0.4.2"
13
13
  p.description = "ldap adapter for datamapper which uses either net-ldap or ruby-ldap"
14
14
  p.developer('mkristian', 'm.kristian@web.de')
15
15
  p.url = "http://dm-ldap-adapter.rubyforge.org"
data/example/posix.rb CHANGED
@@ -1,19 +1,19 @@
1
1
  require 'pathname'
2
2
  require 'rubygems'
3
- require 'slf4r/logging_logger'
4
- gem 'data_objects' , "0.9.11"
3
+ require 'slf4r/logger'
4
+ require 'slf4r/ruby_logger'
5
5
  require 'dm-core'
6
6
 
7
7
  $LOAD_PATH << Pathname(__FILE__).dirname.parent.expand_path + 'lib'
8
8
 
9
- Logging.init :debug, :info, :warn, :error
9
+ # Logging.init :debug, :info, :warn, :error
10
10
 
11
- appender = Logging::Appender.stdout
12
- appender.layout = Logging::Layouts::Pattern.new(:pattern => "%d [%-l] (%c) %m\n")
13
- logger = Logging::Logger.new(:root)
14
- logger.add_appenders(appender)
15
- logger.level = :debug
16
- logger.info "initialized logger . . ."
11
+ # appender = Logging::Appender.stdout
12
+ # appender.layout = Logging::Layouts::Pattern.new(:pattern => "%d [%-l] (%c) %m\n")
13
+ # logger = Logging::Logger.new(:root)
14
+ # logger.add_appenders(appender)
15
+ # logger.level = :debug
16
+ # logger.info "initialized logger . . ."
17
17
 
18
18
  dummy = true #uncomment this to use dummy, i.e. a database instead of ldap
19
19
  dummy = false # uncomment this to use ldap
@@ -49,9 +49,9 @@ end
49
49
  class User
50
50
  include DataMapper::Resource
51
51
 
52
- property :id, Serial, :field => "uidnumber"
52
+ property :id, Serial, :field => "uidNumber"
53
53
  property :login, String, :field => "uid"
54
- property :hashed_password, String, :field => "userpassword", :access => :private
54
+ property :hashed_password, String, :field => "userPassword"
55
55
  property :name, String, :field => "cn"
56
56
 
57
57
  has n, :group_users, :child_key => [:memberuid]
@@ -99,7 +99,7 @@ end
99
99
  class Group
100
100
  include DataMapper::Resource
101
101
  include Slf4r::Logger
102
- property :id, Serial, :field => "gidnumber"
102
+ property :id, Serial, :field => "gidNumber"
103
103
  property :name, String, :field => "cn"
104
104
 
105
105
  dn_prefix { |group| "cn=#{group.name}" }
@@ -145,8 +145,8 @@ class GroupUser
145
145
  ldap_properties do |group_user|
146
146
  {:cn=>"#{group_user.group.name}", :objectclass => "posixGroup"}
147
147
  end
148
- property :memberuid, String, :key => true#, :field => "memberuid"
149
- property :gidnumber, Integer, :key => true#, :field => "gidnumber"
148
+ property :memberuid, String, :key => true#, :field => "memberUid"
149
+ property :gidnumber, Integer, :key => true#, :field => "gidNumber"
150
150
 
151
151
  def group
152
152
  Group.get!(gidnumber)
@@ -316,7 +316,7 @@ module DataMapper
316
316
  end
317
317
 
318
318
  #puts "read_many"
319
- #p result.size
319
+ #p result
320
320
  result = result.uniq if query.unique?
321
321
  result = query.match_records(result) if query.model.multivalue_field
322
322
  result = query.sort_records_case_insensitive(result)
@@ -332,11 +332,6 @@ module DataMapper
332
332
  query.model.key.collect { |k| k.field },
333
333
  to_ldap_conditions(query),
334
334
  field_names, order_by)
335
- #.sort! do |u1, u2|
336
- # value1 = u1[order_by_sym].first.upcase rescue ""
337
- # value2 = u2[order_by_sym].first.upcase rescue ""
338
- # value1 <=> value2
339
- # end
340
335
  if query.model.multivalue_field
341
336
  props_result = []
342
337
  result.each do |props|
@@ -367,8 +362,6 @@ module DataMapper
367
362
  end
368
363
  end
369
364
  end
370
-
371
- # include ::DataMapper::Transaction::Adapter
372
365
  end
373
366
  end
374
367
  end
data/lib/ldap/digest.rb CHANGED
@@ -1,3 +1,5 @@
1
+ require 'sha1'
2
+ require 'base64'
1
3
  module Ldap
2
4
  class Digest
3
5
  # method from openldap faq which produces the userPassword attribute
@@ -6,8 +8,6 @@ module Ldap
6
8
  # @param salt String the salt for the password digester
7
9
  # @return the encoded password/salt
8
10
  def self.ssha(secret, salt)
9
- require 'sha1'
10
- require 'base64'
11
11
  (salt.empty? ? "{SHA}": "{SSHA}") +
12
12
  Base64.encode64(::Digest::SHA1.digest(secret + salt) + salt).gsub(/\n/, '')
13
13
  end
@@ -44,7 +44,7 @@ module Ldap
44
44
  base = "#{treebase},#{@ldap.base}"
45
45
  if @ldap.add( :dn => dn(dn_prefix, treebase),
46
46
  :attributes => props) || @ldap.get_operation_result.code.to_s == "0"
47
- props[key_field.downcase.to_sym]
47
+ props[key_field.to_sym]
48
48
  else
49
49
  unless silence
50
50
  msg = ldap_error("create",
@@ -70,13 +70,14 @@ module Ldap
70
70
  @ldap.search( :base => "#{treebase},#{@ldap.base}",
71
71
  :attributes => field_names,
72
72
  :filter => filter ) do |res|
73
- map = to_map(res)
73
+ mapp = to_map(field_names, res)
74
+
74
75
  #puts map[key_field.to_sym]
75
76
  # TODO maybe make filter which removes this unless
76
77
  # TODO move this into the ldap_Adapter to make it more general, so that
77
78
  # all field with Integer gets converted, etc
78
- result << map if key_fields.detect do |key_field|
79
- map.member? key_field.to_sym
79
+ result << mapp if key_fields.detect do |key_field|
80
+ mapp.keys.detect {|k| k.to_s.downcase == key_field.downcase }
80
81
  end
81
82
  end
82
83
  result
@@ -140,13 +141,19 @@ module Ldap
140
141
  # helper to extract the Hash from the ldap search result
141
142
  # @param Entry from the ldap_search
142
143
  # @return Hash with name/value pairs of the entry
143
- def to_map(entry)
144
+ def to_map(field_names, entry)
145
+ fields = {:dn => :dn}
146
+ field_names.each { |f| fields[f.downcase.to_sym] = f.to_sym }
144
147
  def entry.map
145
148
  @myhash
146
149
  end
147
- entry.map
150
+ result = {}
151
+ entry.map.each do |k,v|
152
+ result[fields[k]] = v
153
+ end
154
+ result
148
155
  end
149
-
156
+
150
157
  def ldap_error(method, dn)
151
158
  "#{method} error: (#{@ldap.get_operation_result.code}) #{@ldap.get_operation_result.message}\n\tDN: #{dn}"
152
159
  end
@@ -62,8 +62,7 @@ module Ldap
62
62
  LDAP.mod(LDAP::LDAP_MOD_ADD, k.to_s, v.is_a?(::Array) ? v : [v.to_s] )
63
63
  end
64
64
  if @ldap2.add( dn(dn_prefix, treebase), mods)
65
- # :attributes => props) and @ldap.get_operation_result.code.to_s == "0"
66
- props[key_field.downcase.to_sym]
65
+ props[key_field.to_sym]
67
66
  else
68
67
  unless silence
69
68
  msg = ldap_error("create",
@@ -91,14 +90,13 @@ module Ldap
91
90
  LDAP::LDAP_SCOPE_SUBTREE,
92
91
  filter.to_s == "" ? "(objectclass=*)" : filter.to_s.gsub(/\(\(/, "(").gsub(/\)\)/, ")"),
93
92
  field_names, false, 0, 0, order_field) do |res|
94
-
95
- map = to_map(res)
96
- #puts map[key_field.to_sym]
93
+ mapp = to_map(field_names, res)
97
94
  # TODO maybe make filter which removes this unless
98
95
  # TODO move this into the ldap_Adapter to make it more general, so that
99
96
  # all field with Integer gets converted, etc
100
- result << map if key_fields.detect do |key_field|
101
- map.member? key_field.to_sym
97
+ # NOTE: somehow the fields are downcase coming from query.model
98
+ result << mapp if key_fields.detect do |key_field|
99
+ mapp.keys.detect {|k| k.to_s.downcase == key_field.downcase }
102
100
  end
103
101
  end
104
102
  end
@@ -174,10 +172,12 @@ module Ldap
174
172
  # helper to extract the Hash from the ldap search result
175
173
  # @param Entry from the ldap_search
176
174
  # @return Hash with name/value pairs of the entry
177
- def to_map(entry)
175
+ def to_map(field_names, entry)
176
+ fields = {:dn => :dn}
177
+ field_names.each { |f| fields[f.downcase.to_sym] = f.to_sym }
178
178
  map = {}
179
179
  LDAP::entry2hash(entry).each do |k,v|
180
- map[k.downcase.to_sym] = v
180
+ map[fields[k.downcase.to_sym]] = v
181
181
  end
182
182
  map
183
183
  end
@@ -4,9 +4,9 @@ require 'spec_helper'
4
4
  class TestContact
5
5
  include DataMapper::Resource
6
6
 
7
- property :id, Serial, :field => "uidnumber"
7
+ property :id, Serial, :field => "uidNumber"
8
8
  property :login, String, :field => "uid", :unique_index => true
9
- property :hashed_password, String, :field => "userpassword", :lazy => true
9
+ property :hashed_password, String, :field => "userPassword", :lazy => true
10
10
  property :name, String, :field => "cn"
11
11
  property :mail, ::Ldap::LdapArray
12
12
 
data/spec/spec_helper.rb CHANGED
@@ -44,10 +44,10 @@ class User
44
44
  include DataMapper::Resource
45
45
  property :id, Serial, :field => "uidnumber"
46
46
  property :login, String, :field => "uid", :unique_index => true
47
- property :hashed_password, String, :field => "userpassword", :writer => :private
47
+ property :hashed_password, String, :field => "userPassword", :writer => :private
48
48
  property :name, String, :field => "cn"
49
49
  property :mail, String
50
- property :age, Integer, :field => "postalcode"
50
+ property :age, Integer, :field => "postalCode"
51
51
  property :alive, Boolean, :field => "gecos"
52
52
 
53
53
  has n, :roles
@@ -96,7 +96,7 @@ end
96
96
 
97
97
  class Role
98
98
  include DataMapper::Resource
99
- property :id, Serial, :field => "gidnumber"
99
+ property :id, Serial, :field => "gidNumber"
100
100
  property :name, String, :field => "cn"
101
101
 
102
102
  dn_prefix { |role| "cn=#{role.name}" }
@@ -110,7 +110,7 @@ end
110
110
 
111
111
  class Group
112
112
  include DataMapper::Resource
113
- property :id, Serial, :field => "gidnumber"
113
+ property :id, Serial, :field => "gidNumber"
114
114
  property :name, String, :field => "cn"
115
115
 
116
116
  dn_prefix { |group| "cn=#{group.name}" }
@@ -127,14 +127,14 @@ class GroupUser
127
127
 
128
128
  treebase "ou=groups"
129
129
 
130
- multivalue_field :memberuid
130
+ multivalue_field :memberUid
131
131
 
132
132
  ldap_properties do |group_user|
133
133
  {:cn=>"#{group_user.group.name}", :objectclass => "posixGroup"}
134
134
  end
135
135
 
136
- property :user_id, Integer, :key => true, :field => "memberuid"
137
- property :group_id, Integer, :key => true, :field => "gidnumber"
136
+ property :user_id, Integer, :key => true, :field => "memberUid"
137
+ property :group_id, Integer, :key => true, :field => "gidNumber"
138
138
 
139
139
  def group
140
140
  Group.get!(group_id)
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dm-ldap-adapter
3
3
  version: !ruby/object:Gem::Version
4
- hash: 13
4
+ hash: 11
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 4
9
- - 1
10
- version: 0.4.1
9
+ - 2
10
+ version: 0.4.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - mkristian
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-01-17 00:00:00 +05:30
18
+ date: 2011-02-08 00:00:00 +05:30
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -101,7 +101,6 @@ files:
101
101
  - README-example.markdown
102
102
  - README.txt
103
103
  - Rakefile
104
- - example/identity_map.rb
105
104
  - example/posix.rb
106
105
  - ldap-commands.txt
107
106
  - lib/adapters/ldap_adapter.rb
@@ -1,75 +0,0 @@
1
- require 'example/posix.rb'
2
-
3
- USER_REPO = :default
4
-
5
- class User
6
-
7
- def self.ddefault_repository_name
8
- USER_REPO
9
- end
10
-
11
- def self.repository_name
12
- USER_REPO
13
- end
14
-
15
- def authenticate(pwd)
16
- require 'base64'
17
- Base64.encode64(Digest::SHA1.digest(pwd)).gsub(/\n/, '') == attribute_get(:hashed_password)[5,1000]
18
- end
19
- end
20
-
21
- class GroupUser
22
-
23
- def self.ddefault_repository_name
24
- USER_REPO
25
- end
26
-
27
- def self.repository_name
28
- USER_REPO
29
- end
30
-
31
- end
32
-
33
- class Group
34
-
35
- def self.ddefault_repository_name
36
- USER_REPO
37
- end
38
-
39
- def self.repository_name
40
- USER_REPO
41
- end
42
-
43
- end
44
-
45
- require 'adapters/memory_adapter'
46
- DATA_REPO=:store
47
- DataMapper.setup(DATA_REPO, {:adapter => 'memory'})
48
-
49
- class Item
50
- include DataMapper::Resource
51
- property :id, Serial
52
- end
53
-
54
-
55
- DataMapper.repository(USER_REPO) do |repository|
56
- repository.adapter.open_ldap_connection do
57
- DataMapper.repository(DATA_REPO) do
58
- root = User.first(:login => 'root') || User.create(:id => 0, :login => :root, :name => 'root', :password => 'none') if root.nil?
59
- admin = Group.first(:name => 'admin') || Group.create(:name => 'admin')
60
- root.groups << admin
61
-
62
- p DataMapper.repository(USER_REPO).identity_map(User)
63
-
64
- p DataMapper.repository(USER_REPO).identity_map(Group)
65
-
66
- p root.authenticate('none')
67
-
68
- p root.groups
69
-
70
- (1..10).each {Item.create}
71
-
72
- p DataMapper.repository(DATA_REPO).identity_map(Item)
73
- end
74
- end
75
- end