From 5c4098612067abf16e5c10e878656dc412304cd3 Mon Sep 17 00:00:00 2001 From: Lain Iwakura Date: Mon, 4 Dec 2017 19:10:15 +0100 Subject: [PATCH] Basic backend chat. --- lib/pleroma/web/channels/user_socket.ex | 12 ++++++++++-- lib/pleroma/web/chat_channel.ex | 14 ++++++++++++++ .../web/twitter_api/twitter_api_controller.ex | 3 ++- lib/pleroma/web/twitter_api/views/user_view.ex | 8 +++++++- 4 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 lib/pleroma/web/chat_channel.ex diff --git a/lib/pleroma/web/channels/user_socket.ex b/lib/pleroma/web/channels/user_socket.ex index 7aa8e556e..d8171cabd 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, user)} + 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..60558cb8e --- /dev/null +++ b/lib/pleroma/web/chat_channel.ex @@ -0,0 +1,14 @@ +defmodule Pleroma.Web.ChatChannel do + use Phoenix.Channel + + def join("chat:public", _message, socket) do + {:ok, socket} + end + + def handle_in("new_msg", %{"text" => text}, socket) do + author = socket.assigns[:user] + author = Pleroma.Web.MastodonAPI.AccountView.render("account.json", user: author) + broadcast! socket, "new_msg", %{text: text, author: author} + {:noreply, socket} + end +end 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 3dc18eff8..d1c7e6fbd 100644 --- a/lib/pleroma/web/twitter_api/views/user_view.ex +++ b/lib/pleroma/web/twitter_api/views/user_view.ex @@ -25,7 +25,7 @@ def render("user.json", %{user: user = %User{}} = assigns) 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, @@ -47,6 +47,12 @@ def render("user.json", %{user: user = %User{}} = assigns) do "cover_photo" => image_url(user.info["banner"]), "background_image" => image_url(user.info["background"]) } + + if assigns[:token] do + Map.put(data, "token", assigns[:token]) + else + data + end end def render("short.json", %{user: %User{