mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-16 16:30:15 +01:00
* feat: verification email * chore: email verification invalid; localize: update * fix: redirect to login when signup: fix: save emailVerified correctly * docs: update ALLOW_UNVERIFIED_EMAIL_LOGIN; fix: don't accept login only when ALLOW_UNVERIFIED_EMAIL_LOGIN = true * fix: user needs to be authenticated * style: update * fix: registration success message and redirect logic * refactor: use `isEnabled` in ALLOW_UNVERIFIED_EMAIL_LOGIN * refactor: move checkEmailConfig to server/utils * refactor: use req as param for verifyEmail function * chore: jsdoc * chore: remove console log * refactor: rename `createNewUser` to `createSocialUser` * refactor: update typing and add expiresAt field to userSchema * refactor: begin use of user methods over direct model access for User * refactor: initial email verification rewrite * chore: typing * refactor: registration flow rewrite * chore: remove help center text * refactor: update getUser to getUserById and add findUser methods. general fixes from recent changes * refactor: Update updateUser method to remove expiresAt field and use $set and $unset operations, createUser now returns Id only * refactor: Update openidStrategy to use optional chaining for avatar check, move saveBuffer init to buffer condition * refactor: logout on deleteUser mutatation * refactor: Update openidStrategy login success message format * refactor: Add emailVerified field to Discord and Facebook profile details * refactor: move limiters to separate middleware dir * refactor: Add limiters for email verification and password reset * refactor: Remove getUserController and update routes and controllers accordingly * refactor: Update getUserById method to exclude password and version fields * refactor: move verification to user route, add resend verification option * refactor: Improve email verification process and resend option * refactor: remove more direct model access of User and remove unused code * refactor: replace user authentication methods and token generation * fix: add user.id to jwt user * refactor: Update AuthContext to include setError function, add resend link to Login Form, make registration redirect shorter * fix(updateUserPluginsService): ensure userPlugins variable is defined * refactor: Delete all shared links for a specific user * fix: remove use of direct User.save() in handleExistingUser * fix(importLibreChatConvo): handle missing createdAt field in messages --------- Co-authored-by: Danny Avila <danny@librechat.ai>
284 lines
No EOL
15 KiB
Handlebars
284 lines
No EOL
15 KiB
Handlebars
<html
|
|
xmlns='http://www.w3.org/1999/xhtml'
|
|
xmlns:v='urn:schemas-microsoft-com:vml'
|
|
xmlns:o='urn:schemas-microsoft-com:office:office'
|
|
>
|
|
|
|
<head>
|
|
<!--[if gte mso 9]>
|
|
<xml>
|
|
<o:OfficeDocumentSettings>
|
|
<o:AllowPNG />
|
|
<o:PixelsPerInch>96</o:PixelsPerInch>
|
|
</o:OfficeDocumentSettings>
|
|
</xml>
|
|
<![endif]-->
|
|
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />
|
|
<meta name='viewport' content='width=device-width, initial-scale=1.0' />
|
|
<meta name='x-apple-disable-message-reformatting' />
|
|
<meta name='color-scheme' content='light dark' />
|
|
<!--[if !mso]><!-->
|
|
<meta http-equiv='X-UA-Compatible' content='IE=edge' />
|
|
<!--<![endif]-->
|
|
<title></title>
|
|
<style type='text/css'>
|
|
@media (prefers-color-scheme: dark) { .darkmode { background-color: #212121 !important; }
|
|
.darkmode p { color: #ffffff !important; } } @media only screen and (min-width: 520px) {
|
|
.u-row { width: 500px !important; } .u-row .u-col { vertical-align: top; } .u-row .u-col-100 {
|
|
width: 500px !important; } } @media (max-width: 520px) { .u-row-container { max-width: 100%
|
|
!important; padding-left: 0px !important; padding-right: 0px !important; } .u-row .u-col {
|
|
min-width: 320px !important; max-width: 100% !important; display: block !important; } .u-row {
|
|
width: 100% !important; } .u-col { width: 100% !important; } .u-col>div { margin: 0 auto; } }
|
|
body { margin: 0; padding: 0; } table, tr, td { vertical-align: top; border-collapse:
|
|
collapse; } p { margin: 0; } .ie-container table, .mso-container table { table-layout: fixed;
|
|
} * { line-height: inherit; } a[x-apple-data-detectors='true'] { color: inherit !important;
|
|
text-decoration: none !important; } table, td { color: #ffffff; } #u_body a { color: #0000ee;
|
|
text-decoration: underline; }
|
|
</style>
|
|
</head>
|
|
|
|
<body
|
|
class='clean-body u_body'
|
|
style='margin: 0;padding: 0;-webkit-text-size-adjust: 100%;background-color: #212121;color: #ffffff'
|
|
>
|
|
<!--[if IE]><div class="ie-container"><![endif]-->
|
|
<!--[if mso]><div class="mso-container"><![endif]-->
|
|
<table
|
|
id='u_body'
|
|
style='border-collapse: collapse;table-layout: fixed;border-spacing: 0;mso-table-lspace: 0pt;mso-table-rspace: 0pt;vertical-align: top;min-width: 320px;Margin: 0 auto;background-color: #212121;width:100%'
|
|
cellpadding='0'
|
|
cellspacing='0'
|
|
>
|
|
<tbody>
|
|
<tr style='vertical-align: top'>
|
|
<td
|
|
style='word-break: break-word;border-collapse: collapse !important;vertical-align: top'
|
|
>
|
|
<!--[if (mso)|(IE)]><table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td align="center" style="background-color: #212121;"><![endif]-->
|
|
<div class='u-row-container' style='padding: 0px;background-color: transparent'>
|
|
<div
|
|
class='u-row'
|
|
style='margin: 0 auto;min-width: 320px;max-width: 500px;overflow-wrap: break-word;word-wrap: break-word;word-break: break-word;background-color: transparent;'
|
|
>
|
|
<div
|
|
style='border-collapse: collapse;display: table;width: 100%;height: 100%;background-color: transparent;'
|
|
>
|
|
<!--[if (mso)|(IE)]><table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td style="padding: 0px;background-color: transparent;" align="center"><table cellpadding="0" cellspacing="0" border="0" style="width:500px;"><tr style="background-color: transparent;"><![endif]-->
|
|
<!--[if (mso)|(IE)]><td align="center" width="500" style="background-color: #212121;width: 500px;padding: 0px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;" valign="top"><![endif]-->
|
|
<div
|
|
class='u-col u-col-100'
|
|
style='max-width: 320px;min-width: 500px;display: table-cell;vertical-align: top;'
|
|
>
|
|
<div
|
|
style='background-color: #212121;height: 100%;width: 100% !important;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;'
|
|
>
|
|
<!--[if (!mso)&(!IE)]><!-->
|
|
<div
|
|
style='box-sizing: border-box; height: 100%; padding: 0px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;'
|
|
>
|
|
<!--<![endif]-->
|
|
<table
|
|
style='font-family:arial,helvetica,sans-serif;'
|
|
role='presentation'
|
|
cellpadding='0'
|
|
cellspacing='0'
|
|
width='100%'
|
|
border='0'
|
|
>
|
|
<tbody>
|
|
<tr>
|
|
<td
|
|
style='overflow-wrap:break-word;word-break:break-word;padding:10px;font-family:arial,helvetica,sans-serif;'
|
|
align='left'
|
|
>
|
|
<!--[if mso]><table width="100%"><tr><td><![endif]-->
|
|
<h1
|
|
style='margin: 0px; line-height: 140%; text-align: left; word-wrap: break-word; font-size: 22px; font-weight: 700;'
|
|
>
|
|
<div>
|
|
<div>You have requested to reset your password.
|
|
</div>
|
|
</div>
|
|
</h1>
|
|
<!--[if mso]></td></tr></table><![endif]-->
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<table
|
|
style='font-family:arial,helvetica,sans-serif;'
|
|
role='presentation'
|
|
cellpadding='0'
|
|
cellspacing='0'
|
|
width='100%'
|
|
border='0'
|
|
>
|
|
<tbody>
|
|
<tr>
|
|
<td
|
|
style='overflow-wrap:break-word;word-break:break-word;padding:10px;font-family:arial,helvetica,sans-serif;'
|
|
align='left'
|
|
>
|
|
<div
|
|
style='font-size: 14px; line-height: 140%; text-align: left; word-wrap: break-word;'
|
|
>
|
|
<div>Hi {{name}},</div>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<table
|
|
style='font-family:arial,helvetica,sans-serif;'
|
|
role='presentation'
|
|
cellpadding='0'
|
|
cellspacing='0'
|
|
width='100%'
|
|
border='0'
|
|
>
|
|
<tbody>
|
|
<tr>
|
|
<td
|
|
style='overflow-wrap:break-word;word-break:break-word;padding:10px;font-family:arial,helvetica,sans-serif;'
|
|
align='left'
|
|
>
|
|
<div
|
|
style='font-size: 14px; line-height: 140%; text-align: left; word-wrap: break-word;'
|
|
>
|
|
<p style='line-height: 140%;'>Please click the button below to
|
|
reset your password.</p>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<table
|
|
style='font-family:arial,helvetica,sans-serif;'
|
|
role='presentation'
|
|
cellpadding='0'
|
|
cellspacing='0'
|
|
width='100%'
|
|
border='0'
|
|
>
|
|
<tbody>
|
|
<tr>
|
|
<td
|
|
style='overflow-wrap:break-word;word-break:break-word;padding:10px;font-family:arial,helvetica,sans-serif;'
|
|
align='left'
|
|
>
|
|
<!--[if mso]><style>.v-button {background: transparent !important;}</style><![endif]-->
|
|
<div align='left'>
|
|
<!--[if mso]><v:roundrect xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w="urn:schemas-microsoft-com:office:word" href="{{link}}" style="height:37px; v-text-anchor:middle; width:142px;" arcsize="11%" stroke="f" fillcolor="#10a37f"><w:anchorlock/><center style="color:#FFFFFF;"><![endif]-->
|
|
<a
|
|
href='{{link}}'
|
|
target='_blank'
|
|
class='v-button'
|
|
style='box-sizing: border-box;display: inline-block;text-decoration: none;-webkit-text-size-adjust: none;text-align: center;color: #FFFFFF; background-color: #10a37f; border-radius: 4px;-webkit-border-radius: 4px; -moz-border-radius: 4px; width:auto; max-width:100%; overflow-wrap: break-word; word-break: break-word; word-wrap:break-word; mso-border-alt: none;font-size: 14px;'
|
|
>
|
|
<span
|
|
style='display:block;padding:10px 20px;line-height:120%;'
|
|
><span style='line-height: 16.8px;'>Reset Password</span></span>
|
|
</a>
|
|
<!--[if mso]></center></v:roundrect><![endif]-->
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<table
|
|
style='font-family:arial,helvetica,sans-serif;'
|
|
role='presentation'
|
|
cellpadding='0'
|
|
cellspacing='0'
|
|
width='100%'
|
|
border='0'
|
|
>
|
|
<tbody>
|
|
<tr>
|
|
<td
|
|
style='overflow-wrap:break-word;word-break:break-word;padding:10px;font-family:arial,helvetica,sans-serif;'
|
|
align='left'
|
|
>
|
|
<div
|
|
style='font-size: 14px; line-height: 140%; text-align: left; word-wrap: break-word;'
|
|
>
|
|
<div>
|
|
<div>If you did not request a password reset, please ignore this
|
|
email.</div>
|
|
</div>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<table
|
|
style='font-family:arial,helvetica,sans-serif;'
|
|
role='presentation'
|
|
cellpadding='0'
|
|
cellspacing='0'
|
|
width='100%'
|
|
border='0'
|
|
>
|
|
<tbody>
|
|
<tr>
|
|
<td
|
|
style='overflow-wrap:break-word;word-break:break-word;padding:10px;font-family:arial,helvetica,sans-serif;'
|
|
align='left'
|
|
>
|
|
<div
|
|
style='font-size: 14px; line-height: 140%; text-align: left; word-wrap: break-word;'
|
|
>
|
|
<div>Best regards,</div>
|
|
<div>The {{appName}} Team</div>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<table
|
|
style='font-family:arial,helvetica,sans-serif;'
|
|
role='presentation'
|
|
cellpadding='0'
|
|
cellspacing='0'
|
|
width='100%'
|
|
border='0'
|
|
>
|
|
<tbody>
|
|
<tr>
|
|
<td
|
|
style='overflow-wrap:break-word;word-break:break-word;padding:0px 10px 10px;font-family:arial,helvetica,sans-serif;'
|
|
align='left'
|
|
>
|
|
<div
|
|
style='font-size: 14px; line-height: 140%; text-align: right; word-wrap: break-word;'
|
|
>
|
|
<div>
|
|
<div><sub>©
|
|
{{year}}
|
|
{{appName}}. All rights reserved.</sub></div>
|
|
</div>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<!--[if (!mso)&(!IE)]><!-->
|
|
</div>
|
|
<!--<![endif]-->
|
|
</div>
|
|
</div>
|
|
<!--[if (mso)|(IE)]></td><![endif]-->
|
|
<!--[if (mso)|(IE)]></tr></table></td></tr></table><![endif]-->
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<!--[if (mso)|(IE)]></td></tr></table><![endif]-->
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<!--[if mso]></div><![endif]-->
|
|
<!--[if IE]></div><![endif]-->
|
|
</body>
|
|
|
|
</html> |