diff --git a/src/Umbraco.Web.UI.Client/src/views/content/assigndomain.html b/src/Umbraco.Web.UI.Client/src/views/content/assigndomain.html index 89381e1be4..492c85c0dd 100644 --- a/src/Umbraco.Web.UI.Client/src/views/content/assigndomain.html +++ b/src/Umbraco.Web.UI.Client/src/views/content/assigndomain.html @@ -16,6 +16,13 @@ +
+
+
{{vm.error.errorMsg}}
+
{{vm.error.data.Message}}
+
+
+
Domains
diff --git a/src/Umbraco.Web.UI.Client/src/views/content/content.assigndomain.controller.js b/src/Umbraco.Web.UI.Client/src/views/content/content.assigndomain.controller.js index 0f27f3046c..627519a207 100644 --- a/src/Umbraco.Web.UI.Client/src/views/content/content.assigndomain.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/content/content.assigndomain.controller.js @@ -131,6 +131,7 @@ } }, function (e) { + vm.error = e; vm.submitButtonState = "error"; }); } diff --git a/src/Umbraco.Web/Editors/ContentController.cs b/src/Umbraco.Web/Editors/ContentController.cs index 12047b628b..37be426d42 100644 --- a/src/Umbraco.Web/Editors/ContentController.cs +++ b/src/Umbraco.Web/Editors/ContentController.cs @@ -37,6 +37,7 @@ using Umbraco.Web.Editors.Filters; using Umbraco.Core.Models.Entities; using Umbraco.Core.Persistence; using Umbraco.Core.Security; +using Umbraco.Web.Routing; namespace Umbraco.Web.Editors { @@ -1588,6 +1589,19 @@ namespace Umbraco.Web.Editors [HttpPost] public DomainSave PostSaveLanguageAndDomains(DomainSave model) { + foreach(var domain in model.Domains) + { + try + { + var uri = DomainHelper.ParseUriFromDomainName(domain.Name, Request.RequestUri); + } + catch (UriFormatException) + { + var response = Request.CreateValidationErrorResponse("One or more domains are not valid"); + throw new HttpResponseException(response); + } + } + var node = Services.ContentService.GetById(model.NodeId); if (node == null) diff --git a/src/Umbraco.Web/Routing/DomainAndUri.cs b/src/Umbraco.Web/Routing/DomainAndUri.cs index 7ba0d8ca9e..23115cad0d 100644 --- a/src/Umbraco.Web/Routing/DomainAndUri.cs +++ b/src/Umbraco.Web/Routing/DomainAndUri.cs @@ -22,16 +22,11 @@ namespace Umbraco.Web.Routing { try { - // turn "/en" into "http://whatever.com/en" so it becomes a parseable uri - var name = Name.StartsWith("/") && currentUri != null - ? currentUri.GetLeftPart(UriPartial.Authority) + Name - : Name; - var scheme = currentUri?.Scheme ?? Uri.UriSchemeHttp; - Uri = new Uri(UriUtility.TrimPathEndSlash(UriUtility.StartWithScheme(name, scheme))); + Uri = DomainHelper.ParseUriFromDomainName(Name, currentUri); } catch (UriFormatException) { - throw new ArgumentException($"Failed to parse invalid domain: node id={domain.ContentId}, hostname=\"{Name.ToCSharpString()}\"." + throw new ArgumentException($"Failed to parse invalid domain: node id={domain.ContentId}, hostname=\"{domain.Name.ToCSharpString()}\"." + " Hostname should be a valid uri.", nameof(domain)); } } diff --git a/src/Umbraco.Web/Routing/DomainHelper.cs b/src/Umbraco.Web/Routing/DomainHelper.cs index 88f2b17814..d7f8348247 100644 --- a/src/Umbraco.Web/Routing/DomainHelper.cs +++ b/src/Umbraco.Web/Routing/DomainHelper.cs @@ -251,6 +251,16 @@ namespace Umbraco.Web.Routing .OrderByDescending(d => d.Uri.ToString()); } + internal static Uri ParseUriFromDomainName(string Name, Uri currentUri) + { + // turn "/en" into "http://whatever.com/en" so it becomes a parseable uri + var name = Name.StartsWith("/") && currentUri != null + ? currentUri.GetLeftPart(UriPartial.Authority) + Name + : Name; + var scheme = currentUri?.Scheme ?? Uri.UriSchemeHttp; + return new Uri(UriUtility.TrimPathEndSlash(UriUtility.StartWithScheme(name, scheme))); + } + #endregion #region Utilities