SessionTests.coffee 9.9 KB

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