Контроль доступа в Cgit

Я хотел бы ввести контроль доступа к 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,

Любая подсказка о том, как этого добиться?

Заранее большое спасибо.

Бр Альфонсо.

1 ответ

Я сделал именно это в моем собственном конфиге cgit.

# 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 с пользовательским сценарием cgit.pl (здесь скрипт perl, но вы можете использовать любой другой язык сценариев):

  • называть гитолит
  • отображать только то, что разрешено 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;
      }
    }
Другие вопросы по тегам