mirror of
git://git.gnupg.org/gnupg.git
synced 2025-07-02 22:46:30 +02:00
wks: Add framework for policy flags.
* tools/call-dirmngr.c (wkd_get_policy_flags): New. * tools/gpg-wks.h (struct policy_flags_s, policy_flags_t): New. * tools/wks-util.c (wks_parse_policy): New. * tools/gpg-wks-client.c (command_send): Get the policy flags to show a new info line. * tools/gpg-wks-server.c (get_policy_flags): New. (process_new_key): get policy flag and add a stub for "auth-submit". (command_list_domains): Check policy flags. Signed-off-by: Werner Koch <wk@gnupg.org>
This commit is contained in:
parent
505ee45106
commit
46362cbc0e
6 changed files with 310 additions and 11 deletions
108
tools/wks-util.c
108
tools/wks-util.c
|
@ -63,3 +63,111 @@ wks_send_mime (mime_maker_t mime)
|
|||
es_fclose (mail);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
/* Parse the policy flags by reading them from STREAM and storing them
|
||||
* into FLAGS. If IGNORE_UNKNOWN is iset unknown keywords are
|
||||
* ignored. */
|
||||
gpg_error_t
|
||||
wks_parse_policy (policy_flags_t flags, estream_t stream, int ignore_unknown)
|
||||
{
|
||||
enum tokens {
|
||||
TOK_MAILBOX_ONLY,
|
||||
TOK_DANE_ONLY,
|
||||
TOK_AUTH_SUBMIT,
|
||||
TOK_MAX_PENDING
|
||||
};
|
||||
static struct {
|
||||
const char *name;
|
||||
enum tokens token;
|
||||
} keywords[] = {
|
||||
{ "mailbox-only", TOK_MAILBOX_ONLY },
|
||||
{ "dane-only", TOK_DANE_ONLY },
|
||||
{ "auth-submit", TOK_AUTH_SUBMIT },
|
||||
{ "max-pending", TOK_MAX_PENDING }
|
||||
};
|
||||
gpg_error_t err = 0;
|
||||
int lnr = 0;
|
||||
char line[1024];
|
||||
char *p, *keyword, *value;
|
||||
int i, n;
|
||||
|
||||
memset (flags, 0, sizeof *flags);
|
||||
|
||||
while (es_fgets (line, DIM(line)-1, stream) )
|
||||
{
|
||||
lnr++;
|
||||
n = strlen (line);
|
||||
if (!n || line[n-1] != '\n')
|
||||
{
|
||||
err = gpg_error (*line? GPG_ERR_LINE_TOO_LONG
|
||||
: GPG_ERR_INCOMPLETE_LINE);
|
||||
break;
|
||||
}
|
||||
trim_trailing_spaces (line);
|
||||
/* Skip empty and comment lines. */
|
||||
for (p=line; spacep (p); p++)
|
||||
;
|
||||
if (!*p || *p == '#')
|
||||
continue;
|
||||
|
||||
if (*p == ':')
|
||||
{
|
||||
err = gpg_error (GPG_ERR_SYNTAX);
|
||||
break;
|
||||
}
|
||||
|
||||
keyword = p;
|
||||
value = NULL;
|
||||
if ((p = strchr (p, ':')))
|
||||
{
|
||||
/* Colon found: Keyword with value. */
|
||||
*p++ = 0;
|
||||
for (; spacep (p); p++)
|
||||
;
|
||||
if (!*p)
|
||||
{
|
||||
err = gpg_error (GPG_ERR_MISSING_VALUE);
|
||||
break;
|
||||
}
|
||||
value = p;
|
||||
}
|
||||
|
||||
for (i=0; i < DIM (keywords); i++)
|
||||
if (!ascii_strcasecmp (keywords[i].name, keyword))
|
||||
break;
|
||||
if (!(i < DIM (keywords)))
|
||||
{
|
||||
if (ignore_unknown)
|
||||
continue;
|
||||
err = gpg_error (GPG_ERR_INV_NAME);
|
||||
break;
|
||||
}
|
||||
|
||||
switch (keywords[i].token)
|
||||
{
|
||||
case TOK_MAILBOX_ONLY: flags->mailbox_only = 1; break;
|
||||
case TOK_DANE_ONLY: flags->dane_only = 1; break;
|
||||
case TOK_AUTH_SUBMIT: flags->auth_submit = 1; break;
|
||||
case TOK_MAX_PENDING:
|
||||
if (!value)
|
||||
{
|
||||
err = gpg_error (GPG_ERR_SYNTAX);
|
||||
goto leave;
|
||||
}
|
||||
/* FIXME: Define whether these are seconds, hours, or days
|
||||
* and decide whether to allow other units. */
|
||||
flags->max_pending = atoi (value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!err && !es_feof (stream))
|
||||
err = gpg_error_from_syserror ();
|
||||
leave:
|
||||
if (err)
|
||||
log_error ("error reading '%s', line %d: %s\n",
|
||||
es_fname_get (stream), lnr, gpg_strerror (err));
|
||||
|
||||
return err;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue