As we reevaluate how to best support and maintain Staging Ref in the future, we encourage development teams using this environment to highlight their use cases in the following issue: https://gitlab.com/gitlab-com/gl-infra/software-delivery/framework/software-delivery-framework-issue-tracker/-/issues/36.

Skip to content
Snippets Groups Projects
Commit 90b9e113 authored by ash's avatar ash
Browse files

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

parent ceb23a62
No related branches found
No related tags found
No related merge requests found
Loading
Loading
@@ -29,3 +29,8 @@ log_file: "/home/git/gitlab-shell/gitlab-shell.log"
# Log level. INFO by default
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
Loading
Loading
@@ -39,6 +39,10 @@ class GitlabConfig
@config['log_level'] ||= 'INFO'
end
def audit_usernames
@config['audit_usernames'] ||= false
end
# Build redis command to write update event in gitlab queue
def redis_command
if redis.empty?
Loading
Loading
Loading
Loading
@@ -8,7 +8,9 @@ class GitlabShell
def initialize
@key_id = ARGV.shift
@origin_cmd = ENV['SSH_ORIGINAL_COMMAND']
@repos_path = GitlabConfig.new.repos_path
@config = GitlabConfig.new
@repos_path = @config.repos_path
@user_tried = false
end
def exec
Loading
Loading
@@ -21,19 +23,16 @@ class GitlabShell
if validate_access
process_cmd
else
message = "gitlab-shell: Access denied for git command <#{@origin_cmd}>"
message << " by user with key #{@key_id}."
message = "gitlab-shell: Access denied for git command <#{@origin_cmd}> by #{log_username}."
$logger.warn message
end
else
message = "gitlab-shell: Attempt to execute disallowed command "
message << "<#{@origin_cmd}> by user with key #{@key_id}."
message = "gitlab-shell: Attempt to execute disallowed command <#{@origin_cmd}> by #{log_username}."
$logger.warn message
puts 'Not allowed command'
end
else
user = api.discover(@key_id)
puts "Welcome to GitLab, #{user && user['name'] || 'Anonymous'}!"
puts "Welcome to GitLab, #{username}!"
end
end
Loading
Loading
@@ -52,7 +51,7 @@ class GitlabShell
def process_cmd
repo_full_path = File.join(repos_path, repo_name)
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)
end
Loading
Loading
@@ -67,4 +66,23 @@ class GitlabShell
def api
GitlabNet.new
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
Loading
Loading
@@ -11,13 +11,15 @@ describe GitlabShell do
end
let(:api) do
double(GitlabNet).tap do |api|
api.stub(discover: 'John Doe')
api.stub(discover: { 'name' => 'John Doe' })
api.stub(allowed?: true)
end
end
let(:key_id) { "key-#{rand(100) + 100}" }
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
before { ssh_cmd 'git-receive-pack' }
Loading
Loading
@@ -71,6 +73,11 @@ describe GitlabShell do
message << "for user with key #{key_id}."
$logger.should_receive(:info).with(message)
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
context 'git-receive-pack' do
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment