activeldap 1.0.9 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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'
|