From 39316a345ff0b44e365cf1be00fcb22a78a11a87 Mon Sep 17 00:00:00 2001 From: Stephan Date: Fri, 6 Sep 2013 20:21:47 +0200 Subject: [PATCH 1/2] Tests - stop deleting dummy.txt files --- src/Umbraco.Tests/TestHelpers/TestHelper.cs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Tests/TestHelpers/TestHelper.cs b/src/Umbraco.Tests/TestHelpers/TestHelper.cs index 58cc7c6974..0ba2a08654 100644 --- a/src/Umbraco.Tests/TestHelpers/TestHelper.cs +++ b/src/Umbraco.Tests/TestHelpers/TestHelper.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Configuration; using System.IO; using System.Linq; @@ -116,12 +117,18 @@ namespace Umbraco.Tests.TestHelpers } public static void CleanDirectories(string[] directories) - { + { + var preserves = new Dictionary + { + { SystemDirectories.Masterpages, new[] {"dummy.txt"} }, + { SystemDirectories.MvcViews, new[] {"dummy.txt"} } + }; foreach (var directory in directories) { var directoryInfo = new DirectoryInfo(IOHelper.MapPath(directory)); + var preserve = preserves.ContainsKey(directory) ? preserves[directory] : null; if (directoryInfo.Exists) - directoryInfo.GetFiles().ForEach(x => x.Delete()); + directoryInfo.GetFiles().Where(x => preserve == null || preserve.Contains(x.Name) == false).ForEach(x => x.Delete()); } } From c5197dbe1720fecaf84f9a9a95a845eecc97f92f Mon Sep 17 00:00:00 2001 From: Stephan Date: Sat, 7 Sep 2013 10:24:52 +0200 Subject: [PATCH 2/2] 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"); + } } ///