rodauth_phlex 0.1.0.pre1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.rspec +3 -0
- data/.standard.yml +3 -0
- data/CHANGELOG.md +5 -0
- data/CODE_OF_CONDUCT.md +132 -0
- data/LICENSE.txt +21 -0
- data/README.md +90 -0
- data/Rakefile +10 -0
- data/lib/rodauth_phlex/component.rb +15 -0
- data/lib/rodauth_phlex/components/add_recovery_codes.rb +21 -0
- data/lib/rodauth_phlex/components/button.rb +33 -0
- data/lib/rodauth_phlex/components/change_login.rb +22 -0
- data/lib/rodauth_phlex/components/email_auth_request_form.rb +20 -0
- data/lib/rodauth_phlex/components/formatted_field_error.rb +23 -0
- data/lib/rodauth_phlex/components/global_logout_field.rb +20 -0
- data/lib/rodauth_phlex/components/input_field.rb +74 -0
- data/lib/rodauth_phlex/components/login_confirm_field.rb +18 -0
- data/lib/rodauth_phlex/components/login_display.rb +19 -0
- data/lib/rodauth_phlex/components/login_field.rb +18 -0
- data/lib/rodauth_phlex/components/login_form.rb +25 -0
- data/lib/rodauth_phlex/components/login_form_footer.rb +20 -0
- data/lib/rodauth_phlex/components/login_hidden_field.rb +16 -0
- data/lib/rodauth_phlex/components/otp_auth_code_field.rb +22 -0
- data/lib/rodauth_phlex/components/password_confirm_field.rb +18 -0
- data/lib/rodauth_phlex/components/password_field.rb +18 -0
- data/lib/rodauth_phlex/components/recovery_codes.rb +24 -0
- data/lib/rodauth_phlex/components/sms_code_field.rb +22 -0
- data/lib/rodauth_phlex/components/webauthn_autofill.rb +26 -0
- data/lib/rodauth_phlex/components.rb +27 -0
- data/lib/rodauth_phlex/email.rb +23 -0
- data/lib/rodauth_phlex/emails/email_auth_email.rb +21 -0
- data/lib/rodauth_phlex/emails/otp_disabled_email.rb +18 -0
- data/lib/rodauth_phlex/emails/otp_locked_out_email.rb +25 -0
- data/lib/rodauth_phlex/emails/otp_setup_email.rb +18 -0
- data/lib/rodauth_phlex/emails/otp_unlock_failed_email.rb +24 -0
- data/lib/rodauth_phlex/emails/otp_unlocked_email.rb +18 -0
- data/lib/rodauth_phlex/emails/password_changed_email.rb +18 -0
- data/lib/rodauth_phlex/emails/reset_password_email.rb +21 -0
- data/lib/rodauth_phlex/emails/reset_password_notify_email.rb +21 -0
- data/lib/rodauth_phlex/emails/unlock_account_email.rb +21 -0
- data/lib/rodauth_phlex/emails/verify_account_email.rb +20 -0
- data/lib/rodauth_phlex/emails/verify_login_change_email.rb +25 -0
- data/lib/rodauth_phlex/emails/webauthn_authenticator_added_email.rb +19 -0
- data/lib/rodauth_phlex/emails/webauthn_authenticator_removed_email.rb +19 -0
- data/lib/rodauth_phlex/emails.rb +22 -0
- data/lib/rodauth_phlex/feature.rb +71 -0
- data/lib/rodauth_phlex/version.rb +5 -0
- data/lib/rodauth_phlex/view.rb +17 -0
- data/lib/rodauth_phlex/views/change_password.rb +25 -0
- data/lib/rodauth_phlex/views/close_account.rb +20 -0
- data/lib/rodauth_phlex/views/confirm_password.rb +20 -0
- data/lib/rodauth_phlex/views/create_account.rb +23 -0
- data/lib/rodauth_phlex/views/email_auth.rb +19 -0
- data/lib/rodauth_phlex/views/login.rb +17 -0
- data/lib/rodauth_phlex/views/logout.rb +19 -0
- data/lib/rodauth_phlex/views/multi_phase_login.rb +17 -0
- data/lib/rodauth_phlex/views/otp_auth.rb +21 -0
- data/lib/rodauth_phlex/views/otp_disable.rb +20 -0
- data/lib/rodauth_phlex/views/otp_setup.rb +39 -0
- data/lib/rodauth_phlex/views/otp_unlock.rb +24 -0
- data/lib/rodauth_phlex/views/otp_unlock_not_available.rb +23 -0
- data/lib/rodauth_phlex/views/recovery_auth.rb +23 -0
- data/lib/rodauth_phlex/views/remember.rb +33 -0
- data/lib/rodauth_phlex/views/reset_password.rb +21 -0
- data/lib/rodauth_phlex/views/reset_password_request.rb +25 -0
- data/lib/rodauth_phlex/views/sms_auth.rb +20 -0
- data/lib/rodauth_phlex/views/sms_confirm.rb +20 -0
- data/lib/rodauth_phlex/views/sms_disable.rb +20 -0
- data/lib/rodauth_phlex/views/sms_request.rb +19 -0
- data/lib/rodauth_phlex/views/sms_setup.rb +30 -0
- data/lib/rodauth_phlex/views/two_factor_auth.rb +19 -0
- data/lib/rodauth_phlex/views/two_factor_disable.rb +20 -0
- data/lib/rodauth_phlex/views/two_factor_manage.rb +28 -0
- data/lib/rodauth_phlex/views/unlock_account.rb +21 -0
- data/lib/rodauth_phlex/views/unlock_account_request.rb +21 -0
- data/lib/rodauth_phlex/views/verify_account.rb +21 -0
- data/lib/rodauth_phlex/views/verify_account_resend.rb +25 -0
- data/lib/rodauth_phlex/views/verify_login_change.rb +19 -0
- data/lib/rodauth_phlex/views/webauthn_auth.rb +27 -0
- data/lib/rodauth_phlex/views/webauthn_remove.rb +33 -0
- data/lib/rodauth_phlex/views/webauthn_setup.rb +28 -0
- data/lib/rodauth_phlex/views.rb +39 -0
- data/lib/rodauth_phlex.rb +13 -0
- metadata +162 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RodauthPhlex::Components
|
|
4
|
+
# This is a Phlex version of the Rodauth template:
|
|
5
|
+
# https://github.com/jeremyevans/rodauth/blob/2.37.0/templates/password-confirm-field.str
|
|
6
|
+
#
|
|
7
|
+
# Copyright (c) 2024 Robert Schulze
|
|
8
|
+
# Copyright (c) 2015-2023 Jeremy Evans
|
|
9
|
+
# MIT License
|
|
10
|
+
class PasswordConfirmField < RodauthPhlex::Component
|
|
11
|
+
def view_template
|
|
12
|
+
div(class: "form-group mb-3") do
|
|
13
|
+
label(for: "password-confirm", class: "form-label") { "#{rodauth.password_confirm_label}#{rodauth.input_field_label_suffix}" }
|
|
14
|
+
InputField(rodauth, rodauth.password_confirm_param, "password-confirm", type: "password", autocomplete: "new-password")
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RodauthPhlex::Components
|
|
4
|
+
# This is a Phlex version of the Rodauth template:
|
|
5
|
+
# https://github.com/jeremyevans/rodauth/blob/2.37.0/templates/password-field.str
|
|
6
|
+
#
|
|
7
|
+
# Copyright (c) 2024 Robert Schulze
|
|
8
|
+
# Copyright (c) 2015-2023 Jeremy Evans
|
|
9
|
+
# MIT License
|
|
10
|
+
class PasswordField < RodauthPhlex::Component
|
|
11
|
+
def view_template
|
|
12
|
+
div(class: "form-group mb-3") do
|
|
13
|
+
label(for: "password", class: "form-label") { "#{rodauth.password_label}#{rodauth.input_field_label_suffix}" }
|
|
14
|
+
InputField(rodauth, rodauth.password_param, "password", type: "password", autocomplete: rodauth.password_field_autocomplete_value)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RodauthPhlex::Components
|
|
4
|
+
class RecoveryCodes < RodauthPhlex::Component
|
|
5
|
+
# This is a Phlex version of the Rodauth template:
|
|
6
|
+
# https://github.com/jeremyevans/rodauth/blob/2.37.0/templates/recovery-codes.str
|
|
7
|
+
#
|
|
8
|
+
# Copyright (c) 2024 Robert Schulze
|
|
9
|
+
# Copyright (c) 2015-2023 Jeremy Evans
|
|
10
|
+
# MIT License
|
|
11
|
+
def view_template
|
|
12
|
+
form(method: "post", class: "rodauth", role: "form", id: "recovery-codes-form") do
|
|
13
|
+
safe_html rodauth.recovery_codes_additional_form_tags
|
|
14
|
+
safe_html rodauth.csrf_tag
|
|
15
|
+
PasswordField(rodauth) if rodauth.two_factor_modifications_require_password?
|
|
16
|
+
Button(
|
|
17
|
+
rodauth,
|
|
18
|
+
rodauth.recovery_codes_button || rodauth.view_recovery_codes_button,
|
|
19
|
+
name: (rodauth.add_recovery_codes_param if rodauth.recovery_codes_button)
|
|
20
|
+
)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RodauthPhlex::Components
|
|
4
|
+
# This is a Phlex version of the Rodauth template:
|
|
5
|
+
# https://github.com/jeremyevans/rodauth/blob/2.37.0/templates/sms-code-field.str
|
|
6
|
+
#
|
|
7
|
+
# Copyright (c) 2024 Robert Schulze
|
|
8
|
+
# Copyright (c) 2015-2023 Jeremy Evans
|
|
9
|
+
# MIT License
|
|
10
|
+
class SmsCodeField < RodauthPhlex::Component
|
|
11
|
+
def view_template
|
|
12
|
+
div(class: "form-group mb-3") do
|
|
13
|
+
label(for: "sms-code", class: "form-label") { "#{rodauth.sms_code_label}#{rodauth.input_field_label_suffix}" }
|
|
14
|
+
div(class: "row") do
|
|
15
|
+
div(class: "col-sm-3") do
|
|
16
|
+
InputField(rodauth, rodauth.sms_code_param, "sms-code", value: "", autocomplete: "one-time-code", inputmode: "numeric")
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RodauthPhlex::Components
|
|
4
|
+
# This is a Phlex version of the Rodauth template:
|
|
5
|
+
# https://github.com/jeremyevans/rodauth/blob/2.37.0/templates/webauthn-autofill.str
|
|
6
|
+
#
|
|
7
|
+
# Copyright (c) 2024 Robert Schulze
|
|
8
|
+
# Copyright (c) 2015-2023 Jeremy Evans
|
|
9
|
+
# MIT License
|
|
10
|
+
class WebauthnAutofill < RodauthPhlex::Component
|
|
11
|
+
def view_template
|
|
12
|
+
cred = rodauth.webauthn_credential_options_for_get
|
|
13
|
+
|
|
14
|
+
form(method: "post", action: rodauth.webauthn_login_path, class: "rodauth", role: "form", id: "webauthn-login-form", "data-credential-options": cred.as_json.to_json) do
|
|
15
|
+
safe_html rodauth.webauthn_auth_additional_form_tags
|
|
16
|
+
safe_html rodauth.csrf_tag(rodauth.webauthn_login_path)
|
|
17
|
+
input(type: "hidden", name: rodauth.webauthn_auth_challenge_param, value: cred.challenge)
|
|
18
|
+
input(type: "hidden", name: rodauth.webauthn_auth_challenge_hmac_param, value: rodauth.compute_hmac(cred.challenge))
|
|
19
|
+
input(class: "rodauth_hidden d-none", "aria-hidden": "true", type: "text", name: rodauth.webauthn_auth_param, id: "webauthn-auth", value: "")
|
|
20
|
+
Button(rodauth, rodauth.webauthn_auth_button, class: "d-none")
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
script(src: "#{rodauth.webauthn_js_host}#{rodauth.webauthn_autofill_js_path}")
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module RodauthPhlex
|
|
2
|
+
autoload :Component, "rodauth_phlex/component"
|
|
3
|
+
|
|
4
|
+
module Components
|
|
5
|
+
extend Phlex::Kit
|
|
6
|
+
|
|
7
|
+
autoload :AddRecoveryCodes, "rodauth_phlex/components/add_recovery_codes"
|
|
8
|
+
autoload :Button, "rodauth_phlex/components/button"
|
|
9
|
+
autoload :ChangeLogin, "rodauth_phlex/components/change_login"
|
|
10
|
+
autoload :EmailAuthRequestForm, "rodauth_phlex/components/email_auth_request_form"
|
|
11
|
+
autoload :FormattedFieldError, "rodauth_phlex/components/formatted_field_error"
|
|
12
|
+
autoload :GlobalLogoutField, "rodauth_phlex/components/global_logout_field"
|
|
13
|
+
autoload :InputField, "rodauth_phlex/components/input_field"
|
|
14
|
+
autoload :LoginConfirmField, "rodauth_phlex/components/login_confirm_field"
|
|
15
|
+
autoload :LoginDisplay, "rodauth_phlex/components/login_display"
|
|
16
|
+
autoload :LoginField, "rodauth_phlex/components/login_field"
|
|
17
|
+
autoload :LoginForm, "rodauth_phlex/components/login_form"
|
|
18
|
+
autoload :LoginFormFooter, "rodauth_phlex/components/login_form_footer"
|
|
19
|
+
autoload :LoginHiddenField, "rodauth_phlex/components/login_hidden_field"
|
|
20
|
+
autoload :OtpAuthCodeField, "rodauth_phlex/components/otp_auth_code_field"
|
|
21
|
+
autoload :PasswordConfirmField, "rodauth_phlex/components/password_confirm_field"
|
|
22
|
+
autoload :PasswordField, "rodauth_phlex/components/password_field"
|
|
23
|
+
autoload :RecoveryCodes, "rodauth_phlex/components/recovery_codes"
|
|
24
|
+
autoload :SmsCodeField, "rodauth_phlex/components/sms_code_field"
|
|
25
|
+
autoload :WebauthnAutofill, "rodauth_phlex/components/webauthn_autofill"
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RodauthPhlex
|
|
4
|
+
class Email < Phlex::SGML # TODO: change to "Phlex::Plain" when available
|
|
5
|
+
include RodauthPhlex::Components
|
|
6
|
+
|
|
7
|
+
def initialize(rodauth)
|
|
8
|
+
@rodauth = rodauth
|
|
9
|
+
end
|
|
10
|
+
attr_reader :rodauth
|
|
11
|
+
|
|
12
|
+
LF = "\n"
|
|
13
|
+
CRLF = "\r\n"
|
|
14
|
+
|
|
15
|
+
def lines(*str, ending: LF)
|
|
16
|
+
raw(safe(str.join(ending)))
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def line(*str, seperator: " ")
|
|
20
|
+
raw(safe(str.join(seperator)))
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RodauthPhlex::Emails
|
|
4
|
+
# This is a Phlex version of the Rodauth template:
|
|
5
|
+
# https://github.com/jeremyevans/rodauth/blob/2.37.0/templates/email-auth-email.str
|
|
6
|
+
#
|
|
7
|
+
# Copyright (c) 2024 Robert Schulze
|
|
8
|
+
# Copyright (c) 2015-2023 Jeremy Evans
|
|
9
|
+
# MIT License
|
|
10
|
+
class EmailAuthEmail < RodauthPhlex::Email
|
|
11
|
+
def body
|
|
12
|
+
lines(
|
|
13
|
+
"Someone has requested a login link for the account with this email",
|
|
14
|
+
"address. If you did not request a login link, please ignore this",
|
|
15
|
+
"message. If you requested a login link, please go to",
|
|
16
|
+
rodauth.email_auth_email_link,
|
|
17
|
+
"to login to this account."
|
|
18
|
+
)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RodauthPhlex::Emails
|
|
4
|
+
# This is a Phlex version of the Rodauth template:
|
|
5
|
+
# https://github.com/jeremyevans/rodauth/blob/2.37.0/templates/otp-disabled-email.str
|
|
6
|
+
#
|
|
7
|
+
# Copyright (c) 2024 Robert Schulze
|
|
8
|
+
# Copyright (c) 2015-2023 Jeremy Evans
|
|
9
|
+
# MIT License
|
|
10
|
+
class OtpDisabledEmail < RodauthPhlex::Email
|
|
11
|
+
def body
|
|
12
|
+
lines(
|
|
13
|
+
"Someone (hopefully you) has disabled TOTP authentication for the account",
|
|
14
|
+
"associated to this email address."
|
|
15
|
+
)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RodauthPhlex::Emails
|
|
4
|
+
# This is a Phlex version of the Rodauth template:
|
|
5
|
+
# https://github.com/jeremyevans/rodauth/blob/2.37.0/templates/otp-locked-out-email.str
|
|
6
|
+
#
|
|
7
|
+
# Copyright (c) 2024 Robert Schulze
|
|
8
|
+
# Copyright (c) 2015-2023 Jeremy Evans
|
|
9
|
+
# MIT License
|
|
10
|
+
class OtpLockedOutEmail < RodauthPhlex::Email
|
|
11
|
+
def view_template
|
|
12
|
+
lines(
|
|
13
|
+
"TOTP authentication has been locked out on your account due to too many",
|
|
14
|
+
"consecutive authentication failures. You can attempt to unlock TOTP",
|
|
15
|
+
"authentication for your account by consecutively authenticating via",
|
|
16
|
+
"TOTP multiple times.",
|
|
17
|
+
"",
|
|
18
|
+
"If you did not initiate the TOTP authentication failures that",
|
|
19
|
+
"caused TOTP authentication to be locked out, that means someone already",
|
|
20
|
+
"has partial access to your account, but is unable to use TOTP",
|
|
21
|
+
"authentication to fully authenticate themselves."
|
|
22
|
+
)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RodauthPhlex::Emails
|
|
4
|
+
# This is a Phlex version of the Rodauth template:
|
|
5
|
+
# https://github.com/jeremyevans/rodauth/blob/2.37.0/templates/otp-setup-email.str
|
|
6
|
+
#
|
|
7
|
+
# Copyright (c) 2024 Robert Schulze
|
|
8
|
+
# Copyright (c) 2015-2023 Jeremy Evans
|
|
9
|
+
# MIT License
|
|
10
|
+
class OtpSetupEmail < RodauthPhlex::Email
|
|
11
|
+
def view_template
|
|
12
|
+
lines(
|
|
13
|
+
"Someone (hopefully you) has setup TOTP authentication for the account",
|
|
14
|
+
"associated to this email address."
|
|
15
|
+
)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RodauthPhlex::Emails
|
|
4
|
+
# This is a Phlex version of the Rodauth template:
|
|
5
|
+
# https://github.com/jeremyevans/rodauth/blob/2.37.0/templates/otp-unlock-failed-email.str
|
|
6
|
+
#
|
|
7
|
+
# Copyright (c) 2024 Robert Schulze
|
|
8
|
+
# Copyright (c) 2015-2023 Jeremy Evans
|
|
9
|
+
# MIT License
|
|
10
|
+
class OtpSetupEmail < RodauthPhlex::Email
|
|
11
|
+
def view_template
|
|
12
|
+
lines(
|
|
13
|
+
"Someone (hopefully you) attempted to unlock TOTP authentication for the",
|
|
14
|
+
"account associated to this email address, but failed as the",
|
|
15
|
+
"authentication code submitted was not correct.",
|
|
16
|
+
"",
|
|
17
|
+
"If you did not initiate the TOTP authentication failure that generated",
|
|
18
|
+
"this email, that means someone already has partial access to your",
|
|
19
|
+
"account, but is unable to use TOTP authentication to fully authenticate",
|
|
20
|
+
"themselves."
|
|
21
|
+
)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RodauthPhlex::Emails
|
|
4
|
+
# This is a Phlex version of the Rodauth template:
|
|
5
|
+
# https://github.com/jeremyevans/rodauth/blob/2.37.0/templates/otp-unlocked-email.str
|
|
6
|
+
#
|
|
7
|
+
# Copyright (c) 2024 Robert Schulze
|
|
8
|
+
# Copyright (c) 2015-2023 Jeremy Evans
|
|
9
|
+
# MIT License
|
|
10
|
+
class OtpUnlockedEmail < RodauthPhlex::Email
|
|
11
|
+
def view_template
|
|
12
|
+
lines(
|
|
13
|
+
"Someone (hopefully you) has reset the password for the account",
|
|
14
|
+
"associated to this email address."
|
|
15
|
+
)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RodauthPhlex::Emails
|
|
4
|
+
# This is a Phlex version of the Rodauth template:
|
|
5
|
+
# https://github.com/jeremyevans/rodauth/blob/2.37.0/templates/password-changed-email.str
|
|
6
|
+
#
|
|
7
|
+
# Copyright (c) 2024 Robert Schulze
|
|
8
|
+
# Copyright (c) 2015-2023 Jeremy Evans
|
|
9
|
+
# MIT License
|
|
10
|
+
class PasswordChangedEmail < RodauthPhlex::Email
|
|
11
|
+
def body
|
|
12
|
+
lines(
|
|
13
|
+
"Someone (hopefully you) has changed the password for the account",
|
|
14
|
+
"associated to this email address."
|
|
15
|
+
)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RodauthPhlex::Emails
|
|
4
|
+
# This is a Phlex version of the Rodauth template:
|
|
5
|
+
# https://github.com/jeremyevans/rodauth/blob/2.37.0/templates/reset-password-email.str
|
|
6
|
+
#
|
|
7
|
+
# Copyright (c) 2024 Robert Schulze
|
|
8
|
+
# Copyright (c) 2015-2023 Jeremy Evans
|
|
9
|
+
# MIT License
|
|
10
|
+
class ResetPasswordEmail < RodauthPhlex::Email
|
|
11
|
+
def body
|
|
12
|
+
lines(
|
|
13
|
+
"Someone has requested a password reset for the account with this email",
|
|
14
|
+
"address. If you did not request a password reset, please ignore this",
|
|
15
|
+
"message. If you requested a password reset, please go to",
|
|
16
|
+
rodauth.reset_password_email_link,
|
|
17
|
+
"to reset the password for the account."
|
|
18
|
+
)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RodauthPhlex::Emails
|
|
4
|
+
# This is a Phlex version of the Rodauth template:
|
|
5
|
+
# https://github.com/jeremyevans/rodauth/blob/2.37.0/templates/reset-password-notify-email.str
|
|
6
|
+
#
|
|
7
|
+
# Copyright (c) 2024 Robert Schulze
|
|
8
|
+
# Copyright (c) 2015-2023 Jeremy Evans
|
|
9
|
+
# MIT License
|
|
10
|
+
class ResetPasswordNotifyEmail < RodauthPhlex::Email
|
|
11
|
+
def view_template
|
|
12
|
+
lines(
|
|
13
|
+
"Someone has requested that the account with this email be unlocked.",
|
|
14
|
+
"If you did not request the unlocking of this account, please ignore this",
|
|
15
|
+
"message. If you requested the unlocking of this account, please go to",
|
|
16
|
+
rodauth.unlock_account_email_link,
|
|
17
|
+
"to unlock this account."
|
|
18
|
+
)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RodauthPhlex::Emails
|
|
4
|
+
# This is a Phlex version of the Rodauth template:
|
|
5
|
+
# https://github.com/jeremyevans/rodauth/blob/2.37.0/templates/unlock-account-email.str
|
|
6
|
+
#
|
|
7
|
+
# Copyright (c) 2024 Robert Schulze
|
|
8
|
+
# Copyright (c) 2015-2023 Jeremy Evans
|
|
9
|
+
# MIT License
|
|
10
|
+
class UnlockAccountEmail < RodauthPhlex::Email
|
|
11
|
+
def view_template
|
|
12
|
+
lines(
|
|
13
|
+
"Someone has requested that the account with this email be unlocked.",
|
|
14
|
+
"If you did not request the unlocking of this account, please ignore this",
|
|
15
|
+
"message. If you requested the unlocking of this account, please go to",
|
|
16
|
+
rodauth.unlock_account_email_link,
|
|
17
|
+
"to unlock this account."
|
|
18
|
+
)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RodauthPhlex::Emails
|
|
4
|
+
# This is a Phlex version of the Rodauth template:
|
|
5
|
+
# https://github.com/jeremyevans/rodauth/blob/2.37.0/templates/verify-account-email.str
|
|
6
|
+
#
|
|
7
|
+
# Copyright (c) 2024 Robert Schulze
|
|
8
|
+
# Copyright (c) 2015-2023 Jeremy Evans
|
|
9
|
+
# MIT License
|
|
10
|
+
class VerifyAccountEmail < RodauthPhlex::Email
|
|
11
|
+
def view_template
|
|
12
|
+
lines(
|
|
13
|
+
"Someone has created an account with this email address. If you did not create",
|
|
14
|
+
"this account, please ignore this message. If you created this account, please go to",
|
|
15
|
+
rodauth.verify_account_email_link,
|
|
16
|
+
"to verify the account."
|
|
17
|
+
)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RodauthPhlex::Emails
|
|
4
|
+
# This is a Phlex version of the Rodauth template:
|
|
5
|
+
# https://github.com/jeremyevans/rodauth/blob/2.37.0/templates/verify-login-change-email.str
|
|
6
|
+
#
|
|
7
|
+
# Copyright (c) 2024 Robert Schulze
|
|
8
|
+
# Copyright (c) 2015-2023 Jeremy Evans
|
|
9
|
+
# MIT License
|
|
10
|
+
class VerifyLoginChangeEmail < RodauthPhlex::Email
|
|
11
|
+
def view_template
|
|
12
|
+
lines(
|
|
13
|
+
"Someone with an account has requested their login be changed to this email address:",
|
|
14
|
+
"",
|
|
15
|
+
"Old Login: #{rodauth.verify_login_change_old_login}",
|
|
16
|
+
"New Login: #{rodauth.verify_login_change_new_login}",
|
|
17
|
+
"",
|
|
18
|
+
"If you did not request this login change, please ignore this message. If you",
|
|
19
|
+
"requested this login change, please go to",
|
|
20
|
+
rodauth.verify_login_change_email_link,
|
|
21
|
+
"to verify the login change."
|
|
22
|
+
)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RodauthPhlex::Emails
|
|
4
|
+
# This is a Phlex version of the Rodauth template:
|
|
5
|
+
# https://github.com/jeremyevans/rodauth/blob/2.37.0/templates/webauthn-authenticator-added-email.str
|
|
6
|
+
#
|
|
7
|
+
# Copyright (c) 2024 Robert Schulze
|
|
8
|
+
# Copyright (c) 2015-2023 Jeremy Evans
|
|
9
|
+
# MIT License
|
|
10
|
+
class WebauthnAuthenticatorAddedEmail < RodauthPhlex::Email
|
|
11
|
+
def view_template
|
|
12
|
+
lines(
|
|
13
|
+
"Someone (hopefully you) has added a WebAuthn authenticator to the",
|
|
14
|
+
"account associated to this email address. There are now #{rodauth.account_webauthn_ids.length} WebAuthn",
|
|
15
|
+
"authenticator(s) with access to the account."
|
|
16
|
+
)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RodauthPhlex::Emails
|
|
4
|
+
# This is a Phlex version of the Rodauth template:
|
|
5
|
+
# https://github.com/jeremyevans/rodauth/blob/2.37.0/templates/webauthn-authenticator-removed-email.str
|
|
6
|
+
#
|
|
7
|
+
# Copyright (c) 2024 Robert Schulze
|
|
8
|
+
# Copyright (c) 2015-2023 Jeremy Evans
|
|
9
|
+
# MIT License
|
|
10
|
+
class WebauthnAuthenticatorRemovedEmail < RodauthPhlex::Email
|
|
11
|
+
def view_template
|
|
12
|
+
lines(
|
|
13
|
+
"Someone (hopefully you) has removed a WebAuthn authenticator from the",
|
|
14
|
+
"account associated to this email address. There are now #{rodauth.account_webauthn_ids.length} WebAuthn",
|
|
15
|
+
"authenticator(s) with access to the account."
|
|
16
|
+
)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RodauthPhlex
|
|
4
|
+
autoload :Email, "rodauth_phlex/email"
|
|
5
|
+
|
|
6
|
+
module Emails
|
|
7
|
+
autoload :EmailAuthEmail, "rodauth_phlex/emails/email_auth_email"
|
|
8
|
+
autoload :OtpDisabledEmail, "rodauth_phlex/emails/otp_disabled_email"
|
|
9
|
+
autoload :OtpLockedOutEmail, "rodauth_phlex/emails/otp_locked_out_email"
|
|
10
|
+
autoload :OtpSetupEmail, "rodauth_phlex/emails/otp_setup_email"
|
|
11
|
+
autoload :OtpUnlockFailedEmail, "rodauth_phlex/emails/otp_unlock_failed_email"
|
|
12
|
+
autoload :OtpUnlockedEmail, "rodauth_phlex/emails/otp_unlocked_email"
|
|
13
|
+
autoload :PasswordChangedEmail, "rodauth_phlex/emails/password_changed_email"
|
|
14
|
+
autoload :ResetPasswordEmail, "rodauth_phlex/emails/reset_password_email"
|
|
15
|
+
autoload :ResetPasswordNotifyEmail, "rodauth_phlex/emails/reset_password_notify_email"
|
|
16
|
+
autoload :UnlockAccountEmail, "rodauth_phlex/emails/unlock_account_email"
|
|
17
|
+
autoload :VerifyAccountEmail, "rodauth_phlex/emails/verify_account_email"
|
|
18
|
+
autoload :VerifyLoginChangeEmail, "rodauth_phlex/emails/verify_login_change_email"
|
|
19
|
+
autoload :WebauthnAuthenticatorAddedEmail, "rodauth_phlex/emails/webauthn_authenticator_added_email"
|
|
20
|
+
autoload :WebauthnAuthenticatorRemovedEmail, "rodauth_phlex/emails/webauthn_authenticator_removed_email"
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
module Rodauth
|
|
2
|
+
Feature.define(:phlex, :RodauthPhlex) do
|
|
3
|
+
auth_value_method :phlex_views_namespace, "RodauthPhlex::Views"
|
|
4
|
+
auth_value_method :phlex_components_namespace, "RodauthPhlex::Components"
|
|
5
|
+
auth_value_method :phlex_emails_namespace, "RodauthPhlex::Emails"
|
|
6
|
+
|
|
7
|
+
auth_value_method :phlex_layout_class, RodauthPhlex::Undefined
|
|
8
|
+
auth_value_method :phlex_layout_title_key, :title
|
|
9
|
+
auth_methods(
|
|
10
|
+
:phlex_set_page_title,
|
|
11
|
+
:phlex_classify_page
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
# render a view
|
|
15
|
+
def view(page, title)
|
|
16
|
+
if (layout = phlex_layout_class) != RodauthPhlex::Undefined
|
|
17
|
+
scope.phlex_layout(layout)
|
|
18
|
+
end
|
|
19
|
+
scope.phlex_layout_opts(phlex_set_page_title(title, scope.phlex_layout_opts))
|
|
20
|
+
scope.phlex(phlex_view(page, :view))
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Render a component.
|
|
24
|
+
# Falls back to rendering a view if the component is not defined
|
|
25
|
+
def render(page)
|
|
26
|
+
scope.phlex_layout(false)
|
|
27
|
+
|
|
28
|
+
orig_error = nil
|
|
29
|
+
mode = :render
|
|
30
|
+
phlex_view =
|
|
31
|
+
begin
|
|
32
|
+
self.phlex_view(page, mode)
|
|
33
|
+
rescue NameError => e
|
|
34
|
+
raise orig_error if orig_error
|
|
35
|
+
|
|
36
|
+
orig_error = e
|
|
37
|
+
mode = :view
|
|
38
|
+
retry
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
warn "The page #{page} is not defined in the #{phlex_components_namespace} namespace. Using #{phlex_view} as fallback. Please create a component for it." if mode == :view
|
|
42
|
+
scope.phlex(phlex_view)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
private def phlex_view(page, mode)
|
|
46
|
+
klass = phlex_classify_page(page, mode)
|
|
47
|
+
klass.new(scope.rodauth)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def phlex_set_page_title(title, opts)
|
|
51
|
+
key = phlex_layout_title_key
|
|
52
|
+
|
|
53
|
+
if opts
|
|
54
|
+
opts[key] = title if key
|
|
55
|
+
opts
|
|
56
|
+
else
|
|
57
|
+
key ? {key => title} : {}
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def phlex_classify_page(page_name, mode)
|
|
62
|
+
klass_name = page_name.split(/(?:_|-)/).map(&:capitalize).join
|
|
63
|
+
mod_name = if page_name.end_with?("-email")
|
|
64
|
+
phlex_emails_namespace
|
|
65
|
+
else
|
|
66
|
+
(mode == :render) ? phlex_components_namespace : phlex_views_namespace
|
|
67
|
+
end
|
|
68
|
+
Object.const_get("#{mod_name}::#{klass_name}")
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RodauthPhlex
|
|
4
|
+
class View < Phlex::HTML
|
|
5
|
+
include RodauthPhlex::Components
|
|
6
|
+
|
|
7
|
+
def initialize(rodauth)
|
|
8
|
+
@rodauth = rodauth
|
|
9
|
+
end
|
|
10
|
+
attr_reader :rodauth
|
|
11
|
+
|
|
12
|
+
# only to be used for rodauth html helper method output
|
|
13
|
+
def safe_html(str)
|
|
14
|
+
raw(safe(str)) if str
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RodauthPhlex::Views
|
|
4
|
+
# This is a Phlex version of the Rodauth template:
|
|
5
|
+
# https://github.com/jeremyevans/rodauth/blob/2.37.0/templates/change-password.str
|
|
6
|
+
#
|
|
7
|
+
# Copyright (c) 2024 Robert Schulze
|
|
8
|
+
# Copyright (c) 2015-2023 Jeremy Evans
|
|
9
|
+
# MIT License
|
|
10
|
+
class ChangePassword < RodauthPhlex::View
|
|
11
|
+
def view_template
|
|
12
|
+
form(method: "post", class: "rodauth", role: "form", id: "change-password-form") do
|
|
13
|
+
safe_html rodauth.change_password_additional_form_tags
|
|
14
|
+
safe_html rodauth.csrf_tag
|
|
15
|
+
PasswordField(rodauth) if rodauth.change_password_requires_password?
|
|
16
|
+
div(class: "form-group mb-3") do
|
|
17
|
+
label(for: "new-password", class: "form-label") { "#{rodauth.new_password_label}#{rodauth.input_field_label_suffix}" }
|
|
18
|
+
InputField(rodauth, rodauth.new_password_param, "new-password", type: "password", autocomplete: "new-password")
|
|
19
|
+
end
|
|
20
|
+
PasswordConfirmField(rodauth) if rodauth.require_password_confirmation?
|
|
21
|
+
Button(rodauth, rodauth.change_password_button)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RodauthPhlex::Views
|
|
4
|
+
# This is a Phlex version of the Rodauth template:
|
|
5
|
+
# https://github.com/jeremyevans/rodauth/blob/2.37.0/templates/close-account.str
|
|
6
|
+
#
|
|
7
|
+
# Copyright (c) 2024 Robert Schulze
|
|
8
|
+
# Copyright (c) 2015-2023 Jeremy Evans
|
|
9
|
+
# MIT License
|
|
10
|
+
class CloseAccount < RodauthPhlex::View
|
|
11
|
+
def view_template
|
|
12
|
+
form(method: "post", class: "rodauth", role: "form", id: "close-account-form") do
|
|
13
|
+
safe_html rodauth.close_account_additional_form_tags
|
|
14
|
+
safe_html rodauth.csrf_tag
|
|
15
|
+
PasswordField(rodauth) if rodauth.close_account_requires_password?
|
|
16
|
+
Button(rodauth, rodauth.close_account_button, class: "btn btn-danger")
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|