HistoryRouter.mjs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. // @ts-check
  2. import Settings from '@overleaf/settings'
  3. import { RateLimiter } from '../../infrastructure/RateLimiter.mjs'
  4. import AuthenticationController from '../Authentication/AuthenticationController.mjs'
  5. import AuthorizationMiddleware from '../Authorization/AuthorizationMiddleware.mjs'
  6. import RateLimiterMiddleware from '../Security/RateLimiterMiddleware.mjs'
  7. import HistoryController from './HistoryController.mjs'
  8. const rateLimiters = {
  9. downloadProjectRevision: new RateLimiter('download-project-revision', {
  10. points: 30,
  11. duration: 60 * 60,
  12. }),
  13. getProjectBlob: new RateLimiter('get-project-blob', {
  14. // Download project in full once per hour
  15. points: Settings.maxEntitiesPerProject,
  16. duration: 60 * 60,
  17. }),
  18. flushHistory: new RateLimiter('flush-project-history', {
  19. points: 30,
  20. duration: 60,
  21. }),
  22. }
  23. function apply(webRouter, privateApiRouter) {
  24. // Blobs
  25. webRouter.head(
  26. '/project/:project_id/blob/:hash',
  27. RateLimiterMiddleware.rateLimit(rateLimiters.getProjectBlob),
  28. AuthorizationMiddleware.ensureUserCanReadProject,
  29. HistoryController.headBlob
  30. )
  31. webRouter.get(
  32. '/project/:project_id/blob/:hash',
  33. RateLimiterMiddleware.rateLimit(rateLimiters.getProjectBlob),
  34. AuthorizationMiddleware.ensureUserCanReadProject,
  35. HistoryController.getBlob
  36. )
  37. // History diffs
  38. webRouter.get(
  39. '/project/:Project_id/updates',
  40. AuthorizationMiddleware.blockRestrictedUserFromProject,
  41. AuthorizationMiddleware.ensureUserCanReadProject,
  42. HistoryController.proxyToHistoryApiAndInjectUserDetails
  43. )
  44. webRouter.get(
  45. '/project/:Project_id/doc/:doc_id/diff',
  46. AuthorizationMiddleware.blockRestrictedUserFromProject,
  47. AuthorizationMiddleware.ensureUserCanReadProject,
  48. HistoryController.proxyToHistoryApi
  49. )
  50. webRouter.get(
  51. '/project/:Project_id/diff',
  52. AuthorizationMiddleware.blockRestrictedUserFromProject,
  53. AuthorizationMiddleware.ensureUserCanReadProject,
  54. HistoryController.proxyToHistoryApiAndInjectUserDetails
  55. )
  56. webRouter.get(
  57. '/project/:Project_id/filetree/diff',
  58. AuthorizationMiddleware.blockRestrictedUserFromProject,
  59. AuthorizationMiddleware.ensureUserCanReadProject,
  60. HistoryController.proxyToHistoryApi
  61. )
  62. // File and project restore
  63. webRouter.post(
  64. '/project/:project_id/restore_file',
  65. AuthorizationMiddleware.ensureUserCanWriteProjectContent,
  66. HistoryController.restoreFileFromV2
  67. )
  68. webRouter.post(
  69. '/project/:project_id/revert_file',
  70. AuthorizationMiddleware.ensureUserCanWriteProjectContent,
  71. HistoryController.revertFile
  72. )
  73. webRouter.post(
  74. '/project/:project_id/revert-project',
  75. AuthorizationMiddleware.ensureUserCanWriteProjectContent,
  76. HistoryController.revertProject
  77. )
  78. // History download
  79. webRouter.get(
  80. '/project/:project_id/version/:version/zip',
  81. RateLimiterMiddleware.rateLimit(rateLimiters.downloadProjectRevision),
  82. AuthorizationMiddleware.blockRestrictedUserFromProject,
  83. AuthorizationMiddleware.ensureUserCanReadProject,
  84. HistoryController.downloadZipOfVersion
  85. )
  86. // History flush and resync
  87. webRouter.post(
  88. '/project/:Project_id/flush',
  89. RateLimiterMiddleware.rateLimit(rateLimiters.flushHistory),
  90. AuthorizationMiddleware.blockRestrictedUserFromProject,
  91. AuthorizationMiddleware.ensureUserCanReadProject,
  92. HistoryController.proxyToHistoryApi
  93. )
  94. privateApiRouter.post(
  95. '/project/:Project_id/history/resync',
  96. AuthenticationController.requirePrivateApiAuth(),
  97. HistoryController.resyncProjectHistory
  98. )
  99. // History labels
  100. webRouter.get(
  101. '/project/:Project_id/labels',
  102. AuthorizationMiddleware.blockRestrictedUserFromProject,
  103. AuthorizationMiddleware.ensureUserCanReadProject,
  104. HistoryController.getLabels
  105. )
  106. webRouter.post(
  107. '/project/:Project_id/labels',
  108. AuthorizationMiddleware.ensureUserCanWriteOrReviewProjectContent,
  109. HistoryController.createLabel
  110. )
  111. webRouter.delete(
  112. '/project/:Project_id/labels/:label_id',
  113. AuthorizationMiddleware.ensureUserCanWriteOrReviewProjectContent,
  114. HistoryController.deleteLabel
  115. )
  116. // History snapshot
  117. webRouter.get(
  118. '/project/:project_id/latest/history',
  119. AuthorizationMiddleware.blockRestrictedUserFromProject,
  120. AuthorizationMiddleware.ensureUserCanReadProject,
  121. HistoryController.getLatestHistory
  122. )
  123. webRouter.get(
  124. '/project/:project_id/changes',
  125. AuthorizationMiddleware.blockRestrictedUserFromProject,
  126. AuthorizationMiddleware.ensureUserCanReadProject,
  127. HistoryController.getChanges
  128. )
  129. }
  130. export default { apply }