Module ActiveLdap::Validations
In: lib/active_ldap/validations.rb
Error AttributeAssignmentError AdapterNotSpecified OperationNotPermitted RequiredObjectClassMissed ConnectionError RequiredAttributeMissed LdifInvalid DistinguishedNameNotSetError EntryNotFound LdapError SaveError StrongAuthenticationRequired NotImplemented AdapterNotFound TimeoutError AuthenticationError AttributeValueInvalid EntryNotSaved DistinguishedNameInputInvalid EntryAlreadyExist ObjectClassError UnknownAttribute EntryInvalid DeleteError ConfigurationError ConnectionNotSetup DistinguishedNameInvalid Schema\n[lib/active_ldap/schema.rb\nlib/active_ldap/schema/syntaxes.rb] Base DistinguishedName Reloadable::Deprecated Reloadable::Subclasses Enumerable Ldif Collection EntryAttribute StandardError Children HasManyWrap HasMany BelongsToMany Proxy BelongsTo Normalizable Common Find LDIF Delete Update ActiveRecord::Callbacks GetText Parser Base\n[lib/active_ldap/adapter/base.rb\nlib/active_ldap/adapter/jndi.rb\nlib/active_ldap/adapter/ldap.rb\nlib/active_ldap/adapter/net_ldap.rb] Jndi Ldap NetLdap GetTextSupport ActiveRecord::Validations Xml JndiConnection lib/active_ldap/distinguished_name.rb lib/active_ldap/base.rb lib/active_ldap/xml.rb lib/active_ldap/schema.rb lib/active_ldap/entry_attribute.rb lib/active_ldap/ldif.rb lib/active_ldap/ldap_error.rb Compatible ClassMethods Associations LdapBenchmarking ActionController Populate lib/active_ldap/association/has_many_wrap.rb lib/active_ldap/association/children.rb lib/active_ldap/association/collection.rb lib/active_ldap/association/proxy.rb lib/active_ldap/association/belongs_to_many.rb lib/active_ldap/association/belongs_to.rb lib/active_ldap/association/has_many.rb HasManyUtils Association ClassMethods Tree Acts Command ClassMethods Normalizable Attributes Update Common ModifyNameRecordLoadable AddOperationModifiable DeleteOperationModifiable ReplaceOperationModifiable ModifyRecordLoadable DeleteRecordLoadable AddRecordLoadable ContentRecordLoadable LDIF Delete Find Operations GetTextSupport Escape ClassMethods Configuration ClassMethods ObjectClass ClassMethods Callbacks lib/active_ldap/get_text/parser.rb GetText lib/active_ldap/adapter/jndi_connection.rb lib/active_ldap/adapter/net_ldap.rb lib/active_ldap/adapter/ldap.rb lib/active_ldap/adapter/base.rb lib/active_ldap/adapter/jndi.rb Adapter Validations GetTextFallback Helper ClassMethods HumanReadable Salt UserPassword ClassMethods Connection ActiveLdap dot/m_46_0.png

Methods

Included Modules

ActiveRecord::Validations

External Aliases

human_attribute_name -> human_attribute_name_active_ldap
human_attribute_name -> human_attribute_name_active_record
human_attribute_name_active_ldap -> human_attribute_name

Public Class methods

[Source]

    # File lib/active_ldap/validations.rb, line 3
 3:     def self.append_features(base)
 4:       super
 5: 
 6:       base.class_eval do
 7:         alias_method :new_record?, :new_entry?
 8:         class << self
 9:           alias_method :human_attribute_name_active_ldap,
10:                        :human_attribute_name
11:         end
12:         include ActiveRecord::Validations
13:         class << self
14:           alias_method :human_attribute_name_active_record,
15:                        :human_attribute_name
16:           alias_method :human_attribute_name,
17:                        :human_attribute_name_active_ldap
18:           unless method_defined?(:human_attribute_name_with_gettext)
19:             def human_attribute_name_with_gettext(attribute_key_name)
20:               s_("#{self}|#{attribute_key_name.humanize}")
21:             end
22:           end
23:         end
24: 
25:         class_local_attr_accessor true, :validation_skip_attributes
26:         remove_method :validation_skip_attributes
27:         self.validation_skip_attributes = []
28: 
29:         # Workaround for GetText's ugly implementation
30:         begin
31:           instance_method(:save_without_validation)
32:         rescue NameError
33:           alias_method_chain :save, :validation
34:           alias_method_chain :save!, :validation
35:           alias_method_chain :update_attribute, :validation_skipping
36:         end
37: 
38:         validate_on_create :validate_duplicated_dn_creation
39:         validate_on_update :validate_duplicated_dn_rename
40:         validate :validate_dn
41:         validate :validate_excluded_classes
42:         validate :validate_required_ldap_values
43:         validate :validate_ldap_values
44: 
45:         class << self
46:           if method_defined?(:evaluate_condition)
47:             def evaluate_condition_with_active_ldap_support(condition, entry)
48:               evaluate_condition_without_active_ldap_support(condition, entry)
49:             rescue ActiveRecord::ActiveRecordError
50:               raise Error, $!.message
51:             end
52:             alias_method_chain :evaluate_condition, :active_ldap_support
53:           end
54:         end
55: 
56:         def save_with_active_ldap_support!
57:           save_without_active_ldap_support!
58:         rescue ActiveRecord::RecordInvalid
59:           raise EntryInvalid, $!.message
60:         end
61:         alias_method_chain :save!, :active_ldap_support
62: 
63:         private
64:         def run_validations_with_active_ldap_support(validation_method)
65:           run_validations_without_active_ldap_support(validation_method)
66:         rescue ActiveRecord::ActiveRecordError
67:           raise Error, $!.message
68:         end
69:         if private_method_defined?(:run_validations)
70:           alias_method_chain :run_validations, :active_ldap_support
71:         else
72:           alias_method(:run_callbacks_with_active_ldap_support,
73:                        :run_validations_with_active_ldap_support)
74:           alias_method_chain :run_callbacks, :active_ldap_support
75:           alias_method(:run_validations_without_active_ldap_support,
76:                        :run_callbacks_without_active_ldap_support)
77:         end
78:       end
79:     end

[Source]

    # File lib/active_ldap/validations.rb, line 47
47:             def evaluate_condition_with_active_ldap_support(condition, entry)
48:               evaluate_condition_without_active_ldap_support(condition, entry)
49:             rescue ActiveRecord::ActiveRecordError
50:               raise Error, $!.message
51:             end

[Source]

    # File lib/active_ldap/validations.rb, line 19
19:             def human_attribute_name_with_gettext(attribute_key_name)
20:               s_("#{self}|#{attribute_key_name.humanize}")
21:             end

Public Instance methods

[Source]

    # File lib/active_ldap/validations.rb, line 64
64:         def run_validations_with_active_ldap_support(validation_method)
65:           run_validations_without_active_ldap_support(validation_method)
66:         rescue ActiveRecord::ActiveRecordError
67:           raise Error, $!.message
68:         end

[Source]

    # File lib/active_ldap/validations.rb, line 56
56:         def save_with_active_ldap_support!
57:           save_without_active_ldap_support!
58:         rescue ActiveRecord::RecordInvalid
59:           raise EntryInvalid, $!.message
60:         end

[Source]

    # File lib/active_ldap/validations.rb, line 81
81:     def validation_skip_attributes
82:       @validation_skip_attributes ||= []
83:     end

[Source]

    # File lib/active_ldap/validations.rb, line 85
85:     def validation_skip_attributes=(attributes)
86:       @validation_skip_attributes = attributes
87:     end

Private Instance methods

[Source]

     # File lib/active_ldap/validations.rb, line 90
 90:     def format_validation_message(format, parameters)
 91:       if ActiveLdap.get_text_supported?
 92:         if /\A(%\{fn\})/ =~ format
 93:           place_holder = $1
 94:           format = $POSTMATCH
 95:         else
 96:           place_holder = ""
 97:         end
 98:         "#{place_holder}#{format % parameters}"
 99:       else
100:         format.sub(/\A%\{fn\} ?/, '') % parameters
101:       end
102:     end

[Source]

     # File lib/active_ldap/validations.rb, line 138
138:     def validate_dn
139:       dn
140:     rescue DistinguishedNameInvalid
141:       format = _("%{fn} is invalid: %s")
142:       message = format_validation_message(format, $!.message)
143:       errors.add("distinguishedName", message)
144:     rescue DistinguishedNameNotSetError
145:       format = _("%{fn} isn't set: %s")
146:       message = format_validation_message(format, $!.message)
147:       errors.add("distinguishedName", message)
148:     end

[Source]

     # File lib/active_ldap/validations.rb, line 104
104:     def validate_duplicated_dn_creation
105:       _dn = nil
106:       begin
107:         _dn = dn
108:       rescue DistinguishedNameInvalid, DistinguishedNameNotSetError
109:         return
110:       end
111:       if _dn and exist?
112:         format = _("%{fn} is duplicated: %s")
113:         message = format_validation_message(format, _dn)
114:         errors.add("distinguishedName", message)
115:       end
116:     end

[Source]

     # File lib/active_ldap/validations.rb, line 118
118:     def validate_duplicated_dn_rename
119:       _dn_attribute = dn_attribute_with_fallback
120:       original_dn_value = @ldap_data[_dn_attribute]
121:       current_dn_value = @data[_dn_attribute]
122:       return if original_dn_value == current_dn_value
123:       return if original_dn_value == [current_dn_value]
124: 
125:       _dn = nil
126:       begin
127:         _dn = dn
128:       rescue DistinguishedNameInvalid, DistinguishedNameNotSetError
129:         return
130:       end
131:       if _dn and exist?
132:         format = _("%{fn} is duplicated: %s")
133:         message = format_validation_message(format, _dn)
134:         errors.add("distinguishedName", message)
135:       end
136:     end

[Source]

     # File lib/active_ldap/validations.rb, line 150
150:     def validate_excluded_classes
151:       excluded_classes = self.class.excluded_classes
152:       return if excluded_classes.empty?
153: 
154:       _schema = schema
155:       _classes = classes.collect do |name|
156:         _schema.object_class(name)
157:       end
158:       unexpected_classes = excluded_classes.inject([]) do |classes, name|
159:         excluded_class = _schema.object_class(name)
160:         if _classes.include?(excluded_class)
161:           classes << excluded_class
162:         end
163:         classes
164:       end
165:       return if unexpected_classes.empty?
166: 
167:       names = unexpected_classes.collect do |object_class|
168:         self.class.human_object_class_name(object_class)
169:       end
170:       format = n_("%{fn} has excluded value: %s",
171:                   "%{fn} has excluded values: %s",
172:                   names.size)
173:       message = format_validation_message(format, names.join(", "))
174:       errors.add("objectClass", message)
175:     end

[Source]

     # File lib/active_ldap/validations.rb, line 227
227:     def validate_ldap_value(attribute, name, value)
228:       failed_reason, option = attribute.validate(value)
229:       return if failed_reason.nil?
230:       if attribute.binary?
231:         inspected_value = _("<binary-value>")
232:       else
233:         inspected_value = self.class.human_readable_format(value)
234:       end
235:       params = [inspected_value,
236:                 self.class.human_syntax_description(attribute.syntax),
237:                 failed_reason]
238:       if option
239:         format = _("%{fn}(%s) has invalid format: %s: required syntax: %s: %s")
240:       else
241:         format = _("%{fn} has invalid format: %s: required syntax: %s: %s")
242:       end
243:       params.unshift(option) if option
244:       message = format_validation_message(format, params)
245:       errors.add(name, message)
246:     end

[Source]

     # File lib/active_ldap/validations.rb, line 219
219:     def validate_ldap_values
220:       entry_attribute.schemata.each do |name, attribute|
221:         value = self[name]
222:         next if self.class.blank_value?(value)
223:         validate_ldap_value(attribute, name, value)
224:       end
225:     end

validate_required_ldap_values

Basic validation:

  • Verify that every ‘MUST’ specified in the schema has a value defined

[Source]

     # File lib/active_ldap/validations.rb, line 181
181:     def validate_required_ldap_values
182:       _schema = nil
183:       @validation_skip_attributes ||= []
184:       _validation_skip_attributes =
185:         @validation_skip_attributes +
186:         (self.class.validation_skip_attributes || [])
187:       # Make sure all MUST attributes have a value
188:       entry_attribute.object_classes.each do |object_class|
189:         object_class.must.each do |required_attribute|
190:           # Normalize to ensure we catch schema problems
191:           # needed?
192:           real_name = to_real_attribute_name(required_attribute.name, true)
193:           raise UnknownAttribute.new(required_attribute) if real_name.nil?
194: 
195:           next if required_attribute.read_only?
196:           next if _validation_skip_attributes.include?(real_name)
197: 
198:           value = @data[real_name] || []
199:           next unless self.class.blank_value?(value)
200: 
201:           _schema ||= schema
202:           aliases = required_attribute.aliases.collect do |name|
203:             self.class.human_attribute_name(name)
204:           end
205:           args = [self.class.human_object_class_name(object_class)]
206:           if aliases.empty?
207:             format = _("%{fn} is required attribute by objectClass '%s'")
208:           else
209:             format = _("%{fn} is required attribute by objectClass " \
210:                        "'%s': aliases: %s")
211:             args << aliases.join(', ')
212:           end
213:           message = format_validation_message(format, args)
214:           errors.add(real_name, message)
215:         end
216:       end
217:     end

[Validate]