Commit 90b9e113 authored by ash's avatar ash

Allow administrators to log users by key id (faster) or by username (clearer).

parent ceb23a62
...@@ -29,3 +29,8 @@ log_file: "/home/git/gitlab-shell/gitlab-shell.log" ...@@ -29,3 +29,8 @@ log_file: "/home/git/gitlab-shell/gitlab-shell.log"
# Log level. INFO by default # Log level. INFO by default
log_level: INFO log_level: INFO
# Audit usernames.
# Set to true to see real usernames in the logs instead of key ids, which is easier to follow, but
# incurs an extra API call on every gitlab-shell command.
audit_usernames: false
...@@ -39,6 +39,10 @@ class GitlabConfig ...@@ -39,6 +39,10 @@ class GitlabConfig
@config['log_level'] ||= 'INFO' @config['log_level'] ||= 'INFO'
end end
def audit_usernames
@config['audit_usernames'] ||= false
end
# Build redis command to write update event in gitlab queue # Build redis command to write update event in gitlab queue
def redis_command def redis_command
if redis.empty? if redis.empty?
......
...@@ -8,7 +8,9 @@ class GitlabShell ...@@ -8,7 +8,9 @@ class GitlabShell
def initialize def initialize
@key_id = ARGV.shift @key_id = ARGV.shift
@origin_cmd = ENV['SSH_ORIGINAL_COMMAND'] @origin_cmd = ENV['SSH_ORIGINAL_COMMAND']
@repos_path = GitlabConfig.new.repos_path @config = GitlabConfig.new
@repos_path = @config.repos_path
@user_tried = false
end end
def exec def exec
...@@ -21,19 +23,16 @@ class GitlabShell ...@@ -21,19 +23,16 @@ class GitlabShell
if validate_access if validate_access
process_cmd process_cmd
else else
message = "gitlab-shell: Access denied for git command <#{@origin_cmd}>" message = "gitlab-shell: Access denied for git command <#{@origin_cmd}> by #{log_username}."
message << " by user with key #{@key_id}."
$logger.warn message $logger.warn message
end end
else else
message = "gitlab-shell: Attempt to execute disallowed command " message = "gitlab-shell: Attempt to execute disallowed command <#{@origin_cmd}> by #{log_username}."
message << "<#{@origin_cmd}> by user with key #{@key_id}."
$logger.warn message $logger.warn message
puts 'Not allowed command' puts 'Not allowed command'
end end
else else
user = api.discover(@key_id) puts "Welcome to GitLab, #{username}!"
puts "Welcome to GitLab, #{user && user['name'] || 'Anonymous'}!"
end end
end end
...@@ -52,7 +51,7 @@ class GitlabShell ...@@ -52,7 +51,7 @@ class GitlabShell
def process_cmd def process_cmd
repo_full_path = File.join(repos_path, repo_name) repo_full_path = File.join(repos_path, repo_name)
cmd = "#{@git_cmd} #{repo_full_path}" cmd = "#{@git_cmd} #{repo_full_path}"
$logger.info "gitlab-shell: executing git command <#{cmd}> for user with key #{@key_id}." $logger.info "gitlab-shell: executing git command <#{cmd}> for #{log_username}."
exec_cmd(cmd) exec_cmd(cmd)
end end
...@@ -67,4 +66,23 @@ class GitlabShell ...@@ -67,4 +66,23 @@ class GitlabShell
def api def api
GitlabNet.new GitlabNet.new
end end
def user
# Can't use "@user ||=" because that will keep hitting the API when @user is really nil!
if @user_tried
@user
else
@user_tried = true
@user = api.discover(@key_id)
end
end
def username
user && user['name'] || 'Anonymous'
end
# User identifier to be used in log messages.
def log_username
@config.audit_usernames ? username : "user with key #{@key_id}"
end
end end
...@@ -11,13 +11,15 @@ describe GitlabShell do ...@@ -11,13 +11,15 @@ describe GitlabShell do
end end
let(:api) do let(:api) do
double(GitlabNet).tap do |api| double(GitlabNet).tap do |api|
api.stub(discover: 'John Doe') api.stub(discover: { 'name' => 'John Doe' })
api.stub(allowed?: true) api.stub(allowed?: true)
end end
end end
let(:key_id) { "key-#{rand(100) + 100}" } let(:key_id) { "key-#{rand(100) + 100}" }
let(:repository_path) { "/home/git#{rand(100)}/repos" } let(:repository_path) { "/home/git#{rand(100)}/repos" }
before { GitlabConfig.any_instance.stub(:repos_path).and_return(repository_path) } before do
GitlabConfig.any_instance.stub(repos_path: repository_path, audit_usernames: false)
end
describe :initialize do describe :initialize do
before { ssh_cmd 'git-receive-pack' } before { ssh_cmd 'git-receive-pack' }
...@@ -71,6 +73,11 @@ describe GitlabShell do ...@@ -71,6 +73,11 @@ describe GitlabShell do
message << "for user with key #{key_id}." message << "for user with key #{key_id}."
$logger.should_receive(:info).with(message) $logger.should_receive(:info).with(message)
end end
it "should use usernames if configured to do so" do
GitlabConfig.any_instance.stub(audit_usernames: true)
$logger.should_receive(:info) { |msg| msg.should =~ /for John Doe/ }
end
end end
context 'git-receive-pack' do context 'git-receive-pack' do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment