omniauth_crowd 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/Gemfile ADDED
@@ -0,0 +1,16 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem 'oa-core'
4
+ gem 'nokogiri'
5
+
6
+ # Add dependencies to develop your gem here.
7
+ # Include everything needed to run rake, tests, features, etc.
8
+ group :development do
9
+ gem 'rack'
10
+ gem 'rake'
11
+ gem 'rack-test'
12
+ gem 'rspec', '~> 2.5.0'
13
+ gem 'webmock', '~> 1.3.4'
14
+ gem "bundler", "~> 1.0.0"
15
+ gem "jeweler", "~> 1.5.2"
16
+ end
@@ -0,0 +1,43 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ addressable (2.2.4)
5
+ crack (0.1.8)
6
+ diff-lcs (1.1.2)
7
+ git (1.2.5)
8
+ jeweler (1.5.2)
9
+ bundler (~> 1.0.0)
10
+ git (>= 1.2.5)
11
+ rake
12
+ nokogiri (1.4.4)
13
+ oa-core (0.2.0)
14
+ rack (~> 1.1)
15
+ rack (1.2.2)
16
+ rack-test (0.5.7)
17
+ rack (>= 1.0)
18
+ rake (0.8.7)
19
+ rspec (2.5.0)
20
+ rspec-core (~> 2.5.0)
21
+ rspec-expectations (~> 2.5.0)
22
+ rspec-mocks (~> 2.5.0)
23
+ rspec-core (2.5.1)
24
+ rspec-expectations (2.5.0)
25
+ diff-lcs (~> 1.1.2)
26
+ rspec-mocks (2.5.0)
27
+ webmock (1.3.5)
28
+ addressable (>= 2.1.1)
29
+ crack (>= 0.1.7)
30
+
31
+ PLATFORMS
32
+ ruby
33
+
34
+ DEPENDENCIES
35
+ bundler (~> 1.0.0)
36
+ jeweler (~> 1.5.2)
37
+ nokogiri
38
+ oa-core
39
+ rack
40
+ rack-test
41
+ rake
42
+ rspec (~> 2.5.0)
43
+ webmock (~> 1.3.4)
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Rob Di Marco
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,39 @@
1
+ = omniauth_crowd
2
+
3
+ The omniauth_crowd library is an OmniAuth provider that supports authentication against Atlassian Crowd REST apis.
4
+
5
+ == Helpful links
6
+
7
+ * <b>Documentation:</b> http://github.com/robdimarco/omniauth_crowd
8
+ * <b>OmniAuth:</b> https://github.com/intridea/omniauth/
9
+ * <b>Atlassian Crowd:</b> http://www.atlassian.com/software/crowd/
10
+ * <b>Atlassian Crowd REST API:</b> http://confluence.atlassian.com/display/CROWDDEV/Crowd+REST+APIs
11
+
12
+ == Install and use
13
+
14
+ === 1. Add the Authlogic Crowd REST plugin to your Gemfile
15
+ gem "omniauth_crowd", :require=>'omniauth/crowd'
16
+
17
+ === 2. You will need to configure OmniAuth to use your crowd authentication. This is generally done in Rails in the config/initializers/omniauth.rb with...
18
+
19
+ Rails.application.config.middleware.use OmniAuth::Builder do
20
+ provider :crowd, :crowd_server_url=>"https://crowd.mycompanyname.com/crowd", :application_name=>"app", :application_password=>"password"
21
+ end
22
+
23
+ You will need to supply the correct server URL, application name and password
24
+
25
+ == Contributing to omniauth_crowd
26
+
27
+ * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
28
+ * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
29
+ * Fork the project
30
+ * Start a feature/bugfix branch
31
+ * Commit and push until you are happy with your contribution
32
+ * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
33
+ * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
34
+
35
+ == Copyright
36
+
37
+ Copyright (c) 2011 Rob Di Marco. See LICENSE.txt for
38
+ further details.
39
+
@@ -0,0 +1,44 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'rake'
11
+
12
+ require 'jeweler'
13
+ Jeweler::Tasks.new do |gem|
14
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
15
+ gem.name = "omniauth_crowd"
16
+ gem.homepage = "http://github.com/robdimarco/omniauth_crowd"
17
+ gem.license = "MIT"
18
+ gem.summary = %Q{An OmniAuth provider for Atlassian Crowd REST API}
19
+ gem.description = %Q{This is an OmniAuth provider for Atlassian Crowd's REST API. It allows you to easily integrate your Rack application in with Atlassian Crowd.}
20
+ gem.email = "rob@innovationontherun.com"
21
+ gem.authors = ["Rob Di Marco"]
22
+ # Include your dependencies below. Runtime dependencies are required when using your gem,
23
+ # and development dependencies are only needed for development (ie running rake tasks, tests, etc)
24
+ gem.add_runtime_dependency 'oa-core'
25
+ gem.add_runtime_dependency 'nokogiri'
26
+ gem.add_development_dependency 'rspec', '~> 2.5.0'
27
+ end
28
+ Jeweler::RubygemsDotOrgTasks.new
29
+
30
+ task :default => :spec
31
+
32
+ require 'rake/rdoctask'
33
+ Rake::RDocTask.new do |rdoc|
34
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
35
+
36
+ rdoc.rdoc_dir = 'rdoc'
37
+ rdoc.title = "omniauth_crowd #{version}"
38
+ rdoc.rdoc_files.include('README*')
39
+ rdoc.rdoc_files.include('lib/**/*.rb')
40
+ end
41
+ require 'rspec/core/rake_task'
42
+ RSpec::Core::RakeTask.new(:spec) do |s|
43
+ s.rspec_opts = "--format=#{ENV['RSPEC_FORMAT'] || 'nested'} --colour"
44
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.0.0
@@ -0,0 +1,6 @@
1
+ require 'omniauth/core'
2
+ module OmniAuth
3
+ module Strategies
4
+ autoload :Crowd, 'omniauth/strategies/crowd'
5
+ end
6
+ end
@@ -0,0 +1,51 @@
1
+ require 'omniauth/core'
2
+
3
+ module OmniAuth
4
+ module Strategies
5
+ class Crowd
6
+ include OmniAuth::Strategy
7
+ autoload :Configuration, 'omniauth/strategies/crowd/configuration'
8
+ autoload :CrowdValidator, 'omniauth/strategies/crowd/crowd_validator'
9
+ def initialize(app, options = {}, &block)
10
+ super(app, options[:name] || :crowd, options.dup, &block)
11
+ @configuration = OmniAuth::Strategies::Crowd::Configuration.new(options)
12
+ end
13
+
14
+ protected
15
+
16
+ def request_phase
17
+ if env['REQUEST_METHOD'] == 'GET'
18
+ get_credentials
19
+ else
20
+ session['omniauth.crowd'] = {'username' => request['username'], 'password' => request['password']}
21
+ redirect callback_path
22
+ end
23
+ end
24
+
25
+ def get_credentials
26
+ OmniAuth::Form.build(:title => (options[:title] || "Crowd Authentication")) do
27
+ text_field 'Login', 'username'
28
+ password_field 'Password', 'password'
29
+ end.to_response
30
+ end
31
+
32
+ def callback_phase
33
+ creds = session.delete 'omniauth.crowd'
34
+ return fail!(:no_credentials, 'No Credentials') unless creds
35
+ validator = CrowdValidator.new(@configuration, creds['username'], creds['password'])
36
+ @user_info = validator.user_info
37
+
38
+ return fail!(:invalid_credentials) if @user_info.nil? || @user_info.empty?
39
+
40
+ super
41
+ end
42
+
43
+ def auth_hash
44
+ OmniAuth::Utils.deep_merge(super, {
45
+ 'uid' => @user_info.delete("user"),
46
+ 'user_info' => @user_info
47
+ })
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,77 @@
1
+ require 'rack'
2
+
3
+ module OmniAuth
4
+ module Strategies
5
+ class Crowd
6
+ class Configuration
7
+ attr_reader :crowd_application_name, :crowd_password
8
+
9
+ # @param [Hash] params configuration options
10
+ # @option params [String, nil] :crowd_server_url the Crowd server root URL; probably something like
11
+ # `https://crowd.mycompany.com` or `https://crowd.mycompany.com/crowd`; optional.
12
+ # @option params [String, nil] :crowd_authentication_url (:crowd_server_url + '/rest/usermanagement/latest/authentication') the URL to which to
13
+ # use for authenication; optional if `:crowd_server_url` is specified,
14
+ # required otherwise.
15
+ # @option params [String, nil] :application_name the application name specified in Crowd for this application, required.
16
+ # @option params [String, nil] :application_password the application password specified in Crowd for this application, required.
17
+ # @option params [Boolean, nil] :disable_ssl_verification disable verification for SSL cert,
18
+ # helpful when you developing with a fake cert.
19
+ def initialize(params)
20
+ parse_params params
21
+ end
22
+
23
+ # Build a Crowd authentication URL from +username+.
24
+ #
25
+ # @param [String] username the username to validate
26
+ #
27
+ # @return [String] a URL like `http://cas.mycompany.com/login?service=...`
28
+ def authentication_url(username)
29
+ append_username @authentication_url, username
30
+ end
31
+
32
+ def disable_ssl_verification?
33
+ @disable_ssl_verification
34
+ end
35
+
36
+ private
37
+ DEFAULT_AUTHENTICATION_URL = "%s/rest/usermanagement/latest/authentication"
38
+ def parse_params(options)
39
+ %w(application_name application_password).each do |opt|
40
+ raise ArgumentError.new(":#{opt} MUST be provided") if options[opt.to_sym].blank?
41
+ end
42
+ @crowd_application_name = options[:application_name]
43
+ @crowd_password = options[:application_password]
44
+
45
+ unless options.include?(:crowd_server_url) or options.include?(:crowd_authentication_url)
46
+ raise ArgumentError.new("Either :crowd_server_url or :crowd_authentication_url MUST be provided")
47
+ end
48
+ @authentication_url = options[:crowd_authentication_url] || DEFAULT_AUTHENTICATION_URL % options[:crowd_server_url]
49
+ validate_is_url 'authentication URL', @authentication_url
50
+
51
+ @disable_ssl_verification = options[:disable_ssl_verification]
52
+ end
53
+
54
+ IS_NOT_URL_ERROR_MESSAGE = "%s is not a valid URL"
55
+
56
+ def validate_is_url(name, possibly_a_url)
57
+ url = URI.parse(possibly_a_url) rescue nil
58
+ raise ArgumentError.new(IS_NOT_URL_ERROR_MESSAGE % name) unless url.kind_of?(URI::HTTP)
59
+ end
60
+
61
+ # Adds +service+ as an URL-escaped parameter to +base+.
62
+ #
63
+ # @param [String] base the base URL
64
+ # @param [String] service the service (a.k.a. return-to) URL.
65
+ #
66
+ # @return [String] the new joined URL.
67
+ def append_username(base, username)
68
+ result = base.dup
69
+ result << (result.include?('?') ? '&' : '?')
70
+ result << 'username='
71
+ result << Rack::Utils.escape(username)
72
+ end
73
+
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,50 @@
1
+ require 'nokogiri'
2
+
3
+ module OmniAuth
4
+ module Strategies
5
+ class Crowd
6
+ class CrowdValidator
7
+ def initialize(configuration, username, password)
8
+ @configuration, @username, @password = configuration, username, password
9
+ @uri = URI.parse(@configuration.authentication_url(@username))
10
+ end
11
+
12
+ def user_info
13
+ if is_user_authorized?
14
+ parse_user_info
15
+ else
16
+ nil
17
+ end
18
+ end
19
+
20
+ private
21
+ def parse_user_info
22
+ return nil if @body.nil? || @body == ''
23
+ doc = Nokogiri::XML(@body)
24
+ return nil if doc.nil?
25
+ {
26
+ "user" => doc.xpath("//user/@name").to_s,
27
+ "name" => doc.xpath("//user/display-name/text()").to_s,
28
+ "first_name" => doc.xpath("//user/first-name/text()").to_s,
29
+ "last_name" => doc.xpath("//user/last-name/text()").to_s,
30
+ "email" => doc.xpath("//user/email/text()").to_s
31
+ }
32
+ end
33
+ AUTHENTICATION_REQUEST_BODY = "<password><value>%s</value></password>"
34
+ def is_user_authorized?
35
+ http = Net::HTTP.new(@uri.host, @uri.port)
36
+ http.use_ssl = @uri.port == 443 || @uri.instance_of?(URI::HTTPS)
37
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE if http.use_ssl? && @configuration.disable_ssl_verification?
38
+ http.start do |c|
39
+ req = Net::HTTP::Post.new("#{@uri.path}?#{@uri.query}")
40
+ req.body = AUTHENTICATION_REQUEST_BODY % @password
41
+ req.basic_auth @configuration.crowd_application_name, @configuration.crowd_password
42
+ req.add_field 'Content-Type', 'text/xml'
43
+ @response, @body = http.request(req)
44
+ @response.code.to_i == 200
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,11 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2
+ <user name="foo" expand="attributes">
3
+ <link rel="self" href="http://crowd.example.org/crowd/rest/usermanagement/latest/user?username=foo"/>
4
+ <first-name>Foo</first-name>
5
+ <last-name>Foobaz</last-name>
6
+ <display-name>Foo Foobaz</display-name>
7
+ <email>foo@example.org</email>
8
+ <password><link rel="edit" href="http://crowd.example.org/crowd/rest/usermanagement/latest/user/password?username=foo"/></password>
9
+ <active>true</active>
10
+ <attributes><link rel="self" href="http://crowd.example.org/crowd/rest/usermanagement/latest/user/attribute?username=foo"/></attributes>
11
+ </user>
@@ -0,0 +1,74 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe OmniAuth::Strategies::Crowd, :type=>:strategy do
4
+ include OmniAuth::Test::StrategyTestCase
5
+ def strategy
6
+ @crowd_server_url ||= 'https://crowd.example.org'
7
+ @application_name ||= 'bogus_app'
8
+ @application_password ||= 'bogus_app_password'
9
+ [OmniAuth::Strategies::Crowd, {:crowd_server_url => @crowd_server_url, :application_name=>@application_name, :application_password=>@application_password}]
10
+ end
11
+
12
+ describe 'GET /auth/crowd' do
13
+ before do
14
+ get '/auth/crowd'
15
+ end
16
+
17
+ it 'should show the login form' do
18
+ last_response.should be_ok
19
+ end
20
+ end
21
+
22
+ describe 'POST /auth/crowd' do
23
+ before do
24
+ post '/auth/crowd', :username=>'foo', :password=>'bar'
25
+ end
26
+
27
+ it 'should redirect to callback' do
28
+ last_response.should be_redirect
29
+ last_response.headers['Location'].should == '/auth/crowd/callback'
30
+ end
31
+ end
32
+
33
+ describe 'GET /auth/crowd/callback without any credentials' do
34
+ 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/
40
+ end
41
+ end
42
+
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
+ get '/auth/crowd/callback', nil, 'rack.session'=>{'omniauth.crowd'=> {"username"=>"foo", "password"=>"ba"}}
48
+ end
49
+ it 'should call through to the master app' do
50
+ last_response.body.should == 'true'
51
+ end
52
+ it 'should have an auth hash' do
53
+ auth = last_request.env['omniauth.auth']
54
+ auth.should be_kind_of(Hash)
55
+ end
56
+ it 'should have good data' do
57
+ auth = last_request.env['omniauth.auth']['provider'].should == 'crowd'
58
+ auth = last_request.env['omniauth.auth']['uid'].should == 'foo'
59
+ auth = last_request.env['omniauth.auth']['user_info'].should be_kind_of(Hash)
60
+ end
61
+ end
62
+
63
+ describe 'GET /auth/crowd/callback with credentials will fail' do
64
+ before do
65
+ stub_request(:post, "https://bogus_app:bogus_app_password@crowd.example.org/rest/usermanagement/latest/authentication?username=foo").
66
+ to_return(:code=>400)
67
+ get '/auth/crowd/callback', nil, 'rack.session'=>{'omniauth.crowd'=> {"username"=>"foo", "password"=>"ba"}}
68
+ end
69
+ it 'should fail' do
70
+ last_response.should be_redirect
71
+ last_response.headers['Location'].should =~ /invalid_credentials/
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,12 @@
1
+ require 'rubygems'
2
+ require 'rspec'
3
+ require 'rspec/autorun'
4
+ require 'rack/test'
5
+ require 'webmock/rspec'
6
+
7
+ include Rack::Test::Methods
8
+ include WebMock
9
+
10
+ require 'omniauth/crowd'
11
+
12
+ WebMock.disable_net_connect!
metadata ADDED
@@ -0,0 +1,259 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: omniauth_crowd
3
+ version: !ruby/object:Gem::Version
4
+ hash: 23
5
+ prerelease:
6
+ segments:
7
+ - 1
8
+ - 0
9
+ - 0
10
+ version: 1.0.0
11
+ platform: ruby
12
+ authors:
13
+ - Rob Di Marco
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-03-18 00:00:00 -04:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ type: :runtime
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 3
29
+ segments:
30
+ - 0
31
+ version: "0"
32
+ version_requirements: *id001
33
+ name: oa-core
34
+ prerelease: false
35
+ - !ruby/object:Gem::Dependency
36
+ type: :runtime
37
+ requirement: &id002 !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ hash: 3
43
+ segments:
44
+ - 0
45
+ version: "0"
46
+ version_requirements: *id002
47
+ name: nokogiri
48
+ prerelease: false
49
+ - !ruby/object:Gem::Dependency
50
+ type: :development
51
+ requirement: &id003 !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ hash: 3
57
+ segments:
58
+ - 0
59
+ version: "0"
60
+ version_requirements: *id003
61
+ name: rack
62
+ prerelease: false
63
+ - !ruby/object:Gem::Dependency
64
+ type: :development
65
+ requirement: &id004 !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ hash: 3
71
+ segments:
72
+ - 0
73
+ version: "0"
74
+ version_requirements: *id004
75
+ name: rake
76
+ prerelease: false
77
+ - !ruby/object:Gem::Dependency
78
+ type: :development
79
+ requirement: &id005 !ruby/object:Gem::Requirement
80
+ none: false
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ hash: 3
85
+ segments:
86
+ - 0
87
+ version: "0"
88
+ version_requirements: *id005
89
+ name: rack-test
90
+ prerelease: false
91
+ - !ruby/object:Gem::Dependency
92
+ type: :development
93
+ requirement: &id006 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ~>
97
+ - !ruby/object:Gem::Version
98
+ hash: 27
99
+ segments:
100
+ - 2
101
+ - 5
102
+ - 0
103
+ version: 2.5.0
104
+ version_requirements: *id006
105
+ name: rspec
106
+ prerelease: false
107
+ - !ruby/object:Gem::Dependency
108
+ type: :development
109
+ requirement: &id007 !ruby/object:Gem::Requirement
110
+ none: false
111
+ requirements:
112
+ - - ~>
113
+ - !ruby/object:Gem::Version
114
+ hash: 19
115
+ segments:
116
+ - 1
117
+ - 3
118
+ - 4
119
+ version: 1.3.4
120
+ version_requirements: *id007
121
+ name: webmock
122
+ prerelease: false
123
+ - !ruby/object:Gem::Dependency
124
+ type: :development
125
+ requirement: &id008 !ruby/object:Gem::Requirement
126
+ none: false
127
+ requirements:
128
+ - - ~>
129
+ - !ruby/object:Gem::Version
130
+ hash: 23
131
+ segments:
132
+ - 1
133
+ - 0
134
+ - 0
135
+ version: 1.0.0
136
+ version_requirements: *id008
137
+ name: bundler
138
+ prerelease: false
139
+ - !ruby/object:Gem::Dependency
140
+ type: :development
141
+ requirement: &id009 !ruby/object:Gem::Requirement
142
+ none: false
143
+ requirements:
144
+ - - ~>
145
+ - !ruby/object:Gem::Version
146
+ hash: 7
147
+ segments:
148
+ - 1
149
+ - 5
150
+ - 2
151
+ version: 1.5.2
152
+ version_requirements: *id009
153
+ name: jeweler
154
+ prerelease: false
155
+ - !ruby/object:Gem::Dependency
156
+ type: :runtime
157
+ requirement: &id010 !ruby/object:Gem::Requirement
158
+ none: false
159
+ requirements:
160
+ - - ">="
161
+ - !ruby/object:Gem::Version
162
+ hash: 3
163
+ segments:
164
+ - 0
165
+ version: "0"
166
+ version_requirements: *id010
167
+ name: oa-core
168
+ prerelease: false
169
+ - !ruby/object:Gem::Dependency
170
+ type: :runtime
171
+ requirement: &id011 !ruby/object:Gem::Requirement
172
+ none: false
173
+ requirements:
174
+ - - ">="
175
+ - !ruby/object:Gem::Version
176
+ hash: 3
177
+ segments:
178
+ - 0
179
+ version: "0"
180
+ version_requirements: *id011
181
+ name: nokogiri
182
+ prerelease: false
183
+ - !ruby/object:Gem::Dependency
184
+ type: :development
185
+ requirement: &id012 !ruby/object:Gem::Requirement
186
+ none: false
187
+ requirements:
188
+ - - ~>
189
+ - !ruby/object:Gem::Version
190
+ hash: 27
191
+ segments:
192
+ - 2
193
+ - 5
194
+ - 0
195
+ version: 2.5.0
196
+ version_requirements: *id012
197
+ name: rspec
198
+ prerelease: false
199
+ description: This is an OmniAuth provider for Atlassian Crowd's REST API. It allows you to easily integrate your Rack application in with Atlassian Crowd.
200
+ email: rob@innovationontherun.com
201
+ executables: []
202
+
203
+ extensions: []
204
+
205
+ extra_rdoc_files:
206
+ - LICENSE.txt
207
+ - README.rdoc
208
+ files:
209
+ - .document
210
+ - Gemfile
211
+ - Gemfile.lock
212
+ - LICENSE.txt
213
+ - README.rdoc
214
+ - Rakefile
215
+ - VERSION
216
+ - lib/omniauth/crowd.rb
217
+ - lib/omniauth/strategies/crowd.rb
218
+ - lib/omniauth/strategies/crowd/configuration.rb
219
+ - lib/omniauth/strategies/crowd/crowd_validator.rb
220
+ - spec/fixtures/success.xml
221
+ - spec/omniauth/strategies/crowd_spec.rb
222
+ - spec/spec_helper.rb
223
+ has_rdoc: true
224
+ homepage: http://github.com/robdimarco/omniauth_crowd
225
+ licenses:
226
+ - MIT
227
+ post_install_message:
228
+ rdoc_options: []
229
+
230
+ require_paths:
231
+ - lib
232
+ required_ruby_version: !ruby/object:Gem::Requirement
233
+ none: false
234
+ requirements:
235
+ - - ">="
236
+ - !ruby/object:Gem::Version
237
+ hash: 3
238
+ segments:
239
+ - 0
240
+ version: "0"
241
+ required_rubygems_version: !ruby/object:Gem::Requirement
242
+ none: false
243
+ requirements:
244
+ - - ">="
245
+ - !ruby/object:Gem::Version
246
+ hash: 3
247
+ segments:
248
+ - 0
249
+ version: "0"
250
+ requirements: []
251
+
252
+ rubyforge_project:
253
+ rubygems_version: 1.6.0
254
+ signing_key:
255
+ specification_version: 3
256
+ summary: An OmniAuth provider for Atlassian Crowd REST API
257
+ test_files:
258
+ - spec/omniauth/strategies/crowd_spec.rb
259
+ - spec/spec_helper.rb