doorkeeper 3.1.0 → 5.6.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of doorkeeper might be problematic. Click here for more details.
- checksums.yaml +5 -5
- data/CHANGELOG.md +1079 -0
- data/README.md +114 -326
- data/app/assets/stylesheets/doorkeeper/admin/application.css +2 -2
- data/app/controllers/doorkeeper/application_controller.rb +7 -6
- data/app/controllers/doorkeeper/application_metal_controller.rb +9 -12
- data/app/controllers/doorkeeper/applications_controller.rb +66 -21
- data/app/controllers/doorkeeper/authorizations_controller.rb +100 -18
- data/app/controllers/doorkeeper/authorized_applications_controller.rb +23 -4
- data/app/controllers/doorkeeper/token_info_controller.rb +16 -4
- data/app/controllers/doorkeeper/tokens_controller.rb +138 -22
- data/app/helpers/doorkeeper/dashboard_helper.rb +15 -9
- data/app/views/doorkeeper/applications/_delete_form.html.erb +4 -3
- data/app/views/doorkeeper/applications/_form.html.erb +33 -21
- data/app/views/doorkeeper/applications/edit.html.erb +1 -1
- data/app/views/doorkeeper/applications/index.html.erb +18 -6
- data/app/views/doorkeeper/applications/new.html.erb +1 -1
- data/app/views/doorkeeper/applications/show.html.erb +40 -16
- data/app/views/doorkeeper/authorizations/error.html.erb +1 -1
- data/app/views/doorkeeper/authorizations/form_post.html.erb +15 -0
- data/app/views/doorkeeper/authorizations/new.html.erb +17 -11
- data/app/views/doorkeeper/authorized_applications/_delete_form.html.erb +1 -2
- data/app/views/doorkeeper/authorized_applications/index.html.erb +0 -1
- data/app/views/layouts/doorkeeper/admin.html.erb +16 -14
- data/config/locales/en.yml +37 -9
- data/lib/doorkeeper/config/abstract_builder.rb +28 -0
- data/lib/doorkeeper/config/option.rb +82 -0
- data/lib/doorkeeper/config/validations.rb +53 -0
- data/lib/doorkeeper/config.rb +602 -142
- data/lib/doorkeeper/engine.rb +22 -7
- data/lib/doorkeeper/errors.rb +37 -10
- data/lib/doorkeeper/grant_flow/fallback_flow.rb +15 -0
- data/lib/doorkeeper/grant_flow/flow.rb +44 -0
- data/lib/doorkeeper/grant_flow/registry.rb +50 -0
- data/lib/doorkeeper/grant_flow.rb +45 -0
- data/lib/doorkeeper/grape/authorization_decorator.rb +6 -4
- data/lib/doorkeeper/grape/helpers.rb +24 -12
- data/lib/doorkeeper/helpers/controller.rb +49 -27
- data/lib/doorkeeper/models/access_grant_mixin.rb +99 -16
- data/lib/doorkeeper/models/access_token_mixin.rb +386 -77
- data/lib/doorkeeper/models/application_mixin.rb +73 -30
- data/lib/doorkeeper/models/concerns/accessible.rb +6 -0
- data/lib/doorkeeper/models/concerns/expirable.rb +20 -6
- data/lib/doorkeeper/models/concerns/expiration_time_sql_math.rb +88 -0
- data/lib/doorkeeper/models/concerns/orderable.rb +15 -0
- data/lib/doorkeeper/models/concerns/ownership.rb +4 -2
- data/lib/doorkeeper/models/concerns/resource_ownerable.rb +47 -0
- data/lib/doorkeeper/models/concerns/reusable.rb +19 -0
- data/lib/doorkeeper/models/concerns/revocable.rb +13 -2
- data/lib/doorkeeper/models/concerns/scopes.rb +12 -2
- data/lib/doorkeeper/models/concerns/secret_storable.rb +106 -0
- data/lib/doorkeeper/oauth/authorization/code.rb +48 -12
- data/lib/doorkeeper/oauth/authorization/context.rb +17 -0
- data/lib/doorkeeper/oauth/authorization/token.rb +72 -28
- data/lib/doorkeeper/oauth/authorization/uri_builder.rb +22 -18
- data/lib/doorkeeper/oauth/authorization_code_request.rb +64 -14
- data/lib/doorkeeper/oauth/base_request.rb +66 -0
- data/lib/doorkeeper/oauth/base_response.rb +31 -0
- data/lib/doorkeeper/oauth/client/credentials.rb +23 -10
- data/lib/doorkeeper/oauth/client.rb +10 -12
- data/lib/doorkeeper/oauth/client_credentials/creator.rb +48 -4
- data/lib/doorkeeper/oauth/client_credentials/issuer.rb +17 -9
- data/lib/doorkeeper/oauth/client_credentials/validator.rb +55 -0
- data/lib/doorkeeper/oauth/client_credentials_request.rb +14 -15
- data/lib/doorkeeper/oauth/code_request.rb +8 -12
- data/lib/doorkeeper/oauth/code_response.rb +31 -19
- data/lib/doorkeeper/oauth/error.rb +5 -3
- data/lib/doorkeeper/oauth/error_response.rb +41 -20
- data/lib/doorkeeper/oauth/forbidden_token_response.rb +11 -3
- data/lib/doorkeeper/oauth/helpers/scope_checker.rb +24 -19
- data/lib/doorkeeper/oauth/helpers/unique_token.rb +20 -3
- data/lib/doorkeeper/oauth/helpers/uri_checker.rb +55 -4
- data/lib/doorkeeper/oauth/hooks/context.rb +21 -0
- data/lib/doorkeeper/oauth/invalid_request_response.rb +43 -0
- data/lib/doorkeeper/oauth/invalid_token_response.rb +31 -5
- data/lib/doorkeeper/oauth/nonstandard.rb +39 -0
- data/lib/doorkeeper/oauth/password_access_token_request.rb +46 -18
- data/lib/doorkeeper/oauth/pre_authorization.rb +135 -26
- data/lib/doorkeeper/oauth/refresh_token_request.rb +67 -30
- data/lib/doorkeeper/oauth/scopes.rb +26 -12
- data/lib/doorkeeper/oauth/token.rb +28 -25
- data/lib/doorkeeper/oauth/token_introspection.rb +202 -0
- data/lib/doorkeeper/oauth/token_request.rb +8 -21
- data/lib/doorkeeper/oauth/token_response.rb +14 -10
- data/lib/doorkeeper/oauth.rb +13 -0
- data/lib/doorkeeper/orm/active_record/access_grant.rb +6 -4
- data/lib/doorkeeper/orm/active_record/access_token.rb +5 -17
- data/lib/doorkeeper/orm/active_record/application.rb +6 -20
- data/lib/doorkeeper/orm/active_record/mixins/access_grant.rb +69 -0
- data/lib/doorkeeper/orm/active_record/mixins/access_token.rb +81 -0
- data/lib/doorkeeper/orm/active_record/mixins/application.rb +214 -0
- data/lib/doorkeeper/orm/active_record/redirect_uri_validator.rb +66 -0
- data/lib/doorkeeper/orm/active_record/stale_records_cleaner.rb +33 -0
- data/lib/doorkeeper/orm/active_record.rb +36 -26
- data/lib/doorkeeper/rails/helpers.rb +14 -15
- data/lib/doorkeeper/rails/routes/abstract_router.rb +35 -0
- data/lib/doorkeeper/rails/routes/mapper.rb +4 -2
- data/lib/doorkeeper/rails/routes/mapping.rb +10 -8
- data/lib/doorkeeper/rails/routes/registry.rb +45 -0
- data/lib/doorkeeper/rails/routes.rb +45 -28
- data/lib/doorkeeper/rake/db.rake +40 -0
- data/lib/doorkeeper/rake/setup.rake +6 -0
- data/lib/doorkeeper/rake.rb +14 -0
- data/lib/doorkeeper/request/authorization_code.rb +12 -4
- data/lib/doorkeeper/request/client_credentials.rb +3 -3
- data/lib/doorkeeper/request/code.rb +1 -1
- data/lib/doorkeeper/request/password.rb +5 -4
- data/lib/doorkeeper/request/refresh_token.rb +6 -5
- data/lib/doorkeeper/request/strategy.rb +4 -2
- data/lib/doorkeeper/request/token.rb +1 -1
- data/lib/doorkeeper/request.rb +62 -29
- data/lib/doorkeeper/secret_storing/base.rb +64 -0
- data/lib/doorkeeper/secret_storing/bcrypt.rb +60 -0
- data/lib/doorkeeper/secret_storing/plain.rb +33 -0
- data/lib/doorkeeper/secret_storing/sha256_hash.rb +26 -0
- data/lib/doorkeeper/server.rb +9 -19
- data/lib/doorkeeper/stale_records_cleaner.rb +24 -0
- data/lib/doorkeeper/validations.rb +5 -2
- data/lib/doorkeeper/version.rb +12 -1
- data/lib/doorkeeper.rb +112 -56
- data/lib/generators/doorkeeper/application_owner_generator.rb +28 -13
- data/lib/generators/doorkeeper/confidential_applications_generator.rb +33 -0
- data/lib/generators/doorkeeper/enable_polymorphic_resource_owner_generator.rb +39 -0
- data/lib/generators/doorkeeper/install_generator.rb +19 -9
- data/lib/generators/doorkeeper/migration_generator.rb +27 -10
- data/lib/generators/doorkeeper/pkce_generator.rb +33 -0
- data/lib/generators/doorkeeper/previous_refresh_token_generator.rb +41 -0
- data/lib/generators/doorkeeper/templates/add_confidential_to_applications.rb.erb +13 -0
- data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb.erb +9 -0
- data/lib/generators/doorkeeper/templates/add_previous_refresh_token_to_access_tokens.rb.erb +13 -0
- data/lib/generators/doorkeeper/templates/enable_pkce_migration.rb.erb +8 -0
- data/lib/generators/doorkeeper/templates/enable_polymorphic_resource_owner_migration.rb.erb +17 -0
- data/lib/generators/doorkeeper/templates/initializer.rb +417 -32
- data/lib/generators/doorkeeper/templates/migration.rb.erb +88 -0
- data/lib/generators/doorkeeper/views_generator.rb +8 -4
- data/vendor/assets/stylesheets/doorkeeper/bootstrap.min.css +4 -5
- metadata +163 -280
- data/.gitignore +0 -14
- data/.hound.yml +0 -13
- data/.rspec +0 -1
- data/.travis.yml +0 -22
- data/CONTRIBUTING.md +0 -45
- data/Gemfile +0 -10
- data/NEWS.md +0 -525
- data/RELEASING.md +0 -17
- data/Rakefile +0 -20
- data/app/validators/redirect_uri_validator.rb +0 -34
- data/doorkeeper.gemspec +0 -27
- data/lib/doorkeeper/oauth/client/methods.rb +0 -18
- data/lib/doorkeeper/oauth/client_credentials/validation.rb +0 -45
- data/lib/doorkeeper/oauth/request_concern.rb +0 -48
- data/lib/generators/doorkeeper/application_scopes_generator.rb +0 -34
- data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb +0 -7
- data/lib/generators/doorkeeper/templates/add_scopes_to_oauth_applications.rb +0 -5
- data/lib/generators/doorkeeper/templates/migration.rb +0 -50
- data/spec/controllers/applications_controller_spec.rb +0 -58
- data/spec/controllers/authorizations_controller_spec.rb +0 -203
- data/spec/controllers/protected_resources_controller_spec.rb +0 -271
- data/spec/controllers/token_info_controller_spec.rb +0 -52
- data/spec/controllers/tokens_controller_spec.rb +0 -88
- data/spec/dummy/Rakefile +0 -7
- data/spec/dummy/app/controllers/application_controller.rb +0 -3
- data/spec/dummy/app/controllers/custom_authorizations_controller.rb +0 -7
- data/spec/dummy/app/controllers/full_protected_resources_controller.rb +0 -12
- data/spec/dummy/app/controllers/home_controller.rb +0 -17
- data/spec/dummy/app/controllers/metal_controller.rb +0 -11
- data/spec/dummy/app/controllers/semi_protected_resources_controller.rb +0 -11
- data/spec/dummy/app/helpers/application_helper.rb +0 -5
- data/spec/dummy/app/models/user.rb +0 -9
- data/spec/dummy/app/views/home/index.html.erb +0 -0
- data/spec/dummy/app/views/layouts/application.html.erb +0 -14
- data/spec/dummy/config/application.rb +0 -57
- data/spec/dummy/config/boot.rb +0 -9
- data/spec/dummy/config/database.yml +0 -15
- data/spec/dummy/config/environment.rb +0 -5
- data/spec/dummy/config/environments/development.rb +0 -29
- data/spec/dummy/config/environments/production.rb +0 -62
- data/spec/dummy/config/environments/test.rb +0 -55
- data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
- data/spec/dummy/config/initializers/doorkeeper.rb +0 -96
- data/spec/dummy/config/initializers/secret_token.rb +0 -9
- data/spec/dummy/config/initializers/session_store.rb +0 -8
- data/spec/dummy/config/initializers/wrap_parameters.rb +0 -14
- data/spec/dummy/config/locales/doorkeeper.en.yml +0 -5
- data/spec/dummy/config/routes.rb +0 -52
- data/spec/dummy/config.ru +0 -4
- data/spec/dummy/db/migrate/20111122132257_create_users.rb +0 -9
- data/spec/dummy/db/migrate/20120312140401_add_password_to_users.rb +0 -5
- data/spec/dummy/db/migrate/20130902165751_create_doorkeeper_tables.rb +0 -41
- data/spec/dummy/db/migrate/20130902175349_add_owner_to_application.rb +0 -7
- data/spec/dummy/db/migrate/20141209001746_add_scopes_to_oauth_applications.rb +0 -5
- data/spec/dummy/db/schema.rb +0 -66
- data/spec/dummy/public/404.html +0 -26
- data/spec/dummy/public/422.html +0 -26
- data/spec/dummy/public/500.html +0 -26
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/script/rails +0 -6
- data/spec/factories.rb +0 -26
- data/spec/generators/application_owner_generator_spec.rb +0 -22
- data/spec/generators/install_generator_spec.rb +0 -31
- data/spec/generators/migration_generator_spec.rb +0 -20
- data/spec/generators/templates/routes.rb +0 -3
- data/spec/generators/views_generator_spec.rb +0 -27
- data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +0 -24
- data/spec/lib/config_spec.rb +0 -317
- data/spec/lib/doorkeeper_spec.rb +0 -28
- data/spec/lib/models/expirable_spec.rb +0 -51
- data/spec/lib/models/revocable_spec.rb +0 -36
- data/spec/lib/models/scopes_spec.rb +0 -43
- data/spec/lib/oauth/authorization/uri_builder_spec.rb +0 -42
- data/spec/lib/oauth/authorization_code_request_spec.rb +0 -80
- data/spec/lib/oauth/client/credentials_spec.rb +0 -47
- data/spec/lib/oauth/client/methods_spec.rb +0 -54
- data/spec/lib/oauth/client_credentials/creator_spec.rb +0 -44
- data/spec/lib/oauth/client_credentials/issuer_spec.rb +0 -86
- data/spec/lib/oauth/client_credentials/validation_spec.rb +0 -54
- data/spec/lib/oauth/client_credentials_integration_spec.rb +0 -27
- data/spec/lib/oauth/client_credentials_request_spec.rb +0 -104
- data/spec/lib/oauth/client_spec.rb +0 -39
- data/spec/lib/oauth/code_request_spec.rb +0 -45
- data/spec/lib/oauth/error_response_spec.rb +0 -61
- data/spec/lib/oauth/error_spec.rb +0 -23
- data/spec/lib/oauth/forbidden_token_response_spec.rb +0 -23
- data/spec/lib/oauth/helpers/scope_checker_spec.rb +0 -64
- data/spec/lib/oauth/helpers/unique_token_spec.rb +0 -20
- data/spec/lib/oauth/helpers/uri_checker_spec.rb +0 -104
- data/spec/lib/oauth/invalid_token_response_spec.rb +0 -28
- data/spec/lib/oauth/password_access_token_request_spec.rb +0 -90
- data/spec/lib/oauth/pre_authorization_spec.rb +0 -155
- data/spec/lib/oauth/refresh_token_request_spec.rb +0 -123
- data/spec/lib/oauth/scopes_spec.rb +0 -123
- data/spec/lib/oauth/token_request_spec.rb +0 -98
- data/spec/lib/oauth/token_response_spec.rb +0 -85
- data/spec/lib/oauth/token_spec.rb +0 -109
- data/spec/lib/request/strategy_spec.rb +0 -53
- data/spec/lib/server_spec.rb +0 -52
- data/spec/models/doorkeeper/access_grant_spec.rb +0 -36
- data/spec/models/doorkeeper/access_token_spec.rb +0 -350
- data/spec/models/doorkeeper/application_spec.rb +0 -187
- data/spec/requests/applications/applications_request_spec.rb +0 -94
- data/spec/requests/applications/authorized_applications_spec.rb +0 -30
- data/spec/requests/endpoints/authorization_spec.rb +0 -72
- data/spec/requests/endpoints/token_spec.rb +0 -64
- data/spec/requests/flows/authorization_code_errors_spec.rb +0 -66
- data/spec/requests/flows/authorization_code_spec.rb +0 -156
- data/spec/requests/flows/client_credentials_spec.rb +0 -58
- data/spec/requests/flows/implicit_grant_errors_spec.rb +0 -32
- data/spec/requests/flows/implicit_grant_spec.rb +0 -61
- data/spec/requests/flows/password_spec.rb +0 -94
- data/spec/requests/flows/refresh_token_spec.rb +0 -104
- data/spec/requests/flows/revoke_token_spec.rb +0 -143
- data/spec/requests/flows/skip_authorization_spec.rb +0 -59
- data/spec/requests/protected_resources/metal_spec.rb +0 -14
- data/spec/requests/protected_resources/private_api_spec.rb +0 -81
- data/spec/routing/custom_controller_routes_spec.rb +0 -71
- data/spec/routing/default_routes_spec.rb +0 -35
- data/spec/routing/scoped_routes_spec.rb +0 -31
- data/spec/spec_helper.rb +0 -2
- data/spec/spec_helper_integration.rb +0 -56
- data/spec/support/dependencies/factory_girl.rb +0 -2
- data/spec/support/helpers/access_token_request_helper.rb +0 -11
- data/spec/support/helpers/authorization_request_helper.rb +0 -41
- data/spec/support/helpers/config_helper.rb +0 -9
- data/spec/support/helpers/model_helper.rb +0 -45
- data/spec/support/helpers/request_spec_helper.rb +0 -76
- data/spec/support/helpers/url_helper.rb +0 -55
- data/spec/support/orm/active_record.rb +0 -3
- data/spec/support/shared/controllers_shared_context.rb +0 -60
- data/spec/support/shared/models_shared_examples.rb +0 -52
- data/spec/validators/redirect_uri_validator_spec.rb +0 -78
@@ -1,350 +0,0 @@
|
|
1
|
-
require 'spec_helper_integration'
|
2
|
-
|
3
|
-
module Doorkeeper
|
4
|
-
describe AccessToken do
|
5
|
-
subject { FactoryGirl.build(:access_token) }
|
6
|
-
|
7
|
-
it { expect(subject).to be_valid }
|
8
|
-
|
9
|
-
it_behaves_like 'an accessible token'
|
10
|
-
it_behaves_like 'a revocable token'
|
11
|
-
it_behaves_like 'a unique token' do
|
12
|
-
let(:factory_name) { :access_token }
|
13
|
-
end
|
14
|
-
|
15
|
-
describe :generate_token do
|
16
|
-
it 'generates a token using the default method' do
|
17
|
-
FactoryGirl.create :access_token
|
18
|
-
|
19
|
-
token = FactoryGirl.create :access_token
|
20
|
-
expect(token.token).to be_a(String)
|
21
|
-
end
|
22
|
-
|
23
|
-
it 'generates a token using a custom object' do
|
24
|
-
module CustomGeneratorArgs
|
25
|
-
def self.generate(opts = {})
|
26
|
-
"custom_generator_token_#{opts[:resource_owner_id]}"
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
Doorkeeper.configure do
|
31
|
-
orm DOORKEEPER_ORM
|
32
|
-
access_token_generator "Doorkeeper::CustomGeneratorArgs"
|
33
|
-
end
|
34
|
-
|
35
|
-
token = FactoryGirl.create :access_token
|
36
|
-
expect(token.token).to match(%r{custom_generator_token_\d+})
|
37
|
-
end
|
38
|
-
|
39
|
-
it 'allows the custom generator to access the application details' do
|
40
|
-
module CustomGeneratorArgs
|
41
|
-
def self.generate(opts = {})
|
42
|
-
"custom_generator_token_#{opts[:application].name}"
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
Doorkeeper.configure do
|
47
|
-
orm DOORKEEPER_ORM
|
48
|
-
access_token_generator "Doorkeeper::CustomGeneratorArgs"
|
49
|
-
end
|
50
|
-
|
51
|
-
token = FactoryGirl.create :access_token
|
52
|
-
expect(token.token).to match(%r{custom_generator_token_Application \d+})
|
53
|
-
end
|
54
|
-
|
55
|
-
it 'allows the custom generator to access the scopes' do
|
56
|
-
module CustomGeneratorArgs
|
57
|
-
def self.generate(opts = {})
|
58
|
-
"custom_generator_token_#{opts[:scopes].count}_#{opts[:scopes]}"
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
Doorkeeper.configure do
|
63
|
-
orm DOORKEEPER_ORM
|
64
|
-
access_token_generator "Doorkeeper::CustomGeneratorArgs"
|
65
|
-
end
|
66
|
-
|
67
|
-
token = FactoryGirl.create :access_token, scopes: 'public write'
|
68
|
-
|
69
|
-
expect(token.token).to eq 'custom_generator_token_2_public write'
|
70
|
-
end
|
71
|
-
|
72
|
-
it 'allows the custom generator to access the expiry length' do
|
73
|
-
module CustomGeneratorArgs
|
74
|
-
def self.generate(opts = {})
|
75
|
-
"custom_generator_token_#{opts[:expires_in]}"
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
Doorkeeper.configure do
|
80
|
-
orm DOORKEEPER_ORM
|
81
|
-
access_token_generator "Doorkeeper::CustomGeneratorArgs"
|
82
|
-
end
|
83
|
-
|
84
|
-
token = FactoryGirl.create :access_token
|
85
|
-
expect(token.token).to eq 'custom_generator_token_7200'
|
86
|
-
end
|
87
|
-
|
88
|
-
it 'raises an error if the custom object does not support generate' do
|
89
|
-
module NoGenerate
|
90
|
-
end
|
91
|
-
|
92
|
-
Doorkeeper.configure do
|
93
|
-
orm DOORKEEPER_ORM
|
94
|
-
access_token_generator "Doorkeeper::NoGenerate"
|
95
|
-
end
|
96
|
-
|
97
|
-
expect { FactoryGirl.create :access_token }.to(
|
98
|
-
raise_error(Doorkeeper::Errors::UnableToGenerateToken))
|
99
|
-
end
|
100
|
-
|
101
|
-
it 'raises an error if the custom object does not exist' do
|
102
|
-
Doorkeeper.configure do
|
103
|
-
orm DOORKEEPER_ORM
|
104
|
-
access_token_generator "Doorkeeper::NotReal"
|
105
|
-
end
|
106
|
-
|
107
|
-
expect { FactoryGirl.create :access_token }.to(
|
108
|
-
raise_error(Doorkeeper::Errors::TokenGeneratorNotFound))
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
describe :refresh_token do
|
113
|
-
it 'has empty refresh token if it was not required' do
|
114
|
-
token = FactoryGirl.create :access_token
|
115
|
-
expect(token.refresh_token).to be_nil
|
116
|
-
end
|
117
|
-
|
118
|
-
it 'generates a refresh token if it was requested' do
|
119
|
-
token = FactoryGirl.create :access_token, use_refresh_token: true
|
120
|
-
expect(token.refresh_token).not_to be_nil
|
121
|
-
end
|
122
|
-
|
123
|
-
it 'is not valid if token exists' do
|
124
|
-
token1 = FactoryGirl.create :access_token, use_refresh_token: true
|
125
|
-
token2 = FactoryGirl.create :access_token, use_refresh_token: true
|
126
|
-
token2.refresh_token = token1.refresh_token
|
127
|
-
expect(token2).not_to be_valid
|
128
|
-
end
|
129
|
-
|
130
|
-
it 'expects database to raise an error if refresh tokens are the same' do
|
131
|
-
token1 = FactoryGirl.create :access_token, use_refresh_token: true
|
132
|
-
token2 = FactoryGirl.create :access_token, use_refresh_token: true
|
133
|
-
expect do
|
134
|
-
token2.refresh_token = token1.refresh_token
|
135
|
-
token2.save(validate: false)
|
136
|
-
end.to raise_error(ActiveRecord::RecordNotUnique)
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
describe 'validations' do
|
141
|
-
it 'is valid without resource_owner_id' do
|
142
|
-
# For client credentials flow
|
143
|
-
subject.resource_owner_id = nil
|
144
|
-
expect(subject).to be_valid
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
describe '#same_credential?' do
|
149
|
-
|
150
|
-
context 'with default parameters' do
|
151
|
-
|
152
|
-
let(:resource_owner_id) { 100 }
|
153
|
-
let(:application) { FactoryGirl.create :application }
|
154
|
-
let(:default_attributes) do
|
155
|
-
{ application: application, resource_owner_id: resource_owner_id }
|
156
|
-
end
|
157
|
-
let(:access_token1) { FactoryGirl.create :access_token, default_attributes }
|
158
|
-
|
159
|
-
context 'the second token has the same owner and same app' do
|
160
|
-
let(:access_token2) { FactoryGirl.create :access_token, default_attributes }
|
161
|
-
it 'success' do
|
162
|
-
expect(access_token1.same_credential?(access_token2)).to be_truthy
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
|
-
context 'the second token has same owner and different app' do
|
167
|
-
let(:other_application) { FactoryGirl.create :application }
|
168
|
-
let(:access_token2) { FactoryGirl.create :access_token, application: other_application, resource_owner_id: resource_owner_id }
|
169
|
-
|
170
|
-
it 'fail' do
|
171
|
-
expect(access_token1.same_credential?(access_token2)).to be_falsey
|
172
|
-
end
|
173
|
-
end
|
174
|
-
|
175
|
-
context 'the second token has different owner and different app' do
|
176
|
-
|
177
|
-
let(:other_application) { FactoryGirl.create :application }
|
178
|
-
let(:access_token2) { FactoryGirl.create :access_token, application: other_application, resource_owner_id: 42 }
|
179
|
-
|
180
|
-
it 'fail' do
|
181
|
-
expect(access_token1.same_credential?(access_token2)).to be_falsey
|
182
|
-
end
|
183
|
-
end
|
184
|
-
|
185
|
-
context 'the second token has different owner and same app' do
|
186
|
-
let(:access_token2) { FactoryGirl.create :access_token, application: application, resource_owner_id: 42 }
|
187
|
-
|
188
|
-
it 'fail' do
|
189
|
-
expect(access_token1.same_credential?(access_token2)).to be_falsey
|
190
|
-
end
|
191
|
-
end
|
192
|
-
end
|
193
|
-
end
|
194
|
-
|
195
|
-
describe '#acceptable?' do
|
196
|
-
context 'a token that is not accessible' do
|
197
|
-
let(:token) { FactoryGirl.create(:access_token, created_at: 6.hours.ago) }
|
198
|
-
|
199
|
-
it 'should return false' do
|
200
|
-
expect(token.acceptable?(nil)).to be false
|
201
|
-
end
|
202
|
-
end
|
203
|
-
|
204
|
-
context 'a token that has the incorrect scopes' do
|
205
|
-
let(:token) { FactoryGirl.create(:access_token) }
|
206
|
-
|
207
|
-
it 'should return false' do
|
208
|
-
expect(token.acceptable?(['public'])).to be false
|
209
|
-
end
|
210
|
-
end
|
211
|
-
|
212
|
-
context 'a token is acceptable with the correct scopes' do
|
213
|
-
let(:token) do
|
214
|
-
token = FactoryGirl.create(:access_token)
|
215
|
-
token[:scopes] = 'public'
|
216
|
-
token
|
217
|
-
end
|
218
|
-
|
219
|
-
it 'should return true' do
|
220
|
-
expect(token.acceptable?(['public'])).to be true
|
221
|
-
end
|
222
|
-
end
|
223
|
-
end
|
224
|
-
|
225
|
-
describe '.revoke_all_for' do
|
226
|
-
let(:resource_owner) { double(id: 100) }
|
227
|
-
let(:application) { FactoryGirl.create :application }
|
228
|
-
let(:default_attributes) do
|
229
|
-
{ application: application, resource_owner_id: resource_owner.id }
|
230
|
-
end
|
231
|
-
|
232
|
-
it 'revokes all tokens for given application and resource owner' do
|
233
|
-
FactoryGirl.create :access_token, default_attributes
|
234
|
-
AccessToken.revoke_all_for application.id, resource_owner
|
235
|
-
AccessToken.all.each do |token|
|
236
|
-
expect(token).to be_revoked
|
237
|
-
end
|
238
|
-
end
|
239
|
-
|
240
|
-
it 'matches application' do
|
241
|
-
FactoryGirl.create :access_token, default_attributes.merge(application: FactoryGirl.create(:application))
|
242
|
-
AccessToken.revoke_all_for application.id, resource_owner
|
243
|
-
expect(AccessToken.all).not_to be_empty
|
244
|
-
end
|
245
|
-
|
246
|
-
it 'matches resource owner' do
|
247
|
-
FactoryGirl.create :access_token, default_attributes.merge(resource_owner_id: 90)
|
248
|
-
AccessToken.revoke_all_for application.id, resource_owner
|
249
|
-
expect(AccessToken.all).not_to be_empty
|
250
|
-
end
|
251
|
-
end
|
252
|
-
|
253
|
-
describe '.matching_token_for' do
|
254
|
-
let(:resource_owner_id) { 100 }
|
255
|
-
let(:application) { FactoryGirl.create :application }
|
256
|
-
let(:scopes) { Doorkeeper::OAuth::Scopes.from_string('public write') }
|
257
|
-
let(:default_attributes) do
|
258
|
-
{
|
259
|
-
application: application,
|
260
|
-
resource_owner_id: resource_owner_id,
|
261
|
-
scopes: scopes.to_s
|
262
|
-
}
|
263
|
-
end
|
264
|
-
|
265
|
-
it 'returns only one token' do
|
266
|
-
token = FactoryGirl.create :access_token, default_attributes
|
267
|
-
last_token = AccessToken.matching_token_for(application, resource_owner_id, scopes)
|
268
|
-
expect(last_token).to eq(token)
|
269
|
-
end
|
270
|
-
|
271
|
-
it 'accepts resource owner as object' do
|
272
|
-
resource_owner = double(to_key: true, id: 100)
|
273
|
-
token = FactoryGirl.create :access_token, default_attributes
|
274
|
-
last_token = AccessToken.matching_token_for(application, resource_owner, scopes)
|
275
|
-
expect(last_token).to eq(token)
|
276
|
-
end
|
277
|
-
|
278
|
-
it 'accepts nil as resource owner' do
|
279
|
-
token = FactoryGirl.create :access_token, default_attributes.merge(resource_owner_id: nil)
|
280
|
-
last_token = AccessToken.matching_token_for(application, nil, scopes)
|
281
|
-
expect(last_token).to eq(token)
|
282
|
-
end
|
283
|
-
|
284
|
-
it 'excludes revoked tokens' do
|
285
|
-
FactoryGirl.create :access_token, default_attributes.merge(revoked_at: 1.day.ago)
|
286
|
-
last_token = AccessToken.matching_token_for(application, resource_owner_id, scopes)
|
287
|
-
expect(last_token).to be_nil
|
288
|
-
end
|
289
|
-
|
290
|
-
it 'matches the application' do
|
291
|
-
FactoryGirl.create :access_token, default_attributes.merge(application: FactoryGirl.create(:application))
|
292
|
-
last_token = AccessToken.matching_token_for(application, resource_owner_id, scopes)
|
293
|
-
expect(last_token).to be_nil
|
294
|
-
end
|
295
|
-
|
296
|
-
it 'matches the resource owner' do
|
297
|
-
FactoryGirl.create :access_token, default_attributes.merge(resource_owner_id: 2)
|
298
|
-
last_token = AccessToken.matching_token_for(application, resource_owner_id, scopes)
|
299
|
-
expect(last_token).to be_nil
|
300
|
-
end
|
301
|
-
|
302
|
-
it 'matches token with fewer scopes' do
|
303
|
-
FactoryGirl.create :access_token, default_attributes.merge(scopes: 'public')
|
304
|
-
last_token = AccessToken.matching_token_for(application, resource_owner_id, scopes)
|
305
|
-
expect(last_token).to be_nil
|
306
|
-
end
|
307
|
-
|
308
|
-
it 'matches token with different scopes' do
|
309
|
-
FactoryGirl.create :access_token, default_attributes.merge(scopes: 'public email')
|
310
|
-
last_token = AccessToken.matching_token_for(application, resource_owner_id, scopes)
|
311
|
-
expect(last_token).to be_nil
|
312
|
-
end
|
313
|
-
|
314
|
-
it 'matches token with more scopes' do
|
315
|
-
FactoryGirl.create :access_token, default_attributes.merge(scopes: 'public write email')
|
316
|
-
last_token = AccessToken.matching_token_for(application, resource_owner_id, scopes)
|
317
|
-
expect(last_token).to be_nil
|
318
|
-
end
|
319
|
-
|
320
|
-
it 'matches application scopes' do
|
321
|
-
application = FactoryGirl.create :application, scopes: "private read"
|
322
|
-
FactoryGirl.create :access_token, default_attributes.merge(
|
323
|
-
application: application
|
324
|
-
)
|
325
|
-
last_token = AccessToken.matching_token_for(application, resource_owner_id, scopes)
|
326
|
-
expect(last_token).to be_nil
|
327
|
-
end
|
328
|
-
|
329
|
-
it 'returns the last created token' do
|
330
|
-
FactoryGirl.create :access_token, default_attributes.merge(created_at: 1.day.ago)
|
331
|
-
token = FactoryGirl.create :access_token, default_attributes
|
332
|
-
last_token = AccessToken.matching_token_for(application, resource_owner_id, scopes)
|
333
|
-
expect(last_token).to eq(token)
|
334
|
-
end
|
335
|
-
|
336
|
-
it 'returns as_json hash' do
|
337
|
-
token = FactoryGirl.create :access_token, default_attributes
|
338
|
-
token_hash = {
|
339
|
-
resource_owner_id: token.resource_owner_id,
|
340
|
-
scopes: token.scopes,
|
341
|
-
expires_in_seconds: token.expires_in_seconds,
|
342
|
-
application: { uid: token.application.uid },
|
343
|
-
created_at: token.created_at.to_i,
|
344
|
-
}
|
345
|
-
expect(token.as_json).to eq token_hash
|
346
|
-
end
|
347
|
-
end
|
348
|
-
|
349
|
-
end
|
350
|
-
end
|
@@ -1,187 +0,0 @@
|
|
1
|
-
require 'spec_helper_integration'
|
2
|
-
|
3
|
-
module Doorkeeper
|
4
|
-
describe Application do
|
5
|
-
let(:require_owner) { Doorkeeper.configuration.instance_variable_set('@confirm_application_owner', true) }
|
6
|
-
let(:unset_require_owner) { Doorkeeper.configuration.instance_variable_set('@confirm_application_owner', false) }
|
7
|
-
let(:new_application) { FactoryGirl.build(:application) }
|
8
|
-
|
9
|
-
let(:uid) { SecureRandom.hex(8) }
|
10
|
-
let(:secret) { SecureRandom.hex(8) }
|
11
|
-
|
12
|
-
context 'application_owner is enabled' do
|
13
|
-
before do
|
14
|
-
Doorkeeper.configure do
|
15
|
-
orm DOORKEEPER_ORM
|
16
|
-
enable_application_owner
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
context 'application owner is not required' do
|
21
|
-
before(:each) do
|
22
|
-
unset_require_owner
|
23
|
-
end
|
24
|
-
|
25
|
-
it 'is valid given valid attributes' do
|
26
|
-
expect(new_application).to be_valid
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
context 'application owner is required' do
|
31
|
-
before(:each) do
|
32
|
-
require_owner
|
33
|
-
@owner = FactoryGirl.build_stubbed(:user)
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'is invalid without an owner' do
|
37
|
-
expect(new_application).not_to be_valid
|
38
|
-
end
|
39
|
-
|
40
|
-
it 'is valid with an owner' do
|
41
|
-
new_application.owner = @owner
|
42
|
-
expect(new_application).to be_valid
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
it 'is invalid without a name' do
|
48
|
-
new_application.name = nil
|
49
|
-
expect(new_application).not_to be_valid
|
50
|
-
end
|
51
|
-
|
52
|
-
it 'generates uid on create' do
|
53
|
-
expect(new_application.uid).to be_nil
|
54
|
-
new_application.save
|
55
|
-
expect(new_application.uid).not_to be_nil
|
56
|
-
end
|
57
|
-
|
58
|
-
it 'generates uid on create if an empty string' do
|
59
|
-
new_application.uid = ''
|
60
|
-
new_application.save
|
61
|
-
expect(new_application.uid).not_to be_blank
|
62
|
-
end
|
63
|
-
|
64
|
-
it 'generates uid on create unless one is set' do
|
65
|
-
new_application.uid = uid
|
66
|
-
new_application.save
|
67
|
-
expect(new_application.uid).to eq(uid)
|
68
|
-
end
|
69
|
-
|
70
|
-
it 'is invalid without uid' do
|
71
|
-
new_application.save
|
72
|
-
new_application.uid = nil
|
73
|
-
expect(new_application).not_to be_valid
|
74
|
-
end
|
75
|
-
|
76
|
-
it 'is invalid without redirect_uri' do
|
77
|
-
new_application.save
|
78
|
-
new_application.redirect_uri = nil
|
79
|
-
expect(new_application).not_to be_valid
|
80
|
-
end
|
81
|
-
|
82
|
-
it 'checks uniqueness of uid' do
|
83
|
-
app1 = FactoryGirl.create(:application)
|
84
|
-
app2 = FactoryGirl.create(:application)
|
85
|
-
app2.uid = app1.uid
|
86
|
-
expect(app2).not_to be_valid
|
87
|
-
end
|
88
|
-
|
89
|
-
it 'expects database to throw an error when uids are the same' do
|
90
|
-
app1 = FactoryGirl.create(:application)
|
91
|
-
app2 = FactoryGirl.create(:application)
|
92
|
-
app2.uid = app1.uid
|
93
|
-
expect { app2.save!(validate: false) }.to raise_error(ActiveRecord::RecordNotUnique)
|
94
|
-
end
|
95
|
-
|
96
|
-
it 'generate secret on create' do
|
97
|
-
expect(new_application.secret).to be_nil
|
98
|
-
new_application.save
|
99
|
-
expect(new_application.secret).not_to be_nil
|
100
|
-
end
|
101
|
-
|
102
|
-
it 'generate secret on create if is blank string' do
|
103
|
-
new_application.secret = ''
|
104
|
-
new_application.save
|
105
|
-
expect(new_application.secret).not_to be_blank
|
106
|
-
end
|
107
|
-
|
108
|
-
it 'generate secret on create unless one is set' do
|
109
|
-
new_application.secret = secret
|
110
|
-
new_application.save
|
111
|
-
expect(new_application.secret).to eq(secret)
|
112
|
-
end
|
113
|
-
|
114
|
-
it 'is invalid without secret' do
|
115
|
-
new_application.save
|
116
|
-
new_application.secret = nil
|
117
|
-
expect(new_application).not_to be_valid
|
118
|
-
end
|
119
|
-
|
120
|
-
describe 'destroy related models on cascade' do
|
121
|
-
before(:each) do
|
122
|
-
new_application.save
|
123
|
-
end
|
124
|
-
|
125
|
-
it 'should destroy its access grants' do
|
126
|
-
FactoryGirl.create(:access_grant, application: new_application)
|
127
|
-
expect { new_application.destroy }.to change { Doorkeeper::AccessGrant.count }.by(-1)
|
128
|
-
end
|
129
|
-
|
130
|
-
it 'should destroy its access tokens' do
|
131
|
-
FactoryGirl.create(:access_token, application: new_application)
|
132
|
-
FactoryGirl.create(:access_token, application: new_application, revoked_at: Time.now)
|
133
|
-
expect do
|
134
|
-
new_application.destroy
|
135
|
-
end.to change { Doorkeeper::AccessToken.count }.by(-2)
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
|
-
describe :authorized_for do
|
140
|
-
let(:resource_owner) { double(:resource_owner, id: 10) }
|
141
|
-
|
142
|
-
it 'is empty if the application is not authorized for anyone' do
|
143
|
-
expect(Application.authorized_for(resource_owner)).to be_empty
|
144
|
-
end
|
145
|
-
|
146
|
-
it 'returns only application for a specific resource owner' do
|
147
|
-
FactoryGirl.create(:access_token, resource_owner_id: resource_owner.id + 1)
|
148
|
-
token = FactoryGirl.create(:access_token, resource_owner_id: resource_owner.id)
|
149
|
-
expect(Application.authorized_for(resource_owner)).to eq([token.application])
|
150
|
-
end
|
151
|
-
|
152
|
-
it 'excludes revoked tokens' do
|
153
|
-
FactoryGirl.create(:access_token, resource_owner_id: resource_owner.id, revoked_at: 2.days.ago)
|
154
|
-
expect(Application.authorized_for(resource_owner)).to be_empty
|
155
|
-
end
|
156
|
-
|
157
|
-
it 'returns all applications that have been authorized' do
|
158
|
-
token1 = FactoryGirl.create(:access_token, resource_owner_id: resource_owner.id)
|
159
|
-
token2 = FactoryGirl.create(:access_token, resource_owner_id: resource_owner.id)
|
160
|
-
expect(Application.authorized_for(resource_owner)).to eq([token1.application, token2.application])
|
161
|
-
end
|
162
|
-
|
163
|
-
it 'returns only one application even if it has been authorized twice' do
|
164
|
-
application = FactoryGirl.create(:application)
|
165
|
-
FactoryGirl.create(:access_token, resource_owner_id: resource_owner.id, application: application)
|
166
|
-
FactoryGirl.create(:access_token, resource_owner_id: resource_owner.id, application: application)
|
167
|
-
expect(Application.authorized_for(resource_owner)).to eq([application])
|
168
|
-
end
|
169
|
-
|
170
|
-
it 'should fail to mass assign a new application', if: ::Rails::VERSION::MAJOR < 4 do
|
171
|
-
mass_assign = { name: 'Something',
|
172
|
-
redirect_uri: 'http://somewhere.com/something',
|
173
|
-
uid: 123,
|
174
|
-
secret: 'something' }
|
175
|
-
expect(Application.create(mass_assign).uid).not_to eq(123)
|
176
|
-
end
|
177
|
-
end
|
178
|
-
|
179
|
-
describe :authenticate do
|
180
|
-
it 'finds the application via uid/secret' do
|
181
|
-
app = FactoryGirl.create :application
|
182
|
-
authenticated = Application.by_uid_and_secret(app.uid, app.secret)
|
183
|
-
expect(authenticated).to eq(app)
|
184
|
-
end
|
185
|
-
end
|
186
|
-
end
|
187
|
-
end
|
@@ -1,94 +0,0 @@
|
|
1
|
-
require 'spec_helper_integration'
|
2
|
-
|
3
|
-
feature 'Adding applications' do
|
4
|
-
context 'in application form' do
|
5
|
-
background do
|
6
|
-
visit '/oauth/applications/new'
|
7
|
-
end
|
8
|
-
|
9
|
-
scenario 'adding a valid app' do
|
10
|
-
fill_in 'doorkeeper_application[name]', with: 'My Application'
|
11
|
-
fill_in 'doorkeeper_application[redirect_uri]',
|
12
|
-
with: 'https://example.com'
|
13
|
-
|
14
|
-
click_button 'Submit'
|
15
|
-
i_should_see 'Application created'
|
16
|
-
i_should_see 'My Application'
|
17
|
-
end
|
18
|
-
|
19
|
-
scenario 'adding invalid app' do
|
20
|
-
click_button 'Submit'
|
21
|
-
i_should_see 'Whoops! Check your form for possible errors'
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
feature 'Listing applications' do
|
27
|
-
background do
|
28
|
-
FactoryGirl.create :application, name: 'Oauth Dude'
|
29
|
-
FactoryGirl.create :application, name: 'Awesome App'
|
30
|
-
end
|
31
|
-
|
32
|
-
scenario 'application list' do
|
33
|
-
visit '/oauth/applications'
|
34
|
-
i_should_see 'Awesome App'
|
35
|
-
i_should_see 'Oauth Dude'
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
feature 'Show application' do
|
40
|
-
given :app do
|
41
|
-
FactoryGirl.create :application, name: 'Just another oauth app'
|
42
|
-
end
|
43
|
-
|
44
|
-
scenario 'visiting application page' do
|
45
|
-
visit "/oauth/applications/#{app.id}"
|
46
|
-
i_should_see 'Just another oauth app'
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
feature 'Edit application' do
|
51
|
-
let :app do
|
52
|
-
FactoryGirl.create :application, name: 'OMG my app'
|
53
|
-
end
|
54
|
-
|
55
|
-
background do
|
56
|
-
visit "/oauth/applications/#{app.id}/edit"
|
57
|
-
end
|
58
|
-
|
59
|
-
scenario 'updating a valid app' do
|
60
|
-
fill_in 'doorkeeper_application[name]', with: 'Serious app'
|
61
|
-
click_button 'Submit'
|
62
|
-
i_should_see 'Application updated'
|
63
|
-
i_should_see 'Serious app'
|
64
|
-
i_should_not_see 'OMG my app'
|
65
|
-
end
|
66
|
-
|
67
|
-
scenario 'updating an invalid app' do
|
68
|
-
fill_in 'doorkeeper_application[name]', with: ''
|
69
|
-
click_button 'Submit'
|
70
|
-
i_should_see 'Whoops! Check your form for possible errors'
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
feature 'Remove application' do
|
75
|
-
background do
|
76
|
-
@app = FactoryGirl.create :application
|
77
|
-
end
|
78
|
-
|
79
|
-
scenario 'deleting an application from list' do
|
80
|
-
visit '/oauth/applications'
|
81
|
-
i_should_see @app.name
|
82
|
-
within(:css, "tr#application_#{@app.id}") do
|
83
|
-
click_button 'Destroy'
|
84
|
-
end
|
85
|
-
i_should_see 'Application deleted'
|
86
|
-
i_should_not_see @app.name
|
87
|
-
end
|
88
|
-
|
89
|
-
scenario 'deleting an application from show' do
|
90
|
-
visit "/oauth/applications/#{@app.id}"
|
91
|
-
click_button 'Destroy'
|
92
|
-
i_should_see 'Application deleted'
|
93
|
-
end
|
94
|
-
end
|
@@ -1,30 +0,0 @@
|
|
1
|
-
require 'spec_helper_integration'
|
2
|
-
|
3
|
-
feature 'Authorized applications' do
|
4
|
-
background do
|
5
|
-
@user = User.create!(name: 'Joe', password: 'sekret')
|
6
|
-
@client = client_exists(name: 'Amazing Client App')
|
7
|
-
resource_owner_is_authenticated @user
|
8
|
-
client_is_authorized @client, @user
|
9
|
-
end
|
10
|
-
|
11
|
-
scenario 'display user\'s authorized applications' do
|
12
|
-
visit '/oauth/authorized_applications'
|
13
|
-
i_should_see 'Amazing Client App'
|
14
|
-
end
|
15
|
-
|
16
|
-
scenario 'do not display other user\'s authorized applications' do
|
17
|
-
client = client_exists(name: 'Another Client App')
|
18
|
-
client_is_authorized client, User.create!(name: 'Joe', password: 'sekret')
|
19
|
-
visit '/oauth/authorized_applications'
|
20
|
-
i_should_not_see 'Another Client App'
|
21
|
-
end
|
22
|
-
|
23
|
-
scenario 'user revoke access to application' do
|
24
|
-
visit '/oauth/authorized_applications'
|
25
|
-
i_should_see 'Amazing Client App'
|
26
|
-
click_on 'Revoke'
|
27
|
-
i_should_see 'Application revoked'
|
28
|
-
i_should_not_see 'Amazing Client App'
|
29
|
-
end
|
30
|
-
end
|