e732d1e by Johan Sørensen at 2008-01-06 1
#!/usr/bin/env ruby
271e194 by Johan Sørensen at 2007-12-31 2
dc6c46e by Johan Sørensen at 2008-01-06 3
require "yaml"
271e194 by Johan Sørensen at 2007-12-31 4
if File.symlink?(__FILE__)
5
  $:.unshift File.dirname(File.readlink(__FILE__)) + "/../lib/gitorious/ssh"
150c93e by Johan Sørensen at 2008-01-26 6
  BASE_DIR = File.dirname(File.readlink(__FILE__)) + "/../"
7
  conf_file = File.join(BASE_DIR, "config/gitorious.yml")
271e194 by Johan Sørensen at 2007-12-31 8
else
9
  $:.unshift File.dirname(__FILE__) + "/../lib/gitorious/ssh"
150c93e by Johan Sørensen at 2008-01-26 10
  BASE_DIR = File.dirname(__FILE__) + "/../"
11
  conf_file = File.join(BASE_DIR, "config/gitorious.yml")
271e194 by Johan Sørensen at 2007-12-31 12
end
13
98ce813 by Marius Mathiesen at 2009-06-24 14
#$DEBUG=true
15
577b527 by Tor Arne Vestbø at 2009-04-22 16
RAILS_ENV = ENV['RAILS_ENV'] ||= 'production'
17
18
GitoriousConfig = YAML::load_file(conf_file)[RAILS_ENV]
fbda043 by Johan Sørensen at 2008-01-06 19
a67761b by Johan Sørensen at 2008-01-07 20
ENV["PATH"] = "/usr/local/bin/:/opt/local/bin:#{ENV["PATH"]}"
271e194 by Johan Sørensen at 2007-12-31 21
150c93e by Johan Sørensen at 2008-01-26 22
require "logger"
271e194 by Johan Sørensen at 2007-12-31 23
require "strainer"
24
require "client"
25
26
File.umask(0022)
27
original_command = ENV["SSH_ORIGINAL_COMMAND"]
150c93e by Johan Sørensen at 2008-01-26 28
user = ARGV[0]
29
30
logger = Logger.new(File.join(BASE_DIR, "log", "gitorious_auth.log"))
31
logger.formatter = Logger::Formatter.new
32
logger.level = Logger::INFO
33
logger.formatter.datetime_format = "%Y-%m-%d %H:%M:%S"
34
logger.info("Connection from #{ENV['SSH_CLIENT'].inspect} (#{user || nil}): #{original_command || nil}")
35
271e194 by Johan Sørensen at 2007-12-31 36
$stderr.puts "original_command: #{original_command.inspect}" if $DEBUG
37
if original_command.nil? || original_command.strip.empty?
bd6054a by Johan Sørensen at 2009-05-19 38
  logger.info("Need SSH_ORIGINAL_COMMAND")
271e194 by Johan Sørensen at 2007-12-31 39
  $stderr.puts "Need SSH_ORIGINAL_COMMAND"
40
  exit!(1)
41
end
42
43
$stderr.puts "user: #{user.inspect}" if $DEBUG
44
if user.nil? || user.strip.empty?
bd6054a by Johan Sørensen at 2009-05-19 45
  logger.info("Need user arg")
ef4f4a0 by Johan Sørensen at 2009-07-21 46
  $stderr.puts "Need user arg"
271e194 by Johan Sørensen at 2007-12-31 47
  exit!(1)
48
end
49
d93bfa1 by Johan Sørensen at 2009-06-29 50
def gitorious_says(msg)
51
  $stderr.puts
52
  $stderr.puts "== Gitorious: " + ("=" * 59)
53
  $stderr.puts msg
54
  $stderr.puts "="*72
55
  $stderr.puts
56
end
57
271e194 by Johan Sørensen at 2007-12-31 58
begin
59
  strainer = Gitorious::SSH::Strainer.new(original_command).parse!
60
  client = Gitorious::SSH::Client.new(strainer, user)
61
98ce813 by Marius Mathiesen at 2009-06-24 62
  args = client.to_git_shell_argument
63
  $stderr.puts "git-shell -c #{args.inspect}" if $DEBUG
64
  ENV['GITORIOUS_WRITABLE_BY_URL'] = client.writable_by_query_url
30582e6 by Marius Mathiesen at 2009-06-24 65
  ENV['GITORIOUS_USER'] = user
7280afb by Johan Sørensen at 2009-06-29 66
  ENV['GITORIOUS_BASE_DIR'] = BASE_DIR
4303f75 by Johan Sørensen at 2009-07-10 67
  ENV['GITORIOUS_DENY_FORCE_PUSHES'] = client.force_pushing_denied? ? "true" : "false"
98ce813 by Marius Mathiesen at 2009-06-24 68
69
  logger.info("Accepted #{user.inspect} for #{args.inspect}")
2fba8e2 by Marius Mathiesen at 2009-06-24 70
  if client.pre_receive_hook_exists?
d93bfa1 by Johan Sørensen at 2009-06-29 71
    exec("git-shell", "-c", args)
2fba8e2 by Marius Mathiesen at 2009-06-24 72
  else
73
    logger.fatal("The pre-receive hook is not executable")
d93bfa1 by Johan Sørensen at 2009-06-29 74
    gitorious_says "Fatal error, please contact support"
2fba8e2 by Marius Mathiesen at 2009-06-24 75
    exit!(1)
76
  end
271e194 by Johan Sørensen at 2007-12-31 77
  
78
  unless $?.success?
bd6054a by Johan Sørensen at 2009-05-19 79
    logger.fatal("Failed to execute git command")
d93bfa1 by Johan Sørensen at 2009-06-29 80
    gitorious_says "Failed to execute git command"
271e194 by Johan Sørensen at 2007-12-31 81
    exit!(1)
82
  end
83
rescue Gitorious::SSH::AccessDeniedError => e
bd6054a by Johan Sørensen at 2009-05-19 84
  logger.info("Access denied or bad repository path for #{user.inspect}: #{original_command.inspect}")
d93bfa1 by Johan Sørensen at 2009-06-29 85
  gitorious_says "Access denied or wrong repository path"
271e194 by Johan Sørensen at 2007-12-31 86
  exit!(1)
87
rescue Gitorious::SSH::BadCommandError => e
bd6054a by Johan Sørensen at 2009-05-19 88
  logger.info("Access denied or bad command for #{user.inspect}: #{original_command.inspect}")
d93bfa1 by Johan Sørensen at 2009-06-29 89
  gitorious_says "Access denied or bad command"
271e194 by Johan Sørensen at 2007-12-31 90
  exit!(1)
4b95da4 by Johan Sørensen at 2009-06-29 91
rescue Errno::ECONNREFUSED => e
92
  logger.fatal("Connection refused querying for paths/permissions")
93
  gitorious_says("Temporary error. Please try again shortly")
94
  exit!(1)
271e194 by Johan Sørensen at 2007-12-31 95
rescue Object => e
96
  if $DEBUG
97
    $stderr.puts "#{e.class.name} #{e.message}"
98
    $stderr.puts e.backtrace.join("  \n")
99
  end
bd6054a by Johan Sørensen at 2009-05-19 100
  logger.fatal("#{e.class.name} #{e.message}: #{e.backtrace.join("\n  ")}")
d93bfa1 by Johan Sørensen at 2009-06-29 101
  gitorious_says "fatal error"
271e194 by Johan Sørensen at 2007-12-31 102
  exit(1)
103
end