Add LUBELOGGER_DOMAIN environment variable which is used to craft registration and reset password links to reduce user friction.

This commit is contained in:
DESKTOP-T0O5CDB\DESK-555BD
2025-04-27 08:37:08 -06:00
parent a87861069b
commit d08726bd85
5 changed files with 45 additions and 11 deletions

View File

@@ -49,21 +49,31 @@ namespace CarCareTracker.Controllers
} }
return View(model: redirectURL); return View(model: redirectURL);
} }
public IActionResult Registration() public IActionResult Registration(string token = "", string email = "")
{ {
if (_config.GetServerDisabledRegistration()) if (_config.GetServerDisabledRegistration())
{ {
return RedirectToAction("Index"); return RedirectToAction("Index");
} }
return View(); var viewModel = new LoginModel
{
EmailAddress = string.IsNullOrWhiteSpace(email) ? string.Empty : email,
Token = string.IsNullOrWhiteSpace(token) ? string.Empty : token
};
return View(viewModel);
} }
public IActionResult ForgotPassword() public IActionResult ForgotPassword()
{ {
return View(); return View();
} }
public IActionResult ResetPassword() public IActionResult ResetPassword(string token = "", string email = "")
{ {
return View(); var viewModel = new LoginModel
{
EmailAddress = string.IsNullOrWhiteSpace(email) ? string.Empty : email,
Token = string.IsNullOrWhiteSpace(token) ? string.Empty : token
};
return View(viewModel);
} }
public IActionResult GetRemoteLoginLink() public IActionResult GetRemoteLoginLink()
{ {

View File

@@ -24,6 +24,7 @@ namespace CarCareTracker.Helper
bool GetServerEnableShopSupplies(); bool GetServerEnableShopSupplies();
string GetServerPostgresConnection(); string GetServerPostgresConnection();
string GetAllowedFileUploadExtensions(); string GetAllowedFileUploadExtensions();
string GetServerDomain();
bool DeleteUserConfig(int userId); bool DeleteUserConfig(int userId);
bool GetInvariantApi(); bool GetInvariantApi();
bool GetServerOpenRegistration(); bool GetServerOpenRegistration();
@@ -62,6 +63,11 @@ namespace CarCareTracker.Helper
var motd = CheckString("LUBELOGGER_MOTD"); var motd = CheckString("LUBELOGGER_MOTD");
return motd; return motd;
} }
public string GetServerDomain()
{
var domain = CheckString("LUBELOGGER_DOMAIN");
return domain;
}
public bool GetServerOpenRegistration() public bool GetServerOpenRegistration()
{ {
return CheckBool(CheckString("LUBELOGGER_OPEN_REGISTRATION")); return CheckBool(CheckString("LUBELOGGER_OPEN_REGISTRATION"));

View File

@@ -17,6 +17,7 @@ namespace CarCareTracker.Helper
{ {
private readonly MailConfig mailConfig; private readonly MailConfig mailConfig;
private readonly string serverLanguage; private readonly string serverLanguage;
private readonly string serverDomain;
private readonly IFileHelper _fileHelper; private readonly IFileHelper _fileHelper;
private readonly ITranslationHelper _translator; private readonly ITranslationHelper _translator;
private readonly ILogger<MailHelper> _logger; private readonly ILogger<MailHelper> _logger;
@@ -29,6 +30,7 @@ namespace CarCareTracker.Helper
//load mailConfig from Configuration //load mailConfig from Configuration
mailConfig = config.GetMailConfig(); mailConfig = config.GetMailConfig();
serverLanguage = config.GetServerLanguage(); serverLanguage = config.GetServerLanguage();
serverDomain = config.GetServerDomain();
_fileHelper = fileHelper; _fileHelper = fileHelper;
_translator = translationHelper; _translator = translationHelper;
_logger = logger; _logger = logger;
@@ -43,7 +45,14 @@ namespace CarCareTracker.Helper
return OperationResponse.Failed("Email Address or Token is invalid"); return OperationResponse.Failed("Email Address or Token is invalid");
} }
string emailSubject = _translator.Translate(serverLanguage, "Your Registration Token for LubeLogger"); string emailSubject = _translator.Translate(serverLanguage, "Your Registration Token for LubeLogger");
string emailBody = $"{_translator.Translate(serverLanguage, "A token has been generated on your behalf, please complete your registration for LubeLogger using the token")}: {token}"; string tokenHtml = token;
if (!string.IsNullOrWhiteSpace(serverDomain))
{
string cleanedURL = serverDomain.EndsWith('/') ? serverDomain.TrimEnd('/') : serverDomain;
//construct registration URL.
tokenHtml = $"<a href='{cleanedURL}/Login/Registration?email={emailAddress}&token={token}' target='_blank'>{token}</a>";
}
string emailBody = $"<span>{_translator.Translate(serverLanguage, "A token has been generated on your behalf, please complete your registration for LubeLogger using the token")}: {tokenHtml}</span>";
var result = SendEmail(new List<string> { emailAddress }, emailSubject, emailBody); var result = SendEmail(new List<string> { emailAddress }, emailSubject, emailBody);
if (result) if (result)
{ {
@@ -64,7 +73,14 @@ namespace CarCareTracker.Helper
return OperationResponse.Failed("Email Address or Token is invalid"); return OperationResponse.Failed("Email Address or Token is invalid");
} }
string emailSubject = _translator.Translate(serverLanguage, "Your Password Reset Token for LubeLogger"); string emailSubject = _translator.Translate(serverLanguage, "Your Password Reset Token for LubeLogger");
string emailBody = $"{_translator.Translate(serverLanguage, "A token has been generated on your behalf, please reset your password for LubeLogger using the token")}: {token}"; string tokenHtml = token;
if (!string.IsNullOrWhiteSpace(serverDomain))
{
string cleanedURL = serverDomain.EndsWith('/') ? serverDomain.TrimEnd('/') : serverDomain;
//construct registration URL.
tokenHtml = $"<a href='{cleanedURL}/Login/ResetPassword?email={emailAddress}&token={token}' target='_blank'>{token}</a>";
}
string emailBody = $"<span>{_translator.Translate(serverLanguage, "A token has been generated on your behalf, please reset your password for LubeLogger using the token")}: {tokenHtml}</span>";
var result = SendEmail(new List<string> { emailAddress }, emailSubject, emailBody); var result = SendEmail(new List<string> { emailAddress }, emailSubject, emailBody);
if (result) if (result)
{ {

View File

@@ -5,6 +5,7 @@
var userLanguage = config.GetServerLanguage(); var userLanguage = config.GetServerLanguage();
var openRegistrationEnabled = config.GetServerOpenRegistration(); var openRegistrationEnabled = config.GetServerOpenRegistration();
} }
@model LoginModel
@{ @{
ViewData["Title"] = "Register"; ViewData["Title"] = "Register";
} }
@@ -19,18 +20,18 @@
<label for="inputToken">@translator.Translate(userLanguage, "Token")</label> <label for="inputToken">@translator.Translate(userLanguage, "Token")</label>
@if (openRegistrationEnabled) { @if (openRegistrationEnabled) {
<div class="input-group"> <div class="input-group">
<input type="text" id="inputToken" class="form-control"> <input type="text" id="inputToken" class="form-control" value="@Model.Token">
<div class="input-group-text"> <div class="input-group-text">
<button type="button" class="btn btn-sm text-secondary password-visible-button" onclick="sendRegistrationToken()"><i class="bi bi-send"></i></button> <button type="button" class="btn btn-sm text-secondary password-visible-button" onclick="sendRegistrationToken()"><i class="bi bi-send"></i></button>
</div> </div>
</div> </div>
} else { } else {
<input type="text" id="inputToken" class="form-control"> <input type="text" id="inputToken" class="form-control" value="@Model.Token">
} }
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="inputEmail">@translator.Translate(userLanguage, "Email Address")</label> <label for="inputEmail">@translator.Translate(userLanguage, "Email Address")</label>
<input type="text" id="inputEmail" class="form-control"> <input type="text" id="inputEmail" class="form-control" value="@Model.EmailAddress">
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="inputUserName">@translator.Translate(userLanguage, "Username")</label> <label for="inputUserName">@translator.Translate(userLanguage, "Username")</label>

View File

@@ -4,6 +4,7 @@
@{ @{
var userLanguage = config.GetServerLanguage(); var userLanguage = config.GetServerLanguage();
} }
@model LoginModel
@{ @{
ViewData["Title"] = "Reset Password"; ViewData["Title"] = "Reset Password";
} }
@@ -16,11 +17,11 @@
<img src="@config.GetLogoUrl()" class="lubelogger-logo" /> <img src="@config.GetLogoUrl()" class="lubelogger-logo" />
<div class="form-group"> <div class="form-group">
<label for="inputToken">@translator.Translate(userLanguage, "Token")</label> <label for="inputToken">@translator.Translate(userLanguage, "Token")</label>
<input type="text" id="inputToken" class="form-control"> <input type="text" id="inputToken" class="form-control" value="@Model.Token">
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="inputUserName">@translator.Translate(userLanguage, "Email Address")</label> <label for="inputUserName">@translator.Translate(userLanguage, "Email Address")</label>
<input type="text" id="inputEmail" class="form-control"> <input type="text" id="inputEmail" class="form-control" value="@Model.EmailAddress">
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="inputUserPassword">@translator.Translate(userLanguage, "New Password")</label> <label for="inputUserPassword">@translator.Translate(userLanguage, "New Password")</label>