opro 0.0.1.pre1.0.2 → 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -0
- data/Gemfile.lock +4 -0
- data/app/controllers/oauth/auth_controller.rb +10 -0
- data/app/controllers/oauth/tests_controller.rb +31 -3
- data/app/controllers/opro_application_controller.rb +1 -1
- data/app/models/oauth/access_grant.rb +11 -1
- data/app/models/oauth/client_application.rb +4 -0
- data/app/views/oauth/auth/new.html.erb +24 -4
- data/app/views/oauth/tests/index.html.erb +1 -1
- data/lib/generators/active_record/templates/access_grants.rb +8 -7
- data/lib/generators/active_record/templates/client_applications.rb +1 -0
- data/lib/generators/templates/opro.rb +8 -2
- data/lib/opro.rb +14 -5
- data/lib/opro/controllers/application_controller_helper.rb +17 -4
- data/lib/opro/controllers/concerns/error_messages.rb +23 -0
- data/lib/opro/controllers/concerns/permissions.rb +89 -0
- data/opro.gemspec +13 -5
- data/test/controllers/permissions_test.rb +27 -0
- data/test/dummy/app/controllers/products_controller.rb +8 -0
- data/test/dummy/app/views/pages/index.html.erb +2 -1
- data/test/dummy/app/views/products/create.html.erb +1 -0
- data/test/dummy/config/initializers/opro.rb +7 -1
- data/test/dummy/config/routes.rb +2 -0
- data/test/dummy/db/migrate/20120514060322_create_opro_access_grants.rb +15 -0
- data/test/dummy/db/migrate/{20120408165730_create_opro_client_applications.rb → 20120514060323_create_opro_client_applications.rb} +1 -0
- data/test/dummy/db/schema.rb +5 -3
- data/test/integration/auth_controller_test.rb +22 -8
- data/test/test_helper.rb +1 -3
- metadata +46 -30
- data/test/dummy/db/migrate/20120408165729_create_opro_access_grants.rb +0 -14
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -64,7 +64,10 @@ GEM
|
|
64
64
|
i18n (>= 0.4.0)
|
65
65
|
mime-types (~> 1.16)
|
66
66
|
treetop (~> 1.4.8)
|
67
|
+
metaclass (0.0.1)
|
67
68
|
mime-types (1.18)
|
69
|
+
mocha (0.11.4)
|
70
|
+
metaclass (~> 0.0.1)
|
68
71
|
multi_json (1.2.0)
|
69
72
|
nokogiri (1.5.2)
|
70
73
|
orm_adapter (0.0.7)
|
@@ -132,6 +135,7 @@ DEPENDENCIES
|
|
132
135
|
devise
|
133
136
|
jeweler (~> 1.6.4)
|
134
137
|
launchy
|
138
|
+
mocha
|
135
139
|
rails (>= 3.0.7)
|
136
140
|
rcov
|
137
141
|
simplecov
|
@@ -6,12 +6,15 @@ class Oauth::AuthController < ApplicationController
|
|
6
6
|
def new
|
7
7
|
@redirect_uri = params[:redirect_uri]
|
8
8
|
@client_app = Oauth::ClientApplication.find_by_app_id(params[:client_id])
|
9
|
+
@scopes = scope_from_params(params)
|
9
10
|
end
|
10
11
|
|
11
12
|
def authorize
|
12
13
|
application = Oauth::ClientApplication.find_by_app_id(params[:client_id])
|
14
|
+
permissions = params[:permissions]
|
13
15
|
access_grant = Oauth::AccessGrant.where( :user_id => current_user.id, :application_id => application.id).first
|
14
16
|
access_grant ||= Oauth::AccessGrant.create(:user => current_user, :application => application)
|
17
|
+
access_grant.update_attributes(:permissions => permissions) if access_grant.permissions != permissions
|
15
18
|
redirect_to access_grant.redirect_uri_for(params[:redirect_uri])
|
16
19
|
end
|
17
20
|
|
@@ -57,6 +60,13 @@ class Oauth::AuthController < ApplicationController
|
|
57
60
|
Oauth::AccessGrant.where(:application_id => @client_app.id, :user_id => user.id).present?
|
58
61
|
end
|
59
62
|
|
63
|
+
def scope_from_params(params)
|
64
|
+
requested_scope = (params[:scope]||[]).map(&:downcase)
|
65
|
+
default_scope = ::Opro.request_permissions.map(&:to_s).map(&:downcase)
|
66
|
+
return default_scope if requested_scope.blank?
|
67
|
+
requested_scope & default_scope
|
68
|
+
end
|
69
|
+
|
60
70
|
|
61
71
|
# We're verifying that a post was made from our own site, indicating a user confirmed via form
|
62
72
|
def user_authorizes_the_request?(request)
|
@@ -23,6 +23,23 @@ class Oauth::TestsController < ApplicationController
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
+
def create
|
27
|
+
result = if valid_oauth?
|
28
|
+
{:status => 200, :message => 'OAuth Worked!!', :params => params, :user_id => oauth_user.id }
|
29
|
+
else
|
30
|
+
{:status => 401, :message => "OAuth Did not Work D: #{generate_oauth_error_message!}", :params => params}
|
31
|
+
end
|
32
|
+
|
33
|
+
respond_to do |format|
|
34
|
+
format.html do
|
35
|
+
render :text => result.to_json, :status => result[:status], :layout => true
|
36
|
+
end
|
37
|
+
format.json do
|
38
|
+
render :json => result, :status => result[:status]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
26
43
|
def destroy
|
27
44
|
result = if valid_oauth?
|
28
45
|
{:status => 200, :message => 'OHNO!!! OAuth is Disabled on this Action, this is bad', :params => params}
|
@@ -44,9 +61,20 @@ class Oauth::TestsController < ApplicationController
|
|
44
61
|
|
45
62
|
def generate_oauth_error_message!
|
46
63
|
msg = ""
|
47
|
-
msg << ' - No OAuth Token Provided!'
|
48
|
-
msg << ' - Allow OAuth set to false!'
|
49
|
-
msg << ' - OAuth user not found!'
|
64
|
+
msg << ' - No OAuth Token Provided!' if params[:access_token].blank?
|
65
|
+
msg << ' - Allow OAuth set to false!' if allow_oauth? == false
|
66
|
+
msg << ' - OAuth user not found!' if oauth_user.blank?
|
67
|
+
generate_oauth_permissions_error_message!(msg)
|
68
|
+
msg
|
69
|
+
end
|
70
|
+
|
71
|
+
def generate_oauth_permissions_error_message!(msg = '')
|
72
|
+
if !oauth_client_has_permissions?
|
73
|
+
msg << ' - OAuth client not permitted'
|
74
|
+
oauth_required_permissions.each do |permission|
|
75
|
+
msg << "- #{permission} permission required;" unless oauth_client_has_permission?(permission)
|
76
|
+
end
|
77
|
+
end
|
50
78
|
msg
|
51
79
|
end
|
52
80
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
class ApplicationController < ActionController::Base
|
2
2
|
|
3
3
|
# Any code that would/should go into ApplicationController is
|
4
|
-
#
|
4
|
+
# now in lib/opro/conrollers/application_controller_helper.rb
|
5
5
|
# it is loaded into ApplicationController in lib/opro/engine.rb
|
6
6
|
# thanks for visiting, come back soon
|
7
7
|
|
@@ -12,13 +12,23 @@ class Oauth::AccessGrant < ActiveRecord::Base
|
|
12
12
|
|
13
13
|
alias_attribute :token, :access_token
|
14
14
|
|
15
|
+
serialize :permissions, Hash
|
16
|
+
|
17
|
+
def can?(value)
|
18
|
+
permissions[value.to_s]
|
19
|
+
end
|
20
|
+
|
15
21
|
def self.prune!
|
16
22
|
# UPDATEME
|
17
23
|
# delete_all(["created_at < ?", 3.days.ago])
|
18
24
|
end
|
19
25
|
|
26
|
+
def self.find_for_token(token)
|
27
|
+
self.where(:access_token => token).includes(:user, :client_application).first
|
28
|
+
end
|
29
|
+
|
20
30
|
def self.find_user_for_token(token)
|
21
|
-
|
31
|
+
find_app_for_token.try(:user)
|
22
32
|
end
|
23
33
|
|
24
34
|
def self.authenticate(code, application_id)
|
@@ -10,6 +10,10 @@ class Oauth::ClientApplication < ActiveRecord::Base
|
|
10
10
|
alias_attribute :client_secret, :app_secret
|
11
11
|
alias_attribute :secret, :app_secret
|
12
12
|
|
13
|
+
serialize :permissions, Hash
|
14
|
+
|
15
|
+
|
16
|
+
|
13
17
|
def self.authenticate(app_id, app_secret)
|
14
18
|
where(["app_id = ? AND app_secret = ?", app_id, app_secret]).first
|
15
19
|
end
|
@@ -1,8 +1,28 @@
|
|
1
|
-
<h2
|
2
|
-
|
1
|
+
<h2>Authorization Request</h2>
|
2
|
+
|
3
|
+
|
4
|
+
<p>
|
5
|
+
<%= @client_app.name %> would like to access your Data. Only accept if you know them, you will then be redirected back to: "<%= @redirect_uri %>".
|
6
|
+
</p>
|
3
7
|
|
4
8
|
<%= form_for @client_app, :url => oauth_authorize_path(:client_id => @client_app.client_id, :redirect_uri => @redirect_uri), :method => :post do |f| %>
|
5
|
-
|
9
|
+
|
10
|
+
|
11
|
+
I Authorize <%= @client_app.name %> to:
|
12
|
+
|
13
|
+
|
14
|
+
<ul>
|
15
|
+
|
16
|
+
<li><%= check_box_tag 'permissions[read]', 1, true, {:disabled => true} %> Read</li>
|
17
|
+
|
18
|
+
<% @scopes.each do |permission| %>
|
19
|
+
<% is_checked = @client_app.permissions.key?(permission) ? @client_app.permissions[permission] : true %>
|
20
|
+
<li><%= check_box_tag "permissions[#{permission}]", 1, is_checked %> <%= permission.capitalize %></li>
|
21
|
+
<% end %>
|
22
|
+
</ul>
|
23
|
+
|
24
|
+
<%= f.submit 'Authorize This Application', :id => 'oauthAuthorize' %>
|
6
25
|
<%- end -%>
|
7
26
|
|
8
|
-
<%= button_to '
|
27
|
+
<%= button_to 'Decline this Request', request.referrer, :id => 'oauthNoAuthorize' %>
|
28
|
+
|
@@ -15,7 +15,7 @@
|
|
15
15
|
<h2>Test OAuth Disallow</h2>
|
16
16
|
<p>
|
17
17
|
If you send a valid OAuth request using the 'DELETE' HTTP method to <%= oauth_test_path(:show_me_the_money) %> you should see a response like below.</p>
|
18
|
-
<%= button_to oauth_test_path(:show_me_the_money), oauth_test_path(:show_me_the_money), :method => :delete %>
|
18
|
+
<%= button_to oauth_test_path(:show_me_the_money), oauth_test_path(:show_me_the_money), :method => :delete, :id => 'deleteButton' %>
|
19
19
|
<pre><code><%= {:status => 401, :message => 'Oauth is Disabled on this Action, this is the correct result!', :params => {:id => 'show_me_the_money', :access_token => '3948fuAlo10gnsu'}}.to_json %></code></pre>
|
20
20
|
|
21
21
|
<p>
|
@@ -1,12 +1,13 @@
|
|
1
1
|
class CreateOproAccessGrants < ActiveRecord::Migration
|
2
2
|
def change
|
3
|
-
create_table
|
4
|
-
t.string
|
5
|
-
t.string
|
6
|
-
t.string
|
7
|
-
t.
|
8
|
-
t.
|
9
|
-
t.integer
|
3
|
+
create_table :opro_access_grants do |t|
|
4
|
+
t.string :code
|
5
|
+
t.string :access_token
|
6
|
+
t.string :refresh_token
|
7
|
+
t.text :permissions
|
8
|
+
t.datetime :access_token_expires_at
|
9
|
+
t.integer :user_id
|
10
|
+
t.integer :application_id
|
10
11
|
|
11
12
|
t.timestamps
|
12
13
|
end
|
@@ -1,4 +1,10 @@
|
|
1
1
|
Opro.setup do |config|
|
2
|
-
##
|
3
|
-
|
2
|
+
## Configure the auth_strategy or use set :login_method, :logout_method, & :authenticate_user_method
|
3
|
+
config.auth_strategy = :devise
|
4
|
+
|
5
|
+
## Add or remove application permissions
|
6
|
+
# Read permission is turned on by default (any request with [GET])
|
7
|
+
# Write permission is requestable by default (any request other than [GET])
|
8
|
+
# Custom permissions can be configured by adding them to the request_permissions Array and configuring require_oauth_permissions in the controller
|
9
|
+
config.request_permissions = [:write]
|
4
10
|
end
|
data/lib/opro.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
module Opro
|
2
|
-
|
3
2
|
module Controllers
|
3
|
+
module Concerns
|
4
|
+
end
|
4
5
|
end
|
6
|
+
|
5
7
|
# Include helpers in the given scope to AC and AV.
|
6
8
|
def self.include_helpers(scope)
|
7
9
|
ActiveSupport.on_load(:action_controller) do
|
@@ -39,7 +41,7 @@ module Opro
|
|
39
41
|
logout_method.call(*args)
|
40
42
|
end
|
41
43
|
|
42
|
-
|
44
|
+
# Used by set_login_logout_methods to pre-define login, logout, and authenticate methods
|
43
45
|
def self.auth_strategy(auth_strategy = nil)
|
44
46
|
if auth_strategy.present?
|
45
47
|
@auth_strategy = auth_strategy
|
@@ -61,6 +63,14 @@ module Opro
|
|
61
63
|
end
|
62
64
|
end
|
63
65
|
|
66
|
+
def self.request_permissions=(permissions)
|
67
|
+
@request_permissions = permissions
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.request_permissions
|
71
|
+
@request_permissions || []
|
72
|
+
end
|
73
|
+
|
64
74
|
|
65
75
|
def self.logout_method(&block)
|
66
76
|
if block.present?
|
@@ -79,8 +89,7 @@ module Opro
|
|
79
89
|
end
|
80
90
|
end
|
81
91
|
|
82
|
-
|
83
|
-
|
84
|
-
# require 'opro/controller/concerns/path'
|
92
|
+
require 'opro/controllers/concerns/error_messages'
|
93
|
+
require 'opro/controllers/concerns/permissions'
|
85
94
|
require 'opro/controllers/application_controller_helper'
|
86
95
|
require 'opro/engine'
|
@@ -5,6 +5,9 @@ module Opro
|
|
5
5
|
module ApplicationControllerHelper
|
6
6
|
extend ActiveSupport::Concern
|
7
7
|
|
8
|
+
include Opro::Controllers::Concerns::Permissions
|
9
|
+
include Opro::Controllers::Concerns::ErrorMessages
|
10
|
+
|
8
11
|
included do
|
9
12
|
around_filter :oauth_auth!
|
10
13
|
skip_before_filter :verify_authenticity_token, :if => :valid_oauth?
|
@@ -23,6 +26,7 @@ module Opro
|
|
23
26
|
prepend_before_filter :disallow_oauth, options
|
24
27
|
skip_before_filter :allow_oauth, options
|
25
28
|
end
|
29
|
+
|
26
30
|
end
|
27
31
|
|
28
32
|
protected
|
@@ -31,6 +35,11 @@ module Opro
|
|
31
35
|
@use_oauth ||= false
|
32
36
|
end
|
33
37
|
|
38
|
+
# returns boolean if oauth request
|
39
|
+
def valid_oauth?
|
40
|
+
oauth? && oauth_user.present? && oauth_client_has_permissions?
|
41
|
+
end
|
42
|
+
|
34
43
|
def disallow_oauth
|
35
44
|
@use_oauth = false
|
36
45
|
end
|
@@ -43,12 +52,16 @@ module Opro
|
|
43
52
|
allow_oauth? && params[:access_token].present?
|
44
53
|
end
|
45
54
|
|
46
|
-
def
|
47
|
-
@
|
55
|
+
def oauth_access_grant
|
56
|
+
@oauth_access_grant ||= Oauth::AccessGrant.find_for_token(params[:access_token])
|
48
57
|
end
|
49
58
|
|
50
|
-
def
|
51
|
-
|
59
|
+
def oauth_client_app
|
60
|
+
@oauth_client_app ||= oauth_access_grant.client_application
|
61
|
+
end
|
62
|
+
|
63
|
+
def oauth_user
|
64
|
+
@oauth_user ||= oauth_access_grant.user
|
52
65
|
end
|
53
66
|
|
54
67
|
def oauth_auth!
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Opro::Controllers::Concerns::ErrorMessages
|
2
|
+
extend ActiveSupport::Concern
|
3
|
+
|
4
|
+
def generate_oauth_error_message!
|
5
|
+
msg = ""
|
6
|
+
msg << ' - No OAuth Token Provided!' if params[:access_token].blank?
|
7
|
+
msg << ' - Allow OAuth set to false!' if allow_oauth? == false
|
8
|
+
msg << ' - OAuth user not found!' if oauth_user.blank?
|
9
|
+
msg = generate_oauth_permissions_error_message!(msg)
|
10
|
+
msg
|
11
|
+
end
|
12
|
+
|
13
|
+
def generate_oauth_permissions_error_message!(msg = '')
|
14
|
+
if !oauth_client_has_permissions?
|
15
|
+
msg << ' - OAuth client not permitted'
|
16
|
+
oauth_required_permissions.each do |permission|
|
17
|
+
msg << "- #{permission} permission required;" unless oauth_client_has_permission?(permission)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
msg
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
module Opro::Controllers::Concerns::Permissions
|
2
|
+
extend ActiveSupport::Concern
|
3
|
+
|
4
|
+
# By default :write permission is required if included in Opro.request_permissions
|
5
|
+
# returns Array
|
6
|
+
def global_oauth_required_permissions
|
7
|
+
[:write] & Opro.request_permissions
|
8
|
+
end
|
9
|
+
|
10
|
+
# returns Array of permissions required for controller action
|
11
|
+
def oauth_required_permissions
|
12
|
+
(@oauth_required_permissions || global_oauth_required_permissions) - skip_oauth_required_permissions
|
13
|
+
end
|
14
|
+
|
15
|
+
def skip_oauth_required_permissions
|
16
|
+
@skip_oauth_required_permissions ||= []
|
17
|
+
end
|
18
|
+
|
19
|
+
def skip_oauth_required_permission(permission)
|
20
|
+
@skip_oauth_required_permissions << permission
|
21
|
+
@skip_oauth_required_permissions
|
22
|
+
end
|
23
|
+
|
24
|
+
def add_oauth_required_permission(permission)
|
25
|
+
@oauth_required_permissions ||= global_oauth_required_permissions
|
26
|
+
@oauth_required_permissions << permission
|
27
|
+
end
|
28
|
+
|
29
|
+
# Checks to make sure client has given permission
|
30
|
+
# permission checks can be extended by creating methods
|
31
|
+
# oauth_client_can_:method? so to over-write a default check for
|
32
|
+
# :write permission, you would need to define oauth_client_can_write?
|
33
|
+
def oauth_client_has_permissions?
|
34
|
+
permissions_valid_array = []
|
35
|
+
oauth_required_permissions.each do |permission|
|
36
|
+
permissions_valid_array << oauth_client_has_permission?(permission)
|
37
|
+
end
|
38
|
+
|
39
|
+
return true unless permissions_valid_array.include?(false)
|
40
|
+
false
|
41
|
+
end
|
42
|
+
|
43
|
+
def oauth_client_has_permission?(permission)
|
44
|
+
oauth_permission_method = "oauth_client_can_#{permission}?".to_sym
|
45
|
+
if respond_to?(oauth_permission_method)
|
46
|
+
has_permission = method(oauth_permission_method).call
|
47
|
+
else
|
48
|
+
has_permission = oauth_access_grant.can?(permission.to_sym)
|
49
|
+
end
|
50
|
+
has_permission
|
51
|
+
end
|
52
|
+
|
53
|
+
# Returns boolean
|
54
|
+
# if client has been granted write permissions or request is a 'GET' returns true
|
55
|
+
def oauth_client_can_write?
|
56
|
+
return true if env['REQUEST_METHOD'] == 'GET'
|
57
|
+
return true if oauth_access_grant.can?(:write)
|
58
|
+
false
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
module ClassMethods
|
63
|
+
|
64
|
+
def skip_oauth_permissions(*args)
|
65
|
+
options = args.last.is_a?(Hash) ? callbacks.pop : {}
|
66
|
+
permissions = args
|
67
|
+
prepend_before_filter(options) do
|
68
|
+
permissions.each do |permission|
|
69
|
+
controller.skip_oauth_required_permission(permission)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
alias :skip_oauth_permission :skip_oauth_permissions
|
74
|
+
|
75
|
+
# pass in array of permissions to be validated, add options to pass to filter
|
76
|
+
def require_oauth_permissions(*args)
|
77
|
+
options = args.last.is_a?(Hash) ? args.pop : {}
|
78
|
+
permissions = args
|
79
|
+
prepend_before_filter(options) do
|
80
|
+
permissions.each do |permission|
|
81
|
+
raise "You must add #{permission.inspect} to the Opro request_permissions in an initializer" unless Opro.request_permissions.include?(permission)
|
82
|
+
controller.add_oauth_required_permission(permission)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
alias :require_oauth_permission :require_oauth_permissions
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
data/opro.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "opro"
|
8
|
-
s.version = "0.0.1
|
8
|
+
s.version = "0.0.1"
|
9
9
|
|
10
|
-
s.required_rubygems_version = Gem::Requirement.new("
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["schneems"]
|
12
|
-
s.date = "2012-
|
12
|
+
s.date = "2012-06-14"
|
13
13
|
s.description = " Enable OAuth clients (iphone, android, web sites, etc.) to access and use your Rails application, what you do with it is up to you"
|
14
14
|
s.email = "richard.schneeman@gmail.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -48,15 +48,20 @@ Gem::Specification.new do |s|
|
|
48
48
|
"lib/generators/templates/opro.rb",
|
49
49
|
"lib/opro.rb",
|
50
50
|
"lib/opro/controllers/application_controller_helper.rb",
|
51
|
+
"lib/opro/controllers/concerns/error_messages.rb",
|
52
|
+
"lib/opro/controllers/concerns/permissions.rb",
|
51
53
|
"lib/opro/engine.rb",
|
52
54
|
"opro.gemspec",
|
55
|
+
"test/controllers/permissions_test.rb",
|
53
56
|
"test/dummy/Rakefile",
|
54
57
|
"test/dummy/app/controllers/application_controller.rb",
|
55
58
|
"test/dummy/app/controllers/pages_controller.rb",
|
59
|
+
"test/dummy/app/controllers/products_controller.rb",
|
56
60
|
"test/dummy/app/helpers/application_helper.rb",
|
57
61
|
"test/dummy/app/models/user.rb",
|
58
62
|
"test/dummy/app/views/layouts/application.html.erb",
|
59
63
|
"test/dummy/app/views/pages/index.html.erb",
|
64
|
+
"test/dummy/app/views/products/create.html.erb",
|
60
65
|
"test/dummy/config.ru",
|
61
66
|
"test/dummy/config/application.rb",
|
62
67
|
"test/dummy/config/boot.rb",
|
@@ -76,8 +81,8 @@ Gem::Specification.new do |s|
|
|
76
81
|
"test/dummy/config/locales/en.yml",
|
77
82
|
"test/dummy/config/routes.rb",
|
78
83
|
"test/dummy/db/migrate/20120408163038_devise_create_users.rb",
|
79
|
-
"test/dummy/db/migrate/
|
80
|
-
"test/dummy/db/migrate/
|
84
|
+
"test/dummy/db/migrate/20120514060322_create_opro_access_grants.rb",
|
85
|
+
"test/dummy/db/migrate/20120514060323_create_opro_client_applications.rb",
|
81
86
|
"test/dummy/db/schema.rb",
|
82
87
|
"test/dummy/public/404.html",
|
83
88
|
"test/dummy/public/422.html",
|
@@ -112,6 +117,7 @@ Gem::Specification.new do |s|
|
|
112
117
|
s.add_runtime_dependency(%q<activesupport>, [">= 3.0.7"])
|
113
118
|
s.add_runtime_dependency(%q<rails>, [">= 3.0.7"])
|
114
119
|
s.add_runtime_dependency(%q<bluecloth>, [">= 0"])
|
120
|
+
s.add_development_dependency(%q<mocha>, [">= 0"])
|
115
121
|
s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
|
116
122
|
s.add_development_dependency(%q<bundler>, [">= 1.1.3"])
|
117
123
|
s.add_development_dependency(%q<capybara>, [">= 0.4.0"])
|
@@ -124,6 +130,7 @@ Gem::Specification.new do |s|
|
|
124
130
|
s.add_dependency(%q<activesupport>, [">= 3.0.7"])
|
125
131
|
s.add_dependency(%q<rails>, [">= 3.0.7"])
|
126
132
|
s.add_dependency(%q<bluecloth>, [">= 0"])
|
133
|
+
s.add_dependency(%q<mocha>, [">= 0"])
|
127
134
|
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
128
135
|
s.add_dependency(%q<bundler>, [">= 1.1.3"])
|
129
136
|
s.add_dependency(%q<capybara>, [">= 0.4.0"])
|
@@ -137,6 +144,7 @@ Gem::Specification.new do |s|
|
|
137
144
|
s.add_dependency(%q<activesupport>, [">= 3.0.7"])
|
138
145
|
s.add_dependency(%q<rails>, [">= 3.0.7"])
|
139
146
|
s.add_dependency(%q<bluecloth>, [">= 0"])
|
147
|
+
s.add_dependency(%q<mocha>, [">= 0"])
|
140
148
|
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
141
149
|
s.add_dependency(%q<bundler>, [">= 1.1.3"])
|
142
150
|
s.add_dependency(%q<capybara>, [">= 0.4.0"])
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class Oauth::TestsControllerTest < ActionController::TestCase
|
4
|
+
tests Oauth::TestsController
|
5
|
+
include Devise::TestHelpers
|
6
|
+
|
7
|
+
setup do
|
8
|
+
@user = create_user
|
9
|
+
@auth_grant = create_auth_grant_for_user(@user)
|
10
|
+
end
|
11
|
+
|
12
|
+
test "access_token with write ability can :POST" do
|
13
|
+
permissions = {'write' => true}
|
14
|
+
@auth_grant.update_attributes(:permissions => permissions)
|
15
|
+
|
16
|
+
post :create, access_token: @auth_grant.access_token, format: :json
|
17
|
+
assert_response :success
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
test "access_token with NO write ability can NOT POST" do
|
22
|
+
permissions = {:write => false}
|
23
|
+
@auth_grant.update_attributes(:permissions => permissions)
|
24
|
+
post :create, access_token: @auth_grant.access_token, format: :json
|
25
|
+
assert_response 401
|
26
|
+
end
|
27
|
+
end
|
@@ -1 +1,2 @@
|
|
1
|
-
Home
|
1
|
+
Home
|
2
|
+
|
@@ -0,0 +1 @@
|
|
1
|
+
Worked
|
@@ -1,4 +1,10 @@
|
|
1
1
|
Opro.setup do |config|
|
2
|
-
##
|
2
|
+
## Configure the auth_strategy or use set :login_method, :logout_method, & :authenticate_user_method
|
3
3
|
config.auth_strategy = :devise
|
4
|
+
|
5
|
+
## Add or remove application permissions
|
6
|
+
# Read permission is turned on by default (any request with [GET])
|
7
|
+
# Write permission is requestable by default (any request other than [GET])
|
8
|
+
# Custom permissions can be configured by adding them to the request_permissions Array and configuring require_oauth_permissions in the controller
|
9
|
+
config.request_permissions = [:write]
|
4
10
|
end
|
data/test/dummy/config/routes.rb
CHANGED
@@ -0,0 +1,15 @@
|
|
1
|
+
class CreateOproAccessGrants < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :opro_access_grants do |t|
|
4
|
+
t.string :code
|
5
|
+
t.string :access_token
|
6
|
+
t.string :refresh_token
|
7
|
+
t.text :permissions
|
8
|
+
t.datetime :access_token_expires_at
|
9
|
+
t.integer :user_id
|
10
|
+
t.integer :application_id
|
11
|
+
|
12
|
+
t.timestamps
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/test/dummy/db/schema.rb
CHANGED
@@ -11,12 +11,13 @@
|
|
11
11
|
#
|
12
12
|
# It's strongly recommended to check this file into your version control system.
|
13
13
|
|
14
|
-
ActiveRecord::Schema.define(:version =>
|
14
|
+
ActiveRecord::Schema.define(:version => 20120514060323) do
|
15
15
|
|
16
16
|
create_table "opro_access_grants", :force => true do |t|
|
17
17
|
t.string "code"
|
18
18
|
t.string "access_token"
|
19
19
|
t.string "refresh_token"
|
20
|
+
t.text "permissions"
|
20
21
|
t.datetime "access_token_expires_at"
|
21
22
|
t.integer "user_id"
|
22
23
|
t.integer "application_id"
|
@@ -28,9 +29,10 @@ ActiveRecord::Schema.define(:version => 20120408165730) do
|
|
28
29
|
t.string "name"
|
29
30
|
t.string "app_id"
|
30
31
|
t.string "app_secret"
|
32
|
+
t.text "permissions"
|
31
33
|
t.integer "user_id"
|
32
|
-
t.datetime "created_at",
|
33
|
-
t.datetime "updated_at",
|
34
|
+
t.datetime "created_at", :null => false
|
35
|
+
t.datetime "updated_at", :null => false
|
34
36
|
end
|
35
37
|
|
36
38
|
create_table "users", :force => true do |t|
|
@@ -2,22 +2,36 @@ require 'test_helper'
|
|
2
2
|
|
3
3
|
class AuthControllerTest < ActiveSupport::IntegrationCase
|
4
4
|
|
5
|
+
setup do
|
6
|
+
@app = create_client_app
|
7
|
+
@user = create_user
|
8
|
+
@redirect_uri = '/'
|
9
|
+
end
|
10
|
+
|
5
11
|
test 'auth entry point should not be accessable to logged OUT users' do
|
6
|
-
visit oauth_new_path
|
12
|
+
visit oauth_new_path(:client_id => @app.client_id, :redirect_uri => '/')
|
7
13
|
assert_equal '/users/sign_in', current_path
|
8
14
|
end
|
9
15
|
|
10
|
-
test 'auth entry point is
|
11
|
-
app = create_client_app
|
12
|
-
user = create_user
|
13
|
-
redirect_uri = '/'
|
16
|
+
test 'auth entry point is accessible to logged IN users' do
|
14
17
|
|
15
|
-
as_user(user).visit oauth_new_path(:client_id => app.client_id, :redirect_uri => redirect_uri)
|
18
|
+
as_user(@user).visit oauth_new_path(:client_id => @app.client_id, :redirect_uri => @redirect_uri)
|
16
19
|
|
17
20
|
assert_equal '/oauth/new', current_path
|
18
21
|
|
19
22
|
click_button 'oauthAuthorize'
|
20
|
-
|
21
|
-
|
23
|
+
access_grant = Oauth::AccessGrant.where(:user_id => @user.id, :application_id => @app.id).first
|
24
|
+
assert_equal @redirect_uri, current_path
|
25
|
+
assert access_grant.present?
|
26
|
+
assert access_grant.can?(:write) # write access is checked by default
|
27
|
+
end
|
28
|
+
|
29
|
+
test 'user can remove permissions' do
|
30
|
+
as_user(@user).visit oauth_new_path(:client_id => @app.client_id, :redirect_uri => @redirect_uri)
|
31
|
+
|
32
|
+
uncheck('permissions_write') # uncheck write access
|
33
|
+
click_button 'oauthAuthorize'
|
34
|
+
access_grant = Oauth::AccessGrant.where(:user_id => @user.id, :application_id => @app.id).first
|
35
|
+
refute access_grant.can?(:write)
|
22
36
|
end
|
23
37
|
end
|
data/test/test_helper.rb
CHANGED
@@ -2,13 +2,11 @@
|
|
2
2
|
ENV["RAILS_ENV"] = "test"
|
3
3
|
|
4
4
|
|
5
|
-
|
6
5
|
ENGINE_RAILS_ROOT=File.join(File.dirname(__FILE__), '../')
|
7
6
|
require File.expand_path("../dummy/config/environment.rb", __FILE__)
|
8
7
|
require "rails/test_help"
|
9
8
|
|
10
|
-
|
11
|
-
|
9
|
+
require 'mocha'
|
12
10
|
|
13
11
|
ActionMailer::Base.delivery_method = :test
|
14
12
|
ActionMailer::Base.perform_deliveries = true
|
metadata
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: opro
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.1
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- schneems
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-06-14 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
16
|
-
requirement: &
|
16
|
+
requirement: &70350386690460 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 3.0.7
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70350386690460
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rails
|
27
|
-
requirement: &
|
27
|
+
requirement: &70350386683340 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 3.0.7
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70350386683340
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: bluecloth
|
38
|
-
requirement: &
|
38
|
+
requirement: &70350386682740 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,21 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70350386682740
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: mocha
|
49
|
+
requirement: &70350386682120 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *70350386682120
|
47
58
|
- !ruby/object:Gem::Dependency
|
48
59
|
name: jeweler
|
49
|
-
requirement: &
|
60
|
+
requirement: &70350386681480 !ruby/object:Gem::Requirement
|
50
61
|
none: false
|
51
62
|
requirements:
|
52
63
|
- - ~>
|
@@ -54,10 +65,10 @@ dependencies:
|
|
54
65
|
version: 1.6.4
|
55
66
|
type: :development
|
56
67
|
prerelease: false
|
57
|
-
version_requirements: *
|
68
|
+
version_requirements: *70350386681480
|
58
69
|
- !ruby/object:Gem::Dependency
|
59
70
|
name: bundler
|
60
|
-
requirement: &
|
71
|
+
requirement: &70350386680760 !ruby/object:Gem::Requirement
|
61
72
|
none: false
|
62
73
|
requirements:
|
63
74
|
- - ! '>='
|
@@ -65,10 +76,10 @@ dependencies:
|
|
65
76
|
version: 1.1.3
|
66
77
|
type: :development
|
67
78
|
prerelease: false
|
68
|
-
version_requirements: *
|
79
|
+
version_requirements: *70350386680760
|
69
80
|
- !ruby/object:Gem::Dependency
|
70
81
|
name: capybara
|
71
|
-
requirement: &
|
82
|
+
requirement: &70350386679900 !ruby/object:Gem::Requirement
|
72
83
|
none: false
|
73
84
|
requirements:
|
74
85
|
- - ! '>='
|
@@ -76,10 +87,10 @@ dependencies:
|
|
76
87
|
version: 0.4.0
|
77
88
|
type: :development
|
78
89
|
prerelease: false
|
79
|
-
version_requirements: *
|
90
|
+
version_requirements: *70350386679900
|
80
91
|
- !ruby/object:Gem::Dependency
|
81
92
|
name: sqlite3
|
82
|
-
requirement: &
|
93
|
+
requirement: &70350386678780 !ruby/object:Gem::Requirement
|
83
94
|
none: false
|
84
95
|
requirements:
|
85
96
|
- - ! '>='
|
@@ -87,10 +98,10 @@ dependencies:
|
|
87
98
|
version: '0'
|
88
99
|
type: :development
|
89
100
|
prerelease: false
|
90
|
-
version_requirements: *
|
101
|
+
version_requirements: *70350386678780
|
91
102
|
- !ruby/object:Gem::Dependency
|
92
103
|
name: launchy
|
93
|
-
requirement: &
|
104
|
+
requirement: &70350386678200 !ruby/object:Gem::Requirement
|
94
105
|
none: false
|
95
106
|
requirements:
|
96
107
|
- - ! '>='
|
@@ -98,10 +109,10 @@ dependencies:
|
|
98
109
|
version: '0'
|
99
110
|
type: :development
|
100
111
|
prerelease: false
|
101
|
-
version_requirements: *
|
112
|
+
version_requirements: *70350386678200
|
102
113
|
- !ruby/object:Gem::Dependency
|
103
114
|
name: devise
|
104
|
-
requirement: &
|
115
|
+
requirement: &70350386677300 !ruby/object:Gem::Requirement
|
105
116
|
none: false
|
106
117
|
requirements:
|
107
118
|
- - ! '>='
|
@@ -109,10 +120,10 @@ dependencies:
|
|
109
120
|
version: '0'
|
110
121
|
type: :development
|
111
122
|
prerelease: false
|
112
|
-
version_requirements: *
|
123
|
+
version_requirements: *70350386677300
|
113
124
|
- !ruby/object:Gem::Dependency
|
114
125
|
name: rcov
|
115
|
-
requirement: &
|
126
|
+
requirement: &70350386676560 !ruby/object:Gem::Requirement
|
116
127
|
none: false
|
117
128
|
requirements:
|
118
129
|
- - ! '>='
|
@@ -120,10 +131,10 @@ dependencies:
|
|
120
131
|
version: '0'
|
121
132
|
type: :development
|
122
133
|
prerelease: false
|
123
|
-
version_requirements: *
|
134
|
+
version_requirements: *70350386676560
|
124
135
|
- !ruby/object:Gem::Dependency
|
125
136
|
name: simplecov
|
126
|
-
requirement: &
|
137
|
+
requirement: &70350386675920 !ruby/object:Gem::Requirement
|
127
138
|
none: false
|
128
139
|
requirements:
|
129
140
|
- - ! '>='
|
@@ -131,7 +142,7 @@ dependencies:
|
|
131
142
|
version: '0'
|
132
143
|
type: :development
|
133
144
|
prerelease: false
|
134
|
-
version_requirements: *
|
145
|
+
version_requirements: *70350386675920
|
135
146
|
description: ! ' Enable OAuth clients (iphone, android, web sites, etc.) to access
|
136
147
|
and use your Rails application, what you do with it is up to you'
|
137
148
|
email: richard.schneeman@gmail.com
|
@@ -172,15 +183,20 @@ files:
|
|
172
183
|
- lib/generators/templates/opro.rb
|
173
184
|
- lib/opro.rb
|
174
185
|
- lib/opro/controllers/application_controller_helper.rb
|
186
|
+
- lib/opro/controllers/concerns/error_messages.rb
|
187
|
+
- lib/opro/controllers/concerns/permissions.rb
|
175
188
|
- lib/opro/engine.rb
|
176
189
|
- opro.gemspec
|
190
|
+
- test/controllers/permissions_test.rb
|
177
191
|
- test/dummy/Rakefile
|
178
192
|
- test/dummy/app/controllers/application_controller.rb
|
179
193
|
- test/dummy/app/controllers/pages_controller.rb
|
194
|
+
- test/dummy/app/controllers/products_controller.rb
|
180
195
|
- test/dummy/app/helpers/application_helper.rb
|
181
196
|
- test/dummy/app/models/user.rb
|
182
197
|
- test/dummy/app/views/layouts/application.html.erb
|
183
198
|
- test/dummy/app/views/pages/index.html.erb
|
199
|
+
- test/dummy/app/views/products/create.html.erb
|
184
200
|
- test/dummy/config.ru
|
185
201
|
- test/dummy/config/application.rb
|
186
202
|
- test/dummy/config/boot.rb
|
@@ -200,8 +216,8 @@ files:
|
|
200
216
|
- test/dummy/config/locales/en.yml
|
201
217
|
- test/dummy/config/routes.rb
|
202
218
|
- test/dummy/db/migrate/20120408163038_devise_create_users.rb
|
203
|
-
- test/dummy/db/migrate/
|
204
|
-
- test/dummy/db/migrate/
|
219
|
+
- test/dummy/db/migrate/20120514060322_create_opro_access_grants.rb
|
220
|
+
- test/dummy/db/migrate/20120514060323_create_opro_client_applications.rb
|
205
221
|
- test/dummy/db/schema.rb
|
206
222
|
- test/dummy/public/404.html
|
207
223
|
- test/dummy/public/422.html
|
@@ -237,13 +253,13 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
237
253
|
version: '0'
|
238
254
|
segments:
|
239
255
|
- 0
|
240
|
-
hash: -
|
256
|
+
hash: -2087592437685873043
|
241
257
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
242
258
|
none: false
|
243
259
|
requirements:
|
244
|
-
- - ! '
|
260
|
+
- - ! '>='
|
245
261
|
- !ruby/object:Gem::Version
|
246
|
-
version:
|
262
|
+
version: '0'
|
247
263
|
requirements: []
|
248
264
|
rubyforge_project:
|
249
265
|
rubygems_version: 1.8.10
|
@@ -1,14 +0,0 @@
|
|
1
|
-
class CreateOproAccessGrants < ActiveRecord::Migration
|
2
|
-
def change
|
3
|
-
create_table :opro_access_grants do |t|
|
4
|
-
t.string :code
|
5
|
-
t.string :access_token
|
6
|
-
t.string :refresh_token
|
7
|
-
t.datetime :access_token_expires_at
|
8
|
-
t.integer :user_id
|
9
|
-
t.integer :application_id
|
10
|
-
|
11
|
-
t.timestamps
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|