diff options
Diffstat (limited to 'sm/call-dirmngr.c')
-rw-r--r-- | sm/call-dirmngr.c | 52 |
1 files changed, 36 insertions, 16 deletions
diff --git a/sm/call-dirmngr.c b/sm/call-dirmngr.c index 4c764ea2c..d9083c9c9 100644 --- a/sm/call-dirmngr.c +++ b/sm/call-dirmngr.c @@ -757,20 +757,24 @@ lookup_status_cb (void *opaque, const char *line) /* Run the Directory Manager's lookup command using the pattern - compiled from the strings given in NAMES. The caller must provide - the callback CB which will be passed cert by cert. Note that CTRL - is optional. With CACHE_ONLY the dirmngr will search only its own - key cache. */ + compiled from the strings given in NAMES or from URI. The caller + must provide the callback CB which will be passed cert by cert. + Note that CTRL is optional. With CACHE_ONLY the dirmngr will + search only its own key cache. */ int -gpgsm_dirmngr_lookup (ctrl_t ctrl, strlist_t names, int cache_only, +gpgsm_dirmngr_lookup (ctrl_t ctrl, strlist_t names, const char *uri, + int cache_only, void (*cb)(void*, ksba_cert_t), void *cb_value) { int rc; - char *pattern; char line[ASSUAN_LINELENGTH]; struct lookup_parm_s parm; size_t len; assuan_context_t ctx; + const char *s; + + if ((names && uri) || (!names && !uri)) + return gpg_error (GPG_ERR_INV_ARG); /* The lookup function can be invoked from the callback of a lookup function, for example to walk the chain. */ @@ -793,19 +797,35 @@ gpgsm_dirmngr_lookup (ctrl_t ctrl, strlist_t names, int cache_only, log_fatal ("both dirmngr contexts are in use\n"); } - pattern = pattern_from_strlist (names); - if (!pattern) + if (names) { - if (ctx == dirmngr_ctx) - release_dirmngr (ctrl); - else - release_dirmngr2 (ctrl); + char *pattern = pattern_from_strlist (names); + if (!pattern) + { + if (ctx == dirmngr_ctx) + release_dirmngr (ctrl); + else + release_dirmngr2 (ctrl); - return out_of_core (); + return out_of_core (); + } + snprintf (line, DIM(line), "LOOKUP%s %s", + cache_only? " --cache-only":"", pattern); + xfree (pattern); + } + else + { + for (s=uri; *s; s++) + if (*s <= ' ') + { + if (ctx == dirmngr_ctx) + release_dirmngr (ctrl); + else + release_dirmngr2 (ctrl); + return gpg_error (GPG_ERR_INV_URI); + } + snprintf (line, DIM(line), "LOOKUP --url %s", uri); } - snprintf (line, DIM(line), "LOOKUP%s %s", - cache_only? " --cache-only":"", pattern); - xfree (pattern); parm.ctrl = ctrl; parm.ctx = ctx; |