Revision 66e78c7a
Added by Marc Dequènes over 13 years ago
- ID 66e78c7acebee5c95dc56e1cba5c159426581743
lib/ldap_shadows/elements.rb | ||
---|---|---|
def ldap_virtual_attr(attr, syntax, single_value = false, binary = false)
|
||
@virtual_attributes ||= {}
|
||
@virtual_attributes[attr.to_s] = {
|
||
:syntax => syntax,
|
||
:single_value => single_value,
|
||
:binary => binary
|
||
:syntax => syntax,
|
||
:single_value => single_value,
|
||
:binary => binary,
|
||
:operational => false
|
||
}
|
||
end
|
||
|
||
... | ... | |
return if attr_info.nil?
|
||
|
||
{
|
||
:syntax => attr_info.syntax.to_param,
|
||
:single_value => attr_info.single_value?,
|
||
:read_only => attr_info.read_only?,
|
||
:binary => attr_info.binary?
|
||
:syntax => attr_info.syntax.to_param,
|
||
:single_value => attr_info.single_value?,
|
||
:read_only => attr_info.read_only?,
|
||
:binary => attr_info.binary?,
|
||
:operational => attr_info.directory_operation?
|
||
}
|
||
end
|
||
|
lib/ldap_shadows/elements/object.rb | ||
---|---|---|
|
||
def human_name
|
||
attr_list = ['displayName', 'cn']
|
||
name_attribute = self.class.parameters[:presentation][:name_attribute]
|
||
name_attribute = self.class.parameters[:interface][:name_attribute]
|
||
attr_list.unshift(name_attribute) unless name_attribute.nil?
|
||
attr_list.each do |attr|
|
||
if attr == 'dn'
|
||
... | ... | |
|
||
def human_description
|
||
attr_list = ['description']
|
||
desc_attribute = self.class.parameters[:presentation][:desc_attribute]
|
||
desc_attribute = self.class.parameters[:interface][:desc_attribute]
|
||
attr_list.unshift(desc_attribute) unless desc_attribute.nil?
|
||
attr_list.each do |attr|
|
||
if self.attribute_present?(attr)
|
||
... | ... | |
end
|
||
|
||
def organized_data
|
||
# merge ignored and expert attributes for object and all present aspects
|
||
ignored_attrs = self.class.shadow.get_config[:presentation][:hidden_attributes]
|
||
ignored_attrs += self.class.parameters[:presentation][:hidden_attributes]
|
||
expert_attributes = self.class.parameters[:presentation][:expert_attributes]
|
||
self.aspects.values.each do |aspect|
|
||
aspect_data = aspect.parameters
|
||
ignored_attrs += aspect_data[:presentation][:hidden_attributes]
|
||
expert_attributes += aspect_data[:presentation][:expert_attributes]
|
||
end
|
||
|
||
attr_list = self.nonempty_attributes - ignored_attrs
|
||
|
||
admin_attributes = attr_list.select do |attr|
|
||
ActiveLdap::Base.schema.attribute(attr).directory_operation?
|
||
end
|
||
|
||
attr_list = self.nonempty_attributes
|
||
rel_list = self.possible_relations
|
||
|
||
# first pass to take aspects forced relations into account
|
||
obj_aspects = {}
|
||
self.aspects.values.each do |aspect|
|
||
aspect_data = aspect.parameters
|
||
aspect_mapping = aspect.parameters[:mapping]
|
||
|
||
unless aspect_data[:mapping][:associated_attributes].empty?
|
||
taken_attr_list = aspect_data[:mapping][:associated_attributes] & (attr_list + ignored_attrs)
|
||
unless aspect_mapping[:associated_attributes].empty?
|
||
taken_attr_list = aspect_mapping[:associated_attributes] & attr_list
|
||
unless taken_attr_list.empty?
|
||
attrs_data = taken_attr_list.collect do |attr|
|
||
[attr, fetch_attribute_data(attr, aspect)]
|
||
end.compact
|
||
|
||
obj_aspects[aspect.handle] ||= {}
|
||
obj_aspects[aspect.handle].merge!(fetch_attributes_data(taken_attr_list, expert_attributes, admin_attributes))
|
||
obj_aspects[aspect.handle].merge!(Hash[attrs_data])
|
||
attr_list -= taken_attr_list
|
||
end
|
||
end
|
||
|
||
unless aspect_data[:mapping][:associated_relations].empty?
|
||
taken_rel_list = aspect_data[:mapping][:associated_relations] & rel_list
|
||
unless aspect_mapping[:associated_relations].empty?
|
||
taken_rel_list = aspect_mapping[:associated_relations] & rel_list
|
||
unless taken_rel_list.empty?
|
||
rels_data = taken_rel_list.collect do |rel|
|
||
["rel:" + rel, fetch_relation_data(rel, aspect)]
|
||
end.compact
|
||
|
||
obj_aspects[aspect.handle] ||= {}
|
||
obj_aspects[aspect.handle].merge!(fetch_relations_data(taken_rel_list, expert_attributes))
|
||
obj_aspects[aspect.handle].merge!(Hash[rels_data])
|
||
rel_list -= taken_rel_list
|
||
end
|
||
end
|
||
... | ... | |
if self.class.parameters[:mapping][:associate_unclaimed_attributes]
|
||
taken_attr_list = attr_list
|
||
else
|
||
taken_attr_list = admin_attributes
|
||
taken_attr_list += self.class.parameters[:mapping][:associated_attributes]
|
||
taken_attr_list = self.class.parameters[:mapping][:associated_attributes]
|
||
taken_attr_list += self.class.possible_attributes
|
||
end
|
||
taken_attr_list = taken_attr_list.uniq & attr_list
|
||
taken_attr_list += self.class.virtual_attributes
|
||
obj_info = fetch_attributes_data(taken_attr_list, expert_attributes, admin_attributes)
|
||
attrs_data = taken_attr_list.collect do |attr|
|
||
[attr, fetch_attribute_data(attr, self)]
|
||
end.compact
|
||
obj_info = Hash[attrs_data]
|
||
attr_list -= taken_attr_list
|
||
|
||
# manage general relations
|
||
if self.class.parameters[:mapping][:associated_relations]
|
||
taken_rel_list = self.class.parameters[:mapping][:associated_relations] & rel_list
|
||
unless taken_rel_list.empty?
|
||
obj_info.merge!(fetch_relations_data(taken_rel_list, expert_attributes))
|
||
rels_data = taken_rel_list.collect do |rel|
|
||
["rel:" + rel, fetch_relation_data(rel, self)]
|
||
end.compact
|
||
|
||
obj_info.merge!(Hash[rels_data])
|
||
rel_list -= taken_rel_list
|
||
end
|
||
end
|
||
... | ... | |
self.aspects.values.each do |aspect|
|
||
taken_attr_list = (aspect.possible_attributes & attr_list)
|
||
taken_attr_list += aspect.virtual_attributes
|
||
|
||
attrs_data = taken_attr_list.collect do |attr|
|
||
[attr, fetch_attribute_data(attr, aspect)]
|
||
end.compact
|
||
|
||
obj_aspects[aspect.handle] ||= {}
|
||
obj_aspects[aspect.handle].merge!(fetch_attributes_data(taken_attr_list, expert_attributes, admin_attributes))
|
||
obj_aspects[aspect.handle].merge!(Hash[attrs_data])
|
||
attr_list -= taken_attr_list
|
||
|
||
break if attr_list.empty?
|
||
end
|
||
end
|
||
|
||
# third pass to dispath the remaining attributes
|
||
unless attr_list.empty?
|
||
attrs_data = attr_list.collect do |attr|
|
||
[attr, fetch_attribute_data(attr, self)]
|
||
end.compact
|
||
obj_info.merge!(Hash[attrs_data])
|
||
end
|
||
|
||
[obj_info, obj_aspects]
|
||
end
|
||
|
||
... | ... | |
end
|
||
end
|
||
|
||
def fetch_attributes_data(attr_list, expert_attributes, admin_attributes)
|
||
attr_data = attr_list.collect do |attr|
|
||
base_info = self.attribute_info(attr)
|
||
def attribute_parameters(attr, claimed_by)
|
||
self.class.shadow.parameters[:interface][:attribute_defaults].dup.
|
||
recursive_merge(claimed_by.class.parameters[:interface][:attribute_defaults]).
|
||
recursive_merge(self.class.shadow.parameters[:interface][:attributes][attr.to_sym] || {}).
|
||
recursive_merge(claimed_by.class.parameters[:interface][:attributes][attr.to_sym] || {})
|
||
end
|
||
|
||
if base_info.nil?
|
||
nil
|
||
else
|
||
val = self.send(attr)
|
||
[attr, base_info.merge({
|
||
:value => val,
|
||
:multiple => val.is_a?(Array),
|
||
:expert => expert_attributes.include?(attr),
|
||
:admin => admin_attributes.include?(attr)
|
||
})]
|
||
end
|
||
end
|
||
Hash[attr_data.compact]
|
||
def fetch_attribute_data(attr, claimed_by)
|
||
base_info = self.attribute_info(attr)
|
||
return nil if base_info.nil?
|
||
|
||
attr_data = attribute_parameters(attr, claimed_by)
|
||
|
||
val = (attr == 'objectClass') ? self.classes : self.send(attr)
|
||
attr_data.merge!({
|
||
:value => val,
|
||
:multiple => val.is_a?(Array)
|
||
})
|
||
|
||
attr_data
|
||
end
|
||
|
||
def fetch_relations_data(rel_list, expert_attributes)
|
||
rel_data = rel_list.collect do |rel|
|
||
data = self.send(rel)
|
||
if data.is_a? Enumerable
|
||
if data.empty?
|
||
value = nil
|
||
else
|
||
value = data.collect{|g| g.handle }
|
||
multiple = true
|
||
end
|
||
def fetch_relation_data(rel, claimed_by)
|
||
data = self.send(rel)
|
||
if data.is_a? Enumerable
|
||
if data.empty?
|
||
value = nil
|
||
else
|
||
# the exists? method also ensure the object is loaded
|
||
if data.exists?
|
||
value = data.handle
|
||
else
|
||
value = nil
|
||
end
|
||
multiple = false
|
||
value = data.collect{|g| g.handle }
|
||
multiple = true
|
||
end
|
||
|
||
if value.nil?
|
||
nil
|
||
else
|
||
# the exists? method also ensure the object is loaded
|
||
if data.exists?
|
||
value = data.handle
|
||
else
|
||
rel_key = "rel:" + rel
|
||
[rel_key, {
|
||
:syntax => nil,
|
||
:value => value,
|
||
:multiple => multiple,
|
||
:expert => expert_attributes.include?(rel_key),
|
||
:admin => false,
|
||
:binary => false
|
||
}]
|
||
value = nil
|
||
end
|
||
multiple = false
|
||
end
|
||
|
||
if value.nil?
|
||
nil
|
||
else
|
||
attr_data = attribute_parameters(attr, claimed_by)
|
||
|
||
attr_data.merge!({
|
||
:syntax => nil,
|
||
:value => value,
|
||
:single_value => !multiple,
|
||
:multiple => multiple,
|
||
:binary => false,
|
||
:operational => false
|
||
})
|
||
|
||
attr_data
|
||
end
|
||
Hash[rel_data.compact]
|
||
end
|
||
end
|
||
|
lib/ldap_shadows/shadow.rb | ||
---|---|---|
@shadow_config
|
||
end
|
||
|
||
alias_method :parameters, :get_config
|
||
|
||
def add_aspect(aspect_name, aspect_def_raw)
|
||
add_container_element('aspect', aspect_name, aspect_def_raw)
|
||
end
|
||
... | ... | |
item_list[item.dn]= item
|
||
end
|
||
else
|
||
self.get_config[:presentation][:tree_objects].each do |obj_hdl|
|
||
self.get_config[:interface][:tree_objects].each do |obj_hdl|
|
||
obj_klass = get_object(obj_hdl.downcase)
|
||
unless obj_klass
|
||
raise PreProcessingError, _("Tree object '%s' not defined") % obj_hdl
|
Also available in: Unified diff
[evol] attributes parameters rework §1 (core code) (refs #142)