Commit e6574b22 authored by Matthias Clasen's avatar Matthias Clasen

keyfile settings: Accept unquoted strings

It is hard for users to remember that strings have to be explicitly
quoted in the keyfile. Be lenient and accept strings that lack those
quotes.
parent 5506de3b
Pipeline #52930 passed with stages
in 13 minutes and 9 seconds
......@@ -225,6 +225,25 @@ get_from_keyfile (GKeyfileSettingsBackend *kfsb,
if (str)
{
return_value = g_variant_parse (type, str, NULL, NULL, NULL);
if (return_value == NULL &&
g_variant_type_equal (type, G_VARIANT_TYPE_STRING) &&
str[0] != '\"')
{
GString *s = g_string_sized_new (strlen (str) + 2);
char *p = str;
g_string_append_c (s, '\"');
while (*p)
{
if (*p == '\"')
g_string_append_c (s, '\\');
g_string_append_c (s, *p);
p++;
}
g_string_append_c (s, '\"');
return_value = g_variant_parse (type, s->str, NULL, NULL, NULL);
g_string_free (s, TRUE);
}
g_free (str);
}
......
......@@ -1770,6 +1770,23 @@ test_keyfile (void)
g_assert_cmpstr (str, ==, "howdy");
g_free (str);
/* Now check setting a string without quotes */
called = FALSE;
g_signal_connect (settings, "changed::greeting", G_CALLBACK (key_changed_cb), &called);
g_key_file_set_string (keyfile, "tests", "greeting", "he\"l🤗uń");
g_free (data);
data = g_key_file_to_data (keyfile, &len, NULL);
g_file_set_contents ("keyfile/gsettings.store", data, len, &error);
g_assert_no_error (error);
while (!called)
g_main_context_iteration (NULL, FALSE);
g_signal_handlers_disconnect_by_func (settings, key_changed_cb, &called);
str = g_settings_get_string (settings, "greeting");
g_assert_cmpstr (str, ==, "he\"l🤗uń");
g_free (str);
g_settings_set (settings, "farewell", "s", "cheerio");
called = FALSE;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment