mirror of
git://git.gnupg.org/gnupg.git
synced 2025-07-03 22:56:33 +02:00
common: Prepare for parsing mail sub-addresses.
* common/mbox-util.c (mailbox_from_userid): Add arg subaddress and implement. Change all callers to pass false for it. * common/t-mbox-util.c (run_mbox_no_sub_test): New. (run_filter): Add arg no_sub. (main): Call new test and add option --no-sub. -- Some stats: In the about 5300000 keys on the SKS servers we found 3055 unique mailboxes with a '+' in it. After removing leading and trailing '+' as well as multiple '+' (e.g. "c++" or "foo+bar+baz") 2697 were left which seem to be valid sub-addresses. To filter mailboxes out from a line delimited list with user-ids (e.g. an SQL output), the command t-mbox-util --verbose --filter can be used; to output w/o sub-addresses add --no-sub. GnuPG-bug-id: 4200 Signed-off-by: Werner Koch <wk@gnupg.org>
This commit is contained in:
parent
bbed4746ed
commit
6b9f772914
16 changed files with 139 additions and 27 deletions
|
@ -173,11 +173,12 @@ is_valid_mailbox (const char *name)
|
|||
|
||||
|
||||
/* Return the mailbox (local-part@domain) form a standard user id.
|
||||
All plain ASCII characters in the result are converted to
|
||||
lowercase. Caller must free the result. Returns NULL if no valid
|
||||
mailbox was found (or we are out of memory). */
|
||||
* All plain ASCII characters in the result are converted to
|
||||
* lowercase. If SUBADDRESS is 1, '+' denoted sub-addresses are not
|
||||
* included in the result. Caller must free the result. Returns NULL
|
||||
* if no valid mailbox was found (or we are out of memory). */
|
||||
char *
|
||||
mailbox_from_userid (const char *userid)
|
||||
mailbox_from_userid (const char *userid, int subaddress)
|
||||
{
|
||||
const char *s, *s_end;
|
||||
size_t len;
|
||||
|
@ -226,6 +227,29 @@ mailbox_from_userid (const char *userid)
|
|||
else
|
||||
errno = EINVAL;
|
||||
|
||||
if (result && subaddress == 1)
|
||||
{
|
||||
char *atsign, *plus;
|
||||
|
||||
if ((atsign = strchr (result, '@')))
|
||||
{
|
||||
/* We consider a subaddress only if there is a single '+'
|
||||
* in the local part and the '+' is not the first or last
|
||||
* character. */
|
||||
*atsign = 0;
|
||||
if ((plus = strchr (result, '+'))
|
||||
&& !strchr (plus+1, '+')
|
||||
&& result != plus
|
||||
&& plus[1] )
|
||||
{
|
||||
*atsign = '@';
|
||||
memmove (plus, atsign, strlen (atsign)+1);
|
||||
}
|
||||
else
|
||||
*atsign = '@';
|
||||
}
|
||||
}
|
||||
|
||||
return result? ascii_strlwr (result): NULL;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue