User.coffee 7.4 KB

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