From 2fea38a5f2d0ee71eef998ec6f7bf4351f188bd7 Mon Sep 17 00:00:00 2001 From: MW Date: Wed, 12 Mar 2008 15:45:56 +0000 Subject: [PATCH] Applied patch from mantis #610, fixed invalid filenames with dump_assets_to_file set to true. thanks tyre. --- .../Communications/Capabilities/Caps.cs | 2 +- OpenSim/Framework/Util.cs | 81 +++++++++++++------ 2 files changed, 56 insertions(+), 27 deletions(-) diff --git a/OpenSim/Framework/Communications/Capabilities/Caps.cs b/OpenSim/Framework/Communications/Capabilities/Caps.cs index 8f41d62068..5df6a069f1 100644 --- a/OpenSim/Framework/Communications/Capabilities/Caps.cs +++ b/OpenSim/Framework/Communications/Capabilities/Caps.cs @@ -553,7 +553,7 @@ namespace OpenSim.Region.Capabilities { Directory.CreateDirectory(assetPath); } - FileStream fs = File.Create(Path.Combine(assetPath, filename)); + FileStream fs = File.Create(Path.Combine(assetPath, Util.safeFileName(filename))); BinaryWriter bw = new BinaryWriter(fs); bw.Write(data); bw.Close(); diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs index 8ba6643ccc..847436f4e8 100644 --- a/OpenSim/Framework/Util.cs +++ b/OpenSim/Framework/Util.cs @@ -37,8 +37,8 @@ using System.Text; using libsecondlife; using Nini.Config; -using System.Runtime.Serialization; -using System.Runtime.Serialization.Formatters.Binary; +using System.Runtime.Serialization; +using System.Runtime.Serialization.Formatters.Binary; namespace OpenSim.Framework { public class Util @@ -48,7 +48,13 @@ namespace OpenSim.Framework private static object XferLock = new object(); private static Dictionary capsURLS = new Dictionary(); - #region Vector Equasions + // Get a list of invalid path characters (OS dependent) + private static string regexInvalidPathChars = "[" + new String(Path.GetInvalidPathChars()) + "]"; + // Get a list of invalid file characters (OS dependent) + private static string regexInvalidFileChars = "[" + new String(Path.GetInvalidFileNameChars()) + "]"; + + + #region Vector Equasions /// /// Get the distance between two 3d vectors /// @@ -60,7 +66,7 @@ namespace OpenSim.Framework float dx = a.X - b.X; float dy = a.Y - b.Y; float dz = a.Z - b.Z; - return Math.Sqrt(dx*dx + dy*dy + dz*dz); + return Math.Sqrt(dx * dx + dy * dy + dz * dz); } /// @@ -68,7 +74,8 @@ namespace OpenSim.Framework /// /// A 3d vector /// The magnitude of the vector - public static double GetMagnitude(LLVector3 a) { + public static double GetMagnitude(LLVector3 a) + { return Math.Sqrt((a.X * a.X) + (a.Y * a.Y) + (a.Z * a.Z)); } @@ -91,16 +98,16 @@ namespace OpenSim.Framework /// Returns if a vector is a zero vector (has all zero components) /// /// - public static bool IsZeroVector( LLVector3 v ) + public static bool IsZeroVector(LLVector3 v) { - if( v.X == 0 && v.Y == 0 && v.Z == 0) + if (v.X == 0 && v.Y == 0 && v.Z == 0) { return true; } - + return false; } - # endregion + # endregion public static ulong UIntsToLong(uint X, uint Y) { @@ -299,7 +306,7 @@ namespace OpenSim.Framework for (int j = 0; j < 16 && (i + j) < bytes.Length; j++) { if (bytes[i + j] >= 0x20 && bytes[i + j] < 0x7E) - output.Append((char) bytes[i + j]); + output.Append((char)bytes[i + j]); else output.Append("."); } @@ -358,6 +365,28 @@ namespace OpenSim.Framework return null; } + /// + /// Removes all invalid path chars (OS dependent) + /// + /// path + /// safe path + public static string safePath(string path) + { + return System.Text.RegularExpressions.Regex.Replace(path, @regexInvalidPathChars, string.Empty); + } + + /// + /// Removes all invalid filename chars (OS dependent) + /// + /// filename + /// safe filename + public static string safeFileName(string filename) + { + return System.Text.RegularExpressions.Regex.Replace(filename, @regexInvalidFileChars, string.Empty); ; + } + + + // // directory locations // @@ -365,12 +394,12 @@ namespace OpenSim.Framework public static string homeDir() { string temp; -// string personal=(Environment.GetFolderPath(Environment.SpecialFolder.Personal)); -// temp = Path.Combine(personal,".OpenSim"); + // string personal=(Environment.GetFolderPath(Environment.SpecialFolder.Personal)); + // temp = Path.Combine(personal,".OpenSim"); temp = "."; return temp; } - + public static string assetsDir() { return Path.Combine(configDir(), "assets"); @@ -439,10 +468,10 @@ namespace OpenSim.Framework public static void AddDataRowToConfig(IConfigSource config, DataRow row) { - config.Configs.Add((string) row[0]); + config.Configs.Add((string)row[0]); for (int i = 0; i < row.Table.Columns.Count; i++) { - config.Configs[(string) row[0]].Set(row.Table.Columns[i].ColumnName, row[i]); + config.Configs[(string)row[0]].Set(row.Table.Columns[i].ColumnName, row[i]); } } @@ -468,25 +497,25 @@ namespace OpenSim.Framework public static string CleanString(string input) { - if(input.Length == 0) + if (input.Length == 0) return input; - int clip=input.Length; + int clip = input.Length; // Test for ++ string terminator - int pos=input.IndexOf("\0"); - if(pos != -1 && pos < clip) - clip=pos; + int pos = input.IndexOf("\0"); + if (pos != -1 && pos < clip) + clip = pos; // Test for CR - pos=input.IndexOf("\r"); - if(pos != -1 && pos < clip) - clip=pos; + pos = input.IndexOf("\r"); + if (pos != -1 && pos < clip) + clip = pos; // Test for LF - pos=input.IndexOf("\n"); - if(pos != -1 && pos < clip) - clip=pos; + pos = input.IndexOf("\n"); + if (pos != -1 && pos < clip) + clip = pos; // Truncate string before first end-of-line character found return input.Substring(0, clip);