代码之家  ›  专栏  ›  技术社区  ›  Makis

Git/Gitosis:如何检查用户名和电子邮件的有效性?

  •  12
  • Makis  · 技术社区  · 15 年前

    我已经安装了Git和Gitosi,我需要添加一个检查,以确保将某些内容推送到存储库时用户名是有效的。

    我认为预接收钩子是放置这个的正确钩子,但是我无法从环境变量中找到Gitosi进入存储库的真实用户名和电子邮件地址(Git-config user.name和Git-config user.email设置的用户名和电子邮件地址)。logname和user都是“git”。Gitosis如何检测此信息,我也可以在预接收挂钩中找到它吗?

    5 回复  |  直到 12 年前
        1
  •  9
  •   Bombe    15 年前

    嗯,从我收集的资料来看 githooks(5) 这个 pre-receive Hook收到更新的参考信息 stdin .

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

    您需要检查电子邮件地址(可能有多行数据)并相应地退出脚本,即。 exit 0 为了成功,例如 exit 1 因为失败。

        2
  •  5
  •   volker    12 年前

    好吧,我们设法完成了任务,伯伯的回答对我们帮助很大。就是这样做的:

    • 我将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
  •  2
  •   volker    12 年前

    那个剧本有几种不同的地方。首先,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
  •  1
  •   pan1nx    15 年前

    添加os.environ['whatver_user']=serve.py中~202行的用户应该会做到…

        5
  •  0
  •   egor7    12 年前

    你可以检查 <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
    
    推荐文章