first commit

This commit is contained in:
2025-04-24 13:11:28 +08:00
commit ff9c54d5e4
5960 changed files with 834111 additions and 0 deletions

View File

@@ -0,0 +1,15 @@
extends ../layout-marketing
block vars
- var suppressNavbar = true
- var suppressFooter = true
- metadata.robotsNoindexNofollow = true
- bootstrap5PageStatus = 'disabled'
block content
main.content.content-alt#main-content
.container-custom-sm.mx-auto
.card
h3 #{translate('your_account_is_suspended')}
p #{translate('sorry_this_account_has_been_suspended')}
p !{translate('please_contact_us_if_you_think_this_is_in_error', {}, [{name: 'a', attrs: {href: `mailto:${settings.adminEmail}`}}])}

View File

@@ -0,0 +1,12 @@
extends ../layout-react
block vars
- var suppressNavbar = true
- var suppressSkipToContent = true
block entrypointVar
- entrypoint = 'pages/user/add-secondary-email'
block content
main.content.content-alt
#add-secondary-email

View File

@@ -0,0 +1,13 @@
extends ../layout-marketing
block vars
- var suppressNavbar = true
- var suppressFooter = true
- var suppressGoogleAnalytics = true
block entrypointVar
- entrypoint = 'pages/compromised-password'
block content
main.content.content-alt#main-content
#compromised-password

View File

@@ -0,0 +1,15 @@
extends ../layout-marketing
block vars
- var suppressNavbar = true
- var suppressSkipToContent = true
block entrypointVar
- entrypoint = 'pages/user/confirm-secondary-email'
block append meta
meta(name="ol-email" content=email)
block content
main.content.content-alt
#confirm-secondary-email

View File

@@ -0,0 +1,60 @@
extends ../layout-marketing
block vars
- bootstrap5PageStatus = 'disabled'
block content
main.content.content-alt#main-content
.container
.row
.col-md-8.col-md-offset-2.col-lg-6.col-lg-offset-3
.card
.page-header(data-ol-hide-on-error-message="confirm-email-wrong-user")
h1 #{translate("confirm_email")}
form(
method="POST"
action="/logout"
id="logoutForm"
)
input(type="hidden", name="_csrf", value=csrfToken)
input(type="hidden", name="redirect", value=currentUrlWithQueryParams)
form(
data-ol-async-form,
data-ol-auto-submit,
name="confirmEmailForm"
action="/user/emails/confirm",
method="POST",
id="confirmEmailForm",
)
input(type="hidden", name="_csrf", value=csrfToken)
input(type="hidden", name="token", value=token)
div(data-ol-not-sent)
+formMessages()
div(data-ol-custom-form-message="confirm-email-wrong-user" hidden)
h1.h3 #{translate("we_cant_confirm_this_email")}
p !{translate("to_confirm_email_address_you_must_be_logged_in_with_the_requesting_account")}
p !{translate("you_are_currently_logged_in_as", {email: getUserEmail()})}
.actions
button.btn-primary.btn.btn-block(
form="logoutForm"
) #{translate('log_in_with_a_different_account')}
.actions
button.btn-primary.btn.btn-block(
type='submit',
data-ol-disabled-inflight
data-ol-hide-on-error-message="confirm-email-wrong-user"
)
span(data-ol-inflight="idle")
| #{translate('confirm')}
span(hidden data-ol-inflight="pending")
i.fa.fa-fw.fa-spin.fa-spinner(aria-hidden="true")
|  #{translate('confirming')}…
div(hidden data-ol-sent)
.alert.alert-success
| #{translate('thank_you_email_confirmed')}
div.text-center
a.btn.btn-primary(href="/user/settings")
| #{translate('go_to_account_settings')}

View File

@@ -0,0 +1,49 @@
extends ../layout-marketing
include ../_mixins/back_to_btns
block vars
- bootstrap5PageStatus = 'disabled'
block content
main.content.content-alt#main-content
.container
.row
.col-md-10.col-md-offset-1.col-lg-8.col-lg-offset-2
.card
.page-header
h1 #{translate("newsletter_info_title")}
p #{translate("newsletter_info_summary")}
- var submitAction
if subscribed
- submitAction = '/user/newsletter/unsubscribe'
p !{translate("newsletter_info_subscribed", {}, ['strong'])}
else
- submitAction = '/user/newsletter/subscribe'
p !{translate("newsletter_info_unsubscribed", {}, ['strong'])}
form(
data-ol-async-form
data-ol-reload-on-success
name="newsletterForm"
action=submitAction
method="POST"
)
input(name='_csrf', type='hidden', value=csrfToken)
+formMessages()
p.actions.text-center
if subscribed
button.btn-danger.btn(type='submit', data-ol-disabled-inflight)
span(data-ol-inflight="idle") #{translate("unsubscribe")}
span(hidden data-ol-inflight="pending") #{translate("saving")}…
else
button.btn-primary.btn(type='submit', data-ol-disabled-inflight)
span(data-ol-inflight="idle") #{translate("subscribe")}
span(hidden data-ol-inflight="pending") #{translate("saving")}…
if subscribed
p #{translate("newsletter_info_note")}
.page-separator
+back-to-btns()

View File

@@ -0,0 +1,52 @@
extends ../layout-marketing
block vars
- bootstrap5PageStatus = 'disabled'
block content
main.content.content-alt#main-content
.container
.row
.col-md-6.col-md-offset-3.col-lg-4.col-lg-offset-4
.card
.page-header
if login_support_title
h1 !{login_support_title}
else
h1 #{translate("log_in")}
form(data-ol-async-form, name="loginForm", action='/login', method="POST")
input(name='_csrf', type='hidden', value=csrfToken)
+formMessages()
+customFormMessage('invalid-password-retry-or-reset', 'danger')
| !{translate('email_or_password_wrong_try_again_or_reset', {}, [{ name: 'a', attrs: { href: '/user/password/reset', 'aria-describedby': 'resetPasswordDescription' } }])}
span.sr-only(id='resetPasswordDescription')
| #{translate('reset_password_link')}
+customValidationMessage('password-compromised')
| !{translate('password_compromised_try_again_or_use_known_device_or_reset', {}, [{name: 'a', attrs: {href: 'https://haveibeenpwned.com/passwords', rel: 'noopener noreferrer', target: '_blank'}}, {name: 'a', attrs: {href: '/user/password/reset', target: '_blank'}}])}.
.form-group
input.form-control(
type='email',
name='email',
required,
placeholder='email@example.com',
autofocus="true"
)
.form-group
input.form-control(
type='password',
name='password',
required,
placeholder='********',
)
.actions
button.btn-primary.btn(
type='submit',
data-ol-disabled-inflight
)
span(data-ol-inflight="idle") #{translate("login")}
span(hidden data-ol-inflight="pending") #{translate("logging_in")}…
a.pull-right(href='/user/password/reset') #{translate("forgot_your_password")}?
if login_support_text
hr
p.text-center !{login_support_text}

View File

@@ -0,0 +1,20 @@
extends ../layout-marketing
block vars
- bootstrap5PageStatus = 'disabled'
block content
main.content.content-alt#main-content
.container
.row
.col-md-6.col-md-offset-3.col-lg-4.col-lg-offset-4
.card
.page-header
h1 We're back!
p Overleaf is now running normally.
p
| Please
|
a(href="/login") log in
|
| to continue working on your projects.

View File

@@ -0,0 +1,76 @@
extends ../layout-website-redesign-bootstrap-5
include ../_mixins/recaptcha
include ../_mixins/notification
block vars
- var suppressNavbar = true
- var suppressFooter = true
block content
- var showCaptcha = settings.recaptcha && settings.recaptcha.siteKey && !(settings.recaptcha.disabled && settings.recaptcha.disabled.passwordReset)
if showCaptcha
script(type="text/javascript", nonce=scriptNonce, src="https://www.recaptcha.net/recaptcha/api.js?render=explicit")
div(
id="recaptcha"
class="g-recaptcha"
data-sitekey=settings.recaptcha.siteKey
data-size="invisible"
data-badge="inline"
)
main#main-content(data-ol-captcha-retry-trigger-area="")
a.auth-aux-logo(href="/")
img(src=buildImgPath("ol-brand/overleaf-o-dark.svg") alt=settings.appName)
.auth-aux-container
form(
data-ol-async-form
name="passwordResetForm"
action="/user/password/reset"
method="POST"
captcha=(showCaptcha ? '' : false)
captcha-action-name=(showCaptcha ? "passwordReset" : false)
)
if error === 'password_reset_token_expired'
h1.h3.mb-3.mt-0 #{translate("sorry_your_token_expired")}
p #{translate('please_request_a_new_password_reset_email_and_follow_the_link')}.
else
h1.h3.mb-3.mt-0(data-ol-not-sent) #{translate("password_reset_sentence_case")}
h1.h3.mb-3.mt-0(hidden data-ol-sent) #{translate("check_your_email")}
p.mb-3.pb-3(data-ol-not-sent) #{translate("enter_your_email_address_below_and_we_will_send_you_a_link_to_reset_your_password")}.
div(data-ol-not-sent)
+formMessagesNewStyle()
if error && error !== 'password_reset_token_expired'
+notification({ariaLive: 'assertive', type: 'error', className: 'mb-3', content: translate(error)})
div(data-ol-custom-form-message="no-password-allowed-due-to-sso" hidden)
+notification({ariaLive: 'polite', type: 'error', className: 'mb-3', content: translate("you_cant_reset_password_due_to_sso", {}, [{name: 'a', attrs: {href: '/sso-login'}}])})
input(type="hidden" name="_csrf" value=csrfToken)
.form-group.mb-3
label.form-label(for='email') #{translate("email")}
input.form-control#email(
aria-label="email"
type='email'
name='email'
required
autocomplete="username"
autofocus
)
.actions
button.btn.btn-primary.w-100.mb-3(
type='submit'
data-ol-disabled-inflight
aria-label=translate('reset_password_sentence_case')
)
span(data-ol-inflight="idle")
| #{translate("reset_password_sentence_case")}
span(hidden data-ol-inflight="pending")
| #{translate("requesting_password_reset")}…
a.btn.btn-ghost.w-100.mb-3(href="/login") #{translate("back_to_log_in")}
div(hidden data-ol-sent)
p.mb-4 #{translate('password_reset_email_sent')}
a.btn.btn-primary.w-100.mb-3(href="/login") #{translate('back_to_log_in')}
if showCaptcha
+recaptchaConditions

View File

@@ -0,0 +1,84 @@
extends ../layout-marketing
include ../_mixins/recaptcha
block vars
- bootstrap5PageStatus = 'disabled'
block content
- var showCaptcha = settings.recaptcha && settings.recaptcha.siteKey && !(settings.recaptcha.disabled && settings.recaptcha.disabled.passwordReset)
if showCaptcha
script(type="text/javascript", nonce=scriptNonce, src="https://www.recaptcha.net/recaptcha/api.js?render=explicit")
div(
id="recaptcha"
class="g-recaptcha"
data-sitekey=settings.recaptcha.siteKey
data-size="invisible"
data-badge="inline"
)
main.content.content-alt#main-content(data-ol-captcha-retry-trigger-area="")
.container-custom-sm.mx-auto
.card
form(
data-ol-async-form
name="passwordResetForm"
action="/user/password/reset",
method="POST",
captcha=(showCaptcha ? '' : false),
captcha-action-name=(showCaptcha ? "passwordReset" : false),
)
if error === 'password_reset_token_expired'
h3.mt-0.mb-2 #{translate("sorry_your_token_expired")}
p #{translate('please_request_a_new_password_reset_email_and_follow_the_link')}.
else
h3.mt-0.mb-2(data-ol-not-sent) #{translate("password_reset")}
h3.mt-0.mb-2(hidden data-ol-sent) #{translate("check_your_email")}
p(data-ol-not-sent) #{translate("enter_your_email_address_below_and_we_will_send_you_a_link_to_reset_your_password")}.
div(data-ol-not-sent)
+formMessages()
if error && error !== 'password_reset_token_expired'
div.alert.alert-danger.mb-2(
role="alert"
aria-live="assertive"
)
| #{translate(error)}
div(data-ol-custom-form-message="no-password-allowed-due-to-sso" hidden)
.notification.notification-type-error(aria-live="polite" style="margin-bottom: 10px;")
.notification-icon
span.material-symbols.material-symbols-rounded(aria-hidden="true") error
.notification-content-and-cta
.notification-content
p
| !{translate("you_cant_reset_password_due_to_sso", {}, [{name: 'a', attrs: {href: '/sso-login'}}])}
input(type="hidden", name="_csrf", value=csrfToken)
.form-group.mb-3
label(for='email') #{translate("email")}
input.form-control#email(
aria-label="email"
type='email',
name='email',
placeholder=translate("enter_your_email_address"),
required,
autocomplete="username",
autofocus
)
.actions
button.btn.btn-primary.w-100(
type='submit',
data-ol-disabled-inflight,
aria-label=translate('request_password_reset_to_reconfirm')
)
span(data-ol-inflight="idle")
| #{translate("request_password_reset")}
span(hidden data-ol-inflight="pending")
| #{translate("requesting_password_reset")}…
div(hidden data-ol-sent)
p.mb-4 #{translate('password_reset_email_sent')}
a(href="/login") #{translate('back_to_log_in')}
if showCaptcha
+recaptchaConditions

View File

@@ -0,0 +1,38 @@
extends ../layout-website-redesign-bootstrap-5
block content
main#main-content
.auth-aux-container
img.w-50.d-block(src=buildImgPath("ol-brand/overleaf.svg") alt=settings.appName)
h1.h3.mb-3 #{translate("keep_your_account_safe")}
div(data-ol-multi-submit)
p.small.mb-4
| !{translate("primary_email_check_question", { email: getUserEmail() }, ["strong"])}
form(
data-ol-async-form
action="/user/emails/primary-email-check"
method="POST"
)
input(name='_csrf', type='hidden', value=csrfToken)
+formMessagesNewStyle()
button.btn.btn-primary.w-100.mb-3(
type='submit'
data-ol-disabled-inflight
)
span(data-ol-inflight="idle") #{translate("yes_that_is_correct")}
span(hidden data-ol-inflight="pending") #{translate("confirming")}…
a.btn.btn-secondary.w-100.mb-4(
href="/user/settings#add-email"
data-ol-slow-link
event-tracking="primary-email-check-change-email"
event-tracking-mb="true"
event-tracking-trigger="click"
)
span(data-ol-inflight="idle") #{translate("no_update_email")}
span(hidden data-ol-inflight="pending") #{translate("redirecting")}…
p.small.mb-2
| #{translate("keep_your_email_updated")}
p.small
| !{translate("learn_more_about_emails", {}, [{name: 'a', attrs: {href: '/learn/how-to/Keeping_your_account_secure', 'event-tracking': 'primary-email-check-learn-more', 'event-tracking-mb': 'true', 'event-tracking-trigger': 'click' }}])}

View File

@@ -0,0 +1,42 @@
extends ../layout-marketing
block vars
- bootstrap5PageStatus = 'disabled'
block content
main.content.content-alt#main-content
.login-register-container.primary-email-check-container
.card.primary-email-check-card
img.primary-email-check-logo(src=buildImgPath("ol-brand/overleaf.svg") alt=settings.appName)
h3.primary-email-check-header #{translate("keep_your_account_safe")}
.login-register-form.primary-email-check-form(data-ol-multi-submit)
p.small
| !{translate("primary_email_check_question", { email: getUserEmail() }, ["strong"])}
form(
data-ol-async-form
action="/user/emails/primary-email-check"
method="POST"
)
input(name='_csrf', type='hidden', value=csrfToken)
+formMessages()
button.btn-primary.btn.btn-block.btn-primary-email-check-button.primary-email-confirm-button(
type='submit'
data-ol-disabled-inflight
)
span(data-ol-inflight="idle") #{translate("yes_that_is_correct")}
span(hidden data-ol-inflight="pending") #{translate("confirming")}…
a.btn-secondary.btn.btn-block.btn-primary-email-check-button.primary-email-change-button(
href="/user/settings#add-email"
data-ol-slow-link
event-tracking="primary-email-check-change-email"
event-tracking-mb="true"
event-tracking-trigger="click"
)
span(data-ol-inflight="idle") #{translate("no_update_email")}
span(hidden data-ol-inflight="pending") #{translate("redirecting")}…
p.small
| #{translate("keep_your_email_updated")}
p.small
| !{translate("learn_more_about_emails", {}, [{name: 'a', attrs: {href: '/learn/how-to/Keeping_your_account_secure', 'event-tracking': 'primary-email-check-learn-more', 'event-tracking-mb': 'true', 'event-tracking-trigger': 'click' }}])}

View File

@@ -0,0 +1,69 @@
extends ../layout-website-redesign-bootstrap-5
include ../_mixins/recaptcha
block content
- var email = reconfirm_email ? reconfirm_email : ""
- var showCaptcha = settings.recaptcha && settings.recaptcha.siteKey && !(settings.recaptcha.disabled && settings.recaptcha.disabled.passwordReset)
if showCaptcha
script(type="text/javascript", nonce=scriptNonce, src="https://www.recaptcha.net/recaptcha/api.js?render=explicit")
div(
id="recaptcha"
class="g-recaptcha"
data-sitekey=settings.recaptcha.siteKey
data-size="invisible"
data-badge="inline"
)
main#main-content(data-ol-captcha-retry-trigger-area="")
.container.auth-aux-container(style="max-width: 420px;")
form(
data-ol-async-form
name="reconfirmAccountForm"
action="/user/reconfirm"
method="POST"
aria-label=translate('request_reconfirmation_email')
captcha=(showCaptcha ? '' : false)
captcha-action-name=(showCaptcha ? "passwordReset" : false)
)
h1.h5.mb-3 #{translate("reconfirm_account")}
p #{translate('reconfirm_explained')}
|
a(href=`mailto:${settings.adminEmail}`) #{settings.adminEmail}
| .
div(data-ol-not-sent)
+formMessagesNewStyle()
input(type="hidden" name="_csrf" value=csrfToken)
.form-group.mb-3
label.form-label(for='email') #{translate("please_enter_email")}
input.form-control(
aria-label="email"
type='email'
name='email'
placeholder='email@example.com'
required
autofocus
value=email
)
.actions
button.btn.btn-primary.w-100(
style="white-space: normal;"
type='submit'
data-ol-disabled-inflight
aria-label=translate('request_password_reset_to_reconfirm')
)
span(data-ol-inflight="idle")
| #{translate('request_password_reset_to_reconfirm')}
span(hidden data-ol-inflight="pending")
| #{translate('request_password_reset_to_reconfirm')}…
div(hidden data-ol-sent)
div.alert.alert-success(
role="alert"
aria-live="polite"
)
span #{translate('password_reset_email_sent')}
if showCaptcha
+recaptchaConditions

View File

@@ -0,0 +1,73 @@
extends ../layout-marketing
include ../_mixins/recaptcha
block vars
- bootstrap5PageStatus = 'disabled'
block content
- var email = reconfirm_email ? reconfirm_email : ""
- var showCaptcha = settings.recaptcha && settings.recaptcha.siteKey && !(settings.recaptcha.disabled && settings.recaptcha.disabled.passwordReset)
if showCaptcha
script(type="text/javascript", nonce=scriptNonce, src="https://www.recaptcha.net/recaptcha/api.js?render=explicit")
div(
id="recaptcha"
class="g-recaptcha"
data-sitekey=settings.recaptcha.siteKey
data-size="invisible"
data-badge="inline"
)
main.content.content-alt#main-content(data-ol-captcha-retry-trigger-area="")
.container
.row
.col-sm-12.col-md-6.col-md-offset-3
.card
h1.card-header.text-capitalize #{translate("reconfirm")} #{translate("Account")}
p #{translate('reconfirm_explained')} 
a(href=`mailto:${settings.adminEmail}`) #{settings.adminEmail}
| .
form(
data-ol-async-form
name="reconfirmAccountForm"
action="/user/reconfirm",
method="POST",
aria-label=translate('request_reconfirmation_email')
captcha=(showCaptcha ? '' : false),
captcha-action-name=(showCaptcha ? "passwordReset" : false)
)
div(data-ol-not-sent)
+formMessages()
input(type="hidden", name="_csrf", value=csrfToken)
.form-group
label(for='email') #{translate("please_enter_email")}
input.form-control(
aria-label="email"
type='email',
name='email',
placeholder='email@example.com',
required,
autofocus
value=email
)
.actions
button.btn.btn-primary(
type='submit',
data-ol-disabled-inflight,
aria-label=translate('request_password_reset_to_reconfirm')
)
span(data-ol-inflight="idle")
| #{translate('request_password_reset_to_reconfirm')}
span(hidden data-ol-inflight="pending")
| #{translate('request_password_reset_to_reconfirm')}…
div(hidden data-ol-sent)
div.alert.alert-success(
role="alert"
aria-live="polite"
)
span #{translate('password_reset_email_sent')}
.row
.col-sm-12.col-md-6.col-md-offset-3
if showCaptcha
+recaptchaConditions

View File

@@ -0,0 +1,35 @@
extends ../layout-marketing
block vars
- bootstrap5PageStatus = 'disabled'
block content
main.content.content-alt#main-content
.container
.row
.registration_message
if sharedProjectData.user_first_name !== undefined
h1 #{translate("user_wants_you_to_see_project", {username:sharedProjectData.user_first_name, projectname:""})}
em #{sharedProjectData.project_name}
div
| #{translate("join_sl_to_view_project")}.
div
| #{translate("already_have_sl_account")}
a(href="/login") #{translate("login_here")}
else if newTemplateData.templateName !== undefined
h1 #{translate("register_to_edit_template", {templateName:newTemplateData.templateName})}
div #{translate("already_have_sl_account")}
a(href="/login") #{translate("login_here")}
.row
.col-md-8.col-md-offset-2.col-lg-6.col-lg-offset-3
.card
.page-header
h1 #{translate("register")}
p
| Please contact
|
strong #{settings.adminEmail}
|
| to create an account.

View File

@@ -0,0 +1,16 @@
extends ../layout-marketing
block vars
- bootstrap5PageStatus = 'disabled'
block content
main.content#main-content
.container
.row
.col-md-8.col-md-offset-2.text-center
.page-header
h2 #{translate("restricted_no_permission")}
p
a(href="/")
i.fa.fa-arrow-circle-o-left(aria-hidden="true")
| #{translate("take_me_home")}

View File

@@ -0,0 +1,72 @@
extends ../layout-marketing
block vars
- bootstrap5PageStatus = 'disabled'
block content
main.content.content-alt#main-content
.container
.row
.col-md-10.col-md-offset-1.col-lg-8.col-lg-offset-2
.card.clear-user-sessions
.page-header
h1 #{translate("your_sessions")}
if currentSession.ip_address && currentSession.session_created
h3 #{translate("current_session")}
div
table.table.table-striped
thead
tr
th #{translate("ip_address")}
th #{translate("session_created_at")}
tr
td #{currentSession.ip_address}
td #{moment(currentSession.session_created).utc().format('Do MMM YYYY, h:mm a')} UTC
h3 #{translate("other_sessions")}
div
p.small
| !{translate("clear_sessions_description")}
form(
data-ol-async-form
action='/user/sessions/clear'
method='POST'
)
input(name='_csrf' type='hidden' value=csrfToken)
div(data-ol-not-sent)
if sessions.length == 0
p.text-center
| #{translate("no_other_sessions")}
if sessions.length > 0
table.table.table-striped
thead
tr
th #{translate("ip_address")}
th #{translate("session_created_at")}
for session in sessions
tr
td #{session.ip_address}
td #{moment(session.session_created).utc().format('Do MMM YYYY, h:mm a')} UTC
p.actions
.text-center
button.btn.btn-lg.btn-primary(
type="submit"
data-ol-disable-inflight
)
span(data-ol-inflight="idle") #{translate('clear_sessions')}
span(hidden data-ol-inflight="pending") #{translate("processing")}…
div(hidden data-ol-sent)
p.text-center
| #{translate("no_other_sessions")}
p.text-success.text-center
| #{translate('clear_sessions_success')}
.page-separator
a.btn.btn-secondary.text-capitalize(href='/user/settings') #{translate('back_to_account_settings')}
|
a.btn.btn-secondary.text-capitalize(href='/project') #{translate('back_to_your_projects')}

View File

@@ -0,0 +1,90 @@
extends ../layout-website-redesign-bootstrap-5
block vars
- var suppressNavbar = true
- var suppressFooter = true
block content
main#main-content
a.auth-aux-logo(href="/")
img(src=buildImgPath("ol-brand/overleaf-o-dark.svg") alt=settings.appName)
.auth-aux-container
form(
data-ol-async-form
name="passwordResetForm"
action="/user/password/set"
method="POST"
data-ol-hide-on-error="token-expired"
)
div(
hidden
data-ol-sent
)
h1.h3.mb-3.mt-0 #{translate("password_updated")}
p.mb-4 #{translate("your_password_has_been_successfully_changed")}.
a.btn.btn-primary.w-100(href='/login') #{translate("log_in_now")}
div(data-ol-not-sent)
h1.h3.mb-3.mt-0 #{translate("reset_your_password")}
p(data-ol-hide-on-error-message="token-expired") #{translate("create_a_new_password_for_your_account")}.
+formMessagesNewStyle()
+customFormMessageNewStyle('password-contains-email', 'danger')
| #{translate('invalid_password_contains_email')}.
| #{translate('use_a_different_password')}.
+customFormMessageNewStyle('password-too-similar', 'danger')
| #{translate('invalid_password_too_similar')}.
| #{translate('use_a_different_password')}.
+customFormMessageNewStyle('token-expired', 'danger')
| #{translate('password_reset_token_expired')}
br
a(href="/user/password/reset")
| #{translate('request_new_password_reset_email')}
input(type="hidden" name="_csrf" value=csrfToken)
input(type="text" hidden name="email" autocomplete="username" value=email)
.form-group.mb-3
label.form-label(for='passwordField', data-ol-hide-on-error-message="token-expired") #{translate("new_password")}
input.form-control.auth-aux-new-password#passwordField(
type='password'
name='password'
autocomplete="new-password"
autofocus
required
minlength=settings.passwordStrengthOptions.length.min
)
+customValidationMessageNewStyle('invalid-password')
| #{translate('invalid_password')}.
+customValidationMessageNewStyle('password-must-be-different')
| #{translate('password_cant_be_the_same_as_current_one')}.
+customValidationMessageNewStyle('password-must-be-strong')
| !{translate('password_was_detected_on_a_public_list_of_known_compromised_passwords', {}, [{name: 'a', attrs: {href: 'https://haveibeenpwned.com/passwords', rel: 'noopener noreferrer', target: '_blank'}}])}.
| #{translate('use_a_different_password')}.
input(
type="hidden"
name="passwordResetToken"
value=passwordResetToken
)
div(data-ol-hide-on-error-message="token-expired")
div #{translate('in_order_to_have_a_secure_account_make_sure_your_password')}
ul.mb-3.ps-4
li #{translate('is_longer_than_n_characters', {n: settings.passwordStrengthOptions.length.min})}
li #{translate('does_not_contain_or_significantly_match_your_email')}
li #{translate('is_not_used_on_any_other_website')}
.actions
button.btn.btn-primary.w-100(
type='submit'
data-ol-disabled-inflight
aria-label=translate('set_new_password')
)
span(data-ol-inflight="idle")
| #{translate('set_new_password')}
span(hidden data-ol-inflight="pending")
| #{translate('set_new_password')}…

View File

@@ -0,0 +1,89 @@
extends ../layout-marketing
block vars
- bootstrap5PageStatus = 'disabled'
block content
main.content.content-alt#main-content
.container-custom-sm.mx-auto
.card
form(
data-ol-async-form,
name="passwordResetForm",
action="/user/password/set",
method="POST",
data-ol-hide-on-error="token-expired"
)
div(
hidden
data-ol-sent
)
h3.mt-0.mb-2 #{translate("password_updated")}
p.mb-4 #{translate("your_password_has_been_successfully_changed")}.
a(href='/login') #{translate("log_in_now")}
div(data-ol-not-sent)
h3.mt-0.mb-2 #{translate("reset_your_password")}
p(data-ol-hide-on-error-message="token-expired") #{translate("create_a_new_password_for_your_account")}.
+formMessages()
+customFormMessage('password-contains-email', 'danger')
| #{translate('invalid_password_contains_email')}.
| #{translate('use_a_different_password')}.
+customFormMessage('password-too-similar', 'danger')
| #{translate('invalid_password_too_similar')}.
| #{translate('use_a_different_password')}.
+customFormMessage('token-expired', 'danger')
| #{translate('password_reset_token_expired')}
br
a(href="/user/password/reset")
| #{translate('request_new_password_reset_email')}
input(type="hidden", name="_csrf", value=csrfToken)
input(type="text" hidden name="email" autocomplete="username" value=email)
.form-group
label(for='passwordField', data-ol-hide-on-error-message="token-expired") #{translate("new_password")}
input.form-control#passwordField(
type='password',
name='password',
placeholder=translate("enter_your_new_password"),
autocomplete="new-password",
autofocus,
required,
minlength=settings.passwordStrengthOptions.length.min
)
+customValidationMessage('invalid-password')
| #{translate('invalid_password')}.
+customValidationMessage('password-must-be-different')
| #{translate('password_cant_be_the_same_as_current_one')}.
+customValidationMessage('password-must-be-strong')
| !{translate('password_was_detected_on_a_public_list_of_known_compromised_passwords', {}, [{name: 'a', attrs: {href: 'https://haveibeenpwned.com/passwords', rel: 'noopener noreferrer', target: '_blank'}}])}.
| #{translate('use_a_different_password')}.
input(
type="hidden",
name="passwordResetToken",
value=passwordResetToken
)
div(data-ol-hide-on-error-message="token-expired")
div #{translate('in_order_to_have_a_secure_account_make_sure_your_password')}
ul.mb-4.ps-4
li #{translate('is_longer_than_n_characters', {n: settings.passwordStrengthOptions.length.min})}
li #{translate('does_not_contain_or_significantly_match_your_email')}
li #{translate('is_not_used_on_any_other_website')}
.actions
button.btn.btn-primary.w-100(
type='submit',
data-ol-disabled-inflight
aria-label=translate('set_new_password')
)
span(data-ol-inflight="idle")
| #{translate('set_new_password')}
span(hidden data-ol-inflight="pending")
| #{translate('set_new_password')}…

View File

@@ -0,0 +1,38 @@
extends ../layout-react
block entrypointVar
- entrypoint = 'pages/user/settings'
block vars
- isWebsiteRedesign = true
block append meta
meta(name="ol-hasPassword" data-type="boolean" content=hasPassword)
meta(name="ol-shouldAllowEditingDetails" data-type="boolean" content=shouldAllowEditingDetails)
meta(name="ol-oauthProviders", data-type="json", content=oauthProviders)
meta(name="ol-institutionLinked", data-type="json", content=institutionLinked)
meta(name="ol-samlError", data-type="json", content=samlError)
meta(name="ol-institutionEmailNonCanonical", content=institutionEmailNonCanonical)
meta(name="ol-reconfirmedViaSAML", content=reconfirmedViaSAML)
meta(name="ol-reconfirmationRemoveEmail", content=reconfirmationRemoveEmail)
meta(name="ol-samlBeta", content=samlBeta)
meta(name="ol-ssoErrorMessage", content=ssoErrorMessage)
meta(name="ol-thirdPartyIds", data-type="json", content=thirdPartyIds || {})
meta(name="ol-passwordStrengthOptions", data-type="json", content=settings.passwordStrengthOptions || {})
meta(name="ol-isExternalAuthenticationSystemUsed" data-type="boolean" content=externalAuthenticationSystemUsed())
meta(name="ol-user" data-type="json" content=user)
meta(name="ol-labsExperiments" data-type="json" content=labsExperiments)
meta(name="ol-dropbox" data-type="json" content=dropbox)
meta(name="ol-github" data-type="json" content=github)
meta(name="ol-projectSyncSuccessMessage", content=projectSyncSuccessMessage)
meta(name="ol-personalAccessTokens", data-type="json" content=personalAccessTokens)
meta(name="ol-emailAddressLimit", data-type="json", content=emailAddressLimit)
meta(name="ol-currentManagedUserAdminEmail" data-type="string" content=currentManagedUserAdminEmail)
meta(name="ol-gitBridgeEnabled" data-type="boolean" content=gitBridgeEnabled)
meta(name="ol-isSaas" data-type="boolean" content=isSaas)
meta(name="ol-memberOfSSOEnabledGroups" data-type="json" content=memberOfSSOEnabledGroups)
block content
main.content.content-alt#main-content
#settings-page-root