class ManagerAuthenticator def initialize(data = {}) @manager = { login: data[:login], user_key: data[:clave_usuario], date: data[:fecha_conexion] }.with_indifferent_access end def auth return false unless [@manager[:login], @manager[:user_key], @manager[:date]].all?(&:present?) return @manager if manager_exists? && application_authorized? false end private def manager_exists? response = client.call( :get_status_user_data, message: { ub: { user_key: @manager[:user_key], date: @manager[:date] }} ).body parsed_response = parser.parse((response[:get_status_user_data_response][:get_status_user_data_return])) @manager[:login] == parsed_response["USUARIO"]["LOGIN"] rescue false end def application_authorized? response = client.call( :get_applications_user_list, message: { ub: { user_key: @manager[:user_key] }} ).body user_list_return = response[:get_applications_user_list_response][:get_applications_user_list_return] parsed_response = parser.parse(user_list_return) aplication_value = parsed_response["APLICACIONES"]["APLICACION"] # aplication_value from UWEB can be an array of hashes or a hash aplication_value.include?("CLAVE_APLICACION" => application_key) || aplication_value["CLAVE_APLICACION"] == application_key rescue false end def client @client ||= Savon.client(wsdl: Tenant.current_secrets.managers_url) end def parser @parser ||= Nori.new end def application_key Tenant.current_secrets.managers_application_key.to_s end end