【问题标题】:Git/gitosis: How to check validity of user name and email?Git/gitosis:如何检查用户名和电子邮件的有效性?
【发布时间】:2009-05-05 14:00:19
【问题描述】:

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

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

【问题讨论】:

    标签: git gitosis


    【解决方案1】:

    嗯,根据我从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 失败。

    【讨论】:

    • 好的,这实际上回答了我的问题,但实际上我的问题不是正确的 :( 我真正需要看到的是 gitosis 用于匹配 ssh 密钥的电子邮件地址。原因:我们有一个访问受限的自动构建系统。每个人都可以写入存储库(因此 gitosis 访问没有帮助),但只允许构建一些。假设我有构建权限。其他人只需要更改电子邮件地址( git config user.email) 到我的,他也被授予访问权限。我需要检查 gitosis 使用的电子邮件地址以检查 ssh 密钥以防止这种情况。
    • 我从未与 gitosis 合作过,所以我无法帮助您,抱歉。
    • 抱歉,我已经测试过了,据我所知,这在预接收中不起作用,因为日志只保存提交的事件。
    【解决方案2】:

    好的,我们设法完成了工作,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 密钥的用户名相同。

    【讨论】:

      【解决方案3】:

      该脚本在几个方面被破坏了。首先,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;
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          您可以查看&lt;gitosis-path&gt;/.ssh/authorized_keys并查看:

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

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-11-22
            • 1970-01-01
            • 2019-04-06
            • 1970-01-01
            • 2020-11-11
            • 2011-03-30
            • 2018-01-31
            相关资源
            最近更新 更多