extensions-tool: Escape '\' and '"' in json string
If user-input string contains '\' and/or '"', extensions-tool generates invalid json. This fixes that by escaping '\' and '"'. https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1279
This commit is contained in:
parent
afb405782c
commit
390431c5e0
@ -48,6 +48,23 @@ get_shell_version (GError **error)
|
|||||||
return g_strjoinv (".", split_version);
|
return g_strjoinv (".", split_version);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
escape_json_string (const char *string)
|
||||||
|
{
|
||||||
|
GString *escaped = g_string_new (string);
|
||||||
|
|
||||||
|
for (gsize i = 0; i < escaped->len; ++i)
|
||||||
|
{
|
||||||
|
if (escaped->str[i] == '"' || escaped->str[i] == '\\')
|
||||||
|
{
|
||||||
|
g_string_insert_c (escaped, i, '\\');
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return g_string_free (escaped, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
create_metadata (GFile *target_dir,
|
create_metadata (GFile *target_dir,
|
||||||
const char *uuid,
|
const char *uuid,
|
||||||
@ -55,6 +72,9 @@ create_metadata (GFile *target_dir,
|
|||||||
const char *description,
|
const char *description,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
|
g_autofree char *uuid_escaped = NULL;
|
||||||
|
g_autofree char *name_escaped = NULL;
|
||||||
|
g_autofree char *desc_escaped = NULL;
|
||||||
g_autoptr (GFile) target = NULL;
|
g_autoptr (GFile) target = NULL;
|
||||||
g_autoptr (GString) json = NULL;
|
g_autoptr (GString) json = NULL;
|
||||||
g_autofree char *version = NULL;
|
g_autofree char *version = NULL;
|
||||||
@ -63,11 +83,15 @@ create_metadata (GFile *target_dir,
|
|||||||
if (version == NULL)
|
if (version == NULL)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
uuid_escaped = escape_json_string (uuid);
|
||||||
|
name_escaped = escape_json_string (name);
|
||||||
|
desc_escaped = escape_json_string (description);
|
||||||
|
|
||||||
json = g_string_new ("{\n");
|
json = g_string_new ("{\n");
|
||||||
|
|
||||||
g_string_append_printf (json, " \"name\": \"%s\",\n", name);
|
g_string_append_printf (json, " \"name\": \"%s\",\n", name_escaped);
|
||||||
g_string_append_printf (json, " \"description\": \"%s\",\n", description);
|
g_string_append_printf (json, " \"description\": \"%s\",\n", desc_escaped);
|
||||||
g_string_append_printf (json, " \"uuid\": \"%s\",\n", uuid);
|
g_string_append_printf (json, " \"uuid\": \"%s\",\n", uuid_escaped);
|
||||||
g_string_append_printf (json, " \"shell-version\": [\n");
|
g_string_append_printf (json, " \"shell-version\": [\n");
|
||||||
g_string_append_printf (json, " \"%s\"\n", version);
|
g_string_append_printf (json, " \"%s\"\n", version);
|
||||||
g_string_append_printf (json, " ]\n}\n");
|
g_string_append_printf (json, " ]\n}\n");
|
||||||
|
Loading…
Reference in New Issue
Block a user