* mu-str etc.: improve escaping (for gmail folder names)
This commit is contained in:
27
src/mu-str.c
27
src/mu-str.c
@ -336,7 +336,7 @@ mu_str_to_list (const char *str, char sepa, gboolean strip)
|
|||||||
|
|
||||||
|
|
||||||
static gchar*
|
static gchar*
|
||||||
eat_esc_string (char **strlst)
|
eat_esc_string (char **strlst, GError **err)
|
||||||
{
|
{
|
||||||
char *str;
|
char *str;
|
||||||
gboolean quoted;
|
gboolean quoted;
|
||||||
@ -366,14 +366,15 @@ leave:
|
|||||||
*strlst = str;
|
*strlst = str;
|
||||||
return g_string_free (gstr, FALSE);
|
return g_string_free (gstr, FALSE);
|
||||||
err:
|
err:
|
||||||
g_warning ("error in string");
|
g_set_error (err, 0, MU_ERROR_IN_PARAMETERS,
|
||||||
|
"error parsing string '%s'", g_strchug(*strlst));
|
||||||
*strlst = NULL;
|
*strlst = NULL;
|
||||||
return g_string_free (gstr, TRUE);
|
return g_string_free (gstr, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
GSList*
|
GSList*
|
||||||
mu_str_esc_to_list (const char *strings)
|
mu_str_esc_to_list (const char *strings, GError **err)
|
||||||
{
|
{
|
||||||
GSList *lst;
|
GSList *lst;
|
||||||
char *mystrings, *freeme;
|
char *mystrings, *freeme;
|
||||||
@ -387,9 +388,15 @@ mu_str_esc_to_list (const char *strings)
|
|||||||
lst = NULL;
|
lst = NULL;
|
||||||
do {
|
do {
|
||||||
gchar *str;
|
gchar *str;
|
||||||
str = eat_esc_string (&mystrings);
|
str = eat_esc_string (&mystrings, err);
|
||||||
if (str)
|
if (str)
|
||||||
lst = g_slist_prepend (lst, str);
|
lst = g_slist_prepend (lst, str);
|
||||||
|
else {
|
||||||
|
g_free (freeme);
|
||||||
|
mu_str_free_list (lst);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
} while (mystrings && *mystrings);
|
} while (mystrings && *mystrings);
|
||||||
|
|
||||||
g_free (freeme);
|
g_free (freeme);
|
||||||
@ -443,11 +450,6 @@ mu_str_ascii_xapian_escape_in_place (char *query, gboolean esc_space)
|
|||||||
*cur = tolower(*cur);
|
*cur = tolower(*cur);
|
||||||
|
|
||||||
switch (*cur) {
|
switch (*cur) {
|
||||||
case ' ':
|
|
||||||
case '@':
|
|
||||||
case '-':
|
|
||||||
case ';':
|
|
||||||
case '/':
|
|
||||||
*cur = escchar;
|
*cur = escchar;
|
||||||
break;
|
break;
|
||||||
case '.': /* don't escape '..' */
|
case '.': /* don't escape '..' */
|
||||||
@ -464,7 +466,14 @@ mu_str_ascii_xapian_escape_in_place (char *query, gboolean esc_space)
|
|||||||
if (!is_xapian_prefix (query, cur))
|
if (!is_xapian_prefix (query, cur))
|
||||||
*cur = escchar;
|
*cur = escchar;
|
||||||
break;
|
break;
|
||||||
|
case '\'':
|
||||||
|
case '*': /* wildcard */
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (!isalnum(*cur))
|
||||||
|
*cur = escchar;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return query;
|
return query;
|
||||||
|
|||||||
@ -288,7 +288,7 @@ GSList* mu_str_to_list (const char *str, char sepa, gboolean strip);
|
|||||||
*
|
*
|
||||||
* @return a list of elements or NULL in case of error
|
* @return a list of elements or NULL in case of error
|
||||||
*/
|
*/
|
||||||
GSList* mu_str_esc_to_list (const char *str);
|
GSList* mu_str_esc_to_list (const char *str, GError **err);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -103,7 +103,7 @@ run_and_count_matches (const char *xpath, const char *query)
|
|||||||
if (g_test_verbose()) {
|
if (g_test_verbose()) {
|
||||||
char *xs;
|
char *xs;
|
||||||
g_print ("\n==> query: %s\n", query);
|
g_print ("\n==> query: %s\n", query);
|
||||||
xs = mu_query_preprocess (query);
|
xs = mu_query_preprocess (query, NULL);
|
||||||
g_print ("==> preproc: '%s'\n", xs);
|
g_print ("==> preproc: '%s'\n", xs);
|
||||||
g_free (xs);
|
g_free (xs);
|
||||||
xs = mu_query_as_string (mquery, query, NULL);
|
xs = mu_query_as_string (mquery, query, NULL);
|
||||||
@ -137,7 +137,6 @@ run_and_count_matches (const char *xpath, const char *query)
|
|||||||
return count1;
|
return count1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
const char *query;
|
const char *query;
|
||||||
size_t count; /* expected number of matches */
|
size_t count; /* expected number of matches */
|
||||||
@ -563,6 +562,28 @@ test_mu_query_tags_02 (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_mu_query_preprocess (void)
|
||||||
|
{
|
||||||
|
unsigned u;
|
||||||
|
struct {
|
||||||
|
const gchar *expr, *expected;
|
||||||
|
} testcases [] = {
|
||||||
|
{ "hello", "hello" },
|
||||||
|
{ "/[Gmail].Sent Mail", "__gmail__sent mail" }
|
||||||
|
/* add more */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
for (u = 0; u != G_N_ELEMENTS(testcases); ++u) {
|
||||||
|
gchar *prep;
|
||||||
|
prep = mu_query_preprocess (testcases[u].expr, NULL);
|
||||||
|
g_assert_cmpstr (prep, ==, testcases[u].expected);
|
||||||
|
g_free (prep);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -572,6 +593,9 @@ main (int argc, char *argv[])
|
|||||||
|
|
||||||
g_test_init (&argc, &argv, NULL);
|
g_test_init (&argc, &argv, NULL);
|
||||||
|
|
||||||
|
g_test_add_func ("/mu-query/test-mu-query-preprocess",
|
||||||
|
test_mu_query_preprocess);
|
||||||
|
|
||||||
g_test_add_func ("/mu-query/test-mu-query-01", test_mu_query_01);
|
g_test_add_func ("/mu-query/test-mu-query-01", test_mu_query_01);
|
||||||
g_test_add_func ("/mu-query/test-mu-query-02", test_mu_query_02);
|
g_test_add_func ("/mu-query/test-mu-query-02", test_mu_query_02);
|
||||||
g_test_add_func ("/mu-query/test-mu-query-03", test_mu_query_03);
|
g_test_add_func ("/mu-query/test-mu-query-03", test_mu_query_03);
|
||||||
|
|||||||
@ -172,7 +172,7 @@ test_mu_str_esc_to_list (void)
|
|||||||
for (i = 0; i != G_N_ELEMENTS(strings); ++i) {
|
for (i = 0; i != G_N_ELEMENTS(strings); ++i) {
|
||||||
GSList *lst, *cur;
|
GSList *lst, *cur;
|
||||||
unsigned u;
|
unsigned u;
|
||||||
lst = mu_str_esc_to_list (strings[i].str);
|
lst = mu_str_esc_to_list (strings[i].str, NULL);
|
||||||
for (cur = lst, u = 0; cur; cur = g_slist_next(cur), ++u)
|
for (cur = lst, u = 0; cur; cur = g_slist_next(cur), ++u)
|
||||||
g_assert_cmpstr ((const char*)cur->data,==,strings[i].strs[u]);
|
g_assert_cmpstr ((const char*)cur->data,==,strings[i].strs[u]);
|
||||||
mu_str_free_list (lst);
|
mu_str_free_list (lst);
|
||||||
|
|||||||
Reference in New Issue
Block a user