ruby-activeldap-debug 0.7.0 → 0.7.1
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/lib/activeldap/base.rb +53 -3
- data/lib/activeldap/ldap.rb +91 -12
- data/lib/activeldap.rb +2 -2
- metadata +2 -2
data/lib/activeldap/base.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
# === ActiveLDAP - an OO-interface to LDAP objects inspired by ActiveRecord
|
2
2
|
# Author: Will Drewry <will@alum.bu.edu>
|
3
3
|
# License: See LICENSE and COPYING.txt
|
4
|
-
# Copyright 2004 Will Drewry <will@alum.bu.edu>
|
4
|
+
# Copyright 2004-2006 Will Drewry <will@alum.bu.edu>
|
5
|
+
# Some portions Copyright 2006 Google Inc
|
5
6
|
#
|
6
7
|
# == Summary
|
7
8
|
# ActiveLDAP lets you read and update LDAP entries in a completely object
|
@@ -347,6 +348,12 @@ module ActiveLDAP
|
|
347
348
|
retry if Base.reconnect()
|
348
349
|
# Do nothing on failure
|
349
350
|
@@logger.debug "No matches for #{config[:filter]} and attrs #{config[:attrs]}"
|
351
|
+
rescue => detail
|
352
|
+
if LDAP::err2exception(@@conn.err)[0] == LDAP::ServerDown
|
353
|
+
@@logger.debug("Failed to write: #{entry}")
|
354
|
+
retry if Base.reconnect()
|
355
|
+
end
|
356
|
+
raise detail
|
350
357
|
end
|
351
358
|
return values
|
352
359
|
end
|
@@ -407,6 +414,12 @@ module ActiveLDAP
|
|
407
414
|
|
408
415
|
# Do nothing on failure
|
409
416
|
@@logger.debug "no matches for #{attr}=#{val}"
|
417
|
+
rescue => detail
|
418
|
+
if LDAP::err2exception(@@conn.err)[0] == LDAP::ServerDown
|
419
|
+
@@logger.debug("Failed to write: #{entry}")
|
420
|
+
retry if Base.reconnect()
|
421
|
+
end
|
422
|
+
raise detail
|
410
423
|
end
|
411
424
|
return nil
|
412
425
|
end
|
@@ -464,6 +477,12 @@ module ActiveLDAP
|
|
464
477
|
|
465
478
|
# Do nothing on failure
|
466
479
|
@@logger.debug "no matches for #{attr}=#{val}"
|
480
|
+
rescue => detail
|
481
|
+
if LDAP::err2exception(@@conn.err)[0] == LDAP::ServerDown
|
482
|
+
@@logger.debug("Failed to write: #{entry}")
|
483
|
+
retry if Base.reconnect()
|
484
|
+
end
|
485
|
+
raise detail
|
467
486
|
end
|
468
487
|
return matches
|
469
488
|
end
|
@@ -714,6 +733,10 @@ module ActiveLDAP
|
|
714
733
|
retry if Base.reconnect()
|
715
734
|
raise DeleteError, "Failed to delete LDAP entry: '#{@dn}'"
|
716
735
|
rescue LDAP::ResultError => detail
|
736
|
+
if LDAP::err2exception(@@conn.err)[0] == LDAP::ServerDown
|
737
|
+
@@logger.debug("Failed to write: #{entry}")
|
738
|
+
retry if Base.reconnect()
|
739
|
+
end
|
717
740
|
raise DeleteError, "Failed to delete LDAP entry: '#{@dn}'"
|
718
741
|
end
|
719
742
|
end
|
@@ -796,6 +819,8 @@ module ActiveLDAP
|
|
796
819
|
name = @attr_methods[name]
|
797
820
|
name = pair[0].split(/;/)[0] if name.nil? # for objectClass, or removed vals
|
798
821
|
value = data[name+suffix]
|
822
|
+
# If it doesn't exist, don't freak out.
|
823
|
+
value = [] if value.nil?
|
799
824
|
|
800
825
|
# Detect subtypes and account for them
|
801
826
|
binary = LDAP::LDAP_MOD_BVALUES if Base.schema.binary? name
|
@@ -827,6 +852,8 @@ module ActiveLDAP
|
|
827
852
|
name = @attr_methods[name]
|
828
853
|
name = pair[0].split(/;/)[0] if name.nil? # for obj class or removed vals
|
829
854
|
value = pair[1]
|
855
|
+
# Make sure to change this to an Array if there was mistake earlier.
|
856
|
+
value = [] if value.nil?
|
830
857
|
|
831
858
|
if not replaceable.member? name+suffix
|
832
859
|
# Detect subtypes and account for them
|
@@ -843,11 +870,17 @@ module ActiveLDAP
|
|
843
870
|
@@conn.modify(@dn, entry)
|
844
871
|
@@logger.debug("#write: modify successful")
|
845
872
|
rescue RuntimeError => detail
|
846
|
-
#todo# check for
|
873
|
+
#todo# check for SERVER_DOWN
|
847
874
|
# the connection may have gone stale. let's reconnect and retry.
|
848
875
|
retry if Base.reconnect()
|
849
876
|
raise WriteError, "Could not update LDAP entry: #{detail}"
|
850
877
|
rescue => detail
|
878
|
+
@@logger.debug(LDAP::err2exception(@@conn.err).inspect)
|
879
|
+
if LDAP::err2exception(@@conn.err)[0] == LDAP::ServerDown
|
880
|
+
@@logger.debug("Failed to write: #{entry}")
|
881
|
+
retry if Base.reconnect()
|
882
|
+
end
|
883
|
+
@@logger.debug("Failed to write: #{entry}")
|
851
884
|
raise WriteError, "Could not update LDAP entry: #{detail}"
|
852
885
|
end
|
853
886
|
else # add everything!
|
@@ -880,6 +913,10 @@ module ActiveLDAP
|
|
880
913
|
retry if Base.reconnect()
|
881
914
|
raise WriteError, "Could not add LDAP entry[#{Base.connection.err2string(Base.connection.err)}]: #{detail}"
|
882
915
|
rescue LDAP::ResultError => detail
|
916
|
+
if LDAP::err2exception(@@conn.err)[0] == LDAP::ServerDown
|
917
|
+
@@logger.debug("Failed to write: #{entry}")
|
918
|
+
retry if Base.reconnect()
|
919
|
+
end
|
883
920
|
raise WriteError, "Could not add LDAP entry[#{Base.connection.err2string(Base.connection.err)}]: #{detail}"
|
884
921
|
end
|
885
922
|
end
|
@@ -1347,8 +1384,21 @@ module ActiveLDAP
|
|
1347
1384
|
raise AttributeAssignmentError, 'cannot modify the DN attribute value'
|
1348
1385
|
end
|
1349
1386
|
|
1387
|
+
# Enforce LDAP-pleasing values
|
1388
|
+
@@logger.debug("value = #{value.inspect}, value.class = #{value.class}")
|
1389
|
+
real_value = value
|
1390
|
+
# Squash empty values
|
1391
|
+
if value.class == Array
|
1392
|
+
real_value = value.collect {|c| if c == ''; []; else c; end }.flatten
|
1393
|
+
end
|
1394
|
+
real_value = [] if real_value.nil?
|
1395
|
+
real_value = [] if real_value == ''
|
1396
|
+
real_value = [real_value] if real_value.class == String
|
1397
|
+
real_value = [real_value.to_s] if real_value.class == Fixnum
|
1398
|
+
# NOTE: Hashes are allowed for subtyping.
|
1399
|
+
|
1350
1400
|
# Assign the value
|
1351
|
-
@data[attr] =
|
1401
|
+
@data[attr] = real_value
|
1352
1402
|
|
1353
1403
|
# Return the passed in value
|
1354
1404
|
@@logger.debug("stub: exitting attribute_method=")
|
data/lib/activeldap/ldap.rb
CHANGED
@@ -1,25 +1,104 @@
|
|
1
1
|
# Extensions to Rubu/LDAP to make ActiveLDAP behave better
|
2
2
|
#
|
3
|
+
# Copyright 2006 Will Drewry <will@alum.bu.edu>
|
4
|
+
# Some portions Copyright 2006 Google Inc
|
3
5
|
|
4
6
|
|
5
7
|
|
6
8
|
module LDAP
|
7
|
-
|
9
|
+
ERRORS = [
|
10
|
+
"LDAP_SUCCESS",
|
11
|
+
"LDAP_OPERATIONS_ERROR",
|
12
|
+
"LDAP_PROTOCOL_ERROR",
|
13
|
+
"LDAP_TIMELIMIT_EXCEEDED",
|
14
|
+
"LDAP_SIZELIMIT_EXCEEDED",
|
15
|
+
"LDAP_COMPARE_FALSE",
|
16
|
+
"LDAP_COMPARE_TRUE",
|
17
|
+
"LDAP_STRONG_AUTH_NOT_SUPPORTED",
|
18
|
+
"LDAP_AUTH_METHOD_NOT_SUPPORTED",
|
19
|
+
"LDAP_STRONG_AUTH_REQUIRED",
|
20
|
+
"LDAP_REFERRAL",
|
21
|
+
"LDAP_ADMINLIMIT_EXCEEDED",
|
22
|
+
"LDAP_UNAVAILABLE_CRITICAL_EXTENSION",
|
23
|
+
"LDAP_CONFIDENTIALITY_REQUIRED",
|
24
|
+
"LDAP_SASL_BIND_IN_PROGRESS",
|
25
|
+
"LDAP_PARTIAL_RESULTS",
|
26
|
+
"LDAP_NO_SUCH_ATTRIBUTE",
|
27
|
+
"LDAP_UNDEFINED_TYPE",
|
28
|
+
"LDAP_INAPPROPRIATE_MATCHING",
|
29
|
+
"LDAP_CONSTRAINT_VIOLATION",
|
30
|
+
"LDAP_TYPE_OR_VALUE_EXISTS",
|
31
|
+
"LDAP_INVALID_SYNTAX",
|
32
|
+
"LDAP_NO_SUCH_OBJECT",
|
33
|
+
"LDAP_ALIAS_PROBLEM",
|
34
|
+
"LDAP_INVALID_DN_SYNTAX",
|
35
|
+
"LDAP_IS_LEAF",
|
36
|
+
"LDAP_ALIAS_DEREF_PROBLEM",
|
37
|
+
"LDAP_INAPPROPRIATE_AUTH",
|
38
|
+
"LDAP_INVALID_CREDENTIALS",
|
39
|
+
"LDAP_INSUFFICIENT_ACCESS",
|
40
|
+
"LDAP_BUSY",
|
41
|
+
"LDAP_UNAVAILABLE",
|
42
|
+
"LDAP_UNWILLING_TO_PERFORM",
|
43
|
+
"LDAP_LOOP_DETECT",
|
44
|
+
"LDAP_NAMING_VIOLATION",
|
45
|
+
"LDAP_OBJECT_CLASS_VIOLATION",
|
46
|
+
"LDAP_NOT_ALLOWED_ON_NONLEAF",
|
47
|
+
"LDAP_NOT_ALLOWED_ON_RDN",
|
48
|
+
"LDAP_ALREADY_EXISTS",
|
49
|
+
"LDAP_NO_OBJECT_CLASS_MODS",
|
50
|
+
"LDAP_RESULTS_TOO_LARGE",
|
51
|
+
"LDAP_OTHER",
|
52
|
+
"LDAP_SERVER_DOWN",
|
53
|
+
"LDAP_LOCAL_ERROR",
|
54
|
+
"LDAP_ENCODING_ERROR",
|
55
|
+
"LDAP_DECODING_ERROR",
|
56
|
+
"LDAP_TIMEOUT",
|
57
|
+
"LDAP_AUTH_UNKNOWN",
|
58
|
+
"LDAP_FILTER_ERROR",
|
59
|
+
"LDAP_USER_CANCELLED",
|
60
|
+
"LDAP_PARAM_ERROR",
|
61
|
+
"LDAP_NO_MEMORY",
|
62
|
+
"LDAP_CONNECT_ERROR"
|
63
|
+
]
|
64
|
+
attr_reader :error_map
|
65
|
+
# Calls err2exception() with 1...100 to
|
66
|
+
# pregenerate all the constants for errors.
|
67
|
+
# TODO: look at other support LDAP SDKs for weirdness
|
68
|
+
def LDAP::generate_err2exceptions()
|
69
|
+
hash = {}
|
70
|
+
ERRORS.each do |err|
|
71
|
+
begin
|
72
|
+
val = LDAP.const_get(err)
|
73
|
+
# Make name into a exception
|
74
|
+
exc = err.gsub(/^LDAP_/, '')
|
75
|
+
exc = exc.split('_').collect {|w| w.capitalize }.join('')
|
76
|
+
# Doesn't exist :-)
|
77
|
+
LDAP.module_eval(<<-end_module_eval)
|
78
|
+
class #{exc} < LDAP::ResultError
|
79
|
+
end
|
80
|
+
end_module_eval
|
81
|
+
hash[val] = exc
|
82
|
+
rescue NameError
|
83
|
+
# next!
|
84
|
+
end
|
85
|
+
end
|
86
|
+
@@error_map = hash
|
87
|
+
end
|
88
|
+
|
89
|
+
# Creates useful exceptions from @@conn.err output
|
8
90
|
# Returns [exception, message] based on err2string
|
9
91
|
def LDAP.err2exception(errno=0)
|
10
|
-
|
11
|
-
err = err.split(' ').collect {|w| w.capitalize }.join('')
|
12
|
-
err.gsub!(/[^A-Za-z]/, '')
|
13
|
-
# If the exception exists - raise it!
|
92
|
+
need_to_rebuild = true
|
14
93
|
begin
|
15
|
-
exc = LDAP.const_get(
|
94
|
+
exc = LDAP.const_get(@@error_map[errno])
|
16
95
|
rescue NameError
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
exc =
|
96
|
+
if need_to_rebuild
|
97
|
+
generate_err2exceptions()
|
98
|
+
need_to_rebuild = false
|
99
|
+
retry
|
100
|
+
end
|
101
|
+
exc = RuntimeError
|
23
102
|
end
|
24
103
|
return [exc, err2string(errno)]
|
25
104
|
end
|
data/lib/activeldap.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#!/usr/bin/ruby
|
1
|
+
#!/usr/bin/ruby
|
2
2
|
# = Ruby/ActiveLDAP
|
3
3
|
#
|
4
4
|
# "Ruby/ActiveLDAP" Copyright (C) 2004,2005 Will Drewry mailto:will@alum.bu.edu
|
@@ -913,7 +913,7 @@ require 'activeldap/configuration'
|
|
913
913
|
|
914
914
|
|
915
915
|
module ActiveLDAP
|
916
|
-
VERSION = "0.7.
|
916
|
+
VERSION = "0.7.1"
|
917
917
|
end
|
918
918
|
|
919
919
|
ActiveLDAP::Base.class_eval do
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: ruby-activeldap-debug
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.7.
|
7
|
-
date: 2006-05-
|
6
|
+
version: 0.7.1
|
7
|
+
date: 2006-05-04 00:00:00 +01:00
|
8
8
|
summary: Ruby/ActiveLDAP is a object-oriented API to LDAP
|
9
9
|
require_paths:
|
10
10
|
- lib
|