Swaf upgrade: fix compilation errors
This commit is contained in:
parent
973110f1a4
commit
21bd0a42d0
74
src/App.ts
74
src/App.ts
@ -1,45 +1,46 @@
|
|||||||
import Application from "wms-core/Application";
|
import Application from "swaf/Application";
|
||||||
import {Type} from "wms-core/Utils";
|
import Migration, {MigrationType} from "swaf/db/Migration";
|
||||||
import Migration from "wms-core/db/Migration";
|
import CreateMigrationsTable from "swaf/migrations/CreateMigrationsTable";
|
||||||
import CreateMigrationsTable from "wms-core/migrations/CreateMigrationsTable";
|
import ExpressAppComponent from "swaf/components/ExpressAppComponent";
|
||||||
import CreateLogsTable from "wms-core/migrations/CreateLogsTable";
|
import NunjucksComponent from "swaf/components/NunjucksComponent";
|
||||||
import ExpressAppComponent from "wms-core/components/ExpressAppComponent";
|
import MysqlComponent from "swaf/components/MysqlComponent";
|
||||||
import NunjucksComponent from "wms-core/components/NunjucksComponent";
|
import LogRequestsComponent from "swaf/components/LogRequestsComponent";
|
||||||
import MysqlComponent from "wms-core/components/MysqlComponent";
|
import RedisComponent from "swaf/components/RedisComponent";
|
||||||
import LogRequestsComponent from "wms-core/components/LogRequestsComponent";
|
import ServeStaticDirectoryComponent from "swaf/components/ServeStaticDirectoryComponent";
|
||||||
import RedisComponent from "wms-core/components/RedisComponent";
|
import MaintenanceComponent from "swaf/components/MaintenanceComponent";
|
||||||
import ServeStaticDirectoryComponent from "wms-core/components/ServeStaticDirectoryComponent";
|
import MailComponent from "swaf/components/MailComponent";
|
||||||
import MaintenanceComponent from "wms-core/components/MaintenanceComponent";
|
import SessionComponent from "swaf/components/SessionComponent";
|
||||||
import MailComponent from "wms-core/components/MailComponent";
|
import FormHelperComponent from "swaf/components/FormHelperComponent";
|
||||||
import SessionComponent from "wms-core/components/SessionComponent";
|
import CsrfProtectionComponent from "swaf/components/CsrfProtectionComponent";
|
||||||
import FormHelperComponent from "wms-core/components/FormHelperComponent";
|
import WebSocketServerComponent from "swaf/components/WebSocketServerComponent";
|
||||||
import CsrfProtectionComponent from "wms-core/components/CsrfProtectionComponent";
|
|
||||||
import WebSocketServerComponent from "wms-core/components/WebSocketServerComponent";
|
|
||||||
import AboutController from "./controllers/AboutController";
|
import AboutController from "./controllers/AboutController";
|
||||||
import AutoUpdateComponent from "wms-core/components/AutoUpdateComponent";
|
import AutoUpdateComponent from "swaf/components/AutoUpdateComponent";
|
||||||
import AuthController from "./controllers/AuthController";
|
import AuthController from "./controllers/AuthController";
|
||||||
import MagicLinkWebSocketListener from "wms-core/auth/magic_link/MagicLinkWebSocketListener";
|
import MagicLinkWebSocketListener from "swaf/auth/magic_link/MagicLinkWebSocketListener";
|
||||||
import MagicLinkController from "./controllers/MagicLinkController";
|
import MagicLinkController from "./controllers/MagicLinkController";
|
||||||
import MailController from "wms-core/auth/MailController";
|
import MailController from "swaf/auth/MailController";
|
||||||
import FileController from "./controllers/FileController";
|
import FileController from "./controllers/FileController";
|
||||||
import CreateUsersAndUserEmailsTable from "wms-core/auth/migrations/CreateUsersAndUserEmailsTable";
|
import CreateUsersAndUserEmailsTable from "swaf/auth/migrations/CreateUsersAndUserEmailsTable";
|
||||||
import CreateMagicLinksTable from "wms-core/auth/migrations/CreateMagicLinksTable";
|
import CreateMagicLinksTable from "swaf/auth/migrations/CreateMagicLinksTable";
|
||||||
import CreateAuthTokensTable from "./migrations/CreateAuthTokensTable";
|
import CreateAuthTokensTable from "./migrations/CreateAuthTokensTable";
|
||||||
import AuthComponent from "wms-core/auth/AuthComponent";
|
import AuthComponent from "swaf/auth/AuthComponent";
|
||||||
import AuthGuard from "wms-core/auth/AuthGuard";
|
import AuthGuard from "swaf/auth/AuthGuard";
|
||||||
import MagicLink from "wms-core/auth/models/MagicLink";
|
import MagicLink from "swaf/auth/models/MagicLink";
|
||||||
import AuthToken from "./models/AuthToken";
|
import AuthToken from "./models/AuthToken";
|
||||||
import {MagicLinkActionType} from "./controllers/MagicLinkActionType";
|
import {MagicLinkActionType} from "./controllers/MagicLinkActionType";
|
||||||
import {Request} from "express";
|
import {Request} from "express";
|
||||||
import CreateFilesTable from "./migrations/CreateFilesTable";
|
import CreateFilesTable from "./migrations/CreateFilesTable";
|
||||||
import IncreaseFilesSizeField from "./migrations/IncreaseFilesSizeField";
|
import IncreaseFilesSizeField from "./migrations/IncreaseFilesSizeField";
|
||||||
import AddApprovedFieldToUsersTable from "wms-core/auth/migrations/AddApprovedFieldToUsersTable";
|
import AddApprovedFieldToUsersTable from "swaf/auth/migrations/AddApprovedFieldToUsersTable";
|
||||||
import CreateUrlRedirectsTable from "./migrations/CreateUrlRedirectsTable";
|
import CreateUrlRedirectsTable from "./migrations/CreateUrlRedirectsTable";
|
||||||
import AuthTokenController from "./controllers/AuthTokenController";
|
import AuthTokenController from "./controllers/AuthTokenController";
|
||||||
import URLRedirectController from "./controllers/URLRedirectController";
|
import URLRedirectController from "./controllers/URLRedirectController";
|
||||||
import LinkController from "./controllers/LinkController";
|
import LinkController from "./controllers/LinkController";
|
||||||
import BackendController from "wms-core/helpers/BackendController";
|
import BackendController from "swaf/helpers/BackendController";
|
||||||
import RedirectBackComponent from "wms-core/components/RedirectBackComponent";
|
import RedirectBackComponent from "swaf/components/RedirectBackComponent";
|
||||||
|
import DummyMigration from "swaf/migrations/DummyMigration";
|
||||||
|
import DropLegacyLogsTable from "swaf/migrations/DropLegacyLogsTable";
|
||||||
|
import {Session} from "express-session";
|
||||||
import packageJson = require('../package.json');
|
import packageJson = require('../package.json');
|
||||||
|
|
||||||
export default class App extends Application {
|
export default class App extends Application {
|
||||||
@ -53,7 +54,7 @@ export default class App extends Application {
|
|||||||
protected getMigrations(): MigrationType<Migration>[] {
|
protected getMigrations(): MigrationType<Migration>[] {
|
||||||
return [
|
return [
|
||||||
CreateMigrationsTable,
|
CreateMigrationsTable,
|
||||||
CreateLogsTable,
|
DummyMigration,
|
||||||
CreateUsersAndUserEmailsTable,
|
CreateUsersAndUserEmailsTable,
|
||||||
CreateMagicLinksTable,
|
CreateMagicLinksTable,
|
||||||
CreateAuthTokensTable,
|
CreateAuthTokensTable,
|
||||||
@ -61,6 +62,7 @@ export default class App extends Application {
|
|||||||
IncreaseFilesSizeField,
|
IncreaseFilesSizeField,
|
||||||
AddApprovedFieldToUsersTable,
|
AddApprovedFieldToUsersTable,
|
||||||
CreateUrlRedirectsTable,
|
CreateUrlRedirectsTable,
|
||||||
|
DropLegacyLogsTable,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -102,8 +104,11 @@ export default class App extends Application {
|
|||||||
this.use(redisComponent);
|
this.use(redisComponent);
|
||||||
this.use(new SessionComponent(redisComponent));
|
this.use(new SessionComponent(redisComponent));
|
||||||
this.use(new AuthComponent(new class extends AuthGuard<MagicLink | AuthToken> {
|
this.use(new AuthComponent(new class extends AuthGuard<MagicLink | AuthToken> {
|
||||||
public async getProofForSession(session: Express.Session): Promise<any | null> {
|
public async getProofForSession(session: Session): Promise<any | null> {
|
||||||
return await MagicLink.bySessionID(session.id, [MagicLinkActionType.LOGIN, MagicLinkActionType.REGISTER]);
|
return await MagicLink.bySessionId(
|
||||||
|
session.id,
|
||||||
|
[MagicLinkActionType.LOGIN, MagicLinkActionType.REGISTER],
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async getProofForRequest(req: Request): Promise<MagicLink | AuthToken | null> {
|
public async getProofForRequest(req: Request): Promise<MagicLink | AuthToken | null> {
|
||||||
@ -119,7 +124,7 @@ export default class App extends Application {
|
|||||||
|
|
||||||
return super.getProofForRequest(req);
|
return super.getProofForRequest(req);
|
||||||
}
|
}
|
||||||
}));
|
}(this)));
|
||||||
|
|
||||||
// Utils
|
// Utils
|
||||||
this.use(new FormHelperComponent());
|
this.use(new FormHelperComponent());
|
||||||
@ -132,8 +137,7 @@ export default class App extends Application {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private registerWebSocketListeners() {
|
private registerWebSocketListeners() {
|
||||||
this.magicLinkWebSocketListener = new MagicLinkWebSocketListener();
|
this.use(new MagicLinkWebSocketListener());
|
||||||
this.use(this.magicLinkWebSocketListener);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private registerControllers() {
|
private registerControllers() {
|
||||||
@ -142,7 +146,7 @@ export default class App extends Application {
|
|||||||
|
|
||||||
// Priority
|
// Priority
|
||||||
this.use(new AuthController());
|
this.use(new AuthController());
|
||||||
this.use(new MagicLinkController(this.magicLinkWebSocketListener!));
|
this.use(new MagicLinkController(this.as<MagicLinkWebSocketListener<this>>(MagicLinkWebSocketListener)));
|
||||||
this.use(new BackendController());
|
this.use(new BackendController());
|
||||||
|
|
||||||
// Core functionality
|
// Core functionality
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import {cryptoRandomDictionary} from "wms-core/Utils";
|
import {cryptoRandomDictionary} from "swaf/Utils";
|
||||||
import config from "config";
|
import config from "config";
|
||||||
import FileModel from "./models/FileModel";
|
import FileModel from "./models/FileModel";
|
||||||
import {ServerError} from "wms-core/HttpError";
|
import {ServerError} from "swaf/HttpError";
|
||||||
|
|
||||||
const SLUG_DICTIONARY = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
|
const SLUG_DICTIONARY = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
|
||||||
export default async function generateSlug(tries: number): Promise<string> {
|
export default async function generateSlug(tries: number): Promise<string> {
|
||||||
@ -14,4 +14,4 @@ export default async function generateSlug(tries: number): Promise<string> {
|
|||||||
i++;
|
i++;
|
||||||
} while (i < tries);
|
} while (i < tries);
|
||||||
throw new ServerError('Failed to generate slug; newly generated slug size should be increased by 1.');
|
throw new ServerError('Failed to generate slug; newly generated slug size should be increased by 1.');
|
||||||
};
|
};
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import Controller from "wms-core/Controller";
|
import Controller from "swaf/Controller";
|
||||||
import {Request, Response} from "express";
|
import {Request, Response} from "express";
|
||||||
|
|
||||||
export default class AboutController extends Controller {
|
export default class AboutController extends Controller {
|
||||||
@ -10,4 +10,4 @@ export default class AboutController extends Controller {
|
|||||||
private async getAbout(req: Request, res: Response) {
|
private async getAbout(req: Request, res: Response) {
|
||||||
res.render('about');
|
res.render('about');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
import MagicLinkAuthController from "wms-core/auth/magic_link/MagicLinkAuthController";
|
import MagicLinkAuthController from "swaf/auth/magic_link/MagicLinkAuthController";
|
||||||
import {MAGIC_LINK_MAIL} from "wms-core/Mails";
|
import {MAGIC_LINK_MAIL} from "swaf/Mails";
|
||||||
|
|
||||||
export default class AuthController extends MagicLinkAuthController {
|
export default class AuthController extends MagicLinkAuthController {
|
||||||
public constructor() {
|
public constructor() {
|
||||||
super(MAGIC_LINK_MAIL);
|
super(MAGIC_LINK_MAIL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,18 +1,19 @@
|
|||||||
import Controller from "wms-core/Controller";
|
import Controller from "swaf/Controller";
|
||||||
import {REQUIRE_AUTH_MIDDLEWARE} from "wms-core/auth/AuthComponent";
|
import {RequireAuthMiddleware} from "swaf/auth/AuthComponent";
|
||||||
import {Request, Response} from "express";
|
import {Request, Response} from "express";
|
||||||
import AuthToken from "../models/AuthToken";
|
import AuthToken from "../models/AuthToken";
|
||||||
import {BadRequestError, ForbiddenHttpError, NotFoundHttpError} from "wms-core/HttpError";
|
import {BadRequestError, ForbiddenHttpError, NotFoundHttpError} from "swaf/HttpError";
|
||||||
|
|
||||||
export default class AuthTokenController extends Controller {
|
export default class AuthTokenController extends Controller {
|
||||||
routes(): void {
|
routes(): void {
|
||||||
this.post('/gen-auth-token', this.postGenAuthToken, 'generate-token', REQUIRE_AUTH_MIDDLEWARE);
|
this.post('/gen-auth-token', this.postGenAuthToken, 'generate-token', RequireAuthMiddleware);
|
||||||
this.post('/revoke-auth-token/:id', this.postRevokeAuthToken, 'revoke-token', REQUIRE_AUTH_MIDDLEWARE);
|
this.post('/revoke-auth-token/:id', this.postRevokeAuthToken, 'revoke-token', RequireAuthMiddleware);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async postGenAuthToken(req: Request, res: Response): Promise<void> {
|
protected async postGenAuthToken(req: Request, res: Response): Promise<void> {
|
||||||
|
const user = req.as(RequireAuthMiddleware).getUser();
|
||||||
const authToken = AuthToken.create({
|
const authToken = AuthToken.create({
|
||||||
user_id: req.models.user!.id,
|
user_id: user.id,
|
||||||
ttl: req.body.ttl ? parseInt(req.body.ttl) : 365 * 24 * 3600,
|
ttl: req.body.ttl ? parseInt(req.body.ttl) : 365 * 24 * 3600,
|
||||||
});
|
});
|
||||||
await authToken.save();
|
await authToken.save();
|
||||||
@ -26,11 +27,13 @@ export default class AuthTokenController extends Controller {
|
|||||||
|
|
||||||
const authToken = await AuthToken.getById<AuthToken>(parseInt(id));
|
const authToken = await AuthToken.getById<AuthToken>(parseInt(id));
|
||||||
if (!authToken) throw new NotFoundHttpError('Auth token', req.url);
|
if (!authToken) throw new NotFoundHttpError('Auth token', req.url);
|
||||||
if (!authToken.canDelete(req.models.user!.id!)) throw new ForbiddenHttpError('auth token', req.url);
|
|
||||||
|
const user = req.as(RequireAuthMiddleware).getUser();
|
||||||
|
if (!authToken.canDelete(user.getOrFail('id'))) throw new ForbiddenHttpError('auth token', req.url);
|
||||||
|
|
||||||
await authToken.delete();
|
await authToken.delete();
|
||||||
|
|
||||||
req.flash('success', 'Successfully deleted auth token.');
|
req.flash('success', 'Successfully deleted auth token.');
|
||||||
res.redirectBack(Controller.route('file-upload'));
|
res.redirectBack(Controller.route('file-upload'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,31 +1,32 @@
|
|||||||
import Controller from "wms-core/Controller";
|
import Controller from "swaf/Controller";
|
||||||
import {REQUIRE_AUTH_MIDDLEWARE} from "wms-core/auth/AuthComponent";
|
import {RequireAuthMiddleware} from "swaf/auth/AuthComponent";
|
||||||
import {NextFunction, Request, Response} from "express";
|
import {NextFunction, Request, Response} from "express";
|
||||||
import {BadRequestError, ForbiddenHttpError, ServerError} from "wms-core/HttpError";
|
import {BadRequestError, ForbiddenHttpError, ServerError} from "swaf/HttpError";
|
||||||
import FileModel from "../models/FileModel";
|
import FileModel from "../models/FileModel";
|
||||||
import config from "config";
|
import config from "config";
|
||||||
import * as fs from "fs";
|
import * as fs from "fs";
|
||||||
import AuthToken from "../models/AuthToken";
|
import AuthToken from "../models/AuthToken";
|
||||||
import {IncomingForm} from "formidable";
|
import {IncomingForm} from "formidable";
|
||||||
import generateSlug from "../SlugGenerator";
|
import generateSlug from "../SlugGenerator";
|
||||||
import Logger from "wms-core/Logger";
|
import {log} from "swaf/Logger";
|
||||||
import FileUploadMiddleware from "wms-core/FileUploadMiddleware";
|
import FileUploadMiddleware from "swaf/FileUploadMiddleware";
|
||||||
|
|
||||||
|
|
||||||
export default class FileController extends Controller {
|
export default class FileController extends Controller {
|
||||||
routes(): void {
|
routes(): void {
|
||||||
this.get('/files/upload', this.getFileUploader, 'file-upload', REQUIRE_AUTH_MIDDLEWARE);
|
this.get('/files/upload', this.getFileUploader, 'file-upload', RequireAuthMiddleware);
|
||||||
this.get('/files/upload/script', this.downloadLinuxScript, 'file-linux-script');
|
this.get('/files/upload/script', this.downloadLinuxScript, 'file-linux-script');
|
||||||
this.post('/files/post', this.postFileFrontend, 'post-file-frontend', REQUIRE_AUTH_MIDDLEWARE, FILE_UPLOAD_FORM_MIDDLEWARE);
|
this.post('/files/post', this.postFileFrontend, 'post-file-frontend', RequireAuthMiddleware, FileUploadFormMiddleware);
|
||||||
this.get('/files/:page([0-9]+)?', this.getFileManager, 'file-manager', REQUIRE_AUTH_MIDDLEWARE);
|
this.get('/files/:page([0-9]+)?', this.getFileManager, 'file-manager', RequireAuthMiddleware);
|
||||||
this.post('/files/delete/:slug', FileController.deleteFileRoute, 'delete-file-frontend', REQUIRE_AUTH_MIDDLEWARE);
|
this.post('/files/delete/:slug', FileController.deleteFileRoute, 'delete-file-frontend', RequireAuthMiddleware);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async getFileUploader(req: Request, res: Response): Promise<void> {
|
protected async getFileUploader(req: Request, res: Response): Promise<void> {
|
||||||
const allowedDomains = config.get<string[]>('allowed_url_domains');
|
const allowedDomains = config.get<string[]>('allowed_url_domains');
|
||||||
|
const user = req.as(RequireAuthMiddleware).getUser();
|
||||||
res.render('file-upload', {
|
res.render('file-upload', {
|
||||||
max_upload_size: config.get<string>('max_upload_size'),
|
max_upload_size: config.get<string>('max_upload_size'),
|
||||||
auth_tokens: await AuthToken.select().where('user_id', req.models.user!.id!).get(),
|
auth_tokens: await AuthToken.select().where('user_id', user.id).get(),
|
||||||
allowed_domains: allowedDomains,
|
allowed_domains: allowedDomains,
|
||||||
default_domain: allowedDomains[config.get<number>('default_url_domain_for_files')],
|
default_domain: allowedDomains[config.get<number>('default_url_domain_for_files')],
|
||||||
});
|
});
|
||||||
@ -36,8 +37,9 @@ export default class FileController extends Controller {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected async getFileManager(req: Request, res: Response): Promise<void> {
|
protected async getFileManager(req: Request, res: Response): Promise<void> {
|
||||||
|
const user = req.as(RequireAuthMiddleware).getUser();
|
||||||
res.render('file-manager', {
|
res.render('file-manager', {
|
||||||
files: await FileModel.paginateForUser(req, 100, req.models.user!.id!),
|
files: await FileModel.paginateForUser(req, 100, user.getOrFail('id')),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -52,7 +54,7 @@ export default class FileController extends Controller {
|
|||||||
throw new BadRequestError('No file received.', 'You must upload exactly one (1) file.', req.url);
|
throw new BadRequestError('No file received.', 'You must upload exactly one (1) file.', req.url);
|
||||||
}
|
}
|
||||||
|
|
||||||
let upload = req.files['upload'];
|
const upload = req.files['upload'];
|
||||||
|
|
||||||
// TTL
|
// TTL
|
||||||
let ttl = config.get<number>('default_file_ttl');
|
let ttl = config.get<number>('default_file_ttl');
|
||||||
@ -60,8 +62,10 @@ export default class FileController extends Controller {
|
|||||||
if (req.body.ttl !== undefined) ttl = parseInt(req.body.ttl);
|
if (req.body.ttl !== undefined) ttl = parseInt(req.body.ttl);
|
||||||
else if (req.body.expire_after_days !== undefined) ttl = parseInt(req.body.expire_after_days) * 24 * 3600;
|
else if (req.body.expire_after_days !== undefined) ttl = parseInt(req.body.expire_after_days) * 24 * 3600;
|
||||||
|
|
||||||
|
const user = req.as(RequireAuthMiddleware).getUser();
|
||||||
|
|
||||||
const file = FileModel.create({
|
const file = FileModel.create({
|
||||||
user_id: req.models.user!.id,
|
user_id: user.id,
|
||||||
slug: slug,
|
slug: slug,
|
||||||
real_name: upload.name,
|
real_name: upload.name,
|
||||||
storage_type: 'local',
|
storage_type: 'local',
|
||||||
@ -93,7 +97,9 @@ export default class FileController extends Controller {
|
|||||||
|
|
||||||
const file = await FileModel.getBySlug(req.params.slug);
|
const file = await FileModel.getBySlug(req.params.slug);
|
||||||
if (!file) return next();
|
if (!file) return next();
|
||||||
if (!file.canDelete(req.models.user!.id!)) throw new ForbiddenHttpError('file', req.url);
|
|
||||||
|
const user = req.as(RequireAuthMiddleware).getUser();
|
||||||
|
if (!file.canDelete(user.getOrFail('id'))) throw new ForbiddenHttpError('file', req.url);
|
||||||
|
|
||||||
switch (file.storage_type) {
|
switch (file.storage_type) {
|
||||||
case 'local':
|
case 'local':
|
||||||
@ -118,13 +124,20 @@ export default class FileController extends Controller {
|
|||||||
public static async deleteFile(file: FileModel): Promise<void> {
|
public static async deleteFile(file: FileModel): Promise<void> {
|
||||||
fs.unlinkSync(file.storage_path!);
|
fs.unlinkSync(file.storage_path!);
|
||||||
await file.delete();
|
await file.delete();
|
||||||
Logger.info('Deleted', file.storage_path, `(${file.real_name})`);
|
log.info('Deleted', file.storage_path, `(${file.real_name})`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const FILE_UPLOAD_FORM_MIDDLEWARE = new FileUploadMiddleware(() => {
|
export class FileUploadFormMiddleware extends FileUploadMiddleware {
|
||||||
const form = new IncomingForm();
|
protected getDefaultField(): string {
|
||||||
form.uploadDir = 'storage/tmp';
|
return 'upload';
|
||||||
form.maxFileSize = config.get<number>('max_upload_size') * 1024 * 1024;
|
}
|
||||||
return form;
|
|
||||||
}, 'upload');
|
protected makeForm(): IncomingForm {
|
||||||
|
const form = new IncomingForm();
|
||||||
|
form.uploadDir = 'storage/tmp';
|
||||||
|
form.maxFileSize = config.get<number>('max_upload_size') * 1024 * 1024;
|
||||||
|
return form;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -1,29 +1,29 @@
|
|||||||
import Controller from "wms-core/Controller";
|
import Controller from "swaf/Controller";
|
||||||
import {NextFunction, Request, Response} from "express";
|
import {NextFunction, Request, Response} from "express";
|
||||||
import {BadRequestError, NotFoundHttpError, ServerError} from "wms-core/HttpError";
|
import {BadRequestError, NotFoundHttpError, ServerError} from "swaf/HttpError";
|
||||||
import config from "config";
|
import config from "config";
|
||||||
import {REQUIRE_REQUEST_AUTH_MIDDLEWARE} from "wms-core/auth/AuthComponent";
|
import {RequireRequestAuthMiddleware} from "swaf/auth/AuthComponent";
|
||||||
import URLRedirect from "../models/URLRedirect";
|
import URLRedirect from "../models/URLRedirect";
|
||||||
import URLRedirectController from "./URLRedirectController";
|
import URLRedirectController from "./URLRedirectController";
|
||||||
import FileModel from "../models/FileModel";
|
import FileModel from "../models/FileModel";
|
||||||
import generateSlug from "../SlugGenerator";
|
import generateSlug from "../SlugGenerator";
|
||||||
import FileController, {FILE_UPLOAD_FORM_MIDDLEWARE} from "./FileController";
|
import FileController, {FileUploadFormMiddleware} from "./FileController";
|
||||||
import * as fs from "fs";
|
import * as fs from "fs";
|
||||||
import {encodeRFC5987ValueChars} from "../Utils";
|
import {encodeRFC5987ValueChars} from "../Utils";
|
||||||
import {promisify} from "util";
|
import {promisify} from "util";
|
||||||
import Logger from "wms-core/Logger";
|
import {log} from "swaf/Logger";
|
||||||
|
|
||||||
export default class LinkController extends Controller {
|
export default class LinkController extends Controller {
|
||||||
routes(): void {
|
routes(): void {
|
||||||
this.post('/', this.postFile, 'post-file', REQUIRE_REQUEST_AUTH_MIDDLEWARE, FILE_UPLOAD_FORM_MIDDLEWARE);
|
this.post('/', this.postFile, 'post-file', RequireRequestAuthMiddleware, FileUploadFormMiddleware);
|
||||||
this.delete('/:slug', FileController.deleteFileRoute, 'delete-file', REQUIRE_REQUEST_AUTH_MIDDLEWARE);
|
this.delete('/:slug', FileController.deleteFileRoute, 'delete-file', RequireRequestAuthMiddleware);
|
||||||
this.get('/:slug', this.getFile, 'get-file');
|
this.get('/:slug', this.getFile, 'get-file');
|
||||||
this.put('/:slug', this.putFile, 'put-file', REQUIRE_REQUEST_AUTH_MIDDLEWARE, FILE_UPLOAD_FORM_MIDDLEWARE);
|
this.put('/:slug', this.putFile, 'put-file', RequireRequestAuthMiddleware, FileUploadFormMiddleware);
|
||||||
|
|
||||||
this.post('/', URLRedirectController.addURL, 'post-url', REQUIRE_REQUEST_AUTH_MIDDLEWARE);
|
this.post('/', URLRedirectController.addURL, 'post-url', RequireRequestAuthMiddleware);
|
||||||
this.delete('/:slug', this.deleteURL, 'delete-url', REQUIRE_REQUEST_AUTH_MIDDLEWARE);
|
this.delete('/:slug', this.deleteURL, 'delete-url', RequireRequestAuthMiddleware);
|
||||||
this.get('/:slug', this.getURLRedirect, 'get-url');
|
this.get('/:slug', this.getURLRedirect, 'get-url');
|
||||||
this.put('/:slug', URLRedirectController.addURL, 'put-url', REQUIRE_REQUEST_AUTH_MIDDLEWARE);
|
this.put('/:slug', URLRedirectController.addURL, 'put-url', RequireRequestAuthMiddleware);
|
||||||
|
|
||||||
this.get(/(.*)/, this.domainFilter);
|
this.get(/(.*)/, this.domainFilter);
|
||||||
}
|
}
|
||||||
@ -45,7 +45,7 @@ export default class LinkController extends Controller {
|
|||||||
|
|
||||||
// If file is bigger than max hotlink size, fallback to express download
|
// If file is bigger than max hotlink size, fallback to express download
|
||||||
if (stats.size > config.get<number>('max_hotlink_size') * 1024 * 1024) {
|
if (stats.size > config.get<number>('max_hotlink_size') * 1024 * 1024) {
|
||||||
Logger.info(`Fallback to express download for file of size ${stats.size}`);
|
log.info(`Fallback to express download for file of size ${stats.size}`);
|
||||||
return res.download(file.storage_path!, fileName);
|
return res.download(file.storage_path!, fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import MagicLink from "wms-core/auth/models/MagicLink";
|
import MagicLink from "swaf/auth/models/MagicLink";
|
||||||
|
|
||||||
export enum MagicLinkActionType {
|
export enum MagicLinkActionType {
|
||||||
LOGIN = 'Login',
|
LOGIN = 'Login',
|
||||||
@ -6,7 +6,7 @@ export enum MagicLinkActionType {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function getActionMessage(magicLink: MagicLink): string {
|
export function getActionMessage(magicLink: MagicLink): string {
|
||||||
switch (magicLink.getActionType()) {
|
switch (magicLink.action_type) {
|
||||||
case MagicLinkActionType.LOGIN:
|
case MagicLinkActionType.LOGIN:
|
||||||
return 'You have been authenticated.';
|
return 'You have been authenticated.';
|
||||||
case MagicLinkActionType.REGISTER:
|
case MagicLinkActionType.REGISTER:
|
||||||
@ -14,4 +14,4 @@ export function getActionMessage(magicLink: MagicLink): string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
@ -1,22 +1,24 @@
|
|||||||
import _MagicLinkController from "wms-core/auth/magic_link/MagicLinkController";
|
import _MagicLinkController from "swaf/auth/magic_link/MagicLinkController";
|
||||||
import {Request, Response} from "express";
|
import {Request, Response} from "express";
|
||||||
import Controller from "wms-core/Controller";
|
import Controller from "swaf/Controller";
|
||||||
import MagicLinkWebSocketListener from "wms-core/auth/magic_link/MagicLinkWebSocketListener";
|
import MagicLinkWebSocketListener from "swaf/auth/magic_link/MagicLinkWebSocketListener";
|
||||||
import MagicLink from "wms-core/auth/models/MagicLink";
|
import MagicLink from "swaf/auth/models/MagicLink";
|
||||||
import AuthController from "./AuthController";
|
import AuthController from "./AuthController";
|
||||||
import {MagicLinkActionType} from "./MagicLinkActionType";
|
import {MagicLinkActionType} from "./MagicLinkActionType";
|
||||||
|
import App from "../App";
|
||||||
|
import AuthComponent from "swaf/auth/AuthComponent";
|
||||||
|
|
||||||
export default class MagicLinkController extends _MagicLinkController {
|
export default class MagicLinkController extends _MagicLinkController<App> {
|
||||||
constructor(magicLinkWebSocketListener: MagicLinkWebSocketListener) {
|
constructor(magicLinkWebSocketListener: MagicLinkWebSocketListener<App>) {
|
||||||
super(magicLinkWebSocketListener);
|
super(magicLinkWebSocketListener);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async performAction(magicLink: MagicLink, req: Request, res: Response): Promise<void> {
|
protected async performAction(magicLink: MagicLink, req: Request, res: Response): Promise<void> {
|
||||||
switch (magicLink.getActionType()) {
|
switch (magicLink.action_type) {
|
||||||
case MagicLinkActionType.LOGIN:
|
case MagicLinkActionType.LOGIN:
|
||||||
case MagicLinkActionType.REGISTER:
|
case MagicLinkActionType.REGISTER:
|
||||||
await AuthController.checkAndAuth(req, res, magicLink);
|
await AuthController.checkAndAuth(req, res, magicLink);
|
||||||
const proof = await req.authGuard.isAuthenticated(req.session!);
|
const proof = await this.getApp().as(AuthComponent).getAuthGuard().isAuthenticated(req.session!);
|
||||||
const user = await proof?.getResource();
|
const user = await proof?.getResource();
|
||||||
|
|
||||||
if (!res.headersSent && user) {
|
if (!res.headersSent && user) {
|
||||||
@ -27,4 +29,4 @@ export default class MagicLinkController extends _MagicLinkController {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,23 +1,24 @@
|
|||||||
import Controller from "wms-core/Controller";
|
import Controller from "swaf/Controller";
|
||||||
import {NextFunction, Request, Response} from "express";
|
import {NextFunction, Request, Response} from "express";
|
||||||
import URLRedirect from "../models/URLRedirect";
|
import URLRedirect from "../models/URLRedirect";
|
||||||
import {REQUIRE_AUTH_MIDDLEWARE} from "wms-core/auth/AuthComponent";
|
import {RequireAuthMiddleware} from "swaf/auth/AuthComponent";
|
||||||
import generateSlug from "../SlugGenerator";
|
import generateSlug from "../SlugGenerator";
|
||||||
import config from "config";
|
import config from "config";
|
||||||
import AuthToken from "../models/AuthToken";
|
import AuthToken from "../models/AuthToken";
|
||||||
|
|
||||||
export default class URLRedirectController extends Controller {
|
export default class URLRedirectController extends Controller {
|
||||||
routes(): void {
|
routes(): void {
|
||||||
this.get('/url/shrink', this.getURLShrinker, 'url-shrinker', REQUIRE_AUTH_MIDDLEWARE);
|
this.get('/url/shrink', this.getURLShrinker, 'url-shrinker', RequireAuthMiddleware);
|
||||||
this.get('/url/shrink/script', this.downloadLinuxScript, 'url-linux-script');
|
this.get('/url/shrink/script', this.downloadLinuxScript, 'url-linux-script');
|
||||||
this.post('/url/shrink', this.addURLFrontend, 'shrink-url', REQUIRE_AUTH_MIDDLEWARE);
|
this.post('/url/shrink', this.addURLFrontend, 'shrink-url', RequireAuthMiddleware);
|
||||||
this.get('/urls/:page([0-9]+)?', this.getURLRedirectManager, 'url-manager', REQUIRE_AUTH_MIDDLEWARE);
|
this.get('/urls/:page([0-9]+)?', this.getURLRedirectManager, 'url-manager', RequireAuthMiddleware);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async getURLShrinker(req: Request, res: Response): Promise<void> {
|
protected async getURLShrinker(req: Request, res: Response): Promise<void> {
|
||||||
|
const user = req.as(RequireAuthMiddleware).getUser();
|
||||||
const allowedDomains = config.get<string[]>('allowed_url_domains');
|
const allowedDomains = config.get<string[]>('allowed_url_domains');
|
||||||
res.render('url-shrinker', {
|
res.render('url-shrinker', {
|
||||||
auth_tokens: await AuthToken.select().where('user_id', req.models.user!.id!).get(),
|
auth_tokens: await AuthToken.select().where('user_id', user.id).get(),
|
||||||
allowed_domains: allowedDomains,
|
allowed_domains: allowedDomains,
|
||||||
default_domain: allowedDomains[config.get<number>('default_url_domain_for_urls')],
|
default_domain: allowedDomains[config.get<number>('default_url_domain_for_urls')],
|
||||||
});
|
});
|
||||||
@ -28,8 +29,9 @@ export default class URLRedirectController extends Controller {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected async getURLRedirectManager(req: Request, res: Response): Promise<void> {
|
protected async getURLRedirectManager(req: Request, res: Response): Promise<void> {
|
||||||
|
const user = req.as(RequireAuthMiddleware).getUser();
|
||||||
res.render('url-manager', {
|
res.render('url-manager', {
|
||||||
urls: await URLRedirect.paginateForUser(req, 100, req.models.user!.id!),
|
urls: await URLRedirect.paginateForUser(req, 100, user.getOrFail('id')),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -41,9 +43,10 @@ export default class URLRedirectController extends Controller {
|
|||||||
public static async addURL(req: Request, res: Response, next: NextFunction, slug?: string): Promise<void> {
|
public static async addURL(req: Request, res: Response, next: NextFunction, slug?: string): Promise<void> {
|
||||||
if (req.body.type !== 'url') return next();
|
if (req.body.type !== 'url') return next();
|
||||||
|
|
||||||
|
const user = req.as(RequireAuthMiddleware).getUser();
|
||||||
slug = slug || req.params.slug || req.body.slug || await generateSlug(10);
|
slug = slug || req.params.slug || req.body.slug || await generateSlug(10);
|
||||||
const urlRedirect = URLRedirect.create({
|
const urlRedirect = URLRedirect.create({
|
||||||
user_id: req.models.user!.id,
|
user_id: user.id,
|
||||||
slug: slug,
|
slug: slug,
|
||||||
target_url: req.body.target_url,
|
target_url: req.body.target_url,
|
||||||
});
|
});
|
||||||
@ -63,4 +66,4 @@ export default class URLRedirectController extends Controller {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import {Connection} from "mysql";
|
import {Connection} from "mysql";
|
||||||
import Migration from "wms-core/db/Migration";
|
import Migration from "swaf/db/Migration";
|
||||||
import ModelFactory from "wms-core/db/ModelFactory";
|
import ModelFactory from "swaf/db/ModelFactory";
|
||||||
import AuthToken from "../models/AuthToken";
|
import AuthToken from "../models/AuthToken";
|
||||||
|
|
||||||
export default class CreateAuthTokensTable extends Migration {
|
export default class CreateAuthTokensTable extends Migration {
|
||||||
@ -25,4 +25,4 @@ export default class CreateAuthTokensTable extends Migration {
|
|||||||
ModelFactory.register(AuthToken);
|
ModelFactory.register(AuthToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import {Connection} from "mysql";
|
import {Connection} from "mysql";
|
||||||
import Migration from "wms-core/db/Migration";
|
import Migration from "swaf/db/Migration";
|
||||||
import ModelFactory from "wms-core/db/ModelFactory";
|
import ModelFactory from "swaf/db/ModelFactory";
|
||||||
import FileModel from "../models/FileModel";
|
import FileModel from "../models/FileModel";
|
||||||
|
|
||||||
export default class CreateFilesTable extends Migration {
|
export default class CreateFilesTable extends Migration {
|
||||||
@ -27,4 +27,4 @@ export default class CreateFilesTable extends Migration {
|
|||||||
public registerModels(): void {
|
public registerModels(): void {
|
||||||
ModelFactory.register(FileModel);
|
ModelFactory.register(FileModel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import Migration from "wms-core/db/Migration";
|
import Migration from "swaf/db/Migration";
|
||||||
import {Connection} from "mysql";
|
import {Connection} from "mysql";
|
||||||
import ModelFactory from "wms-core/db/ModelFactory";
|
import ModelFactory from "swaf/db/ModelFactory";
|
||||||
import URLRedirect from "../models/URLRedirect";
|
import URLRedirect from "../models/URLRedirect";
|
||||||
|
|
||||||
export default class CreateUrlRedirectsTable extends Migration {
|
export default class CreateUrlRedirectsTable extends Migration {
|
||||||
@ -23,4 +23,4 @@ export default class CreateUrlRedirectsTable extends Migration {
|
|||||||
public registerModels(): void {
|
public registerModels(): void {
|
||||||
ModelFactory.register(URLRedirect);
|
ModelFactory.register(URLRedirect);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import Migration from "wms-core/db/Migration";
|
import Migration from "swaf/db/Migration";
|
||||||
import {Connection} from "mysql";
|
import {Connection} from "mysql";
|
||||||
|
|
||||||
export default class IncreaseFilesSizeField extends Migration {
|
export default class IncreaseFilesSizeField extends Migration {
|
||||||
@ -12,4 +12,4 @@ export default class IncreaseFilesSizeField extends Migration {
|
|||||||
|
|
||||||
public registerModels(): void {
|
public registerModels(): void {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import Model from "wms-core/db/Model";
|
import Model from "swaf/db/Model";
|
||||||
import AuthProof from "wms-core/auth/AuthProof";
|
import AuthProof from "swaf/auth/AuthProof";
|
||||||
import User from "wms-core/auth/models/User";
|
import User from "swaf/auth/models/User";
|
||||||
import {cryptoRandomDictionary} from "wms-core/Utils";
|
import {cryptoRandomDictionary} from "swaf/Utils";
|
||||||
|
|
||||||
export default class AuthToken extends Model implements AuthProof<User> {
|
export default class AuthToken extends Model implements AuthProof<User> {
|
||||||
public id?: number = undefined;
|
public id?: number = undefined;
|
||||||
@ -18,8 +18,6 @@ export default class AuthToken extends Model implements AuthProof<User> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected async autoFill(): Promise<void> {
|
protected async autoFill(): Promise<void> {
|
||||||
await super.autoFill();
|
|
||||||
|
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
if (!this.secret) this['secret'] = cryptoRandomDictionary(64, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_');
|
if (!this.secret) this['secret'] = cryptoRandomDictionary(64, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_');
|
||||||
}
|
}
|
||||||
@ -53,4 +51,4 @@ export default class AuthToken extends Model implements AuthProof<User> {
|
|||||||
public async revoke(): Promise<void> {
|
public async revoke(): Promise<void> {
|
||||||
await this.delete();
|
await this.delete();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import Model from "wms-core/db/Model";
|
import Model from "swaf/db/Model";
|
||||||
import Controller from "wms-core/Controller";
|
import Controller from "swaf/Controller";
|
||||||
import config from "config";
|
import config from "config";
|
||||||
import User from "wms-core/auth/models/User";
|
import User from "swaf/auth/models/User";
|
||||||
import {Request} from "express";
|
import {Request} from "express";
|
||||||
import URLRedirect from "./URLRedirect";
|
import URLRedirect from "./URLRedirect";
|
||||||
|
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
import Model from "wms-core/db/Model";
|
import Model from "swaf/db/Model";
|
||||||
import User from "wms-core/auth/models/User";
|
import User from "swaf/auth/models/User";
|
||||||
import FileModel from "./FileModel";
|
import FileModel from "./FileModel";
|
||||||
import {Request} from "express";
|
import {Request} from "express";
|
||||||
import config from "config";
|
import config from "config";
|
||||||
import Controller from "wms-core/Controller";
|
import Controller from "swaf/Controller";
|
||||||
|
|
||||||
export default class URLRedirect extends Model {
|
export default class URLRedirect extends Model {
|
||||||
public static get table(): string {
|
public static get table(): string {
|
||||||
@ -35,4 +35,4 @@ export default class URLRedirect extends Model {
|
|||||||
slug: this.slug!,
|
slug: this.slug!,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user