Fixed bug with Object Tool import ignoring double quotes in command. Fixes #NX-1194
authorEriks Jenkevics <eriks@netxms.org>
Wed, 7 Jun 2017 08:12:53 +0000 (11:12 +0300)
committerEriks Jenkevics <eriks@netxms.org>
Fri, 9 Jun 2017 08:46:45 +0000 (11:46 +0300)
include/nxconfig.h
src/libnetxms/config.cpp
src/server/core/import.cpp

index 84fd305..7515f71 100644 (file)
@@ -123,6 +123,7 @@ private:
        int m_errorCount;
        MUTEX m_mutex;
    StringMap m_aliases;
+   bool m_allowMacroExpansion;
 
 protected:
        virtual void onError(const TCHAR *errorMessage);
@@ -131,7 +132,7 @@ protected:
        ConfigEntry *createEntry(const TCHAR *path);
 
 public:
-       Config();
+       Config(bool allowMacroExpansion = true);
    virtual ~Config();
 
        void lock() { MutexLock(m_mutex); }
index 81084dd..9c39fa2 100644 (file)
 /**
  * Expand value
  */
-static TCHAR *ExpandValue(const TCHAR *src)
+static TCHAR *ExpandValue(const TCHAR *src, bool xmlFormat, bool expandEnv)
 {
+   if (xmlFormat && !expandEnv)
+      return _tcsdup(src);
+
    size_t allocated = _tcslen(src) + 1;
    TCHAR *buffer = (TCHAR *)malloc(allocated * sizeof(TCHAR));
 
@@ -44,12 +47,12 @@ static TCHAR *ExpandValue(const TCHAR *src)
    TCHAR *out = buffer;
    bool squotes = false;
    bool dquotes = false;
-   if (*in == _T('"'))
+   if ((*in == _T('"')) && !xmlFormat)
    {
       dquotes = true;
       in++;
    }
-   else if (*in == _T('\''))
+   else if ((*in == _T('\'')) && !xmlFormat)
    {
       squotes = true;
       in++;
@@ -68,14 +71,14 @@ static TCHAR *ExpandValue(const TCHAR *src)
       }
       else if (dquotes && (*in == _T('"')))
       {
-         // Single quoting characters are ignored in quoted string
+         // Double quoting characters are ignored in quoted string
          if (*(in + 1) == _T('"'))
          {
             in++;
             *out++ = _T('"');
          }
       }
-      else if (!squotes && (*in == _T('$')))
+      else if (!squotes && expandEnv && (*in == _T('$')))
       {
          if (*(in + 1) == _T('{'))  // environment string expansion
          {
@@ -685,11 +688,12 @@ void ConfigEntry::createXml(String &xml, int level)
 /**
  * Constructor for config
  */
-Config::Config()
+Config::Config(bool allowMacroExpansion)
 {
    m_root = new ConfigEntry(_T("[root]"), NULL, this, NULL, 0, 0);
    m_errorCount = 0;
    m_mutex = MutexCreate();
+   m_allowMacroExpansion = allowMacroExpansion;
 }
 
 /**
@@ -1272,7 +1276,7 @@ bool Config::loadIniConfig(const TCHAR *file, const TCHAR *defaultIniSection, bo
          {
             entry = new ConfigEntry(buffer, currentSection, this, file, sourceLine, 0);
          }
-         entry->addValuePreallocated(ExpandValue(ptr));
+         entry->addValuePreallocated(ExpandValue(ptr, false, m_allowMacroExpansion));
       }
    }
    fclose(cfg);
@@ -1298,6 +1302,7 @@ typedef struct
    String charData[MAX_STACK_DEPTH];
    bool trimValue[MAX_STACK_DEPTH];
    bool merge;
+   bool expandEnv;
 } XML_PARSER_STATE;
 
 /**
@@ -1395,7 +1400,7 @@ static void EndElement(void *userData, const char *name)
       ps->level--;
       if (ps->trimValue[ps->level])
          ps->charData[ps->level].trim();
-      ps->stack[ps->level]->addValuePreallocated(ExpandValue(ps->charData[ps->level]));
+      ps->stack[ps->level]->addValuePreallocated(ExpandValue(ps->charData[ps->level], true, ps->expandEnv));
    }
 }
 
@@ -1428,6 +1433,7 @@ bool Config::loadXmlConfigFromMemory(const char *xml, int xmlSize, const TCHAR *
    state.parser = parser;
    state.file = (name != NULL) ? name : _T("<mem>");
    state.merge = merge;
+   state.expandEnv = m_allowMacroExpansion;
 
    bool success = (XML_Parse(parser, xml, xmlSize, TRUE) != XML_STATUS_ERROR);
    if (!success)
index 1e644e5..5708a0c 100644 (file)
@@ -599,7 +599,7 @@ void ImportLocalConfiguration()
          if (MatchString(_T("*.xml"), f->d_name, FALSE))
          {
             _tcscpy(&path[insPos], f->d_name);
-            Config *config = new Config();
+            Config *config = new Config(false);
             if (config->loadXmlConfig(path, "configuration"))
             {
                ImportConfig(config, CFG_IMPORT_REPLACE_EVENT_BY_CODE | CFG_IMPORT_REPLACE_EVENT_BY_NAME);