omniauth_crowd 2.1.1 → 2.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -1
- data/Gemfile.lock +2 -2
- data/lib/omniauth/strategies/crowd.rb +1 -1
- data/lib/omniauth/strategies/crowd/configuration.rb +9 -1
- data/lib/omniauth/strategies/crowd/crowd_validator.rb +57 -15
- data/lib/omniauth_crowd/version.rb +1 -1
- data/spec/fixtures/session.xml +8 -0
- data/spec/omniauth/strategies/crowd_spec.rb +119 -49
- metadata +63 -21
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
omniauth_crowd (2.1.
|
4
|
+
omniauth_crowd (2.1.2)
|
5
5
|
nokogiri (>= 1.4.4)
|
6
6
|
omniauth (~> 1.0)
|
7
7
|
|
@@ -13,7 +13,7 @@ GEM
|
|
13
13
|
diff-lcs (1.1.3)
|
14
14
|
hashie (1.2.0)
|
15
15
|
nokogiri (1.5.2)
|
16
|
-
omniauth (1.
|
16
|
+
omniauth (1.1.1)
|
17
17
|
hashie (~> 1.2)
|
18
18
|
rack
|
19
19
|
rack (1.4.1)
|
@@ -32,7 +32,7 @@ module OmniAuth
|
|
32
32
|
|
33
33
|
def callback_phase
|
34
34
|
creds = session.delete 'omniauth.crowd'
|
35
|
-
return fail!(:no_credentials
|
35
|
+
return fail!(:no_credentials) unless creds
|
36
36
|
validator = CrowdValidator.new(@configuration, creds['username'], creds['password'])
|
37
37
|
@user_info = validator.user_info
|
38
38
|
|
@@ -4,12 +4,14 @@ module OmniAuth
|
|
4
4
|
module Strategies
|
5
5
|
class Crowd
|
6
6
|
class Configuration
|
7
|
+
DEFAULT_SESSION_URL = "%s/rest/usermanagement/latest/session"
|
7
8
|
DEFAULT_AUTHENTICATION_URL = "%s/rest/usermanagement/latest/authentication"
|
8
9
|
DEFAULT_USER_GROUP_URL = "%s/rest/usermanagement/latest/user/group/direct"
|
9
|
-
attr_reader :crowd_application_name, :crowd_password, :disable_ssl_verification, :include_users_groups
|
10
|
+
attr_reader :crowd_application_name, :crowd_password, :disable_ssl_verification, :include_users_groups, :use_sessions, :session_url
|
10
11
|
|
11
12
|
alias :"disable_ssl_verification?" :disable_ssl_verification
|
12
13
|
alias :"include_users_groups?" :include_users_groups
|
14
|
+
alias :"use_sessions?" :use_sessions
|
13
15
|
|
14
16
|
# @param [Hash] params configuration options
|
15
17
|
# @option params [String, nil] :crowd_server_url the Crowd server root URL; probably something like
|
@@ -50,10 +52,16 @@ module OmniAuth
|
|
50
52
|
end
|
51
53
|
@crowd_application_name = options[:application_name]
|
52
54
|
@crowd_password = options[:application_password]
|
55
|
+
@use_sessions = options[:use_sessions]
|
53
56
|
|
54
57
|
unless options.include?(:crowd_server_url) || options.include?(:crowd_authentication_url)
|
55
58
|
raise ArgumentError.new("Either :crowd_server_url or :crowd_authentication_url MUST be provided")
|
56
59
|
end
|
60
|
+
|
61
|
+
if @use_sessions
|
62
|
+
@session_url = options[:crowd_session_url] || DEFAULT_SESSION_URL % options[:crowd_server_url]
|
63
|
+
validate_is_url 'session URL', @session_url
|
64
|
+
end
|
57
65
|
@authentication_url = options[:crowd_authentication_url] || DEFAULT_AUTHENTICATION_URL % options[:crowd_server_url]
|
58
66
|
validate_is_url 'authentication URL', @authentication_url
|
59
67
|
@disable_ssl_verification = options[:disable_ssl_verification]
|
@@ -1,15 +1,21 @@
|
|
1
1
|
require 'nokogiri'
|
2
2
|
require 'net/http'
|
3
3
|
require 'net/https'
|
4
|
+
require 'rexml/text'
|
4
5
|
|
5
6
|
module OmniAuth
|
6
7
|
module Strategies
|
7
8
|
class Crowd
|
8
9
|
class CrowdValidator
|
10
|
+
SESSION_REQUEST_BODY = "<authentication-context>
|
11
|
+
<username>%s</username>
|
12
|
+
<password>%s</password>
|
13
|
+
</authentication-context>"
|
9
14
|
AUTHENTICATION_REQUEST_BODY = "<password><value>%s</value></password>"
|
10
15
|
def initialize(configuration, username, password)
|
11
16
|
@configuration, @username, @password = configuration, username, password
|
12
17
|
@authentiction_uri = URI.parse(@configuration.authentication_url(@username))
|
18
|
+
@session_uri = URI.parse(@configuration.session_url) if @configuration.use_sessions
|
13
19
|
@user_group_uri = @configuration.include_users_groups? ? URI.parse(@configuration.user_group_url(@username)) : nil
|
14
20
|
end
|
15
21
|
|
@@ -20,10 +26,27 @@ module OmniAuth
|
|
20
26
|
else
|
21
27
|
user_info_hash
|
22
28
|
end
|
29
|
+
|
30
|
+
if user_info_hash && @configuration.use_sessions?
|
31
|
+
user_info_hash = add_session!(user_info_hash)
|
32
|
+
end
|
33
|
+
|
23
34
|
user_info_hash
|
24
35
|
end
|
25
36
|
|
26
37
|
private
|
38
|
+
def add_session!(user_info_hash)
|
39
|
+
response = make_session_request
|
40
|
+
if response.kind_of?(Net::HTTPSuccess) && response.body
|
41
|
+
doc = Nokogiri::XML(response.body)
|
42
|
+
user_info_hash["sso_token"] = doc.xpath('//token/text()').to_s
|
43
|
+
else
|
44
|
+
OmniAuth.logger.send(:warn, "(crowd) [add_session!] response code: #{response.code.to_s}")
|
45
|
+
OmniAuth.logger.send(:warn, "(crowd) [add_session!] response body: #{response.body}")
|
46
|
+
end
|
47
|
+
user_info_hash
|
48
|
+
end
|
49
|
+
|
27
50
|
def add_user_groups!(user_info_hash)
|
28
51
|
response = make_user_group_request
|
29
52
|
unless response.code.to_i != 200 || response.body.nil? || response.body == ''
|
@@ -45,32 +68,51 @@ module OmniAuth
|
|
45
68
|
"email" => doc.xpath("//user/email/text()").to_s
|
46
69
|
}
|
47
70
|
else
|
71
|
+
OmniAuth.logger.send(:warn, "(crowd) [retrieve_user_info!] response code: #{response.code.to_s}")
|
72
|
+
OmniAuth.logger.send(:warn, "(crowd) [retrieve_user_info!] response body: #{response.body}")
|
48
73
|
nil
|
49
74
|
end
|
50
75
|
end
|
51
|
-
|
52
|
-
def
|
53
|
-
|
54
|
-
http
|
76
|
+
|
77
|
+
def make_request(uri, body=nil)
|
78
|
+
http_method = body.nil? ? Net::HTTP::Get : Net::HTTP::Post
|
79
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
80
|
+
http.use_ssl = uri.port == 443 || uri.instance_of?(URI::HTTPS)
|
55
81
|
http.verify_mode = OpenSSL::SSL::VERIFY_NONE if http.use_ssl? && @configuration.disable_ssl_verification?
|
56
82
|
http.start do |c|
|
57
|
-
req =
|
83
|
+
req = http_method.new(uri.query.nil? ? uri.path : "#{uri.path}?#{uri.query}")
|
84
|
+
req.body = body if body
|
58
85
|
req.basic_auth @configuration.crowd_application_name, @configuration.crowd_password
|
86
|
+
req.add_field 'Content-Type', 'text/xml'
|
59
87
|
http.request(req)
|
60
88
|
end
|
61
89
|
end
|
62
90
|
|
91
|
+
def make_user_group_request
|
92
|
+
make_request(@user_group_uri)
|
93
|
+
end
|
94
|
+
|
63
95
|
def make_authorization_request
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
96
|
+
make_request(@authentiction_uri, make_authentication_request_body(@password))
|
97
|
+
end
|
98
|
+
|
99
|
+
def make_session_request
|
100
|
+
make_request(@session_uri, make_session_request_body(@username, @password))
|
101
|
+
end
|
102
|
+
|
103
|
+
# create the body using Nokogiri so proper encoding of passwords can be ensured
|
104
|
+
def make_authentication_request_body(password)
|
105
|
+
request_body = Nokogiri::XML(AUTHENTICATION_REQUEST_BODY)
|
106
|
+
password_value = request_body.at_css "value"
|
107
|
+
password_value.content = REXML::Text.normalize(password)
|
108
|
+
return request_body.root.to_s # return the body without the xml header
|
109
|
+
end
|
110
|
+
|
111
|
+
def make_session_request_body(username,password)
|
112
|
+
request_body = Nokogiri::XML(SESSION_REQUEST_BODY)
|
113
|
+
request_body.at_css("username").content = REXML::Text.normalize(username)
|
114
|
+
request_body.at_css("password").content = REXML::Text.normalize(password)
|
115
|
+
return request_body.root.to_s
|
74
116
|
end
|
75
117
|
end
|
76
118
|
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
2
|
+
<session expand="user">
|
3
|
+
<token>rtk8eMvqq00EiGn5iJCMZQ00</token>
|
4
|
+
<user name="foo">
|
5
|
+
<link rel="self" href="http://crowd.example.org/crowd/rest/usermanagement/latest/user?username=foo"/>
|
6
|
+
</user>
|
7
|
+
<link rel="self" href="http://crowd.example.org/crowd/rest/usermanagement/latest/session/rtk8eMvqq00EiGn5iJCMZQ00"/>
|
8
|
+
</session>
|
@@ -1,77 +1,147 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
require 'nokogiri'
|
2
3
|
|
3
4
|
describe OmniAuth::Strategies::Crowd, :type=>:strategy do
|
4
5
|
include OmniAuth::Test::StrategyTestCase
|
6
|
+
@use_sessions = false
|
5
7
|
def strategy
|
6
8
|
@crowd_server_url ||= 'https://crowd.example.org'
|
7
9
|
@application_name ||= 'bogus_app'
|
8
10
|
@application_password ||= 'bogus_app_password'
|
9
|
-
[OmniAuth::Strategies::Crowd, {:crowd_server_url => @crowd_server_url,
|
11
|
+
[OmniAuth::Strategies::Crowd, {:crowd_server_url => @crowd_server_url,
|
12
|
+
:application_name => @application_name,
|
13
|
+
:application_password => @application_password,
|
14
|
+
:use_sessions => @use_sessions}]
|
10
15
|
end
|
11
16
|
|
12
|
-
|
17
|
+
describe 'GET /auth/crowd' do
|
18
|
+
before do
|
19
|
+
get '/auth/crowd'
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should show the login form' do
|
23
|
+
last_response.should be_ok
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe 'POST /auth/crowd' do
|
28
|
+
before do
|
29
|
+
post '/auth/crowd', :username=>'foo', :password=>'bar'
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should redirect to callback' do
|
33
|
+
last_response.should be_redirect
|
34
|
+
last_response.headers['Location'].should == 'http://example.org/auth/crowd/callback'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe 'GET /auth/crowd/callback without any credentials' do
|
39
|
+
before do
|
40
|
+
get '/auth/crowd/callback'
|
41
|
+
end
|
42
|
+
it 'should fail' do
|
43
|
+
last_response.should be_redirect
|
44
|
+
last_response.headers['Location'].should =~ /no_credentials/
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe 'GET /auth/crowd/callback with credentials can be successful' do
|
49
|
+
context "when using authentication endpoint" do
|
13
50
|
before do
|
14
|
-
|
51
|
+
stub_request(:post, "https://bogus_app:bogus_app_password@crowd.example.org/rest/usermanagement/latest/authentication?username=foo").
|
52
|
+
to_return(:body => File.read(File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'success.xml')))
|
53
|
+
stub_request(:get, "https://bogus_app:bogus_app_password@crowd.example.org/rest/usermanagement/latest/user/group/direct?username=foo").
|
54
|
+
to_return(:body => File.read(File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'groups.xml')))
|
55
|
+
get '/auth/crowd/callback', nil, 'rack.session'=>{'omniauth.crowd'=> {"username"=>"foo", "password"=>"ba"}}
|
15
56
|
end
|
16
|
-
|
17
|
-
|
18
|
-
|
57
|
+
it 'should call through to the master app' do
|
58
|
+
last_response.body.should == 'true'
|
59
|
+
end
|
60
|
+
it 'should have an auth hash' do
|
61
|
+
auth = last_request.env['omniauth.auth']
|
62
|
+
auth.should be_kind_of(Hash)
|
63
|
+
end
|
64
|
+
it 'should have good data' do
|
65
|
+
auth = last_request.env['omniauth.auth']['provider'].should == :crowd
|
66
|
+
auth = last_request.env['omniauth.auth']['uid'].should == 'foo'
|
67
|
+
auth = last_request.env['omniauth.auth']['user_info'].should be_kind_of(Hash)
|
68
|
+
auth = last_request.env['omniauth.auth']['user_info']['groups'].sort.should == ["Developers", "jira-users"].sort
|
19
69
|
end
|
20
70
|
end
|
21
71
|
|
22
|
-
|
72
|
+
context "when using authentication endpoint with special characters" do
|
23
73
|
before do
|
24
|
-
post
|
74
|
+
stub_request(:post, "https://bogus_app:bogus_app_password@crowd.example.org/rest/usermanagement/latest/authentication?username=foo")
|
75
|
+
get '/auth/crowd/callback', nil, 'rack.session'=>{'omniauth.crowd'=> {"username"=>"foo", "password"=>"bar&<xml>"}}
|
25
76
|
end
|
26
77
|
|
27
|
-
it 'should
|
28
|
-
|
29
|
-
|
78
|
+
it 'should escape special characters' do
|
79
|
+
WebMock.should have_requested(:post, 'https://bogus_app:bogus_app_password@crowd.example.org/rest/usermanagement/latest/authentication?username=foo').
|
80
|
+
with { |req| Nokogiri::XML(req.body).at_css("value").content == 'bar&<xml>' }
|
30
81
|
end
|
31
82
|
end
|
32
83
|
|
33
|
-
|
84
|
+
context "when using session endpoint" do
|
34
85
|
before do
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
86
|
+
@use_sessions = true
|
87
|
+
stub_request(:post, "https://bogus_app:bogus_app_password@crowd.example.org/rest/usermanagement/latest/authentication?username=foo").
|
88
|
+
to_return(:body => File.read(File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'success.xml')))
|
89
|
+
stub_request(:post, "https://bogus_app:bogus_app_password@crowd.example.org/rest/usermanagement/latest/session").
|
90
|
+
to_return(:status => 201, :body => File.read(File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'session.xml')))
|
91
|
+
stub_request(:get, "https://bogus_app:bogus_app_password@crowd.example.org/rest/usermanagement/latest/user/group/direct?username=foo").
|
92
|
+
to_return(:body => File.read(File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'groups.xml')))
|
93
|
+
get '/auth/crowd/callback', nil, 'rack.session'=>{'omniauth.crowd'=> {"username"=>"foo", "password"=>"ba"}}
|
40
94
|
end
|
41
|
-
end
|
42
95
|
|
43
|
-
|
44
|
-
|
45
|
-
stub_request(:post, "https://bogus_app:bogus_app_password@crowd.example.org/rest/usermanagement/latest/authentication?username=foo").
|
46
|
-
to_return(:body => File.read(File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'success.xml')))
|
47
|
-
stub_request(:get, "https://bogus_app:bogus_app_password@crowd.example.org/rest/usermanagement/latest/user/group/direct?username=foo").
|
48
|
-
to_return(:body => File.read(File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'groups.xml')))
|
49
|
-
get '/auth/crowd/callback', nil, 'rack.session'=>{'omniauth.crowd'=> {"username"=>"foo", "password"=>"ba"}}
|
50
|
-
end
|
51
|
-
it 'should call through to the master app' do
|
52
|
-
last_response.body.should == 'true'
|
53
|
-
end
|
54
|
-
it 'should have an auth hash' do
|
55
|
-
auth = last_request.env['omniauth.auth']
|
56
|
-
auth.should be_kind_of(Hash)
|
57
|
-
end
|
58
|
-
it 'should have good data' do
|
59
|
-
auth = last_request.env['omniauth.auth']['provider'].should == :crowd
|
60
|
-
auth = last_request.env['omniauth.auth']['uid'].should == 'foo'
|
61
|
-
auth = last_request.env['omniauth.auth']['user_info'].should be_kind_of(Hash)
|
62
|
-
auth = last_request.env['omniauth.auth']['user_info']['groups'].sort.should == ["Developers", "jira-users"].sort
|
63
|
-
end
|
96
|
+
after do
|
97
|
+
@use_sessions = false
|
64
98
|
end
|
65
99
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
last_response.should be_redirect
|
74
|
-
last_response.headers['Location'].should =~ /invalid_credentials/
|
75
|
-
end
|
100
|
+
it 'should call through to the master app' do
|
101
|
+
last_response.body.should == 'true'
|
102
|
+
end
|
103
|
+
|
104
|
+
it 'should have an auth hash' do
|
105
|
+
auth = last_request.env['omniauth.auth']
|
106
|
+
auth.should be_kind_of(Hash)
|
76
107
|
end
|
108
|
+
|
109
|
+
it 'should have good data' do
|
110
|
+
auth = last_request.env['omniauth.auth']['provider'].should == :crowd
|
111
|
+
auth = last_request.env['omniauth.auth']['uid'].should == 'foo'
|
112
|
+
auth = last_request.env['omniauth.auth']['user_info'].should be_kind_of(Hash)
|
113
|
+
auth = last_request.env['omniauth.auth']['user_info']['sso_token'].should == 'rtk8eMvqq00EiGn5iJCMZQ00'
|
114
|
+
auth = last_request.env['omniauth.auth']['user_info']['groups'].sort.should == ["Developers", "jira-users"].sort
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
context "when using session endpoint with special characters" do
|
120
|
+
before do
|
121
|
+
@use_sessions = true
|
122
|
+
stub_request(:post, "https://bogus_app:bogus_app_password@crowd.example.org/rest/usermanagement/latest/authentication?username=foo%26%3Cxml%3E").
|
123
|
+
to_return(:body => File.read(File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'success.xml')))
|
124
|
+
stub_request(:post, "https://bogus_app:bogus_app_password@crowd.example.org/rest/usermanagement/latest/session").
|
125
|
+
to_return(:status => 201, :body => File.read(File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'session.xml')))
|
126
|
+
stub_request(:get, "https://bogus_app:bogus_app_password@crowd.example.org/rest/usermanagement/latest/user/group/direct?username=foo%26%3Cxml%3E").
|
127
|
+
to_return(:body => File.read(File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'groups.xml')))
|
128
|
+
get '/auth/crowd/callback', nil, 'rack.session'=>{'omniauth.crowd'=> {"username"=>"foo&<xml>", "password"=>"bar&<xml>"}}
|
129
|
+
end
|
130
|
+
it 'should escape special characters' do
|
131
|
+
WebMock.should have_requested(:post, 'https://bogus_app:bogus_app_password@crowd.example.org/rest/usermanagement/latest/session').
|
132
|
+
with { |req| Nokogiri::XML(req.body).at_css("username").content == 'foo&<xml>' and Nokogiri::XML(req.body).at_css("password").content == 'bar&<xml>' }
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
describe 'GET /auth/crowd/callback with credentials will fail' do
|
137
|
+
before do
|
138
|
+
stub_request(:post, "https://bogus_app:bogus_app_password@crowd.example.org/rest/usermanagement/latest/authentication?username=foo").
|
139
|
+
to_return(:code=>400)
|
140
|
+
get '/auth/crowd/callback', nil, 'rack.session'=>{'omniauth.crowd'=> {"username"=>"foo", "password"=>"ba"}}
|
141
|
+
end
|
142
|
+
it 'should fail' do
|
143
|
+
last_response.should be_redirect
|
144
|
+
last_response.headers['Location'].should =~ /invalid_credentials/
|
145
|
+
end
|
146
|
+
end
|
77
147
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: omniauth_crowd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.
|
4
|
+
version: 2.1.2
|
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-08-13 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: nokogiri
|
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: 1.4.4
|
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: 1.4.4
|
36
46
|
- !ruby/object:Gem::Dependency
|
37
47
|
name: rack
|
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'
|
44
54
|
type: :development
|
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'
|
47
62
|
- !ruby/object:Gem::Dependency
|
48
63
|
name: rake
|
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'
|
55
70
|
type: :development
|
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'
|
58
78
|
- !ruby/object:Gem::Dependency
|
59
79
|
name: rack-test
|
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: '0'
|
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: '0'
|
69
94
|
- !ruby/object:Gem::Dependency
|
70
95
|
name: rspec
|
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: 2.5.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: 2.5.0
|
80
110
|
- !ruby/object:Gem::Dependency
|
81
111
|
name: webmock
|
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: 1.3.4
|
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: 1.3.4
|
91
126
|
- !ruby/object:Gem::Dependency
|
92
127
|
name: bundler
|
93
|
-
requirement:
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
94
129
|
none: false
|
95
130
|
requirements:
|
96
131
|
- - ! '>'
|
@@ -98,7 +133,12 @@ dependencies:
|
|
98
133
|
version: 1.0.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: 1.0.0
|
102
142
|
description: This is an OmniAuth provider for Atlassian Crowd's REST API. It allows
|
103
143
|
you to easily integrate your Rack application in with Atlassian Crowd.
|
104
144
|
email:
|
@@ -121,6 +161,7 @@ files:
|
|
121
161
|
- lib/omniauth_crowd/version.rb
|
122
162
|
- omniauth_crowd.gemspec
|
123
163
|
- spec/fixtures/groups.xml
|
164
|
+
- spec/fixtures/session.xml
|
124
165
|
- spec/fixtures/success.xml
|
125
166
|
- spec/omniauth/strategies/crowd_spec.rb
|
126
167
|
- spec/spec_helper.rb
|
@@ -138,7 +179,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
138
179
|
version: '0'
|
139
180
|
segments:
|
140
181
|
- 0
|
141
|
-
hash:
|
182
|
+
hash: 4515462234693520699
|
142
183
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
143
184
|
none: false
|
144
185
|
requirements:
|
@@ -147,15 +188,16 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
147
188
|
version: '0'
|
148
189
|
segments:
|
149
190
|
- 0
|
150
|
-
hash:
|
191
|
+
hash: 4515462234693520699
|
151
192
|
requirements: []
|
152
193
|
rubyforge_project:
|
153
|
-
rubygems_version: 1.8.
|
194
|
+
rubygems_version: 1.8.25
|
154
195
|
signing_key:
|
155
196
|
specification_version: 3
|
156
197
|
summary: An OmniAuth provider for Atlassian Crowd REST API
|
157
198
|
test_files:
|
158
199
|
- spec/fixtures/groups.xml
|
200
|
+
- spec/fixtures/session.xml
|
159
201
|
- spec/fixtures/success.xml
|
160
202
|
- spec/omniauth/strategies/crowd_spec.rb
|
161
203
|
- spec/spec_helper.rb
|