ruby-activeldap 0.7.4 → 0.8.0

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.
Files changed (74) hide show
  1. data/CHANGES +375 -0
  2. data/COPYING +340 -0
  3. data/LICENSE +58 -0
  4. data/Manifest.txt +33 -0
  5. data/README +63 -0
  6. data/Rakefile +37 -0
  7. data/TODO +31 -0
  8. data/benchmark/bench-al.rb +152 -0
  9. data/lib/{activeldap.rb → active_ldap.rb} +280 -263
  10. data/lib/active_ldap/adaptor/base.rb +29 -0
  11. data/lib/active_ldap/adaptor/ldap.rb +466 -0
  12. data/lib/active_ldap/association/belongs_to.rb +38 -0
  13. data/lib/active_ldap/association/belongs_to_many.rb +40 -0
  14. data/lib/active_ldap/association/collection.rb +80 -0
  15. data/lib/active_ldap/association/has_many.rb +48 -0
  16. data/lib/active_ldap/association/has_many_wrap.rb +56 -0
  17. data/lib/active_ldap/association/proxy.rb +89 -0
  18. data/lib/active_ldap/associations.rb +162 -0
  19. data/lib/active_ldap/attributes.rb +199 -0
  20. data/lib/active_ldap/base.rb +1343 -0
  21. data/lib/active_ldap/callbacks.rb +19 -0
  22. data/lib/active_ldap/command.rb +46 -0
  23. data/lib/active_ldap/configuration.rb +96 -0
  24. data/lib/active_ldap/connection.rb +137 -0
  25. data/lib/{activeldap → active_ldap}/ldap.rb +1 -1
  26. data/lib/active_ldap/object_class.rb +70 -0
  27. data/lib/active_ldap/schema.rb +258 -0
  28. data/lib/{activeldap → active_ldap}/timeout.rb +0 -0
  29. data/lib/{activeldap → active_ldap}/timeout_stub.rb +0 -0
  30. data/lib/active_ldap/user_password.rb +92 -0
  31. data/lib/active_ldap/validations.rb +78 -0
  32. data/rails/plugin/active_ldap/README +54 -0
  33. data/rails/plugin/active_ldap/init.rb +6 -0
  34. data/test/TODO +2 -0
  35. data/test/al-test-utils.rb +337 -0
  36. data/test/command.rb +62 -0
  37. data/test/config.yaml +8 -0
  38. data/test/config.yaml.sample +6 -0
  39. data/test/run-test.rb +17 -0
  40. data/test/test-unit-ext.rb +2 -0
  41. data/test/test_associations.rb +334 -0
  42. data/test/test_attributes.rb +71 -0
  43. data/test/test_base.rb +345 -0
  44. data/test/test_base_per_instance.rb +32 -0
  45. data/test/test_bind.rb +53 -0
  46. data/test/test_callback.rb +35 -0
  47. data/test/test_connection.rb +38 -0
  48. data/test/test_connection_per_class.rb +50 -0
  49. data/test/test_find.rb +36 -0
  50. data/test/test_groupadd.rb +50 -0
  51. data/test/test_groupdel.rb +46 -0
  52. data/test/test_groupls.rb +107 -0
  53. data/test/test_groupmod.rb +51 -0
  54. data/test/test_lpasswd.rb +75 -0
  55. data/test/test_object_class.rb +32 -0
  56. data/test/test_reflection.rb +173 -0
  57. data/test/test_schema.rb +166 -0
  58. data/test/test_user.rb +209 -0
  59. data/test/test_user_password.rb +93 -0
  60. data/test/test_useradd-binary.rb +59 -0
  61. data/test/test_useradd.rb +55 -0
  62. data/test/test_userdel.rb +48 -0
  63. data/test/test_userls.rb +86 -0
  64. data/test/test_usermod-binary-add-time.rb +62 -0
  65. data/test/test_usermod-binary-add.rb +61 -0
  66. data/test/test_usermod-binary-del.rb +64 -0
  67. data/test/test_usermod-lang-add.rb +57 -0
  68. data/test/test_usermod.rb +56 -0
  69. data/test/test_validation.rb +38 -0
  70. metadata +94 -21
  71. data/lib/activeldap/associations.rb +0 -170
  72. data/lib/activeldap/base.rb +0 -1456
  73. data/lib/activeldap/configuration.rb +0 -59
  74. data/lib/activeldap/schema2.rb +0 -217
@@ -0,0 +1,93 @@
1
+ require 'al-test-utils'
2
+
3
+ class TestUserPassword < Test::Unit::TestCase
4
+ priority :must
5
+
6
+ priority :normal
7
+ def test_valid?
8
+ plain_password = "password"
9
+ %w(crypt md5 smd5 sha ssha).each do |type|
10
+ hashed_password = ActiveLdap::UserPassword.send(type, plain_password)
11
+ assert_send([ActiveLdap::UserPassword, :valid?,
12
+ plain_password, hashed_password])
13
+ end
14
+ end
15
+
16
+ def test_crypt
17
+ salt = ".WoUoU9f3IlUx9Hh7D/8y.xA6ziklGib"
18
+ assert_equal("{CRYPT}.W57FZhV52w0s",
19
+ ActiveLdap::UserPassword.crypt("password", salt))
20
+
21
+ password = "PASSWORD"
22
+ hashed_password = ActiveLdap::UserPassword.crypt(password)
23
+ salt = hashed_password.sub(/^\{CRYPT\}/, '')
24
+ assert_equal(hashed_password,
25
+ ActiveLdap::UserPassword.crypt(password, salt))
26
+ end
27
+
28
+ def test_extract_salt_for_crypt
29
+ assert_extract_salt(:crypt, "AB", "ABCDE")
30
+ assert_extract_salt(:crypt, "$1", "$1")
31
+ assert_extract_salt(:crypt, "$1$$", "$1$")
32
+ assert_extract_salt(:crypt, "$1$$", "$1$$")
33
+ assert_extract_salt(:crypt, "$1$abcdefgh$", "$1$abcdefgh$")
34
+ assert_extract_salt(:crypt, "$1$abcdefgh$", "$1$abcdefghi$")
35
+ end
36
+
37
+ def test_md5
38
+ assert_equal("{MD5}X03MO1qnZdYdgyfeuILPmQ==",
39
+ ActiveLdap::UserPassword.md5("password"))
40
+ end
41
+
42
+ def test_smd5
43
+ assert_equal("{SMD5}gjz+SUSfZaux99Xsji/No200cGI=",
44
+ ActiveLdap::UserPassword.smd5("password", "m4pb"))
45
+
46
+ password = "PASSWORD"
47
+ hashed_password = ActiveLdap::UserPassword.smd5(password)
48
+ salt = Base64.decode64(hashed_password.sub(/^\{SMD5\}/, ''))[-4, 4]
49
+ assert_equal(hashed_password,
50
+ ActiveLdap::UserPassword.smd5(password, salt))
51
+ end
52
+
53
+ def test_extract_salt_for_smd5
54
+ assert_extract_salt(:smd5, nil, Base64.encode64("").chomp)
55
+ assert_extract_salt(:smd5, nil, Base64.encode64("1").chomp)
56
+ assert_extract_salt(:smd5, nil, Base64.encode64("12").chomp)
57
+ assert_extract_salt(:smd5, nil, Base64.encode64("123").chomp)
58
+ assert_extract_salt(:smd5, "ABCD", Base64.encode64("ABCD").chomp)
59
+ assert_extract_salt(:smd5, "BCDE", Base64.encode64("ABCDE").chomp)
60
+ end
61
+
62
+ def test_sha
63
+ assert_equal("{SHA}W6ph5Mm5Pz8GgiULbPgzG37mj9g=",
64
+ ActiveLdap::UserPassword.sha("password"))
65
+ end
66
+
67
+ def test_ssha
68
+ assert_equal("{SSHA}ipnlCLA1HaK3mm3hyneJIp+Px2h1RGk3",
69
+ ActiveLdap::UserPassword.ssha("password", "uDi7"))
70
+
71
+ password = "PASSWORD"
72
+ hashed_password = ActiveLdap::UserPassword.ssha(password)
73
+ salt = Base64.decode64(hashed_password.sub(/^\{SSHA\}/, ''))[-4, 4]
74
+ assert_equal(hashed_password,
75
+ ActiveLdap::UserPassword.ssha(password, salt))
76
+ end
77
+
78
+ def test_extract_salt_for_ssha
79
+ assert_extract_salt(:ssha, nil, Base64.encode64("").chomp)
80
+ assert_extract_salt(:ssha, nil, Base64.encode64("1").chomp)
81
+ assert_extract_salt(:ssha, nil, Base64.encode64("12").chomp)
82
+ assert_extract_salt(:ssha, nil, Base64.encode64("123").chomp)
83
+ assert_extract_salt(:ssha, "ABCD", Base64.encode64("ABCD").chomp)
84
+ assert_extract_salt(:ssha, "BCDE", Base64.encode64("ABCDE").chomp)
85
+ end
86
+
87
+ private
88
+ def assert_extract_salt(type, expected, hashed_password)
89
+ actual = ActiveLdap::UserPassword.send("extract_salt_for_#{type}",
90
+ hashed_password)
91
+ assert_equal(expected, actual)
92
+ end
93
+ end
@@ -0,0 +1,59 @@
1
+ require 'al-test-utils'
2
+
3
+ class TestUseraddBinary < Test::Unit::TestCase
4
+ include AlTestUtils
5
+
6
+ def setup
7
+ super
8
+ @command = File.join(@examples_dir, "useradd-binary")
9
+ make_ou("People")
10
+ @user_class.instance_variable_set("@prefix", "ou=People")
11
+ end
12
+
13
+ priority :must
14
+
15
+ priority :normal
16
+ def test_exist_user
17
+ make_temporary_user do |user, password|
18
+ assert(@user_class.exists?(user.uid))
19
+ assert_equal([false, "User #{user.uid} already exists.\n"],
20
+ run_command(user.uid, user.cn, user.uid_number))
21
+ assert(@user_class.exists?(user.uid))
22
+ end
23
+ end
24
+
25
+ def test_add_user
26
+ ensure_delete_user("test-user") do |uid,|
27
+ assert_useradd_binary_successfully(uid, uid, 10000)
28
+ end
29
+ end
30
+
31
+ private
32
+ def assert_useradd_binary_successfully(name, cn, uid, *args, &block)
33
+ _wrap_assertion do
34
+ assert(!@user_class.exists?(name))
35
+ args.concat([name, cn, uid])
36
+ assert_equal([true, ""], run_command(*args, &block))
37
+ assert(@user_class.exists?(name))
38
+
39
+ user = @user_class.find(name)
40
+ assert_equal(name, user.uid)
41
+ assert_equal(cn, user.cn)
42
+ assert_equal(uid.to_s, user.uid_number)
43
+ assert_equal(uid.to_s, user.gid_number)
44
+ assert_equal(['person', 'posixAccount', 'shadowAccount',
45
+ 'strongAuthenticationUser'].sort, user.classes.sort)
46
+ cert = File.read(File.join(@examples_dir, 'example.der'))
47
+ assert_equal({"binary" => cert}, user.user_certificate)
48
+ end
49
+ end
50
+
51
+ def assert_useradd_binary_failed(name, cn, uid, message, *args, &block)
52
+ _wrap_assertion do
53
+ assert(!@user_class.exists?(name))
54
+ args.concat([name, cn, uid])
55
+ assert_equal([false, message], run_command(*args, &block))
56
+ assert(!@user_class.exists?(name))
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,55 @@
1
+ require 'al-test-utils'
2
+
3
+ class TestUseradd < Test::Unit::TestCase
4
+ include AlTestUtils
5
+
6
+ def setup
7
+ super
8
+ @command = File.join(@examples_dir, "useradd")
9
+ make_ou("People")
10
+ @user_class.instance_variable_set("@prefix", "ou=People")
11
+ end
12
+
13
+ priority :must
14
+
15
+ priority :normal
16
+ def test_exist_user
17
+ make_temporary_user do |user, password|
18
+ assert(@user_class.exists?(user.uid))
19
+ assert_equal([false, "User #{user.uid} already exists.\n"],
20
+ run_command(user.uid, user.cn, user.uid_number))
21
+ assert(@user_class.exists?(user.uid))
22
+ end
23
+ end
24
+
25
+ def test_add_user
26
+ ensure_delete_user("test-user") do |uid,|
27
+ assert_useradd_successfully(uid, uid, 10000)
28
+ end
29
+ end
30
+
31
+ private
32
+ def assert_useradd_successfully(name, cn, uid, *args, &block)
33
+ _wrap_assertion do
34
+ assert(!@user_class.exists?(name))
35
+ args.concat([name, cn, uid])
36
+ assert_equal([true, ""], run_command(*args, &block))
37
+ assert(@user_class.exists?(name))
38
+
39
+ user = @user_class.find(name)
40
+ assert_equal(name, user.uid)
41
+ assert_equal(cn, user.cn)
42
+ assert_equal(uid.to_s, user.uid_number)
43
+ assert_equal(uid.to_s, user.gid_number)
44
+ end
45
+ end
46
+
47
+ def assert_useradd_failed(name, cn, uid, message, *args, &block)
48
+ _wrap_assertion do
49
+ assert(!@user_class.exists?(name))
50
+ args.concat([name, cn, uid])
51
+ assert_equal([false, message], run_command(*args, &block))
52
+ assert(!@user_class.exists?(name))
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,48 @@
1
+ require 'al-test-utils'
2
+
3
+ class TestUserdel < Test::Unit::TestCase
4
+ include AlTestUtils
5
+
6
+ def setup
7
+ super
8
+ @command = File.join(@examples_dir, "userdel")
9
+ make_ou("People")
10
+ @user_class.instance_variable_set("@prefix", "ou=People")
11
+ end
12
+
13
+ priority :must
14
+
15
+ priority :normal
16
+ def test_non_exist_user
17
+ ensure_delete_user("test-user") do |uid,|
18
+ assert(!@user_class.exists?(uid))
19
+ assert_equal([false, "User #{uid} doesn't exist.\n"], run_command(uid))
20
+ assert(!@user_class.exists?(uid))
21
+ end
22
+ end
23
+
24
+ def test_delete_user
25
+ make_temporary_user do |user, password|
26
+ assert_userdel_successfully(user.uid)
27
+ end
28
+ end
29
+
30
+ private
31
+ def assert_userdel_successfully(name, *args, &block)
32
+ _wrap_assertion do
33
+ assert(@user_class.exists?(name))
34
+ args.concat([name])
35
+ assert_equal([true, ""], run_command(*args, &block))
36
+ assert(!@user_class.exists?(name))
37
+ end
38
+ end
39
+
40
+ def assert_userdel_failed(name, message, *args, &block)
41
+ _wrap_assertion do
42
+ assert(@user_class.exists?(name))
43
+ args.concat([name])
44
+ assert_equal([false, message], run_command(*args, &block))
45
+ assert(@user_class.exists?(name))
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,86 @@
1
+ require 'al-test-utils'
2
+
3
+ class TestUserls < Test::Unit::TestCase
4
+ include AlTestUtils
5
+
6
+ def setup
7
+ super
8
+ @command = File.join(@examples_dir, "userls")
9
+ make_ou("People")
10
+ @user_class.instance_variable_set("@prefix", "ou=People")
11
+ end
12
+
13
+ priority :must
14
+
15
+ priority :normal
16
+ def test_non_exist_user
17
+ ensure_delete_user("test-user") do |uid,|
18
+ assert(!@user_class.exists?(uid))
19
+ assert_equal([false, "User #{uid} doesn't exist.\n"], run_command(uid))
20
+ assert(!@user_class.exists?(uid))
21
+ end
22
+ end
23
+
24
+ def test_list_user_no_group
25
+ make_temporary_user do |user, password|
26
+ assert_userls_successfully(user.uid, [])
27
+ end
28
+ end
29
+
30
+ def test_list_user_have_primary_group
31
+ make_temporary_group do |group|
32
+ make_temporary_user(:gid_number => group.gid_number) do |user, password|
33
+ assert_userls_successfully(user.uid, [group])
34
+ end
35
+ end
36
+ end
37
+
38
+ def test_list_user_have_groups
39
+ make_temporary_group do |group1|
40
+ make_temporary_group do |group2|
41
+ options = {:gid_number => group2.gid_number.succ}
42
+ make_temporary_user(options) do |user, password|
43
+ user.groups << group1
44
+ user.groups << group2
45
+ assert_userls_successfully(user.uid, [group1, group2])
46
+ end
47
+ end
48
+ end
49
+ end
50
+
51
+ def test_list_user_have_groups_and_primary_group
52
+ make_temporary_group do |group1|
53
+ make_temporary_user(:gid_number => group1.gid_number) do |user, password|
54
+ make_temporary_group do |group2|
55
+ make_temporary_group do |group3|
56
+ user.groups << group2
57
+ user.groups << group3
58
+ assert_userls_successfully(user.uid, [group1, group2, group3])
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+
65
+ private
66
+ def assert_userls_successfully(name, groups, *args, &block)
67
+ _wrap_assertion do
68
+ assert(@user_class.exists?(name))
69
+ args.concat([name])
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"
73
+ assert_equal([true, result], run_command(*args, &block))
74
+ assert(@user_class.exists?(name))
75
+ end
76
+ end
77
+
78
+ def assert_userls_failed(name, message, *args, &block)
79
+ _wrap_assertion do
80
+ assert(@user_class.exists?(name))
81
+ args.concat([name])
82
+ assert_equal([false, message], run_command(*args, &block))
83
+ assert(@user_class.exists?(name))
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,62 @@
1
+ require 'al-test-utils'
2
+
3
+ class TestUsermodBinaryAddTime < Test::Unit::TestCase
4
+ include AlTestUtils
5
+
6
+ def setup
7
+ super
8
+ @command = File.join(@examples_dir, "usermod-binary-add-time")
9
+ make_ou("People")
10
+ @user_class.instance_variable_set("@prefix", "ou=People")
11
+ end
12
+
13
+ priority :must
14
+
15
+ priority :normal
16
+ def test_non_exist_user
17
+ ensure_delete_user("test-user") do |uid,|
18
+ assert(!@user_class.exists?(uid))
19
+ assert_equal([false, "User #{uid} doesn't exist.\n"],
20
+ run_command(uid, "New CN", 11111))
21
+ assert(!@user_class.exists?(uid))
22
+ end
23
+ end
24
+
25
+ def test_modify_user
26
+ make_temporary_user do |user, password|
27
+ assert_usermod_binary_add_time_successfully(user.uid, "New #{user.cn}",
28
+ user.uid_number.to_i + 100)
29
+ end
30
+ end
31
+
32
+ private
33
+ def assert_usermod_binary_add_time_successfully(name, cn, uid, *args, &block)
34
+ _wrap_assertion do
35
+ assert(@user_class.exists?(name))
36
+ previous_classes = @user_class.find(name).classes
37
+ args.concat([name, cn, uid])
38
+ assert_equal([true, ""], run_command(*args, &block))
39
+ assert(@user_class.exists?(name))
40
+
41
+ user = @user_class.find(name)
42
+ assert_equal(name, user.uid)
43
+ assert_equal(cn, user.cn)
44
+ assert_equal(uid.to_s, user.uid_number)
45
+ assert_equal(uid.to_s, user.gid_number)
46
+ assert_equal((previous_classes + ['strongAuthenticationUser']).sort,
47
+ user.classes.sort)
48
+ cert = File.read(File.join(@examples_dir, 'example.der'))
49
+ assert_equal({"binary" => cert}, user.user_certificate)
50
+ end
51
+ end
52
+
53
+ def assert_usermod_binary_add_time_failed(name, cn, uid, message,
54
+ *args, &block)
55
+ _wrap_assertion do
56
+ assert(@user_class.exists?(name))
57
+ args.concat([name, cn, uid])
58
+ assert_equal([false, message], run_command(*args, &block))
59
+ assert(@user_class.exists?(name))
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,61 @@
1
+ require 'al-test-utils'
2
+
3
+ class TestUsermodBinaryAdd < Test::Unit::TestCase
4
+ include AlTestUtils
5
+
6
+ def setup
7
+ super
8
+ @command = File.join(@examples_dir, "usermod-binary-add")
9
+ make_ou("People")
10
+ @user_class.instance_variable_set("@prefix", "ou=People")
11
+ end
12
+
13
+ priority :must
14
+
15
+ priority :normal
16
+ def test_non_exist_user
17
+ ensure_delete_user("test-user") do |uid,|
18
+ assert(!@user_class.exists?(uid))
19
+ assert_equal([false, "User #{uid} doesn't exist.\n"],
20
+ run_command(uid, "New CN", 11111))
21
+ assert(!@user_class.exists?(uid))
22
+ end
23
+ end
24
+
25
+ def test_modify_user
26
+ make_temporary_user do |user, password|
27
+ assert_usermod_binary_add_successfully(user.uid, "New #{user.cn}",
28
+ user.uid_number.to_i + 100)
29
+ end
30
+ end
31
+
32
+ private
33
+ def assert_usermod_binary_add_successfully(name, cn, uid, *args, &block)
34
+ _wrap_assertion do
35
+ assert(@user_class.exists?(name))
36
+ previous_classes = @user_class.find(name).classes
37
+ args.concat([name, cn, uid])
38
+ assert_equal([true, ""], run_command(*args, &block))
39
+ assert(@user_class.exists?(name))
40
+
41
+ user = @user_class.find(name)
42
+ assert_equal(name, user.uid)
43
+ assert_equal(cn, user.cn)
44
+ assert_equal(uid.to_s, user.uid_number)
45
+ assert_equal(uid.to_s, user.gid_number)
46
+ assert_equal((previous_classes + ['strongAuthenticationUser']).sort,
47
+ user.classes.sort)
48
+ cert = File.read(File.join(@examples_dir, 'example.der'))
49
+ assert_equal({"binary" => cert}, user.user_certificate)
50
+ end
51
+ end
52
+
53
+ def assert_usermod_binary_add_failed(name, cn, uid, message, *args, &block)
54
+ _wrap_assertion do
55
+ assert(@user_class.exists?(name))
56
+ args.concat([name, cn, uid])
57
+ assert_equal([false, message], run_command(*args, &block))
58
+ assert(@user_class.exists?(name))
59
+ end
60
+ end
61
+ end