use temp files in express-fileupload, new SVG icons, make room for captcha

merge-requests/208/head
fatchan 5 years ago
parent 170badab6c
commit e7dc699cbc
  1. 8
      controllers/forms.js
  2. 404
      controllers/forms.js.save.1
  3. 21
      gulp/res/css/style.css
  4. BIN
      gulp/res/img/bg.png
  5. 52
      gulp/res/img/locked.svg
  6. 250
      gulp/res/img/sticky.svg
  7. 2
      models/forms/make-post.js
  8. 336
      package-lock.json
  9. 18
      package.json
  10. 2
      server.js
  11. 4
      views/includes/postform.pug
  12. 27
      views/mixins/post.pug

@ -164,9 +164,9 @@ router.post('/board/:board/post', Boards.exists, banCheck, numberConverter, asyn
let numFiles = 0;
if (req.files && req.files.file) {
if (Array.isArray(req.files.file)) {
numFiles = req.files.file.length;
numFiles = req.files.file.filter(file => file.size > 0).length;
} else {
numFiles = 1;
numFiles = req.files.file.size > 0 ? 1 : 0;
req.files.file = [req.files.file];
}
}
@ -213,9 +213,9 @@ router.post('/board/:board/addbanners', Boards.exists, banCheck, checkPermsMiddl
let numFiles = 0;
if (req.files && req.files.file) {
if (Array.isArray(req.files.file)) {
numFiles = req.files.file.length;
numFiles = req.files.file.filter(file => file.size > 0).length;
} else {
numFiles = 1;
numFiles = req.files.file.size > 0 ? 1 : 0;
req.files.file = [req.files.file];
}
}

@ -1,404 +0,0 @@
'use strict';
const express = require('express')
, router = express.Router()
, Boards = require(__dirname+'/../db/boards.js')
, Posts = require(__dirname+'/../db/posts.js')
, Trips = require(__dirname+'/../db/trips.js')
, Bans = require(__dirname+'/../db/bans.js')
, banPoster = require(__dirname+'/../models/forms/ban-poster.js')
, removeBans = require(__dirname+'/../models/forms/removebans.js')
, makePost = require(__dirname+'/../models/forms/make-post.js')
, deletePosts = require(__dirname+'/../models/forms/delete-post.js')
, spoilerPosts = require(__dirname+'/../models/forms/spoiler-post.js')
, reportPosts = require(__dirname+'/../models/forms/report-post.js')
, globalReportPosts = require(__dirname+'/../models/forms/globalreportpost.js')
, dismissReports = require(__dirname+'/../models/forms/dismiss-report.js')
, dismissGlobalReports = require(__dirname+'/../models/forms/dismissglobalreport.js')
, loginAccount = require(__dirname+'/../models/forms/login.js')
, registerAccount = require(__dirname+'/../models/forms/register.js')
, hasPerms = require(__dirname+'/../helpers/haspermsmiddleware.js')
, numberConverter = require(__dirname+'/../helpers/number-converter.js')
, banCheck = require(__dirname+'/../helpers/bancheck.js');
// login to account
router.post('/login', (req, res, next) => {
const errors = [];
//check exist
if (!req.body.username || req.body.username.length <= 0) {
errors.push('Missing username');
}
if (!req.body.password || req.body.password.length <= 0) {
errors.push('Missing password');
}
//check too long
if (req.body.username && req.body.username.length > 50) {
errors.push('Username must be 50 characters or less');
}
if (req.body.password && req.body.password.length > 100) {
errors.push('Password must be 100 characters or less');
}
if (errors.length > 0) {
return res.status(400).render('message', {
'title': 'Bad request',
'errors': errors,
'redirect': '/login'
})
}
loginAccount(req, res, next);
});
//register account
router.post('/register', (req, res, next) => {
const errors = [];
//check exist
if (!req.body.username || req.body.username.length <= 0) {
errors.push('Missing username');
}
if (!req.body.password || req.body.password.length <= 0) {
errors.push('Missing password');
}
if (!req.body.passwordconfirm || req.body.passwordconfirm.length <= 0) {
errors.push('Missing password confirmation');
}
//check too long
if (req.body.username && req.body.username.length > 50) {
errors.push('Username must be 50 characters or less');
}
if (req.body.password && req.body.password.length > 100) {
errors.push('Password must be 100 characters or less');
}
if (req.body.passwordconfirm && req.body.passwordconfirm.length > 100) {
errors.push('Password confirmation must be 100 characters or less');
}
if (req.body.password != req.body.passwordconfirm) {
errors.push('Password and password confirmation must match');
}
if (errors.length > 0) {
return res.status(400).render('message', {
'title': 'Bad request',
'errors': errors,
'redirect': '/register'
})
}
registerAccount(req, res, next);
});
// make new post
router.post('/board/:board/post', Boards.exists, banCheck, numberConverter, async (req, res, next) => {
let numFiles = 0;
if (req.files && req.files.file) {
if (Array.isArray(req.files.file)) {
numFiles = req.files.file.length;
} else {
numFiles = 1;
req.files.file = [req.files.file];
}
}
const errors = [];
if (!req.body.message && numFiles === 0) {
errors.push('Must provide a message or file');
}
if (req.body.message && req.body.message.length > 2000) {
errors.push('Message must be 2000 characters or less');
}
if (!req.body.thread && (!req.body.message || req.body.message.length === 0)) {
errors.push('Threads must include a message');
}
if (req.body.name && req.body.name.length > 50) {
errors.push('Name must be 50 characters or less');
}
if (req.body.subject && req.body.subject.length > 50) {
errors.push('Subject must be 50 characters or less');
}
if (req.body.email && req.body.email.length > 50) {
errors.push('Email must be 50 characters or less');
}
if (req.body.password && req.body.password.length > 50) {
errors.push('Password must be 50 characters or less');
}
if (errors.length > 0) {
return res.status(400).render('message', {
'title': 'Bad request',
'errors': errors,
'redirect': `/${req.params.board}${req.body.thread ? '/thread/' + req.body.thread : ''}`
})
}
makePost(req, res, next, numFiles);
});
//report/delete/spoiler/ban
router.post('/board/:board/actions', Boards.exists, banCheck, numberConverter, async (req, res, next) => {
const errors = [];
if (!req.body.checkedposts || req.body.checkedposts.length === 0 || req.body.checkedposts.length > 10) {
errors.push('Must select 1-10 posts')
}
if (req.body.password && req.body.password.length > 50) {
errors.push('Password must be 50 characters or less');
}
if (req.body.report_reason && req.body.report_reason.length > 50) {
errors.push('Report must be 50 characters or less');
}
if (req.body.ban_reason && req.body.ban_reason.length > 50) {
errors.push('Ban reason must be 50 characters or less');
}
if (!(req.body.report
|| req.body.global_report
|| req.body.spoiler
|| req.body.delete
|| req.body.dismiss
|| req.body.global_dismiss
|| req.body.ban
|| req.body.global_ban)) {
errors.push('Invalid actions selected')
}
if (req.body.report && (!req.body.report_reason || req.body.report_reason.length === 0)) {
errors.push('Reports must have a reason')
}
if (errors.length > 0) {
return res.status(400).render('message', {
'title': 'Bad request',
'errors': errors,
'redirect': `/${req.params.board}`
})
}
const posts = await Posts.getPosts(req.params.board, req.body.checkedposts, true);
if (!posts || posts.length === 0) {
return res.status(404).render('message', {
'title': 'Not found',
'errors': 'Selected posts not found',
'redirect': `/${req.params.board}`
})
}
const messages = [];
try {
// if getting global banned, board ban doesnt matter
if (req.body.global_ban) {
messages.push((await banPoster(req, res, next, null, posts)));
} else if (req.body.ban) {
messages.push((await banPoster(req, res, next, req.params.board, posts)));
}
//ban before deleting
if (req.body.delete) {
messages.push((await deletePosts(req, res, next, posts)));
} else {
// if it was getting deleted, we cant do any of these
if (req.body.spoiler) {
messages.push((await spoilerPosts(req, res, next, posts)));
}
// cannot report and dismiss at same time
if (req.body.report) {
messages.push((await reportPosts(req, res, next)));
} else if (req.body.dismiss) {
messages.push((await dismissReports(req, res, next)));
}
// cannot report and dismiss at same time
if (req.body.global_report) {
messages.push((await globalReportPosts(req, res, next, posts)));
} else if (req.body.global_dismiss) {
messages.push((await dismissGlobalReports(req, res, next, posts)));
}
}
} catch (err) {
//something not right
if (err.status) {
// return out special error
return res.status(err.status).render('message', err.message);
}
//some other error, use regular error handler
return next(err);
}
return res.render('message', {
'title': 'Success',
'messages': messages,
'redirect': `/${req.params.board}`
});
});
//unban
router.post('/board/:board/unban', Boards.exists, banCheck, hasPerms, numberConverter, async (req, res, next) => {
});
//unban
router.post('/board/:board/unban', Boards.exists, banCheck, hasPerms, numberConverter, async (req, res, next) => {
//keep this for later in case i add other options to unbans
const errors = [];
if (!req.body.checkedbans || req.body.checkedbans.length === 0 || req.body.checkedbans.length > 10) {
errors.push('Must select 1-10 bans')
}
if (errors.length > 0) {
return res.status(400).render('message', {
'title': 'Bad request',
'errors': errors,
'redirect': `/${req.params.board}/manage`
});
}
const messages = [];
try {
messages.push((await removeBans(req, res, next)));
} catch (err) {
//something not right
if (err.status) {
// return out special error
return res.status(err.status).render('message', err.message);
}
//some other error, use regular error handler
return next(err);
}
return res.render('message', {
'title': 'Success',
'messages': messages,
'redirect': `/${req.params.board}/manage`
});
});
router.post('/global/actions', hasPerms, numberConverter, async(req, res, next) => {
const errors = [];
if (!req.body.globalcheckedposts || req.body.globalcheckedposts.length === 0 || req.body.globalcheckedposts.length > 10) {
errors.push('Must select 1-10 posts')
}
if (req.body.ban_reason && req.body.ban_reason.length > 50) {
errors.push('Ban reason must be 50 characters or less');
}
if (!(req.body.spoiler
|| req.body.delete
|| req.body.global_dismiss
|| req.body.global_ban)) {
errors.push('Invalid actions selected')
}
if (errors.length > 0) {
return res.status(400).render('message', {
'title': 'Bad request',
'errors': errors,
'redirect': '/globalmanage'
})
}
const posts = await Posts.globalGetPosts(req.body.globalcheckedposts, true);
if (!posts || posts.length === 0) {
return res.status(404).render('message', {
'title': 'Not found',
'errors': 'Selected posts not found',
'redirect': '/globalmanage'
})
}
const messages = [];
try {
if (req.body.global_ban) {
messages.push((await banPoster(req, res, next, null, posts)));
}
//ban before deleting
if (req.body.delete) {
messages.push((await deletePosts(req, res, next, posts)));
} else {
// if it was getting deleted, we cant do any of these
if (req.body.spoiler) {
messages.push((await spoilerPosts(req, res, next, posts)));
}
if (req.body.global_dismiss) {
messages.push((await dismissGlobalReports(req, res, next, posts)));
}
}
} catch (err) {
//something not right
if (err.status) {
// return out special error
return res.status(err.status).render('message', err.message);
}
//some other error, use regular error handler
return next(err);
}
return res.render('message', {
'title': 'Success',
'messages': messages,
'redirect': `/${req.params.board}`
});
});
router.post('/global/unban', hasPerms, numberConverter, async(req, res, next) => {
//TODO
const errors = [];
if (!req.body.checkedbans || req.body.checkedbans.length === 0 || req.body.checkedbans.length > 10) {
errors.push('Must select 1-10 bans')
}
if (errors.length > 0) {
return res.status(400).render('message', {
'title': 'Bad request',
'errors': errors,
'redirect': `/globalmanage`
});
}
const messages = [];
try {
messages.push((await removeBans(req, res, next)));
} catch (err) {
//something not right
if (err.status) {
// return out special error
return res.status(err.status).render('message', err.message);
}
//some other error, use regular error handler
return next(err);
}
return res.render('message', {
'title': 'Success',
'messages': messages,
'redirect': `/globalmanage`
});
});
module.exports = router;

@ -1,7 +1,7 @@
body {
font-family: arial, helvetica, sans-serif;
font-size: 10pt;
background: #EEF2FF;
background: #EEF2FF url('/img/bg.png') repeat-x 50% 0%;;
flex: 1;
display: flex;
flex-direction: column;
@ -130,7 +130,7 @@ blockquote {
}
span {
margin-right: 5px;
/*margin-right: 5px;*/
}
.thread, .action-wrapper, .form-wrapper {
@ -354,15 +354,10 @@ input textarea {
margin-top: -2px;
}
.navbar {
border-bottom: 1px solid lightgray;
}
.nav-item {
line-height: 50px;
line-height: 30px;
text-decoration: none;
float: left;
background: #D6DAF0;
padding-left: 10px;
padding-right: 10px;
}
@ -390,12 +385,18 @@ input textarea {
line-height: 30px;
}
input[type="text"], input[type="password"], textarea {
input[type="text"], input[type="submit"], input[type="password"], input[type="file"], textarea {
border: 1px solid #a9a9a9;
font-size: inherit;
font-family: arial,helvetica,sans-serif;
margin: 0;
flex-grow: 1;
border-radius: 0px;
min-height: 29px;
}
input[type="file"] {
border: none;
}
.postform-section {
@ -466,7 +467,7 @@ hr {
.post-info {
background-color: #B7C5D9;
width: 100%;
/*width: 100%;*/
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 B

@ -1,48 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Layer_1"
x="0px"
y="0px"
viewBox="0 0 24 24"
enable-background="new 0 0 24 24"
xml:space="preserve"
inkscape:version="0.91 r13725"
sodipodi:docname="Locked_icon_red.svg"><metadata
id="metadata11"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs9" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="888"
inkscape:window-height="480"
id="namedview7"
showgrid="false"
inkscape:zoom="9.8333333"
inkscape:cx="12"
inkscape:cy="12"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="Layer_1" /><g
transform="matrix(1 0 0 -1 0 1638)"
id="g3"><path
d="M15,1630c0,0,0,3-2.5,3s-2.5-3-2.5-3v-1h5V1630z M17,1630v-1h2v-10H9c-1.7,0-3,1.3-3,3v7h2v1c0,0,0,5,4.5,5 C17,1635,17,1630,17,1630z"
id="path5"
style="fill:#d11d13;fill-opacity:1" /></g></svg>
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20">
<path fill="#f00" d="m3,9h1V6a5,5 0 0,1 12,0V9h1v11H3M14,9V6a4,4 0 1,0-8,0v3"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 190 B

@ -1,240 +1,10 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="500mm"
height="500mm"
viewBox="0 0 1771.6535 1771.6535"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="TJ-Openclipart-68-office-stationery-tack-pin-12-5-16 - final.svg"
inkscape:export-filename="C:\Users\tejasollie\Desktop\TJ-OpenClipArt 30-1-16\68-Office Stationery\TJ-Openclipart-68-office-stationery-tack-pin-12-5-16.png"
inkscape:export-xdpi="300"
inkscape:export-ydpi="300"
enable-background="new">
<defs
id="defs4">
<filter
inkscape:label="Silk Carpet"
inkscape:menu="Textures"
inkscape:menu-tooltip="Silk carpet texture, horizontal stripes"
style="color-interpolation-filters:sRGB;"
id="filter4271"
height="1.3"
width="1.3"
y="-0.15"
x="-0.15">
<feTurbulence
baseFrequency="0.1"
seed="50"
numOctaves="5"
result="result1"
type="fractalNoise"
id="feTurbulence4273" />
<feGaussianBlur
stdDeviation="4"
result="result7"
id="feGaussianBlur4275" />
<feDisplacementMap
result="result5"
in="SourceGraphic"
scale="20"
xChannelSelector="G"
in2="result7"
id="feDisplacementMap4277" />
<feComposite
result="result2"
operator="in"
in2="result1"
in="result5"
id="feComposite4279" />
<feGaussianBlur
stdDeviation="1"
result="result6"
id="feGaussianBlur4281" />
<feSpecularLighting
surfaceScale="-3"
result="result4"
specularConstant="3.5"
specularExponent="35"
in="result6"
id="feSpecularLighting4283">
<feDistantLight
elevation="45"
azimuth="225"
id="feDistantLight4285" />
</feSpecularLighting>
<feComposite
k1="1.7"
k3="0.7"
in2="result2"
in="result4"
operator="arithmetic"
result="result91"
id="feComposite4287" />
<feBlend
result="fbSourceGraphic"
mode="multiply"
in2="result91"
id="feBlend4289" />
<feComposite
in2="fbSourceGraphic"
in="fbSourceGraphic"
result="result2"
operator="arithmetic"
id="feComposite4291" />
<feComposite
in="result2"
result="result4"
operator="arithmetic"
k2="2"
k3="2"
in2="fbSourceGraphic"
id="feComposite4293" />
<feBlend
mode="screen"
in="result4"
in2="result4"
id="feBlend4295"
result="fbSourceGraphic" />
<feColorMatrix
result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
id="feColorMatrix4329" />
<feTurbulence
id="feTurbulence4331"
type="turbulence"
numOctaves="2"
baseFrequency="0.01 0.11"
seed="10"
in="fbSourceGraphic" />
<feColorMatrix
id="feColorMatrix4333"
result="result5"
values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1.3 0 " />
<feComposite
id="feComposite4335"
in2="result5"
in="fbSourceGraphic"
operator="out" />
<feMorphology
id="feMorphology4337"
operator="dilate"
radius="1.3"
result="result3" />
<feTurbulence
id="feTurbulence4339"
numOctaves="3"
baseFrequency="0.08 0.05"
type="fractalNoise"
seed="7"
result="result6" />
<feGaussianBlur
id="feGaussianBlur4341"
stdDeviation="0.5"
result="result7" />
<feDisplacementMap
id="feDisplacementMap4343"
in2="result7"
in="result3"
xChannelSelector="R"
yChannelSelector="G"
scale="3"
result="result4" />
<feComposite
id="feComposite4345"
in2="result4"
in="result4"
k1="1"
result="result2"
operator="arithmetic"
k2="1" />
<feBlend
id="feBlend4347"
in2="result4"
mode="normal"
in="result2" />
</filter>
<filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Lighting"
id="filter4412">
<feComponentTransfer
in="blur"
result="component"
id="feComponentTransfer4414">
<feFuncR
type="gamma"
amplitude="5.05"
exponent="0.989583"
offset="0"
id="feFuncR4416" />
<feFuncG
type="gamma"
amplitude="5.05"
exponent="0.989583"
offset="0"
id="feFuncG4418" />
<feFuncB
type="gamma"
amplitude="5.05"
exponent="0.989583"
offset="0"
id="feFuncB4420" />
</feComponentTransfer>
</filter>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.16000001"
inkscape:cx="-325.83103"
inkscape:cy="994.39246"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1366"
inkscape:window-height="664"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
id="layer1"
inkscape:label="Layer 1">
<g
id="g4196"
transform="translate(987.49901,199.60027)">
<path
style="fill:#a90000"
d="m -118.26364,1449.3513 -16.44054,-79.5748 0.0165,-326.7161 c 0.0132,-261.42674 -0.0586,-326.81796 -0.35949,-327.22608 -0.3531,-0.47892 -10.93529,-0.51456 -173.24975,-0.58383 l -172.87364,-0.0738 114.26506,-167.33019 c 62.84575,-92.03161 114.34581,-167.63159 114.44457,-167.99996 0.30018,-1.11993 0.21519,-271.90836 -0.0856,-272.69946 -0.19725,-0.51879 -1.76235,-1.54023 -5.625,-3.67104 C -312.0261,73.767659 -353.35868,38.711589 -377.47396,2.2900386 -401.64799,-34.220171 -409.69236,-72.203351 -401.63119,-111.7731 c 2.74683,-13.48332 8.31609,-29.65984 14.35287,-41.6895 l 1.51089,-3.0108 285.03348,0.0752 285.03343,0.0752 1.3325,3 c 14.0781,31.69662 18.7044,63.007054 13.7194,92.849974 -6.9133,41.38594 -31.4562,80.09425 -73.9246,116.59146 -18.7857,16.1444 -43.738501,33.2019 -69.502701,47.511376 -4.6874,2.60334 -6.7025,3.87993 -6.821,4.32105 -0.2269,0.84507 -0.216,271.04718 0.011,271.8939 0.099,0.36732 51.598901,75.9673 114.445401,167.99996 l 114.2664,167.33208 -172.8745,0.0738 c -162.315191,0.0693 -172.897451,0.10491 -173.250551,0.58383 -0.30093,0.40812 -0.37278,65.79934 -0.35949,327.22617 l 0.0165,326.7161 -16.44054,79.5748 c -9.04227,43.7661 -16.507999,79.5747 -16.590499,79.5747 -0.0825,0 -7.54824,-35.8086 -16.59051,-79.5747 z"
id="path4198"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 508.512 508.512" style="enable-background:new 0 0 508.512 508.512;" xml:space="preserve">
<path style="fill:#f00;" d="M333.712,255.142V90.54c40.173-13.603,63.565-35.501,63.565-51.043
c0-52.664-286.042-52.664-286.042,0c0,17.131,23.424,38.552,63.565,51.647v163.998c-40.141,10.202-63.565,29.049-63.565,54.952
c0,24.377,61.34,37.344,127.162,39.092l-0.032,0.413v95.347c0,17.544,7.119,63.565,15.891,63.565
c8.74,0,15.891-46.021,15.891-63.565v-95.347l-0.032-0.413c65.822-1.78,127.162-14.779,127.162-39.092
C397.277,284.191,373.885,265.344,333.712,255.142z"/>
</svg>

Before

Width:  |  Height:  |  Size: 7.7 KiB

After

Width:  |  Height:  |  Size: 867 B

@ -111,6 +111,8 @@ module.exports = async (req, res, next, numFiles) => {
case 'video':
//video metadata
const videoData = await videoIdentify(filename);
processedFile.duration = videoData.format.duration;
processedFile.durationString = new Date(videoData.format.duration*1000).toLocaleString('en-US', {hour12:false}).split(' ')[1].replace(/^00:/, '');
processedFile.geometry = {width: videoData.streams[0].coded_width, height: videoData.streams[0].coded_height} // object with width and height pixels
processedFile.sizeString = formatSize(processedFile.size) // 123 Ki string
processedFile.geometryString = `${processedFile.geometry.width}x${processedFile.geometry.height}` // 123 x 123 string

336
package-lock.json generated

@ -583,11 +583,11 @@
}
},
"bcrypt": {
"version": "3.0.5",
"resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-3.0.5.tgz",
"integrity": "sha512-m4o91nB+Ce8696Ao4R3B/WtVWTc1Lszgd098/OIjU9D/URmdYwT3ooBs9uv1b97J5YhZweTq9lldPefTYZ0TwA==",
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-3.0.6.tgz",
"integrity": "sha512-taA5bCTfXe7FUjKroKky9EXpdhkVvhE5owfxfLYodbrAR1Ul3juLmIQmIQBK4L9a5BuUcE6cqmwT+Da20lF9tg==",
"requires": {
"nan": "2.13.1",
"nan": "2.13.2",
"node-pre-gyp": "0.12.0"
}
},
@ -1122,9 +1122,9 @@
"integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
},
"cookie-parser": {
"version": "1.4.3",
"resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.3.tgz",
"integrity": "sha1-D+MfoZ0AC5X0qt8fU/3CuKIDuqU=",
"version": "1.4.4",
"resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.4.tgz",
"integrity": "sha512-lo13tqF3JEtFO7FyA49CqbhaFkskRJ0u/UAiINgrIXeRCY41c88/zxtrECl8AKH3B0hj9q10+h3Kt8I7KlW4tw==",
"requires": {
"cookie": "0.3.1",
"cookie-signature": "1.0.6"
@ -1161,11 +1161,6 @@
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
},
"crc": {
"version": "3.4.4",
"resolved": "https://registry.npmjs.org/crc/-/crc-3.4.4.tgz",
"integrity": "sha1-naHpgOO9RPxck79as9ozeNheRms="
},
"cross-spawn": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz",
@ -1176,40 +1171,42 @@
}
},
"csrf": {
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/csrf/-/csrf-3.0.6.tgz",
"integrity": "sha1-thEg3c7q/JHnbtUxO7XAsmZ7cQo=",
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/csrf/-/csrf-3.1.0.tgz",
"integrity": "sha512-uTqEnCvWRk042asU6JtapDTcJeeailFy4ydOQS28bj1hcLnYRiqi8SsD2jS412AY1I/4qdOwWZun774iqywf9w==",
"requires": {
"rndm": "1.2.0",
"tsscmp": "1.0.5",
"uid-safe": "2.1.4"
"tsscmp": "1.0.6",
"uid-safe": "2.1.5"
}
},
"csurf": {
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/csurf/-/csurf-1.9.0.tgz",
"integrity": "sha1-SdLGkl/87Ht95VlZfBU/pTM2QTM=",
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/csurf/-/csurf-1.10.0.tgz",
"integrity": "sha512-fh725p0R83wA5JukCik5hdEko/LizW/Vl7pkKDa1WJUVCosg141mqaAWCScB+nkEaRMFMGbutHMOr6oBNc/j9A==",
"requires": {
"cookie": "0.3.1",
"cookie-signature": "1.0.6",
"csrf": "~3.0.3",
"http-errors": "~1.5.0"
"csrf": "3.1.0",
"http-errors": "~1.7.2"
},
"dependencies": {
"http-errors": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.5.1.tgz",
"integrity": "sha1-eIwNLB3iyBuebowBhDtrl+uSB1A=",
"version": "1.7.2",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
"integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
"requires": {
"depd": "~1.1.2",
"inherits": "2.0.3",
"setprototypeof": "1.0.2",
"statuses": ">= 1.3.1 < 2"
"setprototypeof": "1.1.1",
"statuses": ">= 1.5.0 < 2",
"toidentifier": "1.0.0"
}
},
"setprototypeof": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.2.tgz",
"integrity": "sha1-gaVSFB7BBLiOic44MQOtXGZWTQg="
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
"integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
}
}
},
@ -1685,13 +1682,13 @@
"integrity": "sha512-ngXzTfoRGG7fYens3/RMb6yYoVLvLMfmsSllP/mZPxNHgFq41TmPSLF/nLY7fwoclI2vElvAmILFWGUYqdjfCg=="
},
"express": {
"version": "4.16.3",
"resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz",
"integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=",
"version": "4.16.4",
"resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz",
"integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==",
"requires": {
"accepts": "~1.3.5",
"array-flatten": "1.1.1",
"body-parser": "1.18.2",
"body-parser": "1.18.3",
"content-disposition": "0.5.2",
"content-type": "~1.0.4",
"cookie": "0.3.1",
@ -1708,10 +1705,10 @@
"on-finished": "~2.3.0",
"parseurl": "~1.3.2",
"path-to-regexp": "0.1.7",
"proxy-addr": "~2.0.3",
"qs": "6.5.1",
"proxy-addr": "~2.0.4",
"qs": "6.5.2",
"range-parser": "~1.2.0",
"safe-buffer": "5.1.1",
"safe-buffer": "5.1.2",
"send": "0.16.2",
"serve-static": "1.13.2",
"setprototypeof": "1.1.0",
@ -1721,72 +1718,6 @@
"vary": "~1.1.2"
},
"dependencies": {
"body-parser": {
"version": "1.18.2",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz",
"integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=",
"requires": {
"bytes": "3.0.0",
"content-type": "~1.0.4",
"debug": "2.6.9",
"depd": "~1.1.1",
"http-errors": "~1.6.2",
"iconv-lite": "0.4.19",
"on-finished": "~2.3.0",
"qs": "6.5.1",
"raw-body": "2.3.2",
"type-is": "~1.6.15"
}
},
"iconv-lite": {
"version": "0.4.19",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
"integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ=="
},
"qs": {
"version": "6.5.1",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
"integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A=="
},
"raw-body": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz",
"integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=",
"requires": {
"bytes": "3.0.0",
"http-errors": "1.6.2",
"iconv-lite": "0.4.19",
"unpipe": "1.0.0"
},
"dependencies": {
"depd": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz",
"integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k="
},
"http-errors": {
"version": "1.6.2",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz",
"integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=",
"requires": {
"depd": "1.1.1",
"inherits": "2.0.3",
"setprototypeof": "1.0.3",
"statuses": ">= 1.3.1 < 2"
}
},
"setprototypeof": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
"integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ="
}
}
},
"safe-buffer": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
"integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
},
"statuses": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
@ -1803,28 +1734,24 @@
}
},
"express-session": {
"version": "1.15.6",
"resolved": "https://registry.npmjs.org/express-session/-/express-session-1.15.6.tgz",
"integrity": "sha512-r0nrHTCYtAMrFwZ0kBzZEXa1vtPVrw0dKvGSrKP4dahwBQ1BJpF2/y1Pp4sCD/0kvxV4zZeclyvfmw0B4RMJQA==",
"version": "1.16.1",
"resolved": "https://registry.npmjs.org/express-session/-/express-session-1.16.1.tgz",
"integrity": "sha512-pWvUL8Tl5jUy1MLH7DhgUlpoKeVPUTe+y6WQD9YhcN0C5qAhsh4a8feVjiUXo3TFhIy191YGZ4tewW9edbl2xQ==",
"requires": {
"cookie": "0.3.1",
"cookie-signature": "1.0.6",
"crc": "3.4.4",
"debug": "2.6.9",
"depd": "~1.1.1",
"on-headers": "~1.0.1",
"depd": "~2.0.0",
"on-headers": "~1.0.2",
"parseurl": "~1.3.2",
"uid-safe": "~2.1.5",
"utils-merge": "1.0.1"
"safe-buffer": "5.1.2",
"uid-safe": "~2.1.5"
},
"dependencies": {
"uid-safe": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz",
"integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==",
"requires": {
"random-bytes": "~1.0.0"
}
"depd": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
}
}
},
@ -1958,6 +1885,11 @@
"dev": true,
"optional": true
},
"feature-policy": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/feature-policy/-/feature-policy-0.2.0.tgz",
"integrity": "sha512-2hGrlv6efG4hscYVZeaYjpzpT6I2OZgYqE2yDUzeAcKj2D1SH0AsEzqJNXzdoglEddcIXQQYop3lD97XpG75Jw=="
},
"fill-range": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
@ -2025,9 +1957,9 @@
}
},
"fined": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/fined/-/fined-1.1.1.tgz",
"integrity": "sha512-jQp949ZmEbiYHk3gkbdtpJ0G1+kgtLQBNdP5edFP7Fh+WAYceLQz6yO1SBj72Xkg8GVyTB3bBzAYrHJVh5Xd5g==",
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz",
"integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==",
"dev": true,
"requires": {
"expand-tilde": "^2.0.2",
@ -2898,14 +2830,14 @@
"dev": true
},
"gulp": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.0.tgz",
"integrity": "sha1-lXZsYB2t5Kd+0+eyttwDiBtZY2Y=",
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.1.tgz",
"integrity": "sha512-yDVtVunxrAdsk7rIV/b7lVSBifPN1Eqe6wTjsESGrFcL+MEVzaaeNTkpUuGTUptloSOU+8oJm/lBJbgPV+tMAw==",
"dev": true,
"requires": {
"glob-watcher": "^5.0.0",
"gulp-cli": "^2.0.0",
"undertaker": "^1.0.0",
"glob-watcher": "^5.0.3",
"gulp-cli": "^2.2.0",
"undertaker": "^1.2.1",
"vinyl-fs": "^3.0.0"
},
"dependencies": {
@ -2927,9 +2859,9 @@
}
},
"gulp-cli": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.1.0.tgz",
"integrity": "sha512-txzgdFVlEPShBZus6JJyGyKJoBVDq6Do0ZQgIgx5RAsmhNVTDjymmOxpQvo3c20m66FldilS68ZXj2Q9w5dKbA==",
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.2.0.tgz",
"integrity": "sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA==",
"dev": true,
"requires": {
"ansi-colors": "^1.0.1",
@ -2976,25 +2908,24 @@
}
},
"gulp-clean-css": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/gulp-clean-css/-/gulp-clean-css-4.0.0.tgz",
"integrity": "sha512-/Hs+dmclQfFBSpwrAKd4wTVsahJvrVIg2ga0J7Eo7DKVTVfJrM7wXlfU1mK9iJ9Y7OmkO/YstZVtmhfAKzZ00g==",
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/gulp-clean-css/-/gulp-clean-css-4.2.0.tgz",
"integrity": "sha512-r4zQsSOAK2UYUL/ipkAVCTRg/2CLZ2A+oPVORopBximRksJ6qy3EX1KGrIWT4ZrHxz3Hlobb1yyJtqiut7DNjA==",
"dev": true,
"requires": {
"clean-css": "4.2.1",
"plugin-error": "1.0.1",
"through2": "3.0.0",
"through2": "3.0.1",
"vinyl-sourcemaps-apply": "0.2.1"
},
"dependencies": {
"through2": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/through2/-/through2-3.0.0.tgz",
"integrity": "sha512-8B+sevlqP4OiCjonI1Zw03Sf8PuV1eRsYQgLad5eonILOdyeRsY27A/2Ze8IlvlMvq31OH+3fz/styI7Ya62yQ==",
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz",
"integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==",
"dev": true,
"requires": {
"readable-stream": "2 || 3",
"xtend": "~4.0.1"
"readable-stream": "2 || 3"
}
}
}
@ -3174,23 +3105,32 @@
}
},
"helmet": {
"version": "3.13.0",
"resolved": "https://registry.npmjs.org/helmet/-/helmet-3.13.0.tgz",
"integrity": "sha512-rCYnlbOBkeP6fCo4sXZNu91vIAWlbVgolwnUANtnzPANRf2kJZ2a6yjRnCqG23Tyl2/ExvJ8bDg4xUdNCIWnrw==",
"version": "3.16.0",
"resolved": "https://registry.npmjs.org/helmet/-/helmet-3.16.0.tgz",
"integrity": "sha512-rsTKRogc5OYGlvSHuq5QsmOsOzF6uDoMqpfh+Np8r23+QxDq+SUx90Rf8HyIKQVl7H6NswZEwfcykinbAeZ6UQ==",
"requires": {
"depd": "2.0.0",
"dns-prefetch-control": "0.1.0",
"dont-sniff-mimetype": "1.0.0",
"expect-ct": "0.1.1",
"feature-policy": "0.2.0",
"frameguard": "3.0.0",
"helmet-crossdomain": "0.3.0",
"helmet-csp": "2.7.1",
"hide-powered-by": "1.0.0",
"hpkp": "2.0.0",
"hsts": "2.1.0",
"ienoopen": "1.0.0",
"hsts": "2.2.0",
"ienoopen": "1.1.0",
"nocache": "2.0.0",
"referrer-policy": "1.1.0",
"x-xss-protection": "1.1.0"
},
"dependencies": {
"depd": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
}
}
},
"helmet-crossdomain": {
@ -3235,9 +3175,19 @@
"integrity": "sha1-EOFCJk52IVpdMMROxD3mTe5tFnI="
},
"hsts": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/hsts/-/hsts-2.1.0.tgz",
"integrity": "sha512-zXhh/DqgrTXJ7erTN6Fh5k/xjMhDGXCqdYN3wvxUvGUQvnxcFfUd8E+6vLg/nk3ss1TYMb+DhRl25fYABioTvA=="
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/hsts/-/hsts-2.2.0.tgz",
"integrity": "sha512-ToaTnQ2TbJkochoVcdXYm4HOCliNozlviNsg+X2XQLQvZNI/kCHR9rZxVYpJB3UPcHz80PgxRyWQ7PdU1r+VBQ==",
"requires": {
"depd": "2.0.0"
},
"dependencies": {
"depd": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
}
}
},
"htmlparser2": {
"version": "3.10.1",
@ -3284,9 +3234,9 @@
}
},
"ienoopen": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/ienoopen/-/ienoopen-1.0.0.tgz",
"integrity": "sha1-NGpCj0dKrI9QzzeE6i0PFvYr2ms="
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/ienoopen/-/ienoopen-1.1.0.tgz",
"integrity": "sha512-MFs36e/ca6ohEKtinTJ5VvAJ6oDRAYFdYXweUnGY9L9vcoqFOU4n2ZhmJ0C4z/cwGZ3YIQRSB3XZ1+ghZkY5NQ=="
},
"ignore-walk": {
"version": "3.0.1",
@ -3341,9 +3291,9 @@
"dev": true
},
"ipaddr.js": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz",
"integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4="
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz",
"integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA=="
},
"is-absolute": {
"version": "1.0.0",
@ -4068,11 +4018,11 @@
}
},
"mongodb": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.2.2.tgz",
"integrity": "sha512-xQ6apOOV+w7VFApdaJpWhYhzartpjIDFQjG0AwgJkLh7dBs7PTsq4A3Bia2QWpDohmAzTBIdQVLMqqLy0mwt3Q==",
"version": "3.2.3",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.2.3.tgz",
"integrity": "sha512-jw8UyPsq4QleZ9z+t/pIVy3L++51vKdaJ2Q/XXeYxk/3cnKioAH8H6f5tkkDivrQL4PUgUOHe9uZzkpRFH1XtQ==",
"requires": {
"mongodb-core": "3.2.2",
"mongodb-core": "^3.2.3",
"safe-buffer": "^5.1.2"
},
"dependencies": {
@ -4082,9 +4032,9 @@
"integrity": "sha512-jCGVYLoYMHDkOsbwJZBCqwMHyH4c+wzgI9hG7Z6SZJRXWr+x58pdIbm2i9a/jFGCkRJqRUr8eoI7lDWa0hTkxg=="
},
"mongodb-core": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.2.2.tgz",
"integrity": "sha512-YRgC39MuzKL0uoGoRdTmV1e9m47NbMnYmuEx4IOkgWAGXPSEzRY7cwb3N0XMmrDMnD9vp7MysNyAriIIeGgIQg==",
"version": "3.2.3",
"resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.2.3.tgz",
"integrity": "sha512-UyI0rmvPPkjOJV8XGWa9VCTq7R4hBVipimhnAXeSXnuAPjuTqbyfA5Ec9RcYJ1Hhu+ISnc8bJ1KfGZd4ZkYARQ==",
"requires": {
"bson": "^1.1.1",
"require_optional": "^1.0.1",
@ -4115,9 +4065,9 @@
"dev": true
},
"nan": {
"version": "2.13.1",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.13.1.tgz",
"integrity": "sha512-I6YB/YEuDeUZMmhscXKxGgZlFnhsn5y0hgOZBadkzfTRrZBtJDZeg6eQf7PYMIEclwmorTKK8GztsyOUSVBREA=="
"version": "2.13.2",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz",
"integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw=="
},
"nanomatch": {
"version": "1.2.13",
@ -4147,13 +4097,28 @@
}
},
"needle": {
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/needle/-/needle-2.2.4.tgz",
"integrity": "sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA==",
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/needle/-/needle-2.3.1.tgz",
"integrity": "sha512-CaLXV3W8Vnbps8ZANqDGz7j4x7Yj1LW4TWF/TQuDfj7Cfx4nAPTvw98qgTevtto1oHDrh3pQkaODbqupXlsWTg==",
"requires": {
"debug": "^2.1.2",
"debug": "^4.1.0",
"iconv-lite": "^0.4.4",
"sax": "^1.2.4"
},
"dependencies": {
"debug": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
"integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
"requires": {
"ms": "^2.1.1"
}
},
"ms": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
}
}
},
"negotiator": {
@ -4386,9 +4351,9 @@
}
},
"on-headers": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
"integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c="
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
"integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA=="
},
"once": {
"version": "1.4.0",
@ -4500,9 +4465,9 @@
"dev": true
},
"parseurl": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
"integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M="
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
},
"pascalcase": {
"version": "0.1.1",
@ -4685,12 +4650,12 @@
}
},
"proxy-addr": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz",
"integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==",
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz",
"integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==",
"requires": {
"forwarded": "~0.1.2",
"ipaddr.js": "1.8.0"
"ipaddr.js": "1.9.0"
}
},
"prr": {
@ -5784,6 +5749,11 @@
"through2": "^2.0.3"
}
},
"toidentifier": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
"integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
},
"token-stream": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/token-stream/-/token-stream-0.0.1.tgz",
@ -5810,9 +5780,9 @@
}
},
"tsscmp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.5.tgz",
"integrity": "sha1-fcSjOvcVgatDN9qR2FylQn69mpc="
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz",
"integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA=="
},
"tunnel-agent": {
"version": "0.6.0",
@ -5869,9 +5839,9 @@
"optional": true
},
"uid-safe": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.4.tgz",
"integrity": "sha1-Otbzg2jG1MjHXsF2I/t5qh0HHYE=",
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz",
"integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==",
"requires": {
"random-bytes": "~1.0.0"
}

@ -5,18 +5,18 @@
"main": "server.js",
"dependencies": {
"@tohru/gm": "git+https://github.com/iCrawl/gm.git",
"bcrypt": "^3.0.5",
"bcrypt": "^3.0.6",
"body-parser": "^1.18.3",
"connect-mongo": "^2.0.3",
"cookie-parser": "^1.4.3",
"csurf": "^1.9.0",
"express": "^4.16.3",
"cookie-parser": "^1.4.4",
"csurf": "^1.10.0",
"express": "^4.16.4",
"express-fileupload": "^1.1.4",
"express-session": "^1.15.6",
"express-session": "^1.16.1",
"fluent-ffmpeg": "^2.1.2",
"fs": "0.0.1-security",
"helmet": "^3.13.0",
"mongodb": "^3.2.2",
"helmet": "^3.16.0",
"mongodb": "^3.2.3",
"path": "^0.12.7",
"pug": "^2.0.3",
"sanitize-html": "^1.20.0",
@ -24,8 +24,8 @@
},
"devDependencies": {
"del": "^4.1.0",
"gulp": "^4.0.0",
"gulp-clean-css": "^4.0.0",
"gulp": "^4.0.1",
"gulp-clean-css": "^4.2.0",
"gulp-concat": "^2.6.1",
"gulp-less": "^4.0.1",
"gulp-uglify-es": "^1.0.4"

@ -33,7 +33,7 @@ const express = require('express')
files: 3
},
abortOnLimit: true,
useTempFile: true,
useTempFiles: true,
tempFileDir: path.join(__dirname+'/tmp/')
}));

@ -24,5 +24,9 @@ section.form-wrapper
label
input.post-check#spoiler(type='checkbox', name='spoiler', value='true')
| Spoiler
section.postform-section
.postform-label Captcha
input#captcha(type='text', name='captcha', autocomplete='off' placeholder='under construction' maxlength='6')
input(type='submit', value='submit')

@ -6,9 +6,18 @@ mixin post(post, truncate, manage=false, globalmanage=false)
input.post-check(type='checkbox', name='globalcheckedposts[]' value=post._id)
else
input.post-check(type='checkbox', name='checkedposts[]' value=post.postId)
|
|
if !post.thread
if post.sticky
img(src='/img/sticky.svg' height='12')
if post.saged
img(src='/img/saged.svg' height='12')
if post.locked
img(src='/img/locked.svg' height='12')
|
if post.subject
span.post-subject #{post.subject}
|
if post.email
a(href=`mailto:${post.email}`)
span.post-name #{post.name}
@ -18,16 +27,12 @@ mixin post(post, truncate, manage=false, globalmanage=false)
span.post-tripcode #{post.tripcode}
if post.capcode
span.post-capcode #{post.capcode}
|
span #{post.date.toLocaleString()}
|
span.user-id(style=`background: #${post.userId}`) #{post.userId}
|
span: a(href=postURL) ##{post.postId}
if !post.thread
if post.sticky
img(src='/img/sticky.svg' height='14')
if post.saged
img(src='/img/saged.svg' height='12')
if post.locked
img(src='/img/locked.svg' height='16')
.post-data
if post.files.length > 0
.post-files
@ -36,7 +41,11 @@ mixin post(post, truncate, manage=false, globalmanage=false)
small.post-file-info
span: a(href='/img/'+file.filename title=file.originalFilename download=file.originalFilename) Download
br
span (#{file.sizeString} #{file.geometryString})
span
| (#{file.sizeString}, #{file.geometryString}
if file.durationString
| , #{file.durationString}
| )
.post-file-src
a(target='_blank' href='/img/'+file.filename)
if post.spoiler

Loading…
Cancel
Save