ruby-activeldap 0.5.4 → 0.5.5
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/activeldap/base.rb +75 -75
- data/lib/activeldap/configuration.rb +3 -3
- data/lib/activeldap.rb +26 -26
- metadata +5 -4
data/lib/activeldap/base.rb
CHANGED
@@ -34,7 +34,7 @@ require 'ldap/schema'
|
|
34
34
|
require 'log4r'
|
35
35
|
|
36
36
|
module ActiveLDAP
|
37
|
-
# OO-interface to LDAP assuming pam/nss_ldap-style
|
37
|
+
# OO-interface to LDAP assuming pam/nss_ldap-style comanization with Active specifics
|
38
38
|
# Each subclass does a ldapsearch for the matching entry.
|
39
39
|
# If no exact match, raise an error.
|
40
40
|
# If match, change all LDAP attributes in accessor attributes on the object.
|
@@ -167,7 +167,7 @@ module ActiveLDAP
|
|
167
167
|
# +config+ must be a hash that may contain any of the following fields:
|
168
168
|
# :user, :password_block, :logger, :host, :port, :base, :bind_format, :try_sasl, :allow_anonymous
|
169
169
|
# :user specifies the username to bind with.
|
170
|
-
# :bind_format specifies the string to substitute the username into on bind. e.g. uid=%s,ou=People,dc=
|
170
|
+
# :bind_format specifies the string to substitute the username into on bind. e.g. uid=%s,ou=People,dc=example,dc=com. Overrides @@bind_format.
|
171
171
|
# :password_block specifies a Proc object that will yield a String to be used as the password when called.
|
172
172
|
# :logger specifies a preconfigured Log4r::Logger to be used for all logging
|
173
173
|
# :host overrides the configuration.rb @@host setting with the LDAP server hostname
|
@@ -231,7 +231,7 @@ module ActiveLDAP
|
|
231
231
|
@@conn = LDAP::Conn.new(@@config[:host], @@config[:port])
|
232
232
|
end
|
233
233
|
end
|
234
|
-
|
234
|
+
|
235
235
|
|
236
236
|
# Enforce LDAPv3
|
237
237
|
@@conn.set_option(LDAP::LDAP_OPT_PROTOCOL_VERSION, 3)
|
@@ -308,7 +308,7 @@ module ActiveLDAP
|
|
308
308
|
values.push(res)
|
309
309
|
end
|
310
310
|
rescue RuntimeError => detail
|
311
|
-
|
311
|
+
|
312
312
|
# Do nothing on failure
|
313
313
|
end
|
314
314
|
return values
|
@@ -364,7 +364,7 @@ module ActiveLDAP
|
|
364
364
|
end
|
365
365
|
end
|
366
366
|
rescue RuntimeError => detail
|
367
|
-
|
367
|
+
|
368
368
|
# Do nothing on failure
|
369
369
|
end
|
370
370
|
return nil
|
@@ -417,7 +417,7 @@ module ActiveLDAP
|
|
417
417
|
end
|
418
418
|
rescue RuntimeError => detail
|
419
419
|
#p @@conn.err2string(@@conn.err)
|
420
|
-
|
420
|
+
|
421
421
|
# Do nothing on failure
|
422
422
|
end
|
423
423
|
return matches
|
@@ -488,7 +488,7 @@ module ActiveLDAP
|
|
488
488
|
if val.class == LDAP::Entry
|
489
489
|
# Call import, which is basically initialize
|
490
490
|
# without accessing LDAP.
|
491
|
-
|
491
|
+
|
492
492
|
import(val)
|
493
493
|
return
|
494
494
|
end
|
@@ -524,12 +524,12 @@ module ActiveLDAP
|
|
524
524
|
# Save DN
|
525
525
|
@dn = m.dn
|
526
526
|
# Load up data into tmp
|
527
|
-
|
527
|
+
|
528
528
|
m.attrs.each do |attr|
|
529
529
|
# Load with subtypes just like @data
|
530
|
-
|
530
|
+
|
531
531
|
safe_attr, value = make_subtypes(attr, m.vals(attr).dup)
|
532
|
-
|
532
|
+
|
533
533
|
# Add subtype to any existing values
|
534
534
|
if @ldap_data.has_key? safe_attr
|
535
535
|
value.each do |v|
|
@@ -557,7 +557,7 @@ module ActiveLDAP
|
|
557
557
|
|
558
558
|
# Setup dn attribute (later rdn too!)
|
559
559
|
attr_sym = "#{dnattr()}=".to_sym
|
560
|
-
|
560
|
+
|
561
561
|
send(attr_sym, val)
|
562
562
|
end
|
563
563
|
end
|
@@ -571,7 +571,7 @@ module ActiveLDAP
|
|
571
571
|
# Return attribute methods so that a program can determine available
|
572
572
|
# attributes dynamically without schema awareness
|
573
573
|
def attributes
|
574
|
-
|
574
|
+
|
575
575
|
send(:apply_objectclass, @data['objectClass']) if @data['objectClass'] != @last_oc
|
576
576
|
return @attr_methods.keys
|
577
577
|
end
|
@@ -580,7 +580,7 @@ module ActiveLDAP
|
|
580
580
|
#
|
581
581
|
# Return whether the entry exists in LDAP or not
|
582
582
|
def exists?
|
583
|
-
|
583
|
+
|
584
584
|
return @exists
|
585
585
|
end
|
586
586
|
|
@@ -588,7 +588,7 @@ module ActiveLDAP
|
|
588
588
|
#
|
589
589
|
# Return the authoritative dn
|
590
590
|
def dn
|
591
|
-
|
591
|
+
|
592
592
|
return @dn.dup
|
593
593
|
end
|
594
594
|
|
@@ -599,7 +599,7 @@ module ActiveLDAP
|
|
599
599
|
# - Enforcement of undefined attributes is handled in the objectClass= method
|
600
600
|
# Must call enforce_types() first before enforcement can be guaranteed
|
601
601
|
def validate
|
602
|
-
|
602
|
+
|
603
603
|
# Clean up attr values, etc
|
604
604
|
send(:enforce_types)
|
605
605
|
|
@@ -630,7 +630,7 @@ module ActiveLDAP
|
|
630
630
|
end
|
631
631
|
end
|
632
632
|
end
|
633
|
-
|
633
|
+
|
634
634
|
end
|
635
635
|
|
636
636
|
|
@@ -638,7 +638,7 @@ module ActiveLDAP
|
|
638
638
|
#
|
639
639
|
# Delete this entry from LDAP
|
640
640
|
def delete
|
641
|
-
|
641
|
+
|
642
642
|
begin
|
643
643
|
@@conn.delete(@dn)
|
644
644
|
@exists = false
|
@@ -655,7 +655,7 @@ module ActiveLDAP
|
|
655
655
|
# TODO: Binary data support
|
656
656
|
# TODO: Relative DN support
|
657
657
|
def write
|
658
|
-
|
658
|
+
|
659
659
|
# Validate against the objectClass requirements
|
660
660
|
validate
|
661
661
|
|
@@ -667,10 +667,10 @@ module ActiveLDAP
|
|
667
667
|
# Expand subtypes to real ldap_data entries
|
668
668
|
# We can't reuse @ldap_data because an exception would leave
|
669
669
|
# an object in an unknown state
|
670
|
-
|
670
|
+
|
671
671
|
ldap_data = @ldap_data.dup
|
672
|
-
|
673
|
-
|
672
|
+
|
673
|
+
|
674
674
|
ldap_data.keys.each do |key|
|
675
675
|
ldap_data[key].each do |value|
|
676
676
|
if value.class == Hash
|
@@ -684,13 +684,13 @@ module ActiveLDAP
|
|
684
684
|
end
|
685
685
|
end
|
686
686
|
end
|
687
|
-
|
687
|
+
|
688
688
|
|
689
689
|
# Expand subtypes to real data entries, but leave @data alone
|
690
|
-
|
690
|
+
|
691
691
|
data = @data.dup
|
692
|
-
|
693
|
-
|
692
|
+
|
693
|
+
|
694
694
|
data.keys.each do |key|
|
695
695
|
data[key].each do |value|
|
696
696
|
if value.class == Hash
|
@@ -704,7 +704,7 @@ module ActiveLDAP
|
|
704
704
|
end
|
705
705
|
end
|
706
706
|
end
|
707
|
-
|
707
|
+
|
708
708
|
|
709
709
|
|
710
710
|
if @exists
|
@@ -715,7 +715,7 @@ module ActiveLDAP
|
|
715
715
|
# Now that all the subtypes will be treated as unique attributes
|
716
716
|
# we can see what's changed and add anything that is brand-spankin'
|
717
717
|
# new.
|
718
|
-
|
718
|
+
|
719
719
|
ldap_data.each do |pair|
|
720
720
|
suffix = ''
|
721
721
|
binary = 0
|
@@ -735,18 +735,18 @@ module ActiveLDAP
|
|
735
735
|
if not value.empty?
|
736
736
|
# Ditched delete then replace because attribs with no equality match rules
|
737
737
|
# will fails
|
738
|
-
|
738
|
+
|
739
739
|
entry.push(LDAP.mod(LDAP::LDAP_MOD_REPLACE|binary, name + suffix, value))
|
740
740
|
else
|
741
741
|
# Since some types do not have equality matching rules, delete doesn't work
|
742
742
|
# Replacing with nothing is equivalent.
|
743
|
-
|
743
|
+
|
744
744
|
entry.push(LDAP.mod(LDAP::LDAP_MOD_REPLACE|binary, name + suffix, []))
|
745
745
|
end
|
746
746
|
end
|
747
747
|
end
|
748
|
-
|
749
|
-
|
748
|
+
|
749
|
+
|
750
750
|
data.each do |pair|
|
751
751
|
suffix = ''
|
752
752
|
binary = 0
|
@@ -760,26 +760,26 @@ module ActiveLDAP
|
|
760
760
|
if not replaceable.member? name+suffix
|
761
761
|
# Detect subtypes and account for them
|
762
762
|
binary = LDAP::LDAP_MOD_BVALUES if Base.schema.binary? name
|
763
|
-
|
763
|
+
|
764
764
|
# REPLACE will function like ADD, but doesn't hit EQUALITY problems
|
765
765
|
# TODO: Added equality(attr) to Schema2
|
766
766
|
entry.push(LDAP.mod(LDAP::LDAP_MOD_REPLACE|binary, name + suffix, value)) unless value.empty?
|
767
767
|
end
|
768
768
|
end
|
769
|
-
|
769
|
+
|
770
770
|
begin
|
771
|
-
|
771
|
+
|
772
772
|
@@conn.modify(@dn, entry)
|
773
|
-
|
773
|
+
|
774
774
|
rescue => detail
|
775
775
|
raise WriteError, "Could not update LDAP entry: #{detail}"
|
776
776
|
end
|
777
777
|
else # add everything!
|
778
|
-
|
779
|
-
|
778
|
+
|
779
|
+
|
780
780
|
entry.push(LDAP.mod(LDAP::LDAP_MOD_ADD, @attr_methods[dnattr()],
|
781
781
|
data[@attr_methods[dnattr()]]))
|
782
|
-
|
782
|
+
|
783
783
|
entry.push(LDAP.mod(LDAP::LDAP_MOD_ADD, 'objectClass',
|
784
784
|
data[@attr_methods['objectClass']]))
|
785
785
|
data.each do |pair|
|
@@ -790,23 +790,23 @@ module ActiveLDAP
|
|
790
790
|
else
|
791
791
|
binary = 0
|
792
792
|
end
|
793
|
-
|
793
|
+
|
794
794
|
entry.push(LDAP.mod(LDAP::LDAP_MOD_ADD|binary, pair[0], pair[1]))
|
795
795
|
end
|
796
796
|
end
|
797
797
|
begin
|
798
|
-
|
798
|
+
|
799
799
|
@@conn.add(@dn, entry)
|
800
|
-
|
800
|
+
|
801
801
|
@exists = true
|
802
802
|
rescue LDAP::ResultError => detail
|
803
803
|
raise WriteError, "Could not add LDAP entry[#{Base.connection.err2string(Base.connection.err)}]: #{detail}"
|
804
804
|
end
|
805
805
|
end
|
806
|
-
|
806
|
+
|
807
807
|
@ldap_data = @data.dup
|
808
|
-
|
809
|
-
|
808
|
+
|
809
|
+
|
810
810
|
end
|
811
811
|
|
812
812
|
|
@@ -818,26 +818,26 @@ module ActiveLDAP
|
|
818
818
|
# using class_eval instead of using method_missing. This would
|
819
819
|
# give tab completion in irb.
|
820
820
|
def method_missing(name, *args)
|
821
|
-
|
821
|
+
|
822
822
|
|
823
823
|
# dynamically update the available attributes without requiring an
|
824
824
|
# explicit call. The cache 'last_oc' saves a lot of cpu time.
|
825
825
|
if @data['objectClass'] != @last_oc
|
826
|
-
|
826
|
+
|
827
827
|
send(:apply_objectclass, @data['objectClass'])
|
828
828
|
end
|
829
829
|
key = name.to_s
|
830
830
|
case key
|
831
831
|
when /^(\S+)=$/
|
832
832
|
real_key = $1
|
833
|
-
|
833
|
+
|
834
834
|
if @attr_methods.has_key? real_key
|
835
835
|
raise ArgumentError, "wrong number of arguments (#{args.size} for 1)" if args.size != 1
|
836
|
-
|
836
|
+
|
837
837
|
return send(:attribute_method=, real_key, args[0])
|
838
838
|
end
|
839
839
|
else
|
840
|
-
|
840
|
+
|
841
841
|
if @attr_methods.has_key? key
|
842
842
|
raise ArgumentError, "wrong number of arguments (#{args.size} for 1)" if args.size > 1
|
843
843
|
return attribute_method(key, *args)
|
@@ -861,7 +861,7 @@ module ActiveLDAP
|
|
861
861
|
# with the data given in the data given in LDAP::Entry.
|
862
862
|
#
|
863
863
|
def import(entry=nil)
|
864
|
-
|
864
|
+
|
865
865
|
if entry.class != LDAP::Entry
|
866
866
|
raise TypeError, "argument must be a LDAP::Entry"
|
867
867
|
end
|
@@ -876,9 +876,9 @@ module ActiveLDAP
|
|
876
876
|
@dn = entry.dn
|
877
877
|
entry.attrs.each do |attr|
|
878
878
|
# Load with subtypes just like @data
|
879
|
-
|
879
|
+
|
880
880
|
safe_attr, value = make_subtypes(attr, entry.vals(attr).dup)
|
881
|
-
|
881
|
+
|
882
882
|
# Add subtype to any existing values
|
883
883
|
if @ldap_data.has_key? safe_attr
|
884
884
|
value.each do |v|
|
@@ -904,13 +904,13 @@ module ActiveLDAP
|
|
904
904
|
# enforce_types applies your changes without attempting to write to LDAP. This means that
|
905
905
|
# if you set userCertificate to somebinary value, it will wrap it up correctly.
|
906
906
|
def enforce_types
|
907
|
-
|
907
|
+
|
908
908
|
send(:apply_objectclass, @data['objectClass']) if @data['objectClass'] != @last_oc
|
909
909
|
# Enforce attribute value formatting
|
910
910
|
@data.keys.each do |key|
|
911
911
|
@data[key] = attribute_input_handler(key, @data[key])
|
912
912
|
end
|
913
|
-
|
913
|
+
|
914
914
|
return true
|
915
915
|
end
|
916
916
|
|
@@ -922,7 +922,7 @@ module ActiveLDAP
|
|
922
922
|
# removing defined attributes that are no longer valid
|
923
923
|
# given the new objectclasses.
|
924
924
|
def apply_objectclass(val)
|
925
|
-
|
925
|
+
|
926
926
|
new_oc = val
|
927
927
|
new_oc = [val] if new_oc.class != Array
|
928
928
|
return new_oc if @last_oc == new_oc
|
@@ -967,7 +967,7 @@ module ActiveLDAP
|
|
967
967
|
# Hashes are for subtypes
|
968
968
|
# Arrays are for multiple entries
|
969
969
|
def attribute_input_handler(attr, value)
|
970
|
-
|
970
|
+
|
971
971
|
if attr.nil?
|
972
972
|
raise RuntimeError, 'The first argument, attr, must not be nil. Please report this as a bug!'
|
973
973
|
end
|
@@ -980,7 +980,7 @@ module ActiveLDAP
|
|
980
980
|
end
|
981
981
|
value.map! do |entry|
|
982
982
|
if entry.class != Hash
|
983
|
-
|
983
|
+
|
984
984
|
entry = entry.to_s
|
985
985
|
end
|
986
986
|
entry = attribute_input_handler(attr, entry)[0]
|
@@ -1015,7 +1015,7 @@ module ActiveLDAP
|
|
1015
1015
|
# e.g. userCertificate;binary => "some_bin"
|
1016
1016
|
# becomes userCertificate => {"binary" => "some_bin"}
|
1017
1017
|
def make_subtypes(attr, value)
|
1018
|
-
|
1018
|
+
|
1019
1019
|
return [attr, value] unless attr.match(/;/)
|
1020
1020
|
|
1021
1021
|
ret_attr, *subtypes = attr.split(/;/)
|
@@ -1027,7 +1027,7 @@ module ActiveLDAP
|
|
1027
1027
|
# This is a recursive function for building
|
1028
1028
|
# nested hashed from multi-subtyped values
|
1029
1029
|
def make_subtypes_helper(subtypes, value)
|
1030
|
-
|
1030
|
+
|
1031
1031
|
return value if subtypes.size == 0
|
1032
1032
|
return {subtypes[0] => make_subtypes_helper(subtypes[1..-1], value)}
|
1033
1033
|
end
|
@@ -1037,7 +1037,7 @@ module ActiveLDAP
|
|
1037
1037
|
# Extracts all of the subtypes from a given set of nested hashes
|
1038
1038
|
# and returns the attribute suffix and the final true value
|
1039
1039
|
def extract_subtypes(value)
|
1040
|
-
|
1040
|
+
|
1041
1041
|
subtype = ''
|
1042
1042
|
ret_val = value
|
1043
1043
|
if value.class == Hash
|
@@ -1087,7 +1087,7 @@ module ActiveLDAP
|
|
1087
1087
|
@@conn.bind()
|
1088
1088
|
return true
|
1089
1089
|
rescue
|
1090
|
-
|
1090
|
+
|
1091
1091
|
@@logger.warn "Warning: Anonymous authentication failed."
|
1092
1092
|
return false
|
1093
1093
|
end
|
@@ -1102,7 +1102,7 @@ module ActiveLDAP
|
|
1102
1102
|
@@conn.bind(bind_dn, @@config[:password_block].call())
|
1103
1103
|
return true
|
1104
1104
|
rescue
|
1105
|
-
|
1105
|
+
|
1106
1106
|
@@logger.warn "Warning: SIMPLE authentication failed."
|
1107
1107
|
return false
|
1108
1108
|
end
|
@@ -1116,14 +1116,14 @@ module ActiveLDAP
|
|
1116
1116
|
mechanisms = @@conn.root_dse[0]['supportedSASLMechanisms']
|
1117
1117
|
# Use GSSAPI if available
|
1118
1118
|
# Currently only GSSAPI is supported with Ruby/LDAP from
|
1119
|
-
# http://caliban.
|
1119
|
+
# http://caliban.com/files/redhat/RPMS/i386/ruby-ldap-0.8.2-4.i386.rpm
|
1120
1120
|
# TODO: Investigate further SASL support
|
1121
1121
|
if mechanisms.respond_to? :member? and mechanisms.member? 'GSSAPI'
|
1122
1122
|
begin
|
1123
1123
|
@@conn.sasl_bind(bind_dn, 'GSSAPI')
|
1124
1124
|
return true
|
1125
1125
|
rescue
|
1126
|
-
|
1126
|
+
|
1127
1127
|
@@logger.warn "Warning: SASL GSSAPI authentication failed."
|
1128
1128
|
return false
|
1129
1129
|
end
|
@@ -1136,7 +1136,7 @@ module ActiveLDAP
|
|
1136
1136
|
# Returns the value of self.class.base
|
1137
1137
|
# This is just syntactic sugar
|
1138
1138
|
def base
|
1139
|
-
|
1139
|
+
|
1140
1140
|
self.class.base
|
1141
1141
|
end
|
1142
1142
|
|
@@ -1145,7 +1145,7 @@ module ActiveLDAP
|
|
1145
1145
|
# Returns the value of self.class.required_classes
|
1146
1146
|
# This is just syntactic sugar
|
1147
1147
|
def required_classes
|
1148
|
-
|
1148
|
+
|
1149
1149
|
self.class.required_classes
|
1150
1150
|
end
|
1151
1151
|
|
@@ -1154,7 +1154,7 @@ module ActiveLDAP
|
|
1154
1154
|
# Returns the value of self.class.dnattr
|
1155
1155
|
# This is just syntactic sugar
|
1156
1156
|
def dnattr
|
1157
|
-
|
1157
|
+
|
1158
1158
|
self.class.dnattr
|
1159
1159
|
end
|
1160
1160
|
|
@@ -1162,7 +1162,7 @@ module ActiveLDAP
|
|
1162
1162
|
#
|
1163
1163
|
# Return the value of the attribute called by method_missing?
|
1164
1164
|
def attribute_method(method, not_array = false)
|
1165
|
-
|
1165
|
+
|
1166
1166
|
attr = @attr_methods[method]
|
1167
1167
|
|
1168
1168
|
# Return a copy of the stored data
|
@@ -1175,16 +1175,16 @@ module ActiveLDAP
|
|
1175
1175
|
#
|
1176
1176
|
# Set the value of the attribute called by method_missing?
|
1177
1177
|
def attribute_method=(method, value)
|
1178
|
-
|
1178
|
+
|
1179
1179
|
# Get the attr and clean up the input
|
1180
1180
|
attr = @attr_methods[method]
|
1181
|
-
|
1181
|
+
|
1182
1182
|
|
1183
1183
|
# Assign the value
|
1184
1184
|
@data[attr] = value
|
1185
1185
|
|
1186
1186
|
# Return the passed in value
|
1187
|
-
|
1187
|
+
|
1188
1188
|
return @data[attr]
|
1189
1189
|
end
|
1190
1190
|
|
@@ -1194,16 +1194,16 @@ module ActiveLDAP
|
|
1194
1194
|
# Make a method entry for _every_ alias of a valid attribute and map it
|
1195
1195
|
# onto the first attribute passed in.
|
1196
1196
|
def define_attribute_methods(attr)
|
1197
|
-
|
1197
|
+
|
1198
1198
|
if @attr_methods.has_key? attr
|
1199
1199
|
return
|
1200
1200
|
end
|
1201
1201
|
aliases = Base.schema.attribute_aliases(attr)
|
1202
1202
|
aliases.each do |ali|
|
1203
|
-
|
1203
|
+
|
1204
1204
|
@attr_methods[ali] = attr
|
1205
1205
|
end
|
1206
|
-
|
1206
|
+
|
1207
1207
|
end
|
1208
1208
|
|
1209
1209
|
# array_of
|
@@ -1211,7 +1211,7 @@ module ActiveLDAP
|
|
1211
1211
|
# Returns the array form of a value, or not an array if
|
1212
1212
|
# false is passed in.
|
1213
1213
|
def array_of(value, to_a = true)
|
1214
|
-
|
1214
|
+
|
1215
1215
|
if to_a
|
1216
1216
|
case value.class.to_s
|
1217
1217
|
when 'Array'
|
@@ -6,13 +6,13 @@ module ActiveLDAP
|
|
6
6
|
# ActiveLDAP to work with your LDAP server. All of these
|
7
7
|
# settings can be passed in at initialization time.
|
8
8
|
module Configuration
|
9
|
-
@@host = "
|
9
|
+
@@host = "127.0.0.1"
|
10
10
|
@@port = 389
|
11
|
-
@@bind_format = "uid=%s,ou=People,dc=
|
11
|
+
@@bind_format = "uid=%s,ou=People,dc=example,dc=com"
|
12
12
|
|
13
13
|
# Make the return value the string that is your LDAP base
|
14
14
|
def Base.base
|
15
|
-
'dc=
|
15
|
+
'dc=example,dc=com'
|
16
16
|
end
|
17
17
|
|
18
18
|
# This is optionally set to the array of objectClass names
|
data/lib/activeldap.rb
CHANGED
@@ -8,7 +8,7 @@
|
|
8
8
|
# Ruby/ActiveLDAP is a novel way of interacting with LDAP. Most interaction with
|
9
9
|
# LDAP is done using clunky LDIFs, web interfaces, or with painful APIs that
|
10
10
|
# required a thick reference manual nearby. Ruby/ActiveLDAP aims to fix that.
|
11
|
-
# Inspired by ActiveRecord[http://activerecord.rubyonrails.
|
11
|
+
# Inspired by ActiveRecord[http://activerecord.rubyonrails.com], Ruby/ActiveLDAP provides an
|
12
12
|
# object oriented interface to LDAP entries.
|
13
13
|
#
|
14
14
|
# The target audience is system administrators and LDAP users everywhere that
|
@@ -26,8 +26,8 @@
|
|
26
26
|
# against Microsoft's ActiveDirectory, despite what the name implies.)
|
27
27
|
#
|
28
28
|
# Further reading:
|
29
|
-
# * RFC1777[http://www.faqs.
|
30
|
-
# * OpenLDAP[http://www.openldap.
|
29
|
+
# * RFC1777[http://www.faqs.com/rfcs/rfc1777.html] - Lightweight Directory Access Protocol
|
30
|
+
# * OpenLDAP[http://www.openldap.com]
|
31
31
|
#
|
32
32
|
# === So why use Ruby/ActiveLDAP?
|
33
33
|
#
|
@@ -50,18 +50,18 @@
|
|
50
50
|
#
|
51
51
|
# === Requirements
|
52
52
|
#
|
53
|
-
# * Ruby[http://www.ruby-lang.
|
54
|
-
# * Ruby/LDAP[http://ruby-ldap.
|
55
|
-
# * Log4r[http://log4r.
|
56
|
-
# * (Optional) Ruby/LDAP+GSSAPI[http://caliban.
|
57
|
-
# * An LDAP server compatible with Ruby/LDAP: OpenLDAP[http://www.openldap.
|
53
|
+
# * Ruby[http://www.ruby-lang.com] 1.8.x
|
54
|
+
# * Ruby/LDAP[http://ruby-ldap.sourcefcome.net]
|
55
|
+
# * Log4r[http://log4r.sourcefcome.net]
|
56
|
+
# * (Optional) Ruby/LDAP+GSSAPI[http://caliban.com/files/redhat/RPMS/i386/ruby-ldap-0.8.2-4.i386.rpm]
|
57
|
+
# * An LDAP server compatible with Ruby/LDAP: OpenLDAP[http://www.openldap.com], etc
|
58
58
|
# - Your LDAP server must allow root_dse queries to allow for schema queries
|
59
|
-
# * Examples also require: Ruby/Password[http://raa.ruby-lang.
|
59
|
+
# * Examples also require: Ruby/Password[http://raa.ruby-lang.com/project/ruby-password/]
|
60
60
|
#
|
61
61
|
# === Installation
|
62
62
|
#
|
63
63
|
# Assuming all the requirements are installed, you can install by grabbing the latest tgz file from
|
64
|
-
# the download site[http://projects.
|
64
|
+
# the download site[http://projects.example.com/libraries/ruby/activeldap/download.html].
|
65
65
|
#
|
66
66
|
# The following steps will get the Ruby/ActiveLDAP installed in no time!
|
67
67
|
#
|
@@ -183,23 +183,23 @@
|
|
183
183
|
# As you can see, this method is used for defining how this class maps in to LDAP. Let's say that
|
184
184
|
# my LDAP tree looks something like this:
|
185
185
|
#
|
186
|
-
# * dc=
|
187
|
-
# |- ou=People,dc=
|
188
|
-
# |+ ou=Groups,dc=
|
186
|
+
# * dc=example,dc=com
|
187
|
+
# |- ou=People,dc=example,dc=com
|
188
|
+
# |+ ou=Groups,dc=example,dc=com
|
189
189
|
# \
|
190
|
-
# |- cn=develop,ou=Groups,dc=
|
191
|
-
# |- cn=root,ou=Groups,dc=
|
190
|
+
# |- cn=develop,ou=Groups,dc=example,dc=com
|
191
|
+
# |- cn=root,ou=Groups,dc=example,dc=com
|
192
192
|
# |- ...
|
193
193
|
#
|
194
194
|
# Under ou=People I store user objects, and under ou=Groups, I store group
|
195
195
|
# objects. What |ldap_mapping| has done is mapped the class in to the LDAP tree
|
196
196
|
# abstractly. With the given :dnattr and :prefix, it will only work for entries
|
197
|
-
# under ou=Groups,dc=
|
197
|
+
# under ou=Groups,dc=example,dc=com using the primary attribute 'cn' as the
|
198
198
|
# beginning of the distinguished name.
|
199
199
|
#
|
200
200
|
# Just for clarity, here's how the arguments map out:
|
201
201
|
#
|
202
|
-
# cn=develop,ou=Groups,dc=
|
202
|
+
# cn=develop,ou=Groups,dc=example,dc=com
|
203
203
|
# ^^ ^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^
|
204
204
|
# :dnattr | |
|
205
205
|
# :prefix |
|
@@ -233,11 +233,11 @@
|
|
233
233
|
# tying objects together across the LDAP tree. Often, user objects will be
|
234
234
|
# members of, or belong_to, Group objects.
|
235
235
|
#
|
236
|
-
# * dc=
|
237
|
-
# |+ ou=People,dc=
|
236
|
+
# * dc=example,dc=com
|
237
|
+
# |+ ou=People,dc=example,dc=com
|
238
238
|
# \
|
239
|
-
# |- uid=drewry,ou=People,dc=
|
240
|
-
# |- ou=Groups,dc=
|
239
|
+
# |- uid=drewry,ou=People,dc=example,dc=com
|
240
|
+
# |- ou=Groups,dc=example,dc=com
|
241
241
|
#
|
242
242
|
#
|
243
243
|
# In the above tree, one such example would be user 'drewry' who is a part of the
|
@@ -385,7 +385,7 @@
|
|
385
385
|
#
|
386
386
|
# irb> Base.search(:base => 'dc=example,dc=com', :filter => '(uid=roo*)',
|
387
387
|
# :scope => LDAP::LDAP_SCOPE_SUBTREE, :attrs => ['uid', 'cn'])
|
388
|
-
# => [{"dn"=>"uid=root,ou=People,dc=
|
388
|
+
# => [{"dn"=>"uid=root,ou=People,dc=example,dc=com","cn"=>["root"], "uidNumber"=>["0"]}]
|
389
389
|
# You can specify the :filter, :base, :scope, and :attrs, but they all have defaults --
|
390
390
|
# * :filter defaults to objectClass=* - usually this isn't what you want
|
391
391
|
# * :base defaults to the base of the class this is executed from (as set in ldap_mapping)
|
@@ -443,10 +443,10 @@
|
|
443
443
|
# won't need to call Base.connect. Here is a fully parameterized call:
|
444
444
|
#
|
445
445
|
# Base.connect(
|
446
|
-
# :host => 'ldap.
|
446
|
+
# :host => 'ldap.example.com',
|
447
447
|
# :port => 389,
|
448
|
-
# :base => 'dc=
|
449
|
-
# :bind_format => "uid=%s,ou=People,dc=
|
448
|
+
# :base => 'dc=example,dc=com',
|
449
|
+
# :bind_format => "uid=%s,ou=People,dc=example,dc=com",
|
450
450
|
# :logger => log4r_obj,
|
451
451
|
# :user => 'drewry',
|
452
452
|
# :password_block => Proc.new { 'password12345' },
|
@@ -907,7 +907,7 @@ require 'activeldap/configuration'
|
|
907
907
|
require 'activeldap/schema2'
|
908
908
|
|
909
909
|
module ActiveLDAP
|
910
|
-
VERSION = "0.5.
|
910
|
+
VERSION = "0.5.5"
|
911
911
|
end
|
912
912
|
|
913
913
|
ActiveLDAP::Base.class_eval do
|
metadata
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.8.
|
2
|
+
rubygems_version: 0.8.4
|
3
3
|
specification_version: 1
|
4
4
|
name: ruby-activeldap
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.5.
|
7
|
-
date: 2005-02-
|
6
|
+
version: 0.5.5
|
7
|
+
date: 2005-02-20
|
8
8
|
summary: Ruby/ActiveLDAP is a object-oriented API to LDAP
|
9
9
|
require_paths:
|
10
10
|
- lib
|
11
|
-
author: Will Drewry
|
12
11
|
email: will@alum.bu.edu
|
13
12
|
homepage: http://projects.dataspill.org/libraries/ruby/activeldap/index.html
|
14
13
|
rubyforge_project: ruby-activeldap
|
@@ -25,6 +24,8 @@ required_ruby_version: !ruby/object:Gem::Version::Requirement
|
|
25
24
|
version: 0.0.0
|
26
25
|
version:
|
27
26
|
platform: ruby
|
27
|
+
authors:
|
28
|
+
- Will Drewry
|
28
29
|
files:
|
29
30
|
- lib/activeldap
|
30
31
|
- lib/activeldap.rb
|