No admin by username, no Swagger in production, no exception text to clients
S14 and the privacy items of P0: - signing up as "admin" no longer grants admin; `PrivaPub admin promote <root>` (and `demote`) does, run on the box against the configured database; - Swagger is served in Development only; - every service and controller answers "Something went wrong." where it used to send ex.Message, and the SMTP warnings no longer log the recipient's address; - sign-up and login no longer log the IP, User-Agent and root id together; - invitation sign-up takes the persona's own AvatarUserName (and optional AvatarName) instead of naming the avatar after the private login, and refuses a persona username equal to the login's. Invitation login uses the named persona, creating it if it is new; - recovery mail comes from "PrivaPub", not collAnon's support address name. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012CzABvBkbcFqoHdmi8b9WB
This commit is contained in:
1 parent
2eb2a63f1e
commit
0f85030744
11 files changed
+144
-76
No files matched your search
@@ -10,5 +10,12 @@ namespace PrivaPub.ClientModels
|
|||||||
StringLength(Constants.GroupInvitationLength, MinimumLength = Constants.GroupInvitationLength,
|
StringLength(Constants.GroupInvitationLength, MinimumLength = Constants.GroupInvitationLength,
|
||||||
ErrorMessageResourceName = "StringLengthMinMax", ErrorMessageResourceType = typeof(ErrorsResource))]
|
ErrorMessageResourceName = "StringLengthMinMax", ErrorMessageResourceType = typeof(ErrorsResource))]
|
||||||
public string InvitationCode { get; set; }
|
public string InvitationCode { get; set; }
|
||||||
|
|
||||||
|
[StringLength(32, MinimumLength = 3, ErrorMessageResourceName = "StringLengthMinMax", ErrorMessageResourceType = typeof(ErrorsResource)),
|
||||||
|
RegularExpression("^[a-z0-9_]+$", ErrorMessageResourceName = "EmptySpacesNotAllowed", ErrorMessageResourceType = typeof(ErrorsResource))]
|
||||||
|
public string AvatarUserName { get; set; }
|
||||||
|
|
||||||
|
[StringLength(64, ErrorMessageResourceName = "MaxLengthString", ErrorMessageResourceType = typeof(ErrorsResource))]
|
||||||
|
public string AvatarName { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -45,7 +45,7 @@ namespace PrivaPub.Controllers.ClientToServer
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.LogError(ex, $"{nameof(User)}.{nameof(RemoveUsers)}()");
|
Logger.LogError(ex, $"{nameof(User)}.{nameof(RemoveUsers)}()");
|
||||||
return BadRequest(result.Invalidate(ex.Message));
|
return BadRequest(result.Invalidate(Localizer["Something went wrong."]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -73,7 +73,7 @@ namespace PrivaPub.Controllers.ClientToServer
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.LogError(ex, $"{nameof(User)}.{nameof(BanUsers)}()");
|
Logger.LogError(ex, $"{nameof(User)}.{nameof(BanUsers)}()");
|
||||||
return BadRequest(result.Invalidate(ex.Message));
|
return BadRequest(result.Invalidate(Localizer["Something went wrong."]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -99,7 +99,7 @@ namespace PrivaPub.Controllers.ClientToServer
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.LogError(ex, $"{nameof(User)}.{nameof(UnbanUsers)}()");
|
Logger.LogError(ex, $"{nameof(User)}.{nameof(UnbanUsers)}()");
|
||||||
return BadRequest(result.Invalidate(ex.Message));
|
return BadRequest(result.Invalidate(Localizer["Something went wrong."]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -122,7 +122,7 @@ namespace PrivaPub.Controllers.ClientToServer
|
|||||||
// catch (Exception ex)
|
// catch (Exception ex)
|
||||||
// {
|
// {
|
||||||
// Logger.LogError(ex, $"{nameof(User)}.{nameof(GetUsers)}()");
|
// Logger.LogError(ex, $"{nameof(User)}.{nameof(GetUsers)}()");
|
||||||
// return BadRequest(result.Invalidate(ex.Message));
|
// return BadRequest(result.Invalidate(Localizer["Something went wrong."]));
|
||||||
// }
|
// }
|
||||||
//}
|
//}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ namespace PrivaPub.Controllers.ClientToServer
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.LogError(ex, $"{nameof(DataController)}.{nameof(Languages)}()");
|
Logger.LogError(ex, $"{nameof(DataController)}.{nameof(Languages)}()");
|
||||||
return BadRequest(result.Invalidate(ex.Message, exception: ex));
|
return BadRequest(result.Invalidate("Something went wrong.", exception: ex));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ namespace PrivaPub.Controllers.ClientToServer
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
_logger.LogError(ex, $"{nameof(PrivateAvatarController)}.{nameof(InsertAvatar)}()");
|
_logger.LogError(ex, $"{nameof(PrivateAvatarController)}.{nameof(InsertAvatar)}()");
|
||||||
return BadRequest(result.Invalidate(ex.Message));
|
return BadRequest(result.Invalidate(_localizer["Something went wrong."]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -74,7 +74,7 @@ namespace PrivaPub.Controllers.ClientToServer
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
_logger.LogError(ex, $"{nameof(PrivateAvatarController)}.{nameof(UpdateAvatar)}()");
|
_logger.LogError(ex, $"{nameof(PrivateAvatarController)}.{nameof(UpdateAvatar)}()");
|
||||||
return BadRequest(result.Invalidate(ex.Message));
|
return BadRequest(result.Invalidate(_localizer["Something went wrong."]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ using PrivaPub.ClientModels.Group;
|
|||||||
using PrivaPub.ClientModels.User;
|
using PrivaPub.ClientModels.User;
|
||||||
using PrivaPub.ClientModels.User.Avatar;
|
using PrivaPub.ClientModels.User.Avatar;
|
||||||
using PrivaPub.Extensions;
|
using PrivaPub.Extensions;
|
||||||
|
using PrivaPub.Federation.Actors;
|
||||||
using PrivaPub.Models;
|
using PrivaPub.Models;
|
||||||
using PrivaPub.Models.User;
|
using PrivaPub.Models.User;
|
||||||
using PrivaPub.Resources;
|
using PrivaPub.Resources;
|
||||||
@@ -28,6 +29,7 @@ namespace PrivaPub.Controllers.ClientToServer
|
|||||||
readonly IRootUsersService UsersService;
|
readonly IRootUsersService UsersService;
|
||||||
readonly IGroupUsersService GroupUsersService;
|
readonly IGroupUsersService GroupUsersService;
|
||||||
readonly IPrivateAvatarUsersService AvatarUsersService;
|
readonly IPrivateAvatarUsersService AvatarUsersService;
|
||||||
|
readonly ILocalActorService LocalActors;
|
||||||
readonly AuthTokenManager AuthTokenManager;
|
readonly AuthTokenManager AuthTokenManager;
|
||||||
readonly IOptionsMonitor<AppConfiguration> AppConfiguration;
|
readonly IOptionsMonitor<AppConfiguration> AppConfiguration;
|
||||||
readonly ILogger<RootUserController> Logger;
|
readonly ILogger<RootUserController> Logger;
|
||||||
@@ -36,6 +38,7 @@ namespace PrivaPub.Controllers.ClientToServer
|
|||||||
public RootUserController(IRootUsersService usersService,
|
public RootUserController(IRootUsersService usersService,
|
||||||
IGroupUsersService groupUsersService,
|
IGroupUsersService groupUsersService,
|
||||||
IPrivateAvatarUsersService avatarUsersService,
|
IPrivateAvatarUsersService avatarUsersService,
|
||||||
|
ILocalActorService localActors,
|
||||||
AuthTokenManager authTokenManager,
|
AuthTokenManager authTokenManager,
|
||||||
IOptionsMonitor<AppConfiguration> appConfiguration,
|
IOptionsMonitor<AppConfiguration> appConfiguration,
|
||||||
IStringLocalizer<GenericRes> localizer,
|
IStringLocalizer<GenericRes> localizer,
|
||||||
@@ -44,6 +47,7 @@ namespace PrivaPub.Controllers.ClientToServer
|
|||||||
UsersService = usersService;
|
UsersService = usersService;
|
||||||
GroupUsersService = groupUsersService;
|
GroupUsersService = groupUsersService;
|
||||||
AvatarUsersService = avatarUsersService;
|
AvatarUsersService = avatarUsersService;
|
||||||
|
LocalActors = localActors;
|
||||||
AuthTokenManager = authTokenManager;
|
AuthTokenManager = authTokenManager;
|
||||||
AppConfiguration = appConfiguration;
|
AppConfiguration = appConfiguration;
|
||||||
Localizer = localizer;
|
Localizer = localizer;
|
||||||
@@ -67,14 +71,12 @@ namespace PrivaPub.Controllers.ClientToServer
|
|||||||
|
|
||||||
(var user, var userSettings) = ((RootUser, ViewUserSettings))result.Data;
|
(var user, var userSettings) = ((RootUser, ViewUserSettings))result.Data;
|
||||||
var jwtUser = AuthTokenManager.GenerateToken(user, userSettings);
|
var jwtUser = AuthTokenManager.GenerateToken(user, userSettings);
|
||||||
Logger.LogInformation(
|
|
||||||
$"{nameof(SignUp)}();IP:[{HttpContext.Connection?.RemoteIpAddress}];\nUser-Agent:[{Request.Headers["User-Agent"]}];\nUserId:[{user.ID}]");
|
|
||||||
return Ok(jwtUser);
|
return Ok(jwtUser);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.LogError(ex, $"{nameof(User)}.{nameof(SignUp)}()");
|
Logger.LogError(ex, $"{nameof(User)}.{nameof(SignUp)}()");
|
||||||
return BadRequest(result.Invalidate(ex.Message));
|
return BadRequest(result.Invalidate(Localizer["Something went wrong."]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -94,15 +96,13 @@ namespace PrivaPub.Controllers.ClientToServer
|
|||||||
var (user, userSettings) =
|
var (user, userSettings) =
|
||||||
((RootUser, ViewUserSettings))result.Data;
|
((RootUser, ViewUserSettings))result.Data;
|
||||||
var jwtUser = AuthTokenManager.GenerateToken(user, userSettings);
|
var jwtUser = AuthTokenManager.GenerateToken(user, userSettings);
|
||||||
Logger.LogInformation(
|
|
||||||
$"{nameof(Login)}();IP:[{HttpContext.Connection?.RemoteIpAddress}];\nUser-Agent:[{Request.Headers["User-Agent"]}];\nUserId:[{user.ID}]");
|
|
||||||
|
|
||||||
return Ok(jwtUser);
|
return Ok(jwtUser);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.LogError(ex, $"{nameof(User)}.{nameof(Login)}()");
|
Logger.LogError(ex, $"{nameof(User)}.{nameof(Login)}()");
|
||||||
return BadRequest(result.Invalidate(ex.Message));
|
return BadRequest(result.Invalidate(Localizer["Something went wrong."]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -118,6 +118,11 @@ namespace PrivaPub.Controllers.ClientToServer
|
|||||||
if (!invitation.IsValid)
|
if (!invitation.IsValid)
|
||||||
return StatusCode(invitation.StatusCode, invitation);
|
return StatusCode(invitation.StatusCode, invitation);
|
||||||
|
|
||||||
|
var avatarUserName = signUpForm.AvatarUserName?.Trim().ToLowerInvariant();
|
||||||
|
var personaProblem = await PersonaProblem(avatarUserName, signUpForm.UserName, token);
|
||||||
|
if (personaProblem != default)
|
||||||
|
return BadRequest(result.Invalidate(personaProblem));
|
||||||
|
|
||||||
result = await UsersService.SignUpAsync(signUpForm, signUpForm.InvitationCode);
|
result = await UsersService.SignUpAsync(signUpForm, signUpForm.InvitationCode);
|
||||||
if (!result.IsValid)
|
if (!result.IsValid)
|
||||||
return StatusCode(result.StatusCode, result);
|
return StatusCode(result.StatusCode, result);
|
||||||
@@ -126,8 +131,8 @@ namespace PrivaPub.Controllers.ClientToServer
|
|||||||
var avatar = await AvatarUsersService.InsertAvatar(new InsertAvatarForm
|
var avatar = await AvatarUsersService.InsertAvatar(new InsertAvatarForm
|
||||||
{
|
{
|
||||||
RootId = user.ID,
|
RootId = user.ID,
|
||||||
Name = user.UserName,
|
Name = string.IsNullOrWhiteSpace(signUpForm.AvatarName) ? avatarUserName : signUpForm.AvatarName.Trim(),
|
||||||
UserName = user.UserName,
|
UserName = avatarUserName,
|
||||||
Biography = string.Empty
|
Biography = string.Empty
|
||||||
});
|
});
|
||||||
if (!avatar.IsValid)
|
if (!avatar.IsValid)
|
||||||
@@ -142,14 +147,12 @@ namespace PrivaPub.Controllers.ClientToServer
|
|||||||
if (!joined.IsValid)
|
if (!joined.IsValid)
|
||||||
return StatusCode(joined.StatusCode, joined);
|
return StatusCode(joined.StatusCode, joined);
|
||||||
|
|
||||||
Logger.LogInformation(
|
|
||||||
$"{nameof(InvitationSignUp)}();IP:[{HttpContext.Connection?.RemoteIpAddress}];\nUser-Agent:[{Request.Headers["User-Agent"]}];\nUserId:[{user.ID}]");
|
|
||||||
return Ok(AuthTokenManager.GenerateToken(user, userSettings));
|
return Ok(AuthTokenManager.GenerateToken(user, userSettings));
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.LogError(ex, $"{nameof(User)}.{nameof(InvitationSignUp)}()");
|
Logger.LogError(ex, $"{nameof(User)}.{nameof(InvitationSignUp)}()");
|
||||||
return BadRequest(result.Invalidate(ex.Message));
|
return BadRequest(result.Invalidate(Localizer["Something went wrong."]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -171,14 +174,20 @@ namespace PrivaPub.Controllers.ClientToServer
|
|||||||
var (user, userSettings) = ((RootUser, ViewUserSettings))result.Data;
|
var (user, userSettings) = ((RootUser, ViewUserSettings))result.Data;
|
||||||
|
|
||||||
var avatars = await AvatarUsersService.GetRootAvatars(user.ID, token);
|
var avatars = await AvatarUsersService.GetRootAvatars(user.ID, token);
|
||||||
var avatar = (avatars.Data as List<ViewAvatar>)?.FirstOrDefault();
|
var avatarUserName = loginForm.AvatarUserName?.Trim().ToLowerInvariant();
|
||||||
|
var avatar = string.IsNullOrEmpty(avatarUserName)
|
||||||
|
? (avatars.Data as List<ViewAvatar>)?.FirstOrDefault()
|
||||||
|
: (avatars.Data as List<ViewAvatar>)?.FirstOrDefault(a => a.UserName == avatarUserName);
|
||||||
if (avatar == default)
|
if (avatar == default)
|
||||||
{
|
{
|
||||||
|
var personaProblem = await PersonaProblem(avatarUserName, user.UserName, token);
|
||||||
|
if (personaProblem != default)
|
||||||
|
return BadRequest(new WebResult().Invalidate(personaProblem));
|
||||||
var inserted = await AvatarUsersService.InsertAvatar(new InsertAvatarForm
|
var inserted = await AvatarUsersService.InsertAvatar(new InsertAvatarForm
|
||||||
{
|
{
|
||||||
RootId = user.ID,
|
RootId = user.ID,
|
||||||
Name = user.UserName,
|
Name = string.IsNullOrWhiteSpace(loginForm.AvatarName) ? avatarUserName : loginForm.AvatarName.Trim(),
|
||||||
UserName = user.UserName,
|
UserName = avatarUserName,
|
||||||
Biography = string.Empty
|
Biography = string.Empty
|
||||||
});
|
});
|
||||||
if (!inserted.IsValid)
|
if (!inserted.IsValid)
|
||||||
@@ -195,17 +204,26 @@ namespace PrivaPub.Controllers.ClientToServer
|
|||||||
if (!joined.IsValid)
|
if (!joined.IsValid)
|
||||||
return StatusCode(joined.StatusCode, joined);
|
return StatusCode(joined.StatusCode, joined);
|
||||||
|
|
||||||
Logger.LogInformation(
|
|
||||||
$"{nameof(InvitationLogin)}();IP:[{HttpContext.Connection?.RemoteIpAddress}];\nUser-Agent:[{Request.Headers["User-Agent"]}];\nUserId:[{user.ID}]");
|
|
||||||
return Ok(AuthTokenManager.GenerateToken(user, userSettings));
|
return Ok(AuthTokenManager.GenerateToken(user, userSettings));
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.LogError(ex, $"{nameof(User)}.{nameof(InvitationLogin)}()");
|
Logger.LogError(ex, $"{nameof(User)}.{nameof(InvitationLogin)}()");
|
||||||
return BadRequest(result.Invalidate(ex.Message));
|
return BadRequest(result.Invalidate(Localizer["Something went wrong."]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async Task<string> PersonaProblem(string avatarUserName, string rootUserName, CancellationToken token)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(avatarUserName))
|
||||||
|
return Localizer["Choose a username for your persona."];
|
||||||
|
if (string.Equals(avatarUserName, rootUserName?.Trim(), StringComparison.OrdinalIgnoreCase))
|
||||||
|
return Localizer["Your persona's username must differ from your login."];
|
||||||
|
if (await LocalActors.IsUserNameTaken(avatarUserName, token))
|
||||||
|
return Localizer["The username '{0}' is already take.", avatarUserName];
|
||||||
|
return default;
|
||||||
|
}
|
||||||
|
|
||||||
[HttpGet, Route("/clientapi/user/logout"), Authorize(Policy = Policies.IsUser)]
|
[HttpGet, Route("/clientapi/user/logout"), Authorize(Policy = Policies.IsUser)]
|
||||||
public IActionResult Logout()
|
public IActionResult Logout()
|
||||||
{
|
{
|
||||||
@@ -217,7 +235,7 @@ namespace PrivaPub.Controllers.ClientToServer
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.LogError(ex, $"{nameof(User)}.{nameof(Logout)}()");
|
Logger.LogError(ex, $"{nameof(User)}.{nameof(Logout)}()");
|
||||||
return BadRequest(result.Invalidate(ex.Message));
|
return BadRequest(result.Invalidate(Localizer["Something went wrong."]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -238,7 +256,7 @@ namespace PrivaPub.Controllers.ClientToServer
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.LogError(ex, $"{nameof(User)}.{nameof(UpdateUser)}()");
|
Logger.LogError(ex, $"{nameof(User)}.{nameof(UpdateUser)}()");
|
||||||
return BadRequest(result.Invalidate(ex.Message));
|
return BadRequest(result.Invalidate(Localizer["Something went wrong."]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -259,7 +277,7 @@ namespace PrivaPub.Controllers.ClientToServer
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.LogError(ex, $"{nameof(User)}.{nameof(UpdateUserSettings)}()");
|
Logger.LogError(ex, $"{nameof(User)}.{nameof(UpdateUserSettings)}()");
|
||||||
return BadRequest(result.Invalidate(ex.Message));
|
return BadRequest(result.Invalidate(Localizer["Something went wrong."]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -280,7 +298,7 @@ namespace PrivaPub.Controllers.ClientToServer
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.LogError(ex, $"{nameof(User)}.{nameof(UpdatePassword)}()");
|
Logger.LogError(ex, $"{nameof(User)}.{nameof(UpdatePassword)}()");
|
||||||
return BadRequest(result.Invalidate(ex.Message));
|
return BadRequest(result.Invalidate(Localizer["Something went wrong."]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -299,7 +317,7 @@ namespace PrivaPub.Controllers.ClientToServer
|
|||||||
// catch (Exception ex)
|
// catch (Exception ex)
|
||||||
// {
|
// {
|
||||||
// Logger.LogError(ex, $"{nameof(User)}.{nameof(GetUser)}()");
|
// Logger.LogError(ex, $"{nameof(User)}.{nameof(GetUser)}()");
|
||||||
// return BadRequest(result.Invalidate(ex.Message));
|
// return BadRequest(result.Invalidate(Localizer["Something went wrong."]));
|
||||||
// }
|
// }
|
||||||
//}
|
//}
|
||||||
|
|
||||||
@@ -317,7 +335,7 @@ namespace PrivaPub.Controllers.ClientToServer
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.LogError(ex, $"{nameof(User)}.{nameof(GetUserSettings)}()");
|
Logger.LogError(ex, $"{nameof(User)}.{nameof(GetUserSettings)}()");
|
||||||
return BadRequest(result.Invalidate(ex.Message));
|
return BadRequest(result.Invalidate(Localizer["Something went wrong."]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -341,7 +359,7 @@ namespace PrivaPub.Controllers.ClientToServer
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.LogError(ex, $"{nameof(User)}.{nameof(RecoverPassword)}()");
|
Logger.LogError(ex, $"{nameof(User)}.{nameof(RecoverPassword)}()");
|
||||||
return BadRequest(result.Invalidate(ex.Message));
|
return BadRequest(result.Invalidate(Localizer["Something went wrong."]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -364,7 +382,7 @@ namespace PrivaPub.Controllers.ClientToServer
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.LogError(ex, $"{nameof(User)}.{nameof(IsValidRecoveryCode)}()");
|
Logger.LogError(ex, $"{nameof(User)}.{nameof(IsValidRecoveryCode)}()");
|
||||||
return BadRequest(result.Invalidate(ex.Message));
|
return BadRequest(result.Invalidate(Localizer["Something went wrong."]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -385,7 +403,7 @@ namespace PrivaPub.Controllers.ClientToServer
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.LogError(ex, $"{nameof(User)}.{nameof(ChangePassword)}()");
|
Logger.LogError(ex, $"{nameof(User)}.{nameof(ChangePassword)}()");
|
||||||
return BadRequest(result.Invalidate(ex.Message));
|
return BadRequest(result.Invalidate(Localizer["Something went wrong."]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -406,7 +424,7 @@ namespace PrivaPub.Controllers.ClientToServer
|
|||||||
// catch (Exception ex)
|
// catch (Exception ex)
|
||||||
// {
|
// {
|
||||||
// Logger.LogError(ex, $"{nameof(User)}.{nameof(RemoveSelf)}()");
|
// Logger.LogError(ex, $"{nameof(User)}.{nameof(RemoveSelf)}()");
|
||||||
// return BadRequest(result.Invalidate(ex.Message));
|
// return BadRequest(result.Invalidate(Localizer["Something went wrong."]));
|
||||||
// }
|
// }
|
||||||
//}
|
//}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
using MongoDB.Entities;
|
||||||
|
|
||||||
|
using PrivaPub.ClientModels;
|
||||||
|
using PrivaPub.Models.User;
|
||||||
|
|
||||||
|
namespace PrivaPub.Infrastructure.Cli
|
||||||
|
{
|
||||||
|
public static class AdminCommands
|
||||||
|
{
|
||||||
|
const string Usage = "usage: PrivaPub admin promote|demote <root username>";
|
||||||
|
|
||||||
|
public static async Task<int> Run(string[] args)
|
||||||
|
{
|
||||||
|
if (args is not [("promote" or "demote") and var verb, var userName])
|
||||||
|
{
|
||||||
|
Console.Error.WriteLine(Usage);
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
userName = userName.ToLowerInvariant();
|
||||||
|
var user = await DB.Default.Find<RootUser>().Match(u => u.UserName == userName).ExecuteFirstAsync();
|
||||||
|
if (user == default)
|
||||||
|
{
|
||||||
|
Console.Error.WriteLine($"no root user '{userName}'");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
user.Policies.RemoveAll(p => p is Policies.IsAdmin or Policies.IsModerator);
|
||||||
|
if (verb == "promote")
|
||||||
|
user.Policies.AddRange(new[] { Policies.IsAdmin, Policies.IsModerator });
|
||||||
|
if (!user.Policies.Contains(Policies.IsUser))
|
||||||
|
user.Policies.Add(Policies.IsUser);
|
||||||
|
user.UpdatedAt = DateTime.UtcNow;
|
||||||
|
await DB.Default.SaveAsync(user);
|
||||||
|
|
||||||
|
Console.WriteLine($"{userName}: {string.Join(", ", user.Policies)}");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+12
-2
@@ -11,6 +11,7 @@ using Serilog;
|
|||||||
|
|
||||||
using PrivaPub.Data;
|
using PrivaPub.Data;
|
||||||
using PrivaPub.Extensions;
|
using PrivaPub.Extensions;
|
||||||
|
using PrivaPub.Infrastructure.Cli;
|
||||||
using PrivaPub.Infrastructure.Http;
|
using PrivaPub.Infrastructure.Http;
|
||||||
using PrivaPub.Middleware;
|
using PrivaPub.Middleware;
|
||||||
using PrivaPub.Models;
|
using PrivaPub.Models;
|
||||||
@@ -68,6 +69,12 @@ try
|
|||||||
var mongoSettings = builder.Configuration.GetSection(nameof(MongoSettings)).Get<MongoSettings>();
|
var mongoSettings = builder.Configuration.GetSection(nameof(MongoSettings)).Get<MongoSettings>();
|
||||||
await DB.InitAsync(mongoSettings.Database, MongoClientSettings.FromConnectionString(mongoSettings.ConnectionString));
|
await DB.InitAsync(mongoSettings.Database, MongoClientSettings.FromConnectionString(mongoSettings.ConnectionString));
|
||||||
await DB.Default.MigrateAsync<Program>();
|
await DB.Default.MigrateAsync<Program>();
|
||||||
|
|
||||||
|
if (args is ["admin", ..])
|
||||||
|
{
|
||||||
|
Environment.ExitCode = await AdminCommands.Run(args[1..]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -98,8 +105,11 @@ try
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
app.UseSwagger();
|
if (app.Environment.IsDevelopment())
|
||||||
app.UseSwaggerUI();
|
{
|
||||||
|
app.UseSwagger();
|
||||||
|
app.UseSwaggerUI();
|
||||||
|
}
|
||||||
|
|
||||||
app.UseHttpsRedirection();
|
app.UseHttpsRedirection();
|
||||||
app.UseCors("DefaultCORS");
|
app.UseCors("DefaultCORS");
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ namespace PrivaPub.Services.ClientToServer.Private
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
_logger.LogError(ex, $"{nameof(PrivateAvatarUsersService)}.{nameof(InsertAvatar)}");
|
_logger.LogError(ex, $"{nameof(PrivateAvatarUsersService)}.{nameof(InsertAvatar)}");
|
||||||
return result.Invalidate(_localizer["Error: {0}", ex.Message], exception: ex);
|
return result.Invalidate(_localizer["Something went wrong."], exception: ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -118,7 +118,7 @@ namespace PrivaPub.Services.ClientToServer.Private
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
_logger.LogError(ex, $"{nameof(PrivateAvatarUsersService)}.{nameof(UpdateAvatar)}");
|
_logger.LogError(ex, $"{nameof(PrivateAvatarUsersService)}.{nameof(UpdateAvatar)}");
|
||||||
return result.Invalidate(_localizer["Error: {0}", ex.Message], exception: ex);
|
return result.Invalidate(_localizer["Something went wrong."], exception: ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -139,7 +139,7 @@ namespace PrivaPub.Services.ClientToServer.Private
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
_logger.LogError(ex, $"{nameof(PrivateAvatarUsersService)}.{nameof(GetRootAvatars)}");
|
_logger.LogError(ex, $"{nameof(PrivateAvatarUsersService)}.{nameof(GetRootAvatars)}");
|
||||||
return result.Invalidate(_localizer["Error: {0}", ex.Message], exception: ex);
|
return result.Invalidate(_localizer["Something went wrong."], exception: ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ namespace PrivaPub.Services
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
_logger.LogError(ex, $"{nameof(GroupUsersService)}.{nameof(GetGroup)}");
|
_logger.LogError(ex, $"{nameof(GroupUsersService)}.{nameof(GetGroup)}");
|
||||||
return result.Invalidate(_localizer["Error: {0}", ex.Message], exception: ex);
|
return result.Invalidate(_localizer["Something went wrong."], exception: ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -90,7 +90,7 @@ namespace PrivaPub.Services
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
_logger.LogError(ex, $"{nameof(GroupUsersService)}.{nameof(GetGroups)}");
|
_logger.LogError(ex, $"{nameof(GroupUsersService)}.{nameof(GetGroups)}");
|
||||||
return result.Invalidate(_localizer["Error: {0}", ex.Message], exception: ex);
|
return result.Invalidate(_localizer["Something went wrong."], exception: ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -135,7 +135,7 @@ namespace PrivaPub.Services
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
_logger.LogError(ex, $"{nameof(GroupUsersService)}.{nameof(InsertGroup)}");
|
_logger.LogError(ex, $"{nameof(GroupUsersService)}.{nameof(InsertGroup)}");
|
||||||
return result.Invalidate(_localizer["Error: {0}", ex.Message], exception: ex);
|
return result.Invalidate(_localizer["Something went wrong."], exception: ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -171,7 +171,7 @@ namespace PrivaPub.Services
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
_logger.LogError(ex, $"{nameof(GroupUsersService)}.{nameof(UpdateGroup)}");
|
_logger.LogError(ex, $"{nameof(GroupUsersService)}.{nameof(UpdateGroup)}");
|
||||||
return result.Invalidate(_localizer["Error: {0}", ex.Message], exception: ex);
|
return result.Invalidate(_localizer["Something went wrong."], exception: ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -211,7 +211,7 @@ namespace PrivaPub.Services
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
_logger.LogError(ex, $"{nameof(GroupUsersService)}.{nameof(JoinGroup)}");
|
_logger.LogError(ex, $"{nameof(GroupUsersService)}.{nameof(JoinGroup)}");
|
||||||
return result.Invalidate(_localizer["Error: {0}", ex.Message], exception: ex);
|
return result.Invalidate(_localizer["Something went wrong."], exception: ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -237,7 +237,7 @@ namespace PrivaPub.Services
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
_logger.LogError(ex, $"{nameof(GroupUsersService)}.{nameof(LeaveGroup)}");
|
_logger.LogError(ex, $"{nameof(GroupUsersService)}.{nameof(LeaveGroup)}");
|
||||||
return result.Invalidate(_localizer["Error: {0}", ex.Message], exception: ex);
|
return result.Invalidate(_localizer["Something went wrong."], exception: ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -279,7 +279,7 @@ namespace PrivaPub.Services
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
_logger.LogError(ex, $"{nameof(GroupUsersService)}.{nameof(ApproveMember)}");
|
_logger.LogError(ex, $"{nameof(GroupUsersService)}.{nameof(ApproveMember)}");
|
||||||
return result.Invalidate(_localizer["Error: {0}", ex.Message], exception: ex);
|
return result.Invalidate(_localizer["Something went wrong."], exception: ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ namespace PrivaPub.Services
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
_logger.LogError(ex, $"{nameof(PostsService)}.{nameof(InsertPost)}");
|
_logger.LogError(ex, $"{nameof(PostsService)}.{nameof(InsertPost)}");
|
||||||
return result.Invalidate(_localizer["Error: {0}", ex.Message], exception: ex);
|
return result.Invalidate(_localizer["Something went wrong."], exception: ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -150,7 +150,7 @@ namespace PrivaPub.Services
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
_logger.LogError(ex, $"{nameof(PostsService)}.{nameof(DeletePost)}");
|
_logger.LogError(ex, $"{nameof(PostsService)}.{nameof(DeletePost)}");
|
||||||
return result.Invalidate(_localizer["Error: {0}", ex.Message], exception: ex);
|
return result.Invalidate(_localizer["Something went wrong."], exception: ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -183,7 +183,7 @@ namespace PrivaPub.Services
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
_logger.LogError(ex, $"{nameof(PostsService)}.{nameof(GetPosts)}");
|
_logger.LogError(ex, $"{nameof(PostsService)}.{nameof(GetPosts)}");
|
||||||
return result.Invalidate(_localizer["Error: {0}", ex.Message], exception: ex);
|
return result.Invalidate(_localizer["Something went wrong."], exception: ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -272,7 +272,7 @@ namespace PrivaPub.Services
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
_logger.LogError(ex, $"{nameof(PostsService)}.{nameof(InsertDm)}");
|
_logger.LogError(ex, $"{nameof(PostsService)}.{nameof(InsertDm)}");
|
||||||
return result.Invalidate(_localizer["Error: {0}", ex.Message], exception: ex);
|
return result.Invalidate(_localizer["Something went wrong."], exception: ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -317,7 +317,7 @@ namespace PrivaPub.Services
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
_logger.LogError(ex, $"{nameof(PostsService)}.{nameof(GetDms)}");
|
_logger.LogError(ex, $"{nameof(PostsService)}.{nameof(GetDms)}");
|
||||||
return result.Invalidate(_localizer["Error: {0}", ex.Message], exception: ex);
|
return result.Invalidate(_localizer["Something went wrong."], exception: ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -64,13 +64,6 @@ namespace PrivaPub.Services
|
|||||||
UserName = signUpForm.UserName,
|
UserName = signUpForm.UserName,
|
||||||
HashedPassword = signUpPasswordHashed
|
HashedPassword = signUpPasswordHashed
|
||||||
};
|
};
|
||||||
if (signUpForm.UserName == "admin")
|
|
||||||
{
|
|
||||||
newUser.Policies.Clear();
|
|
||||||
newUser.Policies.Add(Policies.IsAdmin);
|
|
||||||
newUser.Policies.Add(Policies.IsUser);
|
|
||||||
newUser.Policies.Add(Policies.IsModerator);
|
|
||||||
}
|
|
||||||
|
|
||||||
var cultureLanguage = CultureInfo.CurrentCulture.TwoLetterISOLanguageName;
|
var cultureLanguage = CultureInfo.CurrentCulture.TwoLetterISOLanguageName;
|
||||||
var language = await DbEntities.Languages.Match(l => l.International2Code == cultureLanguage).ExecuteFirstAsync();
|
var language = await DbEntities.Languages.Match(l => l.International2Code == cultureLanguage).ExecuteFirstAsync();
|
||||||
@@ -111,7 +104,7 @@ namespace PrivaPub.Services
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.LogError(ex, $"{nameof(RootUsersService)}.{nameof(SignUpAsync)}()");
|
Logger.LogError(ex, $"{nameof(RootUsersService)}.{nameof(SignUpAsync)}()");
|
||||||
return result.Invalidate(ex.Message, exception: ex);
|
return result.Invalidate(Localizer["Something went wrong."], exception: ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -165,7 +158,7 @@ namespace PrivaPub.Services
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.LogError(ex, $"{nameof(RootUsersService)}.{nameof(LoginAsync)}()");
|
Logger.LogError(ex, $"{nameof(RootUsersService)}.{nameof(LoginAsync)}()");
|
||||||
return result.Invalidate(ex.Message, exception: ex);
|
return result.Invalidate(Localizer["Something went wrong."], exception: ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -192,7 +185,7 @@ namespace PrivaPub.Services
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.LogError(ex, $"{nameof(RootUsersService)}.{nameof(UpdateUserAsync)}()");
|
Logger.LogError(ex, $"{nameof(RootUsersService)}.{nameof(UpdateUserAsync)}()");
|
||||||
return result.Invalidate(ex.Message, exception: ex);
|
return result.Invalidate(Localizer["Something went wrong."], exception: ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -230,7 +223,7 @@ namespace PrivaPub.Services
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.LogError(ex, $"{nameof(RootUsersService)}.{nameof(UpdateUserSettingsAsync)}()");
|
Logger.LogError(ex, $"{nameof(RootUsersService)}.{nameof(UpdateUserSettingsAsync)}()");
|
||||||
return result.Invalidate(ex.Message, exception: ex);
|
return result.Invalidate(Localizer["Something went wrong."], exception: ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -259,7 +252,7 @@ namespace PrivaPub.Services
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.LogError(ex, $"{nameof(RootUsersService)}.{nameof(UpdateUserPasswordAsync)}()");
|
Logger.LogError(ex, $"{nameof(RootUsersService)}.{nameof(UpdateUserPasswordAsync)}()");
|
||||||
return result.Invalidate(ex.Message, exception: ex);
|
return result.Invalidate(Localizer["Something went wrong."], exception: ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -291,7 +284,7 @@ namespace PrivaPub.Services
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.LogError(ex, $"{nameof(RootUsersService)}.{nameof(RemoveUserAsync)}()");
|
Logger.LogError(ex, $"{nameof(RootUsersService)}.{nameof(RemoveUserAsync)}()");
|
||||||
return result.Invalidate(ex.Message, exception: ex);
|
return result.Invalidate(Localizer["Something went wrong."], exception: ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -310,7 +303,7 @@ namespace PrivaPub.Services
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.LogError(ex, $"{nameof(RootUsersService)}.{nameof(BanUserAsync)}()");
|
Logger.LogError(ex, $"{nameof(RootUsersService)}.{nameof(BanUserAsync)}()");
|
||||||
return result.Invalidate(ex.Message, exception: ex);
|
return result.Invalidate(Localizer["Something went wrong."], exception: ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -329,7 +322,7 @@ namespace PrivaPub.Services
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.LogError(ex, $"{nameof(RootUsersService)}.{nameof(UnbanUserAsync)}()");
|
Logger.LogError(ex, $"{nameof(RootUsersService)}.{nameof(UnbanUserAsync)}()");
|
||||||
return result.Invalidate(ex.Message, exception: ex);
|
return result.Invalidate(Localizer["Something went wrong."], exception: ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -357,7 +350,7 @@ namespace PrivaPub.Services
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.LogError(ex, $"{nameof(RootUsersService)}.{nameof(GetUserSettingsAsync)}()");
|
Logger.LogError(ex, $"{nameof(RootUsersService)}.{nameof(GetUserSettingsAsync)}()");
|
||||||
return result.Invalidate(ex.Message, exception: ex);
|
return result.Invalidate(Localizer["Something went wrong."], exception: ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -448,30 +441,30 @@ namespace PrivaPub.Services
|
|||||||
{
|
{
|
||||||
var toParsed = await smtpClient.VerifyAsync(user.Email);
|
var toParsed = await smtpClient.VerifyAsync(user.Email);
|
||||||
if (toParsed == null)
|
if (toParsed == null)
|
||||||
return result.Invalidate($"Invalid email of {user.Email}.", (int)SmtpStatusCode.MailboxUnavailable);
|
return result.Invalidate(Localizer["Invalid email."], (int)SmtpStatusCode.MailboxUnavailable);
|
||||||
}
|
}
|
||||||
catch (OperationCanceledException ex)
|
catch (OperationCanceledException ex)
|
||||||
{
|
{
|
||||||
Logger.LogWarning(
|
Logger.LogWarning(
|
||||||
$"SMTP operation canceled exception at email verification of {user.Email}. Exception=[{ex.Message}]");
|
"SMTP operation canceled at email verification: {Error}", ex.Message);
|
||||||
}
|
}
|
||||||
catch (SmtpCommandException ex)
|
catch (SmtpCommandException ex)
|
||||||
{
|
{
|
||||||
Logger.LogWarning(
|
Logger.LogWarning(
|
||||||
$"SMTP command exception at email verification of {user.Email}. Exception=[{ex.Message}]");
|
"SMTP command exception at email verification: {Error}", ex.Message);
|
||||||
}
|
}
|
||||||
catch (SmtpProtocolException ex)
|
catch (SmtpProtocolException ex)
|
||||||
{
|
{
|
||||||
Logger.LogWarning(
|
Logger.LogWarning(
|
||||||
$"SMTP protocol exception at email verification of {user.Email}. Exception=[{ex.Message}]");
|
"SMTP protocol exception at email verification: {Error}", ex.Message);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.LogWarning($"General exception at email verification of {user.Email}. Exception=[{ex.Message}]");
|
Logger.LogWarning("Exception at email verification: {Error}", ex.Message);
|
||||||
}
|
}
|
||||||
|
|
||||||
var message = new MimeMessage();
|
var message = new MimeMessage();
|
||||||
message.From.Add(new MailboxAddress(Localizer["Eugene - collAnon support"], AppConfigurationService.AppConfiguration.EmailConfiguration.SmtpUsername));
|
message.From.Add(new MailboxAddress("PrivaPub", AppConfigurationService.AppConfiguration.EmailConfiguration.SmtpUsername));
|
||||||
message.To.Add(MailboxAddress.Parse(user.Email));
|
message.To.Add(MailboxAddress.Parse(user.Email));
|
||||||
message.Subject = Localizer["PrivaPub - Password recovery link"];
|
message.Subject = Localizer["PrivaPub - Password recovery link"];
|
||||||
message.Body = new TextPart("plain")
|
message.Body = new TextPart("plain")
|
||||||
@@ -501,7 +494,7 @@ Eugene from collAnon, following is the password recovery link:
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.LogError(ex, $"{nameof(RootUsersService)}.{nameof(SetupAndSendRecoveryEmail)}()");
|
Logger.LogError(ex, $"{nameof(RootUsersService)}.{nameof(SetupAndSendRecoveryEmail)}()");
|
||||||
return result.Invalidate(ex.Message, exception: ex);
|
return result.Invalidate(Localizer["Something went wrong."], exception: ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -519,7 +512,7 @@ Eugene from collAnon, following is the password recovery link:
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
return result.Invalidate(ex.Message, exception: ex);
|
return result.Invalidate(Localizer["Something went wrong."], exception: ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -555,7 +548,7 @@ Eugene from collAnon, following is the password recovery link:
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.LogError(ex, $"{nameof(RootUsersService)}.{nameof(ChangePassword)}()");
|
Logger.LogError(ex, $"{nameof(RootUsersService)}.{nameof(ChangePassword)}()");
|
||||||
return result.Invalidate(ex.Message, exception: ex);
|
return result.Invalidate(Localizer["Something went wrong."], exception: ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user