50 lines
1.7 KiB
Ruby
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
|