rack-oauth2-revibe 1.0.7
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.
- checksums.yaml +7 -0
- data/.document +5 -0
- data/.gitignore +22 -0
- data/.rspec +2 -0
- data/.travis.yml +3 -0
- data/Gemfile +7 -0
- data/LICENSE +20 -0
- data/README.rdoc +78 -0
- data/Rakefile +25 -0
- data/VERSION +1 -0
- data/lib/rack/oauth2.rb +67 -0
- data/lib/rack/oauth2/access_token.rb +36 -0
- data/lib/rack/oauth2/access_token/authenticator.rb +24 -0
- data/lib/rack/oauth2/access_token/bearer.rb +11 -0
- data/lib/rack/oauth2/access_token/legacy.rb +23 -0
- data/lib/rack/oauth2/access_token/mac.rb +103 -0
- data/lib/rack/oauth2/access_token/mac/sha256_hex_verifier.rb +17 -0
- data/lib/rack/oauth2/access_token/mac/signature.rb +34 -0
- data/lib/rack/oauth2/access_token/mac/verifier.rb +44 -0
- data/lib/rack/oauth2/client.rb +139 -0
- data/lib/rack/oauth2/client/error.rb +14 -0
- data/lib/rack/oauth2/client/grant.rb +30 -0
- data/lib/rack/oauth2/client/grant/authorization_code.rb +12 -0
- data/lib/rack/oauth2/client/grant/client_credentials.rb +10 -0
- data/lib/rack/oauth2/client/grant/facebook_token.rb +12 -0
- data/lib/rack/oauth2/client/grant/password.rb +11 -0
- data/lib/rack/oauth2/client/grant/refresh_token.rb +11 -0
- data/lib/rack/oauth2/debugger.rb +3 -0
- data/lib/rack/oauth2/debugger/request_filter.rb +30 -0
- data/lib/rack/oauth2/server.rb +4 -0
- data/lib/rack/oauth2/server/abstract.rb +4 -0
- data/lib/rack/oauth2/server/abstract/error.rb +69 -0
- data/lib/rack/oauth2/server/abstract/handler.rb +20 -0
- data/lib/rack/oauth2/server/abstract/request.rb +29 -0
- data/lib/rack/oauth2/server/abstract/response.rb +15 -0
- data/lib/rack/oauth2/server/authorize.rb +117 -0
- data/lib/rack/oauth2/server/authorize/code.rb +39 -0
- data/lib/rack/oauth2/server/authorize/error.rb +71 -0
- data/lib/rack/oauth2/server/authorize/extension.rb +12 -0
- data/lib/rack/oauth2/server/authorize/extension/code_and_token.rb +39 -0
- data/lib/rack/oauth2/server/authorize/token.rb +43 -0
- data/lib/rack/oauth2/server/resource.rb +55 -0
- data/lib/rack/oauth2/server/resource/bearer.rb +47 -0
- data/lib/rack/oauth2/server/resource/bearer/error.rb +24 -0
- data/lib/rack/oauth2/server/resource/error.rb +81 -0
- data/lib/rack/oauth2/server/resource/mac.rb +36 -0
- data/lib/rack/oauth2/server/resource/mac/error.rb +24 -0
- data/lib/rack/oauth2/server/token.rb +87 -0
- data/lib/rack/oauth2/server/token/authorization_code.rb +28 -0
- data/lib/rack/oauth2/server/token/client_credentials.rb +23 -0
- data/lib/rack/oauth2/server/token/error.rb +54 -0
- data/lib/rack/oauth2/server/token/extension.rb +12 -0
- data/lib/rack/oauth2/server/token/extension/jwt.rb +37 -0
- data/lib/rack/oauth2/server/token/facebook_token.rb +27 -0
- data/lib/rack/oauth2/server/token/password.rb +27 -0
- data/lib/rack/oauth2/server/token/refresh_token.rb +26 -0
- data/lib/rack/oauth2/util.rb +58 -0
- data/rack-oauth2.gemspec +30 -0
- data/spec/helpers/time.rb +19 -0
- data/spec/helpers/webmock_helper.rb +41 -0
- data/spec/mock_response/blank +0 -0
- data/spec/mock_response/errors/invalid_request.json +4 -0
- data/spec/mock_response/resources/fake.txt +1 -0
- data/spec/mock_response/tokens/_Bearer.json +6 -0
- data/spec/mock_response/tokens/bearer.json +6 -0
- data/spec/mock_response/tokens/legacy.json +5 -0
- data/spec/mock_response/tokens/legacy.txt +1 -0
- data/spec/mock_response/tokens/legacy_without_expires_in.txt +1 -0
- data/spec/mock_response/tokens/mac.json +8 -0
- data/spec/mock_response/tokens/unknown.json +6 -0
- data/spec/rack/oauth2/access_token/authenticator_spec.rb +43 -0
- data/spec/rack/oauth2/access_token/bearer_spec.rb +18 -0
- data/spec/rack/oauth2/access_token/legacy_spec.rb +23 -0
- data/spec/rack/oauth2/access_token/mac/sha256_hex_verifier_spec.rb +28 -0
- data/spec/rack/oauth2/access_token/mac/signature_spec.rb +59 -0
- data/spec/rack/oauth2/access_token/mac/verifier_spec.rb +25 -0
- data/spec/rack/oauth2/access_token/mac_spec.rb +141 -0
- data/spec/rack/oauth2/access_token_spec.rb +69 -0
- data/spec/rack/oauth2/client/error_spec.rb +18 -0
- data/spec/rack/oauth2/client/grant/authorization_code_spec.rb +37 -0
- data/spec/rack/oauth2/client/grant/client_credentials_spec.rb +7 -0
- data/spec/rack/oauth2/client/grant/password_spec.rb +33 -0
- data/spec/rack/oauth2/client/grant/refresh_token_spec.rb +21 -0
- data/spec/rack/oauth2/client_spec.rb +287 -0
- data/spec/rack/oauth2/debugger/request_filter_spec.rb +33 -0
- data/spec/rack/oauth2/oauth2_spec.rb +74 -0
- data/spec/rack/oauth2/server/abstract/error_spec.rb +59 -0
- data/spec/rack/oauth2/server/authorize/code_spec.rb +57 -0
- data/spec/rack/oauth2/server/authorize/error_spec.rb +103 -0
- data/spec/rack/oauth2/server/authorize/extensions/code_and_token_spec.rb +60 -0
- data/spec/rack/oauth2/server/authorize/token_spec.rb +73 -0
- data/spec/rack/oauth2/server/authorize_spec.rb +214 -0
- data/spec/rack/oauth2/server/resource/bearer/error_spec.rb +52 -0
- data/spec/rack/oauth2/server/resource/bearer_spec.rb +123 -0
- data/spec/rack/oauth2/server/resource/error_spec.rb +147 -0
- data/spec/rack/oauth2/server/resource/mac/error_spec.rb +52 -0
- data/spec/rack/oauth2/server/resource/mac_spec.rb +119 -0
- data/spec/rack/oauth2/server/resource_spec.rb +23 -0
- data/spec/rack/oauth2/server/token/authorization_code_spec.rb +43 -0
- data/spec/rack/oauth2/server/token/client_credentials_spec.rb +23 -0
- data/spec/rack/oauth2/server/token/error_spec.rb +77 -0
- data/spec/rack/oauth2/server/token/password_spec.rb +37 -0
- data/spec/rack/oauth2/server/token/refresh_token_spec.rb +34 -0
- data/spec/rack/oauth2/server/token_spec.rb +134 -0
- data/spec/rack/oauth2/util_spec.rb +97 -0
- data/spec/spec_helper.rb +14 -0
- metadata +326 -0
| @@ -0,0 +1,33 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe Rack::OAuth2::Debugger::RequestFilter do
         | 
| 4 | 
            +
              let(:resource_endpoint) { 'https://example.com/resources' }
         | 
| 5 | 
            +
              let(:request) { HTTP::Message.new_request(:get, URI.parse(resource_endpoint)) }
         | 
| 6 | 
            +
              let(:response) { HTTP::Message.new_response(MultiJson.dump({:hello => 'world'})) }
         | 
| 7 | 
            +
              let(:request_filter) { Rack::OAuth2::Debugger::RequestFilter.new }
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              describe '#filter_request' do
         | 
| 10 | 
            +
                it 'should log request' do
         | 
| 11 | 
            +
                  [
         | 
| 12 | 
            +
                    "======= [Rack::OAuth2] HTTP REQUEST STARTED =======",
         | 
| 13 | 
            +
                    request.dump
         | 
| 14 | 
            +
                  ].each do |output|
         | 
| 15 | 
            +
                    Rack::OAuth2.logger.should_receive(:info).with output
         | 
| 16 | 
            +
                  end
         | 
| 17 | 
            +
                  request_filter.filter_request(request)
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              describe '#filter_response' do
         | 
| 22 | 
            +
                it 'should log response' do
         | 
| 23 | 
            +
                  [
         | 
| 24 | 
            +
                    "--------------------------------------------------",
         | 
| 25 | 
            +
                    response.dump,
         | 
| 26 | 
            +
                    "======= [Rack::OAuth2] HTTP REQUEST FINISHED ======="
         | 
| 27 | 
            +
                  ].each do |output|
         | 
| 28 | 
            +
                    Rack::OAuth2.logger.should_receive(:info).with output
         | 
| 29 | 
            +
                  end
         | 
| 30 | 
            +
                  request_filter.filter_response(request, response)
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
              end
         | 
| 33 | 
            +
            end
         | 
| @@ -0,0 +1,74 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe Rack::OAuth2 do
         | 
| 4 | 
            +
              subject { Rack::OAuth2 }
         | 
| 5 | 
            +
              after { Rack::OAuth2.debugging = false }
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              its(:logger) { should be_a Logger }
         | 
| 8 | 
            +
              its(:debugging?) { should be_false }
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              describe '.debug!' do
         | 
| 11 | 
            +
                before { Rack::OAuth2.debug! }
         | 
| 12 | 
            +
                its(:debugging?) { should be_true }
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              describe '.debug' do
         | 
| 16 | 
            +
                it 'should enable debugging within given block' do
         | 
| 17 | 
            +
                  Rack::OAuth2.debug do
         | 
| 18 | 
            +
                    Rack::OAuth2.debugging?.should be_true
         | 
| 19 | 
            +
                  end
         | 
| 20 | 
            +
                  Rack::OAuth2.debugging?.should be_false
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                it 'should not force disable debugging' do
         | 
| 24 | 
            +
                  Rack::OAuth2.debug!
         | 
| 25 | 
            +
                  Rack::OAuth2.debug do
         | 
| 26 | 
            +
                    Rack::OAuth2.debugging?.should be_true
         | 
| 27 | 
            +
                  end
         | 
| 28 | 
            +
                  Rack::OAuth2.debugging?.should be_true
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
              describe '.http_config' do
         | 
| 33 | 
            +
                context 'when request_filter added' do
         | 
| 34 | 
            +
                  context 'when "debug!" is called' do
         | 
| 35 | 
            +
                    after { Rack::OAuth2.reset_http_config! }
         | 
| 36 | 
            +
              
         | 
| 37 | 
            +
                    it 'should put Debugger::RequestFilter at last' do
         | 
| 38 | 
            +
                      Rack::OAuth2.debug!
         | 
| 39 | 
            +
                      Rack::OAuth2.http_config do |config|
         | 
| 40 | 
            +
                        config.request_filter << Proc.new {}
         | 
| 41 | 
            +
                      end
         | 
| 42 | 
            +
                      Rack::OAuth2.http_client.request_filter.last.should be_instance_of Rack::OAuth2::Debugger::RequestFilter
         | 
| 43 | 
            +
                    end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                    it 'should reset_http_config' do
         | 
| 46 | 
            +
                      Rack::OAuth2.debug!
         | 
| 47 | 
            +
                      Rack::OAuth2.http_config do |config|
         | 
| 48 | 
            +
                        config.request_filter << Proc.new {}
         | 
| 49 | 
            +
                      end
         | 
| 50 | 
            +
                      size = Rack::OAuth2.http_client.request_filter.size
         | 
| 51 | 
            +
                      Rack::OAuth2.reset_http_config!
         | 
| 52 | 
            +
                      Rack::OAuth2.http_client.request_filter.size.should == size - 1
         | 
| 53 | 
            +
                    end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                  end
         | 
| 56 | 
            +
                end
         | 
| 57 | 
            +
              end
         | 
| 58 | 
            +
             | 
| 59 | 
            +
              describe ".http_client" do
         | 
| 60 | 
            +
                context "when local_http_config is used" do
         | 
| 61 | 
            +
                  it "should correctly set request_filter" do
         | 
| 62 | 
            +
                    clnt1 = Rack::OAuth2.http_client
         | 
| 63 | 
            +
                    clnt2 = Rack::OAuth2.http_client("my client") do |config|
         | 
| 64 | 
            +
                      config.request_filter << Proc.new {}
         | 
| 65 | 
            +
                    end
         | 
| 66 | 
            +
                    clnt3 = Rack::OAuth2.http_client
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                    clnt1.request_filter.size.should == clnt3.request_filter.size
         | 
| 69 | 
            +
                    clnt1.request_filter.size.should == clnt2.request_filter.size - 1
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                  end
         | 
| 72 | 
            +
                end
         | 
| 73 | 
            +
              end
         | 
| 74 | 
            +
            end
         | 
| @@ -0,0 +1,59 @@ | |
| 1 | 
            +
            require 'spec_helper.rb'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe Rack::OAuth2::Server::Abstract::Error do
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              context 'when full attributes are given' do
         | 
| 6 | 
            +
                subject do
         | 
| 7 | 
            +
                  Rack::OAuth2::Server::Abstract::Error.new 400, :invalid_request, 'Missing some required params', :uri => 'http://server.example.com/error'
         | 
| 8 | 
            +
                end
         | 
| 9 | 
            +
                its(:status)      { should == 400 }
         | 
| 10 | 
            +
                its(:error)       { should == :invalid_request }
         | 
| 11 | 
            +
                its(:description) { should == 'Missing some required params' }
         | 
| 12 | 
            +
                its(:uri)         { should == 'http://server.example.com/error' }
         | 
| 13 | 
            +
                its(:protocol_params) do
         | 
| 14 | 
            +
                  should == {
         | 
| 15 | 
            +
                    :error             => :invalid_request,
         | 
| 16 | 
            +
                    :error_description => 'Missing some required params',
         | 
| 17 | 
            +
                    :error_uri         => 'http://server.example.com/error'
         | 
| 18 | 
            +
                  }
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
              end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              context 'when optional attributes are not given' do
         | 
| 23 | 
            +
                subject do
         | 
| 24 | 
            +
                  Rack::OAuth2::Server::Abstract::Error.new 400, :invalid_request
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
                its(:status)      { should == 400 }
         | 
| 27 | 
            +
                its(:error)       { should == :invalid_request }
         | 
| 28 | 
            +
                its(:description) { should be_nil }
         | 
| 29 | 
            +
                its(:uri)         { should be_nil }
         | 
| 30 | 
            +
                its(:protocol_params) do
         | 
| 31 | 
            +
                  should == {
         | 
| 32 | 
            +
                    :error             => :invalid_request,
         | 
| 33 | 
            +
                    :error_description => nil,
         | 
| 34 | 
            +
                    :error_uri         => nil
         | 
| 35 | 
            +
                  }
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
              end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
            end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
            describe Rack::OAuth2::Server::Abstract::BadRequest do
         | 
| 42 | 
            +
              its(:status) { should == 400 }
         | 
| 43 | 
            +
            end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
            describe Rack::OAuth2::Server::Abstract::Unauthorized do
         | 
| 46 | 
            +
              its(:status) { should == 401 }
         | 
| 47 | 
            +
            end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
            describe Rack::OAuth2::Server::Abstract::Forbidden do
         | 
| 50 | 
            +
              its(:status) { should == 403 }
         | 
| 51 | 
            +
            end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
            describe Rack::OAuth2::Server::Abstract::ServerError do
         | 
| 54 | 
            +
              its(:status) { should == 500 }
         | 
| 55 | 
            +
            end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
            describe Rack::OAuth2::Server::Abstract::TemporarilyUnavailable do
         | 
| 58 | 
            +
              its(:status) { should == 503 }
         | 
| 59 | 
            +
            end
         | 
| @@ -0,0 +1,57 @@ | |
| 1 | 
            +
            require 'spec_helper.rb'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe Rack::OAuth2::Server::Authorize::Code do
         | 
| 4 | 
            +
              let(:request)            { Rack::MockRequest.new app }
         | 
| 5 | 
            +
              let(:redirect_uri)       { 'http://client.example.com/callback' }
         | 
| 6 | 
            +
              let(:authorization_code) { 'authorization_code' }  
         | 
| 7 | 
            +
              let(:response)           { request.get "/?response_type=code&client_id=client&redirect_uri=#{redirect_uri}&state=state" }
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              context 'when approved' do
         | 
| 10 | 
            +
                subject { response }
         | 
| 11 | 
            +
                let :app do
         | 
| 12 | 
            +
                  Rack::OAuth2::Server::Authorize.new do |request, response|
         | 
| 13 | 
            +
                    response.redirect_uri = redirect_uri
         | 
| 14 | 
            +
                    response.code = authorization_code
         | 
| 15 | 
            +
                    response.approve!
         | 
| 16 | 
            +
                  end
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
                its(:status)   { should == 302 }
         | 
| 19 | 
            +
                its(:location) { should == "#{redirect_uri}?code=#{authorization_code}&state=state" }
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                context 'when redirect_uri already includes query' do
         | 
| 22 | 
            +
                  let(:redirect_uri) { 'http://client.example.com/callback?k=v' }
         | 
| 23 | 
            +
                  its(:location)     { should == "#{redirect_uri}&code=#{authorization_code}&state=state" }
         | 
| 24 | 
            +
                end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                context 'when redirect_uri is missing' do
         | 
| 27 | 
            +
                  let(:redirect_uri) { nil }
         | 
| 28 | 
            +
                  it do
         | 
| 29 | 
            +
                    expect { response }.to raise_error AttrRequired::AttrMissing
         | 
| 30 | 
            +
                  end
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                context 'when code is missing' do
         | 
| 34 | 
            +
                  let(:authorization_code) { nil }
         | 
| 35 | 
            +
                  it do
         | 
| 36 | 
            +
                    expect { response }.to raise_error AttrRequired::AttrMissing
         | 
| 37 | 
            +
                  end
         | 
| 38 | 
            +
                end
         | 
| 39 | 
            +
              end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
              context 'when denied' do
         | 
| 42 | 
            +
                let :app do
         | 
| 43 | 
            +
                  Rack::OAuth2::Server::Authorize.new do |request, response|
         | 
| 44 | 
            +
                    request.verify_redirect_uri! redirect_uri
         | 
| 45 | 
            +
                    request.access_denied!
         | 
| 46 | 
            +
                  end
         | 
| 47 | 
            +
                end
         | 
| 48 | 
            +
                it 'should redirect with error in query' do
         | 
| 49 | 
            +
                  response.status.should == 302
         | 
| 50 | 
            +
                  error_message = {
         | 
| 51 | 
            +
                    :error => :access_denied,
         | 
| 52 | 
            +
                    :error_description => Rack::OAuth2::Server::Authorize::ErrorMethods::DEFAULT_DESCRIPTION[:access_denied]
         | 
| 53 | 
            +
                  }
         | 
| 54 | 
            +
                  response.location.should == "#{redirect_uri}?#{error_message.to_query}&state=state"
         | 
| 55 | 
            +
                end
         | 
| 56 | 
            +
              end
         | 
| 57 | 
            +
            end
         | 
| @@ -0,0 +1,103 @@ | |
| 1 | 
            +
            require 'spec_helper.rb'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe Rack::OAuth2::Server::Authorize::BadRequest do
         | 
| 4 | 
            +
              let(:klass)        { Rack::OAuth2::Server::Authorize::BadRequest }
         | 
| 5 | 
            +
              let(:error)        { klass.new(:invalid_request) }
         | 
| 6 | 
            +
              let(:redirect_uri) { 'http://client.example.com/callback' }
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              subject { error }
         | 
| 9 | 
            +
              it { should be_a Rack::OAuth2::Server::Abstract::BadRequest }
         | 
| 10 | 
            +
              its(:protocol_params) do
         | 
| 11 | 
            +
                should == {
         | 
| 12 | 
            +
                  :error             => :invalid_request,
         | 
| 13 | 
            +
                  :error_description => nil,
         | 
| 14 | 
            +
                  :error_uri         => nil,
         | 
| 15 | 
            +
                  :state             => nil
         | 
| 16 | 
            +
                }
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              describe '#finish' do
         | 
| 20 | 
            +
                context 'when redirect_uri is given' do
         | 
| 21 | 
            +
                  before { error.redirect_uri = redirect_uri }
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                  context 'when protocol_params_location = :query' do
         | 
| 24 | 
            +
                    before { error.protocol_params_location = :query }
         | 
| 25 | 
            +
                    it 'should redirect with error in query' do
         | 
| 26 | 
            +
                      state, header, response = error.finish
         | 
| 27 | 
            +
                      state.should == 302
         | 
| 28 | 
            +
                      header["Location"].should == "#{redirect_uri}?error=invalid_request"
         | 
| 29 | 
            +
                    end
         | 
| 30 | 
            +
                  end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  context 'when protocol_params_location = :fragment' do
         | 
| 33 | 
            +
                    before { error.protocol_params_location = :fragment }
         | 
| 34 | 
            +
                    it 'should redirect with error in fragment' do
         | 
| 35 | 
            +
                      state, header, response = error.finish
         | 
| 36 | 
            +
                      state.should == 302
         | 
| 37 | 
            +
                      header["Location"].should == "#{redirect_uri}#error=invalid_request"
         | 
| 38 | 
            +
                    end
         | 
| 39 | 
            +
                  end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                  context 'otherwise' do
         | 
| 42 | 
            +
                    before { error.protocol_params_location = :other }
         | 
| 43 | 
            +
                    it 'should redirect without error' do
         | 
| 44 | 
            +
                      state, header, response = error.finish
         | 
| 45 | 
            +
                      state.should == 302
         | 
| 46 | 
            +
                      header["Location"].should == redirect_uri
         | 
| 47 | 
            +
                    end
         | 
| 48 | 
            +
                  end
         | 
| 49 | 
            +
                end
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                context 'otherwise' do
         | 
| 52 | 
            +
                  it 'should raise itself' do
         | 
| 53 | 
            +
                    expect { error.finish }.to raise_error(klass) { |e|
         | 
| 54 | 
            +
                      e.should == error
         | 
| 55 | 
            +
                    }
         | 
| 56 | 
            +
                  end
         | 
| 57 | 
            +
                end
         | 
| 58 | 
            +
              end
         | 
| 59 | 
            +
            end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
            describe Rack::OAuth2::Server::Authorize::ErrorMethods do
         | 
| 62 | 
            +
              let(:klass)               { Rack::OAuth2::Server::Authorize::BadRequest }
         | 
| 63 | 
            +
              let(:redirect_uri)        { 'http://client.example.com/callback' }
         | 
| 64 | 
            +
              let(:default_description) { Rack::OAuth2::Server::Authorize::ErrorMethods::DEFAULT_DESCRIPTION }
         | 
| 65 | 
            +
              let(:env)                 { Rack::MockRequest.env_for("/authorize?client_id=client_id") }
         | 
| 66 | 
            +
              let(:request)             { Rack::OAuth2::Server::Authorize::Request.new env }
         | 
| 67 | 
            +
              let(:request_for_code)    { Rack::OAuth2::Server::Authorize::Code::Request.new env }
         | 
| 68 | 
            +
              let(:request_for_token)   { Rack::OAuth2::Server::Authorize::Token::Request.new env }
         | 
| 69 | 
            +
             | 
| 70 | 
            +
              describe 'bad_request!' do
         | 
| 71 | 
            +
                it do
         | 
| 72 | 
            +
                  expect { request.bad_request! }.to raise_error klass
         | 
| 73 | 
            +
                end
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                context 'when response_type = :code' do
         | 
| 76 | 
            +
                  it 'should set protocol_params_location = :query' do
         | 
| 77 | 
            +
                    expect { request_for_code.bad_request! }.to raise_error(klass) { |e|
         | 
| 78 | 
            +
                      e.protocol_params_location.should == :query
         | 
| 79 | 
            +
                    }
         | 
| 80 | 
            +
                  end
         | 
| 81 | 
            +
                end
         | 
| 82 | 
            +
             | 
| 83 | 
            +
                context 'when response_type = :token' do
         | 
| 84 | 
            +
                  it 'should set protocol_params_location = :fragment' do
         | 
| 85 | 
            +
                    expect { request_for_token.bad_request! }.to raise_error(klass) { |e|
         | 
| 86 | 
            +
                      e.protocol_params_location.should == :fragment
         | 
| 87 | 
            +
                    }
         | 
| 88 | 
            +
                  end
         | 
| 89 | 
            +
                end
         | 
| 90 | 
            +
              end
         | 
| 91 | 
            +
             | 
| 92 | 
            +
              Rack::OAuth2::Server::Authorize::ErrorMethods::DEFAULT_DESCRIPTION.keys.each do |error_code|
         | 
| 93 | 
            +
                method = "#{error_code}!"
         | 
| 94 | 
            +
                describe method do
         | 
| 95 | 
            +
                  it "should raise Rack::OAuth2::Server::Authorize::BadRequest with error = :#{error_code}" do
         | 
| 96 | 
            +
                    expect { request.send method }.to raise_error(klass) { |error|
         | 
| 97 | 
            +
                      error.error.should       == error_code
         | 
| 98 | 
            +
                      error.description.should == default_description[error_code]
         | 
| 99 | 
            +
                    }
         | 
| 100 | 
            +
                  end
         | 
| 101 | 
            +
                end
         | 
| 102 | 
            +
              end
         | 
| 103 | 
            +
            end
         | 
| @@ -0,0 +1,60 @@ | |
| 1 | 
            +
            require 'spec_helper.rb'
         | 
| 2 | 
            +
            require 'rack/oauth2/server/authorize/extension/code_and_token'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            describe Rack::OAuth2::Server::Authorize::Extension::CodeAndToken do
         | 
| 5 | 
            +
              let(:request)            { Rack::MockRequest.new app }
         | 
| 6 | 
            +
              let(:redirect_uri)       { 'http://client.example.com/callback' }
         | 
| 7 | 
            +
              let(:access_token)       { 'access_token' }
         | 
| 8 | 
            +
              let(:authorization_code) { 'authorization_code' }
         | 
| 9 | 
            +
              let(:response) do
         | 
| 10 | 
            +
                request.get("/?response_type=code%20token&client_id=client&redirect_uri=#{redirect_uri}")
         | 
| 11 | 
            +
              end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
              context "when approved" do
         | 
| 14 | 
            +
                subject { response }
         | 
| 15 | 
            +
                let(:bearer_token) { Rack::OAuth2::AccessToken::Bearer.new(:access_token => access_token) }
         | 
| 16 | 
            +
                let :app do
         | 
| 17 | 
            +
                  Rack::OAuth2::Server::Authorize.new do |request, response|
         | 
| 18 | 
            +
                    response.redirect_uri = redirect_uri
         | 
| 19 | 
            +
                    response.access_token = bearer_token
         | 
| 20 | 
            +
                    response.code         = authorization_code
         | 
| 21 | 
            +
                    response.approve!
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
                its(:status)   { should == 302 }
         | 
| 25 | 
            +
                its(:location) { should include "#{redirect_uri}#" }
         | 
| 26 | 
            +
                its(:location) { should include "code=#{authorization_code}"}
         | 
| 27 | 
            +
                its(:location) { should include "access_token=#{access_token}"}
         | 
| 28 | 
            +
                its(:location) { should include 'token_type=bearer' }
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                context 'when refresh_token is given' do
         | 
| 31 | 
            +
                  let :bearer_token do
         | 
| 32 | 
            +
                    Rack::OAuth2::AccessToken::Bearer.new(
         | 
| 33 | 
            +
                      :access_token => access_token,
         | 
| 34 | 
            +
                      :refresh_token => 'refresh'
         | 
| 35 | 
            +
                    )
         | 
| 36 | 
            +
                  end
         | 
| 37 | 
            +
                  its(:location) { should include "#{redirect_uri}#" }
         | 
| 38 | 
            +
                  its(:location) { should include "code=#{authorization_code}"}
         | 
| 39 | 
            +
                  its(:location) { should include "access_token=#{access_token}"}
         | 
| 40 | 
            +
                  its(:location) { should include 'token_type=bearer' }
         | 
| 41 | 
            +
                end
         | 
| 42 | 
            +
              end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
              context 'when denied' do
         | 
| 45 | 
            +
                let :app do
         | 
| 46 | 
            +
                  Rack::OAuth2::Server::Authorize.new do |request, response|
         | 
| 47 | 
            +
                    request.verify_redirect_uri! redirect_uri
         | 
| 48 | 
            +
                    request.access_denied!
         | 
| 49 | 
            +
                  end
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
                it 'should redirect with error in fragment' do
         | 
| 52 | 
            +
                  response.status.should == 302
         | 
| 53 | 
            +
                  error_message = {
         | 
| 54 | 
            +
                    :error => :access_denied,
         | 
| 55 | 
            +
                    :error_description => Rack::OAuth2::Server::Authorize::ErrorMethods::DEFAULT_DESCRIPTION[:access_denied]
         | 
| 56 | 
            +
                  }
         | 
| 57 | 
            +
                  response.location.should == "#{redirect_uri}##{error_message.to_query}"
         | 
| 58 | 
            +
                end
         | 
| 59 | 
            +
              end
         | 
| 60 | 
            +
            end
         | 
| @@ -0,0 +1,73 @@ | |
| 1 | 
            +
            require 'spec_helper.rb'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe Rack::OAuth2::Server::Authorize::Token do
         | 
| 4 | 
            +
              let(:request)      { Rack::MockRequest.new app }
         | 
| 5 | 
            +
              let(:redirect_uri) { 'http://client.example.com/callback' }
         | 
| 6 | 
            +
              let(:access_token) { 'access_token' }
         | 
| 7 | 
            +
              let(:response)     { request.get("/?response_type=token&client_id=client&redirect_uri=#{redirect_uri}&state=state") }
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              context "when approved" do
         | 
| 10 | 
            +
                subject { response }
         | 
| 11 | 
            +
                let(:bearer_token) { Rack::OAuth2::AccessToken::Bearer.new(:access_token => access_token) }
         | 
| 12 | 
            +
                let :app do
         | 
| 13 | 
            +
                  Rack::OAuth2::Server::Authorize.new do |request, response|
         | 
| 14 | 
            +
                    response.redirect_uri = redirect_uri
         | 
| 15 | 
            +
                    response.access_token = bearer_token
         | 
| 16 | 
            +
                    response.approve!
         | 
| 17 | 
            +
                  end
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
                its(:status)   { should == 302 }
         | 
| 20 | 
            +
                its(:location) { should == "#{redirect_uri}#access_token=#{access_token}&state=state&token_type=bearer" }
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                context 'when refresh_token is given' do
         | 
| 23 | 
            +
                  let :bearer_token do
         | 
| 24 | 
            +
                    Rack::OAuth2::AccessToken::Bearer.new(
         | 
| 25 | 
            +
                      :access_token => access_token,
         | 
| 26 | 
            +
                      :refresh_token => 'refresh'
         | 
| 27 | 
            +
                    )
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
                  its(:location) { should == "#{redirect_uri}#access_token=#{access_token}&state=state&token_type=bearer" }
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                context 'when redirect_uri is missing' do
         | 
| 33 | 
            +
                  let :app do
         | 
| 34 | 
            +
                    Rack::OAuth2::Server::Authorize.new do |request, response|
         | 
| 35 | 
            +
                      response.access_token = bearer_token
         | 
| 36 | 
            +
                      response.approve!
         | 
| 37 | 
            +
                    end
         | 
| 38 | 
            +
                  end
         | 
| 39 | 
            +
                  it do
         | 
| 40 | 
            +
                    expect { response }.to raise_error AttrRequired::AttrMissing
         | 
| 41 | 
            +
                  end
         | 
| 42 | 
            +
                end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                context 'when access_token is missing' do
         | 
| 45 | 
            +
                  let :app do
         | 
| 46 | 
            +
                    Rack::OAuth2::Server::Authorize.new do |request, response|
         | 
| 47 | 
            +
                      response.redirect_uri = redirect_uri
         | 
| 48 | 
            +
                      response.approve!
         | 
| 49 | 
            +
                    end
         | 
| 50 | 
            +
                  end
         | 
| 51 | 
            +
                  it do
         | 
| 52 | 
            +
                    expect { response }.to raise_error AttrRequired::AttrMissing
         | 
| 53 | 
            +
                  end
         | 
| 54 | 
            +
                end
         | 
| 55 | 
            +
              end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
              context 'when denied' do
         | 
| 58 | 
            +
                let :app do
         | 
| 59 | 
            +
                  Rack::OAuth2::Server::Authorize.new do |request, response|
         | 
| 60 | 
            +
                    request.verify_redirect_uri! redirect_uri
         | 
| 61 | 
            +
                    request.access_denied!
         | 
| 62 | 
            +
                  end
         | 
| 63 | 
            +
                end
         | 
| 64 | 
            +
                it 'should redirect with error in fragment' do
         | 
| 65 | 
            +
                  response.status.should == 302
         | 
| 66 | 
            +
                  error_message = {
         | 
| 67 | 
            +
                    :error => :access_denied,
         | 
| 68 | 
            +
                    :error_description => Rack::OAuth2::Server::Authorize::ErrorMethods::DEFAULT_DESCRIPTION[:access_denied]
         | 
| 69 | 
            +
                  }
         | 
| 70 | 
            +
                  response.location.should == "#{redirect_uri}##{error_message.to_query}&state=state"
         | 
| 71 | 
            +
                end
         | 
| 72 | 
            +
              end
         | 
| 73 | 
            +
            end
         |