From 9076f5b21bd78f83f496e7f829e708305b67a58d Mon Sep 17 00:00:00 2001
From: Mark Olesen <Mark.Olesen@esi-group.com>
Date: Sat, 15 Dec 2018 14:39:12 +0100
Subject: [PATCH] ENH: provide argList::envGlobalPath() static method

- this is identical to either of these solutions:

     * getEnv("FOAM_CASE")
     * stringOps::expand("<case>")

  but with a closer resemblance to argList or Time globalPath(),
  which makes the intent clearer.
  Avoids using raw strings in the caller, which improves compile-time checks.

  Used in situations where a class has no derivation path or other
  access to a time registry or command args.
---
 .../db/dynamicLibrary/dynamicCode/dynamicCode.C     | 13 +++++++------
 src/OpenFOAM/global/argList/argList.C               |  8 ++++++++
 src/OpenFOAM/global/argList/argList.H               | 12 ++++++++++++
 .../utilities/systemCall/systemCall.C               | 10 +++++++++-
 .../noise/noiseModels/noiseModel/noiseModel.C       |  4 ++--
 .../noise/noiseModels/pointNoise/pointNoise.C       |  5 ++---
 .../noise/noiseModels/surfaceNoise/surfaceNoise.C   |  5 ++---
 .../boundaryData/boundaryDataSurfaceWriter.C        |  3 ++-
 .../boundaryData/boundaryDataSurfaceWriterImpl.C    |  2 +-
 9 files changed, 45 insertions(+), 17 deletions(-)

diff --git a/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCode.C b/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCode.C
index 422d0687a62..1a2d068749d 100644
--- a/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCode.C
+++ b/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCode.C
@@ -25,6 +25,7 @@ License
 
 #include "dynamicCode.H"
 #include "dynamicCodeContext.H"
+#include "argList.H"
 #include "stringOps.H"
 #include "Fstream.H"
 #include "IOstreams.H"
@@ -64,10 +65,10 @@ void Foam::dynamicCode::checkSecurity
     if (isAdministrator())
     {
         FatalIOErrorInFunction(dict)
-            << "This code should not be executed by someone with administrator"
-            << " rights due to security reasons." << nl
-            << "(it writes a shared library which then gets loaded "
-            << "using dlopen)"
+            << "This code should not be executed by someone"
+            << " with administrator rights for security reasons." << nl
+            << "It generates a shared library which is loaded using dlopen"
+            << nl << endl
             << exit(FatalIOError);
     }
 
@@ -292,8 +293,8 @@ bool Foam::dynamicCode::writeDigest(const std::string& sha1) const
 
 Foam::dynamicCode::dynamicCode(const word& codeName, const word& codeDirName)
 :
-    codeRoot_(stringOps::expand("<case>")/topDirName),
-    libSubDir_(stringOps::expand("platforms/$WM_OPTIONS/lib")),
+    codeRoot_(argList::envGlobalPath()/topDirName),
+    libSubDir_(stringOps::expand("platforms/${WM_OPTIONS}/lib")),
     codeName_(codeName),
     codeDirName_(codeDirName)
 {
diff --git a/src/OpenFOAM/global/argList/argList.C b/src/OpenFOAM/global/argList/argList.C
index f06b9cfc1e9..f7c622e746b 100644
--- a/src/OpenFOAM/global/argList/argList.C
+++ b/src/OpenFOAM/global/argList/argList.C
@@ -463,6 +463,14 @@ bool Foam::argList::postProcess(int argc, char *argv[])
 }
 
 
+// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
+
+Foam::fileName Foam::argList::envGlobalPath()
+{
+    return Foam::getEnv("FOAM_CASE");
+}
+
+
 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
 
 Foam::word Foam::argList::optionCompat(const word& optName)
diff --git a/src/OpenFOAM/global/argList/argList.H b/src/OpenFOAM/global/argList/argList.H
index 379c6617d2d..e569e02e525 100644
--- a/src/OpenFOAM/global/argList/argList.H
+++ b/src/OpenFOAM/global/argList/argList.H
@@ -272,6 +272,18 @@ public:
 
     // Member Functions
 
+    // Environment
+
+        //- Global case (directory) from environment variable
+        //
+        //  Returns the contents of the \c FOAM_CASE variable,
+        //  which has previously been set by argList or by Time.
+        //
+        //  This will normally be identical to the value of globalPath(),
+        //  but obtained via the environment.
+        static fileName envGlobalPath();
+
+
     // Low-level
 
         //- Scan for -help, -doc options etc prior to checking the validity
diff --git a/src/functionObjects/utilities/systemCall/systemCall.C b/src/functionObjects/utilities/systemCall/systemCall.C
index 0b19fda5e36..3e54b1d04fb 100644
--- a/src/functionObjects/utilities/systemCall/systemCall.C
+++ b/src/functionObjects/utilities/systemCall/systemCall.C
@@ -114,9 +114,17 @@ bool Foam::functionObjects::systemCall::read(const dictionary& dict)
     if (executeCalls_.empty() && endCalls_.empty() && writeCalls_.empty())
     {
         WarningInFunction
-            << "no executeCalls, endCalls or writeCalls defined."
+            << "No executeCalls, endCalls or writeCalls defined."
             << endl;
     }
+    else if (isAdministrator())
+    {
+        FatalErrorInFunction
+            << "System calls should not be executed by someone"
+            << " with administrator rights for security reasons." << nl
+            << nl << endl
+            << exit(FatalError);
+    }
     else if (!dynamicCode::allowSystemOperations)
     {
         FatalErrorInFunction
diff --git a/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.C b/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.C
index 1104fabc3ff..6a4272a423d 100644
--- a/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.C
+++ b/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.C
@@ -25,7 +25,7 @@ License
 
 #include "noiseModel.H"
 #include "functionObject.H"
-#include "stringOps.H"
+#include "argList.H"
 
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
 
@@ -143,7 +143,7 @@ Foam::fileName Foam::noiseModel::baseFileDir(const label dataseti) const
 {
     return
     (
-        stringOps::expand("<case>")    // ie, globalPath()
+        argList::envGlobalPath()
       / functionObject::outputPrefix
       / "noise"
       / outputPrefix_
diff --git a/src/randomProcesses/noise/noiseModels/pointNoise/pointNoise.C b/src/randomProcesses/noise/noiseModels/pointNoise/pointNoise.C
index c5474aee3bb..3e0c491292d 100644
--- a/src/randomProcesses/noise/noiseModels/pointNoise/pointNoise.C
+++ b/src/randomProcesses/noise/noiseModels/pointNoise/pointNoise.C
@@ -25,7 +25,7 @@ License
 
 #include "pointNoise.H"
 #include "noiseFFT.H"
-#include "stringOps.H"
+#include "argList.H"
 #include "addToRunTimeSelectionTable.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -244,8 +244,7 @@ void pointNoise::calculate()
 
         if (!fName.isAbsolute())
         {
-            // ie, globalPath() / name
-            fName = stringOps::expand("<case>")/fName;
+            fName = argList::envGlobalPath()/fName;
         }
 
         Function1Types::CSV<scalar> data("pressure", dict_, fName);
diff --git a/src/randomProcesses/noise/noiseModels/surfaceNoise/surfaceNoise.C b/src/randomProcesses/noise/noiseModels/surfaceNoise/surfaceNoise.C
index a60902aafb2..d53c0c9b9f8 100644
--- a/src/randomProcesses/noise/noiseModels/surfaceNoise/surfaceNoise.C
+++ b/src/randomProcesses/noise/noiseModels/surfaceNoise/surfaceNoise.C
@@ -27,8 +27,8 @@ License
 #include "surfaceReader.H"
 #include "surfaceWriter.H"
 #include "noiseFFT.H"
+#include "argList.H"
 #include "graph.H"
-#include "stringOps.H"
 #include "addToRunTimeSelectionTable.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -465,8 +465,7 @@ void surfaceNoise::calculate()
 
         if (!fName.isAbsolute())
         {
-            // ie, globalPath() / name
-            fName = stringOps::expand("<case>")/fName;
+            fName = argList::envGlobalPath()/fName;
         }
 
         initialise(fName);
diff --git a/src/sampling/sampledSurface/writers/boundaryData/boundaryDataSurfaceWriter.C b/src/sampling/sampledSurface/writers/boundaryData/boundaryDataSurfaceWriter.C
index 15cf1d3ee73..8456d61912e 100644
--- a/src/sampling/sampledSurface/writers/boundaryData/boundaryDataSurfaceWriter.C
+++ b/src/sampling/sampledSurface/writers/boundaryData/boundaryDataSurfaceWriter.C
@@ -25,6 +25,7 @@ License
 
 #include "boundaryDataSurfaceWriter.H"
 #include "makeSurfaceWriterMethods.H"
+#include "argList.H"
 
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
 
@@ -62,7 +63,7 @@ Foam::fileName Foam::boundaryDataSurfaceWriter::write
     const pointField& points = surf.points();
 
     // Dummy time to use as an objectRegistry
-    const fileName caseDir(getEnv("FOAM_CASE"));
+    const fileName caseDir(argList::envGlobalPath());
 
     Time dummyTime
     (
diff --git a/src/sampling/sampledSurface/writers/boundaryData/boundaryDataSurfaceWriterImpl.C b/src/sampling/sampledSurface/writers/boundaryData/boundaryDataSurfaceWriterImpl.C
index 14f1545e226..d774e7f1be5 100644
--- a/src/sampling/sampledSurface/writers/boundaryData/boundaryDataSurfaceWriterImpl.C
+++ b/src/sampling/sampledSurface/writers/boundaryData/boundaryDataSurfaceWriterImpl.C
@@ -54,7 +54,7 @@ Foam::fileName Foam::boundaryDataSurfaceWriter::writeTemplate
     const faceList&    faces = surf.faces();
 
     // Dummy time to use as an objectRegistry
-    const fileName caseDir(getEnv("FOAM_CASE"));
+    const fileName caseDir(argList::envGlobalPath());
 
     Time dummyTime
     (
-- 
GitLab