From 299491cb5b248085a1931ae39fb67ee5bc181444 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Thu, 7 Jun 2018 15:31:20 +0200 Subject: [PATCH] add mime types to documents --- Form/StoredObjectType.php | 1 + .../public/module/async_upload/downloader.js | 97 ++++++++++++------- .../public/module/async_upload/uploader.js | 65 ++----------- Resources/views/Form/fields.html.twig | 1 + Resources/views/Macro/macro.html.twig | 4 +- .../views/PersonDocument/index.html.twig | 2 +- 6 files changed, 74 insertions(+), 96 deletions(-) diff --git a/Form/StoredObjectType.php b/Form/StoredObjectType.php index 1ae861362..31dc25528 100644 --- a/Form/StoredObjectType.php +++ b/Form/StoredObjectType.php @@ -22,6 +22,7 @@ class StoredObjectType extends AbstractType { $builder ->add('filename', AsyncUploaderType::class) + ->add('type', HiddenType::class) ->add('keyInfos', HiddenType::class) ->add('iv', HiddenType::class) ; diff --git a/Resources/public/module/async_upload/downloader.js b/Resources/public/module/async_upload/downloader.js index 55f0a3550..6783d1fe9 100644 --- a/Resources/public/module/async_upload/downloader.js +++ b/Resources/public/module/async_upload/downloader.js @@ -1,3 +1,5 @@ +var mime = require('mime-types'); + var algo = 'AES-CBC'; var initializeButtons = (root) => { @@ -16,52 +18,73 @@ var initialize = (button) => { var onClick = e => download(e.target); var download = (button) => { - console.log(button.dataset.key); var keyData = JSON.parse(button.dataset.key), - //keyData, // = JSON.parse(keyString), ivData = JSON.parse(button.dataset.iv), iv = new Uint8Array(ivData), - url = button.dataset.tempUrlGet, - data, key + urlGenerator = button.dataset.tempUrlGetGenerator, + hasFilename = 'filename' in button.dataset, + filename = button.dataset.filename, + labelPreparing = button.dataset.labelPreparing, + labelReady = button.dataset.labelReady, + mimeType = button.dataset.mimeType, + extension = mime.extension(mimeType), + key, url ; - console.log('keyData', keyData); - console.log('iv', iv); - console.log('url', url); - window.crypto.subtle.importKey('jwk', keyData, { name: algo, iv: iv}, false, ['decrypt']) - .then(nKey => { - key = nKey; - console.log(key); - - return window.fetch(url); - }) - .then(r => { - if (r.ok) { - return r.arrayBuffer(); - } else { - console.log(r); - throw new Error(r.statusCode); + button.textContent = labelPreparing; + + window.fetch(urlGenerator) + .then((r) => { + if (r.ok) { + return r.json(); + } else { + throw new Error("error while downloading url " + r.status + " " + r.statusText); + } + }) + .then(data => { + url = data.url; + + return window.crypto.subtle.importKey('jwk', keyData, { name: algo, iv: iv}, false, ['decrypt']); + }) + .then(nKey => { + key = nKey; + + return window.fetch(url); + }) + .then(r => { + if (r.ok) { + return r.arrayBuffer(); + } else { + throw new Error(r.status + r.statusText); + } + }) + .then(buffer => { + return window.crypto.subtle.decrypt({ name: algo, iv: iv }, key, buffer); + }) + .then(decrypted => { + var + blob = new Blob([decrypted], { type: mimeType }), + url = window.URL.createObjectURL(blob) + ; + button.href = url; + button.target = '_parent'; + button.type = mimeType; + button.textContent = labelReady; + if (hasFilename) { + button.download = filename; + if (extension !== false) { + button.download = button.download + '.' + extension; } - }) - .then(buffer => { - return window.crypto.subtle.decrypt({ name: algo, iv: iv }, key, buffer); - }) - .then(decrypted => { - var - blob = new Blob([decrypted]), - url = window.URL.createObjectURL(blob) - ; - button.href = url; - button.removeEventListener('click', onClick); - }) - .catch(error => { - console.log(error); - }) - ; + } + button.removeEventListener('click', onClick); + }) + .catch(error => { + console.log(error); + }) + ; }; window.addEventListener('load', function(e) { - console.log('load'); initializeButtons(e.target); }); diff --git a/Resources/public/module/async_upload/uploader.js b/Resources/public/module/async_upload/uploader.js index 6fdc7cb66..c871152d3 100644 --- a/Resources/public/module/async_upload/uploader.js +++ b/Resources/public/module/async_upload/uploader.js @@ -15,8 +15,6 @@ var searchForZones = function(root) { var initialize = function(zone) { - console.log('initialize zone'); - var dropZone = document.createElement('div'), input = document.createElement('input') @@ -34,16 +32,14 @@ var initialize = function(zone) { }; var handleInputFile = function (zone) { - console.log('handle file'); - var file = zone.querySelector('input[type="file"]').files[0], - + type = file.type, reader = new FileReader() ; reader.onload = e => { - transmitArrayBuffer(zone, e.target.result); + transmitArrayBuffer(zone, e.target.result, type); }; reader.readAsArrayBuffer(file); @@ -59,7 +55,7 @@ var createFilename = () => { return text; }; -var transmitArrayBuffer = (zone, data) => { +var transmitArrayBuffer = (zone, data, type) => { var iv = crypto.getRandomValues(new Uint8Array(16)), generateTempUrlPost = zone.querySelector('input[data-async-file-upload]').dataset.generateTempUrlPost, @@ -69,9 +65,6 @@ var transmitArrayBuffer = (zone, data) => { window.crypto.subtle.generateKey(keyDefinition, true, [ "encrypt", "decrypt" ]) .then(key => { - console.log('key', key); - console.log('iv', iv); - console.log('iv to string', iv.join(',')); jsKey = key; // we register the key somwhere @@ -79,13 +72,10 @@ var transmitArrayBuffer = (zone, data) => { }).then(exportedKey => { rawKey = exportedKey; - console.log('rawkey', rawKey); - console.log('data', data); // we start encryption return window.crypto.subtle.encrypt({ name: algo, iv: iv}, jsKey, data); }) .then(encrypted => { - console.log('encrypted', encrypted); encryptedData = encrypted; @@ -94,8 +84,6 @@ var transmitArrayBuffer = (zone, data) => { }) .then(response => response.json()) .then(data => { - console.log(encryptedData); - console.log(data); var formData = new FormData(); @@ -108,9 +96,6 @@ var transmitArrayBuffer = (zone, data) => { formData.append("signature", data.signature); formData.append("file", new Blob([ encryptedData ]), suffix); - console.log('filename', suffix); - console.log('formData', formData); - return window.fetch(data.url, { method: 'POST', mode: 'cors', @@ -119,65 +104,33 @@ var transmitArrayBuffer = (zone, data) => { }) .then(response => { if (response.ok) { - console.log('sent'); - - storeDataInForm(zone, suffix, rawKey, iv, uploadData); + storeDataInForm(zone, suffix, rawKey, iv, uploadData, type); } else { - console.log('response', response); throw new Error("error while sending data"); } }) .catch(error => { + window.alert("Error while sending document."); console.log(error); }) - -// return window.crypto.subtle.importKey('jwk', rawKey, { name: algo, iv: iv }, false, [ "decrypt"]); -// -// .then(key => { -// console.log('decrypt'); -// console.log(key); -// -// return window.crypto.subtle.decrypt({ name: algo, iv: iv }, key, encryptedData); -// }) -// .then(decrypted => { -// console.log('decrypted'); -// decrypt(zone, decrypted, 'decrypted'); -// }) - ; }; -var storeDataInForm = (zone, suffix, jskey, iv, uploaddata) => { +var storeDataInForm = (zone, suffix, jskey, iv, uploaddata, type) => { var inputKey = zone.querySelector('input[data-stored-object-key]'), inputIv = zone.querySelector('input[data-stored-object-iv]'), - inputObject = zone.querySelector('input[data-async-file-upload]') + inputObject = zone.querySelector('input[data-async-file-upload]'), + inputType = zone.querySelector('input[data-async-file-type]') ; inputKey.value = JSON.stringify(jskey); inputIv.value = JSON.stringify(iv); + inputType.value = type; inputObject.value = uploaddata.prefix + suffix; }; -var decrypt = (zone, arraybuffer, name) => { - console.log('arraybuffer', arraybuffer); - var - link = document.createElement('a'), - data = new Blob([ arraybuffer ]) - ; - - link.innerHTML = name; - - link.href = window.URL.createObjectURL(data); - link.download = 'file'; - - zone.appendChild(link); -}; - - window.addEventListener('load', function(e) { searchForZones(document); }); - - diff --git a/Resources/views/Form/fields.html.twig b/Resources/views/Form/fields.html.twig index bb744282a..ee21c0cb1 100644 --- a/Resources/views/Form/fields.html.twig +++ b/Resources/views/Form/fields.html.twig @@ -3,5 +3,6 @@ {{ form_widget(form.filename) }} {{ form_widget(form.keyInfos, { 'attr': { 'data-stored-object-key': 1 } }) }} {{ form_widget(form.iv, { 'attr': { 'data-stored-object-iv': 1 } }) }} + {{ form_widget(form.type, { 'attr': { 'data-async-file-type': 1 } }) }} {% endblock %} diff --git a/Resources/views/Macro/macro.html.twig b/Resources/views/Macro/macro.html.twig index 7042998d1..36b2793e3 100644 --- a/Resources/views/Macro/macro.html.twig +++ b/Resources/views/Macro/macro.html.twig @@ -1,3 +1,3 @@ -{% macro download_button(storedObject) %} - {{ 'Download'|trans }} +{% macro download_button(storedObject, filename = null) %} + {{ 'Download'|trans }} {% endmacro %} diff --git a/Resources/views/PersonDocument/index.html.twig b/Resources/views/PersonDocument/index.html.twig index dc35ceae9..8c73cc739 100644 --- a/Resources/views/PersonDocument/index.html.twig +++ b/Resources/views/PersonDocument/index.html.twig @@ -49,7 +49,7 @@