60 lines
2.7 KiB
TypeScript
60 lines
2.7 KiB
TypeScript
import config from "config";
|
|
import {Request, Response} from "express";
|
|
import {RequireAuthMiddleware} from "swaf/auth/AuthComponent";
|
|
import {route} from "swaf/common/Routing";
|
|
import Controller from "swaf/Controller";
|
|
import {BadRequestError, ForbiddenHttpError, NotFoundHttpError} from "swaf/HttpError";
|
|
|
|
import AuthToken from "../models/AuthToken.js";
|
|
|
|
export default class AuthTokenController extends Controller {
|
|
public routes(): void {
|
|
this.get('/auth-tokens/:page?', this.getAuthTokens, 'auth-tokens', RequireAuthMiddleware);
|
|
this.post('/gen-auth-token', this.postGenAuthToken, 'generate-token', RequireAuthMiddleware);
|
|
this.post('/revoke-auth-token/:id', this.postRevokeAuthToken, 'revoke-token', RequireAuthMiddleware);
|
|
}
|
|
|
|
public async getAuthTokens(req: Request, res: Response): Promise<void> {
|
|
const allowedDomains = config.get<string[]>('allowed_url_domains');
|
|
const user = req.as(RequireAuthMiddleware).getUser();
|
|
const authTokens = await AuthToken.paginateForUser(req, 25, user.getOrFail('id'));
|
|
res.render('auth-tokens', {
|
|
allowed_domains: allowedDomains,
|
|
default_domain: allowedDomains[config.get<number>('default_url_domain_for_files')],
|
|
auth_tokens: authTokens.map(token => ({
|
|
...token,
|
|
created_at: token.created_at?.toISOString(),
|
|
used_at: token.used_at?.toISOString(),
|
|
})),
|
|
pagination: authTokens.pagination?.serialize(),
|
|
});
|
|
}
|
|
|
|
protected async postGenAuthToken(req: Request, res: Response): Promise<void> {
|
|
const user = req.as(RequireAuthMiddleware).getUser();
|
|
const authToken = AuthToken.create({
|
|
user_id: user.id,
|
|
ttl: req.body.ttl ? parseInt(req.body.ttl) : 365 * 24 * 3600,
|
|
});
|
|
await authToken.save();
|
|
req.flash('success', 'Successfully created auth token.');
|
|
res.redirect(req.getPreviousUrl() || route('file-uploader'));
|
|
}
|
|
|
|
protected async postRevokeAuthToken(req: Request, res: Response): Promise<void> {
|
|
const id = req.params.id;
|
|
if (!id) throw new BadRequestError('Cannot revoke token without an id.', 'Please provide an id.', req.url);
|
|
|
|
const authToken = await AuthToken.getById<AuthToken>(parseInt(id));
|
|
if (!authToken) throw new NotFoundHttpError('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();
|
|
|
|
req.flash('success', 'Successfully deleted auth token.');
|
|
res.redirect(req.getPreviousUrl() || route('file-uploader'));
|
|
}
|
|
}
|