diff options
Diffstat (limited to 'sm')
-rw-r--r-- | sm/call-dirmngr.c | 14 | ||||
-rw-r--r-- | sm/gpgsm.c | 145 | ||||
-rw-r--r-- | sm/gpgsm.h | 15 |
3 files changed, 10 insertions, 164 deletions
diff --git a/sm/call-dirmngr.c b/sm/call-dirmngr.c index 8222d999c..709f31720 100644 --- a/sm/call-dirmngr.c +++ b/sm/call-dirmngr.c @@ -167,7 +167,7 @@ warn_version_mismatch (ctrl_t ctrl, assuan_context_t ctx, static void prepare_dirmngr (ctrl_t ctrl, assuan_context_t ctx, gpg_error_t err) { - struct keyserver_spec *server; + strlist_t server; if (!err) err = warn_version_mismatch (ctrl, ctx, DIRMNGR_NAME, 0); @@ -188,13 +188,13 @@ prepare_dirmngr (ctrl_t ctrl, assuan_context_t ctx, gpg_error_t err) while (server) { char line[ASSUAN_LINELENGTH]; - char *user = server->user ? server->user : ""; - char *pass = server->pass ? server->pass : ""; - char *base = server->base ? server->base : ""; - snprintf (line, DIM (line), "LDAPSERVER %s:%i:%s:%s:%s:%s", - server->host, server->port, user, pass, base, - server->use_ldaps? "ldaps":""); + /* If the host is "ldap" we prefix the entire line with "ldap:" + * to avoid an ambiguity on the server due to the introduction + * of this optional prefix. */ + snprintf (line, DIM (line), "LDAPSERVER %s%s", + !strncmp (server->d, "ldap:", 5)? "ldap:":"", + server->d); assuan_transact (ctx, line, NULL, NULL, NULL, NULL, NULL, NULL); /* The code below is not required because we don't return an error. */ diff --git a/sm/gpgsm.c b/sm/gpgsm.c index 3c6fe9c76..940d65fec 100644 --- a/sm/gpgsm.c +++ b/sm/gpgsm.c @@ -840,133 +840,6 @@ parse_validation_model (const char *model) } -/* Release the list of SERVERS. As usual it is okay to call this - function with SERVERS passed as NULL. */ -void -keyserver_list_free (struct keyserver_spec *servers) -{ - while (servers) - { - struct keyserver_spec *tmp = servers->next; - xfree (servers->host); - xfree (servers->user); - if (servers->pass) - memset (servers->pass, 0, strlen (servers->pass)); - xfree (servers->pass); - xfree (servers->base); - xfree (servers); - servers = tmp; - } -} - -/* See also dirmngr ldapserver_parse_one(). */ -struct keyserver_spec * -parse_keyserver_line (char *line, - const char *filename, unsigned int lineno) -{ - char *p; - char *endp; - const char *s; - struct keyserver_spec *server; - int fieldno; - int fail = 0; - int i; - - if (!filename) - { - filename = "[cmd]"; - lineno = 0; - } - - /* Parse the colon separated fields. */ - server = xcalloc (1, sizeof *server); - for (fieldno = 1, p = line; p; p = endp, fieldno++ ) - { - endp = strchr (p, ':'); - if (endp) - *endp++ = '\0'; - trim_spaces (p); - switch (fieldno) - { - case 1: - if (*p) - server->host = xstrdup (p); - else - { - log_error (_("%s:%u: no hostname given\n"), - filename, lineno); - fail = 1; - } - break; - - case 2: - if (*p) - server->port = atoi (p); - break; - - case 3: - if (*p) - server->user = xstrdup (p); - break; - - case 4: - if (*p && !server->user) - { - log_error (_("%s:%u: password given without user\n"), - filename, lineno); - fail = 1; - } - else if (*p) - server->pass = xstrdup (p); - break; - - case 5: - if (*p) - server->base = xstrdup (p); - break; - - case 6: - { - char **flags = NULL; - - flags = strtokenize (p, ","); - if (!flags) - log_fatal ("strtokenize failed: %s\n", - gpg_strerror (gpg_error_from_syserror ())); - - for (i=0; (s = flags[i]); i++) - { - if (!*s) - ; - else if (!ascii_strcasecmp (s, "ldaps")) - server->use_ldaps = 1; - else if (!ascii_strcasecmp (s, "ldap")) - server->use_ldaps = 0; - else - log_info (_("%s:%u: ignoring unknown flag '%s'\n"), - filename, lineno, s); - } - - xfree (flags); - } - break; - - default: - /* (We silently ignore extra fields.) */ - break; - } - } - - if (fail) - { - log_info (_("%s:%u: skipping this line\n"), filename, lineno); - keyserver_list_free (server); - server = NULL; - } - - return server; -} - int main ( int argc, char **argv) @@ -1541,21 +1414,7 @@ main ( int argc, char **argv) case oValidationModel: parse_validation_model (pargs.r.ret_str); break; case oKeyServer: - { - struct keyserver_spec *keyserver; - keyserver = parse_keyserver_line (pargs.r.ret_str, - configname, pargs.lineno); - if (! keyserver) - log_error (_("could not parse keyserver\n")); - else - { - /* FIXME: Keep last next pointer. */ - struct keyserver_spec **next_p = &opt.keyserver; - while (*next_p) - next_p = &(*next_p)->next; - *next_p = keyserver; - } - } + append_to_strlist (&opt.keyserver, pargs.r.ret_str); break; case oIgnoreCertExtension: @@ -2285,7 +2144,7 @@ main ( int argc, char **argv) /* cleanup */ gpgsm_deinit_default_ctrl (&ctrl); - keyserver_list_free (opt.keyserver); + free_strlist (opt.keyserver); opt.keyserver = NULL; gpgsm_release_certlist (recplist); gpgsm_release_certlist (signerlist); diff --git a/sm/gpgsm.h b/sm/gpgsm.h index 7c27c586e..acf8caeed 100644 --- a/sm/gpgsm.h +++ b/sm/gpgsm.h @@ -45,19 +45,6 @@ #define MAX_DIGEST_LEN 64 /* Fits for SHA-512 */ -struct keyserver_spec -{ - struct keyserver_spec *next; - - char *host; - int port; - char *user; - char *pass; - char *base; - unsigned int use_ldaps:1; -}; - - /* A large struct named "opt" to keep global flags. */ EXTERN_UNLESS_MAIN_MODULE struct @@ -155,7 +142,7 @@ struct the integrity of the software at runtime. */ - struct keyserver_spec *keyserver; + strlist_t keyserver; /* A list of certificate extension OIDs which are ignored so that one can claim that a critical extension has been handled. One |