Skip to content

Commit 0be3a99

Browse files
committed
Merge pull request #70 from github/detect-configuration
Simplify Search Strategy configuration, detection, default behavior
2 parents 3a94c85 + a62ca6c commit 0be3a99

File tree

9 files changed

+106
-336
lines changed

9 files changed

+106
-336
lines changed

lib/github/ldap.rb

Lines changed: 75 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,26 @@
1+
require 'net/ldap'
2+
require 'forwardable'
3+
4+
require 'github/ldap/filter'
5+
require 'github/ldap/domain'
6+
require 'github/ldap/group'
7+
require 'github/ldap/posix_group'
8+
require 'github/ldap/virtual_group'
9+
require 'github/ldap/virtual_attributes'
10+
require 'github/ldap/instrumentation'
11+
require 'github/ldap/member_search'
12+
require 'github/ldap/membership_validators'
13+
114
module GitHub
215
class Ldap
3-
require 'net/ldap'
4-
require 'forwardable'
5-
require 'github/ldap/filter'
6-
require 'github/ldap/domain'
7-
require 'github/ldap/group'
8-
require 'github/ldap/posix_group'
9-
require 'github/ldap/virtual_group'
10-
require 'github/ldap/virtual_attributes'
11-
require 'github/ldap/instrumentation'
12-
require 'github/ldap/capabilities'
13-
require 'github/ldap/member_search'
14-
require 'github/ldap/membership_validators'
15-
1616
include Instrumentation
1717

1818
extend Forwardable
1919

20+
# Internal: The capability required to use ActiveDirectory features.
21+
# See: http://msdn.microsoft.com/en-us/library/cc223359.aspx.
22+
ACTIVE_DIRECTORY_V61_R2_OID = "1.2.840.113556.1.4.2080".freeze
23+
2024
# Utility method to get the last operation result with a human friendly message.
2125
#
2226
# Returns an OpenStruct with `code` and `message`.
@@ -91,11 +95,8 @@ def initialize(options = {})
9195
# when a base is not explicitly provided.
9296
@search_domains = Array(options[:search_domains])
9397

94-
# configure which strategy should be used to validate user membership
95-
configure_membership_validation_strategy(options[:membership_validator])
96-
97-
# configure which strategy should be used for member search
98-
configure_member_search_strategy(options[:member_search_strategy])
98+
# configure both the membership validator and the member search strategies
99+
configure_search_strategy(options[:search_strategy])
99100

100101
# enables instrumenting queries
101102
@instrumentation_service = options[:instrumentation_service]
@@ -242,42 +243,78 @@ def configure_virtual_attributes(attributes)
242243
end
243244
end
244245

245-
# Internal: Configure the membership validation strategy.
246+
# Internal: Configure the member search and membership validation strategies.
246247
#
247-
# Used by GitHub::Ldap::MembershipValidators::Detect to force a specific
248-
# strategy (instead of detecting host capabilities and deciding at runtime).
248+
# TODO: Inline the logic in these two methods here.
249+
#
250+
# Returns nothing.
251+
def configure_search_strategy(strategy = nil)
252+
# configure which strategy should be used to validate user membership
253+
configure_membership_validation_strategy(strategy)
254+
255+
# configure which strategy should be used for member search
256+
configure_member_search_strategy(strategy)
257+
end
258+
259+
# Internal: Configure the membership validation strategy.
249260
#
250-
# If `strategy` is not provided, or doesn't match a known strategy,
251-
# defaults to `:detect`. Otherwise the configured strategy is selected.
261+
# If no known strategy is provided, detects ActiveDirectory capabilities or
262+
# falls back to the Recursive strategy by default.
252263
#
253-
# Returns the selected membership validator strategy Symbol.
264+
# Returns the membership validator strategy Class.
254265
def configure_membership_validation_strategy(strategy = nil)
255266
@membership_validator =
256267
case strategy.to_s
257-
when "classic", "recursive", "active_directory"
258-
strategy.to_sym
268+
when "classic"
269+
GitHub::Ldap::MembershipValidators::Classic
270+
when "recursive"
271+
GitHub::Ldap::MembershipValidators::Recursive
272+
when "active_directory"
273+
GitHub::Ldap::MembershipValidators::ActiveDirectory
259274
else
260-
:detect
275+
# fallback to detection, defaulting to recursive strategy
276+
if active_directory_capability?
277+
GitHub::Ldap::MembershipValidators::ActiveDirectory
278+
else
279+
GitHub::Ldap::MembershipValidators::Recursive
280+
end
261281
end
262282
end
263283

264284
# Internal: Configure the member search strategy.
265285
#
266-
# Used by GitHub::Ldap::MemberSearch::Detect to force a specific strategy
267-
# (instead of detecting the host capabilities and deciding at runtime).
268286
#
269-
# If `strategy` is not provided, or doesn't match a known strategy,
270-
# defaults to `:detect`. Otherwise the configured strategy is selected.
287+
# If no known strategy is provided, detects ActiveDirectory capabilities or
288+
# falls back to the Recursive strategy by default.
271289
#
272-
# Returns the selected strategy Symbol.
290+
# Returns the selected strategy Class.
273291
def configure_member_search_strategy(strategy = nil)
274292
@member_search_strategy =
275-
case strategy.to_s
276-
when "classic", "recursive"
277-
strategy.to_sym
278-
else
279-
:detect
280-
end
293+
case strategy.to_s
294+
when "classic"
295+
GitHub::Ldap::MemberSearch::Classic
296+
when "recursive"
297+
GitHub::Ldap::MemberSearch::Recursive
298+
when "active_directory"
299+
GitHub::Ldap::MemberSearch::ActiveDirectory
300+
else
301+
# fallback to detection, defaulting to recursive strategy
302+
if active_directory_capability?
303+
GitHub::Ldap::MemberSearch::ActiveDirectory
304+
else
305+
GitHub::Ldap::MemberSearch::Recursive
306+
end
307+
end
308+
end
309+
310+
# Internal: Detect whether the LDAP host is an ActiveDirectory server.
311+
#
312+
# See: http://msdn.microsoft.com/en-us/library/cc223359.aspx.
313+
#
314+
# Returns true if the host is an ActiveDirectory server, false otherwise.
315+
def active_directory_capability?
316+
capabilities[:supportedcapabilities].include?(ACTIVE_DIRECTORY_V61_R2_OID)
281317
end
318+
private :active_directory_capability?
282319
end
283320
end

lib/github/ldap/capabilities.rb

Lines changed: 0 additions & 24 deletions
This file was deleted.

lib/github/ldap/member_search.rb

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,4 @@
11
require 'github/ldap/member_search/base'
2-
require 'github/ldap/member_search/detect'
32
require 'github/ldap/member_search/classic'
43
require 'github/ldap/member_search/recursive'
54
require 'github/ldap/member_search/active_directory'
6-
7-
module GitHub
8-
class Ldap
9-
# Provides various strategies for member lookup.
10-
#
11-
# For example:
12-
#
13-
# group = domain.groups(%w(Engineering)).first
14-
# strategy = GitHub::Ldap::MemberSearch::Recursive.new(ldap)
15-
# strategy.perform(group) #=> [#<Net::LDAP::Entry>]
16-
#
17-
module MemberSearch
18-
# Internal: Mapping of strategy name to class.
19-
STRATEGIES = {
20-
:classic => GitHub::Ldap::MemberSearch::Classic,
21-
:recursive => GitHub::Ldap::MemberSearch::Recursive,
22-
:active_directory => GitHub::Ldap::MemberSearch::ActiveDirectory
23-
}
24-
end
25-
end
26-
end

lib/github/ldap/member_search/detect.rb

Lines changed: 0 additions & 71 deletions
This file was deleted.
Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,4 @@
11
require 'github/ldap/membership_validators/base'
2-
require 'github/ldap/membership_validators/detect'
32
require 'github/ldap/membership_validators/classic'
43
require 'github/ldap/membership_validators/recursive'
54
require 'github/ldap/membership_validators/active_directory'
6-
7-
module GitHub
8-
class Ldap
9-
# Provides various strategies for validating membership.
10-
#
11-
# For example:
12-
#
13-
# groups = domain.groups(%w(Engineering))
14-
# validator = GitHub::Ldap::MembershipValidators::Classic.new(ldap, groups)
15-
# validator.perform(entry) #=> true
16-
#
17-
module MembershipValidators
18-
# Internal: Mapping of strategy name to class.
19-
STRATEGIES = {
20-
:classic => GitHub::Ldap::MembershipValidators::Classic,
21-
:recursive => GitHub::Ldap::MembershipValidators::Recursive,
22-
:active_directory => GitHub::Ldap::MembershipValidators::ActiveDirectory
23-
}
24-
end
25-
end
26-
end

lib/github/ldap/membership_validators/detect.rb

Lines changed: 0 additions & 53 deletions
This file was deleted.

0 commit comments

Comments
 (0)