BUG-1750 check filename pattern for invalid characters

This commit is contained in:
JKlingen 2015-02-18 21:03:21 +01:00
parent 2e29728a19
commit f393f3a9d4
3 changed files with 78 additions and 13 deletions

View file

@ -234,6 +234,7 @@ namespace Greenshot {
this.textbox_screenshotname.PropertyName = "OutputFileFilenamePattern"; this.textbox_screenshotname.PropertyName = "OutputFileFilenamePattern";
this.textbox_screenshotname.Size = new System.Drawing.Size(233, 20); this.textbox_screenshotname.Size = new System.Drawing.Size(233, 20);
this.textbox_screenshotname.TabIndex = 3; this.textbox_screenshotname.TabIndex = 3;
this.textbox_screenshotname.TextChanged += new System.EventHandler(this.FilenamePatternChanged);
// //
// label_language // label_language
// //

View file

@ -226,23 +226,55 @@ namespace Greenshot {
// Check the settings and somehow visibly mark when something is incorrect // Check the settings and somehow visibly mark when something is incorrect
private bool CheckSettings() { private bool CheckSettings() {
return CheckFilenamePattern() && CheckStorageLocationPath();
}
private bool CheckFilenamePattern() {
bool settingsOk = true; bool settingsOk = true;
if(!Directory.Exists(FilenameHelper.FillVariables(textbox_storagelocation.Text, false))) { string filename = FilenameHelper.GetFilenameFromPattern(textbox_screenshotname.Text, coreConfiguration.OutputFileFormat, null);
textbox_storagelocation.BackColor = Color.Red; // we allow dynamically created subfolders, need to check for them, too
settingsOk = false; string[] pathParts = filename.Split(Path.DirectorySeparatorChar);
} else {
// "Added" feature #3547158 string filenamePart = pathParts[pathParts.Length-1];
if (Environment.OSVersion.Version.Major >= 6) { settingsOk = FilenameHelper.IsFilenameValid(filenamePart);
textbox_storagelocation.BackColor = SystemColors.Window;
} else { for (int i = 0; (settingsOk && i<pathParts.Length-1); i++) {
textbox_storagelocation.BackColor = SystemColors.Control; settingsOk = FilenameHelper.IsDirectoryNameValid(pathParts[i]);
}
} }
DisplayTextBoxValidity(textbox_screenshotname, settingsOk);
return settingsOk; return settingsOk;
} }
private bool CheckStorageLocationPath() {
bool settingsOk = true;
if(!Directory.Exists(FilenameHelper.FillVariables(textbox_storagelocation.Text, false))) {
settingsOk = false;
}
DisplayTextBoxValidity(textbox_storagelocation, settingsOk);
return settingsOk;
}
private void DisplayTextBoxValidity(GreenshotTextBox textbox, bool valid) {
if (valid) {
// "Added" feature #3547158
if (Environment.OSVersion.Version.Major >= 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) { private void StorageLocationChanged(object sender, EventArgs e) {
CheckSettings(); CheckStorageLocationPath();
} }
/// <summary> /// <summary>

View file

@ -428,7 +428,7 @@ namespace GreenshotPlugin.Core {
/// Fill the pattern wit the supplied details /// Fill the pattern wit the supplied details
/// </summary> /// </summary>
/// <param name="pattern">Pattern</param> /// <param name="pattern">Pattern</param>
/// <param name="captureDetails">CaptureDetails</param> /// <param name="captureDetails">CaptureDetails, can be null</param>
/// <param name="filenameSafeMode">Should the result be made "filename" safe?</param> /// <param name="filenameSafeMode">Should the result be made "filename" safe?</param>
/// <returns>Filled pattern</returns> /// <returns>Filled pattern</returns>
public static string FillPattern(string pattern, ICaptureDetails captureDetails, bool filenameSafeMode) { public static string FillPattern(string pattern, ICaptureDetails captureDetails, bool filenameSafeMode) {
@ -461,10 +461,42 @@ namespace GreenshotPlugin.Core {
); );
} catch (Exception e) { } catch (Exception e) {
// adding additional data for bug tracking // 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); e.Data.Add("pattern", pattern);
throw; throw;
} }
} }
/// <summary>
/// Checks whether a directory name is valid in the current file system
/// </summary>
/// <param name="directoryName">directory name (not path!)</param>
/// <returns>true if directory name is valid</returns>
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;
}
/// <summary>
/// Checks whether a filename is valid in the current file system
/// </summary>
/// <param name="filename">name of the file</param>
/// <returns>true if filename is valid</returns>
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;
}
} }
} }