启动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文件中所述的任何其他指令。

关于如何实现的任何线索?

在此先多谢。


阿方索

最佳答案

我正是在自己的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 @是值的模板占位符)

这个想法是用一个自定义脚本cgit.cgi(这里是一个perl脚本,但是您可以使用任何其他脚本语言)cgit.pl 包装起来,它将:
  • 叫gitolite
  • 仅显示由gitolite授权的内容

  • 您可以看到完整的 cgit.pl script here

    这是您尝试访问特定存储库时的情况:

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

    这是当您在不使用 repo 的情况下调用cgit时:它应仅列出您有权查看的 repo 。
    为此,请调用本地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;
          }
        }
    

    09-03 22:02