diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 09c44502..829126fe 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -4,6 +4,10 @@ class ApplicationController < ActionController::Base helper_method :abilities, :can? + rescue_from Gitosis::AccessDenied do |exception| + render :file => File.join(Rails.root, "public", "gitosis_error"), :layout => false + end + protected def abilities diff --git a/app/controllers/errors_controller.rb b/app/controllers/errors_controller.rb new file mode 100644 index 00000000..c37f10a3 --- /dev/null +++ b/app/controllers/errors_controller.rb @@ -0,0 +1,5 @@ +class ErrorsController < ApplicationController + def gitosis + render :file => File.join(Rails.root, "public", "gitosis_error"), :layout => false + end +end diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 3307ac23..080a6ee6 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -105,6 +105,8 @@ class ProjectsController < ApplicationController format.json { render json: @project.errors, status: :unprocessable_entity } end end + rescue Gitosis::AccessDenied + render :js => "location.href = '#{errors_gitosis_path}'" and return rescue StandardError => ex @project.errors.add(:base, "Cant save project. Please try again later") respond_to do |format| diff --git a/config/application.rb b/config/application.rb index 00ed1a71..9a4fd4e4 100644 --- a/config/application.rb +++ b/config/application.rb @@ -16,7 +16,7 @@ module Gitlab # -- all .rb files in that directory are automatically loaded. # Custom directories with classes and modules you want to be autoloadable. - # config.autoload_paths += %W(#{config.root}/extras) + config.autoload_paths += %W(#{config.root}/lib) # Only load the plugins named here, in the order given (default is alphabetical). # :all can be used as a placeholder for all plugins not explicitly named. diff --git a/config/routes.rb b/config/routes.rb index 332fd8b1..00106b11 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -10,6 +10,7 @@ Gitlab::Application.routes.draw do root :to => "users#index" end + get "errors/gitosis" get "profile/password", :to => "profile#password" put "profile/password", :to => "profile#password_update" get "profile", :to => "profile#show" diff --git a/lib/gitosis.rb b/lib/gitosis.rb index 383a9612..e84eb891 100644 --- a/lib/gitosis.rb +++ b/lib/gitosis.rb @@ -1,6 +1,7 @@ require 'inifile' - +require 'timeout' class Gitosis + class AccessDenied < StandardError; end def pull # create tmp dir @@ -20,15 +21,19 @@ class Gitosis end def configure - File.open(File.join(Dir.tmpdir,"gitme-gitosis.lock"), "w+") do |f| + status = Timeout::timeout(5) { + File.open(File.join(Dir.tmpdir,"gitme-gitosis.lock"), "w+") do |f| f.flock(File::LOCK_EX) - + pull yield(self) push - + f.flock(File::LOCK_UN) - end + end + } + rescue Exception => ex + raise Gitosis::AccessDenied.new("gitosis timeout") end def destroy_project(project) @@ -51,7 +56,7 @@ class Gitosis `cd #{File.join(@local_dir,'gitosis')} ; git rm keydir/#{user}.pub` end - #update or create + #update or create def update_project(repo_name, name_writers) # write config file conf = IniFile.new(File.join(@local_dir,'gitosis','gitosis.conf')) @@ -61,5 +66,4 @@ class Gitosis conf.write end - end diff --git a/public/gitosis_error.html b/public/gitosis_error.html new file mode 100644 index 00000000..be751d6e --- /dev/null +++ b/public/gitosis_error.html @@ -0,0 +1,26 @@ + + + + We're sorry, but we cant get access to your gitosis + + + + + +
+

Gitosis Error

+

We're sorry, but we cant get access to your gitosis.

+

1. Check 'config/gitosis.yml' for correct settings.

+

2. Be sure web server user has access to gitosis.

+
+ +