UserPagesController.coffee 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. UserGetter = require("./UserGetter")
  2. UserSessionsManager = require("./UserSessionsManager")
  3. ErrorController = require("../Errors/ErrorController")
  4. logger = require("logger-sharelatex")
  5. Settings = require("settings-sharelatex")
  6. request = require 'request'
  7. fs = require('fs')
  8. AuthenticationController = require('../Authentication/AuthenticationController')
  9. module.exports = UserPagesController =
  10. registerPage : (req, res)->
  11. sharedProjectData =
  12. project_name:req.query.project_name
  13. user_first_name:req.query.user_first_name
  14. newTemplateData = {}
  15. if req.session.templateData?
  16. newTemplateData.templateName = req.session.templateData.templateName
  17. res.render 'user/register',
  18. title: 'register'
  19. sharedProjectData: sharedProjectData
  20. newTemplateData: newTemplateData
  21. new_email:req.query.new_email || ""
  22. activateAccountPage: (req, res) ->
  23. # An 'activation' is actually just a password reset on an account that
  24. # was set with a random password originally.
  25. logger.log query:req.query, "activiate account page called"
  26. if !req.query?.user_id? or !req.query?.token?
  27. return ErrorController.notFound(req, res)
  28. UserGetter.getUser req.query.user_id, {email: 1, loginCount: 1}, (error, user) ->
  29. return next(error) if error?
  30. if !user
  31. return ErrorController.notFound(req, res)
  32. if user.loginCount > 0
  33. logger.log user:user, "user has already logged in so is active, sending them to /login"
  34. # Already seen this user, so account must be activate
  35. # This lets users keep clicking the 'activate' link in their email
  36. # as a way to log in which, if I know our users, they will.
  37. res.redirect "/login?email=#{encodeURIComponent(user.email)}"
  38. else
  39. res.render 'user/activate',
  40. title: 'activate_account'
  41. email: user.email,
  42. token: req.query.token
  43. loginPage : (req, res)->
  44. # if user is being sent to /login with explicit redirect (redir=/foo),
  45. # such as being sent from the editor to /login, then set the redirect explicitly
  46. if req.query.redir? and !AuthenticationController._getRedirectFromSession(req)?
  47. logger.log {redir: req.query.redir}, "setting explicit redirect from login page"
  48. AuthenticationController.setRedirectInSession(req, req.query.redir)
  49. res.render 'user/login',
  50. title: 'login',
  51. email: req.query.email
  52. logoutPage: (req, res) ->
  53. res.render 'user/logout'
  54. renderReconfirmAccountPage: (req, res) ->
  55. page_data = {
  56. reconfirm_email: req?.session?.reconfirm_email
  57. }
  58. # when a user must reconfirm their account
  59. res.render 'user/reconfirm', page_data
  60. settingsPage : (req, res, next)->
  61. user_id = AuthenticationController.getLoggedInUserId(req)
  62. logger.log user: user_id, "loading settings page"
  63. shouldAllowEditingDetails = !(Settings?.ldap?.updateUserDetailsOnLogin) and !(Settings?.saml?.updateUserDetailsOnLogin)
  64. oauthProviders = Settings.oauthProviders || {}
  65. UserGetter.getUser user_id, (err, user)->
  66. return next(err) if err?
  67. UserPagesController._hasPassword user, (err, passwordPresent) ->
  68. if err
  69. logger.err {err}, "error getting password status from v1"
  70. res.render 'user/settings',
  71. title:'account_settings'
  72. user: user,
  73. hasPassword: passwordPresent,
  74. shouldAllowEditingDetails: shouldAllowEditingDetails
  75. languages: Settings.languages,
  76. accountSettingsTabActive: true,
  77. oauthProviders: UserPagesController._translateProviderDescriptions(oauthProviders, req),
  78. thirdPartyIds: UserPagesController._restructureThirdPartyIds(user),
  79. previewOauth: req.query.prvw?
  80. sessionsPage: (req, res, next) ->
  81. user = AuthenticationController.getSessionUser(req)
  82. logger.log user_id: user._id, "loading sessions page"
  83. UserSessionsManager.getAllUserSessions user, [req.sessionID], (err, sessions) ->
  84. if err?
  85. logger.err {user_id: user._id}, "error getting all user sessions"
  86. return next(err)
  87. res.render 'user/sessions',
  88. title: "sessions"
  89. sessions: sessions
  90. _hasPassword: (user, callback) ->
  91. request.get {
  92. url: "#{Settings.apis.v1.url}/api/v1/sharelatex/has_password"
  93. auth: { user: Settings.apis.v1.user, pass: Settings.apis.v1.pass }
  94. body: { user_id: user?.overleaf?.id }
  95. timeout: 20 * 1000
  96. json: true
  97. }, (err, response, body) ->
  98. if err
  99. # for errors assume password and show password setting form
  100. return callback(err, true)
  101. else if body?.has_password
  102. return callback(err, true)
  103. return callback(err, false)
  104. _restructureThirdPartyIds: (user) ->
  105. # 3rd party identifiers are an array of objects
  106. # this turn them into a single object, which
  107. # makes data easier to use in template
  108. return null if !user.thirdPartyIdentifiers || user.thirdPartyIdentifiers.length == 0
  109. user.thirdPartyIdentifiers.reduce (obj, identifier) ->
  110. obj[identifier.providerId] = identifier.externalUserId
  111. obj
  112. , {}
  113. _translateProviderDescriptions: (providers, req) ->
  114. result = {}
  115. if providers
  116. for provider, data of providers
  117. data.description = req.i18n.translate(data.descriptionKey, data.descriptionOptions)
  118. result[provider] = data
  119. return result