2013-07-22 31 views
5

Tôi muốn giới thiệu kiểm soát truy cập vào cgit khi cgi của cgit đã được khởi chạy. Ý tưởng sẽ là liệt kê tất cả các repos có sẵn trong gitolite nhưng cho phép/vô hiệu hóa danh sách thư mục dựa trên xác thực người dùng.Kiểm soát truy cập trong Cgit

tôi quản lý để có được kiểm soát truy cập trước apache đang thực hiện các cgi cgit:

AllowOverride None 
AuthType Basic 
AuthName "Restricted Files" 
AuthUserFile /var/lib/git_alfonso/passwords 

    Options +ExecCGI 
    Order allow,deny 
    Allow from all 

Alias /cgit.png /var/www/htdocs/cgit/cgit.png 
Alias /cgit.css /var/www/htdocs/cgit/cgit.css 
ScriptAlias /cgit "/var/www/htdocs/cgit/cgit.cgi" 
RewriteRule ^$/[R] 
RewriteRule ^/(.*)$ /cgit.cgi/$1**** 

Nhưng tôi không biết làm thế nào để có được những tác dụng tương tự khi kho lưu trữ đường dẫn được truy cập, tôi đã thử với chỉ thị thư mục và thêm xác thực có nhưng một khi cgit được khởi chạy apache không áp dụng bất kỳ chỉ thị khác được nêu trong tập tin http.conf.

Bất kỳ đầu mối nào về cách đạt được điều đó?

Cảm ơn rất nhiều trước.

Br Alfonso.

Trả lời

1

Tôi đã làm chính xác điều đó trong riêng mình cgit config.

# CGit on @[email protected] 
Listen @[email protected] 
<VirtualHost @[email protected]:@[email protected]> 
ServerName @[email protected] 
ServerAlias @[email protected] 
SetEnv GIT_HTTP_BACKEND "@[email protected]/usr/local/apps/git/libexec/git-core/git-http-backend" 
DocumentRoot @[email protected]/cgit 
Alias /cgit @[email protected]/cgit 
<Directory @[email protected]/cgit> 
    SetEnv [email protected]@/repositories 
    AddHandler cgi-script .cgi .pl 
    DirectoryIndex cgit.pl 

(Các @ xx @ là placeholder mẫu cho các giá trị)

Ý tưởng là để bọc cgit.cgi với một kịch bản tùy chỉnh cgit.pl (ở đây một kịch bản perl nhưng bạn có thể sử dụng bất kỳ ngôn ngữ kịch bản khác mà bạn muốn), trong đó sẽ:

  • gitolite gọi
  • chỉ hiển thị những gì được ủy quyền của gitolite

Bạn có thể xem toàn bộ cgit.pl script here.

Đây là khi bạn đang cố gắng truy cập vào một repo cụ thể:

if ($request_uri ne "/cgit/" && $request_uri ne "/cgit/cgit.pl/") { 
    (my $repo)=($path_info =~ /\/([^\/]+)/); 
    my $perm = "R"; 
    if ($repo ne "") { 
    my $aperm = access($repo, $user, 'R', 'any'); 
    # my ($aperm, $creator) = &repo_rights($repo); 
    $perm=$aperm; 
    } 
    if ($perm !~ /DENIED/) { 
    system("@[email protected]/cgit/cgit.cgi"); 
    } 
} 

Đây là khi bạn đang gọi cgit mà không có một repo: nó nên liệt kê chỉ Repos bạn được phép xem.
Cho rằng, gọi mẹ đẻ cgit.cgi, và sau đó lọc đầu ra, loại bỏ bất kỳ dòng tương ứng với một "từ chối" repo:

my $fname="$user.".timestamp().".tpl"; 
    system("@H@/cgit/cgit.cgi > $fname"); 
    open(INFO, $fname); # Open the file 
    @lines = <INFO>; # Read it into an array 
    close(INFO); 
    unlink($fname); 
    pop(@lines); 
    foreach (@lines) { 
     my $line=$_; 
     (my $repo)=($line =~ /title='([^']+)'/); #' 
     my $perm = "R"; 
     if ($repo ne "") { 
     my $aperm = access($repo, $user, 'R', 'any'); 
     # my ($aperm, $creator) = &repo_rights($repo); 
     $perm=$aperm; 
     } 
     if ($perm !~ /DENIED/) { 
     print $line; 
     } 
    }