validate-referer.ts 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import { objectIdUtils } from '@growi/core/dist/utils';
  2. import loggerFactory from '~/utils/logger';
  3. import { ValidReferer } from '../interfaces';
  4. import { retrieveSiteUrl } from './retrieve-site-url';
  5. const logger = loggerFactory('growi:middlewares:certify-shared-file:validate-referer');
  6. export const validateReferer = (referer: string | undefined): ValidReferer | false => {
  7. // not null
  8. if (referer == null) {
  9. logger.info('The referer string is undefined');
  10. return false;
  11. }
  12. let refererUrl: URL;
  13. try {
  14. refererUrl = new URL(referer);
  15. }
  16. catch (err) {
  17. logger.info(`Parsing referer ('${referer}') has failed`);
  18. return false;
  19. }
  20. // siteUrl
  21. const siteUrl = retrieveSiteUrl();
  22. if (siteUrl == null) {
  23. logger.info('The siteUrl is null.');
  24. return false;
  25. }
  26. // validate hostname and port
  27. if (refererUrl.hostname !== siteUrl.hostname || refererUrl.port !== siteUrl.port) {
  28. logger.warn('The hostname or port mismatched.', {
  29. refererUrl: {
  30. hostname: refererUrl.hostname,
  31. port: refererUrl.port,
  32. },
  33. siteUrl: {
  34. hostname: siteUrl.hostname,
  35. port: siteUrl.port,
  36. },
  37. });
  38. return false;
  39. }
  40. // validate pathname
  41. // https://regex101.com/r/M5Bp6E/1
  42. const match = refererUrl.pathname.match(/^\/share\/(?<shareLinkId>[a-f0-9]{24})$/i);
  43. if (match == null || match.groups?.shareLinkId == null) {
  44. logger.warn(`The pathname ('${refererUrl.pathname}') is invalid.`, match);
  45. return false;
  46. }
  47. // validate shareLinkId is an correct ObjectId
  48. if (!objectIdUtils.isValidObjectId(match.groups.shareLinkId)) {
  49. logger.warn(`The shareLinkId ('${match.groups.shareLinkId}') is invalid as an ObjectId.`);
  50. return false;
  51. }
  52. return {
  53. referer,
  54. shareLinkId: match.groups.shareLinkId,
  55. };
  56. };