Add LUBELOGGER_DOMAIN environment variable which is used to craft registration and reset password links to reduce user friction.
This commit is contained in:
@@ -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()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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"));
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user