activeldap 4.0.5 → 6.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.yardopts +3 -1
- data/doc/text/development.md +26 -0
- data/doc/text/{news.textile → news.md} +451 -241
- data/doc/text/{rails.textile → rails.md} +44 -33
- data/doc/text/{tutorial.textile → tutorial.md} +177 -185
- data/lib/active_ldap/adapter/base.rb +40 -17
- data/lib/active_ldap/adapter/jndi.rb +21 -9
- data/lib/active_ldap/adapter/jndi_connection.rb +83 -20
- data/lib/active_ldap/adapter/ldap.rb +50 -28
- data/lib/active_ldap/adapter/ldap_ext.rb +32 -13
- data/lib/active_ldap/adapter/net_ldap.rb +26 -24
- data/lib/active_ldap/associations.rb +5 -5
- data/lib/active_ldap/attribute_methods/before_type_cast.rb +1 -1
- data/lib/active_ldap/attribute_methods/dirty.rb +4 -7
- data/lib/active_ldap/attribute_methods/query.rb +1 -1
- data/lib/active_ldap/attribute_methods/read.rb +5 -1
- data/lib/active_ldap/attribute_methods/write.rb +1 -1
- data/lib/active_ldap/attribute_methods.rb +1 -2
- data/lib/active_ldap/base.rb +61 -14
- data/lib/active_ldap/callbacks.rb +7 -8
- data/lib/active_ldap/configuration.rb +27 -3
- data/lib/active_ldap/connection.rb +4 -22
- data/lib/active_ldap/distinguished_name.rb +1 -1
- data/lib/active_ldap/human_readable.rb +5 -4
- data/lib/active_ldap/operations.rb +24 -4
- data/lib/active_ldap/persistence.rb +3 -2
- data/lib/active_ldap/populate.rb +5 -3
- data/lib/active_ldap/railties/controller_runtime.rb +1 -2
- data/lib/active_ldap/schema/syntaxes.rb +8 -4
- data/lib/active_ldap/validations.rb +12 -4
- data/lib/active_ldap/version.rb +1 -1
- data/lib/active_ldap.rb +0 -7
- data/po/en/active-ldap.po +2 -2
- data/po/ja/active-ldap.po +3 -3
- data/test/add-phonetic-attribute-options-to-slapd.ldif +3 -3
- data/test/al-test-utils.rb +125 -38
- data/test/command.rb +13 -16
- data/test/enable-dynamic-groups.ldif +22 -0
- data/test/enable-start-tls.ldif +27 -0
- data/test/run-test.rb +0 -4
- data/test/test_base.rb +223 -22
- data/test/test_base_per_instance.rb +33 -1
- data/test/test_callback.rb +10 -8
- data/test/test_connection.rb +4 -0
- data/test/test_connection_per_class.rb +34 -0
- data/test/test_dn.rb +7 -0
- data/test/test_entry.rb +1 -0
- data/test/test_find.rb +14 -3
- data/test/test_supported_control.rb +1 -1
- data/test/test_syntax.rb +5 -0
- data/test/test_validation.rb +28 -15
- metadata +23 -24
- data/README.textile +0 -141
- data/doc/text/development.textile +0 -54
- data/lib/active_ldap/timeout.rb +0 -75
- data/lib/active_ldap/timeout_stub.rb +0 -17
@@ -9,8 +9,7 @@ module ActiveLdap
|
|
9
9
|
def save(*) #:nodoc:
|
10
10
|
succeeded = super
|
11
11
|
if succeeded
|
12
|
-
|
13
|
-
@changed_attributes.clear
|
12
|
+
changes_applied
|
14
13
|
end
|
15
14
|
succeeded
|
16
15
|
end
|
@@ -18,20 +17,18 @@ module ActiveLdap
|
|
18
17
|
# Attempts to <tt>save!</tt> the record and clears changed attributes if successful.
|
19
18
|
def save!(*) #:nodoc:
|
20
19
|
super.tap do
|
21
|
-
|
22
|
-
@changed_attributes.clear
|
20
|
+
changes_applied
|
23
21
|
end
|
24
22
|
end
|
25
23
|
|
26
24
|
# <tt>reload</tt> the record and clears changed attributes.
|
27
25
|
def reload(*) #:nodoc:
|
28
26
|
super.tap do
|
29
|
-
|
30
|
-
@changed_attributes.clear
|
27
|
+
clear_changes_information
|
31
28
|
end
|
32
29
|
end
|
33
30
|
|
34
|
-
|
31
|
+
private
|
35
32
|
def set_attribute(name, value)
|
36
33
|
if name and name != "objectClass"
|
37
34
|
attribute_will_change!(name) unless value == get_attribute(name)
|
@@ -3,11 +3,15 @@ module ActiveLdap
|
|
3
3
|
module Read
|
4
4
|
extend ActiveSupport::Concern
|
5
5
|
|
6
|
-
|
6
|
+
private
|
7
7
|
def attribute(attr, *args)
|
8
8
|
return get_attribute(attr, args.first)
|
9
9
|
end
|
10
10
|
|
11
|
+
def _read_attribute(name)
|
12
|
+
get_attribute(name)
|
13
|
+
end
|
14
|
+
|
11
15
|
# get_attribute
|
12
16
|
#
|
13
17
|
# Return the value of the attribute called by method_missing?
|
data/lib/active_ldap/base.rb
CHANGED
@@ -32,6 +32,7 @@
|
|
32
32
|
require 'English'
|
33
33
|
require 'thread'
|
34
34
|
require 'erb'
|
35
|
+
require 'set'
|
35
36
|
|
36
37
|
module ActiveLdap
|
37
38
|
# OO-interface to LDAP assuming pam/nss_ldap-style organization with
|
@@ -330,6 +331,7 @@ module ActiveLdap
|
|
330
331
|
class_local_attr_accessor true, :dn_attribute, :scope, :sort_by, :order
|
331
332
|
class_local_attr_accessor true, :required_classes, :recommended_classes
|
332
333
|
class_local_attr_accessor true, :excluded_classes
|
334
|
+
class_local_attr_accessor false, :sub_classes
|
333
335
|
|
334
336
|
class << self
|
335
337
|
# Hide new in Base
|
@@ -340,6 +342,7 @@ module ActiveLdap
|
|
340
342
|
sub_class.module_eval do
|
341
343
|
include GetTextSupport
|
342
344
|
end
|
345
|
+
(self.sub_classes ||= []) << sub_class
|
343
346
|
end
|
344
347
|
|
345
348
|
# Set LDAP connection configuration up. It doesn't connect
|
@@ -548,6 +551,20 @@ module ActiveLdap
|
|
548
551
|
defaults.first || name || to_s
|
549
552
|
end
|
550
553
|
|
554
|
+
protected
|
555
|
+
def find_real_class(object_classes)
|
556
|
+
(sub_classes || []).each do |sub_class|
|
557
|
+
real_class = sub_class.find_real_class(object_classes)
|
558
|
+
return real_class if real_class
|
559
|
+
end
|
560
|
+
|
561
|
+
if object_classes.superset?(Set.new(classes))
|
562
|
+
self
|
563
|
+
else
|
564
|
+
nil
|
565
|
+
end
|
566
|
+
end
|
567
|
+
|
551
568
|
private
|
552
569
|
def inspect_attributes(attributes)
|
553
570
|
inspected_attribute_names = {}
|
@@ -594,12 +611,19 @@ module ActiveLdap
|
|
594
611
|
def instantiate(args)
|
595
612
|
dn, attributes, options = args
|
596
613
|
options ||= {}
|
597
|
-
|
598
|
-
|
599
|
-
|
614
|
+
|
615
|
+
object_classes_raw =
|
616
|
+
attributes["objectClass"] ||
|
617
|
+
attributes["objectclass"] ||
|
618
|
+
[]
|
619
|
+
if sub_classes.nil? or object_classes_raw.empty?
|
620
|
+
real_klass = self
|
600
621
|
else
|
601
|
-
|
602
|
-
|
622
|
+
object_classes = Set.new
|
623
|
+
object_classes_raw.each do |object_class_raw|
|
624
|
+
object_classes << schema.object_class(object_class_raw)
|
625
|
+
end
|
626
|
+
real_klass = find_real_class(object_classes) || self
|
603
627
|
end
|
604
628
|
|
605
629
|
obj = real_klass.allocate
|
@@ -827,6 +851,8 @@ module ActiveLdap
|
|
827
851
|
|
828
852
|
_schema = _local_entry_attribute = nil
|
829
853
|
targets = sanitize_for_mass_assignment(new_attributes)
|
854
|
+
have_dn = false
|
855
|
+
dn_value = nil
|
830
856
|
targets.each do |key, value|
|
831
857
|
setter = "#{key}="
|
832
858
|
unless respond_to?(setter)
|
@@ -836,8 +862,15 @@ module ActiveLdap
|
|
836
862
|
_local_entry_attribute ||= local_entry_attribute
|
837
863
|
_local_entry_attribute.register(attribute)
|
838
864
|
end
|
839
|
-
|
865
|
+
case setter
|
866
|
+
when "dn=", "id="
|
867
|
+
have_dn = true
|
868
|
+
dn_value = value
|
869
|
+
else
|
870
|
+
send(setter, value)
|
871
|
+
end
|
840
872
|
end
|
873
|
+
self.dn = dn_value if have_dn
|
841
874
|
end
|
842
875
|
|
843
876
|
def to_ldif_record
|
@@ -922,9 +955,7 @@ module ActiveLdap
|
|
922
955
|
def clear_object_class_based_cache
|
923
956
|
@entry_attribute = nil
|
924
957
|
@real_names = {}
|
925
|
-
|
926
|
-
not attribute_method?(key)
|
927
|
-
end
|
958
|
+
clear_changes_information
|
928
959
|
end
|
929
960
|
|
930
961
|
def clear_removed_attributes_data(removed_attributes)
|
@@ -1093,7 +1124,7 @@ module ActiveLdap
|
|
1093
1124
|
end
|
1094
1125
|
set_attribute(key, value)
|
1095
1126
|
end
|
1096
|
-
|
1127
|
+
clear_changes_information
|
1097
1128
|
end
|
1098
1129
|
private :initialize_attributes
|
1099
1130
|
|
@@ -1143,8 +1174,6 @@ module ActiveLdap
|
|
1143
1174
|
@dn_split_value = nil
|
1144
1175
|
@connection ||= nil
|
1145
1176
|
@_hashing = false
|
1146
|
-
@previously_changed = []
|
1147
|
-
@changed_attributes = {}
|
1148
1177
|
clear_connection_based_cache
|
1149
1178
|
end
|
1150
1179
|
|
@@ -1261,6 +1290,7 @@ module ActiveLdap
|
|
1261
1290
|
end
|
1262
1291
|
|
1263
1292
|
def compute_base
|
1293
|
+
ensure_update_dn
|
1264
1294
|
base_of_class = self.class.base
|
1265
1295
|
if @base_value.nil?
|
1266
1296
|
base_of_class
|
@@ -1352,7 +1382,14 @@ module ActiveLdap
|
|
1352
1382
|
if k == _dn_attribute
|
1353
1383
|
new_dn_value = value[0]
|
1354
1384
|
else
|
1355
|
-
|
1385
|
+
if (v.size == 1 and value.size == 1) or force_replace?(k)
|
1386
|
+
attributes.push([:replace, k, value])
|
1387
|
+
else
|
1388
|
+
removed_values = v - value
|
1389
|
+
added_values = value - v
|
1390
|
+
attributes.push([:delete, k, removed_values]) unless removed_values.empty?
|
1391
|
+
attributes.push([:add, k, added_values]) unless added_values.empty?
|
1392
|
+
end
|
1356
1393
|
end
|
1357
1394
|
end
|
1358
1395
|
|
@@ -1366,12 +1403,22 @@ module ActiveLdap
|
|
1366
1403
|
# Detect subtypes and account for them
|
1367
1404
|
# REPLACE will function like ADD, but doesn't hit EQUALITY problems
|
1368
1405
|
# TODO: Added equality(attr) to Schema
|
1369
|
-
|
1406
|
+
if force_replace?(k)
|
1407
|
+
attributes.push([:replace, k, value])
|
1408
|
+
else
|
1409
|
+
attributes.push([:add, k, value])
|
1410
|
+
end
|
1370
1411
|
end
|
1371
1412
|
|
1372
1413
|
[new_dn_value, attributes]
|
1373
1414
|
end
|
1374
1415
|
|
1416
|
+
def force_replace?(k)
|
1417
|
+
attribute = schema.attribute(k)
|
1418
|
+
attribute.single_value? or
|
1419
|
+
attribute.binary? # TODO: this should probably explicitly check for fields with no equality matching rule instead
|
1420
|
+
end
|
1421
|
+
|
1375
1422
|
def collect_all_attributes(data)
|
1376
1423
|
dn_attr = dn_attribute
|
1377
1424
|
dn_value = data[dn_attr]
|
@@ -14,13 +14,12 @@ module ActiveLdap
|
|
14
14
|
included do
|
15
15
|
extend ActiveModel::Callbacks
|
16
16
|
include ActiveModel::Validations::Callbacks
|
17
|
-
|
17
|
+
singleton_class.class_eval do
|
18
|
+
prepend CallbackedInstantiatable
|
19
|
+
end
|
20
|
+
|
18
21
|
define_model_callbacks :initialize, :find, :touch, :only => :after
|
19
22
|
define_model_callbacks :save, :create, :update, :destroy
|
20
|
-
|
21
|
-
class << self
|
22
|
-
alias_method_chain :instantiate, :callbacks
|
23
|
-
end
|
24
23
|
end
|
25
24
|
|
26
25
|
module ClassMethods
|
@@ -33,9 +32,9 @@ module ActiveLdap
|
|
33
32
|
end
|
34
33
|
end
|
35
34
|
|
36
|
-
module
|
37
|
-
def
|
38
|
-
object =
|
35
|
+
module CallbackedInstantiatable
|
36
|
+
def instantiate(record)
|
37
|
+
object = super(record)
|
39
38
|
object.run_callbacks(:find)
|
40
39
|
object.run_callbacks(:initialize)
|
41
40
|
object
|
@@ -27,6 +27,7 @@ module ActiveLdap
|
|
27
27
|
DEFAULT_CONFIG[:host] = '127.0.0.1'
|
28
28
|
DEFAULT_CONFIG[:port] = nil
|
29
29
|
DEFAULT_CONFIG[:method] = :plain # :ssl, :tls, :plain allowed
|
30
|
+
DEFAULT_CONFIG[:tls_options] = nil
|
30
31
|
|
31
32
|
DEFAULT_CONFIG[:bind_dn] = nil
|
32
33
|
DEFAULT_CONFIG[:password_block] = nil
|
@@ -47,6 +48,15 @@ module ActiveLdap
|
|
47
48
|
DEFAULT_CONFIG[:retry_on_timeout] = true
|
48
49
|
DEFAULT_CONFIG[:follow_referrals] = true
|
49
50
|
|
51
|
+
# 500 is the default size limit value of OpenLDAP 2.4:
|
52
|
+
# https://openldap.org/doc/admin24/limits.html#Global%20Limits
|
53
|
+
#
|
54
|
+
# We may change this when we find LDAP server that its the default
|
55
|
+
# size limit is smaller than 500.
|
56
|
+
DEFAULT_CONFIG[:page_size] = 500
|
57
|
+
# Whether using paged results if available.
|
58
|
+
DEFAULT_CONFIG[:use_paged_results] = true
|
59
|
+
|
50
60
|
DEFAULT_CONFIG[:logger] = nil
|
51
61
|
|
52
62
|
module ClassMethods
|
@@ -91,8 +101,8 @@ module ActiveLdap
|
|
91
101
|
@@defined_configurations
|
92
102
|
end
|
93
103
|
|
94
|
-
def
|
95
|
-
@@defined_configurations.
|
104
|
+
def remove_configuration_by_key(key)
|
105
|
+
@@defined_configurations.delete(key)
|
96
106
|
end
|
97
107
|
|
98
108
|
CONNECTION_CONFIGURATION_KEYS = [:uri, :base, :adapter]
|
@@ -102,8 +112,22 @@ module ActiveLdap
|
|
102
112
|
end
|
103
113
|
end
|
104
114
|
|
115
|
+
def parent_configuration(target)
|
116
|
+
if target.is_a?(Base)
|
117
|
+
target = target.class
|
118
|
+
else
|
119
|
+
target = target.superclass
|
120
|
+
end
|
121
|
+
while target <= Base
|
122
|
+
config = defined_configurations[target.active_connection_key]
|
123
|
+
return config if config
|
124
|
+
target = target.superclass
|
125
|
+
end
|
126
|
+
default_configuration
|
127
|
+
end
|
128
|
+
|
105
129
|
def merge_configuration(user_configuration, target=self)
|
106
|
-
configuration =
|
130
|
+
configuration = parent_configuration(target).dup
|
107
131
|
prepare_configuration(user_configuration).each do |key, value|
|
108
132
|
case key
|
109
133
|
when :base
|
@@ -6,7 +6,7 @@ module ActiveLdap
|
|
6
6
|
|
7
7
|
module ClassMethods
|
8
8
|
@@active_connections = {}
|
9
|
-
@@allow_concurrency =
|
9
|
+
@@allow_concurrency = true
|
10
10
|
|
11
11
|
def thread_safe_active_connections
|
12
12
|
@@active_connections[Thread.current.object_id] ||= {}
|
@@ -135,7 +135,7 @@ module ActiveLdap
|
|
135
135
|
end
|
136
136
|
config = configuration(key)
|
137
137
|
conn = active_connections[key]
|
138
|
-
|
138
|
+
remove_configuration_by_key(key)
|
139
139
|
active_connections.delete_if {|_key, value| value == conn}
|
140
140
|
conn.disconnect! if conn
|
141
141
|
config
|
@@ -165,11 +165,11 @@ module ActiveLdap
|
|
165
165
|
connection.schema
|
166
166
|
end
|
167
167
|
|
168
|
-
private
|
169
168
|
def active_connection_key(k=self)
|
170
169
|
k.name.blank? ? k.object_id : k.name
|
171
170
|
end
|
172
171
|
|
172
|
+
private
|
173
173
|
def determine_active_connection_name
|
174
174
|
key = active_connection_key
|
175
175
|
if active_connections[key] or configuration(key)
|
@@ -197,27 +197,9 @@ module ActiveLdap
|
|
197
197
|
if Object.respond_to?(:java)
|
198
198
|
"jndi"
|
199
199
|
else
|
200
|
-
|
201
|
-
$LOAD_PATH.each do |path|
|
202
|
-
if File.exist?(File.join(path, "ldap", "ldif.rb"))
|
203
|
-
ruby_ldap_available = true
|
204
|
-
break
|
205
|
-
end
|
206
|
-
end
|
207
|
-
if !ruby_ldap_available and Object.const_defined?(:Gem)
|
208
|
-
ruby_ldap_available = gem_available?("ruby-ldap")
|
209
|
-
end
|
210
|
-
if ruby_ldap_available
|
211
|
-
"ldap"
|
212
|
-
else
|
213
|
-
"net-ldap"
|
214
|
-
end
|
200
|
+
"net-ldap"
|
215
201
|
end
|
216
202
|
end
|
217
|
-
|
218
|
-
def gem_available?(name)
|
219
|
-
not Gem::Specification.find_all_by_name(name).empty?
|
220
|
-
end
|
221
203
|
end
|
222
204
|
|
223
205
|
def setup_connection(config=nil)
|
@@ -62,7 +62,7 @@ module ActiveLdap
|
|
62
62
|
|
63
63
|
HEX_PAIR = "(?:[\\da-fA-F]{2})"
|
64
64
|
STRING_CHARS_RE = /[^,=\+<>\#;\\\"]*/ #
|
65
|
-
PAIR_RE = /\\([,=\+<>\#;]|\\|\"|(#{HEX_PAIR}))/ #
|
65
|
+
PAIR_RE = /\\([,=\+<>\#;]|\\|\"| |(#{HEX_PAIR}))/ #
|
66
66
|
HEX_STRING_RE = /\#(#{HEX_PAIR}+)/ #
|
67
67
|
def scan_attribute_value(scanner)
|
68
68
|
if scanner.scan(HEX_STRING_RE)
|
@@ -17,11 +17,12 @@ module ActiveLdap
|
|
17
17
|
if attribute_or_name.is_a?(Schema::Attribute)
|
18
18
|
name = attribute_or_name.name
|
19
19
|
else
|
20
|
-
|
20
|
+
attribute_name = attribute_or_name.to_s
|
21
|
+
attribute = schema.attribute(attribute_name)
|
21
22
|
return nil if attribute.id.nil?
|
22
|
-
if attribute.name ==
|
23
|
-
attribute.aliases.include?(
|
24
|
-
name =
|
23
|
+
if attribute.name == attribute_name or
|
24
|
+
attribute.aliases.include?(attribute_name)
|
25
|
+
name = attribute_name
|
25
26
|
else
|
26
27
|
return nil
|
27
28
|
end
|
@@ -22,9 +22,23 @@ module ActiveLdap
|
|
22
22
|
end
|
23
23
|
|
24
24
|
module Common
|
25
|
-
VALID_SEARCH_OPTIONS = [
|
26
|
-
|
27
|
-
|
25
|
+
VALID_SEARCH_OPTIONS = [
|
26
|
+
:attribute,
|
27
|
+
:value,
|
28
|
+
:filter,
|
29
|
+
:prefix,
|
30
|
+
:classes,
|
31
|
+
:scope,
|
32
|
+
:limit,
|
33
|
+
:attributes,
|
34
|
+
:sort_by,
|
35
|
+
:order,
|
36
|
+
:connection,
|
37
|
+
:base,
|
38
|
+
:offset,
|
39
|
+
:use_paged_results,
|
40
|
+
:page_size,
|
41
|
+
]
|
28
42
|
|
29
43
|
def search(options={}, &block)
|
30
44
|
validate_search_options(options)
|
@@ -62,6 +76,8 @@ module ActiveLdap
|
|
62
76
|
:attributes => requested_attributes,
|
63
77
|
:sort_by => options[:sort_by] || sort_by,
|
64
78
|
:order => options[:order] || order,
|
79
|
+
:use_paged_results => options[:use_paged_results],
|
80
|
+
:page_size => options[:page_size],
|
65
81
|
}
|
66
82
|
options[:connection] ||= connection
|
67
83
|
values = []
|
@@ -96,10 +112,11 @@ module ActiveLdap
|
|
96
112
|
}
|
97
113
|
|
98
114
|
attribute = attr || ensure_search_attribute
|
115
|
+
escaped_value = DN.escape_value(value)
|
99
116
|
options_for_non_leaf = {
|
100
117
|
:attribute => attr,
|
101
118
|
:value => value,
|
102
|
-
:prefix => ["#{attribute}=#{
|
119
|
+
:prefix => ["#{attribute}=#{escaped_value}", prefix].compact.join(","),
|
103
120
|
:limit => 1,
|
104
121
|
:scope => :base,
|
105
122
|
}
|
@@ -291,6 +308,9 @@ module ActiveLdap
|
|
291
308
|
offset = options.delete(:offset) || offset
|
292
309
|
options[:attributes] = options.delete(:attributes) || ['*']
|
293
310
|
options[:attributes] |= ['objectClass']
|
311
|
+
if options.delete(:include_operational_attributes)
|
312
|
+
options[:attributes] |= ["+"]
|
313
|
+
end
|
294
314
|
results = search(options).collect do |dn, attrs|
|
295
315
|
instantiate([dn, attrs, {:connection => options[:connection]}])
|
296
316
|
end
|
@@ -81,9 +81,10 @@ module ActiveLdap
|
|
81
81
|
end
|
82
82
|
end
|
83
83
|
|
84
|
-
def reload
|
84
|
+
def reload(options={})
|
85
85
|
clear_association_cache
|
86
|
-
|
86
|
+
search_options = options.merge(value: id)
|
87
|
+
_, attributes = search(search_options).find do |_dn, _attributes|
|
87
88
|
dn == _dn
|
88
89
|
end
|
89
90
|
if attributes.nil?
|
data/lib/active_ldap/populate.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
module ActiveLdap
|
2
2
|
module Populate
|
3
3
|
module_function
|
4
|
-
def ensure_base(base_class=nil)
|
4
|
+
def ensure_base(base_class=nil, options={})
|
5
5
|
base_class ||= Base
|
6
6
|
return unless base_class.search(:scope => :base).empty?
|
7
|
+
dc_base_class = options[:dc_base_class] || base_class
|
8
|
+
ou_base_class = options[:ou_base_class] || base_class
|
7
9
|
|
8
10
|
base_dn = DN.parse(base_class.base)
|
9
11
|
suffixes = []
|
@@ -15,11 +17,11 @@ module ActiveLdap
|
|
15
17
|
begin
|
16
18
|
case name.downcase
|
17
19
|
when "dc"
|
18
|
-
ensure_dc(value, prefix,
|
20
|
+
ensure_dc(value, prefix, dc_base_class)
|
19
21
|
when "ou"
|
20
22
|
ensure_ou(value,
|
21
23
|
:base => prefix,
|
22
|
-
:base_class =>
|
24
|
+
:base_class => ou_base_class)
|
23
25
|
end
|
24
26
|
rescue ActiveLdap::OperationNotPermitted
|
25
27
|
end
|
@@ -192,11 +192,11 @@ module ActiveLdap
|
|
192
192
|
fraction = fraction.to_f if fraction
|
193
193
|
time_zone = match_data[-1]
|
194
194
|
arguments = [
|
195
|
-
year, month, day, hour, minute, second, fraction, time_zone,
|
195
|
+
value, year, month, day, hour, minute, second, fraction, time_zone,
|
196
196
|
Time.now,
|
197
197
|
]
|
198
|
-
if Time.method(:make_time).arity ==
|
199
|
-
arguments
|
198
|
+
if Time.method(:make_time).arity == 11
|
199
|
+
arguments[2, 0] = nil
|
200
200
|
end
|
201
201
|
begin
|
202
202
|
Time.send(:make_time, *arguments)
|
@@ -222,7 +222,11 @@ module ActiveLdap
|
|
222
222
|
if value.gmt?
|
223
223
|
normalized_value + "Z"
|
224
224
|
else
|
225
|
-
|
225
|
+
# for timezones with non-zero minutes, such as IST which is +0530,
|
226
|
+
# divmod(3600) will give wrong value of 1800
|
227
|
+
|
228
|
+
offset = value.gmtoff / 60 # in minutes
|
229
|
+
normalized_value + ("%+03d%02d" % offset.divmod(60))
|
226
230
|
end
|
227
231
|
else
|
228
232
|
value
|
@@ -53,15 +53,23 @@ module ActiveLdap
|
|
53
53
|
errors.empty? && output
|
54
54
|
end
|
55
55
|
|
56
|
-
def save(
|
57
|
-
|
56
|
+
def save(**options)
|
57
|
+
perform_validations(options) ? super : false
|
58
58
|
end
|
59
59
|
|
60
|
-
def save!(
|
61
|
-
|
60
|
+
def save!(**options)
|
61
|
+
perform_validations(options) ? super : raise(EntryInvalid.new(self))
|
62
62
|
end
|
63
63
|
|
64
64
|
private
|
65
|
+
def perform_validations(options)
|
66
|
+
if options[:validate] == false
|
67
|
+
true
|
68
|
+
else
|
69
|
+
valid?(options[:context])
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
65
73
|
def format_validation_message(format, parameters)
|
66
74
|
format % parameters
|
67
75
|
end
|
data/lib/active_ldap/version.rb
CHANGED
data/lib/active_ldap.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require "rubygems"
|
2
1
|
require "active_model"
|
3
2
|
require "active_support/core_ext"
|
4
3
|
|
@@ -8,12 +7,6 @@ module ActiveLdap
|
|
8
7
|
autoload :Command, "active_ldap/command"
|
9
8
|
end
|
10
9
|
|
11
|
-
if RUBY_PLATFORM.match('linux')
|
12
|
-
require 'active_ldap/timeout'
|
13
|
-
else
|
14
|
-
require 'active_ldap/timeout_stub'
|
15
|
-
end
|
16
|
-
|
17
10
|
require 'active_ldap/get_text'
|
18
11
|
|
19
12
|
require 'active_ldap/compatible'
|
data/po/en/active-ldap.po
CHANGED
@@ -7,7 +7,7 @@ msgid ""
|
|
7
7
|
msgstr ""
|
8
8
|
"Project-Id-Version: Ruby/ActiveLdap 1.1.1\n"
|
9
9
|
"POT-Creation-Date: 2009-08-04 23:26+0900\n"
|
10
|
-
"PO-Revision-Date:
|
10
|
+
"PO-Revision-Date: 2016-05-13 21:52+0900\n"
|
11
11
|
"Last-Translator: Kouhei Sutou <kou@cozmixng.org>\n"
|
12
12
|
"Language-Team: English\n"
|
13
13
|
"MIME-Version: 1.0\n"
|
@@ -3524,7 +3524,7 @@ msgstr ""
|
|
3524
3524
|
|
3525
3525
|
#: lib/active_ldap/adapter/base.rb:579
|
3526
3526
|
msgid ""
|
3527
|
-
"Reconnect to server failed: %s\n"
|
3527
|
+
"Reconnect to server failed: %s: %s\n"
|
3528
3528
|
"Reconnect to server failed backtrace:\n"
|
3529
3529
|
"%s"
|
3530
3530
|
msgstr ""
|
data/po/ja/active-ldap.po
CHANGED
@@ -7,7 +7,7 @@ msgid ""
|
|
7
7
|
msgstr ""
|
8
8
|
"Project-Id-Version: Ruby/ActiveLdap 1.1.1\n"
|
9
9
|
"POT-Creation-Date: 2009-08-04 23:26+0900\n"
|
10
|
-
"PO-Revision-Date:
|
10
|
+
"PO-Revision-Date: 2016-05-13 21:53+0900\n"
|
11
11
|
"Last-Translator: Kouhei Sutou <kou@cozmixng.org>\n"
|
12
12
|
"Language-Team: Japanese\n"
|
13
13
|
"MIME-Version: 1.0\n"
|
@@ -3533,11 +3533,11 @@ msgstr "再接続を試みています"
|
|
3533
3533
|
|
3534
3534
|
#: lib/active_ldap/adapter/base.rb:579
|
3535
3535
|
msgid ""
|
3536
|
-
"Reconnect to server failed: %s\n"
|
3536
|
+
"Reconnect to server failed: %s: %s\n"
|
3537
3537
|
"Reconnect to server failed backtrace:\n"
|
3538
3538
|
"%s"
|
3539
3539
|
msgstr ""
|
3540
|
-
"サーバへの再接続が失敗しました: %s\n"
|
3540
|
+
"サーバへの再接続が失敗しました: %s: %s\n"
|
3541
3541
|
"サーバへの再接続失敗時のバックトレース:\n"
|
3542
3542
|
"%s"
|
3543
3543
|
|
@@ -1,6 +1,6 @@
|
|
1
|
-
# Your LDAP server
|
2
|
-
# This is a LDIF file for OpenLDAP to do the
|
3
|
-
# You can use this file by the following command
|
1
|
+
# Your LDAP server needs to accept 'phonetic' attribute option for test.
|
2
|
+
# This is a LDIF file for OpenLDAP to do the configuration.
|
3
|
+
# You can use this file by the following command line on Debian GNU/Linux
|
4
4
|
# or Ubuntu:
|
5
5
|
# % sudo -H ldapmodify -Y EXTERNAL -H ldapi:/// -f test/add-phonetic-attribute-options-to-slapd.ldif
|
6
6
|
version: 1
|