omniauth-launchpad 0.0.1 → 0.1.0
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.
- checksums.yaml +4 -4
- data/.rspec +2 -0
- data/.travis.yml +14 -0
- data/README.md +9 -3
- data/Rakefile +3 -0
- data/lib/omniauth/launchpad/version.rb +1 -1
- data/lib/omniauth/strategies/launchpad.rb +19 -21
- data/omniauth-launchpad.gemspec +2 -4
- data/spec/omniauth/strategies/launchpad_spec.rb +137 -0
- data/spec/spec_helper.rb +15 -0
- metadata +15 -12
- data/example/Gemfile +0 -4
- data/example/Gemfile.lock +0 -36
- data/example/config.ru +0 -43
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8d070daeb3e1490ec25e3392882228c6688e3746
|
4
|
+
data.tar.gz: 152c9448d0a5180956e052fea005c739aaae31b6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f21c0175ec7f1896cceab351a18e530efda254787949f6f04fd43996f05fb9552ab38bb3104e9d6b49d1c30d53118c55e32c56563204d27d0cd759f2a0ee9a71
|
7
|
+
data.tar.gz: e38f53fe5cb0224ccb6972c4c4e1987b1104d7da786f09755a629b82c14c2db7d35399daec006dc3a2842109104cecf51625dbdf127f1b1d189cd2c5d8fc6125
|
data/.rspec
ADDED
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# Omniauth::Launchpad
|
2
|
+
Build status: [](https://travis-ci.org/joaopapereira/omniauth-launchpad)
|
2
3
|
|
3
|
-
|
4
|
+
This gem allows the user to login with the launchpad account
|
4
5
|
|
5
6
|
## Installation
|
6
7
|
|
@@ -20,11 +21,16 @@ Or install it yourself as:
|
|
20
21
|
|
21
22
|
## Usage
|
22
23
|
|
23
|
-
|
24
|
+
Add the middleware to a Rails app in config/initializers/omniauth.rb:
|
25
|
+
```
|
26
|
+
Rails.application.config.middleware.use OmniAuth::Builder do
|
27
|
+
provider :launchpad, CONSUMER_KEY
|
28
|
+
end
|
29
|
+
```
|
24
30
|
|
25
31
|
## Contributing
|
26
32
|
|
27
|
-
1. Fork it ( https://github.com/
|
33
|
+
1. Fork it ( https://github.com/joaopapereira/omniauth-launchpad/fork )
|
28
34
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
29
35
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
30
36
|
4. Push to the branch (`git push origin my-new-feature`)
|
data/Rakefile
CHANGED
@@ -24,7 +24,6 @@ module OmniAuth
|
|
24
24
|
}
|
25
25
|
def initialize(app, consumer_key="babun", options={}, &block)
|
26
26
|
options[:oauth_consumer_key] = consumer_key
|
27
|
-
options[:oauth_consumer_secret] = consumer_secret
|
28
27
|
super(app, consumer_key, nil, options, &block)
|
29
28
|
end
|
30
29
|
|
@@ -52,28 +51,27 @@ module OmniAuth
|
|
52
51
|
{ raw_user_info: raw_user_info }
|
53
52
|
end
|
54
53
|
def request_phase
|
55
|
-
puts "Request info: #{options.request_param}"
|
56
54
|
request_options = {:oauth_consumer_key => options[:oauth_consumer_key], :realm => "https://api.launchpad.net/"}
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
end
|
69
|
-
@request_token = request_token
|
70
|
-
r.finish
|
71
|
-
|
72
|
-
rescue ::Timeout::Error => e
|
73
|
-
fail!(:timeout, e)
|
74
|
-
rescue ::Net::HTTPFatalError, ::OpenSSL::SSL::SSLError => e
|
75
|
-
fail!(:service_unavailable, e)
|
55
|
+
request_options.merge!(options[:authorize_params])
|
56
|
+
|
57
|
+
request_token = consumer.get_request_token({:oauth_callback => callback_url}, request_options)
|
58
|
+
session['oauth'] ||= {}
|
59
|
+
session['oauth'][name.to_s] = {'callback_confirmed' => request_token.callback_confirmed?, 'request_token' => request_token.token, 'request_secret' => request_token.secret}
|
60
|
+
r = Rack::Response.new
|
61
|
+
|
62
|
+
if request_token.callback_confirmed?
|
63
|
+
r.redirect(request_token.authorize_url)
|
64
|
+
else
|
65
|
+
r.redirect(request_token.authorize_url(:oauth_callback => callback_url))
|
76
66
|
end
|
67
|
+
@request_token = request_token
|
68
|
+
r.finish
|
69
|
+
|
70
|
+
rescue ::Timeout::Error => e
|
71
|
+
fail!(:timeout, e)
|
72
|
+
rescue ::Net::HTTPFatalError, ::OpenSSL::SSL::SSLError => e
|
73
|
+
fail!(:service_unavailable, e)
|
74
|
+
end
|
77
75
|
end
|
78
76
|
end
|
79
77
|
end
|
data/omniauth-launchpad.gemspec
CHANGED
@@ -17,8 +17,9 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
|
+
spec.required_ruby_version = '>= 1.9.2'
|
20
21
|
|
21
|
-
spec.add_development_dependency "bundler"
|
22
|
+
spec.add_development_dependency "bundler"
|
22
23
|
spec.add_development_dependency "rake", "~> 10.0"
|
23
24
|
spec.add_development_dependency 'rspec'
|
24
25
|
spec.add_development_dependency 'webmock'
|
@@ -27,8 +28,5 @@ Gem::Specification.new do |spec|
|
|
27
28
|
|
28
29
|
spec.add_runtime_dependency 'omniauth', '>= 1.1.1'
|
29
30
|
spec.add_runtime_dependency 'omniauth-oauth'
|
30
|
-
#spec.add_runtime_dependency 'faraday'
|
31
|
-
#spec.add_runtime_dependency 'faraday_middleware'
|
32
|
-
#spec.add_runtime_dependency 'simple_oauth'
|
33
31
|
spec.add_runtime_dependency 'multi_json', '~> 1.3'
|
34
32
|
end
|
@@ -0,0 +1,137 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'omniauth-launchpad'
|
3
|
+
|
4
|
+
describe OmniAuth::Strategies::Launchpad do
|
5
|
+
def app
|
6
|
+
Rack::Builder.new {
|
7
|
+
use OmniAuth::Test::PhonySession
|
8
|
+
use OmniAuth::Builder do
|
9
|
+
provider :launchpad, "testing-launchpad"
|
10
|
+
end
|
11
|
+
run lambda { |env| [404, {'Content-Type' => 'text/plain'}, [env.key?('omniauth.auth').to_s]] }
|
12
|
+
}.to_app
|
13
|
+
end
|
14
|
+
def strategy
|
15
|
+
# return the parameters to a Rack::Builder map call:
|
16
|
+
[OmniAuth::Strategies::Launchpad.new, 'bamm']
|
17
|
+
end
|
18
|
+
def session
|
19
|
+
last_request.env['rack.session']
|
20
|
+
end
|
21
|
+
|
22
|
+
before do
|
23
|
+
stub_request(:post, 'https://launchpad.net/+request-token').
|
24
|
+
to_return(:body => "oauth_token=yourtoken&oauth_token_secret=yoursecret&oauth_callback_confirmed=true")
|
25
|
+
end
|
26
|
+
it 'can be camel-cased' do
|
27
|
+
OmniAuth::Utils.camelize( 'launchpad' ).should == 'Launchpad'
|
28
|
+
end
|
29
|
+
|
30
|
+
describe '/auth/launchpad' do
|
31
|
+
context 'successful' do
|
32
|
+
before do
|
33
|
+
get '/auth/launchpad'
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'should redirect to authorize_url' do
|
37
|
+
last_response.should be_redirect
|
38
|
+
last_response.headers['Location'].should == 'https://launchpad.net/+authorize-token?oauth_token=yourtoken'
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
it 'should set appropriate session variables' do
|
43
|
+
session['oauth'].should == {"launchpad"=>{"callback_confirmed"=>true, "request_token"=>"yourtoken", "request_secret"=>"yoursecret"}}
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context 'unsuccessful' do
|
48
|
+
before do
|
49
|
+
stub_request(:post, 'https://launchpad.net/+request-token').
|
50
|
+
to_raise(::Net::HTTPFatalError.new(%Q{502 "Bad Gateway"}, nil))
|
51
|
+
get '/auth/launchpad'
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'should call fail! with :service_unavailable' do
|
55
|
+
last_request.env['omniauth.error'].should be_kind_of(::Net::HTTPFatalError)
|
56
|
+
last_request.env['omniauth.error.type'] = :service_unavailable
|
57
|
+
end
|
58
|
+
|
59
|
+
context "SSL failure" do
|
60
|
+
before do
|
61
|
+
stub_request(:post, 'https://launchpad.net/+request-token').
|
62
|
+
to_raise(::OpenSSL::SSL::SSLError.new("SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed"))
|
63
|
+
get '/auth/launchpad'
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'should call fail! with :service_unavailable' do
|
67
|
+
last_request.env['omniauth.error'].should be_kind_of(::OpenSSL::SSL::SSLError)
|
68
|
+
last_request.env['omniauth.error.type'] = :service_unavailable
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe '/auth/launchpad/callback' do
|
75
|
+
before do
|
76
|
+
body =<<BODY
|
77
|
+
oauth_token=PsK9cpbll1KwehhRDckr&oauth_token_secret=M2hsnmsfEIAjS3bTWg6t8X2GKhlm152PRDjLLmtQdr9C8KFZWPl9c8QbLfWddE0qpz5L56pMKKFKEfv1&lp.context=None
|
78
|
+
BODY
|
79
|
+
|
80
|
+
stub_request(:post, 'https://launchpad.net/+request-token').
|
81
|
+
to_return(:body => "oauth_token=yourtoken&oauth_token_secret=yoursecret")
|
82
|
+
stub_request(:post, "https://launchpad.net/+access-token").
|
83
|
+
with(:body => hash_including({"oauth_consumer_key"=>"testing-launchpad",
|
84
|
+
"oauth_signature"=>"&yoursecret",
|
85
|
+
"oauth_signature_method"=>"PLAINTEXT",
|
86
|
+
"oauth_token"=>"yourtoken",
|
87
|
+
"oauth_version"=>"1.0"})).
|
88
|
+
to_return(:status => 200, :body => body, :headers => {})
|
89
|
+
stub_request(:get, "https://api.launchpad.net/devel/people/+me").
|
90
|
+
to_return(:status => 302, :headers => {"location" =>"https://api.launchpad.net/devel/~theguy"})
|
91
|
+
stub_request(:get, "https://api.launchpad.net/devel/~theguy").
|
92
|
+
to_return(:status => 200, :body => "bamm")
|
93
|
+
|
94
|
+
get '/auth/launchpad/callback', {}, {'rack.session' => {'oauth' => {"launchpad" => {'callback_confirmed' => true, 'request_token' => 'yourtoken', 'request_secret' => 'yoursecret'}}}}
|
95
|
+
end
|
96
|
+
|
97
|
+
|
98
|
+
context "bad gateway (or any 5xx) for access_token" do
|
99
|
+
before do
|
100
|
+
stub_request(:post, 'https://launchpad.net/+access-token').
|
101
|
+
to_raise(::Net::HTTPFatalError.new(%Q{502 "Bad Gateway"}, nil))
|
102
|
+
get '/auth/launchpad/callback', {:oauth_verifier => 'dudeman'}, {'rack.session' => {'oauth' => {"launchpad" => {'callback_confirmed' => true, 'request_token' => 'yourtoken', 'request_secret' => 'yoursecret'}}}}
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'should call fail! with :service_unavailable' do
|
106
|
+
last_request.env['omniauth.error'].should be_kind_of(::Net::HTTPFatalError)
|
107
|
+
last_request.env['omniauth.error.type'] = :service_unavailable
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
context "SSL failure" do
|
112
|
+
before do
|
113
|
+
stub_request(:post, 'https://launchpad.net/+access-token').
|
114
|
+
to_raise(::OpenSSL::SSL::SSLError.new("SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed"))
|
115
|
+
get '/auth/launchpad/callback', {:oauth_verifier => 'dudeman'}, {'rack.session' => {'oauth' => {"launchpad" => {'callback_confirmed' => true, 'request_token' => 'yourtoken', 'request_secret' => 'yoursecret'}}}}
|
116
|
+
end
|
117
|
+
|
118
|
+
it 'should call fail! with :service_unavailable' do
|
119
|
+
last_request.env['omniauth.error'].should be_kind_of(::OpenSSL::SSL::SSLError)
|
120
|
+
last_request.env['omniauth.error.type'] = :service_unavailable
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
describe '/auth/launchpad/callback with expired session' do
|
126
|
+
before do
|
127
|
+
stub_request(:post, 'https://launchpad.net/+request-token').
|
128
|
+
to_return(:body => "oauth_token=yourtoken&oauth_token_secret=yoursecret")
|
129
|
+
get '/auth/launchpad/callback', {:oauth_verifier => 'dudeman'}, {'rack.session' => {}}
|
130
|
+
end
|
131
|
+
|
132
|
+
it 'should call fail! with :session_expired' do
|
133
|
+
last_request.env['omniauth.error'].should be_kind_of(::OmniAuth::NoSessionError)
|
134
|
+
last_request.env['omniauth.error.type'] = :session_expired
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
$:.unshift File.expand_path('..', __FILE__)
|
2
|
+
$:.unshift File.expand_path('../../lib', __FILE__)
|
3
|
+
require 'simplecov'
|
4
|
+
SimpleCov.start
|
5
|
+
require 'rspec'
|
6
|
+
require 'rack/test'
|
7
|
+
require 'webmock/rspec'
|
8
|
+
require 'omniauth'
|
9
|
+
require 'omniauth-oauth'
|
10
|
+
|
11
|
+
RSpec.configure do |config|
|
12
|
+
config.include WebMock::API
|
13
|
+
config.include Rack::Test::Methods
|
14
|
+
config.extend OmniAuth::Test::StrategyMacros, :type => :strategy
|
15
|
+
end
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: omniauth-launchpad
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- João Pereira
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-04-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -144,13 +144,12 @@ extensions: []
|
|
144
144
|
extra_rdoc_files: []
|
145
145
|
files:
|
146
146
|
- ".gitignore"
|
147
|
+
- ".rspec"
|
148
|
+
- ".travis.yml"
|
147
149
|
- Gemfile
|
148
150
|
- LICENSE.txt
|
149
151
|
- README.md
|
150
152
|
- Rakefile
|
151
|
-
- example/Gemfile
|
152
|
-
- example/Gemfile.lock
|
153
|
-
- example/config.ru
|
154
153
|
- example/simple/Gemfile
|
155
154
|
- example/simple/Gemfile.lock
|
156
155
|
- example/simple/My Runner.run
|
@@ -160,6 +159,8 @@ files:
|
|
160
159
|
- lib/omniauth/launchpad/version.rb
|
161
160
|
- lib/omniauth/strategies/launchpad.rb
|
162
161
|
- omniauth-launchpad.gemspec
|
162
|
+
- spec/omniauth/strategies/launchpad_spec.rb
|
163
|
+
- spec/spec_helper.rb
|
163
164
|
homepage: ''
|
164
165
|
licenses:
|
165
166
|
- MIT
|
@@ -172,7 +173,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
172
173
|
requirements:
|
173
174
|
- - ">="
|
174
175
|
- !ruby/object:Gem::Version
|
175
|
-
version:
|
176
|
+
version: 1.9.2
|
176
177
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
177
178
|
requirements:
|
178
179
|
- - ">="
|
@@ -180,8 +181,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
180
181
|
version: '0'
|
181
182
|
requirements: []
|
182
183
|
rubyforge_project:
|
183
|
-
rubygems_version: 2.
|
184
|
+
rubygems_version: 2.6.10
|
184
185
|
signing_key:
|
185
186
|
specification_version: 4
|
186
187
|
summary: Launchpad login for OmniAuth
|
187
|
-
test_files:
|
188
|
+
test_files:
|
189
|
+
- spec/omniauth/strategies/launchpad_spec.rb
|
190
|
+
- spec/spec_helper.rb
|
data/example/Gemfile
DELETED
data/example/Gemfile.lock
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: ../../
|
3
|
-
specs:
|
4
|
-
omniauth-launchpad (0.0.1)
|
5
|
-
multi_json (~> 1.3)
|
6
|
-
omniauth (>= 1.1.1)
|
7
|
-
omniauth-oauth (>= 1.0.1)
|
8
|
-
|
9
|
-
GEM
|
10
|
-
remote: http://rubygems.org/
|
11
|
-
specs:
|
12
|
-
hashie (3.4.1)
|
13
|
-
multi_json (1.11.0)
|
14
|
-
oauth (0.4.7)
|
15
|
-
omniauth (1.2.2)
|
16
|
-
hashie (>= 1.2, < 4)
|
17
|
-
rack (~> 1.0)
|
18
|
-
omniauth-oauth (1.0.1)
|
19
|
-
oauth
|
20
|
-
omniauth (~> 1.0)
|
21
|
-
rack (1.6.0)
|
22
|
-
rack-protection (1.5.3)
|
23
|
-
rack
|
24
|
-
sinatra (1.4.6)
|
25
|
-
rack (~> 1.4)
|
26
|
-
rack-protection (~> 1.4)
|
27
|
-
tilt (>= 1.3, < 3)
|
28
|
-
tilt (2.0.1)
|
29
|
-
|
30
|
-
PLATFORMS
|
31
|
-
ruby
|
32
|
-
|
33
|
-
DEPENDENCIES
|
34
|
-
omniauth
|
35
|
-
omniauth-launchpad!
|
36
|
-
sinatra
|
data/example/config.ru
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
require 'bundler/setup'
|
2
|
-
require 'sinatra/base'
|
3
|
-
require 'omniauth'
|
4
|
-
require 'launchpad'
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
class App < Sinatra::Base
|
9
|
-
|
10
|
-
get '/' do
|
11
|
-
redirect '/auth/launchpad'
|
12
|
-
end
|
13
|
-
# Support both GET and POST for callbacks
|
14
|
-
%w(get post).each do |method|
|
15
|
-
send(method, "/auth/:provider/callback") do
|
16
|
-
# Everything you care about is in env['omniauth.auth']
|
17
|
-
# You'll probably want to keep track of your credential hash somewhere.
|
18
|
-
# Loading it into a client object should be easy:
|
19
|
-
# client.authorization.update_token!(credential_hash)
|
20
|
-
content_type 'application/json'
|
21
|
-
MultiJson.encode(request.env)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
get '/auth/failure' do
|
25
|
-
content_type 'application/json'
|
26
|
-
MultiJson.encode(request.env)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
use Rack::Session::Cookie
|
31
|
-
|
32
|
-
use OmniAuth::Builder do
|
33
|
-
provider :launchpad,
|
34
|
-
ENV['CLIENT_ID'],
|
35
|
-
ENV['CLIENT_SECRET'],
|
36
|
-
:scope => [
|
37
|
-
'https://www.googleapis.com/auth/userinfo.profile',
|
38
|
-
'https://www.googleapis.com/auth/plus.me'
|
39
|
-
],
|
40
|
-
:skip_info => false
|
41
|
-
end
|
42
|
-
|
43
|
-
run App.new
|