From 1c3a7b95fc5788c372732521629d59112a9c365e Mon Sep 17 00:00:00 2001 From: Magnus Kragelund Date: Fri, 27 Mar 2015 11:02:35 +0100 Subject: [PATCH 1/3] fixes bug when trying to render a deleted node in multinode tree picker --- .../contentpicker/contentpicker.controller.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/contentpicker/contentpicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/contentpicker/contentpicker.controller.js index 9d755d7d3f..9002535488 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/contentpicker/contentpicker.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/contentpicker/contentpicker.controller.js @@ -175,8 +175,10 @@ function contentPickerController($scope, dialogService, entityResource, editorSt return d.id == id; }); - entity.icon = iconHelper.convertFromLegacyIcon(entity.icon); - $scope.renderModel.push({ name: entity.name, id: entity.id, icon: entity.icon }); + if(entity != undefined) { + entity.icon = iconHelper.convertFromLegacyIcon(entity.icon); + $scope.renderModel.push({ name: entity.name, id: entity.id, icon: entity.icon }); + } }); From 051e9366e5f2f76ea0590aeee1417238366ffa71 Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 1 Apr 2015 13:39:54 +1100 Subject: [PATCH 2/3] updates js undefined check --- .../propertyeditors/contentpicker/contentpicker.controller.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/contentpicker/contentpicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/contentpicker/contentpicker.controller.js index 9002535488..8c656b2d4b 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/contentpicker/contentpicker.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/contentpicker/contentpicker.controller.js @@ -175,7 +175,7 @@ function contentPickerController($scope, dialogService, entityResource, editorSt return d.id == id; }); - if(entity != undefined) { + if(entity) { entity.icon = iconHelper.convertFromLegacyIcon(entity.icon); $scope.renderModel.push({ name: entity.name, id: entity.id, icon: entity.icon }); } From 437ab4aaf1732dd70f9e5fa3d4d52312778ef323 Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 1 Apr 2015 17:44:27 +1100 Subject: [PATCH 3/3] Fixes installer permission steps - this cannot just arbitrarily write to the umbraco xml cache file --- .../Install/FilePermissionHelper.cs | 67 +++++------ .../InstallSteps/FilePermissionsStep.cs | 107 +----------------- .../umbraco.presentation/content.cs | 25 +--- .../umbraco/webservices/publication.asmx.cs | 3 +- 4 files changed, 39 insertions(+), 163 deletions(-) diff --git a/src/Umbraco.Web/Install/FilePermissionHelper.cs b/src/Umbraco.Web/Install/FilePermissionHelper.cs index c43560832e..013f40fc0e 100644 --- a/src/Umbraco.Web/Install/FilePermissionHelper.cs +++ b/src/Umbraco.Web/Install/FilePermissionHelper.cs @@ -14,58 +14,58 @@ namespace Umbraco.Web.Install internal static readonly string[] PermissionFiles = { }; internal static readonly string[] PackagesPermissionsDirs = { SystemDirectories.Bin, SystemDirectories.Umbraco, SystemDirectories.UserControls, SystemDirectories.Packages }; - public static bool RunFilePermissionTestSuite() + public static bool RunFilePermissionTestSuite(out Dictionary> errorReport) { - var newReport = new Dictionary(); + errorReport = new Dictionary>(); - if (!TestDirectories(PermissionDirs, ref newReport)) - return false; + List errors; - if (!TestDirectories(PackagesPermissionsDirs, ref newReport)) - return false; + if (TestDirectories(PermissionDirs, out errors) == false) + errorReport["Folder creation failed"] = errors.ToList(); - if (!TestFiles(PermissionFiles, ref newReport)) - return false; + if (TestDirectories(PackagesPermissionsDirs, out errors) == false) + errorReport["File writing for packages failed"] = errors.ToList(); - if (!TestContentXml(ref newReport)) - return false; + if (TestFiles(PermissionFiles, out errors) == false) + errorReport["File writing failed"] = errors.ToList(); - if (!TestFolderCreation(SystemDirectories.Media, ref newReport)) - return false; + if (TestContentXml(out errors) == false) + errorReport["Cache file writing failed"] = errors.ToList(); - return true; + if (TestFolderCreation(SystemDirectories.Media, out errors) == false) + errorReport["Media folder creation failed"] = errors.ToList(); + + return errorReport.Any() == false; } - public static bool TestDirectories(string[] directories, ref Dictionary errorReport) + public static bool TestDirectories(string[] directories, out List errorReport) { + errorReport = new List(); bool succes = true; foreach (string dir in PermissionDirs) { bool result = SaveAndDeleteFile(IOHelper.MapPath(dir + "/configWizardPermissionTest.txt")); - if (!result) + if (result == false) { succes = false; - - if (errorReport != null) - errorReport.Add(dir, "Missing permissions, cannot create new files"); + errorReport.Add(dir); } } return succes; } - public static bool TestFiles(string[] files, ref Dictionary errorReport) + public static bool TestFiles(string[] files, out List errorReport) { + errorReport = new List(); bool succes = true; foreach (string file in PermissionFiles) { bool result = OpenFileForWrite(IOHelper.MapPath(file)); - if (!result) + if (result == false) { - if (errorReport != null) - errorReport.Add(file, "Missing write permissions"); - + errorReport.Add(file); succes = false; } } @@ -73,8 +73,9 @@ namespace Umbraco.Web.Install return succes; } - public static bool TestFolderCreation(string folder, ref Dictionary errorReport) + public static bool TestFolderCreation(string folder, out List errorReport) { + errorReport = new List(); try { string tempDir = IOHelper.MapPath(folder + "/testCreatedByConfigWizard"); @@ -84,24 +85,26 @@ namespace Umbraco.Web.Install } catch { - if (errorReport != null) - errorReport.Add(folder, "Could not create sub-directory"); + errorReport.Add(folder); return false; } } - public static bool TestContentXml(ref Dictionary errorReport) + public static bool TestContentXml(out List errorReport) { - // Test umbraco.xml file + errorReport = new List(); + // Test creating/saving/deleting a file in the same location as the content xml file + // NOTE: We cannot modify the xml file directly because a background thread is responsible for + // that and we might get lock issues. try { - content.Instance.PersistXmlToFile(); + var xmlFile = content.Instance.UmbracoXmlDiskCacheFileName + ".tmp"; + SaveAndDeleteFile(xmlFile); return true; } catch { - if(errorReport != null) - errorReport.Add(SystemFiles.ContentCacheXml, "Could not persist content cache"); + errorReport.Add(SystemFiles.ContentCacheXml); return false; } } @@ -112,7 +115,7 @@ namespace Umbraco.Web.Install { //first check if the directory of the file exists, and if not try to create that first. FileInfo fi = new FileInfo(file); - if (!fi.Directory.Exists) + if (fi.Directory.Exists == false) { fi.Directory.Create(); } diff --git a/src/Umbraco.Web/Install/InstallSteps/FilePermissionsStep.cs b/src/Umbraco.Web/Install/InstallSteps/FilePermissionsStep.cs index ae715b33a5..37b12798cb 100644 --- a/src/Umbraco.Web/Install/InstallSteps/FilePermissionsStep.cs +++ b/src/Umbraco.Web/Install/InstallSteps/FilePermissionsStep.cs @@ -17,77 +17,9 @@ namespace Umbraco.Web.Install.InstallSteps { //first validate file permissions var permissionsOk = true; - var reportParts = new Dictionary>(); - - // Test default dir permissions - foreach (var dir in FilePermissionHelper.PermissionDirs) - { - var result = SaveAndDeleteFile(IOHelper.MapPath(dir + "/configWizardPermissionTest.txt")); - if (!result) - { - var report = reportParts.GetOrCreate("Folder creation failed"); - permissionsOk = false; - report.Add(dir); - } - } - - // Test default file permissions - foreach (var file in FilePermissionHelper.PermissionFiles) - { - var result = OpenFileForWrite(IOHelper.MapPath(file)); - if (!result) - { - var report = reportParts.GetOrCreate("File writing failed"); - permissionsOk = false; - report.Add(file); - } - } - - // Test package dir permissions - string packageResult = ""; - foreach (var dir in FilePermissionHelper.PackagesPermissionsDirs) - { - var result = - SaveAndDeleteFile(IOHelper.MapPath(dir + "/configWizardPermissionTest.txt")); - if (!result) - { - var report = reportParts.GetOrCreate("File writing for packages failed"); - permissionsOk = false; - report.Add(dir); - } - } - - // Test umbraco.xml file - try - { - content.Instance.PersistXmlToFile(); - } - catch (Exception ee) - { - permissionsOk = false; - string tempFile = SystemFiles.ContentCacheXml; - - if (tempFile.Substring(0, 1) == "/") - tempFile = tempFile.Substring(1, tempFile.Length - 1); - - var report = reportParts.GetOrCreate("Cache file writing failed"); - report.Add(tempFile); - } - - // Test creation of folders - try - { - string tempDir = IOHelper.MapPath(SystemDirectories.Media + "/testCreatedByConfigWizard"); - Directory.CreateDirectory(tempDir); - Directory.Delete(tempDir); - } - catch - { - permissionsOk = false; - var report = reportParts.GetOrCreate("Media folder creation failed"); - report.Add("Could not create sub folders in " + SystemDirectories.Media); - } + Dictionary> reportParts; + permissionsOk = FilePermissionHelper.RunFilePermissionTestSuite(out reportParts); if (permissionsOk == false) { @@ -97,41 +29,6 @@ namespace Umbraco.Web.Install.InstallSteps return null; } - private bool OpenFileForWrite(string file) - { - try - { - File.AppendText(file).Close(); - } - catch - { - return false; - } - return true; - } - - private static bool SaveAndDeleteFile(string file) - { - try - { - //first check if the directory of the file exists, and if not try to create that first. - var fi = new FileInfo(file); - if (!fi.Directory.Exists) - { - fi.Directory.Create(); - } - - File.WriteAllText(file, - "This file has been created by the umbraco configuration wizard. It is safe to delete it!"); - File.Delete(file); - return true; - } - catch - { - return false; - } - } - public override bool RequiresExecution(object model) { return true; diff --git a/src/Umbraco.Web/umbraco.presentation/content.cs b/src/Umbraco.Web/umbraco.presentation/content.cs index 93e07a680c..c71933b222 100644 --- a/src/Umbraco.Web/umbraco.presentation/content.cs +++ b/src/Umbraco.Web/umbraco.presentation/content.cs @@ -1205,32 +1205,9 @@ order by umbracoNode.level, umbracoNode.sortOrder"; } } - [Obsolete("This method should not be used, xml file persistence is done in a queue using a BackgroundTaskRunner")] + [Obsolete("This method should not be used and does nothing, xml file persistence is done in a queue using a BackgroundTaskRunner")] public void PersistXmlToFile() { - lock (ReaderWriterSyncLock) - { - if (_xmlContent != null) - { - try - { - // create directory for cache path if it doesn't yet exist - var directoryName = Path.GetDirectoryName(UmbracoXmlDiskCacheFileName); - Directory.CreateDirectory(directoryName); - - _xmlContent.Save(UmbracoXmlDiskCacheFileName); - } - catch (Exception ee) - { - // If for whatever reason something goes wrong here, invalidate disk cache - DeleteXmlCache(); - - LogHelper.Error(string.Format( - "Error saving content on thread '{0}' due to '{1}' (Threadpool? {2})", - Thread.CurrentThread.Name, ee.Message, Thread.CurrentThread.IsThreadPoolThread), ee); - } - } - } } /// diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/webservices/publication.asmx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/webservices/publication.asmx.cs index e312c4cfbf..4fca8117d2 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/webservices/publication.asmx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/webservices/publication.asmx.cs @@ -73,13 +73,12 @@ namespace umbraco.webservices { } + [Obsolete("This doesn't do anything and will be removed in future versions")] [WebMethod] public void SaveXmlCacheToDisk() { if (!AuthorizeRequest(DefaultApps.content.ToString())) return; - - content.Instance.PersistXmlToFile(); }