Skip to content

gitweb mit Passwortschutz

gitweb ist, wie vorgestern beschrieben, eine schöne Sache - aber nicht immer will man seine Repositories jedermann zugänglich machen. Schön wäre es doch, wenn man die Möglichkeit hätte, auch den Zugriff auf gitweb an eine Anmeldung zu koppeln und so nur für befugte Benutzer zu erlauben. Eine Möglichkeit dazu will ich nachstehend schildern, orientiert an einem Beitrag im Blog von Leho Kraav.

Weitere, vielleicht hilfreiche Anregungen dazu kann man ergoogeln, bspw.

u.a.

Voraussetzung dafür ist eine ausreichend neue Version von gitweb; die in Debian Lenny verfügbare Version 1.5.6.5 genügt nicht. Sie kann allerdings gepatcht werden (die Änderung ist minimal):

--- /usr/lib/cgi-bin/gitweb.cgi.OLD 2010-01-14 16:49:44.000000000 +0100
+++ /usr/lib/cgi-bin/gitweb.cgi     2010-01-15 15:30:40.975350737 +0100
@@ -86,6 +86,11 @@
 # (only effective if this variable evaluates to true)
 our $export_ok = "";

+# show repository only if this subroutine returns true
+# when given the path to the project, for example:
+#    sub { return -e "$_[0]/git-daemon-export-ok"; }
+our $export_auth_hook = undef;
+
 # only allow viewing of repositories also shown on the overview page
 our $strict_export = "";

@@ -353,7 +358,8 @@
 sub check_export_ok {
        my ($dir) = @_;
        return (check_head_link($dir) &&
-               (!$export_ok || -e "$dir/$export_ok"));
+               (!$export_ok || -e "$dir/$export_ok") &&
+                (!$export_auth_hook || $export_auth_hook->($dir)));
 }

 # process alternate names for backward compatibility

Das vorausgesetzt, genügt es, die gitweb.conf folgendermaßen zu erweitern:

# HTTP Basic Auth
$gitosis_conf = '/home/gitosis/.gitosis.conf';
$username = $cgi->remote_user;
$export_auth_hook = sub {
  my $projectdir = shift;
  if($projectdir =~ (/(.*?)\.git/)) {
    #my $projectname = basename($1);
    my $projectname = $1;
    $projectname =~ s/$projectroot\/?//;
    open FILE, $gitosis_conf or die 'Could not open gitosis config file. Please make sure that $gitosis_conf is set properly';
    my $project_match = 0;
    my $user_match = 0;
    while(<FILE>) {
      if($_ =~ /^\s*members\s*\=\s*(?:.*?\s)*$username(?:\s+|$)/) {$user_match = 1;}
      if($_ =~ /^\s*(read|writ)able\s*\=\s*(?:.*?\s)*$projectname(?:\s+|$)/) {$project_match = 1;}
      if($project_match && $user_match) {
         return 1;
      }
      if($_ =~ /\[group/) {
          $project_match = $user_match = 0;
      }
    }
  }
  return 0;
};

Dann muß noch die Apache-Konfiguration passend erweitert werden, um HTTP-Basic-Authentication für das entsprechende Verzeichnis zu machen:

<Location />
    AuthType Basic
    AuthName "git.host.example"
    AuthUserFile /home/gitosis/gitosis/ht.passwd
    Require valid-user
</Location>

Pfade müssen, wie üblich, entsprechend angepaßt werden.

Und schließlich müssen für die in der gitosis.conf definierten Benutzer - jedenfalls diejenigen, die auch Webzugriff haben sollen - Paßworte in der /home/gitosis/gitosis/ht.passwd angelegt werden. Dazu wird wie gewohnt htpasswd bzw. htpasswd2 aufgerufen.

Voilá!

Trackbacks

Keine Trackbacks

Kommentare

Ansicht der Kommentare: Linear | Verschachtelt

Noch keine Kommentare

Kommentar schreiben

HTML-Tags werden in ihre Entities umgewandelt.
Markdown-Formatierung erlaubt
Standard-Text Smilies wie :-) und ;-) werden zu Bildern konvertiert.
BBCode-Formatierung erlaubt
Gravatar, Identicon/Ycon Autoren-Bilder werden unterstützt.
Formular-Optionen