diff --git a/lib/rauversion/accounts.ex b/lib/rauversion/accounts.ex index 1f592915..86a5e00e 100644 --- a/lib/rauversion/accounts.ex +++ b/lib/rauversion/accounts.ex @@ -820,4 +820,12 @@ defmodule Rauversion.Accounts do |> Rauversion.Repo.all() |> Repo.preload(:user) end + + def is_child_of?(user, child_user_id) do + from(p in Rauversion.ConnectedAccounts.ConnectedAccount) + |> where(parent_id: ^user.id) + |> where(state: "active") + |> where([c], ^child_user_id == c.user_id) + |> Rauversion.Repo.one() + end end diff --git a/lib/rauversion_web/controllers/label_auth_controller.ex b/lib/rauversion_web/controllers/label_auth_controller.ex new file mode 100644 index 00000000..44552973 --- /dev/null +++ b/lib/rauversion_web/controllers/label_auth_controller.ex @@ -0,0 +1,31 @@ +defmodule RauversionWeb.LabelAuthController do + use RauversionWeb, :controller + alias Rauversion.Accounts + + def add(conn, %{"username" => username}) do + user = Accounts.get_user_by_username(username) + + case RauversionWeb.UserAuth.fetch_current_user(conn, []) do + %{assigns: %{current_user: current_user}} -> + case Rauversion.Accounts.is_child_of?(current_user, user.id) do + %Rauversion.ConnectedAccounts.ConnectedAccount{} = connected_account -> + connected_account = connected_account |> Rauversion.Repo.preload(:user) + + conn + |> RauversionWeb.UserAuth.log_in_user_conn(connected_account.user) + |> put_session(:parent_user, current_user.id) + |> redirect(to: "/#{user.username}") + + _a -> + conn + |> put_flash(:error, gettext("not allowed")) + |> redirect(to: "/#{current_user.username}") + end + + _ -> + conn + |> put_flash(:error, gettext("not allowed")) + |> RauversionWeb.UserAuth.log_in_user(user) + end + end +end diff --git a/lib/rauversion_web/controllers/user_auth.ex b/lib/rauversion_web/controllers/user_auth.ex index 4b1a5365..59e26732 100644 --- a/lib/rauversion_web/controllers/user_auth.ex +++ b/lib/rauversion_web/controllers/user_auth.ex @@ -38,6 +38,19 @@ defmodule RauversionWeb.UserAuth do |> redirect(to: user_return_to || signed_in_path(conn)) end + def log_in_user_conn(conn, user, params \\ %{}) do + token = Accounts.generate_user_session_token(user) + user_return_to = get_session(conn, :user_return_to) + + conn + |> renew_session() + |> put_session(:user_token, token) + |> put_session(:live_socket_id, "users_sessions:#{Base.url_encode64(token)}") + |> maybe_write_remember_me_cookie(token, params) + |> fetch_flash() + |> put_flash(:info, "Logged in successfully.") + end + defp maybe_write_remember_me_cookie(conn, token, %{"remember_me" => "true"}) do put_resp_cookie(conn, @remember_me_cookie, token, @remember_me_options) end diff --git a/lib/rauversion_web/live/profile_live/components/menu_component.ex b/lib/rauversion_web/live/profile_live/components/menu_component.ex index 31c407b2..2aa3e56b 100644 --- a/lib/rauversion_web/live/profile_live/components/menu_component.ex +++ b/lib/rauversion_web/live/profile_live/components/menu_component.ex @@ -30,36 +30,47 @@ defmodule RauversionWeb.ProfileLive.MenuComponent do <%= if @current_user && @current_user.id != @profile.id do %> -