Fix #5054: parse string to number with invariant culture.

This commit is contained in:
Ben
2025-02-10 16:23:41 +08:00
parent 189f8f1d27
commit 1aabb93f77
37 changed files with 109 additions and 76 deletions

View File

@ -182,7 +182,7 @@
}
// includes resources
var resources = await GetPageResources(alias, site, page, modules, int.Parse(route.ModuleId, CultureInfo.InvariantCulture), route.Action);
var resources = await GetPageResources(alias, site, page, modules, SharedConverter.ParseInteger(route.ModuleId, CultureInfo.InvariantCulture), route.Action);
ManageStyleSheets(resources);
ManageScripts(resources, alias);
@ -423,7 +423,7 @@
// set cookie
if (setcookie)
{
expiry = DateTime.UtcNow.AddMinutes(int.Parse(settings.GetValue("VisitorDuration", "5")));
expiry = DateTime.UtcNow.AddMinutes(SharedConverter.ParseInteger(settings.GetValue("VisitorDuration", "5")));
Context.Response.Cookies.Append(
visitorCookieName,
@ -456,7 +456,7 @@
var secret = sitesettings.GetValue("JwtOptions:Secret", "");
if (!string.IsNullOrEmpty(secret))
{
_authorizationToken = JwtManager.GenerateToken(alias, (ClaimsIdentity)Context.User.Identity, secret, sitesettings.GetValue("JwtOptions:Issuer", ""), sitesettings.GetValue("JwtOptions:Audience", ""), int.Parse(sitesettings.GetValue("JwtOptions:Lifetime", "20")));
_authorizationToken = JwtManager.GenerateToken(alias, (ClaimsIdentity)Context.User.Identity, secret, sitesettings.GetValue("JwtOptions:Issuer", ""), sitesettings.GetValue("JwtOptions:Audience", ""), SharedConverter.ParseInteger(sitesettings.GetValue("JwtOptions:Lifetime", "20")));
}
}
}

View File

@ -530,7 +530,7 @@ namespace Oqtane.Controllers
// parse the filename which is in the format of filename.ext.part_001_999
string token = ".part_";
string parts = Path.GetExtension(filename)?.Replace(token, ""); // returns "001_999"
int totalparts = int.Parse(parts?.Substring(parts.IndexOf("_") + 1));
int totalparts = SharedConverter.ParseInteger(parts?.Substring(parts.IndexOf("_") + 1));
filename = Path.GetFileNameWithoutExtension(filename); // base filename
string[] fileparts = Directory.GetFiles(folder, filename + token + "*"); // list of all file parts

View File

@ -98,7 +98,7 @@ namespace Oqtane.Controllers
if (folder == null && User.IsInRole(RoleNames.Host) && path.StartsWith("Users/"))
{
// create the user folder on this site for the host user
var userId = int.Parse(path.ReplaceMultiple(new string[] { "Users", "/" }, ""));
var userId = SharedConverter.ParseInteger(path.ReplaceMultiple(new string[] { "Users", "/" }, ""));
folder = _folders.GetFolder(siteId, "Users/");
if (folder != null)
{

View File

@ -33,7 +33,7 @@ namespace Oqtane.Controllers
int SiteId;
if (int.TryParse(siteid, out SiteId) && SiteId == _alias.SiteId)
{
return _logs.GetLogs(SiteId, level, function, int.Parse(rows));
return _logs.GetLogs(SiteId, level, function, SharedConverter.ParseInteger(rows));
}
else
{

View File

@ -32,7 +32,7 @@ namespace Oqtane.Controllers
// legacy support
if (_authEntityId.Count == 0 && accessor.HttpContext.Request.Query.ContainsKey("entityid"))
{
_entityId = int.Parse(accessor.HttpContext.Request.Query["entityid"]);
_entityId = SharedConverter.ParseInteger(accessor.HttpContext.Request.Query["entityid"]);
}
}

View File

@ -188,7 +188,7 @@ namespace Oqtane.Controllers
Page page = null;
Page parent = _pages.GetPage(id);
User user = _userPermissions.GetUser(User);
if (parent != null && parent.SiteId == _alias.SiteId && parent.IsPersonalizable && user.UserId == int.Parse(userid))
if (parent != null && parent.SiteId == _alias.SiteId && parent.IsPersonalizable && user.UserId == SharedConverter.ParseInteger(userid))
{
var path = Utilities.GetFriendlyUrl(user.Username);
page = _pages.GetPage(parent.Path + "/" + path, parent.SiteId);
@ -208,12 +208,12 @@ namespace Oqtane.Controllers
page.Icon = parent.Icon;
page.PermissionList = new List<Permission>()
{
new Permission(PermissionNames.View, int.Parse(userid), true),
new Permission(PermissionNames.View, SharedConverter.ParseInteger(userid), true),
new Permission(PermissionNames.View, RoleNames.Everyone, true),
new Permission(PermissionNames.Edit, int.Parse(userid), true)
new Permission(PermissionNames.Edit, SharedConverter.ParseInteger(userid), true)
};
page.IsPersonalizable = false;
page.UserId = int.Parse(userid);
page.UserId = SharedConverter.ParseInteger(userid);
page = _pages.AddPage(page);
// copy modules
@ -227,9 +227,9 @@ namespace Oqtane.Controllers
module.AllPages = false;
module.PermissionList = new List<Permission>()
{
new Permission(PermissionNames.View, int.Parse(userid), true),
new Permission(PermissionNames.View, SharedConverter.ParseInteger(userid), true),
new Permission(PermissionNames.View, RoleNames.Everyone, true),
new Permission(PermissionNames.Edit, int.Parse(userid), true)
new Permission(PermissionNames.Edit, SharedConverter.ParseInteger(userid), true)
};
module = _modules.AddModule(module);

View File

@ -362,7 +362,7 @@ namespace Oqtane.Controllers
var secret = sitesettings.GetValue("JwtOptions:Secret", "");
if (!string.IsNullOrEmpty(secret))
{
token = _jwtManager.GenerateToken(_tenantManager.GetAlias(), (ClaimsIdentity)User.Identity, secret, sitesettings.GetValue("JwtOptions:Issuer", ""), sitesettings.GetValue("JwtOptions:Audience", ""), int.Parse(sitesettings.GetValue("JwtOptions:Lifetime", "20")));
token = _jwtManager.GenerateToken(_tenantManager.GetAlias(), (ClaimsIdentity)User.Identity, secret, sitesettings.GetValue("JwtOptions:Issuer", ""), sitesettings.GetValue("JwtOptions:Audience", ""), SharedConverter.ParseInteger(sitesettings.GetValue("JwtOptions:Lifetime", "20")));
}
return token;
}

View File

@ -24,7 +24,7 @@ namespace Oqtane.Extensions
{
if (claimsPrincipal.HasClaim(item => item.Type == ClaimTypes.NameIdentifier))
{
return int.Parse(claimsPrincipal.Claims.First(item => item.Type == ClaimTypes.NameIdentifier).Value);
return SharedConverter.ParseInteger(claimsPrincipal.Claims.First(item => item.Type == ClaimTypes.NameIdentifier).Value);
}
else
{
@ -55,7 +55,7 @@ namespace Oqtane.Extensions
var sitekey = SiteKey(claimsPrincipal);
if (!string.IsNullOrEmpty(sitekey) && sitekey.Contains(":"))
{
return int.Parse(sitekey.Split(':')[0]);
return SharedConverter.ParseInteger(sitekey.Split(':')[0]);
}
return -1;
}
@ -65,7 +65,7 @@ namespace Oqtane.Extensions
var sitekey = SiteKey(claimsPrincipal);
if (!string.IsNullOrEmpty(sitekey) && sitekey.Contains(":"))
{
return int.Parse(sitekey.Split(':')[1]);
return SharedConverter.ParseInteger(sitekey.Split(':')[1]);
}
return -1;
}

View File

@ -2,6 +2,7 @@ using Microsoft.Extensions.DependencyInjection;
using Oqtane.Models;
using Microsoft.AspNetCore.Identity;
using System;
using Oqtane.Shared;
namespace Oqtane.Extensions
{
@ -13,15 +14,15 @@ namespace Oqtane.Extensions
builder.AddSiteOptions<IdentityOptions>((options, alias, sitesettings) =>
{
// password options
options.Password.RequiredLength = int.Parse(sitesettings.GetValue("IdentityOptions:Password:RequiredLength", options.Password.RequiredLength.ToString()));
options.Password.RequiredUniqueChars = int.Parse(sitesettings.GetValue("IdentityOptions:Password:RequiredUniqueChars", options.Password.RequiredUniqueChars.ToString()));
options.Password.RequiredLength = SharedConverter.ParseInteger(sitesettings.GetValue("IdentityOptions:Password:RequiredLength", options.Password.RequiredLength.ToString()));
options.Password.RequiredUniqueChars = SharedConverter.ParseInteger(sitesettings.GetValue("IdentityOptions:Password:RequiredUniqueChars", options.Password.RequiredUniqueChars.ToString()));
options.Password.RequireDigit = bool.Parse(sitesettings.GetValue("IdentityOptions:Password:RequireDigit", options.Password.RequireDigit.ToString()));
options.Password.RequireUppercase = bool.Parse(sitesettings.GetValue("IdentityOptions:Password:RequireUppercase", options.Password.RequireUppercase.ToString()));
options.Password.RequireLowercase = bool.Parse(sitesettings.GetValue("IdentityOptions:Password:RequireLowercase", options.Password.RequireLowercase.ToString()));
options.Password.RequireNonAlphanumeric = bool.Parse(sitesettings.GetValue("IdentityOptions:Password:RequireNonAlphanumeric", options.Password.RequireNonAlphanumeric.ToString()));
// lockout options
options.Lockout.MaxFailedAccessAttempts = int.Parse(sitesettings.GetValue("IdentityOptions:Lockout:MaxFailedAccessAttempts", options.Lockout.MaxFailedAccessAttempts.ToString()));
options.Lockout.MaxFailedAccessAttempts = SharedConverter.ParseInteger(sitesettings.GetValue("IdentityOptions:Lockout:MaxFailedAccessAttempts", options.Lockout.MaxFailedAccessAttempts.ToString()));
options.Lockout.DefaultLockoutTimeSpan = TimeZoneInfo.Local.GetUtcOffset(DateTime.UtcNow) + TimeSpan.Parse(sitesettings.GetValue("IdentityOptions:Lockout:DefaultLockoutTimeSpan", options.Lockout.DefaultLockoutTimeSpan.ToString()));
options.Lockout.AllowedForNewUsers = options.Lockout.MaxFailedAccessAttempts > 0;
});

View File

@ -55,7 +55,7 @@ namespace Oqtane.Infrastructure
DeliveryMethod = SmtpDeliveryMethod.Network,
UseDefaultCredentials = false,
Host = settings["SMTPHost"],
Port = int.Parse(settings["SMTPPort"]),
Port = SharedConverter.ParseInteger(settings["SMTPPort"]),
EnableSsl = bool.Parse(settings["SMTPSSL"])
};
if (settings["SMTPUsername"] != "" && settings["SMTPPassword"] != "")

View File

@ -50,7 +50,7 @@ namespace Oqtane.Infrastructure
retention = 30; // 30 days
if (settings.ContainsKey("LogRetention") && !string.IsNullOrEmpty(settings["LogRetention"]))
{
retention = int.Parse(settings["LogRetention"]);
retention = SharedConverter.ParseInteger(settings["LogRetention"]);
}
try
{
@ -68,7 +68,7 @@ namespace Oqtane.Infrastructure
retention = 30; // 30 days
if (settings.ContainsKey("VisitorRetention") && !string.IsNullOrEmpty(settings["VisitorRetention"]))
{
retention = int.Parse(settings["VisitorRetention"]);
retention = SharedConverter.ParseInteger(settings["VisitorRetention"]);
}
try
{
@ -85,7 +85,7 @@ namespace Oqtane.Infrastructure
retention = 30; // 30 days
if (settings.ContainsKey("NotificationRetention") && !string.IsNullOrEmpty(settings["NotificationRetention"]))
{
retention = int.Parse(settings["NotificationRetention"]);
retention = SharedConverter.ParseInteger(settings["NotificationRetention"]);
}
try
{
@ -101,7 +101,7 @@ namespace Oqtane.Infrastructure
retention = 30; // 30 days
if (settings.ContainsKey("UrlMappingRetention") && !string.IsNullOrEmpty(settings["UrlMappingRetention"]))
{
retention = int.Parse(settings["UrlMappingRetention"]);
retention = SharedConverter.ParseInteger(settings["UrlMappingRetention"]);
}
try
{

View File

@ -59,7 +59,7 @@ namespace Oqtane.Infrastructure
if (userid != null && username != null)
{
var _users = context.RequestServices.GetService(typeof(IUserManager)) as IUserManager;
var user = _users.GetUser(int.Parse(userid), alias.SiteId); // cached
var user = _users.GetUser(SharedConverter.ParseInteger(userid), alias.SiteId); // cached
if (user != null && !user.IsDeleted)
{
var claimsidentity = UserSecurity.CreateClaimsIdentity(alias, user);

View File

@ -158,7 +158,7 @@ namespace Oqtane.Providers
var minimumWordLength = MinimumWordLength;
if (siteSettings.ContainsKey(SearchMinimumWordLengthSetting) && !string.IsNullOrEmpty(siteSettings[SearchMinimumWordLengthSetting]))
{
minimumWordLength = int.Parse(siteSettings[SearchMinimumWordLengthSetting]);
minimumWordLength = SharedConverter.ParseInteger(siteSettings[SearchMinimumWordLengthSetting]);
}
// analyze the search content and save the index words

View File

@ -36,7 +36,7 @@ namespace Oqtane.Services
if (!Enum.TryParse(position, true, out AnchorPositionMode _)) position = "center";
if (!Color.TryParseHex("#" + background, out _)) background = "transparent";
if (!int.TryParse(rotate, out _)) rotate = "0";
rotate = (int.Parse(rotate) < 0 || int.Parse(rotate) > 360) ? "0" : rotate;
rotate = (SharedConverter.ParseInteger(rotate) < 0 || SharedConverter.ParseInteger(rotate) > 360) ? "0" : rotate;
if (!_formats.Contains(format)) format = "png";
using (var stream = new FileStream(filepath, FileMode.Open, FileAccess.Read))

View File

@ -106,7 +106,7 @@ namespace Oqtane.Services
if (permission.Contains(":")) // permission
{
var entityName = permission.Split(":")[0];
var entityId = int.Parse(permission.Split(":")[1]);
var entityId = SharedConverter.ParseInteger(permission.Split(":")[1]);
if (!_userPermissions.IsAuthorized(_accessor.HttpContext.User, searchQuery.SiteId, entityName, entityId, PermissionNames.View))
{
visible = false;