index.ts 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import type { NextFunction, Request, Response } from 'express';
  2. import { query, validationResult } from 'express-validator';
  3. import { FilterXSS } from 'xss';
  4. import type { LsxApiOptions } from '../interfaces/api';
  5. import { listPages } from './routes/list-pages';
  6. const loginRequiredFallback = (req: Request, res: Response) => {
  7. return res.status(403).send('login required');
  8. };
  9. const filterXSS = new FilterXSS();
  10. const lsxValidator = [
  11. query('pagePath').notEmpty().isString(),
  12. query('offset').optional().isInt().toInt(),
  13. query('limit').optional().isInt().toInt(),
  14. query('options')
  15. .optional()
  16. .customSanitizer((options) => {
  17. try {
  18. const jsonData: LsxApiOptions = JSON.parse(options);
  19. Object.keys(jsonData).forEach((key) => {
  20. jsonData[key] = filterXSS.process(jsonData[key]);
  21. });
  22. return jsonData;
  23. }
  24. catch (err) {
  25. throw new Error('Invalid JSON format in options');
  26. }
  27. }),
  28. query('options.*').optional().isString(),
  29. ];
  30. const paramValidator = (req: Request, res: Response, next: NextFunction) => {
  31. const errObjArray = validationResult(req);
  32. if (errObjArray.isEmpty()) {
  33. return next();
  34. }
  35. const errs = errObjArray.array().map((err) => {
  36. return new Error(`Invalid lsx parameter: ${err.param}: ${err.msg}`);
  37. });
  38. res.status(400).json({ errors: errs.map(err => err.message) });
  39. };
  40. // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any
  41. const middleware = (crowi: any, app: any): void => {
  42. const loginRequired = crowi.require('../middlewares/login-required')(crowi, true, loginRequiredFallback);
  43. const accessTokenParser = crowi.accessTokenParser;
  44. app.get('/_api/lsx', accessTokenParser, loginRequired, lsxValidator, paramValidator, listPages);
  45. };
  46. export default middleware;