Upgrade authorization lookup in global hooks
[gitorious:banzeras-mainline.git] / app / models / hook.rb
1 # encoding: utf-8
2 #--
3 #   Copyright (C) 2013 Gitorious AS
4 #   Copyright (C) 2012 John VanderPol <john.vanderpol@orbitz.com>
5 #   Copyright (C) 2010 Marius Mathiesen <marius@shortcut.no>
6 #
7 #   This program is free software: you can redistribute it and/or modify
8 #   it under the terms of the GNU Affero General Public License as published by
9 #   the Free Software Foundation, either version 3 of the License, or
10 #   (at your option) any later version.
11 #
12 #   This program is distributed in the hope that it will be useful,
13 #   but WITHOUT ANY WARRANTY; without even the implied warranty of
14 #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 #   GNU Affero General Public License for more details.
16 #
17 #   You should have received a copy of the GNU Affero General Public License
18 #   along with this program.  If not, see <http://www.gnu.org/licenses/>.
19 #++
20
21 class Hook < ActiveRecord::Base
22   include Gitorious::Authorization
23   belongs_to :repository
24   belongs_to :user
25
26   validates_presence_of :user, :url
27   validates_presence_of :repository, :unless => Proc.new { |hook| hook.user && hook.site_admin?(hook.user) }, :message => "is required for non admins"
28   validate :valid_url_format
29
30   def self.global_hooks
31     find(:all, :conditions => {:repository_id => nil})
32   end
33
34   def successful_connection(message)
35     self.successful_request_count += 1
36     self.last_response = message
37     save
38   end
39
40   def failed_connection(message)
41     self.failed_request_count += 1
42     self.last_response = message
43     save
44   end
45
46   def global?
47     repository.nil?
48   end
49
50   def valid_url_format
51     begin
52       uri = URI.parse(url)
53       if uri.host.blank?
54         errors.add(:url, "must be a valid URL")
55       end
56       if uri.scheme != "http"
57         errors.add(:url, "must be a HTTP URL")
58       end
59     rescue URI::InvalidURIError
60       errors.add(:url, "must be a valid URL")
61     end
62   end
63 end