suitepro/plugins/redmine_git_server/app/controllers/git_server_controller.rb

50 lines
1.7 KiB
Ruby

class GitServerController < ApplicationController
skip_before_action :verify_authenticity_token
skip_before_action :check_if_login_required
before_action do
begin
authenticate_or_request_with_http_basic do |username, password|
@user = User.try_to_login(username, password, false)
if @user.nil? or @user.new_record? or !@user.active?
logger.info "(Git Server) Authentication failed from #{request.remote_ip} at #{Time.now.utc}"
false
else
logger.info "(Git Server) Successful authentication for '#{@user.login}' from #{request.remote_ip} at #{Time.now.utc}"
true
end
end
next false unless @user
project = Project.find(params[:id])
unless project.module_enabled?("git_server")
logger.warn "(Git Server) project '#{project.identifier}' doesn't have the git_server module enabled"
render_404
next false
end
repository = project.repositories.find_by_identifier_param(params[:repository_id])
unless repository
render_404
next false
end
@grack_app = RedmineGitServer::GrackApp.new \
request: request,
repository_path: repository.url,
allow_push: @user.allowed_to?(:commit_access, project),
allow_pull: @user.allowed_to?(:view_changesets, project)
rescue ActiveRecord::RecordNotFound
render_404
end
end
Grack::App::ROUTES.collect{|o| o[2] }.uniq.each do |action|
define_method action do
path = request.params["path"]
params = action == :info_refs ? [] : [path]
rack_response = @grack_app.send(action, *params)
self.response = ActionDispatch::Response.new(*rack_response)
response.sending!
end
end
end