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.
This commit is contained in:
Matthias Clasen 2019-01-21 22:55:45 -05:00
parent 5506de3b92
commit e6574b228e
2 changed files with 36 additions and 0 deletions

View File

@ -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);
}

View File

@ -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;