1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
5 defmodule Pleroma.Web.TwitterAPI.UtilController do
6 use Pleroma.Web, :controller
12 alias Pleroma.Healthcheck
14 alias Pleroma.Web.CommonAPI
15 alias Pleroma.Web.Plugs.OAuthScopesPlug
16 alias Pleroma.Web.WebFinger
18 plug(Pleroma.Web.Plugs.FederatingPlug when action == :remote_subscribe)
22 %{scopes: ["write:accounts"]}
27 :update_notificaton_settings,
33 def remote_subscribe(conn, %{"nickname" => nick, "profile" => _}) do
34 with %User{} = user <- User.get_cached_by_nickname(nick),
35 avatar = User.avatar_url(user) do
37 |> render("subscribe.html", %{nickname: nick, avatar: avatar, error: false})
40 render(conn, "subscribe.html", %{
43 error: "Could not find user"
48 def remote_subscribe(conn, %{"user" => %{"nickname" => nick, "profile" => profile}}) do
49 with {:ok, %{"subscribe_address" => template}} <- WebFinger.finger(profile),
50 %User{ap_id: ap_id} <- User.get_cached_by_nickname(nick) do
52 |> Phoenix.Controller.redirect(external: String.replace(template, "{uri}", ap_id))
55 render(conn, "subscribe.html", %{
58 error: "Something went wrong."
63 def frontend_configurations(conn, _params) do
64 render(conn, "frontend_configurations.json")
67 def emoji(conn, _params) do
69 Enum.reduce(Emoji.get_all(), %{}, fn {code, %Emoji{file: file, tags: tags}}, acc ->
70 Map.put(acc, code, %{image_url: file, tags: tags})
76 def update_notificaton_settings(%{assigns: %{user: user}} = conn, params) do
77 with {:ok, _} <- User.update_notification_settings(user, params) do
78 json(conn, %{status: "success"})
82 def change_password(%{assigns: %{user: user}} = conn, params) do
83 case CommonAPI.Utils.confirm_current_password(user, params["password"]) do
86 User.reset_password(user, %{
87 password: params["new_password"],
88 password_confirmation: params["new_password_confirmation"]
90 json(conn, %{status: "success"})
92 {:error, changeset} ->
93 {_, {error, _}} = Enum.at(changeset.errors, 0)
94 json(conn, %{error: "New password #{error}."})
97 json(conn, %{error: "Unable to change password."})
101 json(conn, %{error: msg})
105 def change_email(%{assigns: %{user: user}} = conn, params) do
106 case CommonAPI.Utils.confirm_current_password(user, params["password"]) do
108 with {:ok, _user} <- User.change_email(user, params["email"]) do
109 json(conn, %{status: "success"})
111 {:error, changeset} ->
112 {_, {error, _}} = Enum.at(changeset.errors, 0)
113 json(conn, %{error: "Email #{error}."})
116 json(conn, %{error: "Unable to change email."})
120 json(conn, %{error: msg})
124 def delete_account(%{assigns: %{user: user}} = conn, params) do
125 password = params["password"] || ""
127 case CommonAPI.Utils.confirm_current_password(user, password) do
130 json(conn, %{status: "success"})
133 json(conn, %{error: msg})
137 def disable_account(%{assigns: %{user: user}} = conn, params) do
138 case CommonAPI.Utils.confirm_current_password(user, params["password"]) do
140 User.set_activation_async(user, false)
141 json(conn, %{status: "success"})
144 json(conn, %{error: msg})
148 def captcha(conn, _params) do
149 json(conn, Pleroma.Captcha.new())
152 def healthcheck(conn, _params) do
153 with true <- Config.get([:instance, :healthcheck]),
154 %{healthy: true} = info <- Healthcheck.system_info() do
157 %{healthy: false} = info ->
158 service_unavailable(conn, info)
161 service_unavailable(conn, %{})
165 defp service_unavailable(conn, info) do
167 |> put_status(:service_unavailable)