mirror of
git://git.gnupg.org/gnupg.git
synced 2024-06-11 23:59:50 +02:00
scd: New option --application-priority.
* scd/scdaemon.c (oApplicationPriority): New. (opts): Add "application_priority". (main): Process option. * scd/app.c (app_update_priority_list): New. (get_supported_applications): Take apps from global list. * tools/gpgconf-comp.c (gc_options_scdaemon): Add option. Signed-off-by: Werner Koch <wk@gnupg.org>
This commit is contained in:
parent
80c069b5e1
commit
97feef8ee9
|
@ -332,6 +332,21 @@ This option disables the use of the card application named
|
||||||
@var{name}. This is mainly useful for debugging or if a application
|
@var{name}. This is mainly useful for debugging or if a application
|
||||||
with lower priority should be used by default.
|
with lower priority should be used by default.
|
||||||
|
|
||||||
|
@item --application-priority @var{namelist}
|
||||||
|
@opindex application-priority
|
||||||
|
This option allows to change the order in which applications of a card
|
||||||
|
a tried if no specific application was requested. @var{namelist} is a
|
||||||
|
space or comma delimited list of application names. Unknown names are
|
||||||
|
simply skipped. Applications not mentioned in the list are put in the
|
||||||
|
former order at the end of the new priority list.
|
||||||
|
|
||||||
|
To get the list of current active applications, use
|
||||||
|
@cartouche
|
||||||
|
@smallexample
|
||||||
|
gpg-connect-agent 'scd getinfo app_list' /bye
|
||||||
|
@end smallexample
|
||||||
|
@end cartouche
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
All the long options may also be given in the configuration file after
|
All the long options may also be given in the configuration file after
|
||||||
|
@ -767,4 +782,3 @@ length up to N bytes. If N is not given a default value is used
|
||||||
@command{gpg2}(1)
|
@command{gpg2}(1)
|
||||||
@end ifset
|
@end ifset
|
||||||
@include see-also-note.texi
|
@include see-also-note.texi
|
||||||
|
|
||||||
|
|
|
@ -133,6 +133,7 @@ size_t app_help_read_length_of_cert (int slot, int fid, size_t *r_certoff);
|
||||||
|
|
||||||
|
|
||||||
/*-- app.c --*/
|
/*-- app.c --*/
|
||||||
|
void app_update_priority_list (const char *arg);
|
||||||
void app_send_card_list (ctrl_t ctrl);
|
void app_send_card_list (ctrl_t ctrl);
|
||||||
char *app_get_serialno (app_t app);
|
char *app_get_serialno (app_t app);
|
||||||
|
|
||||||
|
|
76
scd/app.c
76
scd/app.c
|
@ -59,6 +59,59 @@ static struct app_priority_list_s app_priority_list[] =
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Initialization function to change the default app_priority_list.
|
||||||
|
* LIST is a list of comma or space separated strings with application
|
||||||
|
* names. Unknown names will only result in warning message.
|
||||||
|
* Application not mentioned in LIST are used in their original order
|
||||||
|
* after the given once. */
|
||||||
|
void
|
||||||
|
app_update_priority_list (const char *arg)
|
||||||
|
{
|
||||||
|
struct app_priority_list_s save;
|
||||||
|
char **names;
|
||||||
|
int i, j, idx;
|
||||||
|
|
||||||
|
names = strtokenize (arg, ", ");
|
||||||
|
if (!names)
|
||||||
|
log_fatal ("strtokenize failed: %s\n",
|
||||||
|
gpg_strerror (gpg_error_from_syserror ()));
|
||||||
|
|
||||||
|
idx = 0;
|
||||||
|
for (i=0; names[i]; i++)
|
||||||
|
{
|
||||||
|
ascii_strlwr (names[i]);
|
||||||
|
for (j=0; j < i; j++)
|
||||||
|
if (!strcmp (names[j], names[i]))
|
||||||
|
break;
|
||||||
|
if (j < i)
|
||||||
|
{
|
||||||
|
log_info ("warning: duplicate application '%s' in priority list\n",
|
||||||
|
names[i]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (j=idx; app_priority_list[j].name; j++)
|
||||||
|
if (!strcmp (names[i], app_priority_list[j].name))
|
||||||
|
break;
|
||||||
|
if (!app_priority_list[j].name)
|
||||||
|
{
|
||||||
|
log_info ("warning: unknown application '%s' in priority list\n",
|
||||||
|
names[i]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
save = app_priority_list[idx];
|
||||||
|
app_priority_list[idx] = app_priority_list[j];
|
||||||
|
app_priority_list[j] = save;
|
||||||
|
idx++;
|
||||||
|
}
|
||||||
|
log_assert (idx < DIM (app_priority_list));
|
||||||
|
|
||||||
|
xfree (names);
|
||||||
|
for (i=0; app_priority_list[i].name; i++)
|
||||||
|
log_info ("app priority %d: %s\n", i, app_priority_list[i].name);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_progress_line (void *opaque, const char *what, int pc, int cur, int tot)
|
print_progress_line (void *opaque, const char *what, int pc, int cur, int tot)
|
||||||
{
|
{
|
||||||
|
@ -511,32 +564,21 @@ select_application (ctrl_t ctrl, const char *name, app_t *r_app,
|
||||||
char *
|
char *
|
||||||
get_supported_applications (void)
|
get_supported_applications (void)
|
||||||
{
|
{
|
||||||
const char *list[] = {
|
|
||||||
"openpgp",
|
|
||||||
"piv",
|
|
||||||
"nks",
|
|
||||||
"p15",
|
|
||||||
"geldkarte",
|
|
||||||
"dinsig",
|
|
||||||
"sc-hsm",
|
|
||||||
/* Note: "undefined" is not listed here because it needs special
|
|
||||||
treatment by the client. */
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
int idx;
|
int idx;
|
||||||
size_t nbytes;
|
size_t nbytes;
|
||||||
char *buffer, *p;
|
char *buffer, *p;
|
||||||
|
const char *s;
|
||||||
|
|
||||||
for (nbytes=1, idx=0; list[idx]; idx++)
|
for (nbytes=1, idx=0; (s=app_priority_list[idx].name); idx++)
|
||||||
nbytes += strlen (list[idx]) + 1 + 1;
|
nbytes += strlen (s) + 1 + 1;
|
||||||
|
|
||||||
buffer = xtrymalloc (nbytes);
|
buffer = xtrymalloc (nbytes);
|
||||||
if (!buffer)
|
if (!buffer)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
for (p=buffer, idx=0; list[idx]; idx++)
|
for (p=buffer, idx=0; (s=app_priority_list[idx].name); idx++)
|
||||||
if (is_app_allowed (list[idx]))
|
if (is_app_allowed (s))
|
||||||
p = stpcpy (stpcpy (p, list[idx]), ":\n");
|
p = stpcpy (stpcpy (p, s), ":\n");
|
||||||
*p = 0;
|
*p = 0;
|
||||||
|
|
||||||
return buffer;
|
return buffer;
|
||||||
|
|
|
@ -98,6 +98,7 @@ enum cmd_and_opt_values
|
||||||
oAllowAdmin,
|
oAllowAdmin,
|
||||||
oDenyAdmin,
|
oDenyAdmin,
|
||||||
oDisableApplication,
|
oDisableApplication,
|
||||||
|
oApplicationPriority,
|
||||||
oEnablePinpadVarlen,
|
oEnablePinpadVarlen,
|
||||||
oListenBacklog
|
oListenBacklog
|
||||||
};
|
};
|
||||||
|
@ -154,6 +155,8 @@ static ARGPARSE_OPTS opts[] = {
|
||||||
ARGPARSE_s_n (oDenyAdmin, "deny-admin",
|
ARGPARSE_s_n (oDenyAdmin, "deny-admin",
|
||||||
N_("deny the use of admin card commands")),
|
N_("deny the use of admin card commands")),
|
||||||
ARGPARSE_s_s (oDisableApplication, "disable-application", "@"),
|
ARGPARSE_s_s (oDisableApplication, "disable-application", "@"),
|
||||||
|
ARGPARSE_s_s (oApplicationPriority, "application-priority",
|
||||||
|
N_("|LIST|Change the application priority to LIST")),
|
||||||
ARGPARSE_s_n (oEnablePinpadVarlen, "enable-pinpad-varlen",
|
ARGPARSE_s_n (oEnablePinpadVarlen, "enable-pinpad-varlen",
|
||||||
N_("use variable length input for pinpad")),
|
N_("use variable length input for pinpad")),
|
||||||
ARGPARSE_s_s (oHomedir, "homedir", "@"),
|
ARGPARSE_s_s (oHomedir, "homedir", "@"),
|
||||||
|
@ -436,6 +439,7 @@ main (int argc, char **argv )
|
||||||
struct assuan_malloc_hooks malloc_hooks;
|
struct assuan_malloc_hooks malloc_hooks;
|
||||||
int res;
|
int res;
|
||||||
npth_t pipecon_handler;
|
npth_t pipecon_handler;
|
||||||
|
const char *application_priority = NULL;
|
||||||
|
|
||||||
early_system_init ();
|
early_system_init ();
|
||||||
set_strusage (my_strusage);
|
set_strusage (my_strusage);
|
||||||
|
@ -616,6 +620,10 @@ main (int argc, char **argv )
|
||||||
add_to_strlist (&opt.disabled_applications, pargs.r.ret_str);
|
add_to_strlist (&opt.disabled_applications, pargs.r.ret_str);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case oApplicationPriority:
|
||||||
|
application_priority = pargs.r.ret_str;
|
||||||
|
break;
|
||||||
|
|
||||||
case oEnablePinpadVarlen: opt.enable_pinpad_varlen = 1; break;
|
case oEnablePinpadVarlen: opt.enable_pinpad_varlen = 1; break;
|
||||||
|
|
||||||
case oListenBacklog:
|
case oListenBacklog:
|
||||||
|
@ -720,6 +728,7 @@ main (int argc, char **argv )
|
||||||
es_printf ("disable-pinpad:%lu:\n", GC_OPT_FLAG_NONE );
|
es_printf ("disable-pinpad:%lu:\n", GC_OPT_FLAG_NONE );
|
||||||
es_printf ("card-timeout:%lu:%d:\n", GC_OPT_FLAG_DEFAULT, 0);
|
es_printf ("card-timeout:%lu:%d:\n", GC_OPT_FLAG_DEFAULT, 0);
|
||||||
es_printf ("enable-pinpad-varlen:%lu:\n", GC_OPT_FLAG_NONE );
|
es_printf ("enable-pinpad-varlen:%lu:\n", GC_OPT_FLAG_NONE );
|
||||||
|
es_printf ("application-priority:%lu:\n", GC_OPT_FLAG_NONE );
|
||||||
|
|
||||||
scd_exit (0);
|
scd_exit (0);
|
||||||
}
|
}
|
||||||
|
@ -739,6 +748,9 @@ main (int argc, char **argv )
|
||||||
log_debug ("... okay\n");
|
log_debug ("... okay\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (application_priority)
|
||||||
|
app_update_priority_list (application_priority);
|
||||||
|
|
||||||
if (pipe_server)
|
if (pipe_server)
|
||||||
{
|
{
|
||||||
/* This is the simple pipe based server */
|
/* This is the simple pipe based server */
|
||||||
|
|
|
@ -653,6 +653,10 @@ static gc_option_t gc_options_scdaemon[] =
|
||||||
{ "card-timeout", GC_OPT_FLAG_NONE|GC_OPT_FLAG_RUNTIME, GC_LEVEL_BASIC,
|
{ "card-timeout", GC_OPT_FLAG_NONE|GC_OPT_FLAG_RUNTIME, GC_LEVEL_BASIC,
|
||||||
"gnupg", "|N|disconnect the card after N seconds of inactivity",
|
"gnupg", "|N|disconnect the card after N seconds of inactivity",
|
||||||
GC_ARG_TYPE_UINT32, GC_BACKEND_SCDAEMON },
|
GC_ARG_TYPE_UINT32, GC_BACKEND_SCDAEMON },
|
||||||
|
{ "application-priority",
|
||||||
|
GC_OPT_FLAG_NONE|GC_OPT_FLAG_RUNTIME, GC_LEVEL_ADVANCED,
|
||||||
|
"gnupg", "|LIST|Change the application priority to LIST",
|
||||||
|
GC_ARG_TYPE_STRING, GC_BACKEND_SCDAEMON },
|
||||||
|
|
||||||
{ "Debug",
|
{ "Debug",
|
||||||
GC_OPT_FLAG_GROUP, GC_LEVEL_ADVANCED,
|
GC_OPT_FLAG_GROUP, GC_LEVEL_ADVANCED,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user