2009-05-05 7 views
12

Ho installato git e gitosis e devo aggiungere un controllo per verificare che il nome utente sia valido quando qualcosa viene inserito nel repository.Git/gitosi: come verificare la validità del nome utente e dell'email?

Suppongo che il gancio di pre-ricezione sia l'hook corretto per posizionarlo, ma non riesco a trovare il vero nome utente e l'indirizzo e-mail che gitosis entra nel repository (quelli impostati da git config user.name e git config user.email) dalle variabili di ambiente. LOGNAME e USER sono entrambi 'git'. Come fa la gitosi a rilevare queste informazioni e posso trovarla anche nel gancio di pre-ricezione?

risposta

9

Hmm, da quello che ho raccolto da githooks(5) il gancio pre-receive viene aggiornato con i riferimenti aggiornati su stdin.

#!/bin/sh 

while read old new name; do 
    email=$(git log -1 --pretty=format:%ae $new) 
    # check email 
done 

Si avrebbe bisogno di controllare gli indirizzi e-mail (non ci possono essere più di una riga di dati) e uscire dallo script di conseguenza, vale a dire exit 0 per il successo e per esempio exit 1 per errore.

+0

OK, che risponde in realtà la mia domanda, ma in realtà la mia domanda non era quella giusta :(Che cosa ho veramente bisogno di vedere è l'indirizzo email che gitosis utilizza per abbinare la chiave ssh Il motivo: abbiamo un sistema autobuild che ha accesso limitato.Tutti possono scrivere sul repository (quindi l'accesso gitosis non aiuta), ma solo alcuni sono autorizzati a costruire Supponiamo di avere il permesso di compilare. Qualcun altro ha solo bisogno di cambiare l'indirizzo email (git config user.email) al mio e gli viene concesso anche l'accesso. Avrei bisogno di controllare l'indirizzo email usato da gitosis per controllare la chiave ssh per impedirlo. – Makis

+0

Non ho mai lavorato con la gitosi, quindi non posso aiutarti, mi dispiace. – Bombe

+0

Mi spiace, ho provato e per quanto posso dire, non funziona in pre-ricezione, dal momento che il registro contiene solo eventi commessi. – Makis

1

Aggiunta os.environ [ 'WHATVER_USER'] = utente a ~ linea 202 in serve.py dovrebbe fare il trucco ...

5

OK, siamo riusciti a ottenere il lavoro fatto, la risposta di Bombe sopra ha aiutato molto . Questo è come è stato fatto:

  • ho aggiunto os.environ [ 'GITOSIS_USER'] = utente a Gitosis/Serve.py, funzione main() e reinstallato.
  • Ho quindi creato il seguente-ricezione pre script:

hooks/pre-receive

#!/usr/bin/perl 

my $user = $ENV{'GITOSIS_USER'}; 

if ($user !~ m/^[^@][email protected][^@]+$/) { 
    print STDERR "Unknown user. Not running under Gitosis?\n"; 
    exit 1; 
} 

my $fail = 0; 

while(<STDIN>) { 
    if (m/^([0-9a-f]+)\s+([0-9a-f]+)\s+(\S+)$/) { 

    my $oldver = $1; 
    my $curver = $2; 
    my $ref = $3; 

    my $ret = open (FH, "-|", "git", "rev-list", '--pretty=format:%H:%ae:%ce',$ 

    if ($ret) { 
     # great and less brakets hidden in HTML: &gt;FH&lt; 
     while (<FH>) { 
     chomp; 
     my $line = $_; 
     if ($_ !~ m/commit /) { 
      my ($rev, $author, $committer) = split(":", $line); 
      if ($author ne $user && $committer ne $user) { 
      print STDERR "Unauthorized commit: $rev\n"; 
      $fail++; 
      } 
     } 
     } 
    } 
    } 
} 

if ($fail) { 
    exit 1; 
} 

exit 0; 

Questo significa il nome utente deve essere la stessa di quella utilizzata per creare la chiave SSH per portachiavi gitosis.

2

Questo script è rotto in diversi modi. Innanzitutto, la linea open() viene interrotta. Dopo averlo risolto, lo script è entrato in un loop infinito al primo while(), non tentando nemmeno di chiamare git-rev-list.

Con un piccolo aiuto dai miei amici, sono riuscito a abete rosso in su un po ':

hooks/pre-receive

#!/usr/bin/perl 

my $user = $ENV{'GITOSIS_USER'}; 

if ($user !~ m/^[^@][email protected][^@]+$/) { 
    print STDERR "Unknown user. Not running under Gitosis?\n"; 
    exit 1; 
} 

my $fail = 0; 

while(<STDIN>) { 
    if (m/^([0-9a-f]+)\s+([0-9a-f]+)\s+(\S+)$/) { 

    my $oldver = $1; 
    my $curver = $2; 
    my $ref = $3; 

    my $ret = open (FH, "-|", "git", "rev-list", '-- pretty=format:%H:%ae:%ce',"$oldver..$curver"); 

    if ($ret) { 
     while (<FH>) { 
     chomp; 
     my $line = $_; 
     if ($_ !~ m/commit /) { 
      my ($rev, $author, $committer) = split(":", $line); 
      if ($author ne $user && $committer ne $user) { 
      print STDERR "Unauthorized commit: $rev\n"; 
      print STDERR "You must specify Author and Committer.\n"; 
      print STDERR "Specified a/c: $author/$committer\n"; 
      print STDERR "Expected user: $user\n"; 
      $fail++; 
      } 
     } 
     } 
    } 
    } 
} 

if ($fail) { 
    exit 1; 
} 

exit 0; 

0

È possibile controllare <gitosis-path>/.ssh/authorized_keys e vedere:

command="gitosis-serve [email protected]",... 

Leggi l'uomo per sshd e trovato : dopo command="command" è possibile aggiungere l'opzione environment="NAME=value" per impostare i nomi utente desiderati per le proprie chiavi ssh pubbliche. E nessuna modifica Gitosis/Serve.py richiesta.

elaborazione Ambiente è disabilitata per default ed è controllata tramite l'opzione PermitUserEnvironment:

sudo echo "PermitUserEnvironment yes" >> /etc/ssh/sshd_config 
Problemi correlati