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"
},