From 751df8b3f33e7834c19e69ff75e197602591128f Mon Sep 17 00:00:00 2001 From: bmanifold Date: Fri, 15 Dec 2023 12:04:13 -0500 Subject: [PATCH] Update styling for Sign In/Up emails (#2907) Updated the styling for the outbound emails from the portal. ## Preview of the Sign Up Email sign_up_email ## Preview of the Sign In Email sign_in_email This will close #2132 --- .../mailer/auth_email/sign_in_link.html.heex | 282 +++++++++++++++--- .../mailer/auth_email/sign_in_link.text.heex | 10 +- .../mailer/auth_email/sign_up_link.html.heex | 240 +++++++++++++-- .../web/controllers/auth_controller_test.exs | 2 +- website/public/images/logo-lockup.png | Bin 0 -> 18871 bytes 5 files changed, 464 insertions(+), 70 deletions(-) create mode 100644 website/public/images/logo-lockup.png diff --git a/elixir/apps/web/lib/web/mailer/auth_email/sign_in_link.html.heex b/elixir/apps/web/lib/web/mailer/auth_email/sign_in_link.html.heex index 6e9acbf58..f614f427b 100644 --- a/elixir/apps/web/lib/web/mailer/auth_email/sign_in_link.html.heex +++ b/elixir/apps/web/lib/web/mailer/auth_email/sign_in_link.html.heex @@ -1,41 +1,241 @@ -

Sign in token

- -

- Dear Firezone user, -

- -
-

- Please copy the token below and paste it into the Firezone application to proceed with - signing in to "<%= @account.name %>": -

- -

- <%= @secret %> -

- -

- or click this link - if you are on the same device where you are trying to sign in. -

- -

- - This email is valid for 15 minutes. - -

-
- -

- If you did not request this action and have received this email in error, you can safely ignore - and discard this email. However, if you continue to receive multiple unsolicited emails of this nature, - we strongly recommend contacting your system administrator to report the issue. -

- -

- Request details: -
Time: <%= @sign_in_token_created_at %> -
IP address: <%= @remote_ip %> -
User Agent: <%= @user_agent %> -
Account ID: <%= @account.id %> -

+ + + + + + + + + + + Firezone Sign In Token + + + +
+
+ + + + +
+ + + + + + + + + + + +
+

+ Finish Signing In! +

+

+ Copy and paste the following token into the Sign In form +

+

+ <%= @secret %> +

+

+ Or click the button below +

+
+ +
+

+ This email will only be valid for 15 minutes +

+
+ ‍ +
+

+ Request Details +

+ + + + + + + + + + + + + + + + + + + + + +
+ Account + <%= @account.name %>
+ Account ID + <%= @account.id %>
+ Time + <%= @sign_in_token_created_at %>
+ IP Address + <%= @remote_ip %>
+ User Agent + <%= @user_agent %>
+

+
+ ‍ +
+

+ If you didn't request this sign in, you can safely ignore this email. However, if you continue to receive multiple unsolicited emails of this nature, + we strongly recommend contacting your system administrator to report the issue. +
+
Thanks,
The Firezone Team +

+
+
+

+ Blazing-fast alternative to legacy VPNs +

+

+ + Docs + + • + + Github + + • + + X + +

+
+
+
+
+ + diff --git a/elixir/apps/web/lib/web/mailer/auth_email/sign_in_link.text.heex b/elixir/apps/web/lib/web/mailer/auth_email/sign_in_link.text.heex index dadbe3d76..7edb69235 100644 --- a/elixir/apps/web/lib/web/mailer/auth_email/sign_in_link.text.heex +++ b/elixir/apps/web/lib/web/mailer/auth_email/sign_in_link.text.heex @@ -1,11 +1,10 @@ -Dear Firezone user, +Finish Signing In! -Please copy the code and paste it into the Firezone application to proceed with -the sign in to "<%= @account.name %>": +Copy and paste the following token into the Sign In form <%= @secret %> -or click on the magic sign-in if you are on the same device where you are trying to sign in: +or click on the following link if you are on the same device where you are trying to sign in: <%= @sign_in_url %> @@ -16,7 +15,8 @@ and discard this email. However, if you continue to receive multiple unsolicited we strongly recommend contacting your system administrator to report the issue. Request details: + Account: <%= @account.name %> + Account ID: <%= @account.id %> Time: <%= @sign_in_token_created_at %> IP address: <%= @remote_ip %> User Agent: <%= @user_agent %> - Account ID: <%= @account.id %> diff --git a/elixir/apps/web/lib/web/mailer/auth_email/sign_up_link.html.heex b/elixir/apps/web/lib/web/mailer/auth_email/sign_up_link.html.heex index 6197a2eac..4ae44d5b9 100644 --- a/elixir/apps/web/lib/web/mailer/auth_email/sign_up_link.html.heex +++ b/elixir/apps/web/lib/web/mailer/auth_email/sign_up_link.html.heex @@ -1,23 +1,217 @@ -

Thank you for signing up for Firezone!

- -
-

You can sign in to your account "<%= @account.name %>" using following link:

- - - <%= @sign_in_form_url %> - -
- -

- If you did not request this action and have received this email in error, you can safely ignore - and discard this email. However, if you continue to receive multiple unsolicited emails of this nature, - we strongly recommend contacting your system administrator to report the issue. -

- -

- Request details: -
IP address: <%= @remote_ip %> -
User Agent: <%= @user_agent %> -
Account ID: <%= @account.id %> -
Account Slug: <%= @account.slug %> -

+ + + + + + + + + + + Welcome to Firezone + + + +
+
+ + + + +
+ + + + + + + + + + + +
+

+ Welcome! +

+

+ Thank you for signing up for Firezone! +

+
+ Sign In to your account by clicking the button below: +

+ +
+ ‍ +
+

+

+ Account Info: +

+ + + + + + + + + + + + + +
+ Account Name + <%= @account.name %>
+ Account Slug + <%= @account.slug %>
+ Sign In URL + + <%= @sign_in_form_url %> +
+

+
+ ‍ +
+

+ If you didn't sign up for Firezone, you can safely ignore this email.
+
Thanks,
The Firezone Team +

+
+

+ Blazing-fast alternative to legacy VPNs +

+

+ + Docs + + • + + Github + + • + + X + +

+
+
+
+
+ + diff --git a/elixir/apps/web/test/web/controllers/auth_controller_test.exs b/elixir/apps/web/test/web/controllers/auth_controller_test.exs index 70e9ae25b..29d0dca42 100644 --- a/elixir/apps/web/test/web/controllers/auth_controller_test.exs +++ b/elixir/apps/web/test/web/controllers/auth_controller_test.exs @@ -473,7 +473,7 @@ defmodule Web.AuthControllerTest do assert_email_sent(fn email -> assert email.subject == "Firezone sign in token" - assert email.text_body =~ "Please copy the code and paste it into" + assert email.text_body =~ "Copy and paste the following token into the Sign In form" end) assert url = redirected_to(conn) diff --git a/website/public/images/logo-lockup.png b/website/public/images/logo-lockup.png new file mode 100644 index 0000000000000000000000000000000000000000..17b856686d990d74c689f3f1402eb5d186d8363b GIT binary patch literal 18871 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 U9u^7Tvkqj4r>mdKI;Vst09IBBh5!Hn literal 0 HcmV?d00001