6

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

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 ファイルに記載されている他のディレクティブを適用しません。 .

それを達成する方法の手がかりはありますか?

よろしくお願いします。

アルフォンソ君。

4

1 に答える 1

1

私は自分のcgit configでそれを正確に行いました。

# CGit on @PORT_HTTP_CGIT@
Listen @PORT_HTTP_CGIT@
<VirtualHost @FQN@:@PORT_HTTP_CGIT@>
ServerName @FQN@
ServerAlias @HOSTNAME@
SetEnv GIT_HTTP_BACKEND "@H@/usr/local/apps/git/libexec/git-core/git-http-backend"
DocumentRoot @H@/cgit
Alias /cgit @H@/cgit
<Directory @H@/cgit>
  SetEnv GIT_PROJECT_ROOT=@H@/repositories
  AddHandler cgi-script .cgi .pl
  DirectoryIndex cgit.pl

(@xx@ は、値のテンプレート プレースホルダーです)

アイデアは、カスタム スクリプト(ここでは perl スクリプトですが、必要な他のスクリプト言語を使用できます) でラップすることです。これにより、次のことが可能になります。cgit.cgicgit.pl

  • コールギトライト
  • gitolite によって許可されたもののみを表示する

cgit.plここで完全なスクリプトを見ることができます。

これは、特定のレポにアクセスしようとしている場合です。

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("@H@/cgit/cgit.cgi");
  }
}

これは、レポなしで cgit を呼び出している場合です。表示を許可されているレポのみをリストする必要があります。
そのためには、ネイティブを呼び出してcgit.cgiから出力をフィルタリングし、「拒否された」レポに対応する行を削除します。

    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;
      }
    }
于 2013-07-22T08:40:11.300 に答える