diff --git a/Gemfile.lock b/Gemfile.lock index c077593e..823f65e2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,6 +1,6 @@ GIT remote: https://github.com/SaitoWu/grack.git - revision: dd990d231ac9189046b71a65d874638e55320e27 + revision: ba46f3b0845c6a09d488ae6abdce6ede37e227e8 specs: grack (1.0.0) rack (~> 1.4.1) diff --git a/config/initializers/grack_auth.rb b/config/initializers/grack_auth.rb index 17d3641a..27a0a1db 100644 --- a/config/initializers/grack_auth.rb +++ b/config/initializers/grack_auth.rb @@ -2,7 +2,30 @@ module Grack class Auth < Rack::Auth::Basic def valid? - true - end - end -end + # Authentication with username and password + email, password = @auth.credentials + user = User.find_by_email(email) + return false unless user.valid_password?(password) + + # Find project by PATH_INFO from env + if m = /^\/([\w-]+).git/.match(@env['PATH_INFO']).to_a + return false unless project = Project.find_by_path(m.last) + end + + # Git upload and receive + if @env['REQUEST_METHOD'] == 'GET' + true + elsif @env['REQUEST_METHOD'] == 'POST' + if @env['REQUEST_URI'].end_with?('git-upload-pack') + return project.dev_access_for?(user) + elsif @env['REQUEST_URI'].end_with?('git-upload-pack') + #TODO master branch protection + return project.dev_access_for?(user) + else + false + end + end + + end# valid? + end# Auth +end# Grack