diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Document/UpdateDomainsController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Document/UpdateDomainsController.cs index a7c7256c6b..a44289b4c6 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Document/UpdateDomainsController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Document/UpdateDomainsController.cs @@ -66,6 +66,10 @@ public class UpdateDomainsController : DocumentControllerBase .WithDetail("One or more of the specified domain names were conflicting with domain assignments to other content items.") .WithExtension("conflictingDomainNames", _domainPresentationFactory.CreateDomainAssignmentModels(result.Result.ConflictingDomains.EmptyNull())) .Build()), + DomainOperationStatus.InvalidDomainName => BadRequest(problemDetailsBuilder + .WithTitle("Invalid domain name detected") + .WithDetail("One or more of the specified domain names were invalid.") + .Build()), _ => StatusCode(StatusCodes.Status500InternalServerError, problemDetailsBuilder .WithTitle("Unknown domain update operation status.") .Build()), diff --git a/src/Umbraco.Core/Security/Authorization/IAuthorizationHelper.cs b/src/Umbraco.Core/Security/Authorization/IAuthorizationHelper.cs index fb8d1cda35..d197770a00 100644 --- a/src/Umbraco.Core/Security/Authorization/IAuthorizationHelper.cs +++ b/src/Umbraco.Core/Security/Authorization/IAuthorizationHelper.cs @@ -24,5 +24,17 @@ public interface IAuthorizationHelper /// The current user's principal. /// The resulting , if the conversion is successful. /// True if the conversion is successful, false otherwise - bool TryGetUmbracoUser(IPrincipal currentUser, [NotNullWhen(true)] out IUser? user); + bool TryGetUmbracoUser(IPrincipal currentUser, [NotNullWhen(true)] out IUser? user) + { + try + { + user = GetUmbracoUser(currentUser); + return true; + } + catch + { + user = null; + return false; + } + } } diff --git a/src/Umbraco.Core/Services/DomainService.cs b/src/Umbraco.Core/Services/DomainService.cs index b4e103f1a4..c527e40b82 100644 --- a/src/Umbraco.Core/Services/DomainService.cs +++ b/src/Umbraco.Core/Services/DomainService.cs @@ -6,6 +6,7 @@ using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.ContentEditing; using Umbraco.Cms.Core.Notifications; using Umbraco.Cms.Core.Persistence.Repositories; +using Umbraco.Cms.Core.Routing; using Umbraco.Cms.Core.Scoping; using Umbraco.Cms.Core.Services.OperationStatus; using Umbraco.Extensions; @@ -201,6 +202,11 @@ public class DomainService : RepositoryService, IDomainService foreach (DomainModel domainModel in updateModel.Domains) { domainModel.DomainName = domainModel.DomainName.ToLowerInvariant(); + + if(Uri.IsWellFormedUriString(domainModel.DomainName, UriKind.RelativeOrAbsolute) is false) + { + return Attempt.FailWithStatus(DomainOperationStatus.InvalidDomainName, new DomainUpdateResult()); + } } // make sure we're not attempting to assign duplicate domains diff --git a/src/Umbraco.Core/Services/OperationStatus/DomainOperationStatus.cs b/src/Umbraco.Core/Services/OperationStatus/DomainOperationStatus.cs index a752684b2e..ba19e2bc3f 100644 --- a/src/Umbraco.Core/Services/OperationStatus/DomainOperationStatus.cs +++ b/src/Umbraco.Core/Services/OperationStatus/DomainOperationStatus.cs @@ -7,5 +7,6 @@ public enum DomainOperationStatus ContentNotFound, LanguageNotFound, DuplicateDomainName, - ConflictingDomainName + ConflictingDomainName, + InvalidDomainName } diff --git a/src/Umbraco.Web.UI.Client b/src/Umbraco.Web.UI.Client index 97f256a195..bb6abdc884 160000 --- a/src/Umbraco.Web.UI.Client +++ b/src/Umbraco.Web.UI.Client @@ -1 +1 @@ -Subproject commit 97f256a195d8301bcc68ba21ed879240cd0d663d +Subproject commit bb6abdc88452bbd3a47bf867dcb1332f536ad264 diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Web.BackOffice/UrlAndDomains/DomainAndUrlsTests.cs b/tests/Umbraco.Tests.Integration/Umbraco.Web.BackOffice/UrlAndDomains/DomainAndUrlsTests.cs index abc4e3894c..462205b231 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.Web.BackOffice/UrlAndDomains/DomainAndUrlsTests.cs +++ b/tests/Umbraco.Tests.Integration/Umbraco.Web.BackOffice/UrlAndDomains/DomainAndUrlsTests.cs @@ -332,6 +332,22 @@ public class DomainAndUrlsTests : UmbracoIntegrationTest Assert.AreEqual(DomainOperationStatus.DuplicateDomainName, result.Status); } + [TestCase("https://*.umbraco.com")] + [TestCase("&#€%#€")] + [TestCase("¢”$¢”¢$≈{")] + public async Task Cannot_Assign_Invalid_Domains(string domainName) + { + var domainService = GetRequiredService(); + var updateModel = new DomainsUpdateModel + { + Domains = new DomainModel { DomainName = domainName, IsoCode = Cultures.First() }.Yield() + }; + + var result = await domainService.UpdateDomainsAsync(Root.Key, updateModel); + Assert.IsFalse(result.Success); + Assert.AreEqual(DomainOperationStatus.InvalidDomainName, result.Status); + } + [Test] public async Task Cannot_Assign_Already_Used_Domains() { diff --git a/version.json b/version.json index cbb26a6556..2d3aca5f9d 100644 --- a/version.json +++ b/version.json @@ -1,6 +1,6 @@ { "$schema": "https://raw.githubusercontent.com/dotnet/Nerdbank.GitVersioning/main/src/NerdBank.GitVersioning/version.schema.json", - "version": "14.2.0-rc", + "version": "14.2.0-rc3", "assemblyVersion": { "precision": "build" },