logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma git clone https://hacktivis.me/git/pleroma.git

password_controller_test.exs (6497B)


  1. # Pleroma: A lightweight social networking server
  2. # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
  3. # SPDX-License-Identifier: AGPL-3.0-only
  4. defmodule Pleroma.Web.TwitterAPI.PasswordControllerTest do
  5. use Pleroma.Web.ConnCase
  6. alias Pleroma.Config
  7. alias Pleroma.PasswordResetToken
  8. alias Pleroma.Repo
  9. alias Pleroma.Tests.ObanHelpers
  10. alias Pleroma.User
  11. alias Pleroma.Web.OAuth.Token
  12. import Pleroma.Factory
  13. import Swoosh.TestAssertions
  14. describe "GET /api/pleroma/password_reset/token" do
  15. test "it returns error when token invalid", %{conn: conn} do
  16. response =
  17. conn
  18. |> get("/api/pleroma/password_reset/token")
  19. |> html_response(:ok)
  20. assert response =~ "<h2>Invalid Token</h2>"
  21. end
  22. test "it shows password reset form", %{conn: conn} do
  23. user = insert(:user)
  24. {:ok, token} = PasswordResetToken.create_token(user)
  25. response =
  26. conn
  27. |> get("/api/pleroma/password_reset/#{token.token}")
  28. |> html_response(:ok)
  29. assert response =~ "<h2>Password Reset for #{user.nickname}</h2>"
  30. end
  31. test "it returns an error when the token has expired", %{conn: conn} do
  32. clear_config([:instance, :password_reset_token_validity], 0)
  33. user = insert(:user)
  34. {:ok, token} = PasswordResetToken.create_token(user)
  35. {:ok, token} = time_travel(token, -2)
  36. response =
  37. conn
  38. |> get("/api/pleroma/password_reset/#{token.token}")
  39. |> html_response(:ok)
  40. assert response =~ "<h2>Invalid Token</h2>"
  41. end
  42. end
  43. describe "POST /api/pleroma/password_reset" do
  44. test "it fails for an expired token", %{conn: conn} do
  45. clear_config([:instance, :password_reset_token_validity], 0)
  46. user = insert(:user)
  47. {:ok, token} = PasswordResetToken.create_token(user)
  48. {:ok, token} = time_travel(token, -2)
  49. {:ok, _access_token} = Token.create(insert(:oauth_app), user, %{})
  50. params = %{
  51. "password" => "test",
  52. password_confirmation: "test",
  53. token: token.token
  54. }
  55. response =
  56. conn
  57. |> assign(:user, user)
  58. |> post("/api/pleroma/password_reset", %{data: params})
  59. |> html_response(:ok)
  60. refute response =~ "<h2>Password changed!</h2>"
  61. end
  62. test "it returns HTTP 200", %{conn: conn} do
  63. user = insert(:user)
  64. {:ok, token} = PasswordResetToken.create_token(user)
  65. {:ok, _access_token} = Token.create(insert(:oauth_app), user, %{})
  66. params = %{
  67. "password" => "test",
  68. password_confirmation: "test",
  69. token: token.token
  70. }
  71. response =
  72. conn
  73. |> assign(:user, user)
  74. |> post("/api/pleroma/password_reset", %{data: params})
  75. |> html_response(:ok)
  76. assert response =~ "<h2>Password changed!</h2>"
  77. user = refresh_record(user)
  78. assert Pleroma.Password.Pbkdf2.verify_pass("test", user.password_hash)
  79. assert Enum.empty?(Token.get_user_tokens(user))
  80. end
  81. test "it sets password_reset_pending to false", %{conn: conn} do
  82. user = insert(:user, password_reset_pending: true)
  83. {:ok, token} = PasswordResetToken.create_token(user)
  84. {:ok, _access_token} = Token.create(insert(:oauth_app), user, %{})
  85. params = %{
  86. "password" => "test",
  87. password_confirmation: "test",
  88. token: token.token
  89. }
  90. conn
  91. |> assign(:user, user)
  92. |> post("/api/pleroma/password_reset", %{data: params})
  93. |> html_response(:ok)
  94. assert User.get_by_id(user.id).password_reset_pending == false
  95. end
  96. end
  97. describe "POST /auth/password, with valid parameters" do
  98. setup %{conn: conn} do
  99. user = insert(:user)
  100. conn = post(conn, "/auth/password?email=#{user.email}")
  101. %{conn: conn, user: user}
  102. end
  103. test "it returns 204", %{conn: conn} do
  104. assert empty_json_response(conn)
  105. end
  106. test "it creates a PasswordResetToken record for user", %{user: user} do
  107. token_record = Repo.get_by(Pleroma.PasswordResetToken, user_id: user.id)
  108. assert token_record
  109. end
  110. test "it sends an email to user", %{user: user} do
  111. ObanHelpers.perform_all()
  112. token_record = Repo.get_by(Pleroma.PasswordResetToken, user_id: user.id)
  113. email = Pleroma.Emails.UserEmail.password_reset_email(user, token_record.token)
  114. notify_email = Config.get([:instance, :notify_email])
  115. instance_name = Config.get([:instance, :name])
  116. assert_email_sent(
  117. from: {instance_name, notify_email},
  118. to: {user.name, user.email},
  119. html_body: email.html_body
  120. )
  121. end
  122. end
  123. describe "POST /auth/password, with nickname" do
  124. test "it returns 204", %{conn: conn} do
  125. user = insert(:user)
  126. assert conn
  127. |> post("/auth/password?nickname=#{user.nickname}")
  128. |> empty_json_response()
  129. ObanHelpers.perform_all()
  130. token_record = Repo.get_by(Pleroma.PasswordResetToken, user_id: user.id)
  131. email = Pleroma.Emails.UserEmail.password_reset_email(user, token_record.token)
  132. notify_email = Config.get([:instance, :notify_email])
  133. instance_name = Config.get([:instance, :name])
  134. assert_email_sent(
  135. from: {instance_name, notify_email},
  136. to: {user.name, user.email},
  137. html_body: email.html_body
  138. )
  139. end
  140. test "it doesn't fail when a user has no email", %{conn: conn} do
  141. user = insert(:user, %{email: nil})
  142. assert conn
  143. |> post("/auth/password?nickname=#{user.nickname}")
  144. |> empty_json_response()
  145. end
  146. end
  147. describe "POST /auth/password, with invalid parameters" do
  148. setup do
  149. user = insert(:user)
  150. {:ok, user: user}
  151. end
  152. test "it returns 204 when user is not found", %{conn: conn, user: user} do
  153. conn = post(conn, "/auth/password?email=nonexisting_#{user.email}")
  154. assert empty_json_response(conn)
  155. end
  156. test "it returns 204 when user is not local", %{conn: conn, user: user} do
  157. {:ok, user} = Repo.update(Ecto.Changeset.change(user, local: false))
  158. conn = post(conn, "/auth/password?email=#{user.email}")
  159. assert empty_json_response(conn)
  160. end
  161. test "it returns 204 when user is deactivated", %{conn: conn, user: user} do
  162. {:ok, user} = Repo.update(Ecto.Changeset.change(user, is_active: false, local: true))
  163. conn = post(conn, "/auth/password?email=#{user.email}")
  164. assert empty_json_response(conn)
  165. end
  166. end
  167. end