User.coffee 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. request = require("./request")
  2. _ = require("underscore")
  3. settings = require("settings-sharelatex")
  4. {db, ObjectId} = require("../../../../app/js/infrastructure/mongojs")
  5. UserModel = require("../../../../app/js/models/User").User
  6. UserUpdater = require("../../../../app/js/Features/User/UserUpdater")
  7. AuthenticationManager = require("../../../../app/js/Features/Authentication/AuthenticationManager")
  8. count = 0
  9. class User
  10. constructor: (options = {}) ->
  11. @emails = [
  12. email: "acceptance-test-#{count}@example.com"
  13. createdAt: new Date()
  14. ]
  15. @email = @emails[0].email
  16. @password = "acceptance-test-#{count}-password"
  17. count++
  18. @jar = request.jar()
  19. @request = request.defaults({
  20. jar: @jar
  21. })
  22. setExtraAttributes: (user) ->
  23. throw new Error("User does not exist") unless user?._id?
  24. @id = user._id.toString()
  25. @_id = user._id.toString()
  26. @first_name = user.first_name
  27. @referal_id = user.referal_id
  28. get: (callback = (error, user)->) ->
  29. db.users.findOne { _id: ObjectId(@_id) }, callback
  30. register: (callback = (error, user) ->) ->
  31. return callback(new Error('User already registered')) if @_id?
  32. @getCsrfToken (error) =>
  33. return callback(error) if error?
  34. @request.post {
  35. url: '/register'
  36. json: { @email, @password }
  37. }, (error, response, body) =>
  38. return callback(error) if error?
  39. db.users.findOne { email: @email }, (error, user) =>
  40. return callback(error) if error?
  41. @setExtraAttributes user
  42. callback(null, user)
  43. login: (callback = (error) ->) ->
  44. @loginWith(@email, callback)
  45. loginWith: (email, callback = (error) ->) ->
  46. @ensureUserExists (error) =>
  47. return callback(error) if error?
  48. @getCsrfToken (error) =>
  49. return callback(error) if error?
  50. @request.post {
  51. url: "/login"
  52. json: { email, @password }
  53. }, callback
  54. ensureUserExists: (callback = (error) ->) ->
  55. filter = {@email}
  56. options = {upsert: true, new: true, setDefaultsOnInsert: true}
  57. UserModel.findOneAndUpdate filter, {}, options, (error, user) =>
  58. return callback(error) if error?
  59. AuthenticationManager.setUserPassword user._id, @password, (error) =>
  60. return callback(error) if error?
  61. UserUpdater.updateUser user._id, $set: emails: @emails, (error) =>
  62. return callback(error) if error?
  63. @setExtraAttributes user
  64. callback(null, @password)
  65. setFeatures: (features, callback = (error) ->) ->
  66. update = {}
  67. for key, value of features
  68. update["features.#{key}"] = value
  69. UserModel.update { _id: @id }, update, callback
  70. logout: (callback = (error) ->) ->
  71. @getCsrfToken (error) =>
  72. return callback(error) if error?
  73. @request.get {
  74. url: "/logout"
  75. json:
  76. email: @email
  77. password: @password
  78. }, (error, response, body) =>
  79. return callback(error) if error?
  80. db.users.findOne {email: @email}, (error, user) =>
  81. return callback(error) if error?
  82. @id = user?._id?.toString()
  83. @_id = user?._id?.toString()
  84. callback()
  85. addEmail: (email, callback = (error) ->) ->
  86. @emails.push(email: email, createdAt: new Date())
  87. UserUpdater.addEmailAddress @id, email, callback
  88. ensure_admin: (callback = (error) ->) ->
  89. db.users.update {_id: ObjectId(@id)}, { $set: { isAdmin: true }}, callback
  90. upgradeFeatures: (callback = (error) -> ) ->
  91. features = {
  92. collaborators: -1 # Infinite
  93. versioning: true
  94. dropbox:true
  95. compileTimeout: 60
  96. compileGroup:"priority"
  97. templates: true
  98. references: true
  99. trackChanges: true
  100. trackChangesVisible: true
  101. }
  102. db.users.update {_id: ObjectId(@id)}, { $set: { features: features }}, callback
  103. downgradeFeatures: (callback = (error) -> ) ->
  104. features = {
  105. collaborators: 1
  106. versioning: false
  107. dropbox:false
  108. compileTimeout: 60
  109. compileGroup:"standard"
  110. templates: false
  111. references: false
  112. trackChanges: false
  113. trackChangesVisible: false
  114. }
  115. db.users.update {_id: ObjectId(@id)}, { $set: { features: features }}, callback
  116. defaultFeatures: (callback = (error) -> ) ->
  117. features = settings.defaultFeatures
  118. db.users.update {_id: ObjectId(@id)}, { $set: { features: features }}, callback
  119. full_delete_user: (email, callback = (error) ->) ->
  120. db.users.findOne {email: email}, (error, user) =>
  121. if !user?
  122. return callback()
  123. user_id = user._id
  124. db.projects.remove owner_ref:ObjectId(user_id), {multi:true}, (err)->
  125. if err?
  126. callback(err)
  127. db.users.remove {_id: ObjectId(user_id)}, callback
  128. getProject: (project_id, callback = (error, project)->) ->
  129. db.projects.findOne {_id: ObjectId(project_id.toString())}, callback
  130. saveProject: (project, callback=(error)->) ->
  131. db.projects.update {_id: project._id}, project, callback
  132. createProject: (name, options, callback = (error, oroject_id) ->) ->
  133. if typeof options == "function"
  134. callback = options
  135. options = {}
  136. @request.post {
  137. url: "/project/new",
  138. json: Object.assign({projectName: name}, options)
  139. }, (error, response, body) ->
  140. return callback(error) if error?
  141. if !body?.project_id?
  142. error = new Error("SOMETHING WENT WRONG CREATING PROJECT", response.statusCode, response.headers["location"], body)
  143. callback error
  144. else
  145. callback(null, body.project_id)
  146. deleteProject: (project_id, callback=(error)) ->
  147. @request.delete {
  148. url: "/project/#{project_id}"
  149. }, (error, response, body) ->
  150. return callback(error) if error?
  151. callback(null)
  152. openProject: (project_id, callback=(error)) ->
  153. @request.get {
  154. url: "/project/#{project_id}"
  155. }, (error, response, body) ->
  156. return callback(error) if error?
  157. if response.statusCode != 200
  158. err = new Error("Non-success response when opening project: #{response.statusCode}")
  159. return callback(err)
  160. callback(null)
  161. createDocInProject: (project_id, parent_folder_id, name, callback=(error, doc_id)->) ->
  162. @getCsrfToken (error) =>
  163. return callback(error) if error?
  164. @request.post {
  165. url: "/project/#{project_id}/doc",
  166. json: {
  167. name: name,
  168. parent_folder_id: parent_folder_id
  169. }
  170. }, (error, response, body) =>
  171. callback(null, body._id)
  172. addUserToProject: (project_id, user, privileges, callback = (error, user) ->) ->
  173. if privileges == 'readAndWrite'
  174. updateOp = {$addToSet: {collaberator_refs: user._id.toString()}}
  175. else if privileges == 'readOnly'
  176. updateOp = {$addToSet: {readOnly_refs: user._id.toString()}}
  177. db.projects.update {_id: db.ObjectId(project_id)}, updateOp, (err) ->
  178. callback(err)
  179. makePublic: (project_id, level, callback = (error) ->) ->
  180. @request.post {
  181. url: "/project/#{project_id}/settings/admin",
  182. json:
  183. publicAccessLevel: level
  184. }, (error, response, body) ->
  185. return callback(error) if error?
  186. callback(null)
  187. makePrivate: (project_id, callback = (error) ->) ->
  188. @request.post {
  189. url: "/project/#{project_id}/settings/admin",
  190. json:
  191. publicAccessLevel: 'private'
  192. }, (error, response, body) ->
  193. return callback(error) if error?
  194. callback(null)
  195. makeTokenBased: (project_id, callback = (error) ->) ->
  196. @request.post {
  197. url: "/project/#{project_id}/settings/admin",
  198. json:
  199. publicAccessLevel: 'tokenBased'
  200. }, (error, response, body) ->
  201. return callback(error) if error?
  202. callback(null)
  203. getCsrfToken: (callback = (error) ->) ->
  204. @request.get {
  205. url: "/dev/csrf"
  206. }, (err, response, body) =>
  207. return callback(err) if err?
  208. @csrfToken = body
  209. @request = @request.defaults({
  210. headers:
  211. "x-csrf-token": @csrfToken
  212. })
  213. callback()
  214. changePassword: (callback = (error) ->) ->
  215. @getCsrfToken (error) =>
  216. return callback(error) if error?
  217. @request.post {
  218. url: "/user/password/update"
  219. json:
  220. currentPassword: @password
  221. newPassword1: @password
  222. newPassword2: @password
  223. }, (error, response, body) =>
  224. return callback(error) if error?
  225. db.users.findOne {email: @email}, (error, user) =>
  226. return callback(error) if error?
  227. callback()
  228. getUserSettingsPage: (callback = (error, statusCode) ->) ->
  229. @getCsrfToken (error) =>
  230. return callback(error) if error?
  231. @request.get {
  232. url: "/user/settings"
  233. }, (error, response, body) =>
  234. return callback(error) if error?
  235. callback(null, response.statusCode)
  236. activateSudoMode: (callback = (error)->) ->
  237. @getCsrfToken (error) =>
  238. return callback(error) if error?
  239. @request.post {
  240. uri: '/confirm-password',
  241. json:
  242. password: @password
  243. }, callback
  244. updateSettings: (newSettings, callback = (error, response, body) ->) ->
  245. @getCsrfToken (error) =>
  246. return callback(error) if error?
  247. @request.post {
  248. url: '/user/settings'
  249. json: newSettings
  250. }, callback
  251. getProjectListPage: (callback=(error, statusCode)->) ->
  252. @getCsrfToken (error) =>
  253. return callback(error) if error?
  254. @request.get {
  255. url: "/project"
  256. }, (error, response, body) =>
  257. return callback(error) if error?
  258. callback(null, response.statusCode)
  259. isLoggedIn: (callback = (error, loggedIn) ->) ->
  260. @request.get "/user/personal_info", (error, response, body) ->
  261. return callback(error) if error?
  262. if response.statusCode == 200
  263. return callback(null, true)
  264. else if response.statusCode == 302
  265. return callback(null, false)
  266. else
  267. return callback(new Error("unexpected status code from /user/personal_info: #{response.statusCode}"))
  268. module.exports = User