簡體   English   中英

GitLab如何檢查Grack HTTPS推送權限?

[英]How does GitLab check for Grack HTTPS push permissions?

我想為GitLab開發一些功能,並將其添加到開源倉庫中。

描述:當用戶進行推送時,GitLab會檢查來自提交的所有電子郵件是否應存在於數據庫中。

我認為要向https://github.com/gitlabhq/gitlabhq/blob/master/lib/gitlab/git_access.rb此類添加一些驗證方法,但是當用戶推送某些更改(例如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

但是我調試了方法authorized_request? 並且知道此驗證也不會調用。

問題:GitLab中的哪個類可以驗證推送? 也許此功能無法實現?

您正在嘗試了解GitLab架構的最難理解的地方:gitlab-shell。

這就是評論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系統,該系統必須調用一個可執行文件(GitLab shell),該可執行文件需要一個API才能與GitLab進行通信(內部API)。

如果僅在純Ruby中有一個OpenSSH實現,並且可以像Grack那樣將其稱為HTTP的庫(替換git內置服務器),我們將能夠刪除該系統的可怕部分。 https://github.com/net-ssh/net-ssh可能有一天可用。

但是請認真考慮:首先在http://feedback.gitlab.com上提出一個清晰明確的功能請求,並等待其被接受,然后再實施,否則您可能會浪費大量時間在無法合並的內容上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM