From ecb8afbe40123248f9cd2b0ce0eb993a5cd22cf0 Mon Sep 17 00:00:00 2001 From: Bobby Wibowo Date: Thu, 18 Apr 2019 16:06:14 +0700 Subject: [PATCH] Updates Updated fontello (added block and doc-inv icons). Upload results will now show either doc or block icon on top of the file name depending on the status of the upload (unless the uploads are images, in which case they will still show thumbnails instead). Added support for customizable timeout and chunkSize options for ClamAV scanning to the config file. Bumped v1 and v3 version strings. --- config.sample.js | 4 +++- controllers/uploadController.js | 21 +++++++++++---------- public/css/home.css | 8 ++++++++ public/js/home.js | 24 +++++++++++++++++++----- public/libs/fontello/fontello.css | 16 +++++++++------- public/libs/fontello/fontello.eot | Bin 13108 -> 13480 bytes public/libs/fontello/fontello.svg | 4 ++++ public/libs/fontello/fontello.ttf | Bin 12940 -> 13312 bytes public/libs/fontello/fontello.woff | Bin 8396 -> 8660 bytes public/libs/fontello/fontello.woff2 | Bin 7092 -> 7292 bytes views/_globals.njk | 4 ++-- views/home.njk | 3 ++- 12 files changed, 58 insertions(+), 26 deletions(-) diff --git a/config.sample.js b/config.sample.js index 4a30a14..059c57d 100644 --- a/config.sample.js +++ b/config.sample.js @@ -173,7 +173,9 @@ module.exports = { scan: { enabled: false, ip: '127.0.0.1', - port: 3310 + port: 3310, + timeout: 180 * 1000, + chunkSize: 64 * 1024 }, /* diff --git a/controllers/uploadController.js b/controllers/uploadController.js index f8beeb6..10fb1d0 100644 --- a/controllers/uploadController.js +++ b/controllers/uploadController.js @@ -567,22 +567,23 @@ uploadsController.formatInfoMap = (req, res, user, infoMap) => { uploadsController.scanFiles = (req, infoMap) => { return new Promise(async (resolve, reject) => { const scanner = req.app.get('clam-scanner') + const timeout = config.uploads.scan.timeout || 5000 + const chunkSize = config.uploads.scan.chunkSize || 64 * 1024 let iteration = 0 for (const info of infoMap) - scanner.scanFile(info.path).then(reply => { + scanner.scanFile(info.path, timeout, chunkSize).then(reply => { + iteration++ + const lastIteration = iteration === infoMap.length if (!reply.includes('OK') || reply.includes('FOUND')) { // eslint-disable-next-line no-control-regex const virus = reply.replace(/^stream: /, '').replace(/ FOUND\u0000$/, '') console.log(`ClamAV: ${info.data.filename}: ${virus} FOUND.`) - return resolve(virus) + return resolve({ virus, lastIteration }) } - - iteration++ - if (iteration === infoMap.length) - resolve(null) + if (lastIteration) resolve(null) }).catch(reject) - }).then(virus => { - if (!virus) return false + }).then(result => { + if (!result) return false // If there is at least one dirty file, then delete all files const set = req.app.get('uploads-set') infoMap.forEach(info => { @@ -595,10 +596,10 @@ uploadsController.scanFiles = (req, infoMap) => { }) // Unfortunately, we will only be returning name of the first virus // even if the current session was made up by multiple virus types - return `Virus detected: ${virus}.` + return `Threat found: ${result.virus}${result.lastIteration ? '' : ', and maybe more'}.` }).catch(error => { console.error(`ClamAV: ${error.toString()}.`) - return `ClamAV: ${error.code}, please contact site owner.` + return `ClamAV: ${error.code !== undefined ? `${error.code} , p` : 'P'}lease contact the site owner.` }) } diff --git a/public/css/home.css b/public/css/home.css index da27c50..ec31346 100644 --- a/public/css/home.css +++ b/public/css/home.css @@ -120,6 +120,14 @@ margin-bottom: 0; } +.uploads .icon:not(.icon-block) { + color: #3794d2; +} + +.uploads .icon.icon-block { + color: #da4453; +} + .uploads progress { margin-top: .5rem; margin-bottom: 1rem; diff --git a/public/js/home.js b/public/js/home.js index 3116412..a03e1f1 100644 --- a/public/js/home.js +++ b/public/js/home.js @@ -272,6 +272,7 @@ page.prepareDropzone = function () { }) page.dropzone.on('error', function (file, error) { + page.updateTemplateIcon(file.previewElement, 'icon-block') file.previewElement.querySelector('.progress').style.display = 'none' file.previewElement.querySelector('.name').innerHTML = file.name file.previewElement.querySelector('.error').innerHTML = error.description || error @@ -312,6 +313,7 @@ page.uploadUrls = function (button) { previewTemplate.innerHTML = page.previewTemplate.trim() const previewElement = previewTemplate.content.firstChild previewElement.querySelector('.name').innerHTML = url + previewElement.querySelector('.progress').removeAttribute('value') previewsContainer.appendChild(previewElement) return { url, @@ -326,11 +328,12 @@ page.uploadUrls = function (button) { function posted (result) { file.previewElement.querySelector('.progress').style.display = 'none' - if (result.success) + if (result.success) { page.updateTemplate(file, result.files[0]) - else + } else { + page.updateTemplateIcon(file.previewElement, 'icon-block') file.previewElement.querySelector('.error').innerHTML = result.description - + } return post(i + 1) } @@ -355,6 +358,13 @@ page.uploadUrls = function (button) { return run() } +page.updateTemplateIcon = function (templateElement, iconClass) { + const iconElement = templateElement.querySelector('.icon') + if (!iconElement) return + iconElement.classList.add(iconClass) + iconElement.style.display = '' +} + page.updateTemplate = function (file, response) { if (!response.url) return @@ -368,12 +378,16 @@ page.updateTemplate = function (file, response) { const img = file.previewElement.querySelector('img') img.setAttribute('alt', response.name || '') img.dataset['src'] = response.url + img.style.display = '' img.onerror = function () { - // Hide images that failed to load - // Consequently also WEBP in browsers that do not have WEBP support (Firefox/IE) + // Hide image elements that fail to load + // Consequently include WEBP in browsers that do not have WEBP support (Firefox/IE) this.style.display = 'none' + file.previewElement.querySelector('.icon').style.display = '' } page.lazyLoad.update(file.previewElement.querySelectorAll('img')) + } else { + page.updateTemplateIcon(file.previewElement, 'icon-doc-inv') } } diff --git a/public/libs/fontello/fontello.css b/public/libs/fontello/fontello.css index 01ac5f7..10c40fc 100644 --- a/public/libs/fontello/fontello.css +++ b/public/libs/fontello/fontello.css @@ -1,11 +1,11 @@ @font-face { font-family: 'fontello'; - src: url('fontello.eot?94642010'); - src: url('fontello.eot?94642010#iefix') format('embedded-opentype'), - url('fontello.woff2?94642010') format('woff2'), - url('fontello.woff?94642010') format('woff'), - url('fontello.ttf?94642010') format('truetype'), - url('fontello.svg?94642010#fontello') format('svg'); + src: url('fontello.eot?13682569'); + src: url('fontello.eot?13682569#iefix') format('embedded-opentype'), + url('fontello.woff2?13682569') format('woff2'), + url('fontello.woff?13682569') format('woff'), + url('fontello.ttf?13682569') format('truetype'), + url('fontello.svg?13682569#fontello') format('svg'); font-weight: normal; font-style: normal; } @@ -15,7 +15,7 @@ @media screen and (-webkit-min-device-pixel-ratio:0) { @font-face { font-family: 'fontello'; - src: url('fontello.svg?94642010#fontello') format('svg'); + src: url('fontello.svg?13682569#fontello') format('svg'); } } */ @@ -77,11 +77,13 @@ .icon-help-circled:before { content: '\e80f'; } /* '' */ .icon-terminal:before { content: '\e810'; } /* '' */ .icon-hammer:before { content: '\e811'; } /* '' */ +.icon-block:before { content: '\e812'; } /* '' */ .icon-privatebin:before { content: '\e817'; } /* '' */ .icon-github-circled:before { content: '\f09b'; } /* '' */ .icon-filter:before { content: '\f0b0'; } /* '' */ .icon-docs:before { content: '\f0c5'; } /* '' */ .icon-gauge:before { content: '\f0e4'; } /* '' */ +.icon-doc-inv:before { content: '\f15b'; } /* '' */ .icon-paper-plane-empty:before { content: '\f1d9'; } /* '' */ .icon-user-plus:before { content: '\f234'; } /* '' */ .icon-chrome:before { content: '\f268'; } /* '' */ diff --git a/public/libs/fontello/fontello.eot b/public/libs/fontello/fontello.eot index a2b664c2f63e4d1e20df69408b1ffafcec603eec..f1213e06a7a85c6286b60efc6ead8d5a4d5562bd 100644 GIT binary patch delta 991 zcmZ8gO>7fK6#iyrz23w>VAt^`C3a#b*byNma;(sn)-t7PAS9ASt2Dt#!TECxcCs>2 z2>8VEf$>vKS zyh{GYF)f|@arV>z(4qh~EuA`{k-nAukBOCZ_PepM<`byAb8s zPU31>e;*Pqk?y4y1msoss#-c%S|}}*R@Rbh57wjW8N&cp@vg34;oDRSrl?QffAxp_ z6Kg$uV?hjvt*C+^U6M5|NF2?DD}QU;mt7{Lz>Bxht2nulN^J7Z=V?$Jx=q;qJ{Nkw_w+VV5I` zUk)Xc{d0NpPoG~rTZqZs+24w7>Ql=MU>u_=4?(7`JL2t(L9i~#9I4hE7#EBmhY%+tWQ)bq%3R(C=2a~ouNrW9WNRQ83cI46y90cWLwTYoo7Wn>Y?oi% zaI1bs(_1{s6h&FFI^14Ab8HmLvN%bEqSJR}GzwCD>axU>K%f(47%3<8^snw)G!^dwkKVo7KNp|7XkFo9$Wq4abOchx0E=Vjfq2 w@nO&=D9y9&A4|;78gzf?tZW&gJ91pV5!$I(M<$2cG85DKN@!QHCfs0u3rrvU9{>OV delta 590 zcmY+APiPZC7{%XYw^6g}pSIChv$TncZNPw~hFC>K4}$*+f>LS~bV-wJO4bfGl!yo0 zi-HzO81c{|2wsY(;Cj?cF;a>a6oeK}YK4fGZJ-59G5wM~h%7(ezBljNotc@;>y$fo z7?|uSy5sVCi!xC>_2}LkfL#L6pD=Zvo!Yodeg=@V#8@ui{_%GW=*-c2AjQ+>!(!no z`6qzF)A}f8pF>DF}iPHOBi%LDQ|K)Y!q^&xM3f%?HPt;Y=tw!D|EsN680n>1Oi7vyLG7i-7AR9~sScuYGw1 z9MEXfef)Nk|2%z=4%8!y=jhjA+#DE91GA7CZ&6YY_2(etDdk=|f&{tJT=Ch{ zcF8W=%PULOST$3t0Tuj9MakuFWz>)V|A_CdqgIEcvTauyKLY$BCV$QNXq-SRU{5>H zFzk{8c9WJJu!nTn0W`C+uxG$CsRWeIYP&kWy|AO3s`V?= ctdn6yqVoB!UU9!`N_0k|VlZ;ZdJqY!n;BuHq5uE@ diff --git a/public/libs/fontello/fontello.svg b/public/libs/fontello/fontello.svg index 7b32da1..dac1bee 100644 --- a/public/libs/fontello/fontello.svg +++ b/public/libs/fontello/fontello.svg @@ -42,6 +42,8 @@ + + @@ -52,6 +54,8 @@ + + diff --git a/public/libs/fontello/fontello.ttf b/public/libs/fontello/fontello.ttf index 85aabee449e3b7f1aed67a7c113c40bdf788d937..8427a9ec715b07bee0515e83fc3b3962cae68f60 100644 GIT binary patch delta 961 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 diff --git a/views/_globals.njk b/views/_globals.njk index 2bd81e1..31d64ff 100644 --- a/views/_globals.njk +++ b/views/_globals.njk @@ -16,9 +16,9 @@ v3: CSS and JS files (libs such as bulma, lazyload, etc). v4: Renders in /public/render/* directories (to be used by render.js). #} -{% set v1 = "ix1PYPhEvh" %} +{% set v1 = "DKoamSTKbO" %} {% set v2 = "hiboQUzAzp" %} -{% set v3 = "hiboQUzAzp" %} +{% set v3 = "DKoamSTKbO" %} {% set v4 = "dplQUZqTnf" %} {# diff --git a/views/home.njk b/views/home.njk index 0128a1d..e60e83d 100644 --- a/views/home.njk +++ b/views/home.njk @@ -109,7 +109,8 @@