diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/gitlab_shell.rb | 2 | ||||
-rw-r--r-- | lib/gitlab_update.rb | 46 |
2 files changed, 31 insertions, 17 deletions
diff --git a/lib/gitlab_shell.rb b/lib/gitlab_shell.rb index d821299..842714e 100644 --- a/lib/gitlab_shell.rb +++ b/lib/gitlab_shell.rb @@ -16,7 +16,7 @@ class GitlabShell parse_cmd if git_cmds.include?(@git_cmd) - ENV['GL_USER'] = @key_id + ENV['GL_ID'] = @key_id if validate_access process_cmd diff --git a/lib/gitlab_update.rb b/lib/gitlab_update.rb index 7bbb288..d6d135b 100644 --- a/lib/gitlab_update.rb +++ b/lib/gitlab_update.rb @@ -3,33 +3,38 @@ require_relative 'gitlab_net' class GitlabUpdate def initialize(repo_path, key_id, refname) + @repo_path = repo_path.strip @repo_name = repo_path @repo_name.gsub!(GitlabConfig.new.repos_path.to_s, "") @repo_name.gsub!(/.git$/, "") @repo_name.gsub!(/^\//, "") @key_id = key_id - @refname = /refs\/heads\/([\w\.-]+)/.match(refname).to_a.last + @refname = refname + @branch_name = /refs\/heads\/([\w\.-]+)/.match(refname).to_a.last + + @oldrev = ARGV[1] + @newrev = ARGV[2] end def exec - # Skip update hook for local push when key_id is nil - # It required for gitlab instance to make local pushes - # without validation of access - exit 0 if @key_id.nil? - - # Also skip update hook for non-gitlab keys - # and reset GL_USER env - unless @key_id =~ /\Akey\-\d+\Z/ - ENV['GL_USER'] = nil - exit 0 - end + # reset GL_USER env since we already + # get value from it + ENV['GL_ID'] = nil - if api.allowed?('git-receive-pack', @repo_name, @key_id, @refname) - exit 0 + # If its push over ssh + # we need to check user persmission per branch first + if ssh? + if api.allowed?('git-receive-pack', @repo_name, @key_id, @branch_name) + update_redis + exit 0 + else + puts "GitLab: You are not allowed to access #{@branch_name}! " + exit 1 + end else - puts "GitLab: You are not allowed to access #{@refname}! " - exit 1 + update_redis + exit 0 end end @@ -38,4 +43,13 @@ class GitlabUpdate def api GitlabNet.new end + + def ssh? + @key_id =~ /\Akey\-\d+\Z/ + end + + def update_redis + command = "env -i redis-cli rpush 'resque:gitlab:queue:post_receive' '{\"class\":\"PostReceive\",\"args\":[\"#{@repo_path}\",\"#{@oldrev}\",\"#{@newrev}\",\"#{@refname}\",\"#{@key_id}\"]}' > /dev/null 2>&1" + system(command) + end end |