AdminController.mjs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import logger from '@overleaf/logger'
  2. import http from 'node:http'
  3. import https from 'node:https'
  4. import Settings from '@overleaf/settings'
  5. import TpdsUpdateSender from '../ThirdPartyDataStore/TpdsUpdateSender.mjs'
  6. import TpdsProjectFlusher from '../ThirdPartyDataStore/TpdsProjectFlusher.mjs'
  7. import EditorRealTimeController from '../Editor/EditorRealTimeController.mjs'
  8. import SystemMessageManager from '../SystemMessages/SystemMessageManager.mjs'
  9. import Modules from '../../infrastructure/Modules.js'
  10. const AdminController = {
  11. _sendDisconnectAllUsersMessage: delay => {
  12. return EditorRealTimeController.emitToAll(
  13. 'forceDisconnect',
  14. 'Sorry, we are performing a quick update to the editor and need to close it down. Please refresh the page to continue.',
  15. delay
  16. )
  17. },
  18. index: (req, res, next) => {
  19. let url
  20. const openSockets = {}
  21. for (url in http.globalAgent.sockets) {
  22. openSockets[`http://${url}`] = http.globalAgent.sockets[url].map(
  23. socket => socket._httpMessage.path
  24. )
  25. }
  26. for (url in https.globalAgent.sockets) {
  27. openSockets[`https://${url}`] = https.globalAgent.sockets[url].map(
  28. socket => socket._httpMessage.path
  29. )
  30. }
  31. SystemMessageManager.getMessagesFromDB(
  32. async function (error, systemMessages) {
  33. if (error) {
  34. return next(error)
  35. }
  36. const privilegesMatrixResults = await Modules.promises.hooks.fire(
  37. 'getPrivilegesMatrix'
  38. )
  39. const privilegesMatrix = privilegesMatrixResults[0] || null
  40. res.render('admin/index', {
  41. title: 'System Admin',
  42. openSockets,
  43. systemMessages,
  44. privilegesMatrix,
  45. })
  46. }
  47. )
  48. },
  49. disconnectAllUsers: (req, res) => {
  50. logger.warn('disconecting everyone')
  51. const delay = (req.query && req.query.delay) > 0 ? req.query.delay : 10
  52. AdminController._sendDisconnectAllUsersMessage(delay)
  53. res.redirect('/admin#open-close-editor')
  54. },
  55. openEditor(req, res) {
  56. logger.warn('opening editor')
  57. Settings.editorIsOpen = true
  58. res.redirect('/admin#open-close-editor')
  59. },
  60. closeEditor(req, res) {
  61. logger.warn('closing editor')
  62. Settings.editorIsOpen = req.body.isOpen
  63. res.redirect('/admin#open-close-editor')
  64. },
  65. flushProjectToTpds(req, res, next) {
  66. TpdsProjectFlusher.flushProjectToTpds(req.body.project_id, error => {
  67. if (error) {
  68. return next(error)
  69. }
  70. res.sendStatus(200)
  71. })
  72. },
  73. pollDropboxForUser(req, res) {
  74. const { user_id: userId } = req.body
  75. TpdsUpdateSender.pollDropboxForUser(userId, () => res.sendStatus(200))
  76. },
  77. createMessage(req, res, next) {
  78. SystemMessageManager.createMessage(req.body.content, function (error) {
  79. if (error) {
  80. return next(error)
  81. }
  82. res.redirect('/admin#system-messages')
  83. })
  84. },
  85. clearMessages(req, res, next) {
  86. SystemMessageManager.clearMessages(function (error) {
  87. if (error) {
  88. return next(error)
  89. }
  90. res.redirect('/admin#system-messages')
  91. })
  92. },
  93. }
  94. export default AdminController