Skip to content

Commit 5c18fe1

Browse files
committed
feat: use TOTPs in user signup via /go
1 parent 71bc8c9 commit 5c18fe1

File tree

1 file changed

+8
-34
lines changed

1 file changed

+8
-34
lines changed

lib/algora_web/live/org/dashboard_live.ex

Lines changed: 8 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ defmodule AlgoraWeb.Org.DashboardLive do
9696
|> assign(:show_share_drawer, false)
9797
|> assign(:share_drawer_type, nil)
9898
|> assign(:selected_developer, nil)
99-
|> assign(:secret_code, nil)
99+
|> assign(:secret, nil)
100100
|> assign_login_form(User.login_changeset(%User{}, %{}))
101101
|> assign_payable_bounties()
102102
|> assign_contracts()
@@ -807,15 +807,15 @@ defmodule AlgoraWeb.Org.DashboardLive do
807807

808808
@impl true
809809
def handle_event("send_login_code", %{"user" => %{"email" => email}}, socket) do
810-
code = Nanoid.generate()
810+
{secret, code} = AlgoraWeb.UserAuth.generate_totp()
811811

812812
changeset = User.login_changeset(%User{}, %{})
813813

814-
case send_login_code_to_user(email, code) do
814+
case Accounts.deliver_totp_signup_email(email, code) do
815815
{:ok, _id} ->
816816
{:noreply,
817817
socket
818-
|> assign(:secret_code, code)
818+
|> assign(:secret, secret)
819819
|> assign(:email, email)
820820
|> assign_login_form(changeset)}
821821

@@ -827,7 +827,7 @@ defmodule AlgoraWeb.Org.DashboardLive do
827827

828828
@impl true
829829
def handle_event("send_login_code", %{"user" => %{"login_code" => code}}, socket) do
830-
if Plug.Crypto.secure_compare(String.trim(code), socket.assigns.secret_code) do
830+
if AlgoraWeb.UserAuth.valid_totp?(socket.assigns.secret, String.trim(code)) do
831831
handle =
832832
socket.assigns.email
833833
|> Organizations.generate_handle_from_email()
@@ -1021,32 +1021,6 @@ defmodule AlgoraWeb.Org.DashboardLive do
10211021

10221022
defp page_size, do: 10
10231023

1024-
@from_name "Algora"
1025-
@from_email "[email protected]"
1026-
1027-
defp send_login_code_to_user(email, code) do
1028-
email =
1029-
Email.new()
1030-
|> Email.to(email)
1031-
|> Email.from({@from_name, @from_email})
1032-
|> Email.subject("Login code for Algora")
1033-
|> Email.text_body("""
1034-
Here is your login code for Algora!
1035-
1036-
#{code}
1037-
1038-
If you didn't request this link, you can safely ignore this email.
1039-
1040-
--------------------------------------------------------------------------------
1041-
1042-
For correspondence, please email the Algora founders at [email protected] and [email protected]
1043-
1044-
© 2025 Algora PBC.
1045-
""")
1046-
1047-
Algora.Mailer.deliver(email)
1048-
end
1049-
10501024
defp assign_payable_bounties(socket) do
10511025
org = socket.assigns.current_org
10521026

@@ -1098,7 +1072,7 @@ defmodule AlgoraWeb.Org.DashboardLive do
10981072
defp achievement_todo(%{achievement: %{id: :complete_signup_status}} = assigns) do
10991073
~H"""
11001074
<.simple_form
1101-
:if={!@secret_code}
1075+
:if={!@secret}
11021076
for={@login_form}
11031077
id="send_login_code_form"
11041078
phx-submit="send_login_code"
@@ -1115,7 +1089,7 @@ defmodule AlgoraWeb.Org.DashboardLive do
11151089
</.button>
11161090
</.simple_form>
11171091
<.simple_form
1118-
:if={@secret_code}
1092+
:if={@secret}
11191093
for={@login_form}
11201094
id="send_login_code_form"
11211095
phx-submit="send_login_code"
@@ -1646,7 +1620,7 @@ defmodule AlgoraWeb.Org.DashboardLive do
16461620
<.achievement_todo
16471621
achievement={achievement}
16481622
current_user={@current_user}
1649-
secret_code={@secret_code}
1623+
secret={@secret}
16501624
login_form={@login_form}
16511625
/>
16521626
</li>

0 commit comments

Comments
 (0)