mirror of
https://github.com/BobbyWibowo/lolisafe.git
synced 2024-12-13 16:06:21 +00:00
7978325cd6
* Removed rimraf from dependency. Although really it'll still need to be used by other dependencies, such as eslint and bcrypt, so it'll still have to be downloaded by yarn either way. * Updated dashboard.css. Added "overflow: hidden" to thumbnail container. Previously potrait thumbnails will be visible outside of their container. * Removed notice about having "chunks" folder from config.sample.js. Added a line in lolisafe.js to create the folder if it doesn't exist instead. * Updated bcrypt to v2.0.0. I'm not really sure whatever has changed, but I've tested that it didn't require any additional changes for our current usage. * Chunks will no longer be saved with their original file's extension. Instead they'll only be saved as plain files named 0, 1, ..., n, without any extension whatsoever. Extension for joined chunks will be read from the original file's name in /api/upload/finishchunks. If the user doesn't pass that data when calling the API, the joined chunks will not have any extension. * Since rimraf has been removed, uploadsController.actuallyFinishChunks() will now use a combination of fs.unlink() and fs.rmdir(). Promise.all() will be used when running fs.unlink() so that all chunks will be deleted at the same time through multiple instances of async tasks (probably). * Some other small changes and tweaks in uploadController.js.
81 lines
3.0 KiB
JavaScript
81 lines
3.0 KiB
JavaScript
const config = require('./config.js')
|
|
const api = require('./routes/api.js')
|
|
const album = require('./routes/album.js')
|
|
const express = require('express')
|
|
const helmet = require('helmet')
|
|
const bodyParser = require('body-parser')
|
|
const RateLimit = require('express-rate-limit')
|
|
const db = require('knex')(config.database)
|
|
const fs = require('fs')
|
|
const exphbs = require('express-handlebars')
|
|
const safe = express()
|
|
|
|
require('./database/db.js')(db)
|
|
|
|
fs.existsSync('./pages/custom') || fs.mkdirSync('./pages/custom')
|
|
fs.existsSync('./' + config.logsFolder) || fs.mkdirSync('./' + config.logsFolder)
|
|
fs.existsSync('./' + config.uploads.folder) || fs.mkdirSync('./' + config.uploads.folder)
|
|
fs.existsSync('./' + config.uploads.folder + '/chunks') || fs.mkdirSync('./' + config.uploads.folder + '/chunks')
|
|
fs.existsSync('./' + config.uploads.folder + '/thumbs') || fs.mkdirSync('./' + config.uploads.folder + '/thumbs')
|
|
fs.existsSync('./' + config.uploads.folder + '/zips') || fs.mkdirSync('./' + config.uploads.folder + '/zips')
|
|
|
|
safe.use(helmet())
|
|
safe.set('trust proxy', 1)
|
|
|
|
safe.engine('handlebars', exphbs({ defaultLayout: 'main' }))
|
|
safe.set('view engine', 'handlebars')
|
|
safe.enable('view cache')
|
|
|
|
const limiter = new RateLimit({ windowMs: 5000, max: 2 })
|
|
safe.use('/api/login/', limiter)
|
|
safe.use('/api/register/', limiter)
|
|
|
|
safe.use(bodyParser.urlencoded({ extended: true }))
|
|
safe.use(bodyParser.json())
|
|
|
|
const setHeaders = (res, path, stat) => {
|
|
if (/\.(3gp|gif|jpg|jpeg|png|ico|wmv|avi|asf|asx|mpg|mpeg|mp4|pls|mp3|mid|wav|swf|flv|exe|zip|tar|rar|gz|tgz|bz2|uha|7z|doc|docx|xls|xlsx|pdf|iso|js|css|eot|svg|ttf|woff|woff2)$/.test(path)) {
|
|
res.set('Access-Control-Allow-Origin', '*')
|
|
res.set('Cache-Control', 'public, max-age=2592000, must-revalidate, proxy-revalidate, immutable, stale-while-revalidate=86400, stale-if-error=604800') // max-age: 30 days
|
|
}
|
|
}
|
|
|
|
if (config.serveFilesWithNode) {
|
|
safe.use('/', express.static(config.uploads.folder, { setHeaders }))
|
|
}
|
|
|
|
safe.use('/', express.static('./public', { setHeaders }))
|
|
safe.use('/', album)
|
|
safe.use('/api', api)
|
|
|
|
for (const page of config.pages) {
|
|
let root = './pages/'
|
|
if (fs.existsSync(`./pages/custom/${page}.html`)) {
|
|
root = './pages/custom/'
|
|
}
|
|
if (page === 'home') {
|
|
safe.get('/', (req, res, next) => res.sendFile(`${page}.html`, { root }))
|
|
} else {
|
|
safe.get(`/${page}`, (req, res, next) => res.sendFile(`${page}.html`, { root }))
|
|
}
|
|
}
|
|
|
|
// NOTE: Uses fiery.me branch of https://github.com/BobbyWibowo/HttpErrorPages
|
|
safe.use((req, res, next) => {
|
|
res.status(404).sendFile('HTTP404.html', { root: '../HttpErrorPages/dist/' })
|
|
})
|
|
safe.use((error, req, res, next) => {
|
|
console.error(error)
|
|
res.status(500).sendFile('HTTP505.html', { root: '../HttpErrorPages/dist/' })
|
|
})
|
|
|
|
safe.listen(config.port, () => console.log(`lolisafe started on port ${config.port}`))
|
|
|
|
process.on('uncaughtException', error => {
|
|
console.error(`Uncaught Exception:\n${error.stack}`)
|
|
})
|
|
|
|
process.on('unhandledRejection', error => {
|
|
console.error(`Unhandled Rejection (Promise):\n${error.stack}`)
|
|
})
|