AuthenticationTests.js 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. const { expect } = require('chai')
  2. const { ObjectId } = require('mongodb')
  3. const Settings = require('@overleaf/settings')
  4. const User = require('./helpers/User').promises
  5. describe('Authentication', function () {
  6. let user
  7. beforeEach('init vars', function () {
  8. user = new User()
  9. })
  10. describe('CSRF regeneration on login', function () {
  11. it('should prevent use of csrf token from before login', function (done) {
  12. user.logout(err => {
  13. if (err) {
  14. return done(err)
  15. }
  16. user.getCsrfToken(err => {
  17. if (err) {
  18. return done(err)
  19. }
  20. const oldToken = user.csrfToken
  21. user.login(err => {
  22. if (err) {
  23. return done(err)
  24. }
  25. expect(oldToken === user.csrfToken).to.equal(false)
  26. user.request.post(
  27. {
  28. headers: {
  29. 'x-csrf-token': oldToken,
  30. },
  31. url: '/project/new',
  32. json: { projectName: 'test' },
  33. },
  34. (err, response, body) => {
  35. expect(err).to.not.exist
  36. expect(response.statusCode).to.equal(403)
  37. expect(body).to.equal('Forbidden')
  38. done()
  39. }
  40. )
  41. })
  42. })
  43. })
  44. })
  45. })
  46. describe('login', function () {
  47. beforeEach('doLogin', async function () {
  48. await user.login()
  49. })
  50. it('should log the user in', async function () {
  51. const {
  52. response: { statusCode },
  53. } = await user.doRequest('GET', '/project')
  54. expect(statusCode).to.equal(200)
  55. })
  56. it('should emit an user auditLog entry for the login', async function () {
  57. const {
  58. auditLog: [auditLogEntry],
  59. } = await user.get()
  60. expect(auditLogEntry).to.exist
  61. expect(auditLogEntry.timestamp).to.exist
  62. delete auditLogEntry.timestamp
  63. expect(auditLogEntry).to.deep.equal({
  64. operation: 'login',
  65. ipAddress: '127.0.0.1',
  66. initiatorId: ObjectId(user.id),
  67. info: { method: 'Password login', captcha: 'solved' },
  68. })
  69. })
  70. })
  71. describe('failed login', function () {
  72. beforeEach('fetchCsrfToken', async function () {
  73. await user.getCsrfToken()
  74. })
  75. it('should return a 401', async function () {
  76. const {
  77. response: { statusCode },
  78. } = await user.doRequest('POST', {
  79. url: Settings.enableLegacyLogin ? '/login/legacy' : '/login',
  80. json: {
  81. email: user.email,
  82. password: 'foo-bar-baz',
  83. 'g-recaptcha-response': 'valid',
  84. },
  85. })
  86. expect(statusCode).to.equal(401)
  87. })
  88. })
  89. })