commit
9eb019045a
5 changed files with 89 additions and 22 deletions
1
Gemfile
1
Gemfile
|
@ -15,6 +15,7 @@ gem "gitolite", :git => "https://github.com/gitlabhq/gitolite-client.git",
|
|||
gem "pygments.rb", :git => "https://github.com/gitlabhq/pygments.rb.git", :ref => "2cada028da5054616634a1d9ca6941b65b3ce188"
|
||||
gem "omniauth-ldap", :git => "https://github.com/gitlabhq/omniauth-ldap.git", :ref => "7edf27d0281e09561838122982c16b7e62181f44"
|
||||
gem 'yaml_db', :git => "https://github.com/gitlabhq/yaml_db.git"
|
||||
gem 'grack', :git => "https://github.com/gitlabhq/grack.git"
|
||||
gem "linguist", "~> 1.0.0", :git => "https://github.com/gitlabhq/linguist.git"
|
||||
|
||||
gem "stamp"
|
||||
|
|
|
@ -13,6 +13,13 @@ GIT
|
|||
grit (>= 2.4.1)
|
||||
hashery (~> 1.4.0)
|
||||
|
||||
GIT
|
||||
remote: https://github.com/gitlabhq/grack.git
|
||||
revision: ba46f3b0845c6a09d488ae6abdce6ede37e227e8
|
||||
specs:
|
||||
grack (1.0.0)
|
||||
rack (~> 1.4.1)
|
||||
|
||||
GIT
|
||||
remote: https://github.com/gitlabhq/grit.git
|
||||
revision: 7f35cb98ff17d534a07e3ce6ec3d580f67402837
|
||||
|
@ -373,6 +380,7 @@ DEPENDENCIES
|
|||
foreman
|
||||
git
|
||||
gitolite!
|
||||
grack!
|
||||
grit!
|
||||
haml-rails
|
||||
httparty
|
||||
|
|
|
@ -17,11 +17,15 @@ git_host:
|
|||
base_path: /home/git/repositories/
|
||||
host: localhost
|
||||
git_user: git
|
||||
upload_pack: true
|
||||
receive_pack: true
|
||||
# port: 22
|
||||
|
||||
|
||||
# Git settings
|
||||
# Use default values unless you understand it
|
||||
git:
|
||||
path: /usr/bin/git
|
||||
# Max size of git object like commit, in bytes
|
||||
# This value can be increased if you have a very large commits
|
||||
git_max_size: 5242880 # 5.megabytes
|
||||
|
|
46
config/initializers/grack_auth.rb
Normal file
46
config/initializers/grack_auth.rb
Normal file
|
@ -0,0 +1,46 @@
|
|||
module Grack
|
||||
class Auth < Rack::Auth::Basic
|
||||
|
||||
def valid?
|
||||
# Authentication with username and password
|
||||
email, password = @auth.credentials
|
||||
user = User.find_by_email(email)
|
||||
return false unless user.valid_password?(password)
|
||||
|
||||
# Find project by PATH_INFO from env
|
||||
if m = /^\/([\w-]+).git/.match(@env['PATH_INFO']).to_a
|
||||
return false unless project = Project.find_by_path(m.last)
|
||||
end
|
||||
|
||||
# Git upload and receive
|
||||
if @env['REQUEST_METHOD'] == 'GET'
|
||||
true
|
||||
elsif @env['REQUEST_METHOD'] == 'POST'
|
||||
if @env['REQUEST_URI'].end_with?('git-upload-pack')
|
||||
return project.dev_access_for?(user)
|
||||
elsif @env['REQUEST_URI'].end_with?('git-receive-pack')
|
||||
if project.protected_branches.map(&:name).include?(current_ref)
|
||||
project.master_access_for?(user)
|
||||
else
|
||||
project.dev_access_for?(user)
|
||||
end
|
||||
else
|
||||
false
|
||||
end
|
||||
else
|
||||
false
|
||||
end
|
||||
end# valid?
|
||||
|
||||
def current_ref
|
||||
if @env["HTTP_CONTENT_ENCODING"] =~ /gzip/
|
||||
input = Zlib::GzipReader.new(@request.body).string
|
||||
else
|
||||
input = @request.body.string
|
||||
end
|
||||
|
||||
oldrev, newrev, ref = input.split(' ')
|
||||
/refs\/heads\/([\w-]+)/.match(ref).to_a.last
|
||||
end
|
||||
end# Auth
|
||||
end# Grack
|
|
@ -8,6 +8,14 @@ Gitlab::Application.routes.draw do
|
|||
require 'resque/server'
|
||||
mount Resque::Server.new, at: '/info/resque'
|
||||
|
||||
# Enable Grack support
|
||||
mount Grack::Bundle.new({
|
||||
git_path: GIT_OPTS['path'],
|
||||
project_root: GIT_HOST['base_path'],
|
||||
upload_pack: GIT_HOST['upload_pack'],
|
||||
receive_pack: GIT_HOST['receive_pack']
|
||||
}), at: '/git'
|
||||
|
||||
#
|
||||
# Help
|
||||
#
|
||||
|
|
Loading…
Add table
Reference in a new issue