75 lines
2.4 KiB
JavaScript
75 lines
2.4 KiB
JavaScript
var express = require("express");
|
|
var formidable = require("formidable");
|
|
var serveIndex = require("serve-index");
|
|
var randomipa = require("random-ip");
|
|
var path = require("path");
|
|
var fs = require("fs");
|
|
|
|
|
|
const BASE_BLOCK = process.env.BASE_BLOCK || "2607:5600:c6:203::/64", BASE_IPA = BASE_BLOCK.split('/')[0], BASE_PREFIX = BASE_BLOCK.split('/')[1];
|
|
|
|
|
|
const FILES_DIR = "files";
|
|
const AUTH_TOKEN = fs.readFileSync("auth.txt", "utf8").trim();
|
|
var app = express();
|
|
|
|
app.use((req, res, next)=>{
|
|
console.log(`[${new Date().toLocaleString()}]`, '📥', req.socket.remoteAddress, `"${req.method} ${req.url} HTTP/${req.httpVersion}"`, JSON.stringify(req.headers));
|
|
res.on("finish", () => {
|
|
console.log(`[${new Date().toLocaleString()}]`, '📤', res.statusCode, res.statusMessage, JSON.stringify(res.getHeaders()));
|
|
});
|
|
next();
|
|
});
|
|
|
|
app.post("/upload", (req, res, next) => {
|
|
if (req.headers.authentication != AUTH_TOKEN) return res.status(403).send("Unauthorized");
|
|
var form = new formidable.IncomingForm({
|
|
maxFileSize: 2**30, // 1 GiB
|
|
maxFields: 1,
|
|
uploadDir: "tmp"
|
|
});
|
|
form.parse(req, function(err, fields, files) {
|
|
if (err) return next(err);
|
|
var file = files.file;
|
|
if (!file) return res.sendStatus(400);
|
|
do {
|
|
var ipv6 = randomipa(BASE_IPA, BASE_PREFIX);
|
|
var filedir = path.join(FILES_DIR, `[${ipv6}]`);
|
|
} while ( fs.existsSync(filedir) && !console.log("oof") );
|
|
try {
|
|
fs.mkdirSync(filedir);
|
|
fs.renameSync(file.path, path.join(filedir, file.name));
|
|
} catch(e) {
|
|
return next(e);
|
|
}
|
|
require("child_process").execSync(`ip addr add ${ipv6} dev eth0`);
|
|
fs.appendFileSync("@reboot.sh", `ip addr add ${ipv6} dev eth0\n`); // :lul:
|
|
res.send(`http://[${ipv6}]/`);
|
|
});
|
|
});
|
|
|
|
app.get("*", function(req, res, next){
|
|
let filecode = req.headers.host;
|
|
let webroot = path.join(FILES_DIR, filecode);
|
|
let webrootdirlist = fs.readdirSync(webroot);
|
|
if (webrootdirlist.length > 1) {
|
|
req.url = path.join(filecode, req.url);
|
|
next();
|
|
} else if (webrootdirlist.length == 1) {
|
|
res.sendFile(webrootdirlist[0], {
|
|
root: path.join(process.cwd(), webroot),
|
|
headers: {"Content-Disposition": `filename=${webrootdirlist[0]}`}
|
|
});
|
|
} else {
|
|
res.sendStatus(204);
|
|
}
|
|
});
|
|
|
|
app.get("*", express.static(FILES_DIR), serveIndex(FILES_DIR, {icons: true}));
|
|
|
|
app.use(function (error, req, res, next) {
|
|
res.status(error.code == "ENOENT" ? 404 : console.error(error.stack) || 500).send(error.toString());
|
|
});
|
|
|
|
app.listen(process.env.PORT || 80, process.env.ADDRESS || "::");
|