git-daemon --base-path

Tommi Virtanen expressed a wish on #git to be able to use short and elegant
git URLs by making git-daemon 'root' in a given directory. This patch
implements this, causing git-daemon to interpret all paths relative to
the given base path if any is given.

Signed-off-by: Petr Baudis <pasky@suse.cz>
Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Petr Baudis 2005-12-23 02:27:40 +01:00 committed by Junio C Hamano
parent f8f9c73c7d
commit b21c31c9a5
2 changed files with 30 additions and 2 deletions

View File

@ -9,7 +9,8 @@ SYNOPSIS
-------- --------
[verse] [verse]
'git-daemon' [--verbose] [--syslog] [--inetd | --port=n] [--export-all] 'git-daemon' [--verbose] [--syslog] [--inetd | --port=n] [--export-all]
[--timeout=n] [--init-timeout=n] [--strict-paths] [directory...] [--timeout=n] [--init-timeout=n] [--strict-paths]
[--base-path=path] [directory...]
DESCRIPTION DESCRIPTION
----------- -----------
@ -36,6 +37,14 @@ OPTIONS
git-daemon will refuse to start when this option is enabled and no git-daemon will refuse to start when this option is enabled and no
whitelist is specified. whitelist is specified.
--base-path::
Remap all the path requests as relative to the given path.
This is sort of "GIT root" - if you run git-daemon with
'--base-path=/srv/git' on example.com, then if you later try to pull
'git://example.com/hello.git', `git-daemon` will interpret the path
as '/srv/git/hello.git'. Home directories (the '~login' notation)
access is disabled.
--export-all:: --export-all::
Allow pulling from all directories that look like GIT repositories Allow pulling from all directories that look like GIT repositories
(have the 'objects' and 'refs' subdirectories), even if they (have the 'objects' and 'refs' subdirectories), even if they

View File

@ -15,7 +15,8 @@ static int verbose;
static const char daemon_usage[] = static const char daemon_usage[] =
"git-daemon [--verbose] [--syslog] [--inetd | --port=n] [--export-all]\n" "git-daemon [--verbose] [--syslog] [--inetd | --port=n] [--export-all]\n"
" [--timeout=n] [--init-timeout=n] [--strict-paths] [directory...]"; " [--timeout=n] [--init-timeout=n] [--strict-paths]\n"
" [--base-path=path] [directory...]";
/* List of acceptable pathname prefixes */ /* List of acceptable pathname prefixes */
static char **ok_paths = NULL; static char **ok_paths = NULL;
@ -24,6 +25,9 @@ static int strict_paths = 0;
/* If this is set, git-daemon-export-ok is not required */ /* If this is set, git-daemon-export-ok is not required */
static int export_all_trees = 0; static int export_all_trees = 0;
/* Take all paths relative to this one if non-NULL */
static char *base_path = NULL;
/* Timeout, and initial timeout */ /* Timeout, and initial timeout */
static unsigned int timeout = 0; static unsigned int timeout = 0;
static unsigned int init_timeout = 0; static unsigned int init_timeout = 0;
@ -138,6 +142,17 @@ static char *path_ok(char *dir)
return NULL; return NULL;
} }
if (base_path) {
static char rpath[PATH_MAX];
if (*dir != '/') {
/* Forbid possible base-path evasion using ~paths. */
logerror("'%s': Non-absolute path denied (base-path active)");
return NULL;
}
snprintf(rpath, PATH_MAX, "%s%s", base_path, dir);
dir = rpath;
}
path = enter_repo(dir, strict_paths); path = enter_repo(dir, strict_paths);
if (!path) { if (!path) {
@ -639,6 +654,10 @@ int main(int argc, char **argv)
strict_paths = 1; strict_paths = 1;
continue; continue;
} }
if (!strncmp(arg, "--base-path=", 12)) {
base_path = arg+12;
continue;
}
if (!strcmp(arg, "--")) { if (!strcmp(arg, "--")) {
ok_paths = &argv[i+1]; ok_paths = &argv[i+1];
break; break;