User.coffee 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  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. AuthenticationManager = require("../../../../app/js/Features/Authentication/AuthenticationManager")
  7. count = 0
  8. class User
  9. constructor: (options = {}) ->
  10. @email = "acceptance-test-#{count}@example.com"
  11. @password = "acceptance-test-#{count}-password"
  12. count++
  13. @jar = request.jar()
  14. @request = request.defaults({
  15. jar: @jar
  16. })
  17. login: (callback = (error) ->) ->
  18. @getCsrfToken (error) =>
  19. return callback(error) if error?
  20. filter = {@email}
  21. options = {upsert: true, new: true, setDefaultsOnInsert: true}
  22. UserModel.findOneAndUpdate filter, {}, options, (error, user) =>
  23. return callback(error) if error?
  24. AuthenticationManager.setUserPassword user._id, @password, (error) =>
  25. return callback(error) if error?
  26. @id = user?._id?.toString()
  27. @_id = user?._id?.toString()
  28. @first_name = user?.first_name
  29. @referal_id = user?.referal_id
  30. @request.post {
  31. url: "/login"
  32. json: { @email, @password }
  33. }, callback
  34. logout: (callback = (error) ->) ->
  35. @getCsrfToken (error) =>
  36. return callback(error) if error?
  37. @request.get {
  38. url: "/logout"
  39. json:
  40. email: @email
  41. password: @password
  42. }, (error, response, body) =>
  43. return callback(error) if error?
  44. db.users.findOne {email: @email}, (error, user) =>
  45. return callback(error) if error?
  46. @id = user?._id?.toString()
  47. @_id = user?._id?.toString()
  48. callback()
  49. ensure_admin: (callback = (error) ->) ->
  50. db.users.update {_id: ObjectId(@id)}, { $set: { isAdmin: true }}, callback
  51. upgradeFeatures: (callback = (error) -> ) ->
  52. features = {
  53. collaborators: -1 # Infinite
  54. versioning: true
  55. dropbox:true
  56. compileTimeout: 60
  57. compileGroup:"priority"
  58. templates: true
  59. references: true
  60. trackChanges: true
  61. trackChangesVisible: true
  62. }
  63. db.users.update {_id: ObjectId(@id)}, { $set: { features: features }}, callback
  64. downgradeFeatures: (callback = (error) -> ) ->
  65. features = {
  66. collaborators: 1
  67. versioning: false
  68. dropbox:false
  69. compileTimeout: 60
  70. compileGroup:"standard"
  71. templates: false
  72. references: false
  73. trackChanges: false
  74. trackChangesVisible: false
  75. }
  76. db.users.update {_id: ObjectId(@id)}, { $set: { features: features }}, callback
  77. defaultFeatures: (callback = (error) -> ) ->
  78. features = settings.defaultFeatures
  79. db.users.update {_id: ObjectId(@id)}, { $set: { features: features }}, callback
  80. full_delete_user: (email, callback = (error) ->) ->
  81. db.users.findOne {email: email}, (error, user) =>
  82. if !user?
  83. return callback()
  84. user_id = user._id
  85. db.projects.remove owner_ref:ObjectId(user_id), {multi:true}, (err)->
  86. if err?
  87. callback(err)
  88. db.users.remove {_id: ObjectId(user_id)}, callback
  89. getProject: (project_id, callback = (error, project)->) ->
  90. db.projects.findOne {_id: ObjectId(project_id.toString())}, callback
  91. createProject: (name, options, callback = (error, oroject_id) ->) ->
  92. if typeof options == "function"
  93. callback = options
  94. options = {}
  95. @request.post {
  96. url: "/project/new",
  97. json: Object.assign({projectName: name}, options)
  98. }, (error, response, body) ->
  99. return callback(error) if error?
  100. if !body?.project_id?
  101. error = new Error("SOMETHING WENT WRONG CREATING PROJECT", response.statusCode, response.headers["location"], body)
  102. callback error
  103. else
  104. callback(null, body.project_id)
  105. deleteProject: (project_id, callback=(error)) ->
  106. @request.delete {
  107. url: "/project/#{project_id}"
  108. }, (error, response, body) ->
  109. return callback(error) if error?
  110. callback(null)
  111. openProject: (project_id, callback=(error)) ->
  112. @request.get {
  113. url: "/project/#{project_id}"
  114. }, (error, response, body) ->
  115. return callback(error) if error?
  116. if response.statusCode != 200
  117. err = new Error("Non-success response when opening project: #{response.statusCode}")
  118. return callback(err)
  119. callback(null)
  120. addUserToProject: (project_id, user, privileges, callback = (error, user) ->) ->
  121. if privileges == 'readAndWrite'
  122. updateOp = {$addToSet: {collaberator_refs: user._id.toString()}}
  123. else if privileges == 'readOnly'
  124. updateOp = {$addToSet: {readOnly_refs: user._id.toString()}}
  125. db.projects.update {_id: db.ObjectId(project_id)}, updateOp, (err) ->
  126. callback(err)
  127. makePublic: (project_id, level, callback = (error) ->) ->
  128. @request.post {
  129. url: "/project/#{project_id}/settings/admin",
  130. json:
  131. publicAccessLevel: level
  132. }, (error, response, body) ->
  133. return callback(error) if error?
  134. callback(null)
  135. makePrivate: (project_id, callback = (error) ->) ->
  136. @request.post {
  137. url: "/project/#{project_id}/settings/admin",
  138. json:
  139. publicAccessLevel: 'private'
  140. }, (error, response, body) ->
  141. return callback(error) if error?
  142. callback(null)
  143. makeTokenBased: (project_id, callback = (error) ->) ->
  144. @request.post {
  145. url: "/project/#{project_id}/settings/admin",
  146. json:
  147. publicAccessLevel: 'tokenBased'
  148. }, (error, response, body) ->
  149. return callback(error) if error?
  150. callback(null)
  151. getCsrfToken: (callback = (error) ->) ->
  152. @request.get {
  153. url: "/dev/csrf"
  154. }, (err, response, body) =>
  155. return callback(err) if err?
  156. @csrfToken = body
  157. @request = @request.defaults({
  158. headers:
  159. "x-csrf-token": @csrfToken
  160. })
  161. callback()
  162. changePassword: (callback = (error) ->) ->
  163. @getCsrfToken (error) =>
  164. return callback(error) if error?
  165. @request.post {
  166. url: "/user/password/update"
  167. json:
  168. currentPassword: @password
  169. newPassword1: @password
  170. newPassword2: @password
  171. }, (error, response, body) =>
  172. return callback(error) if error?
  173. db.users.findOne {email: @email}, (error, user) =>
  174. return callback(error) if error?
  175. callback()
  176. getUserSettingsPage: (callback = (error, statusCode) ->) ->
  177. @getCsrfToken (error) =>
  178. return callback(error) if error?
  179. @request.get {
  180. url: "/user/settings"
  181. }, (error, response, body) =>
  182. return callback(error) if error?
  183. callback(null, response.statusCode)
  184. getProjectListPage: (callback=(error, statusCode)->) ->
  185. @getCsrfToken (error) =>
  186. return callback(error) if error?
  187. @request.get {
  188. url: "/project"
  189. }, (error, response, body) =>
  190. return callback(error) if error?
  191. callback(null, response.statusCode)
  192. module.exports = User