diff options
author | John Estabrook <jestabro@sentrium.io> | 2019-11-12 08:33:34 -0600 |
---|---|---|
committer | Christian Poessinger <christian@poessinger.com> | 2019-11-17 18:02:32 +0100 |
commit | 05c9967ac3122b45dd2fe2ae48d67d5e2a3f14d7 (patch) | |
tree | b599a7a5df149a4265b85c24da56a898792fbdb8 | |
parent | b1cc15ab68925fb333f1e75862faefa365ac18d1 (diff) | |
download | vyos-1x-05c9967ac3122b45dd2fe2ae48d67d5e2a3f14d7.tar.gz vyos-1x-05c9967ac3122b45dd2fe2ae48d67d5e2a3f14d7.zip |
T1801: escape isolated backslashes before passing to ConfigTree()
-rw-r--r-- | python/vyos/config.py | 6 | ||||
-rw-r--r-- | python/vyos/util.py | 6 | ||||
-rwxr-xr-x | src/services/vyos-http-api-server | 2 |
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()) |