Git / gitosis: Как проверить правильность имени пользователя и адреса электронной почты? - PullRequest
12 голосов
/ 05 мая 2009

Я установил git и gitosis, и мне нужно добавить проверку, что имя пользователя является действительным, когда что-то вставляется в хранилище.

Я считаю, что ловушка предварительного получения - это правильная ловушка для ее размещения, но я не могу найти реальное имя пользователя и адрес электронной почты, которые gitosis входит в хранилище (те, которые установлены git config user.name и git config user.email) из переменных окружения. LOGNAME и USER оба являются «git». Как gitosis обнаруживает эту информацию, и могу ли я найти ее в ловушке предварительного получения?

Ответы [ 5 ]

9 голосов
/ 05 мая 2009

Хм, из того, что я получаю с githooks(5) хук pre-receive получает обновленные ссылки на stdin.

#!/bin/sh

while read old new name; do
    email=$(git log -1 --pretty=format:%ae $new)
    # check email
done

Вам необходимо проверить адреса электронной почты (может быть более одной строки данных) и соответствующим образом выйти из сценария, т. Е. exit 0 для успеха и, например, exit 1 для сбоя.

5 голосов
/ 06 мая 2009

Хорошо, нам удалось выполнить работу, ответ Bombe выше очень помог. Вот как это было сделано:

  • Я добавил os.environ ['GITOSIS_USER'] = пользователь в Gitosis / Serve.py, функцию Main () и переустановил его.
  • Затем я создал следующий сценарий предварительного получения:

hooks/pre-receive</p> <pre><code>#!/usr/bin/perl my $user = $ENV{'GITOSIS_USER'}; if ($user !~ m/^[^@]+@[^@]+$/ ) { 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: &gt;FH&lt; 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.

2 голосов
/ 08 сентября 2009

Этот скрипт сломан несколькими способами. Во-первых, строка open () обрезается. После того, как я это исправил, скрипт первый раз перешел в бесконечный цикл while (), даже не пытаясь вызвать git-rev-list.

С небольшой помощью моих друзей мне удалось немного ее улучшить:

hooks/pre-receive</p> <pre><code>#!/usr/bin/perl my $user = $ENV{'GITOSIS_USER'}; if ($user !~ m/^[^@]+@[^@]+$/ ) { 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;

1 голос
/ 06 мая 2009

Добавление os.environ ['WHATVER_USER'] = пользователь в ~ строке 202 в serve.py должен сделать свое дело ...

0 голосов
/ 27 ноября 2012

Вы можете проверить <gitosis-path>/.ssh/authorized_keys и увидеть:

command="gitosis-serve name@server",...

Прочитайте man для sshd и обнаружите: после command="command" вы можете добавить опцию environment="NAME=value", чтобы установить нужные имена пользователей для ваших открытых ключей SSH. И Gitosis/Serve.py редактирование не требуется.

Обработка среды по умолчанию отключена и управляется с помощью опции PermitUserEnvironment:

sudo echo "PermitUserEnvironment yes" >> /etc/ssh/sshd_config
...