Подтвердить что ты не робот

Git/gitosis: Как проверить правильность имени пользователя и электронной почты?

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

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

4b9b3361

Ответ 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: &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.

Ответ 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