logo

pleroma

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

two_factor_authentication_controller_test.exs (9355B)


  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.PleromaAPI.TwoFactorAuthenticationControllerTest do
  5. use Pleroma.Web.ConnCase, async: true
  6. import Pleroma.Factory
  7. alias Pleroma.MFA.Settings
  8. alias Pleroma.MFA.TOTP
  9. describe "GET /api/pleroma/accounts/mfa/settings" do
  10. test "returns user mfa settings for new user", %{conn: conn} do
  11. token = insert(:oauth_token, scopes: ["read", "follow"])
  12. token2 = insert(:oauth_token, scopes: ["write"])
  13. assert conn
  14. |> put_req_header("authorization", "Bearer #{token.token}")
  15. |> get("/api/pleroma/accounts/mfa")
  16. |> json_response(:ok) == %{
  17. "settings" => %{"enabled" => false, "totp" => false}
  18. }
  19. assert conn
  20. |> put_req_header("authorization", "Bearer #{token2.token}")
  21. |> get("/api/pleroma/accounts/mfa")
  22. |> json_response(403) == %{
  23. "error" => "Insufficient permissions: read:security."
  24. }
  25. end
  26. test "returns user mfa settings with enabled totp", %{conn: conn} do
  27. user =
  28. insert(:user,
  29. multi_factor_authentication_settings: %Settings{
  30. enabled: true,
  31. totp: %Settings.TOTP{secret: "XXX", delivery_type: "app", confirmed: true}
  32. }
  33. )
  34. token = insert(:oauth_token, scopes: ["read", "follow"], user: user)
  35. assert conn
  36. |> put_req_header("authorization", "Bearer #{token.token}")
  37. |> get("/api/pleroma/accounts/mfa")
  38. |> json_response(:ok) == %{
  39. "settings" => %{"enabled" => true, "totp" => true}
  40. }
  41. end
  42. end
  43. describe "GET /api/pleroma/accounts/mfa/backup_codes" do
  44. test "returns backup codes", %{conn: conn} do
  45. user =
  46. insert(:user,
  47. multi_factor_authentication_settings: %Settings{
  48. backup_codes: ["1", "2", "3"],
  49. totp: %Settings.TOTP{secret: "secret"}
  50. }
  51. )
  52. token = insert(:oauth_token, scopes: ["write", "follow"], user: user)
  53. token2 = insert(:oauth_token, scopes: ["read"])
  54. response =
  55. conn
  56. |> put_req_header("authorization", "Bearer #{token.token}")
  57. |> get("/api/pleroma/accounts/mfa/backup_codes")
  58. |> json_response(:ok)
  59. assert [<<_::bytes-size(6)>>, <<_::bytes-size(6)>>] = response["codes"]
  60. user = refresh_record(user)
  61. mfa_settings = user.multi_factor_authentication_settings
  62. assert mfa_settings.totp.secret == "secret"
  63. refute mfa_settings.backup_codes == ["1", "2", "3"]
  64. refute mfa_settings.backup_codes == []
  65. assert conn
  66. |> put_req_header("authorization", "Bearer #{token2.token}")
  67. |> get("/api/pleroma/accounts/mfa/backup_codes")
  68. |> json_response(403) == %{
  69. "error" => "Insufficient permissions: write:security."
  70. }
  71. end
  72. end
  73. describe "GET /api/pleroma/accounts/mfa/setup/totp" do
  74. test "return errors when method is invalid", %{conn: conn} do
  75. user = insert(:user)
  76. token = insert(:oauth_token, scopes: ["write", "follow"], user: user)
  77. response =
  78. conn
  79. |> put_req_header("authorization", "Bearer #{token.token}")
  80. |> get("/api/pleroma/accounts/mfa/setup/torf")
  81. |> json_response(400)
  82. assert response == %{"error" => "undefined method"}
  83. end
  84. test "returns key and provisioning_uri", %{conn: conn} do
  85. user =
  86. insert(:user,
  87. multi_factor_authentication_settings: %Settings{backup_codes: ["1", "2", "3"]}
  88. )
  89. token = insert(:oauth_token, scopes: ["write", "follow"], user: user)
  90. token2 = insert(:oauth_token, scopes: ["read"])
  91. response =
  92. conn
  93. |> put_req_header("authorization", "Bearer #{token.token}")
  94. |> get("/api/pleroma/accounts/mfa/setup/totp")
  95. |> json_response(:ok)
  96. user = refresh_record(user)
  97. mfa_settings = user.multi_factor_authentication_settings
  98. secret = mfa_settings.totp.secret
  99. refute mfa_settings.enabled
  100. assert mfa_settings.backup_codes == ["1", "2", "3"]
  101. assert response == %{
  102. "key" => secret,
  103. "provisioning_uri" => TOTP.provisioning_uri(secret, "#{user.email}")
  104. }
  105. assert conn
  106. |> put_req_header("authorization", "Bearer #{token2.token}")
  107. |> get("/api/pleroma/accounts/mfa/setup/totp")
  108. |> json_response(403) == %{
  109. "error" => "Insufficient permissions: write:security."
  110. }
  111. end
  112. end
  113. describe "GET /api/pleroma/accounts/mfa/confirm/totp" do
  114. test "returns success result", %{conn: conn} do
  115. secret = TOTP.generate_secret()
  116. code = TOTP.generate_token(secret)
  117. user =
  118. insert(:user,
  119. multi_factor_authentication_settings: %Settings{
  120. backup_codes: ["1", "2", "3"],
  121. totp: %Settings.TOTP{secret: secret}
  122. }
  123. )
  124. token = insert(:oauth_token, scopes: ["write", "follow"], user: user)
  125. token2 = insert(:oauth_token, scopes: ["read"])
  126. assert conn
  127. |> put_req_header("authorization", "Bearer #{token.token}")
  128. |> post("/api/pleroma/accounts/mfa/confirm/totp", %{password: "test", code: code})
  129. |> json_response(:ok)
  130. settings = refresh_record(user).multi_factor_authentication_settings
  131. assert settings.enabled
  132. assert settings.totp.secret == secret
  133. assert settings.totp.confirmed
  134. assert settings.backup_codes == ["1", "2", "3"]
  135. assert conn
  136. |> put_req_header("authorization", "Bearer #{token2.token}")
  137. |> post("/api/pleroma/accounts/mfa/confirm/totp", %{password: "test", code: code})
  138. |> json_response(403) == %{
  139. "error" => "Insufficient permissions: write:security."
  140. }
  141. end
  142. test "returns error if password incorrect", %{conn: conn} do
  143. secret = TOTP.generate_secret()
  144. code = TOTP.generate_token(secret)
  145. user =
  146. insert(:user,
  147. multi_factor_authentication_settings: %Settings{
  148. backup_codes: ["1", "2", "3"],
  149. totp: %Settings.TOTP{secret: secret}
  150. }
  151. )
  152. token = insert(:oauth_token, scopes: ["write", "follow"], user: user)
  153. response =
  154. conn
  155. |> put_req_header("authorization", "Bearer #{token.token}")
  156. |> post("/api/pleroma/accounts/mfa/confirm/totp", %{password: "xxx", code: code})
  157. |> json_response(422)
  158. settings = refresh_record(user).multi_factor_authentication_settings
  159. refute settings.enabled
  160. refute settings.totp.confirmed
  161. assert settings.backup_codes == ["1", "2", "3"]
  162. assert response == %{"error" => "Invalid password."}
  163. end
  164. test "returns error if code incorrect", %{conn: conn} do
  165. secret = TOTP.generate_secret()
  166. user =
  167. insert(:user,
  168. multi_factor_authentication_settings: %Settings{
  169. backup_codes: ["1", "2", "3"],
  170. totp: %Settings.TOTP{secret: secret}
  171. }
  172. )
  173. token = insert(:oauth_token, scopes: ["write", "follow"], user: user)
  174. token2 = insert(:oauth_token, scopes: ["read"])
  175. response =
  176. conn
  177. |> put_req_header("authorization", "Bearer #{token.token}")
  178. |> post("/api/pleroma/accounts/mfa/confirm/totp", %{password: "test", code: "code"})
  179. |> json_response(422)
  180. settings = refresh_record(user).multi_factor_authentication_settings
  181. refute settings.enabled
  182. refute settings.totp.confirmed
  183. assert settings.backup_codes == ["1", "2", "3"]
  184. assert response == %{"error" => "invalid_token"}
  185. assert conn
  186. |> put_req_header("authorization", "Bearer #{token2.token}")
  187. |> post("/api/pleroma/accounts/mfa/confirm/totp", %{password: "test", code: "code"})
  188. |> json_response(403) == %{
  189. "error" => "Insufficient permissions: write:security."
  190. }
  191. end
  192. end
  193. describe "DELETE /api/pleroma/accounts/mfa/totp" do
  194. test "returns success result", %{conn: conn} do
  195. user =
  196. insert(:user,
  197. multi_factor_authentication_settings: %Settings{
  198. backup_codes: ["1", "2", "3"],
  199. totp: %Settings.TOTP{secret: "secret"}
  200. }
  201. )
  202. token = insert(:oauth_token, scopes: ["write", "follow"], user: user)
  203. token2 = insert(:oauth_token, scopes: ["read"])
  204. assert conn
  205. |> put_req_header("authorization", "Bearer #{token.token}")
  206. |> delete("/api/pleroma/accounts/mfa/totp", %{password: "test"})
  207. |> json_response(:ok)
  208. settings = refresh_record(user).multi_factor_authentication_settings
  209. refute settings.enabled
  210. assert settings.totp.secret == nil
  211. refute settings.totp.confirmed
  212. assert conn
  213. |> put_req_header("authorization", "Bearer #{token2.token}")
  214. |> delete("/api/pleroma/accounts/mfa/totp", %{password: "test"})
  215. |> json_response(403) == %{
  216. "error" => "Insufficient permissions: write:security."
  217. }
  218. end
  219. end
  220. end