diff options
author | Werner Koch <[email protected]> | 2021-08-20 07:13:01 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2021-08-20 07:18:22 +0000 |
commit | b4345f7521cb4c3f4af7894f5d6d840fda85e82f (patch) | |
tree | efd039f717c3af39c3bd21bd0183e0e3f418405d /common/recsel.c | |
parent | scd: Don't release the context until list_finish for PC/SC. (diff) | |
download | gnupg-b4345f7521cb4c3f4af7894f5d6d840fda85e82f.tar.gz gnupg-b4345f7521cb4c3f4af7894f5d6d840fda85e82f.zip |
wkd: Fix client issue with leading or trailing spaces in user-ids.
* common/recsel.c (recsel_parse_expr): Add flag -t.
* common/stringhelp.c: Remove assert.h.
(strtokenize): Factor code out to do_strtokenize.
(strtokenize_nt): New.
(do_strtokenize): Add arg trim to support the strtokenize_nt.
* common/t-stringhelp.c (test_strtokenize_nt): New test cases.
* tools/wks-util.c (wks_list_key): Use strtokenize_nt and the recsel
flag -t.
--
This fixes a bug with user ids with leading spaces because:
wks-client lists all mail addresses from the key and matches them to the
requested mail address.
If there are several user-ids all with the same mail address
wks-client picks one of them and then extracts exactly that user id.
However, here it does not match by the mail address but by the full
user-id so that we can be sure that there will be only one user-id in
the final key.
The filter built expression unfortunately strips leading blanks but
requires a verbatim match. Thus it won't find the user id again and
errors out.
The new -t flag and a non-trimming strtokenize solves the problem.
Signed-off-by: Werner Koch <[email protected]>
Diffstat (limited to 'common/recsel.c')
-rw-r--r-- | common/recsel.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/common/recsel.c b/common/recsel.c index 95c104fdd..60da4d3c9 100644 --- a/common/recsel.c +++ b/common/recsel.c @@ -172,6 +172,8 @@ find_next_lc (char *string) * * -- VALUE spans to the end of the expression. * -c The string match in this part is done case-sensitive. + * -t Do not trim leading and trailing spaces from VALUE. + * Note that a space after <op> is here required. * * For example four calls to recsel_parse_expr() with these values for * EXPR @@ -203,6 +205,7 @@ recsel_parse_expr (recsel_expr_t *selector, const char *expression) char *s0, *s; int toend = 0; int xcase = 0; + int notrim = 0; int disjun = 0; char *next_lc = NULL; @@ -232,6 +235,7 @@ recsel_parse_expr (recsel_expr_t *selector, const char *expression) { case '-': toend = 1; break; case 'c': xcase = 1; break; + case 't': notrim = 1; break; default: log_error ("invalid flag '-%c' in expression\n", *expr); recsel_release (se_head); @@ -397,8 +401,11 @@ recsel_parse_expr (recsel_expr_t *selector, const char *expression) return my_error (GPG_ERR_INV_OP); } - while (*s == ' ' || *s == '\t') + if (*s == ' ' || *s == '\t') s++; + if (!notrim) + while (*s == ' ' || *s == '\t') + s++; if (se->op == SELECT_NONEMPTY || se->op == SELECT_ISTRUE) { @@ -431,7 +438,8 @@ recsel_parse_expr (recsel_expr_t *selector, const char *expression) return my_error (GPG_ERR_NO_NAME); } - trim_spaces (se->name + (s - expr)); + if (!notrim) + trim_spaces (se->name + (s - expr)); se->value = se->name + (s - expr); if (!se->value[0] && !(se->op == SELECT_NONEMPTY || se->op == SELECT_ISTRUE)) { |