User.coffee 6.9 KB

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