ruby-activeldap 0.4.1 → 0.4.2
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/activeldap.rb +26 -26
- data/lib/activeldap/base.rb +50 -3
- data/lib/activeldap/configuration.rb +2 -2
- data/lib/activeldap/schema2.rb +27 -4
- metadata +2 -2
data/lib/activeldap.rb
CHANGED
@@ -9,7 +9,7 @@
|
|
9
9
|
# Ruby/ActiveLDAP is a novel way of interacting with LDAP. Most interaction with
|
10
10
|
# LDAP is done using clunky LDIFs, web interfaces, or with painful APIs that
|
11
11
|
# required a thick reference manual nearby. Ruby/ActiveLDAP aims to fix that.
|
12
|
-
# Inspired by ActiveRecord[http://activerecord.rubyonrails.
|
12
|
+
# Inspired by ActiveRecord[http://activerecord.rubyonrails.org], Ruby/ActiveLDAP provides an
|
13
13
|
# object oriented interface to LDAP entries.
|
14
14
|
#
|
15
15
|
# The target audience is system administrators and LDAP users everywhere that
|
@@ -27,8 +27,8 @@
|
|
27
27
|
# against Microsoft's ActiveDirectory, despite what the name implies.)
|
28
28
|
#
|
29
29
|
# Further reading:
|
30
|
-
# * RFC1777[http://www.faqs.
|
31
|
-
# * OpenLDAP[http://www.openldap.
|
30
|
+
# * RFC1777[http://www.faqs.org/rfcs/rfc1777.html] - Lightweight Directory Access Protocol
|
31
|
+
# * OpenLDAP[http://www.openldap.org]
|
32
32
|
#
|
33
33
|
# === So why use Ruby/ActiveLDAP?
|
34
34
|
#
|
@@ -51,18 +51,18 @@
|
|
51
51
|
#
|
52
52
|
# === Requirements
|
53
53
|
#
|
54
|
-
# * Ruby[http://www.ruby-lang.
|
55
|
-
# * Ruby/LDAP[http://ruby-ldap.
|
56
|
-
# * Log4r[http://log4r.
|
57
|
-
# * (Optional) Ruby/LDAP+GSSAPI[http://caliban.
|
58
|
-
# * An LDAP server compatible with Ruby/LDAP: OpenLDAP[http://www.openldap.
|
54
|
+
# * Ruby[http://www.ruby-lang.org] 1.8.x
|
55
|
+
# * Ruby/LDAP[http://ruby-ldap.sourceforge.net]
|
56
|
+
# * Log4r[http://log4r.sourceforge.net]
|
57
|
+
# * (Optional) Ruby/LDAP+GSSAPI[http://caliban.org/files/redhat/RPMS/i386/ruby-ldap-0.8.2-4.i386.rpm]
|
58
|
+
# * An LDAP server compatible with Ruby/LDAP: OpenLDAP[http://www.openldap.org], etc
|
59
59
|
# - Your LDAP server must allow root_dse queries to allow for schema queries
|
60
|
-
# * Examples also require: Ruby/Password[http://raa.ruby-lang.
|
60
|
+
# * Examples also require: Ruby/Password[http://raa.ruby-lang.org/project/ruby-password/]
|
61
61
|
#
|
62
62
|
# === Installation
|
63
63
|
#
|
64
64
|
# Assuming all the requirements are installed, you can install by grabbing the latest tgz file from
|
65
|
-
# the download site[http://projects.
|
65
|
+
# the download site[http://projects.dataspill.org/libraries/ruby/activeldap/download.html].
|
66
66
|
#
|
67
67
|
# The following steps will get the Ruby/ActiveLDAP installed in no time!
|
68
68
|
#
|
@@ -184,23 +184,23 @@
|
|
184
184
|
# As you can see, this method is used for defining how this class maps in to LDAP. Let's say that
|
185
185
|
# my LDAP tree looks something like this:
|
186
186
|
#
|
187
|
-
# * dc=
|
188
|
-
# |- ou=People,dc=
|
189
|
-
# |+ ou=Groups,dc=
|
187
|
+
# * dc=dataspill,dc=org
|
188
|
+
# |- ou=People,dc=dataspill,dc=org
|
189
|
+
# |+ ou=Groups,dc=dataspill,dc=org
|
190
190
|
# \
|
191
|
-
# |- cn=develop,ou=Groups,dc=
|
192
|
-
# |- cn=root,ou=Groups,dc=
|
191
|
+
# |- cn=develop,ou=Groups,dc=dataspill,dc=org
|
192
|
+
# |- cn=root,ou=Groups,dc=dataspill,dc=org
|
193
193
|
# |- ...
|
194
194
|
#
|
195
195
|
# Under ou=People I store user objects, and under ou=Groups, I store group
|
196
196
|
# objects. What |ldap_mapping| has done is mapped the class in to the LDAP tree
|
197
197
|
# abstractly. With the given :dnattr and :prefix, it will only work for entries
|
198
|
-
# under ou=Groups,dc=
|
198
|
+
# under ou=Groups,dc=dataspill,dc=org using the primary attribute 'cn' as the
|
199
199
|
# beginning of the distinguished name.
|
200
200
|
#
|
201
201
|
# Just for clarity, here's how the arguments map out:
|
202
202
|
#
|
203
|
-
# cn=develop,ou=Groups,dc=
|
203
|
+
# cn=develop,ou=Groups,dc=dataspill,dc=org
|
204
204
|
# ^^ ^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^
|
205
205
|
# :dnattr | |
|
206
206
|
# :prefix |
|
@@ -228,11 +228,11 @@
|
|
228
228
|
# tying objects together across the LDAP tree. Often, user objects will be
|
229
229
|
# members of, or belong_to, Group objects.
|
230
230
|
#
|
231
|
-
# * dc=
|
232
|
-
# |+ ou=People,dc=
|
231
|
+
# * dc=dataspill,dc=org
|
232
|
+
# |+ ou=People,dc=dataspill,dc=org
|
233
233
|
# \
|
234
|
-
# |- uid=drewry,ou=People,dc=
|
235
|
-
# |- ou=Groups,dc=
|
234
|
+
# |- uid=drewry,ou=People,dc=dataspill,dc=org
|
235
|
+
# |- ou=Groups,dc=dataspill,dc=org
|
236
236
|
#
|
237
237
|
#
|
238
238
|
# In the above tree, one such example would be user 'drewry' who is a part of the
|
@@ -382,7 +382,7 @@
|
|
382
382
|
#
|
383
383
|
# irb> Base.search(:base => 'dc=example,dc=com', :filter => '(uid=roo*)',
|
384
384
|
# :scope => LDAP::LDAP_SCOPE_SUBTREE, :attrs => ['uid', 'cn'])
|
385
|
-
# => [{"dn"=>"uid=root,ou=People,dc=
|
385
|
+
# => [{"dn"=>"uid=root,ou=People,dc=dataspill,dc=org","cn"=>["root"], "uidNumber"=>["0"]}]
|
386
386
|
# You can specify the :filter, :base, :scope, and :attrs, but they all have defaults --
|
387
387
|
# * :filter defaults to objectClass=* - usually this isn't what you want
|
388
388
|
# * :base defaults to the base of the class this is executed from (as set in ldap_mapping)
|
@@ -438,10 +438,10 @@
|
|
438
438
|
# won't need to call Base.connect. Here is a fully parameterized call:
|
439
439
|
#
|
440
440
|
# Base.connect(
|
441
|
-
# :host => 'ldap.
|
441
|
+
# :host => 'ldap.dataspill.org',
|
442
442
|
# :port => 389,
|
443
|
-
# :base => 'dc=
|
444
|
-
# :bind_format => "uid=%s,ou=People,dc=
|
443
|
+
# :base => 'dc=dataspill,dc=org',
|
444
|
+
# :bind_format => "uid=%s,ou=People,dc=dataspill,dc=org",
|
445
445
|
# :logger => log4r_obj,
|
446
446
|
# :user => 'drewry',
|
447
447
|
# :password_block => Proc.new { 'password12345' },
|
@@ -880,7 +880,7 @@ require 'activeldap/configuration'
|
|
880
880
|
require 'activeldap/schema2'
|
881
881
|
|
882
882
|
module ActiveLDAP
|
883
|
-
VERSION = "0.4.
|
883
|
+
VERSION = "0.4.2"
|
884
884
|
end
|
885
885
|
|
886
886
|
ActiveLDAP::Base.class_eval do
|
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 organization 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.
|
@@ -161,7 +161,7 @@ module ActiveLDAP
|
|
161
161
|
# +config+ must be a hash that may contain any of the following fields:
|
162
162
|
# :user, :password_block, :logger, :host, :port, :base, :bind_format, :try_sasl, :allow_anonymous
|
163
163
|
# :user specifies the username to bind with.
|
164
|
-
# :bind_format specifies the string to substitute the username into on bind. e.g. uid=%s,ou=People,dc=
|
164
|
+
# :bind_format specifies the string to substitute the username into on bind. e.g. uid=%s,ou=People,dc=dataspill,dc=org. Overrides @@bind_format.
|
165
165
|
# :password_block specifies a Proc object that will yield a String to be used as the password when called.
|
166
166
|
# :logger specifies a preconfigured Log4r::Logger to be used for all logging
|
167
167
|
# :host overrides the configuration.rb @@host setting with the LDAP server hostname
|
@@ -466,6 +466,7 @@ module ActiveLDAP
|
|
466
466
|
# If multiple values exist for dnattr, the first one put here will be authoritative
|
467
467
|
# TODO: Add support for relative distinguished names
|
468
468
|
def initialize(val='')
|
469
|
+
@@logger.debug("stub: initialize(#{val.inspect}) called")
|
469
470
|
if val.class != String
|
470
471
|
raise TypeError, "Object key must be a String"
|
471
472
|
end
|
@@ -510,9 +511,12 @@ module ActiveLDAP
|
|
510
511
|
# Save DN
|
511
512
|
@dn = m.dn
|
512
513
|
# Load up data into tmp
|
514
|
+
@@logger.debug("loading entry: #{@dn}")
|
513
515
|
m.attrs.each do |attr|
|
514
516
|
# Load with subtypes just like @data
|
517
|
+
@@logger.debug("calling make_subtypes for m.vals(attr).dup")
|
515
518
|
safe_attr, value = make_subtypes(attr, m.vals(attr).dup)
|
519
|
+
@@logger.debug("finished make_subtypes for #{attr}")
|
516
520
|
@ldap_data[safe_attr] = value
|
517
521
|
end
|
518
522
|
end
|
@@ -546,6 +550,7 @@ module ActiveLDAP
|
|
546
550
|
# Return attribute methods so that a program can determine available
|
547
551
|
# attributes dynamically without schema awareness
|
548
552
|
def attributes
|
553
|
+
@@logger.debug("stub: attributes called")
|
549
554
|
return @attr_methods.keys
|
550
555
|
end
|
551
556
|
|
@@ -557,6 +562,7 @@ module ActiveLDAP
|
|
557
562
|
# removing defined attributes that are no longer valid
|
558
563
|
# given the new objectclasses.
|
559
564
|
def objectClass=(val)
|
565
|
+
@@logger.debug("stub: objectClass=(#{val.inspect}) called")
|
560
566
|
if val.class != Array
|
561
567
|
raise TypeError, 'objectClass must be an Array'
|
562
568
|
end
|
@@ -622,6 +628,7 @@ module ActiveLDAP
|
|
622
628
|
#
|
623
629
|
# Return whether the entry exists in LDAP or not
|
624
630
|
def exists?
|
631
|
+
@@logger.debug("stub: exists? called")
|
625
632
|
return @exists
|
626
633
|
end
|
627
634
|
|
@@ -629,6 +636,7 @@ module ActiveLDAP
|
|
629
636
|
#
|
630
637
|
# Return the authoritative dn
|
631
638
|
def dn
|
639
|
+
@@logger.debug("stub: dn called")
|
632
640
|
return @dn.dup
|
633
641
|
end
|
634
642
|
|
@@ -638,6 +646,7 @@ module ActiveLDAP
|
|
638
646
|
# - Verify that every 'MUST' specified in the schema has a value defined
|
639
647
|
# - Enforcement of undefined attributes is handled in the objectClass= method
|
640
648
|
def validate
|
649
|
+
@@logger.debug("stub: validate called")
|
641
650
|
@must.each do |oc|
|
642
651
|
oc[1].each do |req_attr|
|
643
652
|
# TODO: should I ever check if key exists? bug if it doesnt...
|
@@ -648,6 +657,7 @@ module ActiveLDAP
|
|
648
657
|
end
|
649
658
|
end
|
650
659
|
end
|
660
|
+
@@logger.debug("stub: validate finished")
|
651
661
|
end
|
652
662
|
|
653
663
|
|
@@ -655,6 +665,7 @@ module ActiveLDAP
|
|
655
665
|
#
|
656
666
|
# Delete this entry from LDAP
|
657
667
|
def delete
|
668
|
+
@@logger.debug("stub: delete called")
|
658
669
|
begin
|
659
670
|
@@conn.delete(@dn)
|
660
671
|
@exists = false
|
@@ -671,6 +682,7 @@ module ActiveLDAP
|
|
671
682
|
# TODO: Binary data support
|
672
683
|
# TODO: Relative DN support
|
673
684
|
def write
|
685
|
+
@@logger.debug("stub: write called")
|
674
686
|
# Validate against the objectClass requirements
|
675
687
|
validate
|
676
688
|
|
@@ -686,7 +698,10 @@ module ActiveLDAP
|
|
686
698
|
# Expand subtypes to real ldap_data entries
|
687
699
|
# We can't reuse @ldap_data because an exception would leave
|
688
700
|
# an object in an unknown state
|
701
|
+
@@logger.debug("#write: dup'ing @ldap_data")
|
689
702
|
ldap_data = @ldap_data.dup
|
703
|
+
@@logger.debug("#write: dup finished @ldap_data")
|
704
|
+
@@logger.debug("#write: expanding subtypes in @ldap_data")
|
690
705
|
ldap_data.keys.each do |key|
|
691
706
|
ldap_data[key].each do |value|
|
692
707
|
if value.class == Hash
|
@@ -700,9 +715,13 @@ module ActiveLDAP
|
|
700
715
|
end
|
701
716
|
end
|
702
717
|
end
|
718
|
+
@@logger.debug("#write: subtypes expanded for @ldap_data")
|
703
719
|
|
704
720
|
# Expand subtypes to real data entries, but leave @data alone
|
721
|
+
@@logger.debug("#write: dup'ing @data")
|
705
722
|
data = @data.dup
|
723
|
+
@@logger.debug("#write: finished dup'ing @data")
|
724
|
+
@@logger.debug("#write: expanding subtypes for @data")
|
706
725
|
data.keys.each do |key|
|
707
726
|
data[key].each do |value|
|
708
727
|
if value.class == Hash
|
@@ -716,10 +735,12 @@ module ActiveLDAP
|
|
716
735
|
end
|
717
736
|
end
|
718
737
|
end
|
738
|
+
@@logger.debug("#write: subtypes expanded for @data")
|
719
739
|
|
720
740
|
# Now that all the subtypes will be treated as unique attributes
|
721
741
|
# we can see what's changed and add anything that is brand-spankin'
|
722
742
|
# new.
|
743
|
+
@@logger.debug("#write: traversing ldap_data determining replaces and deletes")
|
723
744
|
ldap_data.each do |pair|
|
724
745
|
suffix = ''
|
725
746
|
binary = 0
|
@@ -749,6 +770,8 @@ module ActiveLDAP
|
|
749
770
|
end
|
750
771
|
end
|
751
772
|
end
|
773
|
+
@@logger.debug("#write: finished traversing ldap_data")
|
774
|
+
@@logger.debug("#write: traversing data determining adds")
|
752
775
|
data.each do |pair|
|
753
776
|
suffix = ''
|
754
777
|
binary = 0
|
@@ -766,14 +789,20 @@ module ActiveLDAP
|
|
766
789
|
entry.push(LDAP.mod(LDAP::LDAP_MOD_ADD|binary, name + suffix, value)) unless value.empty?
|
767
790
|
end
|
768
791
|
end
|
792
|
+
@@logger.debug("#write: traversing data complete")
|
769
793
|
begin
|
794
|
+
@@logger.debug("#write: modifying #{@dn}")
|
770
795
|
@@conn.modify(@dn, entry)
|
796
|
+
@@logger.debug("#write: modify successful")
|
771
797
|
rescue => detail
|
772
798
|
raise WriteError, "Could not update LDAP entry: #{detail}"
|
773
799
|
end
|
774
800
|
else # add everything!
|
801
|
+
@@logger.debug("#write: adding all attribute value pairs")
|
802
|
+
@@logger.debug("#write: adding #{@attr_methods[dnattr()].inspect} = #{data[@attr_methods[dnattr()]].inspect}")
|
775
803
|
entry.push(LDAP.mod(LDAP::LDAP_MOD_ADD, @attr_methods[dnattr()],
|
776
804
|
data[@attr_methods[dnattr()]]))
|
805
|
+
@@logger.debug("#write: adding objectClass = #{data[@attr_methods['objectClass']].inspect}")
|
777
806
|
entry.push(LDAP.mod(LDAP::LDAP_MOD_ADD, 'objectClass',
|
778
807
|
data[@attr_methods['objectClass']]))
|
779
808
|
@data.each do |pair|
|
@@ -785,13 +814,18 @@ module ActiveLDAP
|
|
785
814
|
end
|
786
815
|
end
|
787
816
|
begin
|
817
|
+
@@logger.debug("#write: adding #{@dn}")
|
788
818
|
@@conn.add(@dn, entry)
|
819
|
+
@@logger.debug("#write: add successful")
|
789
820
|
@exists = true
|
790
821
|
rescue LDAP::ResultError => detail
|
791
822
|
raise WriteError, "Could not add LDAP entry: #{detail}"
|
792
823
|
end
|
793
824
|
end
|
825
|
+
@@logger.debug("#write: resetting @ldap_data to a dup of @data")
|
794
826
|
@ldap_data = @data.dup
|
827
|
+
@@logger.debug("#write: @ldap_data reset complete")
|
828
|
+
@@logger.debug("stub: write exitted")
|
795
829
|
end
|
796
830
|
|
797
831
|
|
@@ -803,6 +837,7 @@ module ActiveLDAP
|
|
803
837
|
# using class_eval instead of using method_missing. This would
|
804
838
|
# give tab completion in irb.
|
805
839
|
def method_missing(name, *args)
|
840
|
+
@@logger.debug("stub: called method_missing(#{name.inspect}, #{args.inspect})")
|
806
841
|
key = name.to_s
|
807
842
|
case key
|
808
843
|
when /^(\S+)=$/
|
@@ -827,6 +862,7 @@ module ActiveLDAP
|
|
827
862
|
# Hashes are for subtypes
|
828
863
|
# Arrays are for multiple entries
|
829
864
|
def attribute_input_handler(attr, value)
|
865
|
+
@@logger.debug("stub: called attribute_input_handler(#{attr.inspect}, #{value.inspect})")
|
830
866
|
if attr.nil?
|
831
867
|
raise RuntimeError, 'attr argument must not be nil.'
|
832
868
|
end
|
@@ -871,6 +907,7 @@ module ActiveLDAP
|
|
871
907
|
# e.g. userCertificate;binary => "some_bin"
|
872
908
|
# becomes userCertificate => {"binary" => "some_bin"}
|
873
909
|
def make_subtypes(attr, value)
|
910
|
+
@@logger.debug("stub: called make_subtypes(#{attr.inspect}, #{value.inspect})")
|
874
911
|
return [attr, value] unless attr.match(/;/)
|
875
912
|
|
876
913
|
ret_attr, *subtypes = attr.split(/;/)
|
@@ -882,6 +919,7 @@ module ActiveLDAP
|
|
882
919
|
# This is a recursive function for building
|
883
920
|
# nested hashed from multi-subtyped values
|
884
921
|
def make_subtypes_helper(subtypes, value)
|
922
|
+
@@logger.debug("stub: called make_subtypes_helper(#{subtypes.inspect}, #{value.inspect})")
|
885
923
|
return value if subtypes.size == 0
|
886
924
|
return {subtypes[0] => make_subtypes_helper(subtypes[1..-1], value)}
|
887
925
|
end
|
@@ -891,6 +929,7 @@ module ActiveLDAP
|
|
891
929
|
# Extracts all of the subtypes from a given set of nested hashes
|
892
930
|
# and returns the attribute suffix and the final true value
|
893
931
|
def extract_subtypes(value)
|
932
|
+
@@logger.debug("stub: called extract_subtypes(#{value.inspect})")
|
894
933
|
subtype = ''
|
895
934
|
ret_val = value
|
896
935
|
if value.class == Hash
|
@@ -969,7 +1008,7 @@ module ActiveLDAP
|
|
969
1008
|
mechanisms = @@conn.root_dse[0]['supportedSASLMechanisms']
|
970
1009
|
# Use GSSAPI if available
|
971
1010
|
# Currently only GSSAPI is supported with Ruby/LDAP from
|
972
|
-
# http://caliban.
|
1011
|
+
# http://caliban.org/files/redhat/RPMS/i386/ruby-ldap-0.8.2-4.i386.rpm
|
973
1012
|
# TODO: Investigate further SASL support
|
974
1013
|
if mechanisms.respond_to? :member? and mechanisms.member? 'GSSAPI'
|
975
1014
|
begin
|
@@ -989,6 +1028,7 @@ module ActiveLDAP
|
|
989
1028
|
# Returns the value of self.class.base
|
990
1029
|
# This is just syntactic sugar
|
991
1030
|
def base
|
1031
|
+
@@logger.debug("stub: called base")
|
992
1032
|
self.class.base
|
993
1033
|
end
|
994
1034
|
|
@@ -997,6 +1037,7 @@ module ActiveLDAP
|
|
997
1037
|
# Returns the value of self.class.required_classes
|
998
1038
|
# This is just syntactic sugar
|
999
1039
|
def required_classes
|
1040
|
+
@@logger.debug("stub: called required_classes")
|
1000
1041
|
self.class.required_classes
|
1001
1042
|
end
|
1002
1043
|
|
@@ -1005,6 +1046,7 @@ module ActiveLDAP
|
|
1005
1046
|
# Returns the value of self.class.dnattr
|
1006
1047
|
# This is just syntactic sugar
|
1007
1048
|
def dnattr
|
1049
|
+
@@logger.debug("stub: called dnattr")
|
1008
1050
|
self.class.dnattr
|
1009
1051
|
end
|
1010
1052
|
|
@@ -1012,6 +1054,7 @@ module ActiveLDAP
|
|
1012
1054
|
#
|
1013
1055
|
# Return the value of the attribute called by method_missing?
|
1014
1056
|
def attribute_method(method, arrays = false)
|
1057
|
+
@@logger.debug("stub: called attribute_method(#{method.inspect}, #{arrays.inspect}")
|
1015
1058
|
attr = @attr_methods[method]
|
1016
1059
|
|
1017
1060
|
# Return a copy of the stored data
|
@@ -1024,6 +1067,7 @@ module ActiveLDAP
|
|
1024
1067
|
#
|
1025
1068
|
# Set the value of the attribute called by method_missing?
|
1026
1069
|
def attribute_method=(method, arg)
|
1070
|
+
@@logger.debug("stub: called attribute_method=(#{method.inspect}, #{arg.inspect}")
|
1027
1071
|
# Copy input
|
1028
1072
|
begin
|
1029
1073
|
value = arg.dup
|
@@ -1039,6 +1083,7 @@ module ActiveLDAP
|
|
1039
1083
|
@data[attr] = value
|
1040
1084
|
|
1041
1085
|
# Return a copy of what got saved
|
1086
|
+
@@logger.debug("stub: exitting attribute_method=")
|
1042
1087
|
return @data[attr].dup
|
1043
1088
|
end
|
1044
1089
|
|
@@ -1048,6 +1093,7 @@ module ActiveLDAP
|
|
1048
1093
|
# Make a method entry for _every_ alias of a valid attribute and map it
|
1049
1094
|
# onto the first attribute passed in.
|
1050
1095
|
def define_attribute_methods(attr)
|
1096
|
+
@@logger.debug("stub: called define_attribute_methods(#{attr.inspect})")
|
1051
1097
|
if @attr_methods.has_key? attr
|
1052
1098
|
return
|
1053
1099
|
end
|
@@ -1062,6 +1108,7 @@ module ActiveLDAP
|
|
1062
1108
|
# Returns the array form of a value, or not an array if
|
1063
1109
|
# false is passed in.
|
1064
1110
|
def array_of(value, to_a = true)
|
1111
|
+
@@logger.debug("stub: called array_of(#{value.inspect}, #{to_a.inspect})")
|
1065
1112
|
if to_a
|
1066
1113
|
case value.class.to_s
|
1067
1114
|
when 'Array'
|
@@ -8,11 +8,11 @@ module ActiveLDAP
|
|
8
8
|
module Configuration
|
9
9
|
@@host = "localhost"
|
10
10
|
@@port = 389
|
11
|
-
@@bind_format = "uid=%s,ou=People,dc=
|
11
|
+
@@bind_format = "uid=%s,ou=People,dc=dataspill,dc=org"
|
12
12
|
|
13
13
|
# Make the return value the string that is your LDAP base
|
14
14
|
def Base.base
|
15
|
-
'dc=
|
15
|
+
'dc=dataspill,dc=org'
|
16
16
|
end
|
17
17
|
|
18
18
|
# This is optionally set to the array of objectClass names
|
data/lib/activeldap/schema2.rb
CHANGED
@@ -3,6 +3,7 @@ require 'ldap/schema'
|
|
3
3
|
|
4
4
|
module LDAP
|
5
5
|
class Schema2 < Schema
|
6
|
+
@@cache = {}
|
6
7
|
|
7
8
|
# attr
|
8
9
|
#
|
@@ -16,13 +17,29 @@ module LDAP
|
|
16
17
|
return '' if type.empty?
|
17
18
|
return '' if at.empty?
|
18
19
|
|
20
|
+
# Check already parsed options first
|
21
|
+
if @@cache.has_key? sub \
|
22
|
+
and @@cache[sub].has_key? type \
|
23
|
+
and @@cache[sub][type].has_key? at
|
24
|
+
return @@cache[sub][type][at].dup
|
25
|
+
end
|
26
|
+
|
27
|
+
# Initialize anything that is required
|
28
|
+
unless @@cache.has_key? sub
|
29
|
+
@@cache[sub] = {}
|
30
|
+
end
|
31
|
+
|
32
|
+
unless @@cache[sub].has_key? type
|
33
|
+
@@cache[sub][type] = {}
|
34
|
+
end
|
35
|
+
|
19
36
|
at = at.upcase
|
20
37
|
self[sub].each do |s|
|
21
38
|
line = ''
|
22
39
|
if type[0..0] =~ /[0-9]/
|
23
|
-
line = s if s =~ /\(\s+#{type}\s+([A-Z]|\))/
|
40
|
+
line = s if s =~ /\(\s+#{type}\s+(?:[A-Z]|\))/
|
24
41
|
else
|
25
|
-
line = s if s =~ /NAME\s+\(?.*'#{type}'.*\)?\s+([A-Z]|\))/
|
42
|
+
line = s if s =~ /NAME\s+\(?.*'#{type}'.*\)?\s+(?:[A-Z]|\))/
|
26
43
|
end
|
27
44
|
|
28
45
|
# I need to check, but I think some of these matchs
|
@@ -30,25 +47,31 @@ module LDAP
|
|
30
47
|
multi = ''
|
31
48
|
case line
|
32
49
|
when /#{at}\s+[\)A-Z]/
|
50
|
+
@@cache[sub][type][at] = ['TRUE']
|
33
51
|
return ['TRUE']
|
34
52
|
when /#{at}\s+'(.+?)'/
|
53
|
+
@@cache[sub][type][at] = [$1]
|
35
54
|
return [$1]
|
36
55
|
when /#{at}\s+\((.+?)\)/
|
37
56
|
multi = $1
|
38
57
|
when /#{at}\s+\(([\w\d\s\.]+)\)/
|
39
58
|
multi = $1
|
40
59
|
when /#{at}\s+([\w\d\.]+)/
|
60
|
+
@@cache[sub][type][at] = [$1]
|
41
61
|
return [$1]
|
42
62
|
end
|
43
63
|
# Split up multiple matches
|
44
64
|
# if oc then it is sep'd by $
|
45
65
|
# if attr then bu spaces
|
46
66
|
if multi.match(/\$/)
|
47
|
-
|
67
|
+
@@cache[sub][type][at] = multi.split("$").collect{|attr| attr.strip}
|
68
|
+
return @@cache[sub][type][at].dup
|
48
69
|
elsif not multi.empty?
|
49
|
-
|
70
|
+
@@cache[sub][type][at] = multi.gsub(/'/, '').split(' ').collect{|attr| attr.strip}
|
71
|
+
return @@cache[sub][type][at].dup
|
50
72
|
end
|
51
73
|
end
|
74
|
+
@@cache[sub][type][at] = []
|
52
75
|
return []
|
53
76
|
end
|
54
77
|
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.1
|
|
3
3
|
specification_version: 1
|
4
4
|
name: ruby-activeldap
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.4.
|
7
|
-
date: 2004-10-
|
6
|
+
version: 0.4.2
|
7
|
+
date: 2004-10-07
|
8
8
|
summary: Ruby/ActiveLDAP is a object-oriented API to LDAP
|
9
9
|
require_paths:
|
10
10
|
- lib
|