12

我已经安装了 git 和 gitosis,当某些东西被推入存储库时,我需要添加一个检查用户名是否有效。

我认为 pre-receive 钩子是放置这个的正确钩子,但是我无法找到 gitosis 进入存储库的真实用户名和电子邮件地址(由 git config user.name 和 git config user.name 设置的那些)。电子邮件)来自环境变量。LOGNAME 和 USER 都是 'git'。gitosis 如何检测到这些信息,我也可以在预接收挂钩中找到它吗?

4

5 回答 5

9

嗯,从我从钩子中收集到的内容中,更新了githooks(5)refs 。pre-receivestdin

#!/bin/sh

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

您需要检查电子邮件地址(可能有不止一行数据)并相应地退出脚本,即exit 0成功和exit 1失败。

于 2009-05-05T14:28:30.723 回答
5

好的,我们设法完成了工作,Bombe 上面的回复很有帮助。这是如何完成的:

  • 我将 os.environ['GITOSIS_USER'] = user 添加到 Gitosis/Serve.py,函数 Main() 并重新安装它。
  • 然后我创建了以下预接收脚本:

hooks/pre-receive

#!/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;

这意味着用户名必须与用于为 gitosis 密钥环创建 ssh 密钥的用户名相同。

于 2009-05-06T13:19:56.840 回答
2

该脚本在几个方面被破坏。首先,open() 行被切断。在我修复它之后,脚本在第一个 while() 时进入了无限循环,甚至没有尝试调用 git-rev-list。

在朋友们的帮助下,我设法对其进行了一些修饰:

hooks/pre-receive

#!/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;

于 2009-09-08T08:49:43.453 回答
1

在 serve.py 的 ~line 202 添加 os.environ['WHATVER_USER']=user 应该可以解决问题...

于 2009-05-06T09:57:49.290 回答
0

您可以检查<gitosis-path>/.ssh/authorized_keys并查看:

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

阅读手册sshd并发现:在command="command"您可以添加environment="NAME=value"选项来为您的公共 ssh 密钥设置所需的用户名之后。并且不需要Gitosis/Serve.py编辑。

默认情况下禁用环境处理,并通过以下PermitUserEnvironment选项控制:

sudo echo "PermitUserEnvironment yes" >> /etc/ssh/sshd_config
于 2012-11-27T10:08:13.187 回答