Skip to content

Commit 58e515d

Browse files
authored
Do not allow save of invalid domains (#16880)
1 parent 1c1b4c6 commit 58e515d

File tree

4 files changed

+28
-1
lines changed

4 files changed

+28
-1
lines changed

src/Umbraco.Cms.Api.Management/Controllers/Document/UpdateDomainsController.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@ public async Task<IActionResult> Update(
6666
.WithDetail("One or more of the specified domain names were conflicting with domain assignments to other content items.")
6767
.WithExtension("conflictingDomainNames", _domainPresentationFactory.CreateDomainAssignmentModels(result.Result.ConflictingDomains.EmptyNull()))
6868
.Build()),
69+
DomainOperationStatus.InvalidDomainName => BadRequest(problemDetailsBuilder
70+
.WithTitle("Invalid domain name detected")
71+
.WithDetail("One or more of the specified domain names were invalid.")
72+
.Build()),
6973
_ => StatusCode(StatusCodes.Status500InternalServerError, problemDetailsBuilder
7074
.WithTitle("Unknown domain update operation status.")
7175
.Build()),

src/Umbraco.Core/Services/DomainService.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using Umbraco.Cms.Core.Models.ContentEditing;
77
using Umbraco.Cms.Core.Notifications;
88
using Umbraco.Cms.Core.Persistence.Repositories;
9+
using Umbraco.Cms.Core.Routing;
910
using Umbraco.Cms.Core.Scoping;
1011
using Umbraco.Cms.Core.Services.OperationStatus;
1112
using Umbraco.Extensions;
@@ -201,6 +202,11 @@ public async Task<Attempt<DomainUpdateResult, DomainOperationStatus>> UpdateDoma
201202
foreach (DomainModel domainModel in updateModel.Domains)
202203
{
203204
domainModel.DomainName = domainModel.DomainName.ToLowerInvariant();
205+
206+
if(Uri.IsWellFormedUriString(domainModel.DomainName, UriKind.RelativeOrAbsolute) is false)
207+
{
208+
return Attempt.FailWithStatus(DomainOperationStatus.InvalidDomainName, new DomainUpdateResult());
209+
}
204210
}
205211

206212
// make sure we're not attempting to assign duplicate domains

src/Umbraco.Core/Services/OperationStatus/DomainOperationStatus.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@ public enum DomainOperationStatus
77
ContentNotFound,
88
LanguageNotFound,
99
DuplicateDomainName,
10-
ConflictingDomainName
10+
ConflictingDomainName,
11+
InvalidDomainName
1112
}

tests/Umbraco.Tests.Integration/Umbraco.Web.BackOffice/UrlAndDomains/DomainAndUrlsTests.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,22 @@ public async Task Cannot_Assign_Duplicate_Domains(string domainName)
332332
Assert.AreEqual(DomainOperationStatus.DuplicateDomainName, result.Status);
333333
}
334334

335+
[TestCase("https://*.umbraco.com")]
336+
[TestCase("&#€%#€")]
337+
[TestCase("¢”$¢”¢$≈{")]
338+
public async Task Cannot_Assign_Invalid_Domains(string domainName)
339+
{
340+
var domainService = GetRequiredService<IDomainService>();
341+
var updateModel = new DomainsUpdateModel
342+
{
343+
Domains = new DomainModel { DomainName = domainName, IsoCode = Cultures.First() }.Yield()
344+
};
345+
346+
var result = await domainService.UpdateDomainsAsync(Root.Key, updateModel);
347+
Assert.IsFalse(result.Success);
348+
Assert.AreEqual(DomainOperationStatus.InvalidDomainName, result.Status);
349+
}
350+
335351
[Test]
336352
public async Task Cannot_Assign_Already_Used_Domains()
337353
{

0 commit comments

Comments
 (0)