diff options
-rw-r--r-- | app/controllers/application_controller.rb | 4 | ||||
-rw-r--r-- | app/controllers/errors_controller.rb | 5 | ||||
-rw-r--r-- | app/controllers/projects_controller.rb | 2 | ||||
-rw-r--r-- | config/application.rb | 2 | ||||
-rw-r--r-- | config/routes.rb | 1 | ||||
-rw-r--r-- | lib/gitosis.rb | 18 | ||||
-rw-r--r-- | public/gitosis_error.html | 26 |
7 files changed, 50 insertions, 8 deletions
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 09c44502cdf..829126fee05 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 00000000000..c37f10a39f3 --- /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 3307ac23d9b..080a6ee62f6 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 00ed1a71b73..9a4fd4e4586 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 332fd8b153f..00106b119a6 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 383a96129df..e84eb891ab6 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 00000000000..be751d6e5e6 --- /dev/null +++ b/public/gitosis_error.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<html> +<head> + <title>We're sorry, but we cant get access to your gitosis</title> + <style type="text/css"> + body { background-color: #EAEAEA; color: #666; text-align: center; font-family: arial, sans-serif; } + div.dialog { + width: 600px; + padding: 0 4em; + margin: 4em auto 0 auto; + } + h1 { font-size: 48px; color: #444; line-height: 1.5em; } + h2 { font-size: 24px; color: #666; line-height: 1.5em; } + </style> +</head> + +<body> + <!-- This file lives in public/500.html --> + <div class="dialog"> + <h1>Gitosis Error</h1> + <h2>We're sorry, but we cant get access to your gitosis.</h2> + <h3> 1. Check 'config/gitosis.yml' for correct settings.</h3> + <h3> 2. Be sure web server user has access to gitosis.</h3> + </div> +</body> +</html> |