users-email-verification.ts 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. /* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */
  2. import { expect } from 'chai'
  3. import { MockSmtpServer } from '@tests/shared/mock-servers/index.js'
  4. import { HttpStatusCode } from '@peertube/peertube-models'
  5. import {
  6. cleanupTests,
  7. ConfigCommand,
  8. createSingleServer,
  9. PeerTubeServer,
  10. setAccessTokensToServers,
  11. waitJobs
  12. } from '@peertube/peertube-server-commands'
  13. describe('Test users email verification', function () {
  14. let server: PeerTubeServer
  15. let userId: number
  16. let userAccessToken: string
  17. let verificationString: string
  18. let expectedEmailsLength = 0
  19. const user1 = {
  20. username: 'user_1',
  21. password: 'super password'
  22. }
  23. const user2 = {
  24. username: 'user_2',
  25. password: 'super password'
  26. }
  27. const emails: object[] = []
  28. before(async function () {
  29. this.timeout(30000)
  30. const port = await MockSmtpServer.Instance.collectEmails(emails)
  31. server = await createSingleServer(1, ConfigCommand.getEmailOverrideConfig(port))
  32. await setAccessTokensToServers([ server ])
  33. })
  34. it('Should register user and send verification email if verification required', async function () {
  35. this.timeout(30000)
  36. await server.config.updateExistingConfig({
  37. newConfig: {
  38. signup: {
  39. enabled: true,
  40. requiresApproval: false,
  41. requiresEmailVerification: true,
  42. limit: 10
  43. }
  44. }
  45. })
  46. await server.registrations.register(user1)
  47. await waitJobs(server)
  48. expectedEmailsLength++
  49. expect(emails).to.have.lengthOf(expectedEmailsLength)
  50. const email = emails[expectedEmailsLength - 1]
  51. const verificationStringMatches = /verificationString=([a-z0-9]+)/.exec(email['text'])
  52. expect(verificationStringMatches).not.to.be.null
  53. verificationString = verificationStringMatches[1]
  54. expect(verificationString).to.have.length.above(2)
  55. const userIdMatches = /userId=([0-9]+)/.exec(email['text'])
  56. expect(userIdMatches).not.to.be.null
  57. userId = parseInt(userIdMatches[1], 10)
  58. const body = await server.users.get({ userId })
  59. expect(body.emailVerified).to.be.false
  60. })
  61. it('Should not allow login for user with unverified email', async function () {
  62. const { detail } = await server.login.login({ user: user1, expectedStatus: HttpStatusCode.BAD_REQUEST_400 })
  63. expect(detail).to.contain('User email is not verified.')
  64. })
  65. it('Should verify the user via email and allow login', async function () {
  66. await server.users.verifyEmail({ userId, verificationString })
  67. const body = await server.login.login({ user: user1 })
  68. userAccessToken = body.access_token
  69. const user = await server.users.get({ userId })
  70. expect(user.emailVerified).to.be.true
  71. })
  72. it('Should be able to change the user email', async function () {
  73. let updateVerificationString: string
  74. {
  75. await server.users.updateMe({
  76. token: userAccessToken,
  77. email: 'updated@example.com',
  78. currentPassword: user1.password
  79. })
  80. await waitJobs(server)
  81. expectedEmailsLength++
  82. expect(emails).to.have.lengthOf(expectedEmailsLength)
  83. const email = emails[expectedEmailsLength - 1]
  84. const verificationStringMatches = /verificationString=([a-z0-9]+)/.exec(email['text'])
  85. updateVerificationString = verificationStringMatches[1]
  86. }
  87. {
  88. const me = await server.users.getMyInfo({ token: userAccessToken })
  89. expect(me.email).to.equal('user_1@example.com')
  90. expect(me.pendingEmail).to.equal('updated@example.com')
  91. }
  92. {
  93. await server.users.verifyEmail({ userId, verificationString: updateVerificationString, isPendingEmail: true })
  94. const me = await server.users.getMyInfo({ token: userAccessToken })
  95. expect(me.email).to.equal('updated@example.com')
  96. expect(me.pendingEmail).to.be.null
  97. }
  98. })
  99. it('Should register user not requiring email verification if setting not enabled', async function () {
  100. this.timeout(5000)
  101. await server.config.updateExistingConfig({
  102. newConfig: {
  103. signup: {
  104. requiresEmailVerification: false
  105. }
  106. }
  107. })
  108. await server.registrations.register(user2)
  109. await waitJobs(server)
  110. expect(emails).to.have.lengthOf(expectedEmailsLength)
  111. const accessToken = await server.login.getAccessToken(user2)
  112. const user = await server.users.getMyInfo({ token: accessToken })
  113. expect(user.emailVerified).to.be.null
  114. })
  115. it('Should allow login for user with unverified email when setting later enabled', async function () {
  116. await server.config.updateExistingConfig({
  117. newConfig: {
  118. signup: {
  119. requiresEmailVerification: true
  120. }
  121. }
  122. })
  123. await server.login.getAccessToken(user2)
  124. })
  125. after(async function () {
  126. MockSmtpServer.Instance.kill()
  127. await cleanupTests([ server ])
  128. })
  129. })