doorkeeper-grants_assertion 0.0.1

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.
Files changed (55) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/Gemfile +12 -0
  4. data/MIT-LICENSE +21 -0
  5. data/README.md +30 -0
  6. data/Rakefile +18 -0
  7. data/config/locales/en.yml +5 -0
  8. data/doorkeeper-grants_assertion.gemspec +22 -0
  9. data/lib/doorkeeper/grants_assertion.rb +27 -0
  10. data/lib/doorkeeper/request/assertion.rb +29 -0
  11. data/spec/dummy/Rakefile +7 -0
  12. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  13. data/spec/dummy/app/controllers/custom_authorizations_controller.rb +7 -0
  14. data/spec/dummy/app/controllers/full_protected_resources_controller.rb +12 -0
  15. data/spec/dummy/app/controllers/home_controller.rb +17 -0
  16. data/spec/dummy/app/controllers/metal_controller.rb +11 -0
  17. data/spec/dummy/app/controllers/semi_protected_resources_controller.rb +11 -0
  18. data/spec/dummy/app/helpers/application_helper.rb +5 -0
  19. data/spec/dummy/app/models/user.rb +9 -0
  20. data/spec/dummy/app/views/home/index.html.erb +0 -0
  21. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  22. data/spec/dummy/config.ru +4 -0
  23. data/spec/dummy/config/application.rb +47 -0
  24. data/spec/dummy/config/boot.rb +4 -0
  25. data/spec/dummy/config/database.yml +15 -0
  26. data/spec/dummy/config/environment.rb +5 -0
  27. data/spec/dummy/config/environments/development.rb +29 -0
  28. data/spec/dummy/config/environments/production.rb +62 -0
  29. data/spec/dummy/config/environments/test.rb +51 -0
  30. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  31. data/spec/dummy/config/initializers/doorkeeper.rb +92 -0
  32. data/spec/dummy/config/initializers/secret_token.rb +9 -0
  33. data/spec/dummy/config/initializers/session_store.rb +8 -0
  34. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  35. data/spec/dummy/config/locales/doorkeeper.en.yml +74 -0
  36. data/spec/dummy/config/routes.rb +52 -0
  37. data/spec/dummy/db/migrate/20111122132257_create_users.rb +10 -0
  38. data/spec/dummy/db/migrate/20130902165751_create_doorkeeper_tables.rb +41 -0
  39. data/spec/dummy/db/migrate/20130902175349_add_owner_to_application.rb +7 -0
  40. data/spec/dummy/db/schema.rb +66 -0
  41. data/spec/dummy/script/rails +6 -0
  42. data/spec/factories/access_grant.rb +9 -0
  43. data/spec/factories/access_token.rb +11 -0
  44. data/spec/factories/application.rb +6 -0
  45. data/spec/requests/flows/assertion_spec.rb +74 -0
  46. data/spec/spec_helper.rb +2 -0
  47. data/spec/spec_helper_integration.rb +29 -0
  48. data/spec/support/dependencies/factory_girl.rb +2 -0
  49. data/spec/support/helpers/config_helper.rb +9 -0
  50. data/spec/support/helpers/model_helper.rb +45 -0
  51. data/spec/support/helpers/request_spec_helper.rb +76 -0
  52. data/spec/support/helpers/url_helper.rb +19 -0
  53. data/spec/support/shared/controllers_shared_context.rb +60 -0
  54. data/spec/support/shared/models_shared_examples.rb +52 -0
  55. metadata +195 -0
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3
+
4
+ APP_PATH = File.expand_path('../../config/application', __FILE__)
5
+ require File.expand_path('../../config/boot', __FILE__)
6
+ require 'rails/commands'
@@ -0,0 +1,9 @@
1
+ FactoryGirl.define do
2
+ factory :access_grant, class: Doorkeeper::AccessGrant do
3
+ sequence(:resource_owner_id) { |n| n }
4
+ application
5
+ redirect_uri 'https://app.com/callback'
6
+ expires_in 100
7
+ scopes 'public write'
8
+ end
9
+ end
@@ -0,0 +1,11 @@
1
+ FactoryGirl.define do
2
+ factory :access_token, class: Doorkeeper::AccessToken do
3
+ sequence(:resource_owner_id) { |n| n }
4
+ application
5
+ expires_in 2.hours
6
+
7
+ factory :clientless_access_token do
8
+ application nil
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,6 @@
1
+ FactoryGirl.define do
2
+ factory :application, class: Doorkeeper::Application do
3
+ sequence(:name) { |n| "Application #{n}" }
4
+ redirect_uri 'https://app.com/callback'
5
+ end
6
+ end
@@ -0,0 +1,74 @@
1
+ require 'spec_helper_integration'
2
+
3
+ feature 'Resource Owner Assertion Flow inproperly set up' do
4
+ background do
5
+ client_exists
6
+ create_resource_owner
7
+ end
8
+
9
+ context 'with valid user assertion' do
10
+ scenario "should not issue new token" do
11
+ expect {
12
+ post assertion_endpoint_url(client: @client, resource_owner: @resource_owner)
13
+ }.to_not change { Doorkeeper::AccessToken.count }
14
+
15
+ should_have_json 'error', 'invalid_resource_owner'
16
+ should_have_json 'error_description', translated_error_message(:invalid_resource_owner)
17
+ expect(response.status).to eq(401)
18
+ end
19
+ end
20
+ end
21
+
22
+ feature 'Resource Owner Assertion Flow' do
23
+ background do
24
+ config_is_set(:resource_owner_from_assertion) { User.where(assertion: params[:assertion]).first }
25
+ client_exists
26
+ create_resource_owner
27
+ end
28
+
29
+ context 'with valid user assertion' do
30
+ scenario "should issue new token" do
31
+ expect {
32
+ post assertion_endpoint_url(client: @client, resource_owner: @resource_owner)
33
+ }.to change { Doorkeeper::AccessToken.count }.by(1)
34
+
35
+ token = Doorkeeper::AccessToken.first
36
+
37
+ should_have_json 'access_token', token.token
38
+ end
39
+
40
+ scenario "should issue a refresh token if enabled" do
41
+ config_is_set(:refresh_token_enabled, true)
42
+
43
+ post assertion_endpoint_url(client: @client, resource_owner: @resource_owner)
44
+
45
+ token = Doorkeeper::AccessToken.first
46
+
47
+ should_have_json 'refresh_token', token.refresh_token
48
+ end
49
+
50
+ end
51
+
52
+ context "with invalid user assertion" do
53
+ scenario "should not issue new token with bad assertion" do
54
+ expect {
55
+ post assertion_endpoint_url( client: @client, assertion: 'i_dont_exist' )
56
+ }.to_not change { Doorkeeper::AccessToken.count }
57
+
58
+ should_have_json 'error', 'invalid_resource_owner'
59
+ should_have_json 'error_description', translated_error_message(:invalid_resource_owner)
60
+ expect(response.status).to eq(401)
61
+ end
62
+
63
+ scenario "should not issue new token without assertion" do
64
+ expect {
65
+ post assertion_endpoint_url( client: @client )
66
+ }.to_not change { Doorkeeper::AccessToken.count }
67
+
68
+ should_have_json 'error', 'invalid_resource_owner'
69
+ should_have_json 'error_description', translated_error_message(:invalid_resource_owner)
70
+ expect(response.status).to eq(401)
71
+ end
72
+
73
+ end
74
+ end
@@ -0,0 +1,2 @@
1
+ $LOAD_PATH.unshift File.expand_path(File.join(File.dirname(__FILE__), '../lib'))
2
+ $LOAD_PATH.unshift File.expand_path(File.join(File.dirname(__FILE__), '../app'))
@@ -0,0 +1,29 @@
1
+ ENV['RAILS_ENV'] ||= 'test'
2
+
3
+ $LOAD_PATH.unshift File.dirname(__FILE__)
4
+
5
+ require 'dummy/config/environment'
6
+ require 'rspec/rails'
7
+ require 'rspec/autorun'
8
+ require 'database_cleaner'
9
+
10
+ Rails.logger.info "====> Doorkeeper.orm = #{Doorkeeper.configuration.orm.inspect}"
11
+ Rails.logger.info "====> Rails version: #{Rails.version}"
12
+ Rails.logger.info "====> Ruby version: #{RUBY_VERSION}"
13
+
14
+ Dir["#{File.dirname(__FILE__)}/support/{dependencies,helpers,shared}/*.rb"].each { |f| require f }
15
+
16
+ # load schema to in memory sqlite
17
+ ActiveRecord::Migration.verbose = false
18
+ load Rails.root + 'db/schema.rb'
19
+
20
+ RSpec.configure do |config|
21
+ config.mock_with :rspec
22
+
23
+ config.infer_base_class_for_anonymous_controllers = false
24
+
25
+ config.before { DatabaseCleaner.start }
26
+ config.after { DatabaseCleaner.clean }
27
+
28
+ config.order = 'random'
29
+ end
@@ -0,0 +1,2 @@
1
+ require 'factory_girl'
2
+ FactoryGirl.find_definitions
@@ -0,0 +1,9 @@
1
+ module ConfigHelper
2
+ def config_is_set(setting, value = nil, &block)
3
+ setting_ivar = "@#{setting}"
4
+ value = block_given? ? block : value
5
+ Doorkeeper.configuration.instance_variable_set(setting_ivar, value)
6
+ end
7
+ end
8
+
9
+ RSpec.configuration.send :include, ConfigHelper, type: :request
@@ -0,0 +1,45 @@
1
+ module ModelHelper
2
+ def client_exists(client_attributes = {})
3
+ @client = FactoryGirl.create(:application, client_attributes)
4
+ end
5
+
6
+ def create_resource_owner
7
+ @resource_owner = User.create!(name: 'Joe', password: 'sekret', assertion: 'assertion')
8
+ end
9
+
10
+ def authorization_code_exists(options = {})
11
+ @authorization = FactoryGirl.create(:access_grant, options)
12
+ end
13
+
14
+ def access_grant_should_exist_for(client, resource_owner)
15
+ grant = Doorkeeper::AccessGrant.first
16
+ expect(grant.application).to eq(client)
17
+ grant.resource_owner_id == resource_owner.id
18
+ end
19
+
20
+ def access_token_should_exist_for(client, resource_owner)
21
+ grant = Doorkeeper::AccessToken.first
22
+ expect(grant.application).to eq(client)
23
+ grant.resource_owner_id == resource_owner.id
24
+ end
25
+
26
+ def access_grant_should_not_exist
27
+ expect(Doorkeeper::AccessGrant.all).to be_empty
28
+ end
29
+
30
+ def access_token_should_not_exist
31
+ expect(Doorkeeper::AccessToken.all).to be_empty
32
+ end
33
+
34
+ def access_grant_should_have_scopes(*args)
35
+ grant = Doorkeeper::AccessGrant.first
36
+ expect(grant.scopes).to eq(Doorkeeper::OAuth::Scopes.from_array(args))
37
+ end
38
+
39
+ def access_token_should_have_scopes(*args)
40
+ grant = Doorkeeper::AccessToken.first
41
+ expect(grant.scopes).to eq(Doorkeeper::OAuth::Scopes.from_array(args))
42
+ end
43
+ end
44
+
45
+ RSpec.configuration.send :include, ModelHelper, type: :request
@@ -0,0 +1,76 @@
1
+ module RequestSpecHelper
2
+ def i_should_see(content)
3
+ expect(page).to have_content(content)
4
+ end
5
+
6
+ def i_should_not_see(content)
7
+ expect(page).to have_no_content(content)
8
+ end
9
+
10
+ def i_should_be_on(path)
11
+ expect(current_path).to eq(path)
12
+ end
13
+
14
+ def url_should_have_param(param, value)
15
+ expect(current_params[param]).to eq(value)
16
+ end
17
+
18
+ def url_should_not_have_param(param)
19
+ expect(current_params).not_to have_key(param)
20
+ end
21
+
22
+ def current_params
23
+ Rack::Utils.parse_query(current_uri.query)
24
+ end
25
+
26
+ def current_uri
27
+ URI.parse(page.current_url)
28
+ end
29
+
30
+ def should_have_header(header, value)
31
+ expect(headers[header]).to eq(value)
32
+ end
33
+
34
+ def with_access_token_header(token)
35
+ with_header 'Authorization', "Bearer #{token}"
36
+ end
37
+
38
+ def with_header(header, value)
39
+ page.driver.header header, value
40
+ end
41
+
42
+ def basic_auth_header_for_client(client)
43
+ ActionController::HttpAuthentication::Basic.encode_credentials client.uid, client.secret
44
+ end
45
+
46
+ def should_have_json(key, value)
47
+ expect(JSON.parse(response.body).fetch(key)).to eq(value)
48
+ end
49
+
50
+ def should_have_json_within(key, value, range)
51
+ expect(JSON.parse(response.body).fetch(key)).to be_within(range).of(value)
52
+ end
53
+
54
+ def should_not_have_json(key)
55
+ expect(JSON.parse(response.body)).not_to have_key(key)
56
+ end
57
+
58
+ def sign_in
59
+ visit '/'
60
+ click_on 'Sign in'
61
+ end
62
+
63
+ def i_should_see_translated_error_message(key)
64
+ i_should_see translated_error_message(key)
65
+ end
66
+
67
+ def translated_error_message(key)
68
+ I18n.translate key, scope: [:doorkeeper, :errors, :messages]
69
+ end
70
+
71
+ def response_status_should_be(status)
72
+ expect(page.driver.response.status.to_i).to eq(status)
73
+ end
74
+ end
75
+
76
+ RSpec.configuration.send :include, RequestSpecHelper, type: :request
@@ -0,0 +1,19 @@
1
+ module UrlHelper
2
+ def assertion_endpoint_url(options = {})
3
+ parameters = {
4
+ :code => options[:code],
5
+ :client_id => options[:client_id] || options[:client].uid,
6
+ :client_secret => options[:client_secret] || options[:client].secret,
7
+ :redirect_uri => options[:redirect_uri] || options[:client].redirect_uri,
8
+ :grant_type => options[:grant_type] || "assertion",
9
+ :assertion => options[:assertion] || (options[:resource_owner] ? options[:resource_owner].assertion : nil)
10
+ }
11
+ "/oauth/token?#{build_query(parameters)}"
12
+ end
13
+
14
+ def build_query(hash)
15
+ Rack::Utils.build_query(hash)
16
+ end
17
+ end
18
+
19
+ RSpec.configuration.send :include, UrlHelper, type: :request
@@ -0,0 +1,60 @@
1
+ shared_context 'valid token', token: :valid do
2
+ let :token_string do
3
+ '1A2B3C4D'
4
+ end
5
+
6
+ let :token do
7
+ double(Doorkeeper::AccessToken, accessible?: true)
8
+ end
9
+
10
+ before :each do
11
+ allow(Doorkeeper::AccessToken).to receive(:authenticate).with(token_string).and_return(token)
12
+ end
13
+ end
14
+
15
+ shared_context 'invalid token', token: :invalid do
16
+ let :token_string do
17
+ '1A2B3C4D'
18
+ end
19
+
20
+ let :token do
21
+ double(Doorkeeper::AccessToken, accessible?: false, revoked?: false, expired?: false)
22
+ end
23
+
24
+ before :each do
25
+ allow(Doorkeeper::AccessToken).to receive(:authenticate).with(token_string).and_return(token)
26
+ end
27
+ end
28
+
29
+ shared_context 'authenticated resource owner' do
30
+ before do
31
+ user = double(:resource, id: 1)
32
+ allow(Doorkeeper.configuration).to receive(:authenticate_resource_owner) { proc { user } }
33
+ end
34
+ end
35
+
36
+ shared_context 'not authenticated resource owner' do
37
+ before do
38
+ allow(Doorkeeper.configuration).to receive(:authenticate_resource_owner) { proc { redirect_to '/' } }
39
+ end
40
+ end
41
+
42
+ shared_context 'valid authorization request' do
43
+ let :authorization do
44
+ double(:authorization, valid?: true, authorize: true, success_redirect_uri: 'http://something.com/cb?code=token')
45
+ end
46
+
47
+ before do
48
+ allow(controller).to receive(:authorization) { authorization }
49
+ end
50
+ end
51
+
52
+ shared_context 'invalid authorization request' do
53
+ let :authorization do
54
+ double(:authorization, valid?: false, authorize: false, redirect_on_error?: false)
55
+ end
56
+
57
+ before do
58
+ allow(controller).to receive(:authorization) { authorization }
59
+ end
60
+ end
@@ -0,0 +1,52 @@
1
+ shared_examples 'an accessible token' do
2
+ describe :accessible? do
3
+ it 'is accessible if token is not expired' do
4
+ allow(subject).to receive(:expired?).and_return(false)
5
+ should be_accessible
6
+ end
7
+
8
+ it 'is not accessible if token is expired' do
9
+ allow(subject).to receive(:expired?).and_return(true)
10
+ should_not be_accessible
11
+ end
12
+ end
13
+ end
14
+
15
+ shared_examples 'a revocable token' do
16
+ describe :accessible? do
17
+ before { subject.save! }
18
+
19
+ it 'is accessible if token is not revoked' do
20
+ expect(subject).to be_accessible
21
+ end
22
+
23
+ it 'is not accessible if token is revoked' do
24
+ subject.revoke
25
+ expect(subject).not_to be_accessible
26
+ end
27
+ end
28
+ end
29
+
30
+ shared_examples 'a unique token' do
31
+ describe :token do
32
+ it 'is generated before validation' do
33
+ expect { subject.valid? }.to change { subject.token }.from(nil)
34
+ end
35
+
36
+ it 'is not valid if token exists' do
37
+ token1 = FactoryGirl.create factory_name
38
+ token2 = FactoryGirl.create factory_name
39
+ token2.token = token1.token
40
+ expect(token2).not_to be_valid
41
+ end
42
+
43
+ it 'expects database to throw an error when tokens are the same' do
44
+ token1 = FactoryGirl.create factory_name
45
+ token2 = FactoryGirl.create factory_name
46
+ token2.token = token1.token
47
+ expect do
48
+ token2.save!(validate: false)
49
+ end.to raise_error
50
+ end
51
+ end
52
+ end
metadata ADDED
@@ -0,0 +1,195 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: doorkeeper-grants_assertion
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Tute Costa
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-05-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: railties
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '3.1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '3.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: doorkeeper
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '1.3'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '1.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec-rails
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 2.11.4
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 2.11.4
55
+ - !ruby/object:Gem::Dependency
56
+ name: capybara
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 1.1.2
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 1.1.2
69
+ - !ruby/object:Gem::Dependency
70
+ name: factory_girl
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 2.6.4
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 2.6.4
83
+ - !ruby/object:Gem::Dependency
84
+ name: generator_spec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.9.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 0.9.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: database_cleaner
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 1.2.0
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 1.2.0
111
+ description: Assertion grant extension for Doorkeeper.
112
+ email:
113
+ - tutecosta@gmail.com
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - ".gitignore"
119
+ - Gemfile
120
+ - MIT-LICENSE
121
+ - README.md
122
+ - Rakefile
123
+ - config/locales/en.yml
124
+ - doorkeeper-grants_assertion.gemspec
125
+ - lib/doorkeeper/grants_assertion.rb
126
+ - lib/doorkeeper/request/assertion.rb
127
+ - spec/dummy/Rakefile
128
+ - spec/dummy/app/controllers/application_controller.rb
129
+ - spec/dummy/app/controllers/custom_authorizations_controller.rb
130
+ - spec/dummy/app/controllers/full_protected_resources_controller.rb
131
+ - spec/dummy/app/controllers/home_controller.rb
132
+ - spec/dummy/app/controllers/metal_controller.rb
133
+ - spec/dummy/app/controllers/semi_protected_resources_controller.rb
134
+ - spec/dummy/app/helpers/application_helper.rb
135
+ - spec/dummy/app/models/user.rb
136
+ - spec/dummy/app/views/home/index.html.erb
137
+ - spec/dummy/app/views/layouts/application.html.erb
138
+ - spec/dummy/config.ru
139
+ - spec/dummy/config/application.rb
140
+ - spec/dummy/config/boot.rb
141
+ - spec/dummy/config/database.yml
142
+ - spec/dummy/config/environment.rb
143
+ - spec/dummy/config/environments/development.rb
144
+ - spec/dummy/config/environments/production.rb
145
+ - spec/dummy/config/environments/test.rb
146
+ - spec/dummy/config/initializers/backtrace_silencers.rb
147
+ - spec/dummy/config/initializers/doorkeeper.rb
148
+ - spec/dummy/config/initializers/secret_token.rb
149
+ - spec/dummy/config/initializers/session_store.rb
150
+ - spec/dummy/config/initializers/wrap_parameters.rb
151
+ - spec/dummy/config/locales/doorkeeper.en.yml
152
+ - spec/dummy/config/routes.rb
153
+ - spec/dummy/db/migrate/20111122132257_create_users.rb
154
+ - spec/dummy/db/migrate/20130902165751_create_doorkeeper_tables.rb
155
+ - spec/dummy/db/migrate/20130902175349_add_owner_to_application.rb
156
+ - spec/dummy/db/schema.rb
157
+ - spec/dummy/script/rails
158
+ - spec/factories/access_grant.rb
159
+ - spec/factories/access_token.rb
160
+ - spec/factories/application.rb
161
+ - spec/requests/flows/assertion_spec.rb
162
+ - spec/spec_helper.rb
163
+ - spec/spec_helper_integration.rb
164
+ - spec/support/dependencies/factory_girl.rb
165
+ - spec/support/helpers/config_helper.rb
166
+ - spec/support/helpers/model_helper.rb
167
+ - spec/support/helpers/request_spec_helper.rb
168
+ - spec/support/helpers/url_helper.rb
169
+ - spec/support/shared/controllers_shared_context.rb
170
+ - spec/support/shared/models_shared_examples.rb
171
+ homepage: https://github.com/doorkeeper-gem/doorkeeper/doorkeeper-grants-assertion
172
+ licenses:
173
+ - MIT
174
+ metadata: {}
175
+ post_install_message:
176
+ rdoc_options: []
177
+ require_paths:
178
+ - lib
179
+ required_ruby_version: !ruby/object:Gem::Requirement
180
+ requirements:
181
+ - - ">="
182
+ - !ruby/object:Gem::Version
183
+ version: '0'
184
+ required_rubygems_version: !ruby/object:Gem::Requirement
185
+ requirements:
186
+ - - ">="
187
+ - !ruby/object:Gem::Version
188
+ version: '0'
189
+ requirements: []
190
+ rubyforge_project:
191
+ rubygems_version: 2.2.2
192
+ signing_key:
193
+ specification_version: 4
194
+ summary: Assertion grant extension for Doorkeeper.
195
+ test_files: []