Контроль доступа в 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;
}
}