历史记录中的Mercurial身份验证信息

时间:2012-01-10 15:13:20

标签: authentication mercurial dvcs

我有一个“中央”Mercurial存储库,它配置为使用HTTPS并要求对clone-push-push更改进行身份验证。开发人员在他们的计算机上拥有自己的存储库。他们可以自由配置本地设置,例如添加

等部分
[ui]
username = anyname

到他们当地的mercurial.ini文件。

当用户尝试将其更改推送到“中央”存储库时,他会进行身份验证,但身份验证信息不会存储在Mercurial中。 Mercurial将本地配置的用户名作为中央存储库中的修订作者。所以我找不到谁真正对中央存储库进行了更改,但我非常希望这样做。 Mercurial开发人员并不关心它,并认为这种行为是正确的。

但我想在变更集附近保留身份验证信息。我认为最好的方法是在修订说明中添加一个额外的字段,例如“推送ID”并存储认证数据。

我发现的扩展程序没有实现类似的功能。您能否向我提供有关某些第三方扩展,挂钩或仅代码模板或想法如何操作的信息? (我在Python中绝对是新的)

1 个答案:

答案 0 :(得分:4)

使Mercurial开发人员(如我自己)拒绝这一点的根本问题是变更集不可变。当服务器被推送时,服务器无法向更改集添加额外信息。

更具体地说:变更集由其变更集哈希标识。此哈希是根据变更集包含的所有信息计算的,例如用户名,日期,提交消息和更改本身。你不能改变它的任何部分,也不能改变changset hash - 否则会破坏存储库的完整性。

这使您可以安全防止在服务器上进行的意外(或恶意!)更改:如果Alice和Bob谈论“changeset X”,那么他们可以确定它们的确意味着同样的事情。如果服务器(或其他人)可以在不影响ID的情况下更改变更集的内容,那么Alice和Bob将无法保证“X”的确意味着相同 他们的存储库中的东西。此属性当然也是Mercurial在同步存储库时的工作方式的基础。

这里有两个选项:

  1. 如果Alice尝试使用Bob的名称推送变更集,您可以让服务器拒绝推送。这可以通过服务器上的pretxnchangegroup挂钩来完成。它将检查HG_SOURCE环境变量并验证其中列出的用户是否还有HG_NODEtip之间所有推送的变更集的提交者。

  2. 您可以让服务器记录推送器。这被称为“pushlog”。 Mozilla项目uses one和来源appears to be here。在那里,您可以使服务器存储有关推送内容的信息。这是在changegroup钩子中完成的,它将必要的信息记录在一个小型数据库中。

    如果你想要一个推送日志,那么看一下内置了这个功能的 Kallithea .Kallithea通常是托管Mercurial存储库的好方法!它具有比普通hgweb CGI脚本更多的功能。