danski-ooh-auth 0.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/LICENSE +20 -0
- data/Rakefile +58 -0
- data/app/controllers/application.rb +16 -0
- data/app/controllers/authenticating_clients.rb +60 -0
- data/app/controllers/tokens.rb +94 -0
- data/app/helpers/application_helper.rb +64 -0
- data/app/helpers/authenticating_clients_helper.rb +5 -0
- data/app/helpers/authentications_helper.rb +5 -0
- data/app/models/authenticating_client.rb +12 -0
- data/app/models/authenticating_client/dm_authenticating_client.rb +71 -0
- data/app/models/token.rb +12 -0
- data/app/models/token/dm_token.rb +150 -0
- data/app/views/authenticating_clients/_help.html.erb +1 -0
- data/app/views/authenticating_clients/edit.html.erb +27 -0
- data/app/views/authenticating_clients/index.html.erb +24 -0
- data/app/views/authenticating_clients/new.html.erb +47 -0
- data/app/views/authenticating_clients/show.html.erb +40 -0
- data/app/views/layout/ooh_auth.html.erb +23 -0
- data/app/views/tokens/create.html.erb +34 -0
- data/app/views/tokens/edit.html.erb +4 -0
- data/app/views/tokens/new.html.erb +52 -0
- data/app/views/tokens/show.html.erb +1 -0
- data/lib/ooh-auth.rb +103 -0
- data/lib/ooh-auth/authentication_mixin.rb +13 -0
- data/lib/ooh-auth/controller_mixin.rb +38 -0
- data/lib/ooh-auth/key_generators.rb +57 -0
- data/lib/ooh-auth/merbtasks.rb +103 -0
- data/lib/ooh-auth/request_verification_mixin.rb +160 -0
- data/lib/ooh-auth/slicetasks.rb +18 -0
- data/lib/ooh-auth/spectasks.rb +65 -0
- data/lib/ooh-auth/strategies/oauth.rb +16 -0
- data/public/javascripts/master.js +0 -0
- data/public/stylesheets/master.css +2 -0
- data/readme.markdown +43 -0
- data/spec/controllers/application_spec.rb +35 -0
- data/spec/controllers/authenticating_clients_spec.rb +119 -0
- data/spec/controllers/tokens_spec.rb +173 -0
- data/spec/merb-auth-slice-fullfat_spec.rb +41 -0
- data/spec/models/authenticating_client_spec.rb +44 -0
- data/spec/models/oauth_strategy_spec.rb +48 -0
- data/spec/models/request_verification_mixin_spec.rb +121 -0
- data/spec/models/token_spec.rb +139 -0
- data/spec/spec_fixtures.rb +19 -0
- data/spec/spec_helper.rb +107 -0
- data/stubs/app/controllers/application.rb +2 -0
- data/stubs/app/controllers/main.rb +2 -0
- metadata +133 -0
@@ -0,0 +1,139 @@
|
|
1
|
+
require File.join( File.dirname(__FILE__), '..', "spec_helper" )
|
2
|
+
|
3
|
+
describe OohAuth::Token do
|
4
|
+
|
5
|
+
before :each do
|
6
|
+
@authenticating_clients = 3.of {OohAuth::AuthenticatingClient.gen}
|
7
|
+
@users = 3.of {user_class.gen}
|
8
|
+
@date = DateTime.civil(2009)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should be creatable as a request key for an application" do
|
12
|
+
a = OohAuth::Token.create_request_key(@authenticating_clients.first, @date)
|
13
|
+
a.expires.should == @date
|
14
|
+
a.authenticating_client.should == @authenticating_clients.first
|
15
|
+
a.key.should_not be_blank
|
16
|
+
a.user.should be_nil
|
17
|
+
a.should be_valid
|
18
|
+
a.activated?.should be_false
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should generate a unique token_key upon creation" do
|
22
|
+
a = OohAuth::Token.create_request_key(@authenticating_clients.first, @date)
|
23
|
+
a.token_key.should match(/[a-zA-Z0-9]{10}/)
|
24
|
+
end
|
25
|
+
it "should generate a unique token and apply the given expiry upon activation" do
|
26
|
+
a = OohAuth::Token.create_request_key(@authenticating_clients.first, @date)
|
27
|
+
result = a.activate!(@users.first)
|
28
|
+
a.should be_valid
|
29
|
+
result.should be_true
|
30
|
+
a.token_key.should match(/[a-zA-Z0-9]{10}/)
|
31
|
+
a.activated?.should be_true
|
32
|
+
end
|
33
|
+
it "should not activate if no user has been specified" do
|
34
|
+
a = OohAuth::Token.create_request_key(@authenticating_clients.first, @date)
|
35
|
+
a.activate!(nil).should be_false
|
36
|
+
a.activated?.should be_false
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should not change token_key code on save if one was already set" do
|
40
|
+
a = OohAuth::Token.create_request_key(@authenticating_clients.first, @date)
|
41
|
+
a.new_record?.should be_false
|
42
|
+
a.activate!(@users.first).should be_true
|
43
|
+
t = a.token_key
|
44
|
+
a.save
|
45
|
+
a.token_key.should == t
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should be findable with ::get_token" do
|
49
|
+
a = OohAuth::Token.create_request_key(@authenticating_clients.first, @date)
|
50
|
+
OohAuth::Token.get_token(a.token_key).should == a
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should get a new key when activated" do
|
54
|
+
a = OohAuth::Token.create_request_key(@authenticating_clients.first, @date)
|
55
|
+
token = a.token_key
|
56
|
+
token.should_not be_blank
|
57
|
+
a.activate!(@users.first).should be_true
|
58
|
+
a.token_key.should_not == token
|
59
|
+
a.token_key.should_not be_blank
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should generate a secret on first save" do
|
63
|
+
a = OohAuth::Token.create_request_key(@authenticating_clients.first, @date)
|
64
|
+
a.secret.should match(/[a-zA-Z0-9]{10}/)
|
65
|
+
end
|
66
|
+
it "should not change the secret on further saves" do
|
67
|
+
a = OohAuth::Token.create_request_key(@authenticating_clients.first, @date)
|
68
|
+
secret = a.secret
|
69
|
+
a.expires = 1.year.since
|
70
|
+
a.save.should be_true
|
71
|
+
a.secret.should == secret
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should determine if the object is editable by a given user" do
|
75
|
+
a = OohAuth::Token.create_request_key(@authenticating_clients.first, @date)
|
76
|
+
a.activate!(@users.first)
|
77
|
+
a.editable_by_user?(@users.first).should be_true
|
78
|
+
a.editable_by_user?(user_class.gen).should be_false
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should return default permissions if permissions are not set" do
|
82
|
+
a = OohAuth::Token.create_request_key(@authenticating_clients.first, @date)
|
83
|
+
OohAuth[:default_permissions].should_not be_nil
|
84
|
+
a.permissions = nil
|
85
|
+
a.permissions.should == OohAuth[:default_permissions]
|
86
|
+
a.permissions = "delete"
|
87
|
+
a.permissions.should == "delete"
|
88
|
+
end
|
89
|
+
|
90
|
+
describe "#authenticate!" do
|
91
|
+
before :each do
|
92
|
+
@user = user_class.gen
|
93
|
+
@activated = OohAuth::Token.create_request_key(@authenticating_clients.first, @date)
|
94
|
+
@activated.activate!(@user).should be_true
|
95
|
+
@unactivated = OohAuth::Token.create_request_key(@authenticating_clients[1], @date)
|
96
|
+
end
|
97
|
+
|
98
|
+
it "should not authenticate a user when given an incorrect API key and an activated token_key" do
|
99
|
+
OohAuth::Token.authenticate!("DSFARGEG", @activated.token_key).should be_nil
|
100
|
+
end
|
101
|
+
it "should not authenticate a user when given a correct API key and an unactivated key token_key" do
|
102
|
+
OohAuth::Token.authenticate!(@authenticating_clients.first.api_key, @unactivated.token_key).should be_nil
|
103
|
+
end
|
104
|
+
it "should not authenticate a user when given a correct API key but an incorrect token_key" do
|
105
|
+
OohAuth::Token.authenticate!(@authenticating_clients.first.api_key, "DSFARGEG").should be_nil
|
106
|
+
end
|
107
|
+
it "should authenticate a user when given a correct API key and a correct, activated token_key" do
|
108
|
+
#@a.user_id.should == ""
|
109
|
+
OohAuth::Token.authenticate!(@authenticating_clients.first.api_key, @activated.token_key).should == @user
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
describe "transformations" do
|
114
|
+
before :each do
|
115
|
+
@user = user_class.gen
|
116
|
+
@a = OohAuth::Token.create_request_key(@authenticating_clients.first, @date)
|
117
|
+
@a.new_record?.should be_false
|
118
|
+
end
|
119
|
+
|
120
|
+
it "should transform as a 'request_key' bundle when not activated" do
|
121
|
+
@a.activated?.should be_false
|
122
|
+
@a.to_xml.should contain(@a.token_key)
|
123
|
+
@a.to_json.should contain(@a.token_key)
|
124
|
+
@a.to_json.should contain("request_key")
|
125
|
+
@a.to_yaml.should contain(@a.token_key)
|
126
|
+
@a.to_yaml.should contain("request_key")
|
127
|
+
end
|
128
|
+
it "should transform as a 'access_key' bundle when activated" do
|
129
|
+
@a.activate!(@user).should be_true
|
130
|
+
@a.token_key.should match(/[0-9A-Za-z]{10}/)
|
131
|
+
@a.to_xml.should contain(@a.token_key)
|
132
|
+
@a.to_json.should contain(@a.token_key)
|
133
|
+
@a.to_json.should contain("access_key")
|
134
|
+
@a.to_yaml.should contain(@a.token_key)
|
135
|
+
@a.to_yaml.should contain("access_key")
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
OohAuth::Mocks::User.fixture{{
|
2
|
+
:name => (name = /\w+/.gen),
|
3
|
+
:login => name,
|
4
|
+
:email => "#{name}@test.com",
|
5
|
+
:password => (password = "#{name}_goodpass"),
|
6
|
+
:password_confirmation => password
|
7
|
+
}}
|
8
|
+
|
9
|
+
OohAuth::AuthenticatingClient.fixture{{
|
10
|
+
:name => /\w+/.gen,
|
11
|
+
:web_url => "http://www.#{ /\w+/.gen }.com/client/",
|
12
|
+
:api_key => /\w+/.gen,
|
13
|
+
:secret => /\w+/.gen,
|
14
|
+
:kind => /desktop|web/.gen
|
15
|
+
}}
|
16
|
+
|
17
|
+
OohAuth::Token.fixture{{
|
18
|
+
|
19
|
+
}}
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'merb-core'
|
3
|
+
require 'merb-slices'
|
4
|
+
require 'spec'
|
5
|
+
|
6
|
+
# Add ooh-auth.rb to the search path
|
7
|
+
Merb::Plugins.config[:merb_slices][:auto_register] = true
|
8
|
+
Merb::Plugins.config[:merb_slices][:search_path] = File.join(File.dirname(__FILE__), '..', 'lib', 'ooh-auth.rb')
|
9
|
+
require Merb::Plugins.config[:merb_slices][:search_path]
|
10
|
+
|
11
|
+
# Using Merb.root below makes sure that the correct root is set for
|
12
|
+
# - testing standalone, without being installed as a gem and no host application
|
13
|
+
# - testing from within the host application; its root will be used
|
14
|
+
Merb.start_environment(
|
15
|
+
:testing => true,
|
16
|
+
:adapter => 'runner',
|
17
|
+
:environment => ENV['MERB_ENV'] || 'test',
|
18
|
+
:session_store => 'memory'
|
19
|
+
)
|
20
|
+
|
21
|
+
module Merb
|
22
|
+
module Test
|
23
|
+
module SliceHelper
|
24
|
+
|
25
|
+
# The absolute path to the current slice
|
26
|
+
def current_slice_root
|
27
|
+
@current_slice_root ||= File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
28
|
+
end
|
29
|
+
|
30
|
+
# Whether the specs are being run from a host application or standalone
|
31
|
+
def standalone?
|
32
|
+
#raise StandardError, "Merb.root #{Merb.root.inspect} ::OohAuth.root #{::OohAuth.root.inspect}"
|
33
|
+
File.join(Merb.root, "") == File.join(::OohAuth.root, "")
|
34
|
+
end
|
35
|
+
|
36
|
+
def user_class
|
37
|
+
Merb::Authentication.user_class
|
38
|
+
end
|
39
|
+
|
40
|
+
def noko(document)
|
41
|
+
Nokogiri::HTML(document)
|
42
|
+
end
|
43
|
+
|
44
|
+
# Produces a signed FakeRequest ready to be used when testing any action that requires signing.
|
45
|
+
def request_signed_by(client, get_params={}, post_params={}, env={}, opts={})
|
46
|
+
raise RuntimeError, "client #{client.inspect} is not a saved record, has errors #{client.errors.inspect}" if client.new_record?
|
47
|
+
get_params = {
|
48
|
+
:oauth_consumer_key=>client.api_key
|
49
|
+
}.merge(get_params)
|
50
|
+
# Prepare headers
|
51
|
+
env = {
|
52
|
+
:request_method => "GET",
|
53
|
+
:http_host => "test.fullfat.com",
|
54
|
+
:request_uri=>"/secrets/"
|
55
|
+
}.merge(env)
|
56
|
+
env[:query_string] = get_params.collect{|k,v| "#{k}=#{v}"}.join("&")
|
57
|
+
# Extras
|
58
|
+
opts = {
|
59
|
+
:post_body=>post_params.collect{|k,v| "#{k}=#{v}"}.join("&")
|
60
|
+
}.merge(opts)
|
61
|
+
|
62
|
+
unsigned = fake_request(env, opts)
|
63
|
+
get_params[:oauth_signature] ||= Merb::Parse.escape(unsigned.build_signature)
|
64
|
+
env[:query_string] = get_params.collect{|k,v| "#{k}=#{v}"}.join("&")
|
65
|
+
|
66
|
+
signed = fake_request(env, opts)
|
67
|
+
#raise RuntimeError, "Request not properly signed. Got: #{signed.uri}?#{signed.params.collect{|k,v|"#{k}=#{v}"}.join("&")}, expected: #{signed.signature_base_string} / #{signed.signature_secret}" unless signed.signed?
|
68
|
+
#signed
|
69
|
+
end
|
70
|
+
|
71
|
+
# Signs a URL like "/controller/action" with the correct signature to avoid triggering the
|
72
|
+
# ensure_signed filter method.
|
73
|
+
def sign_url_with(client, url, params={})
|
74
|
+
signed = request_signed_by(client, params, {}, {:request_uri=>url, :http_host=>"localhost"})
|
75
|
+
return "#{signed.uri}?#{signed.query_string}"
|
76
|
+
end
|
77
|
+
|
78
|
+
# Override for buggy freaking redirect_to assertion in merb 0.9.11.
|
79
|
+
# duplicates syntax of old version, so can be safely removed once
|
80
|
+
# http://merb.lighthouseapp.com/projects/7433-merb/tickets/949-redirect_to-assertion-errors-on-success-under-some-setups
|
81
|
+
# is fixed.
|
82
|
+
def redirect_to(url)
|
83
|
+
simple_matcher("redirect to #{url.inspect}") do |controller, matcher|
|
84
|
+
actual_url = controller.rack_response[1]["Location"]
|
85
|
+
matcher.failure_message = "expected to be redirected to #{url.inspect} but instead was redirected to #{actual_url.inspect}"
|
86
|
+
actual_url == url
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
# this loads all plugins required in your init file so don't add them
|
95
|
+
# here again, Merb will do it for you
|
96
|
+
#Merb.start_environment(:testing => true, :adapter => 'runner', :environment => ENV['MERB_ENV'] || 'test')
|
97
|
+
# Migrate that shit
|
98
|
+
DataMapper.auto_migrate!
|
99
|
+
# Load fixtures
|
100
|
+
require File.join(File.dirname(__FILE__), 'spec_fixtures')
|
101
|
+
|
102
|
+
Spec::Runner.configure do |config|
|
103
|
+
config.include(Merb::Test::ViewHelper)
|
104
|
+
config.include(Merb::Test::RouteHelper)
|
105
|
+
config.include(Merb::Test::ControllerHelper)
|
106
|
+
config.include(Merb::Test::SliceHelper)
|
107
|
+
end
|
metadata
ADDED
@@ -0,0 +1,133 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: danski-ooh-auth
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Dan Glegg
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2008-10-22 00:00:00 -07:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: ruby-hmac
|
17
|
+
version_requirement:
|
18
|
+
version_requirements: !ruby/object:Gem::Requirement
|
19
|
+
requirements:
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 0.3.2
|
23
|
+
version:
|
24
|
+
- !ruby/object:Gem::Dependency
|
25
|
+
name: merb-slices
|
26
|
+
version_requirement:
|
27
|
+
version_requirements: !ruby/object:Gem::Requirement
|
28
|
+
requirements:
|
29
|
+
- - ">="
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
version: 0.9.10
|
32
|
+
version:
|
33
|
+
description: Merb slice that adds OAuth provider capabilities to any merb-auth application.
|
34
|
+
email: dan@angryameoba.co.uk
|
35
|
+
executables: []
|
36
|
+
|
37
|
+
extensions: []
|
38
|
+
|
39
|
+
extra_rdoc_files:
|
40
|
+
- readme.markdown
|
41
|
+
- LICENSE
|
42
|
+
files:
|
43
|
+
- LICENSE
|
44
|
+
- readme.markdown
|
45
|
+
- Rakefile
|
46
|
+
- lib/ooh-auth
|
47
|
+
- lib/ooh-auth/authentication_mixin.rb
|
48
|
+
- lib/ooh-auth/controller_mixin.rb
|
49
|
+
- lib/ooh-auth/key_generators.rb
|
50
|
+
- lib/ooh-auth/merbtasks.rb
|
51
|
+
- lib/ooh-auth/request_verification_mixin.rb
|
52
|
+
- lib/ooh-auth/slicetasks.rb
|
53
|
+
- lib/ooh-auth/spectasks.rb
|
54
|
+
- lib/ooh-auth/strategies
|
55
|
+
- lib/ooh-auth/strategies/oauth.rb
|
56
|
+
- lib/ooh-auth.rb
|
57
|
+
- spec/controllers
|
58
|
+
- spec/controllers/application_spec.rb
|
59
|
+
- spec/controllers/authenticating_clients_spec.rb
|
60
|
+
- spec/controllers/tokens_spec.rb
|
61
|
+
- spec/merb-auth-slice-fullfat_spec.rb
|
62
|
+
- spec/models
|
63
|
+
- spec/models/authenticating_client_spec.rb
|
64
|
+
- spec/models/oauth_strategy_spec.rb
|
65
|
+
- spec/models/request_verification_mixin_spec.rb
|
66
|
+
- spec/models/token_spec.rb
|
67
|
+
- spec/spec_fixtures.rb
|
68
|
+
- spec/spec_helper.rb
|
69
|
+
- app/controllers
|
70
|
+
- app/controllers/application.rb
|
71
|
+
- app/controllers/authenticating_clients.rb
|
72
|
+
- app/controllers/tokens.rb
|
73
|
+
- app/helpers
|
74
|
+
- app/helpers/application_helper.rb
|
75
|
+
- app/helpers/authenticating_clients_helper.rb
|
76
|
+
- app/helpers/authentications_helper.rb
|
77
|
+
- app/models
|
78
|
+
- app/models/authenticating_client
|
79
|
+
- app/models/authenticating_client/dm_authenticating_client.rb
|
80
|
+
- app/models/authenticating_client.rb
|
81
|
+
- app/models/token
|
82
|
+
- app/models/token/dm_token.rb
|
83
|
+
- app/models/token.rb
|
84
|
+
- app/views
|
85
|
+
- app/views/authenticating_clients
|
86
|
+
- app/views/authenticating_clients/_help.html.erb
|
87
|
+
- app/views/authenticating_clients/edit.html.erb
|
88
|
+
- app/views/authenticating_clients/index.html.erb
|
89
|
+
- app/views/authenticating_clients/new.html.erb
|
90
|
+
- app/views/authenticating_clients/show.html.erb
|
91
|
+
- app/views/layout
|
92
|
+
- app/views/layout/ooh_auth.html.erb
|
93
|
+
- app/views/tokens
|
94
|
+
- app/views/tokens/create.html.erb
|
95
|
+
- app/views/tokens/edit.html.erb
|
96
|
+
- app/views/tokens/new.html.erb
|
97
|
+
- app/views/tokens/show.html.erb
|
98
|
+
- public/javascripts
|
99
|
+
- public/javascripts/master.js
|
100
|
+
- public/stylesheets
|
101
|
+
- public/stylesheets/master.css
|
102
|
+
- stubs/app
|
103
|
+
- stubs/app/controllers
|
104
|
+
- stubs/app/controllers/application.rb
|
105
|
+
- stubs/app/controllers/main.rb
|
106
|
+
has_rdoc: true
|
107
|
+
homepage: http://github.com/danski/ooh-auth
|
108
|
+
post_install_message:
|
109
|
+
rdoc_options: []
|
110
|
+
|
111
|
+
require_paths:
|
112
|
+
- lib
|
113
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: "0"
|
118
|
+
version:
|
119
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - ">="
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: "0"
|
124
|
+
version:
|
125
|
+
requirements: []
|
126
|
+
|
127
|
+
rubyforge_project: merb
|
128
|
+
rubygems_version: 1.2.0
|
129
|
+
signing_key:
|
130
|
+
specification_version: 2
|
131
|
+
summary: Merb Slice that provides RESTful authentication functionality for your application.
|
132
|
+
test_files: []
|
133
|
+
|