From c5197dbe1720fecaf84f9a9a95a845eecc97f92f Mon Sep 17 00:00:00 2001 From: Stephan Date: Sat, 7 Sep 2013 10:24:52 +0200 Subject: [PATCH] U4-2807 - better exception message on bogus domain --- src/Umbraco.Core/StringExtensions.cs | 52 +++++++++++++++++++++++++ src/Umbraco.Web/Routing/DomainAndUri.cs | 12 +++++- 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Core/StringExtensions.cs b/src/Umbraco.Core/StringExtensions.cs index 87b4c676b5..e730bafbdc 100644 --- a/src/Umbraco.Core/StringExtensions.cs +++ b/src/Umbraco.Core/StringExtensions.cs @@ -28,6 +28,17 @@ namespace Umbraco.Core [UmbracoWillObsolete("Do not use this constants. See IShortStringHelper.CleanStringForSafeAliasJavaScriptCode.")] public const string UmbracoInvalidFirstCharacters = "01234567890"; + private static readonly char[] ToCSharpHexDigitLower = "0123456789abcdef".ToCharArray(); + private static readonly char[] ToCSharpEscapeChars; + + static StringExtensions() + { + var escapes = new[] { "\aa", "\bb", "\ff", "\nn", "\rr", "\tt", "\vv", "\"\"", "\\\\", "??", "\00" }; + ToCSharpEscapeChars = new char[escapes.Max(e => e[0]) + 1]; + foreach (var escape in escapes) + ToCSharpEscapeChars[escape[0]] = escape[1]; + } + internal static string ReplaceNonAlphanumericChars(this string input, char replacement) { //any character that is not alphanumeric, convert to a hyphen @@ -1085,5 +1096,46 @@ namespace Umbraco.Core return source; } + + /// + /// Converts a literal string into a C# expression. + /// + /// Current instance of the string. + /// The string in a C# format. + public static string ToCSharpString(this string s) + { + if (s == null) return ""; + + // http://stackoverflow.com/questions/323640/can-i-convert-a-c-sharp-string-value-to-an-escaped-string-literal + + var sb = new StringBuilder(s.Length + 2); + for (var rp = 0; rp < s.Length; rp++) + { + var c = s[rp]; + if (c < ToCSharpEscapeChars.Length && '\0' != ToCSharpEscapeChars[c]) + sb.Append('\\').Append(ToCSharpEscapeChars[c]); + else if ('~' >= c && c >= ' ') + sb.Append(c); + else + sb.Append(@"\x") + .Append(ToCSharpHexDigitLower[c >> 12 & 0x0F]) + .Append(ToCSharpHexDigitLower[c >> 8 & 0x0F]) + .Append(ToCSharpHexDigitLower[c >> 4 & 0x0F]) + .Append(ToCSharpHexDigitLower[c & 0x0F]); + } + + return sb.ToString(); + + // requires full trust + /* + using (var writer = new StringWriter()) + using (var provider = CodeDomProvider.CreateProvider("CSharp")) + { + provider.GenerateCodeFromExpression(new CodePrimitiveExpression(s), writer, null); + return writer.ToString().Replace(string.Format("\" +{0}\t\"", Environment.NewLine), ""); + } + */ + } + } } diff --git a/src/Umbraco.Web/Routing/DomainAndUri.cs b/src/Umbraco.Web/Routing/DomainAndUri.cs index ba13508812..ec3e52ff11 100644 --- a/src/Umbraco.Web/Routing/DomainAndUri.cs +++ b/src/Umbraco.Web/Routing/DomainAndUri.cs @@ -1,4 +1,5 @@ using System; +using Umbraco.Core; using umbraco.cms.businesslogic.web; namespace Umbraco.Web.Routing @@ -20,7 +21,16 @@ namespace Umbraco.Web.Routing public DomainAndUri(Domain domain, string scheme) { Domain = domain; - Uri = new Uri(UriUtility.TrimPathEndSlash(UriUtility.StartWithScheme(domain.Name, scheme))); + try + { + Uri = new Uri(UriUtility.TrimPathEndSlash(UriUtility.StartWithScheme(domain.Name, scheme))); + } + catch (UriFormatException) + { + var name = domain.Name.ToCSharpString(); + throw new ArgumentException(string.Format("Failed to parse invalid domain: node id={0}, hostname=\"{1}\"." + + " Hostname should be a valid uri.", domain.RootNodeId, name), "domain"); + } } ///