]> git.mxchange.org Git - flightgear.git/commitdiff
fgValidatePath uses SGPath
authorJames Turner <zakalawe@mac.com>
Sun, 3 Jul 2016 22:59:40 +0000 (23:59 +0100)
committerRoland Haeder <roland@mxchange.org>
Thu, 22 Sep 2016 21:27:47 +0000 (23:27 +0200)
src/Canvas/FGCanvasSystemAdapter.cxx
src/Main/fg_commands.cxx
src/Main/util.cxx
src/Main/util.hxx
src/Scripting/NasalHTTP.cxx
src/Scripting/NasalSGPath.cxx
src/Scripting/NasalSys.cxx

index e035a8ac22dec3d3e22d70e7ada0eb10d6f37d7a..3fc5ee083aa24346185235a2f198755fe509d8fd 100644 (file)
@@ -79,11 +79,12 @@ namespace canvas
   //----------------------------------------------------------------------------
   osg::ref_ptr<osg::Image> FGCanvasSystemAdapter::getImage(const std::string& path) const
   {
-    if( SGPath(path).isAbsolute() )
+      SGPath p(SGPath::fromUtf8(path));
+    if( p.isAbsolute() )
     {
-      std::string valid_path = fgValidatePath(path, false);
-      if( !valid_path.empty() )
-        return osgDB::readImageFile(valid_path.c_str());
+      SGPath valid_path = fgValidatePath(p, false);
+      if( !valid_path.isNull() )
+        return osgDB::readImageFile(valid_path.local8BitStr());
 
       SG_LOG(SG_IO, SG_ALERT, "canvas::Image: reading '" << path << "' denied");
     }
index ac013383441cd7a5830161130a1e641be964fd20..1040b5f9ef21ba3e6e5c7a7ef02042ace9bfab72 100644 (file)
@@ -289,14 +289,14 @@ do_load (const SGPropertyNode * arg)
     if (file.extension() != "sav")
         file.concat(".sav");
 
-    std::string validated_path = fgValidatePath(file, false);
-    if (validated_path.empty()) {
+    SGPath validated_path = fgValidatePath(file, false);
+    if (validated_path.isNull()) {
         SG_LOG(SG_IO, SG_ALERT, "load: reading '" << file << "' denied "
                 "(unauthorized access)");
         return false;
     }
 
-    sg_ifstream input(SGPath::fromUtf8(validated_path));
+    sg_ifstream input(validated_path);
     if (input.good() && fgLoadFlight(input)) {
         input.close();
         SG_LOG(SG_INPUT, SG_INFO, "Restored flight from " << file);
@@ -322,8 +322,8 @@ do_save (const SGPropertyNode * arg)
     if (file.extension() != "sav")
         file.concat(".sav");
 
-    std::string validated_path = fgValidatePath(file, true);
-    if (validated_path.empty()) {
+    SGPath validated_path = fgValidatePath(file, true);
+    if (validated_path.isNull()) {
         SG_LOG(SG_IO, SG_ALERT, "save: writing '" << file << "' denied "
                 "(unauthorized access)");
         return false;
@@ -1149,8 +1149,8 @@ do_load_xml_to_proptree(const SGPropertyNode * arg)
         }
     }
     
-    std::string validated_path = fgValidatePath(file, false);
-    if (validated_path.empty()) {
+    SGPath validated_path = fgValidatePath(file, false);
+    if (validated_path.isNull()) {
         SG_LOG(SG_IO, SG_ALERT, "loadxml: reading '" << file << "' denied "
                 "(unauthorized directory - authorization no longer follows symlinks; to authorize reading additional directories, add them to --fg-aircraft)");
         return false;
@@ -1232,8 +1232,8 @@ do_save_xml_from_proptree(const SGPropertyNode * arg)
     if (file.extension() != "xml")
         file.concat(".xml");
 
-    std::string validated_path = fgValidatePath(file, true);
-    if (validated_path.empty()) {
+    SGPath validated_path = fgValidatePath(file, true);
+    if (validated_path.isNull()) {
         SG_LOG(SG_IO, SG_ALERT, "savexml: writing to '" << file << "' denied "
                 "(unauthorized directory - authorization no longer follows symlinks)");
         return false;
index 2d333895e1968faeb202f07c7146f370f33dd91e..616bbdcd1bc387e5147c6b7984f21bdf8e1e59ca 100644 (file)
@@ -138,13 +138,13 @@ void fgInitAllowedPaths()
     
     // Check that it works
     std::string homePath = globals->get_fg_home().utf8Str();
-    if(!fgValidatePath(homePath + "/../no.log",true).empty() ||
-        !fgValidatePath(homePath + "/no.logt",true).empty() ||
-        !fgValidatePath(homePath + "/nolog",true).empty() ||
-        !fgValidatePath(homePath + "no.log",true).empty() ||
-        !fgValidatePath(homePath + "\\..\\no.log",false).empty() ||
-        fgValidatePath(homePath + "/aircraft-data/yes..xml",true).empty() ||
-        fgValidatePath(homePath + "/.\\yes.bmp",false).empty()) {
+    if(!fgValidatePath(homePath + "/../no.log",true).isNull() ||
+        !fgValidatePath(homePath + "/no.logt",true).isNull() ||
+        !fgValidatePath(homePath + "/nolog",true).isNull() ||
+        !fgValidatePath(homePath + "no.log",true).isNull() ||
+        !fgValidatePath(homePath + "\\..\\no.log",false).isNull() ||
+        fgValidatePath(homePath + "/aircraft-data/yes..xml",true).isNull() ||
+        fgValidatePath(homePath + "/.\\yes.bmp",false).isNull()) {
             flightgear::fatalMessageBox("Nasal initialization error",
                                     "The FG_HOME directory must not be inside any of the FG_ROOT, FG_AIRCRAFT or FG_SCENERY directories",
                                     "(check that you have not accidentally included an extra :, as an empty part means the current directory)");
@@ -159,10 +159,10 @@ void fgInitAllowedPaths()
  * the current directory changes),
  * always use the returned path not the original one
  */
-std::string fgValidatePath (const std::string& path, bool write)
+SGPath fgValidatePath (const SGPath& path, bool write)
 {
     // Normalize the path (prevents ../../.. or symlink trickery)
-    std::string normed_path = SGPath(path).realpath();
+    std::string normed_path = path.realpath();
     
     const string_list& allowed_paths(write ? write_allowed_paths : read_allowed_paths);
     size_t star_pos;
@@ -175,7 +175,7 @@ std::string fgValidatePath (const std::string& path, bool write)
         star_pos = it->find('*');
         if (star_pos == std::string::npos) {
             if (!(it->compare(normed_path))) {
-                return normed_path;
+                return SGPath::fromUtf8(normed_path);
             }
         } else {
             if ((it->size()-1 <= normed_path.size()) /* long enough to be a potential match */
@@ -184,13 +184,13 @@ std::string fgValidatePath (const std::string& path, bool write)
                 && !(it->substr(star_pos+1,it->size()-star_pos-1)
                     .compare(normed_path.substr(star_pos+1+normed_path.size()-it->size(),
                       it->size()-star_pos-1))) /* after-star parts match */) {
-                return normed_path;
+                return SGPath::fromUtf8(normed_path);
             }
         }
     }
     // no match found
-    return "";
+    return SGPath();
 }
-std::string fgValidatePath(const SGPath& path, bool write) { return fgValidatePath(path.utf8Str(),write); }
+
 // end of util.cxx
 
index f078d0fdb3c3860b9a3d83b139137d4e6cad9cb3..e75c2846259ad12c398ccd6c7375bb948ff9c920 100644 (file)
@@ -47,8 +47,7 @@ double fgGetLowPass (double current, double target, double timeratio);
  * the current directory changes),
  * always use the returned path not the original one
  */
-std::string fgValidatePath(const SGPath& path, bool write);
-std::string fgValidatePath(const std::string& path, bool write);
+SGPath fgValidatePath(const SGPath& path, bool write);
 
 /**
  * Set allowed paths for fgValidatePath
index 15c76ed34f4955e1f1019425d5c4f73e2b34ba92..c59b78a0e80fb1c8540315bd281a20791bef7369 100644 (file)
@@ -55,16 +55,16 @@ static naRef f_http_save(const nasal::CallContext& ctx)
 
   // Check for write access to target file
   const std::string filename = ctx.requireArg<std::string>(1);
-  const std::string validated_path = fgValidatePath(filename, true);
+  const SGPath validated_path = fgValidatePath(filename, true);
 
-  if( validated_path.empty() )
+  if( validated_path.isNull() )
     naRuntimeError( ctx.c,
                     "Access denied: can not write to %s",
                     filename.c_str() );
 
   return ctx.to_nasal
   (
-    requireHTTPClient(ctx.c).client()->save(url, validated_path)
+   requireHTTPClient(ctx.c).client()->save(url, validated_path.utf8Str())
   );
 }
 
index 08cc2c7fef171ab9d967ddd33140bbda3aae3923..384db168554c084912771cc8d726d0699462f7b7 100644 (file)
@@ -46,8 +46,8 @@ SGPath::Permissions checkIORules(const SGPath& path)
         "realpath() to make a path absolute)");
   }
 
-  perm.read  = path.isAbsolute() && !fgValidatePath(path, false).empty();
-  perm.write = path.isAbsolute() && !fgValidatePath(path, true ).empty();
+  perm.read  = path.isAbsolute() && !fgValidatePath(path, false).isNull();
+  perm.write = path.isAbsolute() && !fgValidatePath(path, true ).isNull();
 
   return perm;
 }
index 20b97849c356d932f888bd5297cf536397a011c7..9931905110b58908698ee129c4fdd41c66b6531d 100644 (file)
@@ -576,8 +576,8 @@ static naRef f_directory(naContext c, naRef me, int argc, naRef* args)
     if(argc != 1 || !naIsString(args[0]))
         naRuntimeError(c, "bad arguments to directory()");
 
-    std::string dirname = fgValidatePath(naStr_data(args[0]), false);
-    if(dirname.empty()) {
+    SGPath dirname = fgValidatePath(SGPath::fromUtf8(naStr_data(args[0])), false);
+    if(dirname.isNull()) {
         SG_LOG(SG_NASAL, SG_ALERT, "directory(): listing '" <<
         naStr_data(args[0]) << "' denied (unauthorized directory - authorization"
         " no longer follows symlinks; to authorize reading additional "
@@ -586,8 +586,7 @@ static naRef f_directory(naContext c, naRef me, int argc, naRef* args)
         return naNil();
     }
 
-    SGPath d0(dirname);
-    simgear::Dir d(d0);
+    simgear::Dir d(dirname);
     if(!d.exists()) return naNil();
     naRef result = naNewVector(c);
 
@@ -683,9 +682,9 @@ static naRef f_open(naContext c, naRef me, int argc, naRef* args)
     naRef mode = argc > 1 ? naStringValue(c, args[1]) : naNil();
     if(!naStr_data(file)) naRuntimeError(c, "bad argument to open()");
     const char* modestr = naStr_data(mode) ? naStr_data(mode) : "rb";
-    std::string filename = fgValidatePath(naStr_data(file),
+    SGPath filename = fgValidatePath(SGPath::fromUtf8(naStr_data(file)),
         strcmp(modestr, "rb") && strcmp(modestr, "r"));
-    if(filename.empty()) {
+    if(filename.isNull()) {
         SG_LOG(SG_NASAL, SG_ALERT, "open(): reading/writing '" <<
         naStr_data(file) << "' denied (unauthorized directory - authorization"
         " no longer follows symlinks; to authorize reading additional "
@@ -693,7 +692,9 @@ static naRef f_open(naContext c, naRef me, int argc, naRef* args)
         naRuntimeError(c, "open(): access denied (unauthorized directory)");
         return naNil();
     }
+
     f = fopen(filename.c_str(), modestr);
+
     if(!f) naRuntimeError(c, strerror(errno));
     return naIOGhost(c, f);
 }
@@ -718,8 +719,8 @@ static naRef f_parsexml(naContext c, naRef me, int argc, naRef* args)
         if(!(naIsNil(args[i]) || naIsFunc(args[i])))
             naRuntimeError(c, "parsexml(): callback argument not a function");
 
-    std::string file = fgValidatePath(naStr_data(args[0]), false);
-    if(file.empty()) {
+    SGPath file = fgValidatePath(SGPath::fromUtf8(naStr_data(args[0])), false);
+    if(file.isNull()) {
         SG_LOG(SG_NASAL, SG_ALERT, "parsexml(): reading '" <<
         naStr_data(args[0]) << "' denied (unauthorized directory - authorization"
         " no longer follows symlinks; to authorize reading additional "
@@ -727,7 +728,7 @@ static naRef f_parsexml(naContext c, naRef me, int argc, naRef* args)
         naRuntimeError(c, "parsexml(): access denied (unauthorized directory)");
         return naNil();
     }
-    sg_ifstream input(SGPath::fromUtf8(file));
+    sg_ifstream input(file);
     NasalXMLVisitor visitor(c, argc, args);
     try {
         readXML(input, visitor);
@@ -736,7 +737,9 @@ static naRef f_parsexml(naContext c, naRef me, int argc, naRef* args)
                 file.c_str(), e.getFormattedMessage().c_str());
         return naNil();
     }
-    return naStr_fromdata(naNewString(c), file.c_str(), file.length());
+
+    std::string fs = file.utf8Str();
+    return naStr_fromdata(naNewString(c), fs.c_str(), fs.length());
 }
 
 /**