Показывать только репозитории в gitweb, к которым у пользователя есть доступ через Gitolite

У меня есть настройка gitolite и работа с аутентификацией на основе ключа SSH. Я могу контролировать доступ к репозиториям через репозиторий gitolite-admin.git и файл conf. Все это прекрасно работает через SSH, но я хотел бы использовать GitWeb для быстрого просмотра репозиториев.

GitWeb теперь отлично работает, но показывает все репозитории через веб-интерфейс. Итак, моя цель здесь:

  • Аутентифицируйте пользователей в apache2 через PAM, у меня уже есть сервер Ubuntu, аутентифицирующий AD, и все пользователи доступны. Это не должно быть проблемой.
  • Используйте имя пользователя, вошедшего в систему, с правами проверки gitolite.
  • Отображать соответствующие REPOS в веб-интерфейсе.

У кого-нибудь есть отправная точка для этого? Часть Apache не должна быть сложной, и я настрою ее для аутентификации всех URL-адресов /gitweb/. Я не знаю, как передать это имя пользователя и авторизовать его против gitolite. Любые идеи?

Спасибо,

Натан


person nat45928    schedule 11.08.2014    source источник


Ответы (1)


Да, это возможно, но вам нужно выполнить скрипты конфигурации gitweb, чтобы вызвать gitolite.

Ключ находится в gitweb_config.perl: если этот файл существует, gitweb включит и вызовет его.
См. мой gitweb/gitweb_config.perl файл:

our $home_link_str = "ITSVC projects";
our $site_name = "ITSVC Gitweb";
use lib (".");
require "gitweb.conf.pl";

В gitweb/gitweb.conf.pl (пользовательский скрипт) я определяю официальная функция обратного вызова, вызываемая gitweb: export_auth_hook: эта функция вызовет gitolite.

use Gitolite::Common;
use Gitolite::Conf::Load;
#$ENV{GL_USER} = $cgi->remote_user || "gitweb";

$export_auth_hook = sub {
  my $repo = shift;
  my $user = $ENV{GL_USER};
  # gitweb passes us the full repo path; so we strip the beginning
  # and the end, to get the repo name as it is specified in gitolite conf
  return unless $repo =~ s/^\Q$projectroot\E\/?(.+)\.git$/$1/;

  # check for (at least) "R" permission
  my $ret = &access( $repo, $user, 'R', 'any' );
  my $res = $ret !~ /DENIED/;

  return ($ret !~ /DENIED/);
};

Из комментариев:

GL_USER устанавливается из-за строки:

$ENV{GL_USER} = $cgi->remote_user || "gitweb";

$cgi->remote_user выберет среду, REMOTE_USER установленную любым модулем аутентификации Apache, завершившим аутентификацию (например, в этом Файл конфигурации Apache).
Вы можете распечатать его со строкой "умереть".

«Не удалось найти Gitolite/Rc.pm» означает, что переменная INC, используемая perl, не содержит $ENV{GL_LIBDIR}; (установите значение ~/gitolite/lib или <any_place_where_gitolite_was_installed>/lib).
Вот почему существует строка в том же файле gitweb/gitweb.conf.pl, который добавляет это к INC:

unshift @INC, $ENV{GL_LIBDIR};
use lib $ENV{GL_LIBDIR};
use Gitolite::Rc;

Изменить из Nat45928: в моем случае мне нужно было вставить свой домашний путь во все записи «@H@». Это сразу решило все мои проблемы.

person VonC    schedule 11.08.2014
comment
Хорошо, я думаю, что следую за всем этим. Откуда GitWeb знает начальное имя пользователя, с которого все это нужно начинать? - person nat45928; 11.08.2014
comment
@nat45928 из-за строки $ENV{GL_USER} = $cgi->remote_user || "gitweb";: аутентификация должна выполняться Apache перед вызовом gitweb: см. #L99-L134" rel="nofollow noreferrer">github.com/VonC/compileEverything/blob/: последняя строка вызывает gitweb DirectoryIndex gitweb.cgi. - person VonC; 11.08.2014
comment
Ах хорошо. И $cgi-›remote_user извлекает информацию из настройки сеанса Apache2 с записью формы AuthType? Итак, можно использовать любой тип мода Apache Auth? Спасибо за помощь! - person nat45928; 11.08.2014
comment
@nat45928 да, если этот мод аутентификации (http://httpd.apache.org/docs/current/howto/auth.html) установил переменную $REMOTE_USER. - person VonC; 11.08.2014
comment
переменная $REMOTE_USER — это $cgi-›remote_user? Есть ли способ узнать, установлено ли это? - person nat45928; 11.08.2014
comment
@ nat45928 да, $cgi->remote_user будет иметь содержимое $REMOTE_USER. Обычно я устанавливаю несколько строк отладки для проверки его содержимого, как в github.com/VonC/compileEverything/blob/ - person VonC; 11.08.2014
comment
Потрясающий. Я собираюсь попробовать, начиная с базовой аутентификации в apache2. Отмечу как ответ, если все получится. - person nat45928; 11.08.2014
comment
Бросил a Не удалось найти Gitolite/Rc.pm, похоже, файл gitolite RC. Похоже, use Gitolite::RC; — это строка, которая все испортила. любые идеи о том, как связать их? - person nat45928; 11.08.2014
comment
@ nat45928 какую версию гитолита вы используете? - person VonC; 12.08.2014
comment
@nat45928 обратите внимание, что такие источники, как Gitolite/Rc.pm, известны из-за строки unshift @INC, $ENV{GL_LIBDIR};, которая добавляет к переменной PERL @INC путь к perl-скриптам библиотеки Gitolite. - person VonC; 12.08.2014
comment
Давайте продолжим обсуждение в чате. - person nat45928; 12.08.2014
comment
@nat45928 Извини, я лег спать незадолго до твоего приглашения в чат. - person VonC; 12.08.2014
comment
@ nat45928 да, скрипты, на которые я ссылаюсь, не предназначены для использования как есть. Любые @H@ являются шаблонами, которые необходимо заменить фактическими значениями. - person VonC; 12.08.2014
comment
Да, это то, что меня сбило с толку. Я подумал, что это странно, но я никогда не видел эту запись. Но в остальном ваши скрипты работали безупречно. Намного проще, чем я себе это представлял. Еще раз спасибо! - person nat45928; 12.08.2014