Class ActiveLdap::DistinguishedName::Parser
In: lib/active_ldap/distinguished_name.rb
Parent: Object
Error AttributeAssignmentError AdapterNotSpecified OperationNotPermitted RequiredObjectClassMissed ConnectionError RequiredAttributeMissed LdifInvalid LdapError DistinguishedNameNotSetError EntryNotFound 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 HasMany HasManyWrap BelongsToMany Proxy BelongsTo Normalizable Common Find LDIF Delete Update GetText Parser ActiveRecord::Callbacks ActiveRecord::Validations 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 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 LdapBenchmarking ActionController ClassMethods Associations Compatible ClassMethods Tree Acts 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 Populate Command ClassMethods Normalizable Attributes Escape GetTextSupport Update Common ModifyNameRecordLoadable AddOperationModifiable DeleteOperationModifiable ReplaceOperationModifiable ModifyRecordLoadable DeleteRecordLoadable AddRecordLoadable ContentRecordLoadable LDIF Delete Find Operations ClassMethods Configuration lib/active_ldap/get_text/parser.rb GetText ClassMethods Callbacks ClassMethods ObjectClass Validations 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 Helper GetTextFallback ClassMethods HumanReadable Salt UserPassword ClassMethods Connection ActiveLdap dot/m_45_0.png

Methods

Included Modules

GetTextSupport

Constants

ATTRIBUTE_TYPE_RE = /\s*([a-zA-Z][a-zA-Z\d\-]*|\d+(?:\.\d+)*)\s*/
HEX_PAIR = "(?:[\\da-fA-F]{2})"
STRING_CHARS_RE = /[^,=\+<>\#;\\\"]*/
PAIR_RE = /\\([,=\+<>\#;]|\\|\"|(#{HEX_PAIR}))/
HEX_STRING_RE = /\#(#{HEX_PAIR}+)/

Attributes

dn  [R] 

Public Class methods

[Source]

    # File lib/active_ldap/distinguished_name.rb, line 11
11:       def initialize(source)
12:         @dn = nil
13:         source = source.to_s if source.is_a?(DN)
14:         unless source.is_a?(String)
15:           raise DistinguishedNameInputInvalid.new(source)
16:         end
17:         @source = source
18:       end

Public Instance methods

[Source]

    # File lib/active_ldap/distinguished_name.rb, line 20
20:       def parse
21:         return @dn if @dn
22: 
23:         rdns = []
24:         scanner = StringScanner.new(@source)
25: 
26:         scanner.scan(/\s*/)
27:         raise rdn_is_missing if scanner.scan(/\s*\+\s*/)
28:         raise name_component_is_missing if scanner.scan(/\s*,\s*/)
29: 
30:         rdn = {}
31:         until scanner.eos?
32:           type = scan_attribute_type(scanner)
33:           skip_attribute_type_and_value_separator(scanner)
34:           value = scan_attribute_value(scanner)
35:           rdn[type] = value
36:           if scanner.scan(/\s*\+\s*/)
37:             raise rdn_is_missing if scanner.eos?
38:           elsif scanner.scan(/\s*\,\s*/)
39:             rdns << rdn
40:             rdn = {}
41:             raise name_component_is_missing if scanner.eos?
42:           else
43:             scanner.scan(/\s*/)
44:             rdns << rdn if scanner.eos?
45:           end
46:         end
47: 
48:         @dn = DN.new(*rdns)
49:         @dn
50:       end

Private Instance methods

[Source]

     # File lib/active_ldap/distinguished_name.rb, line 143
143:       def attribute_type_is_missing
144:         invalid_dn(_("attribute type is missing"))
145:       end

[Source]

     # File lib/active_ldap/distinguished_name.rb, line 147
147:       def attribute_value_is_missing
148:         invalid_dn(_("attribute value is missing"))
149:       end

[Source]

     # File lib/active_ldap/distinguished_name.rb, line 118
118:       def collect_pairs(scanner)
119:         result = ""
120:         while scanner.scan(PAIR_RE)
121:           if scanner[2]
122:             result << [scanner[2].hex].pack("C*")
123:           else
124:             result << scanner[1]
125:           end
126:         end
127:         result.force_encoding("utf-8") if result.respond_to?(:force_encoding)
128:         result
129:       end

[Source]

     # File lib/active_ldap/distinguished_name.rb, line 151
151:       def found_unmatched_quotation
152:         invalid_dn(_("found unmatched quotation"))
153:       end

[Source]

     # File lib/active_ldap/distinguished_name.rb, line 131
131:       def invalid_dn(reason)
132:         DistinguishedNameInvalid.new(@source, reason)
133:       end

[Source]

     # File lib/active_ldap/distinguished_name.rb, line 135
135:       def name_component_is_missing
136:         invalid_dn(_("name component is missing"))
137:       end

[Source]

     # File lib/active_ldap/distinguished_name.rb, line 139
139:       def rdn_is_missing
140:         invalid_dn(_("relative distinguished name (RDN) is missing"))
141:       end

[Source]

    # File lib/active_ldap/distinguished_name.rb, line 54
54:       def scan_attribute_type(scanner)
55:         raise attribute_type_is_missing unless scanner.scan(ATTRIBUTE_TYPE_RE)
56:         scanner[1]
57:       end

[Source]

    # File lib/active_ldap/distinguished_name.rb, line 67
67:       def scan_attribute_value(scanner)
68:         if scanner.scan(HEX_STRING_RE)
69:           value = scanner[1].scan(/../).collect do |hex_pair|
70:             hex_pair.hex
71:           end.pack("C*")
72:         elsif scanner.scan(/\"/)
73:           value = scan_quoted_attribute_value(scanner)
74:         else
75:           value = scan_not_quoted_attribute_value(scanner)
76:         end
77:         raise attribute_value_is_missing if value.blank?
78: 
79:         value
80:       end

[Source]

     # File lib/active_ldap/distinguished_name.rb, line 99
 99:       def scan_not_quoted_attribute_value(scanner)
100:         result = ""
101:         until scanner.eos?
102:           prev_size = result.size
103:           pairs = collect_pairs(scanner)
104:           strings = scanner.scan(STRING_CHARS_RE)
105:           result << pairs if !pairs.nil? and !pairs.empty?
106:           unless strings.nil?
107:             if scanner.peek(1) == ","
108:               result << strings.rstrip
109:             else
110:               result << strings
111:             end
112:           end
113:           break if prev_size == result.size
114:         end
115:         result
116:       end

[Source]

    # File lib/active_ldap/distinguished_name.rb, line 82
82:       def scan_quoted_attribute_value(scanner)
83:         result = ""
84:         until scanner.scan(/\"/)
85:           scanner.scan(/([^\\\"]*)/)
86:           quoted_strings = scanner[1]
87:           pairs = collect_pairs(scanner)
88: 
89:           if scanner.eos? or (quoted_strings.empty? and pairs.empty?)
90:             raise found_unmatched_quotation
91:           end
92: 
93:           result << quoted_strings
94:           result << pairs
95:         end
96:         result
97:       end

[Source]

    # File lib/active_ldap/distinguished_name.rb, line 59
59:       def skip_attribute_type_and_value_separator(scanner)
60:         raise attribute_value_is_missing unless scanner.scan(/\s*=\s*/)
61:       end

[Validate]