diff options
author | href <href@random.sh> | 2017-12-05 14:12:15 +0100 |
---|---|---|
committer | href <href@random.sh> | 2017-12-05 14:12:15 +0100 |
commit | 72f7baa6548dbd5cc5ae4c37d9c2e53126203449 (patch) | |
tree | a4923155f8740e8570be4400785a72d8cd6e6bbc /lib | |
parent | 1cb5cbdc6c1cd065e90961a9d538cb72610ae481 (diff) | |
parent | 08e7e249b1e656bce79fec7df4ce8bf9b158855f (diff) | |
download | pleroma-72f7baa6548dbd5cc5ae4c37d9c2e53126203449.tar.gz |
Merge remote-tracking branch 'upstream/develop' into media-proxy
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pleroma/application.ex | 1 | ||||
-rw-r--r-- | lib/pleroma/plugs/authentication_plug.ex | 2 | ||||
-rw-r--r-- | lib/pleroma/user.ex | 5 | ||||
-rw-r--r-- | lib/pleroma/web/channels/user_socket.ex | 12 | ||||
-rw-r--r-- | lib/pleroma/web/chat_channel.ex | 46 | ||||
-rw-r--r-- | lib/pleroma/web/mastodon_api/mastodon_api_controller.ex | 3 | ||||
-rw-r--r-- | lib/pleroma/web/ostatus/user_representer.ex | 1 | ||||
-rw-r--r-- | lib/pleroma/web/twitter_api/twitter_api_controller.ex | 3 | ||||
-rw-r--r-- | lib/pleroma/web/twitter_api/views/user_view.ex | 8 |
9 files changed, 75 insertions, 6 deletions
diff --git a/lib/pleroma/application.ex b/lib/pleroma/application.ex index bfe16e13a..2969ca3c4 100644 --- a/lib/pleroma/application.ex +++ b/lib/pleroma/application.ex @@ -20,6 +20,7 @@ defmodule Pleroma.Application do limit: 2500 ]]), worker(Pleroma.Web.Federator, []), + worker(Pleroma.Web.ChatChannel.ChatChannelState, []), ] ++ if Mix.env == :test, do: [], else: [worker(Pleroma.Web.Streamer, [])] diff --git a/lib/pleroma/plugs/authentication_plug.ex b/lib/pleroma/plugs/authentication_plug.ex index 14654f2e6..beb02eb88 100644 --- a/lib/pleroma/plugs/authentication_plug.ex +++ b/lib/pleroma/plugs/authentication_plug.ex @@ -44,7 +44,7 @@ defmodule Pleroma.Plugs.AuthenticationPlug do defp decode_header(conn) do with ["Basic " <> header] <- get_req_header(conn, "authorization"), {:ok, userinfo} <- Base.decode64(header), - [username, password] <- String.split(userinfo, ":") + [username, password] <- String.split(userinfo, ":", parts: 2) do {:ok, username, password} end diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 68ffe184b..afc62f265 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -329,4 +329,9 @@ defmodule Pleroma.User do Enum.member?(blocks, ap_id) end + def local_user_query() do + from u in User, + where: u.local == true + end + end diff --git a/lib/pleroma/web/channels/user_socket.ex b/lib/pleroma/web/channels/user_socket.ex index 7aa8e556e..4a9bb8e22 100644 --- a/lib/pleroma/web/channels/user_socket.ex +++ b/lib/pleroma/web/channels/user_socket.ex @@ -1,8 +1,11 @@ defmodule Pleroma.Web.UserSocket do use Phoenix.Socket + alias Pleroma.User + alias Comeonin.Pbkdf2 ## Channels # channel "room:*", Pleroma.Web.RoomChannel + channel "chat:*", Pleroma.Web.ChatChannel ## Transports transport :websocket, Phoenix.Transports.WebSocket @@ -19,8 +22,13 @@ defmodule Pleroma.Web.UserSocket do # # See `Phoenix.Token` documentation for examples in # performing token verification on connect. - def connect(_params, socket) do - {:ok, socket} + def connect(%{"token" => token}, socket) do + with {:ok, user_id} <- Phoenix.Token.verify(socket, "user socket", token, max_age: 84600), + %User{} = user <- Pleroma.Repo.get(User, user_id) do + {:ok, assign(socket, :user_name, user.nickname)} + else + _e -> :error + end end # Socket id's are topics that allow you to identify all sockets for a given user: diff --git a/lib/pleroma/web/chat_channel.ex b/lib/pleroma/web/chat_channel.ex new file mode 100644 index 000000000..268bef17d --- /dev/null +++ b/lib/pleroma/web/chat_channel.ex @@ -0,0 +1,46 @@ +defmodule Pleroma.Web.ChatChannel do + use Phoenix.Channel + alias Pleroma.Web.ChatChannel.ChatChannelState + alias Pleroma.User + + def join("chat:public", _message, socket) do + send(self(), :after_join) + {:ok, socket} + end + + def handle_info(:after_join, socket) do + push socket, "messages", %{messages: ChatChannelState.messages()} + {:noreply, socket} + end + + def handle_in("new_msg", %{"text" => text}, %{assigns: %{user_name: user_name}} = socket) do + author = User.get_cached_by_nickname(user_name) + author = Pleroma.Web.MastodonAPI.AccountView.render("account.json", user: author) + message = ChatChannelState.add_message(%{text: text, author: author}) + + broadcast! socket, "new_msg", message + {:noreply, socket} + end +end + +defmodule Pleroma.Web.ChatChannel.ChatChannelState do + use Agent + @max_messages 20 + + def start_link do + Agent.start_link(fn -> %{max_id: 1, messages: []} end, name: __MODULE__) + end + + def add_message(message) do + Agent.get_and_update(__MODULE__, fn state -> + id = state[:max_id] + 1 + message = Map.put(message, "id", id) + messages = [message | state[:messages]] |> Enum.take(@max_messages) + {message, %{max_id: id, messages: messages}} + end) + end + + def messages() do + Agent.get(__MODULE__, fn state -> state[:messages] |> Enum.reverse end) + end +end diff --git a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex index 82887966c..61bf8b4b8 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -93,6 +93,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do @instance Application.get_env(:pleroma, :instance) def masto_instance(conn, _params) do + user_count = Repo.aggregate(User.local_user_query, :count, :id) response = %{ uri: Web.base_url, title: Keyword.get(@instance, :name), @@ -103,8 +104,8 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do streaming_api: String.replace(Web.base_url, ["http","https"], "wss") }, stats: %{ - user_count: 1, status_count: 2, + user_count: user_count, domain_count: 3 }, max_toot_chars: Keyword.get(@instance, :limit) diff --git a/lib/pleroma/web/ostatus/user_representer.ex b/lib/pleroma/web/ostatus/user_representer.ex index 14f78a4ed..20ebb3e08 100644 --- a/lib/pleroma/web/ostatus/user_representer.ex +++ b/lib/pleroma/web/ostatus/user_representer.ex @@ -19,6 +19,7 @@ defmodule Pleroma.Web.OStatus.UserRepresenter do {:"poco:preferredUsername", [nickname]}, {:"poco:displayName", [name]}, {:"poco:note", [bio]}, + {:summary, [bio]}, {:name, [nickname]}, {:link, [rel: 'avatar', href: avatar_url], []} ] ++ banner diff --git a/lib/pleroma/web/twitter_api/twitter_api_controller.ex b/lib/pleroma/web/twitter_api/twitter_api_controller.ex index 1a706029a..73d96c73d 100644 --- a/lib/pleroma/web/twitter_api/twitter_api_controller.ex +++ b/lib/pleroma/web/twitter_api/twitter_api_controller.ex @@ -10,7 +10,8 @@ defmodule Pleroma.Web.TwitterAPI.Controller do require Logger def verify_credentials(%{assigns: %{user: user}} = conn, _params) do - render(conn, UserView, "show.json", %{user: user}) + token = Phoenix.Token.sign(conn, "user socket", user.id) + render(conn, UserView, "show.json", %{user: user, token: token}) end def status_update(%{assigns: %{user: user}} = conn, %{"status" => _} = status_data) do diff --git a/lib/pleroma/web/twitter_api/views/user_view.ex b/lib/pleroma/web/twitter_api/views/user_view.ex index eeef1c037..cc6b450fb 100644 --- a/lib/pleroma/web/twitter_api/views/user_view.ex +++ b/lib/pleroma/web/twitter_api/views/user_view.ex @@ -26,7 +26,7 @@ defmodule Pleroma.Web.TwitterAPI.UserView do user_info = User.get_cached_user_info(user) - %{ + data = %{ "created_at" => user.inserted_at |> Utils.format_naive_asctime, "description" => HtmlSanitizeEx.strip_tags(user.bio), "favourites_count" => 0, @@ -48,6 +48,12 @@ defmodule Pleroma.Web.TwitterAPI.UserView do "cover_photo" => image_url(user.info["banner"]) |> MediaProxy.url(), "background_image" => image_url(user.info["background"]) |> MediaProxy.url(), } + + if assigns[:token] do + Map.put(data, "token", assigns[:token]) + else + data + end end def render("short.json", %{user: %User{ |