socialcast_ldap_integration 1.1.10 → 1.1.11

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.
@@ -1,5 +1,5 @@
1
1
  module Socialcast
2
2
  module LdapIntegration
3
- VERSION = "1.1.10"
3
+ VERSION = "1.1.11"
4
4
  end
5
5
  end
@@ -1,4 +1,5 @@
1
1
  require "net/ldap"
2
+ require "active_support/core_ext"
2
3
 
3
4
  module Socialcast
4
5
  module LdapIntegration
@@ -15,18 +16,21 @@ module Socialcast
15
16
 
16
17
  def self.available?
17
18
  return false unless self.config
19
+
18
20
  return self.config['connections'].all? do |connection|
19
- ['searcher_username', 'searcher_password', 'filter_string', 'base', 'host', 'port', 'ssl', 'map'].all? { |field| !connection[field].to_s.blank? } && self.required_fields.all? { |field| !connection['map'][field].blank? }
21
+ self.connection_fields_present?(connection) && self.required_fields_present?(connection)
20
22
  end
21
23
  end
22
24
 
23
25
  def self.scheduled?
24
- self.config['enableLdapSchedule']
26
+ self.config['enableLdapSchedule'].to_s == 'true'
25
27
  end
26
28
 
27
29
  def self.mirror_lazily?
30
+ # should we really return true here if the connection is unavailable?
28
31
  return true unless self.available?
29
- self.config['lazy_mirroring']
32
+
33
+ self.config['lazy_mirroring'].to_s == 'true'
30
34
  end
31
35
 
32
36
  def self.schedule
@@ -56,6 +60,7 @@ module Socialcast
56
60
  # - Connection settings for the connection
57
61
  def self.connect(options={})
58
62
  raise ArgumentError.new("connect requires a block, see connect_to") unless block_given?
63
+
59
64
  config = options[:config] ? [options[:config]] : Socialcast::LdapIntegration.config['connections']
60
65
  config.each do |connection_options|
61
66
  ldap = connect_to(connection_options)
@@ -87,19 +92,35 @@ module Socialcast
87
92
 
88
93
  return ldap
89
94
  end
90
-
95
+
91
96
  # Supported options
92
- # [:filter] A string representing the search filter to use instead of the default search filter. Overrides any :auxiliary_filter option.
93
- # [:auxiliary_filter] A string representing a search filter to use in addition to the defualt search filter. The two filters will be combined
94
- # using a logical AND.
95
- # [:limit] A number representing the maxmimum number of records to return, defaults to unlimited.
97
+ # [:filter] A string representing the search filter to use instead
98
+ # of the default search filter. Overrides any :auxiliary_filter
99
+ # option.
100
+ # [:auxiliary_filter] A string representing a search filter to use
101
+ # in addition to the default search filter. The two filters
102
+ # will be combined using a logical AND.
103
+ # [:limit] A number representing the maxmimum number of records to
104
+ # return, defaults to unlimited.
96
105
  def self.search(options={})
97
106
  options.reverse_merge! :connect_options => {}
98
107
  Socialcast::LdapIntegration.connect(options.delete(:connect_options) || {}) do |ldap, connection|
99
108
  ldap_search_options = self.construct_filter_for_search(connection, options.delete(:filter), options.delete(:auxiliary_filter))
100
109
  ldap_search_options[:size] = options[:limit] if options.has_key?(:limit)
101
- ldap.search(ldap_search_options) do |entry|
102
- yield(entry, connection) if block_given?
110
+ ldap_search_options[:return_result] = false
111
+
112
+ options_for_search = [ldap_search_options]
113
+
114
+ if connection[:base].blank?
115
+ tree_root = ldap.search_root_dse
116
+ distinguished_names = Array.wrap(tree_root.namingcontexts)
117
+ options_for_search = distinguished_names.map { |dn| ldap_search_options.merge(:base => dn ) }
118
+ end
119
+
120
+ options_for_search.each do |options|
121
+ ldap.search(options) do |entry|
122
+ yield(entry, connection) if block_given?
123
+ end
103
124
  end
104
125
  end
105
126
  end
@@ -109,6 +130,7 @@ module Socialcast
109
130
  # Defaults to 'company_login'
110
131
  def self.authenticated?(identifier, password, options = {})
111
132
  return false if password.blank?
133
+
112
134
  identifying_field = options.reverse_merge!({:identifying_field => 'company_login'}).delete(:identifying_field)
113
135
 
114
136
  Socialcast::LdapIntegration.connect do |ldap, connection|
@@ -118,7 +140,13 @@ module Socialcast
118
140
  host = connection['host']
119
141
  port = connection['port']
120
142
  map = connection['map']
121
- connection_options.reverse_merge! :host => host, :port => port, :base => base, :filter => "#{map[identifying_field]}=#{identifier}", :password => password
143
+ connection_options.reverse_merge!({
144
+ :host => host,
145
+ :port => port,
146
+ :base => base,
147
+ :filter => "#{map[identifying_field]}=#{identifier}",
148
+ :password => password
149
+ })
122
150
  return true if !ldap.bind_as(connection_options).blank?
123
151
  end
124
152
  return false
@@ -130,7 +158,6 @@ module Socialcast
130
158
  self.available? && (["password", "email"].include?(string_field))
131
159
  end
132
160
 
133
-
134
161
  def self.fetch_account_info(identifier, options = {})
135
162
  identifying_field = options.delete(:identifying_field) || 'company_login'
136
163
  matched_account = nil
@@ -148,10 +175,13 @@ module Socialcast
148
175
  return mapped_account_info
149
176
  end
150
177
  end
178
+
151
179
  nil
152
180
  end
153
181
 
182
+
154
183
  protected
184
+
155
185
  def self.construct_filter_for_search(connection, filter_options=nil, auxiliary_filter=nil)
156
186
  unless filter_options
157
187
  search_filter = connection['filter_string'].blank? ? NULL_FILTER : Net::LDAP::Filter.construct(connection['filter_string'])
@@ -160,8 +190,22 @@ module Socialcast
160
190
  end
161
191
  {:filter => filter_options}
162
192
  end
193
+
194
+ def self.required_fields_present?(connection)
195
+ self.required_fields.all? { |field| !connection['map'][field].blank? }
196
+ end
197
+
163
198
  def self.required_fields
164
199
  ['email', 'company_login']
165
200
  end
201
+
202
+ def self.connection_fields_present?(connection)
203
+ connection_fields.all? { |field| !connection[field].to_s.blank? }
204
+ end
205
+
206
+ def self.connection_fields
207
+ ['searcher_username', 'searcher_password', 'filter_string', 'host', 'port', 'ssl', 'map']
208
+ end
209
+
166
210
  end
167
- end
211
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: socialcast_ldap_integration
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.10
4
+ version: 1.1.11
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,20 +11,57 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2012-06-21 00:00:00.000000000 Z
14
+ date: 2012-08-21 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: socialcast-net-ldap
18
- requirement: &2153018180 !ruby/object:Gem::Requirement
18
+ requirement: !ruby/object:Gem::Requirement
19
19
  none: false
20
20
  requirements:
21
- - - =
21
+ - - '='
22
22
  - !ruby/object:Gem::Version
23
23
  version: 0.1.6
24
24
  type: :runtime
25
25
  prerelease: false
26
- version_requirements: *2153018180
27
- description: ! 'BLAH. '
26
+ version_requirements: !ruby/object:Gem::Requirement
27
+ none: false
28
+ requirements:
29
+ - - '='
30
+ - !ruby/object:Gem::Version
31
+ version: 0.1.6
32
+ - !ruby/object:Gem::Dependency
33
+ name: active_support
34
+ requirement: !ruby/object:Gem::Requirement
35
+ none: false
36
+ requirements:
37
+ - - ! '>='
38
+ - !ruby/object:Gem::Version
39
+ version: '3.0'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ none: false
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ - !ruby/object:Gem::Dependency
49
+ name: rspec
50
+ requirement: !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - '='
54
+ - !ruby/object:Gem::Version
55
+ version: 2.11.0
56
+ type: :development
57
+ prerelease: false
58
+ version_requirements: !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - '='
62
+ - !ruby/object:Gem::Version
63
+ version: 2.11.0
64
+ description: ! 'The most bestest LDAP integration gem thine eyes hath ever beholded. '
28
65
  email:
29
66
  - mitch@socialcast.com
30
67
  - sean@socialcast.com
@@ -55,7 +92,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
55
92
  version: '0'
56
93
  requirements: []
57
94
  rubyforge_project: socialcast_ldap_integration
58
- rubygems_version: 1.8.10
95
+ rubygems_version: 1.8.24
59
96
  signing_key:
60
97
  specification_version: 3
61
98
  summary: Provides support for connecting to and traversing LDAP trees.