Git/gitosis: Как проверить правильность имени пользователя и электронной почты?
Я установил git и gitosis, и мне нужно добавить проверку, что имя пользователя действительно, когда что-то помещено в репозиторий.
Я считаю, что крюк pre-receive - правильный крючок, чтобы разместить это, но я не могу найти настоящее имя пользователя и адрес электронной почты, которые gitosis входит в репозиторий (те, которые установлены git config user.name и git config user.email) из переменных среды. LOGNAME и USER являются "git". Как гитоз обнаруживает эту информацию, и могу ли я найти ее и в пред-приемном крюке?
Ответы
Ответ 1
Хмм, из того, что я собираю из githooks(5)
, хук pre-receive
получает обновленные refs на stdin
.
#!/bin/sh
while read old new name; do
email=$(git log -1 --pretty=format:%ae $new)
# check email
done
Вам нужно будет проверить адреса электронной почты (может быть более одной строки данных) и выйти из script соответственно, т.е. exit 0
для успеха и, например, exit 1
для отказа.
Ответ 2
ОК, нам удалось выполнить задание, ответ Бомбе выше помог много. Вот как это было сделано:
- Я добавил os.environ ['GITOSIS_USER'] = пользователь в Gitosis/Serve.py, функцию Main() и переустановил его.
- Затем я создал следующий pre-receive script:
hooks/pre-receive
#!/usr/bin/perl
my $user = $ENV{'GITOSIS_USER'};
if ($user !~ m/^[^@][email protected][^@]+$/ ) {
print STDERR "Unknown user. Not running under Gitosis?\n";
exit 1;
}
my $fail = 0;
while(<STDIN>) {
if (m/^([0-9a-f]+)\s+([0-9a-f]+)\s+(\S+)$/) {
my $oldver = $1;
my $curver = $2;
my $ref = $3;
my $ret = open (FH, "-|", "git", "rev-list", '--pretty=format:%H:%ae:%ce',$
if ($ret) {
# great and less brakets hidden in HTML: >FH<
while (<FH>) {
chomp;
my $line = $_;
if ($_ !~ m/commit /) {
my ($rev, $author, $committer) = split(":", $line);
if ( $author ne $user && $committer ne $user ) {
print STDERR "Unauthorized commit: $rev\n";
$fail++;
}
}
}
}
}
}
if ($fail) {
exit 1;
}
exit 0;
код >
Это означает, что имя пользователя должно быть таким же, как и имя, используемое для создания ключа ssh для ключевого кольца gitosis.
Ответ 3
Этот script разбит несколькими способами. Во-первых, линия open() отключается. После того, как я исправил это, script перешел в бесконечный цикл в первом while(), даже не попытавшись вызвать git -rev-list.
С небольшой помощью от моих друзей мне удалось немного подтянуть его:
hooks/pre-receive
#!/usr/bin/perl
my $user = $ENV{'GITOSIS_USER'};
if ($user !~ m/^[^@][email protected][^@]+$/ ) {
print STDERR "Unknown user. Not running under Gitosis?\n";
exit 1;
}
my $fail = 0;
while(<STDIN>) {
if (m/^([0-9a-f]+)\s+([0-9a-f]+)\s+(\S+)$/) {
my $oldver = $1;
my $curver = $2;
my $ref = $3;
my $ret = open (FH, "-|", "git", "rev-list", '-- pretty=format:%H:%ae:%ce',"$oldver..$curver");
if ($ret) {
while (<FH>) {
chomp;
my $line = $_;
if ($_ !~ m/commit /) {
my ($rev, $author, $committer) = split(":", $line);
if ( $author ne $user && $committer ne $user ) {
print STDERR "Unauthorized commit: $rev\n";
print STDERR "You must specify Author and Committer.\n";
print STDERR "Specified a/c: $author / $committer\n";
print STDERR "Expected user: $user\n";
$fail++;
}
}
}
}
}
}
if ($fail) {
exit 1;
}
exit 0;
код >
Ответ 4
Добавление os.environ ['WHATVER_USER'] = пользователь в ~ строке 202 в serve.py должен делать трюк...
Ответ 5
Вы можете проверить <gitosis-path>/.ssh/authorized_keys
и посмотреть:
command="gitosis-serve [email protected]",...
Прочитайте man для sshd
и найдите: после command="command"
вы можете добавить опцию environment="NAME=value"
, чтобы установить нужные имена пользователей для открытых ключей ssh. И не требуется редактирование Gitosis/Serve.py
.
Обработка по умолчанию отключена по умолчанию и управляется с помощью опции PermitUserEnvironment
:
sudo echo "PermitUserEnvironment yes" >> /etc/ssh/sshd_config