2009-05-05 9 views
12

J'ai installé git et gitosis et j'ai besoin d'ajouter une vérification que le nom d'utilisateur est valide quand quelque chose est poussé dans le dépôt. Je pense que le crochet de pré-réception est le bon crochet pour le placer, mais je n'arrive pas à trouver le vrai nom d'utilisateur et l'adresse e-mail que gitosis entre dans le dépôt (ceux définis par git config user.name et git config user.email) à partir de variables d'environnement. LOGNAME et USER sont tous deux «git». Comment la gitose détecte-t-elle cette information et puis-je la trouver dans le crochet de pré-réception?Git/gitose: Comment vérifier la validité du nom d'utilisateur et du courrier électronique?

Répondre

9

Hmm, à partir de ce que je comprends de githooks(5) le crochet pre-receive est nourri les refs mis à jour sur stdin.

#!/bin/sh 

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

Vous devrez vérifier les adresses e-mail (il peut y avoir plus d'une ligne de données) et quitter le script en conséquence, à savoir exit 0 pour le succès et, par exemple exit 1 pour l'échec.

+0

OK, qui répond à ma question, mais en fait, ma question n'a pas été le bon :(Ce que je vraiment besoin de voir est l'adresse e-mail utilisée par gitosis pour faire correspondre la clé ssh.La raison: nous avons un système autobuild qui a un accès limité.Tout le monde peut écrire dans le dépôt (donc l'accès à la gitose n'aide pas), mais seulement quelques-uns sont autorisés à construire. Supposons que j'ai la permission de construire, quelqu'un d'autre n'a besoin que de changer l'adresse e-mail (utilisateur git config).email) à la mine et il a également accès. J'aurais besoin de vérifier l'adresse e-mail utilisée par gitosis pour vérifier la clé ssh pour éviter cela. – Makis

+0

Je n'ai jamais travaillé avec la gitose alors je ne peux pas vous aider, désolé. – Bombe

+0

Désolé, j'ai testé et pour autant que je sache, cela ne fonctionne pas en pré-réception, car le journal ne contient que des événements validés. – Makis

1

Ajout os.environ [ 'WHATVER_USER'] = utilisateur à ~ ligne 202 serve.py devrait faire l'affaire ...

5

OK, nous avons réussi à faire le travail, la réponse ci-dessus a aidé Bombe beaucoup . Voici comment cela a été fait:

  • I ajouté os.environ [ 'GITOSIS_USER'] = utilisateur Gitosis/Serve.py, la fonction principale() et réinstallée.
  • J'ai ensuite créé le script de pré-réception suivant:

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; 

Cela signifie que le nom d'utilisateur doit être le même que celui utilisé pour créer la clé ssh pour gitosis porte-clés.

2

Ce script est cassé de plusieurs façons. D'abord, la ligne open() est coupée. Après avoir corrigé cela, le script est entré dans une boucle infinie le premier while(), ne tentant même pas d'appeler git-rev-list.

Avec un peu d'aide de mes amis, je l'ai réussi à embellir un peu:

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

Vous pouvez vérifier <gitosis-path>/.ssh/authorized_keys voir:

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

homme Lire pour sshd et trouvé : après command="command" vous pouvez ajouter l'option environment="NAME=value" pour définir les noms d'utilisateur souhaités pour vos clés publiques ssh. Et aucune modification Gitosis/Serve.py requise.

traitement environnement est désactivé par défaut et est contrôlé par l'option PermitUserEnvironment:

sudo echo "PermitUserEnvironment yes" >> /etc/ssh/sshd_config 
Questions connexes