2009-05-05 26 views
12

Tôi đã cài đặt git và gitosis và tôi cần thêm kiểm tra xem tên người dùng có hợp lệ khi một thứ gì đó được đẩy vào kho lưu trữ hay không.Git/gitosis: Cách kiểm tra tính hợp lệ của tên người dùng và email?

Tôi nghĩ móc trước nhận là móc chính xác để đặt cái này, nhưng tôi không thể tìm thấy tên người dùng thực và địa chỉ email mà gitosis xâm nhập vào kho lưu trữ (những người được đặt bởi git config user.name và git config user.email) từ các biến môi trường. LOGNAME và USER đều là 'git'. Làm thế nào để gitosis phát hiện ra thông tin này và tôi có thể tìm thấy nó trong móc tiền nhận được không?

Trả lời

9

Hmm, từ những gì tôi thu thập từ githooks(5) móc pre-receive móc được cung cấp thông tin cập nhật được cập nhật trên stdin.

#!/bin/sh 

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

Bạn sẽ cần phải kiểm tra các địa chỉ email (có thể có nhiều hơn một dòng dữ liệu) và thoát khỏi kịch bản cho phù hợp, ví dụ: exit 0 cho sự thành công và ví dụ exit 1 vì lỗi.

+0

OK, đó thực sự trả lời câu hỏi của tôi, nhưng trên thực tế câu hỏi của tôi không phải là đúng một :(Những gì tôi thực sự cần phải thấy là Địa chỉ email gitosis sử dụng để khớp với khóa ssh Lý do: chúng tôi có hệ thống tự động xây dựng có quyền truy cập hạn chế. Mọi người đều có thể ghi vào kho lưu trữ (do đó truy cập gitosis không giúp được), nhưng chỉ một số được phép xây dựng. Giả sử tôi có quyền xây dựng. Người khác chỉ cần thay đổi địa chỉ email (người dùng cấu hình git).email) và tôi cũng được cấp quyền truy cập. Tôi sẽ cần phải kiểm tra địa chỉ email được sử dụng bởi gitosis để kiểm tra khóa ssh để ngăn chặn điều này. – Makis

+0

Tôi chưa bao giờ làm việc với gitosis vì vậy tôi không thể giúp bạn ở đó, xin lỗi. – Bombe

+0

Xin lỗi, tôi đã thử nghiệm và theo như tôi có thể nói, điều đó không hoạt động trước khi nhận, vì nhật ký chỉ giữ các sự kiện được cam kết. – Makis

1

Thêm os.environ [ 'WHATVER_USER'] = user tại ~ dòng 202 trong serve.py nên làm các trick ...

5

OK, chúng tôi quản lý để có được công việc làm, trả lời Bombe của trên đã giúp rất nhiều . Đây là cách thực hiện:

  • Tôi đã thêm os.environ ['GITOSIS_USER'] = người dùng vào Gitosis/Serve.py, chức năng Main() và cài đặt lại.
  • sau đó tôi đã tạo ra trước nhận kịch bản sau đây:

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; 

này có nghĩa là tên người dùng phải được giống như một trong những sử dụng để tạo phím ssh cho gitosis vòng chìa khóa.

2

Tập lệnh đó được chia theo nhiều cách. Đầu tiên, dòng open() bị cắt bỏ. Sau khi tôi khắc phục điều đó, kịch bản đã đi vào một vòng lặp vô hạn vào lần đầu tiên trong khi(), thậm chí không cố gắng gọi git-rev-list.

Với một chút giúp đỡ từ bạn bè của tôi, tôi quản lý để làm đẹp nó lên một chút:

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

Bạn có thể kiểm tra <gitosis-path>/.ssh/authorized_keys và xem:

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

đọc man cho sshd và thấy : sau command="command" bạn có thể thêm tùy chọn environment="NAME=value" để đặt tên người dùng mong muốn cho bạn các khóa ssh công khai. Và không cần chỉnh sửa Gitosis/Serve.py.

xử lý môi trường bị tắt theo mặc định và được kiểm soát thông qua PermitUserEnvironment tùy chọn:

sudo echo "PermitUserEnvironment yes" >> /etc/ssh/sshd_config 
Các vấn đề liên quan