diff --git a/GUI/index.html b/GUI/index.html index 72c3a714ad9990b5ebf7cdb3682bc8aa6f539134..fc12ce4cc89aeb8f1f84136e8fad78e36972cf76 100644 --- a/GUI/index.html +++ b/GUI/index.html @@ -1,50 +1,148 @@ <!doctype html> -<html ng-app> - <head> - <meta charset="utf-8"> - <link rel="stylesheet" type="text/css" href="lib/css/bootstrap.min.css"> - <link rel="stylesheet" type="text/css" href="lib/css/style.css"> - <script src="lib/js/angular.min.js"></script> - <script src="lib/js/bower_components/js-sha256/src/sha256.js"></script> - <script src="lib/js/jquery.min.js"></script> - <script src="lib/js/index.js"></script> - <script src="lib/js/bootstrap.min.js"></script> - <title>TSA - Blockchain Federal Argentina</title> - </head> - <body> - <nav class="navbar navbar-default"> - <div class="container"> - <div class="navbar-header"> - <a class="navbar-brand" href="#"> - <img alt="Blockchain Federal Argentina" src="lib/images/logo.svg" width="140" height="100"> +<html> +<head> + <title>Sello de Tiempo - Blockchain Federal Argentina</title> + <meta charset="utf-8"> + <link href="https://fonts.googleapis.com/css?family=Raleway:400,400i,700,700i" rel="stylesheet"> + <link rel="stylesheet" type="text/css" href="lib/css/bootstrap.min.css"> + <link rel="stylesheet" type="text/css" href="lib/css/style.css"> + <meta name="MobileOptimized" content="width" /> + <meta name="HandheldFriendly" content="true" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> +</head> +<body> + <nav id="navbar" role="banner" class="navbar navbar-default"> + <div class="container"> + <div class="navbar-header"> + <a class="logo navbar-btn pull-left" href="/" rel="home"> + <img id="logo" src="lib/images/logo.svg" alt="Blockchain Federal Argentina"> </a> - </div> + <!-- Descomentar en caso de agregar menú para volver a BFA.ar + <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar-collapse"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </button> + --> </div> - </nav> - <main> - <div class="container"> - <h1>Time Stamp Authority</h1> - <form class="box" method="post" action="" enctype="multipart/form-data"> - <h2>Stamp</h2> - <p>Lorem ipsum dolor sit amet consectetur adipisicing elit.</p> - <div id="stamp" class="dropArea" ondrop="drop(event)" ondragover="allowDrop(event)"> - <div><span class=" glyphicon glyphicon-cloud-upload" aria-hidden="true"></span></div> - <div class="droptxt">Soltá un archivo aquÃ<br>ó</div> - <div><button type="button" class="btn btn-primary">Seleccioná un archivo</button></div> + <!-- <div id="navbar-collapse" class="navbar-collapse collapse"> + <nav role="navigation"> + <ul class="menu nav navbar-nav navbar-right"> + <li> + <a href="/">Ir a BFA.ar</a> + </li> + </ul> + </nav> + </div> + --> + </div> + </nav> + <main> + <div class="container"> + <h1>Sello de Tiempo</h1> + <p>El servicio de Sello de Tiempo de BFA permite demostrar digitalmente que el contenido de cualquier documento existió en un momento y que desde entonces, no ha cambiado.</p> + <ul class="nav nav-tabs nav-justified" role="tablist"> + <li role="presentation" class="active"><a href="#tab_1" aria-controls="tab_1" role="tab" + data-toggle="tab">1. Sellar</a></li> + <li role="presentation"><a href="#tab_2" aria-controls="tab_2" role="tab" data-toggle="tab">2. Obtener recibo</a></li> + <li role="presentation"><a href="#tab_3" aria-controls="tab_3" role="tab" data-toggle="tab">Verificar</a></li> + </ul> + <form class="box tab-content" method="post" action="" enctype="multipart/form-data"> + <div role="tabpanel" class="tab-pane active" id="tab_1"> + <h2>Paso 1: Iniciar sellado</h2> + <p>Seleccioná un archivo para generar un Sello de Tiempo. El servicio generará un <i>hash</i> (un + código criptográfico asociado a dicho documento) y lo enviará a la blockchain. A continuación, + se descargará automáticamente un recibo digital <b>temporario</b> (.rdt) que luego podrás + usar para obtener el recibo digital <b>definitivo</b> (.rdd) en la pestaña <i>Obtener recibo</i>.</p> + <p>Importante: El documento seleccionado nunca se sube a la red, garantizando su privacidad.</p> + <div id="selectOriginalArea_1" class="dropArea" ondrop="dropStamp(event)" ondragover="allowDrop(event)"> + <div id="originalInfo_1" class="replacedTxt"> + <div><span class="glyphicon glyphicon-cloud-upload" aria-hidden="true"></span></div> + <div class="droptxt">Arrastrá un archivo aquÃ<br>ó</div> + </div> + <div><button type="button" id="selectOriginal_1" class="btn btn-primary btn-pill">Seleccioná un archivo <span class="sr-only">para Sellar</span></button></div> + </div> + <input type="file" id="fileUploadOriginal_1" hidden/> + <!-- <div id="ots_div" class="loading"></div> --> + <div id="response_1" role="alert"></div> + </div> + <div role="tabpanel" class="tab-pane certificadoTab" id="tab_2"> + <h2>Paso 2: Obtener recibo digital definitivo</h2> + <p>Para obtener el recibo definitivo de un Sello de Tiempo se debe tener el documento original y el recibo digital temporal (.rdt), el servicio le devolverá el recibo digital definitivo (.rdd) junto con el dÃa y la hora en que el hash del documento original fue sellado en la Blockchain Federal Argentina.</p> + <input type="hidden" name="hidden_original_file_hash_2" id="hidden_original_file_hash_2" /> + <input type="hidden" name="hidden_original_file_name_2" id="hidden_original_file_name_2" /> + <div class="row"> + <div class="col-md-6"> + <h3>Seleccioná el archivo original</h3> + <div id="selectOriginalArea_2" class="dropArea" ondrop="dropOriginalFile(event)" + ondragover="allowDrop(event)"> + <div id="originalInfo_2" class="replacedTxt"> + <div><span class=" glyphicon glyphicon-cloud-upload" aria-hidden="true"></span></div> + <div class="droptxt">Arrastrá el archivo <b>original</b> aquÃ<br>ó</div> + </div> + <div><button type="button" id="selectOriginal_2" class="btn btn-primary btn-pill">Seleccioná un archivo <span class="sr-only">original</span></button></div> + </div> + <input type="file" id="fileUploadOriginal_2" hidden/> + </div> + <div class="col-md-6"> + <h3>Seleccioná el recibo digital temporario</h3> + <div id="selectReciboArea_2" class="dropArea" ondrop="dropOTSFile(event)" ondragover="allowDrop(event)"> + <div class="replacedTxt"> + <div id="reciboInfo_2"></div> + <div id="reciboInstructions_2"> + <div><span class="glyphicon glyphicon-cloud-upload" aria-hidden="true"></span></div> + <div class="droptxt">Arrastrá el archivo <b>.rdt</b> aquÃ<br>ó</div> + </div> + </div> + <div><button type="button" id="selectRecibo_2" class="btn btn-primary btn-pill">Seleccioná un archivo <span class="sr-only">.rdt</span></button></div> + </div> + <input type="file" id="fileUploadRecibo_2" hidden/> + </div> + </div> + <div id="response_2" role="alert"></div> </div> - <div id="ots_div" class="loading"></div> - <hr> - <h2>Verify</h2> - <p>Lorem ipsum dolor sit amet consectetur adipisicing elit.</p> - <div class="form-group"> - <textarea id="verify_ots" class="form-control" rows="3" readonly></textarea> + <div role="tabpanel" class="tab-pane verificarTab" id="tab_3"> + <h2>Verificar un sello de tiempo</h2> + <p>Para verificar un Sello de Tiempo se debe tener el documento original y el recibo digital definitivo (.rdd). Podrá verificar el dÃa y la hora en que el hash del documento original fue sellado en la Blockchain Federal Argentina.</p> + <input type="hidden" name="hidden_original_file_hash_3" id="hidden_original_file_hash_3" /> + <input type="hidden" name="hidden_original_file_name_3" id="hidden_original_file_name_3" /> + <div class="row"> + <div class="col-md-6"> + <h3>Seleccioná el archivo original</h3> + <div id="selectOriginalArea_3" class="dropArea dropAreaVerify" ondrop="dropOriginalFile(event)" + ondragover="allowDrop(event)"> + <div id="originalInfo_3" class="replacedTxt"> + <div><span class=" glyphicon glyphicon-cloud-upload" aria-hidden="true"></span></div> + <div class="droptxt">Arrastrá el archivo <b>original</b> aquÃ<br>ó</div> + </div> + <div><button type="button" id="selectOriginal_3" class="btn btn-success btn-pill">Seleccioná un archivo <span class="sr-only">original</span></button></div> + </div> + <input type="file" id="fileUploadOriginal_3" hidden/> + </div> + <div class="col-md-6"> + <h3>Seleccioná el recibo digital definitivo</h3> + <div id="selectReciboArea_3" class="dropArea dropAreaVerify" ondrop="dropOTSFile(event)" ondragover="allowDrop(event)"> + <div class="replacedTxt"> + <div id="reciboInfo_3"></div> + <div id="reciboInstructions_3"> + <div><span class="glyphicon glyphicon-cloud-upload" aria-hidden="true"></span></div> + <div class="droptxt">Arrastrá el archivo <b>.rdd</b> aquÃ<br>ó</div> + </div> + </div> + <div><button type="button" id="selectRecibo_3" class="btn btn-success btn-pill">Seleccioná un archivo <span class="sr-only">.rdd</span></button></div> + </div> + <input type="file" id="fileUploadRecibo_3" hidden/> + </div> + </div> + <div id="response_3" role="alert"></div> </div> - <div id="response" role="alert"></div> - <div class="form-group"> - <button type="button" id="btn_verify" class="btn btn-primary btn-lg">Verify</button> - </div> </form> - </div> - </main> - </body> + </div> + </main> +</body> +<script src="lib/js/bower_components/js-sha256/src/sha256.js"></script> +<script src="lib/js/jquery.min.js"></script> +<script src="lib/js/index.js"></script> +<script src="lib/js/bootstrap.min.js"></script> </html> \ No newline at end of file diff --git a/GUI/lib/css/index.css b/GUI/lib/css/index.css deleted file mode 100644 index 2b0a8f50051e5bed9da1d6d67a19d481815356fc..0000000000000000000000000000000000000000 --- a/GUI/lib/css/index.css +++ /dev/null @@ -1,57 +0,0 @@ -textarea { - width: 95%; - height: 95%; - border: none; - resize: none; - outline: none; -} - -h1{ - text-align: center; -} - -#stamp{ - border: 1px solid #ccc; - width: 50%; - height: 200px; -} - -#verify{ - border: 1px solid #ccc; - width: 50%; - height: 200px; - margin-top: 5px; -} - -#ots_div{ - width: 50%; - border: 1px solid #ccc; - height: 100px; - margin-top: 5px; - display: none; - overflow-y: overlay; -} - -.center_div{ - margin: 0 auto; -} - - - -.title{ - float: left; - width: 24%; - text-align: right; - font-size: 18px; - font-weight: bold; - -} - -#btn_verify{ - margin-top: 5px; -} - -.bg-dark{ - background-color: #5a5a5a; - color:white; -} \ No newline at end of file diff --git a/GUI/lib/css/style.css b/GUI/lib/css/style.css index a5f9272bf94798b9c2cb3de6f705700e51631829..599092becc7a8a827fbd4e516af901a9b689e836 100644 --- a/GUI/lib/css/style.css +++ b/GUI/lib/css/style.css @@ -1,43 +1,289 @@ -body{ - background-color: #f9f9f9; +html { + font-size: 0.9em; } + +body { + font-family: 'Raleway', sans-serif; + font-size: 1.125em; + background-color: #ffffff; + line-height: 1.45; + margin-top: 0; +} + +h1, +h2, +h3, +h4 { + margin: 1.414em 0 0.5em; + font-weight: bold; + line-height: 1.2; +} + +h1 { + margin-top: 20px; + font-size: 2.441em; +} + +h2 { + font-size: 1.953em; +} + +h3 { + font-size: 1.563em; + margin-top: 10px; +} + +h4 { + font-size: 1.25em; +} + +small, +.font_small { + font-size: 0.8em; +} + +p { + margin-bottom: 20px; +} + +.btn-pill { + border-radius: 50px; +} + .navbar-default { background-color: #ffffff; border-color: #e7e7e7; } -.navbar-brand{ + +.navbar-brand { height: 130px; } -.dropArea{ + +.dropArea { border: 1px dashed #0094D4; + background-color: #ffffff; padding: 50px; text-align: center; -webkit-border-radius: 5px; border-radius: 5px; transition: 0.3s; } -.dropArea:hover{ + +.hash { + word-wrap: break-word; +} + +.replacedTxt { + margin-bottom: 20px; +} + +.dropArea p { + margin-bottom: 5px; +} + +.dropAreaVerify { + border: 1px dashed #4cae4c; +} + +.dropArea:hover { background-color: #f0f7ff; border-style: solid; } -.dropArea .droptxt{ - font-size: 1.25em; - margin-bottom: 15px; + +.dropAreaVerify:hover { + background-color: #e5fce5; + border-style: solid; +} + +.dropArea .droptxt { + font-size: 1.2em; + margin-bottom: -5px; } -.dropArea .glyphicon{ + +.dropArea .glyphicon-cloud-upload { font-size: 8em; margin-bottom: 40px; color: #ccc; } -.loading{ + +@media screen and (max-width: 768px) { + .dropArea .glyphicon-cloud-upload { + font-size: 4em; + margin-bottom: 20px; + } + + .dropArea { + padding: 20px; + } +} + +.loading { background-color: #0094D4; margin-top: 5px; display: none; padding: 10px; - text-align: center; + text-align: center; -webkit-border-radius: 5px; - border-radius: 5px; + border-radius: 5px; +} +[hidden]{ + display: none !important; } -.btn-lg{ + +.btn-lg { min-width: 200px; -} \ No newline at end of file +} + +.tab-pane { + background-color: #f8f8f8; + border: 1px solid #ddd; + border-top: 0px; + padding: 40px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; +} +.nav-tabs>li.active>a, .nav-tabs>li.active>a:focus, .nav-tabs>li.active>a:hover{ + background-color: #f8f8f8; +} +.nav-tabs.nav-justified>.active>a, .nav-tabs.nav-justified>.active>a:focus, .nav-tabs.nav-justified>.active>a:hover{ + border-bottom-color: #f8f8f8; +} +.tab-pane h2 { + margin-top: 0px; +} +.nav-tabs { + font-size: 1.953em; +} + +.alert { + margin-top: 15px; +} + +@media screen and (max-width: 768px) { + .tab-pane { + border-top: 1px solid #ddd; + } +} + +@media screen and (max-width: 992px) { + h3 { + margin-top: 30px; + } + + .nav-tabs { + font-size: 1.5em; + } +} + +@media screen and (max-width: 1200px) { + .dropArea .droptxt { + font-size: 1em; + margin-bottom: 15px; + } +} + + +.navbar-header .logo img { + height: 100px; + width: 140px; +} +.navbar .logo { + margin-right: -15px; + padding-left: 15px; + padding-right: 15px; +} + +@media screen and (min-width: 768px){ + .navbar .logo { + margin-right: 0; + padding-left: 0; + } +} + +.navbar-default { + background-color: #fff; + border-color: #e7e7e7; + padding-top: 30px; +} + +.navbar-default .navbar-nav li>a { + color: #0094D4; + font-weight: 400; + font-size: 1.25em; +} + +.navbar-default .navbar-nav>.active>a, +.navbar-default .navbar-nav>.active>a:hover, +.navbar-default .navbar-nav>.active>a:focus { + color: #2e2f30; + background-color: transparent; + border-bottom: 2px solid #2e2f30; +} + +@media (min-width: 768px) { + .navbar-default .navbar-nav li>a { + color: #0094D4; + padding-bottom: 8px; + padding-left: 4px; + padding-right: 4px; + margin-left: 20px; + border-bottom: 2px solid transparent; + } + + .navbar-default .navbar-nav li>a:hover, + .navbar-default .navbar-nav li>a:focus { + color: #0094D4; + border-bottom: 2px solid #0094D4; + } + + .navbar-default .navbar-nav li:last-child>a:hover, + .navbar-default .navbar-nav li:last-child>a:focus { + color: #0094D4; + background-color: #fff; + } +} + +.navbar-default .navbar-toggle { + border-color: #0094D4; +} + +.navbar-default .navbar-toggle .icon-bar { + background-color: #0094D4; +} + +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #0094D4; +} + +.navbar-default .navbar-toggle:hover .icon-bar, +.navbar-default .navbar-toggle:focus .icon-bar { + background-color: #fff; +} + +.navbar-default .menu { + margin-top: 40px; +} + +@media (max-width: 768px) { + + .navbar-default .navbar-nav li>a:hover, + .navbar-default .navbar-nav li>a:focus { + color: #0094D4; + text-decoration: underline; + } + .navbar-default { + padding-top: 0px; + } + + .navbar-default .navbar-collapse { + -webkit-box-shadow: 0px 5px 5px 0px rgba(0, 0, 0, 0.2); + box-shadow: 0px 5px 5px 0px rgba(0, 0, 0, 0.2); + background-color: #fff; + } + + .navbar-default .menu { + margin-top: 0; + } + +} diff --git a/GUI/lib/js/index.js b/GUI/lib/js/index.js index 6010a4115ef76872a50bb232f6ac97adff737588..127039dd4dc3426f75468ea685d225c943d52719 100644 --- a/GUI/lib/js/index.js +++ b/GUI/lib/js/index.js @@ -1,147 +1,277 @@ -$(document).ready(function(){ - $('#btn_verify').click(function(){ - - if($('#verify_ots').val() == ''){ - $('#response').html('<span class="glyphicon glyphicon-remove text-danger" aria-hidden="true"></span> Debe ingresar el comprobante'); - $('#response').addClass('alert alert-danger'); - } - - verify($('#verify_ots').val()); - }); -}); - -var tsa_api = 'http://tsaapi.pp.bfa.local/api/tsa/'; +var tsa_api = 'https://tsaapi.bfa.ar/api/tsa/'; var loader_gif = 'lib/images/loader.svg'; var ots_api = ''; var deadline_date = new Date('2018-09-03 00:00:00'); var current_date = new Date(); +var whash = window.location.hash; +var currentTab = whash.substring(5, 6); +$(function () { + whash && $('ul.nav a[href="' + whash + '"]').tab('show'); + $('.nav-tabs a').click(function (e) { + $(this).tab('show'); + var scrollmem = $('body').scrollTop() || $('html').scrollTop(); + whash = this.hash; + currentTab = whash.substring(5, 6); + window.location.hash = whash; + $('html,body').scrollTop(scrollmem); + }); -if(deadline_date>current_date){ - a = 1; -} -else{ - a=2; -} + for (let i = 1; i < 4; i++) { + $('#selectOriginal_' + i+', #selectOriginalArea_' + i).on('click', function () { + $('#fileUploadOriginal_' + i).click(); + return false; + }); + if (i == 1) { + $('#fileUploadOriginal_' + i).change( + function () { + var file = $(this).prop('files')[0]; + stamp(file); + } + ); + } else { + $('#fileUploadOriginal_' + i).change( + function () { + var file = $(this).prop('files')[0]; + original_file_check(file); + } + ); + $('#selectRecibo_' + i+', #selectReciboArea_' + i).on('click', function () { + $('#fileUploadRecibo_' + i).click(); + return false; + }); + $('#fileUploadRecibo_' + i).change( + function () { + var file = $(this).prop('files')[0]; + ots_check(file); + } + ); + } + } + +}); -console.log(current_date); - function allowDrop(e) { e.preventDefault(); } -function drop(e){ - e.preventDefault(); - - $('#ots_div').html('<img src="' + loader_gif + '">'); - $('#ots_div').fadeIn('fast'); +function dropStamp(e) { + e.preventDefault(); + var file = e.dataTransfer.items[0].getAsFile(); + stamp(file); +} - var file = e.dataTransfer.items[0].getAsFile(); - - var reader = new FileReader(); - reader.readAsArrayBuffer(file, "UTF-8") +function stamp(file) { + var reader = new FileReader(); + reader.readAsArrayBuffer(file, "UTF-8") reader.onload = function (evt) { var file_contents = evt.target.result; - + var hash = sha256.create(); hash.update(file_contents); var file_hash = hash.hex(); - - $('#stamp_info').html('<span class="glyphicon glyphicon-remove" aria-hidden="true"></span> '+file.name ); + + $('#originalInfo_1').html('<p>Nombre del archivo: <b>' + file.name + '</b></p><p>Hash del archivo: <b><span class="hash">' + file_hash + '</span></b></p>'); + $('#selectOriginal_1').html('Seleccioná otro archivo <span class="sr-only">para marcar</span>'); + $.ajax({ url: tsa_api + "stamp/", type: "POST", - data: {"file_hash" : file_hash}, - dataType: "json", - success: function(response){ - console.log(response); + data: { + "file_hash": file_hash + }, + dataType: "json", + success: function (response) { - var ots = ' {"file_hash": "' + file_hash + '", "ots": "' + response.temporay_ots + '"}'; - $('#ots_div').html(ots); - $('#ots_div').fadeIn('fast'); + var ots = ' {"file_hash": "' + file_hash + '", "rd": "' + response.temporary_ots + '"}'; - } - }); - } -} + var saveData = (function () { + var a = document.createElement("a"); + document.body.appendChild(a); + a.style = "display: none"; + return function (data, fileName) { + var json = JSON.stringify(data), + blob = new Blob([json], { + type: "octet/stream" + }), + url = window.URL.createObjectURL(blob); + a.href = url; + a.download = fileName; + a.click(); + window.URL.revokeObjectURL(url); + }; + }()); + var data = response.temporary_rd + fileName = file.name + ".rd.temp"; -function verify(json_ots){ - $('#response').removeClass(); - try{ - var ots = JSON.parse(json_ots); - } - catch(err){ - $('#response').html('<span class="glyphicon glyphicon-remove" aria-hidden="true"></span> Parámetros inválidos'); - $('#response').addClass('alert alert-danger'); - return; - } + saveData(data, fileName); - $('#response').html('<img src="' + loader_gif + '">'); - $('#response').addClass('loading'); - if(deadline_date<current_date){ - verify_bfa(ots); - } - else{ - a=2; + } + }); } - - - } -function verify_bfa(ots){ + +function verify_bfa(ots) { var pending = false; var message = ''; + $('#response_' + currentTab).removeClass(); + $.ajax({ url: tsa_api + "verify/", type: "POST", - data: {"file_hash" : ots.file_hash, "ots": ots.ots}, + data: { + "file_hash": ots.file_hash, + "rd": ots.rd + }, dataType: "json", - success: function(response){ + success: function (response) { - if(response.status == 'success'){ - icon = 'glyphicon-ok'; - st = 'alert alert-success'; - }else if(response.status == 'pending'){ + if (response.status == 'success') { + icon = 'glyphicon-ok'; + st = 'alert alert-success'; + response_messages = response.messages.replace(ots.file_hash, $('#hidden_original_file_name_' + currentTab).val()); + } else if (response.status == 'pending') { pending = true; icon = 'glyphicon-time'; st = 'alert alert-warning'; - }else{ + response_messages = response.messages; + } else { icon = 'glyphicon-remove'; - st = 'alert alert-danger'; - } + st = 'alert alert-danger'; + response_messages = response.messages; + } + + message = '<span class="glyphicon ' + icon + '" aria-hidden="true"></span> ' + response_messages; + + + $('#response_' + currentTab).addClass(st); + $('#response_' + currentTab).html(message); + + if (!pending) { + var saveData = (function () { + var a = document.createElement("a"); + document.body.appendChild(a); + a.style = "display: none"; + return function (data, fileName) { + var json = JSON.stringify(data), + blob = new Blob([json], { + type: "octet/stream" + }), + url = window.URL.createObjectURL(blob); + a.href = url; + a.download = fileName; + a.click(); + window.URL.revokeObjectURL(url); + }; + }()); + + var data = response.permanent_rd; + fileName = $('#hidden_original_file_name_' + currentTab).val() + ".rd"; + + if (currentTab == '2') { + ms = 'Seleccioná otro archivo <span class="sr-only">.rd.temp</span>'; + } else if (currentTab == '3') { + ms = 'Seleccioná otro archivo <span class="sr-only">.rd</span>'; + } + + $('#selectRecibo_' + currentTab).html(ms); + $('#reciboInstructions_' + currentTab).hide(); + + if ($('#reciboInfo_' + currentTab).html().includes('.temp')) { + saveData(data, fileName); + } - message = '<span class="glyphicon ' + icon + '" aria-hidden="true"></span> ' + response.messages; - if(!pending){ - message += ' - ots definitivo:' + response.permanent_ots; } - - $('#response').html(message); - $('#response').addClass(st); + + }, - error:function(jqXHR, textStatus, errorThrown){ + error: function (jqXHR, textStatus, errorThrown) { responseText = 'No se encontró el archivo'; - if(errorThrown == 'timeout'){ - responseText = 'No se pudo conectar a la Blockchain'; + if (errorThrown == 'timeout') { + responseText = 'No se pudo conectar a Blockchain Federal Argentina'; } - - $('#response').html('<span class="glyphicon glyphicon-remove" aria-hidden="true"></span> ' + responseText); - $('#response').addClass('alert alert-danger'); + if (whash == '#certificado-tab') { + rp_id = "#response_cert"; + } else { + rp_id = "#response"; + } + $('#response_' + currentTab).html('<span class="glyphicon glyphicon-remove" aria-hidden="true"></span> ' + responseText); + $('#response_' + currentTab).addClass('alert alert-danger'); + }, - timeout:5000 - + timeout: 5000 + }); } -function verify_ots(){ +function dropOriginalFile(e) { + e.preventDefault(); + var file = e.dataTransfer.items[0].getAsFile(); + original_file_check(file); +} + + +function original_file_check(file) { + $('#response_' + currentTab).html(''); + $('#response_' + currentTab).removeClass(); + $('#reciboInfo_' + currentTab).html(''); + $('#reciboInstructions_' + currentTab).show(); + var reader = new FileReader(); + reader.readAsArrayBuffer(file, "UTF-8") + reader.onload = function (evt) { + var file_contents = evt.target.result; + + var hash = sha256.create(); + hash.update(file_contents); + var file_hash = hash.hex(); + + $('#hidden_original_file_hash_' + currentTab).val(file_hash); + $('#hidden_original_file_name_' + currentTab).val(file.name); + + $('#originalInfo_' + currentTab).html('<p>Nombre del archivo: <b>' + file.name + '</b></p><p>Hash del archivo: <b><span class="hash">' + file_hash + '</span></b></p>'); + $('#selectOriginal_' + currentTab).html('Seleccioná otro archivo <span class="sr-only">original</span>'); + }; +} + +function dropOTSFile(e) { + e.preventDefault(); + var file = e.dataTransfer.items[0].getAsFile(); + ots_check(file); +} + +function ots_check(file) { + $('#response_' + currentTab).html(''); + $('#response_' + currentTab).removeClass(); + var file_contents = ''; + var file_hash = $('#hidden_original_file_hash_' + currentTab).val(); + if (file_hash == '') { + $('#response_' + currentTab).html('<span class="glyphicon glyphicon-remove" aria-hidden="true"></span> Debe ingresar el archivo original'); + $('#response_' + currentTab).addClass('alert alert-danger'); + return; + } + var reader = new FileReader(); + reader.readAsText(file, "UTF-8") + reader.onload = function (evt) { + file_contents = evt.target.result; + $('#reciboInstructions_' + currentTab).hide(); + $('#reciboInfo_' + currentTab).html(file.name); + + var ots = { + "file_hash": file_hash, + "rd": file_contents + } + + verify_bfa(ots); + }; } \ No newline at end of file