activeldap 0.9.0 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +61 -0
- data/README +8 -1
- data/Rakefile +4 -1
- data/benchmark/bench-al.rb +12 -2
- data/examples/al-admin/app/controllers/account_controller.rb +4 -3
- data/examples/al-admin/app/controllers/application.rb +5 -2
- data/examples/al-admin/app/controllers/directory_controller.rb +3 -1
- data/examples/al-admin/app/controllers/users_controller.rb +19 -4
- data/examples/al-admin/app/controllers/welcome_controller.rb +4 -2
- data/examples/al-admin/app/helpers/application_helper.rb +7 -1
- data/examples/al-admin/app/helpers/url_helper.rb +4 -0
- data/examples/al-admin/app/models/ldap_user.rb +4 -0
- data/examples/al-admin/app/views/_entry/{_attributes_information.rhtml → _attributes_information.html.erb} +0 -0
- data/examples/al-admin/app/views/_entry/{_entry.rhtml → _entry.html.erb} +0 -0
- data/examples/al-admin/app/views/_schema/{_aliases.rhtml → _aliases.html.erb} +0 -0
- data/examples/al-admin/app/views/_switcher/{_after.rhtml → _after.html.erb} +0 -0
- data/examples/al-admin/app/views/_switcher/{_before.rhtml → _before.html.erb} +0 -0
- data/examples/al-admin/app/views/account/{login.rhtml → login.html.erb} +0 -0
- data/examples/al-admin/app/views/account/{sign_up.rhtml → sign_up.html.erb} +0 -0
- data/examples/al-admin/app/views/attributes/{_attributes.rhtml → _attributes.html.erb} +0 -0
- data/examples/al-admin/app/views/attributes/{_detail.rhtml → _detail.html.erb} +0 -0
- data/examples/al-admin/app/views/attributes/{index.rhtml → index.html.erb} +0 -0
- data/examples/al-admin/app/views/attributes/{show.rhtml → show.html.erb} +0 -0
- data/examples/al-admin/app/views/directory/{_tree.rhtml → _tree.html.erb} +0 -0
- data/examples/al-admin/app/views/directory/{_tree_view_js.rhtml → _tree_view_js.html.erb} +4 -5
- data/examples/al-admin/app/views/directory/{index.rhtml → index.html.erb} +0 -0
- data/examples/al-admin/app/views/directory/{populate.rhtml → populate.html.erb} +0 -0
- data/examples/al-admin/app/views/layouts/{_footer.rhtml → _footer.html.erb} +0 -0
- data/examples/al-admin/app/views/layouts/{_header_menu.rhtml → _header_menu.html.erb} +0 -0
- data/examples/al-admin/app/views/layouts/{_main_menu.rhtml → _main_menu.html.erb} +0 -0
- data/examples/al-admin/app/views/layouts/{application.rhtml → application.html.erb} +3 -2
- data/examples/al-admin/app/views/object_classes/{_attributes.rhtml → _attributes.html.erb} +0 -0
- data/examples/al-admin/app/views/object_classes/{_object_classes.rhtml → _object_classes.html.erb} +0 -0
- data/examples/al-admin/app/views/object_classes/{index.rhtml → index.html.erb} +0 -0
- data/examples/al-admin/app/views/object_classes/{show.rhtml → show.html.erb} +0 -0
- data/examples/al-admin/app/views/syntaxes/{_detail.rhtml → _detail.html.erb} +0 -0
- data/examples/al-admin/app/views/syntaxes/{_syntaxes.rhtml → _syntaxes.html.erb} +0 -0
- data/examples/al-admin/app/views/syntaxes/{index.rhtml → index.html.erb} +0 -0
- data/examples/al-admin/app/views/syntaxes/{show.rhtml → show.html.erb} +0 -0
- data/examples/al-admin/app/views/users/{_attributes_update_form.rhtml → _attributes_update_form.html.erb} +0 -0
- data/examples/al-admin/app/views/users/{_form.rhtml → _form.html.erb} +0 -0
- data/examples/al-admin/app/views/users/{_object_classes_update_form.rhtml → _object_classes_update_form.html.erb} +7 -1
- data/examples/al-admin/app/views/users/{_password_change_form.rhtml → _password_change_form.html.erb} +0 -0
- data/examples/al-admin/app/views/users/{edit.rhtml → edit.html.erb} +0 -0
- data/examples/al-admin/app/views/users/{index.rhtml → index.html.erb} +0 -0
- data/examples/al-admin/app/views/users/{show.rhtml → show.html.erb} +0 -0
- data/examples/al-admin/app/views/welcome/{index.rhtml → index.html.erb} +0 -0
- data/examples/al-admin/config/boot.rb +96 -32
- data/examples/al-admin/config/environment.rb +30 -36
- data/examples/al-admin/config/environments/development.rb +2 -5
- data/examples/al-admin/config/environments/production.rb +1 -0
- data/examples/al-admin/config/environments/test.rb +4 -1
- data/examples/al-admin/config/initializers/exception_notifier.rb +2 -0
- data/examples/al-admin/config/initializers/gettext.rb +1 -0
- data/examples/al-admin/config/initializers/inflections.rb +10 -0
- data/examples/al-admin/config/initializers/mime_types.rb +5 -0
- data/examples/al-admin/config/initializers/ralative_url_support.rb +1 -0
- data/examples/al-admin/config/routes.rb +24 -12
- data/examples/al-admin/lib/authenticated_system.rb +1 -1
- data/examples/al-admin/lib/tasks/gettext.rake +1 -1
- data/examples/al-admin/po/en/al-admin.po +102 -100
- data/examples/al-admin/po/ja/al-admin.po +112 -110
- data/examples/al-admin/po/nl/al-admin.po +117 -110
- data/examples/al-admin/public/javascripts/controls.js +484 -354
- data/examples/al-admin/public/javascripts/dragdrop.js +88 -58
- data/examples/al-admin/public/javascripts/effects.js +396 -364
- data/examples/al-admin/public/javascripts/prototype.js +2817 -1107
- data/examples/al-admin/public/stylesheets/base.css +5 -0
- data/examples/al-admin/script/performance/request +3 -0
- data/lib/active_ldap.rb +13 -10
- data/lib/active_ldap/adapter/base.rb +159 -43
- data/lib/active_ldap/adapter/jndi.rb +175 -0
- data/lib/active_ldap/adapter/jndi_connection.rb +180 -0
- data/lib/active_ldap/adapter/ldap.rb +91 -46
- data/lib/active_ldap/adapter/ldap_ext.rb +19 -5
- data/lib/active_ldap/adapter/net_ldap.rb +52 -44
- data/lib/active_ldap/association/has_many_wrap.rb +1 -1
- data/lib/active_ldap/attributes.rb +20 -95
- data/lib/active_ldap/base.rb +195 -186
- data/lib/active_ldap/callbacks.rb +33 -0
- data/lib/active_ldap/command.rb +3 -3
- data/lib/active_ldap/connection.rb +21 -3
- data/lib/active_ldap/distinguished_name.rb +18 -11
- data/lib/active_ldap/entry_attribute.rb +78 -0
- data/lib/active_ldap/human_readable.rb +20 -0
- data/lib/active_ldap/ldif.rb +860 -10
- data/lib/active_ldap/object_class.rb +6 -4
- data/lib/active_ldap/operations.rb +129 -22
- data/lib/active_ldap/schema.rb +118 -9
- data/lib/active_ldap/schema/syntaxes.rb +33 -16
- data/lib/active_ldap/validations.rb +74 -65
- data/po/en/active-ldap.po +378 -768
- data/po/ja/active-ldap.po +935 -868
- data/rails/plugin/active_ldap/init.rb +40 -2
- data/test/al-test-utils.rb +78 -58
- data/test/command.rb +51 -1
- data/test/test-unit-ext/priority.rb +29 -6
- data/test/test_adapter.rb +21 -2
- data/test/test_attributes.rb +13 -0
- data/test/test_base.rb +51 -1
- data/test/test_connection.rb +2 -1
- data/test/test_connection_per_class.rb +55 -1
- data/test/test_connection_per_dn.rb +29 -1
- data/test/test_find.rb +73 -0
- data/test/test_ldif.rb +1829 -15
- data/test/test_load.rb +126 -0
- data/test/test_object_class.rb +23 -5
- data/test/test_schema.rb +28 -0
- data/test/test_syntax.rb +22 -11
- data/test/test_user.rb +16 -25
- data/test/test_useradd-binary.rb +1 -1
- data/test/test_usermod-binary-add-time.rb +1 -1
- data/test/test_usermod-binary-add.rb +1 -1
- data/test/test_validation.rb +100 -22
- metadata +77 -71
- data/data/locale/en/LC_MESSAGES/active-ldap.mo +0 -0
- data/data/locale/ja/LC_MESSAGES/active-ldap.mo +0 -0
- data/examples/al-admin/app/views/layouts/_flash_box.rhtml +0 -4
- data/examples/al-admin/public/stylesheets/common.css +0 -2
- data/examples/al-admin/script/breakpointer +0 -3
data/test/test_load.rb
ADDED
@@ -0,0 +1,126 @@
|
|
1
|
+
require 'al-test-utils'
|
2
|
+
|
3
|
+
class TestLoad < Test::Unit::TestCase
|
4
|
+
include AlTestUtils
|
5
|
+
|
6
|
+
priority :must
|
7
|
+
def test_load_modify_record
|
8
|
+
ldif = ActiveLdap::LDIF.new
|
9
|
+
make_temporary_user do |user, password|
|
10
|
+
user.display_name = "Display Name"
|
11
|
+
assert(user.save)
|
12
|
+
|
13
|
+
user = @user_class.find(user.dn)
|
14
|
+
assert_equal("Display Name", user.display_name)
|
15
|
+
|
16
|
+
record = ActiveLdap::LDIF::ModifyRecord.new(user.dn)
|
17
|
+
ldif << record
|
18
|
+
|
19
|
+
original_descriptions = user.description(true)
|
20
|
+
new_description = "new description"
|
21
|
+
record.add_operation(:add, "description", [],
|
22
|
+
{"description" => [new_description]})
|
23
|
+
|
24
|
+
record.add_operation(:delete, "DisplayName", [], {})
|
25
|
+
|
26
|
+
original_sn = user.sn
|
27
|
+
new_sn = ["New SN1", "New SN2"]
|
28
|
+
record.add_operation(:replace, "sn", [], {"sn" => new_sn})
|
29
|
+
|
30
|
+
ActiveLdap::Base.load(ldif.to_s)
|
31
|
+
|
32
|
+
user = @user_class.find(user.dn)
|
33
|
+
assert_equal(original_descriptions + [new_description],
|
34
|
+
user.description(true))
|
35
|
+
assert_nil(user.display_name)
|
36
|
+
assert_equal(new_sn, user.sn)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_load_move_dn_record
|
41
|
+
assert_load_move_dn_record(ActiveLdap::LDIF::ModifyDNRecord)
|
42
|
+
assert_load_move_dn_record(ActiveLdap::LDIF::ModifyRDNRecord)
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_load_copy_dn_record
|
46
|
+
assert_load_copy_dn_record(ActiveLdap::LDIF::ModifyDNRecord)
|
47
|
+
assert_load_copy_dn_record(ActiveLdap::LDIF::ModifyRDNRecord)
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_load_delete_record
|
51
|
+
ldif = ActiveLdap::LDIF.new
|
52
|
+
make_temporary_user do |user, password|
|
53
|
+
record = ActiveLdap::LDIF::DeleteRecord.new(user.dn)
|
54
|
+
ldif << record
|
55
|
+
assert_true(@user_class.exists?(user.dn))
|
56
|
+
ActiveLdap::Base.load(ldif.to_s)
|
57
|
+
assert_false(@user_class.exists?(user.dn))
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_load_add_record
|
62
|
+
ldif = ActiveLdap::LDIF.new
|
63
|
+
make_temporary_user do |user, password|
|
64
|
+
new_description = "new description"
|
65
|
+
attributes = {
|
66
|
+
"description" => [new_description]
|
67
|
+
}
|
68
|
+
original_descriptions = user.description(true)
|
69
|
+
record = ActiveLdap::LDIF::AddRecord.new(user.dn, [], attributes)
|
70
|
+
ldif << record
|
71
|
+
ActiveLdap::Base.load(ldif.to_s)
|
72
|
+
user.reload
|
73
|
+
assert(original_descriptions + [new_description], user.description(true))
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_load_content_records
|
78
|
+
ldif = ActiveLdap::LDIF.new
|
79
|
+
2.times do
|
80
|
+
make_temporary_user do |user, password|
|
81
|
+
ldif << ActiveLdap::LDIF.parse(user.to_ldif).records[0]
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
original_n_users = @user_class.count
|
86
|
+
ActiveLdap::Base.load(ldif.to_s)
|
87
|
+
assert_equal(2, @user_class.count - original_n_users)
|
88
|
+
end
|
89
|
+
|
90
|
+
priority :normal
|
91
|
+
|
92
|
+
private
|
93
|
+
def assert_load_copy_dn_record(record_class)
|
94
|
+
ldif = ActiveLdap::LDIF.new
|
95
|
+
make_temporary_user do |user, password|
|
96
|
+
new_rdn = "uid=XXX"
|
97
|
+
ensure_delete_user(new_rdn) do
|
98
|
+
record = record_class.new(user.dn, [], new_rdn, false)
|
99
|
+
ldif << record
|
100
|
+
assert_true(@user_class.exists?(user.dn))
|
101
|
+
assert_false(@user_class.exists?(new_rdn))
|
102
|
+
ActiveLdap::Base.load(ldif.to_s)
|
103
|
+
assert_true(@user_class.exists?(user.dn))
|
104
|
+
assert_true(@user_class.exists?(new_rdn))
|
105
|
+
assert_equal(user.cn, @user_class.find(new_rdn).cn)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def assert_load_move_dn_record(record_class)
|
111
|
+
ldif = ActiveLdap::LDIF.new
|
112
|
+
make_temporary_user do |user, password|
|
113
|
+
new_rdn = "uid=XXX"
|
114
|
+
ensure_delete_user(new_rdn) do
|
115
|
+
record = record_class.new(user.dn, [], new_rdn, true)
|
116
|
+
ldif << record
|
117
|
+
assert_true(@user_class.exists?(user.dn))
|
118
|
+
assert_false(@user_class.exists?(new_rdn))
|
119
|
+
ActiveLdap::Base.load(ldif.to_s)
|
120
|
+
assert_false(@user_class.exists?(user.dn))
|
121
|
+
assert_true(@user_class.exists?(new_rdn))
|
122
|
+
assert_equal(user.cn, @user_class.find(new_rdn).cn)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
data/test/test_object_class.rb
CHANGED
@@ -4,15 +4,33 @@ class TestObjectClass < Test::Unit::TestCase
|
|
4
4
|
include AlTestUtils
|
5
5
|
|
6
6
|
priority :must
|
7
|
+
def test_pass_nil_to_set_classes
|
8
|
+
make_temporary_group do |group|
|
9
|
+
assert_raises(ActiveLdap::RequiredObjectClassMissed) do
|
10
|
+
group.classes = nil
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
7
14
|
|
8
15
|
priority :normal
|
16
|
+
def test_pass_nil_to_replace_class
|
17
|
+
make_temporary_group do |group|
|
18
|
+
assert_raises(ActiveLdap::RequiredObjectClassMissed) do
|
19
|
+
group.replace_class(nil)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
9
24
|
def test_case_insensitive_match
|
10
25
|
assert_nothing_raised do
|
11
|
-
@group_class.instantiate
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
26
|
+
@group_class.send(:instantiate,
|
27
|
+
[
|
28
|
+
"cn=test-group,#{@group_class.base}",
|
29
|
+
{
|
30
|
+
:cn => "test-group",
|
31
|
+
:objectClass => ["TOP", "posixgroup"],
|
32
|
+
}
|
33
|
+
])
|
16
34
|
end
|
17
35
|
end
|
18
36
|
|
data/test/test_schema.rb
CHANGED
@@ -2,6 +2,34 @@ require 'al-test-utils'
|
|
2
2
|
|
3
3
|
class TestSchema < Test::Unit::TestCase
|
4
4
|
priority :must
|
5
|
+
def test_normalize_attribute_value
|
6
|
+
entry = {
|
7
|
+
"attributeTypes" =>
|
8
|
+
[
|
9
|
+
"( 0.9.2342.19200300.100.1.25 NAME ( 'dc' 'domainComponent' ) DESC " +
|
10
|
+
"'RFC1274/2247: domain component' EQUALITY caseIgnoreIA5Match SUBSTR " +
|
11
|
+
"caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 " +
|
12
|
+
"SINGLE-VALUE )",
|
13
|
+
],
|
14
|
+
"ldapSyntaxes" =>
|
15
|
+
[
|
16
|
+
"( 1.3.6.1.4.1.1466.109.114.1 NAME 'caseExactIA5Match' " +
|
17
|
+
"SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )",
|
18
|
+
],
|
19
|
+
}
|
20
|
+
|
21
|
+
schema = ActiveLdap::Schema.new(entry)
|
22
|
+
dc = schema.attribute("dc")
|
23
|
+
assert_equal(["com"], dc.normalize_value("com"))
|
24
|
+
assert_equal(["com"], dc.normalize_value(["com"]))
|
25
|
+
assert_raise(ActiveLdap::AttributeValueInvalid) do
|
26
|
+
dc.normalize_value(["com", "co.jp"])
|
27
|
+
end
|
28
|
+
assert_equal([{"lang-en" => ["com"]},
|
29
|
+
{"lang-ja" => ["co.jp"]}],
|
30
|
+
dc.normalize_value([{"lang-en" => "com"},
|
31
|
+
{"lang-ja" => "co.jp"}]))
|
32
|
+
end
|
5
33
|
|
6
34
|
priority :normal
|
7
35
|
def test_syntax_validation
|
data/test/test_syntax.rb
CHANGED
@@ -84,11 +84,12 @@ class TestSyntax < Test::Unit::TestCase
|
|
84
84
|
|
85
85
|
def test_generalized_time_type_cast
|
86
86
|
assert_type_cast_without_validation(nil, nil, "Generalized Time")
|
87
|
-
assert_type_cast(Time.parse("1994/12/16 10:32"), "
|
87
|
+
assert_type_cast(Time.parse("1994/12/16 10:32:12"), "19941216103212",
|
88
88
|
"Generalized Time")
|
89
|
-
assert_type_cast(Time.parse("1994/12/16 10:
|
89
|
+
assert_type_cast(Time.parse("1994/12/16 10:32:12Z"), "19941216103212Z",
|
90
90
|
"Generalized Time")
|
91
|
-
assert_type_cast(Time.parse("1994/12/16 10:32 +09:00"),
|
91
|
+
assert_type_cast(Time.parse("1994/12/16 10:32:12.345 +09:00"),
|
92
|
+
"19941216103212.345+0900",
|
92
93
|
"Generalized Time")
|
93
94
|
end
|
94
95
|
|
@@ -165,12 +166,18 @@ class TestSyntax < Test::Unit::TestCase
|
|
165
166
|
end
|
166
167
|
|
167
168
|
def test_generalized_time_validate
|
168
|
-
assert_valid("
|
169
|
-
assert_valid("
|
170
|
-
assert_valid("
|
169
|
+
assert_valid("19941216103201", "Generalized Time")
|
170
|
+
assert_valid("19941216103212Z", "Generalized Time")
|
171
|
+
assert_valid("19941216103230+0900", "Generalized Time")
|
172
|
+
assert_valid("20080107034615.0Z", "Generalized Time")
|
173
|
+
assert_valid("20080107034615,123-0900", "Generalized Time")
|
171
174
|
|
172
175
|
value = "1994"
|
173
|
-
params = [value.inspect, %w(month day hour minute).join(", ")]
|
176
|
+
params = [value.inspect, %w(month day hour minute second).join(", ")]
|
177
|
+
assert_invalid(_("%s has missing components: %s") % params,
|
178
|
+
value, "Generalized Time")
|
179
|
+
value = "199412161032"
|
180
|
+
params = [value.inspect, %w(second).join(", ")]
|
174
181
|
assert_invalid(_("%s has missing components: %s") % params,
|
175
182
|
value, "Generalized Time")
|
176
183
|
end
|
@@ -217,7 +224,7 @@ class TestSyntax < Test::Unit::TestCase
|
|
217
224
|
assert_valid("1.2.3.4", "OID")
|
218
225
|
assert_valid("cn", "OID")
|
219
226
|
|
220
|
-
assert_invalid_oid("\#@!")
|
227
|
+
assert_invalid_oid("\#@!", "attribute type is missing")
|
221
228
|
end
|
222
229
|
|
223
230
|
def test_other_mailbox_validate
|
@@ -304,9 +311,13 @@ class TestSyntax < Test::Unit::TestCase
|
|
304
311
|
value, "Numeric String")
|
305
312
|
end
|
306
313
|
|
307
|
-
def assert_invalid_oid(value)
|
308
|
-
|
309
|
-
|
314
|
+
def assert_invalid_oid(value, reason=nil)
|
315
|
+
if reason
|
316
|
+
message = _("%s is invalid OID format: %s") % [value.inspect, _(reason)]
|
317
|
+
else
|
318
|
+
message = _("%s is invalid OID format") % value.inspect
|
319
|
+
end
|
320
|
+
assert_invalid(message, value, "OID")
|
310
321
|
end
|
311
322
|
|
312
323
|
def assert_type_cast_without_validation(type_casted_value, original_value,
|
data/test/test_user.rb
CHANGED
@@ -38,17 +38,15 @@ class TestUser < Test::Unit::TestCase
|
|
38
38
|
'This should have returned an array of a ' +
|
39
39
|
'normal cn and a lang-en-us cn.')
|
40
40
|
|
41
|
-
uid_number = 9000
|
41
|
+
uid_number = "9000"
|
42
42
|
user.uid_number = uid_number
|
43
|
-
|
44
|
-
assert_equal(uid_number, user.
|
45
|
-
assert_equal(uid_number.to_s, user.uid_number_before_type_cast)
|
43
|
+
assert_equal(uid_number.to_i, user.uid_number)
|
44
|
+
assert_equal(uid_number, user.uid_number_before_type_cast)
|
46
45
|
|
47
46
|
gid_number = 9000
|
48
47
|
user.gid_number = gid_number
|
49
|
-
# Test to_s on Fixnums
|
50
48
|
assert_equal(gid_number, user.gid_number)
|
51
|
-
assert_equal(gid_number
|
49
|
+
assert_equal(gid_number, user.gid_number_before_type_cast)
|
52
50
|
|
53
51
|
home_directory = '/home/foo'
|
54
52
|
user.home_directory = home_directory
|
@@ -104,42 +102,35 @@ class TestUser < Test::Unit::TestCase
|
|
104
102
|
|
105
103
|
# This tests the reload of a binary_required type
|
106
104
|
def test_binary_required
|
105
|
+
require 'openssl'
|
107
106
|
make_temporary_user do |user, password|
|
108
107
|
# validate add
|
109
108
|
user.user_certificate = nil
|
110
|
-
|
109
|
+
assert_nil(user.user_certificate)
|
111
110
|
assert_nothing_raised() { user.save! }
|
112
|
-
|
111
|
+
assert_nil(user.user_certificate)
|
113
112
|
|
114
113
|
user.user_certificate = {"binary" => [certificate]}
|
115
|
-
assert_equal(
|
116
|
-
user.user_certificate,
|
117
|
-
'This should have been forced to be a binary subtype.')
|
114
|
+
assert_equal(certificate, user.user_certificate)
|
118
115
|
assert_nothing_raised() { user.save! }
|
119
|
-
assert_equal(
|
120
|
-
user.user_certificate,
|
121
|
-
'This should have been forced to be a binary subtype.')
|
116
|
+
assert_equal(certificate, user.user_certificate)
|
122
117
|
|
123
118
|
# now test modify
|
124
119
|
user.user_certificate = nil
|
125
|
-
|
120
|
+
assert_nil(user.user_certificate)
|
126
121
|
assert_nothing_raised() { user.save! }
|
127
|
-
|
122
|
+
assert_nil(user.user_certificate)
|
128
123
|
|
129
124
|
user.user_certificate = certificate
|
130
|
-
assert_equal(
|
131
|
-
user.user_certificate,
|
132
|
-
'This should have been forced to be a binary subtype.')
|
125
|
+
assert_equal(certificate, user.user_certificate)
|
133
126
|
assert_nothing_raised() { user.save! }
|
134
127
|
|
135
128
|
# validate modify
|
136
129
|
user = @user_class.find(user.uid)
|
137
|
-
assert_equal(
|
138
|
-
user.user_certificate,
|
139
|
-
'This should have been forced to be a binary subtype.')
|
130
|
+
assert_equal(certificate, user.user_certificate)
|
140
131
|
|
141
132
|
expected_cert = OpenSSL::X509::Certificate.new(certificate)
|
142
|
-
actual_cert = user.user_certificate
|
133
|
+
actual_cert = user.user_certificate
|
143
134
|
actual_cert = OpenSSL::X509::Certificate.new(actual_cert)
|
144
135
|
assert_equal(expected_cert.subject.to_s,
|
145
136
|
actual_cert.subject.to_s,
|
@@ -150,10 +141,10 @@ class TestUser < Test::Unit::TestCase
|
|
150
141
|
def test_binary_required_nested
|
151
142
|
make_temporary_user do |user, password|
|
152
143
|
user.user_certificate = {"lang-en" => [certificate]}
|
153
|
-
assert_equal({'lang-en' =>
|
144
|
+
assert_equal({'lang-en' => certificate},
|
154
145
|
user.user_certificate)
|
155
146
|
assert_nothing_raised() { user.save! }
|
156
|
-
assert_equal({'lang-en' =>
|
147
|
+
assert_equal({'lang-en' => certificate},
|
157
148
|
user.user_certificate)
|
158
149
|
end
|
159
150
|
end
|
data/test/test_useradd-binary.rb
CHANGED
@@ -46,7 +46,7 @@ class TestUseraddBinary < Test::Unit::TestCase
|
|
46
46
|
assert_equal(['person', 'posixAccount', 'shadowAccount',
|
47
47
|
'strongAuthenticationUser'].sort, user.classes.sort)
|
48
48
|
cert = File.read(File.join(@examples_dir, 'example.der'))
|
49
|
-
assert_equal(
|
49
|
+
assert_equal(cert, user.user_certificate)
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
@@ -48,7 +48,7 @@ class TestUsermodBinaryAddTime < Test::Unit::TestCase
|
|
48
48
|
assert_equal((previous_classes + ['strongAuthenticationUser']).sort,
|
49
49
|
user.classes.sort)
|
50
50
|
cert = File.read(File.join(@examples_dir, 'example.der'))
|
51
|
-
assert_equal(
|
51
|
+
assert_equal(cert, user.user_certificate)
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
@@ -48,7 +48,7 @@ class TestUsermodBinaryAdd < Test::Unit::TestCase
|
|
48
48
|
assert_equal((previous_classes + ['strongAuthenticationUser']).sort,
|
49
49
|
user.classes.sort)
|
50
50
|
cert = File.read(File.join(@examples_dir, 'example.der'))
|
51
|
-
assert_equal(
|
51
|
+
assert_equal(cert, user.user_certificate)
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
data/test/test_validation.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
1
2
|
require 'al-test-utils'
|
2
3
|
|
3
4
|
class TestValidation < Test::Unit::TestCase
|
@@ -5,6 +6,63 @@ class TestValidation < Test::Unit::TestCase
|
|
5
6
|
include ActiveLdap::Helper
|
6
7
|
|
7
8
|
priority :must
|
9
|
+
def test_validate_excluded_classes
|
10
|
+
make_temporary_user do |user,|
|
11
|
+
user.save
|
12
|
+
user.classes -= ['person']
|
13
|
+
assert(user.save)
|
14
|
+
user.class.excluded_classes = ['person']
|
15
|
+
assert(!user.save)
|
16
|
+
if ActiveLdap.get_text_supported?
|
17
|
+
format = n_("%{fn} has excluded value: %s",
|
18
|
+
"%{fn} has excluded values: %s",
|
19
|
+
1) % {:fn => la_("objectClass")}
|
20
|
+
message = format % loc_("person")
|
21
|
+
else
|
22
|
+
message = "ObjectClass has excluded value: person"
|
23
|
+
end
|
24
|
+
assert_equal([message], user.errors.full_messages)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
priority :normal
|
29
|
+
def test_valid_subtype_and_single_value
|
30
|
+
make_temporary_user do |user, password|
|
31
|
+
user.display_name = [{"lang-ja" => ["ユーザ"]},
|
32
|
+
{"lang-en" => "User"}]
|
33
|
+
assert(user.save)
|
34
|
+
|
35
|
+
user = user.class.find(user.dn)
|
36
|
+
assert_equal([{"lang-ja" => "ユーザ"}, {"lang-en" => "User"}],
|
37
|
+
user.display_name)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_invalid_subtype_and_single_value
|
42
|
+
assert_invalid_display_name_value(["User1", "User2"],
|
43
|
+
["User1", "User2"])
|
44
|
+
assert_invalid_display_name_value(["User3", "User4"],
|
45
|
+
[{"lang-en" => ["User3", "User4"]}],
|
46
|
+
{"lang-en" => ["User3", "User4"]}.inspect)
|
47
|
+
assert_invalid_display_name_value(["U2", "U3"],
|
48
|
+
[{"lang-ja" => ["User1"]},
|
49
|
+
{"lang-en" => ["U2", "U3"]}],
|
50
|
+
[{"lang-ja" => "User1"},
|
51
|
+
{"lang-en" => ["U2", "U3"]}].inspect)
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_validate_required_ldap_values
|
55
|
+
make_temporary_user(:simple => true) do |user, password|
|
56
|
+
assert(user.save)
|
57
|
+
|
58
|
+
user.add_class("strongAuthenticationUser")
|
59
|
+
user.user_certificate = nil
|
60
|
+
assert(!user.save)
|
61
|
+
assert(user.errors.invalid?(:userCertificate))
|
62
|
+
assert_equal(1, user.errors.size)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
8
66
|
def test_syntax_validation
|
9
67
|
make_temporary_user do |user, password|
|
10
68
|
assert(user.save)
|
@@ -26,7 +84,6 @@ class TestValidation < Test::Unit::TestCase
|
|
26
84
|
"lang-ja-jp")
|
27
85
|
end
|
28
86
|
|
29
|
-
priority :normal
|
30
87
|
def test_duplicated_dn_creation
|
31
88
|
assert(ou_class.new("YYY").save)
|
32
89
|
ou = ou_class.new("YYY")
|
@@ -70,6 +127,29 @@ class TestValidation < Test::Unit::TestCase
|
|
70
127
|
end
|
71
128
|
|
72
129
|
private
|
130
|
+
def assert_invalid_value(name, formatted_value, syntax, reason, model, option)
|
131
|
+
syntax_description = lsd_(syntax)
|
132
|
+
assert_not_nil(syntax_description)
|
133
|
+
params = [formatted_value, syntax_description, reason]
|
134
|
+
params.unshift(option) if option
|
135
|
+
if ActiveLdap.get_text_supported?
|
136
|
+
if option
|
137
|
+
format = _("%{fn} (%s) has invalid format: %s: required syntax: %s: %s")
|
138
|
+
else
|
139
|
+
format = _("%{fn} has invalid format: %s: required syntax: %s: %s")
|
140
|
+
end
|
141
|
+
format = format % {:fn => la_(name)}
|
142
|
+
assert_equal([format % params], model.errors.full_messages)
|
143
|
+
else
|
144
|
+
if option
|
145
|
+
format = _("(%s) has invalid format: %s: required syntax: %s: %s")
|
146
|
+
else
|
147
|
+
format = _("has invalid format: %s: required syntax: %s: %s")
|
148
|
+
end
|
149
|
+
assert_equal(["#{name} #{format % params}"], model.errors.full_messages)
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
73
153
|
def assert_invalid_see_also_value(invalid_value, value, option=nil)
|
74
154
|
make_temporary_user do |user, password|
|
75
155
|
assert(user.save)
|
@@ -82,29 +162,27 @@ class TestValidation < Test::Unit::TestCase
|
|
82
162
|
assert(user.errors.invalid?(:seeAlso))
|
83
163
|
assert_equal(1, user.errors.size)
|
84
164
|
|
85
|
-
syntax_description = lsd_("1.3.6.1.4.1.1466.115.121.1.12")
|
86
|
-
assert_not_nil(syntax_description)
|
87
165
|
reason_params = [invalid_value, _("attribute value is missing")]
|
88
166
|
reason = _('%s is invalid distinguished name (DN): %s') % reason_params
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
167
|
+
assert_invalid_value("seeAlso", value.inspect,
|
168
|
+
"1.3.6.1.4.1.1466.115.121.1.12",
|
169
|
+
reason, user, option)
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
def assert_invalid_display_name_value(invalid_value, value,
|
174
|
+
formatted_value=nil)
|
175
|
+
make_temporary_user do |user, password|
|
176
|
+
assert(user.save)
|
177
|
+
|
178
|
+
user.display_name = value
|
179
|
+
assert(!user.save)
|
180
|
+
|
181
|
+
reason_params = [la_("displayName"), invalid_value.inspect]
|
182
|
+
reason = _('Attribute %s can only have a single value: %s') % reason_params
|
183
|
+
assert_invalid_value("displayName", formatted_value || value.inspect,
|
184
|
+
"1.3.6.1.4.1.1466.115.121.1.15",
|
185
|
+
reason, user, nil)
|
108
186
|
end
|
109
187
|
end
|
110
188
|
end
|