SessionTests.coffee 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. expect = require("chai").expect
  2. async = require("async")
  3. User = require "./helpers/User"
  4. request = require "./helpers/request"
  5. settings = require "settings-sharelatex"
  6. redis = require "./helpers/redis"
  7. MockV1Api = require './helpers/MockV1Api'
  8. describe "Sessions", ->
  9. before (done) ->
  10. @timeout(20000)
  11. @user1 = new User()
  12. @site_admin = new User({email: "admin@example.com"})
  13. async.series [
  14. (cb) => @user1.login cb
  15. (cb) => @user1.logout cb
  16. ], done
  17. describe "one session", ->
  18. it "should have one session in UserSessions set", (done) ->
  19. async.series(
  20. [
  21. (next) =>
  22. redis.clearUserSessions @user1, next
  23. # login, should add session to set
  24. , (next) =>
  25. @user1.login (err) ->
  26. next(err)
  27. , (next) =>
  28. redis.getUserSessions @user1, (err, sessions) =>
  29. expect(sessions.length).to.equal 1
  30. expect(sessions[0].slice(0, 5)).to.equal 'sess:'
  31. next()
  32. # should be able to access project list page
  33. , (next) =>
  34. @user1.getProjectListPage (err, statusCode) =>
  35. expect(err).to.equal null
  36. expect(statusCode).to.equal 200
  37. next()
  38. # logout, should remove session from set
  39. , (next) =>
  40. @user1.logout (err) ->
  41. next(err)
  42. , (next) =>
  43. redis.getUserSessions @user1, (err, sessions) =>
  44. expect(sessions.length).to.equal 0
  45. next()
  46. ], (err, result) =>
  47. if err
  48. throw err
  49. done()
  50. )
  51. describe "two sessions", ->
  52. before ->
  53. # set up second session for this user
  54. @user2 = new User()
  55. @user2.email = @user1.email
  56. @user2.password = @user1.password
  57. it "should have two sessions in UserSessions set", (done) ->
  58. async.series(
  59. [
  60. (next) =>
  61. redis.clearUserSessions @user1, next
  62. # login, should add session to set
  63. , (next) =>
  64. @user1.login (err) ->
  65. next(err)
  66. , (next) =>
  67. redis.getUserSessions @user1, (err, sessions) =>
  68. expect(sessions.length).to.equal 1
  69. expect(sessions[0].slice(0, 5)).to.equal 'sess:'
  70. next()
  71. # login again, should add the second session to set
  72. , (next) =>
  73. @user2.login (err) ->
  74. next(err)
  75. , (next) =>
  76. redis.getUserSessions @user1, (err, sessions) =>
  77. expect(sessions.length).to.equal 2
  78. expect(sessions[0].slice(0, 5)).to.equal 'sess:'
  79. expect(sessions[1].slice(0, 5)).to.equal 'sess:'
  80. next()
  81. # both should be able to access project list page
  82. , (next) =>
  83. @user1.getProjectListPage (err, statusCode) =>
  84. expect(err).to.equal null
  85. expect(statusCode).to.equal 200
  86. next()
  87. , (next) =>
  88. @user2.getProjectListPage (err, statusCode) =>
  89. expect(err).to.equal null
  90. expect(statusCode).to.equal 200
  91. next()
  92. # logout first session, should remove session from set
  93. , (next) =>
  94. @user1.logout (err) ->
  95. next(err)
  96. , (next) =>
  97. redis.getUserSessions @user1, (err, sessions) =>
  98. expect(sessions.length).to.equal 1
  99. next()
  100. # first session should not have access to project list page
  101. , (next) =>
  102. @user1.getProjectListPage (err, statusCode) =>
  103. expect(err).to.equal null
  104. expect(statusCode).to.equal 302
  105. next()
  106. # second session should still have access to settings
  107. , (next) =>
  108. @user2.getProjectListPage (err, statusCode) =>
  109. expect(err).to.equal null
  110. expect(statusCode).to.equal 200
  111. next()
  112. # logout second session, should remove last session from set
  113. , (next) =>
  114. @user2.logout (err) ->
  115. next(err)
  116. , (next) =>
  117. redis.getUserSessions @user1, (err, sessions) =>
  118. expect(sessions.length).to.equal 0
  119. next()
  120. # second session should not have access to project list page
  121. , (next) =>
  122. @user2.getProjectListPage (err, statusCode) =>
  123. expect(err).to.equal null
  124. expect(statusCode).to.equal 302
  125. next()
  126. ], (err, result) =>
  127. if err
  128. throw err
  129. done()
  130. )
  131. describe 'three sessions, password reset', ->
  132. before ->
  133. # set up second session for this user
  134. @user2 = new User()
  135. @user2.email = @user1.email
  136. @user2.password = @user1.password
  137. @user3 = new User()
  138. @user3.email = @user1.email
  139. @user3.password = @user1.password
  140. it "should erase both sessions when password is reset", (done) ->
  141. async.series(
  142. [
  143. (next) =>
  144. redis.clearUserSessions @user1, next
  145. # login, should add session to set
  146. , (next) =>
  147. @user1.login (err) ->
  148. next(err)
  149. , (next) =>
  150. redis.getUserSessions @user1, (err, sessions) =>
  151. expect(sessions.length).to.equal 1
  152. expect(sessions[0].slice(0, 5)).to.equal 'sess:'
  153. next()
  154. # login again, should add the second session to set
  155. , (next) =>
  156. @user2.login (err) ->
  157. next(err)
  158. , (next) =>
  159. redis.getUserSessions @user1, (err, sessions) =>
  160. expect(sessions.length).to.equal 2
  161. expect(sessions[0].slice(0, 5)).to.equal 'sess:'
  162. expect(sessions[1].slice(0, 5)).to.equal 'sess:'
  163. next()
  164. # login third session, should add the second session to set
  165. , (next) =>
  166. @user3.login (err) ->
  167. next(err)
  168. , (next) =>
  169. redis.getUserSessions @user1, (err, sessions) =>
  170. expect(sessions.length).to.equal 3
  171. expect(sessions[0].slice(0, 5)).to.equal 'sess:'
  172. expect(sessions[1].slice(0, 5)).to.equal 'sess:'
  173. next()
  174. # password reset from second session, should erase two of the three sessions
  175. , (next) =>
  176. @user2.changePassword (err) ->
  177. next(err)
  178. , (next) =>
  179. redis.getUserSessions @user2, (err, sessions) =>
  180. expect(sessions.length).to.equal 1
  181. next()
  182. # users one and three should not be able to access project list page
  183. , (next) =>
  184. @user1.getProjectListPage (err, statusCode) =>
  185. expect(err).to.equal null
  186. expect(statusCode).to.equal 302
  187. next()
  188. , (next) =>
  189. @user3.getProjectListPage (err, statusCode) =>
  190. expect(err).to.equal null
  191. expect(statusCode).to.equal 302
  192. next()
  193. # user two should still be logged in, and able to access project list page
  194. , (next) =>
  195. @user2.getProjectListPage (err, statusCode) =>
  196. expect(err).to.equal null
  197. expect(statusCode).to.equal 200
  198. next()
  199. # logout second session, should remove last session from set
  200. , (next) =>
  201. @user2.logout (err) ->
  202. next(err)
  203. , (next) =>
  204. redis.getUserSessions @user1, (err, sessions) =>
  205. expect(sessions.length).to.equal 0
  206. next()
  207. ], (err, result) =>
  208. if err
  209. throw err
  210. done()
  211. )
  212. describe 'three sessions, sessions page', ->
  213. before (done) ->
  214. # set up second session for this user
  215. @user2 = new User()
  216. @user2.email = @user1.email
  217. @user2.password = @user1.password
  218. @user3 = new User()
  219. @user3.email = @user1.email
  220. @user3.password = @user1.password
  221. async.series [
  222. @user2.login.bind(@user2)
  223. @user2.activateSudoMode.bind(@user2)
  224. ], done
  225. it "should allow the user to erase the other two sessions", (done) ->
  226. async.series(
  227. [
  228. (next) =>
  229. redis.clearUserSessions @user1, next
  230. # login, should add session to set
  231. , (next) =>
  232. @user1.login (err) ->
  233. next(err)
  234. , (next) =>
  235. redis.getUserSessions @user1, (err, sessions) =>
  236. expect(sessions.length).to.equal 1
  237. expect(sessions[0].slice(0, 5)).to.equal 'sess:'
  238. next()
  239. # login again, should add the second session to set
  240. , (next) =>
  241. @user2.login (err) ->
  242. next(err)
  243. , (next) =>
  244. redis.getUserSessions @user1, (err, sessions) =>
  245. expect(sessions.length).to.equal 2
  246. expect(sessions[0].slice(0, 5)).to.equal 'sess:'
  247. expect(sessions[1].slice(0, 5)).to.equal 'sess:'
  248. next()
  249. # login third session, should add the second session to set
  250. , (next) =>
  251. @user3.login (err) ->
  252. next(err)
  253. , (next) =>
  254. redis.getUserSessions @user1, (err, sessions) =>
  255. expect(sessions.length).to.equal 3
  256. expect(sessions[0].slice(0, 5)).to.equal 'sess:'
  257. expect(sessions[1].slice(0, 5)).to.equal 'sess:'
  258. next()
  259. # enter sudo-mode
  260. , (next) =>
  261. @user2.getCsrfToken (err) =>
  262. expect(err).to.be.oneOf [null, undefined]
  263. @user2.request.post {
  264. uri: '/confirm-password',
  265. json:
  266. password: @user2.password
  267. }, (err, response, body) =>
  268. expect(err).to.be.oneOf [null, undefined]
  269. expect(response.statusCode).to.equal 200
  270. next()
  271. # check the sessions page
  272. , (next) =>
  273. @user2.request.get {
  274. uri: '/user/sessions'
  275. }, (err, response, body) =>
  276. expect(err).to.be.oneOf [null, undefined]
  277. expect(response.statusCode).to.equal 200
  278. next()
  279. # clear sessions from second session, should erase two of the three sessions
  280. , (next) =>
  281. @user2.getCsrfToken (err) =>
  282. expect(err).to.be.oneOf [null, undefined]
  283. @user2.request.post {
  284. uri: '/user/sessions/clear'
  285. }, (err) ->
  286. next(err)
  287. , (next) =>
  288. redis.getUserSessions @user2, (err, sessions) =>
  289. expect(sessions.length).to.equal 1
  290. next()
  291. # users one and three should not be able to access project list page
  292. , (next) =>
  293. @user1.getProjectListPage (err, statusCode) =>
  294. expect(err).to.equal null
  295. expect(statusCode).to.equal 302
  296. next()
  297. , (next) =>
  298. @user3.getProjectListPage (err, statusCode) =>
  299. expect(err).to.equal null
  300. expect(statusCode).to.equal 302
  301. next()
  302. # user two should still be logged in, and able to access project list page
  303. , (next) =>
  304. @user2.getProjectListPage (err, statusCode) =>
  305. expect(err).to.equal null
  306. expect(statusCode).to.equal 200
  307. next()
  308. # logout second session, should remove last session from set
  309. , (next) =>
  310. @user2.logout (err) ->
  311. next(err)
  312. , (next) =>
  313. redis.getUserSessions @user1, (err, sessions) =>
  314. expect(sessions.length).to.equal 0
  315. next()
  316. ], (err, result) =>
  317. if err
  318. throw err
  319. done()
  320. )