SessionTests.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493
  1. /* eslint-disable
  2. handle-callback-err,
  3. max-len,
  4. no-return-assign,
  5. no-unused-vars,
  6. */
  7. // TODO: This file was created by bulk-decaffeinate.
  8. // Fix any style issues and re-enable lint.
  9. /*
  10. * decaffeinate suggestions:
  11. * DS102: Remove unnecessary code created because of implicit returns
  12. * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  13. */
  14. const { expect } = require('chai')
  15. const async = require('async')
  16. const User = require('./helpers/User')
  17. const request = require('./helpers/request')
  18. const settings = require('settings-sharelatex')
  19. const redis = require('./helpers/redis')
  20. const MockV1Api = require('./helpers/MockV1Api')
  21. const MockTagsApi = require('./helpers/MockTagsApi')
  22. describe('Sessions', function() {
  23. beforeEach(function(done) {
  24. this.timeout(20000)
  25. this.user1 = new User()
  26. this.site_admin = new User({ email: 'admin@example.com' })
  27. MockTagsApi.tags[this.user1] = []
  28. return async.series(
  29. [cb => this.user1.login(cb), cb => this.user1.logout(cb)],
  30. done
  31. )
  32. })
  33. describe('one session', function() {
  34. it('should have one session in UserSessions set', function(done) {
  35. return async.series(
  36. [
  37. next => {
  38. return redis.clearUserSessions(this.user1, next)
  39. },
  40. // login, should add session to set
  41. next => {
  42. return this.user1.login(err => next(err))
  43. },
  44. next => {
  45. return redis.getUserSessions(this.user1, (err, sessions) => {
  46. expect(sessions.length).to.equal(1)
  47. expect(sessions[0].slice(0, 5)).to.equal('sess:')
  48. return next()
  49. })
  50. },
  51. // should be able to access project list page
  52. next => {
  53. return this.user1.getProjectListPage((err, statusCode) => {
  54. expect(err).to.equal(null)
  55. expect(statusCode).to.equal(200)
  56. return next()
  57. })
  58. },
  59. // logout, should remove session from set
  60. next => {
  61. return this.user1.logout(err => next(err))
  62. },
  63. next => {
  64. return redis.getUserSessions(this.user1, (err, sessions) => {
  65. expect(sessions.length).to.equal(0)
  66. return next()
  67. })
  68. }
  69. ],
  70. (err, result) => {
  71. if (err) {
  72. throw err
  73. }
  74. return done()
  75. }
  76. )
  77. })
  78. })
  79. describe('two sessions', function() {
  80. beforeEach(function() {
  81. // set up second session for this user
  82. this.user2 = new User()
  83. this.user2.email = this.user1.email
  84. return (this.user2.password = this.user1.password)
  85. })
  86. it('should have two sessions in UserSessions set', function(done) {
  87. return async.series(
  88. [
  89. next => {
  90. return redis.clearUserSessions(this.user1, next)
  91. },
  92. // login, should add session to set
  93. next => {
  94. return this.user1.login(err => next(err))
  95. },
  96. next => {
  97. return redis.getUserSessions(this.user1, (err, sessions) => {
  98. expect(sessions.length).to.equal(1)
  99. expect(sessions[0].slice(0, 5)).to.equal('sess:')
  100. return next()
  101. })
  102. },
  103. // login again, should add the second session to set
  104. next => {
  105. return this.user2.login(err => next(err))
  106. },
  107. next => {
  108. return redis.getUserSessions(this.user1, (err, sessions) => {
  109. expect(sessions.length).to.equal(2)
  110. expect(sessions[0].slice(0, 5)).to.equal('sess:')
  111. expect(sessions[1].slice(0, 5)).to.equal('sess:')
  112. return next()
  113. })
  114. },
  115. // both should be able to access project list page
  116. next => {
  117. return this.user1.getProjectListPage((err, statusCode) => {
  118. expect(err).to.equal(null)
  119. expect(statusCode).to.equal(200)
  120. return next()
  121. })
  122. },
  123. next => {
  124. return this.user2.getProjectListPage((err, statusCode) => {
  125. expect(err).to.equal(null)
  126. expect(statusCode).to.equal(200)
  127. return next()
  128. })
  129. },
  130. // logout first session, should remove session from set
  131. next => {
  132. return this.user1.logout(err => next(err))
  133. },
  134. next => {
  135. return redis.getUserSessions(this.user1, (err, sessions) => {
  136. expect(sessions.length).to.equal(1)
  137. return next()
  138. })
  139. },
  140. // first session should not have access to project list page
  141. next => {
  142. return this.user1.getProjectListPage((err, statusCode) => {
  143. expect(err).to.equal(null)
  144. expect(statusCode).to.equal(302)
  145. return next()
  146. })
  147. },
  148. // second session should still have access to settings
  149. next => {
  150. return this.user2.getProjectListPage((err, statusCode) => {
  151. expect(err).to.equal(null)
  152. expect(statusCode).to.equal(200)
  153. return next()
  154. })
  155. },
  156. // logout second session, should remove last session from set
  157. next => {
  158. return this.user2.logout(err => next(err))
  159. },
  160. next => {
  161. return redis.getUserSessions(this.user1, (err, sessions) => {
  162. expect(sessions.length).to.equal(0)
  163. return next()
  164. })
  165. },
  166. // second session should not have access to project list page
  167. next => {
  168. return this.user2.getProjectListPage((err, statusCode) => {
  169. expect(err).to.equal(null)
  170. expect(statusCode).to.equal(302)
  171. return next()
  172. })
  173. }
  174. ],
  175. (err, result) => {
  176. if (err) {
  177. throw err
  178. }
  179. return done()
  180. }
  181. )
  182. })
  183. })
  184. describe('three sessions, password reset', function() {
  185. beforeEach(function() {
  186. // set up second session for this user
  187. this.user2 = new User()
  188. this.user2.email = this.user1.email
  189. this.user2.password = this.user1.password
  190. this.user3 = new User()
  191. this.user3.email = this.user1.email
  192. return (this.user3.password = this.user1.password)
  193. })
  194. it('should erase both sessions when password is reset', function(done) {
  195. return async.series(
  196. [
  197. next => {
  198. return redis.clearUserSessions(this.user1, next)
  199. },
  200. // login, should add session to set
  201. next => {
  202. return this.user1.login(err => next(err))
  203. },
  204. next => {
  205. return redis.getUserSessions(this.user1, (err, sessions) => {
  206. expect(sessions.length).to.equal(1)
  207. expect(sessions[0].slice(0, 5)).to.equal('sess:')
  208. return next()
  209. })
  210. },
  211. // login again, should add the second session to set
  212. next => {
  213. return this.user2.login(err => next(err))
  214. },
  215. next => {
  216. return redis.getUserSessions(this.user1, (err, sessions) => {
  217. expect(sessions.length).to.equal(2)
  218. expect(sessions[0].slice(0, 5)).to.equal('sess:')
  219. expect(sessions[1].slice(0, 5)).to.equal('sess:')
  220. return next()
  221. })
  222. },
  223. // login third session, should add the second session to set
  224. next => {
  225. return this.user3.login(err => next(err))
  226. },
  227. next => {
  228. return redis.getUserSessions(this.user1, (err, sessions) => {
  229. expect(sessions.length).to.equal(3)
  230. expect(sessions[0].slice(0, 5)).to.equal('sess:')
  231. expect(sessions[1].slice(0, 5)).to.equal('sess:')
  232. return next()
  233. })
  234. },
  235. // password reset from second session, should erase two of the three sessions
  236. next => {
  237. return this.user2.changePassword(err => next(err))
  238. },
  239. next => {
  240. return redis.getUserSessions(this.user2, (err, sessions) => {
  241. expect(sessions.length).to.equal(1)
  242. return next()
  243. })
  244. },
  245. // users one and three should not be able to access project list page
  246. next => {
  247. return this.user1.getProjectListPage((err, statusCode) => {
  248. expect(err).to.equal(null)
  249. expect(statusCode).to.equal(302)
  250. return next()
  251. })
  252. },
  253. next => {
  254. return this.user3.getProjectListPage((err, statusCode) => {
  255. expect(err).to.equal(null)
  256. expect(statusCode).to.equal(302)
  257. return next()
  258. })
  259. },
  260. // user two should still be logged in, and able to access project list page
  261. next => {
  262. return this.user2.getProjectListPage((err, statusCode) => {
  263. expect(err).to.equal(null)
  264. expect(statusCode).to.equal(200)
  265. return next()
  266. })
  267. },
  268. // logout second session, should remove last session from set
  269. next => {
  270. return this.user2.logout(err => next(err))
  271. },
  272. next => {
  273. return redis.getUserSessions(this.user1, (err, sessions) => {
  274. expect(sessions.length).to.equal(0)
  275. return next()
  276. })
  277. }
  278. ],
  279. (err, result) => {
  280. if (err) {
  281. throw err
  282. }
  283. return done()
  284. }
  285. )
  286. })
  287. })
  288. describe('three sessions, sessions page', function() {
  289. beforeEach(function(done) {
  290. // set up second session for this user
  291. this.user2 = new User()
  292. this.user2.email = this.user1.email
  293. this.user2.password = this.user1.password
  294. this.user3 = new User()
  295. this.user3.email = this.user1.email
  296. this.user3.password = this.user1.password
  297. return async.series(
  298. [
  299. this.user2.login.bind(this.user2),
  300. this.user2.activateSudoMode.bind(this.user2)
  301. ],
  302. done
  303. )
  304. })
  305. it('should allow the user to erase the other two sessions', function(done) {
  306. return async.series(
  307. [
  308. next => {
  309. return redis.clearUserSessions(this.user1, next)
  310. },
  311. // login, should add session to set
  312. next => {
  313. return this.user1.login(err => next(err))
  314. },
  315. next => {
  316. return redis.getUserSessions(this.user1, (err, sessions) => {
  317. expect(sessions.length).to.equal(1)
  318. expect(sessions[0].slice(0, 5)).to.equal('sess:')
  319. return next()
  320. })
  321. },
  322. // login again, should add the second session to set
  323. next => {
  324. return this.user2.login(err => next(err))
  325. },
  326. next => {
  327. return redis.getUserSessions(this.user1, (err, sessions) => {
  328. expect(sessions.length).to.equal(2)
  329. expect(sessions[0].slice(0, 5)).to.equal('sess:')
  330. expect(sessions[1].slice(0, 5)).to.equal('sess:')
  331. return next()
  332. })
  333. },
  334. // login third session, should add the second session to set
  335. next => {
  336. return this.user3.login(err => next(err))
  337. },
  338. next => {
  339. return redis.getUserSessions(this.user1, (err, sessions) => {
  340. expect(sessions.length).to.equal(3)
  341. expect(sessions[0].slice(0, 5)).to.equal('sess:')
  342. expect(sessions[1].slice(0, 5)).to.equal('sess:')
  343. return next()
  344. })
  345. },
  346. // enter sudo-mode
  347. next => {
  348. return this.user2.getCsrfToken(err => {
  349. expect(err).to.be.oneOf([null, undefined])
  350. return this.user2.request.post(
  351. {
  352. uri: '/confirm-password',
  353. json: {
  354. password: this.user2.password
  355. }
  356. },
  357. (err, response, body) => {
  358. expect(err).to.be.oneOf([null, undefined])
  359. expect(response.statusCode).to.equal(200)
  360. return next()
  361. }
  362. )
  363. })
  364. },
  365. // check the sessions page
  366. next => {
  367. return this.user2.request.get(
  368. {
  369. uri: '/user/sessions'
  370. },
  371. (err, response, body) => {
  372. expect(err).to.be.oneOf([null, undefined])
  373. expect(response.statusCode).to.equal(200)
  374. return next()
  375. }
  376. )
  377. },
  378. // clear sessions from second session, should erase two of the three sessions
  379. next => {
  380. return this.user2.getCsrfToken(err => {
  381. expect(err).to.be.oneOf([null, undefined])
  382. return this.user2.request.post(
  383. {
  384. uri: '/user/sessions/clear'
  385. },
  386. err => next(err)
  387. )
  388. })
  389. },
  390. next => {
  391. return redis.getUserSessions(this.user2, (err, sessions) => {
  392. expect(sessions.length).to.equal(1)
  393. return next()
  394. })
  395. },
  396. // users one and three should not be able to access project list page
  397. next => {
  398. return this.user1.getProjectListPage((err, statusCode) => {
  399. expect(err).to.equal(null)
  400. expect(statusCode).to.equal(302)
  401. return next()
  402. })
  403. },
  404. next => {
  405. return this.user3.getProjectListPage((err, statusCode) => {
  406. expect(err).to.equal(null)
  407. expect(statusCode).to.equal(302)
  408. return next()
  409. })
  410. },
  411. // user two should still be logged in, and able to access project list page
  412. next => {
  413. return this.user2.getProjectListPage((err, statusCode) => {
  414. expect(err).to.equal(null)
  415. expect(statusCode).to.equal(200)
  416. return next()
  417. })
  418. },
  419. // logout second session, should remove last session from set
  420. next => {
  421. return this.user2.logout(err => next(err))
  422. },
  423. next => {
  424. return redis.getUserSessions(this.user1, (err, sessions) => {
  425. expect(sessions.length).to.equal(0)
  426. return next()
  427. })
  428. }
  429. ],
  430. (err, result) => {
  431. if (err) {
  432. throw err
  433. }
  434. return done()
  435. }
  436. )
  437. })
  438. })
  439. })