2009-05-05 10 views
12

He instalado git y gitosis y necesito agregar una comprobación de que el nombre de usuario es válido cuando se inserta algo en el repositorio.Git/gitosis: ¿Cómo verificar la validez del nombre de usuario y el correo electrónico?

Creo que el gancho de pre-recepción es el gancho correcto para colocar esto, pero no puedo encontrar el nombre de usuario real y la dirección de correo electrónico que gitosis ingresa en el repositorio (los establecidos por git config user.name y git config user.email) desde variables de entorno. LOGNAME y USER son ambos 'git'. ¿Cómo detecta la gitosis esta información y puedo encontrarla en el gancho de pre-recepción también?

Respuesta

9

Hmm, por lo que deduzco de githooks(5) el gancho pre-receive se alimenta de las referencias actualizadas en stdin.

#!/bin/sh 

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

Usted tendría que comprobar las direcciones de correo electrónico (puede haber más de una línea de datos) y salir de la secuencia de comandos en consecuencia, es decir exit 0 para el éxito y, por ejemplo, exit 1 por falla.

+0

bien, que en realidad responde a mi pregunta, pero, de hecho, mi pregunta no era la correcta :(Lo que realmente necesito ver es la glosis de la dirección de correo electrónico coincide con la clave ssh. La razón: tenemos un sistema de autobuild que tiene acceso limitado. Todos pueden escribir en el repositorio (para que el acceso gitosis no ayude), pero solo algunos pueden construir. Supongamos que tengo permiso para compilar. Alguien más solo necesita cambiar la dirección de correo electrónico (git config user.correo electrónico) a la mía y se le concede acceso también. Tendría que verificar la dirección de correo electrónico utilizada por gitosis para verificar la clave ssh y evitar esto. – Makis

+0

Nunca he trabajado con gitosis, así que no puedo ayudarlo, lo siento. – Bombe

+0

Lo siento, probé y, por lo que puedo decir, eso no funciona en pre-recepción, ya que el registro solo contiene eventos comprometidos. – Makis

1

Adición os.environ [ 'WHATVER_USER'] = ~ usuario en la línea 202 en serve.py debe hacer el truco ...

5

bien, hemos conseguido hacer el trabajo, la respuesta de Bombe anterior ayudó mucho . Esto es cómo se ha hecho:

  • I añadió os.environ [ 'GITOSIS_USER'] = usuario Gitosis/Serve.py, la función main() y reinstalado.
  • Entonces creé el siguiente pre-recepción de la escritura:

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; 

Esto significa que el nombre de usuario tiene que ser el mismo que el utilizado para crear la clave ssh para el llavero gitosis.

2

Ese script se ha roto de varias formas. Primero, la línea abierta() se corta. Después de arreglar eso, el script entró en un ciclo infinito en el primer while(), sin siquiera intentar llamar a git-rev-list.

Con un poco de ayuda de mis amigos, he conseguido arreglarlo un poco:

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

Puede comprobar <gitosis-path>/.ssh/authorized_keys y ver:

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

Leer hombre por sshd y encontrado : después de command="command" puede agregar la opción environment="NAME=value" para establecer los nombres de usuario deseados para sus claves públicas ssh. Y no se requiere edición de Gitosis/Serve.py.

procesamiento de Medio Ambiente está desactivada por defecto y se controla a través de la opción PermitUserEnvironment:

sudo echo "PermitUserEnvironment yes" >> /etc/ssh/sshd_config 
Cuestiones relacionadas