index.ts 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import { SCOPE } from '@growi/core/dist/interfaces';
  2. import type { NextFunction, Request, Response } from 'express';
  3. import { query, validationResult } from 'express-validator';
  4. import { FilterXSS } from 'xss';
  5. import type { LsxApiOptions } from '../interfaces/api';
  6. import { listPages } from './routes/list-pages';
  7. const loginRequiredFallback = (_req: Request, res: Response) => {
  8. return res.status(403).send('login required');
  9. };
  10. const filterXSS = new FilterXSS();
  11. const lsxValidator = [
  12. query('pagePath').notEmpty().isString(),
  13. query('offset').optional().isInt().toInt(),
  14. query('limit').optional().isInt().toInt(),
  15. query('options')
  16. .optional()
  17. .customSanitizer((options) => {
  18. try {
  19. const jsonData: LsxApiOptions =
  20. typeof options === 'string' ? JSON.parse(options) : options;
  21. for (const key in jsonData) {
  22. jsonData[key] = filterXSS.process(jsonData[key]);
  23. }
  24. return jsonData;
  25. } catch {
  26. throw new Error('Invalid JSON format in options');
  27. }
  28. }),
  29. query('options.*').optional().isString(),
  30. ];
  31. const paramValidator = (req: Request, res: Response, next: NextFunction) => {
  32. const errObjArray = validationResult(req);
  33. if (errObjArray.isEmpty()) {
  34. return next();
  35. }
  36. const errs = errObjArray.array().map((err) => {
  37. return new Error(`Invalid lsx parameter: ${err.param}: ${err.msg}`);
  38. });
  39. res.status(400).json({ errors: errs.map((err) => err.message) });
  40. };
  41. // biome-ignore lint/suspicious/noExplicitAny: ignore
  42. const middleware = (crowi: any, app: any): void => {
  43. const loginRequired = crowi.require('../middlewares/login-required')(
  44. crowi,
  45. true,
  46. loginRequiredFallback,
  47. );
  48. const accessTokenParser = crowi.accessTokenParser;
  49. app.get(
  50. '/_api/lsx',
  51. accessTokenParser([SCOPE.READ.FEATURES.PAGE], { acceptLegacy: true }),
  52. loginRequired,
  53. lsxValidator,
  54. paramValidator,
  55. listPages,
  56. );
  57. };
  58. export default middleware;