From 093fd1832dd9e8137e28932fe167bcdc7e228366 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Mon, 20 Mar 2017 21:30:44 +0100 Subject: [PATCH] Add Twitter API verify_credentials endpoint. --- lib/pleroma/web/router.ex | 16 ++++++++- .../web/twitter_api/twitter_api_controller.ex | 18 ++++++++++ .../twitter_api/twitter_api_controller_test.exs | 38 ++++++++++++++++++++++ 3 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 lib/pleroma/web/twitter_api/twitter_api_controller.ex create mode 100644 test/web/twitter_api/twitter_api_controller_test.exs diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index e0f1ac12f..83e4253ce 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -1,11 +1,25 @@ defmodule Pleroma.Web.Router do use Pleroma.Web, :router + alias Pleroma.{Repo, User} + + def user_fetcher(username) do + {:ok, Repo.get_by(User, %{nickname: username})} + end + pipeline :api do plug :accepts, ["json"] end + pipeline :authenticated_api do + plug :accepts, ["json"] + plug :fetch_session + plug Pleroma.Plugs.AuthenticationPlug, fetcher: &Pleroma.Web.Router.user_fetcher/1 + end + scope "/api", Pleroma.Web do - pipe_through :api + pipe_through :authenticated_api + + post "/account/verify_credentials.json", TwitterAPI.Controller, :verify_credentials end end diff --git a/lib/pleroma/web/twitter_api/twitter_api_controller.ex b/lib/pleroma/web/twitter_api/twitter_api_controller.ex new file mode 100644 index 000000000..836013cff --- /dev/null +++ b/lib/pleroma/web/twitter_api/twitter_api_controller.ex @@ -0,0 +1,18 @@ +defmodule Pleroma.Web.TwitterAPI.Controller do + use Pleroma.Web, :controller + + alias Pleroma.Web.TwitterAPI.Representers.UserRepresenter + + def verify_credentials(%{assigns: %{user: user}} = conn, _params) do + response = user |> UserRepresenter.to_json + + conn + |> json_reply(200, response) + end + + defp json_reply(conn, status, json) do + conn + |> put_resp_content_type("application/json") + |> send_resp(status, json) + end +end diff --git a/test/web/twitter_api/twitter_api_controller_test.exs b/test/web/twitter_api/twitter_api_controller_test.exs new file mode 100644 index 000000000..118ef932d --- /dev/null +++ b/test/web/twitter_api/twitter_api_controller_test.exs @@ -0,0 +1,38 @@ +defmodule Pleroma.Web.TwitterAPI.ControllerTest do + use Pleroma.Web.ConnCase + alias Pleroma.{User, Repo} + alias Pleroma.Web.TwitterAPI.Representers.UserRepresenter + + describe "POST /api/account/verify_credentials" do + setup [:valid_user] + test "without valid credentials", %{conn: conn} do + conn = post conn, "/api/account/verify_credentials.json" + assert json_response(conn, 403) == %{"error" => "Invalid credentials."} + end + + test "with credentials", %{conn: conn, user: user} do + conn = conn + |> with_credentials(user.nickname, "test") + |> post("/api/account/verify_credentials.json") + + assert json_response(conn, 200) == UserRepresenter.to_map(user) + end + end + + defp valid_user(_context) do + user = %User{ + email: "test@example.org", + name: "Test Name", + nickname: "testname", + password_hash: Comeonin.Pbkdf2.hashpwsalt("test"), + bio: "A tester." + } + user = Repo.insert!(user) + [user: user] + end + + defp with_credentials(conn, username, password) do + header_content = "Basic " <> Base.encode64("#{username}:#{password}") + put_req_header(conn, "authorization", header_content) + end +end