merge-requests/208/head
fatchan 5 years ago
parent a313426e2a
commit 2a2f00e606
  1. 51
      controllers/api.js
  2. 4
      controllers/frontend.js
  3. 50
      helpers/file.js
  4. 13
      helpers/filefilter.js
  5. 27
      models/captcha.js
  6. 224
      package-lock.json
  7. 8
      package.json
  8. 9
      server.js
  9. 5
      static/css/style.css
  10. BIN
      static/img/1553783232449-tombot.png-.png
  11. BIN
      static/img/1553783623138-tombot.png-.png
  12. BIN
      static/img/1553783720126-tombot.png-.png
  13. BIN
      static/img/e16b5d69-3818-45d0-86b5-f30d88b33fbf.png
  14. BIN
      static/img/thumb-e16b5d69-3818-45d0-86b5-f30d88b33fbf.png
  15. BIN
      static/img/thumb_1553783232449-tombot.png-.png
  16. BIN
      static/img/thumb_1553783623138-tombot.png-.png
  17. BIN
      static/img/thumb_1553783720126-tombot.png-.png
  18. 2
      views/includes/postform.pug
  19. 5
      views/mixins/post.pug

@ -3,50 +3,34 @@
const express = require('express')
, router = express.Router()
, utils = require('../utils.js')
, { check, validationResult } = require('express-validator/check')
, Posts = require(__dirname+'/../models/posts.js')
, Boards = require(__dirname+'/../models/boards.js');
, Boards = require(__dirname+'/../models/boards.js')
, files = require(__dirname+'/../helpers/file.js')
/*
roughly:
- GET /board/:board/catalog -> all threads (catalog)
- GET /board/:board/recent/:page? -> recent posts per page (board homepage)
- GET /board/:board/thread/:thread -> get all posts in a thread
// make new post
router.post('/board/:board', Boards.exists, async (req, res, next) => {
- POST /board/:board -> make a new thread
- POST /board/:board/thread/:thread -> make a new post in a thread
- DELETE /board/:board/post/:id -> delete a post
*/
// make new post
router.post('/board/:board', Boards.exists, [
check('author').optional(),
check('subject').optional(),
check('thread').optional(),
check('content').not().isEmpty().withMessage('missing message content'),
], async (req, res, next) => {
//return array of errors about bad post
const errors = validationResult(req)
if (!errors.isEmpty()) {
return res.json({errors:errors.array()})
}
//ghetto setting to 0 so expres validator doesnt skip null value. needs looking into.
if (req.body.thread) {
let thread;
try {
thread = await Posts.getThread(req.params.board, req.body.thread);
} catch (err) {
return res.status(500).json({ 'message': 'Error fetching from DB' });
}
try {
thread = await Posts.getThread(req.params.board, req.body.thread);
} catch (err) {
return res.status(500).json({ 'message': 'Error fetching from DB' });
}
if (!thread) {
return res.status(400).json({ 'message': 'thread does not exist' })
}
}
//TODO: handle file uploads instead of just doing nothing
try {
await files.uploadAndThumb(req, res);
} catch (err) {
console.error(err);
return res.status(500).json({ 'message': 'Error uploading file' });
}
//add the post
const post = await Posts.insertOne(req.params.board, {
@ -54,12 +38,13 @@ router.post('/board/:board', Boards.exists, [
'subject': req.body.subject || '',
'date': new Date(),
'content': req.body.content,
'thread': req.body.thread || null
'thread': req.body.thread || null,
'file': req.file ? req.file.filename : ''
})
const redirect = '/' + req.params.board + '/thread/' + (req.body.thread || post.insertedId);
return res.redirect(redirect)
return res.redirect(redirect);
});

@ -31,7 +31,7 @@ router.get('/:board/:page(\\d+)?', Boards.exists, async (req, res, next) => {
//render the page
res.render('board', {
csrf: req.csrfToken(),
csrf: req.csrfToken(),
threads: threads || []
});
@ -54,7 +54,7 @@ router.get('/:board/thread/:id(\\d+)', Boards.exists, async (req, res, next) =>
//render the page
res.render('thread', {
csrf: req.csrfToken(),
csrf: req.csrfToken(),
thread: thread
});

@ -0,0 +1,50 @@
'use strict';
const multer = require('multer')
, fileFilter = require(__dirname+'/filefilter.js')
, path = require('path')
, uploadDest = path.join(__dirname, '/../static/img/')
, uuidv4 = require('uuid/v4')
, storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, uploadDest)
},
filename: function (req, file, cb) {
cb(null, uuidv4() + path.extname(file.originalname))
}
})
, upload = multer({
storage: storage,
limits: { fileSize: 1 * 1024 * 1024 }, //1MB for now
fileFilter: fileFilter
}).single('file')
, gm = require('@tohru/gm');
module.exports = {
upload,
uploadDest,
uploadAndThumb: (req, res) => {
return new Promise((resolve, reject) => {
upload(req, res, function (err) {
if (err) {
return reject(err)
}
if (req.file) {
//thumbnail it
gm(uploadDest+req.file.filename)
.resize(128, 128)
.noProfile()
.write(uploadDest+'thumb-'+req.file.filename, function (err) {
if (err) {
return reject(err);
}
return resolve()
});
}
});
});
},
};

@ -0,0 +1,13 @@
'use strict';
const allowedMimeTypes = new Set(['image/jpeg', 'image/pjpeg', 'image/png', 'image/gif']);
module.exports = (req, file, cb) => {
if (!allowedMimeTypes.has(file.mimetype)) {
cb(new Error('file type must be jpg, png or gif'))
}
cb(null, true)
}

@ -0,0 +1,27 @@
'use strict';
const Mongo = require(__dirname+'/../helpers/db.js')
, db = Mongo.client.db('captcha');
module.exports = {
db,
findOne: async (name) => {
return db.collection('captcha').findOne({ '_id': name });
},
insertOne: async (data) => {
return db.collection('captcha').insertOne(data);
},
deleteOne: async (data) => {
return db.collection('captcha').deleteOne(data);
},
deleteAll: async () => {
return db.collection('captcha').deleteMany({});
},
}

224
package-lock.json generated

@ -1,9 +1,35 @@
{
"name": "elec3609",
"version": "1.0.0",
"name": "jschan",
"version": "0.0.1",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@tohru/gm": {
"version": "git+https://github.com/iCrawl/gm.git#70ade5ebee96db0e38d621eb8f9744e5eee159c7",
"from": "git+https://github.com/iCrawl/gm.git",
"requires": {
"array-parallel": "^0.1.3",
"array-series": "^0.1.5",
"cross-spawn": "^4.0.0",
"debug": "^3.1.0",
"tmp": "^0.0.33"
},
"dependencies": {
"debug": {
"version": "3.2.6",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
"integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
"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=="
}
}
},
"@types/babel-types": {
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.4.tgz",
@ -56,11 +82,26 @@
"repeat-string": "^1.5.2"
}
},
"append-field": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz",
"integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY="
},
"array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
},
"array-parallel": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/array-parallel/-/array-parallel-0.1.3.tgz",
"integrity": "sha1-j3hTCJJu1apHjEfmTRszS2wMlH0="
},
"array-series": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/array-series/-/array-series-0.1.5.tgz",
"integrity": "sha1-3103v8XC7wdV4qpPkv6ufUtaly8="
},
"asap": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
@ -113,6 +154,11 @@
"resolved": "https://registry.npmjs.org/bson/-/bson-1.0.9.tgz",
"integrity": "sha512-IQX9/h7WdMBIW/q/++tGd+emQr0XMdeZ6icnT/74Xk9fnabWn+gZgpE+9V+gujL3hhJOoNrnDVY7tWdzc7NUTg=="
},
"buffer-from": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
"integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
},
"buffer-shims": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz",
@ -182,11 +228,6 @@
"is-regex": "^1.0.3"
}
},
"charenc": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
"integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc="
},
"clean-css": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz",
@ -205,6 +246,17 @@
"wordwrap": "0.0.2"
}
},
"concat-stream": {
"version": "1.6.2",
"resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
"integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
"requires": {
"buffer-from": "^1.0.0",
"inherits": "^2.0.3",
"readable-stream": "^2.2.2",
"typedarray": "^0.0.6"
}
},
"connect-mongo": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/connect-mongo/-/connect-mongo-2.0.3.tgz",
@ -312,10 +364,14 @@
"resolved": "https://registry.npmjs.org/crc/-/crc-3.4.4.tgz",
"integrity": "sha1-naHpgOO9RPxck79as9ozeNheRms="
},
"crypt": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
"integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs="
"cross-spawn": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz",
"integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=",
"requires": {
"lru-cache": "^4.0.1",
"which": "^1.2.9"
}
},
"csrf": {
"version": "3.0.6",
@ -576,13 +632,11 @@
}
},
"express-fileupload": {
"version": "1.0.0-alpha.1",
"resolved": "https://registry.npmjs.org/express-fileupload/-/express-fileupload-1.0.0-alpha.1.tgz",
"integrity": "sha512-3yr8m8ifPFLmP1sfPovAo9mvAgW5zjlYbDMwoPQpJbkf83bLYGfYGlO1lFcxVK3Bj67gSXaHK8J/nNtSF7UWgw==",
"version": "1.1.3-alpha.2",
"resolved": "https://registry.npmjs.org/express-fileupload/-/express-fileupload-1.1.3-alpha.2.tgz",
"integrity": "sha512-askIbniNmGzLBsmzDzfy9aR3vOFCUgNBOKesplC8XAYT85rOOTlgK0gdJMwgDKQ8tw4sdfgYpAnAbuPbYoyQKg==",
"requires": {
"busboy": "^0.2.14",
"md5": "^2.2.1",
"streamifier": "^0.1.1"
"busboy": "^0.2.14"
}
},
"express-session": {
@ -611,15 +665,6 @@
}
}
},
"express-validator": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/express-validator/-/express-validator-5.3.0.tgz",
"integrity": "sha512-HYVtPt21zp2bHS4+xwxYNF63dlq/23kh+ZRVfyo7SBObhOpRyZ0vWolm/v9KPUfCyLqX8j7ZP42dbB0MWjCCcA==",
"requires": {
"lodash": "^4.17.10",
"validator": "^10.4.0"
}
},
"finalhandler": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
@ -798,6 +843,11 @@
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
},
"isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
},
"js-stringify": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz",
@ -835,14 +885,13 @@
"resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
"integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc="
},
"md5": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz",
"integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=",
"lru-cache": {
"version": "4.1.5",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
"integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
"requires": {
"charenc": "~0.0.1",
"crypt": "~0.0.1",
"is-buffer": "~1.1.1"
"pseudomap": "^1.0.2",
"yallist": "^2.1.2"
}
},
"media-typer": {
@ -884,6 +933,19 @@
"mime-db": "~1.35.0"
}
},
"minimist": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
},
"mkdirp": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
"requires": {
"minimist": "0.0.8"
}
},
"mongodb": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.2.2.tgz",
@ -925,6 +987,21 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
},
"multer": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/multer/-/multer-1.4.1.tgz",
"integrity": "sha512-zzOLNRxzszwd+61JFuAo0fxdQfvku12aNJgnla0AQ+hHxFmfc/B7jBVuPr5Rmvu46Jze/iJrFpSOsD7afO8SDw==",
"requires": {
"append-field": "^1.0.0",
"busboy": "^0.2.11",
"concat-stream": "^1.5.2",
"mkdirp": "^0.5.1",
"object-assign": "^4.1.1",
"on-finished": "^2.3.0",
"type-is": "^1.6.4",
"xtend": "^4.0.0"
}
},
"negotiator": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
@ -953,6 +1030,11 @@
"resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
"integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c="
},
"os-tmpdir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
},
"parseurl": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
@ -987,6 +1069,11 @@
"resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
"integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
},
"process-nextick-args": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
"integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
},
"promise": {
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
@ -1004,6 +1091,11 @@
"ipaddr.js": "1.8.0"
}
},
"pseudomap": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
"integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
},
"pug": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/pug/-/pug-2.0.3.tgz",
@ -1144,6 +1236,20 @@
"unpipe": "1.0.0"
}
},
"readable-stream": {
"version": "2.3.6",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
"requires": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
"isarray": "~1.0.0",
"process-nextick-args": "~2.0.0",
"safe-buffer": "~5.1.1",
"string_decoder": "~1.1.1",
"util-deprecate": "~1.0.1"
}
},
"referrer-policy": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.1.0.tgz",
@ -1280,16 +1386,27 @@
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
"integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
},
"streamifier": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/streamifier/-/streamifier-0.1.1.tgz",
"integrity": "sha1-l+mNj6TRBdYqJpHR3AfoINuN/E8="
},
"streamsearch": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz",
"integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo="
},
"string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"requires": {
"safe-buffer": "~5.1.0"
}
},
"tmp": {
"version": "0.0.33",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
"integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
"requires": {
"os-tmpdir": "~1.0.2"
}
},
"to-fast-properties": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
@ -1314,6 +1431,11 @@
"mime-types": "~2.1.18"
}
},
"typedarray": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
"integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
},
"uglify-js": {
"version": "2.8.29",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
@ -1368,10 +1490,10 @@
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
"integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
},
"validator": {
"version": "10.7.1",
"resolved": "https://registry.npmjs.org/validator/-/validator-10.7.1.tgz",
"integrity": "sha512-tbB5JrTczfeHKLw3PnFRzGFlF1xUAwSgXEDb66EuX1ffCirspYpDEZo3Vc9j38gPdL4JKrDc5UPFfgYiw1IWRQ=="
"uuid": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
"integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="
},
"vary": {
"version": "1.1.2",
@ -1383,6 +1505,14 @@
"resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz",
"integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w="
},
"which": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
"integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
"requires": {
"isexe": "^2.0.0"
}
},
"window-size": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
@ -1407,6 +1537,16 @@
"resolved": "https://registry.npmjs.org/x-xss-protection/-/x-xss-protection-1.1.0.tgz",
"integrity": "sha512-rx3GzJlgEeZ08MIcDsU2vY2B1QEriUKJTSiNHHUIem6eg9pzVOr2TL3Y4Pd6TMAM5D5azGjcxqI62piITBDHVg=="
},
"xtend": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
"integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
},
"yallist": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
"integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
},
"yargs": {
"version": "3.10.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",

@ -4,19 +4,21 @@
"description": "",
"main": "server.js",
"dependencies": {
"@tohru/gm": "git+https://github.com/iCrawl/gm.git",
"body-parser": "^1.18.3",
"connect-mongo": "^2.0.3",
"cookie-parser": "^1.4.3",
"csurf": "^1.9.0",
"express": "^4.16.3",
"express-fileupload": "^1.0.0-alpha.1",
"express-fileupload": "^1.1.3-alpha.2",
"express-session": "^1.15.6",
"express-validator": "^5.3.0",
"fs": "0.0.1-security",
"helmet": "^3.13.0",
"mongodb": "^3.2.2",
"multer": "^1.4.1",
"path": "^0.12.7",
"pug": "^2.0.3"
"pug": "^2.0.3",
"uuid": "^3.3.2"
},
"devDependencies": {},
"scripts": {

@ -12,9 +12,9 @@ const express = require('express')
, csrf = require('csurf')
, bodyParser = require('body-parser')
, cookieParser = require('cookie-parser')
, upload = require('express-fileupload')
, configs = require(__dirname+'/configs/main.json')
, Mongo = require(__dirname+'/helpers/db.js');
, Mongo = require(__dirname+'/helpers/db.js')
, upload = require('express-fileupload');
(async () => {
@ -28,7 +28,7 @@ const express = require('express')
createParentPath: true,
safeFileNames: true,
preserveExtension: true,
limits: { fileSize: 50 * 1024 * 1024 },
limits: { fileSize: 1 * 1024 * 1024 },
abortOnLimit: true
}));
@ -56,10 +56,11 @@ const express = require('express')
app.use('/img', express.static(__dirname + '/static/img'));
// routes
app.use('/api', require(__dirname+'/controllers/api.js'))
app.use('/', require(__dirname+'/controllers/frontend.js'))
// after other routes 404
app.get('*', (req, res) => {
res.status(404).render('404')
})

@ -14,6 +14,7 @@ input, textarea {
font-family: arial, helvetica, sans-serif;
font-size: 10pt;
border-radius: 3px;
max-width:100%;
}
input textares {
@ -45,6 +46,10 @@ input textares {
margin-left: 0;
}
.post-image {
display: block;
}
.navbar {
border-bottom: 1px solid black;
margin: 0;

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

@ -11,6 +11,6 @@ form.form-post(action='/api/board/'+board._id, enctype='multipart/form-data', me
textarea#content(name='content', rows='8', cols='50', placeholder='message')
input#file(type='file', name='files' multiple)
input#file(type='file', name='file')
input(type='submit', value='submit')

@ -8,4 +8,7 @@ mixin post(board, post)
a(href=`/${board._id}/thread/${post._id}`) ##{post._id}
else
a(href=`/${board._id}/thread/${post.thread}#${post._id}`) ##{post._id}
p #{post.content}
if post.file
a(href='/img/'+post.file)
img.post-image(src='/img/thumb-'+post.file)
p(style='white-space: pre-wrap;') #{post.content}

Loading…
Cancel
Save