commit 8a331d18a655032c4a9d11af1045777f84ad5724 Author: Ernesto Canales Pereña Date: Sun Jun 18 21:12:32 2023 +0200 Files added to repository diff --git a/README.md b/README.md new file mode 100644 index 0000000..4a066e6 --- /dev/null +++ b/README.md @@ -0,0 +1,12 @@ +# DataBank-Extension + + +1. Clone this repository + +```bash +git clone http://git.wacanal.cloud/ernie/databank-extension.git +``` + +2. Open Google Chrome and go to the option "Extensions->Manage Extensions" +3. Once in the extension manager, select "Load unpacked" +4. Select the cloned repository diff --git a/background.js b/background.js new file mode 100644 index 0000000..f8931c0 --- /dev/null +++ b/background.js @@ -0,0 +1,5 @@ +chrome.browserAction.onClicked.addListener(function(tab){ + chrome.tabs.create({ + url: ("index.html") + }); +}); \ No newline at end of file diff --git a/content.js b/content.js new file mode 100644 index 0000000..e69de29 diff --git a/estilo.css b/estilo.css new file mode 100644 index 0000000..e121f9d --- /dev/null +++ b/estilo.css @@ -0,0 +1,325 @@ +/* +Al cuerpo de la +pagina se aplica el tamaño de fuente + */ + html{ + overflow: scroll; + } + body { + font-size: 12px; + background-size: cover; + background: linear-gradient(rgba(255,255,255,0.7), rgba(255, 255, 255, 0.7)), url("https://images-ext-2.discordapp.net/external/I4WDr_mFwmEPpd1gYZpWqmZ8Fod844njMPCXgLycCfk/https/www.incimages.com/uploaded_files/image/1920x1080/getty_913017342_415366.jpg?width=1191&height=670"); + background-size: 1850px 850px; + font-family: 'Varela Round', sans-serif; + font-size: 13px; + +} +/** + * se aplica el ancho, margen centrado + * borde de un pixel con redondeado, y rellenado + * a la izquierda y derecha + */ +#Contenedor{ + width: 400px; + margin: 50px auto; + height: 400px; + border-radius:8px; + padding: 0px 9px 0px 9px; +} + +/** + * Aplicando al icono de usuario el color de fondo, + * rellenado de 20px y un redondeado de 120px en forma + * de un circulo + */ +.Icon span{ + background: #A8A6A6; + padding: 20px; + border-radius: 120px; +} +/** + * Se aplica al contenedor madre un margen de tamaño 10px hacia la cabecera y pie, + * color de fuente blanco,un tamaño de fuente 50px y texto centrado. + */ +.Icon{ + margin-top: 10px; + margin-bottom:10px; + color: #FFF; + font-size: 50px; + text-align: center; +} +/** + * Se aplica al contenedor donde muestra en el pie + * la opción de olvidaste tu contraseña? + */ +.opcioncontra{ + text-align: center; + margin-top: 20px; + font-size: 14px; +} + +/** + * En las siguientes lineas + * se define el diseño adaptable, para que + * se muestre en los dispositivos móviles + */ + +/******************************************/ +/*** DISEÑO PARA MOVILES 320 ****/ +/******************************************/ +@media only screen and (max-width:320px){ + #Contenedor{ + width: 100%; + height: auto; + margin: 0px; + } +} + +/******************************************/ +/*** DISEÑO PARA MOVILES 240 ****/ +/******************************************/ +@media only screen and (max-width:240px){ + +} + +.buttonAddPass { + position: relative; + top: 100px; + left: 1217px; +} + +.buttonAddUser { + text-align: center; +} + + + + /* Modal styles */ + .modal .modal-dialog { + max-width: 450px; + } + .modal .modal-header, .modal .modal-body, .modal .modal-footer { + padding: 20px 30px; + } + .modal .modal-content { + border-radius: 3px; + } + .modal .modal-footer { + background: #ecf0f1; + border-radius: 0 0 3px 3px; + } + .modal .modal-title { + display: inline-block; + } + .modal .form-control { + border-radius: 2px; + box-shadow: none; + border-color: #dddddd; + } + .modal textarea.form-control { + resize: vertical; + } + .modal .btn { + border-radius: 2px; + min-width: 100px; + } + .modal form label { + font-weight: normal; + } + + + /* Table styles */ + .table-responsive { + margin: 30px 0; + } + .table-wrapper { + min-width: 1000px; + background: #fff; + padding: 20px 25px; + border-radius: 3px; + box-shadow: 0 1px 1px rgba(0,0,0,.05); + } + .table-title { + padding-bottom: 15px; + background: #435d7d; + color: #fff; + padding: 16px 30px; + margin: -20px -25px 10px; + border-radius: 3px 3px 0 0; + } + .table-title h2 { + margin: 5px 0 0; + font-size: 24px; + } + .table-title .btn-group { + float: right; + } + .table-title .btn { + color: #fff; + float: right; + font-size: 13px; + border: none; + min-width: 50px; + border-radius: 2px; + border: none; + outline: none !important; + margin-left: 10px; + } + .table-title .btn i { + float: left; + font-size: 21px; + margin-right: 5px; + } + .table-title .btn span { + float: left; + margin-top: 2px; + } + table.table tr th, table.table tr td { + border-color: #e9e9e9; + padding: 12px 15px; + vertical-align: middle; + } + table.table tr th:first-child { + width: 250px; + } + table.table tr th:last-child { + width: 130px; + } + table.table-striped tbody tr:nth-of-type(odd) { + background-color: #fcfcfc; + } + table.table-striped.table-hover tbody tr:hover { + background: #f5f5f5; + } + table.table th i { + font-size: 13px; + margin: 0 5px; + cursor: pointer; + } + table.table td:last-child i { + opacity: 0.9; + font-size: 22px; + margin: 0 5px; + } + table.table td a { + font-weight: bold; + color: #566787; + display: inline-block; + text-decoration: none; + outline: none !important; + } + table.table td a:hover { + color: #2196F3; + } + table.table td a.edit { + color: #FFC107; + } + table.table td a.delete { + color: #F44336; + } + table.table td i { + font-size: 19px; + } + table.table .avatar { + border-radius: 50%; + vertical-align: middle; + margin-right: 10px; + } + + a { + cursor:pointer; + } + + .passCaja{ + color:transparent; + cursor:default; + } + + .ojo{ + cursor:pointer; + color: #7e9ac7 ; + } + + #opcionesContraseña{ + height: 45px; + } + + .nav_menu{ + margin-top: 30px; + } + + .nav_menu_tabs{ + display: inline-block; + } + + .nav_menu_botones{ + float: right; + } + + /*mostrar y ocultar tablas compartido y privado*/ + .archivosOcultos{ + display:none !important; + } + + .modal-compartir{ + /*text-align: center;*/ + } + + .multiselect-container{ + overflow:scroll; + max-height: 200px; + } + + .isDisabled { + color: currentColor; + cursor: not-allowed; + opacity: 0.5; + text-decoration: none; + pointer-events: none; + } + + #archivosCompartidosList{ + overflow:scroll; + max-height: 200px; + } + + #archivosCompartidosConmigoList{ + overflow:scroll; + max-height: 200px; + } + + + .qrCode{ + display: block; + margin: auto; + margin-top: 50px; + } + + .badgebox + { + opacity: 0; + } + + .badgebox + .badge + { + /* Move the check mark away when unchecked */ + text-indent: -999999px; + /* Makes the badge's width stay the same checked and unchecked */ + width: 27px; + } + + .badgebox:focus + .badge + { + /* Set something to make the badge looks focused */ + /* This really depends on the application, in my case it was: */ + + /* Adding a light border */ + box-shadow: inset 0px 0px 5px; + /* Taking the difference out of the padding */ + } + + .badgebox:checked + .badge + { + /* Move the check mark back when checked */ + text-indent: 0; + } \ No newline at end of file diff --git a/icon128.png b/icon128.png new file mode 100644 index 0000000..7e819bc Binary files /dev/null and b/icon128.png differ diff --git a/icon16.png b/icon16.png new file mode 100644 index 0000000..49d9a06 Binary files /dev/null and b/icon16.png differ diff --git a/icon32.png b/icon32.png new file mode 100644 index 0000000..28923a6 Binary files /dev/null and b/icon32.png differ diff --git a/icon48.png b/icon48.png new file mode 100644 index 0000000..93e7bc8 Binary files /dev/null and b/icon48.png differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..8f3adf9 --- /dev/null +++ b/index.html @@ -0,0 +1,72 @@ + + + + Proyecto ES + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+
+ + +
+
+
+ + + +
+ + +
+
+
+
+ + +
+ + + + + + + \ No newline at end of file diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..aff41a3 --- /dev/null +++ b/manifest.json @@ -0,0 +1,32 @@ +{ + "manifest_version": 2, + "name": "SE", + "version": "1.0.0", + "description": "Extension for SecureDataBank", + "icons": { + "128": "icon128.png", + "32": "icon32.png", + "48": "icon48.png" + }, + "browser_action": { + "default_icon": { + "16": "icon16.png", + "32": "icon32.png" + }, + "default_title": "Extension for SecureDataBank" + }, + "content_security_policy": "script-src 'self' https://unpkg.com/ https://fonts.googleapis.com/ https://cdn.datatables.net/ https://maxcdn.bootstrapcdn.com/ https://ajax.googleapis.com/ https://cdnjs.cloudflare.com/; object-src 'self'", + "background": + { + "scripts": ["background.js"], + "persistent": false + }, + "content_scripts": [ + { + "matches": [""], + "js": ["content.js"], + "run_at": "document_end" + } + ] +} + diff --git a/script.js b/script.js new file mode 100644 index 0000000..8a3d0cd --- /dev/null +++ b/script.js @@ -0,0 +1,1378 @@ + +import {rellenarContraseña} from './scripts/contraseñaSeguras.js'; +import {bodyHTML, bodyFA} from './scripts/html.js'; +import {modal} from './scripts/modales/modalCrear.js'; +import {modalCompartir} from './scripts/modales/modalCompartir.js'; +import {modalEUsuario,modalENota,modalEditTarjetaCredito,modalEditCuentaBancaria} from './scripts/modales/modalesEditar.js'; +import {plantillaUsuario,plantillaNota,plantillaTarjetaCredito,plantillaCuentaBancaria} from './scripts/plantillas.js' +import {sha512, sha256, cifrar,descifrar,utf8_to_b64,b64_to_utf8,generarParDeClaves,exportarClave,importarClavePublica,importarClavePrivada,cifrarConPublica,descifrarConPrivada,CodificarDatos,DecodificarDatos} from './scripts/seguridad.js' + + +//const baseDominio = '...'; +//const portTLS = '..'; +//const portTLS = '..'; +const baseDominio = '192.168.10.2'; +const portTLS = '4000'; +var time; + +// Creamos el almacenamiento. De momento el único almacenamiento persistente es +// LocalStorage, pero es fácil definir alternativas basadas en WebSQL, IndexedDB, etc. +/*var storage = new plog.storages.LocalStorage({maxSize: 200}) + +// Configuramos plog para que use el almacenamiento que acabamos de crear +plog.useStorage(storage); + +plog.setLevel(plog.level.INFO); + +// Escribimos mensajes en el log +plog.debug('debug message'); +plog.info('info message'); +plog.warn('warn message'); +plog.error('error message'); +plog.fatal('fatal message'); + +var events = storage.getEvents(); +console.log(events);*/ + + +/** + * funcion que devulve una columna (td) con los botones de borrar y editar, a la que le pasamos las funciones manejadoras de eventos, nombre de la tabla y variable i de esa tabla + * @param {*} i variable i del bucle para indicar el número del usuario + * @param {*} funcionBorrar funcion manejadora del evento click del boton borrar + * @param {*} funcionEditar funcion manejadora del evento click del boton editar + * @param {*} nombreTabla nombre de la tabla a la que se quiere añadir los botones + * @returns devuelve la columna (td) con los botones y sus manejadores añadidos + */ +function botonesEditarBorrar(i, funcionBorrar, funcionEditar, nombreTabla){ + + let columna = document.createElement('td'); + let buttonEditar = document.createElement('a'); //Boton editar + buttonEditar.innerHTML = ``; + buttonEditar.id = 'Editar'+nombreTabla+'-' + i; + buttonEditar.className = "edit"; + buttonEditar.setAttribute("data-index", i); + let buttonBorrar = document.createElement('a'); //Boton borrar + buttonBorrar.innerHTML = ``; + buttonBorrar.id = 'Borra'+nombreTabla+'-' + i; + buttonBorrar.classList.add("delete"); + + + //Evento Borrar + buttonBorrar.addEventListener("click", funcionBorrar, false); + //Evento Editar Usuario + buttonEditar.addEventListener("click", funcionEditar, false); + + + columna.appendChild(buttonEditar); + columna.appendChild( document.createTextNode( '\u00A0' ) ); //Espacio + columna.appendChild(buttonBorrar); + + return columna; +} + +/** + * Funcion que le pasas el nombre del id (sin #) de la tabla y le añade el dataTables de JQuery + * @param {*} idTabla es el id (sin el #) de la tabla a la que se le quiere añadir las funcionalidades de las Data Tables + */ +function dataTablesJQuery(idTabla) { + jQuery(document).ready(function($){ + $('#'+idTabla).DataTable({ + language: { + lengthMenu: "Filtro _MENU_", + info: "Página _PAGE_ de _PAGES_", + search: "Buscar", + zeroRecords: "No encontrado", + infoEmpty: "No hay contenido", + infoFiltered: "(de _MAX_ registros)", + paginate: { + first: "Primero", + last: "Último", + next: "Siguiente", + previous: "Anterior" + } + }, + lengthMenu: [ 5, 10, 25, 50, 75, 100 ] + }); + }); +} + +/** + * La función a partir del objeto de la sesion actual, crea la tabla del tipo de dato pasado (en plural), con la funcion editar y borrar pasada + * @param {*} objetoJS objeto de la sesion actual + * @param {*} tipoDato indica el tipo de dato (en plural y string) del cual se va a rellenar la tabla + * @param {*} esUsuario booleano que indica si la tabla es de tipo usuario (true), o de otro tipo (false) + * @param {*} funcionEditar funcion manejadora del evento click en editar del dato + * @param {*} funcionBorrar funcion manejadora del evento click en borrar del dato + */ +function rellenarTabla(objetoJS,tipoDato,esUsuario,funcionEditar,funcionBorrar, compartido=false) { + let tabla; + if(!compartido){ + tabla = document.querySelector('#'+tipoDato+'Table'); + } + else{ + tabla = document.querySelector('#'+tipoDato+'TableCompartidos'); + } + + let fila; let columna; let valores; + for(let i = 0; i + `; + + let divCheck = document.createElement('span'); + divCheck.classList.add("form-check", "form-check-inline"); + divCheck.innerHTML = htmlCheck; + columna.appendChild( document.createTextNode( '\u00A0' ) ); //Espacio + columna.appendChild(divCheck); + } + + fila.appendChild(columna); + tabla.appendChild(fila); + } +} +function cambioPrivateToShareAndReverse(event){ + var ul=event.target.parentNode.parentNode,liPrivate=ul.querySelector("#aPrivate").parentNode, liShare=ul.querySelector("#aShare").parentNode; + var li2FA=ul.querySelector("#a2FA").parentNode; + var divPrivate=document.querySelector("#divPrivate"), divShare=document.querySelector("#divShare"), div2FA=document.querySelector("#div2FA"); + var cambiar=false; + var cambiar2FA=false; + let buttonSubirDatos = document.querySelector('#subirDatos'); + let compartir = document.querySelector('#compartirDatosButton'); + let archivosCompartidosButton = document.querySelector('#archivosCompartidosButton'); + let archivosCompartidosConmigoButton = document.querySelector('#archivosCompartidosConmigoButton'); + + if(event.target.getAttribute("href")=="#divPrivate" && event.target.parentNode.classList.contains("active")===false){ + liPrivate.classList.toggle("active"); + li2FA.className = ""; + liShare.className = ""; + ocultarDiv(divShare,compartir,archivosCompartidosButton,archivosCompartidosConmigoButton,div2FA); + mostrarDiv(divPrivate,buttonSubirDatos); + + } + if(event.target.getAttribute("href")=="#divShare" && event.target.parentNode.classList.contains("active")===false){ + liShare.classList.toggle("active"); + liPrivate.className = ""; + li2FA.className = ""; + ocultarDiv(divPrivate,buttonSubirDatos,div2FA); + mostrarDiv(divShare,compartir,archivosCompartidosButton,archivosCompartidosConmigoButton); + + } + if(event.target.getAttribute("href")=="#div2FA" && event.target.parentNode.classList.contains("active")===false){ + li2FA.classList.toggle("active"); + liPrivate.className = ""; + liShare.className = ""; + ocultarDiv(divPrivate,divShare,buttonSubirDatos,compartir,archivosCompartidosButton,archivosCompartidosConmigoButton); + mostrarDiv(div2FA); + let TFA = sessionStorage.getItem('TFA'); + let checkBox2FA = document.querySelector('#act2FA'); + if(TFA==1){ + checkBox2FA.checked = true; + checkBox2FA.setAttribute('disabled', true); + } + if(sessionStorage.getItem('urlQR')){ + let urlQR = sessionStorage.getItem('urlQR'); + generateQR(urlQR); + } + else{ + generateQR(); + } + } + + //window.scroll(0,0); + setTimeout(function(){ window.scroll(0,0);}, 10); +} + +function ocultarDiv(){ + for (var i = 0; i < arguments.length; i++) { + arguments[i].classList.add("archivosOcultos"); + } +} + +function mostrarDiv(){ + for (var i = 0; i < arguments.length; i++) { + arguments[i].classList.remove("archivosOcultos"); + } +} + + +function generateQR(urlQR){ + var qrcode = new QRCode(document.getElementById("qrcode"), { + width : 800, + height : 800, + useSVG: true + }); + + if(urlQR){ + qrcode.makeCode(urlQR); + return; + } + qrcode.makeCode("https://ernestocanales.es"); +} + +function rellenarBody(){ + let cuerpo = document.querySelector('body'); + cuerpo.style.cssText = 'background:linear-gradient(rgba(255,255,255,0.9), rgba(255, 255, 255, 0.9)), url("https://images-ext-2.discordapp.net/external/I4WDr_mFwmEPpd1gYZpWqmZ8Fod844njMPCXgLycCfk/https/www.incimages.com/uploaded_files/image/1920x1080/getty_913017342_415366.jpg?width=1191&height=670");'; + document.body.innerHTML = bodyHTML(); + + document.body.innerHTML += modal(); + document.body.innerHTML += modalCompartir(); + document.body.innerHTML += modalEUsuario(); + document.body.innerHTML += modalENota(); + document.body.innerHTML += modalEditTarjetaCredito(); + document.body.innerHTML += modalEditCuentaBancaria(); + + + //Evento mostrarCompartidosConmigo + let buttonCompartidoConmigo = document.querySelector('#archivosCompartidosConmigoButton'); + buttonCompartidoConmigo.addEventListener("click", listaCompartidosConmigo, false); + //Evento mostrarCompartidos + let buttonCompartido = document.querySelector('#archivosCompartidosButton'); + buttonCompartido.addEventListener("click", listaCompartidos, false); + //Evento mostrarUsuarios + $('#multiSelect').multiselect(); + let buttonSelect = document.querySelector('#multiSelect'); + buttonSelect = buttonSelect.nextElementSibling.firstElementChild; + buttonSelect.addEventListener("click", listaUsuarios, false); + ///Evento compartirDatos + let botonCompartirDatos = document.querySelector('#compartirDatos'); + botonCompartirDatos.addEventListener("click", compartirDatos, false); + //Evento inactividad + inactividad(); + ///Evento SubirDatos + let botonSubirDatos = document.querySelector('#subirDatos'); + botonSubirDatos.addEventListener("click", subirDatos, false); + ///Evento CerrarSesion + let botonCerrarSesion = document.querySelector('#cerrarSesion'); + botonCerrarSesion.addEventListener("click", cerrarSesion, false); + ///Evento AñadirNuevo Modal + let botonA = document.querySelector('#añadirModal'); + botonA.addEventListener("click", nuevoRegistro, false); + ///Eventos generar contraseñas + let c = document.querySelector("#generarContraseña"); + c.addEventListener("click", contraseñaSegura, false); + let v = document.querySelector("#verContraseña"); + v.addEventListener("click", verContraseña, false); + ///Evento editarUsuario Modal + let botonEditarU = document.querySelector('#modalConfirmacionEditarUsuario'); + botonEditarU.addEventListener("click", editarUsuario, false); + ///Evento editarNota Modal + let botonEditarN = document.querySelector('#modalConfirmacionEditarNota'); + botonEditarN.addEventListener("click", editarNota, false); + ///Evento editarTarjetas Modal + let botonEditarT = document.querySelector('#modalConfirmacionEditarTarjetaCredito'); + botonEditarT.addEventListener("click", editarTarejetaCredito, false); + ///Evento editarCuentas Modal + let botonEditarC = document.querySelector('#modalConfirmacionEditarCuentaBancaria'); + botonEditarC.addEventListener("click", editarCuentaBancaria, false); + + ///Evento activar 2FA + let checkBox2FA = document.querySelector('#act2FA'); + checkBox2FA.addEventListener("click", activar2FA, false); + + //Evento archivos privados + let botonesPrivateShare =document.querySelector('#aPrivate'); + botonesPrivateShare.addEventListener("click", cambioPrivateToShareAndReverse, false) + //Evento archivos compartidos + botonesPrivateShare = document.querySelector('#aShare'); + botonesPrivateShare.addEventListener("click", cambioPrivateToShareAndReverse, false); + //Evento 2FA + botonesPrivateShare = document.querySelector('#a2FA'); + botonesPrivateShare.addEventListener("click", cambioPrivateToShareAndReverse, false); + //botonesPrivateShare.addEventListener("click", subirDatosCompartidos, false) + + + + let objetoJS = JSON.parse(sessionStorage.getItem('Objeto')); //Obtenemos el objeto de la sesion actual + + + + + ////Rellenamos tabla, informacion mas botones con sus eventos. + //Tabla usuarios + let funcionEditarUsuario = function () { + let index = $(this).data('index'); + document.querySelector("#editarUsuarioModal").setAttribute("data-index", index); + $('#editarUsuarioModal').modal('show'); //JQUERY + let objetoJS = JSON.parse(sessionStorage.getItem('Objeto')); //Obtenemos el objeto de la sesion actual + $('#DescripcionModalEditarUsuario').attr("placeholder", objetoJS.usuarios[index].descripcion); + $('#URLModalEditarUsuario').attr("placeholder", objetoJS.usuarios[index].url); + $('#UsuarioModalEditarUsuario').attr("placeholder", objetoJS.usuarios[index].usuario); + $('#ContraseñaModalEditarUsuario').attr("placeholder", "*******"); + }; + //rellenar tabla usuarios + rellenarTabla(objetoJS,"usuarios",true,funcionEditarUsuario,borrarUsuario); + + ///////////////////////Tabla notass + + let funcionEditarNota = function () { + let index = $(this).data('index'); + document.querySelector("#editarNotaModal").setAttribute("data-index", index); + $('#editarNotaModal').modal('show'); //JQUERY + let objetoJS = JSON.parse(sessionStorage.getItem('Objeto')); //Obtenemos el objeto de la sesion actual + $('#EditarNombreNota').attr("placeholder", objetoJS.notas[index].nombre); + $('#EditartextoNota').attr("placeholder", objetoJS.notas[index].textoNota); + }; + //rellenar tabla notas + rellenarTabla(objetoJS,"notas",false,funcionEditarNota,borrarNota); + + ///////////////////////Tabla tarjeta de crédito + + let funcionEditarTarjetaCredito = function () { + let index = $(this).data('index'); + document.querySelector("#editarTarjetaCreditoModal").setAttribute("data-index", index); + $('#editarTarjetaCreditoModal').modal('show'); //JQUERY + let objetoJS = JSON.parse(sessionStorage.getItem('Objeto')); //Obtenemos el objeto de la sesion actual + $('#nombreEntidadModalEditarTarjetaCredito').attr("placeholder", objetoJS.tarjetas[index].nombreEntidad); + $('#numTarjetaModalEditarTarjetaCredito').attr("placeholder", objetoJS.tarjetas[index].numTarjeta); + document.querySelector('#fechaCaducidadModalEditarTarjetaCredito').value=objetoJS.tarjetas[index].fechaCaducidad; + $('#nombreTitularModalEditarTarjetaCredito').attr("placeholder", objetoJS.tarjetas[index].nombreTitular); + $('#codigoDeSeguridadModalEditarTarjetaCredito').attr("placeholder", objetoJS.tarjetas[index].codigoDeSeguridad); + }; + //rellenar tabla tarjetas + rellenarTabla(objetoJS,"tarjetas",false,funcionEditarTarjetaCredito,borrarTarjetaCredito); + + ///////////////////////Tabla cuenta bancaria + let funcionEditarCuentaBancaria = function () { + let index = $(this).data('index'); + document.querySelector("#editarCuentaBancariaModal").setAttribute("data-index", index); + $('#editarCuentaBancariaModal').modal('show'); //JQUERY + let objetoJS = JSON.parse(sessionStorage.getItem('Objeto')); //Obtenemos el objeto de la sesion actual + $('#nombreEntidadBancariaModalEditarCuentaBancaria').attr("placeholder", objetoJS.cuentas[index].nombreEntidadBancaria); + $('#IBANModalEditarCuentaBancaria').attr("placeholder", objetoJS.cuentas[index].IBAN); + $('#usuarioBancarioModalEditarCuentaBancaria').attr("placeholder", objetoJS.cuentas[index].usuarioBancario); + $('#contraseñaBancarioModalEditarCuentaBancaria').attr("placeholder", "*******"); + }; + //rellenar tabla cuentas + rellenarTabla(objetoJS,"cuentas",true,funcionEditarCuentaBancaria,borrarCuentaBancaria); + + + //dataTables + $('[data-toggle="tooltip"]').tooltip(); + dataTablesJQuery("tablaUsuarios"); + dataTablesJQuery("tablaNotas"); + dataTablesJQuery("tablaTarjetasCredito"); + dataTablesJQuery("tablaCuentasBancarias"); + + + // Un poco de css dinamico. Eventos para el div de la contraseña + $('.ojo').mouseover(function(){ + var id = $(this).attr("id"); + id = id.split('-')[1]; + $('#contraseñaTablaO' + id).css('color','#373a74'); + }); + $('.ojo').mouseleave(function(){ + var id = $(this).attr("id"); + id = id.split('-')[1]; + $('#contraseñaTablaO' + id).css('color','transparent'); + }); +} + + +///////////////////////////////// +///Evento activar 2FA + +async function activar2FA(event){ + if(event.currentTarget.checked){ + let contraseñaRandom = utf8_to_b64(rellenarContraseña(15)); //Secreto TOTP solucionar esto por dios + let token = sessionStorage.getItem('token'); + + const payload= {'secreto' : contraseñaRandom.toString()}; + + let cabeceras= { + 'Content-Type': 'application/json', + 'Accept': 'application/json', + 'authorization': token + } + + const request = { + method: 'POST', + headers: cabeceras, + body: JSON.stringify(payload), + }; + + let act = await fetch(`https://${baseDominio}:${portTLS}/activar2FA`, request) + .then(function(response) { + if (!response.ok) { + throw Error(response.statusText); + } + return response.json(); + }) + .then(function(responseAsObject) { + if(responseAsObject.error !== null){ + alert(responseAsObject.error) + } + else{ + sessionStorage.setItem('TFA', responseAsObject.result.TFA); + sessionStorage.setItem('urlQR', responseAsObject.result.urlQR); + generateQR(responseAsObject.result.urlQR); + return responseAsObject.result.status; + } + }) + .catch(function(error) { + alert('Ha habido un problema: ' + error); + return null; + }); + + } +} + + +///////////////////////////////// +///Añadir nuevos usuarios y notas, borrar y editar (CRUD) + +function nuevoDatoSimple(tipoDato,esFemenino,objetoDePlantillaDato) { + + let objetoJSONMemoria = sessionStorage.getItem('Objeto'); + let objetoJS = JSON.parse(objetoJSONMemoria); + objetoJS[tipoDato].push(objetoDePlantillaDato); + let objetoNuevosDatosJSON = JSON.stringify(objetoJS); + let key = sessionStorage.getItem('key'); let usuario = sessionStorage.getItem('Usuario'); + //let ficheroCifradoJSON = cifrar(objetoNuevosDatosJSON,key,IV); + //localStorage.setItem(usuario + '_config.json', ficheroCifradoJSON); + sessionStorage.setItem('Objeto', objetoNuevosDatosJSON); + + let tipoDatoSingular=tipoDato.slice(0, -1); + let nuevo="Nuevo", guardado="guardado"; + if(esFemenino){nuevo="Nueva", guardado="guardada";} + alert(nuevo+" "+tipoDatoSingular+" "+guardado+" correctamente"); + rellenarBody(); +} + +function nuevoUsuario(){ + let u = new plantillaUsuario(document.querySelector('#DescripcionModal').value, document.querySelector('#URLModal').value, + document.querySelector('#UsuarioModal').value, document.querySelector('#ContraseñaModal').value); + + nuevoDatoSimple("usuarios",false,u); +} + +function nuevaNota(){ + let n = new plantillaNota(document.querySelector('#NombreNota').value, document.querySelector('#textoNota').value); + + nuevoDatoSimple("notas",true,n); + +} +function nuevaTarjetaCredito(){ + let t = new plantillaTarjetaCredito(document.querySelector('#nombreEntidad').value, document.querySelector('#numTarjeta').value, + document.querySelector('#fechaCaducidad').value, document.querySelector('#nombreTitular').value, document.querySelector('#codigoDeSeguridad').value); + + nuevoDatoSimple("tarjetas",true,t); + +} +function nuevaCuentaBancaria(){ + let c = new plantillaCuentaBancaria(document.querySelector('#nombreEntidadBancaria').value, document.querySelector('#IBAN').value, + document.querySelector('#usuarioBancario').value, document.querySelector('#contraseñaBancario').value); + + nuevoDatoSimple("cuentas",true,c); + +} + +function nuevoRegistro(){ + if (document.querySelector("#NuevoUsuarioTab.active")) { + nuevoUsuario(); + } else if(document.querySelector("#NuevaNotaTab.active")){ + nuevaNota(); + } + else if(document.querySelector("#NuevaTarjetaDeCréditoTab.active")){ + nuevaTarjetaCredito(); + } + else{ + nuevaCuentaBancaria(); + } +} + +function borrarDatoSimple(event,tipoDato, esFemenino) { + let confirmacion = confirm("¿Estas seguro?"); + if(confirmacion){ + let index = event.currentTarget.id; + //let expressionRegular = /\b[a-z]+/ig; //Con expresiones regulares, si no se utiliza un - + index = parseInt(index.split('-')[1], 10); + let objetoJSONMemoria = sessionStorage.getItem('Objeto'); //Seleccionamos el objeto de la sesion actual + let objetoJS = JSON.parse(objetoJSONMemoria); //Lo convertimos a objeto JS + objetoJS[tipoDato].splice(index, 1); //Borramos el elemento + let objetoNuevosDatosJSON = JSON.stringify(objetoJS); //Lo convertimos a JSON de nuevo pero con los nuevos valores + let key = sessionStorage.getItem('key'); let usuario = sessionStorage.getItem('Usuario'); + //let ficheroCifradoJSON = cifrar(objetoNuevosDatosJSON,key,IV); //Ciframos el JSON + //localStorage.setItem(usuario + '_config.json', ficheroCifradoJSON); //Guardamos el fichero json cifrado en memoria (sobrescribe) + sessionStorage.setItem('Objeto', objetoNuevosDatosJSON); //Guardamos en la sesion actual el objeto sin cifrar en JSON (sobrescribe) + + let tipoDatoSingular; + tipoDatoSingular=tipoDato.charAt(0).toUpperCase() + tipoDato.slice(1); + tipoDatoSingular=tipoDatoSingular.slice(0, -1); + let eliminado="eliminado"; function getMessageEncoding() { + const messageBox = document.querySelector("#rsa-oaep-message"); + let message = messageBox.value; + let enc = new TextEncoder(); + return enc.encode(message); + } + if(esFemenino){eliminado="eliminada";} + + alert(tipoDatoSingular+" "+eliminado+" correctamente"); + rellenarBody(); + } +} + +function borrarUsuario(event){ + borrarDatoSimple(event,"usuarios",false); +} + +function borrarNota(event){ + borrarDatoSimple(event,"notas",false); +} +function borrarTarjetaCredito(event){ + borrarDatoSimple(event,"tarjetas",true); +} +function borrarCuentaBancaria(event){ + borrarDatoSimple(event,"cuentas",true); +} + + function editarUsuario(){ //assign hecho + + let descripcion = document.querySelector('#DescripcionModalEditarUsuario'); descripcion = descripcion.value; + let url = document.querySelector('#URLModalEditarUsuario'); url = url.value; + let usuarioC = document.querySelector('#UsuarioModalEditarUsuario'); usuarioC = usuarioC.value; + let contraseña = document.querySelector('#ContraseñaModalEditarUsuario'); contraseña = contraseña.value; + let index = $('#editarUsuarioModal').data('index'); + let objetoJSONMemoria = sessionStorage.getItem('Objeto'); + let objetoJS = JSON.parse(objetoJSONMemoria); + let u = new plantillaUsuario(descripcion, url, usuarioC, contraseña); + objetoJS.usuarios.splice(index, 1, Object.assign(objetoJS.usuarios[index], u)); //indice, eliminamos 1 objeto y hacemos un assign para copiar + let objetoNuevosDatosJSON = JSON.stringify(objetoJS); + let key = sessionStorage.getItem('key'); let usuario = sessionStorage.getItem('Usuario'); + //let ficheroCifradoJSON = cifrar(objetoNuevosDatosJSON,key,IV); + //localStorage.setItem(usuario + '_config.json', ficheroCifradoJSON); + sessionStorage.setItem('Objeto', objetoNuevosDatosJSON); + alert("Usuario actualizado correctamente"); + rellenarBody(); +} + +function editarNota(){ + + let nombre = document.querySelector('#EditarNombreNota'); nombre = nombre.value; + let textoNota = document.querySelector('#EditartextoNota'); textoNota = textoNota.value; + let index = $('#editarNotaModal').data('index'); + let objetoJSONMemoria = sessionStorage.getItem('Objeto'); + let objetoJS = JSON.parse(objetoJSONMemoria); + let n = new plantillaNota(nombre, textoNota); + objetoJS.notas.splice(index, 1, Object.assign(objetoJS.notas[index], n)); //indice, eliminamos 1 objeto y hacemos un assign para copiar + let objetoNuevosDatosJSON = JSON.stringify(objetoJS); + let key = sessionStorage.getItem('key'); let usuario = sessionStorage.getItem('Usuario'); + //let ficheroCifradoJSON = cifrar(objetoNuevosDatosJSON,key,IV); + //localStorage.setItem(usuario + '_config.json', ficheroCifradoJSON); + sessionStorage.setItem('Objeto', objetoNuevosDatosJSON); + alert("Nota actualizada correctamente"); + rellenarBody(); +} + +function editarTarejetaCredito(){ + + let nombreEntidad = document.querySelector('#nombreEntidadModalEditarTarjetaCredito'); nombreEntidad = nombreEntidad.value; + let numTarjeta = document.querySelector('#numTarjetaModalEditarTarjetaCredito'); numTarjeta = numTarjeta.value; + let fechaCaducidad = document.querySelector('#fechaCaducidadModalEditarTarjetaCredito'); fechaCaducidad = fechaCaducidad.value; + let nombreTitular = document.querySelector('#nombreTitularModalEditarTarjetaCredito'); nombreTitular = nombreTitular.value; + let codigoDeSeguridad =document.querySelector('#codigoDeSeguridadModalEditarTarjetaCredito'); codigoDeSeguridad=codigoDeSeguridad.value; + + let index = $('#editarTarjetaCreditoModal').data('index'); + let objetoJSONMemoria = sessionStorage.getItem('Objeto'); + let objetoJS = JSON.parse(objetoJSONMemoria); + + let u = new plantillaTarjetaCredito(nombreEntidad, numTarjeta, fechaCaducidad, nombreTitular,codigoDeSeguridad); + objetoJS.tarjetas.splice(index, 1, Object.assign(objetoJS.tarjetas[index], u)); //indice, eliminamos 1 objeto y hacemos un assign para copiar + let objetoNuevosDatosJSON = JSON.stringify(objetoJS); + let key = sessionStorage.getItem('key'); let usuario = sessionStorage.getItem('Usuario'); + //let ficheroCifradoJSON = cifrar(objetoNuevosDatosJSON,key,IV); + //localStorage.setItem(usuario + '_config.json', ficheroCifradoJSON); + sessionStorage.setItem('Objeto', objetoNuevosDatosJSON); + alert("Tarjeta actualizada correctamente"); + rellenarBody(); +} + +function editarCuentaBancaria(){ + + let nombreEntidadBancaria = document.querySelector('#nombreEntidadBancariaModalEditarCuentaBancaria'); nombreEntidadBancaria = nombreEntidadBancaria.value; + let IBAN = document.querySelector('#IBANModalEditarCuentaBancaria'); IBAN = IBAN.value; + let usuarioBancario = document.querySelector('#usuarioBancarioModalEditarCuentaBancaria'); usuarioBancario = usuarioBancario.value; + let contraseñaBancario = document.querySelector('#contraseñaBancarioModalEditarCuentaBancaria'); contraseñaBancario = contraseñaBancario.value; + + let index = $('#editarCuentaBancariaModal').data('index'); + let objetoJSONMemoria = sessionStorage.getItem('Objeto'); + let objetoJS = JSON.parse(objetoJSONMemoria); + + let u = new plantillaCuentaBancaria(nombreEntidadBancaria, IBAN, usuarioBancario, contraseñaBancario); + objetoJS.cuentas.splice(index, 1, Object.assign(objetoJS.cuentas[index], u)); //indice, eliminamos 1 objeto y hacemos un assign para copiar + let objetoNuevosDatosJSON = JSON.stringify(objetoJS); + let key = sessionStorage.getItem('key'); let usuario = sessionStorage.getItem('Usuario'); + //let ficheroCifradoJSON = cifrar(objetoNuevosDatosJSON,key,IV); + //localStorage.setItem(usuario + '_config.json', ficheroCifradoJSON); + sessionStorage.setItem('Objeto', objetoNuevosDatosJSON); + alert("Cuenta actualizada correctamente"); + rellenarBody(); +} + +function arrayRemove(arr, value) { + + return arr.filter(function(ele){ + return ele != value; + }); +} + +window.onload = function() { //CUando se refresca la sesion no borra los datos de la sessionStorage por lo que controlamos el evento. + if(localStorage.getItem("Inactivo")){ + sessionStorage.clear(); + localStorage.removeItem("Inactivo"); + alert("Sesión caducada por inactividad"); + } + else if(localStorage.getItem("Cerrar")){ + sessionStorage.clear(); + localStorage.removeItem("Cerrar"); + } + else if(sessionStorage.getItem("Usuario") && !sessionStorage.getItem("page2FA")){ + rellenarBody(); + } + else if(sessionStorage.getItem("page2FA")){ + // + } + else{ + sessionStorage.clear(); + //localStorage.clear(); + } +}; + +function inactividad(){ + time = new Date().getTime(); + $(document).bind("mousemove keypress", function(e) { + time = new Date().getTime(); + }); + + setTimeout(refresh, 10000); +} + +function refresh() { + if(new Date().getTime() - time >= 150000){ + window.location.reload(); + localStorage.setItem("Inactivo", true); + } + else{ + setTimeout(refresh, 10000); + } +} + + +async function listaUsuarios(){ + let token = sessionStorage.getItem('token'); + let cabeceras= { + 'Content-Type': 'application/json', + 'Accept': 'application/json', + 'authorization': token, + } + const request = { + method: 'GET', + headers: cabeceras, + }; + let select = document.querySelector('#multiSelect'); + if(select.length === 0){ + fetch(`https://${baseDominio}:${portTLS}/listaUsuarios`, request) + .then(function(response) { + if (!response.ok) { + throw Error(response.statusText); + } + return response.json(); + }) + .then(function(responseAsObject) { + if(responseAsObject.error && responseAsObject.error !== null){ + throw Error(responseAsObject.error); + } + let usuarioActual = sessionStorage.getItem('Usuario'); + let arrayRemoveUser = arrayRemove(responseAsObject.usuarios, usuarioActual); + for(let i = 0; i${arrayRemoveUser[i]}`); + $('#multiSelect').multiselect('rebuild'); + } + + }) + .catch(function(error) { + localStorage.setItem("Cerrar", true); + window.location.reload(); + alert(error); + }); + } +} + +async function listaCompartidos(){ + let token = sessionStorage.getItem('token'); + let usuario = sessionStorage.getItem('Usuario'); + let cabeceras= { + 'Content-Type': 'application/json', + 'Accept': 'application/json', + 'authorization': token, + } + const request = { + method: 'GET', + headers: cabeceras, + }; + + + let list = document.querySelector('#archivosCompartidosList'); + list.innerHTML = ""; + if(list.firstElementChild === null){ + fetch(`https://${baseDominio}:${portTLS}/listaCompartidos`, request) + .then(function(response) { + if (!response.ok) { + throw Error(response.statusText); + } + return response.json(); + }) + .then(function(responseAsObject) { + if(responseAsObject.error && responseAsObject.error !== null){ + throw Error(responseAsObject.error); + } + for(let i = 0; i { + for (let i = array.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + const temp = array[i]; + array[i] = array[j]; + array[j] = temp; + } + } + + +function rellenarContraseña(longitud){ + + longitud_contraseña = longitud; + cantidad(); + let index = {index : 0}; //Para poder pasar por referencia + + relleno(caracteresEspeciales_cantidad, caracteres_especiales, index); + relleno(numeros_cantidad, numeros, index); + relleno(mayusculas_cantidad, mayusculas, index); + relleno(minusculas_cantidad, minusculas, index); + + if(contraseña.length < longitud_contraseña){ + let diferencia = longitud_contraseña - contraseña.length; + relleno(diferencia,cadenaAleatoria, index); + } + + shuffleArray(contraseña); + let cadena = contraseña.toString(); + cadena = cadena.replaceAll(',', ''); + return cadena; + +} + +function cantidad(){ + caracteresEspeciales_cantidad = Math.floor(Math.random()*(20-15+1)+15) * (longitud_contraseña/100); + numeros_cantidad = Math.floor(Math.random()*(25-20+1)+20) * (longitud_contraseña/100); + mayusculas_cantidad = Math.floor(Math.random()*(25-20+1)+20) * (longitud_contraseña/100); + minusculas_cantidad = Math.floor(Math.random()*(30-25+1)+25) * (longitud_contraseña/100); + + + caracteresEspeciales_cantidad = caracteresEspeciales_cantidad % 1 < 0.5 ? Math.trunc(caracteresEspeciales_cantidad) : Math.ceil(caracteresEspeciales_cantidad); + numeros_cantidad = numeros_cantidad % 1 < 0.5 ? Math.trunc(numeros_cantidad) : Math.ceil(numeros_cantidad); + mayusculas_cantidad = mayusculas_cantidad % 1 < 0.5 ? Math.trunc(mayusculas_cantidad) : Math.ceil(mayusculas_cantidad); + minusculas_cantidad = minusculas_cantidad % 1 < 0.5 ? Math.trunc(minusculas_cantidad) : Math.ceil(minusculas_cantidad); + +} + +function relleno(cantidad, cadena, index){ + + let longitud = cadena.length-1; + let i = index.index; + while(cantidad !== 0){ //Se puede hacer ya que cantidad no se pasa por referencia si no por valor. + contraseña.push(cadena.charAt(Math.floor(Math.random()*(longitud-0+1)+0))); + i++; + cantidad--; + } + index.index = i; +} + +export { rellenarContraseña } \ No newline at end of file diff --git a/scripts/html.js b/scripts/html.js new file mode 100644 index 0000000..7a54b3f --- /dev/null +++ b/scripts/html.js @@ -0,0 +1,252 @@ +/** + * HTML de las tablas de los datos guardados + * @returns devuelve el HTML con las tablas de los datos guardados + */ + export function bodyHTML(){ + var html= + ` + +
+
+
+
+
+
+
+

Usuarios

+
+
+ +
+
+
+ + + + + + + + + + + + +
DescripcionUrlUsuarioPasswordAcciones
+
+
+
+ +
+
+
+
+
+
+

Notas

+
+
+ +
+
+
+ + + + + + + + + + +
NombreDescripcionAcciones
+
+
+
+ + +
+
+
+
+
+
+

Tarjetas de Crédito

+
+
+ +
+
+
+ + + + + + + + + + + + + +
Nombre EntidadNúmero de TarjetaFecha de CaducidadNombre del TitularCódigo De SeguridadAcciones
+
+
+
+ +
+
+
+
+
+
+

Cuentas Bancarias

+
+
+ +
+
+
+ + + + + + + + + + + + +
Nombre EntidadIBANUsuario Banca OnlineContraseña Banca OnlineAcciones
+
+
+
+ +
+ +
+
+
+
+
+
+
+

Usuarios

+
+
+ +
+
+
+ + + + + + + + + + + + +
DescripcionUrlUsuarioPasswordAcciones
+
+
+
+ +
+
+
+
+
+
+

Notas

+
+
+ +
+
+
+ + + + + + + + + + +
NombreDescripcionAcciones
+
+
+
+
+ +
+
+

Active y escane el código QR para aplicar el doble factor TOTP

+ + + + +
+
+ + `; + return html; + } + + + export function bodyFA(){ + let html = `
+
+ + +
+
+ + +
+
+ +
` + + return html; + } \ No newline at end of file diff --git a/scripts/modales/modalCompartir.js b/scripts/modales/modalCompartir.js new file mode 100644 index 0000000..82ab3a4 --- /dev/null +++ b/scripts/modales/modalCompartir.js @@ -0,0 +1,26 @@ +export function modalCompartir(){ + // + var html= ` + + `; + return html; +} \ No newline at end of file diff --git a/scripts/modales/modalCrear.js b/scripts/modales/modalCrear.js new file mode 100644 index 0000000..a3aa5d1 --- /dev/null +++ b/scripts/modales/modalCrear.js @@ -0,0 +1,130 @@ +export function modal(){ + + var html = ` +