From 1aabb93f77d66c0fa7e1ac53cce3b9d604889fc0 Mon Sep 17 00:00:00 2001 From: Ben Date: Mon, 10 Feb 2025 16:23:41 +0800 Subject: [PATCH] Fix #5054: parse string to number with invariant culture. --- Oqtane.Client/Modules/Admin/Files/Add.razor | 2 +- Oqtane.Client/Modules/Admin/Files/Edit.razor | 2 +- Oqtane.Client/Modules/Admin/Files/Index.razor | 4 +-- Oqtane.Client/Modules/Admin/Jobs/Edit.razor | 4 +-- Oqtane.Client/Modules/Admin/Logs/Index.razor | 4 +-- .../Modules/Admin/Modules/Settings.razor | 2 +- Oqtane.Client/Modules/Admin/Pages/Add.razor | 4 +-- Oqtane.Client/Modules/Admin/Pages/Edit.razor | 6 ++-- .../Modules/Admin/Profiles/Edit.razor | 6 ++-- .../Modules/Admin/SearchResults/Index.razor | 4 +-- Oqtane.Client/Modules/Admin/Site/Index.razor | 4 +-- Oqtane.Client/Modules/Admin/Sites/Add.razor | 2 +- .../Modules/Admin/UrlMappings/Index.razor | 2 +- .../Modules/Admin/UserProfile/Add.razor | 2 +- .../Modules/Admin/Visitors/Index.razor | 6 ++-- .../Modules/Controls/FileManager.razor | 8 ++--- Oqtane.Client/Modules/Controls/Pager.razor | 8 ++--- .../Modules/Controls/PermissionGrid.razor | 2 +- .../Theme/ControlPanelInteractive.razor | 14 ++++---- .../OqtaneTheme/Themes/ThemeSettings.razor | 2 +- Oqtane.Client/UI/SiteRouter.razor | 6 ++-- Oqtane.Server/Components/App.razor | 6 ++-- Oqtane.Server/Controllers/FileController.cs | 2 +- Oqtane.Server/Controllers/FolderController.cs | 2 +- Oqtane.Server/Controllers/LogController.cs | 2 +- .../Controllers/ModuleControllerBase.cs | 2 +- Oqtane.Server/Controllers/PageController.cs | 12 +++---- Oqtane.Server/Controllers/UserController.cs | 2 +- .../Extensions/ClaimsPrincipalExtensions.cs | 6 ++-- .../OqtaneSiteIdentityBuilderExtensions.cs | 7 ++-- .../Infrastructure/Jobs/NotificationJob.cs | 2 +- Oqtane.Server/Infrastructure/Jobs/PurgeJob.cs | 8 ++--- .../Middleware/JwtMiddleware.cs | 2 +- .../Providers/DatabaseSearchProvider.cs | 2 +- Oqtane.Server/Services/ImageService.cs | 2 +- Oqtane.Server/Services/SearchService.cs | 2 +- Oqtane.Shared/Shared/SharedConverter.cs | 32 +++++++++++++++++++ 37 files changed, 109 insertions(+), 76 deletions(-) create mode 100644 Oqtane.Shared/Shared/SharedConverter.cs diff --git a/Oqtane.Client/Modules/Admin/Files/Add.razor b/Oqtane.Client/Modules/Admin/Files/Add.razor index b5abe13c..4212c1ba 100644 --- a/Oqtane.Client/Modules/Admin/Files/Add.razor +++ b/Oqtane.Client/Modules/Admin/Files/Add.razor @@ -73,7 +73,7 @@ if (PageState.QueryString.ContainsKey("id")) { - _folderId = int.Parse(PageState.QueryString["id"]); + _folderId = SharedConverter.ParseInteger(PageState.QueryString["id"]); } } diff --git a/Oqtane.Client/Modules/Admin/Files/Edit.razor b/Oqtane.Client/Modules/Admin/Files/Edit.razor index ec8881b5..c684c4ec 100644 --- a/Oqtane.Client/Modules/Admin/Files/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Files/Edit.razor @@ -212,7 +212,7 @@ folder.SiteId = PageState.Site.SiteId; folder.Name = _name; folder.Type = _type; - folder.Capacity = int.Parse(_capacity); + folder.Capacity = SharedConverter.ParseInteger(_capacity); folder.CacheControl = _cachecontrol; folder.ImageSizes = _imagesizes; folder.IsSystem = _isSystem; diff --git a/Oqtane.Client/Modules/Admin/Files/Index.razor b/Oqtane.Client/Modules/Admin/Files/Index.razor index 06f7e61c..4724384c 100644 --- a/Oqtane.Client/Modules/Admin/Files/Index.razor +++ b/Oqtane.Client/Modules/Admin/Files/Index.razor @@ -119,7 +119,7 @@ else _imageFiles = (string.IsNullOrEmpty(_imageFiles)) ? Constants.ImageFiles : _imageFiles; _uploadableFiles = SettingService.GetSetting(settings, "UploadableFiles", Constants.UploadableFiles); _uploadableFiles = (string.IsNullOrEmpty(_uploadableFiles)) ? Constants.UploadableFiles : _uploadableFiles; - _maxChunkSize = int.Parse(SettingService.GetSetting(settings, "MaxChunkSize", "1")); + _maxChunkSize = SharedConverter.ParseInteger(SettingService.GetSetting(settings, "MaxChunkSize", "1")); } catch (Exception ex) { @@ -137,7 +137,7 @@ else { try { - _folderId = int.Parse((string)e.Value); + _folderId = SharedConverter.ParseInteger((string)e.Value); await GetFiles(); StateHasChanged(); } diff --git a/Oqtane.Client/Modules/Admin/Jobs/Edit.razor b/Oqtane.Client/Modules/Admin/Jobs/Edit.razor index 848ab8e5..173b59ae 100644 --- a/Oqtane.Client/Modules/Admin/Jobs/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Jobs/Edit.razor @@ -174,11 +174,11 @@ } else { - job.Interval = int.Parse(_interval); + job.Interval = SharedConverter.ParseInteger(_interval); } job.StartDate = Utilities.LocalDateAndTimeAsUtc(_startDate, _startTime); job.EndDate = Utilities.LocalDateAndTimeAsUtc(_endDate, _endTime); - job.RetentionHistory = int.Parse(_retentionHistory); + job.RetentionHistory = SharedConverter.ParseInteger(_retentionHistory); job.NextExecution = Utilities.LocalDateAndTimeAsUtc(_nextDate, _nextTime); try diff --git a/Oqtane.Client/Modules/Admin/Logs/Index.razor b/Oqtane.Client/Modules/Admin/Logs/Index.razor index dfb0cf8d..9f4fe747 100644 --- a/Oqtane.Client/Modules/Admin/Logs/Index.razor +++ b/Oqtane.Client/Modules/Admin/Logs/Index.razor @@ -127,7 +127,7 @@ else await GetLogs(); var settings = await SettingService.GetSiteSettingsAsync(PageState.Site.SiteId); - _retention = int.Parse( SettingService.GetSetting(settings, "LogRetention", "30")); + _retention = SharedConverter.ParseInteger( SettingService.GetSetting(settings, "LogRetention", "30")); } catch (Exception ex) { @@ -184,7 +184,7 @@ else private async Task GetLogs() { - _logs = await LogService.GetLogsAsync(PageState.Site.SiteId, ((_level == "-") ? string.Empty : _level), ((_function == "-") ? string.Empty : _function), int.Parse(_rows)); + _logs = await LogService.GetLogsAsync(PageState.Site.SiteId, ((_level == "-") ? string.Empty : _level), ((_function == "-") ? string.Empty : _function), SharedConverter.ParseInteger(_rows)); } private string GetClass(string function) diff --git a/Oqtane.Client/Modules/Admin/Modules/Settings.razor b/Oqtane.Client/Modules/Admin/Modules/Settings.razor index a949271f..8833520d 100644 --- a/Oqtane.Client/Modules/Admin/Modules/Settings.razor +++ b/Oqtane.Client/Modules/Admin/Modules/Settings.razor @@ -256,7 +256,7 @@ return; } var pagemodule = await PageModuleService.GetPageModuleAsync(ModuleState.PageModuleId); - pagemodule.PageId = int.Parse(_pageId); + pagemodule.PageId = SharedConverter.ParseInteger(_pageId); pagemodule.Title = _title; pagemodule.Pane = _pane; pagemodule.EffectiveDate = Utilities.LocalDateAndTimeAsUtc(_effectivedate); diff --git a/Oqtane.Client/Modules/Admin/Pages/Add.razor b/Oqtane.Client/Modules/Admin/Pages/Add.razor index 6deef0eb..08516aa1 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Add.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Add.razor @@ -273,7 +273,7 @@ _containers = ThemeService.GetContainerControls(PageState.Site.Themes, _themetype); _containertype = PageState.Site.DefaultContainerType; _children = new List(); - foreach (Page p in _pages.Where(item => (_parentid == "-1" && item.ParentId == null) || (item.ParentId == int.Parse(_parentid)))) + foreach (Page p in _pages.Where(item => (_parentid == "-1" && item.ParentId == null) || (item.ParentId == SharedConverter.ParseInteger(_parentid)))) { if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.View, p.PermissionList)) { @@ -303,7 +303,7 @@ { _parentid = (string)e.Value; _children = new List(); - foreach (Page p in _pages.Where(item => (_parentid == "-1" && item.ParentId == null) || (item.ParentId == int.Parse(_parentid)))) + foreach (Page p in _pages.Where(item => (_parentid == "-1" && item.ParentId == null) || (item.ParentId == SharedConverter.ParseInteger(_parentid)))) { if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.View, p.PermissionList)) { diff --git a/Oqtane.Client/Modules/Admin/Pages/Edit.razor b/Oqtane.Client/Modules/Admin/Pages/Edit.razor index 436eb45a..9ee33a58 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Edit.razor @@ -386,7 +386,7 @@ _parent = _pages.FirstOrDefault(item => item.PageId == _page.ParentId); } _children = new List(); - foreach (Page p in _pages.Where(item => (_parentid == "-1" && item.ParentId == null) || (item.ParentId == int.Parse(_parentid, CultureInfo.InvariantCulture)))) + foreach (Page p in _pages.Where(item => (_parentid == "-1" && item.ParentId == null) || (item.ParentId == SharedConverter.ParseInteger(_parentid, CultureInfo.InvariantCulture)))) { if (p.PageId != _pageId && UserSecurity.IsAuthorized(PageState.User, PermissionNames.View, p.PermissionList)) { @@ -471,7 +471,7 @@ { _parentid = (string)e.Value; _children = new List(); - foreach (Page p in _pages.Where(item => (_parentid == "-1" && item.ParentId == null) || (item.ParentId == int.Parse(_parentid)))) + foreach (Page p in _pages.Where(item => (_parentid == "-1" && item.ParentId == null) || (item.ParentId == SharedConverter.ParseInteger(_parentid)))) { if (p.PageId != _pageId && UserSecurity.IsAuthorized(PageState.User, PermissionNames.View, p.PermissionList)) { @@ -661,7 +661,7 @@ } else { - await PageService.UpdatePageOrderAsync(_page.SiteId, _page.PageId, int.Parse(_currentparentid)); + await PageService.UpdatePageOrderAsync(_page.SiteId, _page.PageId, SharedConverter.ParseInteger(_currentparentid)); } if (_themeSettingsType != null && _themeSettings is ISettingsControl themeSettingsControl) diff --git a/Oqtane.Client/Modules/Admin/Profiles/Edit.razor b/Oqtane.Client/Modules/Admin/Profiles/Edit.razor index 6c820ac2..6f0f12b0 100644 --- a/Oqtane.Client/Modules/Admin/Profiles/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Profiles/Edit.razor @@ -189,9 +189,9 @@ profile.Title = _title; profile.Description = _description; profile.Category = _category; - profile.ViewOrder = int.Parse(_vieworder); - profile.MaxLength = int.Parse(_maxlength); - profile.Rows = int.Parse(_rows); + profile.ViewOrder = SharedConverter.ParseInteger(_vieworder); + profile.MaxLength = SharedConverter.ParseInteger(_maxlength); + profile.Rows = SharedConverter.ParseInteger(_rows); profile.DefaultValue = _defaultvalue; profile.Options = _options; profile.Validation = _validation; diff --git a/Oqtane.Client/Modules/Admin/SearchResults/Index.razor b/Oqtane.Client/Modules/Admin/SearchResults/Index.razor index 80de5e11..ebd8b492 100644 --- a/Oqtane.Client/Modules/Admin/SearchResults/Index.razor +++ b/Oqtane.Client/Modules/Admin/SearchResults/Index.razor @@ -122,11 +122,11 @@ ExcludeEntities = _excludeEntities, FromDate = (!string.IsNullOrEmpty(_fromDate)) ? DateTime.Parse(_fromDate) : DateTime.MinValue, ToDate = (!string.IsNullOrEmpty(_toDate)) ? DateTime.Parse(_toDate) : DateTime.MaxValue, - PageSize = (!string.IsNullOrEmpty(_pageSize)) ? int.Parse(_pageSize) : int.MaxValue, + PageSize = (!string.IsNullOrEmpty(_pageSize)) ? SharedConverter.ParseInteger(_pageSize) : int.MaxValue, PageIndex = 0, SortField = (!string.IsNullOrEmpty(_sortField)) ? (SearchSortField)Enum.Parse(typeof(SearchSortField), _sortField) : SearchSortField.Relevance, SortOrder = (!string.IsNullOrEmpty(_sortOrder)) ? (SearchSortOrder)Enum.Parse(typeof(SearchSortOrder), _sortOrder) : SearchSortOrder.Descending, - BodyLength = (!string.IsNullOrEmpty(_bodyLength)) ? int.Parse(_bodyLength) : 255 + BodyLength = (!string.IsNullOrEmpty(_bodyLength)) ? SharedConverter.ParseInteger(_bodyLength) : 255 }; _searchResults = await SearchResultsService.GetSearchResultsAsync(searchQuery); diff --git a/Oqtane.Client/Modules/Admin/Site/Index.razor b/Oqtane.Client/Modules/Admin/Site/Index.razor index c23f9732..db3f7b73 100644 --- a/Oqtane.Client/Modules/Admin/Site/Index.razor +++ b/Oqtane.Client/Modules/Admin/Site/Index.razor @@ -530,7 +530,7 @@ _smtpsender = SettingService.GetSetting(settings, "SMTPSender", string.Empty); _smtprelay = SettingService.GetSetting(settings, "SMTPRelay", "False"); _smtpenabled = SettingService.GetSetting(settings, "SMTPEnabled", "True"); - _retention = int.Parse(SettingService.GetSetting(settings, "NotificationRetention", "30")); + _retention = SharedConverter.ParseInteger(SettingService.GetSetting(settings, "NotificationRetention", "30")); // PWA _pwaisenabled = site.PwaIsEnabled.ToString(); @@ -632,7 +632,7 @@ if (site != null) { site.Name = _name; - site.HomePageId = (_homepageid != "-" ? int.Parse(_homepageid) : null); + site.HomePageId = (_homepageid != "-" ? SharedConverter.ParseInteger(_homepageid) : null); site.IsDeleted = (_isdeleted == null ? true : Boolean.Parse(_isdeleted)); // appearance diff --git a/Oqtane.Client/Modules/Admin/Sites/Add.razor b/Oqtane.Client/Modules/Admin/Sites/Add.razor index 47f19b04..bdcf6729 100644 --- a/Oqtane.Client/Modules/Admin/Sites/Add.razor +++ b/Oqtane.Client/Modules/Admin/Sites/Add.razor @@ -383,7 +383,7 @@ else } else { - var tenant = _tenants.FirstOrDefault(item => item.TenantId == int.Parse(_tenantid)); + var tenant = _tenants.FirstOrDefault(item => item.TenantId == SharedConverter.ParseInteger(_tenantid)); if (tenant != null) { config.TenantName = tenant.Name; diff --git a/Oqtane.Client/Modules/Admin/UrlMappings/Index.razor b/Oqtane.Client/Modules/Admin/UrlMappings/Index.razor index 75a4c845..829fee1c 100644 --- a/Oqtane.Client/Modules/Admin/UrlMappings/Index.razor +++ b/Oqtane.Client/Modules/Admin/UrlMappings/Index.razor @@ -90,7 +90,7 @@ else _capturebrokenurls = PageState.Site.CaptureBrokenUrls.ToString(); var settings = await SettingService.GetSiteSettingsAsync(PageState.Site.SiteId); - _retention = int.Parse(SettingService.GetSetting(settings, "UrlMappingRetention", "30")); + _retention = SharedConverter.ParseInteger(SettingService.GetSetting(settings, "UrlMappingRetention", "30")); } private async void MappedChanged(ChangeEventArgs e) diff --git a/Oqtane.Client/Modules/Admin/UserProfile/Add.razor b/Oqtane.Client/Modules/Admin/UserProfile/Add.razor index fca4ddc9..52362f25 100644 --- a/Oqtane.Client/Modules/Admin/UserProfile/Add.razor +++ b/Oqtane.Client/Modules/Admin/UserProfile/Add.razor @@ -56,7 +56,7 @@ { if (!string.IsNullOrEmpty(username.Key) && !string.IsNullOrEmpty(subject)) { - var user = await UserService.GetUserAsync(int.Parse(username.Key), ModuleState.SiteId); + var user = await UserService.GetUserAsync(SharedConverter.ParseInteger(username.Key), ModuleState.SiteId); if (user != null) { var notification = new Notification(PageState.Site.SiteId, PageState.User, user, subject, body); diff --git a/Oqtane.Client/Modules/Admin/Visitors/Index.razor b/Oqtane.Client/Modules/Admin/Visitors/Index.razor index ea5510c0..8bb40884 100644 --- a/Oqtane.Client/Modules/Admin/Visitors/Index.razor +++ b/Oqtane.Client/Modules/Admin/Visitors/Index.razor @@ -135,9 +135,9 @@ else _tracking = PageState.Site.VisitorTracking.ToString(); var settings = await SettingService.GetSiteSettingsAsync(PageState.Site.SiteId); - _duration = int.Parse(SettingService.GetSetting(settings, "VisitorDuration", "5")); + _duration = SharedConverter.ParseInteger(SettingService.GetSetting(settings, "VisitorDuration", "5")); _filter = SettingService.GetSetting(settings, "VisitorFilter", Constants.DefaultVisitorFilter); - _retention = int.Parse(SettingService.GetSetting(settings, "VisitorRetention", "30")); + _retention = SharedConverter.ParseInteger(SettingService.GetSetting(settings, "VisitorRetention", "30")); _correlation = SettingService.GetSetting(settings, "VisitorCorrelation", "true"); } @@ -159,7 +159,7 @@ else { try { - _days = int.Parse(e.Value.ToString()); + _days = SharedConverter.ParseInteger(e.Value.ToString()); await GetVisitors(); StateHasChanged(); } diff --git a/Oqtane.Client/Modules/Controls/FileManager.razor b/Oqtane.Client/Modules/Controls/FileManager.razor index 6a2b979d..ccac2ff9 100644 --- a/Oqtane.Client/Modules/Controls/FileManager.razor +++ b/Oqtane.Client/Modules/Controls/FileManager.razor @@ -295,7 +295,7 @@ _message = string.Empty; try { - FolderId = int.Parse((string)e.Value); + FolderId = SharedConverter.ParseInteger((string)e.Value); await GetFiles(); FileId = -1; _file = null; @@ -313,7 +313,7 @@ private async Task FileChanged(ChangeEventArgs e) { _message = string.Empty; - FileId = int.Parse((string)e.Value); + FileId = SharedConverter.ParseInteger((string)e.Value); await SetImage(); await OnSelect.InvokeAsync(FileId); StateHasChanged(); @@ -386,7 +386,7 @@ if (chunksize == 1) { // if ChunkSize parameter is not overridden use the site setting - chunksize = int.Parse(SettingService.GetSetting(PageState.Site.Settings, "MaxChunkSize", "1")); + chunksize = SharedConverter.ParseInteger(SettingService.GetSetting(PageState.Site.Settings, "MaxChunkSize", "1")); } if (!ShowProgress) @@ -433,7 +433,7 @@ else { // set FileId to first file in upload collection - var file = await FileService.GetFileAsync(int.Parse(folder), uploads[0].Split(":")[0]); + var file = await FileService.GetFileAsync(SharedConverter.ParseInteger(folder), uploads[0].Split(":")[0]); if (file != null) { FileId = file.FileId; diff --git a/Oqtane.Client/Modules/Controls/Pager.razor b/Oqtane.Client/Modules/Controls/Pager.razor index 136f39ff..15f7966b 100644 --- a/Oqtane.Client/Modules/Controls/Pager.razor +++ b/Oqtane.Client/Modules/Controls/Pager.razor @@ -445,17 +445,17 @@ if (!string.IsNullOrEmpty(PageSize)) { - _maxItems = int.Parse(PageSize); + _maxItems = SharedConverter.ParseInteger(PageSize); } if (!string.IsNullOrEmpty(Columns)) { - _columns = int.Parse(Columns); + _columns = SharedConverter.ParseInteger(Columns); } if (!string.IsNullOrEmpty(DisplayPages)) { - _displayPages = int.Parse(DisplayPages); + _displayPages = SharedConverter.ParseInteger(DisplayPages); } if (PageState.QueryString.ContainsKey("page") && int.TryParse(PageState.QueryString["page"], out int page)) @@ -466,7 +466,7 @@ { if (!string.IsNullOrEmpty(CurrentPage)) { - _page = int.Parse(CurrentPage); + _page = SharedConverter.ParseInteger(CurrentPage); } else { diff --git a/Oqtane.Client/Modules/Controls/PermissionGrid.razor b/Oqtane.Client/Modules/Controls/PermissionGrid.razor index 6bd700bd..f60546fb 100644 --- a/Oqtane.Client/Modules/Controls/PermissionGrid.razor +++ b/Oqtane.Client/Modules/Controls/PermissionGrid.razor @@ -278,7 +278,7 @@ { if (!string.IsNullOrEmpty(_user.Key)) { - var user = await UserService.GetUserAsync(int.Parse(_user.Key), ModuleState.SiteId); + var user = await UserService.GetUserAsync(SharedConverter.ParseInteger(_user.Key), ModuleState.SiteId); if (user != null && !_users.Any(item => item.UserId == user.UserId)) { _users.Add(user); diff --git a/Oqtane.Client/Themes/Controls/Theme/ControlPanelInteractive.razor b/Oqtane.Client/Themes/Controls/Theme/ControlPanelInteractive.razor index 5f1f5d5d..2dc9acca 100644 --- a/Oqtane.Client/Themes/Controls/Theme/ControlPanelInteractive.razor +++ b/Oqtane.Client/Themes/Controls/Theme/ControlPanelInteractive.razor @@ -330,7 +330,7 @@ if (_pageId != "-") { _modules = await ModuleService.GetModulesAsync(PageState.Page.SiteId); - _modules = _modules.Where(module => module.PageId == int.Parse(_pageId) && module.IsDeleted == false && + _modules = _modules.Where(module => module.PageId == SharedConverter.ParseInteger(_pageId) && module.IsDeleted == false && UserSecurity.IsAuthorized(PageState.User, PermissionNames.View, module.PermissionList) && (_moduleType == "add" || module.ModuleDefinition.IsPortable)) .ToList(); @@ -345,7 +345,7 @@ { if ((_moduleType == "new" && _moduleDefinitionName != "-") || (_moduleType != "new" && _moduleId != "-")) { - var newModuleId = _moduleId != "-" ? int.Parse(_moduleId) : 0; + var newModuleId = _moduleId != "-" ? SharedConverter.ParseInteger(_moduleId) : 0; if (_moduleType == "new") { Module module = new Module(); @@ -360,7 +360,7 @@ } else if (_moduleType == "copy") { - var module = await ModuleService.GetModuleAsync(int.Parse(_moduleId)); + var module = await ModuleService.GetModuleAsync(SharedConverter.ParseInteger(_moduleId)); module.ModuleId = 0; module.SiteId = PageState.Page.SiteId; module.PageId = PageState.Page.PageId; @@ -368,7 +368,7 @@ module.PermissionList = GenerateDefaultPermissions(module.SiteId); module = await ModuleService.AddModuleAsync(module); - var moduleContent = await ModuleService.ExportModuleAsync(int.Parse(_moduleId), PageState.Page.PageId); + var moduleContent = await ModuleService.ExportModuleAsync(SharedConverter.ParseInteger(_moduleId), PageState.Page.PageId); if (!string.IsNullOrEmpty(moduleContent)) { await ModuleService.ImportModuleAsync(module.ModuleId, PageState.Page.PageId, moduleContent); @@ -391,7 +391,7 @@ } else { - pageModule.Title = _modules.FirstOrDefault(item => item.ModuleId == int.Parse(_moduleId))?.Title; + pageModule.Title = _modules.FirstOrDefault(item => item.ModuleId == SharedConverter.ParseInteger(_moduleId))?.Title; } } @@ -465,13 +465,13 @@ { case "Admin": // get admin dashboard moduleid - moduleId = int.Parse(PageState.Site.Settings[Constants.AdminDashboardModule]); + moduleId = SharedConverter.ParseInteger(PageState.Site.Settings[Constants.AdminDashboardModule]); NavigationManager.NavigateTo(Utilities.EditUrl(PageState.Alias.Path, "admin", moduleId, "Index", "returnurl=" + WebUtility.UrlEncode(PageState.Route.PathAndQuery))); break; case "Add": case "Edit": // get page management moduleid - moduleId = int.Parse(PageState.Site.Settings[Constants.PageManagementModule]); + moduleId = SharedConverter.ParseInteger(PageState.Site.Settings[Constants.PageManagementModule]); NavigationManager.NavigateTo(Utilities.EditUrl(PageState.Alias.Path, "admin/pages", moduleId, location, $"id={PageState.Page.PageId}&returnurl={WebUtility.UrlEncode(PageState.Route.PathAndQuery)}")); break; } diff --git a/Oqtane.Client/Themes/OqtaneTheme/Themes/ThemeSettings.razor b/Oqtane.Client/Themes/OqtaneTheme/Themes/ThemeSettings.razor index d488e108..e7c9befd 100644 --- a/Oqtane.Client/Themes/OqtaneTheme/Themes/ThemeSettings.razor +++ b/Oqtane.Client/Themes/OqtaneTheme/Themes/ThemeSettings.razor @@ -63,7 +63,7 @@ { if (PageState.QueryString.ContainsKey("id")) { - pageId = int.Parse(PageState.QueryString["id"]); + pageId = SharedConverter.ParseInteger(PageState.QueryString["id"]); } try diff --git a/Oqtane.Client/UI/SiteRouter.razor b/Oqtane.Client/UI/SiteRouter.razor index 9f2b7e99..991ce8d0 100644 --- a/Oqtane.Client/UI/SiteRouter.razor +++ b/Oqtane.Client/UI/SiteRouter.razor @@ -105,7 +105,7 @@ _error = ""; Route route = new Route(_absoluteUri, SiteState.Alias.Path); - int moduleid = int.Parse(route.ModuleId, CultureInfo.InvariantCulture); + int moduleid = SharedConverter.ParseInteger(route.ModuleId, CultureInfo.InvariantCulture); var action = route.Action; var querystring = Utilities.ParseQueryString(route.Query); @@ -159,7 +159,7 @@ if (authState.User.Identity.IsAuthenticated && authState.User.Claims.Any(item => item.Type == Constants.SiteKeyClaimType && item.Value == SiteState.Alias.SiteKey)) { // get user - var userid = int.Parse(authState.User.Claims.First(item => item.Type == ClaimTypes.NameIdentifier).Value); + var userid = SharedConverter.ParseInteger(authState.User.Claims.First(item => item.Type == ClaimTypes.NameIdentifier).Value); user = await UserService.GetUserAsync(userid, SiteState.Alias.SiteId); if (user != null) { @@ -262,7 +262,7 @@ // edit mode if (user != null) { - var editpageid = user.Settings.ContainsKey("CP-editmode") ? int.Parse(user.Settings["CP-editmode"], CultureInfo.InvariantCulture) : -1; + var editpageid = user.Settings.ContainsKey("CP-editmode") ? SharedConverter.ParseInteger(user.Settings["CP-editmode"], CultureInfo.InvariantCulture) : -1; if ((querystring.ContainsKey("edit") && querystring["edit"] == "true") || page.PageId == editpageid) { editmode = true; diff --git a/Oqtane.Server/Components/App.razor b/Oqtane.Server/Components/App.razor index 712f7145..6aa72fbc 100644 --- a/Oqtane.Server/Components/App.razor +++ b/Oqtane.Server/Components/App.razor @@ -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"))); } } } diff --git a/Oqtane.Server/Controllers/FileController.cs b/Oqtane.Server/Controllers/FileController.cs index 4bdb8a90..57f4d8cc 100644 --- a/Oqtane.Server/Controllers/FileController.cs +++ b/Oqtane.Server/Controllers/FileController.cs @@ -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 diff --git a/Oqtane.Server/Controllers/FolderController.cs b/Oqtane.Server/Controllers/FolderController.cs index 23d3db9b..82153ca4 100644 --- a/Oqtane.Server/Controllers/FolderController.cs +++ b/Oqtane.Server/Controllers/FolderController.cs @@ -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) { diff --git a/Oqtane.Server/Controllers/LogController.cs b/Oqtane.Server/Controllers/LogController.cs index 341d35e5..a41e9cda 100644 --- a/Oqtane.Server/Controllers/LogController.cs +++ b/Oqtane.Server/Controllers/LogController.cs @@ -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 { diff --git a/Oqtane.Server/Controllers/ModuleControllerBase.cs b/Oqtane.Server/Controllers/ModuleControllerBase.cs index 561fe312..e998f141 100644 --- a/Oqtane.Server/Controllers/ModuleControllerBase.cs +++ b/Oqtane.Server/Controllers/ModuleControllerBase.cs @@ -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"]); } } diff --git a/Oqtane.Server/Controllers/PageController.cs b/Oqtane.Server/Controllers/PageController.cs index f8ad1925..47770c95 100644 --- a/Oqtane.Server/Controllers/PageController.cs +++ b/Oqtane.Server/Controllers/PageController.cs @@ -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() { - 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() { - 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); diff --git a/Oqtane.Server/Controllers/UserController.cs b/Oqtane.Server/Controllers/UserController.cs index 92aef5c5..20e3ea12 100644 --- a/Oqtane.Server/Controllers/UserController.cs +++ b/Oqtane.Server/Controllers/UserController.cs @@ -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; } diff --git a/Oqtane.Server/Extensions/ClaimsPrincipalExtensions.cs b/Oqtane.Server/Extensions/ClaimsPrincipalExtensions.cs index 1749c421..7cb42a4b 100644 --- a/Oqtane.Server/Extensions/ClaimsPrincipalExtensions.cs +++ b/Oqtane.Server/Extensions/ClaimsPrincipalExtensions.cs @@ -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; } diff --git a/Oqtane.Server/Extensions/OqtaneSiteIdentityBuilderExtensions.cs b/Oqtane.Server/Extensions/OqtaneSiteIdentityBuilderExtensions.cs index 6234d2fb..2f90fa9e 100644 --- a/Oqtane.Server/Extensions/OqtaneSiteIdentityBuilderExtensions.cs +++ b/Oqtane.Server/Extensions/OqtaneSiteIdentityBuilderExtensions.cs @@ -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((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; }); diff --git a/Oqtane.Server/Infrastructure/Jobs/NotificationJob.cs b/Oqtane.Server/Infrastructure/Jobs/NotificationJob.cs index ab9cc058..167a768e 100644 --- a/Oqtane.Server/Infrastructure/Jobs/NotificationJob.cs +++ b/Oqtane.Server/Infrastructure/Jobs/NotificationJob.cs @@ -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"] != "") diff --git a/Oqtane.Server/Infrastructure/Jobs/PurgeJob.cs b/Oqtane.Server/Infrastructure/Jobs/PurgeJob.cs index 07504f1e..e7b4ff4d 100644 --- a/Oqtane.Server/Infrastructure/Jobs/PurgeJob.cs +++ b/Oqtane.Server/Infrastructure/Jobs/PurgeJob.cs @@ -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 { diff --git a/Oqtane.Server/Infrastructure/Middleware/JwtMiddleware.cs b/Oqtane.Server/Infrastructure/Middleware/JwtMiddleware.cs index fc25a3f1..d48b33d9 100644 --- a/Oqtane.Server/Infrastructure/Middleware/JwtMiddleware.cs +++ b/Oqtane.Server/Infrastructure/Middleware/JwtMiddleware.cs @@ -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); diff --git a/Oqtane.Server/Providers/DatabaseSearchProvider.cs b/Oqtane.Server/Providers/DatabaseSearchProvider.cs index a662b106..ad203258 100644 --- a/Oqtane.Server/Providers/DatabaseSearchProvider.cs +++ b/Oqtane.Server/Providers/DatabaseSearchProvider.cs @@ -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 diff --git a/Oqtane.Server/Services/ImageService.cs b/Oqtane.Server/Services/ImageService.cs index e22f3b8e..50646583 100644 --- a/Oqtane.Server/Services/ImageService.cs +++ b/Oqtane.Server/Services/ImageService.cs @@ -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)) diff --git a/Oqtane.Server/Services/SearchService.cs b/Oqtane.Server/Services/SearchService.cs index 9a4f7ea1..c2813661 100644 --- a/Oqtane.Server/Services/SearchService.cs +++ b/Oqtane.Server/Services/SearchService.cs @@ -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; diff --git a/Oqtane.Shared/Shared/SharedConverter.cs b/Oqtane.Shared/Shared/SharedConverter.cs new file mode 100644 index 00000000..6ca9c414 --- /dev/null +++ b/Oqtane.Shared/Shared/SharedConverter.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Oqtane.Shared +{ + public sealed class SharedConverter + { + public static int ParseInteger(string value) + { + return ParseInteger(value, CultureInfo.InvariantCulture, 0); + } + + public static int ParseInteger(string value, CultureInfo cultureInfo) + { + return ParseInteger(value, cultureInfo, 0); + } + + public static int ParseInteger(string value, CultureInfo cultureInfo, int defaultValue) + { + if (int.TryParse(value, cultureInfo, out int result)) + { + return result; + } + + return 0; + } + } +}