3

我想阻止git commit. 这意味着一个用户不能与其他人更改他/她的电子邮件。我用gitolite。如何实现此功能?由于我有用户的公钥,我可以将他们的电子邮件/姓名绑定到该公钥吗?

4

2 回答 2

2

由于我有用户的公钥,我可以将电子邮件/姓名与该公钥绑定吗?

非本地:Gitolite 仅适用于用户 ID(从 http 或 ssh 会话中提取并设置在变量中GL_USER

因此,您需要在其他地方获得该信息。

我使用的是用户提供并存储在repogitolite/keys目录中的公钥。gitolite-admin

一个公共 ssh 密钥由 3 部分组成:

 ssh-rsa xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx WhateverYouWant

最后一部分,在公钥之后,是一个可以代表你想要的字符串。

我要求用户提供一个包含其电子邮件地址的密钥(最后)。
然后,我为所有 repo 设置了一个VREF(gitolite 中的更新挂钩),它将user.email使用从文件中提取的电子邮件验证提交中看到的~gitolite/.ssh/authorized_keys内容。
该文件由 gitolite 管理,并包含user.name电子邮件及其电子邮件(因为我希望用户给我他们的公钥的方式)

 command=="..../gitolite-shell user-id" xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx WhateverYouWant

如果任何电子邮件与正确的用户名不匹配,VREF 挂钩将拒绝推送。


我自己的VREFCHECKID(出于稍微不同的目的)在以下声明中声明gitolite.conf

repo    @all
  RW+                            = gitoliteadm
  -     VREF/CHECKID             = @all
于 2013-01-30T13:42:48.823 回答
1

我写了一个钩子,它采用与之前的答案略有不同的方法。您在顶部输入一个 EMAILDOMAIN,它确保提交日志上的电子邮件地址等于 [提交用户的 SSH 密钥文件名]@[EMAILDOMAIN]。

我把它扔到 gitolite-admin/common-hooks 中,所以它在推送时运行服务器端。

#!/bin/bash

EMAILDOMAIN="company.com"

if [[ $2 = 0000000000000000000000000000000000000000 ]] || [[ $3 = 0000000000000000000000000000000000000000 ]]
then
  exit 0
fi

# get name and email from git log
EMAILCMD="git log --format="%ce" $3 -1"
EMAIL=$($EMAILCMD)  
NAMECMD="git log --format="%cn" $3 -1"
NAME=$($NAMECMD)

# environment variable for the gitolite user (the SSH key)
# echo $GL_USER

# compare email with gitolite user
EXPEMAIL="$GL_USER@$EMAILDOMAIN"
if [ "{$EXPEMAIL,,}" != "{$EMAIL,,}" ]
then
  echo "You're committing with the SSH key for '$GL_USER'. That key belongs to $EXPEMAIL."
  echo "  (You've configured your email as $EMAIL)"
  exit 1
fi

# TODO: maybe, if we ever bother installing mail on this box, send an email to some admins if someone is trying to key share

# check the name...
IFS=' ' read -ra NAMEPARTS <<< "${NAME,,}"
PARTCOUNT=0
for PART in "${NAMEPARTS[@]}"
do
  PARTCOUNT=$((PARTCOUNT+1))
done

# make sure it's a full name
if (( "$PARTCOUNT" < 2 ))
then
  echo "You should put in your full name, $NAME."
  echo "If you've really only got one name (like Sting or Madonna), email an admin and we can make an exception for you."
  exit 1
fi

exit 0
于 2015-05-29T21:37:54.343 回答