GitLab如何检查Grack HTTPS推送权限?

我想为GitLab开发一些function并将其添加到开源代码库中。

描述:当用户进行推送时,GitLab会检查来自提交的所有电子邮件是否都应存在于数据库中。

我想在https://github.com/gitlabhq/gitlabhq/blob/master/lib/gitlab/git_access.rb这个类中添加一些validation方法,但是这个validation在用户推送一些更改时不会调用(例如git push)起源大师)。

我研究了路由,然后找到了: https : //github.com/gitlabhq/gitlabhq/blob/master/config/routes.rb#L24

mount Grack::Bundle.new({ git_path: Gitlab.config.git.bin_path, project_root: Gitlab.config.gitlab_shell.repos_path, upload_pack: Gitlab.config.gitlab_shell.upload_pack, receive_pack: Gitlab.config.gitlab_shell.receive_pack }), at: '/', constraints: lambda { |request| /[-\/\w\.]+\.git\//.match(request.path_info) }, via: [:get, :post] 

安装Grack以提供对git http协议的访问。 并且Gitlab为Grack /lib/gitlab/backend/grack_auth.rb#L79提供了身份validation的钩子

但我调试了authorized_request?方法authorized_request? 并且得到了这个validation也没有调用。

问题:GitLab中哪个类validation推送? 或者可能这个function无法实现?

您正在磕磕绊绊地了解GitLab架构最难理解的一点:gitlab-shell。

  • GitLab自动将您的存储库钩子repositories/user/project.git/hooks符号链接到: https : //github.com/gitlabhq/gitlab-shell/tree/master/hooks

  • 只要有一个Git推送到repo,就会调用钩子。 这包括HTTP,SSH和Web编辑,它是预接收挂钩https://github.com/gitlabhq/gitlab-shell/blob/master/hooks/pre-receive ,用于检查权限( man githooks )和中止如果你没有它,推动。

  • 预接收挂钩对https://github.com/gitlabhq/gitlabhq/blob/ab2db486b8014e509455b624dfd1719f77e27ede/lib/api/internal.rb进行API调用, 它只调用通常的Abilities系统并返回一个带有true或者HTTP的HTTP请求false ,用于确定挂钩是否成功。

这就是评论的意思https://github.com/gitlabhq/gitlabhq/blob/31de763e816cd5f8f80efc06cb4526ad8dc87eee/lib/gitlab/backend/grack_auth.rb#L92 :

 # Skip user authorization on upload request. # It will be serverd by update hook in repository 

这个复杂系统的基本原理:允许SSH推送。 SSH推送通过OpenSSH服务器,与GitLab进行通信的唯一方法是通过.ssh/authorized_keys系统,该系统必须调用需要API与GitLab(内部API)通信的可执行文件(GitLab shell)。

如果我们在纯Ruby中有一个OpenSSH实现可以被称为像Grack那样的库(取代git内置服务器),我们就能够删除系统中那个可怕的部分。 https://github.com/net-ssh/net-ssh可能有一天可以使用。

但是要认真一点:首先在http://feedback.gitlab.com上制作一个清晰的function请求并等待它在实施之前被接受,否则你可能会浪费很多时间在一些不会合并的东西上。