2012-11-19 13:24:05 -05:00
|
|
|
# == Schema Information
|
|
|
|
#
|
|
|
|
# Table name: web_hooks
|
|
|
|
#
|
2015-11-13 13:22:46 -05:00
|
|
|
# id :integer not null, primary key
|
2015-12-01 15:47:23 -05:00
|
|
|
# url :string(2000)
|
2015-11-13 13:22:46 -05:00
|
|
|
# project_id :integer
|
|
|
|
# created_at :datetime
|
|
|
|
# updated_at :datetime
|
2015-12-01 15:47:23 -05:00
|
|
|
# type :string default("ProjectHook")
|
2015-11-13 13:22:46 -05:00
|
|
|
# service_id :integer
|
|
|
|
# push_events :boolean default(TRUE), not null
|
|
|
|
# issues_events :boolean default(FALSE), not null
|
|
|
|
# merge_requests_events :boolean default(FALSE), not null
|
|
|
|
# tag_push_events :boolean default(FALSE)
|
|
|
|
# note_events :boolean default(FALSE), not null
|
|
|
|
# enable_ssl_verification :boolean default(TRUE)
|
2016-01-05 21:30:59 -05:00
|
|
|
# build_events :boolean default(FALSE), not null
|
2012-11-19 13:24:05 -05:00
|
|
|
#
|
|
|
|
|
2011-12-14 11:38:52 -05:00
|
|
|
class WebHook < ActiveRecord::Base
|
2015-02-05 17:20:55 -05:00
|
|
|
include Sortable
|
2011-12-14 11:38:52 -05:00
|
|
|
include HTTParty
|
|
|
|
|
2014-02-27 08:56:35 -05:00
|
|
|
default_value_for :push_events, true
|
|
|
|
default_value_for :issues_events, false
|
2015-05-16 02:33:31 -04:00
|
|
|
default_value_for :note_events, false
|
2014-02-27 08:56:35 -05:00
|
|
|
default_value_for :merge_requests_events, false
|
2014-09-19 04:23:18 -04:00
|
|
|
default_value_for :tag_push_events, false
|
2015-12-07 07:23:23 -05:00
|
|
|
default_value_for :build_events, false
|
2015-09-15 09:19:32 -04:00
|
|
|
default_value_for :enable_ssl_verification, true
|
2014-02-27 08:56:35 -05:00
|
|
|
|
2016-04-18 20:53:41 -04:00
|
|
|
scope :push_hooks, -> { where(push_events: true) }
|
|
|
|
scope :tag_push_hooks, -> { where(tag_push_events: true) }
|
|
|
|
|
2011-12-14 11:38:52 -05:00
|
|
|
# HTTParty timeout
|
2014-09-12 11:38:14 -04:00
|
|
|
default_timeout Gitlab.config.gitlab.webhook_timeout
|
2011-12-14 11:38:52 -05:00
|
|
|
|
2015-12-01 18:45:36 -05:00
|
|
|
validates :url, presence: true, url: true
|
2011-12-14 11:38:52 -05:00
|
|
|
|
2015-01-23 19:10:43 -05:00
|
|
|
def execute(data, hook_name)
|
2012-08-01 22:48:46 -04:00
|
|
|
parsed_url = URI.parse(url)
|
|
|
|
if parsed_url.userinfo.blank?
|
2015-12-01 19:15:01 -05:00
|
|
|
response = WebHook.post(url,
|
|
|
|
body: data.to_json,
|
|
|
|
headers: {
|
|
|
|
"Content-Type" => "application/json",
|
|
|
|
"X-Gitlab-Event" => hook_name.singularize.titleize
|
|
|
|
},
|
|
|
|
verify: enable_ssl_verification)
|
2012-08-01 22:48:46 -04:00
|
|
|
else
|
2012-09-27 02:20:36 -04:00
|
|
|
post_url = url.gsub("#{parsed_url.userinfo}@", "")
|
2013-02-22 11:03:59 -05:00
|
|
|
auth = {
|
2016-01-12 04:32:25 -05:00
|
|
|
username: CGI.unescape(parsed_url.user),
|
|
|
|
password: CGI.unescape(parsed_url.password),
|
2013-02-22 11:03:59 -05:00
|
|
|
}
|
2015-12-01 19:15:01 -05:00
|
|
|
response = WebHook.post(post_url,
|
|
|
|
body: data.to_json,
|
|
|
|
headers: {
|
|
|
|
"Content-Type" => "application/json",
|
|
|
|
"X-Gitlab-Event" => hook_name.singularize.titleize
|
|
|
|
},
|
|
|
|
verify: enable_ssl_verification,
|
|
|
|
basic_auth: auth)
|
2012-08-01 22:48:46 -04:00
|
|
|
end
|
2015-12-01 19:15:01 -05:00
|
|
|
|
2016-01-07 09:28:24 -05:00
|
|
|
[(response.code >= 200 && response.code < 300), ActionView::Base.full_sanitizer.sanitize(response.to_s)]
|
2015-12-01 19:15:01 -05:00
|
|
|
rescue SocketError, OpenSSL::SSL::SSLError, Errno::ECONNRESET, Errno::ECONNREFUSED, Net::OpenTimeout => e
|
2014-12-04 08:07:01 -05:00
|
|
|
logger.error("WebHook Error => #{e}")
|
2015-12-01 19:15:01 -05:00
|
|
|
[false, e.to_s]
|
2011-12-14 11:38:52 -05:00
|
|
|
end
|
2013-01-24 15:15:24 -05:00
|
|
|
|
2015-01-23 19:10:43 -05:00
|
|
|
def async_execute(data, hook_name)
|
|
|
|
Sidekiq::Client.enqueue(ProjectWebHookWorker, id, data, hook_name)
|
2013-01-24 15:15:24 -05:00
|
|
|
end
|
2011-12-14 11:38:52 -05:00
|
|
|
end
|