threads / discuss / 4384

git daemon directory munging?

Subject: git daemon directory munging?

## tl;dr

5 messages between Jun 4, 2006 and Jun 4, 2006.

replies: 4people: 4as markdown or json

Jon Loeliger· Jun 4, 2006, 00:13 UTC · lore
Scrapped right off the #git IRC channel...
<jdl> I stumbled across some git-daemon quirk for which I'd like opinions on
      possible solutions.						[18:56]
<jdl> I run a server that houses multiple virtual hosts on one physical
      machine.
<jdl> It has multiple Apache based websites on it, and I want to front
      multiple git repositories with gitweb.  That all works fine.	[18:57]
<jdl> But when I set up my repository stores, ie the /pub/scm/repo.git places,
      it falls apart.
<jdl> I want to maintain separate sets of git repos for each virtual site.
									[18:58]
<jdl> That is, www.foo.com can't see the repos of www.bar.com and vice versa.
<jdl> So I have an Apache directory set up that maps www.foo.com/pub/scm to
      some place like /pub/foo/scm using an alias for /pub/scm.		[18:59]
<jdl> Similarly, for www.bar.com I map /pub/scm to /pub/bar/scm
<jdl> Now, when I clone using http: all is well as it correctly maps the URL
      using the Apache Alias entry.					[19:00]
<jdl> However, when cloning via git: it doesn't do the Alias mapping based on
      the given website prefix part of the URL.
<jdl> I would have to clone using git://www.foo.com/pub/foo/scm even though I
      would clone using http://www.foo.com/pub/scm/			[19:01]
<jdl> So my proposed solution is to setup a genarlization of the git-daemon
      -baser-path=path argument.
<jdl> Instead of a single --base-path, there are potentially multiple
      --base-path entries that match multiple a URL prefixes.		[19:02]
<jdl> Thus, I'd use something like:
      --map-base=www.foo.com/pub/scm:/pub/foo/scm
      --map-base=www.bar.com/pub/scm=/pub/bar/scm			[19:04]
<dormando> mod_rewrite for git :|
<jdl> Quick prefix hack, yeah.						[19:05]
<jdl> Um, stop me before I hack....? :-)				[19:06]
<dormando> you're going to end up needing something that supports basic
	   regexes before long
<dormando> I can't think of many cases where you'd want to directly map like
	   that, and especially in that specific manner.		[19:07]
<jdl> I can't hear you.
<dormando> sorry.
* dormando was going to have similar problems for his hosting service
Linus Torvalds· Jun 4, 2006, 00:42 UTC · re: Jon Loeliger · lore

Re: git daemon directory munging?

On Sat, 3 Jun 2006, Jon Loeliger wrote:
>
> <jdl> Thus, I'd use something like:
>       --map-base=www.foo.com/pub/scm:/pub/foo/scm
>       --map-base=www.bar.com/pub/scm=/pub/bar/scm

The bigger problem is that nothing actually passes in the hostname to git-daemon in the first place. By the time the git-daemon is contacted, the hostname is long gone ;(

Now, you can just extend the git protocol to just pass in the host too. 

You can in fact do this in a backwards-compatible manner (old git-daemons will just ignore it, and new git daemons will automatically notice new clients) with something evil like the appended.

Not tested (and this actualyl doesn't make the daemon _use_ the data, it just adds a comment - the rest "is left as an exercise for the reader")

		Linus
---
diff --git a/connect.c b/connect.c
index 54f7bf7..36c5d04 100644
--- a/connect.c
+++ b/connect.c
@@ -374,7 +374,7 @@ static int git_tcp_connect(int fd[2], co
 
 	fd[0] = sockfd;
 	fd[1] = sockfd;
-	packet_write(sockfd, "%s %s\n", prog, path);
+	packet_write(sockfd, "%s %s%c%s%c%s\n", prog, path, 0, host, 0, port);
 	return 0;
 }
 
diff --git a/daemon.c b/daemon.c
index 776749e..61e0af9 100644
--- a/daemon.c
+++ b/daemon.c
@@ -267,7 +267,7 @@ static int upload(char *dir)
 static int execute(void)
 {
 	static char line[1000];
-	int len;
+	int len, n;
 
 	alarm(init_timeout ? init_timeout : timeout);
 	len = packet_read_line(0, line, sizeof(line));
@@ -276,6 +276,14 @@ static int execute(void)
 	if (len && line[len-1] == '\n')
 		line[--len] = 0;
 
+	n = strlen(line);
+	if (n != len) {
+		/* Cool, we have hidden info at the end */
+		/* Parse the hostname and the port, and */
+		/* leave some room for expansion for	*/
+		/* the future ..			*/
+	}
+
 	if (!strncmp("git-upload-pack ", line, 16))
 		return upload(line+16);
 
Junio C Hamano· Jun 4, 2006, 06:27 UTC · re: Linus Torvalds · lore

Re: git daemon directory munging?

Linus Torvalds <torvalds@osdl.org> writes:
Show 12 quoted lines
> diff --git a/connect.c b/connect.c
> index 54f7bf7..36c5d04 100644
> --- a/connect.c
> +++ b/connect.c
> @@ -374,7 +374,7 @@ static int git_tcp_connect(int fd[2], co
>  
>  	fd[0] = sockfd;
>  	fd[1] = sockfd;
> -	packet_write(sockfd, "%s %s\n", prog, path);
> +	packet_write(sockfd, "%s %s%c%s%c%s\n", prog, path, 0, host, 0, port);
>  	return 0;
>  }

Adding host like HTTP does with Host: header makes sense but I think the accept side can usually tell what the port it accepted the connection to is.

H. Peter Anvin· Jun 4, 2006, 23:10 UTC · re: Junio C Hamano · lore

Re: git daemon directory munging?

Junio C Hamano wrote:
Show 5 quoted lines
> 
> Adding host like HTTP does with Host: header makes sense but I
> think the accept side can usually tell what the port it accepted
> the connection to is.
> 

Yes, but that requires that each hostname has a separate IP address and/or port number (and SRV records in DNS, which not all platforms pay attention to.)

Now, if the hostname is passed in like this, it needs to be carefully canonicalized, and there needs to be provisions for wildcard matches.

	-hpa
H. Peter Anvin· Jun 4, 2006, 23:08 UTC · re: Linus Torvalds · lore

Re: git daemon directory munging?

Linus Torvalds wrote:
Show 9 quoted lines
> 
> On Sat, 3 Jun 2006, Jon Loeliger wrote:
>> <jdl> Thus, I'd use something like:
>>       --map-base=www.foo.com/pub/scm:/pub/foo/scm
>>       --map-base=www.bar.com/pub/scm=/pub/bar/scm
> 
> The bigger problem is that nothing actually passes in the hostname to 
> git-daemon in the first place. By the time the git-daemon is contacted, 
> the hostname is long gone ;(

Well, you can bind different git daemons to different IP addresses (IP-based vhosting) or different ports (with SRV records in DNS.)

Show 6 quoted lines
> Now, you can just extend the git protocol to just pass in the host too. 
> 
> You can in fact do this in a backwards-compatible manner (old git-daemons 
> will just ignore it, and new git daemons will automatically notice new 
> clients) with something evil like the appended.
> 
That's actually what was done to HTTP.
> Not tested (and this actualyl doesn't make the daemon _use_ the data, it 
> just adds a comment - the rest "is left as an exercise for the reader")
	-hpa

← back to recent threads