123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- # 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
|