ruby-activeldap 0.8.0 → 0.8.1

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/CHANGES CHANGED
@@ -1,3 +1,20 @@
1
+ 0.8.1:
2
+ * used Dependencies.load_paths.
3
+ * check whether attribute name is available or not.
4
+ * added test for find(:first, :attribute => 'xxx', :value => 'yyy').
5
+ * supported ActiveSupport 1.4.0.
6
+ * make the dual licensing of ruby-activeldap clear in the README.
7
+ * followed edge Rails: don't use Reloadable::Subclasses if doesn't need.
8
+ * added examples/.
9
+ * removed debug code.
10
+ * normalized attribute name to support wrong attribute names in MUST/MAY.
11
+ * supported getting dn value by Base#[].
12
+ * test/test_userls.rb: followed userls changes.
13
+ * update the doc href.
14
+ * provide a dumb example of how to use the old association(return_objects) style API with the new awesome API.
15
+ * followed new API.
16
+ * removed a finished task: support Reloadable::Subclasses.
17
+
1
18
  0.8.0:
2
19
  * Makefile/gemspec system replaced with Rakefile + Hoe
3
20
  * Bugfix: Allow base to be empty
data/README CHANGED
@@ -16,7 +16,7 @@ difficulty.
16
16
  For example and usage - read the rdoc in doc/ from lib/activeldap.rb.
17
17
  It is also available on the web at:
18
18
 
19
- http://static.dataspill.org/projects/libraries/ruby/activeldap/rdoc/
19
+ http://ruby-activeldap.rubyforge.org/
20
20
 
21
21
  PREREQUISITES
22
22
 
@@ -43,10 +43,10 @@ INSTALL
43
43
 
44
44
  LICENCE
45
45
 
46
- This program is free software; you can redistribute it and/or modify
47
- it under the terms of the GNU General Public License as published by
48
- the Free Software Foundation; either version 2, or (at your option)
49
- any later version.
46
+ This program is free software; you can redistribute it and/or modify it. It is
47
+ dual licensed under Ruby's license and under the terms of the GNU General
48
+ Public License as published by the Free Software Foundation; either version 2,
49
+ or (at your option) any later version.
50
50
 
51
51
  Please see the file LICENSE for the terms of the licence.
52
52
 
data/TODO CHANGED
@@ -8,9 +8,6 @@ http://api.rubyonrails.com/classes/ActiveRecord/Base.html#M000865
8
8
  - handle all exception raised from Ruby/LDAP and wrap as
9
9
  ActiveLdap exception. I think we need to develop an
10
10
  application using ActiveLdap.
11
- - support Reloadable::Subclasses. I think we need to
12
- develop a Rails + ActiveLdap application to improve
13
- Rails support.
14
11
  - support Ruby/GetText.
15
12
  - support Net::LDAP as LDAP backend after Net::LDAP
16
13
  supports START_TLS. (I made a patch and submitted to the
@@ -55,7 +55,7 @@ def populate_base
55
55
  name, value = suffix.split(/=/, 2)
56
56
  next unless name == "dc"
57
57
  dc_class = Class.new(ActiveLdap::Base)
58
- dc_class.ldap_mapping :dnattr => "dc",
58
+ dc_class.ldap_mapping :dn_attribute => "dc",
59
59
  :prefix => "",
60
60
  :scope => :base,
61
61
  :classes => ["top", "dcObject", "organization"]
@@ -73,7 +73,7 @@ end
73
73
 
74
74
  def populate_users
75
75
  ou_class = Class.new(ActiveLdap::Base)
76
- ou_class.ldap_mapping :dnattr => "ou",
76
+ ou_class.ldap_mapping :dn_attribute => "ou",
77
77
  :prefix => "",
78
78
  :classes => ["top", "organizationalUnit"]
79
79
  ou_class.new(LDAP_PREFIX.split(/=/)[1]).save!
@@ -109,7 +109,7 @@ def main(argv)
109
109
  do_populate = LDAP_USER && LDAP_PASSWORD
110
110
 
111
111
  if do_populate
112
- config[:bind_format] = LDAP_USER
112
+ config[:bind_dn] = LDAP_USER
113
113
  config[:password] = LDAP_PASSWORD
114
114
  end
115
115
  ActiveLdap::Base.establish_connection(config)
@@ -931,6 +931,11 @@ require_gem_if_need = Proc.new do |library_name, gem_name|
931
931
  end
932
932
 
933
933
  require_gem_if_need.call("active_support", "activesupport")
934
+
935
+ if Dependencies.respond_to?(:load_paths)
936
+ Dependencies.load_paths << File.expand_path(File.dirname(__FILE__))
937
+ end
938
+
934
939
  require 'active_ldap/base'
935
940
  require 'active_ldap/associations'
936
941
  require 'active_ldap/configuration'
@@ -944,7 +949,7 @@ require 'active_ldap/validations'
944
949
  require 'active_ldap/callbacks'
945
950
 
946
951
  module ActiveLdap
947
- VERSION = "0.8.0"
952
+ VERSION = "0.8.1"
948
953
  end
949
954
 
950
955
  ActiveLdap::Base.class_eval do
@@ -135,13 +135,25 @@ module ActiveLdap
135
135
  class AdapterNotSpecified < Error
136
136
  end
137
137
 
138
+ class UnknownAttribute < Error
139
+ attr_reader :name
140
+ def initialize(name)
141
+ @name = name
142
+ super("#{@name} is unknown attribute")
143
+ end
144
+ end
145
+
138
146
  # Base
139
147
  #
140
148
  # Base is the primary class which contains all of the core
141
149
  # ActiveLdap functionality. It is meant to only ever be subclassed
142
150
  # by extension classes.
143
151
  class Base
144
- include Reloadable::Subclasses
152
+ if Reloadable.const_defined?(:Deprecated)
153
+ include Reloadable::Deprecated
154
+ else
155
+ include Reloadable::Subclasses
156
+ end
145
157
 
146
158
  VALID_LDAP_MAPPING_OPTIONS = [:dn_attribute, :prefix, :classes, :scope]
147
159
 
@@ -916,7 +928,11 @@ module ActiveLdap
916
928
  end
917
929
 
918
930
  def [](name, force_array=false)
919
- get_attribute(name, force_array)
931
+ if name == "dn"
932
+ array_of(dn, force_array)
933
+ else
934
+ get_attribute(name, force_array)
935
+ end
920
936
  end
921
937
 
922
938
  def []=(name, value)
@@ -1033,14 +1049,20 @@ module ActiveLdap
1033
1049
  @musts[objc] = attributes[:must]
1034
1050
  @mays[objc] = attributes[:may]
1035
1051
  end
1036
- @must = @musts.values.flatten.uniq
1037
- @may = @mays.values.flatten.uniq
1052
+ @must = normalize_attribute_names(@musts.values)
1053
+ @may = normalize_attribute_names(@mays.values)
1038
1054
  (@must + @may).uniq.each do |attr|
1039
1055
  # Update attr_method with appropriate
1040
1056
  define_attribute_methods(attr)
1041
1057
  end
1042
1058
  end
1043
1059
 
1060
+ def normalize_attribute_names(names)
1061
+ names.flatten.uniq.collect do |may|
1062
+ schema.attribute_aliases(may).first
1063
+ end
1064
+ end
1065
+
1044
1066
  alias_method :base_of_class, :base
1045
1067
  def base
1046
1068
  logger.debug {"stub: called base"}
@@ -1100,6 +1122,7 @@ module ActiveLdap
1100
1122
 
1101
1123
  # Get the attr and clean up the input
1102
1124
  attr = to_real_attribute_name(name)
1125
+ raise UnknownAttribute.new(name) if attr.nil?
1103
1126
 
1104
1127
  if attr == dn_attribute and value.is_a?(String)
1105
1128
  value = value.gsub(/,#{Regexp.escape(base_of_class)}$/, '')
@@ -1139,8 +1162,7 @@ module ActiveLdap
1139
1162
  def define_attribute_methods(attr)
1140
1163
  logger.debug {"stub: called define_attribute_methods(#{attr.inspect})"}
1141
1164
  return if @attr_methods.has_key? attr
1142
- aliases = schema.attribute_aliases(attr)
1143
- aliases.each do |ali|
1165
+ schema.attribute_aliases(attr).each do |ali|
1144
1166
  logger.debug {"associating #{ali} --> #{attr}"}
1145
1167
  @attr_methods[ali] = attr
1146
1168
  logger.debug {"associating #{Inflector.underscore(ali)}" +
@@ -130,7 +130,6 @@ module ActiveLdap
130
130
  # Returns the value of self.class.schema
131
131
  # This is just syntactic sugar
132
132
  def schema
133
- logger.debug {"stub: called schema"}
134
133
  self.class.schema
135
134
  end
136
135
  end
@@ -6,6 +6,7 @@ require 'yaml'
6
6
  require 'socket'
7
7
  require 'openssl'
8
8
  require 'rbconfig'
9
+ require 'tempfile'
9
10
 
10
11
  require 'active_ldap'
11
12
 
@@ -4,6 +4,38 @@ class TestBase < Test::Unit::TestCase
4
4
  include AlTestUtils
5
5
 
6
6
  priority :must
7
+ def test_new_without_class
8
+ no_class_class = Class.new(ActiveLdap::Base)
9
+ no_class_class.ldap_mapping :dn_attribute => "dc", :prefix => "",
10
+ :classes => []
11
+ assert_raises(ActiveLdap::UnknownAttribute) do
12
+ no_class_class.new("xxx")
13
+ end
14
+ end
15
+
16
+ priority :normal
17
+ def test_save_for_dNSDomain
18
+ domain_class = Class.new(ActiveLdap::Base)
19
+ domain_class.ldap_mapping :dn_attribute => "dc", :prefix => "",
20
+ :classes => ['top', 'dcObject', 'dNSDomain']
21
+ name = "ftp"
22
+ a_record = "192.168.1.1"
23
+
24
+ domain = domain_class.new('ftp')
25
+ domain.a_record = a_record
26
+ assert(domain.save)
27
+ assert_equal(a_record, domain.a_record)
28
+ assert_equal(a_record, domain_class.find(name).a_record)
29
+ ensure
30
+ domain_class.delete(name) if domain_class.exists?(name)
31
+ end
32
+
33
+ def test_dn_by_index_getter
34
+ make_temporary_user do |user,|
35
+ assert_equal(user.dn, user["dn"])
36
+ end
37
+ end
38
+
7
39
  def test_create_multiple
8
40
  ensure_delete_user("temp-user1") do |uid1,|
9
41
  ensure_delete_user("temp-user2") do |uid2,|
@@ -52,7 +84,6 @@ class TestBase < Test::Unit::TestCase
52
84
  end
53
85
  end
54
86
 
55
- priority :normal
56
87
  def test_reload_of_not_exists_entry
57
88
  make_temporary_user do |user,|
58
89
  assert_nothing_raised do
@@ -15,6 +15,8 @@ class TestFind < Test::Unit::TestCase
15
15
  make_temporary_user do |user, password|
16
16
  assert_equal(user.uid, @user_class.find(:first).uid)
17
17
  assert_equal(user.uid, @user_class.find(user.uid).uid)
18
+ options = {:attribute => "cn", :value => user.cn}
19
+ assert_equal(user.uid, @user_class.find(:first, options).uid)
18
20
  assert_equal(user.to_ldif, @user_class.find(:first).to_ldif)
19
21
  assert_equal([user.uid], @user_class.find(:all).collect {|u| u.uid})
20
22
 
@@ -23,14 +23,14 @@ class TestUserls < Test::Unit::TestCase
23
23
 
24
24
  def test_list_user_no_group
25
25
  make_temporary_user do |user, password|
26
- assert_userls_successfully(user.uid, [])
26
+ assert_userls_successfully(user.uid, [], [])
27
27
  end
28
28
  end
29
29
 
30
30
  def test_list_user_have_primary_group
31
31
  make_temporary_group do |group|
32
32
  make_temporary_user(:gid_number => group.gid_number) do |user, password|
33
- assert_userls_successfully(user.uid, [group])
33
+ assert_userls_successfully(user.uid, [group], [])
34
34
  end
35
35
  end
36
36
  end
@@ -42,7 +42,7 @@ class TestUserls < Test::Unit::TestCase
42
42
  make_temporary_user(options) do |user, password|
43
43
  user.groups << group1
44
44
  user.groups << group2
45
- assert_userls_successfully(user.uid, [group1, group2])
45
+ assert_userls_successfully(user.uid, [], [group1, group2])
46
46
  end
47
47
  end
48
48
  end
@@ -55,7 +55,7 @@ class TestUserls < Test::Unit::TestCase
55
55
  make_temporary_group do |group3|
56
56
  user.groups << group2
57
57
  user.groups << group3
58
- assert_userls_successfully(user.uid, [group1, group2, group3])
58
+ assert_userls_successfully(user.uid, [group1], [group2, group3])
59
59
  end
60
60
  end
61
61
  end
@@ -63,13 +63,18 @@ class TestUserls < Test::Unit::TestCase
63
63
  end
64
64
 
65
65
  private
66
- def assert_userls_successfully(name, groups, *args, &block)
66
+ def assert_userls_successfully(name, primary_groups, groups, *args, &block)
67
67
  _wrap_assertion do
68
68
  assert(@user_class.exists?(name))
69
69
  args.concat([name])
70
70
  user = @user_class.find(name)
71
- groups = groups.collect {|g| "#{g.cn}[#{g.gid_number}]"}
72
- result = "#{user.to_ldif}Groups: #{groups.join(', ')}\n"
71
+ group_names = groups.collect {|g| "#{g.cn}"}
72
+ group_infos = (primary_groups + groups).collect do |g|
73
+ "#{g.cn}[#{g.gid_number}]"
74
+ end
75
+ result = user.to_ldif
76
+ result << "Groups by name only: #{group_names.join(', ')}\n"
77
+ result << "Groups: #{group_infos.join(', ')}\n"
73
78
  assert_equal([true, result], run_command(*args, &block))
74
79
  assert(@user_class.exists?(name))
75
80
  end
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
3
3
  specification_version: 1
4
4
  name: ruby-activeldap
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.8.0
7
- date: 2006-11-20 00:00:00 +00:00
6
+ version: 0.8.1
7
+ date: 2007-01-28 00:00:00 +00:00
8
8
  summary: Ruby/ActiveLdap is a object-oriented API to LDAP
9
9
  require_paths:
10
10
  - lib
@@ -92,8 +92,8 @@ test_files:
92
92
  - test/TODO
93
93
  - test/config.yaml.sample
94
94
  - test/test_reflection.rb
95
- - test/test_connection_per_class.rb
96
95
  - test/test_callback.rb
96
+ - test/test_connection_per_class.rb
97
97
  - test/test_connection.rb
98
98
  - test/test_schema.rb
99
99
  - test/test_userdel.rb
@@ -102,7 +102,6 @@ test_files:
102
102
  - test/test_base.rb
103
103
  - test/test_userls.rb
104
104
  - test/test_lpasswd.rb
105
- - test/config.yaml
106
105
  rdoc_options: []
107
106
 
108
107
  extra_rdoc_files: []
@@ -1,8 +0,0 @@
1
- test:
2
- host: 127.0.0.1
3
- method: :plain
4
- base: dc=localdomain
5
- bind_dn: cn=admin,dc=localdomain
6
- password: password
7
- retry_limit: 1
8
- timeout: 0