Skip to content
Snippets Groups Projects
Select Git revision
  • ag-test
  • rs-test
  • master default protected
  • test-me-pa
  • mksionek-master-patch-52381
  • new-branch-10
  • test-conflicts
  • test-suggestions
  • alejandro-test
  • patch-25
  • winh-test-image-doscussion
  • stg-lfs-image-test-2
  • stg-lfs-image-test
  • test42016
  • issue_42016
  • issue-32709
  • add-codeowners
  • ClemMakesApps-master-patch-62759
  • bvl-staging-test
  • bvl-merge-base-api
  • v9.2.0-rc6 protected
  • v9.2.0-rc5 protected
  • v9.2.0-rc4 protected
  • v9.2.0-rc3 protected
  • v9.1.4 protected
  • v9.2.0-rc2 protected
  • v9.2.0-rc1 protected
  • v9.1.3 protected
  • v8.17.6 protected
  • v9.0.7 protected
  • v9.1.2 protected
  • v9.1.1 protected
  • v9.2.0.pre protected
  • v9.1.0 protected
  • v9.1.0-rc7 protected
  • v9.1.0-rc6 protected
  • v9.0.6 protected
  • v9.1.0-rc5 protected
  • v9.1.0-rc4 protected
  • v9.1.0-rc3 protected
40 results

gitlab_ci_yaml_processor.rb

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    git_http_controller.rb NaN GiB
    # This file should be identical in GitLab Community Edition and Enterprise Edition
    
    class Projects::GitHttpController < Projects::GitHttpClientController
      # GET /foo/bar.git/info/refs?service=git-upload-pack (git pull)
      # GET /foo/bar.git/info/refs?service=git-receive-pack (git push)
      def info_refs
        if upload_pack? && upload_pack_allowed?
          render_ok
        elsif receive_pack? && receive_pack_allowed?
          render_ok
        elsif http_blocked?
          render_http_not_allowed
        else
          render_denied
        end
      end
    
      # POST /foo/bar.git/git-upload-pack (git pull)
      def git_upload_pack
        if upload_pack? && upload_pack_allowed?
          render_ok
        else
          render_denied
        end
      end
    
      # POST /foo/bar.git/git-receive-pack" (git push)
      def git_receive_pack
        if receive_pack? && receive_pack_allowed?
          render_ok
        else
          render_denied
        end
      end
    
      private
    
      def download_request?
        upload_pack?
      end
    
      def upload_pack?
        git_command == 'git-upload-pack'
      end
    
      def receive_pack?
        git_command == 'git-receive-pack'
      end
    
      def git_command
        if action_name == 'info_refs'
          params[:service]
        else
          action_name.dasherize
        end
      end
    
      def render_ok
        render json: Gitlab::Workhorse.git_http_ok(repository, user)
      end
    
      def render_http_not_allowed
        render plain: access_check.message, status: :forbidden
      end
    
      def render_denied
        if user && user.can?(:read_project, project)
          render plain: 'Access denied', status: :forbidden
        else
          # Do not leak information about project existence
          render_not_found
        end
      end
    
      def upload_pack_allowed?
        return false unless Gitlab.config.gitlab_shell.upload_pack
    
        if user
          access_check.allowed?
        else
          ci? || project.public?
        end
      end
    
      def access
        @access ||= Gitlab::GitAccess.new(user, project, 'http')
      end
    
      def access_check
        # Use the magic string '_any' to indicate we do not know what the
        # changes are. This is also what gitlab-shell does.
        @access_check ||= access.check(git_command, '_any')
      end
    
      def http_blocked?
        !access.protocol_allowed?
      end
    
      def receive_pack_allowed?
        return false unless Gitlab.config.gitlab_shell.receive_pack
    
        access_check.allowed?
      end
    end