powerhome-activeldap 3.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +6 -0
  3. data/COPYING +340 -0
  4. data/Gemfile +12 -0
  5. data/LICENSE +59 -0
  6. data/README.textile +140 -0
  7. data/TODO +32 -0
  8. data/benchmark/README.md +64 -0
  9. data/benchmark/bench-backend.rb +247 -0
  10. data/benchmark/bench-instantiate.rb +98 -0
  11. data/benchmark/config.yaml.sample +5 -0
  12. data/doc/text/development.textile +54 -0
  13. data/doc/text/news.textile +811 -0
  14. data/doc/text/rails.textile +144 -0
  15. data/doc/text/tutorial.textile +1010 -0
  16. data/examples/config.yaml.example +5 -0
  17. data/examples/example.der +0 -0
  18. data/examples/example.jpg +0 -0
  19. data/examples/groupadd +41 -0
  20. data/examples/groupdel +35 -0
  21. data/examples/groupls +49 -0
  22. data/examples/groupmod +42 -0
  23. data/examples/lpasswd +55 -0
  24. data/examples/objects/group.rb +13 -0
  25. data/examples/objects/ou.rb +4 -0
  26. data/examples/objects/user.rb +20 -0
  27. data/examples/ouadd +38 -0
  28. data/examples/useradd +45 -0
  29. data/examples/useradd-binary +53 -0
  30. data/examples/userdel +34 -0
  31. data/examples/userls +50 -0
  32. data/examples/usermod +42 -0
  33. data/examples/usermod-binary-add +50 -0
  34. data/examples/usermod-binary-add-time +54 -0
  35. data/examples/usermod-binary-del +48 -0
  36. data/examples/usermod-lang-add +43 -0
  37. data/lib/active_ldap.rb +85 -0
  38. data/lib/active_ldap/action_controller/ldap_benchmarking.rb +55 -0
  39. data/lib/active_ldap/acts/tree.rb +78 -0
  40. data/lib/active_ldap/adapter/base.rb +707 -0
  41. data/lib/active_ldap/adapter/jndi.rb +184 -0
  42. data/lib/active_ldap/adapter/jndi_connection.rb +185 -0
  43. data/lib/active_ldap/adapter/ldap.rb +290 -0
  44. data/lib/active_ldap/adapter/ldap_ext.rb +105 -0
  45. data/lib/active_ldap/adapter/net_ldap.rb +309 -0
  46. data/lib/active_ldap/adapter/net_ldap_ext.rb +23 -0
  47. data/lib/active_ldap/association/belongs_to.rb +47 -0
  48. data/lib/active_ldap/association/belongs_to_many.rb +58 -0
  49. data/lib/active_ldap/association/children.rb +21 -0
  50. data/lib/active_ldap/association/collection.rb +105 -0
  51. data/lib/active_ldap/association/has_many.rb +31 -0
  52. data/lib/active_ldap/association/has_many_utils.rb +44 -0
  53. data/lib/active_ldap/association/has_many_wrap.rb +75 -0
  54. data/lib/active_ldap/association/proxy.rb +107 -0
  55. data/lib/active_ldap/associations.rb +205 -0
  56. data/lib/active_ldap/attribute_methods.rb +23 -0
  57. data/lib/active_ldap/attribute_methods/before_type_cast.rb +24 -0
  58. data/lib/active_ldap/attribute_methods/dirty.rb +43 -0
  59. data/lib/active_ldap/attribute_methods/query.rb +31 -0
  60. data/lib/active_ldap/attribute_methods/read.rb +44 -0
  61. data/lib/active_ldap/attribute_methods/write.rb +38 -0
  62. data/lib/active_ldap/attributes.rb +176 -0
  63. data/lib/active_ldap/base.rb +1410 -0
  64. data/lib/active_ldap/callbacks.rb +71 -0
  65. data/lib/active_ldap/command.rb +49 -0
  66. data/lib/active_ldap/compatible.rb +44 -0
  67. data/lib/active_ldap/configuration.rb +147 -0
  68. data/lib/active_ldap/connection.rb +299 -0
  69. data/lib/active_ldap/distinguished_name.rb +291 -0
  70. data/lib/active_ldap/entry_attribute.rb +78 -0
  71. data/lib/active_ldap/escape.rb +12 -0
  72. data/lib/active_ldap/get_text.rb +20 -0
  73. data/lib/active_ldap/get_text/parser.rb +161 -0
  74. data/lib/active_ldap/helper.rb +92 -0
  75. data/lib/active_ldap/human_readable.rb +133 -0
  76. data/lib/active_ldap/ldap_error.rb +74 -0
  77. data/lib/active_ldap/ldif.rb +930 -0
  78. data/lib/active_ldap/log_subscriber.rb +50 -0
  79. data/lib/active_ldap/object_class.rb +95 -0
  80. data/lib/active_ldap/operations.rb +624 -0
  81. data/lib/active_ldap/persistence.rb +100 -0
  82. data/lib/active_ldap/populate.rb +53 -0
  83. data/lib/active_ldap/railtie.rb +43 -0
  84. data/lib/active_ldap/railties/controller_runtime.rb +48 -0
  85. data/lib/active_ldap/schema.rb +701 -0
  86. data/lib/active_ldap/schema/syntaxes.rb +422 -0
  87. data/lib/active_ldap/timeout.rb +75 -0
  88. data/lib/active_ldap/timeout_stub.rb +17 -0
  89. data/lib/active_ldap/user_password.rb +99 -0
  90. data/lib/active_ldap/validations.rb +200 -0
  91. data/lib/active_ldap/version.rb +3 -0
  92. data/lib/active_ldap/xml.rb +139 -0
  93. data/lib/rails/generators/active_ldap/model/USAGE +18 -0
  94. data/lib/rails/generators/active_ldap/model/model_generator.rb +47 -0
  95. data/lib/rails/generators/active_ldap/model/templates/model_active_ldap.rb +3 -0
  96. data/lib/rails/generators/active_ldap/scaffold/scaffold_generator.rb +14 -0
  97. data/lib/rails/generators/active_ldap/scaffold/templates/ldap.yml +19 -0
  98. data/po/en/active-ldap.po +4029 -0
  99. data/po/ja/active-ldap.po +4060 -0
  100. data/test/add-phonetic-attribute-options-to-slapd.ldif +10 -0
  101. data/test/al-test-utils.rb +428 -0
  102. data/test/command.rb +111 -0
  103. data/test/config.yaml.sample +6 -0
  104. data/test/fixtures/lower_case_object_class_schema.rb +802 -0
  105. data/test/run-test.rb +34 -0
  106. data/test/test_acts_as_tree.rb +60 -0
  107. data/test/test_adapter.rb +121 -0
  108. data/test/test_associations.rb +701 -0
  109. data/test/test_attributes.rb +117 -0
  110. data/test/test_base.rb +1214 -0
  111. data/test/test_base_per_instance.rb +61 -0
  112. data/test/test_bind.rb +62 -0
  113. data/test/test_callback.rb +31 -0
  114. data/test/test_configuration.rb +40 -0
  115. data/test/test_connection.rb +82 -0
  116. data/test/test_connection_per_class.rb +112 -0
  117. data/test/test_connection_per_dn.rb +112 -0
  118. data/test/test_dirty.rb +98 -0
  119. data/test/test_dn.rb +172 -0
  120. data/test/test_find.rb +176 -0
  121. data/test/test_groupadd.rb +50 -0
  122. data/test/test_groupdel.rb +46 -0
  123. data/test/test_groupls.rb +107 -0
  124. data/test/test_groupmod.rb +51 -0
  125. data/test/test_ldif.rb +1890 -0
  126. data/test/test_load.rb +133 -0
  127. data/test/test_lpasswd.rb +75 -0
  128. data/test/test_object_class.rb +74 -0
  129. data/test/test_persistence.rb +131 -0
  130. data/test/test_reflection.rb +175 -0
  131. data/test/test_schema.rb +559 -0
  132. data/test/test_syntax.rb +444 -0
  133. data/test/test_user.rb +217 -0
  134. data/test/test_user_password.rb +108 -0
  135. data/test/test_useradd-binary.rb +62 -0
  136. data/test/test_useradd.rb +57 -0
  137. data/test/test_userdel.rb +48 -0
  138. data/test/test_userls.rb +91 -0
  139. data/test/test_usermod-binary-add-time.rb +65 -0
  140. data/test/test_usermod-binary-add.rb +64 -0
  141. data/test/test_usermod-binary-del.rb +66 -0
  142. data/test/test_usermod-lang-add.rb +59 -0
  143. data/test/test_usermod.rb +58 -0
  144. data/test/test_validation.rb +274 -0
  145. metadata +379 -0
@@ -0,0 +1,71 @@
1
+ require 'active_support/core_ext/array/wrap'
2
+
3
+ module ActiveLdap
4
+ module Callbacks
5
+ extend ActiveSupport::Concern
6
+
7
+ CALLBACKS = [
8
+ :after_initialize, :after_find, :after_touch, :before_validation, :after_validation,
9
+ :before_save, :around_save, :after_save, :before_create, :around_create,
10
+ :after_create, :before_update, :around_update, :after_update,
11
+ :before_destroy, :around_destroy, :after_destroy, :after_commit, :after_rollback
12
+ ]
13
+
14
+ included do
15
+ extend ActiveModel::Callbacks
16
+ include ActiveModel::Validations::Callbacks
17
+
18
+ define_model_callbacks :initialize, :find, :touch, :only => :after
19
+ define_model_callbacks :save, :create, :update, :destroy
20
+
21
+ class << self
22
+ alias_method_chain :instantiate, :callbacks
23
+ end
24
+ end
25
+
26
+ module ClassMethods
27
+ def method_added(meth)
28
+ super
29
+ if CALLBACKS.include?(meth.to_sym)
30
+ ActiveSupport::Deprecation.warn("Base##{meth} has been deprecated, please use Base.#{meth} :method instead", caller[0,1])
31
+ send(meth.to_sym, meth.to_sym)
32
+ end
33
+ end
34
+ end
35
+
36
+ module ClassMethods
37
+ def instantiate_with_callbacks(record)
38
+ object = instantiate_without_callbacks(record)
39
+ object.send(:_run_find_callbacks)
40
+ object.send(:_run_initialize_callbacks)
41
+ object
42
+ end
43
+ end
44
+
45
+ def initialize(*) #:nodoc:
46
+ run_callbacks(:initialize) { super }
47
+ end
48
+
49
+ def destroy #:nodoc:
50
+ run_callbacks(:destroy) { super }
51
+ end
52
+
53
+ def touch(*) #:nodoc:
54
+ run_callbacks(:touch) { super }
55
+ end
56
+
57
+ private
58
+
59
+ def create_or_update #:nodoc:
60
+ run_callbacks(:save) { super }
61
+ end
62
+
63
+ def create #:nodoc:
64
+ run_callbacks(:create) { super }
65
+ end
66
+
67
+ def update(*) #:nodoc:
68
+ run_callbacks(:update) { super }
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,49 @@
1
+ require 'optparse'
2
+ require 'ostruct'
3
+
4
+ module ActiveLdap
5
+ module Command
6
+ include GetTextSupport
7
+
8
+ module_function
9
+ def parse_options(argv=nil, version=nil)
10
+ argv ||= ARGV.dup
11
+ options = OpenStruct.new
12
+ opts = OptionParser.new do |opts|
13
+ yield(opts, options)
14
+
15
+ opts.separator ""
16
+ opts.separator _("Common options:")
17
+
18
+ opts.on_tail("--config=CONFIG",
19
+ _("Specify configuration file written as YAML")) do |file|
20
+ require 'yaml'
21
+ config = YAML.load(File.read(file)).symbolize_keys
22
+ config = Base.prepare_configuration(config)
23
+ Configuration::DEFAULT_CONFIG.update(config)
24
+ end
25
+
26
+ opts.on_tail("-h", "--help", _("Show this message")) do
27
+ puts opts
28
+ exit
29
+ end
30
+
31
+ opts.on_tail("--version", _("Show version")) do
32
+ puts(version || VERSION)
33
+ exit
34
+ end
35
+ end
36
+ opts.parse!(argv)
37
+ [argv, opts, options]
38
+ end
39
+
40
+ def read_password(prompt, input=$stdin, output=$stdout)
41
+ output.print(prompt)
42
+ system("/bin/stty -echo") if input.tty?
43
+ input.gets.chomp
44
+ ensure
45
+ system("/bin/stty echo") if input.tty?
46
+ output.puts
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,44 @@
1
+ module ActiveLdap
2
+ module Compatible
3
+ module_function
4
+ if "".respond_to?(:force_encoding)
5
+ def convert_to_utf8_encoded_object(object)
6
+ case object
7
+ when Array
8
+ object.collect {|element| convert_to_utf8_encoded_object(element)}
9
+ when Hash
10
+ encoded = {}
11
+ object.each do |key, value|
12
+ key = convert_to_utf8_encoded_object(key)
13
+ value = convert_to_utf8_encoded_object(value)
14
+ encoded[key] = value
15
+ end
16
+ encoded
17
+ when String
18
+ encoded = object.dup
19
+ encoded.force_encoding("utf-8")
20
+ encoded = object unless encoded.valid_encoding?
21
+ encoded
22
+ else
23
+ object
24
+ end
25
+ end
26
+ else
27
+ def convert_to_utf8_encoded_object(object)
28
+ object
29
+ end
30
+ end
31
+
32
+ if "".respond_to?(:lines)
33
+ def string_to_lines(string)
34
+ string.lines.to_a
35
+ end
36
+ else
37
+ def string_to_lines(string)
38
+ ary = []
39
+ string.each_line{|l| ary << l}
40
+ ary
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,147 @@
1
+ require 'uri'
2
+ begin
3
+ require 'uri/ldaps'
4
+ rescue LoadError
5
+ module URI
6
+ class LDAPS < LDAP
7
+ DEFAULT_PORT = 636
8
+ end
9
+ @@schemes['LDAPS'] = LDAPS
10
+ end
11
+ end
12
+
13
+ module ActiveLdap
14
+ # Configuration
15
+ #
16
+ # Configuration provides the default settings required for
17
+ # ActiveLdap to work with your LDAP server. All of these
18
+ # settings can be passed in at initialization time.
19
+ module Configuration
20
+ def self.included(base)
21
+ base.extend(ClassMethods)
22
+ end
23
+
24
+ DEFAULT_CONFIG = {}
25
+ DEFAULT_CONFIG[:host] = '127.0.0.1'
26
+ DEFAULT_CONFIG[:port] = nil
27
+ DEFAULT_CONFIG[:method] = :plain # :ssl, :tls, :plain allowed
28
+
29
+ DEFAULT_CONFIG[:bind_dn] = nil
30
+ DEFAULT_CONFIG[:password_block] = nil
31
+ DEFAULT_CONFIG[:password] = nil
32
+ DEFAULT_CONFIG[:store_password] = true
33
+ DEFAULT_CONFIG[:allow_anonymous] = true
34
+ DEFAULT_CONFIG[:sasl_quiet] = true
35
+ DEFAULT_CONFIG[:try_sasl] = false
36
+ DEFAULT_CONFIG[:sasl_options] = nil
37
+ # See http://www.iana.org/assignments/sasl-mechanisms
38
+ DEFAULT_CONFIG[:sasl_mechanisms] = ["GSSAPI", "DIGEST-MD5",
39
+ "CRAM-MD5", "EXTERNAL"]
40
+
41
+ DEFAULT_CONFIG[:retry_limit] = 1
42
+ DEFAULT_CONFIG[:retry_wait] = 1
43
+ DEFAULT_CONFIG[:timeout] = 0 # in seconds; 0 <= Never timeout
44
+ # Whether or not to retry on timeouts
45
+ DEFAULT_CONFIG[:retry_on_timeout] = true
46
+
47
+ DEFAULT_CONFIG[:logger] = nil
48
+
49
+ module ClassMethods
50
+ @@defined_configurations = {}
51
+
52
+ def default_configuration
53
+ DEFAULT_CONFIG.dup
54
+ end
55
+
56
+ def ensure_configuration(config=nil)
57
+ if config.nil?
58
+ if defined?(LDAP_ENV)
59
+ config = LDAP_ENV
60
+ elsif defined?(Rails)
61
+ config = Rails.env
62
+ else
63
+ config = {}
64
+ end
65
+ end
66
+
67
+ if config.is_a?(Symbol) or config.is_a?(String)
68
+ _config = configurations[config.to_s]
69
+ unless _config
70
+ raise ConnectionError,
71
+ _("%s connection is not configured") % config
72
+ end
73
+ config = _config
74
+ end
75
+
76
+ config
77
+ end
78
+
79
+ def configuration(key=nil)
80
+ @@defined_configurations[key || active_connection_name]
81
+ end
82
+
83
+ def define_configuration(key, config)
84
+ @@defined_configurations[key] = config
85
+ end
86
+
87
+ def defined_configurations
88
+ @@defined_configurations
89
+ end
90
+
91
+ def remove_configuration_by_configuration(config)
92
+ @@defined_configurations.delete_if {|key, value| value == config}
93
+ end
94
+
95
+ CONNECTION_CONFIGURATION_KEYS = [:uri, :base, :adapter]
96
+ def remove_connection_related_configuration(config)
97
+ config.reject do |key, value|
98
+ CONNECTION_CONFIGURATION_KEYS.include?(key)
99
+ end
100
+ end
101
+
102
+ def merge_configuration(user_configuration, target=self)
103
+ configuration = default_configuration
104
+ prepare_configuration(user_configuration).each do |key, value|
105
+ case key
106
+ when :base
107
+ # Scrub before inserting
108
+ target.base = value.gsub(/['}{#]/, '')
109
+ when :scope, :ldap_scope
110
+ if key == :ldap_scope
111
+ message = _(":ldap_scope configuration option is deprecated. " \
112
+ "Use :scope instead.")
113
+ ActiveSupport::Deprecation.warn(message)
114
+ end
115
+ target.scope = value
116
+ configuration[:scope] = value
117
+ else
118
+ configuration[key] = value
119
+ end
120
+ end
121
+ configuration
122
+ end
123
+
124
+ def prepare_configuration(configuration)
125
+ configuration = configuration.symbolize_keys
126
+ uri = configuration.delete(:uri)
127
+ return configuration unless uri
128
+
129
+ begin
130
+ uri = URI.parse(uri)
131
+ rescue URI::InvalidURIError
132
+ raise ConfigurationError.new(_("invalid URI: %s") % uri)
133
+ end
134
+ unless uri.is_a?(URI::LDAP)
135
+ raise ConfigurationError.new(_("not a LDAP URI: %s") % uri.to_s)
136
+ end
137
+
138
+ uri_configuration = {:port => uri.port}
139
+ uri_configuration[:host] = uri.host if uri.host
140
+ uri_configuration[:bind_dn] = uri.dn if uri.dn
141
+ uri_configuration[:scope] = uri.scope if uri.scope
142
+ uri_configuration[:method] = :ssl if uri.is_a?(URI::LDAPS)
143
+ uri_configuration.merge(configuration)
144
+ end
145
+ end
146
+ end
147
+ end
@@ -0,0 +1,299 @@
1
+ module ActiveLdap
2
+ module Connection
3
+ def self.included(base)
4
+ base.extend(ClassMethods)
5
+ end
6
+
7
+ module ClassMethods
8
+ @@active_connections = {}
9
+ @@allow_concurrency = false
10
+
11
+ def thread_safe_active_connections
12
+ @@active_connections[Thread.current.object_id] ||= {}
13
+ end
14
+
15
+ def single_threaded_active_connections
16
+ @@active_connections
17
+ end
18
+
19
+ if @@allow_concurrency
20
+ alias_method :active_connections, :thread_safe_active_connections
21
+ else
22
+ alias_method :active_connections, :single_threaded_active_connections
23
+ end
24
+
25
+ def allow_concurrency=(threaded) #:nodoc:
26
+ logger.debug {"allow_concurrency=#{threaded}"} if logger
27
+ return if @@allow_concurrency == threaded
28
+ clear_all_cached_connections!
29
+ @@allow_concurrency = threaded
30
+ method_prefix = threaded ? "thread_safe" : "single_threaded"
31
+ sing = (class << self; self; end)
32
+ [:active_connections].each do |method|
33
+ sing.send(:alias_method, method, "#{method_prefix}_#{method}")
34
+ end
35
+ end
36
+
37
+ def active_connection_name
38
+ @active_connection_name ||= determine_active_connection_name
39
+ end
40
+
41
+ def remove_active_connections!
42
+ active_connections.keys.each do |key|
43
+ remove_connection(key)
44
+ end
45
+ end
46
+
47
+ def clear_active_connections!
48
+ connections = active_connections
49
+ connections.each do |key, connection|
50
+ connection.disconnect!
51
+ end
52
+ connections.clear
53
+ end
54
+
55
+ def clear_active_connection_name
56
+ @active_connection_name = nil
57
+ ObjectSpace.each_object(Class) do |klass|
58
+ if klass < self and !klass.name.blank?
59
+ klass.instance_variable_set("@active_connection_name", nil)
60
+ end
61
+ end
62
+ end
63
+
64
+ def connection
65
+ conn = nil
66
+ @active_connection_name ||= nil
67
+ if @active_connection_name
68
+ conn = active_connections[@active_connection_name]
69
+ end
70
+ unless conn
71
+ conn = retrieve_connection
72
+ active_connections[@active_connection_name] = conn
73
+ end
74
+ conn
75
+ end
76
+
77
+ def connection=(adapter)
78
+ if adapter.is_a?(Adapter::Base)
79
+ active_connections[active_connection_name] = adapter
80
+ elsif adapter.is_a?(Hash)
81
+ config = adapter
82
+ self.connection = instantiate_adapter(config)
83
+ elsif adapter.nil?
84
+ raise ConnectionNotSetup
85
+ else
86
+ setup_connection(adapter)
87
+ end
88
+ end
89
+
90
+ def instantiate_adapter(config)
91
+ adapter = (config[:adapter] || default_adapter)
92
+ normalized_adapter = adapter.downcase.gsub(/-/, "_")
93
+ adapter_method = "#{normalized_adapter}_connection"
94
+ unless Adapter::Base.respond_to?(adapter_method)
95
+ raise AdapterNotFound.new(adapter)
96
+ end
97
+ if config.has_key?(:ldap_scope)
98
+ message = _(":ldap_scope connection option is deprecated. " \
99
+ "Use :scope instead.")
100
+ ActiveSupport::Deprecation.warn(message)
101
+ config[:scope] ||= config.delete(:ldap_scope)
102
+ end
103
+ config = remove_connection_related_configuration(config)
104
+ Adapter::Base.send(adapter_method, config)
105
+ end
106
+
107
+ def default_adapter
108
+ @@default_adapter ||= guess_available_adapter
109
+ end
110
+
111
+ def connected?
112
+ active_connections[active_connection_name] ? true : false
113
+ end
114
+
115
+ def retrieve_connection
116
+ conn = nil
117
+ name = active_connection_name
118
+ raise ConnectionNotSetup unless name
119
+ conn = active_connections[name]
120
+ if conn.nil?
121
+ config = configuration(name)
122
+ raise ConnectionNotSetup unless config
123
+ self.connection = config
124
+ conn = active_connections[name]
125
+ end
126
+ raise ConnectionNotSetup if conn.nil?
127
+ conn
128
+ end
129
+
130
+ def remove_connection(klass_or_key=self)
131
+ if klass_or_key.is_a?(Module)
132
+ key = active_connection_key(klass_or_key)
133
+ else
134
+ key = klass_or_key
135
+ end
136
+ config = configuration(key)
137
+ conn = active_connections[key]
138
+ remove_configuration_by_configuration(config)
139
+ active_connections.delete_if {|_key, value| value == conn}
140
+ conn.disconnect! if conn
141
+ config
142
+ end
143
+
144
+ def setup_connection(config=nil)
145
+ config = ensure_configuration(config)
146
+ remove_connection
147
+
148
+ clear_active_connection_name
149
+ key = active_connection_key
150
+ @active_connection_name = key
151
+ define_configuration(key, merge_configuration(config))
152
+ end
153
+
154
+ def establish_connection(config=nil)
155
+ message =
156
+ _("ActiveLdap::Connection.establish_connection has been deprecated " \
157
+ "since 1.1.0. " \
158
+ "Please use ActiveLdap::Connection.setup_connection instead.")
159
+ ActiveSupport::Deprecation.warn(message)
160
+ setup_connection(config)
161
+ end
162
+
163
+ # Return the schema object
164
+ def schema
165
+ connection.schema
166
+ end
167
+
168
+ def reset_runtime
169
+ active_connections.inject(0) do |result, (name, connection)|
170
+ _ = name # for suppress a warning on Ruby 1.9.3
171
+ result + connection.reset_runtime
172
+ end
173
+ end
174
+
175
+ private
176
+ def active_connection_key(k=self)
177
+ k.name.blank? ? k.object_id : k.name
178
+ end
179
+
180
+ def determine_active_connection_name
181
+ key = active_connection_key
182
+ if active_connections[key] or configuration(key)
183
+ key
184
+ elsif self == ActiveLdap::Base
185
+ nil
186
+ else
187
+ superclass.active_connection_name
188
+ end
189
+ end
190
+
191
+ def clear_all_cached_connections!
192
+ if @@allow_concurrency
193
+ @@active_connections.each_value do |connection_hash_for_thread|
194
+ connection_hash_for_thread.each_value {|conn| conn.disconnect!}
195
+ connection_hash_for_thread.clear
196
+ end
197
+ else
198
+ @@active_connections.each_value {|conn| conn.disconnect!}
199
+ end
200
+ @@active_connections.clear
201
+ end
202
+
203
+ def guess_available_adapter
204
+ if Object.respond_to?(:java)
205
+ "jndi"
206
+ else
207
+ ruby_ldap_available = false
208
+ $LOAD_PATH.each do |path|
209
+ if File.exist?(File.join(path, "ldap", "ldif.rb"))
210
+ ruby_ldap_available = true
211
+ break
212
+ end
213
+ end
214
+ if !ruby_ldap_available and Object.const_defined?(:Gem)
215
+ ruby_ldap_available = gem_available?("ruby-ldap")
216
+ end
217
+ if ruby_ldap_available
218
+ "ldap"
219
+ else
220
+ "net-ldap"
221
+ end
222
+ end
223
+ end
224
+
225
+ def gem_available?(name)
226
+ not Gem::Specification.find_all_by_name(name).empty?
227
+ end
228
+ end
229
+
230
+ def setup_connection(config=nil)
231
+ config = self.class.ensure_configuration(config)
232
+ config = self.class.configuration.merge(config)
233
+ config = self.class.merge_configuration(config, self)
234
+
235
+ remove_connection
236
+ self.class.define_configuration(dn, config)
237
+ end
238
+
239
+ def establish_connection(config=nil)
240
+ message =
241
+ _("ActiveLdap::Connection#establish_connection has been deprecated " \
242
+ "since 1.1.0. " \
243
+ "Please use ActiveLdap::Connection#setup_connection instead.")
244
+ ActiveSupport::Deprecation.warn(message)
245
+ setup_connection(config)
246
+ end
247
+
248
+ def remove_connection
249
+ self.class.remove_connection(dn)
250
+ @connection = nil
251
+ end
252
+
253
+ def connection
254
+ conn = @connection
255
+ return conn if conn
256
+
257
+ have_dn = !@dn.nil?
258
+ if !have_dn and attribute_name_resolvable_without_connection?
259
+ begin
260
+ have_dn = !get_attribute_before_type_cast(dn_attribute)[1].nil?
261
+ rescue DistinguishedNameInvalid
262
+ end
263
+ end
264
+ conn = self.class.active_connections[dn] || retrieve_connection if have_dn
265
+ conn || self.class.connection
266
+ end
267
+
268
+ def connected?
269
+ connection != self.class.connection
270
+ end
271
+
272
+ def connection=(adapter)
273
+ if adapter.nil? or adapter.is_a?(Adapter::Base)
274
+ @connection = adapter
275
+ elsif adapter.is_a?(Hash)
276
+ config = adapter
277
+ @connection = self.class.instantiate_adapter(config)
278
+ else
279
+ setup_connection(adapter)
280
+ end
281
+ end
282
+
283
+ def retrieve_connection
284
+ conn = self.class.active_connections[dn]
285
+ return conn if conn
286
+
287
+ config = self.class.configuration(dn)
288
+ return nil unless config
289
+
290
+ conn = self.class.instantiate_adapter(config)
291
+ @connection = self.class.active_connections[dn] = conn
292
+ conn
293
+ end
294
+
295
+ def schema
296
+ connection.schema
297
+ end
298
+ end
299
+ end