[英]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。
manbetx客戶端打不開自動將您的存儲庫掛鈎repositories/user/project.git/hooks
/project.git/鈎子符號鏈接到: https : //github.com/gitlabhq/gitlab-shell/tree/master/hooks
每當將Git推送到倉庫時,就會調用鈎子。 這包括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
或true
的HTTP請求決定鈎子是否成功的false
。
# 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.