2009-05-05 3 views
12

나는 git와 gitosis를 설치했고 저장소에 푸시 된 항목이있을 때 사용자 이름이 유효한지 확인해야한다.Git/gitosis : 사용자 이름과 이메일의 유효성을 확인하는 방법?

나는 이것을 수신하기위한 올바른 후크라고 생각하지만 gitosis가 git config user.name으로 설정 한 실제 사용자 이름과 전자 메일 주소를 찾을 수 없습니다. git config user.email)을 환경 변수에서 삭제합니다. LOGNAME과 USER는 모두 '자식'입니다. gitosis는이 정보를 어떻게 감지하며 pre-receive hook에서도 찾을 수 있습니까?

답변

9

흠, 내가 수집 한 것에서 githooks(5)pre-receive 후크는 stdin에 업데이트 된 심판을 먹이로받습니다.

#!/bin/sh 

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

당신은 이메일 주소를 확인해야합니다 (이있을 수 있습니다 더 많은 데이터를 한 줄 이상) 즉 exit 0 성공하고, 예를 들어, 그에 따라 스크립트를 종료 실패의 경우 exit 1 os.environ 추가

+0

확인, 사실은 내 질문에 대답 있지만, 사실은 내 질문에 올바른 아니었다 :(내가 정말 볼 필요가 무엇 gitosis가 ssh 키와 일치시키기 위해 사용하는 이메일 주소 제한된 액세스 권한을 가진 자동 빌드 시스템이 있습니다. 모든 사람이 저장소에 쓸 수 있기 때문에 (gitosis 액세스가 도움이되지 않습니다), 일부만 빌드 할 수 있습니다. 빌드 권한이 있다고 가정 해 봅시다. 누군가 다른 사람이 이메일 주소 (git config 사용자) 만 변경하면됩니다.이메일)을 보내면 액세스 권한도 부여됩니다. 나는 이것을 방지하기 위해 ssh 키를 검사하기 위해 gitosis가 사용하는 전자 메일 주소를 확인해야 할 것입니다. – 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() 줄이 잘립니다. 이 스크립트를 수정 한 후 스크립트는 git-rev-list를 호출하지 않고 while()에서 무한 루프로 들어갔다.

    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 
    
    관련 문제