summaryrefslogtreecommitdiffstats
path: root/ipaserver/install
diff options
context:
space:
mode:
authorMartin Babinsky <mbabinsk@redhat.com>2017-01-10 17:15:33 +0100
committerMartin Babinsky <mbabinsk@redhat.com>2017-01-25 15:02:16 +0100
commit2831b30e9a9de947481c058d8d32e174f951b1c0 (patch)
treeda362a99e30cb77955375dd151f6c8d2172095ab /ipaserver/install
parent517d43e78b8d8ea0b796a6ff6a379236eaae21df (diff)
downloadfreeipa-2831b30e9a9de947481c058d8d32e174f951b1c0.tar.gz
freeipa-2831b30e9a9de947481c058d8d32e174f951b1c0.tar.xz
freeipa-2831b30e9a9de947481c058d8d32e174f951b1c0.zip
Delegate directive value quoting/unquoting to separate functions
Separate functions were added to installutils module to quote/unquote a string in arbitrary characters. `installutils.get/set_directive` functions will use them to enclose the directive values in double quotes/strip the double quotes from retrieved values to maintain the original behavior. These functions can be used also for custom quoting/unquoting of retrieved values when desired. https://fedorahosted.org/freeipa/ticket/6460 Reviewed-By: Tomas Krizek <tkrizek@redhat.com> Reviewed-By: Petr Spacek <pspacek@redhat.com>
Diffstat (limited to 'ipaserver/install')
-rw-r--r--ipaserver/install/installutils.py70
1 files changed, 43 insertions, 27 deletions
diff --git a/ipaserver/install/installutils.py b/ipaserver/install/installutils.py
index 4f9337210..ab2596c8c 100644
--- a/ipaserver/install/installutils.py
+++ b/ipaserver/install/installutils.py
@@ -380,8 +380,38 @@ def update_file(filename, orig, subst):
return 1
-def set_directive(filename, directive, value, quotes=True, separator=' ',
- quote_char='\"'):
+def quote_directive_value(value, quote_char):
+ """Quote a directive value
+ :param value: string to quote
+ :param quote_char: character which is used for quoting. All prior
+ occurences will be escaped before quoting to avoid unparseable value.
+ :returns: processed value
+ """
+ if value.startswith(quote_char) and value.endswith(quote_char):
+ return value
+
+ return "{quote}{value}{quote}".format(
+ quote=quote_char,
+ value="".join(ipautil.escape_seq(quote_char, value))
+ )
+
+
+def unquote_directive_value(value, quote_char):
+ """Unquote a directive value
+ :param value: string to unquote
+ :param quote_char: character to strip. All escaped occurences of
+ `quote_char` will be uncescaped during processing
+ :returns: processed value
+ """
+ unescaped_value = "".join(ipautil.unescape_seq(quote_char, value))
+ if (unescaped_value.startswith(quote_char) and
+ unescaped_value.endswith(quote_char)):
+ return unescaped_value[1:-1]
+
+ return unescaped_value
+
+
+def set_directive(filename, directive, value, quotes=True, separator=' '):
"""Set a name/value pair directive in a configuration file.
A value of None means to drop the directive.
@@ -391,25 +421,19 @@ def set_directive(filename, directive, value, quotes=True, separator=' ',
:param filename: input filename
:param directive: directive name
:param value: value of the directive
- :param quotes: whether to quote `value` in `quote_char`. If true, then
- the `quote_char` are first escaped to avoid unparseable directives.
+ :param quotes: whether to quote `value` in double quotes. If true, then
+ any existing double quotes are first escaped to avoid
+ unparseable directives.
:param separator: character serving as separator between directive and
value
- :param quote_char: the character used for quoting `value`
"""
- def format_directive(directive, value, separator, quotes, quote_char):
- directive_sep = "{directive}{separator}".format(directive=directive,
- separator=separator)
- transformed_value = value
- if quotes:
- transformed_value = "{quote}{value}{quote}".format(
- quote=quote_char,
- value="".join(ipautil.escape_seq(quote_char, value))
- )
+ new_directive_value = ""
+ if value is not None:
+ value_to_set = quote_directive_value(value, '"') if quotes else value
- return "{directive_sep}{value}\n".format(
- directive_sep=directive_sep, value=transformed_value)
+ new_directive_value = "".join(
+ [directive, separator, value_to_set, '\n'])
valueset = False
st = os.stat(filename)
@@ -419,17 +443,13 @@ def set_directive(filename, directive, value, quotes=True, separator=' ',
if line.lstrip().startswith(directive):
valueset = True
if value is not None:
- newfile.append(
- format_directive(
- directive, value, separator, quotes, quote_char))
+ newfile.append(new_directive_value)
else:
newfile.append(line)
fd.close()
if not valueset:
if value is not None:
- newfile.append(
- format_directive(
- directive, value, separator, quotes, quote_char))
+ newfile.append(new_directive_value)
fd = open(filename, "w")
fd.write("".join(newfile))
@@ -444,9 +464,6 @@ def get_directive(filename, directive, separator=' '):
:param filename: input filename
:param directive: directive name
:param separator: separator between directive and value
- :param quote_char: the characters that are used in this particular config
- file to quote values. This character will be stripped and unescaped
- from the raw value.
:returns: The (unquoted) value if the directive was found, None otherwise
"""
@@ -459,8 +476,7 @@ def get_directive(filename, directive, separator=' '):
if not sep or not value:
raise ValueError("Malformed directive: {}".format(line))
- result = value.strip().strip(quote_char)
- result = ipautil.unescape_seq(quote_char, result)[0]
+ result = unquote_directive_value(value.strip(), '"')
result = result.strip(' ')
fd.close()
return result