doorkeeper 1.3.1 → 1.4.0
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.
Potentially problematic release.
This version of doorkeeper might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.hound.yml +4 -1
- data/CHANGELOG.md +18 -0
- data/README.md +2 -1
- data/app/controllers/doorkeeper/application_metal_controller.rb +16 -0
- data/app/controllers/doorkeeper/applications_controller.rb +0 -6
- data/app/controllers/doorkeeper/authorizations_controller.rb +14 -15
- data/app/controllers/doorkeeper/authorized_applications_controller.rb +10 -8
- data/app/controllers/doorkeeper/token_info_controller.rb +1 -1
- data/app/controllers/doorkeeper/tokens_controller.rb +3 -11
- data/app/validators/redirect_uri_validator.rb +0 -1
- data/config/locales/en.yml +0 -3
- data/doorkeeper.gemspec +1 -0
- data/lib/doorkeeper.rb +1 -0
- data/lib/doorkeeper/config.rb +5 -5
- data/lib/doorkeeper/doorkeeper_for.rb +7 -17
- data/lib/doorkeeper/helpers/controller.rb +11 -8
- data/lib/doorkeeper/helpers/filter.rb +35 -13
- data/lib/doorkeeper/models/access_grant.rb +5 -5
- data/lib/doorkeeper/models/access_token.rb +9 -5
- data/lib/doorkeeper/models/active_record/access_grant.rb +1 -1
- data/lib/doorkeeper/models/active_record/access_token.rb +1 -1
- data/lib/doorkeeper/models/active_record/application.rb +3 -3
- data/lib/doorkeeper/models/application.rb +1 -1
- data/lib/doorkeeper/models/mongo_mapper/access_grant.rb +0 -3
- data/lib/doorkeeper/models/mongo_mapper/access_token.rb +0 -3
- data/lib/doorkeeper/models/mongoid2/access_grant.rb +1 -3
- data/lib/doorkeeper/models/mongoid2/access_token.rb +1 -3
- data/lib/doorkeeper/models/mongoid3_4/access_grant.rb +2 -4
- data/lib/doorkeeper/models/mongoid3_4/access_token.rb +2 -4
- data/lib/doorkeeper/models/revocable.rb +1 -1
- data/lib/doorkeeper/models/scopes.rb +6 -2
- data/lib/doorkeeper/oauth/authorization/code.rb +4 -0
- data/lib/doorkeeper/oauth/authorization/token.rb +8 -0
- data/lib/doorkeeper/oauth/authorization_code_request.rb +2 -2
- data/lib/doorkeeper/oauth/client.rb +2 -2
- data/lib/doorkeeper/oauth/client_credentials/creator.rb +1 -1
- data/lib/doorkeeper/oauth/client_credentials/validation.rb +2 -2
- data/lib/doorkeeper/oauth/client_credentials_request.rb +3 -12
- data/lib/doorkeeper/oauth/code_response.rb +3 -4
- data/lib/doorkeeper/oauth/error_response.rb +3 -3
- data/lib/doorkeeper/oauth/forbidden_token_response.rb +29 -0
- data/lib/doorkeeper/oauth/helpers/scope_checker.rb +1 -1
- data/lib/doorkeeper/oauth/password_access_token_request.rb +5 -5
- data/lib/doorkeeper/oauth/pre_authorization.rb +2 -2
- data/lib/doorkeeper/oauth/refresh_token_request.rb +6 -6
- data/lib/doorkeeper/oauth/request_concern.rb +2 -2
- data/lib/doorkeeper/oauth/token.rb +1 -1
- data/lib/doorkeeper/server.rb +2 -2
- data/lib/doorkeeper/version.rb +1 -1
- data/spec/controllers/authorizations_controller_spec.rb +46 -0
- data/spec/controllers/protected_resources_controller_spec.rb +13 -6
- data/spec/lib/models/revocable_spec.rb +1 -1
- data/spec/lib/models/scopes_spec.rb +11 -0
- data/spec/lib/oauth/authorization/uri_builder_spec.rb +5 -0
- data/spec/lib/oauth/forbidden_token_response_spec.rb +23 -0
- data/spec/models/doorkeeper/access_token_spec.rb +30 -0
- data/spec/requests/flows/refresh_token_spec.rb +2 -2
- data/spec/requests/protected_resources/private_api_spec.rb +5 -5
- data/spec/support/shared/controllers_shared_context.rb +2 -2
- data/spec/validators/redirect_uri_validator_spec.rb +1 -2
- metadata +19 -4
- data/lib/doorkeeper/models/mongo_mapper/revocable.rb +0 -15
- data/lib/doorkeeper/models/mongoid/revocable.rb +0 -15
| @@ -15,7 +15,7 @@ module Doorkeeper | |
| 15 15 |  | 
| 16 16 | 
             
                  def scopes
         | 
| 17 17 | 
             
                    @scopes ||= if @original_scopes.present?
         | 
| 18 | 
            -
                                   | 
| 18 | 
            +
                                  OAuth::Scopes.from_string(@original_scopes)
         | 
| 19 19 | 
             
                                else
         | 
| 20 20 | 
             
                                  default_scopes
         | 
| 21 21 | 
             
                                end
         | 
| @@ -30,7 +30,7 @@ module Doorkeeper | |
| 30 30 | 
             
                  end
         | 
| 31 31 |  | 
| 32 32 | 
             
                  def find_or_create_access_token(client, resource_owner_id, scopes, server)
         | 
| 33 | 
            -
                    @access_token =  | 
| 33 | 
            +
                    @access_token = AccessToken.find_or_create_for(
         | 
| 34 34 | 
             
                      client,
         | 
| 35 35 | 
             
                      resource_owner_id,
         | 
| 36 36 | 
             
                      scopes,
         | 
    
        data/lib/doorkeeper/server.rb
    CHANGED
    
    | @@ -34,11 +34,11 @@ module Doorkeeper | |
| 34 34 | 
             
                end
         | 
| 35 35 |  | 
| 36 36 | 
             
                def current_refresh_token
         | 
| 37 | 
            -
                   | 
| 37 | 
            +
                  AccessToken.by_refresh_token(parameters[:refresh_token])
         | 
| 38 38 | 
             
                end
         | 
| 39 39 |  | 
| 40 40 | 
             
                def grant
         | 
| 41 | 
            -
                   | 
| 41 | 
            +
                  AccessGrant.authenticate(parameters[:code])
         | 
| 42 42 | 
             
                end
         | 
| 43 43 |  | 
| 44 44 | 
             
                # TODO: Use configuration and evaluate proper context on block
         | 
    
        data/lib/doorkeeper/version.rb
    CHANGED
    
    
| @@ -98,6 +98,52 @@ describe Doorkeeper::AuthorizationsController, 'implicit grant flow' do | |
| 98 98 | 
             
                end
         | 
| 99 99 | 
             
              end
         | 
| 100 100 |  | 
| 101 | 
            +
              describe 'GET #new token request with native url and skip_authorization true' do
         | 
| 102 | 
            +
                before do
         | 
| 103 | 
            +
                  allow(Doorkeeper.configuration).to receive(:skip_authorization).and_return(proc do
         | 
| 104 | 
            +
                    true
         | 
| 105 | 
            +
                  end)
         | 
| 106 | 
            +
                  client.update_attribute :redirect_uri, 'urn:ietf:wg:oauth:2.0:oob'
         | 
| 107 | 
            +
                  get :new, client_id: client.uid, response_type: 'token', redirect_uri: client.redirect_uri
         | 
| 108 | 
            +
                end
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                it 'should redirect immediately' do
         | 
| 111 | 
            +
                  expect(response).to be_redirect
         | 
| 112 | 
            +
                  expect(response.location).to match(/oauth\/token\/info\?access_token=/)
         | 
| 113 | 
            +
                end
         | 
| 114 | 
            +
             | 
| 115 | 
            +
                it 'should not issue a grant' do
         | 
| 116 | 
            +
                  expect(Doorkeeper::AccessGrant.count).to be 0
         | 
| 117 | 
            +
                end
         | 
| 118 | 
            +
             | 
| 119 | 
            +
                it 'should issue a token' do
         | 
| 120 | 
            +
                  expect(Doorkeeper::AccessToken.count).to be 1
         | 
| 121 | 
            +
                end
         | 
| 122 | 
            +
              end
         | 
| 123 | 
            +
             | 
| 124 | 
            +
              describe 'GET #new code request with native url and skip_authorization true' do
         | 
| 125 | 
            +
                before do
         | 
| 126 | 
            +
                  allow(Doorkeeper.configuration).to receive(:skip_authorization).and_return(proc do
         | 
| 127 | 
            +
                    true
         | 
| 128 | 
            +
                  end)
         | 
| 129 | 
            +
                  client.update_attribute :redirect_uri, 'urn:ietf:wg:oauth:2.0:oob'
         | 
| 130 | 
            +
                  get :new, client_id: client.uid, response_type: 'code', redirect_uri: client.redirect_uri
         | 
| 131 | 
            +
                end
         | 
| 132 | 
            +
             | 
| 133 | 
            +
                it 'should redirect immediately' do
         | 
| 134 | 
            +
                  expect(response).to be_redirect
         | 
| 135 | 
            +
                  expect(response.location).to match(/oauth\/authorize\//)
         | 
| 136 | 
            +
                end
         | 
| 137 | 
            +
             | 
| 138 | 
            +
                it 'should issue a grant' do
         | 
| 139 | 
            +
                  expect(Doorkeeper::AccessGrant.count).to be 1
         | 
| 140 | 
            +
                end
         | 
| 141 | 
            +
             | 
| 142 | 
            +
                it 'should not issue a token' do
         | 
| 143 | 
            +
                  expect(Doorkeeper::AccessToken.count).to be 0
         | 
| 144 | 
            +
                end
         | 
| 145 | 
            +
              end
         | 
| 146 | 
            +
             | 
| 101 147 | 
             
              describe 'GET #new with skip_authorization true' do
         | 
| 102 148 | 
             
                before do
         | 
| 103 149 | 
             
                  allow(Doorkeeper.configuration).to receive(:skip_authorization).and_return(proc do
         | 
| @@ -77,19 +77,22 @@ describe 'Doorkeeper_for helper' do | |
| 77 77 | 
             
                end
         | 
| 78 78 |  | 
| 79 79 | 
             
                let(:token_string) { '1A2BC3' }
         | 
| 80 | 
            +
                let(:token) do
         | 
| 81 | 
            +
                  double(Doorkeeper::AccessToken, acceptable?: true)
         | 
| 82 | 
            +
                end
         | 
| 80 83 |  | 
| 81 84 | 
             
                it 'access_token param' do
         | 
| 82 | 
            -
                  expect(Doorkeeper::AccessToken).to receive(:authenticate).with(token_string)
         | 
| 85 | 
            +
                  expect(Doorkeeper::AccessToken).to receive(:authenticate).with(token_string).and_return(token)
         | 
| 83 86 | 
             
                  get :index, access_token: token_string
         | 
| 84 87 | 
             
                end
         | 
| 85 88 |  | 
| 86 89 | 
             
                it 'bearer_token param' do
         | 
| 87 | 
            -
                  expect(Doorkeeper::AccessToken).to receive(:authenticate).with(token_string)
         | 
| 90 | 
            +
                  expect(Doorkeeper::AccessToken).to receive(:authenticate).with(token_string).and_return(token)
         | 
| 88 91 | 
             
                  get :index, bearer_token: token_string
         | 
| 89 92 | 
             
                end
         | 
| 90 93 |  | 
| 91 94 | 
             
                it 'Authorization header' do
         | 
| 92 | 
            -
                  expect(Doorkeeper::AccessToken).to receive(:authenticate).with(token_string)
         | 
| 95 | 
            +
                  expect(Doorkeeper::AccessToken).to receive(:authenticate).with(token_string).and_return(token)
         | 
| 93 96 | 
             
                  request.env['HTTP_AUTHORIZATION'] = "Bearer #{token_string}"
         | 
| 94 97 | 
             
                  get :index
         | 
| 95 98 | 
             
                end
         | 
| @@ -101,7 +104,7 @@ describe 'Doorkeeper_for helper' do | |
| 101 104 | 
             
                end
         | 
| 102 105 |  | 
| 103 106 | 
             
                it 'does not change Authorization header value' do
         | 
| 104 | 
            -
                  expect(Doorkeeper::AccessToken).to receive(:authenticate).exactly(2).times
         | 
| 107 | 
            +
                  expect(Doorkeeper::AccessToken).to receive(:authenticate).exactly(2).times.and_return(token)
         | 
| 105 108 | 
             
                  request.env['HTTP_AUTHORIZATION'] = "Bearer #{token_string}"
         | 
| 106 109 | 
             
                  get :index
         | 
| 107 110 | 
             
                  controller.send(:remove_instance_variable, :@token)
         | 
| @@ -172,6 +175,7 @@ describe 'Doorkeeper_for helper' do | |
| 172 175 |  | 
| 173 176 | 
             
                it 'allows if the token has particular scopes' do
         | 
| 174 177 | 
             
                  token = double(Doorkeeper::AccessToken, accessible?: true, scopes: %w(write public))
         | 
| 178 | 
            +
                  expect(token).to receive(:acceptable?).with(['write']).and_return(true)
         | 
| 175 179 | 
             
                  expect(Doorkeeper::AccessToken).to receive(:authenticate).with(token_string).and_return(token)
         | 
| 176 180 | 
             
                  get :index, access_token: token_string
         | 
| 177 181 | 
             
                  expect(response).to be_success
         | 
| @@ -180,9 +184,10 @@ describe 'Doorkeeper_for helper' do | |
| 180 184 | 
             
                it 'does not allow if the token does not include given scope' do
         | 
| 181 185 | 
             
                  token = double(Doorkeeper::AccessToken, accessible?: true, scopes: ['public'], revoked?: false, expired?: false)
         | 
| 182 186 | 
             
                  expect(Doorkeeper::AccessToken).to receive(:authenticate).with(token_string).and_return(token)
         | 
| 187 | 
            +
                  expect(token).to receive(:acceptable?).with(['write']).and_return(false)
         | 
| 183 188 | 
             
                  get :index, access_token: token_string
         | 
| 184 | 
            -
                  expect(response.status).to eq  | 
| 185 | 
            -
                  expect(response.header | 
| 189 | 
            +
                  expect(response.status).to eq 403
         | 
| 190 | 
            +
                  expect(response.header).to_not include('WWW-Authenticate')
         | 
| 186 191 | 
             
                end
         | 
| 187 192 | 
             
              end
         | 
| 188 193 |  | 
| @@ -302,6 +307,8 @@ describe 'Doorkeeper_for helper' do | |
| 302 307 | 
             
                context 'with invalid token', token: :invalid do
         | 
| 303 308 | 
             
                  it 'does not allow access if passed block evaluates to false' do
         | 
| 304 309 | 
             
                    get :index, access_token: token_string
         | 
| 310 | 
            +
                    expect(response.status).to eq 401
         | 
| 311 | 
            +
                    expect(response.header['WWW-Authenticate']).to match(/^Bearer/)
         | 
| 305 312 | 
             
                  end
         | 
| 306 313 |  | 
| 307 314 | 
             
                  it 'allows access if passed block evaluates to true' do
         | 
| @@ -12,7 +12,7 @@ describe 'Revocable' do | |
| 12 12 | 
             
              describe :revoke do
         | 
| 13 13 | 
             
                it 'updates :revoked_at attribute with current time' do
         | 
| 14 14 | 
             
                  clock = double now: double
         | 
| 15 | 
            -
                  expect(subject).to receive(: | 
| 15 | 
            +
                  expect(subject).to receive(:update_attribute).with(:revoked_at, clock.now)
         | 
| 16 16 | 
             
                  subject.revoke(clock)
         | 
| 17 17 | 
             
                end
         | 
| 18 18 | 
             
              end
         | 
| @@ -1,5 +1,6 @@ | |
| 1 1 | 
             
            require 'spec_helper'
         | 
| 2 2 | 
             
            require 'active_support/core_ext/module/delegation'
         | 
| 3 | 
            +
            require 'active_support/core_ext/object/blank'
         | 
| 3 4 | 
             
            require 'doorkeeper/oauth/scopes'
         | 
| 4 5 | 
             
            require 'doorkeeper/models/scopes'
         | 
| 5 6 |  | 
| @@ -29,4 +30,14 @@ describe 'Doorkeeper::Models::Scopes' do | |
| 29 30 | 
             
                  expect(subject.scopes_string).to eq('public admin')
         | 
| 30 31 | 
             
                end
         | 
| 31 32 | 
             
              end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
              describe :includes_scope? do
         | 
| 35 | 
            +
                it 'should return true if at least one scope is included' do
         | 
| 36 | 
            +
                  expect(subject.includes_scope?(['public', 'private'])).to be true
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                it 'should return false if no scopes are included' do
         | 
| 40 | 
            +
                  expect(subject.includes_scope?(['teacher', 'student'])).to be false
         | 
| 41 | 
            +
                end
         | 
| 42 | 
            +
              end
         | 
| 32 43 | 
             
            end
         | 
| @@ -32,6 +32,11 @@ module Doorkeeper::OAuth::Authorization | |
| 32 32 | 
             
                    uri = subject.uri_with_fragment 'http://example.com/', parameter: 'value'
         | 
| 33 33 | 
             
                    expect(uri).to eq('http://example.com/#parameter=value')
         | 
| 34 34 | 
             
                  end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                  it 'preserves original query parameters' do
         | 
| 37 | 
            +
                    uri = subject.uri_with_fragment 'http://example.com/?query1=value1', parameter: 'value'
         | 
| 38 | 
            +
                    expect(uri).to eq('http://example.com/?query1=value1#parameter=value')
         | 
| 39 | 
            +
                  end
         | 
| 35 40 | 
             
                end
         | 
| 36 41 | 
             
              end
         | 
| 37 42 | 
             
            end
         | 
| @@ -0,0 +1,23 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
            require 'active_model'
         | 
| 3 | 
            +
            require 'doorkeeper'
         | 
| 4 | 
            +
            require 'doorkeeper/oauth/forbidden_token_response'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            module Doorkeeper::OAuth
         | 
| 7 | 
            +
              describe ForbiddenTokenResponse do
         | 
| 8 | 
            +
                describe '#name' do
         | 
| 9 | 
            +
                  it  { expect(subject.name).to eq(:invalid_scope) }
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                describe '#status' do
         | 
| 13 | 
            +
                  it { expect(subject.status).to eq(:forbidden) }
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                describe :from_scopes do
         | 
| 17 | 
            +
                  it 'should have a list of acceptable scopes' do
         | 
| 18 | 
            +
                    response = ForbiddenTokenResponse.from_scopes(["public"])
         | 
| 19 | 
            +
                    expect(response.description).to include('public')
         | 
| 20 | 
            +
                  end
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
            end
         | 
| @@ -95,6 +95,36 @@ module Doorkeeper | |
| 95 95 | 
             
                  end
         | 
| 96 96 | 
             
                end
         | 
| 97 97 |  | 
| 98 | 
            +
                describe '#acceptable?' do
         | 
| 99 | 
            +
                  context 'a token that is not accessible' do
         | 
| 100 | 
            +
                    let(:token) { FactoryGirl.create(:access_token, created_at: 6.hours.ago) }
         | 
| 101 | 
            +
             | 
| 102 | 
            +
                    it 'should return false' do
         | 
| 103 | 
            +
                      expect(token.acceptable?(nil)).to be false
         | 
| 104 | 
            +
                    end
         | 
| 105 | 
            +
                  end
         | 
| 106 | 
            +
             | 
| 107 | 
            +
                  context 'a token that has the incorrect scopes' do
         | 
| 108 | 
            +
                    let(:token) { FactoryGirl.create(:access_token) }
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                    it 'should return false' do
         | 
| 111 | 
            +
                      expect(token.acceptable?(['public'])).to be false
         | 
| 112 | 
            +
                    end
         | 
| 113 | 
            +
                  end
         | 
| 114 | 
            +
             | 
| 115 | 
            +
                  context 'a token is acceptable with the correct scopes' do
         | 
| 116 | 
            +
                    let(:token) do
         | 
| 117 | 
            +
                      token = FactoryGirl.create(:access_token)
         | 
| 118 | 
            +
                      token[:scopes] = 'public'
         | 
| 119 | 
            +
                      token
         | 
| 120 | 
            +
                    end
         | 
| 121 | 
            +
             | 
| 122 | 
            +
                    it 'should return true' do
         | 
| 123 | 
            +
                      expect(token.acceptable?(['public'])).to be true
         | 
| 124 | 
            +
                    end
         | 
| 125 | 
            +
                  end
         | 
| 126 | 
            +
                end
         | 
| 127 | 
            +
             | 
| 98 128 | 
             
                describe '.revoke_all_for' do
         | 
| 99 129 | 
             
                  let(:resource_owner) { double(id: 100) }
         | 
| 100 130 | 
             
                  let(:application)    { FactoryGirl.create :application }
         | 
| @@ -47,7 +47,7 @@ feature 'Refresh Token Flow' do | |
| 47 47 | 
             
                end
         | 
| 48 48 |  | 
| 49 49 | 
             
                scenario 'client request a token with expired access token' do
         | 
| 50 | 
            -
                  @token. | 
| 50 | 
            +
                  @token.update_attribute :expires_in, -100
         | 
| 51 51 | 
             
                  post refresh_token_endpoint_url(client: @client, refresh_token: @token.refresh_token)
         | 
| 52 52 | 
             
                  should_have_json 'refresh_token', Doorkeeper::AccessToken.last.refresh_token
         | 
| 53 53 | 
             
                  expect(@token.reload).to be_revoked
         | 
| @@ -78,7 +78,7 @@ feature 'Refresh Token Flow' do | |
| 78 78 | 
             
                end
         | 
| 79 79 |  | 
| 80 80 | 
             
                scenario 'client request a token after creating another token with the same user' do
         | 
| 81 | 
            -
                  @token. | 
| 81 | 
            +
                  @token.update_attribute :expires_in, -100
         | 
| 82 82 | 
             
                  post password_token_endpoint_url(client: @client, resource_owner: @resource_owner)
         | 
| 83 83 | 
             
                  post refresh_token_endpoint_url(client: @client, refresh_token: @token.refresh_token)
         | 
| 84 84 | 
             
                  should_have_json 'refresh_token', Doorkeeper::AccessToken.last.refresh_token
         | 
| @@ -27,14 +27,14 @@ feature 'Private API' do | |
| 27 27 | 
             
              end
         | 
| 28 28 |  | 
| 29 29 | 
             
              scenario 'client attempts to request protected resource with expired token' do
         | 
| 30 | 
            -
                @token. | 
| 30 | 
            +
                @token.update_attribute :expires_in, -100 # expires token
         | 
| 31 31 | 
             
                with_access_token_header @token.token
         | 
| 32 32 | 
             
                visit '/full_protected_resources'
         | 
| 33 33 | 
             
                response_status_should_be 401
         | 
| 34 34 | 
             
              end
         | 
| 35 35 |  | 
| 36 36 | 
             
              scenario 'client requests protected resource with permanent token' do
         | 
| 37 | 
            -
                @token. | 
| 37 | 
            +
                @token.update_attribute :expires_in, nil # never expires
         | 
| 38 38 | 
             
                with_access_token_header @token.token
         | 
| 39 39 | 
             
                visit '/full_protected_resources'
         | 
| 40 40 | 
             
                expect(page.body).to have_content('index')
         | 
| @@ -42,15 +42,15 @@ feature 'Private API' do | |
| 42 42 |  | 
| 43 43 | 
             
              scenario 'access token with no scopes' do
         | 
| 44 44 | 
             
                optional_scopes_exist :admin
         | 
| 45 | 
            -
                @token. | 
| 45 | 
            +
                @token.update_attribute :scopes, nil
         | 
| 46 46 | 
             
                with_access_token_header @token.token
         | 
| 47 47 | 
             
                visit '/full_protected_resources/1.json'
         | 
| 48 | 
            -
                response_status_should_be  | 
| 48 | 
            +
                response_status_should_be 403
         | 
| 49 49 | 
             
              end
         | 
| 50 50 |  | 
| 51 51 | 
             
              scenario 'access token with default scope' do
         | 
| 52 52 | 
             
                default_scopes_exist :admin
         | 
| 53 | 
            -
                @token. | 
| 53 | 
            +
                @token.update_attribute :scopes, 'admin'
         | 
| 54 54 | 
             
                with_access_token_header @token.token
         | 
| 55 55 | 
             
                visit '/full_protected_resources/1.json'
         | 
| 56 56 | 
             
                expect(page.body).to have_content('show')
         | 
| @@ -4,7 +4,7 @@ shared_context 'valid token', token: :valid do | |
| 4 4 | 
             
              end
         | 
| 5 5 |  | 
| 6 6 | 
             
              let :token do
         | 
| 7 | 
            -
                double(Doorkeeper::AccessToken, accessible?: true)
         | 
| 7 | 
            +
                double(Doorkeeper::AccessToken, accessible?: true, includes_scope?: true, acceptable?: true)
         | 
| 8 8 | 
             
              end
         | 
| 9 9 |  | 
| 10 10 | 
             
              before :each do
         | 
| @@ -18,7 +18,7 @@ shared_context 'invalid token', token: :invalid do | |
| 18 18 | 
             
              end
         | 
| 19 19 |  | 
| 20 20 | 
             
              let :token do
         | 
| 21 | 
            -
                double(Doorkeeper::AccessToken, accessible?: false, revoked?: false, expired?: false)
         | 
| 21 | 
            +
                double(Doorkeeper::AccessToken, accessible?: false, revoked?: false, expired?: false, includes_scope?: false, acceptable?: false)
         | 
| 22 22 | 
             
              end
         | 
| 23 23 |  | 
| 24 24 | 
             
              before :each do
         | 
| @@ -41,7 +41,6 @@ describe RedirectUriValidator do | |
| 41 41 |  | 
| 42 42 | 
             
              it 'is invalid when the uri has a query parameter' do
         | 
| 43 43 | 
             
                subject.redirect_uri = 'http://example.com/abcd?xyz=123'
         | 
| 44 | 
            -
                expect(subject). | 
| 45 | 
            -
                expect(subject.errors[:redirect_uri].first).to eq('cannot contain a query parameter.')
         | 
| 44 | 
            +
                expect(subject).to be_valid
         | 
| 46 45 | 
             
              end
         | 
| 47 46 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: doorkeeper
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1. | 
| 4 | 
            +
              version: 1.4.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Felipe Elias Philipp
         | 
| @@ -9,7 +9,7 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date: 2014-07- | 
| 12 | 
            +
            date: 2014-07-31 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: railties
         | 
| @@ -151,6 +151,20 @@ dependencies: | |
| 151 151 | 
             
                - - "~>"
         | 
| 152 152 | 
             
                  - !ruby/object:Gem::Version
         | 
| 153 153 | 
             
                    version: 3.0.1
         | 
| 154 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 155 | 
            +
              name: pry
         | 
| 156 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 157 | 
            +
                requirements:
         | 
| 158 | 
            +
                - - "~>"
         | 
| 159 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 160 | 
            +
                    version: 0.10.0
         | 
| 161 | 
            +
              type: :development
         | 
| 162 | 
            +
              prerelease: false
         | 
| 163 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 164 | 
            +
                requirements:
         | 
| 165 | 
            +
                - - "~>"
         | 
| 166 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 167 | 
            +
                    version: 0.10.0
         | 
| 154 168 | 
             
            description: Doorkeeper is an OAuth 2 provider for Rails.
         | 
| 155 169 | 
             
            email:
         | 
| 156 170 | 
             
            - felipe@applicake.com
         | 
| @@ -171,6 +185,7 @@ files: | |
| 171 185 | 
             
            - app/assets/stylesheets/doorkeeper/admin/application.css
         | 
| 172 186 | 
             
            - app/assets/stylesheets/doorkeeper/application.css
         | 
| 173 187 | 
             
            - app/controllers/doorkeeper/application_controller.rb
         | 
| 188 | 
            +
            - app/controllers/doorkeeper/application_metal_controller.rb
         | 
| 174 189 | 
             
            - app/controllers/doorkeeper/applications_controller.rb
         | 
| 175 190 | 
             
            - app/controllers/doorkeeper/authorizations_controller.rb
         | 
| 176 191 | 
             
            - app/controllers/doorkeeper/authorized_applications_controller.rb
         | 
| @@ -211,8 +226,6 @@ files: | |
| 211 226 | 
             
            - lib/doorkeeper/models/mongo_mapper/access_grant.rb
         | 
| 212 227 | 
             
            - lib/doorkeeper/models/mongo_mapper/access_token.rb
         | 
| 213 228 | 
             
            - lib/doorkeeper/models/mongo_mapper/application.rb
         | 
| 214 | 
            -
            - lib/doorkeeper/models/mongo_mapper/revocable.rb
         | 
| 215 | 
            -
            - lib/doorkeeper/models/mongoid/revocable.rb
         | 
| 216 229 | 
             
            - lib/doorkeeper/models/mongoid/scopes.rb
         | 
| 217 230 | 
             
            - lib/doorkeeper/models/mongoid/version.rb
         | 
| 218 231 | 
             
            - lib/doorkeeper/models/mongoid2/access_grant.rb
         | 
| @@ -239,6 +252,7 @@ files: | |
| 239 252 | 
             
            - lib/doorkeeper/oauth/code_response.rb
         | 
| 240 253 | 
             
            - lib/doorkeeper/oauth/error.rb
         | 
| 241 254 | 
             
            - lib/doorkeeper/oauth/error_response.rb
         | 
| 255 | 
            +
            - lib/doorkeeper/oauth/forbidden_token_response.rb
         | 
| 242 256 | 
             
            - lib/doorkeeper/oauth/helpers/scope_checker.rb
         | 
| 243 257 | 
             
            - lib/doorkeeper/oauth/helpers/unique_token.rb
         | 
| 244 258 | 
             
            - lib/doorkeeper/oauth/helpers/uri_checker.rb
         | 
| @@ -347,6 +361,7 @@ files: | |
| 347 361 | 
             
            - spec/lib/oauth/code_request_spec.rb
         | 
| 348 362 | 
             
            - spec/lib/oauth/error_response_spec.rb
         | 
| 349 363 | 
             
            - spec/lib/oauth/error_spec.rb
         | 
| 364 | 
            +
            - spec/lib/oauth/forbidden_token_response_spec.rb
         | 
| 350 365 | 
             
            - spec/lib/oauth/helpers/scope_checker_spec.rb
         | 
| 351 366 | 
             
            - spec/lib/oauth/helpers/unique_token_spec.rb
         | 
| 352 367 | 
             
            - spec/lib/oauth/helpers/uri_checker_spec.rb
         |