2009-05-05 11 views
12

gitとgitosisがインストールされていて、何かがリポジトリにプッシュされたときにユーザー名が有効であるというチェックを追加する必要があります。Git/gitosis:ユーザー名と電子メールの有効性を確認する方法は?

私はpre-receiveフックがこれを配置する正しいフックだと思っていますが、gitosisがgit config user.nameで設定した実際のユーザー名と電子メールアドレスを見つけることができません。 git config user.email)を環境変数から削除します。 LOGNAMEとUSERはどちらも 'git'です。 gitosisはこの情報をどのように検出し、pre-receiveフックでもそれを見つけることができますか?

答えて

9

ええと、私はgithooks(5)から集めたものからpre-receiveフックにstdinという更新されたリファレンスが送られます。あなたが成功すると、例えばのための電子メールアドレスを確認してください(データの複数の行が存在することができる)し、それに応じてスクリプトを終了、すなわちexit 0する必要があるだろう

#!/bin/sh 

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

失敗の場合はexit 1です。 os.environを追加

+0

OK、実際に私の質問に答えるが、実際に私の質問は正しいものではなかった:(私は本当に見に必要なものgitosisの電子メールアドレスはsshキーと一致するために使用されます理由:私たちはアクセスが制限された自動ビルドシステムを持っているので、誰でもリポジトリに書き込むことができます(gitosisアクセスは役に立ちません)。ビルドの許可があると仮定しましょう。誰かが電子メールアドレスを変更する必要があるだけです(git configユーザー。電子メール)を受け取ると、彼にもアクセス権が与えられます。これを防ぐためにgitosisが使用する電子メールアドレスをチェックしてsshキーをチェックする必要があります。 – Makis

+0

私はgitosisで働いたことがないので、お手伝いできません。申し訳ありません。 – Bombe

+0

申し訳ありませんが、テストしたところでは、ログにはコミットされたイベントしか保持されていないため、事前受信では動作しません。 – Makis

1

[「WHATVER_USER」] =トリックを行う必要がありますserve.pyでライン202 ...

5

OK、我々は仕事を得るために管理〜のユーザ、上記ボムの回答はたくさん助け。

  • Gitosis/Serve.py関数main()にos.environ ['GITOSIS_USER'] = userを追加して再インストールしました。

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; 

これは、ユーザー名が使ってgitosisキーリングのSSHキーを作成するために使用したものと同じである必要があります意味:

  • は、私はその後、次の事前受け取るスクリプトを作成しました。

  • 2

    このスクリプトはいくつかの点で壊れています。まず、open()行を切り捨てます。私はそれを修正した後、スクリプトは最初のwhile()では無限ループに入り、git-rev-listを呼び出すことさえしませんでした。

    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

    あなたは<gitosis-path>/.ssh/authorized_keysをチェックして見ることができます:私の友人から少し助けを借りて

    は、私は少しそれを美化するために管理

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

    読む男sshd見つかったため:command="command"の後に、environment="NAME=value"オプションを追加して、パブリックsshキーの希望するユーザー名を設定することができます。編集する必要はありません。Gitosis/Serve.py

    環境処理はデフォルトで無効になっており、PermitUserEnvironmentオプションを介して制御されます。

    sudo echo "PermitUserEnvironment yes" >> /etc/ssh/sshd_config 
    
    関連する問題