Simple file uploading, no automatic cleanup yet
This commit is contained in:
parent
13a6db44a9
commit
1b250435bb
@ -18,6 +18,8 @@ async function init () {
|
|||||||
.then(db => db.migrate({ migrationsPath: path.join(__dirname, 'migrations') }))
|
.then(db => db.migrate({ migrationsPath: path.join(__dirname, 'migrations') }))
|
||||||
|
|
||||||
router.get('/:hash', async (req, res, next) => {
|
router.get('/:hash', async (req, res, next) => {
|
||||||
|
if (!req.params.hash) return res.status(400).send('Invalid request')
|
||||||
|
|
||||||
let db = await dbPromise
|
let db = await dbPromise
|
||||||
let translation = await db.get('SELECT * FROM Translation WHERE translation = ?', req.params.hash)
|
let translation = await db.get('SELECT * FROM Translation WHERE translation = ?', req.params.hash)
|
||||||
if (!translation) return res.status(404).end()
|
if (!translation) return res.status(404).end()
|
||||||
|
1
applications/tempfiles/.gitignore
vendored
Normal file
1
applications/tempfiles/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
*.db
|
115
applications/tempfiles/index.js
Normal file
115
applications/tempfiles/index.js
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
const express = require('express')
|
||||||
|
const multiparty = require('multiparty')
|
||||||
|
const path = require('path')
|
||||||
|
const fsa = require('fs')
|
||||||
|
const fs = fsa.promises
|
||||||
|
const sqlite = require('sqlite')
|
||||||
|
|
||||||
|
const router = express.Router()
|
||||||
|
const cfgLoader = require(path.join('..', '..', 'config-loader'))(path.join(__dirname, 'config.json'), {
|
||||||
|
database: 'index.db',
|
||||||
|
root: './files',
|
||||||
|
expiry: 2246400,
|
||||||
|
baseurl: 'https://i.lunasqu.ee/',
|
||||||
|
tokens: {}
|
||||||
|
})
|
||||||
|
|
||||||
|
function asyncForm (req, form) {
|
||||||
|
return new Promise(function (resolve, reject) {
|
||||||
|
form.parse(req, function(err, fields, files) {
|
||||||
|
if (err) return reject(err)
|
||||||
|
resolve({ fields, files })
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
async function init () {
|
||||||
|
let config = await cfgLoader
|
||||||
|
let root = path.resolve(config.root)
|
||||||
|
let baseurl = config.baseurl
|
||||||
|
|
||||||
|
await fs.access(root, fsa.constants.F_OK)
|
||||||
|
|
||||||
|
const dbPromise = Promise.resolve()
|
||||||
|
.then(() => sqlite.open(path.join(__dirname, config.database), { Promise, cache: true }))
|
||||||
|
.then(db => db.migrate({ migrationsPath: path.join(__dirname, 'migrations') }))
|
||||||
|
|
||||||
|
router.get('/:hash', async (req, res, next) => {
|
||||||
|
if (!req.params.hash) return res.status(400).send('Invalid request')
|
||||||
|
|
||||||
|
let db = await dbPromise
|
||||||
|
let file = await db.get('SELECT * FROM File WHERE path = ?', req.params.hash)
|
||||||
|
if (!file) return res.status(404).end()
|
||||||
|
|
||||||
|
res.header('Cache-Control', 'max-age=' + 7 * 24 * 60 * 60 * 1000)
|
||||||
|
res.sendFile(path.join(root, file.path))
|
||||||
|
})
|
||||||
|
|
||||||
|
router.post('/publish', async (req, res, next) => {
|
||||||
|
let token = req.header('token') || req.body.token
|
||||||
|
if (!token || !config.tokens[token]) return res.status(402).send('Forbidden')
|
||||||
|
|
||||||
|
// Handle multipart data
|
||||||
|
let form = new multiparty.Form()
|
||||||
|
let { fields, files } = await asyncForm(req, form)
|
||||||
|
|
||||||
|
// Detect all files
|
||||||
|
let allFiles = []
|
||||||
|
for (let i in files) {
|
||||||
|
for (let j in files[i]) {
|
||||||
|
allFiles.push(files[i][j])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!allFiles.length) return res.status(400).send('Invalid request')
|
||||||
|
|
||||||
|
// Determine real IP address
|
||||||
|
let ip
|
||||||
|
if (req.header('x-forwarded-for')) {
|
||||||
|
ip = req.header('x-forwarded-for')
|
||||||
|
} else {
|
||||||
|
ip = req.connection.remoteAddress
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('[%s] from %s request to upload %d file(s)', new Date(), ip, allFiles.length)
|
||||||
|
|
||||||
|
// Handle all files provided
|
||||||
|
let db = await dbPromise
|
||||||
|
let uploadedFiles = []
|
||||||
|
for (let i in allFiles) {
|
||||||
|
let file = allFiles[i]
|
||||||
|
let fname = file.originalFilename
|
||||||
|
let target = path.join(root, fname)
|
||||||
|
|
||||||
|
// Handle already exists case (overwrite)
|
||||||
|
try {
|
||||||
|
await fs.access(target, fsa.constants.F_OK)
|
||||||
|
await fs.unlink(target)
|
||||||
|
await fs.copyFile(file.path, target)
|
||||||
|
await fs.unlink(file.path)
|
||||||
|
|
||||||
|
await db.run('UPDATE File SET ip = ?, upload = ? WHERE path = ?', ip, new Date(), fname)
|
||||||
|
|
||||||
|
uploadedFiles.push(baseurl + fname)
|
||||||
|
continue
|
||||||
|
} catch (e) {
|
||||||
|
if (e.code !== 'ENOENT') throw e
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy to target and unlink temporary file
|
||||||
|
await fs.copyFile(file.path, target)
|
||||||
|
await fs.unlink(file.path)
|
||||||
|
|
||||||
|
await db.run('INSERT INTO File (path,ip,upload) VALUES (?,?,?)', fname, ip, new Date())
|
||||||
|
uploadedFiles.push(baseurl + fname)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (uploadedFiles.length === 0) return res.status(400).send('No files were uploaded')
|
||||||
|
|
||||||
|
res.send(uploadedFiles.join('\n'))
|
||||||
|
})
|
||||||
|
|
||||||
|
return router
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = init
|
10
applications/tempfiles/migrations/001-initial.sql
Normal file
10
applications/tempfiles/migrations/001-initial.sql
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
-- Up
|
||||||
|
|
||||||
|
CREATE TABLE File (
|
||||||
|
path TEXT,
|
||||||
|
ip TEXT,
|
||||||
|
upload TEXT
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Down
|
||||||
|
DROP TABLE File;
|
@ -12,6 +12,8 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"body-parser": "^1.18.3",
|
"body-parser": "^1.18.3",
|
||||||
"express": "^4.16.4",
|
"express": "^4.16.4",
|
||||||
|
"express-async-errors": "^3.1.1",
|
||||||
|
"multiparty": "^4.2.1",
|
||||||
"sqlite": "^3.0.1"
|
"sqlite": "^3.0.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,9 @@ const fsPromises = fs.promises
|
|||||||
|
|
||||||
const app = express()
|
const app = express()
|
||||||
|
|
||||||
let apps = process.env.APPS ? JSON.parse(process.env.APPS) : ['highlight-termbin', 'dyndns', 'distrib-ipfs']
|
require('express-async-errors')
|
||||||
|
|
||||||
|
let apps = process.env.APPS ? JSON.parse(process.env.APPS) : ['highlight-termbin', 'dyndns', 'tempfiles']
|
||||||
let sock = process.env.SOCKET || '/tmp/serve-lunasqu.ee.t.sock'
|
let sock = process.env.SOCKET || '/tmp/serve-lunasqu.ee.t.sock'
|
||||||
|
|
||||||
app.enable('trust proxy', 1)
|
app.enable('trust proxy', 1)
|
||||||
@ -52,6 +54,11 @@ async function init () {
|
|||||||
|
|
||||||
try { await fsPromises.unlink(sock) } catch (e) {}
|
try { await fsPromises.unlink(sock) } catch (e) {}
|
||||||
|
|
||||||
|
app.use(function (err, req, res, next) {
|
||||||
|
console.error(err)
|
||||||
|
res.status(500).end('Server error')
|
||||||
|
})
|
||||||
|
|
||||||
app.listen(sock, function () {
|
app.listen(sock, function () {
|
||||||
console.log('Started server on', sock)
|
console.log('Started server on', sock)
|
||||||
})
|
})
|
||||||
|
Loading…
Reference in New Issue
Block a user