From 0f850307448fae0219e23da7e940ee647e7ca840 Mon Sep 17 00:00:00 2001 From: thepra Date: Thu, 1 Oct 2026 10:58:39 +0200 Subject: [PATCH] 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 ` (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 Claude-Session: https://claude.ai/code/session_012CzABvBkbcFqoHdmi8b9WB --- PrivaPub.ClientModels/InvitationLoginForm.cs | 7 ++ .../ClientToServer/AdminController.cs | 8 +-- .../ClientToServer/DataController.cs | 2 +- .../ClientToServer/PrivateAvatarController.cs | 4 +- .../ClientToServer/RootUserController.cs | 72 ++++++++++++------- PrivaPub/Infrastructure/Cli/AdminCommands.cs | 40 +++++++++++ PrivaPub/Program.cs | 14 +++- .../Private/IPrivateAvatarUsersService.cs | 6 +- PrivaPub/Services/GroupUsersService.cs | 14 ++-- PrivaPub/Services/PostsService.cs | 10 +-- PrivaPub/Services/RootUsersService.cs | 43 +++++------ 11 files changed, 144 insertions(+), 76 deletions(-) create mode 100644 PrivaPub/Infrastructure/Cli/AdminCommands.cs diff --git a/PrivaPub.ClientModels/InvitationLoginForm.cs b/PrivaPub.ClientModels/InvitationLoginForm.cs index b1da56c..8c08647 100644 --- a/PrivaPub.ClientModels/InvitationLoginForm.cs +++ b/PrivaPub.ClientModels/InvitationLoginForm.cs @@ -10,5 +10,12 @@ namespace PrivaPub.ClientModels StringLength(Constants.GroupInvitationLength, MinimumLength = Constants.GroupInvitationLength, ErrorMessageResourceName = "StringLengthMinMax", ErrorMessageResourceType = typeof(ErrorsResource))] 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; } } } diff --git a/PrivaPub/Controllers/ClientToServer/AdminController.cs b/PrivaPub/Controllers/ClientToServer/AdminController.cs index 76770b6..130b886 100644 --- a/PrivaPub/Controllers/ClientToServer/AdminController.cs +++ b/PrivaPub/Controllers/ClientToServer/AdminController.cs @@ -45,7 +45,7 @@ namespace PrivaPub.Controllers.ClientToServer catch (Exception ex) { 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) { 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) { 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) // { // Logger.LogError(ex, $"{nameof(User)}.{nameof(GetUsers)}()"); - // return BadRequest(result.Invalidate(ex.Message)); + // return BadRequest(result.Invalidate(Localizer["Something went wrong."])); // } //} } diff --git a/PrivaPub/Controllers/ClientToServer/DataController.cs b/PrivaPub/Controllers/ClientToServer/DataController.cs index a1501e8..9b64a56 100644 --- a/PrivaPub/Controllers/ClientToServer/DataController.cs +++ b/PrivaPub/Controllers/ClientToServer/DataController.cs @@ -48,7 +48,7 @@ namespace PrivaPub.Controllers.ClientToServer catch (Exception ex) { Logger.LogError(ex, $"{nameof(DataController)}.{nameof(Languages)}()"); - return BadRequest(result.Invalidate(ex.Message, exception: ex)); + return BadRequest(result.Invalidate("Something went wrong.", exception: ex)); } } } diff --git a/PrivaPub/Controllers/ClientToServer/PrivateAvatarController.cs b/PrivaPub/Controllers/ClientToServer/PrivateAvatarController.cs index 8dcbfc1..a8e1098 100644 --- a/PrivaPub/Controllers/ClientToServer/PrivateAvatarController.cs +++ b/PrivaPub/Controllers/ClientToServer/PrivateAvatarController.cs @@ -52,7 +52,7 @@ namespace PrivaPub.Controllers.ClientToServer catch (Exception ex) { _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) { _logger.LogError(ex, $"{nameof(PrivateAvatarController)}.{nameof(UpdateAvatar)}()"); - return BadRequest(result.Invalidate(ex.Message)); + return BadRequest(result.Invalidate(_localizer["Something went wrong."])); } } diff --git a/PrivaPub/Controllers/ClientToServer/RootUserController.cs b/PrivaPub/Controllers/ClientToServer/RootUserController.cs index f4e565c..496eef2 100644 --- a/PrivaPub/Controllers/ClientToServer/RootUserController.cs +++ b/PrivaPub/Controllers/ClientToServer/RootUserController.cs @@ -10,6 +10,7 @@ using PrivaPub.ClientModels.Group; using PrivaPub.ClientModels.User; using PrivaPub.ClientModels.User.Avatar; using PrivaPub.Extensions; +using PrivaPub.Federation.Actors; using PrivaPub.Models; using PrivaPub.Models.User; using PrivaPub.Resources; @@ -28,6 +29,7 @@ namespace PrivaPub.Controllers.ClientToServer readonly IRootUsersService UsersService; readonly IGroupUsersService GroupUsersService; readonly IPrivateAvatarUsersService AvatarUsersService; + readonly ILocalActorService LocalActors; readonly AuthTokenManager AuthTokenManager; readonly IOptionsMonitor AppConfiguration; readonly ILogger Logger; @@ -36,6 +38,7 @@ namespace PrivaPub.Controllers.ClientToServer public RootUserController(IRootUsersService usersService, IGroupUsersService groupUsersService, IPrivateAvatarUsersService avatarUsersService, + ILocalActorService localActors, AuthTokenManager authTokenManager, IOptionsMonitor appConfiguration, IStringLocalizer localizer, @@ -44,6 +47,7 @@ namespace PrivaPub.Controllers.ClientToServer UsersService = usersService; GroupUsersService = groupUsersService; AvatarUsersService = avatarUsersService; + LocalActors = localActors; AuthTokenManager = authTokenManager; AppConfiguration = appConfiguration; Localizer = localizer; @@ -67,14 +71,12 @@ namespace PrivaPub.Controllers.ClientToServer (var user, var userSettings) = ((RootUser, ViewUserSettings))result.Data; 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); } catch (Exception ex) { 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) = ((RootUser, ViewUserSettings))result.Data; 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); } catch (Exception ex) { 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) 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); if (!result.IsValid) return StatusCode(result.StatusCode, result); @@ -126,8 +131,8 @@ namespace PrivaPub.Controllers.ClientToServer var avatar = await AvatarUsersService.InsertAvatar(new InsertAvatarForm { RootId = user.ID, - Name = user.UserName, - UserName = user.UserName, + Name = string.IsNullOrWhiteSpace(signUpForm.AvatarName) ? avatarUserName : signUpForm.AvatarName.Trim(), + UserName = avatarUserName, Biography = string.Empty }); if (!avatar.IsValid) @@ -142,14 +147,12 @@ namespace PrivaPub.Controllers.ClientToServer if (!joined.IsValid) 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)); } catch (Exception ex) { 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 avatars = await AvatarUsersService.GetRootAvatars(user.ID, token); - var avatar = (avatars.Data as List)?.FirstOrDefault(); + var avatarUserName = loginForm.AvatarUserName?.Trim().ToLowerInvariant(); + var avatar = string.IsNullOrEmpty(avatarUserName) + ? (avatars.Data as List)?.FirstOrDefault() + : (avatars.Data as List)?.FirstOrDefault(a => a.UserName == avatarUserName); 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 { RootId = user.ID, - Name = user.UserName, - UserName = user.UserName, + Name = string.IsNullOrWhiteSpace(loginForm.AvatarName) ? avatarUserName : loginForm.AvatarName.Trim(), + UserName = avatarUserName, Biography = string.Empty }); if (!inserted.IsValid) @@ -195,17 +204,26 @@ namespace PrivaPub.Controllers.ClientToServer if (!joined.IsValid) 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)); } catch (Exception ex) { Logger.LogError(ex, $"{nameof(User)}.{nameof(InvitationLogin)}()"); - return BadRequest(result.Invalidate(ex.Message)); + return BadRequest(result.Invalidate(Localizer["Something went wrong."])); } } + async Task 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)] public IActionResult Logout() { @@ -217,7 +235,7 @@ namespace PrivaPub.Controllers.ClientToServer catch (Exception ex) { 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) { 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) { 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) { 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) // { // 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) { 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) { 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) { 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) { 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) // { // Logger.LogError(ex, $"{nameof(User)}.{nameof(RemoveSelf)}()"); - // return BadRequest(result.Invalidate(ex.Message)); + // return BadRequest(result.Invalidate(Localizer["Something went wrong."])); // } //} diff --git a/PrivaPub/Infrastructure/Cli/AdminCommands.cs b/PrivaPub/Infrastructure/Cli/AdminCommands.cs new file mode 100644 index 0000000..184c1ce --- /dev/null +++ b/PrivaPub/Infrastructure/Cli/AdminCommands.cs @@ -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 "; + + public static async Task 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().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; + } + } +} diff --git a/PrivaPub/Program.cs b/PrivaPub/Program.cs index 459d9d0..27f44a2 100644 --- a/PrivaPub/Program.cs +++ b/PrivaPub/Program.cs @@ -11,6 +11,7 @@ using Serilog; using PrivaPub.Data; using PrivaPub.Extensions; +using PrivaPub.Infrastructure.Cli; using PrivaPub.Infrastructure.Http; using PrivaPub.Middleware; using PrivaPub.Models; @@ -68,6 +69,12 @@ try var mongoSettings = builder.Configuration.GetSection(nameof(MongoSettings)).Get(); await DB.InitAsync(mongoSettings.Database, MongoClientSettings.FromConnectionString(mongoSettings.ConnectionString)); await DB.Default.MigrateAsync(); + + if (args is ["admin", ..]) + { + Environment.ExitCode = await AdminCommands.Run(args[1..]); + return; + } } catch (Exception ex) { @@ -98,8 +105,11 @@ try }); } - app.UseSwagger(); - app.UseSwaggerUI(); + if (app.Environment.IsDevelopment()) + { + app.UseSwagger(); + app.UseSwaggerUI(); + } app.UseHttpsRedirection(); app.UseCors("DefaultCORS"); diff --git a/PrivaPub/Services/ClientToServer/Private/IPrivateAvatarUsersService.cs b/PrivaPub/Services/ClientToServer/Private/IPrivateAvatarUsersService.cs index 5fd606a..a8ff825 100644 --- a/PrivaPub/Services/ClientToServer/Private/IPrivateAvatarUsersService.cs +++ b/PrivaPub/Services/ClientToServer/Private/IPrivateAvatarUsersService.cs @@ -81,7 +81,7 @@ namespace PrivaPub.Services.ClientToServer.Private catch (Exception ex) { _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) { _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) { _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); } } diff --git a/PrivaPub/Services/GroupUsersService.cs b/PrivaPub/Services/GroupUsersService.cs index 908d39b..be2b23f 100644 --- a/PrivaPub/Services/GroupUsersService.cs +++ b/PrivaPub/Services/GroupUsersService.cs @@ -69,7 +69,7 @@ namespace PrivaPub.Services catch (Exception ex) { _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) { _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) { _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) { _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) { _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) { _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) { _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); } } diff --git a/PrivaPub/Services/PostsService.cs b/PrivaPub/Services/PostsService.cs index 6062a68..d36b3ac 100644 --- a/PrivaPub/Services/PostsService.cs +++ b/PrivaPub/Services/PostsService.cs @@ -112,7 +112,7 @@ namespace PrivaPub.Services catch (Exception ex) { _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) { _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) { _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) { _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) { _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); } } diff --git a/PrivaPub/Services/RootUsersService.cs b/PrivaPub/Services/RootUsersService.cs index 6aeed00..898f08e 100644 --- a/PrivaPub/Services/RootUsersService.cs +++ b/PrivaPub/Services/RootUsersService.cs @@ -64,13 +64,6 @@ namespace PrivaPub.Services UserName = signUpForm.UserName, 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 language = await DbEntities.Languages.Match(l => l.International2Code == cultureLanguage).ExecuteFirstAsync(); @@ -111,7 +104,7 @@ namespace PrivaPub.Services catch (Exception ex) { 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) { 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) { 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) { 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) { 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) { 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) { 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) { 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) { 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); 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) { 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) { 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) { 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) { - 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(); - 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.Subject = Localizer["PrivaPub - Password recovery link"]; message.Body = new TextPart("plain") @@ -501,7 +494,7 @@ Eugene from collAnon, following is the password recovery link: catch (Exception ex) { 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) { - 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) { Logger.LogError(ex, $"{nameof(RootUsersService)}.{nameof(ChangePassword)}()"); - return result.Invalidate(ex.Message, exception: ex); + return result.Invalidate(Localizer["Something went wrong."], exception: ex); } }