Cgit中的访问控制

use*_*132 5 apache gitolite cgit

我想在启动cgit的cgi后向cgit引入访问控制.我们的想法是列出gitolite中可用的所有repos,但是根据用户身份验证启用/禁用目录列表.

在apache执行cgit cgi之前,我设法获得了访问控制:

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

  Options +ExecCGI
   Order allow,deny
   Allow from all
Run Code Online (Sandbox Code Playgroud)

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****
Run Code Online (Sandbox Code Playgroud)

但是我不知道如何在访问存储库路径时获得相同的效果,我尝试使用目录指令并在那里添加身份验证但是一旦启动了cgit,apache就不会应用http.conf文件中声明的任何其他指令.

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

非常感谢提前.

Br Alfonso.

Von*_*onC 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
Run Code Online (Sandbox Code Playgroud)

(@xx@ 是值的模板占位符)

这个想法是用自定义脚本包装cgit.cgicgit.pl(这里是 perl 脚本,但您可以使用您想要的任何其他脚本语言),这将:

  • 叫吉利石
  • 只显示gitolite授权的内容

cgit.pl您可以在此处查看完整的脚本。

这是当您尝试访问特定存储库时:

# 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
Run Code Online (Sandbox Code Playgroud)

这是当您在没有存储库的情况下调用 cgit 时:它应该仅列出您有权查看的存储库。
为此,调用 native cgit.cgi,然后过滤输出,删除与“被拒绝”存储库对应的任何行:

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");
  }
}
Run Code Online (Sandbox Code Playgroud)