1
0
mirror of git://git.gnupg.org/gnupg.git synced 2025-06-11 18:01:03 +02:00

wks: Use templates for the server responses.

* common/helpfile.c (gnupg_get_template): Add arg locale_override and
adjust all callers.
* tools/wks-receive.c (struct receive_ctx_s): Add field ct_language.
(get_language): New.
(new_part): Call it.
(wks_receive): Pass language to the result callback.
* tools/gpg-wks-client.c (short_locale): New.
(main): Get and store the current locale.
(command_create): Fix a glitch for the Posteo hack.  Insert the locale
into the confirmation request.
(send_confirmation_response): Ditto.
* tools/gpg-wks-server.c (struct server_ctx_s): Add field language.
(only_ascii): New.
(struct my_subst_vars_s, my_subst_vars_cb, my_subst_vars): New.
(send_confirmation_request): Use a template.
(send_congratulation_message): Ditto.
(check_and_publish): Pss ctx to send_congratulation_message.
(command_receive_cb): Add arg language.

* doc/wks-utils.txt, doc/wks-utils.de.txt: New.
* doc/Makefile.am (helpfiles): Add them.
--

GnuPG-bug-id: 7381

Note that the subject is not yet translated or templated due to a
missing header encoding function.
This commit is contained in:
Werner Koch 2025-06-02 12:42:59 +02:00
parent 982f45c8c7
commit e6463d7fe0
No known key found for this signature in database
GPG Key ID: E3FDFF218E45B72B
12 changed files with 410 additions and 79 deletions

View File

@ -234,21 +234,25 @@ findkey_locale (const char *domain, const char *key, const char *locname,
intervening lines (except for comment lines) lead to the same help
text. Lines following the key lines make up the actual template texts.
*/
char *
gnupg_get_template (const char *domain, const char *key, unsigned int flags)
gnupg_get_template (const char *domain, const char *key, unsigned int flags,
const char *override_locale)
{
static const char *locname;
static const char *locname_buffer;
const char *locname;
char *result;
if (!locname)
if (override_locale && *override_locale)
locname = override_locale;
else if (!locname_buffer)
{
char *buffer, *p;
int count = 0;
const char *s = gnupg_messages_locale_name ();
buffer = xtrystrdup (s);
if (!buffer)
locname = "";
locname_buffer = "";
else
{
for (p = buffer; *p; p++)
@ -259,9 +263,12 @@ gnupg_get_template (const char *domain, const char *key, unsigned int flags)
if (count++)
*p = 0; /* Also cut at an underscore in the territory. */
}
locname = buffer;
locname_buffer = buffer;
}
locname = locname_buffer;
}
else
locname = locname_buffer;
if (!key || !*key)
return NULL;
@ -293,5 +300,6 @@ char *
gnupg_get_help_string (const char *key, int only_current)
{
return gnupg_get_template ("help", key,
only_current? GET_TEMPLATE_CURRENT_LOCALE : 0);
only_current? GET_TEMPLATE_CURRENT_LOCALE : 0,
NULL);
}

View File

@ -66,7 +66,7 @@ main (int argc, char **argv)
}
result = gnupg_get_template (argv[0], argv[1], flags);
result = gnupg_get_template (argv[0], argv[1], flags, NULL);
if (!result)
{
fprintf (stderr,

View File

@ -303,7 +303,7 @@ void gnupg_rl_initialize (void);
#define GET_TEMPLATE_CRLF 4 /* Use CR+LF. */
char *gnupg_get_template (const char *domain, const char *key,
unsigned int flags);
unsigned int flags, const char *override_locale);
char *gnupg_get_help_string (const char *key, int only_current_locale);
/*-- localename.c --*/

View File

@ -34,7 +34,8 @@ helpfiles = help.txt help.be.txt help.ca.txt help.cs.txt \
help.ja.txt help.nb.txt help.pl.txt help.pt.txt \
help.pt_BR.txt help.ro.txt help.ru.txt help.sk.txt \
help.sv.txt help.tr.txt help.zh_CN.txt help.zh_TW.txt \
mail-tube.txt mail-tube.de.txt
mail-tube.txt mail-tube.de.txt \
wks-utils.txt wks-utils.de.txt
EXTRA_DIST = samplekeys.asc mksamplekeys com-certs.pem \
gnupg-logo.pdf gnupg-logo.png gnupg-logo-tr.png \

73
doc/wks-utils.de.txt Normal file
View File

@ -0,0 +1,73 @@
# wks-utils.txt - gpg-wks-server/-client strings (de) -*- default-generic -*-
# Written in 2025 by g10 Code GmbH
#
# To the extent possible under law, the author(s) have dedicated all
# copyright and related and neighboring rights to this text to the
# public domain worldwide. This text is distributed without any
# warranty. You should have received a copy of the CC0 Public Domain
# Dedication along with this software. If not, see
# <https://creativecommons.org/publicdomain/zero/1.0/>.
# SPDX-License-Identifier: CC0-1.0
#
# Note that this template file needs to be UTF-8 encoded. When looking
# for a template item, GnuPG scans the help files in the following order
# (assuming a standard Unix layout):
#
# /etc/gnupg/TEMPLATE.LL_TT.txt
# /etc/gnupg/TEMPLATE.LL.txt
# /etc/gnupg/TEMPLATE.txt
# /usr/share/gnupg/TEMPLATE.LL_TT.txt
# /usr/share/gnupg/TEMPLATE.LL.txt
# /usr/share/gnupg/TEMPLATE.txt
#
# Here TEMPLATE denotes the name of the template (e.g. "mail-tube"),
# LL_TT denotes the full name of the current locale with the territory
# (.e.g. "de_DE"), LL denotes just the locale name (e.g. "de"). The
# first matching item is returned. To put a dot or a hash mark at the
# beginning of a text line, it needs to be prefixed with a dot and a
# space. A single dot may be used to terminated an entry. Depending
# on the template type certain variables (${NAME}) are expanded.
# Check the man page of the respective tool.
.server.confirm.body
Diese Nachricht wurde auf Ihre Anforderung gesendet, Ihren Schlüssel
zu veröffentlichen. Falls Sie solch eine Anforderung nicht gesendet
haben, so ignorieren Sie bitte diese Nachricht.
[English: This message has been send to confirm your request
to publish your key. If you did not request a key
publication, simply ignore this message.]
Viele Mail Software ist in der Lage diese Art von Nachrichten
automatisch zu verarbeiten. In diesem Fall sollten Sie diesen Text
auch nicht sehen. Falls doch so ist Ihre Mailsoftware veraltet und
kann mit dieser Nachricht nichts anfangen. Unter
https://gnupg.org/faq/wkd.html
finden Sie eine Erklärung, wie Sie solche Nachrichten anderweitig
verarbeiten können.
${sigdelim}
Weitere Informationen zu GnuPG finden Sie hier: https://gnupg.org
.
.server.publish.congrats
Hallo!
Der Schlüssel für Ihre Mailadresse '${address}' wurde soeben vom
Web Key Directory akzeptiert. Je nach Konfiguration Ihres Providers kann
es bis zu 15 Minuten dauern, bis er öffentlich sichtbar wird.
Viele Grüße von Ihrem
Schlüsselveröffentlichungsdienst
${sigdelim}
Weitere Informationen zu GnuPG finden Sie hier: https://gnupg.org
.

71
doc/wks-utils.txt Normal file
View File

@ -0,0 +1,71 @@
# wks-utils.txt - gpg-wks-server/-client strings (en) -*- default-generic -*-
# Written in 2025 by g10 Code GmbH
#
# To the extent possible under law, the author(s) have dedicated all
# copyright and related and neighboring rights to this text to the
# public domain worldwide. This text is distributed without any
# warranty. You should have received a copy of the CC0 Public Domain
# Dedication along with this software. If not, see
# <https://creativecommons.org/publicdomain/zero/1.0/>.
# SPDX-License-Identifier: CC0-1.0
#
# Note that this template file needs to be UTF-8 encoded. When looking
# for a template item, GnuPG scans the help files in the following order
# (assuming a standard Unix layout):
#
# /etc/gnupg/TEMPLATE.LL_TT.txt
# /etc/gnupg/TEMPLATE.LL.txt
# /etc/gnupg/TEMPLATE.txt
# /usr/share/gnupg/TEMPLATE.LL_TT.txt
# /usr/share/gnupg/TEMPLATE.LL.txt
# /usr/share/gnupg/TEMPLATE.txt
#
# Here TEMPLATE denotes the name of the template (e.g. "mail-tube"),
# LL_TT denotes the full name of the current locale with the territory
# (.e.g. "de_DE"), LL denotes just the locale name (e.g. "de"). The
# first matching item is returned. To put a dot or a hash mark at the
# beginning of a text line, it needs to be prefixed with a dot and a
# space. A single dot may be used to terminated an entry. Depending
# on the template type certain variables (${NAME}) are expanded.
# Check the man page of the respective tool.
.server.confirm.body
This message has been send to confirm your request
to publish your key. If you did not request a key
publication, simply ignore this message.
Most mail software can handle this kind of message
automatically and thus you would not have seen this
message. It seems that your client does not fully
support this service. The web page
https://gnupg.org/faq/wkd.html
explains how you can process this message anyway in
a few manual steps.
${sigdelim}
For information on GnuPG see: https://gnupg.org
.
.server.publish.congrats
Hello!
The key for your address '${address}' has been published
and can now be retrieved from the Web Key Directory.
For more information on this system see:
https://gnupg.org/faq/wkd.html
Best regards
GnuPG Key Publisher
${sigdelim}
For information on GnuPG see: https://gnupg.org
.

View File

@ -358,6 +358,15 @@ use option @option{-q}.
The command @option{--revoke-key} is not yet functional.
This tool needs to insert strings into the mails which can be
configured using a plain text file. The installed default files for
English (@file{wks-utils.txt}) and German (@file{wks-utils.de.txt})
can be copied to the system configuration directory and changed to
local needs. Environment variables in these texts are expanded, the
variable ``sigdelim'' is replaced by two dashes and a blank, the
variable ``address'' is replaced by the mail address of the key to be
published.
@mansect options
@noindent

View File

@ -371,7 +371,7 @@ main (int argc, char **argv)
}
/* Return true if TSRING has only ascii chacrterst or is NULL. */
/* Return true if STRING has only ascii characters or is NULL. */
static int
only_ascii (const char *string)
{
@ -571,7 +571,8 @@ mail_tube_encrypt (estream_t fpin, strlist_t recipients)
ct_is_text? "encrypted-file-attached"
: "encrypted-mail-attached",
(GET_TEMPLATE_SUBST_ENVVARS
| GET_TEMPLATE_CRLF));
| GET_TEMPLATE_CRLF),
NULL);
if (templ && !only_ascii (templ))
{
charset = "utf-8";

View File

@ -155,6 +155,8 @@ const char *fake_submission_addr;
static char **blacklist_array;
static size_t blacklist_array_len;
/* The current locale in the short form (e.g. "de" instead of "de_DE") */
static char *short_locale;
static void wrong_args (const char *t1, const char *t2) GPGRT_ATTR_NORETURN;
static void add_blacklist (const char *fname);
@ -168,7 +170,9 @@ static gpg_error_t encrypt_response (estream_t *r_output, estream_t input,
const char *fingerprint);
static gpg_error_t read_confirmation_request (estream_t msg);
static gpg_error_t command_receive_cb (void *opaque,
const char *mediatype, estream_t fp,
const char *mediatype,
const char *language,
estream_t fp,
unsigned int flags);
static gpg_error_t command_mirror (char *domain[]);
@ -374,6 +378,20 @@ main (int argc, char **argv)
!opt.no_autostart);
/* Get the short form of the current locale. */
{
const char *locname = gnupg_messages_locale_name ();
char *p;
if (locname && *locname && strcmp (locname, "C"))
{
short_locale = xstrdup (locname);
if ((p = strpbrk (short_locale, "_.@/")))
*p = 0;
gpgrt_annotate_leaked_object (short_locale);
}
}
/* Check that the top directory exists. */
if (cmd == aInstallKey || cmd == aRemoveKey || cmd == aMirror)
{
@ -1338,25 +1356,6 @@ command_create (const char *fingerprint, const char *userid)
}
}
/* Now put the armor around the key. */
{
estream_t newkey;
es_rewind (key);
err = wks_armor_key (&newkey, key,
no_encrypt? NULL
/* */ : ("Content-Type: application/pgp-keys\n"
"\n"));
if (err)
{
log_error ("error armoring key: %s\n", gpg_strerror (err));
goto leave;
}
es_fclose (key);
key = newkey;
}
/* Hack to support posteo but let them disable this by setting the
* new policy-version flag. */
if (policy->protocol_version < 3
@ -1367,6 +1366,31 @@ command_create (const char *fingerprint, const char *userid)
posteo_hack = 1;
}
/* Now put the armor around the key. */
{
estream_t newkey;
char *prefix;
prefix = xstrconcat
("Content-Type: application/pgp-keys\n",
short_locale && *short_locale? "Content-Language: " : "",
short_locale && *short_locale? short_locale : "",
short_locale && *short_locale? "\n" : "",
"\n", NULL);
es_rewind (key);
err = wks_armor_key (&newkey, key, no_encrypt? NULL : prefix);
xfree (prefix);
if (err)
{
log_error ("error armoring key: %s\n", gpg_strerror (err));
goto leave;
}
es_fclose (key);
key = newkey;
}
/* Encrypt the key part. */
if (!no_encrypt)
{
@ -1415,8 +1439,10 @@ command_create (const char *fingerprint, const char *userid)
goto leave;
}
err = mime_maker_add_header (mime, "Content-type",
err = mime_maker_add_header (mime, "Content-Type",
"application/pgp-keys");
if (!err && short_locale && *short_locale)
err = mime_maker_add_header (mime, "Content-Language", short_locale);
if (err)
goto leave;
@ -1596,10 +1622,11 @@ send_confirmation_response (const char *sender, const char *address,
* only our client will see it. */
if (encrypt)
{
es_fputs ("Content-Type: application/vnd.gnupg.wks\n"
"Content-Transfer-Encoding: 8bit\n"
"\n",
body);
es_fprintf (body,
"Content-Type: application/vnd.gnupg.wks\n"
"Content-Transfer-Encoding: 8bit\n"
"Content-Language: %s\n"
"\n", (short_locale && *short_locale)? short_locale : "en");
}
es_fprintf (body, ("type: confirmation-response\n"
@ -1858,12 +1885,13 @@ read_confirmation_request (estream_t msg)
/* Called from the MIME receiver to process the plain text data in MSG. */
static gpg_error_t
command_receive_cb (void *opaque, const char *mediatype,
command_receive_cb (void *opaque, const char *mediatype, const char *language,
estream_t msg, unsigned int flags)
{
gpg_error_t err;
(void)opaque;
(void)language;
(void)flags;
if (!strcmp (mediatype, "application/vnd.gnupg.wks"))

View File

@ -142,6 +142,7 @@ struct server_ctx_s
{
char *fpr;
uidinfo_list_t mboxes; /* List with addr-specs taken from the UIDs. */
char *language; /* Requested language. */
unsigned int draft_version_2:1; /* Client supports the draft 2. */
};
typedef struct server_ctx_s *server_ctx_t;
@ -157,7 +158,9 @@ static int opt_with_file;
static gpg_error_t get_domain_list (strlist_t *r_list);
static gpg_error_t command_receive_cb (void *opaque,
const char *mediatype, estream_t fp,
const char *mediatype,
const char *language,
estream_t fp,
unsigned int flags);
static gpg_error_t command_list_domains (void);
static gpg_error_t command_revoke_key (const char *mailaddr);
@ -432,6 +435,54 @@ main (int argc, char **argv)
}
/* Return true if STRING has only ascii characters or is NULL. */
static int
only_ascii (const char *string)
{
if (string)
for ( ; *string; string++)
if ((*string & 0x80))
return 0;
return 1;
}
struct my_subst_vars_s
{
const char *address;
};
/* Helper for my_subst_vars. */
static const char *
my_subst_vars_cb (void *cookie, const char *name)
{
struct my_subst_vars_s *parm = cookie;
const char *s;
if (name && !strcmp (name, "sigdelim"))
s = "-- ";
else if (name && !strcmp (name, "address"))
s = parm->address;
else /* Assume envvar. */
s = getenv (name);
return s? s : "";
}
/* Substitute all envvars in TEMPL and the var $address my the value
* of MBOX. Return a a new malloced string or NULL. */
static char *
my_subst_vars (server_ctx_t ctx, const char *templ, const char *mbox)
{
struct my_subst_vars_s parm;
(void)ctx;
parm.address = mbox;
return substitute_vars (templ, my_subst_vars_cb, &parm);
}
/* Take the key in KEYFILE and write it to OUTFILE in binary encoding.
* If ADDRSPEC is given only matching user IDs are included in the
* output. */
@ -991,6 +1042,9 @@ send_confirmation_request (server_ctx_t ctx,
char *from_buffer = NULL;
const char *from;
strlist_t sl;
char *templ = NULL;
char *p;
const char *cttype, *ctencode;
from = from_buffer = get_submission_address (mbox);
if (!from)
@ -1123,25 +1177,48 @@ send_confirmation_request (server_ctx_t ctx,
goto leave;
partid = mime_maker_get_partid (mime);
err = mime_maker_add_header (mime, "Content-Type", "text/plain");
templ = gnupg_get_template ("wks-utils", "server.confirm.body",
0, ctx->language);
if (templ)
{
p = my_subst_vars (ctx, templ, mbox);
xfree (templ);
templ = p;
}
if (templ && !only_ascii (templ))
{
cttype = "text/plain; charset=utf-8";
ctencode = "quoted-printable";
p = mime_maker_qp_encode (templ);
if (!p)
{
err = gpg_error_from_syserror ();
log_error ("QP encoding failed: %s\n", gpg_strerror (err));
goto leave;
}
xfree (templ);
templ = p;
}
else
{
cttype = "text/plain";
ctencode = NULL;
}
err = mime_maker_add_header (mime, "Content-Type", cttype);
if (err)
goto leave;
if (ctencode)
err = mime_maker_add_header (mime,
"Content-Transfer-Encoding", ctencode);
if (err)
goto leave;
err = mime_maker_add_body
(mime,
err = mime_maker_add_body (mime, templ? templ :
"This message has been send to confirm your request\n"
"to publish your key. If you did not request a key\n"
"publication, simply ignore this message.\n"
"\n"
"Most mail software can handle this kind of message\n"
"automatically and thus you would not have seen this\n"
"message. It seems that your client does not fully\n"
"support this service. The web page\n"
"\n"
" https://gnupg.org/faq/wkd.html\n"
"\n"
"explains how you can process this message anyway in\n"
"a few manual steps.\n");
"publication, simply ignore this message.\n");
if (err)
goto leave;
@ -1180,6 +1257,7 @@ send_confirmation_request (server_ctx_t ctx,
err = wks_send_mime (mime);
leave:
xfree (templ);
mime_maker_release (mime);
es_fclose (signature);
es_fclose (signeddata);
@ -1285,7 +1363,8 @@ process_new_key (server_ctx_t ctx, estream_t key)
/* Send a message to tell the user at MBOX that their key has been
* published. FNAME the name of the file with the key. */
static gpg_error_t
send_congratulation_message (const char *mbox, const char *keyfile)
send_congratulation_message (server_ctx_t ctx,
const char *mbox, const char *keyfile)
{
gpg_error_t err;
estream_t body = NULL;
@ -1294,6 +1373,9 @@ send_congratulation_message (const char *mbox, const char *keyfile)
char *from_buffer = NULL;
const char *from;
strlist_t sl;
char *templ = NULL;
char *p;
const char *charset, *ctencode;
from = from_buffer = get_submission_address (mbox);
if (!from)
@ -1315,28 +1397,47 @@ send_congratulation_message (const char *mbox, const char *keyfile)
log_error ("error allocating memory buffer: %s\n", gpg_strerror (err));
goto leave;
}
/* It is fine to use 8 bit encoding because that is encrypted and
* only our client will see it. */
es_fputs ("Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"\n",
body);
es_fprintf (body,
"Hello!\n\n"
"The key for your address '%s' has been published\n"
"and can now be retrieved from the Web Key Directory.\n"
"\n"
"For more information on this system see:\n"
"\n"
" https://gnupg.org/faq/wkd.html\n"
"\n"
"Best regards\n"
"\n"
" GnuPG Key Publisher\n\n\n"
"-- \n"
"For information on GnuPG see: %s\n",
mbox, "https://gnupg.org");
templ = gnupg_get_template ("wks-utils", "server.publish.congrats",
0, ctx->language);
if (templ)
{
p = my_subst_vars (ctx, templ, mbox);
xfree (templ);
templ = p;
}
if (templ && !only_ascii (templ))
{
charset = "utf-8";
ctencode = "Content-Transfer-Encoding: quoted-printable\n";
p = mime_maker_qp_encode (templ);
if (!p)
{
err = gpg_error_from_syserror ();
log_error ("QP encoding failed: %s\n", gpg_strerror (err));
goto leave;
}
xfree (templ);
templ = p;
}
else
{
charset = "us-ascii";
ctencode = "";
}
es_fprintf (body, "Content-Type: text/plain; charset=%s\n%s\n",
charset, ctencode);
if (templ)
es_fputs (templ, body);
else
es_fprintf (body, "Hello!\n\n"
"The key for your address '%s' has been published\n"
"and can now be retrieved from the Web Key Directory.\n",
mbox);
es_rewind (body);
err = encrypt_stream (&bodyenc, body, keyfile);
@ -1399,6 +1500,7 @@ send_congratulation_message (const char *mbox, const char *keyfile)
err = wks_send_mime (mime);
leave:
xfree (templ);
mime_maker_release (mime);
es_fclose (bodyenc);
es_fclose (body);
@ -1516,7 +1618,7 @@ check_and_publish (server_ctx_t ctx, const char *address, const char *nonce)
fnewname, gpg_strerror (gpg_err_code_from_syserror()));
log_info ("key %s published for '%s'\n", ctx->fpr, address);
send_congratulation_message (address, fnewname);
send_congratulation_message (ctx, address, fnewname);
/* Try to publish as DANE record if the DANE directory exists. */
xfree (fname);
@ -1645,7 +1747,7 @@ process_confirmation_response (server_ctx_t ctx, estream_t msg)
/* Called from the MIME receiver to process the plain text data in MSG . */
static gpg_error_t
command_receive_cb (void *opaque, const char *mediatype,
command_receive_cb (void *opaque, const char *mediatype, const char *language,
estream_t msg, unsigned int flags)
{
gpg_error_t err;
@ -1656,6 +1758,8 @@ command_receive_cb (void *opaque, const char *mediatype,
memset (&ctx, 0, sizeof ctx);
if ((flags & WKS_RECEIVE_DRAFT2))
ctx.draft_version_2 = 1;
if (language)
ctx.language = xtrystrdup (language);
if (!strcmp (mediatype, "application/pgp-keys"))
err = process_new_key (&ctx, msg);

View File

@ -127,6 +127,7 @@ gpg_error_t wks_cmd_print_wkd_url (const char *userid);
gpg_error_t wks_receive (estream_t fp,
gpg_error_t (*result_cb)(void *opaque,
const char *mediatype,
const char *language,
estream_t data,
unsigned int flags),
void *cb_data);

View File

@ -50,6 +50,7 @@ struct receive_ctx_s
estream_t signature;
estream_t key_data;
estream_t wkd_data;
char *ct_language; /* The short locale of the conent or NULL. */
unsigned int collect_key_data:1;
unsigned int collect_wkd_data:1;
unsigned int draft_version_2:1; /* This is a draft version 2 request. */
@ -288,6 +289,34 @@ t2body (void *cookie, int level)
}
/* Get the Content-Language from the curent MIME header and store it
* in CTX. */
static void
get_language (receive_ctx_t ctx)
{
rfc822parse_t msg;
char *value, *p;
size_t valueoff;
msg = mime_parser_rfc822parser (ctx->parser);
if (msg)
{
value = rfc822parse_get_field (msg, "Content-Language",
-1, &valueoff);
if (value)
{
xfree (ctx->ct_language);
ctx->ct_language = xtrystrdup (value+valueoff);
/* Take only the first short language. */
if (ctx->ct_language
&& (p = strpbrk (ctx->ct_language, " \t,_.@/")))
*p = 0;
rfc822_free (value);
}
}
}
static gpg_error_t
new_part (void *cookie, const char *mediatype, const char *mediasubtype)
{
@ -308,6 +337,7 @@ new_part (void *cookie, const char *mediatype, const char *mediasubtype)
}
else
{
get_language (ctx);
ctx->key_data = es_fopenmem (0, "w+b");
if (!ctx->key_data)
{
@ -333,6 +363,7 @@ new_part (void *cookie, const char *mediatype, const char *mediasubtype)
}
else
{
get_language (ctx);
ctx->wkd_data = es_fopenmem (0, "w+b");
if (!ctx->wkd_data)
{
@ -410,6 +441,7 @@ gpg_error_t
wks_receive (estream_t fp,
gpg_error_t (*result_cb)(void *opaque,
const char *mediatype,
const char *language,
estream_t data,
unsigned int flags),
void *cb_data)
@ -482,6 +514,8 @@ wks_receive (estream_t fp,
if (DBG_MIME)
{
es_rewind (ctx->key_data);
if (ctx->ct_language)
log_debug ("Language: '%s'\n", ctx->ct_language);
log_debug ("Key: '");
log_printf ("\n");
while ((c = es_getc (ctx->key_data)) != EOF)
@ -492,7 +526,7 @@ wks_receive (estream_t fp,
{
es_rewind (ctx->key_data);
err = result_cb (cb_data, "application/pgp-keys",
ctx->key_data, flags);
ctx->ct_language, ctx->key_data, flags);
if (err)
goto leave;
}
@ -512,7 +546,7 @@ wks_receive (estream_t fp,
{
es_rewind (ctx->wkd_data);
err = result_cb (cb_data, "application/vnd.gnupg.wks",
ctx->wkd_data, flags);
ctx->ct_language, ctx->wkd_data, flags);
if (err)
goto leave;
}
@ -529,6 +563,7 @@ wks_receive (estream_t fp,
es_fclose (ctx->signature);
es_fclose (ctx->key_data);
es_fclose (ctx->wkd_data);
xfree (ctx->ct_language);
xfree (ctx);
return err;
}