2013-07-22 23 views
5

cgitのcgiが起動されたら、cgitへのアクセス制御を導入したいと思います。アイデアは、gitoliteで利用可能なすべてのreposをリストすることですが、ユーザ認証に基づいてディレクトリリストを有効/無効にします。Cgitのアクセス制御

私は、ApacheがCGITのCGI実行される前に、アクセス制御を得ることができた:

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**** 

をしかし、私はかつて同じ効果を得る方法がわかりませんリポジトリのパスにアクセスすると、私はディレクトリディレクティブで試してみましたが、そこに認証を追加しましたが、cgitが起動すると、apacheはhttp.confファイルに記述されている他のディレクティブを適用しません。

どのように達成するための手掛かりですか?

ありがとうございます。

br アルフォンソ

答えて

1

私は自分自身でそれを正確に行っています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 

アイデアがここにカスタムスクリプトcgit.pl(perlスクリプトでラップcgit.cgiにですが、あなたが望む任意の他のスクリプト言語を使用することができます(@ xxの@が値用のテンプレートのプレースホルダです) )、これます:

  • コールgitolite
  • だけgitolite
  • によって許可されている内容を表示

フルcgit.pl script hereが表示されます。

あなたが特定のレポにアクセスしようとしているとき、これは次のとおりです。あなたがレポなしCGITを呼び出しているとき

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"); 
    } 
} 

これがある:それはあなたが見ることが許可されているだけレポをリストする必要があります。

my $fname="$user.".timestamp().".tpl"; 
    system("@[email protected]/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; 
     } 
    } 
:そのために
、ネイティブ cgit.cgiを呼び出し、その後に対応する任意の行を削除し、出力をフィルタリングするレポを「拒否」