aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorhref <href@random.sh>2017-12-05 14:12:15 +0100
committerhref <href@random.sh>2017-12-05 14:12:15 +0100
commit72f7baa6548dbd5cc5ae4c37d9c2e53126203449 (patch)
treea4923155f8740e8570be4400785a72d8cd6e6bbc /lib
parent1cb5cbdc6c1cd065e90961a9d538cb72610ae481 (diff)
parent08e7e249b1e656bce79fec7df4ce8bf9b158855f (diff)
downloadpleroma-72f7baa6548dbd5cc5ae4c37d9c2e53126203449.tar.gz
Merge remote-tracking branch 'upstream/develop' into media-proxy
Diffstat (limited to 'lib')
-rw-r--r--lib/pleroma/application.ex1
-rw-r--r--lib/pleroma/plugs/authentication_plug.ex2
-rw-r--r--lib/pleroma/user.ex5
-rw-r--r--lib/pleroma/web/channels/user_socket.ex12
-rw-r--r--lib/pleroma/web/chat_channel.ex46
-rw-r--r--lib/pleroma/web/mastodon_api/mastodon_api_controller.ex3
-rw-r--r--lib/pleroma/web/ostatus/user_representer.ex1
-rw-r--r--lib/pleroma/web/twitter_api/twitter_api_controller.ex3
-rw-r--r--lib/pleroma/web/twitter_api/views/user_view.ex8
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{