diff options
author | Douwe Maan <douwe@gitlab.com> | 2015-04-06 12:30:21 +0200 |
---|---|---|
committer | Douwe Maan <douwe@gitlab.com> | 2015-04-06 13:08:51 +0200 |
commit | f64e5d4a075479846f2e18bb34b84eb26d180f57 (patch) | |
tree | 436f8840ecdd060f20d282bd7165fa4765c277fa | |
parent | 8f0f67622971d1861769a9deac6b102c9fdaed42 (diff) | |
download | gitlab-shell-f64e5d4a075479846f2e18bb34b84eb26d180f57.tar.gz |
Write GitlabShell error to stderr.nice-error-message
-rwxr-xr-x | bin/gitlab-shell | 7 | ||||
-rw-r--r-- | lib/gitlab_shell.rb | 48 | ||||
-rw-r--r-- | spec/gitlab_shell_spec.rb | 2 |
3 files changed, 36 insertions, 21 deletions
diff --git a/bin/gitlab-shell b/bin/gitlab-shell index 4b3dc16..8154029 100755 --- a/bin/gitlab-shell +++ b/bin/gitlab-shell @@ -13,6 +13,9 @@ require_relative '../lib/gitlab_init' # # require File.join(ROOT_PATH, 'lib', 'gitlab_shell') -GitlabShell.new.exec -exit +if GitlabShell.new.exec + exit 0 +else + exit 1 +end diff --git a/lib/gitlab_shell.rb b/lib/gitlab_shell.rb index 806e016..d075048 100644 --- a/lib/gitlab_shell.rb +++ b/lib/gitlab_shell.rb @@ -3,7 +3,9 @@ require 'shellwords' require_relative 'gitlab_net' class GitlabShell + class AccessDeniedError < StandardError; end class DisallowedCommandError < StandardError; end + class InvalidRepositoryPathError < StandardError; end attr_accessor :key_id, :repo_name, :git_cmd, :repos_path, :repo_name @@ -15,31 +17,41 @@ class GitlabShell end def exec - if @origin_cmd - parse_cmd + unless @origin_cmd + puts "Welcome to GitLab, #{username}!" + return true + end - raise DisallowedCommandError unless git_cmds.include?(@git_cmd) + parse_cmd - ENV['GL_ID'] = @key_id + raise DisallowedCommandError unless git_cmds.include?(@git_cmd) - access = api.check_access(@git_cmd, @repo_name, @key_id, '_any') + ENV['GL_ID'] = @key_id + status = api.check_access(@git_cmd, @repo_name, @key_id, '_any') - if access.allowed? - process_cmd - else - message = "gitlab-shell: Access denied for git command <#{@origin_cmd}> by #{log_username}." - $logger.warn message - puts access.message - end - else - puts "Welcome to GitLab, #{username}!" - end + raise AccessDeniedError, status.message unless status.allowed? + + process_cmd + + true rescue GitlabNet::ApiUnreachableError => ex - puts "Failed to authorize your Git request: internal API unreachable" + $stderr.puts "GitLab: Failed to authorize your Git request: internal API unreachable" + false + rescue AccessDeniedError => ex + message = "gitlab-shell: Access denied for git command <#{@origin_cmd}> by #{log_username}." + $logger.warn message + + $stderr.puts "GitLab: #{ex.message}" + false rescue DisallowedCommandError => ex message = "gitlab-shell: Attempt to execute disallowed command <#{@origin_cmd}> by #{log_username}." $logger.warn message - puts 'Disallowed command' + + $stderr.puts "GitLab: Disallowed command" + false + rescue InvalidRepositoryPathError => ex + $stderr.puts "GitLab: Invalid repository path" + false end protected @@ -125,7 +137,7 @@ class GitlabShell if File.absolute_path(full_repo_path) == full_repo_path path else - abort "Wrong repository path" + raise InvalidRepositoryPathError end end diff --git a/spec/gitlab_shell_spec.rb b/spec/gitlab_shell_spec.rb index 5abeeb9..6bb4db4 100644 --- a/spec/gitlab_shell_spec.rb +++ b/spec/gitlab_shell_spec.rb @@ -241,7 +241,7 @@ describe GitlabShell do before { File.stub(:absolute_path) { 'y' } } subject { -> { shell.send(:escape_path, 'z') } } - it { should raise_error(SystemExit, "Wrong repository path") } + it { should raise_error(GitlabShell::InvalidRepositoryPathError) } end def ssh_cmd(cmd) |