From 97c8b4c2ea6e8c88091b7e4109ee22c35fcfbe6f Mon Sep 17 00:00:00 2001 From: nelsonic Date: Mon, 4 May 2020 21:16:12 +0100 Subject: [PATCH] [WiP] create verify_email/2 for #63 --- lib/auth/person.ex | 19 ++++- lib/auth_web/controllers/auth_controller.ex | 74 +++++++++++++------ lib/auth_web/router.ex | 3 +- lib/auth_web/templates/auth/index.html.eex | 2 +- .../templates/auth/password-prompt.html.eex | 21 ++++++ 5 files changed, 94 insertions(+), 25 deletions(-) create mode 100644 lib/auth_web/templates/auth/password-prompt.html.eex diff --git a/lib/auth/person.ex b/lib/auth/person.ex index 40e4eafd..4d77912d 100644 --- a/lib/auth/person.ex +++ b/lib/auth/person.ex @@ -69,6 +69,11 @@ defmodule Auth.Person do |> cast(attrs, [:email]) end + def password_prompt_changeset(attrs) do + %Person{} + |> cast(attrs, [:email, :password]) + end + @doc """ `transform_github_profile_data_to_person/1` transforms the profile data received from invoking `ElixirAuthGithub.github_auth/1` @@ -167,9 +172,19 @@ defmodule Auth.Person do # |> IO.inspect(label: "changeset with :email_hash") end + def get_status_verified do + status = Auth.Status.upsert_status("verified") + status.id + end + def put_email_status_verified(changeset) do - status_verified = Auth.Status.upsert_status("verified") - put_change(changeset, :status, status_verified.id) + # IO.inspect(changeset, label: "changeset") + provider = changeset.changes.auth_provider + if provider == "google" or provider == "github" do + put_change(changeset, :status, get_status_verified()) + else + changeset + end end # defp put_pass_hash(changeset) do diff --git a/lib/auth_web/controllers/auth_controller.ex b/lib/auth_web/controllers/auth_controller.ex index d8d86e6e..ad3480a3 100644 --- a/lib/auth_web/controllers/auth_controller.ex +++ b/lib/auth_web/controllers/auth_controller.ex @@ -134,37 +134,69 @@ defmodule AuthWeb.AuthController do IO.inspect(email, label: "email") # email is blank or invalid: if is_nil(email) or not Fields.Validate.email(email) do - conn # re-render the login/register form: + conn # email invalid, re-render the login/register form: |> index(params) else + IO.puts("email is NOT nil: " <> email) + person = Auth.Person.get_person_by_email(email) + IO.inspect(person, label: "person:142") # check if the email exists in the people table: - person = case Auth.Person.get_person_by_email(email) do - person -> - person - nil -> - person = Auth.Person.create_person(%{email: email}) - IO.inspect(person, label: "person:146") - Auth.Email.sendemail(%{ - email: email, - link: make_verify_link(conn, person, state) - }) |> IO.inspect(label: "sendemail") - - person + person = if is_nil(person) do + person = Auth.Person.create_person(%{ + email: email, + auth_provider: "email" + }) + # IO.inspect(person, label: "person:146") + Auth.Email.sendemail(%{ email: email, template: "verify", + link: make_verify_link(conn, person, state), + subject: "Please Verify Your Email Address" + }) + + person + else + person + end + IO.inspect(person, label: "person:156") + if not is_nil(person.status) and person.status == 1 do # verified + conn + |> assign(:action, Routes.auth_path(conn, :login_register_handler)) + |> render("password-prompt.html", + changeset: Auth.Person.password_prompt_changeset(%{email: email}), + state: state, + person_id: AuthWeb.ApikeyController.encrypt_encode(person.id) # hide + ) + else + # respond + conn + |> put_resp_content_type("text/html") + |> send_resp(200, "login_register_handler " <> email) + |> halt() end - IO.inspect(person) - # respond - conn - |> put_resp_content_type("text/html") - |> send_resp(200, "login_register_handler") - |> halt() end end def make_verify_link(conn, person, state) do AuthPlug.Helpers.get_baseurl_from_conn(conn) - <> "/person/verify" + <> "/auth/verify?id=" <> AuthWeb.ApikeyController.encrypt_encode(person.id) - <> "?" <> state + <> "&referer=" <> state + end + + def verify_email(conn, params) do + IO.inspect(params, label: "params:196") + referer = params["referer"] + IO.inspect(referer, label: "referer:198") + person_id = AuthWeb.ApikeyController.decode_decrypt(params["id"]) + IO.inspect(person_id, label: "person_id:190") + + auth_client_id = get_client_id_from_query(conn) + IO.inspect(auth_client_id, label: "auth_client_id:200") + # ref = get_referer(conn) + # IO.inspect(ref, label: "referer:188") + conn + |> put_resp_content_type("text/html") + |> send_resp(200, "verify_email") + |> halt() end diff --git a/lib/auth_web/router.ex b/lib/auth_web/router.ex index f5f3d22f..d800b2d6 100644 --- a/lib/auth_web/router.ex +++ b/lib/auth_web/router.ex @@ -19,7 +19,8 @@ defmodule AuthWeb.Router do get "/", AuthController, :index get "/auth/github/callback", AuthController, :github_handler get "/auth/google/callback", AuthController, :google_handler - post "/people/register", AuthController, :login_register_handler + get "/auth/verify", AuthController, :verify_email + post "/auth/register", AuthController, :login_register_handler end diff --git a/lib/auth_web/templates/auth/index.html.eex b/lib/auth_web/templates/auth/index.html.eex index 2397ae07..7541fcb8 100644 --- a/lib/auth_web/templates/auth/index.html.eex +++ b/lib/auth_web/templates/auth/index.html.eex @@ -64,4 +64,4 @@ - + diff --git a/lib/auth_web/templates/auth/password-prompt.html.eex b/lib/auth_web/templates/auth/password-prompt.html.eex new file mode 100644 index 00000000..fdf5a7e3 --- /dev/null +++ b/lib/auth_web/templates/auth/password-prompt.html.eex @@ -0,0 +1,21 @@ +
+
+

Please Type Your Password:

+ + <%= form_for @changeset, @action, fn f -> %> + <%= password_input f, :password, + class: "db w-100 mt2 pa3 ba b--dark-grey f3"%> + <%= error_tag f, :password %> + + +
+ <%= hidden_input f, :state, id: "state", value: @state %> + + <%= submit "Login", + class: "w-100 pointer ba border-box dwyl-bg-mint white pa3 ml1 mv1 f3 + shadow-hover bg-animate hover-dwyl-teal-darkest no-underline db", + style: "margin:0 auto; border-color: #318d7b;" + %> + <% end %> +
+