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 CHANGED
@@ -1,4 +1,5 @@
1
- .rvmrc
1
+ .ruby-version
2
+ .ruby-gemset
2
3
  # rcov generated
3
4
  coverage
4
5
 
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- omniauth_crowd (2.1.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.0.3)
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, 'No Credentials') unless creds
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 make_user_group_request
53
- http = Net::HTTP.new(@user_group_uri.host, @user_group_uri.port)
54
- http.use_ssl = @user_group_uri.port == 443 || @user_group_uri.instance_of?(URI::HTTPS)
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 = Net::HTTP::Get.new("#{@user_group_uri.path}?#{@user_group_uri.query}")
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
- http = Net::HTTP.new(@authentiction_uri.host, @authentiction_uri.port)
65
- http.use_ssl = @authentiction_uri.port == 443 || @authentiction_uri.instance_of?(URI::HTTPS)
66
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE if http.use_ssl? && @configuration.disable_ssl_verification?
67
- http.start do |c|
68
- req = Net::HTTP::Post.new("#{@authentiction_uri.path}?#{@authentiction_uri.query}")
69
- req.body = AUTHENTICATION_REQUEST_BODY % @password
70
- req.basic_auth @configuration.crowd_application_name, @configuration.crowd_password
71
- req.add_field 'Content-Type', 'text/xml'
72
- http.request(req)
73
- end
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
@@ -1,5 +1,5 @@
1
1
  module OmniAuth
2
2
  module Crowd
3
- VERSION = "2.1.1"
3
+ VERSION = "2.1.2"
4
4
  end
5
5
  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, :application_name=>@application_name, :application_password=>@application_password}]
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
- describe 'GET /auth/crowd' do
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
- get '/auth/crowd'
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
- it 'should show the login form' do
18
- last_response.should be_ok
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
- describe 'POST /auth/crowd' do
72
+ context "when using authentication endpoint with special characters" do
23
73
  before do
24
- post '/auth/crowd', :username=>'foo', :password=>'bar'
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 redirect to callback' do
28
- last_response.should be_redirect
29
- last_response.headers['Location'].should == 'http://example.org/auth/crowd/callback'
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&amp;&lt;xml&gt;' }
30
81
  end
31
82
  end
32
83
 
33
- describe 'GET /auth/crowd/callback without any credentials' do
84
+ context "when using session endpoint" do
34
85
  before do
35
- get '/auth/crowd/callback'
36
- end
37
- it 'should fail' do
38
- last_response.should be_redirect
39
- last_response.headers['Location'].should =~ /no_credentials/
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
- describe 'GET /auth/crowd/callback with credentials can be successful' do
44
- before do
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
- describe 'GET /auth/crowd/callback with credentials will fail' do
67
- before do
68
- stub_request(:post, "https://bogus_app:bogus_app_password@crowd.example.org/rest/usermanagement/latest/authentication?username=foo").
69
- to_return(:code=>400)
70
- get '/auth/crowd/callback', nil, 'rack.session'=>{'omniauth.crowd'=> {"username"=>"foo", "password"=>"ba"}}
71
- end
72
- it 'should fail' do
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&amp;&lt;xml&gt;' and Nokogiri::XML(req.body).at_css("password").content == 'bar&amp;&lt;xml&gt;' }
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.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: 2012-03-24 00:00:00.000000000 Z
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: &2185215420 !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: *2185215420
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: &2185214920 !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: 1.4.4
33
38
  type: :runtime
34
39
  prerelease: false
35
- version_requirements: *2185214920
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: &2185214440 !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'
44
54
  type: :development
45
55
  prerelease: false
46
- version_requirements: *2185214440
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: &2185213960 !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'
55
70
  type: :development
56
71
  prerelease: false
57
- version_requirements: *2185213960
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: &2185213480 !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: '0'
66
86
  type: :development
67
87
  prerelease: false
68
- version_requirements: *2185213480
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: &2185213000 !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: 2.5.0
77
102
  type: :development
78
103
  prerelease: false
79
- version_requirements: *2185213000
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: &2185212520 !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: 1.3.4
88
118
  type: :development
89
119
  prerelease: false
90
- version_requirements: *2185212520
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: &2185212040 !ruby/object:Gem::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: *2185212040
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: -4177829934733577967
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: -4177829934733577967
191
+ hash: 4515462234693520699
151
192
  requirements: []
152
193
  rubyforge_project:
153
- rubygems_version: 1.8.10
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