save-server
Version:
A powerful ShareX image and URL server, with support for multiple users.
97 lines (77 loc) • 2.48 kB
JavaScript
// Main server file
;
const express = require("express");
const path = require("path");
const files = require("./api/files");
const users = require("./api/users");
const links = require("./api/url");
const auth = require("./middleware/auth");
const csrf = require("./middleware/csrf");
const ratelimit = require("./middleware/ratelimit");
const { errorHandler } = require("./util");
const bodyParser = require("body-parser");
const cookie = require("cookie-parser");
const { version } = require("../package");
const app = express();
// Global middleware
app.set("view engine", "ejs");
app.enable("trust proxy");
app.use(bodyParser.json());
app.use(cookie());
app.set("x-powered-by", false);
// Client
const client = path.join(__dirname, "client");
const pages = path.join(client, "pages");
app.use("/css", express.static(path.join(client, "css")));
app.use("/js", express.static(path.join(client, "js")));
app.use("/favicon.ico", express.static(path.join(client, "favicon.ico")));
let limit = 1000;
if (process.env.ratelimit !== undefined) {
limit = parseInt(process.env.ratelimit, 10);
}
// Routes
// Global rate limit per minute
app.use(ratelimit(limit, 60));
app.use("/api/files", files.router);
app.use("/api/links", links);
app.use(csrf);
app.use("/api/users", users);
app.use("/api/links", links);
app.use("/u", links);
// Main routes
const getLoc = (n) => path.join(pages, `${n}.ejs`);
app.get("/", (req, res) => {
const runningHours = process.uptime() / (60 * 60);
return res.render(getLoc("index"), {
runningFor: (Math.floor(runningHours * 10) / 10), // uptime in hours, rounded to 1 decimal
version
});
});
app.get("/login", (req, res) => res.render(getLoc("login")));
app.post("/login", (req, res) => res.render(getLoc("login")));
app.use("/dashboard", auth.redirect);
app.get("/dashboard", async (req, res) => {
res.render(getLoc("dashboard"), {
user: {
username: req.user.username,
isAdmin: req.user.isAdmin
}
});
});
app.use("/short", auth.redirect);
app.get("/short", async (req, res) => {
res.render(getLoc("short"));
});
app.get("/:id", files.getFile);
// Error handling
app.use(errorHandler);
app.use(function (_req, res) {
res.status(404).render(getLoc(404));
});
process.on("uncaughtException", err => {
console.error("There was an uncaught error", err);
});
module.exports = function (port = 80) {
app.listen(port, () => console.log(`SaveServer running on port ${port}!`));
app.set("port", port);
};