Browse Source

Add MastoFEController

object-id-column
Egor Kislitsyn 4 years ago
parent
commit
d3c404af12
No known key found for this signature in database GPG Key ID: 1B49CB15B71E7805
9 changed files with 230 additions and 213 deletions
  1. +36
    -0
      lib/pleroma/web/masto_fe_controller.ex
  2. +1
    -1
      lib/pleroma/web/mastodon_api/controllers/auth_controller.ex
  3. +0
    -124
      lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex
  4. +0
    -8
      lib/pleroma/web/mastodon_api/views/mastodon_view.ex
  5. +7
    -7
      lib/pleroma/web/router.ex
  6. +1
    -1
      lib/pleroma/web/templates/masto_fe/index.html.eex
  7. +102
    -0
      lib/pleroma/web/views/masto_fe_view.ex
  8. +83
    -0
      test/web/masto_fe_controller_test.exs
  9. +0
    -72
      test/web/mastodon_api/mastodon_api_controller_test.exs

+ 36
- 0
lib/pleroma/web/masto_fe_controller.ex View File

@@ -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

+ 1
- 1
lib/pleroma/web/mastodon_api/controllers/auth_controller.ex View File

@@ -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)


+ 0
- 124
lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex View File

@@ -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

+ 0
- 8
lib/pleroma/web/mastodon_api/views/mastodon_view.ex View File

@@ -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

+ 7
- 7
lib/pleroma/web/router.ex View File

@@ -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




lib/pleroma/web/templates/mastodon_api/mastodon/index.html.eex → lib/pleroma/web/templates/masto_fe/index.html.eex View File

@@ -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" />

+ 102
- 0
lib/pleroma/web/views/masto_fe_view.ex View File

@@ -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

+ 83
- 0
test/web/masto_fe_controller_test.exs View File

@@ -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

+ 0
- 72
test/web/mastodon_api/mastodon_api_controller_test.exs View File

@@ -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)


Loading…
Cancel
Save