omniauth_crowd 2.1.1 → 2.1.2
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/.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
|