UNPKG

@mygateway/mygateway-three-ds-sdk-frontend

Version:
183 lines (150 loc) 5.22 kB
function isUuid(uuid) { const pattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i; if (pattern.test(uuid)) { return true; } return false; } function isWithinOneHour(dateStr1, dateStr2) { function parseRFC1123Date(str) { // Divide a string por espaços: // ["Mon,", "17", "Feb", "2025", "13:34:25", "GMT"] const parts = str.split(" "); const day = parseInt(parts[1], 10); const monthStr = parts[2]; const year = parseInt(parts[3], 10); const [hour, minute, second] = parts[4].split(":").map(Number); // Mapeamento dos meses para número (0 = Janeiro, 11 = Dezembro) const monthMap = { Jan: 0, Feb: 1, Mar: 2, Apr: 3, May: 4, Jun: 5, Jul: 6, Aug: 7, Sep: 8, Oct: 9, Nov: 10, Dec: 11, }; const month = monthMap[monthStr]; // Converte para timestamp em UTC return Date.UTC(year, month, day, hour, minute, second); } // Função para converter dateStr2 no formato "YYYY-MM-DD HH:MM:SS" function parseCustomDate(str) { const [datePart, timePart] = str.split(" "); const [year, month, day] = datePart.split("-").map(Number); const [hour, minute, second] = timePart.split(":").map(Number); // Note que o mês é subtraído por 1, pois Date.UTC espera 0-11 para o mês return Date.UTC(year, month - 1, day, hour, minute, second); } // Converte ambas as datas para timestamps const time1 = parseRFC1123Date(dateStr1); const time2 = parseCustomDate(dateStr2); // Calcula a diferença absoluta entre os dois timestamps const diffInMs = Math.abs(time1 - time2); // 1 hora = 3.600.000 milissegundos return diffInMs <= 3600000; } function injectAdiqScript(organizationId, orgId, sessionId) { const existScript = document.getElementById("challengeScript"); if (!!existScript) return; const script = document.createElement("script"); script.id = "challengeScript"; script.type = "text/javascript"; script.src = `https://h.online-metrix.net/fp/tags.js?org_id=${orgId}&session_id=${organizationId}${sessionId}`; script.async = true; document.head.appendChild(script); } function injectAdiqIframe(organizationId, orgId, sessionId) { const existIframe = document.getElementById("challengeIframe"); if (!!existIframe) return; const noscript = document.createElement("noscript"); const iframe = document.createElement("iframe"); iframe.id = "challengeIframe"; iframe.style.width = "100px"; iframe.style.height = "100px"; iframe.style.border = "0"; iframe.style.position = "absolute"; iframe.style.top = "-5000px"; iframe.src = `https://h.online-metrix.net/fp/tags.js?org_id=${orgId}&session_id=${organizationId}${sessionId}`; noscript.appendChild(iframe); document.body.appendChild(noscript); } function injectAdiqInput(sessionId) { const existInput = document.getElementById("codeAntiFraud"); if (!!existInput) return; const hiddenDiv = document.querySelector("div[hidden]"); if (hiddenDiv) { const input = document.createElement("input"); input.type = "text"; input.id = "codeAntiFraud"; input.name = "codeAntiFraud"; input.value = sessionId; hiddenDiv.appendChild(input); } } class MyGateway3DS { callback; threeDsType; threeDs; constructor( inputName = "ccnum", callback, threeDsType = 1, sessionId, options ) { this.callback = callback; this.threeDsType = threeDsType; if ( !!!inputName || !!!callback || !!!threeDsType || !!!sessionId || !!!options ) throw new Error("Configuração inválida"); const crypt = options.crypt.split("$$"); const location = atob(crypt[0]); const guid1 = crypt[1]; const object = JSON.parse(atob(crypt[2])); const guid2 = crypt[3]; const seed = atob(options.seed); const now = new Date().toUTCString(); if (window.location.origin.toLowerCase() !== location.toLowerCase()) { throw new Error("Configuração inválida"); } if (!isUuid(guid1) || !isUuid(guid2)) { throw new Error("Configuração inválida"); } if (!isWithinOneHour(now, seed)) { throw new Error("Configuração inválida"); } if (object.sessionId !== sessionId) { throw new Error("Sessão inválida"); } if (threeDsType == 1) { const data = object.providerExternalOne; const organizationId = atob(data.organizationId); const orgId = atob(data.orgId); injectAdiqScript(organizationId, orgId, sessionId); injectAdiqIframe(organizationId, orgId, sessionId); injectAdiqInput(sessionId); this.threeDs = new Adiq3ds(inputName, callback); } } async Authorization3ds() { return await this.threeDs.Authorization3ds(); } GetThreeDsCode() { return this.threeDs.getThreeDsCode(); } InitChallenge(acsUrl, pareq, authTransactionId) { return this.threeDs.InitChallenge(acsUrl, pareq, authTransactionId); } }