config: make the leading $jailreporoot/ prefix optional on ssh: URLs
authorKyle J. McKay <mackyle@gmail.com>
Sat, 12 Apr 2014 04:32:46 +0000 (11 21:32 -0700)
committerKyle J. McKay <mackyle@gmail.com>
Sat, 12 Apr 2014 04:32:46 +0000 (11 21:32 -0700)
Automatically add the $jailreporoot prefix for clients connecting over
the ssh protocol.  The prefix is still allowed if given, but it makes
for a cleaner user experience without it.

Girocco/Config.pm
bin/git-shell-verify

index 9ece320..c62ac92 100644 (file)
@@ -276,6 +276,9 @@ our $httpspushurl = undef;
 our $gitpullurl = "git://repo.or.cz";
 
 # Pushy SSH URL of the repository collection (undef if N/A)
+# Note that the "/$jailreporoot" portion is optional and will be automatically
+# added if appropriate when omitted by the client so this URL can typically
+# be made the same as $gitpullurl with git: replaced with ssh:
 our $pushurl = "ssh://repo.or.cz/$jailreporoot";
 
 # URL of gitweb of this Girocco instance (set to undef if you're not nice
index df8c6ed..72c4df8 100755 (executable)
@@ -20,15 +20,17 @@ webadmurl=@webadmurl@
 
 # Only the following commands are allowed:
 #
-#   git-shell -c 'git-receive-pack dir'
-#   git-shell -c 'git receive-pack dir'
-#   git-shell -c 'git-upload-pack dir'
-#   git-shell -c 'git upload-pack dir'
-#   git-shell -c 'git-upload-archive dir'
-#   git-shell -c 'git upload-archive dir'
+#   git-shell -c "git-receive-pack 'dir'"
+#   git-shell -c "git receive-pack 'dir'"
+#   git-shell -c "git-upload-pack 'dir'"
+#   git-shell -c "git upload-pack 'dir'"
+#   git-shell -c "git-upload-archive 'dir'"
+#   git-shell -c "git upload-archive 'dir'"
 #
 # where dir must start with $reporoot/ but a leading/trailing '/' is optional
-# as well as the final .git
+# as well as the final .git however if $dir does not start with $reporoot but
+# adding a $reporoot prefix makes it work then the $reporoot prefix will be
+# silently added.
 
 if [ "$1" != "-c" ]; then
        echo forbidden >&2
@@ -95,8 +97,13 @@ esac
 case "$dir" in
        "$reporoot/"*) :;;
        *)
-               echo forbidden >&2
-               exit 1
+               # Allow it if prefixing with $reporoot matches an existing directory
+               if [ -d "$reporoot$dir" ]; then
+                       dir="$reporoot$dir"
+               else
+                       echo forbidden >&2
+                       exit 1
+               fi
 esac
 
 if ! [ -d "$dir" ] || ! [ -f "$dir/HEAD" ] || ! [ -d "$dir/objects" ]; then
@@ -129,5 +136,5 @@ if ! [ -x /usr/bin/perl ] && [ "$type" = 'receive-pack' ]; then
        fi
 fi
 
-exec git-shell "$@"
+exec git-shell -c "git-$type '$dir'"
 exit 1