diff options
author | Thomas Roessler <roessler@does-not-exist.org> | 1999-06-03 07:27:43 +0000 |
---|---|---|
committer | Thomas Roessler <roessler@does-not-exist.org> | 1999-06-03 07:27:43 +0000 |
commit | dddad7c776881afcb79b627c5e423b4dd1ac8959 (patch) | |
tree | 9fabe2dc0b83076a387de99fc0572b7eb902cb02 /pgpinvoke.c | |
parent | b5eae58059edb774a743a4c7f66229f7124ad5ab (diff) |
Experimental: New PGP invocation interface. The invocations are done
through formats, so all this should fit more cleanly into mutt now.
Diffstat (limited to 'pgpinvoke.c')
-rw-r--r-- | pgpinvoke.c | 740 |
1 files changed, 213 insertions, 527 deletions
diff --git a/pgpinvoke.c b/pgpinvoke.c index ccc7d494..4af8b933 100644 --- a/pgpinvoke.c +++ b/pgpinvoke.c @@ -1,21 +1,28 @@ /* * Copyright (C) 1997-1999 Thomas Roessler <roessler@guug.de> * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * This program is free software; you can redistribute it + * and/or modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later + * version. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more + * details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA + * 02139, USA. */ +/* This file contains the new pgp invocation code. Note that this + * is almost entirely format based. + */ + #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -25,570 +32,249 @@ #include "mutt.h" #include "pgp.h" -/******************************************************************* - * - * PGP V2 Invocation stuff - * - *******************************************************************/ - -pid_t pgp_v2_invoke_decode(struct pgp_vinfo *pgp, - FILE **pgpin, FILE **pgpout, FILE **pgperr, - int pgpinfd, int pgpoutfd, int pgperrfd, - const char *fname, int need_passphrase) -{ - char _fname[_POSIX_PATH_MAX + SHORT_STRING]; - char cmd[HUGE_STRING]; - char pubring[_POSIX_PATH_MAX + SHORT_STRING]; - char secring[_POSIX_PATH_MAX + SHORT_STRING]; - - mutt_quote_filename (_fname, sizeof (_fname), fname); - mutt_quote_filename (pubring, sizeof (pubring), *pgp->pubring); - mutt_quote_filename (secring, sizeof (secring), *pgp->secring); - - snprintf(cmd, sizeof(cmd), "%scat %s%s | " - "%s +language=%s +pubring=%s +secring=%s +verbose=0 +batchmode -f", - need_passphrase ? "PGPPASSFD=0; export PGPPASSFD; " : "", - need_passphrase ? "- " : "", - _fname, - NONULL(*pgp->binary), NONULL (*pgp->language), NONULL (pubring), NONULL (secring)); - - return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, - pgpinfd, pgpoutfd, pgperrfd); -} - -pid_t pgp_v2_invoke_verify(struct pgp_vinfo *pgp, - FILE **pgpin, FILE **pgpout, FILE **pgperr, - int pgpinfd, int pgpoutfd, int pgperrfd, - const char *signedstuff, const char *sigfile) -{ - char _sig[_POSIX_PATH_MAX + SHORT_STRING]; - char _signed[_POSIX_PATH_MAX + SHORT_STRING]; - char cmd[HUGE_STRING]; - char pubring[_POSIX_PATH_MAX + SHORT_STRING]; - char secring[_POSIX_PATH_MAX + SHORT_STRING]; - - mutt_quote_filename (_sig, sizeof (_sig), sigfile); - mutt_quote_filename (_signed, sizeof (_signed), signedstuff); - mutt_quote_filename (pubring, sizeof (pubring), *pgp->pubring); - mutt_quote_filename (secring, sizeof (secring), *pgp->secring); - - snprintf(cmd, sizeof(cmd), - "%s +language=%s +pubring=%s +secring=%s +batchmode +verbose=0 %s %s", - NONULL(*pgp->binary), NONULL (*pgp->language), NONULL (pubring), - NONULL (secring), _sig, _signed); - - return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, - pgpinfd, pgpoutfd, pgperrfd); -} - -pid_t pgp_v2_invoke_decrypt(struct pgp_vinfo *pgp, - FILE **pgpin, FILE **pgpout, FILE **pgperr, - int pgpinfd, int pgpoutfd, int pgperrfd, - const char *fname) -{ - char _fname[_POSIX_PATH_MAX + SHORT_STRING]; - char cmd[HUGE_STRING]; - char pubring[_POSIX_PATH_MAX + SHORT_STRING]; - char secring[_POSIX_PATH_MAX + SHORT_STRING]; - - mutt_quote_filename (_fname, sizeof (_fname), fname); - mutt_quote_filename (pubring, sizeof (pubring), *pgp->pubring); - mutt_quote_filename (secring, sizeof (secring), *pgp->secring); - - snprintf(cmd, sizeof(cmd), - "PGPPASSFD=0; export PGPPASSFD; cat - %s | %s +language=%s +pubring=%s +secring=%s " - "+verbose=0 +batchmode -f", - _fname, NONULL(*pgp->binary), NONULL (*pgp->language), NONULL (pubring), NONULL (secring)); - return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, - pgpinfd, pgpoutfd, pgperrfd); -} - -pid_t pgp_v2_invoke_sign(struct pgp_vinfo *pgp, - FILE **pgpin, FILE **pgpout, FILE **pgperr, - int pgpinfd, int pgpoutfd, int pgperrfd, - const char *fname) -{ - char _fname[_POSIX_PATH_MAX + SHORT_STRING]; - char cmd[HUGE_STRING]; - char pubring[_POSIX_PATH_MAX + SHORT_STRING]; - char secring[_POSIX_PATH_MAX + SHORT_STRING]; - - mutt_quote_filename (_fname, sizeof (_fname), fname); - mutt_quote_filename (pubring, sizeof (pubring), *pgp->pubring); - mutt_quote_filename (secring, sizeof (secring), *pgp->secring); - - snprintf(cmd, sizeof(cmd), - "PGPPASSFD=0; export PGPPASSFD; cat - %s | %s " - "+language=%s +pubring=%s +secring=%s +verbose=0 +batchmode -abfst %s %s", - _fname, NONULL(*pgp->binary), NONULL (*pgp->language), NONULL (pubring), NONULL (secring), - PgpSignAs ? "-u" : "", - PgpSignAs ? PgpSignAs : ""); - - return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, - pgpinfd, pgpoutfd, pgperrfd); -} -pid_t pgp_v2_invoke_encrypt(struct pgp_vinfo *pgp, - FILE **pgpin, FILE **pgpout, FILE **pgperr, - int pgpinfd, int pgpoutfd, int pgperrfd, - const char *fname, const char *uids, int sign) +/* + * The actual command line formatter. + */ + +struct pgp_command_context { + short need_passphrase; /* %p */ + const char *fname; /* %f */ + const char *sig_fname; /* %s */ + const char *signas; /* %a */ + const char *ids; /* %r */ +}; + + +const char *_mutt_fmt_pgp_command (char *dest, + size_t destlen, + char op, + const char *src, + const char *prefix, + const char *ifstring, + const char *elsestring, + unsigned long data, + format_flag flags) { - char _fname[_POSIX_PATH_MAX + SHORT_STRING]; - char cmd[HUGE_STRING]; - char pubring[_POSIX_PATH_MAX + SHORT_STRING]; - char secring[_POSIX_PATH_MAX + SHORT_STRING]; - - mutt_quote_filename (_fname, sizeof (_fname), fname); - mutt_quote_filename (pubring, sizeof (pubring), *pgp->pubring); - mutt_quote_filename (secring, sizeof (secring), *pgp->secring); - - snprintf(cmd, sizeof(cmd), - "%scat %s%s | %s +language=%s +pubring=%s +secring=%s +verbose=0 %s +batchmode -aeft%s %s%s %s", - sign ? "PGPPASSFD=0; export PGPPASSFD; " : "", - sign ? "- " : "", - _fname, - NONULL(*pgp->binary), NONULL (*pgp->language), NONULL (pubring), NONULL (secring), - option(OPTPGPENCRYPTSELF) ? "+encrypttoself" : "", - sign ? "s" : "", - sign && PgpSignAs ? "-u " : "", - sign && PgpSignAs ? PgpSignAs : "", - uids); - return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, - pgpinfd, pgpoutfd, pgperrfd); + char fmt[16]; + struct pgp_command_context *cctx = (struct pgp_command_context *) data; + int optional = (flags & M_FORMAT_OPTIONAL); + + switch (op) + { + case 'r': + { + if (!optional) + { + snprintf (fmt, sizeof (fmt), "%%%ss", prefix); + snprintf (dest, destlen, fmt, NONULL (cctx->ids)); + } + else if (!cctx->ids) + optional = 0; + break; + } + + case 'a': + { + if (!optional) + { + snprintf (fmt, sizeof (fmt), "%%%ss", prefix); + snprintf (dest, destlen, fmt, NONULL (cctx->signas)); + } + else if (!cctx->signas) + optional = 0; + break; + } + + case 's': + { + if (!optional) + { + snprintf (fmt, sizeof (fmt), "%%%ss", prefix); + snprintf (dest, destlen, fmt, NONULL (cctx->sig_fname)); + } + else if (!cctx->sig_fname) + optional = 0; + break; + } + + case 'f': + { + if (!optional) + { + snprintf (fmt, sizeof (fmt), "%%%ss", prefix); + snprintf (dest, destlen, fmt, NONULL (cctx->fname)); + } + else if (!cctx->fname) + optional = 0; + break; + } + + case 'p': + { + if (!optional) + { + snprintf (fmt, sizeof (fmt), "%%%ss", prefix); + snprintf (dest, destlen, fmt, cctx->need_passphrase ? "PGPPASSFD=0" : ""); + } + else if (!cctx->need_passphrase) + optional = 0; + break; + } + } + + if (optional) + mutt_FormatString (dest, destlen, ifstring, mutt_attach_fmt, data, 0); + else if (flags & M_FORMAT_OPTIONAL) + mutt_FormatString (dest, destlen, elsestring, mutt_attach_fmt, data, 0); + + return (src); } -void pgp_v2_invoke_import(struct pgp_vinfo *pgp, const char *fname) +void mutt_pgp_command (char *d, size_t dlen, struct pgp_command_context *cctx, const char *fmt) { - char _fname[_POSIX_PATH_MAX + SHORT_STRING]; - char cmd[HUGE_STRING]; - char pubring[_POSIX_PATH_MAX + SHORT_STRING]; - char secring[_POSIX_PATH_MAX + SHORT_STRING]; - - mutt_quote_filename (_fname, sizeof (_fname), fname); - mutt_quote_filename (pubring, sizeof (pubring), *pgp->pubring); - mutt_quote_filename (secring, sizeof (secring), *pgp->secring); - - snprintf(cmd, sizeof(cmd), "%s +language=%s +pubring=%s +secring=%s -ka %s", - NONULL(*pgp->binary), NONULL (*pgp->language), NONULL (pubring), - NONULL (secring), _fname); - mutt_system(cmd); + mutt_FormatString (d, dlen, NONULL (fmt), _mutt_fmt_pgp_command, (unsigned long) cctx, 0); + dprint (2, (debugfile, "mutt_pgp_command: %s\n", d)); } -pid_t pgp_v2_invoke_export(struct pgp_vinfo *pgp, - FILE **pgpin, FILE **pgpout, FILE **pgperr, - int pgpinfd, int pgpoutfd, int pgperrfd, const char *id) +/* + * Glue. + */ + + +static pid_t pgp_invoke (FILE **pgpin, FILE **pgpout, FILE **pgperr, + int pgpinfd, int pgpoutfd, int pgperrfd, + short need_passphrase, + const char *fname, + const char *sig_fname, + const char *signas, + const char *ids, + const char *format) { + struct pgp_command_context cctx; char cmd[HUGE_STRING]; - char pubring[_POSIX_PATH_MAX + SHORT_STRING]; - char secring[_POSIX_PATH_MAX + SHORT_STRING]; - - mutt_quote_filename (pubring, sizeof (pubring), *pgp->pubring); - mutt_quote_filename (secring, sizeof (secring), *pgp->secring); - - snprintf(cmd, sizeof(cmd), "%s -kxaf +language=%s +pubring=%s +secring=%s 0x%8s", - NONULL(*pgp->binary), NONULL (*pgp->language), NONULL (pubring), NONULL (secring), id); - return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, + + memset (&cctx, 0, sizeof (cctx)); + + cctx.need_passphrase = need_passphrase; + cctx.fname = fname; + cctx.sig_fname = sig_fname; + cctx.signas = signas; + cctx.ids = ids; + + mutt_pgp_command (cmd, sizeof (cmd), &cctx, format); + + return mutt_create_filter_fd (cmd, pgpin, pgpout, pgperr, pgpinfd, pgpoutfd, pgperrfd); } -pid_t pgp_v2_invoke_verify_key(struct pgp_vinfo *pgp, - FILE **pgpin, FILE **pgpout, FILE **pgperr, - int pgpinfd, int pgpoutfd, int pgperrfd, const char *id) -{ - char cmd[HUGE_STRING]; - char pubring[_POSIX_PATH_MAX + SHORT_STRING]; - char secring[_POSIX_PATH_MAX + SHORT_STRING]; - - mutt_quote_filename (pubring, sizeof (pubring), *pgp->pubring); - mutt_quote_filename (secring, sizeof (secring), *pgp->secring); - snprintf(cmd, sizeof(cmd), "%s +language=%s +pubring=%s +secring=%s +batchmode -kcc 0x%8s", - NONULL(*pgp->binary), NONULL (*pgp->language), NONULL (pubring), NONULL (secring), id); - return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, - pgpinfd, pgpoutfd, pgperrfd); -} - -/******************************************************************* - * - * PGP V3 Invocation stuff +/* + * The exported interface. * - *******************************************************************/ - -pid_t pgp_v3_invoke_decode(struct pgp_vinfo *pgp, - FILE **pgpin, FILE **pgpout, FILE **pgperr, - int pgpinfd, int pgpoutfd, int pgperrfd, - const char *fname, int need_passphrase) -{ - char _fname[_POSIX_PATH_MAX + SHORT_STRING]; - char cmd[HUGE_STRING]; - char pubring[_POSIX_PATH_MAX + SHORT_STRING]; - char secring[_POSIX_PATH_MAX + SHORT_STRING]; - - mutt_quote_filename (_fname, sizeof (_fname), fname); - mutt_quote_filename (pubring, sizeof (pubring), *pgp->pubring); - mutt_quote_filename (secring, sizeof (secring), *pgp->secring); - - snprintf(cmd, sizeof(cmd), "%scat %s%s | " - "%sv +language=%s +pubring=%s +secring=%s +verbose=0 +batchmode -f " - "--OutputInformationFD=2", - need_passphrase ? "PGPPASSFD=0; export PGPPASSFD; " : "", - need_passphrase ? "- " : "", - _fname, - NONULL(*pgp->binary), NONULL (*pgp->language), NONULL (pubring), NONULL (secring)); - return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, - pgpinfd, pgpoutfd, pgperrfd); -} - -pid_t pgp_v3_invoke_verify(struct pgp_vinfo *pgp, - FILE **pgpin, FILE **pgpout, FILE **pgperr, - int pgpinfd, int pgpoutfd, int pgperrfd, - const char *signedstuff, const char *sigfile) -{ - char _sig[_POSIX_PATH_MAX + SHORT_STRING]; - char _sign[_POSIX_PATH_MAX + SHORT_STRING]; - char cmd[HUGE_STRING]; - char pubring[_POSIX_PATH_MAX + SHORT_STRING]; - char secring[_POSIX_PATH_MAX + SHORT_STRING]; - - mutt_quote_filename (_sig, sizeof (_sig), sigfile); - mutt_quote_filename (_sign, sizeof (_sign), signedstuff); - mutt_quote_filename (pubring, sizeof (pubring), *pgp->pubring); - mutt_quote_filename (secring, sizeof (secring), *pgp->secring); - - snprintf(cmd, sizeof(cmd), - "%sv +language=%s +pubring=%s +secring=%s --OutputInformationFD=1 +batchmode +verbose=0 %s %s", - NONULL(*pgp->binary), NONULL (*pgp->language), NONULL (pubring), NONULL (secring), - _sig, _sign); - - return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, - pgpinfd, pgpoutfd, pgperrfd); -} - -pid_t pgp_v3_invoke_encrypt(struct pgp_vinfo *pgp, - FILE **pgpin, FILE **pgpout, FILE **pgperr, - int pgpinfd, int pgpoutfd, int pgperrfd, - const char *fname, const char *uids, int sign) -{ - char *cp; - char *keylist; - char _fname[_POSIX_PATH_MAX + SHORT_STRING]; - char cmd[HUGE_STRING]; - char pubring[_POSIX_PATH_MAX + SHORT_STRING]; - char secring[_POSIX_PATH_MAX + SHORT_STRING]; - char tmpcmd[HUGE_STRING]; - - mutt_quote_filename (_fname, sizeof (_fname), fname); - mutt_quote_filename (pubring, sizeof (pubring), *pgp->pubring); - mutt_quote_filename (secring, sizeof (secring), *pgp->secring); - - snprintf(cmd, sizeof(cmd), - "%scat %s%s | %se +language=%s +pubring=%s +secring=%s +verbose=0 %s +batchmode +nobatchinvalidkeys=off -aft%s %s%s", - sign ? "PGPPASSFD=0; export PGPPASSFD; " : "", - sign ? "- " : "", - _fname, - NONULL(*pgp->binary), NONULL (*pgp->language), NONULL (pubring), NONULL (secring), - option(OPTPGPENCRYPTSELF) ? "+encrypttoself" : "", - sign ? "s" : "", - sign && PgpSignAs ? "-u " : "", - sign && PgpSignAs ? PgpSignAs : ""); - - keylist = safe_strdup(uids); + * This is historic and may be removed at some point. + * + */ - for(cp = strtok(keylist, " "); cp ; cp = strtok(NULL, " ")) - { - snprintf(tmpcmd, sizeof(tmpcmd), "%s -r %s", - cmd, cp); - strcpy(cmd, tmpcmd); - } - safe_free((void **) &keylist); - - return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, - pgpinfd, pgpoutfd, pgperrfd); -} -pid_t pgp_v3_invoke_decrypt(struct pgp_vinfo *pgp, - FILE **pgpin, FILE **pgpout, FILE **pgperr, - int pgpinfd, int pgpoutfd, int pgperrfd, - const char *fname) +pid_t pgp_invoke_decode (FILE **pgpin, FILE **pgpout, FILE **pgperr, + int pgpinfd, int pgpoutfd, int pgperrfd, + const char *fname, short need_passphrase) { - char _fname[_POSIX_PATH_MAX + SHORT_STRING]; - char cmd[HUGE_STRING]; - char pubring[_POSIX_PATH_MAX + SHORT_STRING]; - char secring[_POSIX_PATH_MAX + SHORT_STRING]; - - mutt_quote_filename (_fname, sizeof (_fname), fname); - mutt_quote_filename (pubring, sizeof (pubring), *pgp->pubring); - mutt_quote_filename (secring, sizeof (secring), *pgp->secring); - - snprintf(cmd, sizeof(cmd), - "PGPPASSFD=0; export PGPPASSFD; cat - %s | %sv +language=%s +pubring=%s +secring=%s " - "+verbose=0 +batchmode -f --OutputInformationFD=2", - _fname, NONULL(*pgp->binary), NONULL (*pgp->language), NONULL (pubring), NONULL (secring)); - - return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, - pgpinfd, pgpoutfd, pgperrfd); + return pgp_invoke (pgpin, pgpout, pgperr, pgpinfd, pgpoutfd, pgperrfd, + need_passphrase, fname, NULL, NULL, NULL, + PgpDecodeCommand); } -pid_t pgp_v3_invoke_sign(struct pgp_vinfo *pgp, - FILE **pgpin, FILE **pgpout, FILE **pgperr, +pid_t pgp_invoke_verify (FILE **pgpin, FILE **pgpout, FILE **pgperr, int pgpinfd, int pgpoutfd, int pgperrfd, - const char *fname) -{ - char _fname[_POSIX_PATH_MAX + SHORT_STRING]; - char cmd[HUGE_STRING]; - char pubring[_POSIX_PATH_MAX + SHORT_STRING]; - char secring[_POSIX_PATH_MAX + SHORT_STRING]; - - mutt_quote_filename (_fname, sizeof (_fname), fname); - mutt_quote_filename (pubring, sizeof (pubring), *pgp->pubring); - mutt_quote_filename (secring, sizeof (secring), *pgp->secring); - - snprintf(cmd, sizeof(cmd), - "PGPPASSFD=0; export PGPPASSFD; cat - %s | %ss " - "+language=%s +pubring=%s +secring=%s +verbose=0 -abft %s %s", - _fname, NONULL(*pgp->binary), NONULL (*pgp->language), NONULL (pubring), NONULL (secring), - PgpSignAs ? "-u" : "", - PgpSignAs ? PgpSignAs : ""); - return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, - pgpinfd, pgpoutfd, pgperrfd); -} -void pgp_v3_invoke_import(struct pgp_vinfo *pgp, const char *fname) + const char *fname, const char *sig_fname) { - char _fname[_POSIX_PATH_MAX + SHORT_STRING]; - char cmd[HUGE_STRING]; - char pubring[_POSIX_PATH_MAX + SHORT_STRING]; - char secring[_POSIX_PATH_MAX + SHORT_STRING]; - - mutt_quote_filename (_fname, sizeof (_fname), fname); - mutt_quote_filename (pubring, sizeof (pubring), *pgp->pubring); - mutt_quote_filename (secring, sizeof (secring), *pgp->secring); - - snprintf(cmd, sizeof(cmd), "%sk +language=%s +pubring=%s +secring=%s -a --OutputInformationFD=1 %s", - NONULL(*pgp->binary), NONULL (*pgp->language), NONULL (pubring), NONULL (secring), _fname); - mutt_system(cmd); + return pgp_invoke (pgpin, pgpout, pgperr, pgpinfd, pgpoutfd, pgperrfd, + 0, fname, sig_fname, NULL, NULL, PgpVerifyCommand); } -pid_t pgp_v3_invoke_export(struct pgp_vinfo *pgp, - FILE **pgpin, FILE **pgpout, FILE **pgperr, - int pgpinfd, int pgpoutfd, int pgperrfd, const char *id) +pid_t pgp_invoke_decrypt (FILE **pgpin, FILE **pgpout, FILE **pgperr, + int pgpinfd, int pgpoutfd, int pgperrfd, + const char *fname) { - char cmd[HUGE_STRING]; - char pubring[_POSIX_PATH_MAX + SHORT_STRING]; - char secring[_POSIX_PATH_MAX + SHORT_STRING]; - - mutt_quote_filename (pubring, sizeof (pubring), *pgp->pubring); - mutt_quote_filename (secring, sizeof (secring), *pgp->secring); - - snprintf(cmd, sizeof(cmd), "%sk -xa +language=%s +pubring=%s +secring=%s --OutputInformationFD=1 0x%8s", - NONULL(*pgp->binary), NONULL (*pgp->language), NONULL (pubring), NONULL (secring), id); - - return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, - pgpinfd, pgpoutfd, pgperrfd); + return pgp_invoke (pgpin, pgpout, pgperr, pgpinfd, pgpoutfd, pgperrfd, + 1, fname, NULL, NULL, NULL, PgpDecryptCommand); } -pid_t pgp_v3_invoke_verify_key(struct pgp_vinfo *pgp, - FILE **pgpin, FILE **pgpout, FILE **pgperr, - int pgpinfd, int pgpoutfd, int pgperrfd, const char *id) +pid_t pgp_invoke_sign (FILE **pgpin, FILE **pgpout, FILE **pgperr, + int pgpinfd, int pgpoutfd, int pgperrfd, + const char *fname) { - char cmd[HUGE_STRING]; - char pubring[_POSIX_PATH_MAX + SHORT_STRING]; - char secring[_POSIX_PATH_MAX + SHORT_STRING]; - - mutt_quote_filename (pubring, sizeof (pubring), *pgp->pubring); - mutt_quote_filename (secring, sizeof (secring), *pgp->secring); - - snprintf(cmd, sizeof(cmd), "%sk +language=%s +pubring=%s +secring=%s +batchmode -c --OutputInformationFD=1 0x%8s", - NONULL(*pgp->binary), NONULL (*pgp->language), NONULL (pubring), NONULL (secring), id); - - return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, - pgpinfd, pgpoutfd, pgperrfd); + return pgp_invoke (pgpin, pgpout, pgperr, pgpinfd, pgpoutfd, pgperrfd, + 1, fname, NULL, PgpSignAs, NULL, PgpSignCommand); } -/******************************************************************* - * - * GNU Privacy Guard invocation stuff - * - * Credits go to Werner Koch for sending me the code on which this - * is based. - * - *******************************************************************/ -pid_t pgp_gpg_invoke_decode(struct pgp_vinfo *pgp, - FILE **pgpin, FILE **pgpout, FILE **pgperr, - int pgpinfd, int pgpoutfd, int pgperrfd, - const char *fname, int need_passphrase) +pid_t pgp_invoke_encrypt (FILE **pgpin, FILE **pgpout, FILE **pgperr, + int pgpinfd, int pgpoutfd, int pgperrfd, + const char *fname, const char *uids, int sign) { - char cmd[HUGE_STRING]; - char _fname[_POSIX_PATH_MAX + SHORT_STRING]; - - mutt_quote_filename (_fname, sizeof (_fname), fname); - - snprintf(cmd, sizeof(cmd), - "%s%s --no-verbose --batch -o - %s", - NONULL(*pgp->binary), need_passphrase? " --passphrase-fd 0":"", - _fname); - - return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, - pgpinfd, pgpoutfd, pgperrfd); -} - -pid_t pgp_gpg_invoke_verify(struct pgp_vinfo *pgp, - FILE **pgpin, FILE **pgpout, FILE **pgperr, - int pgpinfd, int pgpoutfd, int pgperrfd, - const char *signedstuff, const char *sigfile) -{ - char _sig[_POSIX_PATH_MAX + SHORT_STRING]; - char _sign[_POSIX_PATH_MAX + SHORT_STRING]; - char cmd[HUGE_STRING]; - - mutt_quote_filename (_sig, sizeof (_sig), sigfile); - mutt_quote_filename (_sign, sizeof (_sign), signedstuff); - - snprintf(cmd, sizeof(cmd), - "%s --no-verbose --batch -o - " - "--verify %s %s", - NONULL(*pgp->binary), _sig, _sign); - - return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, - pgpinfd, pgpoutfd, pgperrfd); + if (sign) + return pgp_invoke (pgpin, pgpout, pgperr, pgpinfd, pgpoutfd, pgperrfd, + 1, fname, NULL, PgpSignAs, uids, + PgpEncryptSignCommand); + else + return pgp_invoke (pgpin, pgpout, pgperr, pgpinfd, pgpoutfd, pgperrfd, + 0, fname, NULL, NULL, uids, + PgpEncryptOnlyCommand); } -pid_t pgp_gpg_invoke_decrypt(struct pgp_vinfo *pgp, - FILE **pgpin, FILE **pgpout, FILE **pgperr, - int pgpinfd, int pgpoutfd, int pgperrfd, - const char *fname) +void pgp_invoke_import (const char *fname) { char _fname[_POSIX_PATH_MAX + SHORT_STRING]; char cmd[HUGE_STRING]; - + struct pgp_command_context cctx; + + memset (&cctx, 0, sizeof (cctx)); + mutt_quote_filename (_fname, sizeof (_fname), fname); - - snprintf(cmd, sizeof(cmd), - "%s --passphrase-fd 0 --no-verbose --batch -o - " - "--decrypt %s", - NONULL(*pgp->binary), _fname); - - return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, - pgpinfd, pgpoutfd, pgperrfd); + cctx.fname = _fname; + + mutt_pgp_command (cmd, sizeof (cmd), &cctx, PgpImportCommand); + mutt_system (cmd); } -static char *gpg_digalg(void) +pid_t pgp_invoke_export (FILE **pgpin, FILE **pgpout, FILE **pgperr, + int pgpinfd, int pgpoutfd, int pgperrfd, + const char *uids) { - static char digalg[STRING]; - if(PgpSignMicalg && !mutt_strncasecmp(PgpSignMicalg, "pgp-", 4)) - strfcpy(digalg, PgpSignMicalg + 4, sizeof(digalg)); - else - { - /* We use md5 here as the default value as it's the good - * old default value for PGP and will be used in the - * message's headers. - */ - - strcpy(digalg, "md5"); - } - return digalg; + return pgp_invoke (pgpin, pgpout, pgperr, pgpinfd, pgpoutfd, pgperrfd, + 0, NULL, NULL, NULL, uids, + PgpExportCommand); } -pid_t pgp_gpg_invoke_sign(struct pgp_vinfo *pgp, - FILE **pgpin, FILE **pgpout, FILE **pgperr, - int pgpinfd, int pgpoutfd, int pgperrfd, - const char *fname) +pid_t pgp_invoke_verify_key (FILE **pgpin, FILE **pgpout, FILE **pgperr, + int pgpinfd, int pgpoutfd, int pgperrfd, + const char *uids) { - char cmd[HUGE_STRING]; - - char _fname[_POSIX_PATH_MAX + SHORT_STRING]; - - mutt_quote_filename (_fname, sizeof (_fname), fname); - - snprintf(cmd, sizeof(cmd), - "%s --no-verbose --batch -o - " - "--passphrase-fd 0 --digest-algo %s " - "--detach-sign --textmode --armor %s%s %s", - NONULL(*pgp->binary), - gpg_digalg(), - PgpSignAs? "-u " : "", - PgpSignAs? PgpSignAs : "", _fname); - - return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, - pgpinfd, pgpoutfd, pgperrfd); + return pgp_invoke (pgpin, pgpout, pgperr, pgpinfd, pgpoutfd, pgperrfd, + 0, NULL, NULL, NULL, uids, + PgpVerifyKeyCommand); } -pid_t pgp_gpg_invoke_encrypt(struct pgp_vinfo *pgp, - FILE **pgpin, FILE **pgpout, FILE **pgperr, - int pgpinfd, int pgpoutfd, int pgperrfd, - const char *fname, const char *uids, int sign) +pid_t pgp_invoke_list_keys (FILE **pgpin, FILE **pgpout, FILE **pgperr, + int pgpinfd, int pgpoutfd, int pgperrfd, + pgp_ring_t keyring, LIST *hints) { - char cmd[HUGE_STRING]; - char tmpcmd[HUGE_STRING]; - char *cp; - char *keylist; - char _fname[_POSIX_PATH_MAX + SHORT_STRING]; - - mutt_quote_filename (_fname, sizeof (_fname), fname); - - snprintf(cmd, sizeof(cmd), - "%s%s --no-verbose -v --batch -o - " - "--digest-algo %s " - "--encrypt%s --textmode --armor --always-trust %s%s", - NONULL(*pgp->binary), - sign? " --passphrase-fd 0":"", - gpg_digalg(), - sign? " --sign":"", - PgpSignAs? "-u " : "", - PgpSignAs? PgpSignAs : "" ); + char uids[HUGE_STRING]; + char tmpuids[HUGE_STRING]; - keylist = safe_strdup(uids); - for(cp = strtok(keylist, " "); cp ; cp = strtok(NULL, " ")) + *uids = '\0'; + + for (; hints; hints = hints->next) { - snprintf(tmpcmd, sizeof(tmpcmd), "%s -r %s", - cmd, cp); - strcpy(cmd, tmpcmd); + snprintf (tmpuids, sizeof (tmpuids), "%s %s", uids, (char *) hints->data); + strcpy (uids, tmpuids); } - safe_free((void **) &keylist); - - snprintf(tmpcmd, sizeof(tmpcmd), "%s %s", cmd, _fname); - strcpy(cmd, tmpcmd); - return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, - pgpinfd, pgpoutfd, pgperrfd); -} - -void pgp_gpg_invoke_import(struct pgp_vinfo *pgp, const char *fname) -{ - char cmd[HUGE_STRING]; - char _fname[_POSIX_PATH_MAX + SHORT_STRING]; - - mutt_quote_filename (_fname, sizeof (_fname), fname); - - snprintf(cmd, sizeof(cmd), "%sm --no-verbose --import -v %s", - NONULL(*pgp->binary), _fname); - - mutt_system(cmd); -} - -pid_t pgp_gpg_invoke_export(struct pgp_vinfo *pgp, - FILE **pgpin, FILE **pgpout, FILE **pgperr, - int pgpinfd, int pgpoutfd, int pgperrfd, const char *id) -{ - char cmd[HUGE_STRING]; - - snprintf(cmd, sizeof(cmd), "%sm --no-verbose --export --armor 0x%8s", - NONULL(*pgp->binary), id); - - return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, - pgpinfd, pgpoutfd, pgperrfd); -} - -pid_t pgp_gpg_invoke_verify_key(struct pgp_vinfo *pgp, - FILE **pgpin, FILE **pgpout, FILE **pgperr, - int pgpinfd, int pgpoutfd, int pgperrfd, const char *id) -{ - char cmd[HUGE_STRING]; - - snprintf(cmd, sizeof(cmd), - "%sm --no-verbose --batch --fingerprint --check-sigs %s%s", - NONULL(*pgp->binary), (mutt_strlen(id)==8 || mutt_strlen(id)==16)? "0x":"", id ); - - return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, - pgpinfd, pgpoutfd, pgperrfd); + return pgp_invoke (pgpin, pgpout, pgperr, pgpinfd, pgpoutfd, pgperrfd, + 0, NULL, NULL, NULL, uids, + keyring == PGP_SECRING ? PgpListSecringCommand : + PgpListPubringCommand); } |