ruby-activeldap 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/activeldap/associations.rb +122 -0
- data/lib/activeldap/base.rb +1094 -0
- data/lib/activeldap/configuration.rb +25 -0
- data/lib/activeldap/schema2.rb +141 -0
- data/lib/activeldap.rb +889 -0
- metadata +53 -0
@@ -0,0 +1,122 @@
|
|
1
|
+
|
2
|
+
module ActiveLDAP
|
3
|
+
# Associations
|
4
|
+
#
|
5
|
+
# Associations provides the class methods needed for
|
6
|
+
# the extension classes to create methods using
|
7
|
+
# belongs_to and has_many
|
8
|
+
module Associations
|
9
|
+
def self.append_features(base)
|
10
|
+
super
|
11
|
+
base.extend(ClassMethods)
|
12
|
+
end
|
13
|
+
module ClassMethods
|
14
|
+
# This class function is used to setup all mappings between the subclass
|
15
|
+
# and ldap for use in activeldap
|
16
|
+
def ldap_mapping(options = {})
|
17
|
+
# The immediate ancestor should be the caller....
|
18
|
+
klass = self.ancestors[0]
|
19
|
+
|
20
|
+
dnattr = options[:dnattr] || 'cn'
|
21
|
+
prefix = options[:prefix] || "ou=#{klass.to_s.split(':').last}"
|
22
|
+
classes_array = options[:classes] || ['top']
|
23
|
+
|
24
|
+
raise TypeError, ":classes must be an array" \
|
25
|
+
unless classes_array.respond_to? :size
|
26
|
+
# Build classes array
|
27
|
+
classes = '['
|
28
|
+
classes_array.map! {|x| x = "'#{x}'"}
|
29
|
+
classes << classes_array.join(', ')
|
30
|
+
classes << ']'
|
31
|
+
|
32
|
+
# This adds the methods to the local
|
33
|
+
# class which can then be inherited, etc
|
34
|
+
# which describe the mapping to LDAP.
|
35
|
+
klass.class_eval <<-"end_eval"
|
36
|
+
class << #{klass}
|
37
|
+
# Return the list of required object classes
|
38
|
+
def required_classes
|
39
|
+
#{classes}
|
40
|
+
end
|
41
|
+
|
42
|
+
# Return the full base of the class
|
43
|
+
def base
|
44
|
+
"#{prefix},\#{super}"
|
45
|
+
end
|
46
|
+
|
47
|
+
# Return the expected DN attribute of an object
|
48
|
+
def dnattr
|
49
|
+
'#{dnattr}'
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
# Hide connect
|
54
|
+
private_class_method :connect
|
55
|
+
|
56
|
+
# Unhide class methods
|
57
|
+
public_class_method :find_all
|
58
|
+
public_class_method :find
|
59
|
+
public_class_method :new
|
60
|
+
public_class_method :dnattr
|
61
|
+
end_eval
|
62
|
+
end
|
63
|
+
|
64
|
+
# belongs_to
|
65
|
+
#
|
66
|
+
# This defines a method for an extension class map its DN key
|
67
|
+
# attribute value on to multiple items which reference it by
|
68
|
+
# |:foreign_key| in the other LDAP entry covered by class |:class_name|.
|
69
|
+
#
|
70
|
+
# Example:
|
71
|
+
# belongs_to :groups, :class_name => Group, :foreign_key => memberUid, :local_key => 'uid'
|
72
|
+
#
|
73
|
+
def belongs_to(association_id, options = {})
|
74
|
+
klass = options[:class_name] || association_id.to_s
|
75
|
+
key = options[:foreign_key] || association_id.to_s + "_id"
|
76
|
+
local_key = options[:local_key] || ''
|
77
|
+
class_eval <<-"end_eval"
|
78
|
+
def #{association_id}(objects = false)
|
79
|
+
local_key = "#{local_key}"
|
80
|
+
local_key = dnattr() if local_key.empty?
|
81
|
+
return #{klass}.find_all(:attribute => "#{key}", :value => attribute_method(local_key), :objects => objects)
|
82
|
+
end
|
83
|
+
end_eval
|
84
|
+
end
|
85
|
+
|
86
|
+
|
87
|
+
# has_many
|
88
|
+
#
|
89
|
+
# This defines a method for an extension class expand an
|
90
|
+
# existing multi-element attribute into ActiveLDAP objects.
|
91
|
+
# This discards any calls which result in entries that
|
92
|
+
# don't exist in LDAP!
|
93
|
+
#
|
94
|
+
# Example:
|
95
|
+
# has_many :members, :class_name => User, :local_key => memberUid, :foreign_key => 'uid'
|
96
|
+
#
|
97
|
+
# TODO[ENH]: def #{...}=(val) to redefine group membership
|
98
|
+
def has_many(association_id, options = {})
|
99
|
+
klass = options[:class_name] || association_id.to_s
|
100
|
+
key = options[:local_key] || association_id.to_s + "_id"
|
101
|
+
foreign_key = options[:foreign_key] || ''
|
102
|
+
class_eval <<-"end_eval"
|
103
|
+
def #{association_id}(objects = false)
|
104
|
+
foreign_key = "#{foreign_key}"
|
105
|
+
if foreign_key.empty?
|
106
|
+
foreign_key = dnattr()
|
107
|
+
end
|
108
|
+
results = []
|
109
|
+
@data["#{key}"].each do |item|
|
110
|
+
# This will even yield entries that don't necessarily exist
|
111
|
+
#{klass}.find_all(:attribute => foreign_key, :value => item, :objects => objects).each do |match|
|
112
|
+
results << match
|
113
|
+
end
|
114
|
+
end
|
115
|
+
return results
|
116
|
+
end
|
117
|
+
end_eval
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|