From f393f3a9d43b760a053e2a34d23dd08955a99e94 Mon Sep 17 00:00:00 2001 From: JKlingen Date: Wed, 18 Feb 2015 21:03:21 +0100 Subject: [PATCH] BUG-1750 check filename pattern for invalid characters --- Greenshot/Forms/SettingsForm.Designer.cs | 1 + Greenshot/Forms/SettingsForm.cs | 54 +++++++++++++++++++----- GreenshotPlugin/Core/FilenameHelper.cs | 36 +++++++++++++++- 3 files changed, 78 insertions(+), 13 deletions(-) diff --git a/Greenshot/Forms/SettingsForm.Designer.cs b/Greenshot/Forms/SettingsForm.Designer.cs index 402fb0237..ee3450880 100644 --- a/Greenshot/Forms/SettingsForm.Designer.cs +++ b/Greenshot/Forms/SettingsForm.Designer.cs @@ -234,6 +234,7 @@ namespace Greenshot { this.textbox_screenshotname.PropertyName = "OutputFileFilenamePattern"; this.textbox_screenshotname.Size = new System.Drawing.Size(233, 20); this.textbox_screenshotname.TabIndex = 3; + this.textbox_screenshotname.TextChanged += new System.EventHandler(this.FilenamePatternChanged); // // label_language // diff --git a/Greenshot/Forms/SettingsForm.cs b/Greenshot/Forms/SettingsForm.cs index c823bb143..77c248d7b 100644 --- a/Greenshot/Forms/SettingsForm.cs +++ b/Greenshot/Forms/SettingsForm.cs @@ -226,23 +226,55 @@ namespace Greenshot { // Check the settings and somehow visibly mark when something is incorrect private bool CheckSettings() { + return CheckFilenamePattern() && CheckStorageLocationPath(); + } + + private bool CheckFilenamePattern() { bool settingsOk = true; - if(!Directory.Exists(FilenameHelper.FillVariables(textbox_storagelocation.Text, false))) { - textbox_storagelocation.BackColor = Color.Red; - settingsOk = false; - } else { - // "Added" feature #3547158 - if (Environment.OSVersion.Version.Major >= 6) { - textbox_storagelocation.BackColor = SystemColors.Window; - } else { - textbox_storagelocation.BackColor = SystemColors.Control; - } + string filename = FilenameHelper.GetFilenameFromPattern(textbox_screenshotname.Text, coreConfiguration.OutputFileFormat, null); + // we allow dynamically created subfolders, need to check for them, too + string[] pathParts = filename.Split(Path.DirectorySeparatorChar); + + string filenamePart = pathParts[pathParts.Length-1]; + settingsOk = FilenameHelper.IsFilenameValid(filenamePart); + + for (int i = 0; (settingsOk && i= 6) { + textbox.BackColor = SystemColors.Window; + } else { + textbox.BackColor = SystemColors.Control; + } + } else { + textbox.BackColor = Color.Red; + } + } + + private void FilenamePatternChanged(object sender, EventArgs e) { + CheckFilenamePattern(); + } + private void StorageLocationChanged(object sender, EventArgs e) { - CheckSettings(); + CheckStorageLocationPath(); } /// diff --git a/GreenshotPlugin/Core/FilenameHelper.cs b/GreenshotPlugin/Core/FilenameHelper.cs index 4fd016868..8fc2d324a 100644 --- a/GreenshotPlugin/Core/FilenameHelper.cs +++ b/GreenshotPlugin/Core/FilenameHelper.cs @@ -428,7 +428,7 @@ namespace GreenshotPlugin.Core { /// Fill the pattern wit the supplied details /// /// Pattern - /// CaptureDetails + /// CaptureDetails, can be null /// Should the result be made "filename" safe? /// Filled pattern public static string FillPattern(string pattern, ICaptureDetails captureDetails, bool filenameSafeMode) { @@ -461,10 +461,42 @@ namespace GreenshotPlugin.Core { ); } catch (Exception e) { // adding additional data for bug tracking - e.Data.Add("title", captureDetails.Title); + if (captureDetails != null) { + e.Data.Add("title", captureDetails.Title); + } e.Data.Add("pattern", pattern); throw; } } + + /// + /// Checks whether a directory name is valid in the current file system + /// + /// directory name (not path!) + /// true if directory name is valid + public static bool IsDirectoryNameValid(string directoryName) { + var forbiddenChars = Path.GetInvalidPathChars(); + foreach (var forbiddenChar in forbiddenChars) { + if (directoryName == null || directoryName.Contains(forbiddenChar.ToString())) { + return false; + } + } + return true; + } + + /// + /// Checks whether a filename is valid in the current file system + /// + /// name of the file + /// true if filename is valid + public static bool IsFilenameValid(string filename) { + var forbiddenChars = Path.GetInvalidFileNameChars(); + foreach (var forbiddenChar in forbiddenChars) { + if (filename == null || filename.Contains(forbiddenChar.ToString())) { + return false; + } + } + return true; + } } }