Merge branch 'develop' into openapi/account
authorEgor Kislitsyn <egor@kislitsyn.com>
Mon, 20 Apr 2020 14:37:45 +0000 (18:37 +0400)
committerEgor Kislitsyn <egor@kislitsyn.com>
Mon, 20 Apr 2020 14:40:02 +0000 (18:40 +0400)
1  2 
lib/pleroma/web/activity_pub/activity_pub.ex
lib/pleroma/web/mastodon_api/controllers/account_controller.ex
lib/pleroma/web/twitter_api/twitter_api.ex
mix.exs
mix.lock
test/web/mastodon_api/controllers/account_controller_test.exs

index f72c91c51259f578af4ef5c0f1df26c4b5cd935c,e8e59ac66c06b6f0de5cd5012676785e163f8b09..2c774b694906ddb882aa76d83be04b1cdb485bf3
@@@ -91,19 -93,18 +94,20 @@@ defmodule Pleroma.Web.MastodonAPI.Accou
      params =
        params
        |> Map.take([
 -        "email",
 -        "captcha_solution",
 -        "captcha_token",
 -        "captcha_answer_data",
 -        "token",
 -        "password"
 +        :email,
 +        :bio,
 +        :captcha_solution,
 +        :captcha_token,
 +        :captcha_answer_data,
 +        :token,
 +        :password,
 +        :fullname
        ])
 -      |> Map.put("nickname", nickname)
 -      |> Map.put("fullname", params["fullname"] || nickname)
 -      |> Map.put("bio", params["bio"] || "")
 -      |> Map.put("confirm", params["password"])
 -      |> Map.put("trusted_app", app.trusted)
 +      |> Map.put(:nickname, params.username)
 +      |> Map.put(:fullname, params.fullname || params.username)
 +      |> Map.put(:bio, params.bio || "")
 +      |> Map.put(:confirm, params.password)
++      |> Map.put(:trusted_app, app.trusted)
  
      with :ok <- validate_email_param(params),
           {:ok, user} <- TwitterAPI.register_user(params, need_confirmation: true),
index 37be48b5a138ab1138483bfdd4abe30e6bd161a9,7a1ba6936e3758fe1ebfc259b0f97199a361adc9..cf1d9c74c00ab9f60f1d10e73bb129e99c114430
@@@ -12,44 -12,48 +12,45 @@@ defmodule Pleroma.Web.TwitterAPI.Twitte
    require Pleroma.Constants
  
    def register_user(params, opts \\ []) do
 -    token = params["token"]
 -    trusted_app? = params["trusted_app"]
 +    params =
 +      params
 +      |> Map.take([
 +        :nickname,
 +        :password,
 +        :captcha_solution,
 +        :captcha_token,
 +        :captcha_answer_data,
 +        :token,
-         :email
++        :email,
++        :trusted_app
 +      ])
 +      |> Map.put(:bio, User.parse_bio(params[:bio] || ""))
 +      |> Map.put(:name, params.fullname)
 +      |> Map.put(:password_confirmation, params[:confirm])
  
 -    params = %{
 -      nickname: params["nickname"],
 -      name: params["fullname"],
 -      bio: User.parse_bio(params["bio"]),
 -      email: params["email"],
 -      password: params["password"],
 -      password_confirmation: params["confirm"],
 -      captcha_solution: params["captcha_solution"],
 -      captcha_token: params["captcha_token"],
 -      captcha_answer_data: params["captcha_answer_data"]
 -    }
 +    case validate_captcha(params) do
 +      :ok ->
 +        if Pleroma.Config.get([:instance, :registrations_open]) do
 +          create_user(params, opts)
 +        else
 +          create_user_with_invite(params, opts)
 +        end
  
 -    captcha_enabled = Pleroma.Config.get([Pleroma.Captcha, :enabled])
 -    # true if captcha is disabled or enabled and valid, false otherwise
 -    captcha_ok =
 -      if trusted_app? || not captcha_enabled do
 -        :ok
 -      else
 -        Pleroma.Captcha.validate(
 -          params[:captcha_token],
 -          params[:captcha_solution],
 -          params[:captcha_answer_data]
 -        )
 -      end
 +      {:error, error} ->
 +        # I have no idea how this error handling works
 +        {:error, %{error: Jason.encode!(%{captcha: [error]})}}
 +    end
 +  end
  
 -    # Captcha invalid
 -    if captcha_ok != :ok do
 -      {:error, error} = captcha_ok
 -      # I have no idea how this error handling works
 -      {:error, %{error: Jason.encode!(%{captcha: [error]})}}
 +  defp validate_captcha(params) do
-     if Pleroma.Config.get([Pleroma.Captcha, :enabled]) do
++    if params[:trusted_app] || not Pleroma.Config.get([Pleroma.Captcha, :enabled]) do
++      :ok
+     else
 -      registration_process(
 -        params,
 -        %{
 -          registrations_open: Pleroma.Config.get([:instance, :registrations_open]),
 -          token: token
 -        },
 -        opts
 +      Pleroma.Captcha.validate(
 +        params.captcha_token,
 +        params.captcha_solution,
 +        params.captcha_answer_data
        )
-     else
-       :ok
      end
    end
  
diff --cc mix.exs
Simple merge
diff --cc mix.lock
index cf44dd1ebc3ff89129edcc0150a29aaa6edcd30f,2b9c545486cbf2d8a60ec9512bf72865292ae629..ee9d93bfbb954767e57b8d5a409ce8a5f0507aad
+++ b/mix.lock
    "mogrify": {:hex, :mogrify, "0.6.1", "de1b527514f2d95a7bbe9642eb556061afb337e220cf97adbf3a4e6438ed70af", [:mix], [], "hexpm", "3bc928d817974fa10cc11e6c89b9a9361e37e96dbbf3d868c41094ec05745dcd"},
    "mox": {:hex, :mox, "0.5.1", "f86bb36026aac1e6f924a4b6d024b05e9adbed5c63e8daa069bd66fb3292165b", [:mix], [], "hexpm", "052346cf322311c49a0f22789f3698eea030eec09b8c47367f0686ef2634ae14"},
    "myhtmlex": {:git, "https://git.pleroma.social/pleroma/myhtmlex.git", "ad0097e2f61d4953bfef20fb6abddf23b87111e6", [ref: "ad0097e2f61d4953bfef20fb6abddf23b87111e6", submodules: true]},
-   "nimble_parsec": {:hex, :nimble_parsec, "0.5.1", "c90796ecee0289dbb5ad16d3ad06f957b0cd1199769641c961cfe0b97db190e0", [:mix], [], "hexpm", "00e3ebdc821fb3a36957320d49e8f4bfa310d73ea31c90e5f925dc75e030da8f"},
+   "nimble_parsec": {:hex, :nimble_parsec, "0.5.3", "def21c10a9ed70ce22754fdeea0810dafd53c2db3219a0cd54cf5526377af1c6", [:mix], [], "hexpm", "589b5af56f4afca65217a1f3eb3fee7e79b09c40c742fddc1c312b3ac0b3399f"},
    "nodex": {:git, "https://git.pleroma.social/pleroma/nodex", "cb6730f943cfc6aad674c92161be23a8411f15d1", [ref: "cb6730f943cfc6aad674c92161be23a8411f15d1"]},
    "oban": {:hex, :oban, "1.2.0", "7cca94d341be43d220571e28f69131c4afc21095b25257397f50973d3fc59b07", [:mix], [{:ecto_sql, "~> 3.1", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.14", [hex: :postgrex, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ba5f8b3f7d76967b3e23cf8014f6a13e4ccb33431e4808f036709a7f822362ee"},
 -  "open_api_spex": {:hex, :open_api_spex, "3.6.0", "64205aba9f2607f71b08fd43e3351b9c5e9898ec5ef49fc0ae35890da502ade9", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}, {:poison, "~> 3.1", [hex: :poison, repo: "hexpm", optional: true]}], "hexpm", "126ba3473966277132079cb1d5bf1e3df9e36fe2acd00166e75fd125cecb59c5"},
 +  "open_api_spex": {:git, "https://git.pleroma.social/pleroma/elixir-libraries/open_api_spex.git", "b862ebd78de0df95875cf46feb6e9607130dc2a8", [ref: "b862ebd78de0df95875cf46feb6e9607130dc2a8"]},
    "parse_trans": {:hex, :parse_trans, "3.3.0", "09765507a3c7590a784615cfd421d101aec25098d50b89d7aa1d66646bc571c1", [:rebar3], [], "hexpm", "17ef63abde837ad30680ea7f857dd9e7ced9476cdd7b0394432af4bfc241b960"},
    "pbkdf2_elixir": {:hex, :pbkdf2_elixir, "0.12.4", "8dd29ed783f2e12195d7e0a4640effc0a7c37e6537da491f1db01839eee6d053", [:mix], [], "hexpm", "595d09db74cb093b1903381c9de423276a931a2480a46a1a5dc7f932a2a6375b"},
-   "phoenix": {:hex, :phoenix, "1.4.10", "619e4a545505f562cd294df52294372d012823f4fd9d34a6657a8b242898c255", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 1.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:plug, "~> 1.8.1 or ~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 1.0 or ~> 2.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "256ad7a140efadc3f0290470369da5bd3de985ec7c706eba07c2641b228974be"},
-   "phoenix_ecto": {:hex, :phoenix_ecto, "4.0.0", "c43117a136e7399ea04ecaac73f8f23ee0ffe3e07acfcb8062fe5f4c9f0f6531", [:mix], [{:ecto, "~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.9", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "fe15d9fee5b82f5e64800502011ffe530650d42e1710ae9b14bc4c9be38bf303"},
-   "phoenix_html": {:hex, :phoenix_html, "2.13.3", "850e292ff6e204257f5f9c4c54a8cb1f6fbc16ed53d360c2b780a3d0ba333867", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "8b01b3d6d39731ab18aa548d928b5796166d2500755f553725cfe967bafba7d9"},
+   "phoenix": {:hex, :phoenix, "1.4.13", "67271ad69b51f3719354604f4a3f968f83aa61c19199343656c9caee057ff3b8", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 1.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:plug, "~> 1.8.1 or ~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 1.0 or ~> 2.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ab765a0feddb81fc62e2116c827b5f068df85159c162bee760745276ad7ddc1b"},
+   "phoenix_ecto": {:hex, :phoenix_ecto, "4.1.0", "a044d0756d0464c5a541b4a0bf4bcaf89bffcaf92468862408290682c73ae50d", [:mix], [{:ecto, "~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.9", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "c5e666a341ff104d0399d8f0e4ff094559b2fde13a5985d4cb5023b2c2ac558b"},
+   "phoenix_html": {:hex, :phoenix_html, "2.14.0", "d8c6bc28acc8e65f8ea0080ee05aa13d912c8758699283b8d3427b655aabe284", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "b0bb30eda478a06dbfbe96728061a93833db3861a49ccb516f839ecb08493fbb"},
    "phoenix_pubsub": {:hex, :phoenix_pubsub, "1.1.2", "496c303bdf1b2e98a9d26e89af5bba3ab487ba3a3735f74bf1f4064d2a845a3e", [:mix], [], "hexpm", "1f13f9f0f3e769a667a6b6828d29dec37497a082d195cc52dbef401a9b69bf38"},
    "phoenix_swoosh": {:hex, :phoenix_swoosh, "0.2.0", "a7e0b32077cd6d2323ae15198839b05d9caddfa20663fd85787479e81f89520e", [:mix], [{:phoenix, "~> 1.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.2", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:swoosh, "~> 0.1", [hex: :swoosh, repo: "hexpm", optional: false]}], "hexpm", "ebf1bfa7b3c1c850c04929afe02e2e0d7ab135e0706332c865de03e761676b1f"},
    "plug": {:hex, :plug, "1.9.0", "8d7c4e26962283ff9f8f3347bd73838e2413fbc38b7bb5467d5924f68f3a5a4a", [:mix], [{:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "9902eda2c52ada2a096434682e99a2493f5d06a94d6ac6bcfff9805f952350f1"},
index 133d7f642efb994838fc2520718175c46118054b,61c2697b2d15f8fa2286518cfd217443670130c4..32a9d85a8e35bbe08e05381b9e7ed3d17a792973
@@@ -1020,14 -939,78 +1020,82 @@@ defmodule Pleroma.Web.MastodonAPI.Accou
      end
  
      test "returns forbidden if token is invalid", %{conn: conn, valid_params: valid_params} do
 -      conn = put_req_header(conn, "authorization", "Bearer " <> "invalid-token")
 +      res =
 +        conn
 +        |> put_req_header("authorization", "Bearer " <> "invalid-token")
 +        |> put_req_header("content-type", "multipart/form-data")
 +        |> post("/api/v1/accounts", valid_params)
  
 -      res = post(conn, "/api/v1/accounts", valid_params)
        assert json_response(res, 403) == %{"error" => "Invalid credentials"}
      end
+     test "registration from trusted app" do
+       clear_config([Pleroma.Captcha, :enabled], true)
+       app = insert(:oauth_app, trusted: true, scopes: ["read", "write", "follow", "push"])
+       conn =
+         build_conn()
+         |> post("/oauth/token", %{
+           "grant_type" => "client_credentials",
+           "client_id" => app.client_id,
+           "client_secret" => app.client_secret
+         })
+       assert %{"access_token" => token, "token_type" => "Bearer"} = json_response(conn, 200)
+       response =
+         build_conn()
+         |> Plug.Conn.put_req_header("authorization", "Bearer " <> token)
++        |> put_req_header("content-type", "multipart/form-data")
+         |> post("/api/v1/accounts", %{
+           nickname: "nickanme",
+           agreement: true,
+           email: "email@example.com",
+           fullname: "Lain",
+           username: "Lain",
+           password: "some_password",
+           confirm: "some_password"
+         })
+         |> json_response(200)
+       assert %{
+                "access_token" => access_token,
+                "created_at" => _,
+                "scope" => ["read", "write", "follow", "push"],
+                "token_type" => "Bearer"
+              } = response
+       response =
+         build_conn()
+         |> Plug.Conn.put_req_header("authorization", "Bearer " <> access_token)
+         |> get("/api/v1/accounts/verify_credentials")
+         |> json_response(200)
+       assert %{
+                "acct" => "Lain",
+                "bot" => false,
+                "display_name" => "Lain",
+                "follow_requests_count" => 0,
+                "followers_count" => 0,
+                "following_count" => 0,
+                "locked" => false,
+                "note" => "",
+                "source" => %{
+                  "fields" => [],
+                  "note" => "",
+                  "pleroma" => %{
+                    "actor_type" => "Person",
+                    "discoverable" => false,
+                    "no_rich_text" => false,
+                    "show_role" => true
+                  },
+                  "privacy" => "public",
+                  "sensitive" => false
+                },
+                "statuses_count" => 0,
+                "username" => "Lain"
+              } = response
+     end
    end
  
    describe "create account by app / rate limit" do