gds-sso 0.7.9 → 0.8.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.
- data/app/controllers/api/user_controller.rb +31 -0
 - data/config/routes.rb +2 -1
 - data/lib/gds-sso/controller_methods.rb +4 -0
 - data/lib/gds-sso/version.rb +1 -1
 - data/spec/controller/api_user_controller_spec.rb +57 -0
 - data/spec/internal/log/test.log +75 -3844
 - data/spec/spec_helper.rb +4 -0
 - metadata +36 -33
 
| 
         @@ -0,0 +1,31 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            class Api::UserController < ApplicationController
         
     | 
| 
      
 2 
     | 
    
         
            +
              before_filter :authenticate_user!
         
     | 
| 
      
 3 
     | 
    
         
            +
              before_filter :require_user_update_permission
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
              def update
         
     | 
| 
      
 6 
     | 
    
         
            +
                user_json = JSON.parse(request.body.read)['user']
         
     | 
| 
      
 7 
     | 
    
         
            +
                oauth_hash = build_gds_oauth_hash(user_json)
         
     | 
| 
      
 8 
     | 
    
         
            +
                GDS::SSO::Config.user_klass.find_for_gds_oauth(oauth_hash)
         
     | 
| 
      
 9 
     | 
    
         
            +
                head :ok
         
     | 
| 
      
 10 
     | 
    
         
            +
              end
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
              private
         
     | 
| 
      
 13 
     | 
    
         
            +
                # This should mirror the object created by the omniauth-gds strategy/gem
         
     | 
| 
      
 14 
     | 
    
         
            +
                # By doing this, we can reuse the code for creating/updating the user
         
     | 
| 
      
 15 
     | 
    
         
            +
                def build_gds_oauth_hash(user_json)
         
     | 
| 
      
 16 
     | 
    
         
            +
                  OmniAuth::AuthHash.new(
         
     | 
| 
      
 17 
     | 
    
         
            +
                      uid: user_json['uid'], 
         
     | 
| 
      
 18 
     | 
    
         
            +
                      provider: 'gds', 
         
     | 
| 
      
 19 
     | 
    
         
            +
                      info: { 
         
     | 
| 
      
 20 
     | 
    
         
            +
                        name: user_json['name'], 
         
     | 
| 
      
 21 
     | 
    
         
            +
                        email: user_json['email']
         
     | 
| 
      
 22 
     | 
    
         
            +
                      }, 
         
     | 
| 
      
 23 
     | 
    
         
            +
                      extra: { 
         
     | 
| 
      
 24 
     | 
    
         
            +
                        user: { permissions: user_json['permissions'] }
         
     | 
| 
      
 25 
     | 
    
         
            +
                      })
         
     | 
| 
      
 26 
     | 
    
         
            +
                end
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                def require_user_update_permission
         
     | 
| 
      
 29 
     | 
    
         
            +
                  authorise_user!(GDS::SSO::Config.default_scope, "user_update_permission")
         
     | 
| 
      
 30 
     | 
    
         
            +
                end
         
     | 
| 
      
 31 
     | 
    
         
            +
            end
         
     | 
    
        data/config/routes.rb
    CHANGED
    
    | 
         @@ -1,5 +1,6 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            Rails.application.routes.draw do
         
     | 
| 
       2 
2 
     | 
    
         
             
              match '/auth/gds/callback', to: 'authentications#callback', as: :gds_sign_in
         
     | 
| 
       3 
3 
     | 
    
         
             
              match '/auth/gds/sign_out', to: 'authentications#sign_out', as: :gds_sign_out
         
     | 
| 
       4 
     | 
    
         
            -
              match '/auth/failure', 
     | 
| 
      
 4 
     | 
    
         
            +
              match '/auth/failure',      to: 'authentications#failure',  as: :auth_failure
         
     | 
| 
      
 5 
     | 
    
         
            +
              match '/auth/gds/api/user', to: "api/user#update", via: "PUT"
         
     | 
| 
       5 
6 
     | 
    
         
             
            end
         
     | 
| 
         @@ -14,6 +14,10 @@ module GDS 
     | 
|
| 
       14 
14 
     | 
    
         | 
| 
       15 
15 
     | 
    
         | 
| 
       16 
16 
     | 
    
         
             
                  def authorise_user!(scope, permission)
         
     | 
| 
      
 17 
     | 
    
         
            +
                    # Ensure that we're authenticated (and by extension that current_user is set).
         
     | 
| 
      
 18 
     | 
    
         
            +
                    # Otherwise current_user might be nil, and we'd error out
         
     | 
| 
      
 19 
     | 
    
         
            +
                    authenticate_user!
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
       17 
21 
     | 
    
         
             
                    if not current_user.has_permission?(scope, permission)
         
     | 
| 
       18 
22 
     | 
    
         
             
                      raise PermissionDeniedException, "Sorry, you don't seem to have the #{permission} permission for #{scope}."
         
     | 
| 
       19 
23 
     | 
    
         
             
                    end
         
     | 
    
        data/lib/gds-sso/version.rb
    CHANGED
    
    
| 
         @@ -0,0 +1,57 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "spec_helper"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            def user_update_json
         
     | 
| 
      
 4 
     | 
    
         
            +
              {
         
     | 
| 
      
 5 
     | 
    
         
            +
                "user" => { 
         
     | 
| 
      
 6 
     | 
    
         
            +
                  "uid" => "a1s2d3", 
         
     | 
| 
      
 7 
     | 
    
         
            +
                  "name" => "Joshua Marshall", 
         
     | 
| 
      
 8 
     | 
    
         
            +
                  "email" => "user@domain.com", 
         
     | 
| 
      
 9 
     | 
    
         
            +
                  "permissions" => {
         
     | 
| 
      
 10 
     | 
    
         
            +
                    "GDS_SSO integration test" => ["signin", "new permission"]
         
     | 
| 
      
 11 
     | 
    
         
            +
                  }
         
     | 
| 
      
 12 
     | 
    
         
            +
                }
         
     | 
| 
      
 13 
     | 
    
         
            +
              }.to_json
         
     | 
| 
      
 14 
     | 
    
         
            +
            end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            describe Api::UserController, type: :controller do
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
              before :each do
         
     | 
| 
      
 19 
     | 
    
         
            +
                @user_to_update = User.new({ 
         
     | 
| 
      
 20 
     | 
    
         
            +
                    :uid => 'a1s2d3', 
         
     | 
| 
      
 21 
     | 
    
         
            +
                    :name => "Moshua Jarshall", 
         
     | 
| 
      
 22 
     | 
    
         
            +
                    :permissions => { "GDS_SSO integration test" => ["signin"] } })
         
     | 
| 
      
 23 
     | 
    
         
            +
              end
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
              describe "PUT update" do
         
     | 
| 
      
 26 
     | 
    
         
            +
                it "should deny access to anybody but the API user (or a user with 'user_update_permission')" do
         
     | 
| 
      
 27 
     | 
    
         
            +
                  malicious_user = User.new({ 
         
     | 
| 
      
 28 
     | 
    
         
            +
                      :uid => '2', 
         
     | 
| 
      
 29 
     | 
    
         
            +
                      :name => "User", 
         
     | 
| 
      
 30 
     | 
    
         
            +
                      :permissions => { "GDS_SSO integration test" => ["signin"] } })
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
                  request.env['warden'] = stub("stub warden", :authenticate! => true, authenticated?: true, user: malicious_user)
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
                  request.env['RAW_POST_DATA'] = user_update_json
         
     | 
| 
      
 35 
     | 
    
         
            +
                  put :update
         
     | 
| 
      
 36 
     | 
    
         
            +
                  
         
     | 
| 
      
 37 
     | 
    
         
            +
                  assert_equal 403, response.status
         
     | 
| 
      
 38 
     | 
    
         
            +
                end
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
                it "should create/update the user record in the same way as the OAuth callback" do
         
     | 
| 
      
 41 
     | 
    
         
            +
                  # Test that it authenticates
         
     | 
| 
      
 42 
     | 
    
         
            +
                  request.env['warden'] = mock("stub warden", authenticated?: true, user: GDS::SSO::ApiUser.new)
         
     | 
| 
      
 43 
     | 
    
         
            +
                  request.env['warden'].expects(:authenticate!).at_least_once.returns(true)
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
                  @user_to_update.expects(:update_attributes).with({ 
         
     | 
| 
      
 46 
     | 
    
         
            +
                      "uid" => "a1s2d3",
         
     | 
| 
      
 47 
     | 
    
         
            +
                      "name" => "Joshua Marshall", 
         
     | 
| 
      
 48 
     | 
    
         
            +
                      "email" => "user@domain.com", 
         
     | 
| 
      
 49 
     | 
    
         
            +
                      "permissions" => { "GDS_SSO integration test" => ["signin", "new permission"] }}, as: :oauth)
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
                  User.expects(:find_by_uid).with("a1s2d3").returns(@user_to_update)
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
                  request.env['RAW_POST_DATA'] = user_update_json
         
     | 
| 
      
 54 
     | 
    
         
            +
                  put :update
         
     | 
| 
      
 55 
     | 
    
         
            +
                end
         
     | 
| 
      
 56 
     | 
    
         
            +
              end
         
     | 
| 
      
 57 
     | 
    
         
            +
            end
         
     |