lib/sequencer/unit/exchange/connection.rb
# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
class Sequencer::Unit::Exchange::Connection < Sequencer::Unit::Common::Provider::Fallback
uses :ews_config
provides :ews_connection
private
def ews_connection
load_viewpoint_class
Viewpoint::EWSClient.new({
endpoint: config[:endpoint],
type: config[:auth_type],
token: config[:access_token],
user: config[:user],
password: config[:password]
}, additional_opts)
end
def config
@config ||= begin
config = ews_config
if !ews_config
config = ::Import::Exchange.config
if config[:auth_type] == 'oauth'
config = config.merge(Setting.get('exchange_oauth'))
end
end
config
end
end
def additional_opts
@additional_opts ||= begin
http_opts
end
end
def http_opts
return {} if config[:disable_ssl_verify].blank?
{
http_opts: {
ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE
}
}
end
def load_viewpoint_class
return if defined?(Viewpoint::EWS::Connection)
require 'viewpoint'
Viewpoint::EWS::Connection.class_eval do
# ---
# Zammad
# ---
# def initialize(endpoint, opts = {})
# @log = Logging.logger[self.class.name.to_s.to_sym]
# if opts[:user_agent]
# @httpcli = HTTPClient.new(agent_name: opts[:user_agent])
# else
# @httpcli = HTTPClient.new
# end
#
# if opts[:trust_ca]
# @httpcli.ssl_config.clear_cert_store
# opts[:trust_ca].each do |ca|
# @httpcli.ssl_config.add_trust_ca ca
# end
# end
#
# @httpcli.ssl_config.verify_mode = opts[:ssl_verify_mode] if opts[:ssl_verify_mode]
# @httpcli.ssl_config.ssl_version = opts[:ssl_version] if opts[:ssl_version]
# # Up the keep-alive so we don't have to do the NTLM dance as often.
# @httpcli.keep_alive_timeout = 60
# @httpcli.receive_timeout = opts[:receive_timeout] if opts[:receive_timeout]
# @httpcli.connect_timeout = opts[:connect_timeout] if opts[:connect_timeout]
# @endpoint = endpoint
# end
def initialize(auth, opts = {})
@log = Logging.logger[self.class.name.to_s.to_sym]
@httpcli = http_object(opts)
@auth_type = auth[:type]
@auth_token = @auth_type == 'oauth' ? auth[:token] : nil
@endpoint = auth[:endpoint]
end
# ---
def post(xmldoc)
headers = { 'Content-Type' => 'text/xml' }
# ---
# Zammad
# ---
if @auth_type == 'oauth' && @auth_token.present?
headers = headers.merge({ 'Authorization' => "Bearer #{@auth_token}" })
end
# ---
check_response(@httpcli.post(@endpoint, xmldoc, headers))
end
# ---
# Zammad
# ---
private
def http_object(opts)
@httpcli = if opts[:user_agent]
HTTPClient.new(agent_name: opts[:user_agent])
else
HTTPClient.new
end
trust_ca_option(opts)
ssl_config(opts)
timeout_options(opts)
@httpcli
end
def trust_ca_option(opts)
return if opts[:trust_ca].nil?
@httpcli.ssl_config.clear_cert_store
opts[:trust_ca].each do |ca|
@httpcli.ssl_config.add_trust_ca ca
end
end
def ssl_config(opts)
Certificate::ApplySSLCertificates.ensure_fresh_ssl_context
@httpcli.ssl_config.verify_mode = opts[:ssl_verify_mode] if opts[:ssl_verify_mode]
@httpcli.ssl_config.ssl_version = opts[:ssl_version] if opts[:ssl_version]
end
def timeout_options(opts)
# Up the keep-alive so we don't have to do the NTLM dance as often.
@httpcli.keep_alive_timeout = 60
@httpcli.receive_timeout = opts[:receive_timeout] if opts[:receive_timeout]
@httpcli.connect_timeout = opts[:connect_timeout] if opts[:connect_timeout]
end
# ---
end
Viewpoint::EWSClient.class_eval do
# ---
# Zammad
# ---
# def initialize(endpoint, username, password, opts = {})
# # dup all. @see ticket https://github.com/zenchild/Viewpoint/issues/68
# @endpoint = endpoint.dup
# @username = username.dup
# password = password.dup
# opts = opts.dup
# http_klass = opts[:http_class] || Viewpoint::EWS::Connection
# con = http_klass.new(endpoint, opts[:http_opts] || {})
# con.set_auth @username, password
# @ews = SOAP::ExchangeWebService.new(con, opts)
# end
def initialize(auth, opts = {})
auth = auth.dup
@auth_type = auth[:type]
@auth_token = @auth_type == 'oauth' ? auth[:token] : nil
@endpoint = auth[:endpoint]
@username = auth[:user]
password = @auth_type == 'basic' ? auth[:password] : nil
http_klass = opts[:http_class] || Viewpoint::EWS::Connection
connection = http_klass.new(auth, opts[:http_opts] || {})
connection.set_auth(@username, password) if password.present?
@ews = Viewpoint::EWS::SOAP::ExchangeWebService.new(connection, opts)
end
# ---
end
end
end