summaryrefslogtreecommitdiff
path: root/lib/api/internal.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/api/internal.rb')
-rw-r--r--lib/api/internal.rb49
1 files changed, 49 insertions, 0 deletions
diff --git a/lib/api/internal.rb b/lib/api/internal.rb
new file mode 100644
index 00000000000..3e5e3a478ba
--- /dev/null
+++ b/lib/api/internal.rb
@@ -0,0 +1,49 @@
+module Gitlab
+ # Internal access API
+ class Internal < Grape::API
+ namespace 'internal' do
+ #
+ # Check if ssh key has access to project code
+ #
+ get "/allowed" do
+ key = Key.find(params[:key_id])
+ project = Project.find_with_namespace(params[:project])
+ git_cmd = params[:action]
+
+ if key.is_deploy_key
+ project == key.project && git_cmd == 'git-upload-pack'
+ else
+ user = key.user
+ action = case git_cmd
+ when 'git-upload-pack'
+ then :download_code
+ when 'git-receive-pack'
+ 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::User
+ end
+
+ get "/check" do
+ {
+ api_version: '3'
+ }
+ end
+ end
+ end
+end
+