@@ -0,0 +1,77 @@ | |||||
# Pleroma: A lightweight social networking server | |||||
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> | |||||
# SPDX-License-Identifier: AGPL-3.0-only | |||||
defmodule Fallback.RedirectController do | |||||
use Pleroma.Web, :controller | |||||
require Logger | |||||
alias Pleroma.User | |||||
alias Pleroma.Web.Metadata | |||||
def api_not_implemented(conn, _params) do | |||||
conn | |||||
|> put_status(404) | |||||
|> json(%{error: "Not implemented"}) | |||||
end | |||||
def redirector(conn, _params, code \\ 200) | |||||
# redirect to admin section | |||||
# /pleroma/admin -> /pleroma/admin/ | |||||
# | |||||
def redirector(conn, %{"path" => ["pleroma", "admin"]} = _, _code) do | |||||
redirect(conn, to: "/pleroma/admin/") | |||||
end | |||||
def redirector(conn, _params, code) 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 = | |||||
try do | |||||
Metadata.build_tags(params) | |||||
rescue | |||||
e -> | |||||
Logger.error( | |||||
"Metadata rendering for #{conn.request_path} failed.\n" <> | |||||
Exception.format(:error, e, __STACKTRACE__) | |||||
) | |||||
"" | |||||
end | |||||
response = String.replace(index_content, "<!--server-generated-meta-->", tags) | |||||
conn | |||||
|> put_resp_content_type("text/html") | |||||
|> send_resp(200, response) | |||||
end | |||||
def index_file_path do | |||||
Pleroma.Plugs.InstanceStatic.file_path("index.html") | |||||
end | |||||
def registration_page(conn, params) do | |||||
redirector(conn, params) | |||||
end | |||||
def empty(conn, _params) do | |||||
conn | |||||
|> put_status(204) | |||||
|> text("") | |||||
end | |||||
end |
@@ -729,68 +729,3 @@ defmodule Pleroma.Web.Router do | |||||
options("/*path", RedirectController, :empty) | options("/*path", RedirectController, :empty) | ||||
end | end | ||||
end | end | ||||
defmodule Fallback.RedirectController do | |||||
use Pleroma.Web, :controller | |||||
require Logger | |||||
alias Pleroma.User | |||||
alias Pleroma.Web.Metadata | |||||
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 = | |||||
try do | |||||
Metadata.build_tags(params) | |||||
rescue | |||||
e -> | |||||
Logger.error( | |||||
"Metadata rendering for #{conn.request_path} failed.\n" <> | |||||
Exception.format(:error, e, __STACKTRACE__) | |||||
) | |||||
"" | |||||
end | |||||
response = String.replace(index_content, "<!--server-generated-meta-->", tags) | |||||
conn | |||||
|> put_resp_content_type("text/html") | |||||
|> send_resp(200, response) | |||||
end | |||||
def index_file_path do | |||||
Pleroma.Plugs.InstanceStatic.file_path("index.html") | |||||
end | |||||
def registration_page(conn, params) do | |||||
redirector(conn, params) | |||||
end | |||||
def empty(conn, _params) do | |||||
conn | |||||
|> put_status(204) | |||||
|> text("") | |||||
end | |||||
end |
@@ -30,6 +30,10 @@ defmodule Pleroma.Web.FallbackTest do | |||||
|> json_response(404) == %{"error" => "Not implemented"} | |> json_response(404) == %{"error" => "Not implemented"} | ||||
end | end | ||||
test "GET /pleroma/admin -> /pleroma/admin/", %{conn: conn} do | |||||
assert redirected_to(get(conn, "/pleroma/admin")) =~ "/pleroma/admin/" | |||||
end | |||||
test "GET /*path", %{conn: conn} do | test "GET /*path", %{conn: conn} do | ||||
assert conn | assert conn | ||||
|> get("/foo") | |> get("/foo") | ||||