twimock 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/twimock/api/intent/sessions.rb +8 -0
- data/lib/twimock/api/oauth.rb +2 -0
- data/lib/twimock/api/oauth/authorize.rb +50 -0
- data/lib/twimock/api/oauth/cancelled.rb +24 -0
- data/lib/twimock/errors.rb +2 -0
- data/lib/twimock/version.rb +1 -1
- data/spec/twimock/api/intent/sessions_spec.rb +18 -0
- data/spec/twimock/api/oauth/authorize_spec.rb +101 -0
- data/spec/twimock/api/oauth/cancelled_spec.rb +31 -0
- data/spec/twimock_spec.rb +1 -1
- data/view/authenticate.html.erb +1 -0
- data/view/oauth_cancelled.html.erb +18 -0
- metadata +9 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5309fdefb9500a7240260529d4059c8582224540
|
4
|
+
data.tar.gz: 9317dc0fe012b4fa78217a63bd57d387de84553c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bbe6f91f69f875e7ccb370972f09954043a1336cf86248ad25ff3ccc8ad4f7771b9fd00a431d4b70a18d577d37ed5ea596ba1ffde53506e50d39b72d2b30b3a3
|
7
|
+
data.tar.gz: a7d786545527bf373a9742bab18d6cca9e0cbdf84dd6bb11777e33627e34d928a79ab096cad952fdf596100827350e8e4e1a6a5dc0a8d78a5d170a4e3406fdc5
|
@@ -24,6 +24,8 @@ module Twimock
|
|
24
24
|
|
25
25
|
if !validate_request_token(@oauth_token)
|
26
26
|
raise Twimock::Errors::InvalidRequestToken.new
|
27
|
+
elsif body.cancel
|
28
|
+
raise Twimock::Errors::OAuthCancelled.new
|
27
29
|
elsif !(user = Twimock::User.find_by_tiwtter_id_or_email(@username_or_email))
|
28
30
|
raise Twimock::Errors::InvalidUsernameOrEmail.new
|
29
31
|
elsif @password.blank? || @password != user.password
|
@@ -43,6 +45,12 @@ module Twimock
|
|
43
45
|
header = { "Content-Length" => body.bytesize.to_s,
|
44
46
|
"Location" => callback_url }
|
45
47
|
[ status, header, [ body ] ]
|
48
|
+
rescue Twimock::Errors::OAuthCancelled
|
49
|
+
status = 303
|
50
|
+
body = ""
|
51
|
+
header = { "Content-Length" => body.bytesize.to_s,
|
52
|
+
"Location" => "/oauth/authorize?oauth_token=#{@oauth_token}&cancel=true" }
|
53
|
+
[ status, header, [ body ] ]
|
46
54
|
rescue Twimock::Errors::InvalidUsernameOrEmail, Twimock::Errors::InvalidPassword => @error
|
47
55
|
response = unauthorized
|
48
56
|
response[0] = 302
|
data/lib/twimock/api/oauth.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'twimock/api/oauth/access_token'
|
2
2
|
require 'twimock/api/oauth/request_token'
|
3
3
|
require 'twimock/api/oauth/authenticate'
|
4
|
+
require 'twimock/api/oauth/authorize'
|
5
|
+
require 'twimock/api/oauth/cancelled'
|
4
6
|
require 'twimock/api/intent/sessions'
|
5
7
|
require 'twimock/api/account/verify_credentials'
|
6
8
|
require 'twimock/errors'
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'uri'
|
2
|
+
require 'erb'
|
3
|
+
|
4
|
+
module Twimock
|
5
|
+
module API
|
6
|
+
# 認証キャンセル後の画面を返すAPI
|
7
|
+
# POST http://api.twimock.com/oauth/authorize
|
8
|
+
class OAuth
|
9
|
+
class Authorize < OAuth
|
10
|
+
METHOD = "GET"
|
11
|
+
PATH = "/oauth/authorize"
|
12
|
+
|
13
|
+
def call(env)
|
14
|
+
return super unless called?(env)
|
15
|
+
begin
|
16
|
+
request = Rack::Request.new(env)
|
17
|
+
@oauth_token = request.params["oauth_token"]
|
18
|
+
@cancel = request.params["cancel"]
|
19
|
+
|
20
|
+
if !validate_request_token(@oauth_token)
|
21
|
+
raise Twimock::Errors::InvalidRequestToken.new
|
22
|
+
elsif @cancel == "true"
|
23
|
+
raise Twimock::Errors::OAuthCancelled.new
|
24
|
+
end
|
25
|
+
|
26
|
+
status = 200
|
27
|
+
body = ""
|
28
|
+
header = { "Content-Length" => body.bytesize.to_s }
|
29
|
+
[ status, header, [ body ] ]
|
30
|
+
rescue Twimock::Errors::InvalidRequestToken => @error
|
31
|
+
unauthorized
|
32
|
+
rescue Twimock::Errors::OAuthCancelled => @error
|
33
|
+
oauth_cancelled
|
34
|
+
rescue => @error
|
35
|
+
internal_server_error
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def oauth_cancelled
|
42
|
+
status = 200
|
43
|
+
body = Twimock::API::OAuth::Cancelled.view(@oauth_token)
|
44
|
+
header = { "Content-Length" => body.bytesize.to_s }
|
45
|
+
[ status, header, [ body ] ]
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Twimock
|
2
|
+
module API
|
3
|
+
# OAuthでブラウザ認証するAPI
|
4
|
+
# GET http://api.twimock.com/authenticate?oauth_token=xxx
|
5
|
+
class OAuth
|
6
|
+
class Cancelled
|
7
|
+
VIEW_DIRECTORY = File.expand_path("../../../../../view", __FILE__)
|
8
|
+
VIEW_FILE_NAME = "oauth_cancelled.html.erb"
|
9
|
+
|
10
|
+
def self.view(oauth_token)
|
11
|
+
@oauth_token = oauth_token
|
12
|
+
erb = ERB.new(File.read(filepath))
|
13
|
+
erb.result(binding)
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def self.filepath
|
19
|
+
File.join(VIEW_DIRECTORY, VIEW_FILE_NAME)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/twimock/errors.rb
CHANGED
data/lib/twimock/version.rb
CHANGED
@@ -161,6 +161,24 @@ describe Twimock::API::Intent::Sessions do
|
|
161
161
|
it_behaves_like 'API 302 Redircted Callback URL'
|
162
162
|
end
|
163
163
|
|
164
|
+
context 'with authenticate canceled' do
|
165
|
+
before do
|
166
|
+
application = Twimock::Application.new
|
167
|
+
application.save!
|
168
|
+
@request_token = Twimock::RequestToken.new(application_id: application.id)
|
169
|
+
@request_token.save!
|
170
|
+
@body = { oauth_token: @request_token.string, cancel: 'true' }
|
171
|
+
post path, @body, header
|
172
|
+
end
|
173
|
+
|
174
|
+
it 'should return 303 Temporary Redirect /oauth/authorize' do
|
175
|
+
expect(last_response.status).to eq 303
|
176
|
+
location = Twimock::API::OAuth::Authorize::PATH + "?oauth_token=#{@request_token.string}&cancel=true"
|
177
|
+
expect(last_response.header['Location']).to eq location
|
178
|
+
expect(last_response.body).to be_blank
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
164
182
|
context 'raise error that is not catched' do
|
165
183
|
before do
|
166
184
|
allow_any_instance_of(Twimock::API::Intent::Sessions).to receive(:query_string_to_hash) do
|
@@ -0,0 +1,101 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'rack/test'
|
3
|
+
|
4
|
+
describe Twimock::API::OAuth::Authorize do
|
5
|
+
include TestApplicationHelper
|
6
|
+
include APISpecHelper
|
7
|
+
include Rack::Test::Methods
|
8
|
+
|
9
|
+
let(:method) { 'GET' }
|
10
|
+
let(:path) { '/oauth/authorize' }
|
11
|
+
let(:body) { "" }
|
12
|
+
let(:header) { {} }
|
13
|
+
let(:test_app) { TestApplicationHelper::TestRackApplication.new }
|
14
|
+
let(:app) { Twimock::API::OAuth::Authorize.new(test_app) }
|
15
|
+
|
16
|
+
describe '::METHOD' do
|
17
|
+
subject { Twimock::API::OAuth::Authorize::METHOD }
|
18
|
+
it { is_expected.to eq method }
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '::PATH' do
|
22
|
+
subject { Twimock::API::OAuth::Authorize::PATH }
|
23
|
+
it { is_expected.to eq path }
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "POST '/oauth/authorize'" do
|
27
|
+
before { stub_const("Twimock::Database::DEFAULT_DB_NAME", db_name) }
|
28
|
+
after { database.drop }
|
29
|
+
|
30
|
+
let(:db_name) { ".test" }
|
31
|
+
let(:database) { Twimock::Database.new }
|
32
|
+
|
33
|
+
context 'with invalid oauth token' do
|
34
|
+
before do
|
35
|
+
@request_token = Twimock::RequestToken.new
|
36
|
+
get path + "?oauth_token=#{@request_token.string}", body, header
|
37
|
+
end
|
38
|
+
it_behaves_like 'API 401 UnAuthorized'
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'with only valid oauth token' do
|
42
|
+
before do
|
43
|
+
application = Twimock::Application.new
|
44
|
+
application.save!
|
45
|
+
@request_token = Twimock::RequestToken.new(application_id: application.id)
|
46
|
+
@request_token.save!
|
47
|
+
get path + "?oauth_token=#{@request_token.string}", body, header
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'should return 200 OK' do
|
51
|
+
expect(last_response.status).to eq 200
|
52
|
+
expect(last_response.header['Content-Length']).to eq last_response.body.bytesize.to_s
|
53
|
+
expect(last_response.body).to be_blank
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context 'with valid oauth token and cancel' do
|
58
|
+
before do
|
59
|
+
application = Twimock::Application.new
|
60
|
+
application.save!
|
61
|
+
@request_token = Twimock::RequestToken.new(application_id: application.id)
|
62
|
+
@request_token.save!
|
63
|
+
get path + "?oauth_token=#{@request_token.string}&cancel=true", body, header
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'should return 200 OK with Cancelled view' do
|
67
|
+
view = Twimock::API::OAuth::Cancelled.view(@request_token.string)
|
68
|
+
expect(last_response.status).to eq 200
|
69
|
+
expect(last_response.header['Content-Length']).to eq last_response.body.bytesize.to_s
|
70
|
+
expect(last_response.body).to eq view
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context 'when raise unexpected error anywhere' do
|
75
|
+
before do
|
76
|
+
allow_any_instance_of(Rack::Request).to receive(:params) { raise }
|
77
|
+
application = Twimock::Application.new
|
78
|
+
application.save!
|
79
|
+
@request_token = Twimock::RequestToken.new(application_id: application.id)
|
80
|
+
@request_token.save!
|
81
|
+
get path + "?oauth_token=#{@request_token.string}", body, header
|
82
|
+
end
|
83
|
+
it_behaves_like 'API 500 InternalServerError'
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe "get '/test'" do
|
88
|
+
before { get '/test' }
|
89
|
+
it_behaves_like 'TestRackApplication 200 OK'
|
90
|
+
end
|
91
|
+
|
92
|
+
describe "POST '/oauth/authorize'" do
|
93
|
+
before { post '/oauth/authorize' }
|
94
|
+
it_behaves_like 'TestRackApplication 200 OK'
|
95
|
+
end
|
96
|
+
|
97
|
+
describe "POST '/oauth/authorization'" do
|
98
|
+
before { get '/oauth/authorization' }
|
99
|
+
it_behaves_like 'TestRackApplication 200 OK'
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Twimock::API::OAuth::Cancelled do
|
4
|
+
let(:view_directory) { File.expand_path("../../../../../view", __FILE__) }
|
5
|
+
let(:view_file_name) { "oauth_cancelled.html.erb" }
|
6
|
+
|
7
|
+
describe '::VIEW_DIRECTORY' do
|
8
|
+
subject { Twimock::API::OAuth::Cancelled::VIEW_DIRECTORY }
|
9
|
+
it { is_expected.to eq view_directory }
|
10
|
+
end
|
11
|
+
|
12
|
+
describe '::VIEW_FILE_NAME' do
|
13
|
+
subject { Twimock::API::OAuth::Cancelled::VIEW_FILE_NAME }
|
14
|
+
it { is_expected.to eq view_file_name }
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '.view' do
|
18
|
+
context 'without oauth_token' do
|
19
|
+
subject { lambda { Twimock::API::OAuth::Cancelled.view } }
|
20
|
+
it { is_expected.to raise_error ArgumentError }
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'with oauth token' do
|
24
|
+
before { @oauth_token = Twimock::RequestToken.new.string }
|
25
|
+
subject { Twimock::API::OAuth::Cancelled.view(@oauth_token) }
|
26
|
+
it { is_expected.to be_include "<!DOCTYPE html>" }
|
27
|
+
it { is_expected.to be_include 'body class="oauth cancelled' }
|
28
|
+
it { is_expected.to be_include @oauth_token }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/spec/twimock_spec.rb
CHANGED
data/view/authenticate.html.erb
CHANGED
@@ -16,6 +16,7 @@
|
|
16
16
|
<input type="hidden" name="remember_me" value="1">
|
17
17
|
<input type="hidden" name="oauth_token" value="<%= @oauth_token %>">
|
18
18
|
<input type="submit" value="login" class="submit button selected" id="allow">
|
19
|
+
<input type="submit" value="cancel" class="submit button" id="cancel" name="cancel">
|
19
20
|
</form>
|
20
21
|
</div>
|
21
22
|
</div>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="ja" dir="ltr" class="">
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<title>Authorize Twimock Application</title>
|
6
|
+
</head>
|
7
|
+
|
8
|
+
<body class="oauth cancelled tfw ja logged-out noloki">
|
9
|
+
<div id="bd" role="main">
|
10
|
+
<div class="auth">
|
11
|
+
<h1>You have not signed in</h1>
|
12
|
+
<p class="cancel-callback">
|
13
|
+
<a href="<%= Twimock::Config.callback_url %>?denied=<%= @oauth_token %>">Return to App</a>
|
14
|
+
</p>
|
15
|
+
</div>
|
16
|
+
</div>
|
17
|
+
</body>
|
18
|
+
</html>
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: twimock
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ogawatti
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-03-
|
11
|
+
date: 2015-03-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sqlite3
|
@@ -258,6 +258,8 @@ files:
|
|
258
258
|
- lib/twimock/api/oauth.rb
|
259
259
|
- lib/twimock/api/oauth/access_token.rb
|
260
260
|
- lib/twimock/api/oauth/authenticate.rb
|
261
|
+
- lib/twimock/api/oauth/authorize.rb
|
262
|
+
- lib/twimock/api/oauth/cancelled.rb
|
261
263
|
- lib/twimock/api/oauth/request_token.rb
|
262
264
|
- lib/twimock/application.rb
|
263
265
|
- lib/twimock/auth_hash.rb
|
@@ -281,6 +283,8 @@ files:
|
|
281
283
|
- spec/twimock/api/intent/sessions_spec.rb
|
282
284
|
- spec/twimock/api/oauth/access_token_spec.rb
|
283
285
|
- spec/twimock/api/oauth/authenticate_spec.rb
|
286
|
+
- spec/twimock/api/oauth/authorize_spec.rb
|
287
|
+
- spec/twimock/api/oauth/cancelled_spec.rb
|
284
288
|
- spec/twimock/api/oauth/request_token_spec.rb
|
285
289
|
- spec/twimock/api_spec.rb
|
286
290
|
- spec/twimock/application_spec.rb
|
@@ -294,6 +298,7 @@ files:
|
|
294
298
|
- spec/twimock_spec.rb
|
295
299
|
- twimock.gemspec
|
296
300
|
- view/authenticate.html.erb
|
301
|
+
- view/oauth_cancelled.html.erb
|
297
302
|
homepage: https://github.com/ogawatti/twimock
|
298
303
|
licenses:
|
299
304
|
- MIT
|
@@ -330,6 +335,8 @@ test_files:
|
|
330
335
|
- spec/twimock/api/intent/sessions_spec.rb
|
331
336
|
- spec/twimock/api/oauth/access_token_spec.rb
|
332
337
|
- spec/twimock/api/oauth/authenticate_spec.rb
|
338
|
+
- spec/twimock/api/oauth/authorize_spec.rb
|
339
|
+
- spec/twimock/api/oauth/cancelled_spec.rb
|
333
340
|
- spec/twimock/api/oauth/request_token_spec.rb
|
334
341
|
- spec/twimock/api_spec.rb
|
335
342
|
- spec/twimock/application_spec.rb
|