omniauth-ldap 1.0.2 → 1.0.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.
- data/Gemfile.lock +2 -2
- data/lib/omniauth-ldap/adaptor.rb +9 -7
- data/lib/omniauth-ldap/version.rb +1 -1
- data/lib/omniauth/strategies/ldap.rb +27 -22
- data/spec/omniauth-ldap/adaptor_spec.rb +22 -17
- data/spec/omniauth/strategies/ldap_spec.rb +91 -30
- metadata +66 -21
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
omniauth-ldap (1.0.
|
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.
|
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
|
-
|
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 = {
|
@@ -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
|
-
|
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
|
-
|
38
|
+
@adaptor = OmniAuth::LDAP::Adaptor.new @options
|
39
|
+
|
40
|
+
return fail!(:missing_credentials) if missing_credentials?
|
42
41
|
begin
|
43
|
-
|
44
|
-
|
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
|
-
|
47
|
-
|
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
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
57
|
-
|
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
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
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
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
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({
|
79
|
-
|
80
|
-
|
81
|
-
|
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
|
86
|
-
should_not
|
144
|
+
|
145
|
+
it 'should not redirect to error page' do
|
146
|
+
last_response.should_not be_redirect
|
87
147
|
end
|
88
|
-
|
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.
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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.
|
200
|
+
rubygems_version: 1.8.24
|
156
201
|
signing_key:
|
157
202
|
specification_version: 3
|
158
203
|
summary: A LDAP strategy for OmniAuth.
|