From ee95434cea85710450fabe8fbae0b96378265fa5 Mon Sep 17 00:00:00 2001 From: Morten Christensen Date: Thu, 7 Mar 2013 19:04:25 -0100 Subject: [PATCH 1/4] Implements U4-1869 by adding the 3 characters to the list of reserved characters. --- src/Umbraco.Core/IO/IOHelper.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Core/IO/IOHelper.cs b/src/Umbraco.Core/IO/IOHelper.cs index f3b2536cc1..b25d305184 100644 --- a/src/Umbraco.Core/IO/IOHelper.cs +++ b/src/Umbraco.Core/IO/IOHelper.cs @@ -235,7 +235,7 @@ namespace Umbraco.Core.IO // from http://en.wikipedia.org/wiki/Percent-encoding var stringBuilder = new StringBuilder(); - const string reservedCharacters = "!*'();:@&=+$,/?%#[]-~{}\"<>\\^`| "; + const string reservedCharacters = "æøåÆØÅ!*'();:@&=+$,/?%#[]-~{}\"<>\\^`| "; foreach (var character in filePath) { From 2a09f02afb7fcaaf4c687ce203573d9e6d53ea6e Mon Sep 17 00:00:00 2001 From: Morten Christensen Date: Thu, 7 Mar 2013 19:56:10 -0100 Subject: [PATCH 2/4] Fixing incorrect sql syntax when the query contains two expressions. --- .../Persistence/Querying/ModelToSqlExpressionHelper.cs | 3 ++- src/Umbraco.Core/Services/ContentService.cs | 2 +- src/Umbraco.Core/Services/MediaService.cs | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Core/Persistence/Querying/ModelToSqlExpressionHelper.cs b/src/Umbraco.Core/Persistence/Querying/ModelToSqlExpressionHelper.cs index 3f0495cfd5..dff000acc2 100644 --- a/src/Umbraco.Core/Persistence/Querying/ModelToSqlExpressionHelper.cs +++ b/src/Umbraco.Core/Persistence/Querying/ModelToSqlExpressionHelper.cs @@ -523,7 +523,8 @@ namespace Umbraco.Core.Persistence.Querying protected bool IsFieldName(string quotedExp) { - return true; + //Not entirely sure this is reliable, but its better then simply returning true + return quotedExp.LastIndexOf("'", StringComparison.InvariantCultureIgnoreCase) + 1 != quotedExp.Length; } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Services/ContentService.cs b/src/Umbraco.Core/Services/ContentService.cs index fcd56259c7..438897cec8 100644 --- a/src/Umbraco.Core/Services/ContentService.cs +++ b/src/Umbraco.Core/Services/ContentService.cs @@ -194,7 +194,7 @@ namespace Umbraco.Core.Services { using (var repository = _repositoryFactory.CreateContentRepository(_uowProvider.GetUnitOfWork())) { - var query = Query.Builder.Where(x => x.Level == level && x.Path.Contains("-20") == false); + var query = Query.Builder.Where(x => x.Level == level && !x.Path.StartsWith("-20")); var contents = repository.GetByQuery(query); return contents; diff --git a/src/Umbraco.Core/Services/MediaService.cs b/src/Umbraco.Core/Services/MediaService.cs index 148b28ac8c..57168ec8c8 100644 --- a/src/Umbraco.Core/Services/MediaService.cs +++ b/src/Umbraco.Core/Services/MediaService.cs @@ -155,7 +155,7 @@ namespace Umbraco.Core.Services { using (var repository = _repositoryFactory.CreateMediaRepository(_uowProvider.GetUnitOfWork())) { - var query = Query.Builder.Where(x => x.Level == level && x.Path.Contains("-21") == false); + var query = Query.Builder.Where(x => x.Level == level && !x.Path.StartsWith("-21")); var contents = repository.GetByQuery(query); return contents; From 1b01386673760268ab997bf4c311d2f019e0c315 Mon Sep 17 00:00:00 2001 From: Morten Christensen Date: Thu, 7 Mar 2013 19:56:59 -0100 Subject: [PATCH 3/4] Changing the initial fix of U4-1869 to use UrlReplacingCharacters --- src/Umbraco.Core/IO/IOHelper.cs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Core/IO/IOHelper.cs b/src/Umbraco.Core/IO/IOHelper.cs index b25d305184..b7216d8eaf 100644 --- a/src/Umbraco.Core/IO/IOHelper.cs +++ b/src/Umbraco.Core/IO/IOHelper.cs @@ -8,6 +8,7 @@ using System.IO; using System.Configuration; using System.Web; using System.Text.RegularExpressions; +using System.Xml; using Umbraco.Core.Configuration; using Umbraco.Core.Logging; @@ -230,12 +231,20 @@ namespace Umbraco.Core.IO filePath = String.Empty; } + //Because the file usually is downloadable as well we check characters against 'UmbracoSettings.UrlReplaceCharacters' + XmlNode replaceChars = UmbracoSettings.UrlReplaceCharacters; + foreach (XmlNode n in replaceChars.SelectNodes("char")) + { + if (n.Attributes.GetNamedItem("org") != null && n.Attributes.GetNamedItem("org").Value != "") + filePath = filePath.Replace(n.Attributes.GetNamedItem("org").Value, XmlHelper.GetNodeValue(n)); + } + // Adapted from: http://stackoverflow.com/a/4827510/5018 // Combined both Reserved Characters and Character Data // from http://en.wikipedia.org/wiki/Percent-encoding var stringBuilder = new StringBuilder(); - const string reservedCharacters = "æøåÆØÅ!*'();:@&=+$,/?%#[]-~{}\"<>\\^`| "; + const string reservedCharacters = "!*'();:@&=+$,/?%#[]-~{}\"<>\\^`| "; foreach (var character in filePath) { From 836b0f39c2423d2fe4adc80aa65e6a70a70799d7 Mon Sep 17 00:00:00 2001 From: Morten Christensen Date: Thu, 7 Mar 2013 20:19:39 -0100 Subject: [PATCH 4/4] Additional correction of the implementation for U4-1869 --- src/Umbraco.Core/IO/IOHelper.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Core/IO/IOHelper.cs b/src/Umbraco.Core/IO/IOHelper.cs index b7216d8eaf..4ca257c6e2 100644 --- a/src/Umbraco.Core/IO/IOHelper.cs +++ b/src/Umbraco.Core/IO/IOHelper.cs @@ -231,14 +231,20 @@ namespace Umbraco.Core.IO filePath = String.Empty; } + //Break up the file in name and extension before applying the UrlReplaceCharacters + var fileNamePart = filePath.Substring(0, filePath.LastIndexOf('.')); + var ext = filePath.Substring(filePath.LastIndexOf('.')); + //Because the file usually is downloadable as well we check characters against 'UmbracoSettings.UrlReplaceCharacters' XmlNode replaceChars = UmbracoSettings.UrlReplaceCharacters; foreach (XmlNode n in replaceChars.SelectNodes("char")) { if (n.Attributes.GetNamedItem("org") != null && n.Attributes.GetNamedItem("org").Value != "") - filePath = filePath.Replace(n.Attributes.GetNamedItem("org").Value, XmlHelper.GetNodeValue(n)); + fileNamePart = fileNamePart.Replace(n.Attributes.GetNamedItem("org").Value, XmlHelper.GetNodeValue(n)); } + filePath = string.Concat(fileNamePart, ext); + // Adapted from: http://stackoverflow.com/a/4827510/5018 // Combined both Reserved Characters and Character Data // from http://en.wikipedia.org/wiki/Percent-encoding