Commit 9eb019045a8c1bb9f1cb6e8d3dfb7338ab2f921a
Exists in
master
and in
4 other branches
Merge pull request #1016 from SaitoWu/feature/https
Feature/https
Showing
5 changed files
with
89 additions
and
22 deletions
Show diff stats
Gemfile
| @@ -15,6 +15,7 @@ gem "gitolite", :git => "https://github.com/gitlabhq/gitolite-client.git", | @@ -15,6 +15,7 @@ gem "gitolite", :git => "https://github.com/gitlabhq/gitolite-client.git", | ||
| 15 | gem "pygments.rb", :git => "https://github.com/gitlabhq/pygments.rb.git", :ref => "2cada028da5054616634a1d9ca6941b65b3ce188" | 15 | gem "pygments.rb", :git => "https://github.com/gitlabhq/pygments.rb.git", :ref => "2cada028da5054616634a1d9ca6941b65b3ce188" |
| 16 | gem "omniauth-ldap", :git => "https://github.com/gitlabhq/omniauth-ldap.git", :ref => "7edf27d0281e09561838122982c16b7e62181f44" | 16 | gem "omniauth-ldap", :git => "https://github.com/gitlabhq/omniauth-ldap.git", :ref => "7edf27d0281e09561838122982c16b7e62181f44" |
| 17 | gem 'yaml_db', :git => "https://github.com/gitlabhq/yaml_db.git" | 17 | gem 'yaml_db', :git => "https://github.com/gitlabhq/yaml_db.git" |
| 18 | +gem 'grack', :git => "https://github.com/gitlabhq/grack.git" | ||
| 18 | gem "linguist", "~> 1.0.0", :git => "https://github.com/gitlabhq/linguist.git" | 19 | gem "linguist", "~> 1.0.0", :git => "https://github.com/gitlabhq/linguist.git" |
| 19 | 20 | ||
| 20 | gem "stamp" | 21 | gem "stamp" |
Gemfile.lock
| @@ -14,6 +14,13 @@ GIT | @@ -14,6 +14,13 @@ GIT | ||
| 14 | hashery (~> 1.4.0) | 14 | hashery (~> 1.4.0) |
| 15 | 15 | ||
| 16 | GIT | 16 | GIT |
| 17 | + remote: https://github.com/gitlabhq/grack.git | ||
| 18 | + revision: ba46f3b0845c6a09d488ae6abdce6ede37e227e8 | ||
| 19 | + specs: | ||
| 20 | + grack (1.0.0) | ||
| 21 | + rack (~> 1.4.1) | ||
| 22 | + | ||
| 23 | +GIT | ||
| 17 | remote: https://github.com/gitlabhq/grit.git | 24 | remote: https://github.com/gitlabhq/grit.git |
| 18 | revision: 7f35cb98ff17d534a07e3ce6ec3d580f67402837 | 25 | revision: 7f35cb98ff17d534a07e3ce6ec3d580f67402837 |
| 19 | ref: 7f35cb98ff17d534a07e3ce6ec3d580f67402837 | 26 | ref: 7f35cb98ff17d534a07e3ce6ec3d580f67402837 |
| @@ -373,6 +380,7 @@ DEPENDENCIES | @@ -373,6 +380,7 @@ DEPENDENCIES | ||
| 373 | foreman | 380 | foreman |
| 374 | git | 381 | git |
| 375 | gitolite! | 382 | gitolite! |
| 383 | + grack! | ||
| 376 | grit! | 384 | grit! |
| 377 | haml-rails | 385 | haml-rails |
| 378 | httparty | 386 | httparty |
config/gitlab.yml.example
| @@ -17,11 +17,15 @@ git_host: | @@ -17,11 +17,15 @@ git_host: | ||
| 17 | base_path: /home/git/repositories/ | 17 | base_path: /home/git/repositories/ |
| 18 | host: localhost | 18 | host: localhost |
| 19 | git_user: git | 19 | git_user: git |
| 20 | + upload_pack: true | ||
| 21 | + receive_pack: true | ||
| 20 | # port: 22 | 22 | # port: 22 |
| 21 | 23 | ||
| 24 | + | ||
| 22 | # Git settings | 25 | # Git settings |
| 23 | # Use default values unless you understand it | 26 | # Use default values unless you understand it |
| 24 | git: | 27 | git: |
| 28 | + path: /usr/bin/git | ||
| 25 | # Max size of git object like commit, in bytes | 29 | # Max size of git object like commit, in bytes |
| 26 | # This value can be increased if you have a very large commits | 30 | # This value can be increased if you have a very large commits |
| 27 | git_max_size: 5242880 # 5.megabytes | 31 | git_max_size: 5242880 # 5.megabytes |
| @@ -0,0 +1,46 @@ | @@ -0,0 +1,46 @@ | ||
| 1 | +module Grack | ||
| 2 | + class Auth < Rack::Auth::Basic | ||
| 3 | + | ||
| 4 | + def valid? | ||
| 5 | + # Authentication with username and password | ||
| 6 | + email, password = @auth.credentials | ||
| 7 | + user = User.find_by_email(email) | ||
| 8 | + return false unless user.valid_password?(password) | ||
| 9 | + | ||
| 10 | + # Find project by PATH_INFO from env | ||
| 11 | + if m = /^\/([\w-]+).git/.match(@env['PATH_INFO']).to_a | ||
| 12 | + return false unless project = Project.find_by_path(m.last) | ||
| 13 | + end | ||
| 14 | + | ||
| 15 | + # Git upload and receive | ||
| 16 | + if @env['REQUEST_METHOD'] == 'GET' | ||
| 17 | + true | ||
| 18 | + elsif @env['REQUEST_METHOD'] == 'POST' | ||
| 19 | + if @env['REQUEST_URI'].end_with?('git-upload-pack') | ||
| 20 | + return project.dev_access_for?(user) | ||
| 21 | + elsif @env['REQUEST_URI'].end_with?('git-receive-pack') | ||
| 22 | + if project.protected_branches.map(&:name).include?(current_ref) | ||
| 23 | + project.master_access_for?(user) | ||
| 24 | + else | ||
| 25 | + project.dev_access_for?(user) | ||
| 26 | + end | ||
| 27 | + else | ||
| 28 | + false | ||
| 29 | + end | ||
| 30 | + else | ||
| 31 | + false | ||
| 32 | + end | ||
| 33 | + end# valid? | ||
| 34 | + | ||
| 35 | + def current_ref | ||
| 36 | + if @env["HTTP_CONTENT_ENCODING"] =~ /gzip/ | ||
| 37 | + input = Zlib::GzipReader.new(@request.body).string | ||
| 38 | + else | ||
| 39 | + input = @request.body.string | ||
| 40 | + end | ||
| 41 | + | ||
| 42 | + oldrev, newrev, ref = input.split(' ') | ||
| 43 | + /refs\/heads\/([\w-]+)/.match(ref).to_a.last | ||
| 44 | + end | ||
| 45 | + end# Auth | ||
| 46 | +end# Grack |
config/routes.rb
| @@ -8,6 +8,14 @@ Gitlab::Application.routes.draw do | @@ -8,6 +8,14 @@ Gitlab::Application.routes.draw do | ||
| 8 | require 'resque/server' | 8 | require 'resque/server' |
| 9 | mount Resque::Server.new, at: '/info/resque' | 9 | mount Resque::Server.new, at: '/info/resque' |
| 10 | 10 | ||
| 11 | + # Enable Grack support | ||
| 12 | + mount Grack::Bundle.new({ | ||
| 13 | + git_path: GIT_OPTS['path'], | ||
| 14 | + project_root: GIT_HOST['base_path'], | ||
| 15 | + upload_pack: GIT_HOST['upload_pack'], | ||
| 16 | + receive_pack: GIT_HOST['receive_pack'] | ||
| 17 | + }), at: '/git' | ||
| 18 | + | ||
| 11 | # | 19 | # |
| 12 | # Help | 20 | # Help |
| 13 | # | 21 | # |
| @@ -20,15 +28,15 @@ Gitlab::Application.routes.draw do | @@ -20,15 +28,15 @@ Gitlab::Application.routes.draw do | ||
| 20 | # Admin Area | 28 | # Admin Area |
| 21 | # | 29 | # |
| 22 | namespace :admin do | 30 | namespace :admin do |
| 23 | - resources :users do | ||
| 24 | - member do | 31 | + resources :users do |
| 32 | + member do | ||
| 25 | put :team_update | 33 | put :team_update |
| 26 | put :block | 34 | put :block |
| 27 | put :unblock | 35 | put :unblock |
| 28 | end | 36 | end |
| 29 | end | 37 | end |
| 30 | - resources :projects, :constraints => { :id => /[^\/]+/ } do | ||
| 31 | - member do | 38 | + resources :projects, :constraints => { :id => /[^\/]+/ } do |
| 39 | + member do | ||
| 32 | get :team | 40 | get :team |
| 33 | put :team_update | 41 | put :team_update |
| 34 | end | 42 | end |
| @@ -79,12 +87,12 @@ Gitlab::Application.routes.draw do | @@ -79,12 +87,12 @@ Gitlab::Application.routes.draw do | ||
| 79 | 87 | ||
| 80 | resources :wikis, :only => [:show, :edit, :destroy, :create] do | 88 | resources :wikis, :only => [:show, :edit, :destroy, :create] do |
| 81 | member do | 89 | member do |
| 82 | - get "history" | 90 | + get "history" |
| 83 | end | 91 | end |
| 84 | end | 92 | end |
| 85 | 93 | ||
| 86 | - resource :repository do | ||
| 87 | - member do | 94 | + resource :repository do |
| 95 | + member do | ||
| 88 | get "branches" | 96 | get "branches" |
| 89 | get "tags" | 97 | get "tags" |
| 90 | get "archive" | 98 | get "archive" |
| @@ -94,14 +102,14 @@ Gitlab::Application.routes.draw do | @@ -94,14 +102,14 @@ Gitlab::Application.routes.draw do | ||
| 94 | resources :deploy_keys | 102 | resources :deploy_keys |
| 95 | resources :protected_branches, :only => [:index, :create, :destroy] | 103 | resources :protected_branches, :only => [:index, :create, :destroy] |
| 96 | 104 | ||
| 97 | - resources :refs, :only => [], :path => "/" do | ||
| 98 | - collection do | 105 | + resources :refs, :only => [], :path => "/" do |
| 106 | + collection do | ||
| 99 | get "switch" | 107 | get "switch" |
| 100 | end | 108 | end |
| 101 | 109 | ||
| 102 | - member do | 110 | + member do |
| 103 | get "tree", :constraints => { :id => /[a-zA-Z.\/0-9_\-]+/ } | 111 | get "tree", :constraints => { :id => /[a-zA-Z.\/0-9_\-]+/ } |
| 104 | - get "blob", | 112 | + get "blob", |
| 105 | :constraints => { | 113 | :constraints => { |
| 106 | :id => /[a-zA-Z.0-9\/_\-]+/, | 114 | :id => /[a-zA-Z.0-9\/_\-]+/, |
| 107 | :path => /.*/ | 115 | :path => /.*/ |
| @@ -126,36 +134,36 @@ Gitlab::Application.routes.draw do | @@ -126,36 +134,36 @@ Gitlab::Application.routes.draw do | ||
| 126 | end | 134 | end |
| 127 | end | 135 | end |
| 128 | 136 | ||
| 129 | - resources :merge_requests do | ||
| 130 | - member do | 137 | + resources :merge_requests do |
| 138 | + member do | ||
| 131 | get :diffs | 139 | get :diffs |
| 132 | get :automerge | 140 | get :automerge |
| 133 | get :automerge_check | 141 | get :automerge_check |
| 134 | end | 142 | end |
| 135 | 143 | ||
| 136 | - collection do | 144 | + collection do |
| 137 | get :branch_from | 145 | get :branch_from |
| 138 | get :branch_to | 146 | get :branch_to |
| 139 | end | 147 | end |
| 140 | end | 148 | end |
| 141 | - | ||
| 142 | - resources :snippets do | ||
| 143 | - member do | 149 | + |
| 150 | + resources :snippets do | ||
| 151 | + member do | ||
| 144 | get "raw" | 152 | get "raw" |
| 145 | end | 153 | end |
| 146 | end | 154 | end |
| 147 | 155 | ||
| 148 | - resources :hooks, :only => [:index, :create, :destroy] do | ||
| 149 | - member do | 156 | + resources :hooks, :only => [:index, :create, :destroy] do |
| 157 | + member do | ||
| 150 | get :test | 158 | get :test |
| 151 | end | 159 | end |
| 152 | end | 160 | end |
| 153 | - resources :commits do | ||
| 154 | - collection do | 161 | + resources :commits do |
| 162 | + collection do | ||
| 155 | get :compare | 163 | get :compare |
| 156 | end | 164 | end |
| 157 | 165 | ||
| 158 | - member do | 166 | + member do |
| 159 | get :patch | 167 | get :patch |
| 160 | end | 168 | end |
| 161 | end | 169 | end |