{"version":3,"sources":["webpack:///webpack/bootstrap b016afd136dd436a75ec","webpack:///./lib/index.ts","webpack:///./lib/common.ts","webpack:///./lib/core.ts","webpack:///./~/eventemitter3/index.js","webpack:///./lib/signer-session.ts"],"names":[],"mappings":"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;AACA;;AAEA;AACA;AACA;AACA,YAAW,cAAc;AACzB,cAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,0CAAyC,SAAS;AAClD;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA,gBAAe,YAAY;AAC3B;;AAEA;AACA,4DAA2D;AAC3D,gEAA+D;AAC/D,oEAAmE;AACnE,wEAAuE;AACvE;AACA,2DAA0D,SAAS;AACnE;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,YAAW,cAAc;AACzB,YAAW,SAAS;AACpB,YAAW,MAAM;AACjB,cAAa,aAAa;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,YAAW,cAAc;AACzB,YAAW,SAAS;AACpB,YAAW,MAAM;AACjB,cAAa,aAAa;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,YAAW,cAAc;AACzB,YAAW,SAAS;AACpB,YAAW,MAAM;AACjB,YAAW,QAAQ;AACnB,cAAa,aAAa;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH,4DAA2D,YAAY;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,YAAW,cAAc;AACzB,cAAa,aAAa;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;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","file":"qs-signer-1.8.4.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap b016afd136dd436a75ec","import * as common from \"./common\";\r\n\r\nimport * as core from \"./core\";\r\n\r\nimport * as signerSession from \"./signer-session\";\r\n\r\n/** Versão atual necessária para o processo de assinatura\r\n */\r\nlet requiredVersion: common.RequiredVersionInfo = {\r\n applet: \"0.8.0\",\r\n chrome: \"0.4.2\",\r\n gecko: \"0.4.4\",\r\n host: \"0.7.0\"\r\n};\r\n\r\nwindow[\"QuickSoft\"] = (function(ns) \r\n{\r\n if (!ns.Signer) ns.Signer = { }; \r\n let signerNS = ns.Signer;\r\n\r\n window[\"__QuickSoft_DigitalSignature_Web_SignerCore_notifyAppletReady\"] = core.__QuickSoft_DigitalSignature_Web_SignerCore_notifyAppletReady;\r\n window[\"__QuickSoft_DigitalSignature_Web_SignerCore_handleAppletResponse\"] = core.__QuickSoft_DigitalSignature_Web_SignerCore_handleAppletResponse;\r\n\r\n signerNS.VersionBindings = requiredVersion;\r\n\r\n signerNS.checkVersion = common.checkVersion;\r\n signerNS.combineRequirements = common.combineRequirements;\r\n signerNS.checkWebExtRuntimeVersions = common.checkWebExtRuntimeVersions;\r\n \r\n signerNS.VersionCheckError = common.VersionCheckError;\r\n signerNS.CoreConstants = common.CoreConstants;\r\n signerNS.RequestIdGenerator = common.RequestIdGenerator;\r\n \r\n signerNS.SignerCore = core.SignerCore;\r\n signerNS.SupportedPlatform = core.SupportedPlatform;\r\n signerNS.IFrameContainerWebExtMessageHub = core.IFrameContainerWebExtMessageHub;\r\n\r\n signerNS.CertificateCache = signerSession.CertificateCache;\r\n signerNS.SignerSession = signerSession.SignerSession;\r\n signerNS.SignerSessionState = signerSession.SignerSessionState;\r\n signerNS.CertificateCacheState = signerSession.CertificateCacheState;\r\n\r\n return ns;\r\n})(window[\"QuickSoft\"] || {});\r\n\n\n\n// WEBPACK FOOTER //\n// ./lib/index.ts","import { ErrorInfo } from \"./http-models\";\r\n\r\n/** Modelo de requests de mensagens de assinatura digital */\r\nexport interface CoreRequestModel {\r\n id: string;\r\n type: string;\r\n operation: string;\r\n computeStatistics?: boolean;\r\n arguments?: any;\r\n}\r\n\r\n/** Modelo de resposta de mensagens ao core de assinatura digital\r\n */\r\nexport interface CoreResponseModel {\r\n id: string;\r\n type: string;\r\n operation: string;\r\n hasNext?: boolean;\r\n error?: ErrorInfo;\r\n result?: any;\r\n statistics?: any;\r\n}\r\n\r\nexport interface CertificateInfo {\r\n certID: string;\r\n subjectDN: string;\r\n issuerDN: string;\r\n serial: string;\r\n isValid: boolean;\r\n hasKey: boolean;\r\n notBefore: Date;\r\n notAfter: Date;\r\n keyStoreType: string;\r\n certChain?: string[];\r\n userData?: { [key: string] : any };\r\n}\r\n\r\nexport interface InstalledVersionInfo\r\n{\r\n hostVersion: string;\r\n coreVersion: string;\r\n hostUpdate?: {\r\n required: boolean;\r\n version: string;\r\n };\r\n}\r\n\r\nexport interface RequiredVersionInfo\r\n{\r\n applet?: string;\r\n chrome?: string;\r\n gecko?: string;\r\n host?: string;\r\n}\r\n\r\nexport interface CheckVersionResult\r\n{\r\n host?: CheckVersionResultItem;\r\n core?: CheckVersionResultItem;\r\n}\r\n\r\nexport interface CheckVersionResultItem\r\n{\r\n required: boolean;\r\n version: string;\r\n}\r\n\r\nexport interface GenericError {\r\n type: string;\r\n msg: string;\r\n}\r\nexport interface GenericErrorResultModel {\r\n error: GenericError;\r\n}\r\n\r\nexport class VersionCheckError\r\n{\r\n /** Falha ao consultar versão necessária da extensão\r\n */\r\n static ERR_TYPE_QUERY_FAILURE = 1;\r\n /** Módulo nativo necessita atualização\r\n */\r\n static ERR_TYPE_HOST_NEEDS_UPDATE = 2;\r\n /** Extensão do chrome necessita atualização\r\n */\r\n static ERR_TYPE_VERSION_MISMATCH = 3;\r\n /** Módulo nativo não foi possível de ser contatado\r\n */\r\n static ERR_TYPE_HOST_UNREACHABLE = 4;\r\n\r\n checkErrorType: number;\r\n msg: string;\r\n type: string;\r\n requiredVersion?: string;\r\n stacktrace?: string;\r\n\r\n constructor(checkErrorType:number, errorInfo:ErrorInfo, requiredVersion?:string)\r\n {\r\n this.checkErrorType = checkErrorType;\r\n this.msg = errorInfo.msg;\r\n this.type = errorInfo.type || \"VersionCheckError\";\r\n this.stacktrace = errorInfo.stacktrace;\r\n this.requiredVersion = requiredVersion;\r\n }\r\n /** Retorna um novo erro de validação de versão, dizendo que o host nativo precisa de update\r\n * @param requiredVersion Versão requerida\r\n * @returns Erro de verificação de versão com as informações adequadas\r\n */\r\n static hostNeedsUpdate(requiredVersion: string) : VersionCheckError {\r\n return new VersionCheckError(\r\n VersionCheckError.ERR_TYPE_HOST_NEEDS_UPDATE,\r\n { msg: \"Assinador digital (Módulo Nativo) necessita de atualização\", type: \"VersionCheckError\" },\r\n requiredVersion\r\n );\r\n }\r\n /** Retorna um novo erro de validação de versão, dizendo que o host nativo está unreachable\r\n * @param requiredVersion Versão requerida\r\n * @param errorInfo Informações de erro retornadas pela extensão\r\n * @returns Erro de verificação de versão com as informações adequadas\r\n */\r\n static unreachableHost(requiredVersion: string, errorInfo:ErrorInfo) : VersionCheckError {\r\n return new VersionCheckError(\r\n VersionCheckError.ERR_TYPE_HOST_UNREACHABLE,\r\n errorInfo,\r\n requiredVersion\r\n );\r\n }\r\n /** Retorna um novo erro de validação de versão, dizendo que a extensão necessita de update\r\n * @param requiredVersion Versão requerida\r\n * @returns Erro de verificação de versão com as informações adequadas\r\n */\r\n static extNeedsUpdate(requiredVersion: string) : VersionCheckError {\r\n return new VersionCheckError(\r\n VersionCheckError.ERR_TYPE_VERSION_MISMATCH,\r\n { msg: \"Extensão do navegador necessita de atualização\", type: \"VersionCheckError\" },\r\n requiredVersion\r\n );\r\n }\r\n}\r\n\r\nclass VersionStruct\r\n{\r\n static parse(versionStr: string) : VersionStruct {\r\n //verifica se informou version string\r\n if (!versionStr) throw new Error(\"versionStr não foi informada\");\r\n\r\n //faz split e valida formato da versão\r\n const splitted: string[] = versionStr.split(\".\");\r\n if (!splitted || splitted.length < 3) throw new Error(\"versionStr não possui formato de 3 valores\");\r\n\r\n //faz parsing para number e constrói objeto\r\n return new VersionStruct(parseInt(splitted[0], 10), parseInt(splitted[1], 10), parseInt(splitted[2], 10));\r\n }\r\n\r\n static max(a: VersionStruct, b: VersionStruct) : VersionStruct {\r\n return b.isHigherThan(a) ? b : a;\r\n }\r\n\r\n static maxVersionString(v1: string, v2: string) : VersionStruct {\r\n const a = VersionStruct.parse(v1);\r\n const b = VersionStruct.parse(v2);\r\n return VersionStruct.max(a, b);\r\n }\r\n\r\n constructor(\r\n public major: number,\r\n public minor: number,\r\n public patch: number\r\n ) { }\r\n\r\n isHigherThan(other: VersionStruct) : boolean {\r\n //bate diferença nas majors\r\n if (this.major > other.major) return true;\r\n if (this.major < other.major) return false;\r\n //majors são iguais... bate diferença nas minors\r\n if (this.minor > other.minor) return true;\r\n if (this.minor < other.minor) return false;\r\n //majors e minor iguais... vamos bater os patches\r\n if (this.patch > other.patch) return true;\r\n return false;\r\n }\r\n\r\n toString() : string {\r\n return `${this.major}.${this.minor}.${this.patch}`;\r\n }\r\n}\r\n\r\nexport function detectExtensionType() : string {\r\n const browserName = window.navigator.userAgent;\r\n\r\n if (!(/\\sedge\\/[\\d\\.]+/i).test(browserName)) {\r\n if ((/\\schrome\\/[\\d\\.]+\\s/i).test(browserName)) return CoreConstants.EXT_TYPE_CHROME;\r\n if ((/\\sgecko\\/[\\d]+\\s/i).test(browserName)) return CoreConstants.EXT_TYPE_GECKO;\r\n }\r\n \r\n return CoreConstants.EXT_TYPE_APPLET;\r\n}\r\n\r\n/**\r\n * Verifica se o client possui instalada a versão mínima necessária para utiliza a assinatura digital\r\n * @param installed Versão instalada atualmente no client\r\n * @param required Versão necessária para utilizar assinatura digital\r\n * @param [thisPlatform] Plataforma atual onde função está sendo executada (ex: gecko, chrome, applet)\r\n * @returns Modelo indicando qual é a última versão e se a atualização é obrigatória. Retorna null se estiver atualizada. \r\n */\r\nexport function checkVersion(\r\n installed : InstalledVersionInfo,\r\n required : RequiredVersionInfo,\r\n thisPlatform? : string\r\n): CheckVersionResult {\r\n //se não tem resource dizendo o que precisamos, vamos retornar que está tudo bem\r\n if (!required) return null;\r\n\r\n //objeto de resultado e flag indicando se encontramos alguma discrepância\r\n let result: CheckVersionResult = { };\r\n let problems: boolean = false;\r\n\r\n //objeto contendo chaves atuais de problema (esse array serve para que um problema para a key 'gecko' seja replicada em 'extension')\r\n const problemKeys:string[] = [];\r\n const addProblem = function(p: CheckVersionResultItem) {\r\n //vincula problema as chaves de problema indicadas e flaga que temos problemas\r\n for (const k of problemKeys) result[k] = p;\r\n problems = true;\r\n };\r\n\r\n //percorre cada versão que o usuário quer validar\r\n for (let key in installed) {\r\n //somente strings nos interessam\r\n if (typeof(installed[key]) !== \"string\") continue;\r\n\r\n //pega valor da versão disponível\r\n const availVersion: string = installed[key];\r\n\r\n //existem chaves que possuem \"Version\" como sufixo, remove tal sufixo. Busca então a versão bindada à library\r\n key = key.replace(/Version$/, \"\");\r\n problemKeys.splice(0, problemKeys.length, key);\r\n \r\n // se for extension muda key para a extensão que deve ser utilizada\r\n if (key === \"extension\") {\r\n key = thisPlatform || detectExtensionType();\r\n problemKeys.push(key);\r\n }\r\n const reqVersion: string = required[key];\r\n\r\n //verifica se tem as 2 informações para comparar\r\n if (reqVersion && availVersion) {\r\n //splita versões pelo separador\r\n const parsedRequired = VersionStruct.parse(reqVersion); // string[] = reqVersion.split(\".\");\r\n const parsedAvailable = VersionStruct.parse(availVersion); //: string[] = availVersion.split(\".\");\r\n\r\n //se a major version é diferente, temos um problema de incompatibilidade forte\r\n if (parsedRequired.major !== parsedAvailable.major) {\r\n addProblem({ required: true, version: reqVersion });\r\n continue;\r\n }\r\n\r\n //se precisar de uma minorVersion mais recente, a funcionalidade que queremos pode não estar implementada: atualização obrigatória também\r\n if (parsedRequired.minor > parsedAvailable.minor) {\r\n addProblem({ required: true, version: reqVersion });\r\n continue;\r\n }\r\n\r\n //caso apenas a PATCH requerida seja maior, vamos dizer que a atualização é recomendável\r\n if (parsedRequired.minor === parsedAvailable.minor && parsedRequired.patch > parsedAvailable.patch) {\r\n addProblem({ required: false, version: reqVersion });\r\n continue;\r\n }\r\n }\r\n }\r\n\r\n //retorna problemas, se encontrou algum\r\n return problems ? result : null;\r\n}\r\n\r\nexport function combineRequirements(current: RequiredVersionInfo, newReqs: RequiredVersionInfo) : RequiredVersionInfo\r\n{\r\n const maxVerStr = VersionStruct.maxVersionString;\r\n\r\n return {\r\n host : newReqs.host ? maxVerStr(current.host, newReqs.host).toString() : current.host,\r\n applet : newReqs.applet ? maxVerStr(current.applet, newReqs.applet).toString() : current.applet,\r\n chrome : newReqs.chrome ? maxVerStr(current.chrome, newReqs.chrome).toString() : current.chrome,\r\n gecko : newReqs.gecko ? maxVerStr(current.gecko, newReqs.gecko).toString() : current.gecko,\r\n };\r\n}\r\n\r\nexport function checkWebExtRuntimeVersions(resp: CoreResponseModel, versionBindings: RequiredVersionInfo, thisPlatform? : string) : Promise\r\n{\r\n //veio erro direto da extensão\r\n if (resp.error)\r\n {\r\n const fail:ErrorInfo = resp.error;\r\n switch (fail.type)\r\n {\r\n case \"web_error.hostUnreachable\":\r\n case \"chrome_error.hostUnreachable\": {\r\n //escolhe maior versão entre a pedida pela extensão e a pedida pela app\r\n const extReq:string = (fail).data.requiredHostVersion;\r\n const higher:string = VersionStruct.maxVersionString(extReq, versionBindings.host).toString();\r\n //retorna rejeição\r\n return Promise.reject(VersionCheckError.unreachableHost(higher, fail));\r\n }\r\n case \"web_error.needsHostUpdate\":\r\n case \"chrome_error.needsHostUpdate\": {\r\n //escolhe maior versão entre a pedida pela extensão e a pedida pela app\r\n const extReq:string = (fail).data.requiredHostVersion;\r\n const higher:string = VersionStruct.maxVersionString(extReq, versionBindings.host).toString();\r\n //mantém tipo de erro vindo da response model\r\n let rj = VersionCheckError.hostNeedsUpdate(higher);\r\n rj.type = fail.type;\r\n return Promise.reject(rj);\r\n }\r\n default:\r\n return Promise.reject(new VersionCheckError(VersionCheckError.ERR_TYPE_QUERY_FAILURE, fail));\r\n }\r\n }\r\n\r\n //se não for erro porém tiver chave \"hostUpdate\", vamos ver se o update não é required\r\n const extHostUpdate = resp.result.hostUpdate;\r\n if (extHostUpdate && extHostUpdate.required) {\r\n //escolhe maior versão entre a pedida pela extensão e a pedida pela app\r\n const extReq:string = extHostUpdate.version;\r\n const higher:string = VersionStruct.maxVersionString(extReq, versionBindings.host).toString();\r\n\r\n return Promise.reject(VersionCheckError.hostNeedsUpdate(higher));\r\n }\r\n\r\n //se chegou até aqui, quer dizer que a extensão está feliz, porém vamos ter que bater os bindings da app também\r\n const versionCheck = checkVersion(resp.result, versionBindings, thisPlatform);\r\n if (versionCheck) {\r\n //se requer update no host (por definição da library js), vamos reportar isso\r\n const hostUpdate:CheckVersionResultItem = versionCheck[\"host\"];\r\n if (hostUpdate && hostUpdate.required) {\r\n return Promise.reject(VersionCheckError.hostNeedsUpdate(hostUpdate.version));\r\n }\r\n //se precisa de update na extensão\r\n const extUpdate:CheckVersionResultItem = versionCheck[\"extension\"];\r\n if (extUpdate && extUpdate.required) {\r\n return Promise.reject(VersionCheckError.extNeedsUpdate(extUpdate.version));\r\n }\r\n }\r\n\r\n return Promise.resolve(resp);\r\n}\r\n\r\n/** Classe para agrupar constantes relevantes para o core de assinatura\r\n */\r\nexport class CoreConstants\r\n{\r\n /** Protocolo de mensagem de requisição de assinatura */\r\n static readonly REQUEST_MSG_TYPE: string = \"qs.signer.request\";\r\n /** Protocolo de mensagem de resposta de assinatura */\r\n static readonly RESPONSE_MSG_TYPE: string = \"qs.signer.response\";\r\n /** Protocolo de proxy de mensagem de requisição de assinatura */\r\n static readonly PROXY_REQUEST_MSG_TYPE: string = \"qs.signer.proxy.request\";\r\n /** Protocolo de proxy de mensagem de resposta de assinatura */\r\n static readonly PROXY_RESPONSE_MSG_TYPE: string = \"qs.signer.proxy.response\";\r\n\r\n /** Operação de ping */\r\n static readonly OP_EXT_PING: string = \"EXT_PING\";\r\n /** Operação de finalização de sessão de assinatura */\r\n static readonly OP_EXT_RELEASE_SESSION: string = \"EXT_RELEASE_SESSION\";\r\n /** Operação de consulta de versão */\r\n static readonly OP_EXT_VERSION: string = \"EXT_VERSION\";\r\n /** Operação de consulta de certificados */\r\n static readonly OP_LIST_CERTS: string = \"LIST_CERTS\";\r\n /** Operação de obtenção de cadeia de certificados */\r\n static readonly OP_GET_CERT_CHAIN: string = \"GET_CERT_CHAIN\";\r\n /** Operação de assinatura */\r\n static readonly OP_SIGN: string = \"SIGN\";\r\n /** Operação de consulta de versão */\r\n static readonly OP_CANCEL: string = \"CANCEL\";\r\n\r\n static readonly EXT_TYPE_APPLET = \"applet\";\r\n static readonly EXT_TYPE_CHROME = \"chrome\";\r\n static readonly EXT_TYPE_GECKO = \"gecko\";\r\n\r\n /** Constante de nome do erro de java applet não suportado */\r\n static readonly ERR_JAVA_APPLET_NOT_SUPPORTED = \"qs.err.javaAppletNotSupported\";\r\n /** Constante de nome do erro de plataforma não suportada */\r\n static readonly ERR_PLATFORM_NOT_SUPPORTED = \"qs.err.platformNotSupported\";\r\n\r\n /** Id de sessão java compartilhada */\r\n static readonly SHARED_JAVA_SESSION_ID: string = \"shared\";\r\n}\r\n\r\n/** Classe para geração de id de requisição\r\n */\r\nexport class RequestIdGenerator\r\n{\r\n /** Id da origem da requisição\r\n */\r\n private readonly requestSourceId: string;\r\n /** Número sequencial do último id gerado\r\n */\r\n private sequence: number;\r\n\r\n /** Construtor\r\n * @param requestSourceId Id da origem da requisição\r\n */\r\n constructor(requestSourceId: string) {\r\n this.requestSourceId = requestSourceId;\r\n this.sequence = 0;\r\n }\r\n\r\n /** Gera próximo id de requisição\r\n * @param javaSessionId Id da sessão java\r\n * @returns Próximo id para a requisição de assinatura\r\n */\r\n next(javaSessionId: string): string {\r\n const seq = ++this.sequence;\r\n return javaSessionId + \"@\" + this.requestSourceId + \"|\" + seq;\r\n }\r\n\r\n /** Extrai o id da sessão java do id da requisição\r\n * @param requestId Id da requisição de assinatura\r\n * @returns Id da sessão java\r\n */\r\n extractJavaSessionId(requestId: string) : string {\r\n return requestId.split(\"@\")[0];\r\n }\r\n}\r\n\r\n\r\n\n\n\n// WEBPACK FOOTER //\n// ./lib/common.ts","import { EventEmitter, ListenerFn } from \"eventemitter3\";\r\n\r\nimport { CoreConstants, RequestIdGenerator, GenericErrorResultModel, CoreRequestModel, CoreResponseModel } from \"./common\";\r\n\r\nimport { SignatureInput } from \"./http-models\";\r\n\r\ntype ExtensionResponseCallback = (response: any, coreSession: AbstractJavaSession) => void;\r\n\r\ntype QueryExtensionVersionCallback = (arg: GenericErrorResultModel | Object) => void;\r\n\r\nabstract class WebExtMessageBroker \r\n{\r\n abstract init() : void;\r\n\r\n abstract dispose() : void;\r\n \r\n protected events: EventEmitter;\r\n\r\n constructor (protected wnd: Window) {\r\n this.events = new EventEmitter();\r\n }\r\n\r\n get_eventEmitter() : EventEmitter { return this.events; }\r\n}\r\n\r\nclass DefaultWebExtMessageBroker extends WebExtMessageBroker\r\n{\r\n private _requestListener: ListenerFn;\r\n\r\n private _responseListener: (ev: MessageEvent) => any;\r\n\r\n init(): void \r\n {\r\n //toda request postada no emitter vai ir para a window contendo a extensão\r\n this._requestListener = (rawRequest) => {\r\n this.wnd.postMessage(rawRequest, \"*\");\r\n };\r\n this.events.on(CoreConstants.REQUEST_MSG_TYPE, this._requestListener);\r\n\r\n //toda mensagem de resposta que chegar na window deve ir para o emitter\r\n this._responseListener = (msgEvent: MessageEvent) => {\r\n //pega dados da mensagem vinda no evento e garante que é uma resposta da extensão de assinatura\r\n const msg = msgEvent.data;\r\n if (msg && msg.type === CoreConstants.RESPONSE_MSG_TYPE) {\r\n this.events.emit(CoreConstants.RESPONSE_MSG_TYPE, msg);\r\n }\r\n };\r\n this.wnd.addEventListener(\"message\", this._responseListener);\r\n }\r\n \r\n dispose(): void\r\n {\r\n if (this._requestListener) {\r\n this.events.off(CoreConstants.REQUEST_MSG_TYPE, this._requestListener);\r\n this._requestListener = null;\r\n }\r\n if (this._responseListener) {\r\n this.wnd.removeEventListener(\"message\", this._responseListener);\r\n this._responseListener = null;\r\n }\r\n\r\n this.wnd = null;\r\n this.events = null;\r\n }\r\n}\r\n\r\nclass IFrameWebExtMessageBroker extends WebExtMessageBroker\r\n{\r\n private _requestListener: ListenerFn;\r\n\r\n private _responseListener: (ev: MessageEvent) => any;\r\n\r\n init(): void \r\n {\r\n //toda request postada no emitter vai ir para a window TOP\r\n this._requestListener = (rawRequest: CoreRequestModel) => {\r\n //tipo da mensagem muda para proxy\r\n rawRequest.type = CoreConstants.PROXY_REQUEST_MSG_TYPE;\r\n this.wnd.top.postMessage(rawRequest, \"*\");\r\n };\r\n this.events.on(CoreConstants.REQUEST_MSG_TYPE, this._requestListener);\r\n\r\n //mensagens de resposta da extensão acabam sendo redirecionadas para janela da extensão\r\n this._responseListener = (msgEvent: MessageEvent) => {\r\n //pega dados da mensagem vinda no evento e garante que é uma resposta da extensão de assinatura\r\n const msg = msgEvent.data;\r\n if (msg && msg.type === CoreConstants.PROXY_RESPONSE_MSG_TYPE) {\r\n this.events.emit(CoreConstants.RESPONSE_MSG_TYPE, msg);\r\n }\r\n };\r\n this.wnd.addEventListener(\"message\", this._responseListener);\r\n }\r\n\r\n dispose(): void\r\n {\r\n if (this._requestListener) {\r\n this.events.off(CoreConstants.REQUEST_MSG_TYPE, this._requestListener);\r\n this._requestListener = null;\r\n }\r\n if (this._responseListener) {\r\n this.wnd.removeEventListener(\"message\", this._responseListener);\r\n this._responseListener = null;\r\n }\r\n\r\n this.wnd = null;\r\n this.events = null;\r\n }\r\n}\r\n\r\nexport class IFrameContainerWebExtMessageHub\r\n{\r\n private myWindow: Window;\r\n private iframeWindow: Window;\r\n\r\n init(window: Window, iframe: HTMLIFrameElement)\r\n {\r\n //salva as janelas envolvidas no processo\r\n this.myWindow = window;\r\n this.iframeWindow = iframe.contentWindow;\r\n\r\n //trata mensagens que estejam chegando em nossa janela\r\n this.myWindow.addEventListener(\"message\", (msgEvent: MessageEvent) =>\r\n {\r\n const msg = msgEvent.data;\r\n if (msg && typeof msg.type === \"string\") \r\n {\r\n //caso for uma request vinda do iframe, vamos re-enviar ela para nossa janela com tipo certo (e como nós sendo source)\r\n if (msgEvent.source === this.iframeWindow && msg.type === CoreConstants.PROXY_REQUEST_MSG_TYPE) {\r\n msg.type = CoreConstants.REQUEST_MSG_TYPE;\r\n this.myWindow.postMessage(msg, \"*\");\r\n }\r\n //se for uma resposta vinda da extensão, vamos postar ela no iframe como tipo 'proxy'\r\n else if (msg.type === CoreConstants.RESPONSE_MSG_TYPE) \r\n {\r\n msg.type = CoreConstants.PROXY_RESPONSE_MSG_TYPE;\r\n this.iframeWindow.postMessage(msg, \"*\");\r\n }\r\n }\r\n });\r\n }\r\n}\r\n\r\ninterface RequestInfo\r\n{\r\n readonly requestObj: any;\r\n readonly callback: (arg: any, coreSession: AbstractJavaSession) => void;\r\n}\r\n\r\n/** Classe que representa uma sessão java para assinatura\r\n */\r\nexport abstract class AbstractJavaSession\r\n{\r\n /** Indica se sessão está pronta para uso */\r\n private isReady: boolean = false;\r\n\r\n /** Disparador de eventos de notificação */\r\n private events: EventEmitter = new EventEmitter();\r\n\r\n /** Lista de requisições pendentes */\r\n private pendingRequests: { [id: string] : RequestInfo } = {};\r\n\r\n /** Construtor\r\n * @param javaSessionId Id da sessão\r\n * @param statisticsEnabled Define se deve coletar estatísticas\r\n * @param signatureResponseMaxInterval Tempo máximo, em milisegundos, para esperar resposta da extensão\r\n * @param idGenerator Objeto responsável pela geração de id de requisições\r\n */\r\n constructor(\r\n private javaSessionId: string,\r\n private statisticsEnabled: boolean,\r\n private signatureResponseMaxInterval: number,\r\n private idGenerator: RequestIdGenerator\r\n ) { }\r\n\r\n protected abstract postJavaRequest(reqObj: any);\r\n\r\n //sub:_handleCancelResponse\r\n private handleCancelResponse(response: any) : void {\r\n //percorre todas as tarefas canceladas e remove da lista de pendentes\r\n const cancelled: string[] = response.result && response.result.cancelledRequests;\r\n if (cancelled) {\r\n for (let i = 0, _i = cancelled.length; i < _i; ++i) {\r\n const cancelledId: string = cancelled[i];\r\n delete this.pendingRequests[cancelledId];\r\n }\r\n }\r\n }\r\n\r\n /** Verifica se sessão está pronta para utilização\r\n * @returns Verdadeiro se sessão está pronta para utilização, senão falso\r\n */\r\n is_ready(): boolean {\r\n return this.isReady;\r\n }\r\n\r\n /** Retorna id da sessão java\r\n * @returns Id da sessão java\r\n */\r\n get_javaSessionId(): string {\r\n return this.javaSessionId;\r\n }\r\n\r\n /** Verifica se é uma sessão compartilhada\r\n * @returns Verdadeiro se é uma sessão compartilhada, senão falso\r\n */\r\n is_shared(): boolean {\r\n return this.get_javaSessionId() === CoreConstants.SHARED_JAVA_SESSION_ID;\r\n }\r\n\r\n /** Evento disparado quando o estado da sessão muda para ready\r\n */\r\n onReady(handler: (any) => void) : void {\r\n this.events.once(\"ready\", handler);\r\n }\r\n\r\n /** Interpreta respostas de requisições de assinatura. Chamando callback das requisições completadas\r\n * @param response Resposta da requisição de assinatura\r\n */\r\n internalHandleResponse(response: any) : void {\r\n //procura request pendente para o ID da resposta\r\n const pendingReq: RequestInfo = this.pendingRequests[response.id];\r\n if (!pendingReq) {\r\n return console.error(\"[AbstractJavaSession] Resposta com ID '\" + response.id + \"' não possui request pendente associada. Resposta sendo ignorada\");\r\n }\r\n //remove request da lista de pendentes, se não tiver próximo pacote\r\n if (!response.hasNext) {\r\n delete this.pendingRequests[response.id];\r\n }\r\n\r\n //se a resposta foi do comando de cancelamento, faz tratamento dela\r\n if (response.operation === CoreConstants.OP_CANCEL) {\r\n this.handleCancelResponse(response);\r\n }\r\n\r\n //executa callback da request, passando a resposta\r\n if (pendingReq.callback) {\r\n //executa callback\r\n try { pendingReq.callback(response, this); }\r\n catch (ex) {\r\n console.error(\"[AbstractJavaSession] Callback disparou exception\");\r\n console.dir(response);\r\n console.dir(ex);\r\n }\r\n }\r\n }\r\n \r\n internalNotifyReadiness() : void {\r\n this.isReady = true;\r\n this.events.emit(\"ready\", this);\r\n }\r\n\r\n /** Envia mensagem para extensão\r\n * @param operation Operação a ser realizada pela extensão\r\n * @param args Parâmetros para operação a ser realizada\r\n * @param callbackMethod Callback para processar resposta\r\n * @returns Id da requisição\r\n */\r\n postRequest(operation: string, args: any, callbackMethod: ExtensionResponseCallback) : string {\r\n //cria ID para request\r\n const reqId = this.idGenerator.next(this.get_javaSessionId());\r\n\r\n //verifica se é para computarmos estatísticas (hoje só estamos interessados para requests 'SIGN')\r\n const calcStats = this.statisticsEnabled && operation === CoreConstants.OP_SIGN;\r\n\r\n //cria objeto de request\r\n const reqObj: any = {\r\n id: reqId,\r\n type: CoreConstants.REQUEST_MSG_TYPE,\r\n operation: operation,\r\n computeStatistics: calcStats\r\n };\r\n //adiciona argumentos, se houver\r\n if (args) reqObj.arguments = args;\r\n\r\n //adiciona informação da request como pendente\r\n this.pendingRequests[reqId] = { requestObj: reqObj, callback: callbackMethod };\r\n\r\n //posta para o java\r\n this.postJavaRequest(reqObj);\r\n\r\n //retorna id da request\r\n return reqId;\r\n }\r\n\r\n /** Lista certificados para utilizar na assinatura\r\n * @param callbackMethod Callback para processar resposta\r\n * @param includeChain Define se deve ser incluída toda a cadeia de certificados no retorno\r\n * @param reloadStore Define se deve atualizar store de certificados\r\n * @returns Id da requisição gerada\r\n */\r\n listCertificates(callbackMethod: ExtensionResponseCallback, includeChain?: boolean, reloadStore?: boolean, afterTo: number = 0) : string {\r\n //monta argumentos para a listagem de certificados\r\n const args: any = {\r\n includeChain: !!includeChain,\r\n reloadStore: !!reloadStore,\r\n afterTo: afterTo\r\n };\r\n //posta request\r\n return this.postRequest(CoreConstants.OP_LIST_CERTS, args, callbackMethod);\r\n }\r\n\r\n /** Busca cadeia de certificados\r\n * @param certId Id do certificado do qual se deseja buscar a cadeia de certificados\r\n * @param callbackMethod Callback para processar resposta \r\n * @returns Id da requisição gerada\r\n */\r\n getCertChain(certId: string, callbackMethod: ExtensionResponseCallback) : string {\r\n const args: any = { certID: certId };\r\n return this.postRequest(CoreConstants.OP_GET_CERT_CHAIN, args, callbackMethod);\r\n }\r\n\r\n /** Realiza assinatura em um lote de inputs\r\n * @param certId Id do certifica a ser utilizado para assinatura\r\n * @param algorithm Algorítmo da assinatura a ser utilizado\r\n * @param inputs Lote de inputs para assinar\r\n * @param callbackMethod Callback para processar resposta\r\n * @returns Id da requisição gerada\r\n */\r\n sign(certId: string, algorithm: string, inputs: SignatureInput[], callbackMethod: ExtensionResponseCallback) : string {\r\n const args: any = {\r\n certID: certId,\r\n algorithm: algorithm,\r\n inputs: inputs\r\n };\r\n\r\n //verifica se tem tempo customizado de retorno para enviar\r\n if (this.signatureResponseMaxInterval) args.responseMaxInterval = this.signatureResponseMaxInterval;\r\n\r\n return this.postRequest(CoreConstants.OP_SIGN, args, callbackMethod);\r\n }\r\n \r\n //sub:_cancelRequests\r\n private internalCancelRequests(requests: string[], callbackMethod: ExtensionResponseCallback) : string {\r\n //verifica se tem requests para filtrar\r\n const args: any = requests ? { requests: requests } : null;\r\n //posta request para o java\r\n return this.postRequest(CoreConstants.OP_CANCEL, args, callbackMethod);\r\n }\r\n\r\n /** Cancela uma requisição\r\n * @param requestId Id da requisição a ser cancelada\r\n * @param callbackMethod Callback para processar resposta\r\n * @returns Id da requisição de cancelamento\r\n */\r\n cancelRequest(requestId: string, callbackMethod: ExtensionResponseCallback) : string {\r\n //invoca cancelamento de requests\r\n return this.internalCancelRequests([requestId], callbackMethod);\r\n }\r\n\r\n /** Cancela todas as requisições pendentes\r\n * @param callbackMethod Callback para processar resposta\r\n * @returns Id da requisição de cancelamento\r\n */\r\n cancelAllRequests(callbackMethod: ExtensionResponseCallback) : string {\r\n return this.internalCancelRequests(null, callbackMethod);\r\n }\r\n\r\n /** Cancelamento de todas as requests chamado no dispose\r\n */\r\n protected cancelAllRequestsOnDispose() : void {\r\n this.cancelAllRequests(null);\r\n }\r\n\r\n /** Limpa referências do objeto\r\n */\r\n public internalDispose() : void {\r\n this.cancelAllRequestsOnDispose();\r\n\r\n this.events = null;\r\n this.javaSessionId = null;\r\n this.pendingRequests = null;\r\n this.idGenerator = null;\r\n }\r\n}\r\n\r\n/** Classe que representa uma sessão do applet\r\n */\r\nexport class AppletSession extends AbstractJavaSession\r\n{\r\n /** \r\n * @param appletId Id do applet\r\n * @param jnlpPath Caminho do applet\r\n * @param logEnabled Define se o log de assinatura está habilitado\r\n * @param signerCoreElement Elemento html do script control do core de assinatura\r\n */\r\n constructor(\r\n private appletId: string,\r\n private jnlpPath: string,\r\n private logEnabled: boolean,\r\n private signerCoreElement: HTMLElement,\r\n javaSessionId: string,\r\n statisticsEnabled: boolean,\r\n signatureResponseMaxInterval: number,\r\n idGenerator: RequestIdGenerator)\r\n {\r\n super(javaSessionId, statisticsEnabled, signatureResponseMaxInterval, idGenerator);\r\n\r\n this.initializeApplet();\r\n }\r\n\r\n /** Retorna o id do applet\r\n * @returns Id do applet\r\n */\r\n get_appletId() : string {\r\n return this.appletId;\r\n }\r\n\r\n /** Envia mensagem para o applet\r\n * @param reqObj Json com parâmtros para execução da requisição\r\n */\r\n protected postJavaRequest(reqObj: any) : void {\r\n //se não tem applet ID, é pq está fazendo dispose (não precisa enviar nada para o java)\r\n const appletId: string = this.get_appletId();\r\n if (!appletId) return;\r\n\r\n //converte request para json e envia para o applet\r\n const jsonStr: string = JSON.stringify(reqObj);\r\n (document.getElementById(appletId)).executeRequest(jsonStr);\r\n }\r\n\r\n //sub:_initializeApplet\r\n private initializeApplet() : void {\r\n //cria elemento embed\r\n const jApplet: HTMLElement = document.createElement(\"embed\");\r\n \r\n //atributos do elemento\r\n const attributes: { [key: string] : string } = {\r\n \"id\": this.get_appletId(),\r\n \"type\": \"application/x-java-applet;version=1.6\",\r\n \"width\": \"0\",\r\n \"height\": \"0\",\r\n \"jnlp_href\": this.jnlpPath,\r\n \"scriptable\": \"true\",\r\n \"qs-response-delivery\": \"__QuickSoft_DigitalSignature_Web_SignerCore_handleAppletResponse\",\r\n \"qs-readiness-notification\": \"__QuickSoft_DigitalSignature_Web_SignerCore_notifyAppletReady\",\r\n \"qs-java-session\": this.get_javaSessionId()\r\n };\r\n //põe os atributos no elemento\r\n for (let key in attributes) {\r\n jApplet.setAttribute(key, attributes[key]);\r\n }\r\n\r\n //bota como position fixed, indo para fora da página (display none ou visibility hidden faz com que o applet não funcione)\r\n jApplet.style.position = \"fixed\";\r\n jApplet.style.top = \"-1000px\";\r\n\r\n //verifica se tem que habilitar o log\r\n if (this.logEnabled) {\r\n jApplet.setAttribute(\"qs-enable-log\", \"true\");\r\n }\r\n\r\n //se não for shared, cria uma jvm para cada embed\r\n if (!this.is_shared()) {\r\n jApplet.setAttribute(\"separate_jvm\", \"true\");\r\n }\r\n\r\n //faz append como irmão do elemento do signerCore\r\n this.signerCoreElement.parentNode.insertBefore(jApplet, this.signerCoreElement.nextSibling);\r\n }\r\n\r\n /** Limpa referências do objeto\r\n */\r\n public internalDispose() : void {\r\n //remove elemento de applet\r\n const elem: HTMLElement = document.getElementById(this.get_appletId());\r\n elem.parentNode.removeChild(elem);\r\n\r\n this.appletId = null;\r\n\r\n super.internalDispose();\r\n }\r\n}\r\n\r\n/** Sessão de assinatura via extensão web \r\n */\r\nexport class WebExtSession extends AbstractJavaSession\r\n{\r\n private skipSessionRelease: boolean = false;\r\n\r\n /** Construtor\r\n * @param javaSessionId Id da sessão\r\n * @param statisticsEnabled Define se deve coletar estatísticas\r\n * @param signatureResponseMaxInterval Tempo máximo, em milisegundos, para esperar resposta da extensão\r\n * @param idGenerator Objeto responsável pela geração de id de requisições\r\n * @param messageBroker Message broker, para comunicação com extensão do navegador\r\n */\r\n constructor(\r\n javaSessionId : string,\r\n statisticsEnabled : boolean,\r\n signatureResponseMaxInterval : number,\r\n idGenerator : RequestIdGenerator,\r\n \r\n private messageBroker : EventEmitter\r\n )\r\n {\r\n super(javaSessionId, statisticsEnabled, signatureResponseMaxInterval, idGenerator);\r\n }\r\n\r\n /** Verifica se sessão não precisa executar o release\r\n * @returns Verdadeiro se sessão não precisa executar o release, senão falso \r\n */\r\n get_skipSessionRelease() : boolean {\r\n return this.skipSessionRelease;\r\n }\r\n\r\n /** Define se sessão não precisa executar o release\r\n * @param skipSessionRelease Verdadeiro para a sessão não precisar executar o release, senão falso \r\n */\r\n set_skipSessionRelease(skipSessionRelease: boolean) : void {\r\n this.skipSessionRelease = skipSessionRelease;\r\n }\r\n\r\n /** Envia mensagem de ping para a extensão\r\n * @param messageBroker Broker de mensagens para extensão\r\n */\r\n static sendPingCommand(messageBroker: EventEmitter) : void {\r\n //monta request de \"ping\"\r\n const reqObj = {\r\n id: \"?\",\r\n type: CoreConstants.REQUEST_MSG_TYPE,\r\n operation: CoreConstants.OP_EXT_PING\r\n };\r\n //posta request para extensão\r\n messageBroker.emit(CoreConstants.REQUEST_MSG_TYPE, reqObj);\r\n }\r\n\r\n /** Envia mensagem para a extensão\r\n * @param reqObj Objeto com parâmetros para execução\r\n */\r\n protected postJavaRequest(reqObj: any) : void {\r\n //posta mensagem no broker\r\n this.messageBroker.emit(CoreConstants.REQUEST_MSG_TYPE, reqObj);\r\n }\r\n\r\n /** Cancela todas as requests pendentes, utilizado no dispose\r\n */\r\n protected cancelAllRequestsOnDispose() : void {\r\n //se esta sessão for compartilhada, apenas chama o método base de dispose de requisições\r\n if (this.is_shared()) {\r\n super.cancelAllRequestsOnDispose();\r\n }\r\n else {\r\n //envia comando de release da sessão, se esta sessão não for shared\r\n this.postRequest(CoreConstants.OP_EXT_RELEASE_SESSION, null, null);\r\n }\r\n }\r\n\r\n /** Verifica versão da extensão que o usuário tem instalada\r\n * @param callbackMethod Callback para processamento do retorno\r\n * @param bypassCache Define se deve limpa cache antes enviar requisição\r\n * @returns Id da requisição\r\n */\r\n getExtensionVersion(callbackMethod: ExtensionResponseCallback, bypassCache: boolean = false) : string {\r\n //argumentos para a obtenção da versão\r\n const args: any = bypassCache ? { bypassCache: true } : null;\r\n //posta requisição de versão da app\r\n return this.postRequest(CoreConstants.OP_EXT_VERSION, args, callbackMethod);\r\n }\r\n}\r\n\r\n/** Handler para mensagem de applet pronto para utilização\r\n * @param javaSessionId Id da sessão criada\r\n */\r\nexport function __QuickSoft_DigitalSignature_Web_SignerCore_notifyAppletReady(javaSessionId: string) : void {\r\n //verifica se tem singleton registrado\r\n const instance = SignerCore.getInstance();\r\n if (!instance) return console.error(\"Recebido sinal de 'ready' do applet de assinatura, porém nenhuma instância de SignerCore está registrada\");\r\n //verifica se foi informada a sessão java\r\n if (!javaSessionId) return console.error(\"Parâmetro 'javaSessionId' não foi informado no método de notificação de 'ready' para applet\");\r\n \r\n //invoca tratamento de readiness de applet\r\n instance.internalHandleAppletReadyResponse(javaSessionId);\r\n}\r\n\r\n/** Handler para respostas de requisições ao applet. Transforma json retornado em objeto\r\n * @param rawResponse Json com retorno da requisição\r\n */\r\nexport function __QuickSoft_DigitalSignature_Web_SignerCore_handleAppletResponse(rawResponse: string) : void {\r\n //verifica se tem singleton registrado\r\n const instance = SignerCore.getInstance();\r\n if (!instance) return console.error(\"Recebida response do applet de assinatura, porém nenhuma instância de SignerCore está registrada\");\r\n\r\n //como resposta veio do applet, ela está em string json (temos de converter para objeto). Chama o tratamento de resposta\r\n const respObj = JSON.parse(rawResponse);\r\n instance.internalHandleResponse(respObj);\r\n}\r\n\r\nexport enum SupportedPlatform\r\n{\r\n Unsupported = 0,\r\n IE = 1,\r\n GoogleChrome = 2,\r\n Firefox_Applet = 3,\r\n Firefox_WebExt = 4\r\n}\r\n\r\n/** Script control para utilização da assinatura digital\r\n */\r\nexport class SignerCore\r\n{\r\n private static instance: SignerCore;\r\n\r\n private useWebExt: boolean = false;\r\n \r\n private webExtReady: boolean = false;\r\n\r\n private webExtPingInterval: number;\r\n\r\n private idGenerator: RequestIdGenerator;\r\n\r\n private javaSessionSequence: number = 0;\r\n\r\n private javaSessionsCount: number = 0;\r\n\r\n private javaSessions: { [id: string] : AbstractJavaSession } = {};\r\n\r\n private webExtMessageBroker: WebExtMessageBroker;\r\n\r\n private handleWindowMessageHandler: (MessageEvent) => void;\r\n\r\n /** Construtor\r\n * @param coreHtmlElementId Id do elemento html\r\n * @param requestSourceId Id da origem da requisição\r\n * @param jnlpPath Caminho do applet\r\n * @param signatureResponseMaxInterval Tempo máximo, em milisegundos, para esperar resposta da requisição de assinatura\r\n * @param statisticsEnabled Define se coleta de estatísticas será habilitada\r\n * @param sessionIsolationEnabled Define se sessão isolada será habilitadas\r\n * @param logEnabled Define se o log de assinatura será habilitado\r\n * @param forceAppletUsage Define se deve utilizar o applet obrigatóriamente\r\n * @param framed Define se este componente está sendo utilizando dentro de um iframe\r\n * @param appletSupportChecker Função para verificar se o browser suporta utilização de applet\r\n */\r\n constructor(\r\n private coreHtmlElementId: string,\r\n private requestSourceId: string,\r\n private jnlpPath: string,\r\n private signatureResponseMaxInterval: number = 1000,\r\n private statisticsEnabled: boolean = false,\r\n private sessionIsolationEnabled: boolean = true,\r\n private logEnabled: boolean = false,\r\n private forceAppletUsage: boolean = false,\r\n private framed: boolean = false,\r\n private appletSupportChecker: ()=>boolean = null\r\n ) {\r\n // Se não informado considera que sempre suporta\r\n if (!this.appletSupportChecker) this.appletSupportChecker = function() { return true; };\r\n }\r\n\r\n /**\r\n * Retorna se este componente está configurado para rodar dentro de um iframe\r\n */\r\n get_framed(): boolean { return this.framed; }\r\n /**\r\n * Seta configuração que habilita este componente rodar dentro de um iframe\r\n * @param framed Indicador se está dentro de iframe\r\n */\r\n set_framed(framed: boolean): void { this.framed = framed; }\r\n\r\n /** Busca id da origem das requisições\r\n * @returns Id da origem das requisições\r\n */\r\n get_requestSourceId() : string {\r\n return this.requestSourceId;\r\n }\r\n\r\n /** Define id da origem das requisições\r\n * @param requestSourceId Novo id da origem das requisições\r\n */\r\n set_requestSourceId(requestSourceId: string) : void {\r\n this.requestSourceId = requestSourceId;\r\n }\r\n\r\n /** Busca caminho do applet\r\n * @returns caminho do applet\r\n */\r\n get_jnlpPath() : string {\r\n return this.jnlpPath;\r\n }\r\n\r\n /** Define caminho do applet\r\n * @param Novo caminho do applet\r\n */\r\n set_jnlpPath(jnlpPath: string) : void {\r\n this.jnlpPath = jnlpPath;\r\n }\r\n\r\n /** Verifica se o log de assinatura está habilitado\r\n * @returns Verdadeiro se o log de assinatura está habilitado, senão falso\r\n */\r\n get_logEnabled() : boolean {\r\n return this.logEnabled;\r\n }\r\n\r\n /** Define se log de assinatura deve ser habilitado\r\n * @param enabled Verdadeiro para habilitar log de assinatura, senão falso\r\n */\r\n set_logEnabled(enabled: boolean) : void {\r\n this.logEnabled = enabled;\r\n }\r\n\r\n /** Verifica se a coleta de estatísticas está habilitada\r\n * @returns Verdadeiro se a coleta de estatísticas está habilitada, senão falso\r\n */\r\n get_statisticsEnabled() : boolean {\r\n return this.statisticsEnabled;\r\n }\r\n\r\n /** Define se deve habilitar a coleta de estatísticas\r\n * @param enabled Verdadeiro para habilitar a coleta de estatísticas, senão falso\r\n */\r\n set_statisticsEnabled(enabled: boolean) : void {\r\n this.statisticsEnabled = enabled;\r\n }\r\n\r\n /** Verifica se deve utilizar sessão isolada\r\n * @returns Verdadeiro se deve utilizar sessão isolada, senão falso\r\n */\r\n get_sessionIsolationEnabled() : boolean {\r\n return this.sessionIsolationEnabled;\r\n }\r\n \r\n /** Define se deve utilizar sessão isolada\r\n * @param enabled Verdadeiro para forçar utilização de sessão isolada, senão falso\r\n */\r\n set_sessionIsolationEnabled(enabled: boolean) : void {\r\n this.sessionIsolationEnabled = enabled;\r\n }\r\n\r\n /** Verifica se obriga utilização do applet\r\n * @return Verdadeiro se a utilização do applet é obrigatória, senão falso\r\n */\r\n get_forceAppletUsage() : boolean {\r\n return this.forceAppletUsage;\r\n }\r\n \r\n /** Define se obriga utilização do applet\r\n * @param forceAppletUsage Verdadeiro para forçar utilização do applet, senão falso\r\n */\r\n set_forceAppletUsage(forceAppletUsage: boolean) : void {\r\n this.forceAppletUsage = forceAppletUsage;\r\n }\r\n\r\n /** Busca tempo máximo, em milisegundos, para esperar resposta de requisição de assinatura\r\n * @returns Tempo em milisegundos\r\n */\r\n get_signatureResponseMaxInterval() : number {\r\n return this.signatureResponseMaxInterval;\r\n }\r\n \r\n /** Define tempo máximo, em milisegundos, para esperar resposta de requisição de assinatura\r\n * @param signatureResponseMaxInterval Tempo em milisegundos\r\n */\r\n set_signatureResponseMaxInterval(signatureResponseMaxInterval: number) : void {\r\n this.signatureResponseMaxInterval = signatureResponseMaxInterval;\r\n }\r\n\r\n /** Busca gerador de id de requisição\r\n * @returns Instância do objeto responsável pela geração dos ids de requisições\r\n */\r\n get_requestIdGenerator() : RequestIdGenerator {\r\n return this.idGenerator;\r\n }\r\n\r\n /** Verifica se utiliza extensão web\r\n * @returns Verdadeiro se utiliza extensão web, senão falso\r\n */\r\n get_useWebExtension() : boolean {\r\n return this.useWebExt;\r\n }\r\n \r\n /** Verifica se extensão web está pronta para utilização\r\n * @returns Verdadeiro se extensão está pronta para utilização, senão falso\r\n */\r\n get_webExtensionReady() : boolean {\r\n return this.webExtReady;\r\n }\r\n\r\n static getInstance() : SignerCore {\r\n return SignerCore.instance;\r\n }\r\n\r\n static detectPlatform() : SupportedPlatform\r\n {\r\n //browsername em lowercase\r\n const browserName: string = window.navigator.userAgent.toLowerCase();\r\n\r\n //edge ou opera (prefixos específicos)\r\n let m:RegExpExecArray = (/\\s(edge|opr)\\/[\\d\\.]+/).exec(browserName);\r\n if (m) return SupportedPlatform.Unsupported;\r\n\r\n //se for o chrome vai ter tal fragmento na versão\r\n if ((/\\schrome\\/[\\d\\.]+/).test(browserName)) return SupportedPlatform.GoogleChrome;\r\n\r\n //se for safari vai ter isso escrito\r\n if ((/\\ssafari\\/[\\d\\.]+/).test(browserName)) return SupportedPlatform.Unsupported;\r\n\r\n //se é firefox vai ter \"gecko\" com versão\r\n if ((/\\sgecko\\/[\\d]+/).test(browserName)) {\r\n //pega versão do firefox\r\n m = (/rv:(\\d+)\\.\\d/).exec(browserName);\r\n if (m) {\r\n if (Number(m[1]) >= 52) return SupportedPlatform.Firefox_WebExt;\r\n }\r\n //firefox com applet\r\n return SupportedPlatform.Firefox_Applet;\r\n }\r\n\r\n //se tiver propriedade \"documentMode\", vamos acreditar que é Internet Explorer\r\n if (\"documentMode\" in window.document) return SupportedPlatform.IE;\r\n\r\n //não conhecemos o navegador\r\n return SupportedPlatform.Unsupported;\r\n }\r\n\r\n //sub:_throwCustomError\r\n private throwCustomError(message: string, name: string) {\r\n const e = new Error(message);\r\n e.name = name;\r\n throw e;\r\n }\r\n\r\n //sub:_queryExtensionVersionInternal\r\n private queryExtensionVersionInternal(callback: QueryExtensionVersionCallback, bypassCache: boolean) : void {\r\n const coreRef: SignerCore = this;\r\n this.newJavaSession((session: WebExtSession) => {\r\n //se for uma sessão única que criamos para esta operação, flagga que pode fazer skip do comando de release de\r\n //sessão, uma vez que este tipo de request não gera necessariamente uma sessão na app nativa e vamos usar a sessão só para isso\r\n if (!session.is_shared()) {\r\n session.set_skipSessionRelease(true);\r\n }\r\n //envia comando de requisição de versão\r\n session.getExtensionVersion(function() {\r\n //destrói sessão que usamos para isso\r\n coreRef.destroySession(session);\r\n //invoca callback com os argumentos recebidos na função\r\n callback.apply(window, arguments);\r\n }, bypassCache);\r\n });\r\n }\r\n\r\n /** Busca versão da extensão sendo utilizada\r\n * @param callback Callback para processamento da resposta\r\n * @param bypassCache Define se deve ser limapado o cache antes da consulta da versão\r\n * @param readinessTimeout Tempo, em milisegundos, para esperar criação da sessão\r\n */\r\n queryExtensionVersion(callback : QueryExtensionVersionCallback, bypassCache: boolean = false, readinessTimeout: number = 3000) : void {\r\n //verifica se estamos usando a extensão web\r\n if (!this.get_useWebExtension()) {\r\n throw new Error(\"Não é possível pedir versão da instalação da extensão web quando este objeto não estiver dependendo de tal\");\r\n }\r\n\r\n //se extensão já estiver ready, invoca o método de pegar versão diretamente\r\n if (this.get_webExtensionReady()) {\r\n return this.queryExtensionVersionInternal(callback, bypassCache);\r\n }\r\n \r\n //vamos esperar até a extensão ficar pronta (3 segundos no máximo, por default). Vamos fazer uma request por décimo de segundo.\r\n readinessTimeout = readinessTimeout || 3000;\r\n const interval: number = 100;\r\n\r\n //contexto da espera\r\n const ctx = {\r\n intervalRef: null,\r\n thisRef: this,\r\n attempts: 0,\r\n attempts_limit: Math.ceil(readinessTimeout / interval)\r\n };\r\n\r\n //função de espera até extensão estiver \"ready\"\r\n const checkMethod = () => {\r\n //verifica se está pronta\r\n const isReady: boolean = ctx.thisRef.get_webExtensionReady();\r\n\r\n //se ainda não chegamos em um estado terminal de nossa espera, vamos deixar para a próxima\r\n const keepWaiting: boolean = !isReady && (++ctx.attempts < ctx.attempts_limit);\r\n if (keepWaiting) return;\r\n\r\n //limpa nosso interval\r\n clearInterval(ctx.intervalRef);\r\n ctx.intervalRef = null;\r\n\r\n //se extensão está pronta, vamos invocar o método de pedir versão da extensão\r\n if (isReady) return ctx.thisRef.queryExtensionVersionInternal(callback, bypassCache);\r\n\r\n //se extensão não respondeu em tempo hábil, ela não está instalada (vamos invocar o callback descrevendo este erro)\r\n callback({\r\n error: {\r\n type: \"web_error.appNotInstalled\",\r\n msg: \"Extensão web não instalada\"\r\n }\r\n });\r\n };\r\n\r\n //inicia intervalo de probe se está pronta a extensão\r\n ctx.intervalRef = setInterval(checkMethod, interval);\r\n }\r\n\r\n //sub: _detectExtension\r\n private detectExtension(platform:SupportedPlatform) : void\r\n {\r\n //se for para usar applet mesmo (forma forçada)\r\n if (this.get_forceAppletUsage()) {\r\n this.useWebExt = false;\r\n return;\r\n }\r\n\r\n //caso for navegador legacy, que não suporta extensões deve ser usado applet\r\n switch (platform)\r\n {\r\n case SupportedPlatform.Firefox_Applet:\r\n case SupportedPlatform.IE:\r\n this.useWebExt = false;\r\n return;\r\n }\r\n\r\n //vamos tentar com extensão mesmo\r\n this.useWebExt = true;\r\n }\r\n\r\n //sub: _disposeWebExtensionPing\r\n private disposeWebExtensionPing() : void {\r\n clearInterval(this.webExtPingInterval);\r\n this.webExtPingInterval = null;\r\n }\r\n\r\n //sub: _initializeWebExtensionPing\r\n /**\r\n * Inicializa mecanismo de ping para extensão\r\n * @param messageBroker Message broker para eventos de extensão\r\n */\r\n private initializeWebExtensionPing(messageBroker: EventEmitter) : void {\r\n //envia primeiro ping\r\n WebExtSession.sendPingCommand(messageBroker);\r\n\r\n //configuração do contexto de ping\r\n const ctx = {\r\n interval: 100,\r\n thisRef: this,\r\n attempts: 0,\r\n //tenta por 1 minuto (10x por segundo x 60 segundos\r\n attempts_limit: 10 * 60\r\n };\r\n\r\n //de tempos em tempos, envia um ping para a extensão web\r\n const pingMethod = () => {\r\n //variável que indica se temos que parar o processo de ping (primeiro critério é já termos uma resposta positiva do ping)\r\n let stopPing: boolean = ctx.thisRef.webExtReady;\r\n\r\n //executa ping, se necessário\r\n if (!stopPing) {\r\n WebExtSession.sendPingCommand(messageBroker);\r\n //contabiliza execução e avalia se não estourou o limite de execuções\r\n stopPing = (++ctx.attempts >= ctx.attempts_limit);\r\n }\r\n\r\n //verifica se deve parar o processo de ping\r\n if (stopPing) ctx.thisRef.disposeWebExtensionPing();\r\n };\r\n\r\n //registra chamadas em intervalo\r\n this.webExtPingInterval = window.setInterval(pingMethod, ctx.interval);\r\n }\r\n\r\n //sub: _handleExtensionPingResponse\r\n private handleExtensionPingResponse() : void {\r\n //verifica se já não foi feito o tratamento de extensão web pronta para uso\r\n if (this.webExtReady) return;\r\n\r\n //marca como pronta para uso a extensão web e faz dispose do processo de ping na extensão\r\n this.webExtReady = true;\r\n this.disposeWebExtensionPing();\r\n\r\n //percorre sessões sendo tratadas e notifica que elas estão ready\r\n for (let key in this.javaSessions) {\r\n const sess: AbstractJavaSession = this.javaSessions[key];\r\n sess.internalNotifyReadiness();\r\n }\r\n }\r\n\r\n /** Handler para mensagem de applet pronto para utilização\r\n * @param javaSessionId Id da sessão \r\n */\r\n internalHandleAppletReadyResponse(javaSessionId: string) : void {\r\n //pega sessão java com o ID passado\r\n const sess = this.javaSessions[javaSessionId];\r\n if (!sess) return console.error(\"[SignerCore] Recebido 'ready' de um applet de sessão desconhecida: \" + javaSessionId);\r\n\r\n //invoca método notificando que tal sessão está \"ready\"\r\n sess.internalNotifyReadiness();\r\n }\r\n\r\n /** Handler para resposta de requisições. Verifica se resposta recebida é de uma requisição conhecida\r\n * @param respObj Objeto de resposta da requisição\r\n */\r\n internalHandleResponse(respObj: any) : void {\r\n //TODO: tipar 'respObj' quando souber certinho o que é\r\n\r\n //extrai ID da sessão à partir do ID da response\r\n const javaSessionId: string = this.get_requestIdGenerator().extractJavaSessionId(respObj.id);\r\n\r\n //pega sessão sendo gerenciada por este controle\r\n const javaSession: AbstractJavaSession = this.javaSessions[javaSessionId];\r\n if (!javaSession) {\r\n //se estivermos usando extensão do chrome e a mensagem for de release session, é normal não termos mais sessão java registrada aqui\r\n if (respObj.operation === CoreConstants.OP_EXT_RELEASE_SESSION) return;\r\n //loga erro que não encontrou sessão para a mensagem\r\n console.error(\"[SignerCore] Recebida resposta para sessão inexistente\");\r\n return console.dir(respObj);\r\n }\r\n\r\n //repassa mensagem para a sessão\r\n javaSession.internalHandleResponse(respObj);\r\n }\r\n\r\n //sub: _handleWindowMessage\r\n private handleWindowMessage(responseMessage: CoreResponseModel) : void\r\n {\r\n //se for uma resposta para comando de \"ping\", chama tratamento adequado, caso contrário chama tratamento de respostas de assinatura\r\n if (responseMessage.operation === CoreConstants.OP_EXT_PING) {\r\n this.handleExtensionPingResponse();\r\n }\r\n else { this.internalHandleResponse(responseMessage); }\r\n }\r\n\r\n //sub: _initializeExtensionMessageListening\r\n /**\r\n * Inicializa escuta de eventos vindos da extensão do navegador\r\n * @param messageBroker Message broker para comunicação com extensão do navegador\r\n */\r\n private initializeExtensionMessageListening(messageBroker: EventEmitter) : void {\r\n //inicializa handler de eventos para mensagens na janela\r\n if (!this.handleWindowMessageHandler) {\r\n this.handleWindowMessageHandler = this.handleWindowMessage.bind(this);\r\n messageBroker.on(CoreConstants.RESPONSE_MSG_TYPE, this.handleWindowMessageHandler);\r\n }\r\n }\r\n\r\n //sub: _disposeExtensionMessageListening\r\n /**\r\n * Faz dispose na escuta de eventos vindos da extensão do navegador\r\n * @param messageBroker Message broker para comunicação com extensão do navegador\r\n */\r\n private disposeExtensionMessageListening(messageBroker: EventEmitter) : void {\r\n //remove listener de eventos de mensagens de janela\r\n if (this.handleWindowMessageHandler) {\r\n messageBroker.off(CoreConstants.RESPONSE_MSG_TYPE, this.handleWindowMessageHandler);\r\n this.handleWindowMessageHandler = null;\r\n }\r\n }\r\n\r\n //sub: _makeNewJavaSessionId\r\n private makeNewJavaSessionId(shared: boolean) : string {\r\n //se ID para uma sessão compartilhada, temos isso em uma constante\r\n if (shared) return CoreConstants.SHARED_JAVA_SESSION_ID;\r\n\r\n //pega um ID de sessão sequencial e retorna ele\r\n const seq: number = ++this.javaSessionSequence;\r\n return seq.toString();\r\n }\r\n\r\n //sub: _destroyAllSessions\r\n private destroyAllSessions() : void {\r\n //zera número de sessões\r\n this.javaSessionsCount = 0;\r\n\r\n //percorre todas as sessões fazendo dispose nelas\r\n for (let key in this.javaSessions) {\r\n //pega session e faz dispose nela, depois nula referência\r\n this.javaSessions[key].internalDispose();\r\n this.javaSessions[key] = null;\r\n }\r\n }\r\n\r\n //sub: _createNewJavaSession\r\n /**\r\n * @throws {Error} lança erro com name \"CoreConstants.ERR_JAVA_APPLET_NOT_SUPPORTED\" quando browser não consegue acessar o java applet\r\n */\r\n private createNewJavaSession(javaSessionId: string) : AbstractJavaSession {\r\n //verifica que tipo de sessão devemos criar (classe) e instancia objeto\r\n let sessionObj: AbstractJavaSession;\r\n if (this.useWebExt) {\r\n sessionObj = new WebExtSession(javaSessionId, this.statisticsEnabled, this.signatureResponseMaxInterval, this.idGenerator, this.webExtMessageBroker.get_eventEmitter());\r\n }\r\n else {\r\n // Verifica se browser tem suporte para utilizar java applet (java instalado e browser ainda suporta)\r\n if (!this.appletSupportChecker()) {\r\n this.throwCustomError(\"Navegador sem suporte à java applets\", CoreConstants.ERR_JAVA_APPLET_NOT_SUPPORTED);\r\n }\r\n\r\n //id para o applet e elemento DOM simbolizando o core\r\n const appletId = `${this.coreHtmlElementId}_${javaSessionId}_applet`;\r\n const coreDomElement = document.getElementById(this.coreHtmlElementId);\r\n\r\n sessionObj = new AppletSession(appletId, this.jnlpPath, this.logEnabled, coreDomElement, javaSessionId, this.statisticsEnabled, this.signatureResponseMaxInterval, this.idGenerator);\r\n }\r\n \r\n //adiciona na lista de sessões\r\n this.javaSessions[javaSessionId] = sessionObj;\r\n ++this.javaSessionsCount;\r\n //retorna objeto criado\r\n return sessionObj;\r\n }\r\n\r\n /** Cria nova sessão java\r\n * @param callbackMethod Callback para processamento do retorno\r\n */\r\n newJavaSession(callbackMethod: (session: AbstractJavaSession) => void) : number {\r\n //verifica se pode usar uma sessão compartilhada, e determina ID para a nova sessão\r\n const useShared: boolean = !this.get_sessionIsolationEnabled();\r\n const sessionId: string = this.makeNewJavaSessionId(useShared);\r\n \r\n //se pode usar compartilhada, verifica se já não temos criada tal sessão\r\n let session: AbstractJavaSession = useShared ? this.javaSessions[sessionId] : null;\r\n\r\n //se não podemos reutilizar uma sessão, vamos criar uma nova\r\n if (!session) session = this.createNewJavaSession(sessionId);\r\n\r\n //adiciona método de callback na lista de eventos de 'ready' da sessão\r\n session.onReady(callbackMethod);\r\n\r\n //situações onde pedimos para o evento de ready ser disparado imediatamente:\r\n //1) a sessão já é Ready (sessão compartilhada)\r\n //2) estivermos utilizando extensão web, e a extensão já respondeu ao ping\r\n if (session.is_ready() || this.webExtReady) {\r\n //bota dentro de um setTimeout() só para ficar agendado para próximo poll da EventQueue do javascript\r\n return window.setTimeout(function () {\r\n session.internalNotifyReadiness();\r\n }, 0);\r\n }\r\n }\r\n\r\n /** Finaliza uma sessão java\r\n * @param session Sessão a ser finalizada\r\n */\r\n destroySession(session: AbstractJavaSession) : void {\r\n //se a sessão for shared, não destrói ela\r\n if (session.is_shared()) return;\r\n\r\n //pega sessão pelo ID (se não encontrar, dispara erro)\r\n const sessionId: string = session.get_javaSessionId();\r\n if (!this.javaSessions[sessionId]) throw new Error(\"Sessão passada não gerenciada por este objeto\");\r\n\r\n //remove da lista de sessões\r\n delete this.javaSessions[sessionId];\r\n --this.javaSessionsCount;\r\n\r\n //faz dispose do objeto\r\n session.internalDispose();\r\n }\r\n\r\n /** Realiza configurações iniciais do controle de assinatura\r\n */\r\n initialize() : void {\r\n if (SignerCore.instance) {\r\n throw new Error(\"Não foi possível registrar \" + this.coreHtmlElementId + \" como singleton da classe SignerCore: outra instância já estava ocupando tal posição\");\r\n }\r\n SignerCore.instance = this;\r\n\r\n //detecta plataforma em que estamos rodando\r\n const platform:SupportedPlatform = SignerCore.detectPlatform();\r\n if (platform === SupportedPlatform.Unsupported)\r\n this.throwCustomError(\"Plataforma não suportada pelo assinador\", CoreConstants.ERR_PLATFORM_NOT_SUPPORTED);\r\n\r\n //cria gerador de ID de request\r\n this.idGenerator = new RequestIdGenerator(this.get_requestSourceId());\r\n\r\n //detecta se temos que usar extensão web ou applet java\r\n this.detectExtension(platform);\r\n \r\n //inicializações para quando usar extensão no navegador\r\n if (this.useWebExt) {\r\n //cria message broker para eventos\r\n this.webExtMessageBroker = this.framed ? new IFrameWebExtMessageBroker(window) : new DefaultWebExtMessageBroker(window);\r\n this.webExtMessageBroker.init();\r\n //inicializa listening de mensagens da extensão\r\n this.initializeExtensionMessageListening(this.webExtMessageBroker.get_eventEmitter());\r\n //inicializa envio de \"ping\" para extensão web\r\n this.initializeWebExtensionPing(this.webExtMessageBroker.get_eventEmitter());\r\n }\r\n }\r\n\r\n /** Limpa referências do objeto\r\n */\r\n dispose(): void {\r\n //remove de singleton\r\n if (SignerCore.instance === this) {\r\n SignerCore.instance = null;\r\n }\r\n\r\n //faz dispose de pingamento da extensão (se ela tiver sido iniciada) e do tratamento de mensagens de janela (quando usa extensão do chrome)\r\n if (this.useWebExt) {\r\n this.disposeExtensionMessageListening(this.webExtMessageBroker.get_eventEmitter());\r\n this.disposeWebExtensionPing();\r\n\r\n this.webExtMessageBroker.dispose();\r\n this.webExtMessageBroker = null;\r\n }\r\n \r\n //destrói todas as sessões\r\n this.destroyAllSessions();\r\n }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./lib/core.ts","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @api private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {Mixed} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @api private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @api public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @api public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {String|Symbol} event The event name.\n * @param {Boolean} exists Only check if there are listeners.\n * @returns {Array|Boolean}\n * @api public\n */\nEventEmitter.prototype.listeners = function listeners(event, exists) {\n var evt = prefix ? prefix + event : event\n , available = this._events[evt];\n\n if (exists) return !!available;\n if (!available) return [];\n if (available.fn) return [available.fn];\n\n for (var i = 0, l = available.length, ee = new Array(l); i < l; i++) {\n ee[i] = available[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {String|Symbol} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @api public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {String|Symbol} event The event name.\n * @param {Function} fn The listener function.\n * @param {Mixed} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @api public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n var listener = new EE(fn, context || this)\n , evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) this._events[evt] = listener, this._eventsCount++;\n else if (!this._events[evt].fn) this._events[evt].push(listener);\n else this._events[evt] = [this._events[evt], listener];\n\n return this;\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {String|Symbol} event The event name.\n * @param {Function} fn The listener function.\n * @param {Mixed} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @api public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n var listener = new EE(fn, context || this, true)\n , evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) this._events[evt] = listener, this._eventsCount++;\n else if (!this._events[evt].fn) this._events[evt].push(listener);\n else this._events[evt] = [this._events[evt], listener];\n\n return this;\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {String|Symbol} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {Mixed} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @api public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n if (--this._eventsCount === 0) this._events = new Events();\n else delete this._events[evt];\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn\n && (!once || listeners.once)\n && (!context || listeners.context === context)\n ) {\n if (--this._eventsCount === 0) this._events = new Events();\n else delete this._events[evt];\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn\n || (once && !listeners[i].once)\n || (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else if (--this._eventsCount === 0) this._events = new Events();\n else delete this._events[evt];\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {String|Symbol} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @api public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) {\n if (--this._eventsCount === 0) this._events = new Events();\n else delete this._events[evt];\n }\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// This function doesn't apply anymore.\n//\nEventEmitter.prototype.setMaxListeners = function setMaxListeners() {\n return this;\n};\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/eventemitter3/index.js\n// module id = 3\n// module chunks = 0","import { EventEmitter } from \"eventemitter3\";\r\n\r\nimport {\r\n ProcessedCertificateReference,\r\n CertificateListPreProcessingArguments, CertificateListPreProcessingResult,\r\n SignatureProcessStartArguments, StartSessionStateResult, Statistics,\r\n BatchProcessingArguments, SessionStateResult, BatchProcessingOutput,\r\n SignerSessionHttpServices, SignatureInput, ErrorInfo\r\n} from \"./http-models\";\r\n\r\nimport { CoreResponseModel, CertificateInfo } from \"./common\";\r\n\r\nimport { AbstractJavaSession, SignerCore } from \"./core\";\r\n\r\n/** Enumeração de estado da sessão de assinatura\r\n */\r\nexport enum SignerSessionState\r\n{\r\n NotStarted = 0,\r\n CreatingCoreSession = 1,\r\n CoreSessionCreated = 2,\r\n StartingSignature = 3,\r\n SignatureStarted = 4,\r\n ReportingError = 5,\r\n Finishing = 6,\r\n Finished = 7\r\n}\r\n\r\n/** Enumeração de estado de cache de certificados\r\n */\r\nexport enum CertificateCacheState\r\n{\r\n Initial = 0,\r\n LoadingCertificates = 1,\r\n CertificatesLoaded = 2,\r\n ProcessingCertificates = 3,\r\n CertificatesProcessed = 4\r\n}\r\n\r\n/** Classe que representa um cache de certificado\r\n */\r\nexport class CertificateCache\r\n{\r\n private cachedResponse: CoreResponseModel;\r\n\r\n private events: EventEmitter = new EventEmitter();\r\n\r\n private state: CertificateCacheState = CertificateCacheState.Initial;\r\n\r\n private certListProcessingScheduled: boolean = false;\r\n\r\n private processed: boolean = false;\r\n\r\n private coreSessionResponseHandler: (CoreReponseModel, coreSession: AbstractJavaSession) => void;\r\n\r\n private processLoadedCertListHandler: (CoreReponseModel) => void;\r\n \r\n /** Construtor\r\n * @param certProcessingEnabled Define se o pré-processamento de certificados deve estar habilitado\r\n * @param http Objeto responsável por comunicação com webservice de assinatura digital\r\n */\r\n constructor(\r\n private certProcessingEnabled: boolean,\r\n private http: SignerSessionHttpServices\r\n )\r\n {\r\n this.coreSessionResponseHandler = this.handleCoreSessionResponse.bind(this);\r\n this.processLoadedCertListHandler = this.processCertList.bind(this);\r\n }\r\n\r\n /** Adiciona handler para evento de lista de certificados processada\r\n */\r\n add_certListReady(handler: (CoreResponseModel) => void): void { this.events.on(\"certListReady\", handler); }\r\n /** Remove handler para evento de lista de certificados processada\r\n */\r\n remove_certListReady(handler: (CoreResponseModel) => void): void { this.events.removeListener(\"certListReady\", handler); }\r\n\r\n //sub: _fireCertListReadyEvent\r\n private fireCertListReadyEvent(response: CoreResponseModel) : void {\r\n this.events.emit(\"certListReady\", response);\r\n this.events.removeAllListeners(\"certListReady\");\r\n }\r\n\r\n /** Adiciona handler para evento de lista de certificados carregada e processada, quando necessário\r\n * @param handler Processo a ser executado\r\n */\r\n add_certListLoaded(handler: (CoreResponseModel) => void) { this.events.on(\"certListLoaded\", handler); }\r\n /** Remove handler para evento de lista de certificados carregada e processada, quando necessário\r\n * @param handler Processo a ser executado\r\n */\r\n remove_certListLoaded(handler: (CoreResponseModel) => void) { this.events.removeListener(\"certListLoaded\", handler); }\r\n\r\n //sub: _fireCertListLoadedEvent\r\n private fireCertListLoadedEvent(response: CoreResponseModel) : void {\r\n this.events.emit(\"certListLoaded\", response);\r\n this.events.removeAllListeners(\"certListLoaded\");\r\n }\r\n\r\n /** Verifica se lista de certificados está carregada\r\n * @returns Verdadeiro se lista de certificados está carregada, senão falso\r\n */\r\n is_loaded() : boolean { return this.state >= CertificateCacheState.CertificatesLoaded; }\r\n\r\n /** Verifica se lista de certificados já foi processada\r\n * @returns Verdadeiro se lista de certificados já foi processada, senão falso\r\n */\r\n is_processed() : boolean { return this.state >= CertificateCacheState.CertificatesProcessed; }\r\n\r\n /** Verifica se o pré-processamento da lista de certificados está habilitada\r\n * @returns Verdadeiro se o pré-processamento da lista de certificados está habilitada, senão falso\r\n */\r\n is_certProcessingEnabled() : boolean { return this.certProcessingEnabled; }\r\n\r\n /** Verifica se lista de certificados já está carregada e processada se necessário\r\n * @returns Verdadeiro se lista de certificados já está pronta para ser utilizada, senão falso\r\n */\r\n is_certListReady() : boolean {\r\n return this.is_certProcessingEnabled() ? this.is_processed() : this.is_loaded();\r\n }\r\n\r\n //sub: _filterCertificateList\r\n private filterCertificateList(allowedCertificates: ProcessedCertificateReference[]) : void {\r\n //converte o array de certificados permitidos em uma hashtable\r\n const filtered: { [certId: string] : ProcessedCertificateReference } = {};\r\n if (allowedCertificates && allowedCertificates.length > 0) {\r\n //percorre os certificados filtrados adicionando no mapa\r\n for (let i = allowedCertificates.length - 1; i >= 0; --i) {\r\n const certObj: ProcessedCertificateReference = allowedCertificates[i];\r\n filtered[certObj.certId] = certObj;\r\n }\r\n }\r\n\r\n //pega resultado da resposta original\r\n const responseResult: { certs: CertificateInfo[] } = this.cachedResponse.result;\r\n\r\n //filtra array de certificados utilizado originalmente\r\n const newList: CertificateInfo[] = [];\r\n for (let i = 0, _i = responseResult.certs.length; i < _i; ++i) {\r\n //pega certificado original e verifica se ele está mapeado na hashtable de filtrados\r\n const originalCert: CertificateInfo = responseResult.certs[i];\r\n const allowed: ProcessedCertificateReference = filtered[originalCert.certID];\r\n if (allowed) {\r\n //caso o servidor trouxe UserData associado à referência do certificado, copia isso para o objeto original\r\n if (allowed.userData) originalCert.userData = allowed.userData;\r\n //adiciona certificado permitido na nova lista de certificados\r\n newList.push(originalCert);\r\n }\r\n }\r\n\r\n //joga lista de certificados filtrados no resultado da resposta original\r\n responseResult.certs = newList;\r\n }\r\n\r\n private handleServerCallback(rawResult: CertificateListPreProcessingResult, rawError: any) : void {\r\n //se veio resposta do callback para servidor quando não estamos em um estado que espera isso, vamos ignorar\r\n if (this.state !== CertificateCacheState.ProcessingCertificates)\r\n return console.error(\"Recebida resposta de callback de processamento de lista de certificados, porém ela foi DESCARTADA pois o estado atual do cache de certificados está com valor \" + this.state);\r\n\r\n //mudamos estado para \"processado\"\r\n this.state = CertificateCacheState.CertificatesProcessed;\r\n\r\n //vamos inspecionar se recebemos um erro de request, jogando na resposta original\r\n if (rawError) {\r\n this.cachedResponse.error = { msg: rawError.toString(), stacktrace: null, type: null };\r\n }\r\n else {\r\n //se o resultado apresenta erro, registra isso na resposta. Caso contrário aplica filtro retornado pelo callback.\r\n if (rawResult.error) this.cachedResponse.error = rawResult.error;\r\n else this.filterCertificateList(rawResult.certs);\r\n }\r\n\r\n //invoca evento de finalização\r\n this.fireCertListReadyEvent(this.cachedResponse);\r\n }\r\n\r\n //sub: _processCertList\r\n private processCertList(response: CoreResponseModel) : void {\r\n //variável que indica quando não temos certificado algum para processar em server-side\r\n const noCerts = !response || response.error || !response.result || !response.result.certs || response.result.certs.length < 1;\r\n\r\n //se o conjunto de certificados é vazio, vamos marcar que \"processamos\" a lista e disparamos eventos de 'Ready'\r\n if (noCerts) {\r\n this.state = CertificateCacheState.CertificatesProcessed;\r\n return this.fireCertListReadyEvent(response);\r\n }\r\n\r\n //avançamos o estado para \"processando certificados\"\r\n this.state = CertificateCacheState.ProcessingCertificates;\r\n\r\n //cria argumentos para o callback de processamento, com os certificados listados e muda estado deste componente para \"processando\"\r\n const serverCallbackArgs: CertificateListPreProcessingArguments = { certs: [] };\r\n\r\n //converte os certificados recebidos em argumentos para o callback de processamento\r\n const recvCerts: CertificateInfo[] = response.result.certs;\r\n for (let i = 0, _i = recvCerts.length; i < _i; ++i) {\r\n const recvCert = recvCerts[i];\r\n //adiciona na lista de referências de certificados a serem enviados para o server-side\r\n serverCallbackArgs.certs.push({\r\n certId: recvCert.certID,\r\n certChain: recvCert.certChain\r\n });\r\n }\r\n\r\n //com nossa lista de certificados em mãos, vamos fazer um callback para o servidor\r\n this.http.processCertificates(serverCallbackArgs)\r\n .then(res => this.handleServerCallback(res, null))\r\n .catch(err => this.handleServerCallback(null, err));\r\n }\r\n\r\n //sub: _handleCoreSessionResponse\r\n private handleCoreSessionResponse(response: CoreResponseModel, coreSession: AbstractJavaSession) : void {\r\n //se estado não estiver apontando que estamos no meio de um carregamento de certificados, desconsidera o que recebemos\r\n if (this.state !== CertificateCacheState.LoadingCertificates)\r\n return console.error(\"Recebida lista de certificados do java, porém ela foi DESCARTADA, devido à que o estado do cache de certificados está com valor \" + this.state);\r\n\r\n if (!this.cachedResponse)\r\n this.cachedResponse = response;\r\n else\r\n this.cachedResponse.result.certs = this.cachedResponse.result.certs.concat(response.result.certs);\r\n\r\n if (response.result.totalCerts > this.cachedResponse.result.certs.length) {\r\n var reloadStore = true;\r\n var includeChain = this.is_certProcessingEnabled();\r\n\r\n coreSession.listCertificates(this.coreSessionResponseHandler, includeChain, reloadStore, this.cachedResponse.result.certs.length);\r\n\r\n return;\r\n }\r\n\r\n this.state = CertificateCacheState.CertificatesLoaded;\r\n\r\n //dispara evento que carregamos a lista\r\n this.fireCertListLoadedEvent(this.cachedResponse);\r\n\r\n //se termos carregado os dados do certificado já conta como \"Ready\", disparamos tal evento\r\n if (this.is_certListReady()) this.fireCertListReadyEvent(this.cachedResponse);\r\n }\r\n\r\n //sub: _registerCertListProcessingOnLoadedCertList\r\n private registerCertListProcessingOnLoadedCertList() : void {\r\n //registra método de processamento de lista no momento do carregamento da lista de certificados\r\n if (!this.certListProcessingScheduled) {\r\n this.add_certListLoaded(this.processLoadedCertListHandler);\r\n this.certListProcessingScheduled = true;\r\n }\r\n }\r\n\r\n private unregisterCertListProcessingOnLoadedCertList() : void {\r\n //desregistra método de processamento de lista no momento do carregamento da lista de certificados\r\n if (this.certListProcessingScheduled) {\r\n this.remove_certListLoaded(this.processLoadedCertListHandler);\r\n this.certListProcessingScheduled = false;\r\n }\r\n }\r\n\r\n /**\r\n * Reseta estado do carregamento de certificados no cache, e também limpa as respostas em cache\r\n */\r\n private discardCacheState() : void {\r\n //limpa o estado atual do cache e vai para carregando certificados\r\n this.state = CertificateCacheState.Initial;\r\n this.cachedResponse = null;\r\n this.processed = false;\r\n }\r\n\r\n private reloadCacheInternal(coreSession: AbstractJavaSession) : void {\r\n //limpa o estado do cache\r\n this.discardCacheState();\r\n\r\n this.state = CertificateCacheState.LoadingCertificates;\r\n //chama método do de listagem de certificados na sessão do core\r\n const reloadStore: boolean = true;\r\n const includeChain: boolean = this.is_certProcessingEnabled();\r\n coreSession.listCertificates(this.coreSessionResponseHandler, includeChain, reloadStore);\r\n }\r\n\r\n /** Limpa lista de certificados e consulta novamente\r\n * @param coreSession Sessão java utilizada para consulta\r\n */\r\n reloadCache(coreSession: AbstractJavaSession) : void {\r\n //se tiver no meio de um reload, cai fora\r\n if (this.state === CertificateCacheState.LoadingCertificates) return;\r\n\r\n //desregistra evento de processamento de certificados (se tiver registrado algum)\r\n this.unregisterCertListProcessingOnLoadedCertList();\r\n //chama método interno de reload\r\n this.reloadCacheInternal(coreSession);\r\n }\r\n\r\n /** Busca certificados na store\r\n * @param coreSession Sessão java a ser utilizada\r\n * @param callbackMethod Callback para processamento do retorno \r\n */\r\n listCertificates(coreSession: AbstractJavaSession, callbackMethod: (CoreResponseModel) => void) : void {\r\n //[Estado 'ready'] Se a lista de certificados está pronta, chama método de callback (assincronamente) e cai fora\r\n if (this.is_certListReady()) {\r\n setTimeout(callbackMethod, 0, this.cachedResponse);\r\n return;\r\n } \r\n\r\n //adiciona método de callback na lista de handlers de quando tivermos a lista de certificados pronta\r\n this.add_certListReady(callbackMethod);\r\n\r\n //[Estado '1'] Se estamos em um estado inicial, precisamos iniciar o carregamento do cache de certificados.\r\n //chamar '_reloadCacheInternal' sempre muda para o estado 2 !!!\r\n if (this.state === CertificateCacheState.Initial) {\r\n this.reloadCacheInternal(coreSession);\r\n }\r\n\r\n //[Estado '2'] Se processamento server-side estiver habilitado, precisamos registrar o método de processamento\r\n //de certificados quando o carregamento de certificados finalizar\r\n if (this.state === CertificateCacheState.LoadingCertificates && this.is_certProcessingEnabled()) {\r\n return this.registerCertListProcessingOnLoadedCertList();\r\n }\r\n\r\n //[Estado '3'] Temos uma lista de certificados carregada. O fato dela não ter sido qualificada como 'ready' indica que temos\r\n //processamento server-side. Como a lista de certificados já está carregada, vamos processá-la imediatamente.\r\n //Invocar \"_processCertList\" sempre muda o estado para 4 !!!\r\n if (this.state === CertificateCacheState.CertificatesLoaded) {\r\n this.processCertList(this.cachedResponse);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Interface que simboliza correlação entre ida e volta de callbacks\r\n */\r\nclass CallbackCorrelationInfo {\r\n sessionId: string;\r\n signerDataRevision: number;\r\n isErrorReport: boolean;\r\n constructor(\r\n sessionId: string,\r\n signerDataRevision: number,\r\n isErrorReport: boolean) \r\n {\r\n this.sessionId = sessionId;\r\n this.signerDataRevision = signerDataRevision;\r\n this.isErrorReport = isErrorReport;\r\n }\r\n\r\n matches(another: CallbackCorrelationInfo): boolean {\r\n //prioridade é o sessionId\r\n if (this.sessionId) return this.sessionId === another.sessionId;\r\n //vamos por revisão mesmo\r\n return this.signerDataRevision && this.signerDataRevision === another.signerDataRevision;\r\n }\r\n}\r\n\r\n/** Classe que contém dados de uma sessão de assinatura\r\n */\r\nclass SignerSessionData {\r\n constructor() {\r\n this.progress = { total: 0, done: 0 };\r\n }\r\n sessionId: string;\r\n signatureAlgorithm: string;\r\n certId: string;\r\n progress: {\r\n total: number;\r\n done: number;\r\n };\r\n\r\n /**\r\n * Propriedade que indica se um cancelamento foi solicitado para a sessão atual\r\n */\r\n cancelled: boolean;\r\n /**\r\n * Código numérico que identifica o processo de assinatura no client-side (revisão da sessiondata)\r\n */\r\n revision: number;\r\n\r\n /**\r\n * Cria e retorna uma info de correlação para callbacks\r\n */\r\n makeCallbackCorrelationInfo() : CallbackCorrelationInfo {\r\n return new CallbackCorrelationInfo(this.sessionId, this.revision, false);\r\n }\r\n\r\n /**\r\n * Retorna se os dados atuais desta sessão de assinatura correspondem com uma info de correção de callback\r\n * @param correlationInfo Informação de correção de callback\r\n */\r\n matchesCallbackCorrelationInfo(correlationInfo: CallbackCorrelationInfo) : boolean {\r\n //prioridade é o sessionId\r\n if (this.sessionId) return this.sessionId === correlationInfo.sessionId;\r\n //vamos por revisão mesmo\r\n return this.revision && this.revision === correlationInfo.signerDataRevision;\r\n }\r\n};\r\n\r\n/**\r\n * Tipo que representa o callback de sucesso e falha\r\n */\r\ntype RestCallbackHandlerFunc = (result: SessionStateResult | StartSessionStateResult, correlationInfo: CallbackCorrelationInfo) => void;\r\n\r\n/**\r\n * Classe que é responsável por controlar a fila de requests\r\n */\r\nclass SignerSessionBatchReporter\r\n{\r\n private queue: Array<[BatchProcessingArguments, CallbackCorrelationInfo]> = [];\r\n \r\n private requestPending: boolean = false;\r\n\r\n constructor(\r\n private http: SignerSessionHttpServices,\r\n private onReportSuccess: RestCallbackHandlerFunc,\r\n private onReportFailure: RestCallbackHandlerFunc\r\n ) { }\r\n\r\n /**\r\n * Adiciona uma request de batch na fila\r\n * @param batchInfo argumentos do batch\r\n * @param correlationInfo informações da sessão\r\n */\r\n enqueue(batchInfo: BatchProcessingArguments, correlationInfo: CallbackCorrelationInfo) {\r\n this.queue.push([batchInfo, correlationInfo]);\r\n this.startSending();\r\n }\r\n\r\n private startSending() {\r\n //verifica se já não tem ninguém executando ou se fila está vazia\r\n if (this.requestPending || this.queue.length < 1) return;\r\n\r\n this.requestPending = true;\r\n\r\n //retira o primeiro item da lista e dispara a request\r\n const [batchArgs, correlation] = this.queue.shift();\r\n this.fireRequest(batchArgs, correlation);\r\n }\r\n\r\n private fireRequest(batchInfo: BatchProcessingArguments, correlationInfo: CallbackCorrelationInfo) {\r\n //envia callback para o servidor\r\n this.http.sendBatch(batchInfo)\r\n .then(res => this.handleRequestSuccess(res, correlationInfo))\r\n .catch(err => this.handleRequestFailure(err, correlationInfo));\r\n }\r\n\r\n private handleRequestSuccess(res: SessionStateResult, correlationInfo: CallbackCorrelationInfo) {\r\n //dispara o handler onreportsuccess\r\n try {\r\n this.onReportSuccess(res, correlationInfo);\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n \r\n //limpa indicador de request pendente e reschedula próxima execução\r\n this.requestPending = false;\r\n setTimeout(() => this.startSending(), 0);\r\n }\r\n\r\n private handleRequestFailure(err: any, correlationInfo: CallbackCorrelationInfo) {\r\n //limpa os itens da sessão na fila\r\n this.clearQueue(correlationInfo);\r\n\r\n //dispara o handler onreportfailure\r\n try {\r\n this.onReportFailure(err, correlationInfo);\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n\r\n //limpa indicador de request pendente e reschedula próxima execução\r\n this.requestPending = false;\r\n setTimeout(() => this.startSending(), 0);\r\n }\r\n\r\n private clearQueue(correlationInfo: CallbackCorrelationInfo) {\r\n //remove de \"queue\" todas as requests que forem do mesmo correlation\r\n //(filtra deixando apenas as de correlation diferente)\r\n this.queue = this.queue.filter(([, corr]) => !corr.matches(correlationInfo));\r\n }\r\n}\r\n\r\n/** Classe que representa uma sessão de assinatura\r\n */\r\nexport class SignerSession\r\n{\r\n private events: EventEmitter = new EventEmitter();\r\n\r\n private state: SignerSessionState = SignerSessionState.NotStarted;\r\n\r\n private sessionData: SignerSessionData = new SignerSessionData();\r\n \r\n private coreSession: AbstractJavaSession = null;\r\n\r\n private signRequestId: string = null;\r\n\r\n private hasCertificateListPreProcess: boolean = false;\r\n\r\n private lastError: ErrorInfo = null;\r\n\r\n private inputsQueue: SignatureInput[] = null;\r\n\r\n private javaSignCallbackHandler: (CoreResponseModel) => void = null;\r\n\r\n private onCoreSessionCreatedHandler: (CoreResponseModel) => void = null;\r\n\r\n private certCache: CertificateCache = null;\r\n\r\n private signerSessionDataRevisionSeed:number = 0;\r\n\r\n private batchReporter: SignerSessionBatchReporter;\r\n\r\n /** Construtor\r\n * @param certProcessingEnabled Define se pré-processamento de lista de certificados estará habilitado\r\n * @param http Objeto responsável pelas comunicações com webservice de assinatura digital\r\n */\r\n constructor(\r\n private certProcessingEnabled: boolean,\r\n private http: SignerSessionHttpServices\r\n ) {\r\n //cria reporter de lotes (queue) para enviar assinaturas para o server de forma serializada\r\n this.batchReporter = new SignerSessionBatchReporter(\r\n this.http,\r\n this.handleCallbackResult.bind(this),\r\n this.handleCallbackError.bind(this)\r\n );\r\n }\r\n\r\n private getSignerCore() : SignerCore {\r\n const core = SignerCore.getInstance();\r\n if (!core) throw new Error(\"Signer core não está carregado\");\r\n\r\n return core;\r\n }\r\n\r\n get_hasCertificateListPreProcess() : boolean { return this.hasCertificateListPreProcess; }\r\n set_hasCertificateListPreProcess(hasCertificateListPreProcess: boolean) : void { this.hasCertificateListPreProcess = hasCertificateListPreProcess; }\r\n\r\n /** Adiciona handler para quando ocorrer erro no processo de assinatura\r\n * @param handler Processo a ser executado\r\n */\r\n add_processErrorOccurred(handler: (any) => void) : void { this.events.on(\"processErrorOccurred\", handler); }\r\n /** Remove handler para quando ocorrer erro no processo de assinatura\r\n * @param handler Processo a ser removido\r\n */\r\n remove_processErrorOccurred(handler: (any) => void) : void { this.events.removeListener(\"processErrorOccurred\", handler); }\r\n\r\n /** Adiciona handler para alteração no progresso de assinaturas do lote \r\n * @param handler Processo a ser executado\r\n */\r\n add_progressChanged(handler: (any) => void) : void { this.events.on(\"progressChanged\", handler); }\r\n /** Remove handler para alteração no progresso de assinaturas do lote \r\n * @param handler Processo a ser removido\r\n */\r\n remove_progressChanged(handler: (any) => void) : void { this.events.removeListener(\"progressChanged\", handler); }\r\n\r\n /** Adiciona handler para finalização do processo de assinatura \r\n * @param handler Processo a ser executado\r\n */\r\n add_signProcessFinished(handler: (any) => void) : void { this.events.on(\"signProcessFinished\", handler); }\r\n /** Remove handler para finalização do processo de assinatura \r\n * @param handler Processo a ser removido\r\n */\r\n remove_signProcessFinished(handler: (any) => void) : void { this.events.removeListener(\"signProcessFinished\", handler); }\r\n\r\n /** Adiciona handler para recepção de dados customizados\r\n * @param handler Processo a ser executado\r\n */\r\n add_userCallbackDataReceived(handler: (arg: string[]) => void) : void { this.events.on(\"userCallbackDataReceived\", handler); }\r\n /** Remove handler para recepção de dados customizados\r\n * @param handler Processo a ser removido\r\n */\r\n remove_userCallbackDataReceived(handler: (arg: string[]) => void) : void { this.events.removeListener(\"userCallbackDataReceived\", handler); }\r\n\r\n /** Adiciona handler para sessão adquirida\r\n * @param handler Processo a ser executado\r\n */\r\n private add_coreSessionAcquired(handler: (AbstractJavaSession) => void) : void { this.events.on(\"coreSessionAcquired\", handler); }\r\n \r\n private fireCoreSessionAcquired () {\r\n this.events.emit(\"coreSessionAcquired\");\r\n this.events.removeAllListeners(\"coreSessionAcquired\");\r\n }\r\n\r\n /** Busca estado da sessão de assinatura\r\n * @returns Estado da sessão de assinatura\r\n */\r\n get_state() : SignerSessionState { return this.state; }\r\n\r\n /** Busca último erro ocorrido\r\n * @param Último erro ocorrido\r\n */\r\n get_lastError() : ErrorInfo { return this.lastError; }\r\n\r\n /** Verifica se existe uma sessão ativa\r\n * @returns Verdadeiro se existe uma sessão ativa, senão falso\r\n */\r\n has_activeSession() : boolean {\r\n return !!this.coreSession;\r\n }\r\n\r\n /** Verifica se está processando assinaturas\r\n * @returns Verdadeiro se está processando assinaturas, senão falso\r\n */\r\n is_processingSignatures() : boolean {\r\n return this.state >= SignerSessionState.StartingSignature && this.state <= SignerSessionState.Finishing;\r\n }\r\n\r\n /** Verifica se sessão está no estado finalizado\r\n */\r\n is_finished() : boolean {\r\n return this.state === SignerSessionState.Finished;\r\n }\r\n\r\n /**\r\n * Retorna se a sessão atual está marcada como cancelada\r\n */\r\n is_currentSessionCancelled(): boolean {\r\n return this.sessionData.cancelled;\r\n }\r\n\r\n private disposeCoreSession() : void {\r\n if (this.coreSession) {\r\n //tenta pegar core, fazendo dispose da sessão (este código não chama \"_getSignerCore\", pois pode acontecer do signercore\r\n //já ter levado um dispose(), o que levaria todas as sessões juntas\r\n const signerCore: SignerCore = SignerCore.getInstance();\r\n if (signerCore) signerCore.destroySession(this.coreSession);\r\n\r\n //nula referência da sessão\r\n this.coreSession = null;\r\n }\r\n }\r\n\r\n private ensureCoreSession() : AbstractJavaSession {\r\n //pega core session e garante que esteja criado\r\n const coreSession = this.coreSession;\r\n if (!coreSession) throw new Error(\"Nenhuma sessão com componente Core do assinador está estabelecida\");\r\n //retorna sessão core obtida\r\n return coreSession;\r\n }\r\n\r\n private isSigningInJava() : boolean {\r\n return !!this.signRequestId;\r\n }\r\n\r\n private cancelJavaSignatureUnchecked() : void {\r\n //se tiver pacote sendo assinado em java, cancela ele\r\n if (this.isSigningInJava()) {\r\n this.ensureCoreSession().cancelRequest(this.signRequestId, null);\r\n this.signRequestId = null;\r\n }\r\n }\r\n\r\n private clearSessionInfo() : void {\r\n const sd = this.sessionData;\r\n sd.sessionId = null;\r\n sd.signatureAlgorithm = null;\r\n sd.certId = null;\r\n sd.progress.total = 0;\r\n sd.progress.done = 0;\r\n sd.cancelled = false;\r\n sd.revision = 0;\r\n }\r\n\r\n private raiseEventSafely(eventName: string, eventArgs: any) : boolean {\r\n //invoca evento, de forma segura (com try/catch)\r\n try {\r\n this.events.emit(eventName, eventArgs);\r\n }\r\n catch (ex) {\r\n console.error(\"[signer session] Erro detectado ao disparar evento '\" + eventName + \"'\");\r\n console.dir(ex);\r\n return false;\r\n }\r\n //tudo OK\r\n return true;\r\n }\r\n\r\n private raiseProcessError(error: ErrorInfo) : boolean {\r\n return this.raiseEventSafely(\"processErrorOccurred\", error);\r\n }\r\n\r\n private raiseFinishedEvent() : boolean {\r\n return this.raiseEventSafely(\"signProcessFinished\", this.lastError);\r\n }\r\n\r\n private raiseProgressChangedEvent() : boolean {\r\n return this.raiseEventSafely(\"progressChanged\", this.sessionData.progress);\r\n }\r\n\r\n private raiseUserCallbackDataReceivedEvent(userCallbackDataList: string[]) : boolean {\r\n //percorre lista de dados customizados recebidos\r\n for (let i = 0, _i = userCallbackDataList.length; i < _i; ++i) {\r\n //invoca evento com try/catch por fora\r\n try {\r\n this.events.emit(\"userCallbackDataReceived\", userCallbackDataList[i]);\r\n }\r\n catch (ex) {\r\n console.error(\"[signer session] Erro detectado ao disparar evento 'userCallbackDataReceived'\");\r\n console.dir(ex);\r\n return false;\r\n }\r\n }\r\n\r\n //nenhuma exception enquanto era tentando disparar eventos\r\n return true;\r\n }\r\n\r\n private enterFinishedState() : void {\r\n //seta estado e dispara evento de finalizado\r\n this.state = SignerSessionState.Finished;\r\n this.raiseFinishedEvent();\r\n\r\n //limpa informações da sessão de assinatura e sessão core\r\n this.clearSessionInfo();\r\n this.disposeCoreSession();\r\n }\r\n \r\n private enterErrorState(error: ErrorInfo | string) : void {\r\n //se error for um objeto que contenha o atributo 'msg', já é um objeto de erro certinho... caso contrário temos que\r\n //criar um objeto de erro com esse formato e utilizar o erro passado como se fosse a mensagem\r\n if (typeof error !== \"object\" || !error.msg) {\r\n error = { msg: error, stacktrace: null, type: null };\r\n }\r\n //salva erro como último\r\n this.lastError = error;\r\n //se está assinando alguma coisa no java, cancela tal operação\r\n this.cancelJavaSignatureUnchecked();\r\n //dispara evento de erro\r\n this.raiseProcessError(error);\r\n //vai para estado de finalizado\r\n this.enterFinishedState();\r\n }\r\n\r\n private enterReportingErrorState(error: ErrorInfo) : void {\r\n this.state = SignerSessionState.ReportingError;\r\n //cancela assinatura no java, se tiver alguma executando\r\n this.cancelJavaSignatureUnchecked();\r\n //envia callback para o servidor, com a mensagem de erro\r\n this.sendBatchCallbackForError(error);\r\n }\r\n\r\n private feedInputsQueue(newInputs: SignatureInput[]) : void {\r\n //copia elementos para fila de input\r\n if (newInputs && newInputs.length > 0) {\r\n Array.prototype.push.apply(this.inputsQueue, newInputs);\r\n }\r\n }\r\n\r\n private fetchInputs() : SignatureInput[] {\r\n //faz fetch de todos mesmo\r\n return this.inputsQueue.splice(0, Number.MAX_VALUE);\r\n }\r\n\r\n private sendBatchCallbackForError(signatureError: ErrorInfo) : void\r\n {\r\n //argumentos de callback da assinatura\r\n const callbackArgs: BatchProcessingArguments = {\r\n sessionId : this.sessionData.sessionId,\r\n signatureError : signatureError,\r\n outputs : null,\r\n statistics : null\r\n };\r\n\r\n //cria correção para callback e marca como report de erros\r\n const correlationInfo:CallbackCorrelationInfo = this.sessionData.makeCallbackCorrelationInfo();\r\n correlationInfo.isErrorReport = true;\r\n\r\n //chamar fila de batches\r\n this.batchReporter.enqueue(callbackArgs, correlationInfo);\r\n }\r\n\r\n private sendBatchCallback(signatureOutputs: BatchProcessingOutput[], statistics?: Statistics) : void {\r\n //guarda legacy no método\r\n if (!signatureOutputs) return;\r\n\r\n //argumentos de callback da assinatura\r\n const callbackArgs: BatchProcessingArguments = {\r\n sessionId : this.sessionData.sessionId,\r\n outputs : signatureOutputs,\r\n signatureError : null,\r\n statistics : statistics || null\r\n };\r\n\r\n //cria correção para callback\r\n const correlationInfo:CallbackCorrelationInfo = this.sessionData.makeCallbackCorrelationInfo();\r\n\r\n //chamar fila de batches\r\n this.batchReporter.enqueue(callbackArgs, correlationInfo);\r\n }\r\n\r\n private javaSignCallback(result: CoreResponseModel) : void {\r\n //se estado deste controle não estiver indicando que está assinando algo no java, ignora callback\r\n if (!this.isSigningInJava()) {\r\n console.warn(\"[signer session] Recebido callback de assinatura apesar do componente não estar assinando nada em java\");\r\n return console.dir(result);\r\n }\r\n\r\n //se ocorreram erros na assinatura no java, vamos cancelar a sessão no servidor\r\n if (result.error) {\r\n return this.enterReportingErrorState(result.error);\r\n }\r\n else {\r\n //pega objeto de resultado da assinatura e verifica se vieram outputs assinados\r\n const signResult = result.result;\r\n if (signResult.outputs && signResult.outputs.length > 0) {\r\n this.sendBatchCallback(signResult.outputs, result.statistics);\r\n }\r\n }\r\n\r\n //se não tem próxima resposta, terminou de se comunicar com o java\r\n if (!result.hasNext) {\r\n //se ainda temos inputs na fila, invoca o java novamente, caso contrário terminamos a assinatura no java\r\n if (this.inputsQueue.length > 0) {\r\n this.invokeJavaSignature();\r\n }\r\n else { this.signRequestId = null; }\r\n }\r\n }\r\n\r\n private invokeJavaSignature() : void {\r\n //pega sessão core e lote de informações a serem assinadas\r\n const coreSession = this.ensureCoreSession();\r\n const batch = this.fetchInputs();\r\n\r\n //pega ID do certificado e algoritmo de assinatura necessários para o processo\r\n const certId = this.sessionData.certId;\r\n const algorithm = this.sessionData.signatureAlgorithm;\r\n\r\n //cria request de assinatura do lote\r\n this.signRequestId = coreSession.sign(certId, algorithm, batch, this.javaSignCallbackHandler);\r\n }\r\n\r\n private handleUserCallbackData(resultObj: SessionStateResult | StartSessionStateResult) : void {\r\n //verifica se vieram dados de callback customizados do usuário\r\n if (resultObj.userCallbackData && resultObj.userCallbackData.length > 0) {\r\n this.raiseUserCallbackDataReceivedEvent(resultObj.userCallbackData);\r\n }\r\n }\r\n\r\n private handleProcessStartCallbackResult(resultObj: StartSessionStateResult) : void {\r\n //valida se veio inputs (obrigatório inicialmente)\r\n if (!resultObj.inputsBatch || resultObj.inputsBatch.length < 1) {\r\n console.error(\"Resposta inicial não possui objetos de input\");\r\n return this.enterErrorState(\"Erro no processo de assinatura, tente novamente\");\r\n }\r\n\r\n //seta estágio deste objeto como 'started'\r\n this.state = SignerSessionState.SignatureStarted;\r\n\r\n //pega dados da nova sessão\r\n this.sessionData.sessionId = resultObj.sessionId;\r\n this.sessionData.progress.total = resultObj.totalInputs;\r\n this.sessionData.progress.done = 0;\r\n this.sessionData.signatureAlgorithm = resultObj.algorithm;\r\n\r\n //dispara evento de mudaça do progresso (temos de verificar se o usuário não cancelou o processo neste evento de report)\r\n this.raiseProgressChangedEvent();\r\n if (this.is_currentSessionCancelled()) return;\r\n\r\n //reseta fila de inputs e usa o primeiro lote como sendo o inicial para assinatura\r\n this.inputsQueue = [];\r\n this.feedInputsQueue(resultObj.inputsBatch);\r\n\r\n //invoca o java para assinar inputs\r\n this.invokeJavaSignature();\r\n }\r\n\r\n private handleBatchProcessingCallbackResult(resultObj: SessionStateResult) : void {\r\n //atualiza dados e emite evento de mudança\r\n this.sessionData.progress.done = resultObj.processedOutputs;\r\n this.raiseProgressChangedEvent();\r\n\r\n //se finalizou o processo entre no estado de finalizado\r\n if (resultObj.finished) {\r\n return this.enterFinishedState();\r\n }\r\n\r\n //se usuário cancelou o processo no evento \"ProgressChangedEvent\", vamos parar por aqui\r\n if (this.is_currentSessionCancelled()) return;\r\n\r\n //alimenta inputs com os novos retornados\r\n this.feedInputsQueue(resultObj.inputsBatch);\r\n\r\n //caso o java tiver sido mais rápido que nós, vamos invocá-lo novamente\r\n if (!this.isSigningInJava() && this.inputsQueue.length > 0) {\r\n this.invokeJavaSignature();\r\n }\r\n }\r\n\r\n private handleCallbackResult(result: SessionStateResult | StartSessionStateResult, correlationInfo: CallbackCorrelationInfo) : void\r\n {\r\n //se o callback for para uma session diferente da atual, vamos ignorar ele\r\n if (!this.sessionData.matchesCallbackCorrelationInfo(correlationInfo)) {\r\n console.warn(\"Recebida resposta de callback que não corresponde à sessão atual. Possível sessão dangling em server-side\");\r\n return console.dir(result);\r\n }\r\n\r\n //se estivermos no meio de um report de erros, só vamos considerar respostas que tenham vindo de tais requests\r\n let currState:SignerSessionState = this.state;\r\n if (currState === SignerSessionState.ReportingError && !correlationInfo.isErrorReport) {\r\n console.warn(\"Recebida resposta de callback sem correlação com report de erros, enquanto no estado de report de erros\");\r\n return console.dir(result);\r\n }\r\n \r\n //verifica se é um callback que caracteriza o fim do processo\r\n if (result.finished) {\r\n currState = SignerSessionState.Finishing;\r\n this.state = currState;\r\n }\r\n\r\n //trata dados customizados que vieram no callback\r\n this.handleUserCallbackData(result);\r\n\r\n //verifica se veio erro, entrando em estado de erro\r\n if (result.error) {\r\n console.error(result.error);\r\n return this.enterErrorState(\"Erro no processo de assinatura, tente novamente\");\r\n }\r\n\r\n //verifica se é uma resposta de início de assinatura\r\n const looksLikeStartSessionResponse:boolean = !!(result).algorithm;\r\n if (looksLikeStartSessionResponse) {\r\n //verifica se está no estágio correto\r\n if (currState !== SignerSessionState.StartingSignature) {\r\n console.error(\"Recebida resposta de início de processo de assinatura, porém estágio da sessão estava com valor: \" + currState);\r\n return this.enterErrorState(\"Erro no processo de assinatura, tente novamente\");\r\n }\r\n //faz tratamento da resposta\r\n this.handleProcessStartCallbackResult(result);\r\n }\r\n else {\r\n //verifica se está no estágio correto\r\n if (currState !== SignerSessionState.SignatureStarted && currState !== SignerSessionState.Finishing) {\r\n console.error(\"Recebida resposta de lote de assinaturas, porém estágio da sessão estava com valor: \" + currState);\r\n return this.enterErrorState(\"Erro no processo de assinatura, tente novamente\");\r\n }\r\n //faz tratamento da resposta\r\n this.handleBatchProcessingCallbackResult(result);\r\n }\r\n }\r\n\r\n private handleCallbackError(error: ErrorInfo, correlationInfo: CallbackCorrelationInfo) : void\r\n {\r\n //se o callback for para uma session diferente da atual, vamos ignorar ele\r\n if (!this.sessionData.matchesCallbackCorrelationInfo(correlationInfo)) {\r\n console.warn(\"Recebido erro em callback que não corresponde à sessão atual. Possível sessão dangling em server-side\");\r\n return console.dir(error);\r\n }\r\n\r\n //entra em estado de erro\r\n this.enterErrorState(error);\r\n }\r\n\r\n /** Cancela processo de assinatura que estiver sendo realizado\r\n */\r\n cancelSignature() : void\r\n {\r\n //se sessão já está finalizada ou cancelada, não há nada para fazer\r\n if (this.is_finished() || this.is_currentSessionCancelled()) return;\r\n\r\n //pega estado atual do processo do signer\r\n const currentState:SignerSessionState = this.state;\r\n \r\n //se ainda estiver no estado de criação da sessão do core (nunca iniciou uma sessão de assinatura mesmo no server)\r\n //não precisamos fazer nada de especial (podendo manter o core criado certinho)\r\n if (currentState === SignerSessionState.CreatingCoreSession || currentState === SignerSessionState.CoreSessionCreated) return;\r\n\r\n //marca flag de cancelamento nos dados atuais da sessão\r\n this.sessionData.cancelled = true;\r\n\r\n //cria modelo de erro simbolizando cancelamento\r\n const cancelError:ErrorInfo = { msg: \"Operação cancelada manualmente\", type: null };\r\n\r\n //tricky: neste estado, foi uma request de início de sessão para o servidor porém ela ainda não voltou.\r\n //vamos pular direto para o estado de \"Finished\", pois não adianta enviar nenhuma notificação para o server-side\r\n if (currentState === SignerSessionState.StartingSignature) {\r\n return this.enterErrorState(cancelError);\r\n }\r\n\r\n //verifica se está processando assinaturas no java, entrando em estado de report de erro (consequentemente cancelando assinatura)\r\n this.enterReportingErrorState(cancelError);\r\n }\r\n\r\n private rebuildCertificateCacheInternal() : void {\r\n //pega sessão core e invoca reload do cache de certificados\r\n const coreSession: AbstractJavaSession = this.ensureCoreSession();\r\n this.certCache.reloadCache(coreSession);\r\n }\r\n\r\n private scheduleRebuildCertificateCacheInternal() : void {\r\n this.add_coreSessionAcquired(this.rebuildCertificateCacheInternal.bind(this));\r\n }\r\n\r\n /** Recria cache de certificados\r\n */\r\n rebuildCertificateCache() : void {\r\n //se já começou uma sessão de assinatura, vamos ignorar o pedido de rebuild, de forma silenciosa\r\n if (this.state >= SignerSessionState.StartingSignature)\r\n return console.warn(\"Ignorado pedido de rebuild cache, pois estado está '%s'\", this.state);\r\n\r\n //se está no meio da criação de uma sessão com o core, faz schedule da operação, em vez de executar imediatamente\r\n if (this.state === SignerSessionState.CreatingCoreSession) {\r\n this.scheduleRebuildCertificateCacheInternal();\r\n }\r\n else { this.rebuildCertificateCacheInternal(); }\r\n }\r\n\r\n private listCertificatesInternal(callbackMethod: (CoreResponseModel) => void) : void {\r\n //pega sessão core e invoca listagem de certificados do cache\r\n const coreSession: AbstractJavaSession = this.ensureCoreSession();\r\n this.certCache.listCertificates(coreSession, callbackMethod);\r\n }\r\n\r\n private scheduleListCertificatesInternal(callbackMethod: (CoreResponseModel) => void) : void {\r\n this.add_coreSessionAcquired(sender => sender.listCertificatesInternal(callbackMethod));\r\n }\r\n\r\n /** Realiza consulta de certificados\r\n * @param callbackMethod Callback para processamento do retorno\r\n */\r\n listCertificates(callbackMethod: (CoreResponseModel) => void) : void {\r\n //se está no meio da criação de uma sessão com o core, faz schedule da operação, em vez de executar imediatamente\r\n if (this.state === SignerSessionState.CreatingCoreSession) {\r\n this.scheduleListCertificatesInternal(callbackMethod);\r\n }\r\n else { this.listCertificatesInternal(callbackMethod); }\r\n }\r\n\r\n /** Inicia processo de assinatura\r\n * @param certificate Informações do certificado a ser utilizado\r\n * @returns Promisse com dados da sessão de assinatura se certificado possui cadeia completa, senão void\r\n */\r\n startSignProcess(certificate: CertificateInfo): any {\r\n //valida certificado informado\r\n if (!certificate) throw new Error(`Parâmetro \"certificate\" obrigatório não informado`);\r\n if (!certificate.certID) throw new Error(\"Objeto de certificado informado não possui atributo 'certID' válido\");\r\n if (!certificate.keyStoreType) throw Error(\"Objeto de certificado informado não possui atributo 'keyStoreType' válido\");\r\n\r\n //verifica se já não está no meio do processamento de assinaturas\r\n if (this.is_processingSignatures())\r\n throw new Error(\"Um processo de assinatura já está ocorrendo no momento\");\r\n\r\n //pega sessão do core\r\n const coreSession: AbstractJavaSession = this.ensureCoreSession();\r\n\r\n //limpa último erro ocorrido e informações de sessão que existirem\r\n this.lastError = null;\r\n this.clearSessionInfo();\r\n //seta nova revisão para session data\r\n this.sessionData.revision = ++this.signerSessionDataRevisionSeed;\r\n\r\n //muda estágio para iniciando e seta ID do certificado sendo utilizado\r\n this.state = SignerSessionState.StartingSignature;\r\n this.sessionData.certId = certificate.certID;\r\n \r\n //argumentos para o callback de início de assinatura (tenta pegar cadeia de certificados já do objeto de certificado passado)\r\n const startCommandArgs: SignatureProcessStartArguments = {\r\n keyStoreType : certificate.keyStoreType,\r\n certChain : certificate.certChain\r\n };\r\n\r\n //cria info de correção para callbacks à seguir\r\n const correlationInfo:CallbackCorrelationInfo = this.sessionData.makeCallbackCorrelationInfo();\r\n\r\n //se já tem cadeia de certificados informada, vamos executar o callback\r\n if (startCommandArgs.certChain) {\r\n return this.http.startSession(startCommandArgs)\r\n .then(res => this.handleCallbackResult(res, correlationInfo))\r\n .catch(err => this.handleCallbackError(err, correlationInfo));\r\n }\r\n\r\n //não tendo a cadeia informada ainda, vamos pedir ela para o java\r\n const thisRef: SignerSession = this;\r\n coreSession.getCertChain(this.sessionData.certId, function (resp) {\r\n //se possui erro, vai para estado de erro\r\n if (resp.error) return thisRef.enterErrorState(resp.error);\r\n\r\n //seta cadeia resultante nos argumentos do callback e envia o callback para o servidor\r\n startCommandArgs.certChain = resp.result.chain;\r\n thisRef.http.startSession(startCommandArgs)\r\n .then(res => thisRef.handleCallbackResult(res, correlationInfo))\r\n .catch(err => thisRef.handleCallbackError(err, correlationInfo));\r\n });\r\n }\r\n\r\n private onCoreSessionCreated(coreSession: AbstractJavaSession) : void {\r\n //garante que o estado deste controle esteja esperando pela criação da core session\r\n if (this.state !== SignerSessionState.CreatingCoreSession)\r\n throw new Error(\"Recebido callback de criação de sessão Java durante o estágio \" + this.state);\r\n\r\n //salva coreSession e muda o estágio deste controle\r\n this.coreSession = coreSession;\r\n this.state = SignerSessionState.CoreSessionCreated;\r\n\r\n //dispara evento de sessão do core obtida\r\n this.fireCoreSessionAcquired();\r\n }\r\n\r\n /** Cria nova sessão java não existe nenhuma sessão válida para utilização\r\n * @param callback Callback para processar retorno\r\n */\r\n newJavaSession(callback: (AbstractJavaSession) => void) : void {\r\n //verifica se foi passado callback\r\n if (!callback) throw new Error(`Parâmetro \"callback\" obrigatório não informado`);\r\n if (typeof callback !== \"function\") throw new Error(`Tipo inválido do parâmetro \"callback\" (deve ser Function)`);\r\n\r\n //garante que o status está em um estado terminal ou que ainda não iniciamos nenhum processo de assinatura\r\n const needsSession: boolean = this.is_finished() || this.state === SignerSessionState.NotStarted;\r\n if (!needsSession)\r\n throw new Error(\"Não é possível criar nova sessão de assinatura enquanto este controle estiver no estado \" + this.state);\r\n\r\n //salva callback do usuário a ser invocado quando o java estiver pronto, assim como muda o estado para criando sessão java\r\n this.state = SignerSessionState.CreatingCoreSession;\r\n this.add_coreSessionAcquired(callback);\r\n\r\n //pega core de assinatura e pede para criar nova sessão Java\r\n this.getSignerCore().newJavaSession(this.onCoreSessionCreatedHandler);\r\n }\r\n\r\n /** Incializa sessão de assinatura\r\n */\r\n initialize() : void {\r\n //cria delegates\r\n this.javaSignCallbackHandler = this.javaSignCallback.bind(this);\r\n this.onCoreSessionCreatedHandler = this.onCoreSessionCreated.bind(this);\r\n\r\n this.certCache = new CertificateCache(this.certProcessingEnabled, this.http);\r\n }\r\n\r\n /** Limpa referências do objeto\r\n */\r\n dispose() : void {\r\n //nula delegates\r\n this.javaSignCallbackHandler = null;\r\n this.onCoreSessionCreatedHandler = null;\r\n\r\n //se tiver processo de assinatura rolando, vamos fazer um cancelamento emergencial\r\n if (this.is_processingSignatures()) {\r\n this.cancelJavaSignatureUnchecked();\r\n this.sendBatchCallbackForError({ msg: \"Cancelamento emergencial: Objeto javascript recebeu dispose\", type: null });\r\n }\r\n\r\n //faz dispose da core session sendo utilizada (se tiver)\r\n this.disposeCoreSession();\r\n\r\n //nula outras coisas\r\n this.certCache = null;\r\n }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./lib/signer-session.ts"],"sourceRoot":""}