Welcome to mirror list, hosted at ThFree Co, Russian Federation.

internal.rb « api « lib - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: ebc9fef07b454dd17d5765cc3948218bc39826dc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
module API
  # Internal access API
  class Internal < Grape::API

    DOWNLOAD_COMMANDS = %w{ git-upload-pack git-upload-archive }
    PUSH_COMMANDS = %w{ git-receive-pack }

    namespace 'internal' do
      #
      # Check if ssh key has access to project code
      #
      # Params:
      #   key_id - SSH Key id
      #   project - project path with namespace
      #   action - git action (git-upload-pack or git-receive-pack)
      #   ref - branch name
      #
      get "/allowed" do
        # Check for *.wiki repositories.
        # Strip out the .wiki from the pathname before finding the
        # project. This applies the correct project permissions to
        # the wiki repository as well.
        project_path = params[:project]
        project_path.gsub!(/\.wiki/,'') if project_path =~ /\.wiki/

        key = Key.find(params[:key_id])
        project = Project.find_with_namespace(project_path)
        git_cmd = params[:action]
        return false unless project


        if key.is_a? DeployKey
          key.projects.include?(project) && DOWNLOAD_COMMANDS.include?(git_cmd)
        else
          user = key.user

          return false if user.blocked?
          if Gitlab.config.ldap.enabled
            return false if user.ldap_user? && Gitlab::LDAP::User.blocked?(user.extern_uid)
          end

          action = case git_cmd
                   when *DOWNLOAD_COMMANDS
                     then :download_code
                   when *PUSH_COMMANDS
                     then
                     if project.protected_branch?(params[:ref])
                       :push_code_to_protected_branches
                     else
                       :push_code
                     end
                   end

          user.can?(action, project)
        end
      end

      #
      # Discover user by ssh key
      #
      get "/discover" do
        key = Key.find(params[:key_id])
        present key.user, with: Entities::UserSafe
      end

      get "/check" do
        {
          api_version: API.version,
          gitlab_version: Gitlab::VERSION,
          gitlab_rev: Gitlab::REVISION,
        }
      end
    end
  end
end