TwitterAPI: allow deleting one's own account with request body
This commit is contained in:
		
							parent
							
								
									0b2119d4a7
								
							
						
					
					
						commit
						8672ad6b00
					
				
					 3 changed files with 49 additions and 5 deletions
				
			
		| 
						 | 
				
			
			@ -188,6 +188,7 @@ def delete_account_operation do
 | 
			
		|||
      parameters: [
 | 
			
		||||
        Operation.parameter(:password, :query, :string, "Password")
 | 
			
		||||
      ],
 | 
			
		||||
      requestBody: request_body("Parameters", delete_account_request(), required: false),
 | 
			
		||||
      responses: %{
 | 
			
		||||
        200 =>
 | 
			
		||||
          Operation.response("Success", "application/json", %Schema{
 | 
			
		||||
| 
						 | 
				
			
			@ -234,4 +235,22 @@ def remote_subscribe_operation do
 | 
			
		|||
      responses: %{200 => Operation.response("Web Page", "test/html", %Schema{type: :string})}
 | 
			
		||||
    }
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  defp delete_account_request do
 | 
			
		||||
    %Schema{
 | 
			
		||||
      title: "AccountDeleteRequest",
 | 
			
		||||
      description: "POST body for deleting one's own account",
 | 
			
		||||
      type: :object,
 | 
			
		||||
      properties: %{
 | 
			
		||||
        password: %Schema{
 | 
			
		||||
          type: :string,
 | 
			
		||||
          description: "The user's own password for confirmation.",
 | 
			
		||||
          format: :password
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      example: %{
 | 
			
		||||
        "password" => "prettyp0ony1313"
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -123,8 +123,10 @@ def change_email(%{assigns: %{user: user}, body_params: body_params} = conn, %{}
 | 
			
		|||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def delete_account(%{assigns: %{user: user}} = conn, params) do
 | 
			
		||||
    password = params[:password] || ""
 | 
			
		||||
  def delete_account(%{assigns: %{user: user}, body_params: body_params} = conn, params) do
 | 
			
		||||
    # This endpoint can accept a query param or JSON body for backwards-compatibility.
 | 
			
		||||
    # Submitting a JSON body is recommended, so passwords don't end up in server logs.
 | 
			
		||||
    password = body_params[:password] || params[:password] || ""
 | 
			
		||||
 | 
			
		||||
    case CommonAPI.Utils.confirm_current_password(user, password) do
 | 
			
		||||
      {:ok, user} ->
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -444,7 +444,10 @@ test "without permissions", %{conn: conn} do
 | 
			
		|||
 | 
			
		||||
    test "with proper permissions and wrong or missing password", %{conn: conn} do
 | 
			
		||||
      for params <- [%{"password" => "hi"}, %{}] do
 | 
			
		||||
        ret_conn = post(conn, "/api/pleroma/delete_account", params)
 | 
			
		||||
        ret_conn =
 | 
			
		||||
          conn
 | 
			
		||||
          |> put_req_header("content-type", "application/json")
 | 
			
		||||
          |> post("/api/pleroma/delete_account", params)
 | 
			
		||||
 | 
			
		||||
        assert json_response_and_validate_schema(ret_conn, 200) == %{
 | 
			
		||||
                 "error" => "Invalid password."
 | 
			
		||||
| 
						 | 
				
			
			@ -452,8 +455,28 @@ test "with proper permissions and wrong or missing password", %{conn: conn} do
 | 
			
		|||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    test "with proper permissions and valid password", %{conn: conn, user: user} do
 | 
			
		||||
      conn = post(conn, "/api/pleroma/delete_account?password=test")
 | 
			
		||||
    test "with proper permissions and valid password (URL query)", %{conn: conn, user: user} do
 | 
			
		||||
      conn =
 | 
			
		||||
        conn
 | 
			
		||||
        |> put_req_header("content-type", "application/json")
 | 
			
		||||
        |> post("/api/pleroma/delete_account?password=test")
 | 
			
		||||
 | 
			
		||||
      ObanHelpers.perform_all()
 | 
			
		||||
      assert json_response_and_validate_schema(conn, 200) == %{"status" => "success"}
 | 
			
		||||
 | 
			
		||||
      user = User.get_by_id(user.id)
 | 
			
		||||
      refute user.is_active
 | 
			
		||||
      assert user.name == nil
 | 
			
		||||
      assert user.bio == ""
 | 
			
		||||
      assert user.password_hash == nil
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    test "with proper permissions and valid password (JSON body)", %{conn: conn, user: user} do
 | 
			
		||||
      conn =
 | 
			
		||||
        conn
 | 
			
		||||
        |> put_req_header("content-type", "application/json")
 | 
			
		||||
        |> post("/api/pleroma/delete_account", %{password: "test"})
 | 
			
		||||
 | 
			
		||||
      ObanHelpers.perform_all()
 | 
			
		||||
      assert json_response_and_validate_schema(conn, 200) == %{"status" => "success"}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue