Merge branch 'fix/twittercards' into 'develop'
[akkoma] / lib / pleroma / web / admin_api / admin_api_controller.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Web.AdminAPI.AdminAPIController do
6 use Pleroma.Web, :controller
7 alias Pleroma.User
8 alias Pleroma.Web.ActivityPub.Relay
9
10 import Pleroma.Web.ControllerHelper, only: [json_response: 3]
11
12 require Logger
13
14 action_fallback(:errors)
15
16 def user_delete(conn, %{"nickname" => nickname}) do
17 User.get_by_nickname(nickname)
18 |> User.delete()
19
20 conn
21 |> json(nickname)
22 end
23
24 def user_create(
25 conn,
26 %{"nickname" => nickname, "email" => email, "password" => password}
27 ) do
28 user_data = %{
29 nickname: nickname,
30 name: nickname,
31 email: email,
32 password: password,
33 password_confirmation: password,
34 bio: "."
35 }
36
37 changeset = User.register_changeset(%User{}, user_data, confirmed: true)
38 {:ok, user} = User.register(changeset)
39
40 conn
41 |> json(user.nickname)
42 end
43
44 def tag_users(conn, %{"nicknames" => nicknames, "tags" => tags}) do
45 with {:ok, _} <- User.tag(nicknames, tags),
46 do: json_response(conn, :no_content, "")
47 end
48
49 def untag_users(conn, %{"nicknames" => nicknames, "tags" => tags}) do
50 with {:ok, _} <- User.untag(nicknames, tags),
51 do: json_response(conn, :no_content, "")
52 end
53
54 def right_add(conn, %{"permission_group" => permission_group, "nickname" => nickname})
55 when permission_group in ["moderator", "admin"] do
56 user = User.get_by_nickname(nickname)
57
58 info =
59 %{}
60 |> Map.put("is_" <> permission_group, true)
61
62 info_cng = User.Info.admin_api_update(user.info, info)
63
64 cng =
65 user
66 |> Ecto.Changeset.change()
67 |> Ecto.Changeset.put_embed(:info, info_cng)
68
69 {:ok, _user} = User.update_and_set_cache(cng)
70
71 json(conn, info)
72 end
73
74 def right_add(conn, _) do
75 conn
76 |> put_status(404)
77 |> json(%{error: "No such permission_group"})
78 end
79
80 def right_get(conn, %{"nickname" => nickname}) do
81 user = User.get_by_nickname(nickname)
82
83 conn
84 |> json(%{
85 is_moderator: user.info.is_moderator,
86 is_admin: user.info.is_admin
87 })
88 end
89
90 def right_delete(
91 %{assigns: %{user: %User{:nickname => admin_nickname}}} = conn,
92 %{
93 "permission_group" => permission_group,
94 "nickname" => nickname
95 }
96 )
97 when permission_group in ["moderator", "admin"] do
98 if admin_nickname == nickname do
99 conn
100 |> put_status(403)
101 |> json(%{error: "You can't revoke your own admin status."})
102 else
103 user = User.get_by_nickname(nickname)
104
105 info =
106 %{}
107 |> Map.put("is_" <> permission_group, false)
108
109 info_cng = User.Info.admin_api_update(user.info, info)
110
111 cng =
112 Ecto.Changeset.change(user)
113 |> Ecto.Changeset.put_embed(:info, info_cng)
114
115 {:ok, _user} = User.update_and_set_cache(cng)
116
117 json(conn, info)
118 end
119 end
120
121 def right_delete(conn, _) do
122 conn
123 |> put_status(404)
124 |> json(%{error: "No such permission_group"})
125 end
126
127 def set_activation_status(conn, %{"nickname" => nickname, "status" => status}) do
128 with {:ok, status} <- Ecto.Type.cast(:boolean, status),
129 %User{} = user <- User.get_by_nickname(nickname),
130 {:ok, _} <- User.deactivate(user, !status),
131 do: json_response(conn, :no_content, "")
132 end
133
134 def relay_follow(conn, %{"relay_url" => target}) do
135 with {:ok, _message} <- Relay.follow(target) do
136 json(conn, target)
137 else
138 _ ->
139 conn
140 |> put_status(500)
141 |> json(target)
142 end
143 end
144
145 def relay_unfollow(conn, %{"relay_url" => target}) do
146 with {:ok, _message} <- Relay.unfollow(target) do
147 json(conn, target)
148 else
149 _ ->
150 conn
151 |> put_status(500)
152 |> json(target)
153 end
154 end
155
156 @doc "Sends registration invite via email"
157 def email_invite(%{assigns: %{user: user}} = conn, %{"email" => email} = params) do
158 with true <-
159 Pleroma.Config.get([:instance, :invites_enabled]) &&
160 !Pleroma.Config.get([:instance, :registrations_open]),
161 {:ok, invite_token} <- Pleroma.UserInviteToken.create_token(),
162 email <-
163 Pleroma.UserEmail.user_invitation_email(user, invite_token, email, params["name"]),
164 {:ok, _} <- Pleroma.Mailer.deliver(email) do
165 json_response(conn, :no_content, "")
166 end
167 end
168
169 @doc "Get a account registeration invite token (base64 string)"
170 def get_invite_token(conn, _params) do
171 {:ok, token} = Pleroma.UserInviteToken.create_token()
172
173 conn
174 |> json(token.token)
175 end
176
177 @doc "Get a password reset token (base64 string) for given nickname"
178 def get_password_reset(conn, %{"nickname" => nickname}) do
179 (%User{local: true} = user) = User.get_by_nickname(nickname)
180 {:ok, token} = Pleroma.PasswordResetToken.create_token(user)
181
182 conn
183 |> json(token.token)
184 end
185
186 def errors(conn, {:param_cast, _}) do
187 conn
188 |> put_status(400)
189 |> json("Invalid parameters")
190 end
191
192 def errors(conn, _) do
193 conn
194 |> put_status(500)
195 |> json("Something went wrong")
196 end
197 end