Add OAuth tokens endpoint
authorMaxim Filippov <colixer@gmail.com>
Sun, 10 Feb 2019 19:41:06 +0000 (22:41 +0300)
committerMaxim Filippov <colixer@gmail.com>
Wed, 13 Feb 2019 09:59:56 +0000 (12:59 +0300)
lib/pleroma/web/oauth/token.ex
lib/pleroma/web/router.ex
lib/pleroma/web/twitter_api/twitter_api_controller.ex
lib/pleroma/web/twitter_api/views/token_view.ex [new file with mode: 0644]
test/support/factory.ex
test/web/twitter_api/twitter_api_controller_test.exs

index b0bbeeb69d47fcc62fcdb43fe8d5f82dec1a68d6..40bf0ac6b9b6f04854a844c9e90e37e237866dac 100644 (file)
@@ -52,4 +52,12 @@ defmodule Pleroma.Web.OAuth.Token do
     )
     |> Repo.delete_all()
   end
+
+  def get_user_tokens(%User{id: user_id}) do
+    from(
+      t in Pleroma.Web.OAuth.Token,
+      where: t.user_id == ^user_id
+    )
+    |> Repo.all()
+  end
 end
index 5b5627ce84cb20a8a1796de752439e7dd0eb677d..a394900b227018883217ca9b6745c4d2fc28c400 100644 (file)
@@ -389,6 +389,8 @@ defmodule Pleroma.Web.Router do
     get("/qvitter/mutes", TwitterAPI.Controller, :raw_empty_array)
 
     get("/externalprofile/show", TwitterAPI.Controller, :external_profile)
+
+    get("/oauth_tokens", TwitterAPI.Controller, :oauth_tokens)
   end
 
   pipeline :ap_relay do
index c2f0dc2a9e331b361bb1820af6a79e743134f430..1a43e9a60f4ad86a2ffa613e5ea3f254b068bfb0 100644 (file)
@@ -8,6 +8,10 @@ defmodule Pleroma.Web.TwitterAPI.Controller do
   import Pleroma.Web.ControllerHelper, only: [json_response: 3]
 
   alias Ecto.Changeset
+  alias Pleroma.Web.TwitterAPI.{TwitterAPI, UserView, ActivityView, NotificationView, TokenView}
+  alias Pleroma.Web.CommonAPI
+  alias Pleroma.{Repo, Activity, Object, User, Notification}
+  alias Pleroma.Web.OAuth.Token
   alias Pleroma.Web.ActivityPub.ActivityPub
   alias Pleroma.Web.ActivityPub.Utils
   alias Pleroma.Web.CommonAPI
@@ -542,6 +546,14 @@ defmodule Pleroma.Web.TwitterAPI.Controller do
     end
   end
 
+  def oauth_tokens(%{assigns: %{user: user}} = conn, _params) do
+    with oauth_tokens <- Token.get_user_tokens(user) do
+      conn
+      |> put_view(TokenView)
+      |> render("index.json", %{tokens: oauth_tokens})
+    end
+  end
+
   def blocks(%{assigns: %{user: user}} = conn, _params) do
     with blocked_users <- User.blocked_users(user) do
       conn
diff --git a/lib/pleroma/web/twitter_api/views/token_view.ex b/lib/pleroma/web/twitter_api/views/token_view.ex
new file mode 100644 (file)
index 0000000..96b8526
--- /dev/null
@@ -0,0 +1,22 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.TwitterAPI.TokenView do
+  use Pleroma.Web, :view
+
+  def render("index.json", %{tokens: tokens}) do
+    tokens
+    |> render_many(Pleroma.Web.TwitterAPI.TokenView, "show.json")
+    |> Enum.filter(&Enum.any?/1)
+  end
+
+  def render("show.json", %{token: token_entry}) do
+    %{
+      id: token_entry.id,
+      token: token_entry.token,
+      refresh_token: token_entry.refresh_token,
+      valid_until: token_entry.valid_until
+    }
+  end
+end
index 0c21093cef5c3f7c4a8082d29a7f2d49623ffa66..7a91549f5eb687c591035879edf2c7c173c10ba6 100644 (file)
@@ -227,4 +227,17 @@ defmodule Pleroma.Factory do
       unreachable_since: nil
     }
   end
+
+  def oauth_token_factory do
+    user = insert(:user)
+    oauth_app = insert(:oauth_app)
+
+    %Pleroma.Web.OAuth.Token{
+      token: :crypto.strong_rand_bytes(32) |> Base.url_encode64(),
+      refresh_token: :crypto.strong_rand_bytes(32) |> Base.url_encode64(),
+      user_id: user.id,
+      app_id: oauth_app.id,
+      valid_until: NaiveDateTime.add(NaiveDateTime.utc_now(), 60 * 10)
+    }
+  end
 end
index 855ae1526ba9d0edfabafe73724667536f9ad0e3..c50d82def38be4bbd9a255a13575c69de3f1151a 100644 (file)
@@ -1876,4 +1876,22 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
                ActivityRepresenter.to_map(activity, %{user: user, for: user})
     end
   end
+
+  describe "GET /api/oauth_tokens" do
+    test "renders list" do
+      token = insert(:oauth_token)
+
+      response =
+        build_conn()
+        |> assign(:user, Repo.get(User, token.user_id))
+        |> get("/api/oauth_tokens")
+
+      keys =
+        json_response(response, 200)
+        |> hd()
+        |> Map.keys()
+
+      assert keys -- ["id", "refresh_token", "token", "valid_until"] == []
+    end
+  end
 end