This commit is contained in:
waveringana 2023-11-18 12:53:15 -05:00
parent 807e50388a
commit 832189a346
10 changed files with 518 additions and 299 deletions

View file

@ -1,64 +1,80 @@
import crypto from "crypto";
import express from "express";
import passport from "passport";
import {Strategy as LocalStrategy} from "passport-local";
import { Strategy as LocalStrategy } from "passport-local";
import {User} from "../lib/lib";
import {db, UserRow} from "../lib/db";
import { User } from "../lib/lib";
import { db, UserRow } from "../lib/db";
const router = express.Router();
passport.use(new LocalStrategy(function verify(username, password, cb) {
db.get("SELECT * FROM users WHERE username = ?", [username], function(err: Error, row: UserRow) {
if (err) {
return cb(err);
}
if (!row) {
return cb(null, false, {
message: "Incorrect username or password."
});
}
passport.use(
new LocalStrategy(function verify(username, password, cb) {
db.get(
"SELECT * FROM users WHERE username = ?",
[username],
function (err: Error, row: UserRow) {
if (err) {
return cb(err);
}
if (!row) {
return cb(null, false, {
message: "Incorrect username or password.",
});
}
crypto.pbkdf2(password, row.salt, 310000, 32, "sha256", function(err, hashedPassword) {
if (err) {
return cb(err);
}
if (!crypto.timingSafeEqual(row.hashed_password, hashedPassword)) {
return cb(null, false, {
message: "Incorrect username or password."
});
}
return cb(null, row);
});
});
}));
crypto.pbkdf2(
password,
row.salt,
310000,
32,
"sha256",
function (err, hashedPassword) {
if (err) {
return cb(err);
}
if (!crypto.timingSafeEqual(row.hashed_password, hashedPassword)) {
return cb(null, false, {
message: "Incorrect username or password.",
});
}
return cb(null, row);
},
);
},
);
}),
);
passport.serializeUser(function(user:User, cb) {
process.nextTick(function() {
passport.serializeUser(function (user: User, cb) {
process.nextTick(function () {
cb(null, {
id: user.id,
username: user.username
username: user.username,
});
});
});
passport.deserializeUser(function(user:User, cb) {
process.nextTick(function() {
passport.deserializeUser(function (user: User, cb) {
process.nextTick(function () {
return cb(null, user);
});
});
router.get("/login", function(req, res) {
router.get("/login", function (req, res) {
res.render("login");
});
router.post("/login/password", passport.authenticate("local", {
successRedirect: "/",
failureRedirect: "/login"
}));
router.post(
"/login/password",
passport.authenticate("local", {
successRedirect: "/",
failureRedirect: "/login",
}),
);
router.post("/logout", function(req, res, next) {
req.logout(function(err) {
router.post("/logout", function (req, res, next) {
req.logout(function (err) {
if (err) {
return next(err);
}

View file

@ -1,33 +1,47 @@
import type {RequestHandler as Middleware, Request, Response, NextFunction} from "express";
import type {
RequestHandler as Middleware,
Request,
Response,
NextFunction,
} from "express";
import multer from "multer";
import express from "express";
import imageProbe from "probe-image-size";
import {ffProbe} from "../lib/ffmpeg";
import { ffProbe } from "../lib/ffmpeg";
import fs from "fs";
import {extension, videoExtensions} from "../lib/lib";
import {db, MediaRow, getPath, deleteId} from "../lib/db";
import {fileStorage} from "../lib/multer";
import {checkAuth, checkSharexAuth, convertTo720p, createEmbedData, handleUpload} from "../lib/middleware";
import { extension, videoExtensions } from "../lib/lib";
import { db, MediaRow, getPath, deleteId } from "../lib/db";
import { fileStorage } from "../lib/multer";
import {
checkAuth,
checkSharexAuth,
convertTo720p,
createEmbedData,
handleUpload,
} from "../lib/middleware";
const upload = multer({ storage: fileStorage /**, fileFilter: fileFilter**/ }); //maybe make this a env variable?
/**Middleware to grab media from media database */
const fetchMedia: Middleware = (req, res, next) => {
const admin: boolean = req.user.username == "admin" ? true : false;
/**Check if the user is an admin, if so, show all posts from all users */
const query: string = admin == true ? "SELECT * FROM media" : `SELECT * FROM media WHERE username = '${req.user.username}'`;
const query: string =
admin == true
? "SELECT * FROM media"
: `SELECT * FROM media WHERE username = '${req.user.username}'`;
db.all(query, (err:Error, rows: []) => {
db.all(query, (err: Error, rows: []) => {
if (err) return next(err);
const files = rows.map((row: MediaRow)=> {
const files = rows.map((row: MediaRow) => {
return {
id: row.id,
path: row.path,
expire: row.expire,
username: row.username,
url: "/" + row.id
url: "/" + row.id,
};
});
res.locals.files = files.reverse(); //reverse so newest files appear first
@ -38,63 +52,118 @@ const fetchMedia: Middleware = (req, res, next) => {
const router = express.Router();
router.get("/", (req: Request, res: Response, next: NextFunction) => {
if (!req.user)
return res.render("home");
next();
}, fetchMedia, (req: Request, res: Response) => {
res.locals.filter = null;
res.render("index", { user: req.user });
});
router.get(
"/",
(req: Request, res: Response, next: NextFunction) => {
if (!req.user) return res.render("home");
next();
},
fetchMedia,
(req: Request, res: Response) => {
res.locals.filter = null;
res.render("index", { user: req.user });
},
);
router.get("/gifv/:file", async (req: Request, res: Response, next: NextFunction) => {
const url = `${req.protocol}://${req.get("host")}/uploads/${req.params.file}`;
let width; let height;
router.get(
"/gifv/:file",
async (req: Request, res: Response, next: NextFunction) => {
const url = `${req.protocol}://${req.get("host")}/uploads/${
req.params.file
}`;
let width;
let height;
const nameAndExtension = extension(`uploads/${req.params.file}`);
if (nameAndExtension[1] == ".mp4" || nameAndExtension[1] == ".mov" || nameAndExtension[1] == ".webm" || nameAndExtension[1] == ".gif") {
let imageData = ffProbe(`uploads/${req.params.file}`, nameAndExtension[0], nameAndExtension[1]);
const nameAndExtension = extension(`uploads/${req.params.file}`);
if (
nameAndExtension[1] == ".mp4" ||
nameAndExtension[1] == ".mov" ||
nameAndExtension[1] == ".webm" ||
nameAndExtension[1] == ".gif"
) {
const imageData = ffProbe(
`uploads/${req.params.file}`,
nameAndExtension[0],
nameAndExtension[1],
);
width = (await imageData).streams[0].width;
height = (await imageData).streams[0].height;
width = (await imageData).streams[0].width;
height = (await imageData).streams[0].height;
return res.render("gifv", { url: url, host: `${req.protocol}://${req.get("host")}`, width: width, height: height });
} else {
const imageData = await imageProbe(fs.createReadStream(`uploads/${req.params.file}`));
return res.render("gifv", { url: url, host: `${req.protocol}://${req.get("host")}`, width: imageData.width, height: imageData.height });
}
});
return res.render("gifv", {
url: url,
host: `${req.protocol}://${req.get("host")}`,
width: width,
height: height,
});
} else {
const imageData = await imageProbe(
fs.createReadStream(`uploads/${req.params.file}`),
);
return res.render("gifv", {
url: url,
host: `${req.protocol}://${req.get("host")}`,
width: imageData.width,
height: imageData.height,
});
}
},
);
router.post("/", [checkAuth, upload.array("fileupload"), convertTo720p, createEmbedData, handleUpload], (req: Request, res: Response) => {
res.redirect("/");
});
router.post(
"/",
[
checkAuth,
upload.array("fileupload"),
convertTo720p,
createEmbedData,
handleUpload,
],
(req: Request, res: Response) => {
res.redirect("/");
},
);
router.post("/sharex", [checkSharexAuth, upload.single("fileupload"), createEmbedData, handleUpload], (req: Request, res: Response) => {
return res.send(`${req.protocol}://${req.get("host")}/uploads/${req.file.filename}`);
});
router.post(
"/sharex",
[checkSharexAuth, upload.single("fileupload"), createEmbedData, handleUpload],
(req: Request, res: Response) => {
return res.send(
`${req.protocol}://${req.get("host")}/uploads/${req.file.filename}`,
);
},
);
router.post("/:id(\\d+)/delete", [checkAuth], async (req: Request, res: Response) => {
const path: any = await getPath(req.params.id);
router.post(
"/:id(\\d+)/delete",
[checkAuth],
async (req: Request, res: Response) => {
const path: any = await getPath(req.params.id);
const nameAndExtension = extension(path.path);
const nameAndExtension = extension(path.path);
const filesToDelete = [path.path, "oembed-" + path.path + ".json"];
const filesToDelete = [path.path, "oembed-" + path.path + ".json"];
if (videoExtensions.includes(nameAndExtension[1]) || nameAndExtension[1] == ".gif") {
filesToDelete.push("720p-" + path.path);
}
if (
videoExtensions.includes(nameAndExtension[1]) ||
nameAndExtension[1] == ".gif"
) {
filesToDelete.push("720p-" + path.path);
}
filesToDelete.forEach(path => {
fs.unlink(path, async (err) => {
console.log(`Deleting ${path}`);
if (err && err.errno == -4058) {
filesToDelete.forEach((path) => {
fs.unlink(path, async (err) => {
console.log(`Deleting ${path}`);
if (err && err.errno == -4058) {
await deleteId("media", req.params.id);
}
await deleteId("media", req.params.id);
}
await deleteId("media", req.params.id);
});
});
});
return res.redirect("/");
});
return res.redirect("/");
},
);
export default router;
export default router;