From b86e9271f1aec757b29a064fa25cd612b6c1d2b4 Mon Sep 17 00:00:00 2001 From: Hadrien <26697460+ketsapiwiq@users.noreply.github.com> Date: Wed, 11 Nov 2020 16:42:35 +0100 Subject: add post register endpoint + tests --- lib/polyjuice/client/endpoint/post_register.ex | 101 +++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 lib/polyjuice/client/endpoint/post_register.ex (limited to 'lib') diff --git a/lib/polyjuice/client/endpoint/post_register.ex b/lib/polyjuice/client/endpoint/post_register.ex new file mode 100644 index 0000000..df10a8c --- /dev/null +++ b/lib/polyjuice/client/endpoint/post_register.ex @@ -0,0 +1,101 @@ +# Copyright 2019 Hubert Chathi +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +defmodule Polyjuice.Client.Endpoint.PostRegister do + @moduledoc """ + Register a user + + https://matrix.org/docs/spec/client_server/r0.6.1#post-matrix-client-r0-register + """ + + @type t :: %__MODULE__{ + kind: :guest | :user, + auth: %{type: String.t(), session: String.t() | nil}, + username: String.t() | nil, + password: String.t() | nil, + device_id: String.t() | nil, + initial_device_display_name: String.t() | nil, + inhibit_login: boolean() + } + + @enforce_keys [:auth] + defstruct [ + :kind, + :auth, + :username, + :password, + :device_id, + :initial_device_display_name, + :inhibit_login + ] + + defimpl Polyjuice.Client.Endpoint.Proto do + def http_spec(%Polyjuice.Client.Endpoint.PostRegister{ + kind: kind, + auth: auth, + username: username, + password: password, + device_id: device_id, + initial_device_display_name: initial_device_display_name, + inhibit_login: inhibit_login + }) do + body = + [ + if(auth != nil, do: [{"auth", auth}], else: []), + if(username != nil, do: [{"username", username}], else: []), + if(password != nil, do: [{"password", password}], else: []), + if(device_id != nil, do: [{"device_id", device_id}], else: []), + if(inhibit_login != nil, + do: [{"inhibit_login", Atom.to_string(inhibit_login)}], + else: [] + ), + if(initial_device_display_name != nil, + do: [{"initial_device_display_name", initial_device_display_name}], + else: [] + ) + ] + |> Enum.concat() + |> Map.new() + |> Jason.encode_to_iodata!() + + query = [ + kind: + if kind == nil do + "user" + else + Atom.to_string(kind) + end + ] + + Polyjuice.Client.Endpoint.HttpSpec.post( + :r0, + "register", + body: body, + query: query, + auth_required: false + ) + end + + def transform_http_result(req, status_code, resp_headers, body) do + Polyjuice.Client.Endpoint.parse_response(req, status_code, resp_headers, body) + end + end + + # defimpl Polyjuice.Client.Endpoint.BodyParser do + # def parse(_req, parsed) do + # {:ok, Map.get(parsed, "user_id"), Map.get(parsed, "access_token"), + # Map.get(parsed, "device_id")} + # end + # end +end -- cgit v1.2.3 From f2ee1f306ad4b5a7bcc33d8e024b6f155c8bdab6 Mon Sep 17 00:00:00 2001 From: Hadrien <26697460+ketsapiwiq@users.noreply.github.com> Date: Wed, 11 Nov 2020 16:43:57 +0100 Subject: register interface for client and lowlevel --- lib/polyjuice/client.ex | 100 ++++++++++++++++++++++++++++++++++++++ lib/polyjuice/client/low_level.ex | 40 +++++++++++++++ 2 files changed, 140 insertions(+) (limited to 'lib') diff --git a/lib/polyjuice/client.ex b/lib/polyjuice/client.ex index 361914d..54e2670 100644 --- a/lib/polyjuice/client.ex +++ b/lib/polyjuice/client.ex @@ -723,6 +723,106 @@ defmodule Polyjuice.Client do end end + @type register_opts() :: [ + kind: :guest | :user, + username: String.t() | nil, + password: String.t() | nil, + device_id: String.t() | nil, + initial_device_display_name: String.t() | nil, + inhibit_login: boolean() + ] + + @doc """ + Register a user. + + `opts` is a keyword list of options: + + - `username:` (string) the basis for the localpart of the desired Matrix ID + - `password:` (string) the desired password for the account + - `device_id:` (string) the device ID to use + - `initial_device_display_name:` (string) the display name to use for the device + - `inhibit_login:` (boolean) don't login after successful register + - `kind:` (atom) kind of account to register. Defaults to user. One of: ["guest", "user"] + """ + @spec register( + client :: Polyjuice.Client.t(), + opts :: register_opts() + ) :: {:ok, map()} | any + def register(%Polyjuice.Client{} = client, opts \\ []) do + case Polyjuice.Client.API.call( + client, + %Polyjuice.Client.Endpoint.PostRegister{ + auth: %{type: "m.login.dummy"}, + username: Keyword.get(opts, :username), + password: Keyword.get(opts, :password), + kind: Keyword.get(opts, :kind), + device_id: Keyword.get(opts, :device_id), + initial_device_display_name: Keyword.get(opts, :initial_device_display_name), + inhibit_login: Keyword.get(opts, :inhibit_login, false) + } + ) do + ret = + {:ok, + %{"access_token" => access_token, "user_id" => user_id, "device_id" => device_id} = + http_ret} -> + GenServer.cast( + client.pid, + {:set, %{access_token: access_token, user_id: user_id, device_id: device_id}} + ) + + # do not send logged_in event if the inhibit_login option is set to true + unless Keyword.get(opts, :inhibit_login) == true do + if client.opts.storage do + Polyjuice.Client.Storage.kv_put( + client.opts.storage, + "ca.uhoreg.polyjuice", + "access_token", + access_token + ) + + Polyjuice.Client.Storage.kv_put( + client.opts.storage, + "ca.uhoreg.polyjuice", + "user_id", + user_id + ) + + Polyjuice.Client.Storage.kv_put( + client.opts.storage, + "ca.uhoreg.polyjuice", + "device_id", + device_id + ) + end + + if client.opts.handler do + Polyjuice.Client.Handler.handle( + client.opts.handler, + :logged_in, + {user_id, device_id, Map.drop(http_ret, ["user_id", "device_id"])} + ) + end + + if client.opts.sync && client.opts.handler do + # make sure we don't already have a sync process running + kill_sync(client.id) + + supervisor_name = process_name(client.id, :supervisor) + + DynamicSupervisor.start_child( + supervisor_name, + sync_child_spec(client.base_url, client.id, client.pid, client.opts) + ) + end + end + + ret + + ret -> + ret + end + end + @doc false def kill_sync(id) do supervisor_name = process_name(id, :supervisor) diff --git a/lib/polyjuice/client/low_level.ex b/lib/polyjuice/client/low_level.ex index 6a6521d..51a9154 100644 --- a/lib/polyjuice/client/low_level.ex +++ b/lib/polyjuice/client/low_level.ex @@ -212,4 +212,44 @@ defmodule Polyjuice.Client.LowLevel do %Polyjuice.Client.Endpoint.PostLogout{} ) end + + @type register_opts() :: [ + kind: :guest | :user, + username: String.t() | nil, + password: String.t() | nil, + device_id: String.t() | nil, + initial_device_display_name: String.t() | nil, + inhibit_login: boolean() + ] + + @doc """ + Register a user. + + `opts` is a keyword list of options: + + - `username:` (string) the basis for the localpart of the desired Matrix ID + - `password:` (string) the desired password for the account + - `device_id:` (string) the device ID to use + - `initial_device_display_name:` (string) the display name to use for the device + - `inhibit_login:` (boolean) don't login after successful register + - `kind:` (atom) kind of account to register. Defaults to user. One of: ["guest", "user"] + """ + @spec register( + client :: Polyjuice.Client.LowLevel.t(), + opts :: register_opts() + ) :: {:ok, map()} | any + def register(client, opts \\ []) do + Polyjuice.Client.API.call( + client, + %Polyjuice.Client.Endpoint.PostRegister{ + kind: Keyword.get(opts, :kind, :user), + auth: %{type: "m.login.dummy"}, + username: Keyword.get(opts, :username), + password: Keyword.get(opts, :password), + device_id: Keyword.get(opts, :device_id), + initial_device_display_name: Keyword.get(opts, :initial_device_display_name), + inhibit_login: Keyword.get(opts, :inhibit_login, false) + } + ) + end end -- cgit v1.2.3 From 01c79449177f3a6473b3522d6a648f64540922c9 Mon Sep 17 00:00:00 2001 From: Pierre de Lacroix Date: Wed, 3 Mar 2021 18:37:48 +0100 Subject: hotfix to squash --- lib/polyjuice/client.ex | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/polyjuice/client.ex b/lib/polyjuice/client.ex index 54e2670..f027fd0 100644 --- a/lib/polyjuice/client.ex +++ b/lib/polyjuice/client.ex @@ -811,7 +811,13 @@ defmodule Polyjuice.Client do DynamicSupervisor.start_child( supervisor_name, - sync_child_spec(client.base_url, client.id, client.pid, client.opts) + sync_child_spec( + client.base_url, + client.id, + client.pid, + client.hackney_opts, + client.opts + ) ) end end -- cgit v1.2.3