From 5d5287989a8639d23a35d386294567efdde5bd6d Mon Sep 17 00:00:00 2001 From: Roman Chvanikov Date: Thu, 30 Jul 2020 21:43:11 +0300 Subject: Migrate Redirect controller --- lib/mix/tasks/pleroma/user.ex | 2 +- lib/pleroma/emails/user_email.ex | 2 +- lib/pleroma/plugs/frontend_static.ex | 2 - lib/pleroma/web/controller/frontend_controller.ex | 38 +++++++ lib/pleroma/web/fallback_redirect_controller.ex | 109 --------------------- lib/pleroma/web/feed/user_controller.ex | 5 +- lib/pleroma/web/ostatus/ostatus_controller.ex | 26 ++--- lib/pleroma/web/router.ex | 9 +- test/emails/user_email_test.exs | 2 +- .../frontend/pleroma_controller_test.exs | 76 ++++++++++++++ test/web/fallback_test.exs | 80 --------------- test/web/feed/user_controller_test.exs | 12 ++- 12 files changed, 144 insertions(+), 219 deletions(-) delete mode 100644 lib/pleroma/web/fallback_redirect_controller.ex create mode 100644 test/web/controllers/frontend/pleroma_controller_test.exs delete mode 100644 test/web/fallback_test.exs diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index 01824aa18..ce7ba9b80 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -277,7 +277,7 @@ defmodule Mix.Tasks.Pleroma.User do shell_info("Generated user invite token " <> String.replace(invite.invite_type, "_", " ")) url = - Pleroma.Web.Router.Helpers.redirect_url( + Pleroma.Web.Router.Helpers.frontend_url( Pleroma.Web.Endpoint, :registration_page, invite.token diff --git a/lib/pleroma/emails/user_email.ex b/lib/pleroma/emails/user_email.ex index 313533859..1a1f6fb4b 100644 --- a/lib/pleroma/emails/user_email.ex +++ b/lib/pleroma/emails/user_email.ex @@ -52,7 +52,7 @@ defmodule Pleroma.Emails.UserEmail do to_name \\ nil ) do registration_url = - Router.Helpers.redirect_url( + Router.Helpers.frontend_url( Endpoint, :registration_page, user_invite_token.token diff --git a/lib/pleroma/plugs/frontend_static.ex b/lib/pleroma/plugs/frontend_static.ex index f549ca75f..815f3bb20 100644 --- a/lib/pleroma/plugs/frontend_static.ex +++ b/lib/pleroma/plugs/frontend_static.ex @@ -21,8 +21,6 @@ defmodule Pleroma.Plugs.FrontendStatic do configuration["ref"], path ]) - else - nil end end diff --git a/lib/pleroma/web/controller/frontend_controller.ex b/lib/pleroma/web/controller/frontend_controller.ex index fc717fa29..5fa4e6391 100644 --- a/lib/pleroma/web/controller/frontend_controller.ex +++ b/lib/pleroma/web/controller/frontend_controller.ex @@ -4,6 +4,7 @@ defmodule Pleroma.Web.FrontendController do defmacro __using__(_opts) do quote do require Logger + alias Pleroma.User def fallback(conn, _params) do conn @@ -11,6 +12,30 @@ defmodule Pleroma.Web.FrontendController do |> text("Not found") end + def registration_page(conn, params) do + redirector(conn, params) + end + + def api_not_implemented(conn, _params) do + conn + |> put_status(404) + |> json(%{error: "Not implemented"}) + end + + def empty(conn, _params) do + conn + |> put_status(204) + |> text("") + end + + def redirector(conn, _params) do + {:ok, path} = Pleroma.Frontend.file_path("index.html") + + conn + |> put_resp_content_type("text/html") + |> send_file(conn.status || 200, path) + end + def redirector_with_preload(conn, %{"path" => ["pleroma", "admin"]}) do redirect(conn, to: "/pleroma/admin/") end @@ -19,6 +44,19 @@ defmodule Pleroma.Web.FrontendController do index_with_generated_data(conn, params, [:preload]) end + def redirector_with_meta(conn, %{"maybe_nickname_or_id" => maybe_nickname_or_id} = params) do + with %User{} = user <- User.get_cached_by_nickname_or_id(maybe_nickname_or_id) do + redirector_with_meta(conn, %{user: user}) + else + nil -> + redirector(conn, params) + end + end + + def redirector_with_meta(conn, params) do + index_with_generated_data(conn, params, [:metadata, :preload]) + end + def index_with_generated_data(conn, params, generators) do {:ok, path} = Pleroma.Frontend.file_path("index.html") {:ok, index_content} = File.read(path) diff --git a/lib/pleroma/web/fallback_redirect_controller.ex b/lib/pleroma/web/fallback_redirect_controller.ex deleted file mode 100644 index a59c2a02e..000000000 --- a/lib/pleroma/web/fallback_redirect_controller.ex +++ /dev/null @@ -1,109 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Fallback.RedirectController do - use Pleroma.Web, :controller - - require Logger - - alias Pleroma.User - alias Pleroma.Web.Metadata - alias Pleroma.Web.Preload - - def api_not_implemented(conn, _params) do - conn - |> put_status(404) - |> json(%{error: "Not implemented"}) - end - - def redirector(conn, _params, code \\ 200) do - conn - |> put_resp_content_type("text/html") - |> send_file(code, index_file_path()) - end - - def redirector_with_meta(conn, %{"maybe_nickname_or_id" => maybe_nickname_or_id} = params) do - with %User{} = user <- User.get_cached_by_nickname_or_id(maybe_nickname_or_id) do - redirector_with_meta(conn, %{user: user}) - else - nil -> - redirector(conn, params) - end - end - - def redirector_with_meta(conn, params) do - {:ok, index_content} = File.read(index_file_path()) - - tags = build_tags(conn, params) - preloads = preload_data(conn, params) - - response = - index_content - |> String.replace("", tags <> preloads) - - conn - |> put_resp_content_type("text/html") - |> send_resp(200, response) - end - - def redirector_with_preload(conn, %{"path" => ["pleroma", "admin"]}) do - redirect(conn, to: "/pleroma/admin/") - end - - def redirector_with_preload(conn, params) do - {:ok, index_content} = File.read(index_file_path()) - preloads = preload_data(conn, params) - - response = - index_content - |> String.replace("", preloads) - - conn - |> put_resp_content_type("text/html") - |> send_resp(200, response) - end - - def registration_page(conn, params) do - redirector(conn, params) - end - - def empty(conn, _params) do - conn - |> put_status(204) - |> text("") - end - - defp index_file_path do - {:ok, file} = Pleroma.Frontend.file_path("index.html", :primary) - file - end - - defp build_tags(conn, params) do - try do - Metadata.build_tags(params) - rescue - e -> - Logger.error( - "Metadata rendering for #{conn.request_path} failed.\n" <> - Exception.format(:error, e, __STACKTRACE__) - ) - - "" - end - end - - defp preload_data(conn, params) do - try do - Preload.build_tags(conn, params) - rescue - e -> - Logger.error( - "Preloading for #{conn.request_path} failed.\n" <> - Exception.format(:error, e, __STACKTRACE__) - ) - - "" - end - end -end diff --git a/lib/pleroma/web/feed/user_controller.ex b/lib/pleroma/web/feed/user_controller.ex index d56f43818..47c3dba35 100644 --- a/lib/pleroma/web/feed/user_controller.ex +++ b/lib/pleroma/web/feed/user_controller.ex @@ -5,7 +5,6 @@ defmodule Pleroma.Web.Feed.UserController do use Pleroma.Web, :controller - alias Fallback.RedirectController alias Pleroma.User alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.ActivityPub.ActivityPubController @@ -17,7 +16,9 @@ defmodule Pleroma.Web.Feed.UserController do def feed_redirect(%{assigns: %{format: "html"}} = conn, %{"nickname" => nickname}) do with {_, %User{} = user} <- {:fetch_user, User.get_cached_by_nickname_or_id(nickname)} do - RedirectController.redirector_with_meta(conn, %{user: user}) + conn + |> Map.put(:params, %{user: user}) + |> Pleroma.Web.FrontendController.call(:redirector_with_meta) end end diff --git a/lib/pleroma/web/ostatus/ostatus_controller.ex b/lib/pleroma/web/ostatus/ostatus_controller.ex index de1b0b3f0..e6ce1d350 100644 --- a/lib/pleroma/web/ostatus/ostatus_controller.ex +++ b/lib/pleroma/web/ostatus/ostatus_controller.ex @@ -5,7 +5,6 @@ defmodule Pleroma.Web.OStatus.OStatusController do use Pleroma.Web, :controller - alias Fallback.RedirectController alias Pleroma.Activity alias Pleroma.Object alias Pleroma.Plugs.RateLimiter @@ -91,24 +90,25 @@ defmodule Pleroma.Web.OStatus.OStatusController do activity.data["type"] == "Create" -> %Object{} = object = Object.normalize(activity) - RedirectController.redirector_with_meta( - conn, - %{ - activity_id: activity.id, - object: object, - url: Router.Helpers.o_status_url(Endpoint, :notice, activity.id), - user: user - } - ) + params = %{ + activity_id: activity.id, + object: object, + url: Router.Helpers.o_status_url(Endpoint, :notice, activity.id), + user: user + } + + conn + |> Map.put(:params, params) + |> Pleroma.Web.FrontendController.call(:redirector_with_meta) true -> - RedirectController.redirector(conn, nil) + Pleroma.Web.FrontendController.call(conn, :redirector) end else reason when reason in [{:public?, false}, {:activity, nil}] -> conn |> put_status(404) - |> RedirectController.redirector(nil, 404) + |> Pleroma.Web.FrontendController.call(:redirector) e -> e @@ -135,7 +135,7 @@ defmodule Pleroma.Web.OStatus.OStatusController do _error -> conn |> put_status(404) - |> RedirectController.redirector(nil, 404) + |> Pleroma.Web.FrontendController.call(:redirector) end end diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index b8c93a389..3cf5728f0 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -715,12 +715,11 @@ defmodule Pleroma.Web.Router do end scope "/" do - get("/registration/:token", Fallback.RedirectController, :registration_page) - get("/:maybe_nickname_or_id", Fallback.RedirectController, :redirector_with_meta) - get("/api*path", Fallback.RedirectController, :api_not_implemented) - # get("/*path", RedirectController, :redirector_with_preload) + get("/registration/:token", Pleroma.Web.FrontendController, :registration_page) + get("/:maybe_nickname_or_id", Pleroma.Web.FrontendController, :redirector_with_meta) + get("/api*path", Pleroma.Web.FrontendController, :api_not_implemented) get("/*path", Pleroma.Web.FrontendController, :redirector_with_preload) - options("/*path", Fallback.RedirectController, :empty) + options("/*path", Pleroma.Web.FrontendController, :empty) end end diff --git a/test/emails/user_email_test.exs b/test/emails/user_email_test.exs index a75623bb4..c6044a8a5 100644 --- a/test/emails/user_email_test.exs +++ b/test/emails/user_email_test.exs @@ -31,7 +31,7 @@ defmodule Pleroma.Emails.UserEmailTest do assert email.to == [{"Jonh", "test@test.com"}] assert email.html_body =~ - Router.Helpers.redirect_url(Endpoint, :registration_page, token.token) + Router.Helpers.frontend_url(Endpoint, :registration_page, token.token) end test "build account confirmation email" do diff --git a/test/web/controllers/frontend/pleroma_controller_test.exs b/test/web/controllers/frontend/pleroma_controller_test.exs new file mode 100644 index 000000000..7c91d4581 --- /dev/null +++ b/test/web/controllers/frontend/pleroma_controller_test.exs @@ -0,0 +1,76 @@ +defmodule Pleroma.Web.Frontend.PleromaControllerTest do + use Pleroma.Web.ConnCase + import Pleroma.Factory + + test "GET /pleroma/admin -> /pleroma/admin/", %{conn: conn} do + assert redirected_to(get(conn, "/pleroma/admin")) =~ "/pleroma/admin/" + end + + describe "neither preloaded data nor metadata attached to" do + test "GET /registration/:token", %{conn: conn} do + response = get(conn, "/registration/foo") + + assert html_response(response, 200) =~ "" + end + + test "GET /*path", %{conn: conn} do + assert conn + |> get("/foo") + |> html_response(200) =~ "" + end + end + + describe "preloaded data and metadata attached to" do + test "GET /:maybe_nickname_or_id", %{conn: conn} do + user = insert(:user) + user_missing = get(conn, "/foo") + user_present = get(conn, "/#{user.nickname}") + + assert(html_response(user_missing, 200) =~ "") + refute html_response(user_present, 200) =~ "" + assert html_response(user_present, 200) =~ "initial-results" + end + + test "GET /*path", %{conn: conn} do + assert conn + |> get("/foo") + |> html_response(200) =~ "" + + refute conn + |> get("/foo/bar") + |> html_response(200) =~ "" + end + end + + describe "preloaded data is attached to" do + test "GET /main/public", %{conn: conn} do + public_page = get(conn, "/main/public") + + refute html_response(public_page, 200) =~ "" + assert html_response(public_page, 200) =~ "initial-results" + end + + test "GET /main/all", %{conn: conn} do + public_page = get(conn, "/main/all") + + refute html_response(public_page, 200) =~ "" + assert html_response(public_page, 200) =~ "initial-results" + end + end + + test "GET /api*path", %{conn: conn} do + assert conn + |> get("/api/foo") + |> json_response(404) == %{"error" => "Not implemented"} + end + + test "OPTIONS /*path", %{conn: conn} do + assert conn + |> options("/foo") + |> response(204) == "" + + assert conn + |> options("/foo/bar") + |> response(204) == "" + end +end diff --git a/test/web/fallback_test.exs b/test/web/fallback_test.exs deleted file mode 100644 index a65865860..000000000 --- a/test/web/fallback_test.exs +++ /dev/null @@ -1,80 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.FallbackTest do - use Pleroma.Web.ConnCase - import Pleroma.Factory - - describe "neither preloaded data nor metadata attached to" do - test "GET /registration/:token", %{conn: conn} do - response = get(conn, "/registration/foo") - - assert html_response(response, 200) =~ "" - end - - test "GET /*path", %{conn: conn} do - assert conn - |> get("/foo") - |> html_response(200) =~ "" - end - end - - describe "preloaded data and metadata attached to" do - test "GET /:maybe_nickname_or_id", %{conn: conn} do - user = insert(:user) - user_missing = get(conn, "/foo") - user_present = get(conn, "/#{user.nickname}") - - assert(html_response(user_missing, 200) =~ "") - refute html_response(user_present, 200) =~ "" - assert html_response(user_present, 200) =~ "initial-results" - end - - test "GET /*path", %{conn: conn} do - assert conn - |> get("/foo") - |> html_response(200) =~ "" - - refute conn - |> get("/foo/bar") - |> html_response(200) =~ "" - end - end - - describe "preloaded data is attached to" do - test "GET /main/public", %{conn: conn} do - public_page = get(conn, "/main/public") - - refute html_response(public_page, 200) =~ "" - assert html_response(public_page, 200) =~ "initial-results" - end - - test "GET /main/all", %{conn: conn} do - public_page = get(conn, "/main/all") - - refute html_response(public_page, 200) =~ "" - assert html_response(public_page, 200) =~ "initial-results" - end - end - - test "GET /api*path", %{conn: conn} do - assert conn - |> get("/api/foo") - |> json_response(404) == %{"error" => "Not implemented"} - end - - test "GET /pleroma/admin -> /pleroma/admin/", %{conn: conn} do - assert redirected_to(get(conn, "/pleroma/admin")) =~ "/pleroma/admin/" - end - - test "OPTIONS /*path", %{conn: conn} do - assert conn - |> options("/foo") - |> response(204) == "" - - assert conn - |> options("/foo/bar") - |> response(204) == "" - end -end diff --git a/test/web/feed/user_controller_test.exs b/test/web/feed/user_controller_test.exs index fa2ed1ea5..5bbb90eb4 100644 --- a/test/web/feed/user_controller_test.exs +++ b/test/web/feed/user_controller_test.exs @@ -194,11 +194,13 @@ defmodule Pleroma.Web.Feed.UserControllerTest do |> get("/users/#{user.nickname}") |> response(200) - assert response == - Fallback.RedirectController.redirector_with_meta( - conn, - %{user: user} - ).resp_body + expected = + conn + |> Map.put(:params, %{user: user}) + |> Pleroma.Web.FrontendController.call(:redirector_with_meta) + |> Map.get(:resp_body) + + assert response == expected end test "with html format, it returns error when user is not found", %{conn: conn} do -- cgit v1.2.3