ruby-activeldap 0.8.1 → 0.8.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. data/CHANGES +5 -0
  2. data/Manifest.txt +91 -25
  3. data/README +22 -0
  4. data/Rakefile +41 -8
  5. data/TODO +1 -6
  6. data/examples/config.yaml.example +5 -0
  7. data/examples/example.der +0 -0
  8. data/examples/example.jpg +0 -0
  9. data/examples/groupadd +41 -0
  10. data/examples/groupdel +35 -0
  11. data/examples/groupls +49 -0
  12. data/examples/groupmod +42 -0
  13. data/examples/lpasswd +55 -0
  14. data/examples/objects/group.rb +13 -0
  15. data/examples/objects/ou.rb +4 -0
  16. data/examples/objects/user.rb +20 -0
  17. data/examples/ouadd +38 -0
  18. data/examples/useradd +45 -0
  19. data/examples/useradd-binary +50 -0
  20. data/examples/userdel +34 -0
  21. data/examples/userls +50 -0
  22. data/examples/usermod +42 -0
  23. data/examples/usermod-binary-add +47 -0
  24. data/examples/usermod-binary-add-time +51 -0
  25. data/examples/usermod-binary-del +48 -0
  26. data/examples/usermod-lang-add +43 -0
  27. data/lib/active_ldap.rb +213 -214
  28. data/lib/active_ldap/adapter/base.rb +461 -0
  29. data/lib/active_ldap/adapter/ldap.rb +232 -0
  30. data/lib/active_ldap/adapter/ldap_ext.rb +69 -0
  31. data/lib/active_ldap/adapter/net_ldap.rb +288 -0
  32. data/lib/active_ldap/adapter/net_ldap_ext.rb +29 -0
  33. data/lib/active_ldap/association/belongs_to.rb +3 -1
  34. data/lib/active_ldap/association/belongs_to_many.rb +5 -6
  35. data/lib/active_ldap/association/has_many.rb +9 -17
  36. data/lib/active_ldap/association/has_many_wrap.rb +4 -5
  37. data/lib/active_ldap/attributes.rb +4 -0
  38. data/lib/active_ldap/base.rb +201 -56
  39. data/lib/active_ldap/configuration.rb +11 -1
  40. data/lib/active_ldap/connection.rb +15 -9
  41. data/lib/active_ldap/distinguished_name.rb +246 -0
  42. data/lib/active_ldap/ldap_error.rb +74 -0
  43. data/lib/active_ldap/object_class.rb +9 -5
  44. data/lib/active_ldap/schema.rb +50 -9
  45. data/lib/active_ldap/validations.rb +11 -13
  46. data/rails/plugin/active_ldap/generators/scaffold_al/scaffold_al_generator.rb +7 -0
  47. data/rails/plugin/active_ldap/generators/scaffold_al/templates/ldap.yml +21 -0
  48. data/rails/plugin/active_ldap/init.rb +10 -4
  49. data/test/al-test-utils.rb +46 -3
  50. data/test/run-test.rb +16 -4
  51. data/test/test-unit-ext/always-show-result.rb +28 -0
  52. data/test/test-unit-ext/priority.rb +163 -0
  53. data/test/test_adapter.rb +81 -0
  54. data/test/test_attributes.rb +8 -1
  55. data/test/test_base.rb +132 -3
  56. data/test/test_base_per_instance.rb +14 -3
  57. data/test/test_connection.rb +19 -0
  58. data/test/test_dn.rb +161 -0
  59. data/test/test_find.rb +24 -0
  60. data/test/test_object_class.rb +15 -2
  61. data/test/test_schema.rb +108 -1
  62. metadata +111 -41
  63. data/lib/active_ldap/adaptor/base.rb +0 -29
  64. data/lib/active_ldap/adaptor/ldap.rb +0 -466
  65. data/lib/active_ldap/ldap.rb +0 -113
data/examples/lpasswd ADDED
@@ -0,0 +1,55 @@
1
+ #!/usr/bin/ruby -W0
2
+
3
+ base = File.expand_path(File.join(File.dirname(__FILE__), ".."))
4
+ $LOAD_PATH << File.join(base, "lib")
5
+ $LOAD_PATH << File.join(base, "examples")
6
+
7
+ require 'active_ldap'
8
+ require 'objects/user'
9
+ require 'objects/group'
10
+
11
+ argv, opts, options = ActiveLdap::Command.parse_options do |opts, options|
12
+ opts.banner += " USER_NAME"
13
+ end
14
+
15
+ if argv.size == 1
16
+ name = argv.shift
17
+ else
18
+ $stderr.puts opts
19
+ exit 1
20
+ end
21
+
22
+ pwb = Proc.new do |user|
23
+ user ||= ENV["USER"]
24
+ ActiveLdap::Command.read_password("[#{user}] Password: ")
25
+ end
26
+ ActiveLdap::Base.establish_connection(:password_block => pwb,
27
+ :allow_anonymous => false)
28
+
29
+ unless User.exists?(name)
30
+ $stderr.puts("User #{name} doesn't exist.")
31
+ exit 1
32
+ end
33
+
34
+ class PasswordMismatch < RuntimeError
35
+ end
36
+
37
+ user = User.find(name)
38
+ count = 0
39
+ begin
40
+ count += 1
41
+ pw1 = pwb.call(user.dn)
42
+ pw2 = pwb.call(user.dn)
43
+ raise PasswordMismatch if pw1 != pw2
44
+ rescue PasswordMismatch
45
+ puts "Password mismatch!"
46
+ exit 1 if count == 3
47
+ retry
48
+ end
49
+
50
+ user.user_password = ActiveLdap::UserPassword.ssha(pw1)
51
+ unless user.save
52
+ puts "failed"
53
+ puts user.errors.full_messages
54
+ exit 1
55
+ end
@@ -0,0 +1,13 @@
1
+ class Group < ActiveLdap::Base
2
+ ldap_mapping :dn_attribute => "cn",
3
+ :classes => ['posixGroup']
4
+ # Inspired by ActiveRecord, this tells ActiveLDAP that the
5
+ # LDAP entry has a attribute which contains one or more of
6
+ # some class |:class_name| where the attributes name is
7
+ # |:local_key|. This means that it will call
8
+ # :class_name.new(value_of(:local_key)) to create the objects.
9
+ has_many :members, :class => "User", :wrap => "memberUid"
10
+ has_many :primary_members, :class => 'User',
11
+ :foreign_key => 'gidNumber',
12
+ :primary_key => 'gidNumber'
13
+ end # Group
@@ -0,0 +1,4 @@
1
+ class Ou < ActiveLdap::Base
2
+ ldap_mapping :dn_attribute => 'ou', :prefix => '',
3
+ :classes => ['top', 'organizationalUnit']
4
+ end
@@ -0,0 +1,20 @@
1
+ require 'objects/group'
2
+
3
+ class User < ActiveLdap::Base
4
+ ldap_mapping :dn_attribute => 'uid', :prefix => 'ou=People',
5
+ :classes => ['person', 'posixAccount']
6
+ belongs_to :primary_group, :class => "Group",
7
+ :foreign_key => "gidNumber", :primary_key => "gidNumber"
8
+ belongs_to :groups, :many => 'memberUid'
9
+
10
+ # An example of using the old "return_objects" API with the
11
+ # new ActiveRecord-style API.
12
+ alias groups_mapping groups
13
+ def groups(return_objects=true)
14
+ return groups_mapping if return_objects
15
+ attr = 'cn'
16
+ Group.search(:attribute => 'memberUid',
17
+ :value => id,
18
+ :attributes => [attr]).map {|dn, attrs| attrs[attr]}.flatten
19
+ end
20
+ end
data/examples/ouadd ADDED
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/ruby -W0
2
+
3
+ base = File.expand_path(File.join(File.dirname(__FILE__), ".."))
4
+ $LOAD_PATH << File.join(base, "lib")
5
+ $LOAD_PATH << File.join(base, "examples")
6
+
7
+ require 'active_ldap'
8
+ require 'objects/ou'
9
+
10
+ argv, opts, options = ActiveLdap::Command.parse_options do |opts, options|
11
+ opts.banner += " name"
12
+ end
13
+
14
+ if argv.size == 1
15
+ name = argv[0]
16
+ else
17
+ $stderr.puts opts
18
+ exit 1
19
+ end
20
+
21
+ pwb = Proc.new do |user|
22
+ ActiveLdap::Command.read_password("[#{user}] Password: ")
23
+ end
24
+
25
+ ActiveLdap::Base.establish_connection(:password_block => pwb,
26
+ :allow_anonymous => false)
27
+
28
+ if Ou.exists?(name)
29
+ $stderr.puts("Ou #{name} already exists.")
30
+ exit 1
31
+ end
32
+
33
+ ou = Ou.new(name)
34
+ unless ou.save
35
+ puts "failed"
36
+ puts ou.errors.full_messages
37
+ exit 1
38
+ end
data/examples/useradd ADDED
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/ruby -W0
2
+
3
+ base = File.expand_path(File.join(File.dirname(__FILE__), ".."))
4
+ $LOAD_PATH << File.join(base, "lib")
5
+ $LOAD_PATH << File.join(base, "examples")
6
+
7
+ require 'active_ldap'
8
+ require 'objects/user'
9
+ require 'objects/group'
10
+
11
+ argv, opts, options = ActiveLdap::Command.parse_options do |opts, options|
12
+ opts.banner += " USER_NAME CN UID"
13
+ end
14
+
15
+ if argv.size == 3
16
+ name, cn, uid = argv
17
+ else
18
+ $stderr.puts opts
19
+ exit 1
20
+ end
21
+
22
+ pwb = Proc.new do |user|
23
+ ActiveLdap::Command.read_password("[#{user}] Password: ")
24
+ end
25
+
26
+ ActiveLdap::Base.establish_connection(:password_block => pwb,
27
+ :allow_anonymous => false)
28
+
29
+ if User.exists?(name)
30
+ $stderr.puts("User #{name} already exists.")
31
+ exit 1
32
+ end
33
+
34
+ user = User.new(name)
35
+ user.add_class('shadowAccount')
36
+ user.cn = cn
37
+ user.uid_number = uid
38
+ user.gid_number = uid
39
+ user.home_directory = "/home/#{name}"
40
+ user.sn = "somesn"
41
+ unless user.save
42
+ puts "failed"
43
+ puts user.errors.full_messages
44
+ exit 1
45
+ end
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/ruby -W0
2
+
3
+ base = File.expand_path(File.join(File.dirname(__FILE__), ".."))
4
+ $LOAD_PATH << File.join(base, "lib")
5
+ $LOAD_PATH << File.join(base, "examples")
6
+
7
+ require 'active_ldap'
8
+ require 'objects/user'
9
+ require 'objects/group'
10
+
11
+ argv, opts, options = ActiveLdap::Command.parse_options do |opts, options|
12
+ opts.banner += " USER_NAME CN UID"
13
+ end
14
+
15
+ if argv.size == 3
16
+ name, cn, uid = argv
17
+ else
18
+ $stderr.puts opts
19
+ exit 1
20
+ end
21
+
22
+ pwb = Proc.new do |user|
23
+ ActiveLdap::Command.read_password("[#{user}] Password: ")
24
+ end
25
+
26
+ ActiveLdap::Base.establish_connection(:password_block => pwb,
27
+ :allow_anonymous => false)
28
+
29
+ if User.exists?(name)
30
+ $stderr.puts("User #{name} already exists.")
31
+ exit 1
32
+ end
33
+
34
+ user = User.new(name)
35
+ user.add_class('shadowAccount')
36
+ user.cn = cn
37
+ user.sn = "somesn"
38
+ user.uid_number = uid
39
+ user.gid_number = uid
40
+ user.home_directory = "/home/#{name}"
41
+ user.add_class('strongAuthenticationUser')
42
+ cert_file = File.join(File.dirname(__FILE__), 'example.der')
43
+ user.user_certificate = File.read(cert_file)
44
+
45
+ unless user.save
46
+ puts "failed"
47
+ puts user.errors.full_messages
48
+ exit 1
49
+ end
50
+
data/examples/userdel ADDED
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/ruby -W0
2
+
3
+ base = File.expand_path(File.join(File.dirname(__FILE__), ".."))
4
+ $LOAD_PATH << File.join(base, "lib")
5
+ $LOAD_PATH << File.join(base, "examples")
6
+
7
+ require 'active_ldap'
8
+ require 'objects/user'
9
+ require 'objects/group'
10
+
11
+ argv, opts, options = ActiveLdap::Command.parse_options do |opts, options|
12
+ opts.banner += " USER_NAME"
13
+ end
14
+
15
+ if argv.size == 1
16
+ name = argv.shift
17
+ else
18
+ $stderr.puts opts
19
+ exit 1
20
+ end
21
+
22
+ pwb = Proc.new do |user|
23
+ ActiveLdap::Command.read_password("[#{user}] Password: ")
24
+ end
25
+
26
+ ActiveLdap::Base.establish_connection(:password_block => pwb,
27
+ :allow_anonymous => false)
28
+
29
+ unless User.exists?(name)
30
+ $stderr.puts("User #{name} doesn't exist.")
31
+ exit 1
32
+ end
33
+
34
+ User.destroy(name)
data/examples/userls ADDED
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/ruby -W0
2
+
3
+ base = File.expand_path(File.join(File.dirname(__FILE__), ".."))
4
+ $LOAD_PATH << File.join(base, "lib")
5
+ $LOAD_PATH << File.join(base, "examples")
6
+
7
+ require 'active_ldap'
8
+ require 'objects/user'
9
+ require 'objects/group'
10
+
11
+ require 'base64'
12
+
13
+ argv, opts, options = ActiveLdap::Command.parse_options do |opts, options|
14
+ opts.banner += " USER_NAME"
15
+ end
16
+
17
+ if argv.size == 1
18
+ name = argv.shift
19
+ else
20
+ $stderr.puts opts
21
+ exit 1
22
+ end
23
+
24
+ pwb = Proc.new do |user|
25
+ ActiveLdap::Command.read_password("[#{user}] Password: ")
26
+ end
27
+
28
+ ActiveLdap::Base.establish_connection(:password_block => pwb,
29
+ :allow_anonymous => false)
30
+
31
+ unless User.exists?(name)
32
+ $stderr.puts("User #{name} doesn't exist.")
33
+ exit 1
34
+ end
35
+
36
+ user = User.find(name)
37
+ puts user.to_ldif
38
+
39
+ groups = []
40
+ primary_group = user.primary_group
41
+ if primary_group.exists?
42
+ groups << "#{primary_group.cn}[#{primary_group.gid_number}]"
43
+ end
44
+ puts "Groups by name only: #{user.groups(false).join(', ')}"
45
+ user.groups.sort_by do |group|
46
+ group.id
47
+ end.collect do |group|
48
+ groups << "#{group.cn}[#{group.gid_number}]"
49
+ end
50
+ puts "Groups: #{groups.join(', ')}"
data/examples/usermod ADDED
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/ruby -W0
2
+
3
+ base = File.expand_path(File.join(File.dirname(__FILE__), ".."))
4
+ $LOAD_PATH << File.join(base, "lib")
5
+ $LOAD_PATH << File.join(base, "examples")
6
+
7
+ require 'active_ldap'
8
+ require 'objects/user'
9
+ require 'objects/group'
10
+
11
+ argv, opts, options = ActiveLdap::Command.parse_options do |opts, options|
12
+ opts.banner += " USER_NAME CN UID"
13
+ end
14
+
15
+ if argv.size == 3
16
+ name, cn, uid = argv
17
+ else
18
+ $stderr.puts opts
19
+ exit 1
20
+ end
21
+
22
+ pwb = Proc.new do |user|
23
+ ActiveLdap::Command.read_password("[#{user}] Password: ")
24
+ end
25
+
26
+ ActiveLdap::Base.establish_connection(:password_block => pwb,
27
+ :allow_anonymous => false)
28
+
29
+ unless User.exists?(name)
30
+ $stderr.puts("User #{name} doesn't exist.")
31
+ exit 1
32
+ end
33
+
34
+ user = User.find(name)
35
+ user.cn = cn
36
+ user.uid_number = uid
37
+ user.gid_number = uid
38
+ unless user.save
39
+ puts "failed"
40
+ puts user.errors.full_messages
41
+ exit 1
42
+ end
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/ruby -W0
2
+
3
+ base = File.expand_path(File.join(File.dirname(__FILE__), ".."))
4
+ $LOAD_PATH << File.join(base, "lib")
5
+ $LOAD_PATH << File.join(base, "examples")
6
+
7
+ require 'active_ldap'
8
+ require 'objects/user'
9
+ require 'objects/group'
10
+
11
+ argv, opts, options = ActiveLdap::Command.parse_options do |opts, options|
12
+ opts.banner += " USER_NAME CN UID"
13
+ end
14
+
15
+ if argv.size == 3
16
+ name, cn, uid = argv
17
+ else
18
+ $stderr.puts opts
19
+ exit 1
20
+ end
21
+
22
+ pwb = Proc.new do |user|
23
+ ActiveLdap::Command.read_password("[#{user}] Password: ")
24
+ end
25
+
26
+ ActiveLdap::Base.establish_connection(:password_block => pwb,
27
+ :allow_anonymous => false)
28
+
29
+ unless User.exists?(name)
30
+ $stderr.puts("User #{name} doesn't exist.")
31
+ exit 1
32
+ end
33
+
34
+ user = User.find(name)
35
+ user.cn = cn
36
+ user.uid_number = uid
37
+ user.gid_number = uid
38
+
39
+ user.add_class('strongAuthenticationUser')
40
+ cert_file = File.join(File.dirname(__FILE__), 'example.der')
41
+ user.user_certificate = File.read(cert_file)
42
+
43
+ unless user.save
44
+ puts "failed"
45
+ puts user.errors.full_messages
46
+ exit 1
47
+ end
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/ruby -W0
2
+
3
+ base = File.expand_path(File.join(File.dirname(__FILE__), ".."))
4
+ $LOAD_PATH << File.join(base, "lib")
5
+ $LOAD_PATH << File.join(base, "examples")
6
+
7
+ require 'active_ldap'
8
+ require 'objects/user'
9
+ require 'objects/group'
10
+
11
+ argv, opts, options = ActiveLdap::Command.parse_options do |opts, options|
12
+ opts.banner += " USER_NAME CN UID"
13
+ end
14
+
15
+ if argv.size == 3
16
+ name, cn, uid = argv
17
+ else
18
+ $stderr.puts opts
19
+ exit 1
20
+ end
21
+
22
+ pwb = Proc.new do |user|
23
+ ActiveLdap::Command.read_password("[#{user}] Password: ")
24
+ end
25
+
26
+ ActiveLdap::Base.establish_connection(:password_block => pwb,
27
+ :allow_anonymous => false)
28
+
29
+ unless User.exists?(name)
30
+ $stderr.puts("User #{name} doesn't exist.")
31
+ exit 1
32
+ end
33
+
34
+ 100.times do |i|
35
+ user = User.find(name)
36
+ user.cn = cn
37
+ user.uid_number = uid
38
+ user.gid_number = uid
39
+
40
+ user.add_class('strongAuthenticationUser')
41
+ cert_file = File.join(File.dirname(__FILE__), 'example.der')
42
+ user.user_certificate = File.read(cert_file)
43
+
44
+ unless user.save
45
+ puts "failed #{i}"
46
+ puts user.errors.full_messages
47
+ exit 1
48
+ end
49
+
50
+ # puts "success [#{i}]"
51
+ end