@sync-in/server 1.10.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1057) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/LICENSE +1 -1
  3. package/README.md +3 -11
  4. package/environment/environment.dist.min.yaml +1 -1
  5. package/environment/environment.dist.yaml +173 -28
  6. package/package.json +18 -17
  7. package/server/app.bootstrap.js +1 -5
  8. package/server/app.bootstrap.js.map +1 -1
  9. package/server/app.constants.js +1 -5
  10. package/server/app.constants.js.map +1 -1
  11. package/server/app.e2e-spec.js +1 -5
  12. package/server/app.e2e-spec.js.map +1 -1
  13. package/server/app.functions.js +1 -5
  14. package/server/app.functions.js.map +1 -1
  15. package/server/app.module.js +1 -5
  16. package/server/app.module.js.map +1 -1
  17. package/server/app.service.js +1 -5
  18. package/server/app.service.js.map +1 -1
  19. package/server/app.service.spec.js +2 -6
  20. package/server/app.service.spec.js.map +1 -1
  21. package/server/applications/admin/admin.module.js +1 -5
  22. package/server/applications/admin/admin.module.js.map +1 -1
  23. package/server/applications/admin/constants/routes.js +1 -5
  24. package/server/applications/admin/constants/routes.js.map +1 -1
  25. package/server/applications/admin/interfaces/check-update.interfaces.js +1 -5
  26. package/server/applications/admin/interfaces/check-update.interfaces.js.map +1 -1
  27. package/server/applications/admin/services/admin-scheduler.service.js +1 -5
  28. package/server/applications/admin/services/admin-scheduler.service.js.map +1 -1
  29. package/server/applications/admin/services/admin.service.js +13 -8
  30. package/server/applications/admin/services/admin.service.js.map +1 -1
  31. package/server/applications/admin/services/admin.service.spec.js +1 -5
  32. package/server/applications/admin/services/admin.service.spec.js.map +1 -1
  33. package/server/applications/admin/utils/check-update.js +1 -5
  34. package/server/applications/admin/utils/check-update.js.map +1 -1
  35. package/server/applications/applications.config.js +1 -5
  36. package/server/applications/applications.config.js.map +1 -1
  37. package/server/applications/applications.constants.js +5 -5
  38. package/server/applications/applications.constants.js.map +1 -1
  39. package/server/applications/applications.module.js +1 -5
  40. package/server/applications/applications.module.js.map +1 -1
  41. package/server/applications/comments/comments.controller.js +1 -5
  42. package/server/applications/comments/comments.controller.js.map +1 -1
  43. package/server/applications/comments/comments.controller.spec.js +1 -5
  44. package/server/applications/comments/comments.controller.spec.js.map +1 -1
  45. package/server/applications/comments/comments.module.js +1 -5
  46. package/server/applications/comments/comments.module.js.map +1 -1
  47. package/server/applications/comments/constants/routes.js +1 -5
  48. package/server/applications/comments/constants/routes.js.map +1 -1
  49. package/server/applications/comments/dto/comment.dto.js +1 -5
  50. package/server/applications/comments/dto/comment.dto.js.map +1 -1
  51. package/server/applications/comments/interfaces/comment-recent.interface.js +1 -5
  52. package/server/applications/comments/interfaces/comment-recent.interface.js.map +1 -1
  53. package/server/applications/comments/schemas/comment.interface.js +1 -5
  54. package/server/applications/comments/schemas/comment.interface.js.map +1 -1
  55. package/server/applications/comments/schemas/comments.schema.js +1 -5
  56. package/server/applications/comments/schemas/comments.schema.js.map +1 -1
  57. package/server/applications/comments/services/comments-manager.service.js +9 -7
  58. package/server/applications/comments/services/comments-manager.service.js.map +1 -1
  59. package/server/applications/comments/services/comments-manager.service.spec.js +10 -8
  60. package/server/applications/comments/services/comments-manager.service.spec.js.map +1 -1
  61. package/server/applications/comments/services/comments-queries.service.js +1 -5
  62. package/server/applications/comments/services/comments-queries.service.js.map +1 -1
  63. package/server/applications/files/adapters/files-indexer-mysql.service.js +29 -12
  64. package/server/applications/files/adapters/files-indexer-mysql.service.js.map +1 -1
  65. package/server/applications/files/adapters/files-indexer-mysql.service.spec.js +1 -5
  66. package/server/applications/files/adapters/files-indexer-mysql.service.spec.js.map +1 -1
  67. package/server/applications/files/constants/cache.js +1 -5
  68. package/server/applications/files/constants/cache.js.map +1 -1
  69. package/server/applications/files/constants/compress.js +1 -5
  70. package/server/applications/files/constants/compress.js.map +1 -1
  71. package/server/applications/files/constants/files.js +1 -5
  72. package/server/applications/files/constants/files.js.map +1 -1
  73. package/server/applications/files/constants/indexing.js +1 -5
  74. package/server/applications/files/constants/indexing.js.map +1 -1
  75. package/server/applications/files/constants/operations.js +1 -5
  76. package/server/applications/files/constants/operations.js.map +1 -1
  77. package/server/applications/files/constants/routes.js +1 -5
  78. package/server/applications/files/constants/routes.js.map +1 -1
  79. package/server/applications/files/constants/samples.js +1 -5
  80. package/server/applications/files/constants/samples.js.map +1 -1
  81. package/server/applications/files/dto/file-operations.dto.js +1 -5
  82. package/server/applications/files/dto/file-operations.dto.js.map +1 -1
  83. package/server/applications/files/events/file-task-event.js +1 -5
  84. package/server/applications/files/events/file-task-event.js.map +1 -1
  85. package/server/applications/files/files-tasks.controller.js +1 -5
  86. package/server/applications/files/files-tasks.controller.js.map +1 -1
  87. package/server/applications/files/files-tasks.controller.spec.js +1 -5
  88. package/server/applications/files/files-tasks.controller.spec.js.map +1 -1
  89. package/server/applications/files/files.config.js +1 -5
  90. package/server/applications/files/files.config.js.map +1 -1
  91. package/server/applications/files/files.controller.js +1 -5
  92. package/server/applications/files/files.controller.js.map +1 -1
  93. package/server/applications/files/files.controller.spec.js +1 -5
  94. package/server/applications/files/files.controller.spec.js.map +1 -1
  95. package/server/applications/files/files.module.js +1 -5
  96. package/server/applications/files/files.module.js.map +1 -1
  97. package/server/applications/files/interfaces/file-db-props.interface.js +1 -5
  98. package/server/applications/files/interfaces/file-db-props.interface.js.map +1 -1
  99. package/server/applications/files/interfaces/file-lock.interface.js +1 -5
  100. package/server/applications/files/interfaces/file-lock.interface.js.map +1 -1
  101. package/server/applications/files/interfaces/file-parse-index.js +1 -5
  102. package/server/applications/files/interfaces/file-parse-index.js.map +1 -1
  103. package/server/applications/files/interfaces/file-props.interface.js +1 -5
  104. package/server/applications/files/interfaces/file-props.interface.js.map +1 -1
  105. package/server/applications/files/interfaces/file-recent-location.interface.js +1 -5
  106. package/server/applications/files/interfaces/file-recent-location.interface.js.map +1 -1
  107. package/server/applications/files/interfaces/file-space.interface.js +1 -5
  108. package/server/applications/files/interfaces/file-space.interface.js.map +1 -1
  109. package/server/applications/files/interfaces/file-tree.interface.js +1 -5
  110. package/server/applications/files/interfaces/file-tree.interface.js.map +1 -1
  111. package/server/applications/files/models/file-error.js +1 -5
  112. package/server/applications/files/models/file-error.js.map +1 -1
  113. package/server/applications/files/models/file-lock-error.js +1 -5
  114. package/server/applications/files/models/file-lock-error.js.map +1 -1
  115. package/server/applications/files/models/file-task.js +1 -5
  116. package/server/applications/files/models/file-task.js.map +1 -1
  117. package/server/applications/files/models/files-indexer.js +1 -5
  118. package/server/applications/files/models/files-indexer.js.map +1 -1
  119. package/server/applications/files/modules/collabora-online/collabora-online-environment.decorator.js +1 -5
  120. package/server/applications/files/modules/collabora-online/collabora-online-environment.decorator.js.map +1 -1
  121. package/server/applications/files/modules/collabora-online/collabora-online-manager.service.js +21 -10
  122. package/server/applications/files/modules/collabora-online/collabora-online-manager.service.js.map +1 -1
  123. package/server/applications/files/modules/collabora-online/collabora-online-manager.service.spec.js +1 -5
  124. package/server/applications/files/modules/collabora-online/collabora-online-manager.service.spec.js.map +1 -1
  125. package/server/applications/files/modules/collabora-online/collabora-online.config.js +1 -5
  126. package/server/applications/files/modules/collabora-online/collabora-online.config.js.map +1 -1
  127. package/server/applications/files/modules/collabora-online/collabora-online.constants.js +1 -5
  128. package/server/applications/files/modules/collabora-online/collabora-online.constants.js.map +1 -1
  129. package/server/applications/files/modules/collabora-online/collabora-online.controller.js +1 -5
  130. package/server/applications/files/modules/collabora-online/collabora-online.controller.js.map +1 -1
  131. package/server/applications/files/modules/collabora-online/collabora-online.controller.spec.js +1 -5
  132. package/server/applications/files/modules/collabora-online/collabora-online.controller.spec.js.map +1 -1
  133. package/server/applications/files/modules/collabora-online/collabora-online.dtos.js +1 -5
  134. package/server/applications/files/modules/collabora-online/collabora-online.dtos.js.map +1 -1
  135. package/server/applications/files/modules/collabora-online/collabora-online.guard.js +1 -5
  136. package/server/applications/files/modules/collabora-online/collabora-online.guard.js.map +1 -1
  137. package/server/applications/files/modules/collabora-online/collabora-online.guard.spec.js +1 -5
  138. package/server/applications/files/modules/collabora-online/collabora-online.guard.spec.js.map +1 -1
  139. package/server/applications/files/modules/collabora-online/collabora-online.interface.js +1 -5
  140. package/server/applications/files/modules/collabora-online/collabora-online.interface.js.map +1 -1
  141. package/server/applications/files/modules/collabora-online/collabora-online.module.js +1 -5
  142. package/server/applications/files/modules/collabora-online/collabora-online.module.js.map +1 -1
  143. package/server/applications/files/modules/collabora-online/collabora-online.routes.js +1 -5
  144. package/server/applications/files/modules/collabora-online/collabora-online.routes.js.map +1 -1
  145. package/server/applications/files/modules/collabora-online/collabora-online.strategy.js +1 -5
  146. package/server/applications/files/modules/collabora-online/collabora-online.strategy.js.map +1 -1
  147. package/server/applications/files/modules/collabora-online/collabora-online.utils.js +1 -5
  148. package/server/applications/files/modules/collabora-online/collabora-online.utils.js.map +1 -1
  149. package/server/applications/files/modules/file-editor-providers.interface.js +6 -0
  150. package/server/applications/files/modules/file-editor-providers.interface.js.map +1 -0
  151. package/server/applications/files/modules/only-office/only-office-environment.decorator.js +1 -5
  152. package/server/applications/files/modules/only-office/only-office-environment.decorator.js.map +1 -1
  153. package/server/applications/files/modules/only-office/only-office-manager.service.js +57 -19
  154. package/server/applications/files/modules/only-office/only-office-manager.service.js.map +1 -1
  155. package/server/applications/files/modules/only-office/only-office-manager.service.spec.js +1 -5
  156. package/server/applications/files/modules/only-office/only-office-manager.service.spec.js.map +1 -1
  157. package/server/applications/files/modules/only-office/only-office.config.js +1 -5
  158. package/server/applications/files/modules/only-office/only-office.config.js.map +1 -1
  159. package/server/applications/files/modules/only-office/only-office.constants.js +1 -5
  160. package/server/applications/files/modules/only-office/only-office.constants.js.map +1 -1
  161. package/server/applications/files/modules/only-office/only-office.controller.js +1 -5
  162. package/server/applications/files/modules/only-office/only-office.controller.js.map +1 -1
  163. package/server/applications/files/modules/only-office/only-office.controller.spec.js +1 -5
  164. package/server/applications/files/modules/only-office/only-office.controller.spec.js.map +1 -1
  165. package/server/applications/files/modules/only-office/only-office.dtos.js +1 -5
  166. package/server/applications/files/modules/only-office/only-office.dtos.js.map +1 -1
  167. package/server/applications/files/modules/only-office/only-office.guard.js +1 -5
  168. package/server/applications/files/modules/only-office/only-office.guard.js.map +1 -1
  169. package/server/applications/files/modules/only-office/only-office.guard.spec.js +1 -5
  170. package/server/applications/files/modules/only-office/only-office.guard.spec.js.map +1 -1
  171. package/server/applications/files/modules/only-office/only-office.interface.js +1 -5
  172. package/server/applications/files/modules/only-office/only-office.interface.js.map +1 -1
  173. package/server/applications/files/modules/only-office/only-office.module.js +1 -5
  174. package/server/applications/files/modules/only-office/only-office.module.js.map +1 -1
  175. package/server/applications/files/modules/only-office/only-office.routes.js +1 -5
  176. package/server/applications/files/modules/only-office/only-office.routes.js.map +1 -1
  177. package/server/applications/files/modules/only-office/only-office.strategy.js +1 -5
  178. package/server/applications/files/modules/only-office/only-office.strategy.js.map +1 -1
  179. package/server/applications/files/schemas/file-content.interface.js +1 -5
  180. package/server/applications/files/schemas/file-content.interface.js.map +1 -1
  181. package/server/applications/files/schemas/file-recent.interface.js +1 -5
  182. package/server/applications/files/schemas/file-recent.interface.js.map +1 -1
  183. package/server/applications/files/schemas/file.interface.js +1 -5
  184. package/server/applications/files/schemas/file.interface.js.map +1 -1
  185. package/server/applications/files/schemas/files-content.schema.js +1 -5
  186. package/server/applications/files/schemas/files-content.schema.js.map +1 -1
  187. package/server/applications/files/schemas/files-recents.schema.js +1 -5
  188. package/server/applications/files/schemas/files-recents.schema.js.map +1 -1
  189. package/server/applications/files/schemas/files.schema.js +1 -5
  190. package/server/applications/files/schemas/files.schema.js.map +1 -1
  191. package/server/applications/files/services/files-content-manager.service.js +45 -16
  192. package/server/applications/files/services/files-content-manager.service.js.map +1 -1
  193. package/server/applications/files/services/files-lock-manager.service.js +53 -18
  194. package/server/applications/files/services/files-lock-manager.service.js.map +1 -1
  195. package/server/applications/files/services/files-lock-manager.service.spec.js +1 -5
  196. package/server/applications/files/services/files-lock-manager.service.spec.js.map +1 -1
  197. package/server/applications/files/services/files-manager.service.js +77 -24
  198. package/server/applications/files/services/files-manager.service.js.map +1 -1
  199. package/server/applications/files/services/files-manager.service.spec.js +1 -5
  200. package/server/applications/files/services/files-manager.service.spec.js.map +1 -1
  201. package/server/applications/files/services/files-methods.service.js +5 -6
  202. package/server/applications/files/services/files-methods.service.js.map +1 -1
  203. package/server/applications/files/services/files-methods.service.spec.js +1 -5
  204. package/server/applications/files/services/files-methods.service.spec.js.map +1 -1
  205. package/server/applications/files/services/files-parser.service.js +13 -8
  206. package/server/applications/files/services/files-parser.service.js.map +1 -1
  207. package/server/applications/files/services/files-parser.service.spec.js +1 -5
  208. package/server/applications/files/services/files-parser.service.spec.js.map +1 -1
  209. package/server/applications/files/services/files-queries.service.js +29 -12
  210. package/server/applications/files/services/files-queries.service.js.map +1 -1
  211. package/server/applications/files/services/files-recents.service.js +1 -5
  212. package/server/applications/files/services/files-recents.service.js.map +1 -1
  213. package/server/applications/files/services/files-recents.service.spec.js +1 -5
  214. package/server/applications/files/services/files-recents.service.spec.js.map +1 -1
  215. package/server/applications/files/services/files-scheduler.service.js +77 -24
  216. package/server/applications/files/services/files-scheduler.service.js.map +1 -1
  217. package/server/applications/files/services/files-search-manager.service.js +9 -7
  218. package/server/applications/files/services/files-search-manager.service.js.map +1 -1
  219. package/server/applications/files/services/files-search-manager.service.spec.js +1 -5
  220. package/server/applications/files/services/files-search-manager.service.spec.js.map +1 -1
  221. package/server/applications/files/services/files-tasks-manager.service.js +77 -24
  222. package/server/applications/files/services/files-tasks-manager.service.js.map +1 -1
  223. package/server/applications/files/services/files-tasks-manager.service.spec.js +1 -5
  224. package/server/applications/files/services/files-tasks-manager.service.spec.js.map +1 -1
  225. package/server/applications/files/utils/doc-textify/adapters/excel.js +1 -5
  226. package/server/applications/files/utils/doc-textify/adapters/excel.js.map +1 -1
  227. package/server/applications/files/utils/doc-textify/adapters/html.js +1 -5
  228. package/server/applications/files/utils/doc-textify/adapters/html.js.map +1 -1
  229. package/server/applications/files/utils/doc-textify/adapters/open-office.js +1 -5
  230. package/server/applications/files/utils/doc-textify/adapters/open-office.js.map +1 -1
  231. package/server/applications/files/utils/doc-textify/adapters/pdf.js +1 -5
  232. package/server/applications/files/utils/doc-textify/adapters/pdf.js.map +1 -1
  233. package/server/applications/files/utils/doc-textify/adapters/power-point.js +1 -5
  234. package/server/applications/files/utils/doc-textify/adapters/power-point.js.map +1 -1
  235. package/server/applications/files/utils/doc-textify/adapters/text.js +1 -5
  236. package/server/applications/files/utils/doc-textify/adapters/text.js.map +1 -1
  237. package/server/applications/files/utils/doc-textify/adapters/word.js +1 -5
  238. package/server/applications/files/utils/doc-textify/adapters/word.js.map +1 -1
  239. package/server/applications/files/utils/doc-textify/doc-textify.js +1 -5
  240. package/server/applications/files/utils/doc-textify/doc-textify.js.map +1 -1
  241. package/server/applications/files/utils/doc-textify/interfaces/doc-textify.interfaces.js +1 -5
  242. package/server/applications/files/utils/doc-textify/interfaces/doc-textify.interfaces.js.map +1 -1
  243. package/server/applications/files/utils/doc-textify/utils/clean.js +1 -5
  244. package/server/applications/files/utils/doc-textify/utils/clean.js.map +1 -1
  245. package/server/applications/files/utils/files-search.js +1 -5
  246. package/server/applications/files/utils/files-search.js.map +1 -1
  247. package/server/applications/files/utils/files-tree.js +1 -5
  248. package/server/applications/files/utils/files-tree.js.map +1 -1
  249. package/server/applications/files/utils/files.js +1 -5
  250. package/server/applications/files/utils/files.js.map +1 -1
  251. package/server/applications/files/utils/send-file.js +1 -5
  252. package/server/applications/files/utils/send-file.js.map +1 -1
  253. package/server/applications/files/utils/unzip-file.js +1 -5
  254. package/server/applications/files/utils/unzip-file.js.map +1 -1
  255. package/server/applications/files/utils/url-file.js +1 -5
  256. package/server/applications/files/utils/url-file.js.map +1 -1
  257. package/server/applications/links/constants/cache.js +1 -5
  258. package/server/applications/links/constants/cache.js.map +1 -1
  259. package/server/applications/links/constants/links.js +1 -5
  260. package/server/applications/links/constants/links.js.map +1 -1
  261. package/server/applications/links/constants/routes.js +1 -5
  262. package/server/applications/links/constants/routes.js.map +1 -1
  263. package/server/applications/links/dto/create-or-update-link.dto.js +1 -5
  264. package/server/applications/links/dto/create-or-update-link.dto.js.map +1 -1
  265. package/server/applications/links/interfaces/link-guest.interface.js +1 -5
  266. package/server/applications/links/interfaces/link-guest.interface.js.map +1 -1
  267. package/server/applications/links/interfaces/link-space.interface.js +1 -5
  268. package/server/applications/links/interfaces/link-space.interface.js.map +1 -1
  269. package/server/applications/links/links.controller.js +1 -5
  270. package/server/applications/links/links.controller.js.map +1 -1
  271. package/server/applications/links/links.controller.spec.js +1 -5
  272. package/server/applications/links/links.controller.spec.js.map +1 -1
  273. package/server/applications/links/schemas/link.interface.js +1 -5
  274. package/server/applications/links/schemas/link.interface.js.map +1 -1
  275. package/server/applications/links/schemas/links.schema.js +1 -5
  276. package/server/applications/links/schemas/links.schema.js.map +1 -1
  277. package/server/applications/links/services/links-manager.service.js +55 -20
  278. package/server/applications/links/services/links-manager.service.js.map +1 -1
  279. package/server/applications/links/services/links-manager.service.spec.js +3 -7
  280. package/server/applications/links/services/links-manager.service.spec.js.map +1 -1
  281. package/server/applications/links/services/links-queries.service.js +1 -5
  282. package/server/applications/links/services/links-queries.service.js.map +1 -1
  283. package/server/applications/notifications/constants/notifications.js +1 -5
  284. package/server/applications/notifications/constants/notifications.js.map +1 -1
  285. package/server/applications/notifications/constants/routes.js +1 -5
  286. package/server/applications/notifications/constants/routes.js.map +1 -1
  287. package/server/applications/notifications/constants/websocket.js +1 -5
  288. package/server/applications/notifications/constants/websocket.js.map +1 -1
  289. package/server/applications/notifications/i18n/de.js +1 -9
  290. package/server/applications/notifications/i18n/de.js.map +1 -1
  291. package/server/applications/notifications/i18n/es.js +1 -5
  292. package/server/applications/notifications/i18n/es.js.map +1 -1
  293. package/server/applications/notifications/i18n/fr.js +1 -5
  294. package/server/applications/notifications/i18n/fr.js.map +1 -1
  295. package/server/applications/notifications/i18n/hi.js +1 -5
  296. package/server/applications/notifications/i18n/hi.js.map +1 -1
  297. package/server/applications/notifications/i18n/index.js +1 -5
  298. package/server/applications/notifications/i18n/index.js.map +1 -1
  299. package/server/applications/notifications/i18n/it.js +1 -5
  300. package/server/applications/notifications/i18n/it.js.map +1 -1
  301. package/server/applications/notifications/i18n/ja.js +1 -5
  302. package/server/applications/notifications/i18n/ja.js.map +1 -1
  303. package/server/applications/notifications/i18n/ko.js +1 -5
  304. package/server/applications/notifications/i18n/ko.js.map +1 -1
  305. package/server/applications/notifications/i18n/pl.js +1 -5
  306. package/server/applications/notifications/i18n/pl.js.map +1 -1
  307. package/server/applications/notifications/i18n/pt.js +1 -5
  308. package/server/applications/notifications/i18n/pt.js.map +1 -1
  309. package/server/applications/notifications/i18n/pt_br.js +1 -5
  310. package/server/applications/notifications/i18n/pt_br.js.map +1 -1
  311. package/server/applications/notifications/i18n/ru.js +1 -5
  312. package/server/applications/notifications/i18n/ru.js.map +1 -1
  313. package/server/applications/notifications/i18n/tr.js +1 -5
  314. package/server/applications/notifications/i18n/tr.js.map +1 -1
  315. package/server/applications/notifications/i18n/zh.js +1 -5
  316. package/server/applications/notifications/i18n/zh.js.map +1 -1
  317. package/server/applications/notifications/interfaces/notification-properties.interface.js +1 -5
  318. package/server/applications/notifications/interfaces/notification-properties.interface.js.map +1 -1
  319. package/server/applications/notifications/interfaces/user-mail-notification.interface.js +1 -5
  320. package/server/applications/notifications/interfaces/user-mail-notification.interface.js.map +1 -1
  321. package/server/applications/notifications/mails/models.js +1 -5
  322. package/server/applications/notifications/mails/models.js.map +1 -1
  323. package/server/applications/notifications/mails/templates.js +1 -5
  324. package/server/applications/notifications/mails/templates.js.map +1 -1
  325. package/server/applications/notifications/mails/urls.js +1 -5
  326. package/server/applications/notifications/mails/urls.js.map +1 -1
  327. package/server/applications/notifications/notifications.controller.js +1 -5
  328. package/server/applications/notifications/notifications.controller.js.map +1 -1
  329. package/server/applications/notifications/notifications.controller.spec.js +1 -5
  330. package/server/applications/notifications/notifications.controller.spec.js.map +1 -1
  331. package/server/applications/notifications/notifications.gateway.js +1 -5
  332. package/server/applications/notifications/notifications.gateway.js.map +1 -1
  333. package/server/applications/notifications/notifications.module.js +1 -5
  334. package/server/applications/notifications/notifications.module.js.map +1 -1
  335. package/server/applications/notifications/schemas/notification.interface.js +1 -5
  336. package/server/applications/notifications/schemas/notification.interface.js.map +1 -1
  337. package/server/applications/notifications/schemas/notifications.schema.js +1 -5
  338. package/server/applications/notifications/schemas/notifications.schema.js.map +1 -1
  339. package/server/applications/notifications/services/notifications-manager.service.js +25 -11
  340. package/server/applications/notifications/services/notifications-manager.service.js.map +1 -1
  341. package/server/applications/notifications/services/notifications-manager.service.spec.js +20 -11
  342. package/server/applications/notifications/services/notifications-manager.service.spec.js.map +1 -1
  343. package/server/applications/notifications/services/notifications-queries.service.js +1 -5
  344. package/server/applications/notifications/services/notifications-queries.service.js.map +1 -1
  345. package/server/applications/shares/constants/routes.js +1 -5
  346. package/server/applications/shares/constants/routes.js.map +1 -1
  347. package/server/applications/shares/constants/shares.js +1 -5
  348. package/server/applications/shares/constants/shares.js.map +1 -1
  349. package/server/applications/shares/dto/create-or-update-share.dto.js +1 -5
  350. package/server/applications/shares/dto/create-or-update-share.dto.js.map +1 -1
  351. package/server/applications/shares/interfaces/share-child.interface.js +1 -5
  352. package/server/applications/shares/interfaces/share-child.interface.js.map +1 -1
  353. package/server/applications/shares/interfaces/share-env.interface.js +1 -5
  354. package/server/applications/shares/interfaces/share-env.interface.js.map +1 -1
  355. package/server/applications/shares/interfaces/share-file.interface.js +1 -5
  356. package/server/applications/shares/interfaces/share-file.interface.js.map +1 -1
  357. package/server/applications/shares/interfaces/share-link.interface.js +1 -5
  358. package/server/applications/shares/interfaces/share-link.interface.js.map +1 -1
  359. package/server/applications/shares/interfaces/share-props.interface.js +1 -5
  360. package/server/applications/shares/interfaces/share-props.interface.js.map +1 -1
  361. package/server/applications/shares/models/share-child.model.js +1 -5
  362. package/server/applications/shares/models/share-child.model.js.map +1 -1
  363. package/server/applications/shares/schemas/share-members.interface.js +1 -5
  364. package/server/applications/shares/schemas/share-members.interface.js.map +1 -1
  365. package/server/applications/shares/schemas/share.interface.js +1 -5
  366. package/server/applications/shares/schemas/share.interface.js.map +1 -1
  367. package/server/applications/shares/schemas/shares-members.schema.js +1 -5
  368. package/server/applications/shares/schemas/shares-members.schema.js.map +1 -1
  369. package/server/applications/shares/schemas/shares.schema.js +1 -5
  370. package/server/applications/shares/schemas/shares.schema.js.map +1 -1
  371. package/server/applications/shares/services/shares-manager.service.js +214 -68
  372. package/server/applications/shares/services/shares-manager.service.js.map +1 -1
  373. package/server/applications/shares/services/shares-manager.service.spec.js +1 -5
  374. package/server/applications/shares/services/shares-manager.service.spec.js.map +1 -1
  375. package/server/applications/shares/services/shares-queries.service.js +49 -17
  376. package/server/applications/shares/services/shares-queries.service.js.map +1 -1
  377. package/server/applications/shares/shares.controller.js +1 -5
  378. package/server/applications/shares/shares.controller.js.map +1 -1
  379. package/server/applications/shares/shares.controller.spec.js +1 -5
  380. package/server/applications/shares/shares.controller.spec.js.map +1 -1
  381. package/server/applications/shares/shares.module.js +1 -5
  382. package/server/applications/shares/shares.module.js.map +1 -1
  383. package/server/applications/spaces/constants/cache.js +1 -5
  384. package/server/applications/spaces/constants/cache.js.map +1 -1
  385. package/server/applications/spaces/constants/routes.js +1 -5
  386. package/server/applications/spaces/constants/routes.js.map +1 -1
  387. package/server/applications/spaces/constants/spaces.js +1 -5
  388. package/server/applications/spaces/constants/spaces.js.map +1 -1
  389. package/server/applications/spaces/decorators/space-override-permission.decorator.js +1 -5
  390. package/server/applications/spaces/decorators/space-override-permission.decorator.js.map +1 -1
  391. package/server/applications/spaces/decorators/space-skip-guard.decorator.js +1 -5
  392. package/server/applications/spaces/decorators/space-skip-guard.decorator.js.map +1 -1
  393. package/server/applications/spaces/decorators/space-skip-permissions.decorator.js +1 -5
  394. package/server/applications/spaces/decorators/space-skip-permissions.decorator.js.map +1 -1
  395. package/server/applications/spaces/decorators/space.decorator.js +1 -5
  396. package/server/applications/spaces/decorators/space.decorator.js.map +1 -1
  397. package/server/applications/spaces/dto/create-or-update-space.dto.js +1 -5
  398. package/server/applications/spaces/dto/create-or-update-space.dto.js.map +1 -1
  399. package/server/applications/spaces/dto/delete-space.dto.js +1 -5
  400. package/server/applications/spaces/dto/delete-space.dto.js.map +1 -1
  401. package/server/applications/spaces/dto/search-space.dto.js +1 -5
  402. package/server/applications/spaces/dto/search-space.dto.js.map +1 -1
  403. package/server/applications/spaces/dto/space-roots.dto.js +1 -5
  404. package/server/applications/spaces/dto/space-roots.dto.js.map +1 -1
  405. package/server/applications/spaces/guards/space.guard.js +17 -9
  406. package/server/applications/spaces/guards/space.guard.js.map +1 -1
  407. package/server/applications/spaces/guards/space.guard.spec.js +1 -5
  408. package/server/applications/spaces/guards/space.guard.spec.js.map +1 -1
  409. package/server/applications/spaces/interfaces/space-diff.interface.js +1 -5
  410. package/server/applications/spaces/interfaces/space-diff.interface.js.map +1 -1
  411. package/server/applications/spaces/interfaces/space-files.interface.js +1 -5
  412. package/server/applications/spaces/interfaces/space-files.interface.js.map +1 -1
  413. package/server/applications/spaces/interfaces/space-request.interface.js +1 -5
  414. package/server/applications/spaces/interfaces/space-request.interface.js.map +1 -1
  415. package/server/applications/spaces/interfaces/space-trash.interface.js +1 -5
  416. package/server/applications/spaces/interfaces/space-trash.interface.js.map +1 -1
  417. package/server/applications/spaces/models/space-env.model.js +1 -5
  418. package/server/applications/spaces/models/space-env.model.js.map +1 -1
  419. package/server/applications/spaces/models/space-props.model.js +1 -5
  420. package/server/applications/spaces/models/space-props.model.js.map +1 -1
  421. package/server/applications/spaces/models/space-root-props.model.js +1 -5
  422. package/server/applications/spaces/models/space-root-props.model.js.map +1 -1
  423. package/server/applications/spaces/models/space.model.js +1 -5
  424. package/server/applications/spaces/models/space.model.js.map +1 -1
  425. package/server/applications/spaces/schemas/space-members.interface.js +1 -5
  426. package/server/applications/spaces/schemas/space-members.interface.js.map +1 -1
  427. package/server/applications/spaces/schemas/space-root.interface.js +1 -5
  428. package/server/applications/spaces/schemas/space-root.interface.js.map +1 -1
  429. package/server/applications/spaces/schemas/space.interface.js +1 -5
  430. package/server/applications/spaces/schemas/space.interface.js.map +1 -1
  431. package/server/applications/spaces/schemas/spaces-members.schema.js +1 -5
  432. package/server/applications/spaces/schemas/spaces-members.schema.js.map +1 -1
  433. package/server/applications/spaces/schemas/spaces-roots.schema.js +1 -5
  434. package/server/applications/spaces/schemas/spaces-roots.schema.js.map +1 -1
  435. package/server/applications/spaces/schemas/spaces.schema.js +1 -5
  436. package/server/applications/spaces/schemas/spaces.schema.js.map +1 -1
  437. package/server/applications/spaces/services/spaces-browser.service.js +77 -24
  438. package/server/applications/spaces/services/spaces-browser.service.js.map +1 -1
  439. package/server/applications/spaces/services/spaces-browser.service.spec.js +1 -5
  440. package/server/applications/spaces/services/spaces-browser.service.spec.js.map +1 -1
  441. package/server/applications/spaces/services/spaces-manager.service.js +193 -53
  442. package/server/applications/spaces/services/spaces-manager.service.js.map +1 -1
  443. package/server/applications/spaces/services/spaces-manager.service.spec.js +1 -5
  444. package/server/applications/spaces/services/spaces-manager.service.spec.js.map +1 -1
  445. package/server/applications/spaces/services/spaces-queries.service.js +65 -21
  446. package/server/applications/spaces/services/spaces-queries.service.js.map +1 -1
  447. package/server/applications/spaces/services/spaces-scheduler.service.js +49 -17
  448. package/server/applications/spaces/services/spaces-scheduler.service.js.map +1 -1
  449. package/server/applications/spaces/spaces.controller.js +1 -5
  450. package/server/applications/spaces/spaces.controller.js.map +1 -1
  451. package/server/applications/spaces/spaces.controller.spec.js +1 -5
  452. package/server/applications/spaces/spaces.controller.spec.js.map +1 -1
  453. package/server/applications/spaces/spaces.module.js +1 -5
  454. package/server/applications/spaces/spaces.module.js.map +1 -1
  455. package/server/applications/spaces/utils/paths.js +1 -5
  456. package/server/applications/spaces/utils/paths.js.map +1 -1
  457. package/server/applications/spaces/utils/permissions.js +1 -5
  458. package/server/applications/spaces/utils/permissions.js.map +1 -1
  459. package/server/applications/spaces/utils/routes.js +1 -5
  460. package/server/applications/spaces/utils/routes.js.map +1 -1
  461. package/server/applications/sync/constants/auth.js +1 -5
  462. package/server/applications/sync/constants/auth.js.map +1 -1
  463. package/server/applications/sync/constants/routes.js +6 -5
  464. package/server/applications/sync/constants/routes.js.map +1 -1
  465. package/server/applications/sync/constants/store.js +1 -9
  466. package/server/applications/sync/constants/store.js.map +1 -1
  467. package/server/applications/sync/constants/sync.js +2 -6
  468. package/server/applications/sync/constants/sync.js.map +1 -1
  469. package/server/applications/sync/decorators/sync-context.decorator.js +1 -5
  470. package/server/applications/sync/decorators/sync-context.decorator.js.map +1 -1
  471. package/server/applications/sync/decorators/sync-environment.decorator.js +1 -5
  472. package/server/applications/sync/decorators/sync-environment.decorator.js.map +1 -1
  473. package/server/applications/sync/dtos/sync-client-auth.dto.js +12 -8
  474. package/server/applications/sync/dtos/sync-client-auth.dto.js.map +1 -1
  475. package/server/applications/sync/dtos/sync-client-info.dto.js +49 -0
  476. package/server/applications/sync/dtos/sync-client-info.dto.js.map +1 -0
  477. package/server/applications/sync/dtos/sync-client-registration.dto.js +34 -11
  478. package/server/applications/sync/dtos/sync-client-registration.dto.js.map +1 -1
  479. package/server/applications/sync/dtos/sync-operations.dto.js +1 -5
  480. package/server/applications/sync/dtos/sync-operations.dto.js.map +1 -1
  481. package/server/applications/sync/dtos/sync-path.dto.js +1 -5
  482. package/server/applications/sync/dtos/sync-path.dto.js.map +1 -1
  483. package/server/applications/sync/dtos/sync-upload.dto.js +1 -5
  484. package/server/applications/sync/dtos/sync-upload.dto.js.map +1 -1
  485. package/server/applications/sync/interceptors/sync-diff-gzip-body.interceptor.js +1 -5
  486. package/server/applications/sync/interceptors/sync-diff-gzip-body.interceptor.js.map +1 -1
  487. package/server/applications/sync/interceptors/sync-diff-gzip-body.interceptor.spec.js +1 -5
  488. package/server/applications/sync/interceptors/sync-diff-gzip-body.interceptor.spec.js.map +1 -1
  489. package/server/applications/sync/interfaces/store-manifest.interface.js +1 -5
  490. package/server/applications/sync/interfaces/store-manifest.interface.js.map +1 -1
  491. package/server/applications/sync/interfaces/sync-client-auth.interface.js +1 -25
  492. package/server/applications/sync/interfaces/sync-client-auth.interface.js.map +1 -1
  493. package/server/applications/sync/interfaces/sync-client-paths.interface.js +1 -5
  494. package/server/applications/sync/interfaces/sync-client-paths.interface.js.map +1 -1
  495. package/server/applications/sync/interfaces/sync-client.interface.js +1 -5
  496. package/server/applications/sync/interfaces/sync-client.interface.js.map +1 -1
  497. package/server/applications/sync/interfaces/sync-diff.interface.js +1 -5
  498. package/server/applications/sync/interfaces/sync-diff.interface.js.map +1 -1
  499. package/server/applications/sync/interfaces/sync-path.interface.js +1 -5
  500. package/server/applications/sync/interfaces/sync-path.interface.js.map +1 -1
  501. package/server/applications/sync/schemas/sync-client.interface.js +1 -5
  502. package/server/applications/sync/schemas/sync-client.interface.js.map +1 -1
  503. package/server/applications/sync/schemas/sync-clients.schema.js +1 -5
  504. package/server/applications/sync/schemas/sync-clients.schema.js.map +1 -1
  505. package/server/applications/sync/schemas/sync-path.interface.js +1 -5
  506. package/server/applications/sync/schemas/sync-path.interface.js.map +1 -1
  507. package/server/applications/sync/schemas/sync-paths.schema.js +1 -5
  508. package/server/applications/sync/schemas/sync-paths.schema.js.map +1 -1
  509. package/server/applications/sync/services/sync-clients-manager.service.js +108 -44
  510. package/server/applications/sync/services/sync-clients-manager.service.js.map +1 -1
  511. package/server/applications/sync/services/sync-clients-manager.service.spec.js +14 -17
  512. package/server/applications/sync/services/sync-clients-manager.service.spec.js.map +1 -1
  513. package/server/applications/sync/services/sync-manager.service.js +29 -12
  514. package/server/applications/sync/services/sync-manager.service.js.map +1 -1
  515. package/server/applications/sync/services/sync-manager.service.spec.js +1 -5
  516. package/server/applications/sync/services/sync-manager.service.spec.js.map +1 -1
  517. package/server/applications/sync/services/sync-paths-manager.service.js +27 -17
  518. package/server/applications/sync/services/sync-paths-manager.service.js.map +1 -1
  519. package/server/applications/sync/services/sync-paths-manager.service.spec.js +11 -15
  520. package/server/applications/sync/services/sync-paths-manager.service.spec.js.map +1 -1
  521. package/server/applications/sync/services/sync-queries.service.js +1 -5
  522. package/server/applications/sync/services/sync-queries.service.js.map +1 -1
  523. package/server/applications/sync/sync.config.js +1 -5
  524. package/server/applications/sync/sync.config.js.map +1 -1
  525. package/server/applications/sync/sync.controller.js +21 -6
  526. package/server/applications/sync/sync.controller.js.map +1 -1
  527. package/server/applications/sync/sync.controller.spec.js +1 -5
  528. package/server/applications/sync/sync.controller.spec.js.map +1 -1
  529. package/server/applications/sync/sync.module.js +1 -5
  530. package/server/applications/sync/sync.module.js.map +1 -1
  531. package/server/applications/sync/utils/functions.js +1 -5
  532. package/server/applications/sync/utils/functions.js.map +1 -1
  533. package/server/applications/sync/utils/normalizedMap.js +1 -5
  534. package/server/applications/sync/utils/normalizedMap.js.map +1 -1
  535. package/server/applications/sync/utils/routes.js +1 -5
  536. package/server/applications/sync/utils/routes.js.map +1 -1
  537. package/server/applications/users/admin-users.controller.js +2 -6
  538. package/server/applications/users/admin-users.controller.js.map +1 -1
  539. package/server/applications/users/admin-users.controller.spec.js +6 -10
  540. package/server/applications/users/admin-users.controller.spec.js.map +1 -1
  541. package/server/applications/users/constants/group.js +1 -5
  542. package/server/applications/users/constants/group.js.map +1 -1
  543. package/server/applications/users/constants/member.js +1 -5
  544. package/server/applications/users/constants/member.js.map +1 -1
  545. package/server/applications/users/constants/routes.js +1 -5
  546. package/server/applications/users/constants/routes.js.map +1 -1
  547. package/server/applications/users/constants/user.js +1 -5
  548. package/server/applications/users/constants/user.js.map +1 -1
  549. package/server/applications/users/constants/websocket.js +1 -5
  550. package/server/applications/users/constants/websocket.js.map +1 -1
  551. package/server/applications/users/decorators/permissions.decorator.js +1 -5
  552. package/server/applications/users/decorators/permissions.decorator.js.map +1 -1
  553. package/server/applications/users/decorators/roles.decorator.js +1 -5
  554. package/server/applications/users/decorators/roles.decorator.js.map +1 -1
  555. package/server/applications/users/decorators/user.decorator.js +1 -5
  556. package/server/applications/users/decorators/user.decorator.js.map +1 -1
  557. package/server/applications/users/dto/create-or-update-group.dto.js +1 -5
  558. package/server/applications/users/dto/create-or-update-group.dto.js.map +1 -1
  559. package/server/applications/users/dto/create-or-update-user.dto.js +1 -5
  560. package/server/applications/users/dto/create-or-update-user.dto.js.map +1 -1
  561. package/server/applications/users/dto/delete-user.dto.js +1 -5
  562. package/server/applications/users/dto/delete-user.dto.js.map +1 -1
  563. package/server/applications/users/dto/search-members.dto.js +1 -5
  564. package/server/applications/users/dto/search-members.dto.js.map +1 -1
  565. package/server/applications/users/dto/user-properties.dto.js +1 -5
  566. package/server/applications/users/dto/user-properties.dto.js.map +1 -1
  567. package/server/applications/users/guards/permissions.guard.js +1 -5
  568. package/server/applications/users/guards/permissions.guard.js.map +1 -1
  569. package/server/applications/users/guards/permissions.guard.spec.js +1 -5
  570. package/server/applications/users/guards/permissions.guard.spec.js.map +1 -1
  571. package/server/applications/users/guards/roles.guard.js +1 -5
  572. package/server/applications/users/guards/roles.guard.js.map +1 -1
  573. package/server/applications/users/guards/roles.guard.spec.js +1 -5
  574. package/server/applications/users/guards/roles.guard.spec.js.map +1 -1
  575. package/server/applications/users/interfaces/admin-group.interface.js +1 -5
  576. package/server/applications/users/interfaces/admin-group.interface.js.map +1 -1
  577. package/server/applications/users/interfaces/admin-user.interface.js +1 -5
  578. package/server/applications/users/interfaces/admin-user.interface.js.map +1 -1
  579. package/server/applications/users/interfaces/group-browse.interface.js +1 -5
  580. package/server/applications/users/interfaces/group-browse.interface.js.map +1 -1
  581. package/server/applications/users/interfaces/group-member.js +1 -5
  582. package/server/applications/users/interfaces/group-member.js.map +1 -1
  583. package/server/applications/users/interfaces/guest-user.interface.js +1 -5
  584. package/server/applications/users/interfaces/guest-user.interface.js.map +1 -1
  585. package/server/applications/users/interfaces/member.interface.js +1 -5
  586. package/server/applications/users/interfaces/member.interface.js.map +1 -1
  587. package/server/applications/users/interfaces/owner.interface.js +1 -5
  588. package/server/applications/users/interfaces/owner.interface.js.map +1 -1
  589. package/server/applications/users/interfaces/user-secrets.interface.js +1 -5
  590. package/server/applications/users/interfaces/user-secrets.interface.js.map +1 -1
  591. package/server/applications/users/interfaces/websocket.interface.js +1 -5
  592. package/server/applications/users/interfaces/websocket.interface.js.map +1 -1
  593. package/server/applications/users/models/user.model.js +1 -5
  594. package/server/applications/users/models/user.model.js.map +1 -1
  595. package/server/applications/users/schemas/group.interface.js +1 -5
  596. package/server/applications/users/schemas/group.interface.js.map +1 -1
  597. package/server/applications/users/schemas/groups.schema.js +1 -5
  598. package/server/applications/users/schemas/groups.schema.js.map +1 -1
  599. package/server/applications/users/schemas/user-group.interface.js +1 -5
  600. package/server/applications/users/schemas/user-group.interface.js.map +1 -1
  601. package/server/applications/users/schemas/user.interface.js +1 -5
  602. package/server/applications/users/schemas/user.interface.js.map +1 -1
  603. package/server/applications/users/schemas/users-groups.schema.js +1 -5
  604. package/server/applications/users/schemas/users-groups.schema.js.map +1 -1
  605. package/server/applications/users/schemas/users-guests.schema.js +1 -5
  606. package/server/applications/users/schemas/users-guests.schema.js.map +1 -1
  607. package/server/applications/users/schemas/users.schema.js +1 -5
  608. package/server/applications/users/schemas/users.schema.js.map +1 -1
  609. package/server/applications/users/services/admin-users-manager.service.js +67 -23
  610. package/server/applications/users/services/admin-users-manager.service.js.map +1 -1
  611. package/server/applications/users/services/admin-users-manager.service.spec.js +3 -7
  612. package/server/applications/users/services/admin-users-manager.service.spec.js.map +1 -1
  613. package/server/applications/users/services/admin-users-queries.service.js +65 -21
  614. package/server/applications/users/services/admin-users-queries.service.js.map +1 -1
  615. package/server/applications/users/services/users-manager.service.js +81 -25
  616. package/server/applications/users/services/users-manager.service.js.map +1 -1
  617. package/server/applications/users/services/users-manager.service.spec.js +14 -12
  618. package/server/applications/users/services/users-manager.service.spec.js.map +1 -1
  619. package/server/applications/users/services/users-queries.service.js +49 -17
  620. package/server/applications/users/services/users-queries.service.js.map +1 -1
  621. package/server/applications/users/users.controller.js +2 -6
  622. package/server/applications/users/users.controller.js.map +1 -1
  623. package/server/applications/users/users.controller.spec.js +5 -9
  624. package/server/applications/users/users.controller.spec.js.map +1 -1
  625. package/server/applications/users/users.e2e-spec.js +3 -7
  626. package/server/applications/users/users.e2e-spec.js.map +1 -1
  627. package/server/applications/users/users.gateway.js +29 -12
  628. package/server/applications/users/users.gateway.js.map +1 -1
  629. package/server/applications/users/users.gateway.spec.js +1 -5
  630. package/server/applications/users/users.gateway.spec.js.map +1 -1
  631. package/server/applications/users/users.module.js +1 -5
  632. package/server/applications/users/users.module.js.map +1 -1
  633. package/server/applications/users/utils/avatar.js +1 -5
  634. package/server/applications/users/utils/avatar.js.map +1 -1
  635. package/server/applications/users/utils/test.js +1 -5
  636. package/server/applications/users/utils/test.js.map +1 -1
  637. package/server/applications/webdav/constants/routes.js +1 -5
  638. package/server/applications/webdav/constants/routes.js.map +1 -1
  639. package/server/applications/webdav/constants/webdav.js +1 -5
  640. package/server/applications/webdav/constants/webdav.js.map +1 -1
  641. package/server/applications/webdav/decorators/if-header.decorator.js +1 -5
  642. package/server/applications/webdav/decorators/if-header.decorator.js.map +1 -1
  643. package/server/applications/webdav/decorators/webdav-context.decorator.js +1 -5
  644. package/server/applications/webdav/decorators/webdav-context.decorator.js.map +1 -1
  645. package/server/applications/webdav/filters/webdav.filter.js +1 -5
  646. package/server/applications/webdav/filters/webdav.filter.js.map +1 -1
  647. package/server/applications/webdav/filters/webdav.filter.spec.js +1 -5
  648. package/server/applications/webdav/filters/webdav.filter.spec.js.map +1 -1
  649. package/server/applications/webdav/guards/webdav-protocol.guard.js +54 -20
  650. package/server/applications/webdav/guards/webdav-protocol.guard.js.map +1 -1
  651. package/server/applications/webdav/guards/webdav-protocol.guard.spec.js +54 -0
  652. package/server/applications/webdav/guards/webdav-protocol.guard.spec.js.map +1 -1
  653. package/server/applications/webdav/interfaces/if-header.interface.js +1 -5
  654. package/server/applications/webdav/interfaces/if-header.interface.js.map +1 -1
  655. package/server/applications/webdav/interfaces/webdav.interface.js +1 -5
  656. package/server/applications/webdav/interfaces/webdav.interface.js.map +1 -1
  657. package/server/applications/webdav/models/webdav-file.model.js +1 -5
  658. package/server/applications/webdav/models/webdav-file.model.js.map +1 -1
  659. package/server/applications/webdav/services/webdav-methods.service.js +74 -26
  660. package/server/applications/webdav/services/webdav-methods.service.js.map +1 -1
  661. package/server/applications/webdav/services/webdav-methods.service.spec.js +15 -18
  662. package/server/applications/webdav/services/webdav-methods.service.spec.js.map +1 -1
  663. package/server/applications/webdav/services/webdav-spaces.service.js +17 -9
  664. package/server/applications/webdav/services/webdav-spaces.service.js.map +1 -1
  665. package/server/applications/webdav/services/webdav-spaces.service.spec.js +1 -5
  666. package/server/applications/webdav/services/webdav-spaces.service.spec.js.map +1 -1
  667. package/server/applications/webdav/utils/bootstrap.js +1 -5
  668. package/server/applications/webdav/utils/bootstrap.js.map +1 -1
  669. package/server/applications/webdav/utils/if-header.js +1 -5
  670. package/server/applications/webdav/utils/if-header.js.map +1 -1
  671. package/server/applications/webdav/utils/routes.js +1 -5
  672. package/server/applications/webdav/utils/routes.js.map +1 -1
  673. package/server/applications/webdav/utils/webdav.js +1 -5
  674. package/server/applications/webdav/utils/webdav.js.map +1 -1
  675. package/server/applications/webdav/utils/xml.js +1 -5
  676. package/server/applications/webdav/utils/xml.js.map +1 -1
  677. package/server/applications/webdav/webdav.controller.js +1 -5
  678. package/server/applications/webdav/webdav.controller.js.map +1 -1
  679. package/server/applications/webdav/webdav.controller.spec.js +1 -5
  680. package/server/applications/webdav/webdav.controller.spec.js.map +1 -1
  681. package/server/applications/webdav/webdav.e2e-spec.js +1 -5
  682. package/server/applications/webdav/webdav.e2e-spec.js.map +1 -1
  683. package/server/applications/webdav/webdav.module.js +1 -5
  684. package/server/applications/webdav/webdav.module.js.map +1 -1
  685. package/server/authentication/auth.config.js +23 -123
  686. package/server/authentication/auth.config.js.map +1 -1
  687. package/server/authentication/auth.controller.js +27 -21
  688. package/server/authentication/auth.controller.js.map +1 -1
  689. package/server/authentication/auth.controller.spec.js +6 -10
  690. package/server/authentication/auth.controller.spec.js.map +1 -1
  691. package/server/authentication/auth.e2e-spec.js +1 -5
  692. package/server/authentication/auth.e2e-spec.js.map +1 -1
  693. package/server/authentication/auth.module.js +17 -20
  694. package/server/authentication/auth.module.js.map +1 -1
  695. package/server/authentication/{services/auth-manager.service.js → auth.service.js} +41 -18
  696. package/server/authentication/auth.service.js.map +1 -0
  697. package/server/authentication/{services/auth-manager.service.spec.js → auth.service.spec.js} +6 -10
  698. package/server/authentication/auth.service.spec.js.map +1 -0
  699. package/server/authentication/constants/auth.js +1 -5
  700. package/server/authentication/constants/auth.js.map +1 -1
  701. package/server/authentication/constants/routes.js +41 -30
  702. package/server/authentication/constants/routes.js.map +1 -1
  703. package/server/authentication/constants/scope.js +2 -5
  704. package/server/authentication/constants/scope.js.map +1 -1
  705. package/server/authentication/decorators/auth-token-optional.decorator.js +1 -5
  706. package/server/authentication/decorators/auth-token-optional.decorator.js.map +1 -1
  707. package/server/authentication/decorators/auth-token-skip.decorator.js +1 -5
  708. package/server/authentication/decorators/auth-token-skip.decorator.js.map +1 -1
  709. package/server/authentication/dto/login-response.dto.js +1 -10
  710. package/server/authentication/dto/login-response.dto.js.map +1 -1
  711. package/server/authentication/dto/token-response.dto.js +1 -5
  712. package/server/authentication/dto/token-response.dto.js.map +1 -1
  713. package/server/authentication/guards/auth-anonymous.guard.js +1 -5
  714. package/server/authentication/guards/auth-anonymous.guard.js.map +1 -1
  715. package/server/authentication/guards/auth-anonymous.guard.spec.js +1 -5
  716. package/server/authentication/guards/auth-anonymous.guard.spec.js.map +1 -1
  717. package/server/authentication/guards/auth-anonymous.strategy.js +1 -5
  718. package/server/authentication/guards/auth-anonymous.strategy.js.map +1 -1
  719. package/server/authentication/guards/auth-basic.guard.js +1 -5
  720. package/server/authentication/guards/auth-basic.guard.js.map +1 -1
  721. package/server/authentication/guards/auth-basic.guard.spec.js +13 -14
  722. package/server/authentication/guards/auth-basic.guard.spec.js.map +1 -1
  723. package/server/authentication/guards/auth-basic.strategy.js +10 -11
  724. package/server/authentication/guards/auth-basic.strategy.js.map +1 -1
  725. package/server/authentication/guards/auth-digest.guard.js +1 -5
  726. package/server/authentication/guards/auth-digest.guard.js.map +1 -1
  727. package/server/authentication/guards/auth-digest.strategy.js +1 -5
  728. package/server/authentication/guards/auth-digest.strategy.js.map +1 -1
  729. package/server/authentication/guards/auth-local.guard.js +1 -5
  730. package/server/authentication/guards/auth-local.guard.js.map +1 -1
  731. package/server/authentication/guards/auth-local.guard.spec.js +9 -13
  732. package/server/authentication/guards/auth-local.guard.spec.js.map +1 -1
  733. package/server/authentication/guards/auth-local.strategy.js +6 -10
  734. package/server/authentication/guards/auth-local.strategy.js.map +1 -1
  735. package/server/authentication/guards/auth-token-access.guard.js +1 -5
  736. package/server/authentication/guards/auth-token-access.guard.js.map +1 -1
  737. package/server/authentication/guards/auth-token-access.guard.spec.js +3 -7
  738. package/server/authentication/guards/auth-token-access.guard.spec.js.map +1 -1
  739. package/server/authentication/guards/auth-token-access.strategy.js +3 -7
  740. package/server/authentication/guards/auth-token-access.strategy.js.map +1 -1
  741. package/server/authentication/guards/auth-token-refresh.guard.js +1 -5
  742. package/server/authentication/guards/auth-token-refresh.guard.js.map +1 -1
  743. package/server/authentication/guards/auth-token-refresh.guard.spec.js +3 -7
  744. package/server/authentication/guards/auth-token-refresh.guard.spec.js.map +1 -1
  745. package/server/authentication/guards/auth-token-refresh.strategy.js +3 -7
  746. package/server/authentication/guards/auth-token-refresh.strategy.js.map +1 -1
  747. package/server/authentication/guards/implementations/http-basic.strategy.js +1 -5
  748. package/server/authentication/guards/implementations/http-basic.strategy.js.map +1 -1
  749. package/server/authentication/guards/implementations/http-digest.strategy.js +1 -5
  750. package/server/authentication/guards/implementations/http-digest.strategy.js.map +1 -1
  751. package/server/authentication/interfaces/auth-request.interface.js +1 -5
  752. package/server/authentication/interfaces/auth-request.interface.js.map +1 -1
  753. package/server/authentication/interfaces/jwt-payload.interface.js +1 -5
  754. package/server/authentication/interfaces/jwt-payload.interface.js.map +1 -1
  755. package/server/authentication/interfaces/token.interface.js +1 -5
  756. package/server/authentication/interfaces/token.interface.js.map +1 -1
  757. package/server/authentication/providers/auth-providers.constants.js +18 -0
  758. package/server/authentication/providers/auth-providers.constants.js.map +1 -0
  759. package/server/authentication/providers/auth-providers.models.js +14 -0
  760. package/server/authentication/providers/auth-providers.models.js.map +1 -0
  761. package/server/authentication/providers/auth-providers.utils.js +42 -0
  762. package/server/authentication/providers/auth-providers.utils.js.map +1 -0
  763. package/server/authentication/providers/ldap/auth-ldap.config.js +143 -0
  764. package/server/authentication/providers/ldap/auth-ldap.config.js.map +1 -0
  765. package/server/authentication/{constants/auth-ldap.js → providers/ldap/auth-ldap.constants.js} +12 -6
  766. package/server/authentication/providers/ldap/auth-ldap.constants.js.map +1 -0
  767. package/server/authentication/providers/ldap/auth-provider-ldap.service.js +506 -0
  768. package/server/authentication/providers/ldap/auth-provider-ldap.service.js.map +1 -0
  769. package/server/authentication/providers/ldap/auth-provider-ldap.service.spec.js +674 -0
  770. package/server/authentication/providers/ldap/auth-provider-ldap.service.spec.js.map +1 -0
  771. package/server/authentication/{services/auth-methods/auth-method-database.service.js → providers/mysql/auth-provider-mysql.service.js} +16 -14
  772. package/server/authentication/providers/mysql/auth-provider-mysql.service.js.map +1 -0
  773. package/server/authentication/{services/auth-methods/auth-method-database.service.spec.js → providers/mysql/auth-provider-mysql.service.spec.js} +15 -19
  774. package/server/authentication/providers/mysql/auth-provider-mysql.service.spec.js.map +1 -0
  775. package/server/authentication/providers/oidc/auth-oidc-desktop.constants.js +30 -0
  776. package/server/authentication/providers/oidc/auth-oidc-desktop.constants.js.map +1 -0
  777. package/server/authentication/providers/oidc/auth-oidc.config.js +149 -0
  778. package/server/authentication/providers/oidc/auth-oidc.config.js.map +1 -0
  779. package/server/authentication/providers/oidc/auth-oidc.constants.js +39 -0
  780. package/server/authentication/providers/oidc/auth-oidc.constants.js.map +1 -0
  781. package/server/authentication/providers/oidc/auth-oidc.controller.js +83 -0
  782. package/server/authentication/providers/oidc/auth-oidc.controller.js.map +1 -0
  783. package/server/authentication/providers/oidc/auth-oidc.interfaces.js +6 -0
  784. package/server/authentication/providers/oidc/auth-oidc.interfaces.js.map +1 -0
  785. package/server/authentication/providers/oidc/auth-provider-oidc.module.js +36 -0
  786. package/server/authentication/providers/oidc/auth-provider-oidc.module.js.map +1 -0
  787. package/server/authentication/providers/oidc/auth-provider-oidc.service.js +373 -0
  788. package/server/authentication/providers/oidc/auth-provider-oidc.service.js.map +1 -0
  789. package/server/authentication/providers/oidc/auth-provider-oidc.service.spec.js +270 -0
  790. package/server/authentication/providers/oidc/auth-provider-oidc.service.spec.js.map +1 -0
  791. package/server/authentication/{services/auth-methods/auth-method-two-fa.service.js → providers/two-fa/auth-provider-two-fa.service.js} +56 -38
  792. package/server/authentication/providers/two-fa/auth-provider-two-fa.service.js.map +1 -0
  793. package/server/authentication/{services/auth-methods/auth-method-two-fa.service.spec.js → providers/two-fa/auth-provider-two-fa.service.spec.js} +6 -10
  794. package/server/authentication/providers/two-fa/auth-provider-two-fa.service.spec.js.map +1 -0
  795. package/server/authentication/{guards → providers/two-fa}/auth-two-fa-guard.js +10 -14
  796. package/server/authentication/providers/two-fa/auth-two-fa-guard.js.map +1 -0
  797. package/server/authentication/providers/two-fa/auth-two-fa.config.js +57 -0
  798. package/server/authentication/providers/two-fa/auth-two-fa.config.js.map +1 -0
  799. package/server/authentication/{dto/two-fa-verify.dto.js → providers/two-fa/auth-two-fa.dtos.js} +8 -6
  800. package/server/authentication/providers/two-fa/auth-two-fa.dtos.js.map +1 -0
  801. package/server/authentication/providers/two-fa/auth-two-fa.interfaces.js +6 -0
  802. package/server/authentication/providers/two-fa/auth-two-fa.interfaces.js.map +1 -0
  803. package/server/authentication/utils/crypt-secret.js +1 -5
  804. package/server/authentication/utils/crypt-secret.js.map +1 -1
  805. package/server/common/constants.js +1 -5
  806. package/server/common/constants.js.map +1 -1
  807. package/server/common/decorators.js +1 -5
  808. package/server/common/decorators.js.map +1 -1
  809. package/server/common/functions.js +25 -9
  810. package/server/common/functions.js.map +1 -1
  811. package/server/common/i18n.js +1 -5
  812. package/server/common/i18n.js.map +1 -1
  813. package/server/common/image.js +1 -5
  814. package/server/common/image.js.map +1 -1
  815. package/server/common/interfaces.js +1 -5
  816. package/server/common/interfaces.js.map +1 -1
  817. package/server/common/qrcode.js +1 -5
  818. package/server/common/qrcode.js.map +1 -1
  819. package/server/common/shared.js +6 -6
  820. package/server/common/shared.js.map +1 -1
  821. package/server/configuration/config.constants.js +1 -5
  822. package/server/configuration/config.constants.js.map +1 -1
  823. package/server/configuration/config.environment.js +2 -6
  824. package/server/configuration/config.environment.js.map +1 -1
  825. package/server/configuration/config.interfaces.js +1 -5
  826. package/server/configuration/config.interfaces.js.map +1 -1
  827. package/server/configuration/config.loader.js +1 -5
  828. package/server/configuration/config.loader.js.map +1 -1
  829. package/server/configuration/config.logger.js +4 -8
  830. package/server/configuration/config.logger.js.map +1 -1
  831. package/server/configuration/config.validation.js +7 -5
  832. package/server/configuration/config.validation.js.map +1 -1
  833. package/server/infrastructure/cache/adapters/mysql-cache.adapter.js +9 -7
  834. package/server/infrastructure/cache/adapters/mysql-cache.adapter.js.map +1 -1
  835. package/server/infrastructure/cache/adapters/redis-cache.adapter.js +1 -5
  836. package/server/infrastructure/cache/adapters/redis-cache.adapter.js.map +1 -1
  837. package/server/infrastructure/cache/cache.config.js +1 -5
  838. package/server/infrastructure/cache/cache.config.js.map +1 -1
  839. package/server/infrastructure/cache/cache.decorator.js +9 -7
  840. package/server/infrastructure/cache/cache.decorator.js.map +1 -1
  841. package/server/infrastructure/cache/cache.e2e-spec.js +1 -5
  842. package/server/infrastructure/cache/cache.e2e-spec.js.map +1 -1
  843. package/server/infrastructure/cache/cache.module.js +1 -5
  844. package/server/infrastructure/cache/cache.module.js.map +1 -1
  845. package/server/infrastructure/cache/schemas/mysql-cache.interface.js +1 -5
  846. package/server/infrastructure/cache/schemas/mysql-cache.interface.js.map +1 -1
  847. package/server/infrastructure/cache/schemas/mysql-cache.schema.js +1 -5
  848. package/server/infrastructure/cache/schemas/mysql-cache.schema.js.map +1 -1
  849. package/server/infrastructure/cache/services/cache.service.js +1 -5
  850. package/server/infrastructure/cache/services/cache.service.js.map +1 -1
  851. package/server/infrastructure/context/context.module.js +1 -5
  852. package/server/infrastructure/context/context.module.js.map +1 -1
  853. package/server/infrastructure/context/interceptors/context.interceptor.js +1 -5
  854. package/server/infrastructure/context/interceptors/context.interceptor.js.map +1 -1
  855. package/server/infrastructure/context/interceptors/context.interceptor.spec.js +2 -6
  856. package/server/infrastructure/context/interceptors/context.interceptor.spec.js.map +1 -1
  857. package/server/infrastructure/context/interfaces/context-store.interface.js +1 -5
  858. package/server/infrastructure/context/interfaces/context-store.interface.js.map +1 -1
  859. package/server/infrastructure/context/services/context-manager.service.js +1 -5
  860. package/server/infrastructure/context/services/context-manager.service.js.map +1 -1
  861. package/server/infrastructure/context/services/context-manager.service.spec.js +1 -5
  862. package/server/infrastructure/context/services/context-manager.service.spec.js.map +1 -1
  863. package/server/infrastructure/database/columns.js +1 -5
  864. package/server/infrastructure/database/columns.js.map +1 -1
  865. package/server/infrastructure/database/configuration.js +1 -5
  866. package/server/infrastructure/database/configuration.js.map +1 -1
  867. package/server/infrastructure/database/constants.js +2 -6
  868. package/server/infrastructure/database/constants.js.map +1 -1
  869. package/server/infrastructure/database/database.config.js +1 -5
  870. package/server/infrastructure/database/database.config.js.map +1 -1
  871. package/server/infrastructure/database/database.logger.js +1 -5
  872. package/server/infrastructure/database/database.logger.js.map +1 -1
  873. package/server/infrastructure/database/database.module.js +1 -5
  874. package/server/infrastructure/database/database.module.js.map +1 -1
  875. package/server/infrastructure/database/interfaces/database.interface.js +1 -5
  876. package/server/infrastructure/database/interfaces/database.interface.js.map +1 -1
  877. package/server/infrastructure/database/schema.js +1 -5
  878. package/server/infrastructure/database/schema.js.map +1 -1
  879. package/server/infrastructure/database/scripts/create-user.js +1 -5
  880. package/server/infrastructure/database/scripts/create-user.js.map +1 -1
  881. package/server/infrastructure/database/scripts/db.js +1 -5
  882. package/server/infrastructure/database/scripts/db.js.map +1 -1
  883. package/server/infrastructure/database/scripts/seed/main.js +1 -5
  884. package/server/infrastructure/database/scripts/seed/main.js.map +1 -1
  885. package/server/infrastructure/database/scripts/seed/usersgroups.js +1 -5
  886. package/server/infrastructure/database/scripts/seed/usersgroups.js.map +1 -1
  887. package/server/infrastructure/database/utils.js +1 -5
  888. package/server/infrastructure/database/utils.js.map +1 -1
  889. package/server/infrastructure/mailer/interfaces/mail.interface.js +1 -5
  890. package/server/infrastructure/mailer/interfaces/mail.interface.js.map +1 -1
  891. package/server/infrastructure/mailer/mailer.config.js +1 -5
  892. package/server/infrastructure/mailer/mailer.config.js.map +1 -1
  893. package/server/infrastructure/mailer/mailer.module.js +1 -5
  894. package/server/infrastructure/mailer/mailer.module.js.map +1 -1
  895. package/server/infrastructure/mailer/mailer.service.js +1 -5
  896. package/server/infrastructure/mailer/mailer.service.js.map +1 -1
  897. package/server/infrastructure/mailer/mailer.service.spec.js +2 -6
  898. package/server/infrastructure/mailer/mailer.service.spec.js.map +1 -1
  899. package/server/infrastructure/scheduler/scheduler.constants.js +1 -5
  900. package/server/infrastructure/scheduler/scheduler.constants.js.map +1 -1
  901. package/server/infrastructure/scheduler/scheduler.module.js +1 -5
  902. package/server/infrastructure/scheduler/scheduler.module.js.map +1 -1
  903. package/server/infrastructure/websocket/adapters/cluster.adapter.js +1 -5
  904. package/server/infrastructure/websocket/adapters/cluster.adapter.js.map +1 -1
  905. package/server/infrastructure/websocket/adapters/redis.adapter.js +1 -5
  906. package/server/infrastructure/websocket/adapters/redis.adapter.js.map +1 -1
  907. package/server/infrastructure/websocket/adapters/web-socket.adapter.js +1 -5
  908. package/server/infrastructure/websocket/adapters/web-socket.adapter.js.map +1 -1
  909. package/server/infrastructure/websocket/decorators/web-socket-user.decorator.js +1 -5
  910. package/server/infrastructure/websocket/decorators/web-socket-user.decorator.js.map +1 -1
  911. package/server/infrastructure/websocket/interfaces/auth-socket-io.interface.js +1 -5
  912. package/server/infrastructure/websocket/interfaces/auth-socket-io.interface.js.map +1 -1
  913. package/server/infrastructure/websocket/utils.js +1 -5
  914. package/server/infrastructure/websocket/utils.js.map +1 -1
  915. package/server/infrastructure/websocket/web-socket.config.js +1 -5
  916. package/server/infrastructure/websocket/web-socket.config.js.map +1 -1
  917. package/server/main.js +5 -0
  918. package/server/main.js.map +1 -1
  919. package/static/assets/pdfjs/build/pdf.mjs +724 -745
  920. package/static/assets/pdfjs/build/pdf.mjs.map +1 -1
  921. package/static/assets/pdfjs/build/pdf.sandbox.mjs +2 -2
  922. package/static/assets/pdfjs/build/pdf.worker.mjs +706 -193
  923. package/static/assets/pdfjs/build/pdf.worker.mjs.map +1 -1
  924. package/static/assets/pdfjs/version +1 -1
  925. package/static/assets/pdfjs/web/locale/dsb/viewer.ftl +5 -5
  926. package/static/assets/pdfjs/web/locale/en-US/viewer.ftl +1 -0
  927. package/static/assets/pdfjs/web/locale/fur/viewer.ftl +5 -0
  928. package/static/assets/pdfjs/web/locale/kk/viewer.ftl +28 -0
  929. package/static/assets/pdfjs/web/locale/ml/viewer.ftl +4 -0
  930. package/static/assets/pdfjs/web/locale/ru/viewer.ftl +3 -3
  931. package/static/assets/pdfjs/web/viewer.css +207 -65
  932. package/static/assets/pdfjs/web/viewer.html +11 -10
  933. package/static/assets/pdfjs/web/viewer.mjs +850 -270
  934. package/static/assets/pdfjs/web/viewer.mjs.map +1 -1
  935. package/static/assets/pdfjs/web/wasm/LICENSE_JBIG2 +196 -0
  936. package/static/assets/pdfjs/web/wasm/LICENSE_PDFJS_JBIG2 +13 -0
  937. package/static/assets/pdfjs/web/wasm/jbig2.wasm +0 -0
  938. package/static/chunk-22TZP6HW.js +1 -0
  939. package/static/{chunk-U5E5H2DD.js → chunk-27ATUHBH.js} +1 -1
  940. package/static/{chunk-HZAB6F4Q.js → chunk-2CKLZ3FM.js} +1 -1
  941. package/static/{chunk-XZHWESIY.js → chunk-2QZPX7LO.js} +1 -1
  942. package/static/{chunk-UOK3LKSX.js → chunk-2R6IBBPZ.js} +1 -1
  943. package/static/{chunk-DVCN3P7Q.js → chunk-4FIGEBNL.js} +1 -1
  944. package/static/chunk-4P3JABAP.js +13 -0
  945. package/static/chunk-5CZOSAMZ.js +1 -0
  946. package/static/{chunk-RBTLSPYJ.js → chunk-677WUBCT.js} +1 -1
  947. package/static/{chunk-KEZNIIFH.js → chunk-74CAHBFM.js} +1 -1
  948. package/static/{chunk-WRK2FTKU.js → chunk-7GWW6MJO.js} +1 -1
  949. package/static/{chunk-EKWB5W72.js → chunk-7WOPGQXB.js} +1 -1
  950. package/static/{chunk-IMFO2MI7.js → chunk-A4UGPSWX.js} +1 -1
  951. package/static/{chunk-KDUAB76O.js → chunk-AHO37FKW.js} +1 -1
  952. package/static/chunk-AQCXMKP3.js +1 -0
  953. package/static/chunk-B6PDYCRO.js +3 -0
  954. package/static/{chunk-PPJCVBJH.js → chunk-CU76ATCF.js} +1 -1
  955. package/static/{chunk-ARS47O5X.js → chunk-CWYHOPOP.js} +1 -1
  956. package/static/{chunk-CSVPAZHK.js → chunk-E5WI5725.js} +1 -1
  957. package/static/{chunk-XX3JPJUM.js → chunk-FC5HTKVM.js} +1 -1
  958. package/static/{chunk-QGHNJVJ6.js → chunk-FOSM7EYI.js} +1 -1
  959. package/static/{chunk-JAJ7VXMB.js → chunk-GAZO25PI.js} +1 -1
  960. package/static/{chunk-IHS5LSJJ.js → chunk-GB7ABR5N.js} +1 -1
  961. package/static/{chunk-27V66YJV.js → chunk-GEHFKZQ5.js} +2 -2
  962. package/static/{chunk-3QTROEHV.js → chunk-GQFMWVFD.js} +1 -1
  963. package/static/{chunk-FWQJ4ZCD.js → chunk-GVNTC564.js} +1 -1
  964. package/static/{chunk-4NIYCYRS.js → chunk-HGL3NYP2.js} +2 -2
  965. package/static/chunk-HLIWPWRA.js +1 -0
  966. package/static/{chunk-3VRUIWQG.js → chunk-HNYB3M4S.js} +1 -1
  967. package/static/{chunk-7HJFIMNF.js → chunk-HUXAUQMN.js} +1 -1
  968. package/static/chunk-I2XA6PPK.js +1 -0
  969. package/static/{chunk-RJULB733.js → chunk-ISV3BO6R.js} +1 -1
  970. package/static/{chunk-R4VYKZVJ.js → chunk-IWWBV6EM.js} +1 -1
  971. package/static/{chunk-TTWMFWEC.js → chunk-JV3AGU5B.js} +1 -1
  972. package/static/{chunk-X7NHX5C7.js → chunk-K25E7YGG.js} +1 -1
  973. package/static/chunk-K46PUTZB.js +1 -0
  974. package/static/{chunk-D2MLAO5N.js → chunk-KERFLJ56.js} +1 -7
  975. package/static/{chunk-LZUHREOF.js → chunk-KJD3KFF3.js} +1 -1
  976. package/static/chunk-KPKSI23S.js +1 -0
  977. package/static/{chunk-CMNMPG6Z.js → chunk-KZS7CTNR.js} +1 -1
  978. package/static/{chunk-RNVPQQKT.js → chunk-L5IHUVXL.js} +1 -1
  979. package/static/{chunk-2GXOVGTD.js → chunk-L7RRX2M3.js} +1 -1
  980. package/static/{chunk-WFMEUST4.js → chunk-LGWJ2WKU.js} +1 -1
  981. package/static/{chunk-ZOMRIN3G.js → chunk-MLC7JK2H.js} +2 -2
  982. package/static/{chunk-76REYAEA.js → chunk-MOHNYW2A.js} +1 -1
  983. package/static/{chunk-ZHUBWKA2.js → chunk-MTRXBVWZ.js} +1 -1
  984. package/static/{chunk-QJ22N76V.js → chunk-MZQK6LNV.js} +1 -1
  985. package/static/{chunk-SDJNZULP.js → chunk-NCDUOVMW.js} +1 -1
  986. package/static/chunk-NGUAJIGI.js +1 -0
  987. package/static/chunk-NIPP6JDI.js +1 -0
  988. package/static/{chunk-VD5JHSDS.js → chunk-NMTBMHUL.js} +1 -1
  989. package/static/chunk-O4XXMZFX.js +4 -0
  990. package/static/{chunk-WZPF4LS2.js → chunk-OANZITPM.js} +1 -1
  991. package/static/{chunk-JNTNMIUH.js → chunk-OGE4SAHU.js} +1 -1
  992. package/static/{chunk-S6H2ELRY.js → chunk-OI3ME22C.js} +1 -1
  993. package/static/{chunk-7KAYOR3A.js → chunk-Q3EGCMF5.js} +1 -1
  994. package/static/chunk-QF2NSHZA.js +1 -0
  995. package/static/{chunk-3ZBAQTHJ.js → chunk-QIGUDEZF.js} +1 -1
  996. package/static/{chunk-76M3BMK6.js → chunk-QJVC3SRJ.js} +11 -11
  997. package/static/{chunk-VBTZDHZ3.js → chunk-QKN6LAAA.js} +1 -1
  998. package/static/{chunk-JRXG43AA.js → chunk-QRFESU5O.js} +2 -2
  999. package/static/chunk-QVRVFYJH.js +1 -0
  1000. package/static/{chunk-BCN4T5DO.js → chunk-RFJIPIOK.js} +2 -2
  1001. package/static/{chunk-2RWLNKZH.js → chunk-RLL634K4.js} +1 -1
  1002. package/static/{chunk-D5FQ72R4.js → chunk-RS2OFKWP.js} +1 -1
  1003. package/static/{chunk-CN5YVRFT.js → chunk-RWAAC3A4.js} +1 -1
  1004. package/static/{chunk-LWSCODLD.js → chunk-RWCNTCU5.js} +1 -1
  1005. package/static/{chunk-FTFEQDWH.js → chunk-S5Y64DDS.js} +1 -1
  1006. package/static/{chunk-J7474P3L.js → chunk-SLG5KDU6.js} +1 -1
  1007. package/static/chunk-TJ4CVFEL.js +1 -0
  1008. package/static/{chunk-KAUCN24H.js → chunk-TWCGKSYE.js} +1 -1
  1009. package/static/{chunk-PDG7DOEF.js → chunk-UMDRE4S7.js} +1 -1
  1010. package/static/chunk-VRIOLRYR.js +5 -0
  1011. package/static/chunk-VS4O2XDP.js +1 -0
  1012. package/static/{chunk-ZEJLIGAY.js → chunk-VSBFNFOM.js} +1 -1
  1013. package/static/{chunk-XSURUW7C.js → chunk-WN4WXCVK.js} +1 -1
  1014. package/static/{chunk-S44QIK3G.js → chunk-WX7RXW7K.js} +1 -1
  1015. package/static/{chunk-3ZLBVUCX.js → chunk-XC4POKR3.js} +2 -2
  1016. package/static/{chunk-TNCKNU6I.js → chunk-Y4AUYQTG.js} +1 -1
  1017. package/static/{chunk-3MVPXC3U.js → chunk-Y67J3BOL.js} +1 -1
  1018. package/static/{chunk-QTPIEEZW.js → chunk-YMIXHRJQ.js} +1 -7
  1019. package/static/{chunk-VZFZUI6D.js → chunk-ZUNKFAKP.js} +1 -1
  1020. package/static/index.html +3 -3
  1021. package/static/main-QN4UCOC5.js +5 -0
  1022. package/static/{styles-XLLEY5Y3.css → styles-46GLIE7Y.css} +1 -1
  1023. package/server/authentication/constants/auth-ldap.js.map +0 -1
  1024. package/server/authentication/dto/two-fa-verify.dto.js.map +0 -1
  1025. package/server/authentication/guards/auth-two-fa-guard.js.map +0 -1
  1026. package/server/authentication/interfaces/two-fa-setup.interface.js +0 -10
  1027. package/server/authentication/interfaces/two-fa-setup.interface.js.map +0 -1
  1028. package/server/authentication/models/auth-method.js +0 -18
  1029. package/server/authentication/models/auth-method.js.map +0 -1
  1030. package/server/authentication/services/auth-manager.service.js.map +0 -1
  1031. package/server/authentication/services/auth-manager.service.spec.js.map +0 -1
  1032. package/server/authentication/services/auth-methods/auth-method-database.service.js.map +0 -1
  1033. package/server/authentication/services/auth-methods/auth-method-database.service.spec.js.map +0 -1
  1034. package/server/authentication/services/auth-methods/auth-method-ldap.service.js +0 -326
  1035. package/server/authentication/services/auth-methods/auth-method-ldap.service.js.map +0 -1
  1036. package/server/authentication/services/auth-methods/auth-method-ldap.service.spec.js +0 -534
  1037. package/server/authentication/services/auth-methods/auth-method-ldap.service.spec.js.map +0 -1
  1038. package/server/authentication/services/auth-methods/auth-method-two-fa.service.js.map +0 -1
  1039. package/server/authentication/services/auth-methods/auth-method-two-fa.service.spec.js.map +0 -1
  1040. package/static/chunk-2YQ4SX3A.js +0 -13
  1041. package/static/chunk-46TJLPJY.js +0 -1
  1042. package/static/chunk-6OEOADR6.js +0 -1
  1043. package/static/chunk-AALPWGPB.js +0 -3
  1044. package/static/chunk-CVXLHSO5.js +0 -1
  1045. package/static/chunk-G7RZN7HN.js +0 -1
  1046. package/static/chunk-LTJNLOX2.js +0 -1
  1047. package/static/chunk-NIKNG2FX.js +0 -1
  1048. package/static/chunk-NNZWSNAW.js +0 -1
  1049. package/static/chunk-NWKBB7J4.js +0 -1
  1050. package/static/chunk-PVYVY3GD.js +0 -1
  1051. package/static/chunk-Q5X5TPAG.js +0 -1
  1052. package/static/chunk-R4VMWCM5.js +0 -1
  1053. package/static/chunk-SNOOCDJD.js +0 -1
  1054. package/static/chunk-SPQH3ATC.js +0 -5
  1055. package/static/chunk-ZCSHU3D7.js +0 -1
  1056. package/static/chunk-ZU5MQTFN.js +0 -4
  1057. package/static/main-5O3KLGIR.js +0 -11
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/files/services/files-manager.service.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { HttpService } from '@nestjs/axios'\nimport { HttpStatus, Injectable, Logger } from '@nestjs/common'\nimport archiver, { Archiver, ArchiverError } from 'archiver'\nimport { AxiosResponse } from 'axios'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport { Readable } from 'node:stream'\nimport { extract as extractTar } from 'tar'\nimport { FastifyAuthenticatedRequest } from '../../../authentication/interfaces/auth-request.interface'\nimport { generateThumbnail } from '../../../common/image'\nimport { SERVER_NAME } from '../../../common/shared'\nimport { ContextManager } from '../../../infrastructure/context/services/context-manager.service'\nimport { HTTP_METHOD } from '../../applications.constants'\nimport { NOTIFICATION_APP, NOTIFICATION_APP_EVENT } from '../../notifications/constants/notifications'\nimport { NotificationContent } from '../../notifications/interfaces/notification-properties.interface'\nimport { NotificationsManager } from '../../notifications/services/notifications-manager.service'\nimport { SPACE_OPERATION } from '../../spaces/constants/spaces'\nimport { FastifySpaceRequest } from '../../spaces/interfaces/space-request.interface'\nimport { SpaceEnv } from '../../spaces/models/space-env.model'\nimport { SpacesManager } from '../../spaces/services/spaces-manager.service'\nimport { realTrashPathFromSpace } from '../../spaces/utils/paths'\nimport { canAccessToSpace, haveSpaceEnvPermissions } from '../../spaces/utils/permissions'\nimport { UserModel } from '../../users/models/user.model'\nimport { DEPTH, LOCK_DEPTH } from '../../webdav/constants/webdav'\nimport { CACHE_LOCK_FILE_TTL } from '../constants/cache'\nimport { tarGzExtension } from '../constants/compress'\nimport { COMPRESSION_EXTENSION, DEFAULT_HIGH_WATER_MARK } from '../constants/files'\nimport { FILE_OPERATION } from '../constants/operations'\nimport { DOCUMENT_TYPE, SAMPLE_PATH_WITHOUT_EXT } from '../constants/samples'\nimport { CompressFileDto } from '../dto/file-operations.dto'\nimport { FileTaskEvent } from '../events/file-task-event'\nimport { FileDBProps } from '../interfaces/file-db-props.interface'\nimport { FileLock } from '../interfaces/file-lock.interface'\nimport { FileLockProps } from '../interfaces/file-props.interface'\nimport { FileError } from '../models/file-error'\nimport { LockConflict } from '../models/file-lock-error'\nimport {\n checkFileName,\n copyFileContent,\n copyFiles,\n createEmptyFile,\n dirName,\n dirSize,\n fileName,\n fileSize,\n getMimeType,\n isPathExists,\n isPathIsDir,\n makeDir,\n moveFiles,\n removeFiles,\n touchFile,\n uniqueDatedFilePath,\n uniqueFilePathFromDir,\n writeFromStream,\n writeFromStreamAndChecksum\n} from '../utils/files'\nimport { SendFile } from '../utils/send-file'\nimport { extractZip } from '../utils/unzip-file'\nimport { regExpPrivateIP } from '../utils/url-file'\nimport { FilesLockManager } from './files-lock-manager.service'\nimport { FilesQueries } from './files-queries.service'\n\n@Injectable()\nexport class FilesManager {\n /* Spaces permissions are checked in the space guard, except for the copy/move destination */\n private logger = new Logger(FilesManager.name)\n\n constructor(\n private readonly http: HttpService,\n private readonly filesQueries: FilesQueries,\n private readonly spacesManager: SpacesManager,\n private readonly contextManager: ContextManager,\n private readonly notificationsManager: NotificationsManager,\n public readonly filesLockManager: FilesLockManager\n ) {}\n\n sendFileFromSpace(space: SpaceEnv, downloadName = ''): SendFile {\n return new SendFile(space.realPath, downloadName)\n }\n\n async saveStream(\n user: UserModel,\n space: SpaceEnv,\n req: FastifyAuthenticatedRequest,\n options: {\n checksumAlg: string\n tmpPath?: string\n }\n ): Promise<string>\n async saveStream(user: UserModel, space: SpaceEnv, req: FastifyAuthenticatedRequest, options?: any): Promise<boolean>\n async saveStream(\n user: UserModel,\n space: SpaceEnv,\n req: FastifyAuthenticatedRequest,\n options?: { dav?: { depth: LOCK_DEPTH; lockTokens: string[] }; checksumAlg?: string; tmpPath?: string }\n ): Promise<boolean | string> {\n // If tmpPath is used, we lock the final destination during the transfer\n // space.realPath is replaced by tmpPath (if allowed). If the move operation failed, we remove the tmp file\n const fExists = await isPathExists(space.realPath)\n const fTmpExists = options?.tmpPath ? await isPathExists(options.tmpPath) : false\n if (fExists && req.method === HTTP_METHOD.POST) {\n throw new FileError(HttpStatus.METHOD_NOT_ALLOWED, 'Resource already exists')\n }\n if (fExists && (await isPathIsDir(space.realPath))) {\n throw new FileError(HttpStatus.METHOD_NOT_ALLOWED, 'The location is a directory')\n }\n if (options?.tmpPath) {\n // Ensure tmpPath parent dir exists\n await makeDir(dirName(options.tmpPath), true)\n } else if (!(await isPathExists(dirName(space.realPath)))) {\n throw new FileError(HttpStatus.CONFLICT, 'Parent must exists')\n }\n /* File Lock */\n let fileLock: FileLock | undefined\n if (options?.dav) {\n // Check locks\n await this.filesLockManager.checkConflicts(space.dbFile, options?.dav?.depth || DEPTH.RESOURCE, {\n userId: user.id,\n lockTokens: options.dav?.lockTokens\n })\n } else {\n // Create lock if there is no webdav context\n const [ok, lock] = await this.filesLockManager.create(user, space.dbFile, SERVER_NAME, DEPTH.RESOURCE)\n if (!ok) {\n throw new LockConflict(lock, 'Conflicting lock')\n }\n fileLock = lock\n }\n try {\n // Check range\n let startRange = 0\n if ((fExists || fTmpExists) && req.headers['content-range']) {\n // With PUT method, some webdav clients use the `content-range` header,\n // which is normally reserved for a response to a request containing the `range` header.\n // However, for more compatibility let's accept it.\n const match = /\\d+/.exec(req.headers['content-range'])\n if (!match.length) {\n throw new FileError(HttpStatus.BAD_REQUEST, 'Content-range : header is malformed')\n }\n startRange = parseInt(match[0], 10)\n const size = await fileSize(options?.tmpPath || space.realPath)\n if (startRange !== size) {\n throw new FileError(HttpStatus.BAD_REQUEST, 'Content-range : start offset does not match the current file size')\n }\n }\n // todo: check file in db to update\n // todo : versioning here\n let checksum: string\n if (options?.checksumAlg) {\n checksum = await writeFromStreamAndChecksum(options?.tmpPath || space.realPath, req.raw, startRange, options.checksumAlg)\n } else {\n await writeFromStream(options?.tmpPath || space.realPath, req.raw, startRange)\n }\n if (options?.tmpPath) {\n try {\n // ensure parent path exists\n await makeDir(path.dirname(space.realPath), true)\n // move the uploaded file to destination\n await moveFiles(options.tmpPath, space.realPath, true)\n } catch (e) {\n // cleanup tmp file\n await removeFiles(options.tmpPath)\n this.logger.error(`${this.saveStream.name} - unable to move ${options.tmpPath} -> ${space.realPath} : ${e}`)\n throw new FileError(HttpStatus.INTERNAL_SERVER_ERROR, 'Unable to move tmp file to dst file')\n }\n }\n if (options?.checksumAlg) {\n return checksum\n }\n return fExists\n } finally {\n if (fileLock) {\n try {\n await this.filesLockManager.removeLock(fileLock.key)\n } catch (e) {\n this.logger.warn(`Failed to remove lock ${fileLock.key}: ${e}`)\n }\n }\n }\n }\n\n async saveMultipart(user: UserModel, space: SpaceEnv, req: FastifySpaceRequest) {\n /* Accepted methods:\n POST: Creates new resource\n PUT: Creates or fully replaces a resource at the given URI (even if intermediate paths do not exist)\n PATCH: Updates the content of an existing resource without creating a new one.\n In this text-editing scenario, locking and refreshing occur automatically, but unlocking must be handled explicitly via\n the `unlock` method.\n */\n const overwrite = req.method === HTTP_METHOD.PUT\n const patch = req.method === HTTP_METHOD.PATCH\n const realParentPath = dirName(space.realPath)\n\n if (!overwrite) {\n if (!patch && (await isPathExists(space.realPath))) {\n throw new FileError(HttpStatus.BAD_REQUEST, 'Resource already exists')\n }\n if (!(await isPathExists(realParentPath))) {\n throw new FileError(HttpStatus.BAD_REQUEST, 'Parent must exists')\n }\n if (!(await isPathIsDir(realParentPath))) {\n throw new FileError(HttpStatus.BAD_REQUEST, 'Parent must be a directory')\n }\n }\n\n const basePath = realParentPath + path.sep\n\n for await (const part of req.files()) {\n // If the request uses the PATCH method, the file name corresponds to the space\n const partFileName = patch ? fileName(space.realPath) : part.filename\n // `part.filename` may contain a path like foo/bar.txt\n const dstFile = path.resolve(basePath, partFileName)\n // Prevent path traversal\n if (!dstFile.startsWith(basePath)) {\n throw new FileError(HttpStatus.FORBIDDEN, 'Location is not allowed')\n }\n\n const dstDir = dirName(dstFile)\n\n if (overwrite) {\n // Prevent errors when an uploaded file would replace a directory with the same name\n // Only applies in `overwrite` cases\n if ((await isPathExists(dstFile)) && (await isPathIsDir(dstFile))) {\n // If a directory already exists at the destination path, delete it to allow overwriting with the uploaded file\n const dstUrl = path.join(path.dirname(space.url), partFileName)\n const dstSpace = await this.spacesManager.spaceEnv(user, dstUrl.split('/'))\n await this.delete(user, dstSpace)\n } else if ((await isPathExists(dstDir)) && !(await isPathIsDir(dstDir))) {\n // If the destination's parent exists but is a file, remove it so we can create the directory\n const dstUrl = path.join(path.dirname(space.url), path.dirname(partFileName))\n const dstSpace = await this.spacesManager.spaceEnv(user, dstUrl.split('/'))\n await this.delete(user, dstSpace)\n }\n }\n // Create the directory in the space\n if (!(await isPathExists(dstDir))) {\n await makeDir(dstDir, true)\n }\n // Create or refresh lock\n const dbFile = { ...space.dbFile, path: path.join(dirName(space.dbFile.path), partFileName) }\n // Use a short TTL for the PATCH method (which is also used for refreshing)\n const ttl = patch ? CACHE_LOCK_FILE_TTL : undefined\n const [created, fileLock] = await this.filesLockManager.createOrRefresh(user, dbFile, SERVER_NAME, DEPTH.RESOURCE, ttl)\n // Do\n try {\n await writeFromStream(dstFile, part.file)\n } finally {\n if (!patch && created) {\n // Remove the file lock only if it has not been refreshed\n await this.filesLockManager.removeLock(fileLock.key)\n }\n }\n if (patch) {\n // Only one resource can be updated with the PATCH method.\n break\n }\n }\n }\n\n async touch(user: UserModel, space: SpaceEnv, mtime: number, checkLocks = true): Promise<void> {\n if (!(await isPathExists(space.realPath))) {\n throw new FileError(HttpStatus.NOT_FOUND, 'Location not found')\n }\n if (checkLocks) {\n await this.filesLockManager.checkConflicts(space.dbFile, DEPTH.RESOURCE, { userId: user.id })\n }\n // todo: update mtime in last files ( & in db file ?)\n await touchFile(space.realPath, mtime)\n }\n\n async mkFile(user: UserModel, space: SpaceEnv, overwrite = false, checkLocks = true, checkDocument = false): Promise<void> {\n checkFileName(space.realPath)\n if (!overwrite && (await isPathExists(space.realPath))) {\n throw new FileError(HttpStatus.BAD_REQUEST, 'Resource already exists')\n }\n if (checkLocks) {\n await this.filesLockManager.checkConflicts(space.dbFile, DEPTH.RESOURCE, { userId: user.id })\n }\n // use sample documents when possible\n const fileExtension = path.extname(space.realPath)\n if (checkDocument && fileExtension !== '.txt' && Object.values(DOCUMENT_TYPE).indexOf(fileExtension) > -1) {\n const srcSample = path.join(__dirname, `${SAMPLE_PATH_WITHOUT_EXT}${fileExtension}`)\n return copyFileContent(srcSample, space.realPath)\n } else {\n return createEmptyFile(space.realPath)\n }\n }\n\n async mkDir(user: UserModel, space: SpaceEnv, recursive = false, dav?: { depth: LOCK_DEPTH; lockTokens: string[] }): Promise<void> {\n checkFileName(space.realPath)\n if (!recursive) {\n if (await isPathExists(space.realPath)) {\n throw new FileError(HttpStatus.METHOD_NOT_ALLOWED, 'Resource already exists')\n } else if (!(await isPathExists(dirName(space.realPath)))) {\n throw new FileError(HttpStatus.CONFLICT, 'Parent must exists')\n }\n }\n await this.filesLockManager.checkConflicts(space.dbFile, dav?.depth || DEPTH.RESOURCE, { userId: user.id, lockTokens: dav?.lockTokens })\n await makeDir(space.realPath, recursive)\n }\n\n async copyMove(\n user: UserModel,\n srcSpace: SpaceEnv,\n dstSpace: SpaceEnv,\n isMove: boolean,\n overwrite = false,\n mkdirDstParentPath = false,\n dav?: { depth: LOCK_DEPTH; lockTokens: string[] }\n ): Promise<void> {\n // checks\n if (!canAccessToSpace(user, dstSpace)) {\n this.logger.warn(`${this.copyMove.name} - is not allowed to access to this space repository : ${dstSpace.repository}`)\n throw new FileError(HttpStatus.FORBIDDEN, 'You are not allowed to access to this repository')\n }\n if (!haveSpaceEnvPermissions(dstSpace, SPACE_OPERATION.ADD)) {\n this.logger.warn(`${this.copyMove.name} - is not allowed to copy/move on this space : *${dstSpace.alias}* (${dstSpace.id}) : ${dstSpace.url}`)\n throw new FileError(HttpStatus.FORBIDDEN, 'You are not allowed to copy/move on the destination')\n }\n if (dstSpace.quotaIsExceeded) {\n this.logger.warn(`${this.copyMove.name} - quota is exceeded for *${dstSpace.alias}* (${dstSpace.id})`)\n throw new FileError(HttpStatus.INSUFFICIENT_STORAGE, 'Quota is exceeded')\n }\n if (!(await isPathExists(srcSpace.realPath))) {\n throw new FileError(HttpStatus.NOT_FOUND, 'Location not found')\n }\n if (!(await isPathExists(dirName(dstSpace.realPath)))) {\n if (mkdirDstParentPath) {\n try {\n await makeDir(dirName(dstSpace.realPath), true)\n } catch (e) {\n this.logger.error(`${this.copyMove.name} - Cannot create parent directory for destination ${dstSpace.realPath} : ${e}`)\n throw new FileError(HttpStatus.INTERNAL_SERVER_ERROR, 'Cannot create parent directory for destination')\n }\n } else {\n throw new FileError(HttpStatus.CONFLICT, 'Parent must exists')\n }\n }\n if (srcSpace.realPath === dstSpace.realPath) {\n throw new FileError(HttpStatus.FORBIDDEN, 'Cannot copy/move source onto itself')\n }\n if (`${dstSpace.realPath}/`.startsWith(`${srcSpace.realPath}/`)) {\n throw new FileError(HttpStatus.FORBIDDEN, 'Cannot copy/move source below itself')\n }\n if (dirName(srcSpace.url) === dirName(dstSpace.url) && dirName(srcSpace.realPath) !== dirName(dstSpace.realPath)) {\n /* Handle renaming a space file with the same name as a space root :\n srcSpace.url = '/space/sync-in/code2.ts' (a space file)\n srcSpace.realPath = '/home/sync-in/spaces/sync-in/code2.ts\n dstSpace.url = '/space/sync-in/code.ts' (a space root)\n dstSpace.realPath = '/home/sync-in/users/jo/files/code2.ts !!\n */\n throw new FileError(HttpStatus.BAD_REQUEST, 'An anchored file already has this name')\n }\n if (!overwrite && (await isPathExists(dstSpace.realPath))) {\n /* Handle case-sensitive (in renaming context):\n srcSpace.url = '/space/sync-in/code.ts'\n dstSpace.url = '/space/sync-in/code.TS'\n The destination exists because it's the same file, bypass this\n */\n if (!(isMove && srcSpace.realPath.toLowerCase() === dstSpace.realPath.toLowerCase())) {\n throw new FileError(dav ? HttpStatus.PRECONDITION_FAILED : HttpStatus.BAD_REQUEST, 'The destination already exists')\n }\n }\n\n const isDir = await isPathIsDir(srcSpace.realPath)\n\n if (dstSpace.storageQuota) {\n /* Skip validation when moving to the same space; for copy operations, run all checks. */\n if (!isMove || (isMove && srcSpace.id !== dstSpace.id)) {\n const size = isDir ? (await dirSize(srcSpace.realPath))[0] : await fileSize(srcSpace.realPath)\n if (dstSpace.willExceedQuota(size)) {\n this.logger.warn(`${this.copyMove.name} - storage quota will be exceeded for *${dstSpace.alias}* (${dstSpace.id})`)\n throw new FileError(HttpStatus.INSUFFICIENT_STORAGE, 'Storage quota will be exceeded')\n }\n }\n }\n\n // check lock conflicts on source and destination\n let recursive: boolean\n let depth: LOCK_DEPTH\n if (dav?.depth) {\n recursive = dav.depth === DEPTH.INFINITY\n depth = dav.depth\n } else {\n recursive = isDir\n depth = recursive ? DEPTH.INFINITY : DEPTH.RESOURCE\n }\n if (isMove) {\n // check source\n await this.filesLockManager.checkConflicts(srcSpace.dbFile, depth, { userId: user.id, lockTokens: dav?.lockTokens })\n }\n // check destination\n await this.filesLockManager.checkConflicts(dstSpace.dbFile, depth, { userId: user.id, lockTokens: dav?.lockTokens })\n\n // overwrite\n if (overwrite && (await isPathExists(dstSpace.realPath))) {\n // todo : versioning here\n await this.delete(user, dstSpace)\n }\n\n // send it to task watcher\n if (srcSpace.task?.cacheKey) {\n if (!isDir) srcSpace.task.props.totalSize = await fileSize(srcSpace.realPath)\n FileTaskEvent.emit('startWatch', srcSpace, isMove ? FILE_OPERATION.MOVE : FILE_OPERATION.COPY, dstSpace.realPath)\n }\n\n // do\n if (isMove) {\n await moveFiles(srcSpace.realPath, dstSpace.realPath, overwrite)\n return this.filesQueries.moveFiles(srcSpace.dbFile, dstSpace.dbFile, isDir)\n }\n return copyFiles(srcSpace.realPath, dstSpace.realPath, overwrite, recursive)\n }\n\n async delete(user: UserModel, space: SpaceEnv, dav?: { lockTokens: string[] }): Promise<void> {\n if (!(await isPathExists(space.realPath))) {\n throw new FileError(HttpStatus.NOT_FOUND, 'Location not found')\n }\n // check lock conflicts\n const isDir = await isPathIsDir(space.realPath)\n await this.filesLockManager.checkConflicts(space.dbFile, isDir ? DEPTH.INFINITY : DEPTH.RESOURCE, {\n userId: user.id,\n lockTokens: dav?.lockTokens\n })\n // file system deletion\n let forceDeleteInDB = false\n if (space.inTrashRepository) {\n await removeFiles(space.realPath)\n } else {\n const baseTrashPath = realTrashPathFromSpace(user, space)\n if (baseTrashPath) {\n const name = fileName(space.realPath)\n const trashDir = path.join(baseTrashPath, dirName(space.dbFile.path))\n const trashFile = path.join(trashDir, name)\n if (!(await isPathExists(trashDir))) {\n await makeDir(trashDir, true)\n }\n if (await isPathExists(trashFile)) {\n // if a resource already exists in the trash, rename it with the date\n const dstTrash = await uniqueDatedFilePath(trashFile)\n // move the resource on fs\n await moveFiles(trashFile, dstTrash.path)\n // move the resource in db\n const trashFileDB: FileDBProps = { ...space.dbFile, inTrash: true }\n const dstTrashFileDB: FileDBProps = { ...trashFileDB, path: path.join(dirName(trashFileDB.path), fileName(dstTrash.path)) }\n await this.filesQueries.moveFiles(trashFileDB, dstTrashFileDB, dstTrash.isDir)\n }\n await moveFiles(space.realPath, trashFile, true)\n } else {\n // unsupported case: delete the file (this shouldn't happen)\n this.logger.error(`Unable to find trash path for space - *${space.alias}* (${space.id}) : delete permanently : ${space.realPath}`)\n forceDeleteInDB = true\n await removeFiles(space.realPath)\n }\n }\n // remove locks, these locks have already been checked in the `checkConflicts` function\n if (isDir) {\n this.filesLockManager.removeChildLocks(user, space.dbFile).catch((e: Error) => this.logger.error(`${this.delete.name} - ${e}`))\n }\n for (const lock of await this.filesLockManager.getLocksByPath(space.dbFile)) {\n this.filesLockManager.removeLock(lock.key).catch((e: Error) => this.logger.error(`${this.delete.name} - ${e}`))\n }\n // delete or move to trash the files in db\n return this.filesQueries.deleteFiles(space.dbFile, isDir, forceDeleteInDB)\n }\n\n async downloadFromUrl(user: UserModel, space: SpaceEnv, url: string): Promise<void> {\n this.logger.log(`${this.downloadFromUrl.name} : ${url}`)\n // create lock\n const rPath = await uniqueFilePathFromDir(space.realPath)\n const dbFile = space.dbFile\n dbFile.path = path.join(dirName(dbFile.path), fileName(space.realPath))\n const [ok, fileLock] = await this.filesLockManager.create(user, dbFile, SERVER_NAME, DEPTH.RESOURCE)\n if (!ok) {\n throw new LockConflict(fileLock, 'Conflicting lock')\n }\n // tasking\n if (space.task.cacheKey) {\n let headRes: AxiosResponse\n\n try {\n headRes = await this.http.axiosRef({ method: HTTP_METHOD.HEAD, url: url, maxRedirects: 1 })\n } catch (e) {\n // release lock\n await this.filesLockManager.removeLock(fileLock.key)\n this.logger.error(`${this.downloadFromUrl.name} - ${url} : ${e}`)\n throw new FileError(HttpStatus.BAD_REQUEST, 'Unable to download file')\n }\n\n if (regExpPrivateIP.test(headRes.request.socket.remoteAddress)) {\n // release lock\n await this.filesLockManager.removeLock(fileLock.key)\n // prevent SSRF attack\n throw new FileError(HttpStatus.FORBIDDEN, 'Access to internal IP addresses is forbidden')\n }\n\n // attempt to retrieve the Content-Length header\n try {\n if ('content-length' in headRes.headers) {\n space.task.props.totalSize = parseInt(headRes.headers['content-length'], 10) || null\n }\n } catch (e) {\n this.logger.debug(`${this.downloadFromUrl.name} - content-length : ${e}`)\n }\n FileTaskEvent.emit('startWatch', space, FILE_OPERATION.DOWNLOAD, rPath)\n }\n // do\n try {\n const getRes = await this.http.axiosRef({ method: HTTP_METHOD.GET, url: url, responseType: 'stream', maxRedirects: 1 })\n if (regExpPrivateIP.test(getRes.request.socket.remoteAddress)) {\n // Prevent SSRF attacks and perform a DNS-rebinding check if a HEAD request has already been made\n throw new FileError(HttpStatus.FORBIDDEN, 'Access to internal IP addresses is forbidden')\n }\n await writeFromStream(rPath, getRes.data)\n } finally {\n // release lock\n await this.filesLockManager.removeLock(fileLock.key)\n }\n }\n\n async compress(user: UserModel, space: SpaceEnv, dto: CompressFileDto): Promise<void> {\n // This method is currently used only by files-methods.service, which handles input sanitization.\n // If it is used in other services in the future, make sure to refactor accordingly to sanitize inputs properly.\n const srcPath = dirName(space.realPath)\n // todo: a guest link tasksPath should be in specific directory (guest link has no home)\n const archiveExt = dto.name.endsWith(dto.extension) ? '' : `.${dto.extension}`\n const dstPath = await uniqueFilePathFromDir(path.join(dto.compressInDirectory ? srcPath : user.tasksPath, `${dto.name}${archiveExt}`))\n const archive: Archiver = archiver('tar', {\n gzip: dto.extension === tarGzExtension,\n gzipOptions: {\n level: 9\n }\n })\n // create lock\n let fileLock: FileLock\n if (dto.compressInDirectory) {\n const dbFile = space.dbFile\n dbFile.path = path.join(dirName(dbFile.path), fileName(dstPath))\n const [ok, lock] = await this.filesLockManager.create(user, dbFile, SERVER_NAME, DEPTH.RESOURCE)\n if (!ok) {\n throw new LockConflict(lock, 'Conflicting lock')\n }\n fileLock = lock\n }\n if (space.task?.cacheKey) {\n space.task.props.compressInDirectory = dto.compressInDirectory\n FileTaskEvent.emit('startWatch', space, FILE_OPERATION.COMPRESS, dstPath)\n }\n // do\n try {\n archive.on('error', (error: ArchiverError) => {\n throw error\n })\n const dstStream = fs.createWriteStream(dstPath, { highWaterMark: DEFAULT_HIGH_WATER_MARK })\n archive.pipe(dstStream)\n for (const f of dto.files) {\n if (await isPathIsDir(f.path)) {\n archive.directory(f.path, dto.files.length > 1 ? fileName(f.path) : false)\n } else {\n archive.file(f.path, {\n name: f.rootAlias ? f.name : fileName(f.path)\n })\n }\n }\n await archive.finalize()\n } finally {\n if (fileLock) {\n await this.filesLockManager.removeLock(fileLock.key)\n }\n }\n }\n\n async decompress(user: UserModel, space: SpaceEnv): Promise<void> {\n // checks\n if (!(await isPathExists(space.realPath))) {\n throw new FileError(HttpStatus.NOT_FOUND, 'Location not found')\n }\n const extension = path.extname(space.realPath)\n if (!COMPRESSION_EXTENSION.has(extension)) {\n throw new FileError(HttpStatus.BAD_REQUEST, `${extension} is not supported`)\n }\n // make destination folder\n const dstPath = await uniqueFilePathFromDir(path.join(dirName(space.realPath), path.basename(space.realPath, extension)))\n await makeDir(dstPath)\n // create lock\n const dbFile = space.dbFile\n dbFile.path = path.join(dirName(dbFile.path), fileName(dstPath))\n const [ok, fileLock] = await this.filesLockManager.create(user, dbFile, SERVER_NAME, DEPTH.INFINITY)\n if (!ok) {\n throw new LockConflict(fileLock, 'Conflicting lock')\n }\n // tasking\n if (space.task?.cacheKey) FileTaskEvent.emit('startWatch', space, FILE_OPERATION.DECOMPRESS, dstPath)\n // do\n try {\n if (extension === '.zip') {\n await extractZip(space.realPath, dstPath)\n } else {\n await extractTar({\n file: space.realPath,\n cwd: dstPath,\n gzip: COMPRESSION_EXTENSION.get(extension) === tarGzExtension,\n preserveOwner: false\n })\n }\n } finally {\n await this.filesLockManager.removeLock(fileLock.key)\n }\n }\n\n async generateThumbnail(space: SpaceEnv, size: number): Promise<Readable> {\n if (!(await isPathExists(space.realPath))) {\n throw new FileError(HttpStatus.NOT_FOUND, 'Location not found')\n }\n if (getMimeType(space.realPath, false).indexOf('image') === -1) {\n throw new FileError(HttpStatus.BAD_REQUEST, 'File is not an image')\n }\n try {\n return generateThumbnail(space.realPath, size)\n } catch (e) {\n this.logger.warn(e)\n throw new FileError(HttpStatus.BAD_REQUEST, 'File is not an image')\n }\n }\n\n async lock(user: UserModel, space: SpaceEnv): Promise<FileLockProps> {\n const rExists = await isPathExists(space.realPath)\n if (!rExists) {\n this.logger.warn('Lock refresh must specify an existing resource')\n throw new FileError(HttpStatus.BAD_REQUEST, 'Lock refresh must specify an existing resource')\n }\n const [_created, lock] = await this.filesLockManager.createOrRefresh(user, space.dbFile, SERVER_NAME, DEPTH.RESOURCE, CACHE_LOCK_FILE_TTL)\n return this.filesLockManager.convertLockToFileLockProps(lock)\n }\n\n async unlock(user: UserModel, space: SpaceEnv, forceAsFileOwner = false): Promise<void> {\n if (!(await isPathExists(space.realPath))) {\n this.logger.warn(`Unable to unlock: ${space.url} - resource does not exist`)\n throw new FileError(HttpStatus.BAD_REQUEST, 'Unlock must specify an existing resource')\n }\n const fileLocks = await this.filesLockManager.getLocksByPath(space.dbFile)\n if (fileLocks.length === 0) {\n this.logger.warn(`Unable to find lock: ${space.url} - resource does not exist`)\n return\n }\n for (const lock of fileLocks) {\n if ((forceAsFileOwner && space.dbFile?.ownerId === user.id) || lock.owner.id === user.id) {\n // Refresh if more than half of the TTL has passed\n await this.filesLockManager.removeLock(lock.key)\n } else {\n throw new LockConflict(lock, 'Conflicting lock')\n }\n }\n }\n\n async unlockRequest(user: UserModel, space: SpaceEnv): Promise<void> {\n const fileLocks = await this.filesLockManager.getLocksByPath(space.dbFile)\n if (fileLocks.length === 0) {\n this.logger.warn(`Unable to find lock: ${space.url} - resource does not exist`)\n throw new FileError(HttpStatus.NOT_FOUND, 'Lock not found')\n }\n for (const lock of fileLocks) {\n if (lock.owner.id !== user.id) {\n const notification: NotificationContent = {\n app: NOTIFICATION_APP.UNLOCK_REQUEST,\n event: NOTIFICATION_APP_EVENT.UNLOCK_REQUEST,\n element: fileName(space.url),\n url: dirName(space.url)\n }\n this.notificationsManager\n .create([lock.owner.id], notification, {\n author: user,\n currentUrl: this.contextManager.headerOriginUrl()\n })\n .catch((e: Error) => this.logger.error(`${this.unlockRequest.name} - ${e}`))\n }\n }\n }\n\n async getSize(space: SpaceEnv): Promise<number> {\n if (!(await isPathExists(space.realPath))) {\n throw new FileError(HttpStatus.NOT_FOUND, 'Location not found')\n }\n if (await isPathIsDir(space.realPath)) {\n return (await dirSize(space.realPath))[0]\n } else {\n return await fileSize(space.realPath)\n }\n }\n}\n"],"names":["FilesManager","sendFileFromSpace","space","downloadName","SendFile","realPath","saveStream","user","req","options","fExists","isPathExists","fTmpExists","tmpPath","method","HTTP_METHOD","POST","FileError","HttpStatus","METHOD_NOT_ALLOWED","isPathIsDir","makeDir","dirName","CONFLICT","fileLock","dav","filesLockManager","checkConflicts","dbFile","depth","DEPTH","RESOURCE","userId","id","lockTokens","ok","lock","create","SERVER_NAME","LockConflict","startRange","headers","match","exec","length","BAD_REQUEST","parseInt","size","fileSize","checksum","checksumAlg","writeFromStreamAndChecksum","raw","writeFromStream","path","dirname","moveFiles","e","removeFiles","logger","error","name","INTERNAL_SERVER_ERROR","removeLock","key","warn","saveMultipart","overwrite","PUT","patch","PATCH","realParentPath","basePath","sep","part","files","partFileName","fileName","filename","dstFile","resolve","startsWith","FORBIDDEN","dstDir","dstUrl","join","url","dstSpace","spacesManager","spaceEnv","split","delete","ttl","CACHE_LOCK_FILE_TTL","undefined","created","createOrRefresh","file","touch","mtime","checkLocks","NOT_FOUND","touchFile","mkFile","checkDocument","checkFileName","fileExtension","extname","Object","values","DOCUMENT_TYPE","indexOf","srcSample","__dirname","SAMPLE_PATH_WITHOUT_EXT","copyFileContent","createEmptyFile","mkDir","recursive","copyMove","srcSpace","isMove","mkdirDstParentPath","canAccessToSpace","repository","haveSpaceEnvPermissions","SPACE_OPERATION","ADD","alias","quotaIsExceeded","INSUFFICIENT_STORAGE","toLowerCase","PRECONDITION_FAILED","isDir","storageQuota","dirSize","willExceedQuota","INFINITY","task","cacheKey","props","totalSize","FileTaskEvent","emit","FILE_OPERATION","MOVE","COPY","filesQueries","copyFiles","forceDeleteInDB","inTrashRepository","baseTrashPath","realTrashPathFromSpace","trashDir","trashFile","dstTrash","uniqueDatedFilePath","trashFileDB","inTrash","dstTrashFileDB","removeChildLocks","catch","getLocksByPath","deleteFiles","downloadFromUrl","log","rPath","uniqueFilePathFromDir","headRes","http","axiosRef","HEAD","maxRedirects","regExpPrivateIP","test","request","socket","remoteAddress","debug","DOWNLOAD","getRes","GET","responseType","data","compress","dto","srcPath","archiveExt","endsWith","extension","dstPath","compressInDirectory","tasksPath","archive","archiver","gzip","tarGzExtension","gzipOptions","level","COMPRESS","on","dstStream","fs","createWriteStream","highWaterMark","DEFAULT_HIGH_WATER_MARK","pipe","f","directory","rootAlias","finalize","decompress","COMPRESSION_EXTENSION","has","basename","DECOMPRESS","extractZip","extractTar","cwd","get","preserveOwner","generateThumbnail","getMimeType","rExists","_created","convertLockToFileLockProps","unlock","forceAsFileOwner","fileLocks","ownerId","owner","unlockRequest","notification","app","NOTIFICATION_APP","UNLOCK_REQUEST","event","NOTIFICATION_APP_EVENT","element","notificationsManager","author","currentUrl","contextManager","headerOriginUrl","getSize","Logger"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/files/services/files-manager.service.ts"],"sourcesContent":["import { HttpService } from '@nestjs/axios'\nimport { HttpStatus, Injectable, Logger } from '@nestjs/common'\nimport archiver, { Archiver, ArchiverError } from 'archiver'\nimport { AxiosResponse } from 'axios'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport { Readable } from 'node:stream'\nimport { extract as extractTar } from 'tar'\nimport { FastifyAuthenticatedRequest } from '../../../authentication/interfaces/auth-request.interface'\nimport { generateThumbnail } from '../../../common/image'\nimport { SERVER_NAME } from '../../../common/shared'\nimport { ContextManager } from '../../../infrastructure/context/services/context-manager.service'\nimport { HTTP_METHOD } from '../../applications.constants'\nimport { NOTIFICATION_APP, NOTIFICATION_APP_EVENT } from '../../notifications/constants/notifications'\nimport { NotificationContent } from '../../notifications/interfaces/notification-properties.interface'\nimport { NotificationsManager } from '../../notifications/services/notifications-manager.service'\nimport { SPACE_OPERATION } from '../../spaces/constants/spaces'\nimport { FastifySpaceRequest } from '../../spaces/interfaces/space-request.interface'\nimport { SpaceEnv } from '../../spaces/models/space-env.model'\nimport { SpacesManager } from '../../spaces/services/spaces-manager.service'\nimport { realTrashPathFromSpace } from '../../spaces/utils/paths'\nimport { canAccessToSpace, haveSpaceEnvPermissions } from '../../spaces/utils/permissions'\nimport { UserModel } from '../../users/models/user.model'\nimport { DEPTH, LOCK_DEPTH } from '../../webdav/constants/webdav'\nimport { CACHE_LOCK_FILE_TTL } from '../constants/cache'\nimport { tarGzExtension } from '../constants/compress'\nimport { COMPRESSION_EXTENSION, DEFAULT_HIGH_WATER_MARK } from '../constants/files'\nimport { FILE_OPERATION } from '../constants/operations'\nimport { DOCUMENT_TYPE, SAMPLE_PATH_WITHOUT_EXT } from '../constants/samples'\nimport { CompressFileDto } from '../dto/file-operations.dto'\nimport { FileTaskEvent } from '../events/file-task-event'\nimport { FileDBProps } from '../interfaces/file-db-props.interface'\nimport { FileLock } from '../interfaces/file-lock.interface'\nimport { FileLockProps } from '../interfaces/file-props.interface'\nimport { FileError } from '../models/file-error'\nimport { LockConflict } from '../models/file-lock-error'\nimport {\n checkFileName,\n copyFileContent,\n copyFiles,\n createEmptyFile,\n dirName,\n dirSize,\n fileName,\n fileSize,\n getMimeType,\n isPathExists,\n isPathIsDir,\n makeDir,\n moveFiles,\n removeFiles,\n touchFile,\n uniqueDatedFilePath,\n uniqueFilePathFromDir,\n writeFromStream,\n writeFromStreamAndChecksum\n} from '../utils/files'\nimport { SendFile } from '../utils/send-file'\nimport { extractZip } from '../utils/unzip-file'\nimport { regExpPrivateIP } from '../utils/url-file'\nimport { FilesLockManager } from './files-lock-manager.service'\nimport { FilesQueries } from './files-queries.service'\n\n@Injectable()\nexport class FilesManager {\n /* Spaces permissions are checked in the space guard, except for the copy/move destination */\n private logger = new Logger(FilesManager.name)\n\n constructor(\n private readonly http: HttpService,\n private readonly filesQueries: FilesQueries,\n private readonly spacesManager: SpacesManager,\n private readonly contextManager: ContextManager,\n private readonly notificationsManager: NotificationsManager,\n public readonly filesLockManager: FilesLockManager\n ) {}\n\n sendFileFromSpace(space: SpaceEnv, downloadName = ''): SendFile {\n return new SendFile(space.realPath, downloadName)\n }\n\n async saveStream(\n user: UserModel,\n space: SpaceEnv,\n req: FastifyAuthenticatedRequest,\n options: {\n checksumAlg: string\n tmpPath?: string\n }\n ): Promise<string>\n async saveStream(user: UserModel, space: SpaceEnv, req: FastifyAuthenticatedRequest, options?: any): Promise<boolean>\n async saveStream(\n user: UserModel,\n space: SpaceEnv,\n req: FastifyAuthenticatedRequest,\n options?: { dav?: { depth: LOCK_DEPTH; lockTokens: string[] }; checksumAlg?: string; tmpPath?: string }\n ): Promise<boolean | string> {\n // If tmpPath is used, we lock the final destination during the transfer\n // space.realPath is replaced by tmpPath (if allowed). If the move operation failed, we remove the tmp file\n const fExists = await isPathExists(space.realPath)\n const fTmpExists = options?.tmpPath ? await isPathExists(options.tmpPath) : false\n if (fExists && req.method === HTTP_METHOD.POST) {\n throw new FileError(HttpStatus.METHOD_NOT_ALLOWED, 'Resource already exists')\n }\n if (fExists && (await isPathIsDir(space.realPath))) {\n throw new FileError(HttpStatus.METHOD_NOT_ALLOWED, 'The location is a directory')\n }\n if (options?.tmpPath) {\n // Ensure tmpPath parent dir exists\n await makeDir(dirName(options.tmpPath), true)\n } else if (!(await isPathExists(dirName(space.realPath)))) {\n throw new FileError(HttpStatus.CONFLICT, 'Parent must exists')\n }\n /* File Lock */\n let fileLock: FileLock | undefined\n if (options?.dav) {\n // Check locks\n await this.filesLockManager.checkConflicts(space.dbFile, options?.dav?.depth || DEPTH.RESOURCE, {\n userId: user.id,\n lockTokens: options.dav?.lockTokens\n })\n } else {\n // Create lock if there is no webdav context\n const [ok, lock] = await this.filesLockManager.create(user, space.dbFile, SERVER_NAME, DEPTH.RESOURCE)\n if (!ok) {\n throw new LockConflict(lock, 'Conflicting lock')\n }\n fileLock = lock\n }\n try {\n // Check range\n let startRange = 0\n if ((fExists || fTmpExists) && req.headers['content-range']) {\n // With PUT method, some webdav clients use the `content-range` header,\n // which is normally reserved for a response to a request containing the `range` header.\n // However, for more compatibility let's accept it.\n const match = /\\d+/.exec(req.headers['content-range'])\n if (!match.length) {\n throw new FileError(HttpStatus.BAD_REQUEST, 'Content-range : header is malformed')\n }\n startRange = parseInt(match[0], 10)\n const size = await fileSize(options?.tmpPath || space.realPath)\n if (startRange !== size) {\n throw new FileError(HttpStatus.BAD_REQUEST, 'Content-range : start offset does not match the current file size')\n }\n }\n // todo: check file in db to update\n // todo : versioning here\n let checksum: string\n if (options?.checksumAlg) {\n checksum = await writeFromStreamAndChecksum(options?.tmpPath || space.realPath, req.raw, startRange, options.checksumAlg)\n } else {\n await writeFromStream(options?.tmpPath || space.realPath, req.raw, startRange)\n }\n if (options?.tmpPath) {\n try {\n // ensure parent path exists\n await makeDir(path.dirname(space.realPath), true)\n // move the uploaded file to destination\n await moveFiles(options.tmpPath, space.realPath, true)\n } catch (e) {\n // cleanup tmp file\n await removeFiles(options.tmpPath)\n this.logger.error({ tag: this.saveStream.name, msg: `unable to move ${options.tmpPath} -> ${space.realPath} : ${e}` })\n throw new FileError(HttpStatus.INTERNAL_SERVER_ERROR, 'Unable to move tmp file to dst file')\n }\n }\n if (options?.checksumAlg) {\n return checksum\n }\n return fExists\n } finally {\n if (fileLock) {\n try {\n await this.filesLockManager.removeLock(fileLock.key)\n } catch (e) {\n this.logger.warn({ tag: this.saveStream.name, msg: `Failed to remove lock ${fileLock.key}: ${e}` })\n }\n }\n }\n }\n\n async saveMultipart(user: UserModel, space: SpaceEnv, req: FastifySpaceRequest) {\n /* Accepted methods:\n POST: Creates new resource\n PUT: Creates or fully replaces a resource at the given URI (even if intermediate paths do not exist)\n PATCH: Updates the content of an existing resource without creating a new one.\n In this text-editing scenario, locking and refreshing occur automatically, but unlocking must be handled explicitly via\n the `unlock` method.\n */\n const overwrite = req.method === HTTP_METHOD.PUT\n const patch = req.method === HTTP_METHOD.PATCH\n const realParentPath = dirName(space.realPath)\n\n if (!overwrite) {\n if (!patch && (await isPathExists(space.realPath))) {\n throw new FileError(HttpStatus.BAD_REQUEST, 'Resource already exists')\n }\n if (!(await isPathExists(realParentPath))) {\n throw new FileError(HttpStatus.BAD_REQUEST, 'Parent must exists')\n }\n if (!(await isPathIsDir(realParentPath))) {\n throw new FileError(HttpStatus.BAD_REQUEST, 'Parent must be a directory')\n }\n }\n\n const basePath = realParentPath + path.sep\n\n for await (const part of req.files()) {\n // If the request uses the PATCH method, the file name corresponds to the space\n const partFileName = patch ? fileName(space.realPath) : part.filename\n // `part.filename` may contain a path like foo/bar.txt\n const dstFile = path.resolve(basePath, partFileName)\n // Prevent path traversal\n if (!dstFile.startsWith(basePath)) {\n throw new FileError(HttpStatus.FORBIDDEN, 'Location is not allowed')\n }\n\n const dstDir = dirName(dstFile)\n\n if (overwrite) {\n // Prevent errors when an uploaded file would replace a directory with the same name\n // Only applies in `overwrite` cases\n if ((await isPathExists(dstFile)) && (await isPathIsDir(dstFile))) {\n // If a directory already exists at the destination path, delete it to allow overwriting with the uploaded file\n const dstUrl = path.join(path.dirname(space.url), partFileName)\n const dstSpace = await this.spacesManager.spaceEnv(user, dstUrl.split('/'))\n await this.delete(user, dstSpace)\n } else if ((await isPathExists(dstDir)) && !(await isPathIsDir(dstDir))) {\n // If the destination's parent exists but is a file, remove it so we can create the directory\n const dstUrl = path.join(path.dirname(space.url), path.dirname(partFileName))\n const dstSpace = await this.spacesManager.spaceEnv(user, dstUrl.split('/'))\n await this.delete(user, dstSpace)\n }\n }\n // Create the directory in the space\n if (!(await isPathExists(dstDir))) {\n await makeDir(dstDir, true)\n }\n // Create or refresh lock\n const dbFile = { ...space.dbFile, path: path.join(dirName(space.dbFile.path), partFileName) }\n // Use a short TTL for the PATCH method (which is also used for refreshing)\n const ttl = patch ? CACHE_LOCK_FILE_TTL : undefined\n const [created, fileLock] = await this.filesLockManager.createOrRefresh(user, dbFile, SERVER_NAME, DEPTH.RESOURCE, ttl)\n // Do\n try {\n await writeFromStream(dstFile, part.file)\n } finally {\n if (!patch && created) {\n // Remove the file lock only if it has not been refreshed\n await this.filesLockManager.removeLock(fileLock.key)\n }\n }\n if (patch) {\n // Only one resource can be updated with the PATCH method.\n break\n }\n }\n }\n\n async touch(user: UserModel, space: SpaceEnv, mtime: number, checkLocks = true): Promise<void> {\n if (!(await isPathExists(space.realPath))) {\n throw new FileError(HttpStatus.NOT_FOUND, 'Location not found')\n }\n if (checkLocks) {\n await this.filesLockManager.checkConflicts(space.dbFile, DEPTH.RESOURCE, { userId: user.id })\n }\n // todo: update mtime in last files ( & in db file ?)\n await touchFile(space.realPath, mtime)\n }\n\n async mkFile(user: UserModel, space: SpaceEnv, overwrite = false, checkLocks = true, checkDocument = false): Promise<void> {\n checkFileName(space.realPath)\n if (!overwrite && (await isPathExists(space.realPath))) {\n throw new FileError(HttpStatus.BAD_REQUEST, 'Resource already exists')\n }\n if (checkLocks) {\n await this.filesLockManager.checkConflicts(space.dbFile, DEPTH.RESOURCE, { userId: user.id })\n }\n // use sample documents when possible\n const fileExtension = path.extname(space.realPath)\n if (checkDocument && fileExtension !== '.txt' && Object.values(DOCUMENT_TYPE).indexOf(fileExtension) > -1) {\n const srcSample = path.join(__dirname, `${SAMPLE_PATH_WITHOUT_EXT}${fileExtension}`)\n return copyFileContent(srcSample, space.realPath)\n } else {\n return createEmptyFile(space.realPath)\n }\n }\n\n async mkDir(user: UserModel, space: SpaceEnv, recursive = false, dav?: { depth: LOCK_DEPTH; lockTokens: string[] }): Promise<void> {\n checkFileName(space.realPath)\n if (!recursive) {\n if (await isPathExists(space.realPath)) {\n throw new FileError(HttpStatus.METHOD_NOT_ALLOWED, 'Resource already exists')\n } else if (!(await isPathExists(dirName(space.realPath)))) {\n throw new FileError(HttpStatus.CONFLICT, 'Parent must exists')\n }\n }\n await this.filesLockManager.checkConflicts(space.dbFile, dav?.depth || DEPTH.RESOURCE, { userId: user.id, lockTokens: dav?.lockTokens })\n await makeDir(space.realPath, recursive)\n }\n\n async copyMove(\n user: UserModel,\n srcSpace: SpaceEnv,\n dstSpace: SpaceEnv,\n isMove: boolean,\n overwrite = false,\n mkdirDstParentPath = false,\n dav?: { depth: LOCK_DEPTH; lockTokens: string[] }\n ): Promise<void> {\n // checks\n if (!canAccessToSpace(user, dstSpace)) {\n this.logger.warn({ tag: this.copyMove.name, msg: `is not allowed to access to this space repository : ${dstSpace.repository}` })\n throw new FileError(HttpStatus.FORBIDDEN, 'You are not allowed to access to this repository')\n }\n if (!haveSpaceEnvPermissions(dstSpace, SPACE_OPERATION.ADD)) {\n this.logger.warn({\n tag: this.copyMove.name,\n msg: `is not allowed to copy/move on this space : *${dstSpace.alias}* (${dstSpace.id}) : ${dstSpace.url}`\n })\n throw new FileError(HttpStatus.FORBIDDEN, 'You are not allowed to copy/move on the destination')\n }\n if (dstSpace.quotaIsExceeded) {\n this.logger.warn({ tag: this.copyMove.name, msg: `quota is exceeded for *${dstSpace.alias}* (${dstSpace.id})` })\n throw new FileError(HttpStatus.INSUFFICIENT_STORAGE, 'Quota is exceeded')\n }\n if (!(await isPathExists(srcSpace.realPath))) {\n throw new FileError(HttpStatus.NOT_FOUND, 'Location not found')\n }\n if (!(await isPathExists(dirName(dstSpace.realPath)))) {\n if (mkdirDstParentPath) {\n try {\n await makeDir(dirName(dstSpace.realPath), true)\n } catch (e) {\n this.logger.error({ tag: this.copyMove.name, msg: `Cannot create parent directory for destination ${dstSpace.realPath} : ${e}` })\n throw new FileError(HttpStatus.INTERNAL_SERVER_ERROR, 'Cannot create parent directory for destination')\n }\n } else {\n throw new FileError(HttpStatus.CONFLICT, 'Parent must exists')\n }\n }\n if (srcSpace.realPath === dstSpace.realPath) {\n throw new FileError(HttpStatus.FORBIDDEN, 'Cannot copy/move source onto itself')\n }\n if (`${dstSpace.realPath}/`.startsWith(`${srcSpace.realPath}/`)) {\n throw new FileError(HttpStatus.FORBIDDEN, 'Cannot copy/move source below itself')\n }\n if (dirName(srcSpace.url) === dirName(dstSpace.url) && dirName(srcSpace.realPath) !== dirName(dstSpace.realPath)) {\n /* Handle renaming a space file with the same name as a space root :\n srcSpace.url = '/space/sync-in/code2.ts' (a space file)\n srcSpace.realPath = '/home/sync-in/spaces/sync-in/code2.ts\n dstSpace.url = '/space/sync-in/code.ts' (a space root)\n dstSpace.realPath = '/home/sync-in/users/jo/files/code2.ts !!\n */\n throw new FileError(HttpStatus.BAD_REQUEST, 'An anchored file already has this name')\n }\n if (!overwrite && (await isPathExists(dstSpace.realPath))) {\n /* Handle case-sensitive (in renaming context):\n srcSpace.url = '/space/sync-in/code.ts'\n dstSpace.url = '/space/sync-in/code.TS'\n The destination exists because it's the same file, bypass this\n */\n if (!(isMove && srcSpace.realPath.toLowerCase() === dstSpace.realPath.toLowerCase())) {\n throw new FileError(dav ? HttpStatus.PRECONDITION_FAILED : HttpStatus.BAD_REQUEST, 'The destination already exists')\n }\n }\n\n const isDir = await isPathIsDir(srcSpace.realPath)\n\n if (dstSpace.storageQuota) {\n /* Skip validation when moving to the same space; for copy operations, run all checks. */\n if (!isMove || (isMove && srcSpace.id !== dstSpace.id)) {\n const size = isDir ? (await dirSize(srcSpace.realPath))[0] : await fileSize(srcSpace.realPath)\n if (dstSpace.willExceedQuota(size)) {\n this.logger.warn({ tag: this.copyMove.name, msg: `storage quota will be exceeded for *${dstSpace.alias}* (${dstSpace.id})` })\n throw new FileError(HttpStatus.INSUFFICIENT_STORAGE, 'Storage quota will be exceeded')\n }\n }\n }\n\n // check lock conflicts on source and destination\n let recursive: boolean\n let depth: LOCK_DEPTH\n if (dav?.depth) {\n recursive = dav.depth === DEPTH.INFINITY\n depth = dav.depth\n } else {\n recursive = isDir\n depth = recursive ? DEPTH.INFINITY : DEPTH.RESOURCE\n }\n if (isMove) {\n // check source\n await this.filesLockManager.checkConflicts(srcSpace.dbFile, depth, { userId: user.id, lockTokens: dav?.lockTokens })\n }\n // check destination\n await this.filesLockManager.checkConflicts(dstSpace.dbFile, depth, { userId: user.id, lockTokens: dav?.lockTokens })\n\n // overwrite\n if (overwrite && (await isPathExists(dstSpace.realPath))) {\n // todo : versioning here\n await this.delete(user, dstSpace)\n }\n\n // send it to task watcher\n if (srcSpace.task?.cacheKey) {\n if (!isDir) srcSpace.task.props.totalSize = await fileSize(srcSpace.realPath)\n FileTaskEvent.emit('startWatch', srcSpace, isMove ? FILE_OPERATION.MOVE : FILE_OPERATION.COPY, dstSpace.realPath)\n }\n\n // do\n if (isMove) {\n await moveFiles(srcSpace.realPath, dstSpace.realPath, overwrite)\n return this.filesQueries.moveFiles(srcSpace.dbFile, dstSpace.dbFile, isDir)\n }\n return copyFiles(srcSpace.realPath, dstSpace.realPath, overwrite, recursive)\n }\n\n async delete(user: UserModel, space: SpaceEnv, dav?: { lockTokens: string[] }): Promise<void> {\n if (!(await isPathExists(space.realPath))) {\n throw new FileError(HttpStatus.NOT_FOUND, 'Location not found')\n }\n // check lock conflicts\n const isDir = await isPathIsDir(space.realPath)\n await this.filesLockManager.checkConflicts(space.dbFile, isDir ? DEPTH.INFINITY : DEPTH.RESOURCE, {\n userId: user.id,\n lockTokens: dav?.lockTokens\n })\n // file system deletion\n let forceDeleteInDB = false\n if (space.inTrashRepository) {\n await removeFiles(space.realPath)\n } else {\n const baseTrashPath = realTrashPathFromSpace(user, space)\n if (baseTrashPath) {\n const name = fileName(space.realPath)\n const trashDir = path.join(baseTrashPath, dirName(space.dbFile.path))\n const trashFile = path.join(trashDir, name)\n if (!(await isPathExists(trashDir))) {\n await makeDir(trashDir, true)\n }\n if (await isPathExists(trashFile)) {\n // if a resource already exists in the trash, rename it with the date\n const dstTrash = await uniqueDatedFilePath(trashFile)\n // move the resource on fs\n await moveFiles(trashFile, dstTrash.path)\n // move the resource in db\n const trashFileDB: FileDBProps = { ...space.dbFile, inTrash: true }\n const dstTrashFileDB: FileDBProps = { ...trashFileDB, path: path.join(dirName(trashFileDB.path), fileName(dstTrash.path)) }\n await this.filesQueries.moveFiles(trashFileDB, dstTrashFileDB, dstTrash.isDir)\n }\n await moveFiles(space.realPath, trashFile, true)\n } else {\n // unsupported case: delete the file (this shouldn't happen)\n this.logger.error({\n tag: this.delete.name,\n msg: `Unable to find trash path for space - *${space.alias}* (${space.id}) : delete permanently : ${space.realPath}`\n })\n forceDeleteInDB = true\n await removeFiles(space.realPath)\n }\n }\n // remove locks, these locks have already been checked in the `checkConflicts` function\n if (isDir) {\n this.filesLockManager.removeChildLocks(user, space.dbFile).catch((e: Error) => this.logger.error({ tag: this.delete.name, msg: `${e}` }))\n }\n for (const lock of await this.filesLockManager.getLocksByPath(space.dbFile)) {\n this.filesLockManager.removeLock(lock.key).catch((e: Error) => this.logger.error({ tag: this.delete.name, msg: `${e}` }))\n }\n // delete or move to trash the files in db\n return this.filesQueries.deleteFiles(space.dbFile, isDir, forceDeleteInDB)\n }\n\n async downloadFromUrl(user: UserModel, space: SpaceEnv, url: string): Promise<void> {\n this.logger.log({ tag: this.downloadFromUrl.name, msg: `${url}` })\n // create lock\n const rPath = await uniqueFilePathFromDir(space.realPath)\n const dbFile = space.dbFile\n dbFile.path = path.join(dirName(dbFile.path), fileName(space.realPath))\n const [ok, fileLock] = await this.filesLockManager.create(user, dbFile, SERVER_NAME, DEPTH.RESOURCE)\n if (!ok) {\n throw new LockConflict(fileLock, 'Conflicting lock')\n }\n // tasking\n if (space.task.cacheKey) {\n let headRes: AxiosResponse\n\n try {\n headRes = await this.http.axiosRef({ method: HTTP_METHOD.HEAD, url: url, maxRedirects: 1 })\n } catch (e) {\n // release lock\n await this.filesLockManager.removeLock(fileLock.key)\n this.logger.error({ tag: this.downloadFromUrl.name, msg: `${url} : ${e}` })\n throw new FileError(HttpStatus.BAD_REQUEST, 'Unable to download file')\n }\n\n if (regExpPrivateIP.test(headRes.request.socket.remoteAddress)) {\n // release lock\n await this.filesLockManager.removeLock(fileLock.key)\n // prevent SSRF attack\n throw new FileError(HttpStatus.FORBIDDEN, 'Access to internal IP addresses is forbidden')\n }\n\n // attempt to retrieve the Content-Length header\n try {\n if ('content-length' in headRes.headers) {\n space.task.props.totalSize = parseInt(headRes.headers['content-length'], 10) || null\n }\n } catch (e) {\n this.logger.debug({ tag: this.downloadFromUrl.name, msg: `content-length : ${e}` })\n }\n FileTaskEvent.emit('startWatch', space, FILE_OPERATION.DOWNLOAD, rPath)\n }\n // do\n try {\n const getRes = await this.http.axiosRef({ method: HTTP_METHOD.GET, url: url, responseType: 'stream', maxRedirects: 1 })\n if (regExpPrivateIP.test(getRes.request.socket.remoteAddress)) {\n // Prevent SSRF attacks and perform a DNS-rebinding check if a HEAD request has already been made\n throw new FileError(HttpStatus.FORBIDDEN, 'Access to internal IP addresses is forbidden')\n }\n await writeFromStream(rPath, getRes.data)\n } finally {\n // release lock\n await this.filesLockManager.removeLock(fileLock.key)\n }\n }\n\n async compress(user: UserModel, space: SpaceEnv, dto: CompressFileDto): Promise<void> {\n // This method is currently used only by files-methods.service, which handles input sanitization.\n // If it is used in other services in the future, make sure to refactor accordingly to sanitize inputs properly.\n const srcPath = dirName(space.realPath)\n // todo: a guest link tasksPath should be in specific directory (guest link has no home)\n const archiveExt = dto.name.endsWith(dto.extension) ? '' : `.${dto.extension}`\n const dstPath = await uniqueFilePathFromDir(path.join(dto.compressInDirectory ? srcPath : user.tasksPath, `${dto.name}${archiveExt}`))\n const archive: Archiver = archiver('tar', {\n gzip: dto.extension === tarGzExtension,\n gzipOptions: {\n level: 9\n }\n })\n // create lock\n let fileLock: FileLock\n if (dto.compressInDirectory) {\n const dbFile = space.dbFile\n dbFile.path = path.join(dirName(dbFile.path), fileName(dstPath))\n const [ok, lock] = await this.filesLockManager.create(user, dbFile, SERVER_NAME, DEPTH.RESOURCE)\n if (!ok) {\n throw new LockConflict(lock, 'Conflicting lock')\n }\n fileLock = lock\n }\n if (space.task?.cacheKey) {\n space.task.props.compressInDirectory = dto.compressInDirectory\n FileTaskEvent.emit('startWatch', space, FILE_OPERATION.COMPRESS, dstPath)\n }\n // do\n try {\n archive.on('error', (error: ArchiverError) => {\n throw error\n })\n const dstStream = fs.createWriteStream(dstPath, { highWaterMark: DEFAULT_HIGH_WATER_MARK })\n archive.pipe(dstStream)\n for (const f of dto.files) {\n if (await isPathIsDir(f.path)) {\n archive.directory(f.path, dto.files.length > 1 ? fileName(f.path) : false)\n } else {\n archive.file(f.path, {\n name: f.rootAlias ? f.name : fileName(f.path)\n })\n }\n }\n await archive.finalize()\n } finally {\n if (fileLock) {\n await this.filesLockManager.removeLock(fileLock.key)\n }\n }\n }\n\n async decompress(user: UserModel, space: SpaceEnv): Promise<void> {\n // checks\n if (!(await isPathExists(space.realPath))) {\n throw new FileError(HttpStatus.NOT_FOUND, 'Location not found')\n }\n const extension = path.extname(space.realPath)\n if (!COMPRESSION_EXTENSION.has(extension)) {\n throw new FileError(HttpStatus.BAD_REQUEST, `${extension} is not supported`)\n }\n // make destination folder\n const dstPath = await uniqueFilePathFromDir(path.join(dirName(space.realPath), path.basename(space.realPath, extension)))\n await makeDir(dstPath)\n // create lock\n const dbFile = space.dbFile\n dbFile.path = path.join(dirName(dbFile.path), fileName(dstPath))\n const [ok, fileLock] = await this.filesLockManager.create(user, dbFile, SERVER_NAME, DEPTH.INFINITY)\n if (!ok) {\n throw new LockConflict(fileLock, 'Conflicting lock')\n }\n // tasking\n if (space.task?.cacheKey) FileTaskEvent.emit('startWatch', space, FILE_OPERATION.DECOMPRESS, dstPath)\n // do\n try {\n if (extension === '.zip') {\n await extractZip(space.realPath, dstPath)\n } else {\n await extractTar({\n file: space.realPath,\n cwd: dstPath,\n gzip: COMPRESSION_EXTENSION.get(extension) === tarGzExtension,\n preserveOwner: false\n })\n }\n } finally {\n await this.filesLockManager.removeLock(fileLock.key)\n }\n }\n\n async generateThumbnail(space: SpaceEnv, size: number): Promise<Readable> {\n if (!(await isPathExists(space.realPath))) {\n throw new FileError(HttpStatus.NOT_FOUND, 'Location not found')\n }\n if (getMimeType(space.realPath, false).indexOf('image') === -1) {\n throw new FileError(HttpStatus.BAD_REQUEST, 'File is not an image')\n }\n try {\n return generateThumbnail(space.realPath, size)\n } catch (e) {\n this.logger.warn({ tag: this.generateThumbnail.name, msg: e })\n throw new FileError(HttpStatus.BAD_REQUEST, 'File is not an image')\n }\n }\n\n async lock(user: UserModel, space: SpaceEnv): Promise<FileLockProps> {\n const rExists = await isPathExists(space.realPath)\n if (!rExists) {\n this.logger.warn({ tag: this.lock.name, msg: 'Lock refresh must specify an existing resource' })\n throw new FileError(HttpStatus.BAD_REQUEST, 'Lock refresh must specify an existing resource')\n }\n const [_created, lock] = await this.filesLockManager.createOrRefresh(user, space.dbFile, SERVER_NAME, DEPTH.RESOURCE, CACHE_LOCK_FILE_TTL)\n return this.filesLockManager.convertLockToFileLockProps(lock)\n }\n\n async unlock(user: UserModel, space: SpaceEnv, forceAsFileOwner = false): Promise<void> {\n if (!(await isPathExists(space.realPath))) {\n this.logger.warn({ tag: this.unlock.name, msg: `Unable to unlock: ${space.url} - resource does not exist` })\n throw new FileError(HttpStatus.BAD_REQUEST, 'Unlock must specify an existing resource')\n }\n const fileLocks = await this.filesLockManager.getLocksByPath(space.dbFile)\n if (fileLocks.length === 0) {\n this.logger.warn({ tag: this.unlock.name, msg: `Unable to find lock: ${space.url} - resource does not exist` })\n return\n }\n for (const lock of fileLocks) {\n if ((forceAsFileOwner && space.dbFile?.ownerId === user.id) || lock.owner.id === user.id) {\n // Refresh if more than half of the TTL has passed\n await this.filesLockManager.removeLock(lock.key)\n } else {\n throw new LockConflict(lock, 'Conflicting lock')\n }\n }\n }\n\n async unlockRequest(user: UserModel, space: SpaceEnv): Promise<void> {\n const fileLocks = await this.filesLockManager.getLocksByPath(space.dbFile)\n if (fileLocks.length === 0) {\n this.logger.warn({ tag: this.unlockRequest.name, msg: `Unable to find lock: ${space.url} - resource does not exist` })\n throw new FileError(HttpStatus.NOT_FOUND, 'Lock not found')\n }\n for (const lock of fileLocks) {\n if (lock.owner.id !== user.id) {\n const notification: NotificationContent = {\n app: NOTIFICATION_APP.UNLOCK_REQUEST,\n event: NOTIFICATION_APP_EVENT.UNLOCK_REQUEST,\n element: fileName(space.url),\n url: dirName(space.url)\n }\n this.notificationsManager\n .create([lock.owner.id], notification, {\n author: user,\n currentUrl: this.contextManager.headerOriginUrl()\n })\n .catch((e: Error) => this.logger.error({ tag: this.unlockRequest.name, msg: `${e}` }))\n }\n }\n }\n\n async getSize(space: SpaceEnv): Promise<number> {\n if (!(await isPathExists(space.realPath))) {\n throw new FileError(HttpStatus.NOT_FOUND, 'Location not found')\n }\n if (await isPathIsDir(space.realPath)) {\n return (await dirSize(space.realPath))[0]\n } else {\n return await fileSize(space.realPath)\n }\n }\n}\n"],"names":["FilesManager","sendFileFromSpace","space","downloadName","SendFile","realPath","saveStream","user","req","options","fExists","isPathExists","fTmpExists","tmpPath","method","HTTP_METHOD","POST","FileError","HttpStatus","METHOD_NOT_ALLOWED","isPathIsDir","makeDir","dirName","CONFLICT","fileLock","dav","filesLockManager","checkConflicts","dbFile","depth","DEPTH","RESOURCE","userId","id","lockTokens","ok","lock","create","SERVER_NAME","LockConflict","startRange","headers","match","exec","length","BAD_REQUEST","parseInt","size","fileSize","checksum","checksumAlg","writeFromStreamAndChecksum","raw","writeFromStream","path","dirname","moveFiles","e","removeFiles","logger","error","tag","name","msg","INTERNAL_SERVER_ERROR","removeLock","key","warn","saveMultipart","overwrite","PUT","patch","PATCH","realParentPath","basePath","sep","part","files","partFileName","fileName","filename","dstFile","resolve","startsWith","FORBIDDEN","dstDir","dstUrl","join","url","dstSpace","spacesManager","spaceEnv","split","delete","ttl","CACHE_LOCK_FILE_TTL","undefined","created","createOrRefresh","file","touch","mtime","checkLocks","NOT_FOUND","touchFile","mkFile","checkDocument","checkFileName","fileExtension","extname","Object","values","DOCUMENT_TYPE","indexOf","srcSample","__dirname","SAMPLE_PATH_WITHOUT_EXT","copyFileContent","createEmptyFile","mkDir","recursive","copyMove","srcSpace","isMove","mkdirDstParentPath","canAccessToSpace","repository","haveSpaceEnvPermissions","SPACE_OPERATION","ADD","alias","quotaIsExceeded","INSUFFICIENT_STORAGE","toLowerCase","PRECONDITION_FAILED","isDir","storageQuota","dirSize","willExceedQuota","INFINITY","task","cacheKey","props","totalSize","FileTaskEvent","emit","FILE_OPERATION","MOVE","COPY","filesQueries","copyFiles","forceDeleteInDB","inTrashRepository","baseTrashPath","realTrashPathFromSpace","trashDir","trashFile","dstTrash","uniqueDatedFilePath","trashFileDB","inTrash","dstTrashFileDB","removeChildLocks","catch","getLocksByPath","deleteFiles","downloadFromUrl","log","rPath","uniqueFilePathFromDir","headRes","http","axiosRef","HEAD","maxRedirects","regExpPrivateIP","test","request","socket","remoteAddress","debug","DOWNLOAD","getRes","GET","responseType","data","compress","dto","srcPath","archiveExt","endsWith","extension","dstPath","compressInDirectory","tasksPath","archive","archiver","gzip","tarGzExtension","gzipOptions","level","COMPRESS","on","dstStream","fs","createWriteStream","highWaterMark","DEFAULT_HIGH_WATER_MARK","pipe","f","directory","rootAlias","finalize","decompress","COMPRESSION_EXTENSION","has","basename","DECOMPRESS","extractZip","extractTar","cwd","get","preserveOwner","generateThumbnail","getMimeType","rExists","_created","convertLockToFileLockProps","unlock","forceAsFileOwner","fileLocks","ownerId","owner","unlockRequest","notification","app","NOTIFICATION_APP","UNLOCK_REQUEST","event","NOTIFICATION_APP_EVENT","element","notificationsManager","author","currentUrl","contextManager","headerOriginUrl","getSize","Logger"],"mappings":"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"}
@@ -1,8 +1,4 @@
1
- /*
2
- * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>
3
- * This file is part of Sync-in | The open source file sync and share solution
4
- * See the LICENSE file for licensing details
5
- */ "use strict";
1
+ "use strict";
6
2
  Object.defineProperty(exports, "__esModule", {
7
3
  value: true
8
4
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/files/services/files-manager.service.spec.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { HttpService } from '@nestjs/axios'\nimport { Test, TestingModule } from '@nestjs/testing'\nimport { ContextManager } from '../../../infrastructure/context/services/context-manager.service'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport { NotificationsManager } from '../../notifications/services/notifications-manager.service'\nimport { SpacesManager } from '../../spaces/services/spaces-manager.service'\nimport { FilesLockManager } from './files-lock-manager.service'\nimport { FilesManager } from './files-manager.service'\nimport { FilesQueries } from './files-queries.service'\n\ndescribe(FilesManager.name, () => {\n let service: FilesManager\n\n beforeAll(async () => {\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n { provide: DB_TOKEN_PROVIDER, useValue: {} },\n { provide: FilesLockManager, useValue: {} },\n { provide: SpacesManager, useValue: {} },\n { provide: ContextManager, useValue: {} },\n { provide: NotificationsManager, useValue: {} },\n {\n provide: HttpService,\n useValue: {}\n },\n FilesManager,\n FilesQueries\n ]\n }).compile()\n\n service = module.get<FilesManager>(FilesManager)\n })\n\n it('should be defined', () => {\n expect(service).toBeDefined()\n })\n})\n"],"names":["describe","FilesManager","name","service","beforeAll","module","Test","createTestingModule","providers","provide","DB_TOKEN_PROVIDER","useValue","FilesLockManager","SpacesManager","ContextManager","NotificationsManager","HttpService","FilesQueries","compile","get","it","expect","toBeDefined"],"mappings":"AAAA;;;;CAIC;;;;uBAE2B;yBACQ;uCACL;2BACG;6CACG;sCACP;yCACG;qCACJ;qCACA;AAE7BA,SAASC,iCAAY,CAACC,IAAI,EAAE;IAC1B,IAAIC;IAEJC,UAAU;QACR,MAAMC,SAAwB,MAAMC,aAAI,CAACC,mBAAmB,CAAC;YAC3DC,WAAW;gBACT;oBAAEC,SAASC,4BAAiB;oBAAEC,UAAU,CAAC;gBAAE;gBAC3C;oBAAEF,SAASG,yCAAgB;oBAAED,UAAU,CAAC;gBAAE;gBAC1C;oBAAEF,SAASI,mCAAa;oBAAEF,UAAU,CAAC;gBAAE;gBACvC;oBAAEF,SAASK,qCAAc;oBAAEH,UAAU,CAAC;gBAAE;gBACxC;oBAAEF,SAASM,iDAAoB;oBAAEJ,UAAU,CAAC;gBAAE;gBAC9C;oBACEF,SAASO,kBAAW;oBACpBL,UAAU,CAAC;gBACb;gBACAV,iCAAY;gBACZgB,iCAAY;aACb;QACH,GAAGC,OAAO;QAEVf,UAAUE,OAAOc,GAAG,CAAelB,iCAAY;IACjD;IAEAmB,GAAG,qBAAqB;QACtBC,OAAOlB,SAASmB,WAAW;IAC7B;AACF"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/files/services/files-manager.service.spec.ts"],"sourcesContent":["import { HttpService } from '@nestjs/axios'\nimport { Test, TestingModule } from '@nestjs/testing'\nimport { ContextManager } from '../../../infrastructure/context/services/context-manager.service'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport { NotificationsManager } from '../../notifications/services/notifications-manager.service'\nimport { SpacesManager } from '../../spaces/services/spaces-manager.service'\nimport { FilesLockManager } from './files-lock-manager.service'\nimport { FilesManager } from './files-manager.service'\nimport { FilesQueries } from './files-queries.service'\n\ndescribe(FilesManager.name, () => {\n let service: FilesManager\n\n beforeAll(async () => {\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n { provide: DB_TOKEN_PROVIDER, useValue: {} },\n { provide: FilesLockManager, useValue: {} },\n { provide: SpacesManager, useValue: {} },\n { provide: ContextManager, useValue: {} },\n { provide: NotificationsManager, useValue: {} },\n {\n provide: HttpService,\n useValue: {}\n },\n FilesManager,\n FilesQueries\n ]\n }).compile()\n\n service = module.get<FilesManager>(FilesManager)\n })\n\n it('should be defined', () => {\n expect(service).toBeDefined()\n })\n})\n"],"names":["describe","FilesManager","name","service","beforeAll","module","Test","createTestingModule","providers","provide","DB_TOKEN_PROVIDER","useValue","FilesLockManager","SpacesManager","ContextManager","NotificationsManager","HttpService","FilesQueries","compile","get","it","expect","toBeDefined"],"mappings":";;;;uBAA4B;yBACQ;uCACL;2BACG;6CACG;sCACP;yCACG;qCACJ;qCACA;AAE7BA,SAASC,iCAAY,CAACC,IAAI,EAAE;IAC1B,IAAIC;IAEJC,UAAU;QACR,MAAMC,SAAwB,MAAMC,aAAI,CAACC,mBAAmB,CAAC;YAC3DC,WAAW;gBACT;oBAAEC,SAASC,4BAAiB;oBAAEC,UAAU,CAAC;gBAAE;gBAC3C;oBAAEF,SAASG,yCAAgB;oBAAED,UAAU,CAAC;gBAAE;gBAC1C;oBAAEF,SAASI,mCAAa;oBAAEF,UAAU,CAAC;gBAAE;gBACvC;oBAAEF,SAASK,qCAAc;oBAAEH,UAAU,CAAC;gBAAE;gBACxC;oBAAEF,SAASM,iDAAoB;oBAAEJ,UAAU,CAAC;gBAAE;gBAC9C;oBACEF,SAASO,kBAAW;oBACpBL,UAAU,CAAC;gBACb;gBACAV,iCAAY;gBACZgB,iCAAY;aACb;QACH,GAAGC,OAAO;QAEVf,UAAUE,OAAOc,GAAG,CAAelB,iCAAY;IACjD;IAEAmB,GAAG,qBAAqB;QACtBC,OAAOlB,SAASmB,WAAW;IAC7B;AACF"}
@@ -1,8 +1,4 @@
1
- /*
2
- * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>
3
- * This file is part of Sync-in | The open source file sync and share solution
4
- * See the LICENSE file for licensing details
5
- */ "use strict";
1
+ "use strict";
6
2
  Object.defineProperty(exports, "__esModule", {
7
3
  value: true
8
4
  });
@@ -179,7 +175,10 @@ let FilesMethods = class FilesMethods {
179
175
  };
180
176
  }
181
177
  handleError(space, action, e, dstSpace) {
182
- this.logger.error(`unable to ${action} ${space.url}${dstSpace?.url ? ` -> ${dstSpace.url}` : ''} : ${e}`);
178
+ this.logger.error({
179
+ tag: this.handleError.name,
180
+ msg: `unable to ${action} ${space.url}${dstSpace?.url ? ` -> ${dstSpace.url}` : ''} : ${e}`
181
+ });
183
182
  // Remove the last part to avoid exposing the path
184
183
  const errorMsg = e.message.split(',')[0];
185
184
  if (e instanceof _filelockerror.LockConflict) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/files/services/files-methods.service.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { HttpException, HttpStatus, Injectable, Logger, StreamableFile } from '@nestjs/common'\nimport { FastifyReply } from 'fastify'\nimport path from 'node:path'\nimport { Readable } from 'node:stream'\nimport { FastifySpaceRequest } from '../../spaces/interfaces/space-request.interface'\nimport { SpaceEnv } from '../../spaces/models/space-env.model'\nimport { SpacesManager } from '../../spaces/services/spaces-manager.service'\nimport { UserModel } from '../../users/models/user.model'\nimport { FILE_OPERATION } from '../constants/operations'\nimport { CompressFileDto, CopyMoveFileDto, DownloadFileDto, MakeFileDto } from '../dto/file-operations.dto'\nimport { FileLockProps } from '../interfaces/file-props.interface'\nimport { FileError } from '../models/file-error'\nimport { LockConflict } from '../models/file-lock-error'\nimport { checkFileName, dirName, fileName, isPathExists, sanitizeName } from '../utils/files'\nimport { SendFile } from '../utils/send-file'\nimport { FilesManager } from './files-manager.service'\n\n@Injectable()\nexport class FilesMethods {\n private readonly logger = new Logger(FilesMethods.name)\n\n constructor(\n private readonly spacesManager: SpacesManager,\n private readonly filesManager: FilesManager\n ) {}\n\n async headOrGet(req: FastifySpaceRequest, res: FastifyReply): Promise<StreamableFile> {\n const sendFile: SendFile = this.filesManager.sendFileFromSpace(req.space)\n try {\n await sendFile.checks()\n return await sendFile.stream(req, res)\n } catch (e) {\n this.handleError(req.space, req.method, e)\n }\n }\n\n async upload(req: FastifySpaceRequest): Promise<void> {\n try {\n await this.filesManager.saveMultipart(req.user, req.space, req)\n } catch (e) {\n this.handleError(req.space, FILE_OPERATION.UPLOAD, e)\n }\n }\n\n async make(user: UserModel, space: SpaceEnv, makeFileDto: MakeFileDto): Promise<void> {\n try {\n if (makeFileDto.type === 'directory') {\n return await this.filesManager.mkDir(user, space)\n } else {\n return await this.filesManager.mkFile(user, space, false, true, true)\n }\n } catch (e) {\n this.handleError(space, `${FILE_OPERATION.MAKE} ${makeFileDto.type}`, e)\n }\n }\n\n copy(\n user: UserModel,\n space: SpaceEnv,\n copyMoveFileDto: CopyMoveFileDto\n ): Promise<{\n path: string\n name: string\n }> {\n return this.copyMove(user, space, copyMoveFileDto, false)\n }\n\n move(\n user: UserModel,\n space: SpaceEnv,\n copyMoveFileDto: CopyMoveFileDto\n ): Promise<{\n path: string\n name: string\n }> {\n return this.copyMove(user, space, copyMoveFileDto, true)\n }\n\n async delete(user: UserModel, space: SpaceEnv): Promise<void> {\n try {\n return await this.filesManager.delete(user, space)\n } catch (e) {\n this.handleError(space, FILE_OPERATION.DELETE, e)\n }\n }\n\n async downloadFromUrl(user: UserModel, space: SpaceEnv, downloadDto: DownloadFileDto): Promise<void> {\n checkFileName(space.realPath)\n try {\n return await this.filesManager.downloadFromUrl(user, space, downloadDto.url)\n } catch (e) {\n this.handleError(space, FILE_OPERATION.DOWNLOAD, e)\n }\n }\n\n async compress(user: UserModel, space: SpaceEnv, compressFileDto: CompressFileDto): Promise<void> {\n compressFileDto.name = checkFileName(space.realPath)\n try {\n for (const f of compressFileDto.files) {\n // sanitize file name\n f.name = sanitizeName(f.name)\n // handles the case where the file is an anchored file\n let baseSpace: SpaceEnv\n if (f.path) {\n baseSpace = await this.spacesManager.spaceEnv(user, f.path.split('/'))\n f.path = baseSpace.realPath\n } else {\n if (f.rootAlias) {\n baseSpace = await this.spacesManager.spaceEnv(user, path.join(dirName(space.url), f.rootAlias).split('/'))\n f.path = baseSpace.realPath\n } else {\n baseSpace = space\n f.path = path.resolve(dirName(space.realPath), f.name)\n }\n }\n // prevent path traversal\n if (!f.path.startsWith(baseSpace.realBasePath)) {\n return this.handleError(space, FILE_OPERATION.COMPRESS, new FileError(HttpStatus.FORBIDDEN, `${f.name} not allowed`))\n }\n if (!(await isPathExists(f.path))) {\n return this.handleError(space, FILE_OPERATION.COMPRESS, new FileError(HttpStatus.NOT_FOUND, `${f.name} does not exist`))\n }\n }\n return await this.filesManager.compress(user, space, compressFileDto)\n } catch (e) {\n this.handleError(space, FILE_OPERATION.COMPRESS, e)\n }\n }\n\n async decompress(user: UserModel, space: SpaceEnv): Promise<void> {\n try {\n return await this.filesManager.decompress(user, space)\n } catch (e) {\n this.handleError(space, FILE_OPERATION.DECOMPRESS, e)\n }\n }\n\n async genThumbnail(space: SpaceEnv, size: number): Promise<Readable> {\n try {\n return await this.filesManager.generateThumbnail(space, size)\n } catch (e) {\n this.handleError(space, this.genThumbnail.name, e)\n }\n }\n\n async lock(user: UserModel, space: SpaceEnv): Promise<FileLockProps> {\n try {\n return await this.filesManager.lock(user, space)\n } catch (e) {\n if (e instanceof LockConflict) {\n const fileLockProps = this.filesManager.filesLockManager.convertLockToFileLockProps(e.lock)\n throw new HttpException(fileLockProps, HttpStatus.LOCKED)\n }\n this.handleError(space, FILE_OPERATION.LOCK, e)\n }\n }\n\n async unlock(user: UserModel, space: SpaceEnv, forceAsFileOwner = false): Promise<void> {\n try {\n return await this.filesManager.unlock(user, space, forceAsFileOwner)\n } catch (e) {\n this.handleError(space, FILE_OPERATION.UNLOCK, e)\n }\n }\n\n async unlockRequest(user: UserModel, space: SpaceEnv): Promise<void> {\n try {\n return await this.filesManager.unlockRequest(user, space)\n } catch (e) {\n this.handleError(space, FILE_OPERATION.UNLOCK_REQUEST, e)\n }\n }\n\n async getSize(space: SpaceEnv): Promise<{ size: number }> {\n try {\n return { size: await this.filesManager.getSize(space) }\n } catch (e) {\n this.handleError(space, FILE_OPERATION.GET_SIZE, e)\n }\n }\n\n private async copyMove(\n user: UserModel,\n space: SpaceEnv,\n copyMoveFileDto: CopyMoveFileDto,\n isMove: boolean\n ): Promise<{\n path: string\n name: string\n }> {\n const dstUrl = path.join(copyMoveFileDto.dstDirectory, copyMoveFileDto.dstName ? copyMoveFileDto.dstName : fileName(space.realPath))\n let dstSpace: SpaceEnv\n try {\n dstSpace = await this.spacesManager.spaceEnv(user, dstUrl.split('/'))\n await this.filesManager.copyMove(user, space, dstSpace, isMove, copyMoveFileDto.overwrite)\n } catch (e) {\n this.handleError(space, isMove ? FILE_OPERATION.MOVE : FILE_OPERATION.COPY, e, dstSpace)\n }\n return { path: dirName(dstUrl), name: fileName(dstUrl) }\n }\n\n private handleError(space: SpaceEnv, action: string, e: any, dstSpace?: SpaceEnv) {\n this.logger.error(`unable to ${action} ${space.url}${dstSpace?.url ? ` -> ${dstSpace.url}` : ''} : ${e}`)\n // Remove the last part to avoid exposing the path\n const errorMsg = e.message.split(',')[0]\n if (e instanceof LockConflict) {\n throw new HttpException('The file is locked', HttpStatus.LOCKED)\n } else if (e instanceof FileError) {\n throw new HttpException(errorMsg, e.httpCode)\n }\n throw new HttpException(errorMsg, HttpStatus.INTERNAL_SERVER_ERROR)\n }\n}\n"],"names":["FilesMethods","headOrGet","req","res","sendFile","filesManager","sendFileFromSpace","space","checks","stream","e","handleError","method","upload","saveMultipart","user","FILE_OPERATION","UPLOAD","make","makeFileDto","type","mkDir","mkFile","MAKE","copy","copyMoveFileDto","copyMove","move","delete","DELETE","downloadFromUrl","downloadDto","checkFileName","realPath","url","DOWNLOAD","compress","compressFileDto","name","f","files","sanitizeName","baseSpace","path","spacesManager","spaceEnv","split","rootAlias","join","dirName","resolve","startsWith","realBasePath","COMPRESS","FileError","HttpStatus","FORBIDDEN","isPathExists","NOT_FOUND","decompress","DECOMPRESS","genThumbnail","size","generateThumbnail","lock","LockConflict","fileLockProps","filesLockManager","convertLockToFileLockProps","HttpException","LOCKED","LOCK","unlock","forceAsFileOwner","UNLOCK","unlockRequest","UNLOCK_REQUEST","getSize","GET_SIZE","isMove","dstUrl","dstDirectory","dstName","fileName","dstSpace","overwrite","MOVE","COPY","action","logger","error","errorMsg","message","httpCode","INTERNAL_SERVER_ERROR","Logger"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/files/services/files-methods.service.ts"],"sourcesContent":["import { HttpException, HttpStatus, Injectable, Logger, StreamableFile } from '@nestjs/common'\nimport { FastifyReply } from 'fastify'\nimport path from 'node:path'\nimport { Readable } from 'node:stream'\nimport { FastifySpaceRequest } from '../../spaces/interfaces/space-request.interface'\nimport { SpaceEnv } from '../../spaces/models/space-env.model'\nimport { SpacesManager } from '../../spaces/services/spaces-manager.service'\nimport { UserModel } from '../../users/models/user.model'\nimport { FILE_OPERATION } from '../constants/operations'\nimport { CompressFileDto, CopyMoveFileDto, DownloadFileDto, MakeFileDto } from '../dto/file-operations.dto'\nimport { FileLockProps } from '../interfaces/file-props.interface'\nimport { FileError } from '../models/file-error'\nimport { LockConflict } from '../models/file-lock-error'\nimport { checkFileName, dirName, fileName, isPathExists, sanitizeName } from '../utils/files'\nimport { SendFile } from '../utils/send-file'\nimport { FilesManager } from './files-manager.service'\n\n@Injectable()\nexport class FilesMethods {\n private readonly logger = new Logger(FilesMethods.name)\n\n constructor(\n private readonly spacesManager: SpacesManager,\n private readonly filesManager: FilesManager\n ) {}\n\n async headOrGet(req: FastifySpaceRequest, res: FastifyReply): Promise<StreamableFile> {\n const sendFile: SendFile = this.filesManager.sendFileFromSpace(req.space)\n try {\n await sendFile.checks()\n return await sendFile.stream(req, res)\n } catch (e) {\n this.handleError(req.space, req.method, e)\n }\n }\n\n async upload(req: FastifySpaceRequest): Promise<void> {\n try {\n await this.filesManager.saveMultipart(req.user, req.space, req)\n } catch (e) {\n this.handleError(req.space, FILE_OPERATION.UPLOAD, e)\n }\n }\n\n async make(user: UserModel, space: SpaceEnv, makeFileDto: MakeFileDto): Promise<void> {\n try {\n if (makeFileDto.type === 'directory') {\n return await this.filesManager.mkDir(user, space)\n } else {\n return await this.filesManager.mkFile(user, space, false, true, true)\n }\n } catch (e) {\n this.handleError(space, `${FILE_OPERATION.MAKE} ${makeFileDto.type}`, e)\n }\n }\n\n copy(\n user: UserModel,\n space: SpaceEnv,\n copyMoveFileDto: CopyMoveFileDto\n ): Promise<{\n path: string\n name: string\n }> {\n return this.copyMove(user, space, copyMoveFileDto, false)\n }\n\n move(\n user: UserModel,\n space: SpaceEnv,\n copyMoveFileDto: CopyMoveFileDto\n ): Promise<{\n path: string\n name: string\n }> {\n return this.copyMove(user, space, copyMoveFileDto, true)\n }\n\n async delete(user: UserModel, space: SpaceEnv): Promise<void> {\n try {\n return await this.filesManager.delete(user, space)\n } catch (e) {\n this.handleError(space, FILE_OPERATION.DELETE, e)\n }\n }\n\n async downloadFromUrl(user: UserModel, space: SpaceEnv, downloadDto: DownloadFileDto): Promise<void> {\n checkFileName(space.realPath)\n try {\n return await this.filesManager.downloadFromUrl(user, space, downloadDto.url)\n } catch (e) {\n this.handleError(space, FILE_OPERATION.DOWNLOAD, e)\n }\n }\n\n async compress(user: UserModel, space: SpaceEnv, compressFileDto: CompressFileDto): Promise<void> {\n compressFileDto.name = checkFileName(space.realPath)\n try {\n for (const f of compressFileDto.files) {\n // sanitize file name\n f.name = sanitizeName(f.name)\n // handles the case where the file is an anchored file\n let baseSpace: SpaceEnv\n if (f.path) {\n baseSpace = await this.spacesManager.spaceEnv(user, f.path.split('/'))\n f.path = baseSpace.realPath\n } else {\n if (f.rootAlias) {\n baseSpace = await this.spacesManager.spaceEnv(user, path.join(dirName(space.url), f.rootAlias).split('/'))\n f.path = baseSpace.realPath\n } else {\n baseSpace = space\n f.path = path.resolve(dirName(space.realPath), f.name)\n }\n }\n // prevent path traversal\n if (!f.path.startsWith(baseSpace.realBasePath)) {\n return this.handleError(space, FILE_OPERATION.COMPRESS, new FileError(HttpStatus.FORBIDDEN, `${f.name} not allowed`))\n }\n if (!(await isPathExists(f.path))) {\n return this.handleError(space, FILE_OPERATION.COMPRESS, new FileError(HttpStatus.NOT_FOUND, `${f.name} does not exist`))\n }\n }\n return await this.filesManager.compress(user, space, compressFileDto)\n } catch (e) {\n this.handleError(space, FILE_OPERATION.COMPRESS, e)\n }\n }\n\n async decompress(user: UserModel, space: SpaceEnv): Promise<void> {\n try {\n return await this.filesManager.decompress(user, space)\n } catch (e) {\n this.handleError(space, FILE_OPERATION.DECOMPRESS, e)\n }\n }\n\n async genThumbnail(space: SpaceEnv, size: number): Promise<Readable> {\n try {\n return await this.filesManager.generateThumbnail(space, size)\n } catch (e) {\n this.handleError(space, this.genThumbnail.name, e)\n }\n }\n\n async lock(user: UserModel, space: SpaceEnv): Promise<FileLockProps> {\n try {\n return await this.filesManager.lock(user, space)\n } catch (e) {\n if (e instanceof LockConflict) {\n const fileLockProps = this.filesManager.filesLockManager.convertLockToFileLockProps(e.lock)\n throw new HttpException(fileLockProps, HttpStatus.LOCKED)\n }\n this.handleError(space, FILE_OPERATION.LOCK, e)\n }\n }\n\n async unlock(user: UserModel, space: SpaceEnv, forceAsFileOwner = false): Promise<void> {\n try {\n return await this.filesManager.unlock(user, space, forceAsFileOwner)\n } catch (e) {\n this.handleError(space, FILE_OPERATION.UNLOCK, e)\n }\n }\n\n async unlockRequest(user: UserModel, space: SpaceEnv): Promise<void> {\n try {\n return await this.filesManager.unlockRequest(user, space)\n } catch (e) {\n this.handleError(space, FILE_OPERATION.UNLOCK_REQUEST, e)\n }\n }\n\n async getSize(space: SpaceEnv): Promise<{ size: number }> {\n try {\n return { size: await this.filesManager.getSize(space) }\n } catch (e) {\n this.handleError(space, FILE_OPERATION.GET_SIZE, e)\n }\n }\n\n private async copyMove(\n user: UserModel,\n space: SpaceEnv,\n copyMoveFileDto: CopyMoveFileDto,\n isMove: boolean\n ): Promise<{\n path: string\n name: string\n }> {\n const dstUrl = path.join(copyMoveFileDto.dstDirectory, copyMoveFileDto.dstName ? copyMoveFileDto.dstName : fileName(space.realPath))\n let dstSpace: SpaceEnv\n try {\n dstSpace = await this.spacesManager.spaceEnv(user, dstUrl.split('/'))\n await this.filesManager.copyMove(user, space, dstSpace, isMove, copyMoveFileDto.overwrite)\n } catch (e) {\n this.handleError(space, isMove ? FILE_OPERATION.MOVE : FILE_OPERATION.COPY, e, dstSpace)\n }\n return { path: dirName(dstUrl), name: fileName(dstUrl) }\n }\n\n private handleError(space: SpaceEnv, action: string, e: any, dstSpace?: SpaceEnv) {\n this.logger.error({ tag: this.handleError.name, msg: `unable to ${action} ${space.url}${dstSpace?.url ? ` -> ${dstSpace.url}` : ''} : ${e}` })\n // Remove the last part to avoid exposing the path\n const errorMsg = e.message.split(',')[0]\n if (e instanceof LockConflict) {\n throw new HttpException('The file is locked', HttpStatus.LOCKED)\n } else if (e instanceof FileError) {\n throw new HttpException(errorMsg, e.httpCode)\n }\n throw new HttpException(errorMsg, HttpStatus.INTERNAL_SERVER_ERROR)\n }\n}\n"],"names":["FilesMethods","headOrGet","req","res","sendFile","filesManager","sendFileFromSpace","space","checks","stream","e","handleError","method","upload","saveMultipart","user","FILE_OPERATION","UPLOAD","make","makeFileDto","type","mkDir","mkFile","MAKE","copy","copyMoveFileDto","copyMove","move","delete","DELETE","downloadFromUrl","downloadDto","checkFileName","realPath","url","DOWNLOAD","compress","compressFileDto","name","f","files","sanitizeName","baseSpace","path","spacesManager","spaceEnv","split","rootAlias","join","dirName","resolve","startsWith","realBasePath","COMPRESS","FileError","HttpStatus","FORBIDDEN","isPathExists","NOT_FOUND","decompress","DECOMPRESS","genThumbnail","size","generateThumbnail","lock","LockConflict","fileLockProps","filesLockManager","convertLockToFileLockProps","HttpException","LOCKED","LOCK","unlock","forceAsFileOwner","UNLOCK","unlockRequest","UNLOCK_REQUEST","getSize","GET_SIZE","isMove","dstUrl","dstDirectory","dstName","fileName","dstSpace","overwrite","MOVE","COPY","action","logger","error","tag","msg","errorMsg","message","httpCode","INTERNAL_SERVER_ERROR","Logger"],"mappings":"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"}
@@ -1,8 +1,4 @@
1
- /*
2
- * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>
3
- * This file is part of Sync-in | The open source file sync and share solution
4
- * See the LICENSE file for licensing details
5
- */ "use strict";
1
+ "use strict";
6
2
  Object.defineProperty(exports, "__esModule", {
7
3
  value: true
8
4
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/files/services/files-methods.service.spec.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Test, TestingModule } from '@nestjs/testing'\nimport path from 'node:path'\nimport { transformAndValidate } from '../../../common/functions'\nimport { Cache } from '../../../infrastructure/cache/services/cache.service'\nimport { ContextManager } from '../../../infrastructure/context/services/context-manager.service'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport { NotificationsManager } from '../../notifications/services/notifications-manager.service'\nimport { SharesManager } from '../../shares/services/shares-manager.service'\nimport { SPACE_REPOSITORY } from '../../spaces/constants/spaces'\nimport { SpaceEnv } from '../../spaces/models/space-env.model'\nimport { SpaceModel } from '../../spaces/models/space.model'\nimport { SpacesManager } from '../../spaces/services/spaces-manager.service'\nimport { SpacesQueries } from '../../spaces/services/spaces-queries.service'\nimport { UserModel } from '../../users/models/user.model'\nimport { UsersQueries } from '../../users/services/users-queries.service'\nimport { generateUserTest } from '../../users/utils/test'\nimport { tarExtension } from '../constants/compress'\nimport { CompressFileDto, CopyMoveFileDto } from '../dto/file-operations.dto'\nimport { FilesManager } from './files-manager.service'\nimport { FilesMethods } from './files-methods.service'\n\ndescribe(FilesMethods.name, () => {\n let filesMethods: FilesMethods\n let spacesManager: SpacesManager\n let userTest: UserModel\n const spaceEnv = {\n id: 1,\n alias: 'project',\n name: 'project',\n enabled: true,\n permissions: 'a:d:m:so',\n role: 0,\n realBasePath: SpaceModel.getFilesPath('project'),\n realPath: path.join(SpaceModel.getFilesPath('project'), 'foo'),\n url: `${SPACE_REPOSITORY.FILES}/project/foo`\n } as SpaceEnv\n\n beforeAll(async () => {\n const module: TestingModule = await Test.createTestingModule({\n imports: [],\n providers: [\n FilesMethods,\n SpacesManager,\n { provide: DB_TOKEN_PROVIDER, useValue: {} },\n {\n provide: Cache,\n useValue: { get: () => null }\n },\n { provide: ContextManager, useValue: {} },\n {\n provide: NotificationsManager,\n useValue: {}\n },\n { provide: UsersQueries, useValue: {} },\n { provide: SharesManager, useValue: {} },\n {\n provide: SpacesQueries,\n useValue: {\n permissions: () => spaceEnv\n }\n },\n {\n provide: FilesManager,\n useValue: {\n compress: jest.fn()\n }\n }\n ]\n }).compile()\n\n module.useLogger(['fatal'])\n filesMethods = module.get<FilesMethods>(FilesMethods)\n spacesManager = module.get<SpacesManager>(SpacesManager)\n userTest = new UserModel(generateUserTest())\n // mock\n spacesManager.updateSpacesQuota = jest.fn().mockReturnValue(undefined)\n })\n\n it('should be defined', () => {\n expect(filesMethods).toBeDefined()\n expect(spacesManager).toBeDefined()\n expect(userTest).toBeDefined()\n })\n\n it('should avoid path traversal on CopyMove action', async () => {\n const copyMoveFileDto: CopyMoveFileDto = { dstDirectory: '../../../foo', dstName: '../bar/../' }\n expect(() => transformAndValidate(CopyMoveFileDto, copyMoveFileDto)).toThrow()\n await expect((filesMethods as any).copyMove(userTest, spaceEnv, copyMoveFileDto, false)).rejects.toThrow(/is not valid/i)\n })\n\n it('should avoid path traversal on Compress action', async () => {\n const compressFileDto: CompressFileDto = {\n name: '../../archive',\n compressInDirectory: false,\n files: [{ name: '../../foo', rootAlias: undefined }],\n extension: tarExtension\n }\n expect(() => transformAndValidate(CompressFileDto, compressFileDto)).toThrow()\n await expect(filesMethods.compress(userTest, spaceEnv, compressFileDto)).rejects.toThrow(/does not exist/i)\n compressFileDto.files[0].path = '../../../bar/../'\n await expect(filesMethods.compress(userTest, spaceEnv, compressFileDto)).rejects.toThrow(/is not valid/i)\n })\n})\n"],"names":["describe","FilesMethods","name","filesMethods","spacesManager","userTest","spaceEnv","id","alias","enabled","permissions","role","realBasePath","SpaceModel","getFilesPath","realPath","path","join","url","SPACE_REPOSITORY","FILES","beforeAll","module","Test","createTestingModule","imports","providers","SpacesManager","provide","DB_TOKEN_PROVIDER","useValue","Cache","get","ContextManager","NotificationsManager","UsersQueries","SharesManager","SpacesQueries","FilesManager","compress","jest","fn","compile","useLogger","UserModel","generateUserTest","updateSpacesQuota","mockReturnValue","undefined","it","expect","toBeDefined","copyMoveFileDto","dstDirectory","dstName","transformAndValidate","CopyMoveFileDto","toThrow","copyMove","rejects","compressFileDto","compressInDirectory","files","rootAlias","extension","tarExtension","CompressFileDto"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/files/services/files-methods.service.spec.ts"],"sourcesContent":["import { Test, TestingModule } from '@nestjs/testing'\nimport path from 'node:path'\nimport { transformAndValidate } from '../../../common/functions'\nimport { Cache } from '../../../infrastructure/cache/services/cache.service'\nimport { ContextManager } from '../../../infrastructure/context/services/context-manager.service'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport { NotificationsManager } from '../../notifications/services/notifications-manager.service'\nimport { SharesManager } from '../../shares/services/shares-manager.service'\nimport { SPACE_REPOSITORY } from '../../spaces/constants/spaces'\nimport { SpaceEnv } from '../../spaces/models/space-env.model'\nimport { SpaceModel } from '../../spaces/models/space.model'\nimport { SpacesManager } from '../../spaces/services/spaces-manager.service'\nimport { SpacesQueries } from '../../spaces/services/spaces-queries.service'\nimport { UserModel } from '../../users/models/user.model'\nimport { UsersQueries } from '../../users/services/users-queries.service'\nimport { generateUserTest } from '../../users/utils/test'\nimport { tarExtension } from '../constants/compress'\nimport { CompressFileDto, CopyMoveFileDto } from '../dto/file-operations.dto'\nimport { FilesManager } from './files-manager.service'\nimport { FilesMethods } from './files-methods.service'\n\ndescribe(FilesMethods.name, () => {\n let filesMethods: FilesMethods\n let spacesManager: SpacesManager\n let userTest: UserModel\n const spaceEnv = {\n id: 1,\n alias: 'project',\n name: 'project',\n enabled: true,\n permissions: 'a:d:m:so',\n role: 0,\n realBasePath: SpaceModel.getFilesPath('project'),\n realPath: path.join(SpaceModel.getFilesPath('project'), 'foo'),\n url: `${SPACE_REPOSITORY.FILES}/project/foo`\n } as SpaceEnv\n\n beforeAll(async () => {\n const module: TestingModule = await Test.createTestingModule({\n imports: [],\n providers: [\n FilesMethods,\n SpacesManager,\n { provide: DB_TOKEN_PROVIDER, useValue: {} },\n {\n provide: Cache,\n useValue: { get: () => null }\n },\n { provide: ContextManager, useValue: {} },\n {\n provide: NotificationsManager,\n useValue: {}\n },\n { provide: UsersQueries, useValue: {} },\n { provide: SharesManager, useValue: {} },\n {\n provide: SpacesQueries,\n useValue: {\n permissions: () => spaceEnv\n }\n },\n {\n provide: FilesManager,\n useValue: {\n compress: jest.fn()\n }\n }\n ]\n }).compile()\n\n module.useLogger(['fatal'])\n filesMethods = module.get<FilesMethods>(FilesMethods)\n spacesManager = module.get<SpacesManager>(SpacesManager)\n userTest = new UserModel(generateUserTest())\n // mock\n spacesManager.updateSpacesQuota = jest.fn().mockReturnValue(undefined)\n })\n\n it('should be defined', () => {\n expect(filesMethods).toBeDefined()\n expect(spacesManager).toBeDefined()\n expect(userTest).toBeDefined()\n })\n\n it('should avoid path traversal on CopyMove action', async () => {\n const copyMoveFileDto: CopyMoveFileDto = { dstDirectory: '../../../foo', dstName: '../bar/../' }\n expect(() => transformAndValidate(CopyMoveFileDto, copyMoveFileDto)).toThrow()\n await expect((filesMethods as any).copyMove(userTest, spaceEnv, copyMoveFileDto, false)).rejects.toThrow(/is not valid/i)\n })\n\n it('should avoid path traversal on Compress action', async () => {\n const compressFileDto: CompressFileDto = {\n name: '../../archive',\n compressInDirectory: false,\n files: [{ name: '../../foo', rootAlias: undefined }],\n extension: tarExtension\n }\n expect(() => transformAndValidate(CompressFileDto, compressFileDto)).toThrow()\n await expect(filesMethods.compress(userTest, spaceEnv, compressFileDto)).rejects.toThrow(/does not exist/i)\n compressFileDto.files[0].path = '../../../bar/../'\n await expect(filesMethods.compress(userTest, spaceEnv, compressFileDto)).rejects.toThrow(/is not valid/i)\n })\n})\n"],"names":["describe","FilesMethods","name","filesMethods","spacesManager","userTest","spaceEnv","id","alias","enabled","permissions","role","realBasePath","SpaceModel","getFilesPath","realPath","path","join","url","SPACE_REPOSITORY","FILES","beforeAll","module","Test","createTestingModule","imports","providers","SpacesManager","provide","DB_TOKEN_PROVIDER","useValue","Cache","get","ContextManager","NotificationsManager","UsersQueries","SharesManager","SpacesQueries","FilesManager","compress","jest","fn","compile","useLogger","UserModel","generateUserTest","updateSpacesQuota","mockReturnValue","undefined","it","expect","toBeDefined","copyMoveFileDto","dstDirectory","dstName","transformAndValidate","CopyMoveFileDto","toThrow","copyMove","rejects","compressFileDto","compressInDirectory","files","rootAlias","extension","tarExtension","CompressFileDto"],"mappings":"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"}
@@ -1,8 +1,4 @@
1
- /*
2
- * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>
3
- * This file is part of Sync-in | The open source file sync and share solution
4
- * See the LICENSE file for licensing details
5
- */ "use strict";
1
+ "use strict";
6
2
  Object.defineProperty(exports, "__esModule", {
7
3
  value: true
8
4
  });
@@ -67,7 +63,10 @@ let FilesParser = class FilesParser {
67
63
  ])))){
68
64
  const userFilesPath = _usermodel.UserModel.getFilesPath(user.login);
69
65
  if (!await (0, _files.isPathExists)(userFilesPath)) {
70
- this.logger.warn(`${this.userPaths.name} - user path does not exist : ${userFilesPath}`);
66
+ this.logger.warn({
67
+ tag: this.userPaths.name,
68
+ msg: `user path does not exist : ${userFilesPath}`
69
+ });
71
70
  continue;
72
71
  }
73
72
  yield [
@@ -101,7 +100,10 @@ let FilesParser = class FilesParser {
101
100
  ] : [])).groupBy(_spacesschema.spaces.id))){
102
101
  const spaceFilesPath = _spacemodel.SpaceModel.getFilesPath(space.alias);
103
102
  if (!await (0, _files.isPathExists)(spaceFilesPath)) {
104
- this.logger.warn(`${this.spacePaths.name} - space path does not exist : ${spaceFilesPath}`);
103
+ this.logger.warn({
104
+ tag: this.spacePaths.name,
105
+ msg: `space path does not exist : ${spaceFilesPath}`
106
+ });
105
107
  continue;
106
108
  }
107
109
  const spacePath = [
@@ -159,7 +161,10 @@ let FilesParser = class FilesParser {
159
161
  continue;
160
162
  }
161
163
  if (!await (0, _files.isPathExists)(shareFilesPath)) {
162
- this.logger.warn(`${this.sharePaths.name} - share path does not exist : ${shareFilesPath}`);
164
+ this.logger.warn({
165
+ tag: this.sharePaths.name,
166
+ msg: `share path does not exist : ${shareFilesPath}`
167
+ });
163
168
  continue;
164
169
  }
165
170
  yield [
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/files/services/files-parser.service.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Inject, Injectable, Logger } from '@nestjs/common'\nimport { and, eq, inArray, isNotNull, isNull, lte, or, sql } from 'drizzle-orm'\nimport path from 'node:path'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport { DBSchema } from '../../../infrastructure/database/interfaces/database.interface'\nimport { concatDistinctObjectsInArray } from '../../../infrastructure/database/utils'\nimport { SHARE_TYPE } from '../../shares/constants/shares'\nimport { shares } from '../../shares/schemas/shares.schema'\nimport { SPACE_ALIAS, SPACE_REPOSITORY } from '../../spaces/constants/spaces'\nimport { SpaceModel } from '../../spaces/models/space.model'\nimport { spacesRoots } from '../../spaces/schemas/spaces-roots.schema'\nimport { spaces } from '../../spaces/schemas/spaces.schema'\nimport { USER_ROLE } from '../../users/constants/user'\nimport { UserModel } from '../../users/models/user.model'\nimport { users } from '../../users/schemas/users.schema'\nimport { FileParseContext, FileParseType } from '../interfaces/file-parse-index'\nimport { filePathSQL, files } from '../schemas/files.schema'\nimport { isPathExists } from '../utils/files'\n\n@Injectable()\nexport class FilesParser {\n private readonly logger = new Logger(FilesParser.name)\n\n constructor(@Inject(DB_TOKEN_PROVIDER) private readonly db: DBSchema) {}\n\n async *allPaths(userId?: number, spaceIds?: number[], shareIds?: number[]): AsyncGenerator<[number, FileParseType, FileParseContext[]]> {\n yield* this.userPaths(userId)\n yield* this.spacePaths(spaceIds)\n yield* this.sharePaths(shareIds)\n }\n\n async *userPaths(userId?: number): AsyncGenerator<[number, FileParseType, FileParseContext[]]> {\n for (const user of await this.db\n .select({\n id: users.id,\n login: users.login\n })\n .from(users)\n .where(and(...[eq(users.storageIndexing, true), lte(users.role, USER_ROLE.USER), ...(userId ? [eq(users.id, userId)] : [])]))) {\n const userFilesPath = UserModel.getFilesPath(user.login)\n if (!(await isPathExists(userFilesPath))) {\n this.logger.warn(`${this.userPaths.name} - user path does not exist : ${userFilesPath}`)\n continue\n }\n yield [user.id, 'user', [{ realPath: userFilesPath, pathPrefix: `${SPACE_REPOSITORY.FILES}/${SPACE_ALIAS.PERSONAL}`, isDir: true }]]\n }\n }\n\n async *spacePaths(spaceIds?: number[]): AsyncGenerator<[number, FileParseType, FileParseContext[]]> {\n for (const space of await this.db\n .select({\n id: spaces.id,\n alias: spaces.alias,\n roots: concatDistinctObjectsInArray(spacesRoots.alias, {\n alias: spacesRoots.alias,\n externalPath: spacesRoots.externalPath,\n isDir: sql<boolean>`IF (${spacesRoots.externalPath} IS NOT NULL, 1, ${files.isDir})`,\n file: {\n path: filePathSQL(files),\n fromOwner: users.login\n }\n })\n })\n .from(spaces)\n .leftJoin(spacesRoots, eq(spacesRoots.spaceId, spaces.id))\n .leftJoin(files, eq(files.id, spacesRoots.fileId))\n .leftJoin(users, eq(users.id, files.ownerId))\n .where(and(eq(spaces.storageIndexing, true), ...(spaceIds ? [inArray(spaces.id, spaceIds)] : [])))\n .groupBy(spaces.id)) {\n const spaceFilesPath = SpaceModel.getFilesPath(space.alias)\n if (!(await isPathExists(spaceFilesPath))) {\n this.logger.warn(`${this.spacePaths.name} - space path does not exist : ${spaceFilesPath}`)\n continue\n }\n const spacePath = [{ realPath: spaceFilesPath, pathPrefix: `${SPACE_REPOSITORY.FILES}/${space.alias}`, isDir: true }]\n const rootPaths = space.roots.map(\n (r: any): FileParseContext =>\n r.externalPath\n ? {\n realPath: r.externalPath,\n pathPrefix: `${SPACE_REPOSITORY.FILES}/${space.alias}/${r.alias}`,\n isDir: r.isDir\n }\n : {\n realPath: path.join(UserModel.getFilesPath(r.file.fromOwner), r.file.path),\n pathPrefix: `${SPACE_REPOSITORY.FILES}/${space.alias}/${r.alias}`,\n isDir: r.isDir\n }\n )\n yield [space.id, 'space', [...spacePath, ...rootPaths]]\n }\n }\n\n async *sharePaths(shareIds?: number[]): AsyncGenerator<[number, FileParseType, FileParseContext[]]> {\n for (const share of await this.db\n .select({\n id: shares.id,\n alias: shares.alias,\n externalPath: sql<string>`IF (${shares.externalPath} IS NOT NULL, ${shares.externalPath}, ${spacesRoots.externalPath})`,\n isDir: sql<boolean>`IF (${shares.externalPath} IS NOT NULL AND ${shares.fileId} IS NULL, 1, ${files.isDir})`,\n file: { path: sql<string>`IF (${files.id} IS NOT NULL, ${filePathSQL(files)}, '.')`, fromOwner: users.login, fromSpace: spaces.alias }\n })\n .from(shares)\n .leftJoin(spacesRoots, eq(spacesRoots.id, shares.spaceRootId))\n .leftJoin(\n files,\n or(\n // If the child share is from a share with an external path, the child share should have an external path and a fileId\n and(isNotNull(shares.fileId), eq(files.id, shares.fileId)),\n and(isNull(shares.externalPath), isNull(shares.fileId), isNotNull(spacesRoots.fileId), eq(files.id, spacesRoots.fileId))\n )\n )\n .leftJoin(spaces, and(isNull(shares.externalPath), isNotNull(files.spaceId), eq(spaces.id, files.spaceId), eq(spaces.storageIndexing, true)))\n .leftJoin(users, and(eq(users.id, files.ownerId), eq(users.storageIndexing, true)))\n .where(and(eq(shares.storageIndexing, true), ...[eq(shares.type, SHARE_TYPE.COMMON), ...(shareIds ? [inArray(shares.id, shareIds)] : [])]))\n .groupBy(shares.id)) {\n let shareFilesPath: string\n if (share.externalPath) {\n shareFilesPath = path.join(share.externalPath, share.file.path)\n } else if (share.file.fromOwner) {\n shareFilesPath = path.join(UserModel.getFilesPath(share.file.fromOwner), share.file.path)\n } else if (share.file.fromSpace) {\n shareFilesPath = path.join(SpaceModel.getFilesPath(share.file.fromSpace), share.file.path)\n } else {\n // Exclude shares that don’t match these cases (join conditions)\n continue\n }\n if (!(await isPathExists(shareFilesPath))) {\n this.logger.warn(`${this.sharePaths.name} - share path does not exist : ${shareFilesPath}`)\n continue\n }\n yield [share.id, 'share', [{ realPath: shareFilesPath, pathPrefix: `${SPACE_REPOSITORY.SHARES}/${share.alias}`, isDir: share.isDir }]]\n }\n }\n}\n"],"names":["FilesParser","allPaths","userId","spaceIds","shareIds","userPaths","spacePaths","sharePaths","user","db","select","id","users","login","from","where","and","eq","storageIndexing","lte","role","USER_ROLE","USER","userFilesPath","UserModel","getFilesPath","isPathExists","logger","warn","name","realPath","pathPrefix","SPACE_REPOSITORY","FILES","SPACE_ALIAS","PERSONAL","isDir","space","spaces","alias","roots","concatDistinctObjectsInArray","spacesRoots","externalPath","sql","files","file","path","filePathSQL","fromOwner","leftJoin","spaceId","fileId","ownerId","inArray","groupBy","spaceFilesPath","SpaceModel","spacePath","rootPaths","map","r","join","share","shares","fromSpace","spaceRootId","or","isNotNull","isNull","type","SHARE_TYPE","COMMON","shareFilesPath","SHARES","Logger"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/files/services/files-parser.service.ts"],"sourcesContent":["import { Inject, Injectable, Logger } from '@nestjs/common'\nimport { and, eq, inArray, isNotNull, isNull, lte, or, sql } from 'drizzle-orm'\nimport path from 'node:path'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport { DBSchema } from '../../../infrastructure/database/interfaces/database.interface'\nimport { concatDistinctObjectsInArray } from '../../../infrastructure/database/utils'\nimport { SHARE_TYPE } from '../../shares/constants/shares'\nimport { shares } from '../../shares/schemas/shares.schema'\nimport { SPACE_ALIAS, SPACE_REPOSITORY } from '../../spaces/constants/spaces'\nimport { SpaceModel } from '../../spaces/models/space.model'\nimport { spacesRoots } from '../../spaces/schemas/spaces-roots.schema'\nimport { spaces } from '../../spaces/schemas/spaces.schema'\nimport { USER_ROLE } from '../../users/constants/user'\nimport { UserModel } from '../../users/models/user.model'\nimport { users } from '../../users/schemas/users.schema'\nimport { FileParseContext, FileParseType } from '../interfaces/file-parse-index'\nimport { filePathSQL, files } from '../schemas/files.schema'\nimport { isPathExists } from '../utils/files'\n\n@Injectable()\nexport class FilesParser {\n private readonly logger = new Logger(FilesParser.name)\n\n constructor(@Inject(DB_TOKEN_PROVIDER) private readonly db: DBSchema) {}\n\n async *allPaths(userId?: number, spaceIds?: number[], shareIds?: number[]): AsyncGenerator<[number, FileParseType, FileParseContext[]]> {\n yield* this.userPaths(userId)\n yield* this.spacePaths(spaceIds)\n yield* this.sharePaths(shareIds)\n }\n\n async *userPaths(userId?: number): AsyncGenerator<[number, FileParseType, FileParseContext[]]> {\n for (const user of await this.db\n .select({\n id: users.id,\n login: users.login\n })\n .from(users)\n .where(and(...[eq(users.storageIndexing, true), lte(users.role, USER_ROLE.USER), ...(userId ? [eq(users.id, userId)] : [])]))) {\n const userFilesPath = UserModel.getFilesPath(user.login)\n if (!(await isPathExists(userFilesPath))) {\n this.logger.warn({ tag: this.userPaths.name, msg: `user path does not exist : ${userFilesPath}` })\n continue\n }\n yield [user.id, 'user', [{ realPath: userFilesPath, pathPrefix: `${SPACE_REPOSITORY.FILES}/${SPACE_ALIAS.PERSONAL}`, isDir: true }]]\n }\n }\n\n async *spacePaths(spaceIds?: number[]): AsyncGenerator<[number, FileParseType, FileParseContext[]]> {\n for (const space of await this.db\n .select({\n id: spaces.id,\n alias: spaces.alias,\n roots: concatDistinctObjectsInArray(spacesRoots.alias, {\n alias: spacesRoots.alias,\n externalPath: spacesRoots.externalPath,\n isDir: sql<boolean>`IF (${spacesRoots.externalPath} IS NOT NULL, 1, ${files.isDir})`,\n file: {\n path: filePathSQL(files),\n fromOwner: users.login\n }\n })\n })\n .from(spaces)\n .leftJoin(spacesRoots, eq(spacesRoots.spaceId, spaces.id))\n .leftJoin(files, eq(files.id, spacesRoots.fileId))\n .leftJoin(users, eq(users.id, files.ownerId))\n .where(and(eq(spaces.storageIndexing, true), ...(spaceIds ? [inArray(spaces.id, spaceIds)] : [])))\n .groupBy(spaces.id)) {\n const spaceFilesPath = SpaceModel.getFilesPath(space.alias)\n if (!(await isPathExists(spaceFilesPath))) {\n this.logger.warn({ tag: this.spacePaths.name, msg: `space path does not exist : ${spaceFilesPath}` })\n continue\n }\n const spacePath = [{ realPath: spaceFilesPath, pathPrefix: `${SPACE_REPOSITORY.FILES}/${space.alias}`, isDir: true }]\n const rootPaths = space.roots.map(\n (r: any): FileParseContext =>\n r.externalPath\n ? {\n realPath: r.externalPath,\n pathPrefix: `${SPACE_REPOSITORY.FILES}/${space.alias}/${r.alias}`,\n isDir: r.isDir\n }\n : {\n realPath: path.join(UserModel.getFilesPath(r.file.fromOwner), r.file.path),\n pathPrefix: `${SPACE_REPOSITORY.FILES}/${space.alias}/${r.alias}`,\n isDir: r.isDir\n }\n )\n yield [space.id, 'space', [...spacePath, ...rootPaths]]\n }\n }\n\n async *sharePaths(shareIds?: number[]): AsyncGenerator<[number, FileParseType, FileParseContext[]]> {\n for (const share of await this.db\n .select({\n id: shares.id,\n alias: shares.alias,\n externalPath: sql<string>`IF (${shares.externalPath} IS NOT NULL, ${shares.externalPath}, ${spacesRoots.externalPath})`,\n isDir: sql<boolean>`IF (${shares.externalPath} IS NOT NULL AND ${shares.fileId} IS NULL, 1, ${files.isDir})`,\n file: { path: sql<string>`IF (${files.id} IS NOT NULL, ${filePathSQL(files)}, '.')`, fromOwner: users.login, fromSpace: spaces.alias }\n })\n .from(shares)\n .leftJoin(spacesRoots, eq(spacesRoots.id, shares.spaceRootId))\n .leftJoin(\n files,\n or(\n // If the child share is from a share with an external path, the child share should have an external path and a fileId\n and(isNotNull(shares.fileId), eq(files.id, shares.fileId)),\n and(isNull(shares.externalPath), isNull(shares.fileId), isNotNull(spacesRoots.fileId), eq(files.id, spacesRoots.fileId))\n )\n )\n .leftJoin(spaces, and(isNull(shares.externalPath), isNotNull(files.spaceId), eq(spaces.id, files.spaceId), eq(spaces.storageIndexing, true)))\n .leftJoin(users, and(eq(users.id, files.ownerId), eq(users.storageIndexing, true)))\n .where(and(eq(shares.storageIndexing, true), ...[eq(shares.type, SHARE_TYPE.COMMON), ...(shareIds ? [inArray(shares.id, shareIds)] : [])]))\n .groupBy(shares.id)) {\n let shareFilesPath: string\n if (share.externalPath) {\n shareFilesPath = path.join(share.externalPath, share.file.path)\n } else if (share.file.fromOwner) {\n shareFilesPath = path.join(UserModel.getFilesPath(share.file.fromOwner), share.file.path)\n } else if (share.file.fromSpace) {\n shareFilesPath = path.join(SpaceModel.getFilesPath(share.file.fromSpace), share.file.path)\n } else {\n // Exclude shares that don’t match these cases (join conditions)\n continue\n }\n if (!(await isPathExists(shareFilesPath))) {\n this.logger.warn({ tag: this.sharePaths.name, msg: `share path does not exist : ${shareFilesPath}` })\n continue\n }\n yield [share.id, 'share', [{ realPath: shareFilesPath, pathPrefix: `${SPACE_REPOSITORY.SHARES}/${share.alias}`, isDir: share.isDir }]]\n }\n }\n}\n"],"names":["FilesParser","allPaths","userId","spaceIds","shareIds","userPaths","spacePaths","sharePaths","user","db","select","id","users","login","from","where","and","eq","storageIndexing","lte","role","USER_ROLE","USER","userFilesPath","UserModel","getFilesPath","isPathExists","logger","warn","tag","name","msg","realPath","pathPrefix","SPACE_REPOSITORY","FILES","SPACE_ALIAS","PERSONAL","isDir","space","spaces","alias","roots","concatDistinctObjectsInArray","spacesRoots","externalPath","sql","files","file","path","filePathSQL","fromOwner","leftJoin","spaceId","fileId","ownerId","inArray","groupBy","spaceFilesPath","SpaceModel","spacePath","rootPaths","map","r","join","share","shares","fromSpace","spaceRootId","or","isNotNull","isNull","type","SHARE_TYPE","COMMON","shareFilesPath","SHARES","Logger"],"mappings":"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"}
@@ -1,8 +1,4 @@
1
- /*
2
- * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>
3
- * This file is part of Sync-in | The open source file sync and share solution
4
- * See the LICENSE file for licensing details
5
- */ "use strict";
1
+ "use strict";
6
2
  Object.defineProperty(exports, "__esModule", {
7
3
  value: true
8
4
  });