summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Estabrook <jestabro@sentrium.io>2019-11-12 08:33:34 -0600
committerChristian Poessinger <christian@poessinger.com>2019-11-17 18:02:32 +0100
commit05c9967ac3122b45dd2fe2ae48d67d5e2a3f14d7 (patch)
treeb599a7a5df149a4265b85c24da56a898792fbdb8
parentb1cc15ab68925fb333f1e75862faefa365ac18d1 (diff)
downloadvyos-1x-05c9967ac3122b45dd2fe2ae48d67d5e2a3f14d7.tar.gz
vyos-1x-05c9967ac3122b45dd2fe2ae48d67d5e2a3f14d7.zip
T1801: escape isolated backslashes before passing to ConfigTree()
-rw-r--r--python/vyos/config.py6
-rw-r--r--python/vyos/util.py6
-rwxr-xr-xsrc/services/vyos-http-api-server2
3 files changed, 14 insertions, 0 deletions
diff --git a/python/vyos/config.py b/python/vyos/config.py
index 13b2c107e..e6a41a92d 100644
--- a/python/vyos/config.py
+++ b/python/vyos/config.py
@@ -69,6 +69,7 @@ import json
import subprocess
import vyos.configtree
+import vyos.util
class VyOSError(Exception):
@@ -111,6 +112,11 @@ class Config(object):
else:
session_config_text = running_config_text
+ # The output of showConfig does not escape backslashes, as is expected
+ # by ConfigTree().
+ session_config_text = vyos.util.escape_backslash(session_config_text)
+ running_config_text = vyos.util.escape_backslash(running_config_text)
+
self._session_config = vyos.configtree.ConfigTree(session_config_text)
self._running_config = vyos.configtree.ConfigTree(running_config_text)
diff --git a/python/vyos/util.py b/python/vyos/util.py
index 67a602f7a..659a702fd 100644
--- a/python/vyos/util.py
+++ b/python/vyos/util.py
@@ -199,3 +199,9 @@ def is_admin() -> bool:
current_user = getpass.getuser()
(_, _, _, admin_group_members) = grp.getgrnam('sudo')
return current_user in admin_group_members
+
+def escape_backslash(string: str) -> str:
+ """Escape single backslashes in string that are not in escape sequence"""
+ p = re.compile(r'(?<!\\)[\\](?!b|f|n|r|t|\\[^bfnrt])')
+ result = p.sub(r'\\\\', string)
+ return result
diff --git a/src/services/vyos-http-api-server b/src/services/vyos-http-api-server
index 1abaed873..9b6d7e979 100755
--- a/src/services/vyos-http-api-server
+++ b/src/services/vyos-http-api-server
@@ -24,6 +24,7 @@ import traceback
import threading
import vyos.config
+import vyos.util
import bottle
@@ -212,6 +213,7 @@ def get_value():
config_format = command['configFormat']
res = session.show_config(path=command['path'])
+ res = vyos.util.escape_backslash(res)
if config_format == 'json':
config_tree = vyos.configtree.ConfigTree(res)
res = json.loads(config_tree.to_json())