From 0542261437fd9df7539fe480069449b566057300 Mon Sep 17 00:00:00 2001
From: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Date: Thu, 24 Oct 2013 17:17:22 +0300
Subject: [PATCH] Allow git clone with http for GitLab CI service:

If you enable GitLab CI for project you will be able to clone project
source code with next command:
git clone http://gitlab-ci-token:XXXXXXXXXXXX@host:project.git
Requires for GitLab CI 4.0
---
 lib/gitlab/backend/grack_auth.rb | 29 +++++++++++++++++++++--------
 1 file changed, 21 insertions(+), 8 deletions(-)

diff --git a/lib/gitlab/backend/grack_auth.rb b/lib/gitlab/backend/grack_auth.rb
index c522e0a413b..e09cf311972 100644
--- a/lib/gitlab/backend/grack_auth.rb
+++ b/lib/gitlab/backend/grack_auth.rb
@@ -38,6 +38,16 @@ module Grack
         # Authentication with username and password
         login, password = @auth.credentials
 
+        # Allow authentication for GitLab CI service
+        # if valid token passed
+        if login == "gitlab-ci-token" && project.gitlab_ci?
+          token = project.gitlab_ci_service.token
+
+          if token.present? && token == password && service_name == 'git-upload-pack'
+            return @app.call(env)
+          end
+        end
+
         @user = authenticate_user(login, password)
 
         if @user
@@ -59,14 +69,7 @@ module Grack
     end
 
     def authorized_git_request?
-      # Git upload and receive
-      if @request.get?
-        authorize_request(@request.params['service'])
-      elsif @request.post?
-        authorize_request(File.basename(@request.path))
-      else
-        false
-      end
+      authorize_request(service_name)
     end
 
     def authenticate_user(login, password)
@@ -91,6 +94,16 @@ module Grack
       end
     end
 
+    def service_name
+      if @request.get?
+        @request.params['service']
+      elsif @request.post?
+        File.basename(@request.path)
+      else
+        nil
+      end
+    end
+
     def project
       @project ||= project_by_path(@request.path_info)
     end
-- 
GitLab