@@ -0,0 +1,36 @@ | |||||
# Pleroma: A lightweight social networking server | |||||
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> | |||||
# SPDX-License-Identifier: AGPL-3.0-only | |||||
defmodule Pleroma.Web.MastoFEController do | |||||
use Pleroma.Web, :controller | |||||
alias Pleroma.User | |||||
@doc "GET /web/*path" | |||||
def index(%{assigns: %{user: user}} = conn, _params) do | |||||
token = get_session(conn, :oauth_token) | |||||
if user && token do | |||||
conn | |||||
|> put_layout(false) | |||||
|> render("index.html", token: token, user: user, custom_emojis: Pleroma.Emoji.get_all()) | |||||
else | |||||
conn | |||||
|> put_session(:return_to, conn.request_path) | |||||
|> redirect(to: "/web/login") | |||||
end | |||||
end | |||||
@doc "PUT /api/web/settings" | |||||
def put_settings(%{assigns: %{user: user}} = conn, %{"data" => settings} = _params) do | |||||
with {:ok, _} <- User.update_info(user, &User.Info.mastodon_settings_update(&1, settings)) do | |||||
json(conn, %{}) | |||||
else | |||||
e -> | |||||
conn | |||||
|> put_status(:internal_server_error) | |||||
|> json(%{error: inspect(e)}) | |||||
end | |||||
end | |||||
end |
@@ -75,7 +75,7 @@ defmodule Pleroma.Web.MastodonAPI.AuthController do | |||||
defp local_mastodon_root_path(conn) do | defp local_mastodon_root_path(conn) do | ||||
case get_session(conn, :return_to) do | case get_session(conn, :return_to) do | ||||
nil -> | nil -> | ||||
mastodon_api_path(conn, :index, ["getting-started"]) | |||||
masto_fe_path(conn, :index, ["getting-started"]) | |||||
return_to -> | return_to -> | ||||
delete_session(conn, :return_to) | delete_session(conn, :return_to) | ||||
@@ -8,13 +8,11 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do | |||||
import Pleroma.Web.ControllerHelper, only: [add_link_headers: 2] | import Pleroma.Web.ControllerHelper, only: [add_link_headers: 2] | ||||
alias Pleroma.Bookmark | alias Pleroma.Bookmark | ||||
alias Pleroma.Config | |||||
alias Pleroma.Pagination | alias Pleroma.Pagination | ||||
alias Pleroma.User | alias Pleroma.User | ||||
alias Pleroma.Web.ActivityPub.ActivityPub | alias Pleroma.Web.ActivityPub.ActivityPub | ||||
alias Pleroma.Web.CommonAPI | alias Pleroma.Web.CommonAPI | ||||
alias Pleroma.Web.MastodonAPI.AccountView | alias Pleroma.Web.MastodonAPI.AccountView | ||||
alias Pleroma.Web.MastodonAPI.MastodonView | |||||
alias Pleroma.Web.MastodonAPI.StatusView | alias Pleroma.Web.MastodonAPI.StatusView | ||||
require Logger | require Logger | ||||
@@ -87,124 +85,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do | |||||
|> render("index.json", %{activities: activities, for: user, as: :activity}) | |> render("index.json", %{activities: activities, for: user, as: :activity}) | ||||
end | end | ||||
def index(%{assigns: %{user: user}} = conn, _params) do | |||||
token = get_session(conn, :oauth_token) | |||||
if user && token do | |||||
mastodon_emoji = | |||||
Pleroma.Web.MastodonAPI.CustomEmojiView.render("index.json", %{ | |||||
custom_emojis: Pleroma.Emoji.get_all() | |||||
}) | |||||
limit = Config.get([:instance, :limit]) | |||||
accounts = Map.put(%{}, user.id, AccountView.render("show.json", %{user: user, for: user})) | |||||
initial_state = | |||||
%{ | |||||
meta: %{ | |||||
streaming_api_base_url: Pleroma.Web.Endpoint.websocket_url(), | |||||
access_token: token, | |||||
locale: "en", | |||||
domain: Pleroma.Web.Endpoint.host(), | |||||
admin: "1", | |||||
me: "#{user.id}", | |||||
unfollow_modal: false, | |||||
boost_modal: false, | |||||
delete_modal: true, | |||||
auto_play_gif: false, | |||||
display_sensitive_media: false, | |||||
reduce_motion: false, | |||||
max_toot_chars: limit, | |||||
mascot: User.get_mascot(user)["url"] | |||||
}, | |||||
poll_limits: Config.get([:instance, :poll_limits]), | |||||
rights: %{ | |||||
delete_others_notice: present?(user.info.is_moderator), | |||||
admin: present?(user.info.is_admin) | |||||
}, | |||||
compose: %{ | |||||
me: "#{user.id}", | |||||
default_privacy: user.info.default_scope, | |||||
default_sensitive: false, | |||||
allow_content_types: Config.get([:instance, :allowed_post_formats]) | |||||
}, | |||||
media_attachments: %{ | |||||
accept_content_types: [ | |||||
".jpg", | |||||
".jpeg", | |||||
".png", | |||||
".gif", | |||||
".webm", | |||||
".mp4", | |||||
".m4v", | |||||
"image\/jpeg", | |||||
"image\/png", | |||||
"image\/gif", | |||||
"video\/webm", | |||||
"video\/mp4" | |||||
] | |||||
}, | |||||
settings: | |||||
user.info.settings || | |||||
%{ | |||||
onboarded: true, | |||||
home: %{ | |||||
shows: %{ | |||||
reblog: true, | |||||
reply: true | |||||
} | |||||
}, | |||||
notifications: %{ | |||||
alerts: %{ | |||||
follow: true, | |||||
favourite: true, | |||||
reblog: true, | |||||
mention: true | |||||
}, | |||||
shows: %{ | |||||
follow: true, | |||||
favourite: true, | |||||
reblog: true, | |||||
mention: true | |||||
}, | |||||
sounds: %{ | |||||
follow: true, | |||||
favourite: true, | |||||
reblog: true, | |||||
mention: true | |||||
} | |||||
} | |||||
}, | |||||
push_subscription: nil, | |||||
accounts: accounts, | |||||
custom_emojis: mastodon_emoji, | |||||
char_limit: limit | |||||
} | |||||
|> Jason.encode!() | |||||
conn | |||||
|> put_layout(false) | |||||
|> put_view(MastodonView) | |||||
|> render("index.html", %{initial_state: initial_state}) | |||||
else | |||||
conn | |||||
|> put_session(:return_to, conn.request_path) | |||||
|> redirect(to: "/web/login") | |||||
end | |||||
end | |||||
def put_settings(%{assigns: %{user: user}} = conn, %{"data" => settings} = _params) do | |||||
with {:ok, _} <- User.update_info(user, &User.Info.mastodon_settings_update(&1, settings)) do | |||||
json(conn, %{}) | |||||
else | |||||
e -> | |||||
conn | |||||
|> put_status(:internal_server_error) | |||||
|> json(%{error: inspect(e)}) | |||||
end | |||||
end | |||||
# Stubs for unimplemented mastodon api | # Stubs for unimplemented mastodon api | ||||
# | # | ||||
def empty_array(conn, _) do | def empty_array(conn, _) do | ||||
@@ -216,8 +96,4 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do | |||||
Logger.debug("Unimplemented, returning an empty object") | Logger.debug("Unimplemented, returning an empty object") | ||||
json(conn, %{}) | json(conn, %{}) | ||||
end | end | ||||
defp present?(nil), do: false | |||||
defp present?(false), do: false | |||||
defp present?(_), do: true | |||||
end | end |
@@ -1,8 +0,0 @@ | |||||
# Pleroma: A lightweight social networking server | |||||
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> | |||||
# SPDX-License-Identifier: AGPL-3.0-only | |||||
defmodule Pleroma.Web.MastodonAPI.MastodonView do | |||||
use Pleroma.Web, :view | |||||
import Phoenix.HTML | |||||
end |
@@ -451,10 +451,10 @@ defmodule Pleroma.Web.Router do | |||||
end | end | ||||
end | end | ||||
scope "/api/web", Pleroma.Web.MastodonAPI do | |||||
scope "/api/web", Pleroma.Web do | |||||
pipe_through([:authenticated_api, :oauth_write]) | pipe_through([:authenticated_api, :oauth_write]) | ||||
put("/settings", MastodonAPIController, :put_settings) | |||||
put("/settings", MastoFEController, :put_settings) | |||||
end | end | ||||
scope "/api/v1", Pleroma.Web.MastodonAPI do | scope "/api/v1", Pleroma.Web.MastodonAPI do | ||||
@@ -658,17 +658,17 @@ defmodule Pleroma.Web.Router do | |||||
get("/:version", Nodeinfo.NodeinfoController, :nodeinfo) | get("/:version", Nodeinfo.NodeinfoController, :nodeinfo) | ||||
end | end | ||||
scope "/", Pleroma.Web.MastodonAPI do | |||||
scope "/", Pleroma.Web do | |||||
pipe_through(:mastodon_html) | pipe_through(:mastodon_html) | ||||
get("/web/login", AuthController, :login) | |||||
delete("/auth/sign_out", AuthController, :logout) | |||||
get("/web/login", MastodonAPI.AuthController, :login) | |||||
delete("/auth/sign_out", MastodonAPI.AuthController, :logout) | |||||
post("/auth/password", AuthController, :password_reset) | |||||
post("/auth/password", MastodonAPI.AuthController, :password_reset) | |||||
scope [] do | scope [] do | ||||
pipe_through(:oauth_read) | pipe_through(:oauth_read) | ||||
get("/web/*path", MastodonAPIController, :index) | |||||
get("/web/*path", MastoFEController, :index) | |||||
end | end | ||||
end | end | ||||
@@ -14,7 +14,7 @@ | |||||
<link rel='preload' as='script' crossorigin='anonymous' href='/packs/features/compose.js'> | <link rel='preload' as='script' crossorigin='anonymous' href='/packs/features/compose.js'> | ||||
<link rel='preload' as='script' crossorigin='anonymous' href='/packs/features/home_timeline.js'> | <link rel='preload' as='script' crossorigin='anonymous' href='/packs/features/home_timeline.js'> | ||||
<link rel='preload' as='script' crossorigin='anonymous' href='/packs/features/notifications.js'> | <link rel='preload' as='script' crossorigin='anonymous' href='/packs/features/notifications.js'> | ||||
<script id='initial-state' type='application/json'><%= raw @initial_state %></script> | |||||
<script id='initial-state' type='application/json'><%= initial_state(@token, @user, @custom_emojis) %></script> | |||||
<script src="/packs/core/common.js"></script> | <script src="/packs/core/common.js"></script> | ||||
<link rel="stylesheet" media="all" href="/packs/core/common.css" /> | <link rel="stylesheet" media="all" href="/packs/core/common.css" /> |
@@ -0,0 +1,102 @@ | |||||
# Pleroma: A lightweight social networking server | |||||
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> | |||||
# SPDX-License-Identifier: AGPL-3.0-only | |||||
defmodule Pleroma.Web.MastoFEView do | |||||
use Pleroma.Web, :view | |||||
alias Pleroma.Config | |||||
alias Pleroma.User | |||||
alias Pleroma.Web.MastodonAPI.AccountView | |||||
alias Pleroma.Web.MastodonAPI.CustomEmojiView | |||||
@default_settings %{ | |||||
onboarded: true, | |||||
home: %{ | |||||
shows: %{ | |||||
reblog: true, | |||||
reply: true | |||||
} | |||||
}, | |||||
notifications: %{ | |||||
alerts: %{ | |||||
follow: true, | |||||
favourite: true, | |||||
reblog: true, | |||||
mention: true | |||||
}, | |||||
shows: %{ | |||||
follow: true, | |||||
favourite: true, | |||||
reblog: true, | |||||
mention: true | |||||
}, | |||||
sounds: %{ | |||||
follow: true, | |||||
favourite: true, | |||||
reblog: true, | |||||
mention: true | |||||
} | |||||
} | |||||
} | |||||
def initial_state(token, user, custom_emojis) do | |||||
limit = Config.get([:instance, :limit]) | |||||
%{ | |||||
meta: %{ | |||||
streaming_api_base_url: Pleroma.Web.Endpoint.websocket_url(), | |||||
access_token: token, | |||||
locale: "en", | |||||
domain: Pleroma.Web.Endpoint.host(), | |||||
admin: "1", | |||||
me: "#{user.id}", | |||||
unfollow_modal: false, | |||||
boost_modal: false, | |||||
delete_modal: true, | |||||
auto_play_gif: false, | |||||
display_sensitive_media: false, | |||||
reduce_motion: false, | |||||
max_toot_chars: limit, | |||||
mascot: User.get_mascot(user)["url"] | |||||
}, | |||||
poll_limits: Config.get([:instance, :poll_limits]), | |||||
rights: %{ | |||||
delete_others_notice: present?(user.info.is_moderator), | |||||
admin: present?(user.info.is_admin) | |||||
}, | |||||
compose: %{ | |||||
me: "#{user.id}", | |||||
default_privacy: user.info.default_scope, | |||||
default_sensitive: false, | |||||
allow_content_types: Config.get([:instance, :allowed_post_formats]) | |||||
}, | |||||
media_attachments: %{ | |||||
accept_content_types: [ | |||||
".jpg", | |||||
".jpeg", | |||||
".png", | |||||
".gif", | |||||
".webm", | |||||
".mp4", | |||||
".m4v", | |||||
"image\/jpeg", | |||||
"image\/png", | |||||
"image\/gif", | |||||
"video\/webm", | |||||
"video\/mp4" | |||||
] | |||||
}, | |||||
settings: user.info.settings || @default_settings, | |||||
push_subscription: nil, | |||||
accounts: %{user.id => render(AccountView, "show.json", user: user, for: user)}, | |||||
custom_emojis: render(CustomEmojiView, "index.json", custom_emojis: custom_emojis), | |||||
char_limit: limit | |||||
} | |||||
|> Jason.encode!() | |||||
|> Phoenix.HTML.raw() | |||||
end | |||||
defp present?(nil), do: false | |||||
defp present?(false), do: false | |||||
defp present?(_), do: true | |||||
end |
@@ -0,0 +1,83 @@ | |||||
# Pleroma: A lightweight social networking server | |||||
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> | |||||
# SPDX-License-Identifier: AGPL-3.0-only | |||||
defmodule Pleroma.Web.MastodonAPI.MastoFEController do | |||||
use Pleroma.Web.ConnCase | |||||
alias Pleroma.User | |||||
alias Pleroma.Config | |||||
import Pleroma.Factory | |||||
clear_config([:instance, :public]) | |||||
test "put settings", %{conn: conn} do | |||||
user = insert(:user) | |||||
conn = | |||||
conn | |||||
|> assign(:user, user) | |||||
|> put("/api/web/settings", %{"data" => %{"programming" => "socks"}}) | |||||
assert _result = json_response(conn, 200) | |||||
user = User.get_cached_by_ap_id(user.ap_id) | |||||
assert user.info.settings == %{"programming" => "socks"} | |||||
end | |||||
describe "index/2 redirections" do | |||||
setup %{conn: conn} do | |||||
session_opts = [ | |||||
store: :cookie, | |||||
key: "_test", | |||||
signing_salt: "cooldude" | |||||
] | |||||
conn = | |||||
conn | |||||
|> Plug.Session.call(Plug.Session.init(session_opts)) | |||||
|> fetch_session() | |||||
test_path = "/web/statuses/test" | |||||
%{conn: conn, path: test_path} | |||||
end | |||||
test "redirects not logged-in users to the login page", %{conn: conn, path: path} do | |||||
conn = get(conn, path) | |||||
assert conn.status == 302 | |||||
assert redirected_to(conn) == "/web/login" | |||||
end | |||||
test "redirects not logged-in users to the login page on private instances", %{ | |||||
conn: conn, | |||||
path: path | |||||
} do | |||||
Config.put([:instance, :public], false) | |||||
conn = get(conn, path) | |||||
assert conn.status == 302 | |||||
assert redirected_to(conn) == "/web/login" | |||||
end | |||||
test "does not redirect logged in users to the login page", %{conn: conn, path: path} do | |||||
token = insert(:oauth_token) | |||||
conn = | |||||
conn | |||||
|> assign(:user, token.user) | |||||
|> put_session(:oauth_token, token.token) | |||||
|> get(path) | |||||
assert conn.status == 200 | |||||
end | |||||
test "saves referer path to session", %{conn: conn, path: path} do | |||||
conn = get(conn, path) | |||||
return_to = Plug.Conn.get_session(conn, :return_to) | |||||
assert return_to == path | |||||
end | |||||
end | |||||
end |
@@ -5,7 +5,6 @@ | |||||
defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do | defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do | ||||
use Pleroma.Web.ConnCase | use Pleroma.Web.ConnCase | ||||
alias Pleroma.Config | |||||
alias Pleroma.Notification | alias Pleroma.Notification | ||||
alias Pleroma.Repo | alias Pleroma.Repo | ||||
alias Pleroma.User | alias Pleroma.User | ||||
@@ -19,7 +18,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do | |||||
:ok | :ok | ||||
end | end | ||||
clear_config([:instance, :public]) | |||||
clear_config([:rich_media, :enabled]) | clear_config([:rich_media, :enabled]) | ||||
test "getting a list of mutes", %{conn: conn} do | test "getting a list of mutes", %{conn: conn} do | ||||
@@ -113,20 +111,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do | |||||
assert [] = json_response(third_conn, 200) | assert [] = json_response(third_conn, 200) | ||||
end | end | ||||
test "put settings", %{conn: conn} do | |||||
user = insert(:user) | |||||
conn = | |||||
conn | |||||
|> assign(:user, user) | |||||
|> put("/api/web/settings", %{"data" => %{"programming" => "socks"}}) | |||||
assert _result = json_response(conn, 200) | |||||
user = User.get_cached_by_ap_id(user.ap_id) | |||||
assert user.info.settings == %{"programming" => "socks"} | |||||
end | |||||
describe "link headers" do | describe "link headers" do | ||||
test "preserves parameters in link headers", %{conn: conn} do | test "preserves parameters in link headers", %{conn: conn} do | ||||
user = insert(:user) | user = insert(:user) | ||||
@@ -159,62 +143,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do | |||||
end | end | ||||
end | end | ||||
describe "index/2 redirections" do | |||||
setup %{conn: conn} do | |||||
session_opts = [ | |||||
store: :cookie, | |||||
key: "_test", | |||||
signing_salt: "cooldude" | |||||
] | |||||
conn = | |||||
conn | |||||
|> Plug.Session.call(Plug.Session.init(session_opts)) | |||||
|> fetch_session() | |||||
test_path = "/web/statuses/test" | |||||
%{conn: conn, path: test_path} | |||||
end | |||||
test "redirects not logged-in users to the login page", %{conn: conn, path: path} do | |||||
conn = get(conn, path) | |||||
assert conn.status == 302 | |||||
assert redirected_to(conn) == "/web/login" | |||||
end | |||||
test "redirects not logged-in users to the login page on private instances", %{ | |||||
conn: conn, | |||||
path: path | |||||
} do | |||||
Config.put([:instance, :public], false) | |||||
conn = get(conn, path) | |||||
assert conn.status == 302 | |||||
assert redirected_to(conn) == "/web/login" | |||||
end | |||||
test "does not redirect logged in users to the login page", %{conn: conn, path: path} do | |||||
token = insert(:oauth_token) | |||||
conn = | |||||
conn | |||||
|> assign(:user, token.user) | |||||
|> put_session(:oauth_token, token.token) | |||||
|> get(path) | |||||
assert conn.status == 200 | |||||
end | |||||
test "saves referer path to session", %{conn: conn, path: path} do | |||||
conn = get(conn, path) | |||||
return_to = Plug.Conn.get_session(conn, :return_to) | |||||
assert return_to == path | |||||
end | |||||
end | |||||
describe "empty_array, stubs for mastodon api" do | describe "empty_array, stubs for mastodon api" do | ||||
test "GET /api/v1/accounts/:id/identity_proofs", %{conn: conn} do | test "GET /api/v1/accounts/:id/identity_proofs", %{conn: conn} do | ||||
user = insert(:user) | user = insert(:user) | ||||