TFS_ANTIGUO/SIGPC/ProyectoSIGPC/hfda/HermesFDARemote.js
kledezma 7fdadc4709 KLB
git-tfs-id: [http://192.168.1.10:8080/tfs/AyA]$/SINORT;C519
2021-01-22 15:05:35 +00:00

365 lines
No EOL
8.5 KiB
JavaScript

function HermesFDARemote(urlBase, servicioId, sesionReadyCallback, sesionErrorCallback, desconectadoCallback)
{
// propiedades
this.version = 1;
this.lastErrorMessage = "";
this.description = "Proxy remoto de componente de firma digital de Hermes 1.1";
this.pinLength = 0;
this.lastError = 0;
this.lastLowLevelError = 0;
this.pinModuleName = "";
this.isPinMissing = false;
this.isPinInvalid = false;
this.pinRetryCount = 0;
this.pin = "";
this.isInstalled = true;
this.pinNeeded = false;
this.isUpdated = true;
// propiedades del servicio
this.servicioId = servicioId;
this.cliente = new HermesMsg(urlBase);
// Establecer una sesión segura
this.sesionEstablecida = false;
this.Desconectado = desconectadoCallback;
// eventos
this.onCertificatesReady = null;
this.onUpdated = null;
this.onCertificateReady = null;
this.onSignatureReady = null;
// codigos de comandos
this.ListarCertificados = 1;
this.ObtenerCertificado = 2;
this.FirmarDigitalmente = 3;
}
HermesFDARemote.prototype.IniciarSesion =
function (sesionReadyCallback, sesionErrorCallback)
{
var obj = this;
var result = this.cliente.IniciarSesion(
this.servicioId,
function () {
obj.sesionEstablecida = true;
if (sesionReadyCallback != null) {
try {
sesionReadyCallback();
}
catch (e) {
}
}
},
function () {
if (sesionErrorCallback != null) {
try {
sesionErrorCallback();
}
catch (e) {
}
}
}
);
}
HermesFDARemote.prototype.isInstalled =
function ()
{
return this.isInstalled;
}
HermesFDARemote.prototype.getVersion =
function ()
{
return this.version;
}
HermesFDARemote.prototype.processPinChar =
function (char)
{
this.pin += char;
this.pinLength = this.pin.length;
}
HermesFDARemote.prototype.deletePinChar =
function ()
{
if (this.pin.length > 0)
{
this.pin = this.pin.substr(0, this.pin.length - 1);
this.pinLength = this.pin.length;
}
}
HermesFDARemote.prototype.getDigitalSignatureCertificates =
function ()
{
// Tratar de resolver desde el cache
var certificateList = getFromCache("getDigitalSignatureCertificates");
if (certificateList != null) {
this.lastError = 0;
this.lastErrorMessage = "";
this.lastLowLevelError = 0;
return certificateList;
}
// Es necesario que haya una sesión segura
if (!this.sesionEstablecida)
{
this.lastError = 12;
this.lastErrorMessage = "No se puede establecer una sesión";
if (this.onCertificatesReady != null) {
this.onCertificatesReady("");
}
}
var comando = this.CrearComando(this.ListarCertificados, null);
var obj = this;
this.cliente.EnviarMensaje(
this.servicioId,
comando,
function (respuesta) {
respuesta = JSON.parse(respuesta);
obj.ProcesarRespuesta(respuesta, respuesta.Certificados);
if (respuesta.Certificados != null) {
addToCache("getDigitalSignatureCertificates", respuesta.Certificados);
}
if (obj.onCertificatesReady != null)
{
obj.onCertificatesReady(respuesta.Certificados);
}
},
function(error)
{
obj.ActualizarEstado();
if (obj.onCertificatesReady != null) {
obj.onCertificatesReady("");
}
if (obj.servicioId == null && obj.Desconectado != null)
{
obj.Desconectado();
}
}
);
}
HermesFDARemote.prototype.getCertificate =
function (certId)
{
// Tratar de resolver desde el cache
var certificado = getFromCache(certId);
if (certificado != null) {
this.lastError = 0;
this.lastErrorMessage = "";
this.lastLowLevelError = 0;
return certificado;
}
// Es necesario que haya una sesión segura
if (!this.sesionEstablecida) {
this.lastError = 12;
this.lastErrorMessage = "No se puede establecer una sesión";
if (this.onCertificateReady != null) {
this.onCertificateReady("");
}
}
var comando = this.CrearComando(this.ObtenerCertificado, certId);
var obj = this;
this.cliente.EnviarMensaje(
this.servicioId,
comando,
function (respuesta) {
respuesta = JSON.parse(respuesta);
obj.ProcesarRespuesta(respuesta, respuesta.Certificado);
if (respuesta.Certificado != null) {
addToCache(certId, respuesta.Certificado);
}
if (obj.onCertificateReady != null) {
obj.onCertificateReady(respuesta.Certificado);
}
},
function (error) {
obj.ActualizarEstado();
if (obj.onCertificateReady != null) {
obj.onCertificateReady("");
}
if (obj.servicioId == null && obj.Desconectado != null) {
obj.Desconectado();
}
}
);
}
HermesFDARemote.prototype.signPkcs1 =
function(certId, digest)
{
// Es necesario que haya una sesión segura
if (!this.sesionEstablecida) {
this.lastError = 12;
this.lastErrorMessage = "No se puede establecer una sesión";
if (this.onSignatureReady != null) {
this.onSignatureReady("");
}
}
var comando = this.CrearComando(this.FirmarDigitalmente, { certId: certId, digest: digest });
var obj = this;
this.cliente.EnviarMensaje(
this.servicioId,
comando,
function (respuesta) {
respuesta = JSON.parse(respuesta);
obj.ProcesarRespuesta(respuesta, respuesta.Pkcs1);
if (obj.onSignatureReady != null) {
obj.onSignatureReady(respuesta.Pkcs1);
}
},
function (error) {
obj.ActualizarEstado();
if (obj.onSignatureReady != null) {
obj.onSignatureReady("");
}
if (obj.servicioId == null && obj.Desconectado != null) {
obj.Desconectado();
}
}
);
}
HermesFDARemote.prototype.CrearComando =
function(codigo, argumento)
{
return JSON.stringify({Codigo:codigo, Pin:this.pin, Argumento:argumento});
}
HermesFDARemote.prototype.ProcesarRespuesta =
function (respuesta, dato) {
var error = dato == null || dato == "";
if (error)
{
this.lastError = respuesta.lastError;
this.lastErrorMessage = respuesta.lastErrorMessage;
this.lastLowLevelError = respuesta.lastLowLevelError
}
else
{
this.lastError = 0;
this.lastErrorMessage = "";
this.lastLowLevelError = 0;
}
this.pinModuleName = respuesta.pinModuleName;
this.isPinMissing = respuesta.isPinMissing;
this.isPinInvalid =respuesta.isPinInvalid;
this.pinRetryCount = respuesta.pinRetryCount;
this.pinNeeded = respuesta.pinNeeded;
this.isInstalled = respuesta.isInstalled;
this.isUpdated = respuesta.isUpdated;
this.pinLength = respuesta.pinLength;
if (this.pinLength == 0)
{
this.pin = "";
}
}
HermesFDARemote.prototype.ActualizarEstado =
function (respuesta) {
// Si el cliente está en estado Desocupado significa que el servidor
// dejo de responder
if (this.cliente.EstadoMensaje == this.cliente.Desocupado)
{
this.lastError = 12;
this.lastErrorMessage = "No se puede establecer una conexión con el lector";
this.servicioId = null;
}
}
function RutaBaseServicioFirma() {
var rutaBase = HermesFDAPrepareSignaturePageURL;
var i = rutaBase.indexOf("FirmaDigitalAvanzada/PrepararCades");
if (i > 0) {
rutaBase = rutaBase.substr(0, i);
}
return rutaBase;
}
function ObtenerIdServicio(pedirAUsuario) {
var servicioId = readCookie("ServicioId");
if (pedirAUsuario && servicioId == null) {
servicioId = prompt("Introduzca el c\xf3digo de acceso remoto:");
if (servicioId == null || servicioId == "") {
eraseCookie("ServicioId");
}
else {
createCookie("ServicioId", servicioId, null);
}
}
return servicioId == null || servicioId == "" ? null : parseInt(servicioId, 16);
}
function BorrarServicioId()
{
eraseCookie("ServicioId");
}
function createCookie(name, value, days) {
var expires;
if (days) {
var date = new Date();
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
expires = "; expires=" + date.toGMTString();
} else {
expires = "";
}
document.cookie = encodeURIComponent(name) + "=" + encodeURIComponent(value) + expires + "; path=/";
}
function readCookie(name) {
var nameEQ = encodeURIComponent(name) + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0) === ' ') c = c.substring(1, c.length);
if (c.indexOf(nameEQ) === 0) return decodeURIComponent(c.substring(nameEQ.length, c.length));
}
return null;
}
function eraseCookie(name) {
createCookie(name, "", -1);
}