SessionTests.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492
  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. before(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', () =>
  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. describe('two sessions', function() {
  79. before(function() {
  80. // set up second session for this user
  81. this.user2 = new User()
  82. this.user2.email = this.user1.email
  83. return (this.user2.password = this.user1.password)
  84. })
  85. it('should have two sessions in UserSessions set', function(done) {
  86. return async.series(
  87. [
  88. next => {
  89. return redis.clearUserSessions(this.user1, next)
  90. },
  91. // login, should add session to set
  92. next => {
  93. return this.user1.login(err => next(err))
  94. },
  95. next => {
  96. return redis.getUserSessions(this.user1, (err, sessions) => {
  97. expect(sessions.length).to.equal(1)
  98. expect(sessions[0].slice(0, 5)).to.equal('sess:')
  99. return next()
  100. })
  101. },
  102. // login again, should add the second session to set
  103. next => {
  104. return this.user2.login(err => next(err))
  105. },
  106. next => {
  107. return redis.getUserSessions(this.user1, (err, sessions) => {
  108. expect(sessions.length).to.equal(2)
  109. expect(sessions[0].slice(0, 5)).to.equal('sess:')
  110. expect(sessions[1].slice(0, 5)).to.equal('sess:')
  111. return next()
  112. })
  113. },
  114. // both should be able to access project list page
  115. next => {
  116. return this.user1.getProjectListPage((err, statusCode) => {
  117. expect(err).to.equal(null)
  118. expect(statusCode).to.equal(200)
  119. return next()
  120. })
  121. },
  122. next => {
  123. return this.user2.getProjectListPage((err, statusCode) => {
  124. expect(err).to.equal(null)
  125. expect(statusCode).to.equal(200)
  126. return next()
  127. })
  128. },
  129. // logout first session, should remove session from set
  130. next => {
  131. return this.user1.logout(err => next(err))
  132. },
  133. next => {
  134. return redis.getUserSessions(this.user1, (err, sessions) => {
  135. expect(sessions.length).to.equal(1)
  136. return next()
  137. })
  138. },
  139. // first session should not have access to project list page
  140. next => {
  141. return this.user1.getProjectListPage((err, statusCode) => {
  142. expect(err).to.equal(null)
  143. expect(statusCode).to.equal(302)
  144. return next()
  145. })
  146. },
  147. // second session should still have access to settings
  148. next => {
  149. return this.user2.getProjectListPage((err, statusCode) => {
  150. expect(err).to.equal(null)
  151. expect(statusCode).to.equal(200)
  152. return next()
  153. })
  154. },
  155. // logout second session, should remove last session from set
  156. next => {
  157. return this.user2.logout(err => next(err))
  158. },
  159. next => {
  160. return redis.getUserSessions(this.user1, (err, sessions) => {
  161. expect(sessions.length).to.equal(0)
  162. return next()
  163. })
  164. },
  165. // second session should not have access to project list page
  166. next => {
  167. return this.user2.getProjectListPage((err, statusCode) => {
  168. expect(err).to.equal(null)
  169. expect(statusCode).to.equal(302)
  170. return next()
  171. })
  172. }
  173. ],
  174. (err, result) => {
  175. if (err) {
  176. throw err
  177. }
  178. return done()
  179. }
  180. )
  181. })
  182. })
  183. describe('three sessions, password reset', function() {
  184. before(function() {
  185. // set up second session for this user
  186. this.user2 = new User()
  187. this.user2.email = this.user1.email
  188. this.user2.password = this.user1.password
  189. this.user3 = new User()
  190. this.user3.email = this.user1.email
  191. return (this.user3.password = this.user1.password)
  192. })
  193. it('should erase both sessions when password is reset', function(done) {
  194. return async.series(
  195. [
  196. next => {
  197. return redis.clearUserSessions(this.user1, next)
  198. },
  199. // login, should add session to set
  200. next => {
  201. return this.user1.login(err => next(err))
  202. },
  203. next => {
  204. return redis.getUserSessions(this.user1, (err, sessions) => {
  205. expect(sessions.length).to.equal(1)
  206. expect(sessions[0].slice(0, 5)).to.equal('sess:')
  207. return next()
  208. })
  209. },
  210. // login again, should add the second session to set
  211. next => {
  212. return this.user2.login(err => next(err))
  213. },
  214. next => {
  215. return redis.getUserSessions(this.user1, (err, sessions) => {
  216. expect(sessions.length).to.equal(2)
  217. expect(sessions[0].slice(0, 5)).to.equal('sess:')
  218. expect(sessions[1].slice(0, 5)).to.equal('sess:')
  219. return next()
  220. })
  221. },
  222. // login third session, should add the second session to set
  223. next => {
  224. return this.user3.login(err => next(err))
  225. },
  226. next => {
  227. return redis.getUserSessions(this.user1, (err, sessions) => {
  228. expect(sessions.length).to.equal(3)
  229. expect(sessions[0].slice(0, 5)).to.equal('sess:')
  230. expect(sessions[1].slice(0, 5)).to.equal('sess:')
  231. return next()
  232. })
  233. },
  234. // password reset from second session, should erase two of the three sessions
  235. next => {
  236. return this.user2.changePassword(err => next(err))
  237. },
  238. next => {
  239. return redis.getUserSessions(this.user2, (err, sessions) => {
  240. expect(sessions.length).to.equal(1)
  241. return next()
  242. })
  243. },
  244. // users one and three should not be able to access project list page
  245. next => {
  246. return this.user1.getProjectListPage((err, statusCode) => {
  247. expect(err).to.equal(null)
  248. expect(statusCode).to.equal(302)
  249. return next()
  250. })
  251. },
  252. next => {
  253. return this.user3.getProjectListPage((err, statusCode) => {
  254. expect(err).to.equal(null)
  255. expect(statusCode).to.equal(302)
  256. return next()
  257. })
  258. },
  259. // user two should still be logged in, and able to access project list page
  260. next => {
  261. return this.user2.getProjectListPage((err, statusCode) => {
  262. expect(err).to.equal(null)
  263. expect(statusCode).to.equal(200)
  264. return next()
  265. })
  266. },
  267. // logout second session, should remove last session from set
  268. next => {
  269. return this.user2.logout(err => next(err))
  270. },
  271. next => {
  272. return redis.getUserSessions(this.user1, (err, sessions) => {
  273. expect(sessions.length).to.equal(0)
  274. return next()
  275. })
  276. }
  277. ],
  278. (err, result) => {
  279. if (err) {
  280. throw err
  281. }
  282. return done()
  283. }
  284. )
  285. })
  286. })
  287. describe('three sessions, sessions page', function() {
  288. before(function(done) {
  289. // set up second session for this user
  290. this.user2 = new User()
  291. this.user2.email = this.user1.email
  292. this.user2.password = this.user1.password
  293. this.user3 = new User()
  294. this.user3.email = this.user1.email
  295. this.user3.password = this.user1.password
  296. return async.series(
  297. [
  298. this.user2.login.bind(this.user2),
  299. this.user2.activateSudoMode.bind(this.user2)
  300. ],
  301. done
  302. )
  303. })
  304. it('should allow the user to erase the other two sessions', function(done) {
  305. return async.series(
  306. [
  307. next => {
  308. return redis.clearUserSessions(this.user1, next)
  309. },
  310. // login, should add session to set
  311. next => {
  312. return this.user1.login(err => next(err))
  313. },
  314. next => {
  315. return redis.getUserSessions(this.user1, (err, sessions) => {
  316. expect(sessions.length).to.equal(1)
  317. expect(sessions[0].slice(0, 5)).to.equal('sess:')
  318. return next()
  319. })
  320. },
  321. // login again, should add the second session to set
  322. next => {
  323. return this.user2.login(err => next(err))
  324. },
  325. next => {
  326. return redis.getUserSessions(this.user1, (err, sessions) => {
  327. expect(sessions.length).to.equal(2)
  328. expect(sessions[0].slice(0, 5)).to.equal('sess:')
  329. expect(sessions[1].slice(0, 5)).to.equal('sess:')
  330. return next()
  331. })
  332. },
  333. // login third session, should add the second session to set
  334. next => {
  335. return this.user3.login(err => next(err))
  336. },
  337. next => {
  338. return redis.getUserSessions(this.user1, (err, sessions) => {
  339. expect(sessions.length).to.equal(3)
  340. expect(sessions[0].slice(0, 5)).to.equal('sess:')
  341. expect(sessions[1].slice(0, 5)).to.equal('sess:')
  342. return next()
  343. })
  344. },
  345. // enter sudo-mode
  346. next => {
  347. return this.user2.getCsrfToken(err => {
  348. expect(err).to.be.oneOf([null, undefined])
  349. return this.user2.request.post(
  350. {
  351. uri: '/confirm-password',
  352. json: {
  353. password: this.user2.password
  354. }
  355. },
  356. (err, response, body) => {
  357. expect(err).to.be.oneOf([null, undefined])
  358. expect(response.statusCode).to.equal(200)
  359. return next()
  360. }
  361. )
  362. })
  363. },
  364. // check the sessions page
  365. next => {
  366. return this.user2.request.get(
  367. {
  368. uri: '/user/sessions'
  369. },
  370. (err, response, body) => {
  371. expect(err).to.be.oneOf([null, undefined])
  372. expect(response.statusCode).to.equal(200)
  373. return next()
  374. }
  375. )
  376. },
  377. // clear sessions from second session, should erase two of the three sessions
  378. next => {
  379. return this.user2.getCsrfToken(err => {
  380. expect(err).to.be.oneOf([null, undefined])
  381. return this.user2.request.post(
  382. {
  383. uri: '/user/sessions/clear'
  384. },
  385. err => next(err)
  386. )
  387. })
  388. },
  389. next => {
  390. return redis.getUserSessions(this.user2, (err, sessions) => {
  391. expect(sessions.length).to.equal(1)
  392. return next()
  393. })
  394. },
  395. // users one and three should not be able to access project list page
  396. next => {
  397. return this.user1.getProjectListPage((err, statusCode) => {
  398. expect(err).to.equal(null)
  399. expect(statusCode).to.equal(302)
  400. return next()
  401. })
  402. },
  403. next => {
  404. return this.user3.getProjectListPage((err, statusCode) => {
  405. expect(err).to.equal(null)
  406. expect(statusCode).to.equal(302)
  407. return next()
  408. })
  409. },
  410. // user two should still be logged in, and able to access project list page
  411. next => {
  412. return this.user2.getProjectListPage((err, statusCode) => {
  413. expect(err).to.equal(null)
  414. expect(statusCode).to.equal(200)
  415. return next()
  416. })
  417. },
  418. // logout second session, should remove last session from set
  419. next => {
  420. return this.user2.logout(err => next(err))
  421. },
  422. next => {
  423. return redis.getUserSessions(this.user1, (err, sessions) => {
  424. expect(sessions.length).to.equal(0)
  425. return next()
  426. })
  427. }
  428. ],
  429. (err, result) => {
  430. if (err) {
  431. throw err
  432. }
  433. return done()
  434. }
  435. )
  436. })
  437. })
  438. })