omniauth-ldap 1.0.2 → 1.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- omniauth-ldap (1.0.1)
4
+ omniauth-ldap (1.0.2)
5
5
  net-ldap (~> 0.2.2)
6
6
  omniauth (~> 1.0)
7
7
  pyu-ruby-sasl (~> 0.0.3.1)
@@ -29,7 +29,7 @@ GEM
29
29
  ruby_core_source (>= 0.1.4)
30
30
  multi_json (1.0.3)
31
31
  net-ldap (0.2.2)
32
- omniauth (1.0.0)
32
+ omniauth (1.0.1)
33
33
  hashie (~> 1.2)
34
34
  rack
35
35
  pyu-ruby-sasl (0.0.3.3)
@@ -26,18 +26,20 @@ module OmniAuth
26
26
 
27
27
  attr_accessor :bind_dn, :password
28
28
  attr_reader :connection, :uid, :base, :auth
29
-
30
- def initialize(configuration={})
31
- @configuration = configuration.dup
32
- @configuration[:allow_anonymous] ||= false
33
- @logger = @configuration.delete(:logger)
29
+ def self.validate(configuration={})
34
30
  message = []
35
31
  MUST_HAVE_KEYS.each do |name|
36
- message << name if configuration[name].nil?
32
+ message << name if configuration[name].nil?
37
33
  end
38
34
  raise ArgumentError.new(message.join(",") +" MUST be provided") unless message.empty?
35
+ end
36
+ def initialize(configuration={})
37
+ Adaptor.validate(configuration)
38
+ @configuration = configuration.dup
39
+ @configuration[:allow_anonymous] ||= false
40
+ @logger = @configuration.delete(:logger)
39
41
  VALID_ADAPTER_CONFIGURATION_KEYS.each do |name|
40
- instance_variable_set("@#{name}", configuration[name])
42
+ instance_variable_set("@#{name}", @configuration[name])
41
43
  end
42
44
  method = ensure_method(@method)
43
45
  config = {
@@ -1,5 +1,5 @@
1
1
  module OmniAuth
2
2
  module LDAP
3
- VERSION = "1.0.2"
3
+ VERSION = "1.0.3"
4
4
  end
5
5
  end
@@ -3,7 +3,6 @@ require 'omniauth'
3
3
  module OmniAuth
4
4
  module Strategies
5
5
  class LDAP
6
- class MissingCredentialsError < StandardError; end
7
6
  include OmniAuth::Strategy
8
7
  @@config = {
9
8
  'name' => 'cn',
@@ -25,11 +24,9 @@ module OmniAuth
25
24
  option :method, :plain
26
25
  option :uid, 'sAMAccountName'
27
26
  option :name_proc, lambda {|n| n}
28
- def initialize(app, *args, &block)
29
- super
30
- @adaptor = OmniAuth::LDAP::Adaptor.new @options
31
- end
27
+
32
28
  def request_phase
29
+ OmniAuth::LDAP::Adaptor.validate @options
33
30
  f = OmniAuth::Form.new(:title => (options[:title] || "LDAP Authentication"), :url => callback_path)
34
31
  f.text_field 'Login', 'username'
35
32
  f.password_field 'Password', 'password'
@@ -38,13 +35,15 @@ module OmniAuth
38
35
  end
39
36
 
40
37
  def callback_phase
41
- raise MissingCredentialsError.new("Missing login credentials") if request['username'].nil? || request['password'].nil?
38
+ @adaptor = OmniAuth::LDAP::Adaptor.new @options
39
+
40
+ return fail!(:missing_credentials) if missing_credentials?
42
41
  begin
43
- @ldap_user_info = @adaptor.bind_as(:filter => Net::LDAP::Filter.eq(@adaptor.uid, @options[:name_proc].call(request['username'])),:size => 1, :password => request['password'])
44
- return fail!(:invalid_credentials) if !@ldap_user_info
42
+ @ldap_user_info = @adaptor.bind_as(:filter => Net::LDAP::Filter.eq(@adaptor.uid, @options[:name_proc].call(request['username'])),:size => 1, :password => request['password'])
43
+ return fail!(:invalid_credentials) if !@ldap_user_info
45
44
 
46
- @user_info = self.class.map_user(@@config, @ldap_user_info)
47
- super
45
+ @user_info = self.class.map_user(@@config, @ldap_user_info)
46
+ super
48
47
  rescue Exception => e
49
48
  return fail!(:ldap_error, e)
50
49
  end
@@ -64,23 +63,29 @@ module OmniAuth
64
63
  user = {}
65
64
  mapper.each do |key, value|
66
65
  case value
67
- when String
68
- user[key] = object[value.downcase.to_sym].first if object[value.downcase.to_sym]
69
- when Array
70
- value.each {|v| (user[key] = object[v.downcase.to_sym].first; break;) if object[v.downcase.to_sym]}
71
- when Hash
72
- value.map do |key1, value1|
73
- pattern = key1.dup
74
- value1.each_with_index do |v,i|
75
- part = ''; v.collect(&:downcase).collect(&:to_sym).each {|v1| (part = object[v1].first; break;) if object[v1]}
76
- pattern.gsub!("%#{i}",part||'')
77
- end
78
- user[key] = pattern
66
+ when String
67
+ user[key] = object[value.downcase.to_sym].first if object[value.downcase.to_sym]
68
+ when Array
69
+ value.each {|v| (user[key] = object[v.downcase.to_sym].first; break;) if object[v.downcase.to_sym]}
70
+ when Hash
71
+ value.map do |key1, value1|
72
+ pattern = key1.dup
73
+ value1.each_with_index do |v,i|
74
+ part = ''; v.collect(&:downcase).collect(&:to_sym).each {|v1| (part = object[v1].first; break;) if object[v1]}
75
+ pattern.gsub!("%#{i}",part||'')
79
76
  end
77
+ user[key] = pattern
80
78
  end
79
+ end
81
80
  end
82
81
  user
83
82
  end
83
+
84
+ protected
85
+
86
+ def missing_credentials?
87
+ request['username'].nil? or request['username'].empty? or request['password'].nil? or request['password'].empty?
88
+ end # missing_credentials?
84
89
  end
85
90
  end
86
91
  end
@@ -2,13 +2,13 @@ require 'spec_helper'
2
2
  describe "OmniAuth::LDAP::Adaptor" do
3
3
 
4
4
  describe 'initialize' do
5
-
6
5
  it 'should throw exception when must have field is not set' do
7
6
  #[:host, :port, :method, :bind_dn]
8
- lambda { OmniAuth::LDAP::Adaptor.new({host: "192.168.1.145", method: 'plain'})}.should raise_error(ArgumentError)
7
+ lambda { OmniAuth::LDAP::Adaptor.new({host: "192.168.1.145", method: 'plain'})}.should raise_error(ArgumentError)
9
8
  end
9
+
10
10
  it 'should throw exception when method is not supported' do
11
- lambda { OmniAuth::LDAP::Adaptor.new({host: "192.168.1.145", method: 'myplain', uid: 'uid', port: 389, base: 'dc=com'})}.should raise_error(OmniAuth::LDAP::Adaptor::ConfigurationError)
11
+ lambda { OmniAuth::LDAP::Adaptor.new({host: "192.168.1.145", method: 'myplain', uid: 'uid', port: 389, base: 'dc=com'})}.should raise_error(OmniAuth::LDAP::Adaptor::ConfigurationError)
12
12
  end
13
13
 
14
14
  it 'should setup ldap connection with anonymous' do
@@ -17,54 +17,59 @@ describe "OmniAuth::LDAP::Adaptor" do
17
17
  adaptor.connection.host.should == '192.168.1.145'
18
18
  adaptor.connection.port.should == 389
19
19
  adaptor.connection.base.should == 'dc=intridea, dc=com'
20
- adaptor.connection.instance_variable_get('@auth').should == {:method => :anonymous, :username => nil, :password => nil}
20
+ adaptor.connection.instance_variable_get('@auth').should == {:method => :anonymous, :username => nil, :password => nil}
21
21
  end
22
+
22
23
  it 'should setup ldap connection with simple' do
23
24
  adaptor = OmniAuth::LDAP::Adaptor.new({host: "192.168.1.145", method: 'plain', base: 'dc=intridea, dc=com', port: 389, uid: 'sAMAccountName', bind_dn: 'bind_dn', password: 'password'})
24
25
  adaptor.connection.should_not == nil
25
26
  adaptor.connection.host.should == '192.168.1.145'
26
27
  adaptor.connection.port.should == 389
27
28
  adaptor.connection.base.should == 'dc=intridea, dc=com'
28
- adaptor.connection.instance_variable_get('@auth').should == {:method => :simple, :username => 'bind_dn', :password => 'password'}
29
- end
29
+ adaptor.connection.instance_variable_get('@auth').should == {:method => :simple, :username => 'bind_dn', :password => 'password'}
30
+ end
31
+
30
32
  it 'should setup ldap connection with sasl-md5' do
31
33
  adaptor = OmniAuth::LDAP::Adaptor.new({host: "192.168.1.145", method: 'plain', base: 'dc=intridea, dc=com', port: 389, uid: 'sAMAccountName', try_sasl: true, sasl_mechanisms: ["DIGEST-MD5"], bind_dn: 'bind_dn', password: 'password'})
32
34
  adaptor.connection.should_not == nil
33
35
  adaptor.connection.host.should == '192.168.1.145'
34
36
  adaptor.connection.port.should == 389
35
37
  adaptor.connection.base.should == 'dc=intridea, dc=com'
36
- adaptor.connection.instance_variable_get('@auth')[:method].should == :sasl
37
- adaptor.connection.instance_variable_get('@auth')[:mechanism].should == 'DIGEST-MD5'
38
- adaptor.connection.instance_variable_get('@auth')[:initial_credential].should == ''
39
- adaptor.connection.instance_variable_get('@auth')[:challenge_response].should_not be_nil
38
+ adaptor.connection.instance_variable_get('@auth')[:method].should == :sasl
39
+ adaptor.connection.instance_variable_get('@auth')[:mechanism].should == 'DIGEST-MD5'
40
+ adaptor.connection.instance_variable_get('@auth')[:initial_credential].should == ''
41
+ adaptor.connection.instance_variable_get('@auth')[:challenge_response].should_not be_nil
40
42
  end
43
+
41
44
  it 'should setup ldap connection with sasl-gss' do
42
45
  adaptor = OmniAuth::LDAP::Adaptor.new({host: "192.168.1.145", method: 'plain', base: 'dc=intridea, dc=com', port: 389, uid: 'sAMAccountName', try_sasl: true, sasl_mechanisms: ["GSS-SPNEGO"], bind_dn: 'bind_dn', password: 'password'})
43
46
  adaptor.connection.should_not == nil
44
47
  adaptor.connection.host.should == '192.168.1.145'
45
48
  adaptor.connection.port.should == 389
46
49
  adaptor.connection.base.should == 'dc=intridea, dc=com'
47
- adaptor.connection.instance_variable_get('@auth')[:method].should == :sasl
48
- adaptor.connection.instance_variable_get('@auth')[:mechanism].should == 'GSS-SPNEGO'
49
- adaptor.connection.instance_variable_get('@auth')[:initial_credential].should =~ /^NTLMSSP/
50
- adaptor.connection.instance_variable_get('@auth')[:challenge_response].should_not be_nil
50
+ adaptor.connection.instance_variable_get('@auth')[:method].should == :sasl
51
+ adaptor.connection.instance_variable_get('@auth')[:mechanism].should == 'GSS-SPNEGO'
52
+ adaptor.connection.instance_variable_get('@auth')[:initial_credential].should =~ /^NTLMSSP/
53
+ adaptor.connection.instance_variable_get('@auth')[:challenge_response].should_not be_nil
51
54
  end
52
55
  end
53
-
56
+
54
57
  describe 'bind_as' do
55
58
  let(:args) { {:filter => Net::LDAP::Filter.eq('sAMAccountName', 'username'), :password => 'password', :size => 1} }
56
59
  let(:rs) { Struct.new(:dn).new('new dn') }
60
+
57
61
  it 'should bind simple' do
58
62
  adaptor = OmniAuth::LDAP::Adaptor.new({host: "192.168.1.126", method: 'plain', base: 'dc=score, dc=local', port: 389, uid: 'sAMAccountName', bind_dn: 'bind_dn', password: 'password'})
59
63
  adaptor.connection.should_receive(:open).and_yield(adaptor.connection)
60
- adaptor.connection.should_receive(:search).with(args).and_return([rs])
64
+ adaptor.connection.should_receive(:search).with(args).and_return([rs])
61
65
  adaptor.connection.should_receive(:bind).with({:username => 'new dn', :password => args[:password], :method => :simple}).and_return(true)
62
66
  adaptor.bind_as(args).should == rs
63
67
  end
68
+
64
69
  it 'should bind sasl' do
65
70
  adaptor = OmniAuth::LDAP::Adaptor.new({host: "192.168.1.145", method: 'plain', base: 'dc=intridea, dc=com', port: 389, uid: 'sAMAccountName', try_sasl: true, sasl_mechanisms: ["GSS-SPNEGO"], bind_dn: 'bind_dn', password: 'password'})
66
71
  adaptor.connection.should_receive(:open).and_yield(adaptor.connection)
67
- adaptor.connection.should_receive(:search).with(args).and_return([rs])
72
+ adaptor.connection.should_receive(:search).with(args).and_return([rs])
68
73
  adaptor.connection.should_receive(:bind).and_return(true)
69
74
  adaptor.bind_as(args).should == rs
70
75
  end
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
  describe "OmniAuth::Strategies::LDAP" do
3
- # :title => "My LDAP",
3
+ # :title => "My LDAP",
4
4
  # :host => '10.101.10.1',
5
5
  # :port => 389,
6
6
  # :method => :plain,
@@ -8,17 +8,18 @@ describe "OmniAuth::Strategies::LDAP" do
8
8
  # :uid => 'sAMAccountName',
9
9
  # :name_proc => Proc.new {|name| name.gsub(/@.*$/,'')}
10
10
  # :bind_dn => 'default_bind_dn'
11
- # :password => 'password'
12
- class MyLdapProvider < OmniAuth::Strategies::LDAP; end
13
- def app
11
+ # :password => 'password'
12
+ class MyLdapProvider < OmniAuth::Strategies::LDAP; end
13
+
14
+ let(:app) do
14
15
  Rack::Builder.new {
15
16
  use OmniAuth::Test::PhonySession
16
- use MyLdapProvider, :name => 'ldap', :title => 'MyLdap Form', :host => '192.168.1.145', :base => 'dc=score, dc=local', :name_proc => Proc.new {|name| name.gsub(/@.*$/,'')}
17
+ use MyLdapProvider, :name => 'ldap', :title => 'MyLdap Form', :host => '192.168.1.145', :base => 'dc=score, dc=local', :name_proc => Proc.new {|name| name.gsub(/@.*$/,'')}
17
18
  run lambda { |env| [404, {'Content-Type' => 'text/plain'}, [env.key?('omniauth.auth').to_s]] }
18
19
  }.to_app
19
20
  end
20
21
 
21
- def session
22
+ let(:session) do
22
23
  last_request.env['rack.session']
23
24
  end
24
25
 
@@ -44,7 +45,6 @@ describe "OmniAuth::Strategies::LDAP" do
44
45
  it 'should have a label of the form title' do
45
46
  last_response.body.scan('MyLdap Form').size.should > 1
46
47
  end
47
-
48
48
  end
49
49
 
50
50
  describe 'post /auth/ldap/callback' do
@@ -52,40 +52,101 @@ describe "OmniAuth::Strategies::LDAP" do
52
52
  @adaptor = mock(OmniAuth::LDAP::Adaptor, {:uid => 'ping'})
53
53
  OmniAuth::LDAP::Adaptor.stub(:new).and_return(@adaptor)
54
54
  end
55
+
55
56
  context 'failure' do
56
- before(:each) do
57
- @adaptor.stub(:bind_as).and_return(false)
58
- end
59
- it 'should raise MissingCredentialsError' do
60
- lambda{post('/auth/ldap/callback', {})}.should raise_error OmniAuth::Strategies::LDAP::MissingCredentialsError
57
+ before(:each) do
58
+ @adaptor.stub(:bind_as).and_return(false)
61
59
  end
62
- it 'should redirect to error page' do
63
- post('/auth/ldap/callback', {:username => 'ping', :password => 'password'})
64
- last_response.should be_redirect
65
- last_response.headers['Location'].should =~ %r{invalid_credentials}
60
+
61
+ context "when username is not preset" do
62
+ it 'should redirect to error page' do
63
+ post('/auth/ldap/callback', {})
64
+
65
+ last_response.should be_redirect
66
+ last_response.headers['Location'].should =~ %r{missing_credentials}
67
+ end
66
68
  end
67
- it 'should redirect to error page when there is exception' do
68
- @adaptor.stub(:bind_as).and_throw(Exception.new('connection_error'))
69
- post('/auth/ldap/callback', {:username => 'ping', :password => 'password'})
70
- last_response.should be_redirect
71
- last_response.headers['Location'].should =~ %r{ldap_error}
69
+
70
+ context "when username is empty" do
71
+ it 'should redirect to error page' do
72
+ post('/auth/ldap/callback', {:username => ""})
73
+
74
+ last_response.should be_redirect
75
+ last_response.headers['Location'].should =~ %r{missing_credentials}
76
+ end
77
+ end
78
+
79
+ context "when username is present" do
80
+ context "and password is not preset" do
81
+ it 'should redirect to error page' do
82
+ post('/auth/ldap/callback', {:username => "ping"})
83
+
84
+ last_response.should be_redirect
85
+ last_response.headers['Location'].should =~ %r{missing_credentials}
86
+ end
87
+ end
88
+
89
+ context "and password is empty" do
90
+ it 'should redirect to error page' do
91
+ post('/auth/ldap/callback', {:username => "ping", :password => ""})
92
+
93
+ last_response.should be_redirect
94
+ last_response.headers['Location'].should =~ %r{missing_credentials}
95
+ end
96
+ end
97
+ end
98
+
99
+ context "when username and password are present" do
100
+ context "and bind on LDAP server failed" do
101
+ it 'should redirect to error page' do
102
+ post('/auth/ldap/callback', {:username => 'ping', :password => 'password'})
103
+
104
+ last_response.should be_redirect
105
+ last_response.headers['Location'].should =~ %r{invalid_credentials}
106
+ end
107
+ end
108
+
109
+ context "and communication with LDAP server caused an exception" do
110
+ before :each do
111
+ @adaptor.stub(:bind_as).and_throw(Exception.new('connection_error'))
112
+ end
113
+
114
+ it 'should redirect to error page' do
115
+ post('/auth/ldap/callback', {:username => "ping", :password => "password"})
116
+
117
+ last_response.should be_redirect
118
+ last_response.headers['Location'].should =~ %r{ldap_error}
119
+ end
120
+ end
72
121
  end
73
122
  end
74
-
123
+
75
124
  context 'success' do
76
125
  let(:auth_hash){ last_request.env['omniauth.auth'] }
126
+
77
127
  before(:each) do
78
- @adaptor.stub(:bind_as).and_return({:dn => ['cn=ping, dc=intridea, dc=com'], :mail => ['ping@intridea.com'], :givenname => ['Ping'], :sn => ['Yu'],
79
- :telephonenumber => ['555-555-5555'], :mobile => ['444-444-4444'], :uid => ['ping'], :title => ['dev'], :address =>[ 'k street'],
80
- :l => ['Washington'], :st => ['DC'], :co => ["U.S.A"], :postofficebox => ['20001'], :wwwhomepage => ['www.intridea.com'],
81
- :jpegphoto => ['http://www.intridea.com/ping.jpg'], :description => ['omniauth-ldap']})
128
+ @adaptor.stub(:bind_as).and_return({
129
+ :dn => ['cn=ping, dc=intridea, dc=com'],
130
+ :mail => ['ping@intridea.com'],
131
+ :givenname => ['Ping'], :sn => ['Yu'],
132
+ :telephonenumber => ['555-555-5555'],
133
+ :mobile => ['444-444-4444'],
134
+ :uid => ['ping'],
135
+ :title => ['dev'],
136
+ :address =>[ 'k street'],
137
+ :l => ['Washington'], :st => ['DC'], :co => ["U.S.A"], :postofficebox => ['20001'],
138
+ :wwwhomepage => ['www.intridea.com'],
139
+ :jpegphoto => ['http://www.intridea.com/ping.jpg'],
140
+ :description => ['omniauth-ldap']})
141
+
82
142
  post('/auth/ldap/callback', {:username => 'ping', :password => 'password'})
83
143
  end
84
-
85
- it 'should raise MissingCredentialsError' do
86
- should_not raise_error OmniAuth::Strategies::LDAP::MissingCredentialsError
144
+
145
+ it 'should not redirect to error page' do
146
+ last_response.should_not be_redirect
87
147
  end
88
- it 'should map user info' do
148
+
149
+ it 'should map user info to Auth Hash' do
89
150
  auth_hash.uid.should == 'cn=ping, dc=intridea, dc=com'
90
151
  auth_hash.info.email.should == 'ping@intridea.com'
91
152
  auth_hash.info.first_name.should == 'Ping'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: omniauth-ldap
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-17 00:00:00.000000000Z
12
+ date: 2013-01-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: omniauth
16
- requirement: &70232010172840 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,15 @@ dependencies:
21
21
  version: '1.0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70232010172840
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '1.0'
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: net-ldap
27
- requirement: &70232010172340 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
35
  - - ~>
@@ -32,10 +37,15 @@ dependencies:
32
37
  version: 0.2.2
33
38
  type: :runtime
34
39
  prerelease: false
35
- version_requirements: *70232010172340
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 0.2.2
36
46
  - !ruby/object:Gem::Dependency
37
47
  name: pyu-ruby-sasl
38
- requirement: &70232010171880 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
39
49
  none: false
40
50
  requirements:
41
51
  - - ~>
@@ -43,10 +53,15 @@ dependencies:
43
53
  version: 0.0.3.1
44
54
  type: :runtime
45
55
  prerelease: false
46
- version_requirements: *70232010171880
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 0.0.3.1
47
62
  - !ruby/object:Gem::Dependency
48
63
  name: rubyntlm
49
- requirement: &70232010171420 !ruby/object:Gem::Requirement
64
+ requirement: !ruby/object:Gem::Requirement
50
65
  none: false
51
66
  requirements:
52
67
  - - ~>
@@ -54,10 +69,15 @@ dependencies:
54
69
  version: 0.1.1
55
70
  type: :runtime
56
71
  prerelease: false
57
- version_requirements: *70232010171420
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 0.1.1
58
78
  - !ruby/object:Gem::Dependency
59
79
  name: rspec
60
- requirement: &70232010170960 !ruby/object:Gem::Requirement
80
+ requirement: !ruby/object:Gem::Requirement
61
81
  none: false
62
82
  requirements:
63
83
  - - ~>
@@ -65,10 +85,15 @@ dependencies:
65
85
  version: '2.7'
66
86
  type: :development
67
87
  prerelease: false
68
- version_requirements: *70232010170960
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: '2.7'
69
94
  - !ruby/object:Gem::Dependency
70
95
  name: simplecov
71
- requirement: &70232010170580 !ruby/object:Gem::Requirement
96
+ requirement: !ruby/object:Gem::Requirement
72
97
  none: false
73
98
  requirements:
74
99
  - - ! '>='
@@ -76,10 +101,15 @@ dependencies:
76
101
  version: '0'
77
102
  type: :development
78
103
  prerelease: false
79
- version_requirements: *70232010170580
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
80
110
  - !ruby/object:Gem::Dependency
81
111
  name: rack-test
82
- requirement: &70232010170120 !ruby/object:Gem::Requirement
112
+ requirement: !ruby/object:Gem::Requirement
83
113
  none: false
84
114
  requirements:
85
115
  - - ! '>='
@@ -87,10 +117,15 @@ dependencies:
87
117
  version: '0'
88
118
  type: :development
89
119
  prerelease: false
90
- version_requirements: *70232010170120
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
91
126
  - !ruby/object:Gem::Dependency
92
127
  name: libnotify
93
- requirement: &70232010169700 !ruby/object:Gem::Requirement
128
+ requirement: !ruby/object:Gem::Requirement
94
129
  none: false
95
130
  requirements:
96
131
  - - ! '>='
@@ -98,10 +133,15 @@ dependencies:
98
133
  version: '0'
99
134
  type: :development
100
135
  prerelease: false
101
- version_requirements: *70232010169700
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
102
142
  - !ruby/object:Gem::Dependency
103
143
  name: ruby-debug19
104
- requirement: &70232010169280 !ruby/object:Gem::Requirement
144
+ requirement: !ruby/object:Gem::Requirement
105
145
  none: false
106
146
  requirements:
107
147
  - - ! '>='
@@ -109,7 +149,12 @@ dependencies:
109
149
  version: '0'
110
150
  type: :development
111
151
  prerelease: false
112
- version_requirements: *70232010169280
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ! '>='
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
113
158
  description: A LDAP strategy for OmniAuth.
114
159
  email:
115
160
  - ping@intridea.com
@@ -152,7 +197,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
152
197
  version: '0'
153
198
  requirements: []
154
199
  rubyforge_project:
155
- rubygems_version: 1.8.10
200
+ rubygems_version: 1.8.24
156
201
  signing_key:
157
202
  specification_version: 3
158
203
  summary: A LDAP strategy for OmniAuth.