diff options
Diffstat (limited to 'lib')
7 files changed, 238 insertions, 62 deletions
| diff --git a/lib/pleroma/web/api_spec/operations/media_operation.ex b/lib/pleroma/web/api_spec/operations/media_operation.ex index 85aa14869..1e245b291 100644 --- a/lib/pleroma/web/api_spec/operations/media_operation.ex +++ b/lib/pleroma/web/api_spec/operations/media_operation.ex @@ -105,6 +105,7 @@ defmodule Pleroma.Web.ApiSpec.MediaOperation do        responses: %{          200 => Operation.response("Media", "application/json", Attachment),          401 => Operation.response("Media", "application/json", ApiError), +        403 => Operation.response("Media", "application/json", ApiError),          422 => Operation.response("Media", "application/json", ApiError)        }      } diff --git a/lib/pleroma/web/api_spec/operations/timeline_operation.ex b/lib/pleroma/web/api_spec/operations/timeline_operation.ex index cae18c758..24d792916 100644 --- a/lib/pleroma/web/api_spec/operations/timeline_operation.ex +++ b/lib/pleroma/web/api_spec/operations/timeline_operation.ex @@ -115,7 +115,8 @@ defmodule Pleroma.Web.ApiSpec.TimelineOperation do        ],        operationId: "TimelineController.hashtag",        responses: %{ -        200 => Operation.response("Array of Status", "application/json", array_of_statuses()) +        200 => Operation.response("Array of Status", "application/json", array_of_statuses()), +        401 => Operation.response("Error", "application/json", ApiError)        }      }    end diff --git a/lib/pleroma/web/api_spec/operations/twitter_util_operation.ex b/lib/pleroma/web/api_spec/operations/twitter_util_operation.ex new file mode 100644 index 000000000..0cafbc719 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/twitter_util_operation.ex @@ -0,0 +1,219 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.TwitterUtilOperation do +  alias OpenApiSpex.Operation +  alias OpenApiSpex.Schema +  alias Pleroma.Web.ApiSpec.Schemas.ApiError +  alias Pleroma.Web.ApiSpec.Schemas.BooleanLike + +  def open_api_operation(action) do +    operation = String.to_existing_atom("#{action}_operation") +    apply(__MODULE__, operation, []) +  end + +  def emoji_operation do +    %Operation{ +      tags: ["Emojis"], +      summary: "List all custom emojis", +      operationId: "UtilController.emoji", +      parameters: [], +      responses: %{ +        200 => +          Operation.response("List", "application/json", %Schema{ +            type: :object, +            additionalProperties: %Schema{ +              type: :object, +              properties: %{ +                image_url: %Schema{type: :string}, +                tags: %Schema{type: :array, items: %Schema{type: :string}} +              } +            }, +            example: %{ +              "firefox" => %{ +                "image_url" => "/emoji/firefox.png", +                "tag" => ["Fun"] +              } +            } +          }) +      } +    } +  end + +  def frontend_configurations_operation do +    %Operation{ +      tags: ["Configuration"], +      summary: "Dump frontend configurations", +      operationId: "UtilController.frontend_configurations", +      parameters: [], +      responses: %{ +        200 => +          Operation.response("List", "application/json", %Schema{ +            type: :object, +            additionalProperties: %Schema{type: :object} +          }) +      } +    } +  end + +  def change_password_operation do +    %Operation{ +      tags: ["Account credentials"], +      summary: "Change account password", +      security: [%{"oAuth" => ["write:accounts"]}], +      operationId: "UtilController.change_password", +      parameters: [ +        Operation.parameter(:password, :query, :string, "Current password", required: true), +        Operation.parameter(:new_password, :query, :string, "New password", required: true), +        Operation.parameter( +          :new_password_confirmation, +          :query, +          :string, +          "New password, confirmation", +          required: true +        ) +      ], +      responses: %{ +        200 => +          Operation.response("Success", "application/json", %Schema{ +            type: :object, +            properties: %{status: %Schema{type: :string, example: "success"}} +          }), +        400 => Operation.response("Error", "application/json", ApiError), +        403 => Operation.response("Error", "application/json", ApiError) +      } +    } +  end + +  def change_email_operation do +    %Operation{ +      tags: ["Account credentials"], +      summary: "Change account email", +      security: [%{"oAuth" => ["write:accounts"]}], +      operationId: "UtilController.change_email", +      parameters: [ +        Operation.parameter(:password, :query, :string, "Current password", required: true), +        Operation.parameter(:email, :query, :string, "New email", required: true) +      ], +      requestBody: nil, +      responses: %{ +        200 => +          Operation.response("Success", "application/json", %Schema{ +            type: :object, +            properties: %{status: %Schema{type: :string, example: "success"}} +          }), +        400 => Operation.response("Error", "application/json", ApiError), +        403 => Operation.response("Error", "application/json", ApiError) +      } +    } +  end + +  def update_notificaton_settings_operation do +    %Operation{ +      tags: ["Accounts"], +      summary: "Update Notification Settings", +      security: [%{"oAuth" => ["write:accounts"]}], +      operationId: "UtilController.update_notificaton_settings", +      parameters: [ +        Operation.parameter( +          :block_from_strangers, +          :query, +          BooleanLike, +          "blocks notifications from accounts you do not follow" +        ), +        Operation.parameter( +          :hide_notification_contents, +          :query, +          BooleanLike, +          "removes the contents of a message from the push notification" +        ) +      ], +      requestBody: nil, +      responses: %{ +        200 => +          Operation.response("Success", "application/json", %Schema{ +            type: :object, +            properties: %{status: %Schema{type: :string, example: "success"}} +          }), +        400 => Operation.response("Error", "application/json", ApiError) +      } +    } +  end + +  def disable_account_operation do +    %Operation{ +      tags: ["Account credentials"], +      summary: "Disable Account", +      security: [%{"oAuth" => ["write:accounts"]}], +      operationId: "UtilController.disable_account", +      parameters: [ +        Operation.parameter(:password, :query, :string, "Password") +      ], +      responses: %{ +        200 => +          Operation.response("Success", "application/json", %Schema{ +            type: :object, +            properties: %{status: %Schema{type: :string, example: "success"}} +          }), +        403 => Operation.response("Error", "application/json", ApiError) +      } +    } +  end + +  def delete_account_operation do +    %Operation{ +      tags: ["Account credentials"], +      summary: "Delete Account", +      security: [%{"oAuth" => ["write:accounts"]}], +      operationId: "UtilController.delete_account", +      parameters: [ +        Operation.parameter(:password, :query, :string, "Password") +      ], +      responses: %{ +        200 => +          Operation.response("Success", "application/json", %Schema{ +            type: :object, +            properties: %{status: %Schema{type: :string, example: "success"}} +          }), +        403 => Operation.response("Error", "application/json", ApiError) +      } +    } +  end + +  def captcha_operation do +    %Operation{ +      summary: "Get a captcha", +      operationId: "UtilController.captcha", +      parameters: [], +      responses: %{ +        200 => Operation.response("Success", "application/json", %Schema{type: :object}) +      } +    } +  end + +  def healthcheck_operation do +    %Operation{ +      tags: ["Accounts"], +      summary: "Quick status check on the instance", +      security: [%{"oAuth" => ["write:accounts"]}], +      operationId: "UtilController.healthcheck", +      parameters: [], +      responses: %{ +        200 => Operation.response("Healthy", "application/json", %Schema{type: :object}), +        503 => +          Operation.response("Disabled or Unhealthy", "application/json", %Schema{type: :object}) +      } +    } +  end + +  def remote_subscribe_operation do +    %Operation{ +      tags: ["Accounts"], +      summary: "Remote Subscribe", +      operationId: "UtilController.remote_subscribe", +      parameters: [], +      responses: %{200 => Operation.response("Web Page", "test/html", %Schema{type: :string})} +    } +  end +end diff --git a/lib/pleroma/web/api_spec/operations/user_import_operation.ex b/lib/pleroma/web/api_spec/operations/user_import_operation.ex index 6292e2004..8df19f1fc 100644 --- a/lib/pleroma/web/api_spec/operations/user_import_operation.ex +++ b/lib/pleroma/web/api_spec/operations/user_import_operation.ex @@ -23,6 +23,7 @@ defmodule Pleroma.Web.ApiSpec.UserImportOperation do        requestBody: request_body("Parameters", import_request(), required: true),        responses: %{          200 => ok_response(), +        403 => Operation.response("Error", "application/json", ApiError),          500 => Operation.response("Error", "application/json", ApiError)        },        security: [%{"oAuth" => ["write:follow"]}] diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 95d56699e..efca7078a 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -624,12 +624,6 @@ defmodule Pleroma.Web.Router do      get("/oauth_tokens", TwitterAPI.Controller, :oauth_tokens)      delete("/oauth_tokens/:id", TwitterAPI.Controller, :revoke_token) - -    post( -      "/qvitter/statuses/notifications/read", -      TwitterAPI.Controller, -      :mark_notifications_as_read -    )    end    scope "/", Pleroma.Web do diff --git a/lib/pleroma/web/twitter_api/controller.ex b/lib/pleroma/web/twitter_api/controller.ex index 077bfa70d..e32713311 100644 --- a/lib/pleroma/web/twitter_api/controller.ex +++ b/lib/pleroma/web/twitter_api/controller.ex @@ -5,7 +5,6 @@  defmodule Pleroma.Web.TwitterAPI.Controller do    use Pleroma.Web, :controller -  alias Pleroma.Notification    alias Pleroma.User    alias Pleroma.Web.OAuth.Token    alias Pleroma.Web.Plugs.EnsurePublicOrAuthenticatedPlug @@ -15,11 +14,6 @@ defmodule Pleroma.Web.TwitterAPI.Controller do    require Logger    plug( -    OAuthScopesPlug, -    %{scopes: ["write:notifications"]} when action == :mark_notifications_as_read -  ) - -  plug(      :skip_plug,      [OAuthScopesPlug, EnsurePublicOrAuthenticatedPlug] when action == :confirm_email    ) @@ -67,31 +61,4 @@ defmodule Pleroma.Web.TwitterAPI.Controller do      |> put_resp_content_type("application/json")      |> send_resp(status, json)    end - -  def mark_notifications_as_read( -        %{assigns: %{user: user}} = conn, -        %{"latest_id" => latest_id} = params -      ) do -    Notification.set_read_up_to(user, latest_id) - -    notifications = Notification.for_user(user, params) - -    conn -    # XXX: This is a hack because pleroma-fe still uses that API. -    |> put_view(Pleroma.Web.MastodonAPI.NotificationView) -    |> render("index.json", %{notifications: notifications, for: user}) -  end - -  def mark_notifications_as_read(%{assigns: %{user: _user}} = conn, _) do -    bad_request_reply(conn, "You need to specify latest_id") -  end - -  defp bad_request_reply(conn, error_message) do -    json = error_json(conn, error_message) -    json_reply(conn, 400, json) -  end - -  defp error_json(conn, error_message) do -    %{"error" => error_message, "request" => conn.request_path} |> Jason.encode!() -  end  end diff --git a/lib/pleroma/web/twitter_api/controllers/util_controller.ex b/lib/pleroma/web/twitter_api/controllers/util_controller.ex index 940a645bb..a2e69666e 100644 --- a/lib/pleroma/web/twitter_api/controllers/util_controller.ex +++ b/lib/pleroma/web/twitter_api/controllers/util_controller.ex @@ -10,12 +10,12 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do    alias Pleroma.Config    alias Pleroma.Emoji    alias Pleroma.Healthcheck -  alias Pleroma.Notification    alias Pleroma.User    alias Pleroma.Web.CommonAPI    alias Pleroma.Web.Plugs.OAuthScopesPlug    alias Pleroma.Web.WebFinger +  plug(Pleroma.Web.ApiSpec.CastAndValidate when action != :remote_subscribe)    plug(Pleroma.Web.Plugs.FederatingPlug when action == :remote_subscribe)    plug( @@ -30,7 +30,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do           ]    ) -  plug(OAuthScopesPlug, %{scopes: ["write:notifications"]} when action == :notifications_read) +  defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.TwitterUtilOperation    def remote_subscribe(conn, %{"nickname" => nick, "profile" => _}) do      with %User{} = user <- User.get_cached_by_nickname(nick), @@ -62,17 +62,6 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do      end    end -  def notifications_read(%{assigns: %{user: user}} = conn, %{"id" => notification_id}) do -    with {:ok, _} <- Notification.read_one(user, notification_id) do -      json(conn, %{status: "success"}) -    else -      {:error, message} -> -        conn -        |> put_resp_content_type("application/json") -        |> send_resp(403, Jason.encode!(%{"error" => message})) -    end -  end -    def frontend_configurations(conn, _params) do      render(conn, "frontend_configurations.json")    end @@ -92,13 +81,17 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do      end    end -  def change_password(%{assigns: %{user: user}} = conn, params) do -    case CommonAPI.Utils.confirm_current_password(user, params["password"]) do +  def change_password(%{assigns: %{user: user}} = conn, %{ +        password: password, +        new_password: new_password, +        new_password_confirmation: new_password_confirmation +      }) do +    case CommonAPI.Utils.confirm_current_password(user, password) do        {:ok, user} ->          with {:ok, _user} <-                 User.reset_password(user, %{ -                 password: params["new_password"], -                 password_confirmation: params["new_password_confirmation"] +                 password: new_password, +                 password_confirmation: new_password_confirmation                 }) do            json(conn, %{status: "success"})          else @@ -115,10 +108,10 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do      end    end -  def change_email(%{assigns: %{user: user}} = conn, params) do -    case CommonAPI.Utils.confirm_current_password(user, params["password"]) do +  def change_email(%{assigns: %{user: user}} = conn, %{password: password, email: email}) do +    case CommonAPI.Utils.confirm_current_password(user, password) do        {:ok, user} -> -        with {:ok, _user} <- User.change_email(user, params["email"]) do +        with {:ok, _user} <- User.change_email(user, email) do            json(conn, %{status: "success"})          else            {:error, changeset} -> @@ -135,7 +128,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do    end    def delete_account(%{assigns: %{user: user}} = conn, params) do -    password = params["password"] || "" +    password = params[:password] || ""      case CommonAPI.Utils.confirm_current_password(user, password) do        {:ok, user} -> @@ -148,7 +141,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do    end    def disable_account(%{assigns: %{user: user}} = conn, params) do -    case CommonAPI.Utils.confirm_current_password(user, params["password"]) do +    case CommonAPI.Utils.confirm_current_password(user, params[:password]) do        {:ok, user} ->          User.set_activation_async(user, false)          json(conn, %{status: "success"}) | 
