activeldap 1.0.9 → 1.1.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.
- data/CHANGES +648 -567
- data/README +53 -48
- data/Rakefile +25 -53
- data/TODO +2 -0
- 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/controllers/application_controller.rb +1 -1
- data/examples/al-admin/app/views/_entry/_attributes_information.html.erb +7 -1
- data/examples/al-admin/app/views/users/_attributes_update_form.html.erb +13 -1
- data/examples/al-admin/config/environment.rb +2 -3
- data/lib/active_ldap.rb +103 -98
- data/lib/active_ldap/association/belongs_to_many.rb +7 -7
- data/lib/active_ldap/association/has_many.rb +4 -4
- data/lib/active_ldap/associations.rb +29 -5
- data/lib/active_ldap/attributes.rb +5 -1
- data/lib/active_ldap/base.rb +17 -13
- data/lib/active_ldap/configuration.rb +3 -4
- data/lib/active_ldap/connection.rb +3 -3
- data/lib/active_ldap/get_text/parser.rb +4 -2
- data/lib/active_ldap/helper.rb +59 -0
- data/lib/active_ldap/operations.rb +15 -10
- data/lib/active_ldap/xml.rb +22 -30
- data/po/en/active-ldap.po +221 -154
- data/po/ja/active-ldap.po +237 -178
- data/test-unit/History.txt +26 -0
- data/test-unit/Manifest.txt +1 -1
- data/test-unit/README.txt +1 -0
- data/test-unit/Rakefile +6 -1
- data/test-unit/lib/test/unit/autorunner.rb +6 -0
- data/test-unit/lib/test/unit/testcase.rb +101 -36
- data/test-unit/test/{test_testcase.rb → test-testcase.rb} +30 -1
- data/test-unit/test/test_assertions.rb +1 -1
- data/test/al-test-utils.rb +3 -1
- data/test/test_associations.rb +75 -6
- data/test/test_base.rb +45 -3
- metadata +75 -45
- data/examples/al-admin/config/initializers/gettext.rb +0 -15
data/README
CHANGED
@@ -1,12 +1,18 @@
|
|
1
|
-
Ruby/ActiveLdap
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
1
|
+
= Ruby/ActiveLdap
|
2
|
+
|
3
|
+
ruby library for object-oriented LDAP interction
|
4
|
+
|
5
|
+
* Copyright (C) 2004-2006 Will Drewry <tt><will@alum.bu.edu></tt>
|
6
|
+
* Copyright (C) 2006-2009 Kouhei Sutou <tt><kou@clear-code.com></tt>
|
7
|
+
|
8
|
+
Contributors::
|
9
|
+
* Dick Davies <tt><rasputnik AT hellooperator.net></tt>
|
10
|
+
* Nathan Kinder <tt><quicksilver02 AT mac.com></tt>
|
11
|
+
* Patrick Cole <tt><pac AT independent.com.au></tt>
|
12
|
+
* Google Inc.
|
13
|
+
|
14
|
+
== DESCRIPTION
|
15
|
+
|
10
16
|
'Ruby/ActiveLdap' is a ruby extension library which provides a clean objected
|
11
17
|
oriented interface to the Ruby/LDAP[0] library. It was inspired by
|
12
18
|
ActivRecord[3]. This is not nearly as clean or as flexible as ActiveRecord, but
|
@@ -18,49 +24,56 @@ It is also available on the web at:
|
|
18
24
|
|
19
25
|
http://ruby-activeldap.rubyforge.org/
|
20
26
|
|
21
|
-
PREREQUISITES
|
27
|
+
== PREREQUISITES
|
22
28
|
|
23
|
-
|
24
|
-
|
25
|
-
*
|
26
|
-
*
|
29
|
+
[Ruby intepreter]
|
30
|
+
One of them:
|
31
|
+
* Ruby[http://www.ruby-lang.org] (1.8.x or 1.9.1)
|
32
|
+
* JRuby[http://jruby.codehaus.org/]
|
27
33
|
|
34
|
+
[LDAP client]
|
35
|
+
JRuby doesn't need to install new library because JRuby
|
36
|
+
has builtin LDAP support. Ruby users need one of them:
|
37
|
+
* Ruby/LDAP[http://rubyforge.org/projects/ruby-ldap/]
|
38
|
+
* Net::LDAP[http://rubyforge.org/projects/net-ldap/]
|
28
39
|
|
29
|
-
|
40
|
+
* ActiveRecord[http://activerecord.rubyonrails.org]
|
30
41
|
|
31
|
-
|
42
|
+
== NOTES
|
32
43
|
|
44
|
+
* Only GSSAPI SASL support exists due to Ruby/LDAP limitations
|
33
45
|
|
34
|
-
INSTALL
|
46
|
+
== INSTALL
|
35
47
|
|
36
|
-
|
37
|
-
- Run -
|
38
|
-
sudo rake install
|
48
|
+
% sudo gem install activeldap
|
39
49
|
|
40
|
-
RAILS
|
50
|
+
== RAILS
|
41
51
|
|
42
|
-
There is a small rails plugin included that allows the use
|
43
|
-
'ldap.yml' in the config directory of
|
44
|
-
|
45
|
-
|
46
|
-
settings
|
47
|
-
|
52
|
+
There is a small rails plugin included that allows the use
|
53
|
+
of a file named 'config/ldap.yml' in the config directory of
|
54
|
+
your rails app. This file has a similar function to the
|
55
|
+
'database.yml' file that allows you to set your database
|
56
|
+
connection settings per environment. Similarly, the ldap.yml
|
57
|
+
file allows settings to be set for development, test, and
|
58
|
+
production environments. For instance, the development entry
|
59
|
+
would look something like the following:
|
48
60
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
61
|
+
development:
|
62
|
+
host: 127.0.0.1
|
63
|
+
port: 389
|
64
|
+
base: dc=localhost
|
65
|
+
bind_dn: cn=admin,dc=localhost
|
66
|
+
password: secret
|
55
67
|
|
68
|
+
To install, simply add the following codes to you config/environment.rb:
|
56
69
|
|
57
|
-
|
58
|
-
vendor/plugins directory of your rails application and create config/ldap.yml.
|
59
|
-
When your application starts up, the plugin will call #establish_connection
|
60
|
-
using the parameters specified for your current environment.
|
70
|
+
config.gem "activeldap", :lib => "active_ldap"
|
61
71
|
|
72
|
+
When your application starts up, the plugin will call
|
73
|
+
ActiveLdap::Base.setup_connection using the parameters
|
74
|
+
specified for your current environment.
|
62
75
|
|
63
|
-
LICENCE
|
76
|
+
== LICENCE
|
64
77
|
|
65
78
|
This program is free software; you can redistribute it and/or modify it. It is
|
66
79
|
dual licensed under Ruby's license and under the terms of the GNU General
|
@@ -69,16 +82,7 @@ or (at your option) any later version.
|
|
69
82
|
|
70
83
|
Please see the file LICENSE for the terms of the licence.
|
71
84
|
|
72
|
-
|
73
|
-
REFERENCES
|
74
|
-
|
75
|
-
[0] - http://ruby-ldap.sourceforge.net
|
76
|
-
[1] - http://rubyforge.org/projects/net-ldap/
|
77
|
-
[2] - http://www.ruby-lang.org
|
78
|
-
[3] - http://activerecord.rubyonrails.org
|
79
|
-
|
80
|
-
|
81
|
-
THANKS
|
85
|
+
== THANKS
|
82
86
|
|
83
87
|
This list may not be correct. If you notice mistakes of this
|
84
88
|
list, please point out.
|
@@ -129,3 +133,4 @@ list, please point out.
|
|
129
133
|
* Tim Hermans: A bug report.
|
130
134
|
* Joe Francis: A suggestion.
|
131
135
|
* Tiago Fernandes: Bug reports.
|
136
|
+
* achemze. A suggestion.
|
data/Rakefile
CHANGED
@@ -53,24 +53,26 @@ at_exit do
|
|
53
53
|
FileUtils.rm_f("History.txt")
|
54
54
|
end
|
55
55
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
56
|
+
ENV["VERSION"] = ActiveLdap::VERSION
|
57
|
+
project = Hoe.spec('activeldap') do
|
58
|
+
self.version = ActiveLdap::VERSION
|
59
|
+
self.rubyforge_name = 'ruby-activeldap'
|
60
|
+
self.author = ['Will Drewry', 'Kouhei Sutou']
|
61
|
+
self.email = ['redpig@dataspill.org', 'kou@cozmixng.org']
|
62
|
+
self.summary = 'Ruby/ActiveLdap is a object-oriented API to LDAP'
|
63
|
+
self.url = 'http://rubyforge.org/projects/ruby-activeldap/'
|
64
|
+
self.test_globs = ['test/test_*.rb']
|
65
|
+
self.changes = self.paragraphs_of('CHANGES', 1..2).join("\n\n")
|
66
|
+
self.extra_deps = [
|
67
|
+
# ['ruby-ldap', '= 0.9.9'],
|
68
|
+
['activerecord', '= 2.3.2'],
|
69
|
+
['locale', '= 2.0.4'],
|
70
|
+
['gettext', '= 2.0.4'],
|
71
|
+
['gettext_activerecord', '= 2.0.4'],
|
72
|
+
]
|
73
|
+
self.remote_rdoc_dir = "doc"
|
74
|
+
self.rsync_args += " --chmod=Dg+ws,Fg+w"
|
75
|
+
self.description = String.new(<<-EOF)
|
74
76
|
'Ruby/ActiveLdap' is a ruby extension library which provides a clean
|
75
77
|
objected oriented interface to the Ruby/LDAP library. It was inspired
|
76
78
|
by ActiveRecord. This is not nearly as clean or as flexible as
|
@@ -79,6 +81,8 @@ project = Hoe.new('activeldap', ActiveLdap::VERSION) do |project|
|
|
79
81
|
EOF
|
80
82
|
end
|
81
83
|
|
84
|
+
project.spec.extra_rdoc_files = ["README", "CHANGES", "COPYING", "LICENSE"]
|
85
|
+
|
82
86
|
publish_docs_actions = task(:publish_docs).instance_variable_get("@actions")
|
83
87
|
original_project_name = nil
|
84
88
|
before_publish_docs = Proc.new do
|
@@ -91,9 +95,6 @@ end
|
|
91
95
|
publish_docs_actions.unshift(before_publish_docs)
|
92
96
|
publish_docs_actions.push(after_publish_docs)
|
93
97
|
|
94
|
-
# fix Hoe's incorrect guess.
|
95
|
-
project.spec.executables.clear
|
96
|
-
project.bin_files = project.spec.files.grep(/^bin/)
|
97
98
|
|
98
99
|
rdoc_main = "lib/active_ldap.rb"
|
99
100
|
project.spec.rdoc_options.each do |option|
|
@@ -101,36 +102,7 @@ project.spec.rdoc_options.each do |option|
|
|
101
102
|
end
|
102
103
|
ObjectSpace.each_object(Rake::RDocTask) do |task|
|
103
104
|
task.main = rdoc_main if task.main == "README.txt"
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
# fix Hoe's install and uninstall task.
|
108
|
-
task(:install).instance_variable_get("@actions").clear
|
109
|
-
task(:uninstall).instance_variable_get("@actions").clear
|
110
|
-
|
111
|
-
task :install do
|
112
|
-
[
|
113
|
-
[project.lib_files, "lib", Hoe::RUBYLIB, 0444],
|
114
|
-
[project.bin_files, "bin", File.join(Hoe::PREFIX, 'bin'), 0555]
|
115
|
-
].each do |files, prefix, dest, mode|
|
116
|
-
FileUtils.mkdir_p dest unless test ?d, dest
|
117
|
-
files.each do |file|
|
118
|
-
base = File.dirname(file.sub(/^#{prefix}#{File::SEPARATOR}/, ''))
|
119
|
-
_dest = File.join(dest, base)
|
120
|
-
FileUtils.mkdir_p _dest unless test ?d, _dest
|
121
|
-
install file, _dest, :mode => mode
|
122
|
-
end
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
desc 'Uninstall the package.'
|
127
|
-
task :uninstall do
|
128
|
-
Dir.chdir Hoe::RUBYLIB do
|
129
|
-
rm_f project.lib_files.collect {|f| f.sub(/^lib#{File::SEPARATOR}/, '')}
|
130
|
-
end
|
131
|
-
Dir.chdir File.join(Hoe::PREFIX, 'bin') do
|
132
|
-
rm_f project.bin_files.collect {|f| f.sub(/^bin#{File::SEPARATOR}/, '')}
|
133
|
-
end
|
105
|
+
task.rdoc_files = project.spec.require_paths + project.spec.extra_rdoc_files
|
134
106
|
end
|
135
107
|
|
136
108
|
desc 'Tag the repository for release.'
|
@@ -145,7 +117,7 @@ task :gettext => ["gettext:po:update", "gettext:mo:create"]
|
|
145
117
|
namespace :gettext do
|
146
118
|
desc "Setup environment for GetText"
|
147
119
|
task :environment do
|
148
|
-
require "gettext/
|
120
|
+
require "gettext/tools"
|
149
121
|
end
|
150
122
|
|
151
123
|
namespace :po do
|
@@ -176,7 +148,7 @@ namespace :gettext do
|
|
176
148
|
namespace :mo do
|
177
149
|
desc "Create *.mo from *.po (GetText)"
|
178
150
|
task :create => "gettext:environment" do
|
179
|
-
GetText.create_mofiles
|
151
|
+
GetText.create_mofiles
|
180
152
|
end
|
181
153
|
end
|
182
154
|
end
|
data/TODO
CHANGED
Binary file
|
Binary file
|
@@ -8,7 +8,7 @@ class ApplicationController < ActionController::Base
|
|
8
8
|
# Uncomment the :secret if you're not using the cookie session store
|
9
9
|
protect_from_forgery # :secret => '5965eefc93d824a9c145fe8edb6d1a36'
|
10
10
|
|
11
|
-
|
11
|
+
init_gettext "al-admin"
|
12
12
|
|
13
13
|
include ExceptionNotifiable
|
14
14
|
|
@@ -13,7 +13,13 @@
|
|
13
13
|
<% (entry.attribute_names(true) - ["objectClass"]).sort.each do |name| -%>
|
14
14
|
<tr class="<%= cycle('even', 'odd') %>">
|
15
15
|
<th scope="row"><%= link_to_attribute(name) %></th>
|
16
|
-
<td
|
16
|
+
<td>
|
17
|
+
<%=
|
18
|
+
entry[name, true].collect do |value|
|
19
|
+
h(value.inspect)
|
20
|
+
end.join("<br />")
|
21
|
+
%>
|
22
|
+
</td>
|
17
23
|
<td><%= h(lad_(name)) %></td>
|
18
24
|
</tr>
|
19
25
|
<% end -%>
|
@@ -23,7 +23,19 @@
|
|
23
23
|
<span class="required-attribute-mark">*</span>
|
24
24
|
<% end -%>
|
25
25
|
</th>
|
26
|
-
<td
|
26
|
+
<td>
|
27
|
+
<%=
|
28
|
+
ldap_field(:text, :user, name,
|
29
|
+
:ldap_options => ["lang-en"]) do |field, info|
|
30
|
+
ldap_options = info[:options]
|
31
|
+
if ldap_options.empty?
|
32
|
+
"#{field}<br />"
|
33
|
+
else
|
34
|
+
"#{ldap_options.join(';')}: #{field}<br />"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
-%>
|
38
|
+
</td>
|
27
39
|
<td><%= h lad_(name) %></td>
|
28
40
|
</tr>
|
29
41
|
<% end -%>
|
@@ -27,9 +27,8 @@ Rails::Initializer.run do |config|
|
|
27
27
|
# config.gem "hpricot", :version => '0.6', :source => "http://code.whytheluckystiff.net"
|
28
28
|
# config.gem "sqlite3-ruby", :lib => "sqlite3"
|
29
29
|
# config.gem "aws-s3", :lib => "aws/s3"
|
30
|
-
|
31
|
-
|
32
|
-
# config.gem "gettext_rails"
|
30
|
+
config.gem "locale_rails", :version => "2.0.4"
|
31
|
+
config.gem "gettext_rails", :version => "2.0.4"
|
33
32
|
|
34
33
|
# Only load the plugins named here, in the order given. By default, all plugins
|
35
34
|
# in vendor/plugins are loaded in alphabetical order.
|
data/lib/active_ldap.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
#!/usr/bin/ruby
|
2
2
|
# = ActiveLdap
|
3
3
|
#
|
4
|
-
#
|
5
|
-
#
|
4
|
+
# Copyright (C) 2004,2005 Will Drewry mailto:will@alum.bu.edu
|
5
|
+
# Copyright (C) 2006-2009 Kouhei Sutou <kou@clear-code.com>
|
6
6
|
#
|
7
7
|
# == Introduction
|
8
8
|
#
|
@@ -58,26 +58,13 @@
|
|
58
58
|
#
|
59
59
|
# === Installation
|
60
60
|
#
|
61
|
-
# Assuming all the requirements are installed, you can install by
|
62
|
-
# the download site[http://rubyforge.org/frs/?group_id=381].
|
61
|
+
# Assuming all the requirements are installed, you can install by gem.
|
63
62
|
#
|
64
|
-
#
|
65
|
-
#
|
66
|
-
# $ tar -xzvf ruby-activeldap-current.tgz
|
67
|
-
# $ cd ruby-activeldap-VERSION
|
68
|
-
#
|
69
|
-
# Edit lib/active_ldap/configuration.rb replacing values to match what will work
|
70
|
-
# with your LDAP servers. Please note that those variables are required, but can
|
71
|
-
# be overridden in any program as detailed later in this document. Also make
|
72
|
-
# sure that "ROOT" stays all upcase.
|
73
|
-
#
|
74
|
-
# Now run:
|
75
|
-
#
|
76
|
-
# $ (as root) rake install
|
63
|
+
# # gem install activeldap
|
77
64
|
#
|
78
65
|
# Now as a quick test, you can run:
|
79
66
|
#
|
80
|
-
# $ irb
|
67
|
+
# $ irb -rubygems
|
81
68
|
# irb> require 'active_ldap'
|
82
69
|
# => true
|
83
70
|
# irb> exit
|
@@ -86,33 +73,6 @@
|
|
86
73
|
# problem with the installation. You may need to customize what setup.rb does on
|
87
74
|
# install.
|
88
75
|
#
|
89
|
-
#
|
90
|
-
# === Customizations
|
91
|
-
#
|
92
|
-
# Now that ActiveLdap is installed and working, we still have a few more
|
93
|
-
# steps to make it useful for programming.
|
94
|
-
#
|
95
|
-
# Let's say that you are writing a Ruby program for managing user and group
|
96
|
-
# accounts in LDAP. I will use this as the running example throughout the
|
97
|
-
# document.
|
98
|
-
#
|
99
|
-
# You will want to make a directory called 'ldapadmin' wherever is convenient. Under this directory,
|
100
|
-
# you'll want to make sure you have a 'lib' directory.
|
101
|
-
#
|
102
|
-
# $ cd ~
|
103
|
-
# $ mkdir ldapadmin
|
104
|
-
# $ cd ldapadmin
|
105
|
-
# $ mkdir lib
|
106
|
-
# $ cd lib
|
107
|
-
#
|
108
|
-
# The lib directory is where we'll be making customizations. You can, of course,
|
109
|
-
# make this changes somewhere in Ruby's default search path to make this
|
110
|
-
# accessible to every Ruby scripts. Enough of my babbling, I'm sure you'd like to
|
111
|
-
# know what we're going to put in lib/.
|
112
|
-
#
|
113
|
-
# We're going to put extension classes in there. What are extension classes you say . . .
|
114
|
-
#
|
115
|
-
#
|
116
76
|
# == Usage
|
117
77
|
#
|
118
78
|
# This section covers using ActiveLdap from writing extension classes to
|
@@ -122,6 +82,11 @@
|
|
122
82
|
#
|
123
83
|
# irb> require 'active_ldap'
|
124
84
|
#
|
85
|
+
# Call setup_connection method for connect to LDAP server. In this case, LDAP server
|
86
|
+
# is localhost, and base of LDAP tree is "dc=dataspill,dc=org".
|
87
|
+
#
|
88
|
+
# irb> ActiveLdap::Base.setup_connection :host => 'localhost', :base => 'dc=dataspill,dc=org'
|
89
|
+
#
|
125
90
|
# Here's an extension class that maps to the LDAP Group objects:
|
126
91
|
#
|
127
92
|
# irb> class Group < ActiveLdap::Base
|
@@ -171,7 +136,7 @@
|
|
171
136
|
#
|
172
137
|
# class Group < ActiveLdap::Base
|
173
138
|
# ldap_mapping :dn_attribute => 'cn',
|
174
|
-
# :prefix => 'ou=Groups', :classes => ['top', 'posixGroup']
|
139
|
+
# :prefix => 'ou=Groups', :classes => ['top', 'posixGroup'],
|
175
140
|
# :scope => :one
|
176
141
|
# end
|
177
142
|
#
|
@@ -181,7 +146,7 @@
|
|
181
146
|
# * dc=dataspill,dc=org
|
182
147
|
# |- ou=People,dc=dataspill,dc=org
|
183
148
|
# |+ ou=Groups,dc=dataspill,dc=org
|
184
|
-
# \
|
149
|
+
# \
|
185
150
|
# |- cn=develop,ou=Groups,dc=dataspill,dc=org
|
186
151
|
# |- cn=root,ou=Groups,dc=dataspill,dc=org
|
187
152
|
# |- ...
|
@@ -198,11 +163,12 @@
|
|
198
163
|
# ^^ ^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^
|
199
164
|
# :dn_attribute | |
|
200
165
|
# :prefix |
|
201
|
-
# :base from
|
166
|
+
# :base from setup_connection
|
202
167
|
#
|
203
168
|
# :scope tells ActiveLdap to only search under ou=Groups, and not to look deeper
|
204
169
|
# for dn_attribute matches.
|
205
170
|
# (e.g. cn=develop,ou=DevGroups,ou=Groups,dc=dataspill,dc=org)
|
171
|
+
# You can choose value from between :sub, :one and :base.
|
206
172
|
#
|
207
173
|
# Something's missing: :classes. :classes is used to tell ActiveLdap what
|
208
174
|
# the minimum requirement is when creating a new object. LDAP uses objectClasses
|
@@ -234,7 +200,7 @@
|
|
234
200
|
#
|
235
201
|
# * dc=dataspill,dc=org
|
236
202
|
# |+ ou=People,dc=dataspill,dc=org
|
237
|
-
# \
|
203
|
+
# \
|
238
204
|
# |- uid=drewry,ou=People,dc=dataspill,dc=org
|
239
205
|
# |- ou=Groups,dc=dataspill,dc=org
|
240
206
|
#
|
@@ -251,7 +217,7 @@
|
|
251
217
|
# group 'develop'. In order to remedy that, we can use belongs_to
|
252
218
|
#
|
253
219
|
# irb> class User < ActiveLdap::Base
|
254
|
-
# irb* ldap_mapping :dn_attribute => 'uid', :prefix => 'People', :classes => ['top','account']
|
220
|
+
# irb* ldap_mapping :dn_attribute => 'uid', :prefix => 'ou=People', :classes => ['top','account']
|
255
221
|
# irb* belongs_to :groups, :class_name => 'Group', :many => 'memberUid', :foreign_key => 'uid'
|
256
222
|
# irb* end
|
257
223
|
#
|
@@ -260,7 +226,7 @@
|
|
260
226
|
#
|
261
227
|
# irb> me = User.find('drewry')
|
262
228
|
# irb> me.groups
|
263
|
-
# =>
|
229
|
+
# => #<ActiveLdap::Association::BelongsToMany...> # Enumerable object
|
264
230
|
# irb> me.groups.each { |group| p group.cn };nil
|
265
231
|
# "cdrom"
|
266
232
|
# "audio"
|
@@ -290,7 +256,7 @@
|
|
290
256
|
# mind, the above definition could become:
|
291
257
|
#
|
292
258
|
# irb> class User < ActiveLdap::Base
|
293
|
-
# irb* ldap_mapping :dn_attribute => 'uid', :prefix => 'People', :classes => ['top','account']
|
259
|
+
# irb* ldap_mapping :dn_attribute => 'uid', :prefix => 'ou=People', :classes => ['top','account']
|
294
260
|
# irb* belongs_to :groups, :class_name => 'Group', :many => 'memberUid'
|
295
261
|
# irb* end
|
296
262
|
#
|
@@ -319,8 +285,9 @@
|
|
319
285
|
# irb> develop = Group.find('develop')
|
320
286
|
# => ...
|
321
287
|
# irb> develop.members
|
322
|
-
# =>
|
323
|
-
#
|
288
|
+
# => #<ActiveLdap::Association::HasManyWrap:..> # Enumerable object
|
289
|
+
# irb> develop.members.map{|member| member.id}
|
290
|
+
# => ["drewry", "builder"]
|
324
291
|
#
|
325
292
|
# The arguments for has_many follow the exact same idea that belongs_to's
|
326
293
|
# arguments followed. :wrap's contents are used to search for matching
|
@@ -375,10 +342,10 @@
|
|
375
342
|
# :scope => :sub, :attributes => ['uid', 'cn'])
|
376
343
|
# => [["uid=root,ou=People,dc=dataspill,dc=org",{"cn"=>["root"], "uidNumber"=>["0"]}]
|
377
344
|
# You can specify the :filter, :base, :scope, and :attributes, but they all have defaults --
|
378
|
-
#
|
379
|
-
#
|
380
|
-
#
|
381
|
-
#
|
345
|
+
# * :filter defaults to objectClass=* - usually this isn't what you want
|
346
|
+
# * :base defaults to the base of the class this is executed from (as set in ldap_mapping)
|
347
|
+
# * :scope defaults to :sub. Usually you won't need to change it (You can choose value also from between :one and :base)
|
348
|
+
# * :attributes defaults to [] and is the list of attributes you want back. Empty means all of them.
|
382
349
|
#
|
383
350
|
# ==== #valid?
|
384
351
|
#
|
@@ -438,10 +405,9 @@
|
|
438
405
|
# )
|
439
406
|
#
|
440
407
|
# There are quite a few arguments, but luckily many of them have safe defaults:
|
441
|
-
# * :host defaults to
|
442
|
-
# * :port defaults to
|
443
|
-
# * :
|
444
|
-
# * :bind_dn defaults @@bind_format from configuration.rb
|
408
|
+
# * :host defaults to "127.0.0.1".
|
409
|
+
# * :port defaults to nil. 389 is applied if not specified.
|
410
|
+
# * :bind_dn defaults to nil. anonymous binding is applied if not specified.
|
445
411
|
# * :logger defaults to a Logger object that prints fatal messages to stderr
|
446
412
|
# * :password_block defaults to nil
|
447
413
|
# * :allow_anonymous defaults to true
|
@@ -466,13 +432,12 @@
|
|
466
432
|
# bind methods fail
|
467
433
|
# * :try_sasl, when true, tells ActiveLdap to attempt a SASL-GSSAPI bind
|
468
434
|
# * :sasl_quiet, when true, tells the SASL libraries to not spew messages to STDOUT
|
469
|
-
# * :method indicates whether to use :ssl, :tls, or :plain
|
470
435
|
# * :retry_limit - indicates the number of attempts to reconnect that will be undertaken when a stale connection occurs. -1 means infinite.
|
471
436
|
# * :retry_wait - seconds to wait before retrying a connection
|
472
437
|
# * :scope - dictates how to find objects. (Default: :one)
|
473
438
|
# * :timeout - time in seconds - defaults to disabled. This CAN interrupt search() requests. Be warned.
|
474
439
|
# * :retry_on_timeout - whether to reconnect when timeouts occur. Defaults to true
|
475
|
-
# See lib/configuration.rb for defaults for each option
|
440
|
+
# See lib/configuration.rb(ActiveLdap::Configuration::DEFAULT_CONFIG) for defaults for each option
|
476
441
|
#
|
477
442
|
# Base.setup_connection just setups connection
|
478
443
|
# configuration. A connection is connected and bound when it
|
@@ -518,7 +483,7 @@
|
|
518
483
|
# ==== ConnectionError
|
519
484
|
#
|
520
485
|
# This exception is raised during Base.setup_connection if no valid
|
521
|
-
# connection to the LDAP server could be created. Check you
|
486
|
+
# connection to the LDAP server could be created. Check you
|
522
487
|
# Base.setup_connection arguments, and network connectivity! Also check
|
523
488
|
# your LDAP server logs to see if it ever saw the request.
|
524
489
|
#
|
@@ -543,24 +508,28 @@
|
|
543
508
|
#
|
544
509
|
# All of the scripts here are in the package's examples/ directory.
|
545
510
|
#
|
546
|
-
# ==== Setting up
|
511
|
+
# ==== Setting up
|
512
|
+
#
|
513
|
+
# Create directory for scripts.
|
514
|
+
#
|
515
|
+
# mkdir -p ldapadmin/objects
|
547
516
|
#
|
548
|
-
# In ldapadmin/
|
549
|
-
#
|
517
|
+
# In ldapadmin/objects/ create the file user.rb:
|
518
|
+
#
|
519
|
+
# require 'objects/group'
|
520
|
+
#
|
550
521
|
# class User < ActiveLdap::Base
|
551
|
-
# ldap_mapping :dn_attribute => 'uid', :prefix => 'ou=People', :classes => ['
|
552
|
-
# belongs_to :groups, :class_name => 'Group', :
|
522
|
+
# ldap_mapping :dn_attribute => 'uid', :prefix => 'ou=People', :classes => ['person', 'posixAccount']
|
523
|
+
# belongs_to :groups, :class_name => 'Group', :many => 'memberUid'
|
553
524
|
# end
|
554
|
-
# EOF
|
555
525
|
#
|
556
|
-
# In ldapadmin/
|
557
|
-
#
|
526
|
+
# In ldapadmin/objects/ create the file group.rb:
|
527
|
+
#
|
558
528
|
# class Group < ActiveLdap::Base
|
559
|
-
# ldap_mapping :classes => ['top', 'posixGroup'], :prefix => 'ou=
|
560
|
-
# has_many :members, :class_name => "User", :
|
529
|
+
# ldap_mapping :classes => ['top', 'posixGroup'], :prefix => 'ou=Groups'
|
530
|
+
# has_many :members, :class_name => "User", :wrap => "memberUid"
|
561
531
|
# has_many :primary_members, :class_name => 'User', :foreign_key => 'gidNumber', :primary_key => 'gidNumber'
|
562
|
-
# end
|
563
|
-
# EOF
|
532
|
+
# end
|
564
533
|
#
|
565
534
|
# Now, we can write some small scripts to do simple management tasks.
|
566
535
|
#
|
@@ -568,10 +537,13 @@
|
|
568
537
|
#
|
569
538
|
# Now let's create a really dumb script for adding users - ldapadmin/useradd:
|
570
539
|
#
|
540
|
+
# #!/usr/bin/ruby -W0
|
541
|
+
#
|
571
542
|
# base = File.expand_path(File.join(File.dirname(__FILE__), ".."))
|
572
543
|
# $LOAD_PATH << File.join(base, "lib")
|
573
544
|
# $LOAD_PATH << File.join(base, "examples")
|
574
545
|
#
|
546
|
+
# require 'rubygems'
|
575
547
|
# require 'active_ldap'
|
576
548
|
# require 'objects/user'
|
577
549
|
# require 'objects/group'
|
@@ -622,6 +594,7 @@
|
|
622
594
|
# $LOAD_PATH << File.join(base, "lib")
|
623
595
|
# $LOAD_PATH << File.join(base, "examples")
|
624
596
|
#
|
597
|
+
# require 'rubygems'
|
625
598
|
# require 'active_ldap'
|
626
599
|
# require 'objects/user'
|
627
600
|
# require 'objects/group'
|
@@ -659,6 +632,45 @@
|
|
659
632
|
# exit 1
|
660
633
|
# end
|
661
634
|
#
|
635
|
+
# ==== Removing LDAP entries
|
636
|
+
# Now let's create more one for deleting users - ldapadmin/userdel:
|
637
|
+
#
|
638
|
+
# #!/usr/bin/ruby -W0
|
639
|
+
#
|
640
|
+
# base = File.expand_path(File.join(File.dirname(__FILE__), ".."))
|
641
|
+
# $LOAD_PATH << File.join(base, "lib")
|
642
|
+
# $LOAD_PATH << File.join(base, "examples")
|
643
|
+
#
|
644
|
+
# require 'rubygems'
|
645
|
+
# require 'active_ldap'
|
646
|
+
# require 'objects/user'
|
647
|
+
# require 'objects/group'
|
648
|
+
#
|
649
|
+
# argv, opts, options = ActiveLdap::Command.parse_options do |opts, options|
|
650
|
+
# opts.banner += " USER_NAME"
|
651
|
+
# end
|
652
|
+
#
|
653
|
+
# if argv.size == 1
|
654
|
+
# name = argv.shift
|
655
|
+
# else
|
656
|
+
# $stderr.puts opts
|
657
|
+
# exit 1
|
658
|
+
# end
|
659
|
+
#
|
660
|
+
# pwb = Proc.new do |user|
|
661
|
+
# ActiveLdap::Command.read_password("[#{user}] Password: ")
|
662
|
+
# end
|
663
|
+
#
|
664
|
+
# ActiveLdap::Base.setup_connection(:password_block => pwb,
|
665
|
+
# :allow_anonymous => false)
|
666
|
+
#
|
667
|
+
# unless User.exists?(name)
|
668
|
+
# $stderr.puts("User #{name} doesn't exist.")
|
669
|
+
# exit 1
|
670
|
+
# end
|
671
|
+
#
|
672
|
+
# User.destroy(name)
|
673
|
+
#
|
662
674
|
# === Advanced Topics
|
663
675
|
#
|
664
676
|
# Below are some situation tips and tricks to get the most out of ActiveLdap.
|
@@ -740,7 +752,7 @@
|
|
740
752
|
# ./myldap/group.rb:
|
741
753
|
# module MyLDAP
|
742
754
|
# class Group < ActiveLdap::Base
|
743
|
-
# ldap_mapping :classes => ['top', 'posixGroup'], :prefix => 'ou=
|
755
|
+
# ldap_mapping :classes => ['top', 'posixGroup'], :prefix => 'ou=Groups'
|
744
756
|
# has_many :members, :class_name => 'MyLDAP::User', :wrap => 'memberUid'
|
745
757
|
# has_many :primary_members, :class_name => 'MyLDAP::User', :foreign_key => 'gidNumber', :primary_key => 'gidNumber'
|
746
758
|
# end
|
@@ -791,7 +803,7 @@
|
|
791
803
|
# => ...
|
792
804
|
# irb> auth_class = Class.new(Base)
|
793
805
|
# => ...
|
794
|
-
# irb> auth_class.setup_connection(:password_block => {'mypass'})
|
806
|
+
# irb> auth_class.setup_connection(:password_block => lambda{'mypass'})
|
795
807
|
# => ...
|
796
808
|
#
|
797
809
|
# This can be useful for doing authentication tests and other such tricks.
|
@@ -841,7 +853,10 @@
|
|
841
853
|
# any methods you write might need to figure it out. I'd suggest just
|
842
854
|
# calling self[attribname] to get the value, but if that's not good enough,
|
843
855
|
# you can call look up the stored name by #to_real_attribute_name as follows:
|
844
|
-
#
|
856
|
+
#
|
857
|
+
# irb> User.find(:first).instance_eval do
|
858
|
+
# irb> to_real_attribute_name('commonName')
|
859
|
+
# irb> end
|
845
860
|
# => 'cn'
|
846
861
|
#
|
847
862
|
# This tells you the name the attribute is stored in behind the scenes (@data).
|
@@ -851,8 +866,8 @@
|
|
851
866
|
# Also, if you like to look up all aliases for an attribute, you can call the
|
852
867
|
# following:
|
853
868
|
#
|
854
|
-
# irb> schema.
|
855
|
-
# => [
|
869
|
+
# irb> User.schema.attribute_type 'cn', 'NAME'
|
870
|
+
# => ["cn", "commonName"]
|
856
871
|
#
|
857
872
|
# This is discovered automagically from the LDAP server's schema.
|
858
873
|
#
|
@@ -886,7 +901,7 @@ require_gem_if_need = Proc.new do |library_name, gem_name, *gem_args|
|
|
886
901
|
end
|
887
902
|
end
|
888
903
|
|
889
|
-
require_gem_if_need.call("active_support", "activesupport")
|
904
|
+
require_gem_if_need.call("active_support", "activesupport", "= 2.3.2")
|
890
905
|
|
891
906
|
if ActiveSupport.const_defined?(:Dependencies)
|
892
907
|
dependencies = ActiveSupport::Dependencies
|
@@ -899,7 +914,7 @@ if dependencies.respond_to?(:load_paths)
|
|
899
914
|
end
|
900
915
|
|
901
916
|
module ActiveLdap
|
902
|
-
VERSION = "1.0
|
917
|
+
VERSION = "1.1.0"
|
903
918
|
end
|
904
919
|
|
905
920
|
if RUBY_PLATFORM.match('linux')
|
@@ -908,21 +923,11 @@ else
|
|
908
923
|
require 'active_ldap/timeout_stub'
|
909
924
|
end
|
910
925
|
|
911
|
-
require_gem_if_need.call("active_record", "activerecord")
|
926
|
+
require_gem_if_need.call("active_record", "activerecord", "= 2.3.2")
|
912
927
|
begin
|
913
|
-
|
914
|
-
require_gem_if_need.call("
|
915
|
-
require_gem_if_need.call("
|
916
|
-
|
917
|
-
require 'active_record/version'
|
918
|
-
active_record_version = [ActiveRecord::VERSION::MAJOR,
|
919
|
-
ActiveRecord::VERSION::MINOR,
|
920
|
-
ActiveRecord::VERSION::TINY]
|
921
|
-
if (active_record_version <=> [2, 2, 0]) < 0
|
922
|
-
require "gettext/active_record"
|
923
|
-
else
|
924
|
-
require_gem_if_need.call("gettext_activerecord")
|
925
|
-
end
|
928
|
+
require_gem_if_need.call("locale", nil, "= 2.0.4")
|
929
|
+
require_gem_if_need.call("gettext", nil, "= 2.0.4")
|
930
|
+
require_gem_if_need.call("gettext_activerecord", nil, "= 2.0.4")
|
926
931
|
rescue LoadError
|
927
932
|
end
|
928
933
|
require 'active_ldap/get_text'
|