2002-06-29 13:46:34 +00:00
|
|
|
/* g10.c - The GnuPG utility (main for gpg)
|
2004-01-22 03:47:05 +00:00
|
|
|
* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003
|
2005-01-20 11:42:03 +00:00
|
|
|
* 2004, 2005 Free Software Foundation, Inc.
|
1997-11-18 14:06:00 +00:00
|
|
|
*
|
1998-12-23 12:41:40 +00:00
|
|
|
* This file is part of GnuPG.
|
1997-11-18 14:06:00 +00:00
|
|
|
*
|
1998-12-23 12:41:40 +00:00
|
|
|
* GnuPG is free software; you can redistribute it and/or modify
|
1997-11-18 14:06:00 +00:00
|
|
|
* 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.
|
|
|
|
*
|
1998-12-23 12:41:40 +00:00
|
|
|
* GnuPG is distributed in the hope that it will be useful,
|
1997-11-18 14:06:00 +00:00
|
|
|
* 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <config.h>
|
1997-12-12 12:03:58 +00:00
|
|
|
#include <errno.h>
|
1997-11-18 14:06:00 +00:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
1998-01-16 21:15:24 +00:00
|
|
|
#include <string.h>
|
1998-12-08 12:20:53 +00:00
|
|
|
#include <ctype.h>
|
1997-12-01 10:33:23 +00:00
|
|
|
#include <unistd.h>
|
2002-09-17 03:21:13 +00:00
|
|
|
#include <assert.h>
|
2000-07-28 16:19:07 +00:00
|
|
|
#ifdef HAVE_DOSISH_SYSTEM
|
* armor.c, g10.c, kbnode.c, misc.c, pkclist.c, sign.c, build-packet.c,
getkey.c, keydb.c, openfile.c, plaintext.c, status.c, gpgv.c, keygen.c,
options.h, sig-check.c, tdbio.h, encode.c, mainproc.c, parse-packet.c,
signal.c, textfilter.c: Edit all preprocessor instructions to remove
whitespace before the '#'. This is not required by C89, but there are some
compilers out there that don't like it.
2003-05-24 21:50:33 +00:00
|
|
|
#include <fcntl.h> /* for setmode() */
|
2000-07-28 16:19:07 +00:00
|
|
|
#endif
|
2002-08-07 15:53:15 +00:00
|
|
|
#ifdef HAVE_STAT
|
|
|
|
#include <sys/stat.h> /* for stat() */
|
|
|
|
#endif
|
2004-11-17 16:04:21 +00:00
|
|
|
#include <fcntl.h>
|
1997-11-18 14:06:00 +00:00
|
|
|
|
2002-06-29 13:46:34 +00:00
|
|
|
#define INCLUDED_BY_MAIN_MODULE 1
|
1997-11-18 14:06:00 +00:00
|
|
|
#include "packet.h"
|
|
|
|
#include "iobuf.h"
|
2002-06-29 13:46:34 +00:00
|
|
|
#include "memory.h"
|
1997-11-18 14:06:00 +00:00
|
|
|
#include "util.h"
|
|
|
|
#include "main.h"
|
|
|
|
#include "options.h"
|
|
|
|
#include "keydb.h"
|
1999-03-11 15:42:06 +00:00
|
|
|
#include "trustdb.h"
|
2002-06-29 13:46:34 +00:00
|
|
|
#include "mpi.h"
|
|
|
|
#include "cipher.h"
|
1997-11-21 14:53:57 +00:00
|
|
|
#include "filter.h"
|
1998-01-16 21:15:24 +00:00
|
|
|
#include "ttyio.h"
|
1998-01-26 22:09:01 +00:00
|
|
|
#include "i18n.h"
|
1998-01-30 16:23:16 +00:00
|
|
|
#include "status.h"
|
2002-06-29 13:46:34 +00:00
|
|
|
#include "g10defs.h"
|
|
|
|
#include "keyserver-internal.h"
|
2002-07-03 04:01:21 +00:00
|
|
|
#include "exec.h"
|
2003-10-08 15:21:20 +00:00
|
|
|
#include "cardglue.h"
|
2004-09-15 15:26:38 +00:00
|
|
|
#ifdef ENABLE_CARD_SUPPORT
|
|
|
|
#include "ccid-driver.h"
|
|
|
|
#endif
|
|
|
|
|
2004-11-17 16:04:21 +00:00
|
|
|
#if defined(HAVE_DOSISH_SYSTEM) || defined(__CYGWIN__)
|
|
|
|
#define MY_O_BINARY O_BINARY
|
2004-11-18 16:01:08 +00:00
|
|
|
#ifndef S_IRGRP
|
|
|
|
# define S_IRGRP 0
|
|
|
|
# define S_IWGRP 0
|
|
|
|
#endif
|
2004-11-17 16:04:21 +00:00
|
|
|
#else
|
|
|
|
#define MY_O_BINARY 0
|
|
|
|
#endif
|
|
|
|
|
2004-09-15 15:26:38 +00:00
|
|
|
|
2003-10-01 15:15:58 +00:00
|
|
|
enum cmd_and_opt_values
|
|
|
|
{
|
|
|
|
aNull = 0,
|
1998-08-11 17:29:34 +00:00
|
|
|
oArmor = 'a',
|
|
|
|
aDetachedSign = 'b',
|
|
|
|
aSym = 'c',
|
|
|
|
aDecrypt = 'd',
|
|
|
|
aEncr = 'e',
|
1999-05-19 14:12:26 +00:00
|
|
|
oInteractive = 'i',
|
1998-08-11 17:29:34 +00:00
|
|
|
oKOption = 'k',
|
|
|
|
oDryRun = 'n',
|
|
|
|
oOutput = 'o',
|
1998-10-25 19:00:01 +00:00
|
|
|
oQuiet = 'q',
|
1999-01-24 17:16:40 +00:00
|
|
|
oRecipient = 'r',
|
2002-11-01 16:15:45 +00:00
|
|
|
oHiddenRecipient = 'R',
|
1998-08-11 17:29:34 +00:00
|
|
|
aSign = 's',
|
1998-11-03 19:38:58 +00:00
|
|
|
oTextmodeShort= 't',
|
1998-08-11 17:29:34 +00:00
|
|
|
oUser = 'u',
|
|
|
|
oVerbose = 'v',
|
|
|
|
oCompress = 'z',
|
2003-06-05 02:06:12 +00:00
|
|
|
oSetNotation = 'N',
|
2004-09-20 18:38:39 +00:00
|
|
|
aListSecretKeys = 'K',
|
1998-08-11 17:29:34 +00:00
|
|
|
oBatch = 500,
|
2004-02-18 23:09:27 +00:00
|
|
|
oMaxOutput,
|
2002-06-29 13:46:34 +00:00
|
|
|
oSigNotation,
|
|
|
|
oCertNotation,
|
|
|
|
oShowNotation,
|
|
|
|
oNoShowNotation,
|
2003-09-12 03:29:00 +00:00
|
|
|
aEncrFiles,
|
2003-10-26 03:26:14 +00:00
|
|
|
aEncrSym,
|
|
|
|
aDecryptFiles,
|
1998-09-11 05:47:32 +00:00
|
|
|
aClearsign,
|
1998-08-11 17:29:34 +00:00
|
|
|
aStore,
|
|
|
|
aKeygen,
|
|
|
|
aSignEncr,
|
2003-11-13 02:54:12 +00:00
|
|
|
aSignEncrSym,
|
2002-06-29 13:46:34 +00:00
|
|
|
aSignSym,
|
1998-08-11 17:29:34 +00:00
|
|
|
aSignKey,
|
1999-07-12 16:49:22 +00:00
|
|
|
aLSignKey,
|
2004-01-22 03:47:05 +00:00
|
|
|
aListConfig,
|
2004-05-20 17:06:34 +00:00
|
|
|
aGPGConfList,
|
1998-08-11 17:29:34 +00:00
|
|
|
aListPackets,
|
|
|
|
aEditKey,
|
2002-06-29 13:46:34 +00:00
|
|
|
aDeleteKeys,
|
|
|
|
aDeleteSecretKeys,
|
|
|
|
aDeleteSecretAndPublicKeys,
|
1998-08-11 17:29:34 +00:00
|
|
|
aKMode,
|
|
|
|
aKModeC,
|
|
|
|
aImport,
|
1998-10-25 19:00:01 +00:00
|
|
|
aFastImport,
|
1998-08-11 17:29:34 +00:00
|
|
|
aVerify,
|
2000-07-14 17:34:53 +00:00
|
|
|
aVerifyFiles,
|
1998-08-11 17:29:34 +00:00
|
|
|
aListKeys,
|
|
|
|
aListSigs,
|
1999-01-19 18:37:41 +00:00
|
|
|
aSendKeys,
|
1999-03-20 10:53:39 +00:00
|
|
|
aRecvKeys,
|
2002-06-29 13:46:34 +00:00
|
|
|
aSearchKeys,
|
1998-08-11 17:29:34 +00:00
|
|
|
aExport,
|
|
|
|
aExportSecret,
|
2000-07-14 17:34:53 +00:00
|
|
|
aExportSecretSub,
|
1998-08-11 17:29:34 +00:00
|
|
|
aCheckKeys,
|
|
|
|
aGenRevoke,
|
2002-06-29 13:46:34 +00:00
|
|
|
aDesigRevoke,
|
1998-08-11 17:29:34 +00:00
|
|
|
aPrimegen,
|
|
|
|
aPrintMD,
|
|
|
|
aPrintMDs,
|
|
|
|
aCheckTrustDB,
|
1998-10-16 16:00:17 +00:00
|
|
|
aUpdateTrustDB,
|
1998-10-07 13:30:43 +00:00
|
|
|
aFixTrustDB,
|
1998-08-11 17:29:34 +00:00
|
|
|
aListTrustDB,
|
|
|
|
aListTrustPath,
|
|
|
|
aExportOwnerTrust,
|
2003-03-24 20:05:53 +00:00
|
|
|
aListOwnerTrust,
|
1998-08-11 17:29:34 +00:00
|
|
|
aImportOwnerTrust,
|
|
|
|
aDeArmor,
|
|
|
|
aEnArmor,
|
|
|
|
aGenRandom,
|
2002-06-29 13:46:34 +00:00
|
|
|
aPipeMode,
|
|
|
|
aRebuildKeydbCaches,
|
|
|
|
aRefreshKeys,
|
2003-09-28 13:41:58 +00:00
|
|
|
aCardStatus,
|
|
|
|
aCardEdit,
|
|
|
|
aChangePIN,
|
1998-09-11 05:47:32 +00:00
|
|
|
|
1998-11-03 19:38:58 +00:00
|
|
|
oTextmode,
|
* g10.c (main): Add --no-textmode.
* export.c (do_export_stream), keyedit.c (show_key_with_all_names,
menu_addrevoker), mainproc.c (check_sig_and_print), photoid.c
(show_photos), sign.c (mk_notation_and_policy), trustdb.c (get_validity,
reset_trust_records, validate_keys): Make some strings translatable.
* mainproc.c (check_sig_and_print): Show digest algorithm and sig class
when verifying a sig with --verbose on, and add version, pk and hash
algorithms and sig class to VALIDSIG.
* parse-packet.c (enum_sig_subpkt): Make a warning message a --verbose
warning message since we don't need to warn every time we see an unknown
critical (we only need to invalidate the signature).
* trustdb.c (init_trustdb): Check the trustdb options even with TM_AUTO
since the auto may become TM_CLASSIC or TM_OPENPGP.
2003-04-27 20:22:09 +00:00
|
|
|
oNoTextmode,
|
2002-06-29 13:46:34 +00:00
|
|
|
oExpert,
|
|
|
|
oNoExpert,
|
|
|
|
oAskSigExpire,
|
|
|
|
oNoAskSigExpire,
|
|
|
|
oAskCertExpire,
|
|
|
|
oNoAskCertExpire,
|
2004-02-24 23:37:18 +00:00
|
|
|
oAskCertLevel,
|
|
|
|
oNoAskCertLevel,
|
1998-09-11 05:47:32 +00:00
|
|
|
oFingerprint,
|
1999-07-08 14:24:35 +00:00
|
|
|
oWithFingerprint,
|
1998-09-11 05:47:32 +00:00
|
|
|
oAnswerYes,
|
|
|
|
oAnswerNo,
|
2004-02-24 23:37:18 +00:00
|
|
|
oDefCertLevel,
|
|
|
|
oMinCertLevel,
|
1998-09-11 05:47:32 +00:00
|
|
|
oKeyring,
|
2002-11-25 03:18:48 +00:00
|
|
|
oPrimaryKeyring,
|
1998-09-11 05:47:32 +00:00
|
|
|
oSecretKeyring,
|
2002-06-29 13:46:34 +00:00
|
|
|
oShowKeyring,
|
1998-09-11 05:47:32 +00:00
|
|
|
oDefaultKey,
|
1999-07-13 15:41:14 +00:00
|
|
|
oDefRecipient,
|
|
|
|
oDefRecipientSelf,
|
|
|
|
oNoDefRecipient,
|
1998-09-11 05:47:32 +00:00
|
|
|
oOptions,
|
|
|
|
oDebug,
|
|
|
|
oDebugAll,
|
2004-09-15 15:26:38 +00:00
|
|
|
oDebugCCIDDriver,
|
1998-09-11 05:47:32 +00:00
|
|
|
oStatusFD,
|
2002-06-29 13:46:34 +00:00
|
|
|
oStatusFile,
|
|
|
|
oAttributeFD,
|
|
|
|
oAttributeFile,
|
|
|
|
oSKComments,
|
|
|
|
oNoSKComments,
|
1999-06-15 12:31:07 +00:00
|
|
|
oEmitVersion,
|
2003-04-09 01:57:46 +00:00
|
|
|
oNoEmitVersion,
|
1998-09-11 05:47:32 +00:00
|
|
|
oCompletesNeeded,
|
|
|
|
oMarginalsNeeded,
|
1998-11-13 19:41:41 +00:00
|
|
|
oMaxCertDepth,
|
1998-09-11 05:47:32 +00:00
|
|
|
oLoadExtension,
|
* trustdb.h, trustdb.c (is_disabled), gpgv.c (is_disabled): Rename
is_disabled to cache_disabled_value, which now takes a pk and not just the
keyid. This is for speed since there is no need to re-fetch a key when we
already have that key handy. Cache the result of the check so we don't
need to hit the trustdb more than once.
* getkey.c (skip_disabled): New function to get a pk and call is_disabled
on it. (key_byname): Use it here.
* packet.h, getkey.c (skip_disabled), keylist.c (print_capabilities): New
"pk_is_disabled" macro to retrieve the cached disabled value if available,
and fill it in via cache_disabled_value if not available.
* trustdb.c (get_validity): Cache the disabled value since we have it
handy and it might be useful later.
* parse-packet.c (parse_key): Clear disabled flag when parsing a new key.
Just in case someone forgets to clear the whole key.
* getkey.c (merge_selfsigs_main): Add an "if all else fails" path for
setting a single user ID primary when there are multiple set primaries all
at the same second, or no primaries set and the most recent user IDs are
at the same second, or no signed user IDs at all. This is arbitrary, but
deterministic.
* exec.h, photoid.h: Add copyright message.
* keylist.c (list_keyblock_print): Don't dump attribs for
revoked/expired/etc uids for non-colon key listings. This is for
consistency with --show-photos.
* main.h, keylist.c (dump_attribs), mainproc.c (check_sig_and_print): Dump
attribs if --attrib-fd is set when verifying signatures.
* g10.c (main): New --gnupg option to disable the various --openpgp,
--pgpX, etc. options. This is the same as --no-XXXX for those options.
* revoke.c (ask_revocation_reason): Clear old reason if user elects to
repeat question. This is bug 153.
* keyedit.c (sign_uids): Show keyid of the key making the signature.
2003-05-21 16:42:22 +00:00
|
|
|
oGnuPG,
|
1998-09-11 05:47:32 +00:00
|
|
|
oRFC1991,
|
* parse-packet.c (parse_signature): No need to reserve 8 bytes for the
unhashed signature cache any longer.
* misc.c (pct_expando): Add two new expandos - signer's fingerprint (%g),
and signer's primary fingerprint (%p).
* Makefile.am: Include W32LIBS where appropriate.
* g10.c (main): Add --rfc2440 alias for --openpgp since in a few months,
they won't be the same thing.
* keyserver.c (parse_keyserver_uri): Accept "http" as an alias for "hkp",
since it is occasionally written that way. (keyserver_spawn): Use
ascii_isspace to avoid locale issues.
* keygen.c (ask_user_id): Make --allow-freeform-uid apply to the email
field as well as the name field, and allow mixing fields when it is set.
* options.skel: Use subkeys.pgp.net as the default keyserver.
* trustdb.c (validate_one_keyblock): Certifications on revoked or expired
uids do not count in the web of trust.
* signal.c (init_one_signal, pause_on_sigusr, do_block): Only use
sigprocmask() if we have sigset_t, and only use sigaction() if we have
struct sigaction. This is for Forte c89 on Solaris which seems to define
only the function call half of the two pairs by default.
(pause_on_sigusr): Typo. (do_block): If we can't use sigprocmask() and
sigset_t, try to get the number of signals from NSIG as well as MAXSIG,
and if we can't, fail with an explanation.
* signal.c, tdbio.c: Comment out the transaction code. It was not used in
this version, and was causing some build problems on quasi-posix platforms
(Solaris and Forte c89).
* keylist.c (list_keyblock_colon): Don't include validity values when
listing secret keys since they can be incorrect and/or misleading. This
is a temporary kludge, and will be handled properly in 1.9/2.0.
* mainproc.c (check_sig_and_print): Only show the "key available from"
preferred keyserver line if the key is not currently present.
* keyedit.c (sign_uids): Do not sign expired uids without --expert (same
behavior as revoked uids). Do not allow signing a user ID without a
self-signature. --expert overrides. Add additional prompt to the
signature level question. (menu_expire): When changing expiration dates,
don't replace selfsigs on revoked uids since this would effectively
unrevoke them. There is also no point in replacing expired selfsigs.
This is bug #181
* g10.c (add_notation_data): Make sure that only ascii is passed to
iscntrl. Noted by Christian Biere.
* getkey.c (classify_user_id2): Replaced isspace by spacep
* keygen.c (ask_user_id): Ditto. (get_parameter_algo): Ditto.
* keyedit.c (keyedit_menu): Ditto.
* tdbdump.c (import_ownertrust): Ditto. s/isxdigit/hexdigitp/.
* revoke.c (ask_revocation_reason):
* keyserver.c (keyserver_spawn): Dito.
2003-07-10 14:30:07 +00:00
|
|
|
oRFC2440,
|
1999-06-15 12:31:07 +00:00
|
|
|
oOpenPGP,
|
2002-06-29 13:46:34 +00:00
|
|
|
oPGP2,
|
|
|
|
oPGP6,
|
|
|
|
oPGP7,
|
2002-12-03 23:31:48 +00:00
|
|
|
oPGP8,
|
2004-12-20 05:19:09 +00:00
|
|
|
oRFC2440Text,
|
|
|
|
oNoRFC2440Text,
|
1998-09-11 05:47:32 +00:00
|
|
|
oCipherAlgo,
|
|
|
|
oDigestAlgo,
|
2002-06-29 13:46:34 +00:00
|
|
|
oCertDigestAlgo,
|
1998-09-11 05:47:32 +00:00
|
|
|
oCompressAlgo,
|
2003-11-15 22:31:58 +00:00
|
|
|
oCompressLevel,
|
|
|
|
oBZ2CompressLevel,
|
2004-03-25 22:43:51 +00:00
|
|
|
oBZ2DecompressLowmem,
|
1998-09-11 05:47:32 +00:00
|
|
|
oPasswdFD,
|
2002-06-29 13:46:34 +00:00
|
|
|
oPasswdFile,
|
2000-07-14 17:34:53 +00:00
|
|
|
oCommandFD,
|
2002-06-29 13:46:34 +00:00
|
|
|
oCommandFile,
|
|
|
|
oQuickRandom,
|
1998-09-11 05:47:32 +00:00
|
|
|
oNoVerbose,
|
|
|
|
oTrustDBName,
|
|
|
|
oNoSecmemWarn,
|
2004-12-16 05:16:09 +00:00
|
|
|
oRequireSecmem,
|
|
|
|
oNoRequireSecmem,
|
2002-06-29 13:46:34 +00:00
|
|
|
oNoPermissionWarn,
|
2002-07-30 16:48:21 +00:00
|
|
|
oNoMDCWarn,
|
1998-09-11 05:47:32 +00:00
|
|
|
oNoArmor,
|
|
|
|
oNoDefKeyring,
|
|
|
|
oNoGreeting,
|
1999-06-15 12:31:07 +00:00
|
|
|
oNoTTY,
|
1998-09-11 05:47:32 +00:00
|
|
|
oNoOptions,
|
|
|
|
oNoBatch,
|
|
|
|
oHomedir,
|
|
|
|
oWithColons,
|
1999-06-08 11:41:46 +00:00
|
|
|
oWithKeyData,
|
1998-09-11 05:47:32 +00:00
|
|
|
oSkipVerify,
|
|
|
|
oCompressKeys,
|
|
|
|
oCompressSigs,
|
|
|
|
oAlwaysTrust,
|
2002-11-03 20:18:56 +00:00
|
|
|
oTrustModel,
|
2002-11-07 04:37:27 +00:00
|
|
|
oForceOwnertrust,
|
1998-09-11 05:47:32 +00:00
|
|
|
oRunAsShmCP,
|
|
|
|
oSetFilename,
|
2002-06-29 13:46:34 +00:00
|
|
|
oForYourEyesOnly,
|
|
|
|
oNoForYourEyesOnly,
|
1999-05-26 12:41:46 +00:00
|
|
|
oSetPolicyURL,
|
2002-06-29 13:46:34 +00:00
|
|
|
oSigPolicyURL,
|
|
|
|
oCertPolicyURL,
|
|
|
|
oShowPolicyURL,
|
|
|
|
oNoShowPolicyURL,
|
2003-07-24 19:28:12 +00:00
|
|
|
oSigKeyserverURL,
|
1999-06-01 14:08:57 +00:00
|
|
|
oUseEmbeddedFilename,
|
2004-04-16 16:31:19 +00:00
|
|
|
oNoUseEmbeddedFilename,
|
1998-09-11 05:47:32 +00:00
|
|
|
oComment,
|
1999-06-15 12:31:07 +00:00
|
|
|
oDefaultComment,
|
2003-09-23 03:52:55 +00:00
|
|
|
oNoComments,
|
2004-08-08 13:28:04 +00:00
|
|
|
oThrowKeyids,
|
|
|
|
oNoThrowKeyids,
|
2002-06-29 13:46:34 +00:00
|
|
|
oShowPhotos,
|
|
|
|
oNoShowPhotos,
|
|
|
|
oPhotoViewer,
|
1998-10-18 15:21:22 +00:00
|
|
|
oForceV3Sigs,
|
2002-06-29 13:46:34 +00:00
|
|
|
oNoForceV3Sigs,
|
|
|
|
oForceV4Certs,
|
|
|
|
oNoForceV4Certs,
|
1999-04-26 15:53:01 +00:00
|
|
|
oForceMDC,
|
2002-06-29 13:46:34 +00:00
|
|
|
oNoForceMDC,
|
|
|
|
oDisableMDC,
|
|
|
|
oNoDisableMDC,
|
1998-09-28 19:25:31 +00:00
|
|
|
oS2KMode,
|
|
|
|
oS2KDigest,
|
|
|
|
oS2KCipher,
|
2002-06-29 13:46:34 +00:00
|
|
|
oSimpleSKChecksum,
|
2004-07-15 21:00:35 +00:00
|
|
|
oDisplayCharset,
|
1998-11-20 17:42:18 +00:00
|
|
|
oNotDashEscaped,
|
1998-12-17 17:36:05 +00:00
|
|
|
oEscapeFrom,
|
2002-06-29 13:46:34 +00:00
|
|
|
oNoEscapeFrom,
|
1998-11-27 20:40:56 +00:00
|
|
|
oLockOnce,
|
1999-06-15 12:31:07 +00:00
|
|
|
oLockMultiple,
|
2000-07-14 17:34:53 +00:00
|
|
|
oLockNever,
|
1999-01-16 08:29:29 +00:00
|
|
|
oKeyServer,
|
2002-06-29 13:46:34 +00:00
|
|
|
oKeyServerOptions,
|
2002-07-22 22:26:14 +00:00
|
|
|
oImportOptions,
|
* options.h, main.h, export.c (parse_export_options, do_export_stream),
g10.c (main): add new --export-options option. Current flags are
"include-non-rfc", "include-local-sigs", "include-attributes", and
"include-sensitive-revkeys".
* options.h, hkp.c (hkp_export), keyserver.c (parse_keyserver_options,
keyserver_spawn): try passing unknown keyserver options to export options,
and if successful, use them when doing a keyserver --send-key.
* build-packet.c (build_sig_subpkt): We do not generate
SIGSUBPKT_PRIV_VERIFY_CACHE anymore.
2002-07-22 19:07:21 +00:00
|
|
|
oExportOptions,
|
* mainproc.c (check_sig_and_print), main.h, keylist.c (show_policy,
show_notation): Collapse the old print_notation_data into show_policy()
and show_notation() so there is only one function to print notations and
policy URLs.
* options.h, main.h, g10.c (main), keyedit.c (print_and_check_one_sig),
keylist.c (list_one, list_keyblock_print), pkclist.c (do_edit_ownertrust),
sign.c (mk_notation_and_policy): New "list-options" and "verify-options"
commands. These replace the existing --show-photos/--no-show-photos,
--show-notation/--no-show-notation,
--show-policy-url/--no-show-policy-url, and --show-keyring options. The
new method is more flexible since a user can specify (for example) showing
photos during sig verification, but not in key listings. The old options
are emulated.
2003-05-31 23:23:19 +00:00
|
|
|
oListOptions,
|
|
|
|
oVerifyOptions,
|
2002-06-29 13:46:34 +00:00
|
|
|
oTempDir,
|
|
|
|
oExecPath,
|
1999-02-16 13:16:33 +00:00
|
|
|
oEncryptTo,
|
2002-11-01 16:15:45 +00:00
|
|
|
oHiddenEncryptTo,
|
1999-02-19 14:54:00 +00:00
|
|
|
oNoEncryptTo,
|
1999-05-22 20:54:54 +00:00
|
|
|
oLoggerFD,
|
2002-06-29 13:46:34 +00:00
|
|
|
oLoggerFile,
|
1999-07-01 10:53:35 +00:00
|
|
|
oUtf8Strings,
|
|
|
|
oNoUtf8Strings,
|
1999-07-15 08:16:46 +00:00
|
|
|
oDisableCipherAlgo,
|
|
|
|
oDisablePubkeyAlgo,
|
1999-07-22 18:11:55 +00:00
|
|
|
oAllowNonSelfsignedUID,
|
2002-06-29 13:46:34 +00:00
|
|
|
oNoAllowNonSelfsignedUID,
|
2000-09-18 14:35:34 +00:00
|
|
|
oAllowFreeformUID,
|
2002-06-29 13:46:34 +00:00
|
|
|
oNoAllowFreeformUID,
|
|
|
|
oAllowSecretKeyImport,
|
|
|
|
oEnableSpecialFilenames,
|
1999-07-26 07:44:46 +00:00
|
|
|
oNoLiteral,
|
|
|
|
oSetFilesize,
|
2000-07-14 17:34:53 +00:00
|
|
|
oHonorHttpProxy,
|
|
|
|
oFastListMode,
|
|
|
|
oListOnly,
|
|
|
|
oIgnoreTimeConflict,
|
2002-08-06 17:38:04 +00:00
|
|
|
oIgnoreValidFrom,
|
|
|
|
oIgnoreCrcError,
|
2002-08-06 17:57:53 +00:00
|
|
|
oIgnoreMDCError,
|
2002-06-29 13:46:34 +00:00
|
|
|
oShowSessionKey,
|
|
|
|
oOverrideSessionKey,
|
2000-07-14 17:34:53 +00:00
|
|
|
oNoRandomSeedFile,
|
2002-06-29 13:46:34 +00:00
|
|
|
oAutoKeyRetrieve,
|
2000-07-14 17:34:53 +00:00
|
|
|
oNoAutoKeyRetrieve,
|
2000-08-21 15:54:37 +00:00
|
|
|
oUseAgent,
|
2002-06-29 13:46:34 +00:00
|
|
|
oNoUseAgent,
|
|
|
|
oGpgAgentInfo,
|
2000-09-18 14:35:34 +00:00
|
|
|
oMergeOnly,
|
|
|
|
oTryAllSecrets,
|
|
|
|
oTrustedKey,
|
2002-06-29 13:46:34 +00:00
|
|
|
oNoExpensiveTrustChecks,
|
|
|
|
oFixedListMode,
|
|
|
|
oNoSigCache,
|
|
|
|
oNoSigCreateCheck,
|
|
|
|
oAutoCheckTrustDB,
|
|
|
|
oNoAutoCheckTrustDB,
|
|
|
|
oPreservePermissions,
|
|
|
|
oDefaultPreferenceList,
|
|
|
|
oPersonalCipherPreferences,
|
|
|
|
oPersonalDigestPreferences,
|
|
|
|
oPersonalCompressPreferences,
|
|
|
|
oDisplay,
|
|
|
|
oTTYname,
|
|
|
|
oTTYtype,
|
|
|
|
oLCctype,
|
|
|
|
oLCmessages,
|
|
|
|
oGroup,
|
2004-01-30 16:49:28 +00:00
|
|
|
oUnGroup,
|
2003-10-01 15:15:58 +00:00
|
|
|
oNoGroups,
|
2002-10-03 22:13:04 +00:00
|
|
|
oStrict,
|
|
|
|
oNoStrict,
|
2002-12-05 15:25:16 +00:00
|
|
|
oMangleDosFilenames,
|
|
|
|
oNoMangleDosFilenames,
|
2003-09-09 00:25:53 +00:00
|
|
|
oEnableProgressFilter,
|
|
|
|
oMultifile,
|
2004-03-03 05:47:51 +00:00
|
|
|
oKeyidFormat,
|
2003-09-28 13:41:58 +00:00
|
|
|
|
|
|
|
oReaderPort,
|
|
|
|
octapiDriver,
|
|
|
|
opcscDriver,
|
|
|
|
oDisableCCID,
|
|
|
|
|
2003-10-01 15:15:58 +00:00
|
|
|
aTest
|
|
|
|
};
|
1998-08-11 17:29:34 +00:00
|
|
|
|
|
|
|
|
1998-02-13 20:58:50 +00:00
|
|
|
static ARGPARSE_OPTS opts[] = {
|
|
|
|
|
1998-05-15 18:49:19 +00:00
|
|
|
{ 300, NULL, 0, N_("@Commands:\n ") },
|
1998-02-13 20:58:50 +00:00
|
|
|
|
1998-08-11 17:29:34 +00:00
|
|
|
{ aSign, "sign", 256, N_("|[file]|make a signature")},
|
2003-09-12 03:29:00 +00:00
|
|
|
{ aClearsign, "clearsign", 256, N_("|[file]|make a clear text signature")},
|
1998-08-11 17:29:34 +00:00
|
|
|
{ aDetachedSign, "detach-sign", 256, N_("make a detached signature")},
|
|
|
|
{ aEncr, "encrypt", 256, N_("encrypt data")},
|
2003-09-12 03:29:00 +00:00
|
|
|
{ aEncrFiles, "encrypt-files", 256, "@"},
|
1998-08-11 17:29:34 +00:00
|
|
|
{ aSym, "symmetric", 256, N_("encryption only with symmetric cipher")},
|
2003-09-12 03:29:00 +00:00
|
|
|
{ aStore, "store", 256, "@"},
|
1998-08-11 17:29:34 +00:00
|
|
|
{ aDecrypt, "decrypt", 256, N_("decrypt data (default)")},
|
2003-09-12 03:29:00 +00:00
|
|
|
{ aDecryptFiles, "decrypt-files", 256, "@"},
|
1998-09-11 05:47:32 +00:00
|
|
|
{ aVerify, "verify" , 256, N_("verify a signature")},
|
2000-07-14 17:34:53 +00:00
|
|
|
{ aVerifyFiles, "verify-files" , 256, "@" },
|
1998-09-11 05:47:32 +00:00
|
|
|
{ aListKeys, "list-keys", 256, N_("list keys")},
|
1999-04-07 18:58:34 +00:00
|
|
|
{ aListKeys, "list-public-keys", 256, "@" },
|
1998-09-11 05:47:32 +00:00
|
|
|
{ aListSigs, "list-sigs", 256, N_("list keys and signatures")},
|
2003-09-12 03:29:00 +00:00
|
|
|
{ aCheckKeys, "check-sigs",256, N_("list and check key signatures")},
|
1998-09-11 05:47:32 +00:00
|
|
|
{ oFingerprint, "fingerprint", 256, N_("list keys and fingerprints")},
|
|
|
|
{ aListSecretKeys, "list-secret-keys", 256, N_("list secret keys")},
|
1999-07-12 16:49:22 +00:00
|
|
|
{ aKeygen, "gen-key", 256, N_("generate a new key pair")},
|
2002-06-29 13:46:34 +00:00
|
|
|
{ aDeleteKeys,"delete-keys",256,N_("remove keys from the public keyring")},
|
|
|
|
{ aDeleteSecretKeys, "delete-secret-keys",256,
|
|
|
|
N_("remove keys from the secret keyring")},
|
1999-07-12 16:49:22 +00:00
|
|
|
{ aSignKey, "sign-key" ,256, N_("sign a key")},
|
|
|
|
{ aLSignKey, "lsign-key" ,256, N_("sign a key locally")},
|
|
|
|
{ aEditKey, "edit-key" ,256, N_("sign or edit a key")},
|
1998-09-11 05:47:32 +00:00
|
|
|
{ aGenRevoke, "gen-revoke",256, N_("generate a revocation certificate")},
|
2002-06-29 13:46:34 +00:00
|
|
|
{ aDesigRevoke, "desig-revoke",256, "@" },
|
1998-12-10 19:20:47 +00:00
|
|
|
{ aExport, "export" , 256, N_("export keys") },
|
1999-01-19 18:37:41 +00:00
|
|
|
{ aSendKeys, "send-keys" , 256, N_("export keys to a key server") },
|
1999-03-20 10:53:39 +00:00
|
|
|
{ aRecvKeys, "recv-keys" , 256, N_("import keys from a key server") },
|
2002-06-29 13:46:34 +00:00
|
|
|
{ aSearchKeys, "search-keys" , 256,
|
|
|
|
N_("search for keys on a key server") },
|
|
|
|
{ aRefreshKeys, "refresh-keys", 256,
|
|
|
|
N_("update all keys from a keyserver")},
|
1998-09-11 05:47:32 +00:00
|
|
|
{ aExportSecret, "export-secret-keys" , 256, "@" },
|
2000-07-14 17:34:53 +00:00
|
|
|
{ aExportSecretSub, "export-secret-subkeys" , 256, "@" },
|
1998-09-11 05:47:32 +00:00
|
|
|
{ aImport, "import", 256 , N_("import/merge keys")},
|
1998-10-25 19:00:01 +00:00
|
|
|
{ aFastImport, "fast-import", 256 , "@"},
|
2003-09-28 13:41:58 +00:00
|
|
|
#ifdef ENABLE_CARD_SUPPORT
|
|
|
|
{ aCardStatus, "card-status", 256, N_("print the card status")},
|
|
|
|
{ aCardEdit, "card-edit", 256, N_("change data on a card")},
|
|
|
|
{ aChangePIN, "change-pin", 256, N_("change a card's PIN")},
|
|
|
|
#endif
|
2004-01-22 03:47:05 +00:00
|
|
|
{ aListConfig, "list-config", 256, "@"},
|
2004-05-20 17:06:34 +00:00
|
|
|
{ aGPGConfList, "gpgconf-list", 256, "@" },
|
2003-09-12 03:29:00 +00:00
|
|
|
{ aListPackets, "list-packets",256, "@"},
|
|
|
|
{ aExportOwnerTrust, "export-ownertrust", 256, "@"},
|
|
|
|
{ aImportOwnerTrust, "import-ownertrust", 256, "@"},
|
1998-10-16 16:00:17 +00:00
|
|
|
{ aUpdateTrustDB,
|
1999-07-14 17:47:23 +00:00
|
|
|
"update-trustdb",0 , N_("update the trust database")},
|
2003-09-12 03:29:00 +00:00
|
|
|
{ aCheckTrustDB, "check-trustdb", 0, "@"},
|
|
|
|
{ aFixTrustDB, "fix-trustdb", 0, "@"},
|
|
|
|
{ aDeArmor, "dearmor", 256, "@"},
|
|
|
|
{ aDeArmor, "dearmour", 256, "@"},
|
|
|
|
{ aEnArmor, "enarmor", 256, "@"},
|
|
|
|
{ aEnArmor, "enarmour", 256, "@"},
|
1998-09-11 05:47:32 +00:00
|
|
|
{ aPrintMD, "print-md" , 256, N_("|algo [files]|print message digests")},
|
|
|
|
{ aPrimegen, "gen-prime" , 256, "@" },
|
|
|
|
{ aGenRandom, "gen-random" , 256, "@" },
|
1998-02-13 20:58:50 +00:00
|
|
|
|
1998-05-15 18:49:19 +00:00
|
|
|
{ 301, NULL, 0, N_("@\nOptions:\n ") },
|
1998-02-13 20:58:50 +00:00
|
|
|
|
1998-08-11 17:29:34 +00:00
|
|
|
{ oArmor, "armor", 0, N_("create ascii armored output")},
|
1999-09-17 10:58:20 +00:00
|
|
|
{ oArmor, "armour", 0, "@" },
|
1999-01-24 17:16:40 +00:00
|
|
|
{ oRecipient, "recipient", 2, N_("|NAME|encrypt for NAME")},
|
2002-11-01 16:15:45 +00:00
|
|
|
{ oHiddenRecipient, "hidden-recipient", 2, "@" },
|
1999-01-24 17:16:40 +00:00
|
|
|
{ oRecipient, "remote-user", 2, "@"}, /* old option name */
|
2003-09-12 03:29:00 +00:00
|
|
|
{ oDefRecipient, "default-recipient", 2, "@"},
|
|
|
|
{ oDefRecipientSelf, "default-recipient-self", 0, "@"},
|
1999-07-13 15:41:14 +00:00
|
|
|
{ oNoDefRecipient, "no-default-recipient", 0, "@" },
|
2002-06-29 13:46:34 +00:00
|
|
|
{ oTempDir, "temp-directory", 2, "@" },
|
|
|
|
{ oExecPath, "exec-path", 2, "@" },
|
1999-02-16 13:16:33 +00:00
|
|
|
{ oEncryptTo, "encrypt-to", 2, "@" },
|
2002-11-01 16:15:45 +00:00
|
|
|
{ oHiddenEncryptTo, "hidden-encrypt-to", 2, "@" },
|
1999-02-19 14:54:00 +00:00
|
|
|
{ oNoEncryptTo, "no-encrypt-to", 0, "@" },
|
1998-08-11 17:29:34 +00:00
|
|
|
{ oUser, "local-user",2, N_("use this user-id to sign or decrypt")},
|
2003-11-15 22:31:58 +00:00
|
|
|
{ oCompress, NULL, 1, N_("|N|set compress level N (0 disables)") },
|
|
|
|
{ oCompressLevel, "compress-level", 1, "@" },
|
2003-11-15 23:54:14 +00:00
|
|
|
{ oBZ2CompressLevel, "bzip2-compress-level", 1, "@" },
|
2004-03-25 22:43:51 +00:00
|
|
|
{ oBZ2DecompressLowmem, "bzip2-decompress-lowmem", 0, "@" },
|
1998-11-03 19:38:58 +00:00
|
|
|
{ oTextmodeShort, NULL, 0, "@"},
|
1998-08-11 17:29:34 +00:00
|
|
|
{ oTextmode, "textmode", 0, N_("use canonical text mode")},
|
* g10.c (main): Add --no-textmode.
* export.c (do_export_stream), keyedit.c (show_key_with_all_names,
menu_addrevoker), mainproc.c (check_sig_and_print), photoid.c
(show_photos), sign.c (mk_notation_and_policy), trustdb.c (get_validity,
reset_trust_records, validate_keys): Make some strings translatable.
* mainproc.c (check_sig_and_print): Show digest algorithm and sig class
when verifying a sig with --verbose on, and add version, pk and hash
algorithms and sig class to VALIDSIG.
* parse-packet.c (enum_sig_subpkt): Make a warning message a --verbose
warning message since we don't need to warn every time we see an unknown
critical (we only need to invalidate the signature).
* trustdb.c (init_trustdb): Check the trustdb options even with TM_AUTO
since the auto may become TM_CLASSIC or TM_OPENPGP.
2003-04-27 20:22:09 +00:00
|
|
|
{ oNoTextmode, "no-textmode", 0, "@"},
|
2002-06-29 13:46:34 +00:00
|
|
|
{ oExpert, "expert", 0, "@"},
|
|
|
|
{ oNoExpert, "no-expert", 0, "@"},
|
|
|
|
{ oAskSigExpire, "ask-sig-expire", 0, "@"},
|
|
|
|
{ oNoAskSigExpire, "no-ask-sig-expire", 0, "@"},
|
|
|
|
{ oAskCertExpire, "ask-cert-expire", 0, "@"},
|
|
|
|
{ oNoAskCertExpire, "no-ask-cert-expire", 0, "@"},
|
2004-02-24 23:37:18 +00:00
|
|
|
{ oAskCertLevel, "ask-cert-level", 0, "@"},
|
|
|
|
{ oNoAskCertLevel, "no-ask-cert-level", 0, "@"},
|
1998-08-11 17:29:34 +00:00
|
|
|
{ oOutput, "output", 2, N_("use as output file")},
|
2004-02-18 23:09:27 +00:00
|
|
|
{ oMaxOutput, "max-output", 16|4, "@" },
|
1998-08-11 17:29:34 +00:00
|
|
|
{ oVerbose, "verbose", 0, N_("verbose") },
|
2003-09-12 03:29:00 +00:00
|
|
|
{ oQuiet, "quiet", 0, "@"},
|
|
|
|
{ oNoTTY, "no-tty", 0, "@"},
|
|
|
|
{ oForceV3Sigs, "force-v3-sigs", 0, "@"},
|
|
|
|
{ oNoForceV3Sigs, "no-force-v3-sigs", 0, "@"},
|
|
|
|
{ oForceV4Certs, "force-v4-certs", 0, "@"},
|
|
|
|
{ oNoForceV4Certs, "no-force-v4-certs", 0, "@"},
|
|
|
|
{ oForceMDC, "force-mdc", 0, "@"},
|
2002-06-29 13:46:34 +00:00
|
|
|
{ oNoForceMDC, "no-force-mdc", 0, "@" },
|
2003-09-12 03:29:00 +00:00
|
|
|
{ oDisableMDC, "disable-mdc", 0, "@"},
|
2002-06-29 13:46:34 +00:00
|
|
|
{ oNoDisableMDC, "no-disable-mdc", 0, "@" },
|
1999-02-25 17:51:55 +00:00
|
|
|
{ oDryRun, "dry-run", 0, N_("do not make any changes") },
|
2002-08-18 17:24:21 +00:00
|
|
|
{ oInteractive, "interactive", 0, N_("prompt before overwriting") },
|
2003-09-12 03:29:00 +00:00
|
|
|
{ oUseAgent, "use-agent",0, "@"},
|
2002-06-29 13:46:34 +00:00
|
|
|
{ oNoUseAgent, "no-use-agent",0, "@"},
|
|
|
|
{ oGpgAgentInfo, "gpg-agent-info",2, "@"},
|
2003-09-12 03:29:00 +00:00
|
|
|
{ oBatch, "batch", 0, "@"},
|
|
|
|
{ oAnswerYes, "yes", 0, "@"},
|
|
|
|
{ oAnswerNo, "no", 0, "@"},
|
|
|
|
{ oKeyring, "keyring", 2, "@"},
|
2002-11-25 03:18:48 +00:00
|
|
|
{ oPrimaryKeyring, "primary-keyring",2, "@" },
|
2003-09-12 03:29:00 +00:00
|
|
|
{ oSecretKeyring, "secret-keyring", 2, "@"},
|
2003-08-24 23:01:26 +00:00
|
|
|
{ oShowKeyring, "show-keyring", 0, "@"},
|
2003-09-12 03:29:00 +00:00
|
|
|
{ oDefaultKey, "default-key", 2, "@"},
|
|
|
|
{ oKeyServer, "keyserver", 2, "@"},
|
2002-06-29 13:46:34 +00:00
|
|
|
{ oKeyServerOptions, "keyserver-options",2,"@"},
|
2002-07-22 22:26:14 +00:00
|
|
|
{ oImportOptions, "import-options",2,"@"},
|
* options.h, main.h, export.c (parse_export_options, do_export_stream),
g10.c (main): add new --export-options option. Current flags are
"include-non-rfc", "include-local-sigs", "include-attributes", and
"include-sensitive-revkeys".
* options.h, hkp.c (hkp_export), keyserver.c (parse_keyserver_options,
keyserver_spawn): try passing unknown keyserver options to export options,
and if successful, use them when doing a keyserver --send-key.
* build-packet.c (build_sig_subpkt): We do not generate
SIGSUBPKT_PRIV_VERIFY_CACHE anymore.
2002-07-22 19:07:21 +00:00
|
|
|
{ oExportOptions, "export-options",2,"@"},
|
* mainproc.c (check_sig_and_print), main.h, keylist.c (show_policy,
show_notation): Collapse the old print_notation_data into show_policy()
and show_notation() so there is only one function to print notations and
policy URLs.
* options.h, main.h, g10.c (main), keyedit.c (print_and_check_one_sig),
keylist.c (list_one, list_keyblock_print), pkclist.c (do_edit_ownertrust),
sign.c (mk_notation_and_policy): New "list-options" and "verify-options"
commands. These replace the existing --show-photos/--no-show-photos,
--show-notation/--no-show-notation,
--show-policy-url/--no-show-policy-url, and --show-keyring options. The
new method is more flexible since a user can specify (for example) showing
photos during sig verification, but not in key listings. The old options
are emulated.
2003-05-31 23:23:19 +00:00
|
|
|
{ oListOptions, "list-options",2,"@"},
|
2003-06-04 21:21:23 +00:00
|
|
|
{ oVerifyOptions, "verify-options",2,"@"},
|
2004-07-15 21:00:35 +00:00
|
|
|
{ oDisplayCharset, "display-charset", 2, "@"},
|
|
|
|
{ oDisplayCharset, "charset", 2, "@"},
|
2003-09-12 03:29:00 +00:00
|
|
|
{ oOptions, "options", 2, "@"},
|
2000-07-14 17:34:53 +00:00
|
|
|
{ oDebug, "debug" ,4|16, "@"},
|
|
|
|
{ oDebugAll, "debug-all" ,0, "@"},
|
2003-09-12 03:29:00 +00:00
|
|
|
{ oStatusFD, "status-fd" ,1, "@"},
|
|
|
|
{ oStatusFile, "status-file" ,2, "@"},
|
2002-06-29 13:46:34 +00:00
|
|
|
{ oAttributeFD, "attribute-fd" ,1, "@" },
|
|
|
|
{ oAttributeFile, "attribute-file" ,2, "@" },
|
|
|
|
{ oNoSKComments, "no-sk-comments", 0, "@"},
|
|
|
|
{ oSKComments, "sk-comments", 0, "@"},
|
2000-07-14 17:34:53 +00:00
|
|
|
{ oCompletesNeeded, "completes-needed", 1, "@"},
|
|
|
|
{ oMarginalsNeeded, "marginals-needed", 1, "@"},
|
1998-11-13 19:41:41 +00:00
|
|
|
{ oMaxCertDepth, "max-cert-depth", 1, "@" },
|
2003-09-12 03:29:00 +00:00
|
|
|
{ oTrustedKey, "trusted-key", 2, "@"},
|
|
|
|
{ oLoadExtension, "load-extension", 2, "@"},
|
* trustdb.h, trustdb.c (is_disabled), gpgv.c (is_disabled): Rename
is_disabled to cache_disabled_value, which now takes a pk and not just the
keyid. This is for speed since there is no need to re-fetch a key when we
already have that key handy. Cache the result of the check so we don't
need to hit the trustdb more than once.
* getkey.c (skip_disabled): New function to get a pk and call is_disabled
on it. (key_byname): Use it here.
* packet.h, getkey.c (skip_disabled), keylist.c (print_capabilities): New
"pk_is_disabled" macro to retrieve the cached disabled value if available,
and fill it in via cache_disabled_value if not available.
* trustdb.c (get_validity): Cache the disabled value since we have it
handy and it might be useful later.
* parse-packet.c (parse_key): Clear disabled flag when parsing a new key.
Just in case someone forgets to clear the whole key.
* getkey.c (merge_selfsigs_main): Add an "if all else fails" path for
setting a single user ID primary when there are multiple set primaries all
at the same second, or no primaries set and the most recent user IDs are
at the same second, or no signed user IDs at all. This is arbitrary, but
deterministic.
* exec.h, photoid.h: Add copyright message.
* keylist.c (list_keyblock_print): Don't dump attribs for
revoked/expired/etc uids for non-colon key listings. This is for
consistency with --show-photos.
* main.h, keylist.c (dump_attribs), mainproc.c (check_sig_and_print): Dump
attribs if --attrib-fd is set when verifying signatures.
* g10.c (main): New --gnupg option to disable the various --openpgp,
--pgpX, etc. options. This is the same as --no-XXXX for those options.
* revoke.c (ask_revocation_reason): Clear old reason if user elects to
repeat question. This is bug 153.
* keyedit.c (sign_uids): Show keyid of the key making the signature.
2003-05-21 16:42:22 +00:00
|
|
|
{ oGnuPG, "gnupg", 0, "@"},
|
|
|
|
{ oGnuPG, "no-pgp2", 0, "@"},
|
|
|
|
{ oGnuPG, "no-pgp6", 0, "@"},
|
|
|
|
{ oGnuPG, "no-pgp7", 0, "@"},
|
|
|
|
{ oGnuPG, "no-pgp8", 0, "@"},
|
2003-09-12 03:29:00 +00:00
|
|
|
{ oRFC1991, "rfc1991", 0, "@"},
|
* parse-packet.c (parse_signature): No need to reserve 8 bytes for the
unhashed signature cache any longer.
* misc.c (pct_expando): Add two new expandos - signer's fingerprint (%g),
and signer's primary fingerprint (%p).
* Makefile.am: Include W32LIBS where appropriate.
* g10.c (main): Add --rfc2440 alias for --openpgp since in a few months,
they won't be the same thing.
* keyserver.c (parse_keyserver_uri): Accept "http" as an alias for "hkp",
since it is occasionally written that way. (keyserver_spawn): Use
ascii_isspace to avoid locale issues.
* keygen.c (ask_user_id): Make --allow-freeform-uid apply to the email
field as well as the name field, and allow mixing fields when it is set.
* options.skel: Use subkeys.pgp.net as the default keyserver.
* trustdb.c (validate_one_keyblock): Certifications on revoked or expired
uids do not count in the web of trust.
* signal.c (init_one_signal, pause_on_sigusr, do_block): Only use
sigprocmask() if we have sigset_t, and only use sigaction() if we have
struct sigaction. This is for Forte c89 on Solaris which seems to define
only the function call half of the two pairs by default.
(pause_on_sigusr): Typo. (do_block): If we can't use sigprocmask() and
sigset_t, try to get the number of signals from NSIG as well as MAXSIG,
and if we can't, fail with an explanation.
* signal.c, tdbio.c: Comment out the transaction code. It was not used in
this version, and was causing some build problems on quasi-posix platforms
(Solaris and Forte c89).
* keylist.c (list_keyblock_colon): Don't include validity values when
listing secret keys since they can be incorrect and/or misleading. This
is a temporary kludge, and will be handled properly in 1.9/2.0.
* mainproc.c (check_sig_and_print): Only show the "key available from"
preferred keyserver line if the key is not currently present.
* keyedit.c (sign_uids): Do not sign expired uids without --expert (same
behavior as revoked uids). Do not allow signing a user ID without a
self-signature. --expert overrides. Add additional prompt to the
signature level question. (menu_expire): When changing expiration dates,
don't replace selfsigs on revoked uids since this would effectively
unrevoke them. There is also no point in replacing expired selfsigs.
This is bug #181
* g10.c (add_notation_data): Make sure that only ascii is passed to
iscntrl. Noted by Christian Biere.
* getkey.c (classify_user_id2): Replaced isspace by spacep
* keygen.c (ask_user_id): Ditto. (get_parameter_algo): Ditto.
* keyedit.c (keyedit_menu): Ditto.
* tdbdump.c (import_ownertrust): Ditto. s/isxdigit/hexdigitp/.
* revoke.c (ask_revocation_reason):
* keyserver.c (keyserver_spawn): Dito.
2003-07-10 14:30:07 +00:00
|
|
|
{ oRFC2440, "rfc2440", 0, "@" },
|
2003-09-12 03:29:00 +00:00
|
|
|
{ oOpenPGP, "openpgp", 0, N_("use strict OpenPGP behavior")},
|
|
|
|
{ oPGP2, "pgp2", 0, N_("generate PGP 2.x compatible messages")},
|
2002-06-29 13:46:34 +00:00
|
|
|
{ oPGP6, "pgp6", 0, "@"},
|
|
|
|
{ oPGP7, "pgp7", 0, "@"},
|
2002-12-03 23:31:48 +00:00
|
|
|
{ oPGP8, "pgp8", 0, "@"},
|
2004-12-20 05:19:09 +00:00
|
|
|
{ oRFC2440Text, "rfc2440-text", 0, "@"},
|
|
|
|
{ oNoRFC2440Text, "no-rfc2440-text", 0, "@"},
|
2003-09-12 03:29:00 +00:00
|
|
|
{ oS2KMode, "s2k-mode", 1, "@"},
|
|
|
|
{ oS2KDigest, "s2k-digest-algo", 2, "@"},
|
|
|
|
{ oS2KCipher, "s2k-cipher-algo", 2, "@"},
|
2002-06-29 13:46:34 +00:00
|
|
|
{ oSimpleSKChecksum, "simple-sk-checksum", 0, "@"},
|
2003-09-12 03:29:00 +00:00
|
|
|
{ oCipherAlgo, "cipher-algo", 2, "@"},
|
|
|
|
{ oDigestAlgo, "digest-algo", 2, "@"},
|
2002-06-29 13:46:34 +00:00
|
|
|
{ oCertDigestAlgo, "cert-digest-algo", 2 , "@" },
|
2003-09-12 03:29:00 +00:00
|
|
|
{ oCompressAlgo,"compress-algo", 2, "@"},
|
2004-12-15 05:16:53 +00:00
|
|
|
{ oCompressAlgo, "compression-algo", 2, "@"}, /* Alias */
|
2004-08-08 13:28:04 +00:00
|
|
|
{ oThrowKeyids, "throw-keyid", 0, "@"},
|
|
|
|
{ oThrowKeyids, "throw-keyids", 0, "@"},
|
|
|
|
{ oNoThrowKeyids, "no-throw-keyid", 0, "@" },
|
|
|
|
{ oNoThrowKeyids, "no-throw-keyids", 0, "@" },
|
* mainproc.c (check_sig_and_print), main.h, keylist.c (show_policy,
show_notation): Collapse the old print_notation_data into show_policy()
and show_notation() so there is only one function to print notations and
policy URLs.
* options.h, main.h, g10.c (main), keyedit.c (print_and_check_one_sig),
keylist.c (list_one, list_keyblock_print), pkclist.c (do_edit_ownertrust),
sign.c (mk_notation_and_policy): New "list-options" and "verify-options"
commands. These replace the existing --show-photos/--no-show-photos,
--show-notation/--no-show-notation,
--show-policy-url/--no-show-policy-url, and --show-keyring options. The
new method is more flexible since a user can specify (for example) showing
photos during sig verification, but not in key listings. The old options
are emulated.
2003-05-31 23:23:19 +00:00
|
|
|
{ oShowPhotos, "show-photos", 0, "@" },
|
|
|
|
{ oNoShowPhotos, "no-show-photos", 0, "@" },
|
|
|
|
{ oPhotoViewer, "photo-viewer", 2, "@" },
|
2003-06-05 02:06:12 +00:00
|
|
|
{ oSetNotation, "set-notation", 2, "@" },
|
|
|
|
{ oSetNotation, "notation-data", 2, "@" }, /* Alias */
|
|
|
|
{ oSigNotation, "sig-notation", 2, "@" },
|
|
|
|
{ oCertNotation, "cert-notation", 2, "@" },
|
1998-02-13 20:58:50 +00:00
|
|
|
|
2000-07-14 17:34:53 +00:00
|
|
|
{ 302, NULL, 0, N_(
|
|
|
|
"@\n(See the man page for a complete listing of all commands and options)\n"
|
|
|
|
)},
|
|
|
|
|
|
|
|
{ 303, NULL, 0, N_("@\nExamples:\n\n"
|
1998-02-13 20:58:50 +00:00
|
|
|
" -se -r Bob [file] sign and encrypt for user Bob\n"
|
1998-09-28 19:25:31 +00:00
|
|
|
" --clearsign [file] make a clear text signature\n"
|
|
|
|
" --detach-sign [file] make a detached signature\n"
|
|
|
|
" --list-keys [names] show keys\n"
|
|
|
|
" --fingerprint [names] show fingerprints\n" ) },
|
1998-02-13 20:58:50 +00:00
|
|
|
|
|
|
|
/* hidden options */
|
2003-03-24 20:05:53 +00:00
|
|
|
{ aListOwnerTrust, "list-ownertrust", 256, "@"}, /* deprecated */
|
1999-07-13 15:41:14 +00:00
|
|
|
{ aPrintMDs, "print-mds" , 256, "@"}, /* old */
|
1998-09-11 05:47:32 +00:00
|
|
|
{ aListTrustDB, "list-trustdb",0 , "@"},
|
2002-12-11 17:50:38 +00:00
|
|
|
/* Not yet used */
|
|
|
|
/* { aListTrustPath, "list-trust-path",0, "@"}, */
|
2002-06-29 13:46:34 +00:00
|
|
|
{ aPipeMode, "pipemode", 0, "@" },
|
1998-08-11 17:29:34 +00:00
|
|
|
{ oKOption, NULL, 0, "@"},
|
1998-09-11 05:47:32 +00:00
|
|
|
{ oPasswdFD, "passphrase-fd",1, "@" },
|
2002-06-29 13:46:34 +00:00
|
|
|
{ oPasswdFile, "passphrase-file",2, "@" },
|
2000-07-14 17:34:53 +00:00
|
|
|
{ oCommandFD, "command-fd",1, "@" },
|
2002-06-29 13:46:34 +00:00
|
|
|
{ oCommandFile, "command-file",2, "@" },
|
|
|
|
{ oQuickRandom, "quick-random", 0, "@"},
|
1998-09-11 05:47:32 +00:00
|
|
|
{ oNoVerbose, "no-verbose", 0, "@"},
|
|
|
|
{ oTrustDBName, "trustdb-name", 2, "@" },
|
2004-11-17 16:04:21 +00:00
|
|
|
{ oNoSecmemWarn, "no-secmem-warning", 0, "@" },
|
2004-12-16 05:16:09 +00:00
|
|
|
{ oRequireSecmem,"require-secmem", 0, "@" },
|
|
|
|
{ oNoRequireSecmem,"no-require-secmem", 0, "@" },
|
2002-06-29 13:46:34 +00:00
|
|
|
{ oNoPermissionWarn, "no-permission-warning", 0, "@" },
|
2002-07-30 16:48:21 +00:00
|
|
|
{ oNoMDCWarn, "no-mdc-warning", 0, "@" },
|
1998-09-11 05:47:32 +00:00
|
|
|
{ oNoArmor, "no-armor", 0, "@"},
|
1999-09-17 10:58:20 +00:00
|
|
|
{ oNoArmor, "no-armour", 0, "@"},
|
1998-09-11 05:47:32 +00:00
|
|
|
{ oNoDefKeyring, "no-default-keyring", 0, "@" },
|
|
|
|
{ oNoGreeting, "no-greeting", 0, "@" },
|
|
|
|
{ oNoOptions, "no-options", 0, "@" }, /* shortcut for --options /dev/null */
|
|
|
|
{ oHomedir, "homedir", 2, "@" }, /* defaults to "~/.gnupg" */
|
|
|
|
{ oNoBatch, "no-batch", 0, "@" },
|
|
|
|
{ oWithColons, "with-colons", 0, "@"},
|
1999-06-08 11:41:46 +00:00
|
|
|
{ oWithKeyData,"with-key-data", 0, "@"},
|
1998-09-11 05:47:32 +00:00
|
|
|
{ aListKeys, "list-key", 0, "@" }, /* alias */
|
|
|
|
{ aListSigs, "list-sig", 0, "@" }, /* alias */
|
|
|
|
{ aCheckKeys, "check-sig",0, "@" }, /* alias */
|
|
|
|
{ oSkipVerify, "skip-verify",0, "@" },
|
|
|
|
{ oCompressKeys, "compress-keys",0, "@"},
|
|
|
|
{ oCompressSigs, "compress-sigs",0, "@"},
|
2004-02-24 23:37:18 +00:00
|
|
|
{ oDefCertLevel, "default-cert-check-level", 1, "@"}, /* Old option */
|
|
|
|
{ oDefCertLevel, "default-cert-level", 1, "@"},
|
|
|
|
{ oMinCertLevel, "min-cert-level", 1, "@"},
|
1998-09-11 05:47:32 +00:00
|
|
|
{ oAlwaysTrust, "always-trust", 0, "@"},
|
2002-11-03 20:18:56 +00:00
|
|
|
{ oTrustModel, "trust-model", 2, "@"},
|
* tdbio.c (create_version_record): Only create new trustdbs with
TM_CLASSIC or TM_PGP.
* trustdb.h, trustdb.c (trust_string, get_ownertrust_string,
get_validity_string, ask_ownertrust, validate_keys), pkclist.c
(do_edit_ownertrust): Rename trust_string to trust_value_to_string for
naming consistency.
* trustdb.h, trustdb.c (string_to_trust_value): New function to translate
a string to a trust value.
* g10.c (main): Use string_to_trust_value here for --force-ownertrust.
* options.h, g10.c (main), trustdb.c (trust_model_string, init_trustdb,
check_trustdb, update_trustdb, get_validity, validate_one_keyblock): An
"OpenPGP" trust model is misleading since there is no official OpenPGP
trust model. Use "PGP" instead.
2003-05-01 21:37:08 +00:00
|
|
|
{ oForceOwnertrust, "force-ownertrust", 2, "@"},
|
1998-09-11 05:47:32 +00:00
|
|
|
{ oRunAsShmCP, "run-as-shm-coprocess", 4, "@" },
|
|
|
|
{ oSetFilename, "set-filename", 2, "@" },
|
2002-06-29 13:46:34 +00:00
|
|
|
{ oForYourEyesOnly, "for-your-eyes-only", 0, "@" },
|
|
|
|
{ oNoForYourEyesOnly, "no-for-your-eyes-only", 0, "@" },
|
1999-05-26 12:41:46 +00:00
|
|
|
{ oSetPolicyURL, "set-policy-url", 2, "@" },
|
2002-06-29 13:46:34 +00:00
|
|
|
{ oSigPolicyURL, "sig-policy-url", 2, "@" },
|
|
|
|
{ oCertPolicyURL, "cert-policy-url", 2, "@" },
|
|
|
|
{ oShowPolicyURL, "show-policy-url", 0, "@" },
|
|
|
|
{ oNoShowPolicyURL, "no-show-policy-url", 0, "@" },
|
2003-08-31 23:49:07 +00:00
|
|
|
{ oSigKeyserverURL, "sig-keyserver-url", 2, "@" },
|
2002-06-29 13:46:34 +00:00
|
|
|
{ oShowNotation, "show-notation", 0, "@" },
|
|
|
|
{ oNoShowNotation, "no-show-notation", 0, "@" },
|
1998-09-11 05:47:32 +00:00
|
|
|
{ oComment, "comment", 2, "@" },
|
1999-06-15 12:31:07 +00:00
|
|
|
{ oDefaultComment, "default-comment", 0, "@" },
|
2003-09-23 03:52:55 +00:00
|
|
|
{ oNoComments, "no-comments", 0, "@" },
|
1999-06-15 12:31:07 +00:00
|
|
|
{ oEmitVersion, "emit-version", 0, "@"},
|
2003-04-09 01:57:46 +00:00
|
|
|
{ oNoEmitVersion, "no-emit-version", 0, "@"},
|
|
|
|
{ oNoEmitVersion, "no-version", 0, "@"}, /* alias */
|
1998-11-20 17:42:18 +00:00
|
|
|
{ oNotDashEscaped, "not-dash-escaped", 0, "@" },
|
1998-12-17 17:36:05 +00:00
|
|
|
{ oEscapeFrom, "escape-from-lines", 0, "@" },
|
2002-06-29 13:46:34 +00:00
|
|
|
{ oNoEscapeFrom, "no-escape-from-lines", 0, "@" },
|
1998-11-27 20:40:56 +00:00
|
|
|
{ oLockOnce, "lock-once", 0, "@" },
|
1999-06-15 12:31:07 +00:00
|
|
|
{ oLockMultiple, "lock-multiple", 0, "@" },
|
2000-07-14 17:34:53 +00:00
|
|
|
{ oLockNever, "lock-never", 0, "@" },
|
1999-05-22 20:54:54 +00:00
|
|
|
{ oLoggerFD, "logger-fd",1, "@" },
|
2002-06-29 13:46:34 +00:00
|
|
|
{ oLoggerFile, "logger-file",2, "@" },
|
1999-06-01 14:08:57 +00:00
|
|
|
{ oUseEmbeddedFilename, "use-embedded-filename", 0, "@" },
|
2004-04-16 16:31:19 +00:00
|
|
|
{ oNoUseEmbeddedFilename, "no-use-embedded-filename", 0, "@" },
|
1999-07-01 10:53:35 +00:00
|
|
|
{ oUtf8Strings, "utf8-strings", 0, "@" },
|
|
|
|
{ oNoUtf8Strings, "no-utf8-strings", 0, "@" },
|
1999-07-08 14:24:35 +00:00
|
|
|
{ oWithFingerprint, "with-fingerprint", 0, "@" },
|
1999-07-15 08:16:46 +00:00
|
|
|
{ oDisableCipherAlgo, "disable-cipher-algo", 2, "@" },
|
|
|
|
{ oDisablePubkeyAlgo, "disable-pubkey-algo", 2, "@" },
|
1999-07-22 18:11:55 +00:00
|
|
|
{ oAllowNonSelfsignedUID, "allow-non-selfsigned-uid", 0, "@" },
|
2002-06-29 13:46:34 +00:00
|
|
|
{ oNoAllowNonSelfsignedUID, "no-allow-non-selfsigned-uid", 0, "@" },
|
2000-09-18 14:35:34 +00:00
|
|
|
{ oAllowFreeformUID, "allow-freeform-uid", 0, "@" },
|
2002-06-29 13:46:34 +00:00
|
|
|
{ oNoAllowFreeformUID, "no-allow-freeform-uid", 0, "@" },
|
1999-07-26 07:44:46 +00:00
|
|
|
{ oNoLiteral, "no-literal", 0, "@" },
|
|
|
|
{ oSetFilesize, "set-filesize", 20, "@" },
|
2000-07-14 17:34:53 +00:00
|
|
|
{ oHonorHttpProxy,"honor-http-proxy", 0, "@" },
|
|
|
|
{ oFastListMode,"fast-list-mode", 0, "@" },
|
2002-06-29 13:46:34 +00:00
|
|
|
{ oFixedListMode,"fixed-list-mode", 0, "@" },
|
2000-07-14 17:34:53 +00:00
|
|
|
{ oListOnly, "list-only", 0, "@"},
|
|
|
|
{ oIgnoreTimeConflict, "ignore-time-conflict", 0, "@" },
|
2002-06-29 13:46:34 +00:00
|
|
|
{ oIgnoreValidFrom, "ignore-valid-from", 0, "@" },
|
|
|
|
{ oIgnoreCrcError, "ignore-crc-error", 0,"@" },
|
2002-08-06 17:57:53 +00:00
|
|
|
{ oIgnoreMDCError, "ignore-mdc-error", 0,"@" },
|
2002-06-29 13:46:34 +00:00
|
|
|
{ oShowSessionKey, "show-session-key", 0, "@" },
|
|
|
|
{ oOverrideSessionKey, "override-session-key", 2, "@" },
|
2000-07-14 17:34:53 +00:00
|
|
|
{ oNoRandomSeedFile, "no-random-seed-file", 0, "@" },
|
2002-06-29 13:46:34 +00:00
|
|
|
{ oAutoKeyRetrieve, "auto-key-retrieve", 0, "@" },
|
2000-07-14 17:34:53 +00:00
|
|
|
{ oNoAutoKeyRetrieve, "no-auto-key-retrieve", 0, "@" },
|
2002-06-29 13:46:34 +00:00
|
|
|
{ oNoSigCache, "no-sig-cache", 0, "@" },
|
|
|
|
{ oNoSigCreateCheck, "no-sig-create-check", 0, "@" },
|
|
|
|
{ oAutoCheckTrustDB, "auto-check-trustdb", 0, "@"},
|
|
|
|
{ oNoAutoCheckTrustDB, "no-auto-check-trustdb", 0, "@"},
|
2000-09-18 14:35:34 +00:00
|
|
|
{ oMergeOnly, "merge-only", 0, "@" },
|
2002-06-29 13:46:34 +00:00
|
|
|
{ oAllowSecretKeyImport, "allow-secret-key-import", 0, "@" },
|
2000-09-18 14:35:34 +00:00
|
|
|
{ oTryAllSecrets, "try-all-secrets", 0, "@" },
|
2002-06-29 13:46:34 +00:00
|
|
|
{ oEnableSpecialFilenames, "enable-special-filenames", 0, "@" },
|
|
|
|
{ oNoExpensiveTrustChecks, "no-expensive-trust-checks", 0, "@" },
|
|
|
|
{ aDeleteSecretAndPublicKeys, "delete-secret-and-public-keys",256, "@" },
|
|
|
|
{ aRebuildKeydbCaches, "rebuild-keydb-caches", 256, "@"},
|
|
|
|
{ oPreservePermissions, "preserve-permissions", 0, "@"},
|
|
|
|
{ oDefaultPreferenceList, "default-preference-list", 2, "@"},
|
|
|
|
{ oPersonalCipherPreferences, "personal-cipher-preferences", 2, "@"},
|
|
|
|
{ oPersonalDigestPreferences, "personal-digest-preferences", 2, "@"},
|
|
|
|
{ oPersonalCompressPreferences, "personal-compress-preferences", 2, "@"},
|
2003-11-10 04:33:13 +00:00
|
|
|
/* Aliases. I constantly mistype these, and assume other people
|
|
|
|
do as well. */
|
|
|
|
{ oPersonalCipherPreferences, "personal-cipher-prefs", 2, "@"},
|
|
|
|
{ oPersonalDigestPreferences, "personal-digest-prefs", 2, "@"},
|
|
|
|
{ oPersonalCompressPreferences, "personal-compress-prefs", 2, "@"},
|
2002-06-29 13:46:34 +00:00
|
|
|
{ oDisplay, "display", 2, "@" },
|
|
|
|
{ oTTYname, "ttyname", 2, "@" },
|
|
|
|
{ oTTYtype, "ttytype", 2, "@" },
|
|
|
|
{ oLCctype, "lc-ctype", 2, "@" },
|
|
|
|
{ oLCmessages, "lc-messages", 2, "@" },
|
|
|
|
{ oGroup, "group", 2, "@" },
|
2004-01-30 16:49:28 +00:00
|
|
|
{ oUnGroup, "ungroup", 2, "@" },
|
2003-10-01 15:15:58 +00:00
|
|
|
{ oNoGroups, "no-groups", 0, "@" },
|
2002-10-03 22:13:04 +00:00
|
|
|
{ oStrict, "strict", 0, "@" },
|
|
|
|
{ oNoStrict, "no-strict", 0, "@" },
|
2002-12-05 15:25:16 +00:00
|
|
|
{ oMangleDosFilenames, "mangle-dos-filenames", 0, "@" },
|
|
|
|
{ oNoMangleDosFilenames, "no-mangle-dos-filenames", 0, "@" },
|
2003-04-15 15:46:13 +00:00
|
|
|
{ oEnableProgressFilter, "enable-progress-filter", 0, "@" },
|
2003-09-09 00:25:53 +00:00
|
|
|
{ oMultifile, "multifile", 0, "@" },
|
2004-03-03 05:47:51 +00:00
|
|
|
{ oKeyidFormat, "keyid-format", 2, "@" },
|
2003-09-28 13:41:58 +00:00
|
|
|
|
|
|
|
{ oReaderPort, "reader-port", 2, "@"},
|
|
|
|
{ octapiDriver, "ctapi-driver", 2, "@"},
|
|
|
|
{ opcscDriver, "pcsc-driver", 2, "@"},
|
2003-10-10 09:28:26 +00:00
|
|
|
{ oDisableCCID, "disable-ccid", 0, "@"},
|
2004-09-15 15:26:38 +00:00
|
|
|
#if defined(ENABLE_CARD_SUPPORT) && defined(HAVE_LIBUSB)
|
|
|
|
{ oDebugCCIDDriver, "debug-ccid-driver", 0, "@"},
|
|
|
|
#endif
|
2003-09-28 13:41:58 +00:00
|
|
|
|
2004-05-10 21:46:00 +00:00
|
|
|
{0,NULL,0,NULL}
|
|
|
|
};
|
1998-02-13 20:58:50 +00:00
|
|
|
|
2004-10-13 18:10:06 +00:00
|
|
|
|
|
|
|
#ifdef ENABLE_SELINUX_HACKS
|
|
|
|
#define ALWAYS_ADD_KEYRINGS 1
|
|
|
|
#else
|
|
|
|
#define ALWAYS_ADD_KEYRINGS 0
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
2002-06-29 13:46:34 +00:00
|
|
|
int g10_errors_seen = 0;
|
1998-11-10 12:59:59 +00:00
|
|
|
|
1999-07-01 10:53:35 +00:00
|
|
|
static int utf8_strings = 0;
|
1998-07-09 13:37:17 +00:00
|
|
|
static int maybe_setuid = 1;
|
1998-01-05 19:13:15 +00:00
|
|
|
|
2002-06-29 13:46:34 +00:00
|
|
|
static char *build_list( const char *text, char letter,
|
2000-07-14 17:34:53 +00:00
|
|
|
const char *(*mapf)(int), int (*chkf)(int) );
|
1998-08-11 17:29:34 +00:00
|
|
|
static void set_cmd( enum cmd_and_opt_values *ret_cmd,
|
|
|
|
enum cmd_and_opt_values new_cmd );
|
2002-06-29 13:46:34 +00:00
|
|
|
static void print_mds( const char *fname, int algo );
|
|
|
|
static void add_notation_data( const char *string, int which );
|
|
|
|
static void add_policy_url( const char *string, int which );
|
2003-07-24 19:28:12 +00:00
|
|
|
static void add_keyserver_url( const char *string, int which );
|
2000-07-14 17:34:53 +00:00
|
|
|
|
2002-06-29 13:46:34 +00:00
|
|
|
const char *
|
|
|
|
strusage( int level )
|
1997-11-18 14:06:00 +00:00
|
|
|
{
|
2002-06-29 13:46:34 +00:00
|
|
|
static char *digests, *pubkeys, *ciphers, *zips;
|
1997-11-18 14:06:00 +00:00
|
|
|
const char *p;
|
|
|
|
switch( level ) {
|
1999-04-18 08:18:52 +00:00
|
|
|
case 11: p = "gpg (GnuPG)";
|
1998-03-05 09:22:13 +00:00
|
|
|
break;
|
1998-02-16 20:05:02 +00:00
|
|
|
case 13: p = VERSION; break;
|
|
|
|
case 17: p = PRINTABLE_OS_NAME; break;
|
1998-03-05 09:22:13 +00:00
|
|
|
case 19: p =
|
1998-05-26 13:38:00 +00:00
|
|
|
_("Please report bugs to <gnupg-bugs@gnu.org>.\n");
|
1998-03-05 09:22:13 +00:00
|
|
|
break;
|
2003-12-04 04:58:12 +00:00
|
|
|
|
|
|
|
#ifdef IS_DEVELOPMENT_VERSION
|
|
|
|
case 20:
|
|
|
|
p="NOTE: THIS IS A DEVELOPMENT VERSION!";
|
|
|
|
break;
|
|
|
|
case 21:
|
|
|
|
p="It is only intended for test purposes and should NOT be";
|
|
|
|
break;
|
|
|
|
case 22:
|
|
|
|
p="used in a production environment or with production keys!";
|
|
|
|
break;
|
|
|
|
#endif
|
|
|
|
|
1997-11-18 14:06:00 +00:00
|
|
|
case 1:
|
1998-03-05 09:22:13 +00:00
|
|
|
case 40: p =
|
|
|
|
_("Usage: gpg [options] [files] (-h for help)");
|
|
|
|
break;
|
|
|
|
case 41: p =
|
|
|
|
_("Syntax: gpg [options] [files]\n"
|
|
|
|
"sign, check, encrypt or decrypt\n"
|
|
|
|
"default operation depends on the input data\n");
|
|
|
|
break;
|
1998-02-16 20:05:02 +00:00
|
|
|
|
2000-07-14 17:34:53 +00:00
|
|
|
case 31: p = "\nHome: "; break;
|
2002-06-29 13:46:34 +00:00
|
|
|
#ifndef __riscos__
|
2000-07-14 17:34:53 +00:00
|
|
|
case 32: p = opt.homedir; break;
|
2002-06-29 13:46:34 +00:00
|
|
|
#else /* __riscos__ */
|
|
|
|
case 32: p = make_filename(opt.homedir, NULL); break;
|
|
|
|
#endif /* __riscos__ */
|
2000-07-14 17:34:53 +00:00
|
|
|
case 33: p = _("\nSupported algorithms:\n"); break;
|
|
|
|
case 34:
|
1998-02-16 20:05:02 +00:00
|
|
|
if( !pubkeys )
|
2003-03-24 20:05:53 +00:00
|
|
|
pubkeys = build_list(_("Pubkey: "), 0, pubkey_algo_to_string,
|
2002-06-29 13:46:34 +00:00
|
|
|
check_pubkey_algo );
|
1998-02-16 20:05:02 +00:00
|
|
|
p = pubkeys;
|
|
|
|
break;
|
2002-06-29 13:46:34 +00:00
|
|
|
case 35:
|
|
|
|
if( !ciphers )
|
2003-03-24 20:05:53 +00:00
|
|
|
ciphers = build_list(_("Cipher: "), 'S', cipher_algo_to_string,
|
2002-06-29 13:46:34 +00:00
|
|
|
check_cipher_algo );
|
|
|
|
p = ciphers;
|
|
|
|
break;
|
2000-07-14 17:34:53 +00:00
|
|
|
case 36:
|
1998-02-16 20:05:02 +00:00
|
|
|
if( !digests )
|
2003-03-24 20:05:53 +00:00
|
|
|
digests = build_list(_("Hash: "), 'H', digest_algo_to_string,
|
2002-06-29 13:46:34 +00:00
|
|
|
check_digest_algo );
|
1998-02-16 20:05:02 +00:00
|
|
|
p = digests;
|
1997-11-18 14:06:00 +00:00
|
|
|
break;
|
2002-06-29 13:46:34 +00:00
|
|
|
case 37:
|
|
|
|
if( !zips )
|
2003-03-24 20:05:53 +00:00
|
|
|
zips = build_list(_("Compression: "),'Z',compress_algo_to_string,
|
2002-06-29 13:46:34 +00:00
|
|
|
check_compress_algo);
|
|
|
|
p = zips;
|
|
|
|
break;
|
1998-02-16 20:05:02 +00:00
|
|
|
|
2002-06-29 13:46:34 +00:00
|
|
|
default: p = default_strusage(level);
|
1997-11-18 14:06:00 +00:00
|
|
|
}
|
|
|
|
return p;
|
|
|
|
}
|
|
|
|
|
1998-02-16 20:05:02 +00:00
|
|
|
|
|
|
|
static char *
|
2002-06-29 13:46:34 +00:00
|
|
|
build_list( const char *text, char letter,
|
|
|
|
const char * (*mapf)(int), int (*chkf)(int) )
|
1998-02-16 20:05:02 +00:00
|
|
|
{
|
|
|
|
int i;
|
2002-06-29 13:46:34 +00:00
|
|
|
const char *s;
|
1998-02-16 20:05:02 +00:00
|
|
|
size_t n=strlen(text)+2;
|
2002-06-29 13:46:34 +00:00
|
|
|
char *list, *p, *line=NULL;
|
|
|
|
|
|
|
|
if( maybe_setuid )
|
|
|
|
secmem_init( 0 ); /* drop setuid */
|
|
|
|
|
|
|
|
for(i=0; i <= 110; i++ )
|
|
|
|
if( !chkf(i) && (s=mapf(i)) )
|
|
|
|
n += strlen(s) + 7 + 2;
|
|
|
|
list = m_alloc( 21 + n ); *list = 0;
|
|
|
|
for(p=NULL, i=0; i <= 110; i++ ) {
|
|
|
|
if( !chkf(i) && (s=mapf(i)) ) {
|
|
|
|
if( !p ) {
|
1998-02-16 20:05:02 +00:00
|
|
|
p = stpcpy( list, text );
|
2002-06-29 13:46:34 +00:00
|
|
|
line=p;
|
|
|
|
}
|
1998-02-16 20:05:02 +00:00
|
|
|
else
|
|
|
|
p = stpcpy( p, ", ");
|
2002-06-29 13:46:34 +00:00
|
|
|
|
|
|
|
if(strlen(line)>60) {
|
|
|
|
int spaces=strlen(text);
|
|
|
|
|
|
|
|
list=m_realloc(list,n+spaces+1);
|
|
|
|
/* realloc could move the block, so find the end again */
|
|
|
|
p=list;
|
|
|
|
while(*p)
|
|
|
|
p++;
|
|
|
|
|
|
|
|
p=stpcpy(p, "\n");
|
|
|
|
line=p;
|
|
|
|
for(;spaces;spaces--)
|
|
|
|
p=stpcpy(p, " ");
|
|
|
|
}
|
|
|
|
|
|
|
|
p = stpcpy(p, s );
|
|
|
|
if(opt.verbose && letter)
|
|
|
|
{
|
|
|
|
char num[8];
|
|
|
|
sprintf(num," (%c%d)",letter,i);
|
|
|
|
p = stpcpy(p,num);
|
|
|
|
}
|
1998-02-16 20:05:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
if( p )
|
|
|
|
p = stpcpy(p, "\n" );
|
|
|
|
return list;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
1998-01-26 22:09:01 +00:00
|
|
|
static void
|
|
|
|
i18n_init(void)
|
|
|
|
{
|
* armor.c, g10.c, kbnode.c, misc.c, pkclist.c, sign.c, build-packet.c,
getkey.c, keydb.c, openfile.c, plaintext.c, status.c, gpgv.c, keygen.c,
options.h, sig-check.c, tdbio.h, encode.c, mainproc.c, parse-packet.c,
signal.c, textfilter.c: Edit all preprocessor instructions to remove
whitespace before the '#'. This is not required by C89, but there are some
compilers out there that don't like it.
2003-05-24 21:50:33 +00:00
|
|
|
#ifdef USE_SIMPLE_GETTEXT
|
2005-01-20 11:42:03 +00:00
|
|
|
set_gettext_file (PACKAGE, "Software\\GNU\\GnuPG");
|
* armor.c, g10.c, kbnode.c, misc.c, pkclist.c, sign.c, build-packet.c,
getkey.c, keydb.c, openfile.c, plaintext.c, status.c, gpgv.c, keygen.c,
options.h, sig-check.c, tdbio.h, encode.c, mainproc.c, parse-packet.c,
signal.c, textfilter.c: Edit all preprocessor instructions to remove
whitespace before the '#'. This is not required by C89, but there are some
compilers out there that don't like it.
2003-05-24 21:50:33 +00:00
|
|
|
#else
|
|
|
|
#ifdef ENABLE_NLS
|
2002-06-29 13:46:34 +00:00
|
|
|
setlocale( LC_ALL, "" );
|
|
|
|
bindtextdomain( PACKAGE, G10_LOCALEDIR );
|
1998-01-26 22:09:01 +00:00
|
|
|
textdomain( PACKAGE );
|
* armor.c, g10.c, kbnode.c, misc.c, pkclist.c, sign.c, build-packet.c,
getkey.c, keydb.c, openfile.c, plaintext.c, status.c, gpgv.c, keygen.c,
options.h, sig-check.c, tdbio.h, encode.c, mainproc.c, parse-packet.c,
signal.c, textfilter.c: Edit all preprocessor instructions to remove
whitespace before the '#'. This is not required by C89, but there are some
compilers out there that don't like it.
2003-05-24 21:50:33 +00:00
|
|
|
#endif
|
|
|
|
#endif
|
1998-01-26 22:09:01 +00:00
|
|
|
}
|
|
|
|
|
2000-07-14 17:34:53 +00:00
|
|
|
static void
|
|
|
|
wrong_args( const char *text)
|
|
|
|
{
|
|
|
|
fputs(_("usage: gpg [options] "),stderr);
|
|
|
|
fputs(text,stderr);
|
|
|
|
putc('\n',stderr);
|
2002-06-29 13:46:34 +00:00
|
|
|
g10_exit(2);
|
2000-07-14 17:34:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static char *
|
|
|
|
make_username( const char *string )
|
|
|
|
{
|
|
|
|
char *p;
|
|
|
|
if( utf8_strings )
|
2002-06-29 13:46:34 +00:00
|
|
|
p = m_strdup(string);
|
2000-07-14 17:34:53 +00:00
|
|
|
else
|
|
|
|
p = native_to_utf8( string );
|
|
|
|
return p;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
1997-11-18 14:06:00 +00:00
|
|
|
static void
|
|
|
|
set_debug(void)
|
|
|
|
{
|
|
|
|
if( opt.debug & DBG_MEMORY_VALUE )
|
|
|
|
memory_debug_mode = 1;
|
|
|
|
if( opt.debug & DBG_MEMSTAT_VALUE )
|
|
|
|
memory_stat_debug_mode = 1;
|
|
|
|
if( opt.debug & DBG_MPI_VALUE )
|
2002-06-29 13:46:34 +00:00
|
|
|
mpi_debug_mode = 1;
|
1997-11-18 14:06:00 +00:00
|
|
|
if( opt.debug & DBG_CIPHER_VALUE )
|
2002-06-29 13:46:34 +00:00
|
|
|
g10c_debug_mode = 1;
|
1997-11-24 11:04:11 +00:00
|
|
|
if( opt.debug & DBG_IOBUF_VALUE )
|
|
|
|
iobuf_debug_mode = 1;
|
1998-06-13 17:00:02 +00:00
|
|
|
|
1997-11-18 14:06:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-09-28 17:49:38 +00:00
|
|
|
/* We need the home directory also in some other directories, so make
|
|
|
|
sure that both variables are always in sync. */
|
|
|
|
static void
|
|
|
|
set_homedir (char *dir)
|
|
|
|
{
|
|
|
|
if (!dir)
|
|
|
|
dir = "";
|
|
|
|
g10_opt_homedir = opt.homedir = dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2004-01-24 00:47:45 +00:00
|
|
|
/* We set the screen dimensions for UI purposes. Do not allow screens
|
|
|
|
smaller than 80x24 for the sake of simplicity. */
|
|
|
|
static void
|
|
|
|
set_screen_dimensions(void)
|
|
|
|
{
|
|
|
|
#ifndef _WIN32
|
|
|
|
char *str;
|
|
|
|
|
|
|
|
str=getenv("COLUMNS");
|
|
|
|
if(str)
|
|
|
|
opt.screen_columns=atoi(str);
|
|
|
|
|
|
|
|
str=getenv("LINES");
|
|
|
|
if(str)
|
|
|
|
opt.screen_lines=atoi(str);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
if(opt.screen_columns<80 || opt.screen_columns>255)
|
|
|
|
opt.screen_columns=80;
|
|
|
|
|
|
|
|
if(opt.screen_lines<24 || opt.screen_lines>255)
|
|
|
|
opt.screen_lines=24;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2004-11-17 16:04:21 +00:00
|
|
|
/* Helper to open a file FNAME either for reading or writing to be
|
|
|
|
used with --status-file etc functions. Not generally useful but it
|
|
|
|
avoids the riscos specific functions and well some Windows people
|
|
|
|
might like it too. Prints an error message and returns -1 on
|
|
|
|
error. On success the file descriptor is returned. */
|
|
|
|
static int
|
|
|
|
open_info_file (const char *fname, int for_write)
|
|
|
|
{
|
|
|
|
#ifdef __riscos__
|
|
|
|
return riscos_fdopenfile (fname, for_write);
|
|
|
|
#elif defined (ENABLE_SELINUX_HACKS)
|
|
|
|
/* We can't allow these even when testing for a secured filename
|
|
|
|
because files to be secured might not yet been secured. This is
|
|
|
|
similar to the option file but in that case it is unlikely that
|
|
|
|
sensitive information may be retrieved by means of error
|
|
|
|
messages. */
|
|
|
|
return -1;
|
|
|
|
#else
|
|
|
|
int fd;
|
|
|
|
|
|
|
|
/* if (is_secured_filename (fname)) */
|
|
|
|
/* { */
|
|
|
|
/* fd = -1; */
|
|
|
|
/* errno = EPERM; */
|
|
|
|
/* } */
|
|
|
|
/* else */
|
|
|
|
/* { */
|
|
|
|
do
|
|
|
|
{
|
|
|
|
if (for_write)
|
|
|
|
fd = open (fname, O_CREAT | O_TRUNC | O_WRONLY,
|
|
|
|
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
|
|
|
|
else
|
|
|
|
fd = open (fname, O_RDONLY | MY_O_BINARY);
|
|
|
|
}
|
|
|
|
while (fd == -1 && errno == EINTR);
|
|
|
|
/* } */
|
|
|
|
if ( fd == -1)
|
|
|
|
log_error ( for_write? _("can't create `%s': %s\n")
|
|
|
|
: _("can't open `%s': %s\n"), fname, strerror(errno));
|
|
|
|
|
|
|
|
return fd;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
1998-01-05 19:13:15 +00:00
|
|
|
static void
|
1998-08-11 17:29:34 +00:00
|
|
|
set_cmd( enum cmd_and_opt_values *ret_cmd, enum cmd_and_opt_values new_cmd )
|
1998-01-05 19:13:15 +00:00
|
|
|
{
|
1998-08-11 17:29:34 +00:00
|
|
|
enum cmd_and_opt_values cmd = *ret_cmd;
|
1998-01-05 19:13:15 +00:00
|
|
|
|
|
|
|
if( !cmd || cmd == new_cmd )
|
|
|
|
cmd = new_cmd;
|
|
|
|
else if( cmd == aSign && new_cmd == aEncr )
|
|
|
|
cmd = aSignEncr;
|
|
|
|
else if( cmd == aEncr && new_cmd == aSign )
|
|
|
|
cmd = aSignEncr;
|
2002-06-29 13:46:34 +00:00
|
|
|
else if( cmd == aSign && new_cmd == aSym )
|
|
|
|
cmd = aSignSym;
|
|
|
|
else if( cmd == aSym && new_cmd == aSign )
|
|
|
|
cmd = aSignSym;
|
2003-10-26 03:26:14 +00:00
|
|
|
else if( cmd == aSym && new_cmd == aEncr )
|
|
|
|
cmd = aEncrSym;
|
|
|
|
else if( cmd == aEncr && new_cmd == aSym )
|
|
|
|
cmd = aEncrSym;
|
1998-01-05 19:13:15 +00:00
|
|
|
else if( cmd == aKMode && new_cmd == aSym )
|
|
|
|
cmd = aKModeC;
|
2003-11-13 02:54:12 +00:00
|
|
|
else if (cmd == aSignEncr && new_cmd == aSym)
|
|
|
|
cmd = aSignEncrSym;
|
|
|
|
else if (cmd == aSignSym && new_cmd == aEncr)
|
|
|
|
cmd = aSignEncrSym;
|
|
|
|
else if (cmd == aEncrSym && new_cmd == aSign)
|
|
|
|
cmd = aSignEncrSym;
|
1998-02-04 18:54:31 +00:00
|
|
|
else if( ( cmd == aSign && new_cmd == aClearsign )
|
|
|
|
|| ( cmd == aClearsign && new_cmd == aSign ) )
|
|
|
|
cmd = aClearsign;
|
1998-01-05 19:13:15 +00:00
|
|
|
else {
|
1998-01-26 22:09:01 +00:00
|
|
|
log_error(_("conflicting commands\n"));
|
2002-06-29 13:46:34 +00:00
|
|
|
g10_exit(2);
|
1998-01-05 19:13:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
*ret_cmd = cmd;
|
|
|
|
}
|
|
|
|
|
1997-11-21 14:53:57 +00:00
|
|
|
|
2004-01-22 03:47:05 +00:00
|
|
|
static void
|
|
|
|
add_group(char *string)
|
2002-06-29 13:46:34 +00:00
|
|
|
{
|
|
|
|
char *name,*value;
|
|
|
|
struct groupitem *item;
|
|
|
|
|
|
|
|
/* Break off the group name */
|
2002-09-09 19:21:58 +00:00
|
|
|
name=strsep(&string,"=");
|
2002-06-29 13:46:34 +00:00
|
|
|
if(string==NULL)
|
|
|
|
{
|
2004-10-11 21:08:37 +00:00
|
|
|
log_error(_("no = sign found in group definition `%s'\n"),name);
|
2002-06-29 13:46:34 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2003-01-16 19:20:10 +00:00
|
|
|
trim_trailing_ws(name,strlen(name));
|
|
|
|
|
2004-01-30 16:49:28 +00:00
|
|
|
/* Does this group already exist? */
|
|
|
|
for(item=opt.grouplist;item;item=item->next)
|
|
|
|
if(strcasecmp(item->name,name)==0)
|
|
|
|
break;
|
|
|
|
|
|
|
|
if(!item)
|
|
|
|
{
|
|
|
|
item=m_alloc(sizeof(struct groupitem));
|
|
|
|
item->name=name;
|
|
|
|
item->next=opt.grouplist;
|
|
|
|
item->values=NULL;
|
|
|
|
opt.grouplist=item;
|
|
|
|
}
|
|
|
|
|
2002-06-29 13:46:34 +00:00
|
|
|
/* Break apart the values */
|
2003-01-15 17:07:54 +00:00
|
|
|
while ((value= strsep(&string," \t")))
|
2003-01-14 09:35:31 +00:00
|
|
|
{
|
|
|
|
if (*value)
|
2004-01-30 16:49:28 +00:00
|
|
|
add_to_strlist2(&item->values,value,utf8_strings);
|
2003-01-14 09:35:31 +00:00
|
|
|
}
|
2004-01-30 16:49:28 +00:00
|
|
|
}
|
2002-06-29 13:46:34 +00:00
|
|
|
|
|
|
|
|
2004-01-30 16:49:28 +00:00
|
|
|
static void
|
|
|
|
rm_group(char *name)
|
|
|
|
{
|
|
|
|
struct groupitem *item,*last=NULL;
|
|
|
|
|
|
|
|
trim_trailing_ws(name,strlen(name));
|
|
|
|
|
|
|
|
for(item=opt.grouplist;item;last=item,item=item->next)
|
|
|
|
{
|
|
|
|
if(strcasecmp(item->name,name)==0)
|
|
|
|
{
|
|
|
|
if(last)
|
|
|
|
last->next=item->next;
|
|
|
|
else
|
|
|
|
opt.grouplist=item->next;
|
|
|
|
|
|
|
|
free_strlist(item->values);
|
|
|
|
m_free(item);
|
2004-02-10 22:42:34 +00:00
|
|
|
break;
|
2004-01-30 16:49:28 +00:00
|
|
|
}
|
|
|
|
}
|
2002-06-29 13:46:34 +00:00
|
|
|
}
|
|
|
|
|
2004-01-30 16:49:28 +00:00
|
|
|
|
2002-08-07 15:53:15 +00:00
|
|
|
/* We need to check three things.
|
|
|
|
|
|
|
|
0) The homedir. It must be x00, a directory, and owned by the
|
|
|
|
user.
|
|
|
|
|
2004-01-22 03:47:05 +00:00
|
|
|
1) The options/gpg.conf file. Okay unless it or its containing
|
|
|
|
directory is group or other writable or not owned by us. Disable
|
|
|
|
exec in this case.
|
2002-08-07 15:53:15 +00:00
|
|
|
|
2004-01-22 03:47:05 +00:00
|
|
|
2) Extensions. Same as #1.
|
2002-08-07 15:53:15 +00:00
|
|
|
|
|
|
|
Returns true if the item is unsafe. */
|
|
|
|
static int
|
|
|
|
check_permissions(const char *path,int item)
|
|
|
|
{
|
|
|
|
#if defined(HAVE_STAT) && !defined(HAVE_DOSISH_SYSTEM)
|
|
|
|
static int homedir_cache=-1;
|
2002-09-17 03:21:13 +00:00
|
|
|
char *tmppath,*dir;
|
2002-08-07 15:53:15 +00:00
|
|
|
struct stat statbuf,dirbuf;
|
|
|
|
int homedir=0,ret=0,checkonly=0;
|
|
|
|
int perm=0,own=0,enc_dir_perm=0,enc_dir_own=0;
|
|
|
|
|
|
|
|
if(opt.no_perm_warn)
|
|
|
|
return 0;
|
|
|
|
|
2002-09-17 03:21:13 +00:00
|
|
|
assert(item==0 || item==1 || item==2);
|
|
|
|
|
2002-08-07 15:53:15 +00:00
|
|
|
/* extensions may attach a path */
|
|
|
|
if(item==2 && path[0]!=DIRSEP_C)
|
|
|
|
{
|
|
|
|
if(strchr(path,DIRSEP_C))
|
|
|
|
tmppath=make_filename(path,NULL);
|
|
|
|
else
|
|
|
|
tmppath=make_filename(GNUPG_LIBDIR,path,NULL);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
tmppath=m_strdup(path);
|
|
|
|
|
|
|
|
/* If the item is located in the homedir, but isn't the homedir,
|
|
|
|
don't continue if we already checked the homedir itself. This is
|
|
|
|
to avoid user confusion with an extra options file warning which
|
|
|
|
could be rectified if the homedir itself had proper
|
|
|
|
permissions. */
|
2002-09-10 08:40:12 +00:00
|
|
|
if(item!=0 && homedir_cache>-1
|
|
|
|
&& ascii_strncasecmp(opt.homedir,tmppath,strlen(opt.homedir))==0)
|
2002-08-07 15:53:15 +00:00
|
|
|
{
|
|
|
|
ret=homedir_cache;
|
|
|
|
goto end;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* It's okay if the file or directory doesn't exist */
|
|
|
|
if(stat(tmppath,&statbuf)!=0)
|
|
|
|
{
|
|
|
|
ret=0;
|
|
|
|
goto end;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Now check the enclosing directory. Theoretically, we could walk
|
|
|
|
this test up to the root directory /, but for the sake of sanity,
|
|
|
|
I'm stopping at one level down. */
|
|
|
|
dir=make_dirname(tmppath);
|
|
|
|
|
|
|
|
if(stat(dir,&dirbuf)!=0 || !S_ISDIR(dirbuf.st_mode))
|
|
|
|
{
|
|
|
|
/* Weird error */
|
|
|
|
ret=1;
|
|
|
|
goto end;
|
|
|
|
}
|
|
|
|
|
|
|
|
m_free(dir);
|
|
|
|
|
|
|
|
/* Assume failure */
|
|
|
|
ret=1;
|
|
|
|
|
|
|
|
if(item==0)
|
|
|
|
{
|
|
|
|
/* The homedir must be x00, a directory, and owned by the user. */
|
|
|
|
|
|
|
|
if(S_ISDIR(statbuf.st_mode))
|
|
|
|
{
|
|
|
|
if(statbuf.st_uid==getuid())
|
|
|
|
{
|
|
|
|
if((statbuf.st_mode & (S_IRWXG|S_IRWXO))==0)
|
|
|
|
ret=0;
|
|
|
|
else
|
|
|
|
perm=1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
own=1;
|
|
|
|
|
|
|
|
homedir_cache=ret;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if(item==1 || item==2)
|
|
|
|
{
|
|
|
|
/* The options or extension file. Okay unless it or its
|
|
|
|
containing directory is group or other writable or not owned
|
|
|
|
by us or root. */
|
|
|
|
|
|
|
|
if(S_ISREG(statbuf.st_mode))
|
|
|
|
{
|
|
|
|
if(statbuf.st_uid==getuid() || statbuf.st_uid==0)
|
|
|
|
{
|
|
|
|
if((statbuf.st_mode & (S_IWGRP|S_IWOTH))==0)
|
|
|
|
{
|
|
|
|
/* it's not writable, so make sure the enclosing
|
|
|
|
directory is also not writable */
|
|
|
|
if(dirbuf.st_uid==getuid() || dirbuf.st_uid==0)
|
|
|
|
{
|
|
|
|
if((dirbuf.st_mode & (S_IWGRP|S_IWOTH))==0)
|
|
|
|
ret=0;
|
|
|
|
else
|
|
|
|
enc_dir_perm=1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
enc_dir_own=1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* it's writable, so the enclosing directory had
|
|
|
|
better not let people get to it. */
|
|
|
|
if(dirbuf.st_uid==getuid() || dirbuf.st_uid==0)
|
|
|
|
{
|
|
|
|
if((dirbuf.st_mode & (S_IRWXG|S_IRWXO))==0)
|
|
|
|
ret=0;
|
|
|
|
else
|
|
|
|
perm=enc_dir_perm=1; /* unclear which one to fix! */
|
|
|
|
}
|
|
|
|
else
|
|
|
|
enc_dir_own=1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
own=1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
BUG();
|
|
|
|
|
|
|
|
if(!checkonly)
|
|
|
|
{
|
|
|
|
if(own)
|
2002-09-17 03:21:13 +00:00
|
|
|
{
|
|
|
|
if(item==0)
|
2004-08-27 17:32:31 +00:00
|
|
|
log_info(_("WARNING: unsafe ownership on"
|
|
|
|
" homedir `%s'\n"),tmppath);
|
2002-09-17 03:21:13 +00:00
|
|
|
else if(item==1)
|
2004-08-27 17:32:31 +00:00
|
|
|
log_info(_("WARNING: unsafe ownership on"
|
|
|
|
" configuration file `%s'\n"),tmppath);
|
2002-09-17 03:21:13 +00:00
|
|
|
else
|
2004-08-27 17:32:31 +00:00
|
|
|
log_info(_("WARNING: unsafe ownership on"
|
|
|
|
" extension `%s'\n"),tmppath);
|
2002-09-17 03:21:13 +00:00
|
|
|
}
|
2002-08-07 15:53:15 +00:00
|
|
|
if(perm)
|
2002-09-17 03:21:13 +00:00
|
|
|
{
|
|
|
|
if(item==0)
|
2004-08-27 17:32:31 +00:00
|
|
|
log_info(_("WARNING: unsafe permissions on"
|
|
|
|
" homedir `%s'\n"),tmppath);
|
2002-09-17 03:21:13 +00:00
|
|
|
else if(item==1)
|
2004-08-27 17:32:31 +00:00
|
|
|
log_info(_("WARNING: unsafe permissions on"
|
|
|
|
" configuration file `%s'\n"),tmppath);
|
2002-09-17 03:21:13 +00:00
|
|
|
else
|
2004-08-27 17:32:31 +00:00
|
|
|
log_info(_("WARNING: unsafe permissions on"
|
|
|
|
" extension `%s'\n"),tmppath);
|
2002-09-17 03:21:13 +00:00
|
|
|
}
|
2002-08-07 15:53:15 +00:00
|
|
|
if(enc_dir_own)
|
2002-09-17 03:21:13 +00:00
|
|
|
{
|
|
|
|
if(item==0)
|
2004-08-27 17:32:31 +00:00
|
|
|
log_info(_("WARNING: unsafe enclosing directory ownership on"
|
|
|
|
" homedir `%s'\n"),tmppath);
|
2002-09-17 03:21:13 +00:00
|
|
|
else if(item==1)
|
2004-08-27 17:32:31 +00:00
|
|
|
log_info(_("WARNING: unsafe enclosing directory ownership on"
|
|
|
|
" configuration file `%s'\n"),tmppath);
|
2002-09-17 03:21:13 +00:00
|
|
|
else
|
2004-08-27 17:32:31 +00:00
|
|
|
log_info(_("WARNING: unsafe enclosing directory ownership on"
|
|
|
|
" extension `%s'\n"),tmppath);
|
2002-09-17 03:21:13 +00:00
|
|
|
}
|
2002-08-07 15:53:15 +00:00
|
|
|
if(enc_dir_perm)
|
2002-09-17 03:21:13 +00:00
|
|
|
{
|
|
|
|
if(item==0)
|
2004-08-27 17:32:31 +00:00
|
|
|
log_info(_("WARNING: unsafe enclosing directory permissions on"
|
|
|
|
" homedir `%s'\n"),tmppath);
|
2002-09-17 03:21:13 +00:00
|
|
|
else if(item==1)
|
2004-08-27 17:32:31 +00:00
|
|
|
log_info(_("WARNING: unsafe enclosing directory permissions on"
|
|
|
|
" configuration file `%s'\n"),tmppath);
|
2002-09-17 03:21:13 +00:00
|
|
|
else
|
2004-08-27 17:32:31 +00:00
|
|
|
log_info(_("WARNING: unsafe enclosing directory permissions on"
|
|
|
|
" extension `%s'\n"),tmppath);
|
2002-09-17 03:21:13 +00:00
|
|
|
}
|
2002-08-07 15:53:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
end:
|
|
|
|
m_free(tmppath);
|
|
|
|
|
|
|
|
if(homedir)
|
|
|
|
homedir_cache=ret;
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
|
|
|
#endif /* HAVE_STAT && !HAVE_DOSISH_SYSTEM */
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
1998-02-13 20:58:50 +00:00
|
|
|
|
2004-01-22 03:47:05 +00:00
|
|
|
|
|
|
|
static void
|
|
|
|
print_algo_numbers(int (*checker)(int))
|
|
|
|
{
|
|
|
|
int i,first=1;
|
|
|
|
|
|
|
|
for(i=0;i<=110;i++)
|
|
|
|
{
|
|
|
|
if(!checker(i))
|
|
|
|
{
|
|
|
|
if(first)
|
|
|
|
first=0;
|
|
|
|
else
|
|
|
|
printf(";");
|
|
|
|
printf("%d",i);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* In the future, we can do all sorts of interesting configuration
|
|
|
|
output here. For now, just give "group" as the Enigmail folks need
|
|
|
|
it, and pubkey, cipher, hash, and compress as they may be useful
|
|
|
|
for frontends. */
|
|
|
|
static void
|
|
|
|
list_config(char *items)
|
|
|
|
{
|
|
|
|
int show_all=(items==NULL);
|
|
|
|
char *name=NULL;
|
|
|
|
|
|
|
|
if(!opt.with_colons)
|
|
|
|
return;
|
|
|
|
|
|
|
|
while(show_all || (name=strsep(&items," ")))
|
|
|
|
{
|
2004-01-30 16:49:28 +00:00
|
|
|
int any=0;
|
|
|
|
|
2004-01-22 03:47:05 +00:00
|
|
|
if(show_all || ascii_strcasecmp(name,"group")==0)
|
|
|
|
{
|
|
|
|
struct groupitem *iter;
|
|
|
|
|
|
|
|
for(iter=opt.grouplist;iter;iter=iter->next)
|
|
|
|
{
|
|
|
|
STRLIST sl;
|
|
|
|
|
|
|
|
printf("cfg:group:");
|
|
|
|
print_string(stdout,iter->name,strlen(iter->name),':');
|
|
|
|
printf(":");
|
|
|
|
|
|
|
|
for(sl=iter->values;sl;sl=sl->next)
|
|
|
|
{
|
|
|
|
print_string2(stdout,sl->d,strlen(sl->d),':',';');
|
|
|
|
if(sl->next)
|
|
|
|
printf(";");
|
|
|
|
}
|
|
|
|
|
|
|
|
printf("\n");
|
|
|
|
}
|
2004-01-30 16:49:28 +00:00
|
|
|
|
|
|
|
any=1;
|
2004-01-22 03:47:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if(show_all || ascii_strcasecmp(name,"version")==0)
|
|
|
|
{
|
|
|
|
printf("cfg:version:");
|
|
|
|
print_string(stdout,VERSION,strlen(VERSION),':');
|
|
|
|
printf("\n");
|
2004-01-30 16:49:28 +00:00
|
|
|
any=1;
|
2004-01-22 03:47:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if(show_all || ascii_strcasecmp(name,"pubkey")==0)
|
|
|
|
{
|
|
|
|
printf("cfg:pubkey:");
|
|
|
|
print_algo_numbers(check_pubkey_algo);
|
|
|
|
printf("\n");
|
2004-01-30 16:49:28 +00:00
|
|
|
any=1;
|
2004-01-22 03:47:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if(show_all || ascii_strcasecmp(name,"cipher")==0)
|
|
|
|
{
|
|
|
|
printf("cfg:cipher:");
|
|
|
|
print_algo_numbers(check_cipher_algo);
|
|
|
|
printf("\n");
|
2004-01-30 16:49:28 +00:00
|
|
|
any=1;
|
2004-01-22 03:47:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if(show_all
|
|
|
|
|| ascii_strcasecmp(name,"digest")==0
|
|
|
|
|| ascii_strcasecmp(name,"hash")==0)
|
|
|
|
{
|
|
|
|
printf("cfg:digest:");
|
|
|
|
print_algo_numbers(check_digest_algo);
|
|
|
|
printf("\n");
|
2004-01-30 16:49:28 +00:00
|
|
|
any=1;
|
2004-01-22 03:47:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if(show_all || ascii_strcasecmp(name,"compress")==0)
|
|
|
|
{
|
|
|
|
printf("cfg:compress:");
|
|
|
|
print_algo_numbers(check_compress_algo);
|
|
|
|
printf("\n");
|
2004-01-30 16:49:28 +00:00
|
|
|
any=1;
|
2004-01-22 03:47:05 +00:00
|
|
|
}
|
|
|
|
|
2004-09-17 13:57:29 +00:00
|
|
|
if(show_all || ascii_strcasecmp(name,"ccid-reader-id")==0)
|
|
|
|
{
|
|
|
|
#if defined(ENABLE_CARD_SUPPORT) && defined(HAVE_LIBUSB)
|
|
|
|
char *p, *p2, *list = ccid_get_reader_list ();
|
|
|
|
|
|
|
|
for (p=list; p && (p2 = strchr (p, '\n')); p = p2+1)
|
|
|
|
{
|
|
|
|
*p2 = 0;
|
|
|
|
printf("cfg:ccid-reader-id:%s\n", p);
|
|
|
|
}
|
|
|
|
free (list);
|
|
|
|
#endif
|
|
|
|
any=1;
|
|
|
|
}
|
|
|
|
|
2004-01-22 03:47:05 +00:00
|
|
|
if(show_all)
|
|
|
|
break;
|
2004-01-30 16:49:28 +00:00
|
|
|
|
|
|
|
if(!any)
|
2004-08-27 17:32:31 +00:00
|
|
|
log_error(_("unknown configuration item `%s'\n"),name);
|
2004-01-22 03:47:05 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2004-05-20 17:06:34 +00:00
|
|
|
/* List options and default values in the GPG Conf format. This is a
|
|
|
|
new tool distributed with gnupg 1.9.x but we also want some limited
|
|
|
|
support in older gpg versions. The output is the name of the
|
|
|
|
configuration file and a list of options available for editing by
|
|
|
|
gpgconf. */
|
|
|
|
static void
|
|
|
|
gpgconf_list (const char *configfile)
|
|
|
|
{
|
|
|
|
/* The following definitions are taken from gnupg/tools/gpgconf-comp.c. */
|
|
|
|
#define GC_OPT_FLAG_NONE 0UL
|
|
|
|
#define GC_OPT_FLAG_DEFAULT (1UL << 4)
|
|
|
|
|
|
|
|
printf ("gpgconf-gpg.conf:%lu:\"%s\n",
|
|
|
|
GC_OPT_FLAG_DEFAULT,configfile?configfile:"/dev/null");
|
|
|
|
printf ("verbose:%lu:\n", GC_OPT_FLAG_NONE);
|
|
|
|
printf ("quiet:%lu:\n", GC_OPT_FLAG_NONE);
|
|
|
|
printf ("keyserver:%lu:\n", GC_OPT_FLAG_NONE);
|
2004-09-17 13:57:29 +00:00
|
|
|
printf ("reader-port:%lu:\n", GC_OPT_FLAG_NONE);
|
2004-05-20 17:06:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2004-09-12 15:27:38 +00:00
|
|
|
static int
|
|
|
|
parse_subpacket_list(char *list)
|
|
|
|
{
|
|
|
|
char *tok;
|
|
|
|
byte subpackets[128],i;
|
|
|
|
int count=0;
|
|
|
|
|
|
|
|
if(!list)
|
|
|
|
{
|
|
|
|
/* No arguments means all subpackets */
|
|
|
|
memset(subpackets+1,1,sizeof(subpackets)-1);
|
|
|
|
count=127;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
memset(subpackets,0,sizeof(subpackets));
|
|
|
|
|
|
|
|
/* Merge with earlier copy */
|
|
|
|
if(opt.show_subpackets)
|
|
|
|
{
|
|
|
|
byte *in;
|
|
|
|
|
|
|
|
for(in=opt.show_subpackets;*in;in++)
|
|
|
|
{
|
|
|
|
if(*in>127 || *in<1)
|
|
|
|
BUG();
|
|
|
|
|
|
|
|
if(!subpackets[*in])
|
|
|
|
count++;
|
|
|
|
subpackets[*in]=1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
while((tok=strsep(&list," ,")))
|
|
|
|
{
|
|
|
|
if(!*tok)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
i=atoi(tok);
|
|
|
|
if(i>127 || i<1)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
if(!subpackets[i])
|
|
|
|
count++;
|
|
|
|
subpackets[i]=1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
m_free(opt.show_subpackets);
|
|
|
|
opt.show_subpackets=m_alloc(count+1);
|
|
|
|
opt.show_subpackets[count--]=0;
|
|
|
|
|
|
|
|
for(i=1;i<128 && count>=0;i++)
|
|
|
|
if(subpackets[i])
|
|
|
|
opt.show_subpackets[count--]=i;
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
parse_list_options(char *str)
|
|
|
|
{
|
|
|
|
char *subpackets=""; /* something that isn't NULL */
|
|
|
|
struct parse_options lopts[]=
|
|
|
|
{
|
|
|
|
{"show-photos",LIST_SHOW_PHOTOS,NULL},
|
|
|
|
{"show-policy-urls",LIST_SHOW_POLICY_URLS,NULL},
|
|
|
|
{"show-notations",LIST_SHOW_NOTATIONS,NULL},
|
|
|
|
{"show-std-notations",LIST_SHOW_STD_NOTATIONS,NULL},
|
|
|
|
{"show-standard-notations",LIST_SHOW_STD_NOTATIONS,NULL},
|
|
|
|
{"show-user-notations",LIST_SHOW_USER_NOTATIONS,NULL},
|
|
|
|
{"show-keyserver-urls",LIST_SHOW_KEYSERVER_URLS,NULL},
|
|
|
|
{"show-uid-validity",LIST_SHOW_UID_VALIDITY,NULL},
|
|
|
|
{"show-unusable-uids",LIST_SHOW_UNUSABLE_UIDS,NULL},
|
|
|
|
{"show-unusable-subkeys",LIST_SHOW_UNUSABLE_SUBKEYS,NULL},
|
|
|
|
{"show-keyring",LIST_SHOW_KEYRING,NULL},
|
|
|
|
{"show-sig-expire",LIST_SHOW_SIG_EXPIRE,NULL},
|
2004-10-21 01:10:49 +00:00
|
|
|
{"show-sig-subpackets",LIST_SHOW_SIG_SUBPACKETS,NULL},
|
2004-09-12 15:27:38 +00:00
|
|
|
{NULL,0,NULL}
|
|
|
|
};
|
|
|
|
|
2004-10-21 01:10:49 +00:00
|
|
|
/* C99 allows for non-constant initializers, but we'd like to
|
2004-10-21 19:18:47 +00:00
|
|
|
compile everywhere, so fill in the show-sig-subpackets argument
|
|
|
|
here. Note that if the parse_options array changes, we'll have
|
|
|
|
to change the subscript here. */
|
2004-10-21 01:10:49 +00:00
|
|
|
lopts[12].value=&subpackets;
|
|
|
|
|
2004-09-12 15:27:38 +00:00
|
|
|
if(parse_options(str,&opt.list_options,lopts,1))
|
|
|
|
{
|
|
|
|
if(opt.list_options&LIST_SHOW_SIG_SUBPACKETS)
|
|
|
|
{
|
|
|
|
/* Unset so users can pass multiple lists in. */
|
|
|
|
opt.list_options&=~LIST_SHOW_SIG_SUBPACKETS;
|
|
|
|
if(!parse_subpacket_list(subpackets))
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
else if(subpackets==NULL && opt.show_subpackets)
|
|
|
|
{
|
|
|
|
/* User did 'no-show-subpackets' */
|
|
|
|
m_free(opt.show_subpackets);
|
|
|
|
opt.show_subpackets=NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2004-05-20 17:06:34 +00:00
|
|
|
|
2004-01-22 03:47:05 +00:00
|
|
|
/* Collapses argc/argv into a single string that must be freed */
|
|
|
|
static char *
|
|
|
|
collapse_args(int argc,char *argv[])
|
|
|
|
{
|
|
|
|
char *str=NULL;
|
|
|
|
int i,first=1,len=0;
|
|
|
|
|
|
|
|
for(i=0;i<argc;i++)
|
|
|
|
{
|
|
|
|
len+=strlen(argv[i])+2;
|
|
|
|
str=m_realloc(str,len);
|
|
|
|
if(first)
|
|
|
|
{
|
|
|
|
str[0]='\0';
|
|
|
|
first=0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
strcat(str," ");
|
|
|
|
|
|
|
|
strcat(str,argv[i]);
|
|
|
|
}
|
|
|
|
|
|
|
|
return str;
|
|
|
|
}
|
|
|
|
|
2004-10-13 15:34:52 +00:00
|
|
|
static void
|
|
|
|
parse_trust_model(const char *model)
|
|
|
|
{
|
|
|
|
if(ascii_strcasecmp(model,"pgp")==0)
|
|
|
|
opt.trust_model=TM_PGP;
|
|
|
|
else if(ascii_strcasecmp(model,"classic")==0)
|
|
|
|
opt.trust_model=TM_CLASSIC;
|
|
|
|
else if(ascii_strcasecmp(model,"always")==0)
|
|
|
|
opt.trust_model=TM_ALWAYS;
|
|
|
|
else if(ascii_strcasecmp(model,"direct")==0)
|
|
|
|
opt.trust_model=TM_DIRECT;
|
|
|
|
else if(ascii_strcasecmp(model,"auto")==0)
|
|
|
|
opt.trust_model=TM_AUTO;
|
|
|
|
else
|
|
|
|
log_error("unknown trust model `%s'\n",model);
|
|
|
|
}
|
2004-01-22 03:47:05 +00:00
|
|
|
|
1998-05-26 13:38:00 +00:00
|
|
|
int
|
1997-11-18 14:06:00 +00:00
|
|
|
main( int argc, char **argv )
|
|
|
|
{
|
1997-12-12 12:03:58 +00:00
|
|
|
ARGPARSE_ARGS pargs;
|
1997-11-18 14:06:00 +00:00
|
|
|
IOBUF a;
|
1998-01-16 21:15:24 +00:00
|
|
|
int rc=0;
|
1997-12-12 12:03:58 +00:00
|
|
|
int orig_argc;
|
|
|
|
char **orig_argv;
|
1998-03-09 21:44:06 +00:00
|
|
|
const char *fname;
|
1999-07-12 12:57:54 +00:00
|
|
|
char *username;
|
2000-09-18 14:35:34 +00:00
|
|
|
int may_coredump;
|
1997-11-24 11:04:11 +00:00
|
|
|
STRLIST sl, remusr= NULL, locusr=NULL;
|
1998-07-09 13:37:17 +00:00
|
|
|
STRLIST nrings=NULL, sec_nrings=NULL;
|
1997-11-21 14:53:57 +00:00
|
|
|
armor_filter_context_t afx;
|
1997-12-09 12:46:23 +00:00
|
|
|
int detached_sig = 0;
|
1997-12-12 12:03:58 +00:00
|
|
|
FILE *configfp = NULL;
|
|
|
|
char *configname = NULL;
|
2004-05-20 17:06:34 +00:00
|
|
|
char *save_configname = NULL;
|
1997-12-12 12:03:58 +00:00
|
|
|
unsigned configlineno;
|
1998-02-11 23:22:09 +00:00
|
|
|
int parse_debug = 0;
|
2002-06-29 13:46:34 +00:00
|
|
|
int default_config = 1;
|
1997-12-20 17:23:29 +00:00
|
|
|
int default_keyring = 1;
|
1999-07-13 15:41:14 +00:00
|
|
|
int greeting = 0;
|
1999-07-14 17:47:23 +00:00
|
|
|
int nogreeting = 0;
|
2000-07-14 17:34:53 +00:00
|
|
|
int use_random_seed = 1;
|
1998-08-11 17:29:34 +00:00
|
|
|
enum cmd_and_opt_values cmd = 0;
|
1998-02-02 14:36:06 +00:00
|
|
|
const char *trustdb_name = NULL;
|
1998-07-09 13:37:17 +00:00
|
|
|
char *def_cipher_string = NULL;
|
|
|
|
char *def_digest_string = NULL;
|
2003-11-15 22:31:58 +00:00
|
|
|
char *compress_algo_string = NULL;
|
2002-06-29 13:46:34 +00:00
|
|
|
char *cert_digest_string = NULL;
|
1998-09-28 19:25:31 +00:00
|
|
|
char *s2k_cipher_string = NULL;
|
|
|
|
char *s2k_digest_string = NULL;
|
2002-06-29 13:46:34 +00:00
|
|
|
char *pers_cipher_list = NULL;
|
|
|
|
char *pers_digest_list = NULL;
|
|
|
|
char *pers_compress_list = NULL;
|
|
|
|
int eyes_only=0;
|
2003-09-09 00:25:53 +00:00
|
|
|
int multifile=0;
|
1998-09-28 19:25:31 +00:00
|
|
|
int pwfd = -1;
|
1999-07-08 14:24:35 +00:00
|
|
|
int with_fpr = 0; /* make an option out of --fingerprint */
|
2002-06-29 13:46:34 +00:00
|
|
|
int any_explicit_recipient = 0;
|
2004-12-16 05:16:09 +00:00
|
|
|
int require_secmem=0,got_secmem=0;
|
* armor.c, g10.c, kbnode.c, misc.c, pkclist.c, sign.c, build-packet.c,
getkey.c, keydb.c, openfile.c, plaintext.c, status.c, gpgv.c, keygen.c,
options.h, sig-check.c, tdbio.h, encode.c, mainproc.c, parse-packet.c,
signal.c, textfilter.c: Edit all preprocessor instructions to remove
whitespace before the '#'. This is not required by C89, but there are some
compilers out there that don't like it.
2003-05-24 21:50:33 +00:00
|
|
|
#ifdef USE_SHM_COPROCESSING
|
1998-07-31 16:45:58 +00:00
|
|
|
ulong requested_shm_size=0;
|
* armor.c, g10.c, kbnode.c, misc.c, pkclist.c, sign.c, build-packet.c,
getkey.c, keydb.c, openfile.c, plaintext.c, status.c, gpgv.c, keygen.c,
options.h, sig-check.c, tdbio.h, encode.c, mainproc.c, parse-packet.c,
signal.c, textfilter.c: Edit all preprocessor instructions to remove
whitespace before the '#'. This is not required by C89, but there are some
compilers out there that don't like it.
2003-05-24 21:50:33 +00:00
|
|
|
#endif
|
1997-12-12 12:03:58 +00:00
|
|
|
|
* armor.c, g10.c, kbnode.c, misc.c, pkclist.c, sign.c, build-packet.c,
getkey.c, keydb.c, openfile.c, plaintext.c, status.c, gpgv.c, keygen.c,
options.h, sig-check.c, tdbio.h, encode.c, mainproc.c, parse-packet.c,
signal.c, textfilter.c: Edit all preprocessor instructions to remove
whitespace before the '#'. This is not required by C89, but there are some
compilers out there that don't like it.
2003-05-24 21:50:33 +00:00
|
|
|
#ifdef __riscos__
|
2002-06-29 13:46:34 +00:00
|
|
|
opt.lock_once = 1;
|
* armor.c, g10.c, kbnode.c, misc.c, pkclist.c, sign.c, build-packet.c,
getkey.c, keydb.c, openfile.c, plaintext.c, status.c, gpgv.c, keygen.c,
options.h, sig-check.c, tdbio.h, encode.c, mainproc.c, parse-packet.c,
signal.c, textfilter.c: Edit all preprocessor instructions to remove
whitespace before the '#'. This is not required by C89, but there are some
compilers out there that don't like it.
2003-05-24 21:50:33 +00:00
|
|
|
#endif /* __riscos__ */
|
2002-06-29 13:46:34 +00:00
|
|
|
|
1998-05-15 18:49:19 +00:00
|
|
|
trap_unaligned();
|
2002-06-29 13:46:34 +00:00
|
|
|
secmem_set_flags( secmem_get_flags() | 2 ); /* suspend warnings */
|
1998-02-09 17:43:42 +00:00
|
|
|
/* Please note that we may running SUID(ROOT), so be very CAREFUL
|
|
|
|
* when adding any stuff between here and the call to
|
|
|
|
* secmem_init() somewhere after the option parsing
|
|
|
|
*/
|
1998-02-24 18:50:46 +00:00
|
|
|
log_set_name("gpg");
|
2002-06-29 13:46:34 +00:00
|
|
|
secure_random_alloc(); /* put random number into secure memory */
|
2000-09-18 14:35:34 +00:00
|
|
|
may_coredump = disable_core_dumps();
|
1998-10-12 20:16:38 +00:00
|
|
|
init_signals();
|
1999-02-16 13:16:33 +00:00
|
|
|
create_dotlock(NULL); /* register locking cleanup */
|
1998-01-26 22:09:01 +00:00
|
|
|
i18n_init();
|
2000-07-14 17:34:53 +00:00
|
|
|
opt.command_fd = -1; /* no command fd */
|
2003-11-15 22:31:58 +00:00
|
|
|
opt.compress_level = -1; /* defaults to standard compress level */
|
2003-12-04 04:58:12 +00:00
|
|
|
opt.bz2_compress_level = -1; /* defaults to standard compress level */
|
1999-06-15 12:31:07 +00:00
|
|
|
/* note: if you change these lines, look at oOpenPGP */
|
1998-08-05 16:51:59 +00:00
|
|
|
opt.def_cipher_algo = 0;
|
1998-05-15 18:49:19 +00:00
|
|
|
opt.def_digest_algo = 0;
|
2002-06-29 13:46:34 +00:00
|
|
|
opt.cert_digest_algo = 0;
|
2003-11-15 22:31:58 +00:00
|
|
|
opt.compress_algo = -1; /* defaults to DEFAULT_COMPRESS_ALGO */
|
1999-06-15 12:31:07 +00:00
|
|
|
opt.s2k_mode = 3; /* iterated+salted */
|
2003-02-21 20:43:17 +00:00
|
|
|
#ifdef USE_CAST5
|
2002-06-29 13:46:34 +00:00
|
|
|
opt.s2k_cipher_algo = CIPHER_ALGO_CAST5;
|
2003-02-21 20:43:17 +00:00
|
|
|
#else
|
|
|
|
opt.s2k_cipher_algo = CIPHER_ALGO_3DES;
|
|
|
|
#endif
|
1998-01-25 18:56:33 +00:00
|
|
|
opt.completes_needed = 1;
|
|
|
|
opt.marginals_needed = 3;
|
1998-11-13 19:41:41 +00:00
|
|
|
opt.max_cert_depth = 5;
|
2000-07-14 17:34:53 +00:00
|
|
|
opt.pgp2_workarounds = 1;
|
2002-06-29 13:46:34 +00:00
|
|
|
opt.force_v3_sigs = 1;
|
|
|
|
opt.escape_from = 1;
|
2002-10-23 15:59:45 +00:00
|
|
|
opt.import_options=IMPORT_SK2PK;
|
2004-11-26 15:51:37 +00:00
|
|
|
opt.export_options=EXPORT_ATTRIBUTES;
|
2003-04-09 01:57:46 +00:00
|
|
|
opt.keyserver_options.import_options=IMPORT_REPAIR_PKS_SUBKEY_BUG;
|
2004-11-26 15:51:37 +00:00
|
|
|
opt.keyserver_options.export_options=EXPORT_ATTRIBUTES;
|
2004-04-15 18:16:17 +00:00
|
|
|
opt.keyserver_options.options=
|
2004-04-19 16:02:11 +00:00
|
|
|
KEYSERVER_INCLUDE_SUBKEYS|KEYSERVER_INCLUDE_REVOKED|KEYSERVER_TRY_DNS_SRV|KEYSERVER_HONOR_KEYSERVER_URL;
|
2003-06-05 02:06:12 +00:00
|
|
|
opt.verify_options=
|
2004-05-05 02:40:27 +00:00
|
|
|
VERIFY_SHOW_POLICY_URLS|VERIFY_SHOW_STD_NOTATIONS|VERIFY_SHOW_KEYSERVER_URLS;
|
2003-04-26 20:38:16 +00:00
|
|
|
opt.trust_model=TM_AUTO;
|
2004-02-23 04:00:51 +00:00
|
|
|
opt.mangle_dos_filenames=0;
|
2004-02-24 23:37:18 +00:00
|
|
|
opt.min_cert_level=2;
|
2004-01-24 00:47:45 +00:00
|
|
|
set_screen_dimensions();
|
2004-03-03 05:47:51 +00:00
|
|
|
opt.keyid_format=KF_SHORT;
|
2004-12-20 05:19:09 +00:00
|
|
|
opt.rfc2440_text=1;
|
2005-01-20 11:42:03 +00:00
|
|
|
set_homedir ( default_homedir () );
|
1997-12-12 12:03:58 +00:00
|
|
|
|
2003-10-25 14:17:24 +00:00
|
|
|
#ifdef ENABLE_CARD_SUPPORT
|
|
|
|
# ifdef _WIN32
|
|
|
|
opt.pcsc_driver = "winscard.dll";
|
|
|
|
#else
|
|
|
|
opt.pcsc_driver = "libpcsclite.so";
|
|
|
|
#endif
|
|
|
|
#endif /*ENABLE_CARD_SUPPORT*/
|
|
|
|
|
1998-04-14 17:51:16 +00:00
|
|
|
/* check whether we have a config file on the commandline */
|
1997-12-12 12:03:58 +00:00
|
|
|
orig_argc = argc;
|
|
|
|
orig_argv = argv;
|
|
|
|
pargs.argc = &argc;
|
|
|
|
pargs.argv = &argv;
|
1998-06-11 07:16:50 +00:00
|
|
|
pargs.flags= 1|(1<<6); /* do not remove the args, ignore version */
|
1997-11-18 14:06:00 +00:00
|
|
|
while( arg_parse( &pargs, opts) ) {
|
1998-09-11 05:47:32 +00:00
|
|
|
if( pargs.r_opt == oDebug || pargs.r_opt == oDebugAll )
|
1998-02-11 23:22:09 +00:00
|
|
|
parse_debug++;
|
1998-09-11 05:47:32 +00:00
|
|
|
else if( pargs.r_opt == oOptions ) {
|
1997-12-12 12:03:58 +00:00
|
|
|
/* yes there is one, so we do not try the default one, but
|
|
|
|
* read the option file when it is encountered at the commandline
|
|
|
|
*/
|
|
|
|
default_config = 0;
|
|
|
|
}
|
1998-09-11 05:47:32 +00:00
|
|
|
else if( pargs.r_opt == oNoOptions )
|
1998-02-17 20:48:52 +00:00
|
|
|
default_config = 0; /* --no-options */
|
1998-09-11 05:47:32 +00:00
|
|
|
else if( pargs.r_opt == oHomedir )
|
2002-09-28 17:49:38 +00:00
|
|
|
set_homedir ( pargs.r.ret_str );
|
2002-08-07 15:53:15 +00:00
|
|
|
else if( pargs.r_opt == oNoPermissionWarn )
|
|
|
|
opt.no_perm_warn=1;
|
2002-10-17 11:50:46 +00:00
|
|
|
else if (pargs.r_opt == oStrict )
|
|
|
|
{
|
|
|
|
opt.strict=1;
|
|
|
|
log_set_strict(1);
|
|
|
|
}
|
|
|
|
else if (pargs.r_opt == oNoStrict )
|
|
|
|
{
|
|
|
|
opt.strict=0;
|
|
|
|
log_set_strict(0);
|
|
|
|
}
|
* armor.c, g10.c, kbnode.c, misc.c, pkclist.c, sign.c, build-packet.c,
getkey.c, keydb.c, openfile.c, plaintext.c, status.c, gpgv.c, keygen.c,
options.h, sig-check.c, tdbio.h, encode.c, mainproc.c, parse-packet.c,
signal.c, textfilter.c: Edit all preprocessor instructions to remove
whitespace before the '#'. This is not required by C89, but there are some
compilers out there that don't like it.
2003-05-24 21:50:33 +00:00
|
|
|
#ifdef USE_SHM_COPROCESSING
|
1998-09-28 19:25:31 +00:00
|
|
|
else if( pargs.r_opt == oRunAsShmCP ) {
|
|
|
|
/* does not make sense in a options file, we do it here,
|
|
|
|
* so that we are the able to drop setuid as soon as possible */
|
|
|
|
opt.shm_coprocess = 1;
|
|
|
|
requested_shm_size = pargs.r.ret_ulong;
|
|
|
|
}
|
1999-05-31 17:49:37 +00:00
|
|
|
else if ( pargs.r_opt == oStatusFD ) {
|
|
|
|
/* this is needed to ensure that the status-fd filedescriptor is
|
|
|
|
* initialized when init_shm_coprocessing() is called */
|
2002-06-29 13:46:34 +00:00
|
|
|
set_status_fd( iobuf_translate_file_handle (pargs.r.ret_int, 1) );
|
1999-05-31 17:49:37 +00:00
|
|
|
}
|
* armor.c, g10.c, kbnode.c, misc.c, pkclist.c, sign.c, build-packet.c,
getkey.c, keydb.c, openfile.c, plaintext.c, status.c, gpgv.c, keygen.c,
options.h, sig-check.c, tdbio.h, encode.c, mainproc.c, parse-packet.c,
signal.c, textfilter.c: Edit all preprocessor instructions to remove
whitespace before the '#'. This is not required by C89, but there are some
compilers out there that don't like it.
2003-05-24 21:50:33 +00:00
|
|
|
#endif
|
1998-09-28 19:25:31 +00:00
|
|
|
}
|
|
|
|
|
2002-06-29 13:46:34 +00:00
|
|
|
#ifdef HAVE_DOSISH_SYSTEM
|
|
|
|
if ( strchr (opt.homedir,'\\') ) {
|
|
|
|
char *d, *buf = m_alloc (strlen (opt.homedir)+1);
|
|
|
|
const char *s = opt.homedir;
|
|
|
|
for (d=buf,s=opt.homedir; *s; s++)
|
|
|
|
*d++ = *s == '\\'? '/': *s;
|
|
|
|
*d = 0;
|
2002-09-28 17:49:38 +00:00
|
|
|
set_homedir (buf);
|
2002-06-29 13:46:34 +00:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
#ifdef USE_SHM_COPROCESSING
|
1998-09-28 19:25:31 +00:00
|
|
|
if( opt.shm_coprocess ) {
|
|
|
|
init_shm_coprocessing(requested_shm_size, 1 );
|
1997-12-12 12:03:58 +00:00
|
|
|
}
|
2002-06-29 13:46:34 +00:00
|
|
|
#endif
|
1998-09-28 19:25:31 +00:00
|
|
|
/* initialize the secure memory. */
|
2004-12-16 05:16:09 +00:00
|
|
|
got_secmem=secmem_init( 32768 );
|
1998-09-28 19:25:31 +00:00
|
|
|
maybe_setuid = 0;
|
|
|
|
/* Okay, we are now working under our real uid */
|
|
|
|
|
2004-09-30 15:00:58 +00:00
|
|
|
#if defined(HAVE_GETUID) && defined(HAVE_GETEUID)
|
|
|
|
/* There should be no way to get to this spot while still carrying
|
|
|
|
setuid privs. Just in case, bomb out if we are. */
|
|
|
|
if(getuid()!=geteuid())
|
|
|
|
BUG();
|
|
|
|
#endif
|
|
|
|
|
2002-09-02 10:59:04 +00:00
|
|
|
set_native_charset (NULL); /* Try to auto set the character set */
|
|
|
|
|
2003-10-26 15:49:44 +00:00
|
|
|
/* Try for a version specific config file first */
|
1997-12-12 12:03:58 +00:00
|
|
|
if( default_config )
|
2002-08-06 13:29:27 +00:00
|
|
|
{
|
2003-10-26 15:49:44 +00:00
|
|
|
char *name=m_strdup("gpg" EXTSEP_S "conf-" SAFE_VERSION);
|
|
|
|
char *ver=&name[strlen("gpg" EXTSEP_S "conf-")];
|
|
|
|
|
|
|
|
do
|
2003-06-01 15:36:13 +00:00
|
|
|
{
|
2003-10-26 15:49:44 +00:00
|
|
|
if(configname)
|
|
|
|
{
|
|
|
|
char *tok;
|
|
|
|
|
|
|
|
m_free(configname);
|
|
|
|
configname=NULL;
|
|
|
|
|
|
|
|
if((tok=strrchr(ver,SAFE_VERSION_DASH)))
|
|
|
|
*tok='\0';
|
|
|
|
else if((tok=strrchr(ver,SAFE_VERSION_DOT)))
|
|
|
|
*tok='\0';
|
|
|
|
else
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
configname = make_filename(opt.homedir,name,NULL);
|
2003-06-01 15:36:13 +00:00
|
|
|
}
|
2003-10-26 15:49:44 +00:00
|
|
|
while(access(configname,R_OK));
|
|
|
|
|
|
|
|
m_free(name);
|
|
|
|
|
|
|
|
if(!configname)
|
|
|
|
configname=make_filename(opt.homedir, "gpg" EXTSEP_S "conf", NULL );
|
2002-08-06 13:29:27 +00:00
|
|
|
if (!access (configname, R_OK))
|
|
|
|
{ /* Print a warning when both config files are present. */
|
|
|
|
char *p = make_filename(opt.homedir, "options", NULL );
|
|
|
|
if (!access (p, R_OK))
|
|
|
|
log_info (_("NOTE: old default options file `%s' ignored\n"), p);
|
|
|
|
m_free (p);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{ /* Keep on using the old default one. */
|
|
|
|
m_free (configname);
|
|
|
|
configname = make_filename(opt.homedir, "options", NULL );
|
|
|
|
}
|
|
|
|
}
|
1997-12-12 12:03:58 +00:00
|
|
|
argc = orig_argc;
|
|
|
|
argv = orig_argv;
|
|
|
|
pargs.argc = &argc;
|
|
|
|
pargs.argv = &argv;
|
|
|
|
pargs.flags= 1; /* do not remove the args */
|
2002-08-07 15:53:15 +00:00
|
|
|
|
|
|
|
/* By this point we have a homedir, and cannot change it. */
|
|
|
|
check_permissions(opt.homedir,0);
|
|
|
|
|
1997-12-12 12:03:58 +00:00
|
|
|
next_pass:
|
|
|
|
if( configname ) {
|
2002-08-07 15:53:15 +00:00
|
|
|
if(check_permissions(configname,1))
|
2002-06-29 13:46:34 +00:00
|
|
|
{
|
|
|
|
/* If any options file is unsafe, then disable any external
|
|
|
|
programs for keyserver calls or photo IDs. Since the
|
|
|
|
external program to call is set in the options file, a
|
|
|
|
unsafe options file can lead to an arbitrary program
|
|
|
|
being run. */
|
|
|
|
|
|
|
|
opt.exec_disable=1;
|
|
|
|
}
|
|
|
|
|
1997-12-12 12:03:58 +00:00
|
|
|
configlineno = 0;
|
|
|
|
configfp = fopen( configname, "r" );
|
2004-10-13 18:10:06 +00:00
|
|
|
if (configfp && is_secured_file (fileno (configfp)))
|
|
|
|
{
|
|
|
|
fclose (configfp);
|
|
|
|
configfp = NULL;
|
|
|
|
errno = EPERM;
|
|
|
|
}
|
1997-12-12 12:03:58 +00:00
|
|
|
if( !configfp ) {
|
|
|
|
if( default_config ) {
|
1998-02-11 23:22:09 +00:00
|
|
|
if( parse_debug )
|
1998-12-29 13:47:31 +00:00
|
|
|
log_info(_("NOTE: no default option file `%s'\n"),
|
1998-02-17 20:48:52 +00:00
|
|
|
configname );
|
1997-12-12 12:03:58 +00:00
|
|
|
}
|
1998-02-13 20:58:50 +00:00
|
|
|
else {
|
1998-12-29 13:47:31 +00:00
|
|
|
log_error(_("option file `%s': %s\n"),
|
1997-12-12 12:03:58 +00:00
|
|
|
configname, strerror(errno) );
|
2002-06-29 13:46:34 +00:00
|
|
|
g10_exit(2);
|
1998-02-13 20:58:50 +00:00
|
|
|
}
|
2002-06-29 13:46:34 +00:00
|
|
|
m_free(configname); configname = NULL;
|
1997-12-12 12:03:58 +00:00
|
|
|
}
|
1998-02-11 23:22:09 +00:00
|
|
|
if( parse_debug && configname )
|
1998-12-29 13:47:31 +00:00
|
|
|
log_info(_("reading options from `%s'\n"), configname );
|
1997-12-12 12:03:58 +00:00
|
|
|
default_config = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
while( optfile_parse( configfp, configname, &configlineno,
|
2003-10-01 15:15:58 +00:00
|
|
|
&pargs, opts) )
|
|
|
|
{
|
|
|
|
switch( pargs.r_opt )
|
|
|
|
{
|
2004-05-20 17:06:34 +00:00
|
|
|
case aCheckKeys:
|
|
|
|
case aListConfig:
|
|
|
|
case aGPGConfList:
|
|
|
|
case aListPackets:
|
|
|
|
case aImport:
|
|
|
|
case aFastImport:
|
|
|
|
case aSendKeys:
|
|
|
|
case aRecvKeys:
|
|
|
|
case aSearchKeys:
|
|
|
|
case aRefreshKeys:
|
|
|
|
case aExport:
|
|
|
|
set_cmd (&cmd, pargs.r_opt);
|
|
|
|
break;
|
1998-09-11 05:47:32 +00:00
|
|
|
case aListKeys: set_cmd( &cmd, aListKeys); break;
|
|
|
|
case aListSigs: set_cmd( &cmd, aListSigs); break;
|
|
|
|
case aExportSecret: set_cmd( &cmd, aExportSecret); break;
|
2000-07-14 17:34:53 +00:00
|
|
|
case aExportSecretSub: set_cmd( &cmd, aExportSecretSub); break;
|
2004-01-22 03:47:05 +00:00
|
|
|
case aDeleteSecretKeys:
|
|
|
|
set_cmd( &cmd, aDeleteSecretKeys);
|
|
|
|
greeting=1;
|
|
|
|
break;
|
2002-06-29 13:46:34 +00:00
|
|
|
case aDeleteSecretAndPublicKeys:
|
|
|
|
set_cmd( &cmd, aDeleteSecretAndPublicKeys);
|
|
|
|
greeting=1;
|
|
|
|
break;
|
|
|
|
case aDeleteKeys: set_cmd( &cmd, aDeleteKeys); greeting=1; break;
|
1998-03-05 09:22:13 +00:00
|
|
|
|
1998-08-11 17:29:34 +00:00
|
|
|
case aDetachedSign: detached_sig = 1; set_cmd( &cmd, aSign ); break;
|
|
|
|
case aSym: set_cmd( &cmd, aSym); break;
|
2000-07-14 17:34:53 +00:00
|
|
|
|
2003-09-09 00:25:53 +00:00
|
|
|
case aDecryptFiles: multifile=1; /* fall through */
|
1998-08-11 17:29:34 +00:00
|
|
|
case aDecrypt: set_cmd( &cmd, aDecrypt); break;
|
2000-07-14 17:34:53 +00:00
|
|
|
|
2003-09-09 00:25:53 +00:00
|
|
|
case aEncrFiles: multifile=1; /* fall through */
|
1998-08-11 17:29:34 +00:00
|
|
|
case aEncr: set_cmd( &cmd, aEncr); break;
|
2003-09-09 00:25:53 +00:00
|
|
|
|
|
|
|
case aVerifyFiles: multifile=1; /* fall through */
|
|
|
|
case aVerify: set_cmd( &cmd, aVerify); break;
|
|
|
|
|
1998-08-11 17:29:34 +00:00
|
|
|
case aSign: set_cmd( &cmd, aSign ); break;
|
1999-07-13 15:41:14 +00:00
|
|
|
case aKeygen: set_cmd( &cmd, aKeygen); greeting=1; break;
|
1998-09-11 05:47:32 +00:00
|
|
|
case aSignKey: set_cmd( &cmd, aSignKey); break;
|
1999-07-12 16:49:22 +00:00
|
|
|
case aLSignKey: set_cmd( &cmd, aLSignKey); break;
|
1998-09-11 05:47:32 +00:00
|
|
|
case aStore: set_cmd( &cmd, aStore); break;
|
1999-07-13 15:41:14 +00:00
|
|
|
case aEditKey: set_cmd( &cmd, aEditKey); greeting=1; break;
|
1998-08-11 17:29:34 +00:00
|
|
|
case aClearsign: set_cmd( &cmd, aClearsign); break;
|
1998-09-11 05:47:32 +00:00
|
|
|
case aGenRevoke: set_cmd( &cmd, aGenRevoke); break;
|
2002-06-29 13:46:34 +00:00
|
|
|
case aDesigRevoke: set_cmd( &cmd, aDesigRevoke); break;
|
1999-04-18 08:18:52 +00:00
|
|
|
case aPrimegen: set_cmd( &cmd, aPrimegen); break;
|
|
|
|
case aGenRandom: set_cmd( &cmd, aGenRandom); break;
|
1998-09-11 05:47:32 +00:00
|
|
|
case aPrintMD: set_cmd( &cmd, aPrintMD); break;
|
|
|
|
case aPrintMDs: set_cmd( &cmd, aPrintMDs); break;
|
|
|
|
case aListTrustDB: set_cmd( &cmd, aListTrustDB); break;
|
|
|
|
case aCheckTrustDB: set_cmd( &cmd, aCheckTrustDB); break;
|
1998-10-16 16:00:17 +00:00
|
|
|
case aUpdateTrustDB: set_cmd( &cmd, aUpdateTrustDB); break;
|
1998-10-07 13:30:43 +00:00
|
|
|
case aFixTrustDB: set_cmd( &cmd, aFixTrustDB); break;
|
1998-09-11 05:47:32 +00:00
|
|
|
case aListTrustPath: set_cmd( &cmd, aListTrustPath); break;
|
1999-07-13 15:41:14 +00:00
|
|
|
case aDeArmor: set_cmd( &cmd, aDeArmor); break;
|
|
|
|
case aEnArmor: set_cmd( &cmd, aEnArmor); break;
|
2003-03-24 20:05:53 +00:00
|
|
|
case aListOwnerTrust:
|
|
|
|
deprecated_warning(configname,configlineno,
|
|
|
|
"--list-ownertrust","--export-ownertrust","");
|
1998-09-11 05:47:32 +00:00
|
|
|
case aExportOwnerTrust: set_cmd( &cmd, aExportOwnerTrust); break;
|
|
|
|
case aImportOwnerTrust: set_cmd( &cmd, aImportOwnerTrust); break;
|
2002-06-29 13:46:34 +00:00
|
|
|
case aPipeMode: set_cmd( &cmd, aPipeMode); break;
|
|
|
|
case aRebuildKeydbCaches: set_cmd( &cmd, aRebuildKeydbCaches); break;
|
1998-09-11 05:47:32 +00:00
|
|
|
|
2003-09-28 13:41:58 +00:00
|
|
|
#ifdef ENABLE_CARD_SUPPORT
|
|
|
|
case aCardStatus: set_cmd (&cmd, aCardStatus); break;
|
|
|
|
case aCardEdit: set_cmd (&cmd, aCardEdit); break;
|
|
|
|
case aChangePIN: set_cmd (&cmd, aChangePIN); break;
|
|
|
|
case oReaderPort:
|
2003-10-08 15:21:20 +00:00
|
|
|
card_set_reader_port (pargs.r.ret_str);
|
2003-09-28 13:41:58 +00:00
|
|
|
break;
|
|
|
|
case octapiDriver: opt.ctapi_driver = pargs.r.ret_str; break;
|
|
|
|
case opcscDriver: opt.pcsc_driver = pargs.r.ret_str; break;
|
|
|
|
case oDisableCCID: opt.disable_ccid = 1; break;
|
|
|
|
#endif /* ENABLE_CARD_SUPPORT*/
|
|
|
|
|
1998-09-11 05:47:32 +00:00
|
|
|
case oArmor: opt.armor = 1; opt.no_armor=0; break;
|
1998-08-11 17:29:34 +00:00
|
|
|
case oOutput: opt.outfile = pargs.r.ret_str; break;
|
2004-02-18 23:09:27 +00:00
|
|
|
case oMaxOutput: opt.max_output = pargs.r.ret_ulong; break;
|
1998-10-25 19:00:01 +00:00
|
|
|
case oQuiet: opt.quiet = 1; break;
|
2000-09-18 14:35:34 +00:00
|
|
|
case oNoTTY: tty_no_terminal(1); break;
|
1999-02-25 17:51:55 +00:00
|
|
|
case oDryRun: opt.dry_run = 1; break;
|
1999-05-19 14:12:26 +00:00
|
|
|
case oInteractive: opt.interactive = 1; break;
|
2003-09-25 04:03:11 +00:00
|
|
|
case oVerbose:
|
|
|
|
g10_opt_verbose++;
|
|
|
|
opt.verbose++;
|
|
|
|
opt.list_options|=LIST_SHOW_UNUSABLE_UIDS;
|
2004-02-11 13:46:23 +00:00
|
|
|
opt.list_options|=LIST_SHOW_UNUSABLE_SUBKEYS;
|
2003-09-25 04:03:11 +00:00
|
|
|
break;
|
1998-08-11 17:29:34 +00:00
|
|
|
case oKOption: set_cmd( &cmd, aKMode ); break;
|
1998-03-05 09:22:13 +00:00
|
|
|
|
2002-06-29 13:46:34 +00:00
|
|
|
case oBatch: opt.batch = 1; nogreeting = 1; break;
|
|
|
|
case oUseAgent:
|
|
|
|
#ifndef __riscos__
|
|
|
|
opt.use_agent = 1;
|
|
|
|
#else /* __riscos__ */
|
|
|
|
opt.use_agent = 0;
|
2002-10-31 16:58:47 +00:00
|
|
|
riscos_not_implemented("use-agent");
|
2002-06-29 13:46:34 +00:00
|
|
|
#endif /* __riscos__ */
|
|
|
|
break;
|
|
|
|
case oNoUseAgent: opt.use_agent = 0; break;
|
|
|
|
case oGpgAgentInfo: opt.gpg_agent_info = pargs.r.ret_str; break;
|
1998-09-11 05:47:32 +00:00
|
|
|
case oAnswerYes: opt.answer_yes = 1; break;
|
|
|
|
case oAnswerNo: opt.answer_no = 1; break;
|
|
|
|
case oKeyring: append_to_strlist( &nrings, pargs.r.ret_str); break;
|
2002-11-25 03:18:48 +00:00
|
|
|
case oPrimaryKeyring:
|
2002-11-08 03:31:21 +00:00
|
|
|
sl=append_to_strlist( &nrings, pargs.r.ret_str);
|
|
|
|
sl->flags=2;
|
|
|
|
break;
|
2003-10-10 03:05:05 +00:00
|
|
|
case oShowKeyring:
|
|
|
|
deprecated_warning(configname,configlineno,"--show-keyring",
|
|
|
|
"--list-options ","show-keyring");
|
|
|
|
opt.list_options|=LIST_SHOW_KEYRING;
|
|
|
|
break;
|
1998-09-11 05:47:32 +00:00
|
|
|
case oDebug: opt.debug |= pargs.r.ret_ulong; break;
|
|
|
|
case oDebugAll: opt.debug = ~0; break;
|
2004-09-15 15:26:38 +00:00
|
|
|
case oDebugCCIDDriver:
|
|
|
|
#if defined(ENABLE_CARD_SUPPORT) && defined(HAVE_LIBUSB)
|
|
|
|
ccid_set_debug_level (1);
|
|
|
|
#endif
|
|
|
|
break;
|
2002-06-29 13:46:34 +00:00
|
|
|
case oStatusFD:
|
|
|
|
set_status_fd( iobuf_translate_file_handle (pargs.r.ret_int, 1) );
|
|
|
|
break;
|
|
|
|
case oStatusFile:
|
2004-11-17 16:04:21 +00:00
|
|
|
set_status_fd ( open_info_file (pargs.r.ret_str, 1) );
|
2002-06-29 13:46:34 +00:00
|
|
|
break;
|
|
|
|
case oAttributeFD:
|
|
|
|
set_attrib_fd(iobuf_translate_file_handle (pargs.r.ret_int, 1));
|
|
|
|
break;
|
|
|
|
case oAttributeFile:
|
2004-11-17 16:04:21 +00:00
|
|
|
set_attrib_fd ( open_info_file (pargs.r.ret_str, 1) );
|
2002-06-29 13:46:34 +00:00
|
|
|
break;
|
|
|
|
case oLoggerFD:
|
|
|
|
log_set_logfile( NULL,
|
2004-11-17 16:04:21 +00:00
|
|
|
iobuf_translate_file_handle (pargs.r.ret_int, 1));
|
2002-06-29 13:46:34 +00:00
|
|
|
break;
|
|
|
|
case oLoggerFile:
|
2004-11-17 16:04:21 +00:00
|
|
|
log_set_logfile( NULL, open_info_file (pargs.r.ret_str, 1) );
|
2002-06-29 13:46:34 +00:00
|
|
|
break;
|
2004-11-17 16:04:21 +00:00
|
|
|
|
1999-07-08 14:24:35 +00:00
|
|
|
case oWithFingerprint:
|
2002-06-29 13:46:34 +00:00
|
|
|
opt.with_fingerprint = 1;
|
|
|
|
with_fpr=1; /*fall thru*/
|
1998-09-11 05:47:32 +00:00
|
|
|
case oFingerprint: opt.fingerprint++; break;
|
2004-11-17 16:04:21 +00:00
|
|
|
case oSecretKeyring:
|
|
|
|
append_to_strlist( &sec_nrings, pargs.r.ret_str);
|
|
|
|
break;
|
1998-09-11 05:47:32 +00:00
|
|
|
case oOptions:
|
1997-12-12 12:03:58 +00:00
|
|
|
/* config files may not be nested (silently ignore them) */
|
|
|
|
if( !configfp ) {
|
2002-06-29 13:46:34 +00:00
|
|
|
m_free(configname);
|
|
|
|
configname = m_strdup(pargs.r.ret_str);
|
1997-12-12 12:03:58 +00:00
|
|
|
goto next_pass;
|
|
|
|
}
|
|
|
|
break;
|
1998-09-11 05:47:32 +00:00
|
|
|
case oNoArmor: opt.no_armor=1; opt.armor=0; break;
|
|
|
|
case oNoDefKeyring: default_keyring = 0; break;
|
2004-02-24 23:37:18 +00:00
|
|
|
case oDefCertLevel: opt.def_cert_level=pargs.r.ret_int; break;
|
|
|
|
case oMinCertLevel: opt.min_cert_level=pargs.r.ret_int; break;
|
1999-07-14 17:47:23 +00:00
|
|
|
case oNoGreeting: nogreeting = 1; break;
|
2002-06-29 13:46:34 +00:00
|
|
|
case oNoVerbose: g10_opt_verbose = 0;
|
|
|
|
opt.verbose = 0; opt.list_sigs=0; break;
|
|
|
|
case oQuickRandom: quick_random_gen(1); break;
|
|
|
|
case oSKComments: opt.sk_comments=1; break;
|
|
|
|
case oNoSKComments: opt.sk_comments=0; break;
|
1999-06-15 12:31:07 +00:00
|
|
|
case oEmitVersion: opt.no_version=0; break;
|
2003-04-09 01:57:46 +00:00
|
|
|
case oNoEmitVersion: opt.no_version=1; break;
|
1998-09-11 05:47:32 +00:00
|
|
|
case oCompletesNeeded: opt.completes_needed = pargs.r.ret_int; break;
|
|
|
|
case oMarginalsNeeded: opt.marginals_needed = pargs.r.ret_int; break;
|
1998-11-13 19:41:41 +00:00
|
|
|
case oMaxCertDepth: opt.max_cert_depth = pargs.r.ret_int; break;
|
1998-09-11 05:47:32 +00:00
|
|
|
case oTrustDBName: trustdb_name = pargs.r.ret_str; break;
|
|
|
|
case oDefaultKey: opt.def_secret_key = pargs.r.ret_str; break;
|
1999-07-13 15:41:14 +00:00
|
|
|
case oDefRecipient:
|
|
|
|
if( *pargs.r.ret_str )
|
|
|
|
opt.def_recipient = make_username(pargs.r.ret_str);
|
|
|
|
break;
|
|
|
|
case oDefRecipientSelf:
|
2002-06-29 13:46:34 +00:00
|
|
|
m_free(opt.def_recipient); opt.def_recipient = NULL;
|
1999-07-13 15:41:14 +00:00
|
|
|
opt.def_recipient_self = 1;
|
|
|
|
break;
|
|
|
|
case oNoDefRecipient:
|
2002-06-29 13:46:34 +00:00
|
|
|
m_free(opt.def_recipient); opt.def_recipient = NULL;
|
1999-07-13 15:41:14 +00:00
|
|
|
opt.def_recipient_self = 0;
|
|
|
|
break;
|
2002-06-29 13:46:34 +00:00
|
|
|
case oNoOptions: opt.no_homedir_creation = 1; break; /* no-options */
|
|
|
|
case oHomedir: break;
|
1998-09-11 05:47:32 +00:00
|
|
|
case oNoBatch: opt.batch = 0; break;
|
1999-06-08 11:41:46 +00:00
|
|
|
case oWithKeyData: opt.with_key_data=1; /* fall thru */
|
1998-09-11 05:47:32 +00:00
|
|
|
case oWithColons: opt.with_colons=':'; break;
|
|
|
|
|
|
|
|
case oSkipVerify: opt.skip_verify=1; break;
|
|
|
|
case oCompressKeys: opt.compress_keys = 1; break;
|
|
|
|
case aListSecretKeys: set_cmd( &cmd, aListSecretKeys); break;
|
2002-11-03 20:18:56 +00:00
|
|
|
/* There are many programs (like mutt) that call gpg with
|
|
|
|
--always-trust so keep this option around for a long
|
|
|
|
time. */
|
|
|
|
case oAlwaysTrust: opt.trust_model=TM_ALWAYS; break;
|
|
|
|
case oTrustModel:
|
2004-10-13 15:34:52 +00:00
|
|
|
parse_trust_model(pargs.r.ret_str);
|
2002-11-03 20:18:56 +00:00
|
|
|
break;
|
2002-11-07 04:37:27 +00:00
|
|
|
case oForceOwnertrust:
|
|
|
|
log_info(_("NOTE: %s is not for normal use!\n"),
|
|
|
|
"--force-ownertrust");
|
* tdbio.c (create_version_record): Only create new trustdbs with
TM_CLASSIC or TM_PGP.
* trustdb.h, trustdb.c (trust_string, get_ownertrust_string,
get_validity_string, ask_ownertrust, validate_keys), pkclist.c
(do_edit_ownertrust): Rename trust_string to trust_value_to_string for
naming consistency.
* trustdb.h, trustdb.c (string_to_trust_value): New function to translate
a string to a trust value.
* g10.c (main): Use string_to_trust_value here for --force-ownertrust.
* options.h, g10.c (main), trustdb.c (trust_model_string, init_trustdb,
check_trustdb, update_trustdb, get_validity, validate_one_keyblock): An
"OpenPGP" trust model is misleading since there is no official OpenPGP
trust model. Use "PGP" instead.
2003-05-01 21:37:08 +00:00
|
|
|
opt.force_ownertrust=string_to_trust_value(pargs.r.ret_str);
|
|
|
|
if(opt.force_ownertrust==-1)
|
|
|
|
{
|
2004-10-11 21:08:37 +00:00
|
|
|
log_error("invalid ownertrust `%s'\n",pargs.r.ret_str);
|
* tdbio.c (create_version_record): Only create new trustdbs with
TM_CLASSIC or TM_PGP.
* trustdb.h, trustdb.c (trust_string, get_ownertrust_string,
get_validity_string, ask_ownertrust, validate_keys), pkclist.c
(do_edit_ownertrust): Rename trust_string to trust_value_to_string for
naming consistency.
* trustdb.h, trustdb.c (string_to_trust_value): New function to translate
a string to a trust value.
* g10.c (main): Use string_to_trust_value here for --force-ownertrust.
* options.h, g10.c (main), trustdb.c (trust_model_string, init_trustdb,
check_trustdb, update_trustdb, get_validity, validate_one_keyblock): An
"OpenPGP" trust model is misleading since there is no official OpenPGP
trust model. Use "PGP" instead.
2003-05-01 21:37:08 +00:00
|
|
|
opt.force_ownertrust=0;
|
|
|
|
}
|
2002-11-07 04:37:27 +00:00
|
|
|
break;
|
1998-10-16 16:00:17 +00:00
|
|
|
case oLoadExtension:
|
2002-06-29 13:46:34 +00:00
|
|
|
#ifndef __riscos__
|
2003-08-29 00:14:42 +00:00
|
|
|
#if defined(USE_DYNAMIC_LINKING) || defined(_WIN32)
|
2002-08-07 15:53:15 +00:00
|
|
|
if(check_permissions(pargs.r.ret_str,2))
|
2004-08-27 17:32:31 +00:00
|
|
|
log_info(_("cipher extension `%s' not loaded due to"
|
|
|
|
" unsafe permissions\n"),pargs.r.ret_str);
|
2002-08-07 15:53:15 +00:00
|
|
|
else
|
|
|
|
register_cipher_extension(orig_argc? *orig_argv:NULL,
|
|
|
|
pargs.r.ret_str);
|
|
|
|
#endif
|
2002-06-29 13:46:34 +00:00
|
|
|
#else /* __riscos__ */
|
2002-10-31 16:58:47 +00:00
|
|
|
riscos_not_implemented("load-extension");
|
2002-06-29 13:46:34 +00:00
|
|
|
#endif /* __riscos__ */
|
1998-10-16 16:00:17 +00:00
|
|
|
break;
|
1998-12-17 17:36:05 +00:00
|
|
|
case oRFC1991:
|
* packet.h, build-packet.c (build_sig_subpkt), export.c
(do_export_stream), import.c (remove_bad_stuff, import), parse-packet.c
(dump_sig_subpkt, parse_one_sig_subpkt): Remove vestigal code for the old
sig cache subpacket. This wasn't completely harmless as it caused
subpacket 101 to disappear on import and export.
* options.h, armor.c, cipher.c, g10.c, keyedit.c, pkclist.c, sign.c,
encode.c, getkey.c, revoke.c: The current flags for different levels of
PGP-ness are massively complex. This is step one in simplifying them. No
functional change yet, just use a macro to check for compliance level.
* sign.c (sign_file): Fix bug that causes spurious compression preference
warning.
* sign.c (clearsign_file): Fix bug that prevents proper warning message
from appearing when clearsigning in --pgp2 mode with a non-v3 RSA key.
* main.h, misc.c (compliance_option_string, compliance_string,
compliance_failure), pkclist.c (build_pk_list), sign.c (sign_file,
clearsign_file), encode.c (encode_crypt, write_pubkey_enc_from_list): New
functions to put the "this message may not be usable...." warning in one
place.
* options.h, g10.c (main): Part two of the simplification. Use a single
enum to indicate what we are compliant to (1991, 2440, PGPx, etc.)
* g10.c (main): Show errors for failure in export, send-keys, recv-keys,
and refresh-keys.
* options.h, g10.c (main): Give algorithm warnings for algorithms chosen
against the --pgpX and --openpgp rules.
* keydb.h, pkclist.c (algo_available): Make TIGER192 invalid in --openpgp
mode.
* sign.c (sign_file), pkclist.c (algo_available): Allow passing a hint of
0.
2003-05-03 04:07:45 +00:00
|
|
|
opt.compliance = CO_RFC1991;
|
2002-06-29 13:46:34 +00:00
|
|
|
opt.force_v4_certs = 0;
|
1998-12-17 17:36:05 +00:00
|
|
|
opt.escape_from = 1;
|
|
|
|
break;
|
1999-06-15 12:31:07 +00:00
|
|
|
case oOpenPGP:
|
2004-12-20 05:19:09 +00:00
|
|
|
case oRFC2440:
|
|
|
|
/* TODO: When 2440bis becomes a RFC, set new values for
|
|
|
|
oOpenPGP. */
|
|
|
|
opt.rfc2440_text=1;
|
* packet.h, build-packet.c (build_sig_subpkt), export.c
(do_export_stream), import.c (remove_bad_stuff, import), parse-packet.c
(dump_sig_subpkt, parse_one_sig_subpkt): Remove vestigal code for the old
sig cache subpacket. This wasn't completely harmless as it caused
subpacket 101 to disappear on import and export.
* options.h, armor.c, cipher.c, g10.c, keyedit.c, pkclist.c, sign.c,
encode.c, getkey.c, revoke.c: The current flags for different levels of
PGP-ness are massively complex. This is step one in simplifying them. No
functional change yet, just use a macro to check for compliance level.
* sign.c (sign_file): Fix bug that causes spurious compression preference
warning.
* sign.c (clearsign_file): Fix bug that prevents proper warning message
from appearing when clearsigning in --pgp2 mode with a non-v3 RSA key.
* main.h, misc.c (compliance_option_string, compliance_string,
compliance_failure), pkclist.c (build_pk_list), sign.c (sign_file,
clearsign_file), encode.c (encode_crypt, write_pubkey_enc_from_list): New
functions to put the "this message may not be usable...." warning in one
place.
* options.h, g10.c (main): Part two of the simplification. Use a single
enum to indicate what we are compliant to (1991, 2440, PGPx, etc.)
* g10.c (main): Show errors for failure in export, send-keys, recv-keys,
and refresh-keys.
* options.h, g10.c (main): Give algorithm warnings for algorithms chosen
against the --pgpX and --openpgp rules.
* keydb.h, pkclist.c (algo_available): Make TIGER192 invalid in --openpgp
mode.
* sign.c (sign_file), pkclist.c (algo_available): Allow passing a hint of
0.
2003-05-03 04:07:45 +00:00
|
|
|
opt.compliance = CO_RFC2440;
|
2002-06-29 13:46:34 +00:00
|
|
|
opt.allow_non_selfsigned_uid = 1;
|
|
|
|
opt.allow_freeform_uid = 1;
|
2000-07-14 17:34:53 +00:00
|
|
|
opt.pgp2_workarounds = 0;
|
1999-06-15 12:31:07 +00:00
|
|
|
opt.escape_from = 0;
|
|
|
|
opt.force_v3_sigs = 0;
|
2004-12-20 05:19:09 +00:00
|
|
|
opt.compress_keys = 0; /* not mandated, but we do it */
|
1999-06-15 12:31:07 +00:00
|
|
|
opt.compress_sigs = 0; /* ditto. */
|
|
|
|
opt.not_dash_escaped = 0;
|
|
|
|
opt.def_cipher_algo = 0;
|
|
|
|
opt.def_digest_algo = 0;
|
2002-06-29 13:46:34 +00:00
|
|
|
opt.cert_digest_algo = 0;
|
2003-11-15 22:31:58 +00:00
|
|
|
opt.compress_algo = -1;
|
2002-06-29 13:46:34 +00:00
|
|
|
opt.s2k_mode = 3; /* iterated+salted */
|
|
|
|
opt.s2k_digest_algo = DIGEST_ALGO_SHA1;
|
2003-02-21 20:43:17 +00:00
|
|
|
opt.s2k_cipher_algo = CIPHER_ALGO_3DES;
|
1999-06-15 12:31:07 +00:00
|
|
|
break;
|
* trustdb.h, trustdb.c (is_disabled), gpgv.c (is_disabled): Rename
is_disabled to cache_disabled_value, which now takes a pk and not just the
keyid. This is for speed since there is no need to re-fetch a key when we
already have that key handy. Cache the result of the check so we don't
need to hit the trustdb more than once.
* getkey.c (skip_disabled): New function to get a pk and call is_disabled
on it. (key_byname): Use it here.
* packet.h, getkey.c (skip_disabled), keylist.c (print_capabilities): New
"pk_is_disabled" macro to retrieve the cached disabled value if available,
and fill it in via cache_disabled_value if not available.
* trustdb.c (get_validity): Cache the disabled value since we have it
handy and it might be useful later.
* parse-packet.c (parse_key): Clear disabled flag when parsing a new key.
Just in case someone forgets to clear the whole key.
* getkey.c (merge_selfsigs_main): Add an "if all else fails" path for
setting a single user ID primary when there are multiple set primaries all
at the same second, or no primaries set and the most recent user IDs are
at the same second, or no signed user IDs at all. This is arbitrary, but
deterministic.
* exec.h, photoid.h: Add copyright message.
* keylist.c (list_keyblock_print): Don't dump attribs for
revoked/expired/etc uids for non-colon key listings. This is for
consistency with --show-photos.
* main.h, keylist.c (dump_attribs), mainproc.c (check_sig_and_print): Dump
attribs if --attrib-fd is set when verifying signatures.
* g10.c (main): New --gnupg option to disable the various --openpgp,
--pgpX, etc. options. This is the same as --no-XXXX for those options.
* revoke.c (ask_revocation_reason): Clear old reason if user elects to
repeat question. This is bug 153.
* keyedit.c (sign_uids): Show keyid of the key making the signature.
2003-05-21 16:42:22 +00:00
|
|
|
case oPGP2: opt.compliance = CO_PGP2; break;
|
|
|
|
case oPGP6: opt.compliance = CO_PGP6; break;
|
|
|
|
case oPGP7: opt.compliance = CO_PGP7; break;
|
|
|
|
case oPGP8: opt.compliance = CO_PGP8; break;
|
|
|
|
case oGnuPG: opt.compliance = CO_GNUPG; break;
|
1998-09-11 05:47:32 +00:00
|
|
|
case oCompressSigs: opt.compress_sigs = 1; break;
|
2004-12-20 05:19:09 +00:00
|
|
|
case oRFC2440Text: opt.rfc2440_text=1; break;
|
|
|
|
case oNoRFC2440Text: opt.rfc2440_text=0; break;
|
1998-09-11 05:47:32 +00:00
|
|
|
case oRunAsShmCP:
|
2002-06-29 13:46:34 +00:00
|
|
|
#ifndef __riscos__
|
2002-09-10 08:40:12 +00:00
|
|
|
# ifndef USE_SHM_COPROCESSING
|
1998-09-28 19:25:31 +00:00
|
|
|
/* not possible in the option file,
|
|
|
|
* but we print the warning here anyway */
|
1998-07-31 16:45:58 +00:00
|
|
|
log_error("shared memory coprocessing is not available\n");
|
2002-09-10 08:40:12 +00:00
|
|
|
# endif
|
2002-06-29 13:46:34 +00:00
|
|
|
#else /* __riscos__ */
|
2002-10-31 16:58:47 +00:00
|
|
|
riscos_not_implemented("run-as-shm-coprocess");
|
2002-06-29 13:46:34 +00:00
|
|
|
#endif /* __riscos__ */
|
1998-07-31 16:45:58 +00:00
|
|
|
break;
|
1998-09-11 05:47:32 +00:00
|
|
|
case oSetFilename: opt.set_filename = pargs.r.ret_str; break;
|
2002-06-29 13:46:34 +00:00
|
|
|
case oForYourEyesOnly: eyes_only = 1; break;
|
|
|
|
case oNoForYourEyesOnly: eyes_only = 0; break;
|
|
|
|
case oSetPolicyURL:
|
|
|
|
add_policy_url(pargs.r.ret_str,0);
|
|
|
|
add_policy_url(pargs.r.ret_str,1);
|
|
|
|
break;
|
|
|
|
case oSigPolicyURL: add_policy_url(pargs.r.ret_str,0); break;
|
|
|
|
case oCertPolicyURL: add_policy_url(pargs.r.ret_str,1); break;
|
* mainproc.c (check_sig_and_print), main.h, keylist.c (show_policy,
show_notation): Collapse the old print_notation_data into show_policy()
and show_notation() so there is only one function to print notations and
policy URLs.
* options.h, main.h, g10.c (main), keyedit.c (print_and_check_one_sig),
keylist.c (list_one, list_keyblock_print), pkclist.c (do_edit_ownertrust),
sign.c (mk_notation_and_policy): New "list-options" and "verify-options"
commands. These replace the existing --show-photos/--no-show-photos,
--show-notation/--no-show-notation,
--show-policy-url/--no-show-policy-url, and --show-keyring options. The
new method is more flexible since a user can specify (for example) showing
photos during sig verification, but not in key listings. The old options
are emulated.
2003-05-31 23:23:19 +00:00
|
|
|
case oShowPolicyURL:
|
2003-10-10 03:05:05 +00:00
|
|
|
deprecated_warning(configname,configlineno,"--show-policy-url",
|
2003-11-14 05:06:19 +00:00
|
|
|
"--list-options ","show-policy-urls");
|
2003-10-10 03:05:05 +00:00
|
|
|
deprecated_warning(configname,configlineno,"--show-policy-url",
|
2003-11-14 05:06:19 +00:00
|
|
|
"--verify-options ","show-policy-urls");
|
|
|
|
opt.list_options|=LIST_SHOW_POLICY_URLS;
|
|
|
|
opt.verify_options|=VERIFY_SHOW_POLICY_URLS;
|
* mainproc.c (check_sig_and_print), main.h, keylist.c (show_policy,
show_notation): Collapse the old print_notation_data into show_policy()
and show_notation() so there is only one function to print notations and
policy URLs.
* options.h, main.h, g10.c (main), keyedit.c (print_and_check_one_sig),
keylist.c (list_one, list_keyblock_print), pkclist.c (do_edit_ownertrust),
sign.c (mk_notation_and_policy): New "list-options" and "verify-options"
commands. These replace the existing --show-photos/--no-show-photos,
--show-notation/--no-show-notation,
--show-policy-url/--no-show-policy-url, and --show-keyring options. The
new method is more flexible since a user can specify (for example) showing
photos during sig verification, but not in key listings. The old options
are emulated.
2003-05-31 23:23:19 +00:00
|
|
|
break;
|
|
|
|
case oNoShowPolicyURL:
|
2003-10-10 03:05:05 +00:00
|
|
|
deprecated_warning(configname,configlineno,"--no-show-policy-url",
|
2003-11-14 05:06:19 +00:00
|
|
|
"--list-options ","no-show-policy-urls");
|
2003-10-10 03:05:05 +00:00
|
|
|
deprecated_warning(configname,configlineno,"--no-show-policy-url",
|
2003-11-14 05:06:19 +00:00
|
|
|
"--verify-options ","no-show-policy-urls");
|
|
|
|
opt.list_options&=~LIST_SHOW_POLICY_URLS;
|
|
|
|
opt.verify_options&=~VERIFY_SHOW_POLICY_URLS;
|
* mainproc.c (check_sig_and_print), main.h, keylist.c (show_policy,
show_notation): Collapse the old print_notation_data into show_policy()
and show_notation() so there is only one function to print notations and
policy URLs.
* options.h, main.h, g10.c (main), keyedit.c (print_and_check_one_sig),
keylist.c (list_one, list_keyblock_print), pkclist.c (do_edit_ownertrust),
sign.c (mk_notation_and_policy): New "list-options" and "verify-options"
commands. These replace the existing --show-photos/--no-show-photos,
--show-notation/--no-show-notation,
--show-policy-url/--no-show-policy-url, and --show-keyring options. The
new method is more flexible since a user can specify (for example) showing
photos during sig verification, but not in key listings. The old options
are emulated.
2003-05-31 23:23:19 +00:00
|
|
|
break;
|
2003-07-24 19:28:12 +00:00
|
|
|
case oSigKeyserverURL: add_keyserver_url(pargs.r.ret_str,0); break;
|
1999-06-01 14:08:57 +00:00
|
|
|
case oUseEmbeddedFilename: opt.use_embedded_filename = 1; break;
|
2004-04-16 16:31:19 +00:00
|
|
|
case oNoUseEmbeddedFilename: opt.use_embedded_filename = 0; break;
|
2003-10-14 23:30:14 +00:00
|
|
|
case oComment:
|
|
|
|
if(pargs.r.ret_str[0])
|
2004-03-19 23:15:27 +00:00
|
|
|
append_to_strlist(&opt.comments,pargs.r.ret_str);
|
2003-10-14 23:30:14 +00:00
|
|
|
break;
|
2003-09-23 03:52:55 +00:00
|
|
|
case oDefaultComment:
|
|
|
|
deprecated_warning(configname,configlineno,
|
|
|
|
"--default-comment","--no-comments","");
|
|
|
|
/* fall through */
|
|
|
|
case oNoComments:
|
|
|
|
free_strlist(opt.comments);
|
|
|
|
opt.comments=NULL;
|
|
|
|
break;
|
2004-08-08 13:28:04 +00:00
|
|
|
case oThrowKeyids: opt.throw_keyid = 1; break;
|
|
|
|
case oNoThrowKeyids: opt.throw_keyid = 0; break;
|
2003-10-10 03:05:05 +00:00
|
|
|
case oShowPhotos:
|
|
|
|
deprecated_warning(configname,configlineno,"--show-photos",
|
|
|
|
"--list-options ","show-photos");
|
|
|
|
deprecated_warning(configname,configlineno,"--show-photos",
|
|
|
|
"--verify-options ","show-photos");
|
* mainproc.c (check_sig_and_print), main.h, keylist.c (show_policy,
show_notation): Collapse the old print_notation_data into show_policy()
and show_notation() so there is only one function to print notations and
policy URLs.
* options.h, main.h, g10.c (main), keyedit.c (print_and_check_one_sig),
keylist.c (list_one, list_keyblock_print), pkclist.c (do_edit_ownertrust),
sign.c (mk_notation_and_policy): New "list-options" and "verify-options"
commands. These replace the existing --show-photos/--no-show-photos,
--show-notation/--no-show-notation,
--show-policy-url/--no-show-policy-url, and --show-keyring options. The
new method is more flexible since a user can specify (for example) showing
photos during sig verification, but not in key listings. The old options
are emulated.
2003-05-31 23:23:19 +00:00
|
|
|
opt.list_options|=LIST_SHOW_PHOTOS;
|
|
|
|
opt.verify_options|=VERIFY_SHOW_PHOTOS;
|
|
|
|
break;
|
|
|
|
case oNoShowPhotos:
|
2003-10-10 03:05:05 +00:00
|
|
|
deprecated_warning(configname,configlineno,"--no-show-photos",
|
|
|
|
"--list-options ","no-show-photos");
|
|
|
|
deprecated_warning(configname,configlineno,"--no-show-photos",
|
|
|
|
"--verify-options ","no-show-photos");
|
* mainproc.c (check_sig_and_print), main.h, keylist.c (show_policy,
show_notation): Collapse the old print_notation_data into show_policy()
and show_notation() so there is only one function to print notations and
policy URLs.
* options.h, main.h, g10.c (main), keyedit.c (print_and_check_one_sig),
keylist.c (list_one, list_keyblock_print), pkclist.c (do_edit_ownertrust),
sign.c (mk_notation_and_policy): New "list-options" and "verify-options"
commands. These replace the existing --show-photos/--no-show-photos,
--show-notation/--no-show-notation,
--show-policy-url/--no-show-policy-url, and --show-keyring options. The
new method is more flexible since a user can specify (for example) showing
photos during sig verification, but not in key listings. The old options
are emulated.
2003-05-31 23:23:19 +00:00
|
|
|
opt.list_options&=~LIST_SHOW_PHOTOS;
|
|
|
|
opt.verify_options&=~VERIFY_SHOW_PHOTOS;
|
|
|
|
break;
|
2002-06-29 13:46:34 +00:00
|
|
|
case oPhotoViewer: opt.photo_viewer = pargs.r.ret_str; break;
|
1998-10-18 15:21:22 +00:00
|
|
|
case oForceV3Sigs: opt.force_v3_sigs = 1; break;
|
2002-06-29 13:46:34 +00:00
|
|
|
case oNoForceV3Sigs: opt.force_v3_sigs = 0; break;
|
|
|
|
case oForceV4Certs: opt.force_v4_certs = 1; break;
|
|
|
|
case oNoForceV4Certs: opt.force_v4_certs = 0; break;
|
1999-04-26 15:53:01 +00:00
|
|
|
case oForceMDC: opt.force_mdc = 1; break;
|
2002-06-29 13:46:34 +00:00
|
|
|
case oNoForceMDC: opt.force_mdc = 0; break;
|
|
|
|
case oDisableMDC: opt.disable_mdc = 1; break;
|
|
|
|
case oNoDisableMDC: opt.disable_mdc = 0; break;
|
1998-09-28 19:25:31 +00:00
|
|
|
case oS2KMode: opt.s2k_mode = pargs.r.ret_int; break;
|
2002-06-29 13:46:34 +00:00
|
|
|
case oS2KDigest: s2k_digest_string = m_strdup(pargs.r.ret_str); break;
|
|
|
|
case oS2KCipher: s2k_cipher_string = m_strdup(pargs.r.ret_str); break;
|
|
|
|
case oSimpleSKChecksum: opt.simple_sk_checksum = 1; break;
|
1999-02-19 14:54:00 +00:00
|
|
|
case oNoEncryptTo: opt.no_encrypt_to = 1; break;
|
1999-02-16 13:16:33 +00:00
|
|
|
case oEncryptTo: /* store the recipient in the second list */
|
1999-07-01 10:53:35 +00:00
|
|
|
sl = add_to_strlist2( &remusr, pargs.r.ret_str, utf8_strings );
|
1999-02-16 13:16:33 +00:00
|
|
|
sl->flags = 1;
|
|
|
|
break;
|
2002-11-01 16:15:45 +00:00
|
|
|
case oHiddenEncryptTo: /* store the recipient in the second list */
|
|
|
|
sl = add_to_strlist2( &remusr, pargs.r.ret_str, utf8_strings );
|
|
|
|
sl->flags = 1|2;
|
|
|
|
break;
|
1999-01-24 17:16:40 +00:00
|
|
|
case oRecipient: /* store the recipient */
|
1999-07-01 10:53:35 +00:00
|
|
|
add_to_strlist2( &remusr, pargs.r.ret_str, utf8_strings );
|
2002-06-29 13:46:34 +00:00
|
|
|
any_explicit_recipient = 1;
|
1998-09-11 05:47:32 +00:00
|
|
|
break;
|
2002-11-01 16:15:45 +00:00
|
|
|
case oHiddenRecipient: /* store the recipient with a flag */
|
|
|
|
sl = add_to_strlist2( &remusr, pargs.r.ret_str, utf8_strings );
|
|
|
|
sl->flags = 2;
|
|
|
|
any_explicit_recipient = 1;
|
|
|
|
break;
|
1998-11-03 19:38:58 +00:00
|
|
|
case oTextmodeShort: opt.textmode = 2; break;
|
1998-09-11 05:47:32 +00:00
|
|
|
case oTextmode: opt.textmode=1; break;
|
* g10.c (main): Add --no-textmode.
* export.c (do_export_stream), keyedit.c (show_key_with_all_names,
menu_addrevoker), mainproc.c (check_sig_and_print), photoid.c
(show_photos), sign.c (mk_notation_and_policy), trustdb.c (get_validity,
reset_trust_records, validate_keys): Make some strings translatable.
* mainproc.c (check_sig_and_print): Show digest algorithm and sig class
when verifying a sig with --verbose on, and add version, pk and hash
algorithms and sig class to VALIDSIG.
* parse-packet.c (enum_sig_subpkt): Make a warning message a --verbose
warning message since we don't need to warn every time we see an unknown
critical (we only need to invalidate the signature).
* trustdb.c (init_trustdb): Check the trustdb options even with TM_AUTO
since the auto may become TM_CLASSIC or TM_OPENPGP.
2003-04-27 20:22:09 +00:00
|
|
|
case oNoTextmode: opt.textmode=0; break;
|
2002-06-29 13:46:34 +00:00
|
|
|
case oExpert: opt.expert = 1; break;
|
|
|
|
case oNoExpert: opt.expert = 0; break;
|
|
|
|
case oAskSigExpire: opt.ask_sig_expire = 1; break;
|
|
|
|
case oNoAskSigExpire: opt.ask_sig_expire = 0; break;
|
|
|
|
case oAskCertExpire: opt.ask_cert_expire = 1; break;
|
|
|
|
case oNoAskCertExpire: opt.ask_cert_expire = 0; break;
|
2004-02-24 23:37:18 +00:00
|
|
|
case oAskCertLevel: opt.ask_cert_level = 1; break;
|
|
|
|
case oNoAskCertLevel: opt.ask_cert_level = 0; break;
|
1998-09-11 05:47:32 +00:00
|
|
|
case oUser: /* store the local users */
|
1999-07-01 10:53:35 +00:00
|
|
|
add_to_strlist2( &locusr, pargs.r.ret_str, utf8_strings );
|
1998-09-11 05:47:32 +00:00
|
|
|
break;
|
2003-11-15 22:31:58 +00:00
|
|
|
case oCompress:
|
|
|
|
/* this is the -z command line option */
|
|
|
|
opt.compress_level = opt.bz2_compress_level = pargs.r.ret_int;
|
|
|
|
break;
|
|
|
|
case oCompressLevel: opt.compress_level = pargs.r.ret_int; break;
|
|
|
|
case oBZ2CompressLevel: opt.bz2_compress_level = pargs.r.ret_int; break;
|
2004-03-25 22:43:51 +00:00
|
|
|
case oBZ2DecompressLowmem: opt.bz2_decompress_lowmem=1; break;
|
2002-06-29 13:46:34 +00:00
|
|
|
case oPasswdFD:
|
|
|
|
pwfd = iobuf_translate_file_handle (pargs.r.ret_int, 0);
|
2003-08-29 00:14:42 +00:00
|
|
|
opt.use_agent = 0;
|
2002-06-29 13:46:34 +00:00
|
|
|
break;
|
|
|
|
case oPasswdFile:
|
2004-11-17 16:04:21 +00:00
|
|
|
pwfd = open_info_file (pargs.r.ret_str, 0);
|
2002-06-29 13:46:34 +00:00
|
|
|
break;
|
|
|
|
case oCommandFD:
|
|
|
|
opt.command_fd = iobuf_translate_file_handle (pargs.r.ret_int, 0);
|
|
|
|
break;
|
|
|
|
case oCommandFile:
|
2004-11-17 16:04:21 +00:00
|
|
|
opt.command_fd = open_info_file (pargs.r.ret_str, 0);
|
|
|
|
break;
|
|
|
|
case oCipherAlgo:
|
|
|
|
def_cipher_string = m_strdup(pargs.r.ret_str);
|
|
|
|
break;
|
|
|
|
case oDigestAlgo:
|
|
|
|
def_digest_string = m_strdup(pargs.r.ret_str);
|
2002-06-29 13:46:34 +00:00
|
|
|
break;
|
2002-11-15 04:07:24 +00:00
|
|
|
case oCompressAlgo:
|
|
|
|
/* If it is all digits, stick a Z in front of it for
|
|
|
|
later. This is for backwards compatibility with
|
|
|
|
versions that took the compress algorithm number. */
|
|
|
|
{
|
|
|
|
char *pt=pargs.r.ret_str;
|
|
|
|
while(*pt)
|
|
|
|
{
|
|
|
|
if(!isdigit(*pt))
|
|
|
|
break;
|
|
|
|
|
|
|
|
pt++;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(*pt=='\0')
|
|
|
|
{
|
2003-11-15 22:31:58 +00:00
|
|
|
compress_algo_string=m_alloc(strlen(pargs.r.ret_str)+2);
|
|
|
|
strcpy(compress_algo_string,"Z");
|
|
|
|
strcat(compress_algo_string,pargs.r.ret_str);
|
2002-11-15 04:07:24 +00:00
|
|
|
}
|
|
|
|
else
|
2003-11-15 22:31:58 +00:00
|
|
|
compress_algo_string = m_strdup(pargs.r.ret_str);
|
2002-11-15 04:07:24 +00:00
|
|
|
}
|
|
|
|
break;
|
2002-06-29 13:46:34 +00:00
|
|
|
case oCertDigestAlgo: cert_digest_string = m_strdup(pargs.r.ret_str); break;
|
|
|
|
case oNoSecmemWarn: secmem_set_flags( secmem_get_flags() | 1 ); break;
|
2004-12-16 05:16:09 +00:00
|
|
|
case oRequireSecmem: require_secmem=1; break;
|
|
|
|
case oNoRequireSecmem: require_secmem=0; break;
|
2002-06-29 13:46:34 +00:00
|
|
|
case oNoPermissionWarn: opt.no_perm_warn=1; break;
|
2002-07-30 16:48:21 +00:00
|
|
|
case oNoMDCWarn: opt.no_mdc_warn=1; break;
|
2004-07-15 21:00:35 +00:00
|
|
|
case oDisplayCharset:
|
1998-11-10 12:59:59 +00:00
|
|
|
if( set_native_charset( pargs.r.ret_str ) )
|
2004-08-27 17:32:31 +00:00
|
|
|
log_error(_("`%s' is not a valid character set\n"),
|
|
|
|
pargs.r.ret_str);
|
1998-11-10 12:59:59 +00:00
|
|
|
break;
|
1998-11-20 17:42:18 +00:00
|
|
|
case oNotDashEscaped: opt.not_dash_escaped = 1; break;
|
1998-12-17 17:36:05 +00:00
|
|
|
case oEscapeFrom: opt.escape_from = 1; break;
|
2002-06-29 13:46:34 +00:00
|
|
|
case oNoEscapeFrom: opt.escape_from = 0; break;
|
1998-11-27 20:40:56 +00:00
|
|
|
case oLockOnce: opt.lock_once = 1; break;
|
2000-07-14 17:34:53 +00:00
|
|
|
case oLockNever: disable_dotlock(); break;
|
2002-06-29 13:46:34 +00:00
|
|
|
case oLockMultiple:
|
|
|
|
#ifndef __riscos__
|
|
|
|
opt.lock_once = 0;
|
|
|
|
#else /* __riscos__ */
|
2002-10-31 16:58:47 +00:00
|
|
|
riscos_not_implemented("lock-multiple");
|
2002-06-29 13:46:34 +00:00
|
|
|
#endif /* __riscos__ */
|
|
|
|
break;
|
|
|
|
case oKeyServer:
|
2004-05-08 13:51:14 +00:00
|
|
|
opt.keyserver=parse_keyserver_uri(pargs.r.ret_str,0,
|
2004-04-14 21:33:45 +00:00
|
|
|
configname,configlineno);
|
|
|
|
if(!opt.keyserver)
|
2004-05-08 13:51:14 +00:00
|
|
|
log_error(_("could not parse keyserver URL\n"));
|
2002-06-29 13:46:34 +00:00
|
|
|
break;
|
|
|
|
case oKeyServerOptions:
|
2004-04-19 16:02:11 +00:00
|
|
|
if(!parse_keyserver_options(pargs.r.ret_str))
|
|
|
|
{
|
|
|
|
if(configname)
|
|
|
|
log_error(_("%s:%d: invalid keyserver options\n"),
|
|
|
|
configname,configlineno);
|
|
|
|
else
|
|
|
|
log_error(_("invalid keyserver options\n"));
|
|
|
|
}
|
2002-06-29 13:46:34 +00:00
|
|
|
break;
|
2002-07-22 22:26:14 +00:00
|
|
|
case oImportOptions:
|
2003-12-28 03:46:43 +00:00
|
|
|
if(!parse_import_options(pargs.r.ret_str,&opt.import_options,1))
|
2002-07-22 22:26:14 +00:00
|
|
|
{
|
|
|
|
if(configname)
|
|
|
|
log_error(_("%s:%d: invalid import options\n"),
|
|
|
|
configname,configlineno);
|
|
|
|
else
|
|
|
|
log_error(_("invalid import options\n"));
|
|
|
|
}
|
|
|
|
break;
|
* options.h, main.h, export.c (parse_export_options, do_export_stream),
g10.c (main): add new --export-options option. Current flags are
"include-non-rfc", "include-local-sigs", "include-attributes", and
"include-sensitive-revkeys".
* options.h, hkp.c (hkp_export), keyserver.c (parse_keyserver_options,
keyserver_spawn): try passing unknown keyserver options to export options,
and if successful, use them when doing a keyserver --send-key.
* build-packet.c (build_sig_subpkt): We do not generate
SIGSUBPKT_PRIV_VERIFY_CACHE anymore.
2002-07-22 19:07:21 +00:00
|
|
|
case oExportOptions:
|
2003-12-28 03:46:43 +00:00
|
|
|
if(!parse_export_options(pargs.r.ret_str,&opt.export_options,1))
|
* options.h, main.h, export.c (parse_export_options, do_export_stream),
g10.c (main): add new --export-options option. Current flags are
"include-non-rfc", "include-local-sigs", "include-attributes", and
"include-sensitive-revkeys".
* options.h, hkp.c (hkp_export), keyserver.c (parse_keyserver_options,
keyserver_spawn): try passing unknown keyserver options to export options,
and if successful, use them when doing a keyserver --send-key.
* build-packet.c (build_sig_subpkt): We do not generate
SIGSUBPKT_PRIV_VERIFY_CACHE anymore.
2002-07-22 19:07:21 +00:00
|
|
|
{
|
|
|
|
if(configname)
|
|
|
|
log_error(_("%s:%d: invalid export options\n"),
|
|
|
|
configname,configlineno);
|
|
|
|
else
|
|
|
|
log_error(_("invalid export options\n"));
|
|
|
|
}
|
|
|
|
break;
|
* mainproc.c (check_sig_and_print), main.h, keylist.c (show_policy,
show_notation): Collapse the old print_notation_data into show_policy()
and show_notation() so there is only one function to print notations and
policy URLs.
* options.h, main.h, g10.c (main), keyedit.c (print_and_check_one_sig),
keylist.c (list_one, list_keyblock_print), pkclist.c (do_edit_ownertrust),
sign.c (mk_notation_and_policy): New "list-options" and "verify-options"
commands. These replace the existing --show-photos/--no-show-photos,
--show-notation/--no-show-notation,
--show-policy-url/--no-show-policy-url, and --show-keyring options. The
new method is more flexible since a user can specify (for example) showing
photos during sig verification, but not in key listings. The old options
are emulated.
2003-05-31 23:23:19 +00:00
|
|
|
case oListOptions:
|
2004-09-12 15:27:38 +00:00
|
|
|
if(!parse_list_options(pargs.r.ret_str))
|
|
|
|
{
|
|
|
|
if(configname)
|
|
|
|
log_error(_("%s:%d: invalid list options\n"),
|
|
|
|
configname,configlineno);
|
|
|
|
else
|
|
|
|
log_error(_("invalid list options\n"));
|
|
|
|
}
|
* mainproc.c (check_sig_and_print), main.h, keylist.c (show_policy,
show_notation): Collapse the old print_notation_data into show_policy()
and show_notation() so there is only one function to print notations and
policy URLs.
* options.h, main.h, g10.c (main), keyedit.c (print_and_check_one_sig),
keylist.c (list_one, list_keyblock_print), pkclist.c (do_edit_ownertrust),
sign.c (mk_notation_and_policy): New "list-options" and "verify-options"
commands. These replace the existing --show-photos/--no-show-photos,
--show-notation/--no-show-notation,
--show-policy-url/--no-show-policy-url, and --show-keyring options. The
new method is more flexible since a user can specify (for example) showing
photos during sig verification, but not in key listings. The old options
are emulated.
2003-05-31 23:23:19 +00:00
|
|
|
break;
|
|
|
|
case oVerifyOptions:
|
|
|
|
{
|
|
|
|
struct parse_options vopts[]=
|
|
|
|
{
|
2004-02-14 05:03:45 +00:00
|
|
|
{"show-photos",VERIFY_SHOW_PHOTOS,NULL},
|
|
|
|
{"show-policy-urls",VERIFY_SHOW_POLICY_URLS,NULL},
|
|
|
|
{"show-notations",VERIFY_SHOW_NOTATIONS,NULL},
|
2004-05-05 02:40:27 +00:00
|
|
|
{"show-std-notations",VERIFY_SHOW_STD_NOTATIONS,NULL},
|
|
|
|
{"show-standard-notations",VERIFY_SHOW_STD_NOTATIONS,NULL},
|
|
|
|
{"show-user-notations",VERIFY_SHOW_USER_NOTATIONS,NULL},
|
2004-02-14 05:03:45 +00:00
|
|
|
{"show-keyserver-urls",VERIFY_SHOW_KEYSERVER_URLS,NULL},
|
2004-10-21 19:18:47 +00:00
|
|
|
{"show-uid-validity",VERIFY_SHOW_UID_VALIDITY,NULL},
|
2004-02-14 05:03:45 +00:00
|
|
|
{"show-unusable-uids",VERIFY_SHOW_UNUSABLE_UIDS,NULL},
|
|
|
|
{NULL,0,NULL}
|
* mainproc.c (check_sig_and_print), main.h, keylist.c (show_policy,
show_notation): Collapse the old print_notation_data into show_policy()
and show_notation() so there is only one function to print notations and
policy URLs.
* options.h, main.h, g10.c (main), keyedit.c (print_and_check_one_sig),
keylist.c (list_one, list_keyblock_print), pkclist.c (do_edit_ownertrust),
sign.c (mk_notation_and_policy): New "list-options" and "verify-options"
commands. These replace the existing --show-photos/--no-show-photos,
--show-notation/--no-show-notation,
--show-policy-url/--no-show-policy-url, and --show-keyring options. The
new method is more flexible since a user can specify (for example) showing
photos during sig verification, but not in key listings. The old options
are emulated.
2003-05-31 23:23:19 +00:00
|
|
|
};
|
|
|
|
|
2003-12-28 03:46:43 +00:00
|
|
|
if(!parse_options(pargs.r.ret_str,&opt.verify_options,vopts,1))
|
* mainproc.c (check_sig_and_print), main.h, keylist.c (show_policy,
show_notation): Collapse the old print_notation_data into show_policy()
and show_notation() so there is only one function to print notations and
policy URLs.
* options.h, main.h, g10.c (main), keyedit.c (print_and_check_one_sig),
keylist.c (list_one, list_keyblock_print), pkclist.c (do_edit_ownertrust),
sign.c (mk_notation_and_policy): New "list-options" and "verify-options"
commands. These replace the existing --show-photos/--no-show-photos,
--show-notation/--no-show-notation,
--show-policy-url/--no-show-policy-url, and --show-keyring options. The
new method is more flexible since a user can specify (for example) showing
photos during sig verification, but not in key listings. The old options
are emulated.
2003-05-31 23:23:19 +00:00
|
|
|
{
|
|
|
|
if(configname)
|
|
|
|
log_error(_("%s:%d: invalid verify options\n"),
|
|
|
|
configname,configlineno);
|
|
|
|
else
|
|
|
|
log_error(_("invalid verify options\n"));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
2002-06-29 13:46:34 +00:00
|
|
|
case oTempDir: opt.temp_dir=pargs.r.ret_str; break;
|
|
|
|
case oExecPath:
|
2002-07-24 19:24:08 +00:00
|
|
|
if(set_exec_path(pargs.r.ret_str,0))
|
2002-07-03 04:01:21 +00:00
|
|
|
log_error(_("unable to set exec-path to %s\n"),pargs.r.ret_str);
|
2002-07-24 19:24:08 +00:00
|
|
|
else
|
|
|
|
opt.exec_path_set=1;
|
2002-06-29 13:46:34 +00:00
|
|
|
break;
|
2003-06-05 02:06:12 +00:00
|
|
|
case oSetNotation:
|
2002-06-29 13:46:34 +00:00
|
|
|
add_notation_data( pargs.r.ret_str, 0 );
|
|
|
|
add_notation_data( pargs.r.ret_str, 1 );
|
|
|
|
break;
|
|
|
|
case oSigNotation: add_notation_data( pargs.r.ret_str, 0 ); break;
|
|
|
|
case oCertNotation: add_notation_data( pargs.r.ret_str, 1 ); break;
|
* mainproc.c (check_sig_and_print), main.h, keylist.c (show_policy,
show_notation): Collapse the old print_notation_data into show_policy()
and show_notation() so there is only one function to print notations and
policy URLs.
* options.h, main.h, g10.c (main), keyedit.c (print_and_check_one_sig),
keylist.c (list_one, list_keyblock_print), pkclist.c (do_edit_ownertrust),
sign.c (mk_notation_and_policy): New "list-options" and "verify-options"
commands. These replace the existing --show-photos/--no-show-photos,
--show-notation/--no-show-notation,
--show-policy-url/--no-show-policy-url, and --show-keyring options. The
new method is more flexible since a user can specify (for example) showing
photos during sig verification, but not in key listings. The old options
are emulated.
2003-05-31 23:23:19 +00:00
|
|
|
case oShowNotation:
|
2003-10-10 03:05:05 +00:00
|
|
|
deprecated_warning(configname,configlineno,"--show-notation",
|
2003-11-14 05:06:19 +00:00
|
|
|
"--list-options ","show-notations");
|
2003-10-10 03:05:05 +00:00
|
|
|
deprecated_warning(configname,configlineno,"--show-notation",
|
2003-11-14 05:06:19 +00:00
|
|
|
"--verify-options ","show-notations");
|
|
|
|
opt.list_options|=LIST_SHOW_NOTATIONS;
|
|
|
|
opt.verify_options|=VERIFY_SHOW_NOTATIONS;
|
* mainproc.c (check_sig_and_print), main.h, keylist.c (show_policy,
show_notation): Collapse the old print_notation_data into show_policy()
and show_notation() so there is only one function to print notations and
policy URLs.
* options.h, main.h, g10.c (main), keyedit.c (print_and_check_one_sig),
keylist.c (list_one, list_keyblock_print), pkclist.c (do_edit_ownertrust),
sign.c (mk_notation_and_policy): New "list-options" and "verify-options"
commands. These replace the existing --show-photos/--no-show-photos,
--show-notation/--no-show-notation,
--show-policy-url/--no-show-policy-url, and --show-keyring options. The
new method is more flexible since a user can specify (for example) showing
photos during sig verification, but not in key listings. The old options
are emulated.
2003-05-31 23:23:19 +00:00
|
|
|
break;
|
|
|
|
case oNoShowNotation:
|
2003-10-10 03:05:05 +00:00
|
|
|
deprecated_warning(configname,configlineno,"--no-show-notation",
|
2003-11-14 05:06:19 +00:00
|
|
|
"--list-options ","no-show-notations");
|
2003-10-10 03:05:05 +00:00
|
|
|
deprecated_warning(configname,configlineno,"--no-show-notation",
|
2003-11-14 05:06:19 +00:00
|
|
|
"--verify-options ","no-show-notations");
|
|
|
|
opt.list_options&=~LIST_SHOW_NOTATIONS;
|
|
|
|
opt.verify_options&=~VERIFY_SHOW_NOTATIONS;
|
* mainproc.c (check_sig_and_print), main.h, keylist.c (show_policy,
show_notation): Collapse the old print_notation_data into show_policy()
and show_notation() so there is only one function to print notations and
policy URLs.
* options.h, main.h, g10.c (main), keyedit.c (print_and_check_one_sig),
keylist.c (list_one, list_keyblock_print), pkclist.c (do_edit_ownertrust),
sign.c (mk_notation_and_policy): New "list-options" and "verify-options"
commands. These replace the existing --show-photos/--no-show-photos,
--show-notation/--no-show-notation,
--show-policy-url/--no-show-policy-url, and --show-keyring options. The
new method is more flexible since a user can specify (for example) showing
photos during sig verification, but not in key listings. The old options
are emulated.
2003-05-31 23:23:19 +00:00
|
|
|
break;
|
1999-07-01 10:53:35 +00:00
|
|
|
case oUtf8Strings: utf8_strings = 1; break;
|
|
|
|
case oNoUtf8Strings: utf8_strings = 0; break;
|
2002-06-29 13:46:34 +00:00
|
|
|
case oDisableCipherAlgo:
|
|
|
|
disable_cipher_algo( string_to_cipher_algo(pargs.r.ret_str) );
|
1999-07-15 08:16:46 +00:00
|
|
|
break;
|
2002-06-29 13:46:34 +00:00
|
|
|
case oDisablePubkeyAlgo:
|
|
|
|
disable_pubkey_algo( string_to_pubkey_algo(pargs.r.ret_str) );
|
1999-07-15 08:16:46 +00:00
|
|
|
break;
|
2002-06-29 13:46:34 +00:00
|
|
|
case oNoSigCache: opt.no_sig_cache = 1; break;
|
|
|
|
case oNoSigCreateCheck: opt.no_sig_create_check = 1; break;
|
2000-07-14 17:34:53 +00:00
|
|
|
case oAllowNonSelfsignedUID: opt.allow_non_selfsigned_uid = 1; break;
|
2002-06-29 13:46:34 +00:00
|
|
|
case oNoAllowNonSelfsignedUID: opt.allow_non_selfsigned_uid=0; break;
|
2000-09-18 14:35:34 +00:00
|
|
|
case oAllowFreeformUID: opt.allow_freeform_uid = 1; break;
|
2002-06-29 13:46:34 +00:00
|
|
|
case oNoAllowFreeformUID: opt.allow_freeform_uid = 0; break;
|
2000-07-14 17:34:53 +00:00
|
|
|
case oNoLiteral: opt.no_literal = 1; break;
|
|
|
|
case oSetFilesize: opt.set_filesize = pargs.r.ret_ulong; break;
|
2002-06-29 13:46:34 +00:00
|
|
|
case oHonorHttpProxy:
|
2003-12-28 16:08:04 +00:00
|
|
|
add_to_strlist(&opt.keyserver_options.other,"http-proxy");
|
2002-06-29 13:46:34 +00:00
|
|
|
deprecated_warning(configname,configlineno,
|
|
|
|
"--honor-http-proxy",
|
2003-12-28 16:08:04 +00:00
|
|
|
"--keyserver-options ","http-proxy");
|
2002-06-29 13:46:34 +00:00
|
|
|
break;
|
2000-07-14 17:34:53 +00:00
|
|
|
case oFastListMode: opt.fast_list_mode = 1; break;
|
2002-06-29 13:46:34 +00:00
|
|
|
case oFixedListMode: opt.fixed_list_mode = 1; break;
|
2000-07-14 17:34:53 +00:00
|
|
|
case oListOnly: opt.list_only=1; break;
|
|
|
|
case oIgnoreTimeConflict: opt.ignore_time_conflict = 1; break;
|
2002-06-29 13:46:34 +00:00
|
|
|
case oIgnoreValidFrom: opt.ignore_valid_from = 1; break;
|
|
|
|
case oIgnoreCrcError: opt.ignore_crc_error = 1; break;
|
2002-08-06 17:57:53 +00:00
|
|
|
case oIgnoreMDCError: opt.ignore_mdc_error = 1; break;
|
2000-07-14 17:34:53 +00:00
|
|
|
case oNoRandomSeedFile: use_random_seed = 0; break;
|
2002-06-29 13:46:34 +00:00
|
|
|
case oAutoKeyRetrieve:
|
|
|
|
case oNoAutoKeyRetrieve:
|
2004-04-15 18:16:17 +00:00
|
|
|
if(pargs.r_opt==oAutoKeyRetrieve)
|
|
|
|
opt.keyserver_options.options|=KEYSERVER_AUTO_KEY_RETRIEVE;
|
|
|
|
else
|
|
|
|
opt.keyserver_options.options&=~KEYSERVER_AUTO_KEY_RETRIEVE;
|
|
|
|
|
2002-06-29 13:46:34 +00:00
|
|
|
deprecated_warning(configname,configlineno,
|
|
|
|
pargs.r_opt==oAutoKeyRetrieve?"--auto-key-retrieve":
|
|
|
|
"--no-auto-key-retrieve","--keyserver-options ",
|
|
|
|
pargs.r_opt==oAutoKeyRetrieve?"auto-key-retrieve":
|
|
|
|
"no-auto-key-retrieve");
|
|
|
|
break;
|
|
|
|
case oShowSessionKey: opt.show_session_key = 1; break;
|
|
|
|
case oOverrideSessionKey:
|
|
|
|
opt.override_session_key = pargs.r.ret_str;
|
|
|
|
break;
|
2003-12-31 04:58:52 +00:00
|
|
|
case oMergeOnly:
|
|
|
|
deprecated_warning(configname,configlineno,"--merge-only",
|
|
|
|
"--import-options ","merge-only");
|
|
|
|
opt.import_options|=IMPORT_MERGE_ONLY;
|
|
|
|
break;
|
2002-06-29 13:46:34 +00:00
|
|
|
case oAllowSecretKeyImport: /* obsolete */ break;
|
2000-09-18 14:35:34 +00:00
|
|
|
case oTryAllSecrets: opt.try_all_secrets = 1; break;
|
|
|
|
case oTrustedKey: register_trusted_key( pargs.r.ret_str ); break;
|
2002-06-29 13:46:34 +00:00
|
|
|
case oEnableSpecialFilenames:
|
|
|
|
iobuf_enable_special_filenames (1);
|
|
|
|
break;
|
|
|
|
case oNoExpensiveTrustChecks: opt.no_expensive_trust_checks=1; break;
|
|
|
|
case oAutoCheckTrustDB: opt.no_auto_check_trustdb=0; break;
|
|
|
|
case oNoAutoCheckTrustDB: opt.no_auto_check_trustdb=1; break;
|
|
|
|
case oPreservePermissions: opt.preserve_permissions=1; break;
|
|
|
|
case oDefaultPreferenceList:
|
|
|
|
opt.def_preference_list = pargs.r.ret_str;
|
|
|
|
break;
|
|
|
|
case oPersonalCipherPreferences:
|
|
|
|
pers_cipher_list=pargs.r.ret_str;
|
|
|
|
break;
|
|
|
|
case oPersonalDigestPreferences:
|
|
|
|
pers_digest_list=pargs.r.ret_str;
|
|
|
|
break;
|
|
|
|
case oPersonalCompressPreferences:
|
|
|
|
pers_compress_list=pargs.r.ret_str;
|
|
|
|
break;
|
|
|
|
case oDisplay: opt.display = pargs.r.ret_str; break;
|
|
|
|
case oTTYname: opt.ttyname = pargs.r.ret_str; break;
|
|
|
|
case oTTYtype: opt.ttytype = pargs.r.ret_str; break;
|
|
|
|
case oLCctype: opt.lc_ctype = pargs.r.ret_str; break;
|
|
|
|
case oLCmessages: opt.lc_messages = pargs.r.ret_str; break;
|
|
|
|
case oGroup: add_group(pargs.r.ret_str); break;
|
2004-01-30 16:49:28 +00:00
|
|
|
case oUnGroup: rm_group(pargs.r.ret_str); break;
|
2003-10-01 15:15:58 +00:00
|
|
|
case oNoGroups:
|
|
|
|
while(opt.grouplist)
|
|
|
|
{
|
|
|
|
struct groupitem *iter=opt.grouplist;
|
|
|
|
free_strlist(iter->values);
|
|
|
|
opt.grouplist=opt.grouplist->next;
|
|
|
|
m_free(iter);
|
|
|
|
}
|
|
|
|
break;
|
2002-10-03 22:13:04 +00:00
|
|
|
case oStrict: opt.strict=1; log_set_strict(1); break;
|
|
|
|
case oNoStrict: opt.strict=0; log_set_strict(0); break;
|
2002-12-05 15:25:16 +00:00
|
|
|
case oMangleDosFilenames: opt.mangle_dos_filenames = 1; break;
|
|
|
|
case oNoMangleDosFilenames: opt.mangle_dos_filenames = 0; break;
|
2003-04-15 15:46:13 +00:00
|
|
|
case oEnableProgressFilter: opt.enable_progress_filter = 1; break;
|
2003-09-09 00:25:53 +00:00
|
|
|
case oMultifile: multifile=1; break;
|
2004-03-03 05:47:51 +00:00
|
|
|
case oKeyidFormat:
|
|
|
|
if(ascii_strcasecmp(pargs.r.ret_str,"short")==0)
|
|
|
|
opt.keyid_format=KF_SHORT;
|
|
|
|
else if(ascii_strcasecmp(pargs.r.ret_str,"long")==0)
|
|
|
|
opt.keyid_format=KF_LONG;
|
|
|
|
else if(ascii_strcasecmp(pargs.r.ret_str,"0xshort")==0)
|
|
|
|
opt.keyid_format=KF_0xSHORT;
|
|
|
|
else if(ascii_strcasecmp(pargs.r.ret_str,"0xlong")==0)
|
|
|
|
opt.keyid_format=KF_0xLONG;
|
|
|
|
else
|
2004-10-11 21:08:37 +00:00
|
|
|
log_error("unknown keyid-format `%s'\n",pargs.r.ret_str);
|
2004-03-03 05:47:51 +00:00
|
|
|
break;
|
2003-04-15 15:46:13 +00:00
|
|
|
|
1998-11-10 12:59:59 +00:00
|
|
|
default : pargs.err = configfp? 1:2; break;
|
2003-10-01 15:15:58 +00:00
|
|
|
}
|
|
|
|
}
|
2002-06-29 13:46:34 +00:00
|
|
|
|
2004-05-20 17:06:34 +00:00
|
|
|
|
1997-12-12 12:03:58 +00:00
|
|
|
if( configfp ) {
|
|
|
|
fclose( configfp );
|
|
|
|
configfp = NULL;
|
2004-05-20 17:06:34 +00:00
|
|
|
/* Remember the first config file name. */
|
|
|
|
if (!save_configname)
|
|
|
|
save_configname = configname;
|
|
|
|
else
|
|
|
|
m_free(configname);
|
|
|
|
configname = NULL;
|
1997-12-12 12:03:58 +00:00
|
|
|
goto next_pass;
|
|
|
|
}
|
2002-06-29 13:46:34 +00:00
|
|
|
m_free( configname ); configname = NULL;
|
1998-02-13 20:58:50 +00:00
|
|
|
if( log_get_errorcount(0) )
|
2002-06-29 13:46:34 +00:00
|
|
|
g10_exit(2);
|
2004-05-20 17:06:34 +00:00
|
|
|
|
|
|
|
/* The command --gpgconf-list is pretty simple and may be called
|
|
|
|
directly after the option parsing. */
|
|
|
|
if (cmd == aGPGConfList)
|
|
|
|
{
|
|
|
|
gpgconf_list (save_configname);
|
|
|
|
g10_exit (0);
|
|
|
|
}
|
|
|
|
m_free (save_configname);
|
|
|
|
|
1999-07-14 17:47:23 +00:00
|
|
|
if( nogreeting )
|
|
|
|
greeting = 0;
|
1997-12-12 12:03:58 +00:00
|
|
|
|
1998-02-11 23:22:09 +00:00
|
|
|
if( greeting ) {
|
1999-02-19 14:54:00 +00:00
|
|
|
fprintf(stderr, "%s %s; %s\n",
|
|
|
|
strusage(11), strusage(13), strusage(14) );
|
|
|
|
fprintf(stderr, "%s\n", strusage(15) );
|
1998-02-11 23:22:09 +00:00
|
|
|
}
|
* armor.c, g10.c, kbnode.c, misc.c, pkclist.c, sign.c, build-packet.c,
getkey.c, keydb.c, openfile.c, plaintext.c, status.c, gpgv.c, keygen.c,
options.h, sig-check.c, tdbio.h, encode.c, mainproc.c, parse-packet.c,
signal.c, textfilter.c: Edit all preprocessor instructions to remove
whitespace before the '#'. This is not required by C89, but there are some
compilers out there that don't like it.
2003-05-24 21:50:33 +00:00
|
|
|
#ifdef IS_DEVELOPMENT_VERSION
|
2003-12-04 04:58:12 +00:00
|
|
|
if( !opt.batch )
|
|
|
|
{
|
|
|
|
const char *s;
|
|
|
|
|
|
|
|
if((s=strusage(20)))
|
|
|
|
log_info("%s\n",s);
|
|
|
|
if((s=strusage(21)))
|
|
|
|
log_info("%s\n",s);
|
|
|
|
if((s=strusage(22)))
|
|
|
|
log_info("%s\n",s);
|
|
|
|
}
|
* armor.c, g10.c, kbnode.c, misc.c, pkclist.c, sign.c, build-packet.c,
getkey.c, keydb.c, openfile.c, plaintext.c, status.c, gpgv.c, keygen.c,
options.h, sig-check.c, tdbio.h, encode.c, mainproc.c, parse-packet.c,
signal.c, textfilter.c: Edit all preprocessor instructions to remove
whitespace before the '#'. This is not required by C89, but there are some
compilers out there that don't like it.
2003-05-24 21:50:33 +00:00
|
|
|
#endif
|
2000-09-18 14:35:34 +00:00
|
|
|
|
2002-09-02 10:59:04 +00:00
|
|
|
if (opt.verbose > 2)
|
|
|
|
log_info ("using character set `%s'\n", get_native_charset ());
|
|
|
|
|
2000-09-18 14:35:34 +00:00
|
|
|
if( may_coredump && !opt.quiet )
|
|
|
|
log_info(_("WARNING: program may create a core file!\n"));
|
|
|
|
|
2002-06-29 13:46:34 +00:00
|
|
|
if (eyes_only) {
|
|
|
|
if (opt.set_filename)
|
|
|
|
log_info(_("WARNING: %s overrides %s\n"),
|
|
|
|
"--for-your-eyes-only","--set-filename");
|
|
|
|
|
|
|
|
opt.set_filename="_CONSOLE";
|
|
|
|
}
|
|
|
|
|
1999-07-26 07:44:46 +00:00
|
|
|
if (opt.no_literal) {
|
|
|
|
log_info(_("NOTE: %s is not for normal use!\n"), "--no-literal");
|
|
|
|
if (opt.textmode)
|
|
|
|
log_error(_("%s not allowed with %s!\n"),
|
|
|
|
"--textmode", "--no-literal" );
|
|
|
|
if (opt.set_filename)
|
|
|
|
log_error(_("%s makes no sense with %s!\n"),
|
2002-06-29 13:46:34 +00:00
|
|
|
eyes_only?"--for-your-eyes-only":"--set-filename",
|
|
|
|
"--no-literal" );
|
1999-07-26 07:44:46 +00:00
|
|
|
}
|
2002-06-29 13:46:34 +00:00
|
|
|
|
1999-07-26 07:44:46 +00:00
|
|
|
if (opt.set_filesize)
|
|
|
|
log_info(_("NOTE: %s is not for normal use!\n"), "--set-filesize");
|
1999-04-18 08:18:52 +00:00
|
|
|
if( opt.batch )
|
|
|
|
tty_batchmode( 1 );
|
1998-02-11 23:22:09 +00:00
|
|
|
|
2002-06-29 13:46:34 +00:00
|
|
|
secmem_set_flags( secmem_get_flags() & ~2 ); /* resume warnings */
|
1998-01-25 18:56:33 +00:00
|
|
|
|
2004-12-16 05:16:09 +00:00
|
|
|
if(require_secmem && !got_secmem)
|
|
|
|
{
|
2005-01-06 04:44:38 +00:00
|
|
|
log_info(_("will not run with insecure memory due to %s\n"),
|
|
|
|
"--require-secmem");
|
2004-12-16 05:16:09 +00:00
|
|
|
g10_exit(2);
|
|
|
|
}
|
|
|
|
|
1997-11-18 14:06:00 +00:00
|
|
|
set_debug();
|
2002-06-29 13:46:34 +00:00
|
|
|
|
|
|
|
/* Do these after the switch(), so they can override settings. */
|
* packet.h, build-packet.c (build_sig_subpkt), export.c
(do_export_stream), import.c (remove_bad_stuff, import), parse-packet.c
(dump_sig_subpkt, parse_one_sig_subpkt): Remove vestigal code for the old
sig cache subpacket. This wasn't completely harmless as it caused
subpacket 101 to disappear on import and export.
* options.h, armor.c, cipher.c, g10.c, keyedit.c, pkclist.c, sign.c,
encode.c, getkey.c, revoke.c: The current flags for different levels of
PGP-ness are massively complex. This is step one in simplifying them. No
functional change yet, just use a macro to check for compliance level.
* sign.c (sign_file): Fix bug that causes spurious compression preference
warning.
* sign.c (clearsign_file): Fix bug that prevents proper warning message
from appearing when clearsigning in --pgp2 mode with a non-v3 RSA key.
* main.h, misc.c (compliance_option_string, compliance_string,
compliance_failure), pkclist.c (build_pk_list), sign.c (sign_file,
clearsign_file), encode.c (encode_crypt, write_pubkey_enc_from_list): New
functions to put the "this message may not be usable...." warning in one
place.
* options.h, g10.c (main): Part two of the simplification. Use a single
enum to indicate what we are compliant to (1991, 2440, PGPx, etc.)
* g10.c (main): Show errors for failure in export, send-keys, recv-keys,
and refresh-keys.
* options.h, g10.c (main): Give algorithm warnings for algorithms chosen
against the --pgpX and --openpgp rules.
* keydb.h, pkclist.c (algo_available): Make TIGER192 invalid in --openpgp
mode.
* sign.c (sign_file), pkclist.c (algo_available): Allow passing a hint of
0.
2003-05-03 04:07:45 +00:00
|
|
|
if(PGP2)
|
2002-06-29 13:46:34 +00:00
|
|
|
{
|
* packet.h, build-packet.c (build_sig_subpkt), export.c
(do_export_stream), import.c (remove_bad_stuff, import), parse-packet.c
(dump_sig_subpkt, parse_one_sig_subpkt): Remove vestigal code for the old
sig cache subpacket. This wasn't completely harmless as it caused
subpacket 101 to disappear on import and export.
* options.h, armor.c, cipher.c, g10.c, keyedit.c, pkclist.c, sign.c,
encode.c, getkey.c, revoke.c: The current flags for different levels of
PGP-ness are massively complex. This is step one in simplifying them. No
functional change yet, just use a macro to check for compliance level.
* sign.c (sign_file): Fix bug that causes spurious compression preference
warning.
* sign.c (clearsign_file): Fix bug that prevents proper warning message
from appearing when clearsigning in --pgp2 mode with a non-v3 RSA key.
* main.h, misc.c (compliance_option_string, compliance_string,
compliance_failure), pkclist.c (build_pk_list), sign.c (sign_file,
clearsign_file), encode.c (encode_crypt, write_pubkey_enc_from_list): New
functions to put the "this message may not be usable...." warning in one
place.
* options.h, g10.c (main): Part two of the simplification. Use a single
enum to indicate what we are compliant to (1991, 2440, PGPx, etc.)
* g10.c (main): Show errors for failure in export, send-keys, recv-keys,
and refresh-keys.
* options.h, g10.c (main): Give algorithm warnings for algorithms chosen
against the --pgpX and --openpgp rules.
* keydb.h, pkclist.c (algo_available): Make TIGER192 invalid in --openpgp
mode.
* sign.c (sign_file), pkclist.c (algo_available): Allow passing a hint of
0.
2003-05-03 04:07:45 +00:00
|
|
|
int unusable=0;
|
|
|
|
|
|
|
|
if(cmd==aSign && !detached_sig)
|
|
|
|
{
|
|
|
|
log_info(_("you can only make detached or clear signatures "
|
|
|
|
"while in --pgp2 mode\n"));
|
|
|
|
unusable=1;
|
|
|
|
}
|
|
|
|
else if(cmd==aSignEncr || cmd==aSignSym)
|
|
|
|
{
|
|
|
|
log_info(_("you can't sign and encrypt at the "
|
|
|
|
"same time while in --pgp2 mode\n"));
|
|
|
|
unusable=1;
|
|
|
|
}
|
|
|
|
else if(argc==0 && (cmd==aSign || cmd==aEncr || cmd==aSym))
|
2002-06-29 13:46:34 +00:00
|
|
|
{
|
* packet.h, build-packet.c (build_sig_subpkt), export.c
(do_export_stream), import.c (remove_bad_stuff, import), parse-packet.c
(dump_sig_subpkt, parse_one_sig_subpkt): Remove vestigal code for the old
sig cache subpacket. This wasn't completely harmless as it caused
subpacket 101 to disappear on import and export.
* options.h, armor.c, cipher.c, g10.c, keyedit.c, pkclist.c, sign.c,
encode.c, getkey.c, revoke.c: The current flags for different levels of
PGP-ness are massively complex. This is step one in simplifying them. No
functional change yet, just use a macro to check for compliance level.
* sign.c (sign_file): Fix bug that causes spurious compression preference
warning.
* sign.c (clearsign_file): Fix bug that prevents proper warning message
from appearing when clearsigning in --pgp2 mode with a non-v3 RSA key.
* main.h, misc.c (compliance_option_string, compliance_string,
compliance_failure), pkclist.c (build_pk_list), sign.c (sign_file,
clearsign_file), encode.c (encode_crypt, write_pubkey_enc_from_list): New
functions to put the "this message may not be usable...." warning in one
place.
* options.h, g10.c (main): Part two of the simplification. Use a single
enum to indicate what we are compliant to (1991, 2440, PGPx, etc.)
* g10.c (main): Show errors for failure in export, send-keys, recv-keys,
and refresh-keys.
* options.h, g10.c (main): Give algorithm warnings for algorithms chosen
against the --pgpX and --openpgp rules.
* keydb.h, pkclist.c (algo_available): Make TIGER192 invalid in --openpgp
mode.
* sign.c (sign_file), pkclist.c (algo_available): Allow passing a hint of
0.
2003-05-03 04:07:45 +00:00
|
|
|
log_info(_("you must use files (and not a pipe) when "
|
|
|
|
"working with --pgp2 enabled.\n"));
|
|
|
|
unusable=1;
|
|
|
|
}
|
|
|
|
else if(cmd==aEncr || cmd==aSym)
|
|
|
|
{
|
|
|
|
/* Everything else should work without IDEA (except using
|
|
|
|
a secret key encrypted with IDEA and setting an IDEA
|
|
|
|
preference, but those have their own error
|
|
|
|
messages). */
|
2002-06-29 13:46:34 +00:00
|
|
|
|
* packet.h, build-packet.c (build_sig_subpkt), export.c
(do_export_stream), import.c (remove_bad_stuff, import), parse-packet.c
(dump_sig_subpkt, parse_one_sig_subpkt): Remove vestigal code for the old
sig cache subpacket. This wasn't completely harmless as it caused
subpacket 101 to disappear on import and export.
* options.h, armor.c, cipher.c, g10.c, keyedit.c, pkclist.c, sign.c,
encode.c, getkey.c, revoke.c: The current flags for different levels of
PGP-ness are massively complex. This is step one in simplifying them. No
functional change yet, just use a macro to check for compliance level.
* sign.c (sign_file): Fix bug that causes spurious compression preference
warning.
* sign.c (clearsign_file): Fix bug that prevents proper warning message
from appearing when clearsigning in --pgp2 mode with a non-v3 RSA key.
* main.h, misc.c (compliance_option_string, compliance_string,
compliance_failure), pkclist.c (build_pk_list), sign.c (sign_file,
clearsign_file), encode.c (encode_crypt, write_pubkey_enc_from_list): New
functions to put the "this message may not be usable...." warning in one
place.
* options.h, g10.c (main): Part two of the simplification. Use a single
enum to indicate what we are compliant to (1991, 2440, PGPx, etc.)
* g10.c (main): Show errors for failure in export, send-keys, recv-keys,
and refresh-keys.
* options.h, g10.c (main): Give algorithm warnings for algorithms chosen
against the --pgpX and --openpgp rules.
* keydb.h, pkclist.c (algo_available): Make TIGER192 invalid in --openpgp
mode.
* sign.c (sign_file), pkclist.c (algo_available): Allow passing a hint of
0.
2003-05-03 04:07:45 +00:00
|
|
|
if(check_cipher_algo(CIPHER_ALGO_IDEA))
|
2002-06-29 13:46:34 +00:00
|
|
|
{
|
* packet.h, build-packet.c (build_sig_subpkt), export.c
(do_export_stream), import.c (remove_bad_stuff, import), parse-packet.c
(dump_sig_subpkt, parse_one_sig_subpkt): Remove vestigal code for the old
sig cache subpacket. This wasn't completely harmless as it caused
subpacket 101 to disappear on import and export.
* options.h, armor.c, cipher.c, g10.c, keyedit.c, pkclist.c, sign.c,
encode.c, getkey.c, revoke.c: The current flags for different levels of
PGP-ness are massively complex. This is step one in simplifying them. No
functional change yet, just use a macro to check for compliance level.
* sign.c (sign_file): Fix bug that causes spurious compression preference
warning.
* sign.c (clearsign_file): Fix bug that prevents proper warning message
from appearing when clearsigning in --pgp2 mode with a non-v3 RSA key.
* main.h, misc.c (compliance_option_string, compliance_string,
compliance_failure), pkclist.c (build_pk_list), sign.c (sign_file,
clearsign_file), encode.c (encode_crypt, write_pubkey_enc_from_list): New
functions to put the "this message may not be usable...." warning in one
place.
* options.h, g10.c (main): Part two of the simplification. Use a single
enum to indicate what we are compliant to (1991, 2440, PGPx, etc.)
* g10.c (main): Show errors for failure in export, send-keys, recv-keys,
and refresh-keys.
* options.h, g10.c (main): Give algorithm warnings for algorithms chosen
against the --pgpX and --openpgp rules.
* keydb.h, pkclist.c (algo_available): Make TIGER192 invalid in --openpgp
mode.
* sign.c (sign_file), pkclist.c (algo_available): Allow passing a hint of
0.
2003-05-03 04:07:45 +00:00
|
|
|
log_info(_("encrypting a message in --pgp2 mode requires "
|
|
|
|
"the IDEA cipher\n"));
|
|
|
|
idea_cipher_warn(1);
|
2002-06-29 13:46:34 +00:00
|
|
|
unusable=1;
|
|
|
|
}
|
* packet.h, build-packet.c (build_sig_subpkt), export.c
(do_export_stream), import.c (remove_bad_stuff, import), parse-packet.c
(dump_sig_subpkt, parse_one_sig_subpkt): Remove vestigal code for the old
sig cache subpacket. This wasn't completely harmless as it caused
subpacket 101 to disappear on import and export.
* options.h, armor.c, cipher.c, g10.c, keyedit.c, pkclist.c, sign.c,
encode.c, getkey.c, revoke.c: The current flags for different levels of
PGP-ness are massively complex. This is step one in simplifying them. No
functional change yet, just use a macro to check for compliance level.
* sign.c (sign_file): Fix bug that causes spurious compression preference
warning.
* sign.c (clearsign_file): Fix bug that prevents proper warning message
from appearing when clearsigning in --pgp2 mode with a non-v3 RSA key.
* main.h, misc.c (compliance_option_string, compliance_string,
compliance_failure), pkclist.c (build_pk_list), sign.c (sign_file,
clearsign_file), encode.c (encode_crypt, write_pubkey_enc_from_list): New
functions to put the "this message may not be usable...." warning in one
place.
* options.h, g10.c (main): Part two of the simplification. Use a single
enum to indicate what we are compliant to (1991, 2440, PGPx, etc.)
* g10.c (main): Show errors for failure in export, send-keys, recv-keys,
and refresh-keys.
* options.h, g10.c (main): Give algorithm warnings for algorithms chosen
against the --pgpX and --openpgp rules.
* keydb.h, pkclist.c (algo_available): Make TIGER192 invalid in --openpgp
mode.
* sign.c (sign_file), pkclist.c (algo_available): Allow passing a hint of
0.
2003-05-03 04:07:45 +00:00
|
|
|
else if(cmd==aSym)
|
2002-06-29 13:46:34 +00:00
|
|
|
{
|
* packet.h, build-packet.c (build_sig_subpkt), export.c
(do_export_stream), import.c (remove_bad_stuff, import), parse-packet.c
(dump_sig_subpkt, parse_one_sig_subpkt): Remove vestigal code for the old
sig cache subpacket. This wasn't completely harmless as it caused
subpacket 101 to disappear on import and export.
* options.h, armor.c, cipher.c, g10.c, keyedit.c, pkclist.c, sign.c,
encode.c, getkey.c, revoke.c: The current flags for different levels of
PGP-ness are massively complex. This is step one in simplifying them. No
functional change yet, just use a macro to check for compliance level.
* sign.c (sign_file): Fix bug that causes spurious compression preference
warning.
* sign.c (clearsign_file): Fix bug that prevents proper warning message
from appearing when clearsigning in --pgp2 mode with a non-v3 RSA key.
* main.h, misc.c (compliance_option_string, compliance_string,
compliance_failure), pkclist.c (build_pk_list), sign.c (sign_file,
clearsign_file), encode.c (encode_crypt, write_pubkey_enc_from_list): New
functions to put the "this message may not be usable...." warning in one
place.
* options.h, g10.c (main): Part two of the simplification. Use a single
enum to indicate what we are compliant to (1991, 2440, PGPx, etc.)
* g10.c (main): Show errors for failure in export, send-keys, recv-keys,
and refresh-keys.
* options.h, g10.c (main): Give algorithm warnings for algorithms chosen
against the --pgpX and --openpgp rules.
* keydb.h, pkclist.c (algo_available): Make TIGER192 invalid in --openpgp
mode.
* sign.c (sign_file), pkclist.c (algo_available): Allow passing a hint of
0.
2003-05-03 04:07:45 +00:00
|
|
|
/* This only sets IDEA for symmetric encryption
|
|
|
|
since it is set via select_algo_from_prefs for
|
|
|
|
pk encryption. */
|
|
|
|
m_free(def_cipher_string);
|
|
|
|
def_cipher_string = m_strdup("idea");
|
2002-06-29 13:46:34 +00:00
|
|
|
}
|
|
|
|
|
* packet.h, build-packet.c (build_sig_subpkt), export.c
(do_export_stream), import.c (remove_bad_stuff, import), parse-packet.c
(dump_sig_subpkt, parse_one_sig_subpkt): Remove vestigal code for the old
sig cache subpacket. This wasn't completely harmless as it caused
subpacket 101 to disappear on import and export.
* options.h, armor.c, cipher.c, g10.c, keyedit.c, pkclist.c, sign.c,
encode.c, getkey.c, revoke.c: The current flags for different levels of
PGP-ness are massively complex. This is step one in simplifying them. No
functional change yet, just use a macro to check for compliance level.
* sign.c (sign_file): Fix bug that causes spurious compression preference
warning.
* sign.c (clearsign_file): Fix bug that prevents proper warning message
from appearing when clearsigning in --pgp2 mode with a non-v3 RSA key.
* main.h, misc.c (compliance_option_string, compliance_string,
compliance_failure), pkclist.c (build_pk_list), sign.c (sign_file,
clearsign_file), encode.c (encode_crypt, write_pubkey_enc_from_list): New
functions to put the "this message may not be usable...." warning in one
place.
* options.h, g10.c (main): Part two of the simplification. Use a single
enum to indicate what we are compliant to (1991, 2440, PGPx, etc.)
* g10.c (main): Show errors for failure in export, send-keys, recv-keys,
and refresh-keys.
* options.h, g10.c (main): Give algorithm warnings for algorithms chosen
against the --pgpX and --openpgp rules.
* keydb.h, pkclist.c (algo_available): Make TIGER192 invalid in --openpgp
mode.
* sign.c (sign_file), pkclist.c (algo_available): Allow passing a hint of
0.
2003-05-03 04:07:45 +00:00
|
|
|
/* PGP2 can't handle the output from the textmode
|
|
|
|
filter, so we disable it for anything that could
|
|
|
|
create a literal packet (only encryption and
|
|
|
|
symmetric encryption, since we disable signing
|
|
|
|
above). */
|
|
|
|
if(!unusable)
|
|
|
|
opt.textmode=0;
|
2002-12-03 23:31:48 +00:00
|
|
|
}
|
* packet.h, build-packet.c (build_sig_subpkt), export.c
(do_export_stream), import.c (remove_bad_stuff, import), parse-packet.c
(dump_sig_subpkt, parse_one_sig_subpkt): Remove vestigal code for the old
sig cache subpacket. This wasn't completely harmless as it caused
subpacket 101 to disappear on import and export.
* options.h, armor.c, cipher.c, g10.c, keyedit.c, pkclist.c, sign.c,
encode.c, getkey.c, revoke.c: The current flags for different levels of
PGP-ness are massively complex. This is step one in simplifying them. No
functional change yet, just use a macro to check for compliance level.
* sign.c (sign_file): Fix bug that causes spurious compression preference
warning.
* sign.c (clearsign_file): Fix bug that prevents proper warning message
from appearing when clearsigning in --pgp2 mode with a non-v3 RSA key.
* main.h, misc.c (compliance_option_string, compliance_string,
compliance_failure), pkclist.c (build_pk_list), sign.c (sign_file,
clearsign_file), encode.c (encode_crypt, write_pubkey_enc_from_list): New
functions to put the "this message may not be usable...." warning in one
place.
* options.h, g10.c (main): Part two of the simplification. Use a single
enum to indicate what we are compliant to (1991, 2440, PGPx, etc.)
* g10.c (main): Show errors for failure in export, send-keys, recv-keys,
and refresh-keys.
* options.h, g10.c (main): Give algorithm warnings for algorithms chosen
against the --pgpX and --openpgp rules.
* keydb.h, pkclist.c (algo_available): Make TIGER192 invalid in --openpgp
mode.
* sign.c (sign_file), pkclist.c (algo_available): Allow passing a hint of
0.
2003-05-03 04:07:45 +00:00
|
|
|
|
|
|
|
if(unusable)
|
|
|
|
compliance_failure();
|
|
|
|
else
|
2002-12-03 23:31:48 +00:00
|
|
|
{
|
* packet.h, build-packet.c (build_sig_subpkt), export.c
(do_export_stream), import.c (remove_bad_stuff, import), parse-packet.c
(dump_sig_subpkt, parse_one_sig_subpkt): Remove vestigal code for the old
sig cache subpacket. This wasn't completely harmless as it caused
subpacket 101 to disappear on import and export.
* options.h, armor.c, cipher.c, g10.c, keyedit.c, pkclist.c, sign.c,
encode.c, getkey.c, revoke.c: The current flags for different levels of
PGP-ness are massively complex. This is step one in simplifying them. No
functional change yet, just use a macro to check for compliance level.
* sign.c (sign_file): Fix bug that causes spurious compression preference
warning.
* sign.c (clearsign_file): Fix bug that prevents proper warning message
from appearing when clearsigning in --pgp2 mode with a non-v3 RSA key.
* main.h, misc.c (compliance_option_string, compliance_string,
compliance_failure), pkclist.c (build_pk_list), sign.c (sign_file,
clearsign_file), encode.c (encode_crypt, write_pubkey_enc_from_list): New
functions to put the "this message may not be usable...." warning in one
place.
* options.h, g10.c (main): Part two of the simplification. Use a single
enum to indicate what we are compliant to (1991, 2440, PGPx, etc.)
* g10.c (main): Show errors for failure in export, send-keys, recv-keys,
and refresh-keys.
* options.h, g10.c (main): Give algorithm warnings for algorithms chosen
against the --pgpX and --openpgp rules.
* keydb.h, pkclist.c (algo_available): Make TIGER192 invalid in --openpgp
mode.
* sign.c (sign_file), pkclist.c (algo_available): Allow passing a hint of
0.
2003-05-03 04:07:45 +00:00
|
|
|
opt.force_v4_certs = 0;
|
|
|
|
opt.sk_comments = 0;
|
|
|
|
opt.escape_from = 1;
|
|
|
|
opt.force_v3_sigs = 1;
|
|
|
|
opt.pgp2_workarounds = 1;
|
|
|
|
opt.ask_sig_expire = 0;
|
|
|
|
opt.ask_cert_expire = 0;
|
|
|
|
m_free(def_digest_string);
|
|
|
|
def_digest_string = m_strdup("md5");
|
* main.h: Create S2K_DIGEST_ALGO macro so we do not need to always set
opt.s2k_digest_algo. This helps fix a problem with PGP 2.x encrypted
symmetric messages. Change all callers (encode.c, g10.c, keyedit.c,
keygen.c, passphrase.c, sign.c).
* armor.c, cardglue.c, getkey.c, import.c, keygen.c: Be consistent in some
more quoted strings. Always use 'user ID', not 'user id', "quotes" for
user IDs, etc.
2004-09-24 20:34:38 +00:00
|
|
|
m_free(s2k_digest_string);
|
|
|
|
s2k_digest_string = m_strdup("md5");
|
2003-11-15 22:31:58 +00:00
|
|
|
opt.compress_algo = COMPRESS_ALGO_ZIP;
|
2002-06-29 13:46:34 +00:00
|
|
|
}
|
|
|
|
}
|
* packet.h, build-packet.c (build_sig_subpkt), export.c
(do_export_stream), import.c (remove_bad_stuff, import), parse-packet.c
(dump_sig_subpkt, parse_one_sig_subpkt): Remove vestigal code for the old
sig cache subpacket. This wasn't completely harmless as it caused
subpacket 101 to disappear on import and export.
* options.h, armor.c, cipher.c, g10.c, keyedit.c, pkclist.c, sign.c,
encode.c, getkey.c, revoke.c: The current flags for different levels of
PGP-ness are massively complex. This is step one in simplifying them. No
functional change yet, just use a macro to check for compliance level.
* sign.c (sign_file): Fix bug that causes spurious compression preference
warning.
* sign.c (clearsign_file): Fix bug that prevents proper warning message
from appearing when clearsigning in --pgp2 mode with a non-v3 RSA key.
* main.h, misc.c (compliance_option_string, compliance_string,
compliance_failure), pkclist.c (build_pk_list), sign.c (sign_file,
clearsign_file), encode.c (encode_crypt, write_pubkey_enc_from_list): New
functions to put the "this message may not be usable...." warning in one
place.
* options.h, g10.c (main): Part two of the simplification. Use a single
enum to indicate what we are compliant to (1991, 2440, PGPx, etc.)
* g10.c (main): Show errors for failure in export, send-keys, recv-keys,
and refresh-keys.
* options.h, g10.c (main): Give algorithm warnings for algorithms chosen
against the --pgpX and --openpgp rules.
* keydb.h, pkclist.c (algo_available): Make TIGER192 invalid in --openpgp
mode.
* sign.c (sign_file), pkclist.c (algo_available): Allow passing a hint of
0.
2003-05-03 04:07:45 +00:00
|
|
|
else if(PGP6)
|
|
|
|
{
|
|
|
|
opt.sk_comments=0;
|
|
|
|
opt.escape_from=1;
|
|
|
|
opt.force_v3_sigs=1;
|
|
|
|
opt.ask_sig_expire=0;
|
|
|
|
}
|
|
|
|
else if(PGP7)
|
|
|
|
{
|
|
|
|
opt.sk_comments=0;
|
|
|
|
opt.escape_from=1;
|
|
|
|
opt.force_v3_sigs=1;
|
|
|
|
opt.ask_sig_expire=0;
|
|
|
|
}
|
|
|
|
else if(PGP8)
|
|
|
|
{
|
|
|
|
opt.escape_from=1;
|
|
|
|
}
|
1998-07-09 13:37:17 +00:00
|
|
|
|
|
|
|
/* must do this after dropping setuid, because string_to...
|
2000-07-14 17:34:53 +00:00
|
|
|
* may try to load an module */
|
1998-07-09 13:37:17 +00:00
|
|
|
if( def_cipher_string ) {
|
2002-06-29 13:46:34 +00:00
|
|
|
opt.def_cipher_algo = string_to_cipher_algo(def_cipher_string);
|
|
|
|
if(opt.def_cipher_algo==0 &&
|
2003-02-22 13:00:18 +00:00
|
|
|
(ascii_strcasecmp(def_cipher_string,"idea")==0
|
|
|
|
|| ascii_strcasecmp(def_cipher_string,"s1")==0))
|
2002-06-29 13:46:34 +00:00
|
|
|
idea_cipher_warn(1);
|
|
|
|
m_free(def_cipher_string); def_cipher_string = NULL;
|
|
|
|
if( check_cipher_algo(opt.def_cipher_algo) )
|
1998-08-05 16:51:59 +00:00
|
|
|
log_error(_("selected cipher algorithm is invalid\n"));
|
1998-07-09 13:37:17 +00:00
|
|
|
}
|
|
|
|
if( def_digest_string ) {
|
2002-06-29 13:46:34 +00:00
|
|
|
opt.def_digest_algo = string_to_digest_algo(def_digest_string);
|
|
|
|
m_free(def_digest_string); def_digest_string = NULL;
|
|
|
|
if( check_digest_algo(opt.def_digest_algo) )
|
1998-08-05 16:51:59 +00:00
|
|
|
log_error(_("selected digest algorithm is invalid\n"));
|
1998-07-09 13:37:17 +00:00
|
|
|
}
|
2003-11-15 22:31:58 +00:00
|
|
|
if( compress_algo_string ) {
|
|
|
|
opt.compress_algo = string_to_compress_algo(compress_algo_string);
|
|
|
|
m_free(compress_algo_string); compress_algo_string = NULL;
|
|
|
|
if( check_compress_algo(opt.compress_algo) )
|
2002-11-15 04:07:24 +00:00
|
|
|
log_error(_("selected compression algorithm is invalid\n"));
|
|
|
|
}
|
2002-06-29 13:46:34 +00:00
|
|
|
if( cert_digest_string ) {
|
|
|
|
opt.cert_digest_algo = string_to_digest_algo(cert_digest_string);
|
|
|
|
m_free(cert_digest_string); cert_digest_string = NULL;
|
|
|
|
if( check_digest_algo(opt.cert_digest_algo) )
|
|
|
|
log_error(_("selected certification digest algorithm is invalid\n"));
|
|
|
|
}
|
1998-09-28 19:25:31 +00:00
|
|
|
if( s2k_cipher_string ) {
|
2002-06-29 13:46:34 +00:00
|
|
|
opt.s2k_cipher_algo = string_to_cipher_algo(s2k_cipher_string);
|
|
|
|
m_free(s2k_cipher_string); s2k_cipher_string = NULL;
|
|
|
|
if( check_cipher_algo(opt.s2k_cipher_algo) )
|
1998-09-28 19:25:31 +00:00
|
|
|
log_error(_("selected cipher algorithm is invalid\n"));
|
|
|
|
}
|
|
|
|
if( s2k_digest_string ) {
|
2002-06-29 13:46:34 +00:00
|
|
|
opt.s2k_digest_algo = string_to_digest_algo(s2k_digest_string);
|
|
|
|
m_free(s2k_digest_string); s2k_digest_string = NULL;
|
|
|
|
if( check_digest_algo(opt.s2k_digest_algo) )
|
1998-09-28 19:25:31 +00:00
|
|
|
log_error(_("selected digest algorithm is invalid\n"));
|
|
|
|
}
|
1998-08-05 16:51:59 +00:00
|
|
|
if( opt.completes_needed < 1 )
|
2004-02-23 04:00:51 +00:00
|
|
|
log_error(_("completes-needed must be greater than 0\n"));
|
1998-08-05 16:51:59 +00:00
|
|
|
if( opt.marginals_needed < 2 )
|
2004-02-23 04:00:51 +00:00
|
|
|
log_error(_("marginals-needed must be greater than 1\n"));
|
1998-11-13 19:41:41 +00:00
|
|
|
if( opt.max_cert_depth < 1 || opt.max_cert_depth > 255 )
|
2004-02-23 04:00:51 +00:00
|
|
|
log_error(_("max-cert-depth must be in the range from 1 to 255\n"));
|
2004-02-24 23:37:18 +00:00
|
|
|
if(opt.def_cert_level<0 || opt.def_cert_level>3)
|
|
|
|
log_error(_("invalid default-cert-level; must be 0, 1, 2, or 3\n"));
|
|
|
|
if( opt.min_cert_level < 1 || opt.min_cert_level > 3 )
|
|
|
|
log_error(_("invalid min-cert-level; must be 1, 2, or 3\n"));
|
1998-09-28 19:25:31 +00:00
|
|
|
switch( opt.s2k_mode ) {
|
1998-09-29 16:15:15 +00:00
|
|
|
case 0:
|
1998-11-10 12:59:59 +00:00
|
|
|
log_info(_("NOTE: simple S2K mode (0) is strongly discouraged\n"));
|
1998-09-29 16:15:15 +00:00
|
|
|
break;
|
|
|
|
case 1: case 3: break;
|
1998-09-28 19:25:31 +00:00
|
|
|
default:
|
|
|
|
log_error(_("invalid S2K mode; must be 0, 1 or 3\n"));
|
|
|
|
}
|
1998-08-05 16:51:59 +00:00
|
|
|
|
2002-06-29 13:46:34 +00:00
|
|
|
/* This isn't actually needed, but does serve to error out if the
|
|
|
|
string is invalid. */
|
|
|
|
if(opt.def_preference_list &&
|
|
|
|
keygen_set_std_prefs(opt.def_preference_list,0))
|
|
|
|
log_error(_("invalid default preferences\n"));
|
|
|
|
|
2004-02-24 23:37:18 +00:00
|
|
|
/* We provide defaults for the personal digest list. This is
|
|
|
|
SHA-1. */
|
2002-06-29 13:46:34 +00:00
|
|
|
if(!pers_digest_list)
|
|
|
|
pers_digest_list="h2";
|
|
|
|
|
|
|
|
if(pers_cipher_list &&
|
|
|
|
keygen_set_std_prefs(pers_cipher_list,PREFTYPE_SYM))
|
|
|
|
log_error(_("invalid personal cipher preferences\n"));
|
|
|
|
|
|
|
|
if(pers_digest_list &&
|
|
|
|
keygen_set_std_prefs(pers_digest_list,PREFTYPE_HASH))
|
|
|
|
log_error(_("invalid personal digest preferences\n"));
|
|
|
|
|
|
|
|
if(pers_compress_list &&
|
|
|
|
keygen_set_std_prefs(pers_compress_list,PREFTYPE_ZIP))
|
|
|
|
log_error(_("invalid personal compress preferences\n"));
|
1998-12-08 12:20:53 +00:00
|
|
|
|
2003-09-09 00:25:53 +00:00
|
|
|
/* We don't support all possible commands with multifile yet */
|
|
|
|
if(multifile)
|
|
|
|
{
|
|
|
|
char *cmdname;
|
|
|
|
|
|
|
|
switch(cmd)
|
|
|
|
{
|
|
|
|
case aSign:
|
|
|
|
cmdname="--sign";
|
|
|
|
break;
|
|
|
|
case aClearsign:
|
|
|
|
cmdname="--clearsign";
|
|
|
|
break;
|
|
|
|
case aDetachedSign:
|
|
|
|
cmdname="--detach-sign";
|
|
|
|
break;
|
|
|
|
case aSym:
|
|
|
|
cmdname="--symmetric";
|
|
|
|
break;
|
2003-10-26 03:26:14 +00:00
|
|
|
case aEncrSym:
|
|
|
|
cmdname="--symmetric --encrypt";
|
|
|
|
break;
|
2003-09-09 00:25:53 +00:00
|
|
|
case aStore:
|
|
|
|
cmdname="--store";
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
cmdname=NULL;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(cmdname)
|
|
|
|
log_error(_("%s does not yet work with %s\n"),cmdname,"--multifile");
|
|
|
|
}
|
|
|
|
|
1998-07-09 13:37:17 +00:00
|
|
|
if( log_get_errorcount(0) )
|
2002-06-29 13:46:34 +00:00
|
|
|
g10_exit(2);
|
1998-07-09 13:37:17 +00:00
|
|
|
|
2004-01-30 16:49:28 +00:00
|
|
|
if(opt.compress_level==0)
|
|
|
|
opt.compress_algo=COMPRESS_ALGO_NONE;
|
|
|
|
|
* packet.h, build-packet.c (build_sig_subpkt), export.c
(do_export_stream), import.c (remove_bad_stuff, import), parse-packet.c
(dump_sig_subpkt, parse_one_sig_subpkt): Remove vestigal code for the old
sig cache subpacket. This wasn't completely harmless as it caused
subpacket 101 to disappear on import and export.
* options.h, armor.c, cipher.c, g10.c, keyedit.c, pkclist.c, sign.c,
encode.c, getkey.c, revoke.c: The current flags for different levels of
PGP-ness are massively complex. This is step one in simplifying them. No
functional change yet, just use a macro to check for compliance level.
* sign.c (sign_file): Fix bug that causes spurious compression preference
warning.
* sign.c (clearsign_file): Fix bug that prevents proper warning message
from appearing when clearsigning in --pgp2 mode with a non-v3 RSA key.
* main.h, misc.c (compliance_option_string, compliance_string,
compliance_failure), pkclist.c (build_pk_list), sign.c (sign_file,
clearsign_file), encode.c (encode_crypt, write_pubkey_enc_from_list): New
functions to put the "this message may not be usable...." warning in one
place.
* options.h, g10.c (main): Part two of the simplification. Use a single
enum to indicate what we are compliant to (1991, 2440, PGPx, etc.)
* g10.c (main): Show errors for failure in export, send-keys, recv-keys,
and refresh-keys.
* options.h, g10.c (main): Give algorithm warnings for algorithms chosen
against the --pgpX and --openpgp rules.
* keydb.h, pkclist.c (algo_available): Make TIGER192 invalid in --openpgp
mode.
* sign.c (sign_file), pkclist.c (algo_available): Allow passing a hint of
0.
2003-05-03 04:07:45 +00:00
|
|
|
/* Check our chosen algorithms against the list of legal
|
|
|
|
algorithms. */
|
|
|
|
|
|
|
|
if(!GNUPG)
|
|
|
|
{
|
|
|
|
const char *badalg=NULL;
|
|
|
|
preftype_t badtype=PREFTYPE_NONE;
|
|
|
|
|
|
|
|
if(opt.def_cipher_algo
|
|
|
|
&& !algo_available(PREFTYPE_SYM,opt.def_cipher_algo,NULL))
|
|
|
|
{
|
|
|
|
badalg=cipher_algo_to_string(opt.def_cipher_algo);
|
|
|
|
badtype=PREFTYPE_SYM;
|
|
|
|
}
|
|
|
|
else if(opt.def_digest_algo
|
|
|
|
&& !algo_available(PREFTYPE_HASH,opt.def_digest_algo,NULL))
|
|
|
|
{
|
|
|
|
badalg=digest_algo_to_string(opt.def_digest_algo);
|
|
|
|
badtype=PREFTYPE_HASH;
|
|
|
|
}
|
|
|
|
else if(opt.cert_digest_algo
|
|
|
|
&& !algo_available(PREFTYPE_HASH,opt.cert_digest_algo,NULL))
|
|
|
|
{
|
|
|
|
badalg=digest_algo_to_string(opt.cert_digest_algo);
|
|
|
|
badtype=PREFTYPE_HASH;
|
|
|
|
}
|
2003-11-15 22:31:58 +00:00
|
|
|
else if(opt.compress_algo!=-1
|
|
|
|
&& !algo_available(PREFTYPE_ZIP,opt.compress_algo,NULL))
|
* packet.h, build-packet.c (build_sig_subpkt), export.c
(do_export_stream), import.c (remove_bad_stuff, import), parse-packet.c
(dump_sig_subpkt, parse_one_sig_subpkt): Remove vestigal code for the old
sig cache subpacket. This wasn't completely harmless as it caused
subpacket 101 to disappear on import and export.
* options.h, armor.c, cipher.c, g10.c, keyedit.c, pkclist.c, sign.c,
encode.c, getkey.c, revoke.c: The current flags for different levels of
PGP-ness are massively complex. This is step one in simplifying them. No
functional change yet, just use a macro to check for compliance level.
* sign.c (sign_file): Fix bug that causes spurious compression preference
warning.
* sign.c (clearsign_file): Fix bug that prevents proper warning message
from appearing when clearsigning in --pgp2 mode with a non-v3 RSA key.
* main.h, misc.c (compliance_option_string, compliance_string,
compliance_failure), pkclist.c (build_pk_list), sign.c (sign_file,
clearsign_file), encode.c (encode_crypt, write_pubkey_enc_from_list): New
functions to put the "this message may not be usable...." warning in one
place.
* options.h, g10.c (main): Part two of the simplification. Use a single
enum to indicate what we are compliant to (1991, 2440, PGPx, etc.)
* g10.c (main): Show errors for failure in export, send-keys, recv-keys,
and refresh-keys.
* options.h, g10.c (main): Give algorithm warnings for algorithms chosen
against the --pgpX and --openpgp rules.
* keydb.h, pkclist.c (algo_available): Make TIGER192 invalid in --openpgp
mode.
* sign.c (sign_file), pkclist.c (algo_available): Allow passing a hint of
0.
2003-05-03 04:07:45 +00:00
|
|
|
{
|
2003-11-15 22:31:58 +00:00
|
|
|
badalg=compress_algo_to_string(opt.compress_algo);
|
* packet.h, build-packet.c (build_sig_subpkt), export.c
(do_export_stream), import.c (remove_bad_stuff, import), parse-packet.c
(dump_sig_subpkt, parse_one_sig_subpkt): Remove vestigal code for the old
sig cache subpacket. This wasn't completely harmless as it caused
subpacket 101 to disappear on import and export.
* options.h, armor.c, cipher.c, g10.c, keyedit.c, pkclist.c, sign.c,
encode.c, getkey.c, revoke.c: The current flags for different levels of
PGP-ness are massively complex. This is step one in simplifying them. No
functional change yet, just use a macro to check for compliance level.
* sign.c (sign_file): Fix bug that causes spurious compression preference
warning.
* sign.c (clearsign_file): Fix bug that prevents proper warning message
from appearing when clearsigning in --pgp2 mode with a non-v3 RSA key.
* main.h, misc.c (compliance_option_string, compliance_string,
compliance_failure), pkclist.c (build_pk_list), sign.c (sign_file,
clearsign_file), encode.c (encode_crypt, write_pubkey_enc_from_list): New
functions to put the "this message may not be usable...." warning in one
place.
* options.h, g10.c (main): Part two of the simplification. Use a single
enum to indicate what we are compliant to (1991, 2440, PGPx, etc.)
* g10.c (main): Show errors for failure in export, send-keys, recv-keys,
and refresh-keys.
* options.h, g10.c (main): Give algorithm warnings for algorithms chosen
against the --pgpX and --openpgp rules.
* keydb.h, pkclist.c (algo_available): Make TIGER192 invalid in --openpgp
mode.
* sign.c (sign_file), pkclist.c (algo_available): Allow passing a hint of
0.
2003-05-03 04:07:45 +00:00
|
|
|
badtype=PREFTYPE_ZIP;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(badalg)
|
|
|
|
{
|
|
|
|
switch(badtype)
|
|
|
|
{
|
|
|
|
case PREFTYPE_SYM:
|
2004-08-27 17:32:31 +00:00
|
|
|
log_info(_("you may not use cipher algorithm `%s'"
|
|
|
|
" while in %s mode\n"),
|
* packet.h, build-packet.c (build_sig_subpkt), export.c
(do_export_stream), import.c (remove_bad_stuff, import), parse-packet.c
(dump_sig_subpkt, parse_one_sig_subpkt): Remove vestigal code for the old
sig cache subpacket. This wasn't completely harmless as it caused
subpacket 101 to disappear on import and export.
* options.h, armor.c, cipher.c, g10.c, keyedit.c, pkclist.c, sign.c,
encode.c, getkey.c, revoke.c: The current flags for different levels of
PGP-ness are massively complex. This is step one in simplifying them. No
functional change yet, just use a macro to check for compliance level.
* sign.c (sign_file): Fix bug that causes spurious compression preference
warning.
* sign.c (clearsign_file): Fix bug that prevents proper warning message
from appearing when clearsigning in --pgp2 mode with a non-v3 RSA key.
* main.h, misc.c (compliance_option_string, compliance_string,
compliance_failure), pkclist.c (build_pk_list), sign.c (sign_file,
clearsign_file), encode.c (encode_crypt, write_pubkey_enc_from_list): New
functions to put the "this message may not be usable...." warning in one
place.
* options.h, g10.c (main): Part two of the simplification. Use a single
enum to indicate what we are compliant to (1991, 2440, PGPx, etc.)
* g10.c (main): Show errors for failure in export, send-keys, recv-keys,
and refresh-keys.
* options.h, g10.c (main): Give algorithm warnings for algorithms chosen
against the --pgpX and --openpgp rules.
* keydb.h, pkclist.c (algo_available): Make TIGER192 invalid in --openpgp
mode.
* sign.c (sign_file), pkclist.c (algo_available): Allow passing a hint of
0.
2003-05-03 04:07:45 +00:00
|
|
|
badalg,compliance_option_string());
|
|
|
|
break;
|
|
|
|
case PREFTYPE_HASH:
|
2004-08-27 17:32:31 +00:00
|
|
|
log_info(_("you may not use digest algorithm `%s'"
|
|
|
|
" while in %s mode\n"),
|
* packet.h, build-packet.c (build_sig_subpkt), export.c
(do_export_stream), import.c (remove_bad_stuff, import), parse-packet.c
(dump_sig_subpkt, parse_one_sig_subpkt): Remove vestigal code for the old
sig cache subpacket. This wasn't completely harmless as it caused
subpacket 101 to disappear on import and export.
* options.h, armor.c, cipher.c, g10.c, keyedit.c, pkclist.c, sign.c,
encode.c, getkey.c, revoke.c: The current flags for different levels of
PGP-ness are massively complex. This is step one in simplifying them. No
functional change yet, just use a macro to check for compliance level.
* sign.c (sign_file): Fix bug that causes spurious compression preference
warning.
* sign.c (clearsign_file): Fix bug that prevents proper warning message
from appearing when clearsigning in --pgp2 mode with a non-v3 RSA key.
* main.h, misc.c (compliance_option_string, compliance_string,
compliance_failure), pkclist.c (build_pk_list), sign.c (sign_file,
clearsign_file), encode.c (encode_crypt, write_pubkey_enc_from_list): New
functions to put the "this message may not be usable...." warning in one
place.
* options.h, g10.c (main): Part two of the simplification. Use a single
enum to indicate what we are compliant to (1991, 2440, PGPx, etc.)
* g10.c (main): Show errors for failure in export, send-keys, recv-keys,
and refresh-keys.
* options.h, g10.c (main): Give algorithm warnings for algorithms chosen
against the --pgpX and --openpgp rules.
* keydb.h, pkclist.c (algo_available): Make TIGER192 invalid in --openpgp
mode.
* sign.c (sign_file), pkclist.c (algo_available): Allow passing a hint of
0.
2003-05-03 04:07:45 +00:00
|
|
|
badalg,compliance_option_string());
|
|
|
|
break;
|
|
|
|
case PREFTYPE_ZIP:
|
2004-08-27 17:32:31 +00:00
|
|
|
log_info(_("you may not use compression algorithm `%s'"
|
|
|
|
" while in %s mode\n"),
|
* packet.h, build-packet.c (build_sig_subpkt), export.c
(do_export_stream), import.c (remove_bad_stuff, import), parse-packet.c
(dump_sig_subpkt, parse_one_sig_subpkt): Remove vestigal code for the old
sig cache subpacket. This wasn't completely harmless as it caused
subpacket 101 to disappear on import and export.
* options.h, armor.c, cipher.c, g10.c, keyedit.c, pkclist.c, sign.c,
encode.c, getkey.c, revoke.c: The current flags for different levels of
PGP-ness are massively complex. This is step one in simplifying them. No
functional change yet, just use a macro to check for compliance level.
* sign.c (sign_file): Fix bug that causes spurious compression preference
warning.
* sign.c (clearsign_file): Fix bug that prevents proper warning message
from appearing when clearsigning in --pgp2 mode with a non-v3 RSA key.
* main.h, misc.c (compliance_option_string, compliance_string,
compliance_failure), pkclist.c (build_pk_list), sign.c (sign_file,
clearsign_file), encode.c (encode_crypt, write_pubkey_enc_from_list): New
functions to put the "this message may not be usable...." warning in one
place.
* options.h, g10.c (main): Part two of the simplification. Use a single
enum to indicate what we are compliant to (1991, 2440, PGPx, etc.)
* g10.c (main): Show errors for failure in export, send-keys, recv-keys,
and refresh-keys.
* options.h, g10.c (main): Give algorithm warnings for algorithms chosen
against the --pgpX and --openpgp rules.
* keydb.h, pkclist.c (algo_available): Make TIGER192 invalid in --openpgp
mode.
* sign.c (sign_file), pkclist.c (algo_available): Allow passing a hint of
0.
2003-05-03 04:07:45 +00:00
|
|
|
badalg,compliance_option_string());
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
BUG();
|
|
|
|
}
|
|
|
|
|
|
|
|
compliance_failure();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-07-14 17:34:53 +00:00
|
|
|
/* set the random seed file */
|
|
|
|
if( use_random_seed ) {
|
|
|
|
char *p = make_filename(opt.homedir, "random_seed", NULL );
|
|
|
|
set_random_seed_file(p);
|
2004-10-13 18:10:06 +00:00
|
|
|
if (!access (p, F_OK))
|
|
|
|
register_secured_file (p);
|
2002-06-29 13:46:34 +00:00
|
|
|
m_free(p);
|
2000-07-14 17:34:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if( !cmd && opt.fingerprint && !with_fpr ) {
|
1998-03-09 21:44:06 +00:00
|
|
|
set_cmd( &cmd, aListKeys);
|
2000-07-14 17:34:53 +00:00
|
|
|
}
|
1998-03-09 21:44:06 +00:00
|
|
|
|
1998-01-05 19:13:15 +00:00
|
|
|
if( cmd == aKMode || cmd == aKModeC ) { /* kludge to be compatible to pgp */
|
|
|
|
if( cmd == aKModeC ) {
|
|
|
|
opt.fingerprint = 1;
|
|
|
|
cmd = aKMode;
|
|
|
|
}
|
|
|
|
opt.list_sigs = 0;
|
|
|
|
if( opt.verbose > 2 )
|
|
|
|
opt.check_sigs++;
|
|
|
|
if( opt.verbose > 1 )
|
|
|
|
opt.list_sigs++;
|
|
|
|
|
|
|
|
opt.verbose = opt.verbose > 1;
|
2002-06-29 13:46:34 +00:00
|
|
|
g10_opt_verbose = opt.verbose;
|
1998-01-05 19:13:15 +00:00
|
|
|
}
|
1998-03-05 09:22:13 +00:00
|
|
|
|
|
|
|
/* kludge to let -sat generate a clear text signature */
|
1998-11-03 19:38:58 +00:00
|
|
|
if( opt.textmode == 2 && !detached_sig && opt.armor && cmd == aSign )
|
1998-03-05 09:22:13 +00:00
|
|
|
cmd = aClearsign;
|
|
|
|
|
1997-11-18 14:06:00 +00:00
|
|
|
if( opt.verbose > 1 )
|
|
|
|
set_packet_list_mode(1);
|
|
|
|
|
2002-06-29 13:46:34 +00:00
|
|
|
/* Add the keyrings, but not for some special commands and not in
|
|
|
|
case of "-kvv userid keyring". Also avoid adding the secret
|
|
|
|
keyring for a couple of commands to avoid unneeded access in
|
2004-10-13 18:10:06 +00:00
|
|
|
case the secrings are stored on a floppy.
|
|
|
|
|
|
|
|
We always need to add the keyrings if we are running under
|
|
|
|
SELinux, thi is so that the rings are added to the list of
|
|
|
|
secured files. */
|
|
|
|
if( ALWAYS_ADD_KEYRINGS
|
|
|
|
|| (cmd != aDeArmor && cmd != aEnArmor
|
|
|
|
&& !(cmd == aKMode && argc == 2 )) )
|
2002-06-29 13:46:34 +00:00
|
|
|
{
|
2004-10-13 18:10:06 +00:00
|
|
|
if (ALWAYS_ADD_KEYRINGS
|
|
|
|
|| (cmd != aCheckKeys && cmd != aListSigs && cmd != aListKeys
|
|
|
|
&& cmd != aVerify && cmd != aSym))
|
2002-06-29 13:46:34 +00:00
|
|
|
{
|
|
|
|
if (!sec_nrings || default_keyring) /* add default secret rings */
|
|
|
|
keydb_add_resource ("secring" EXTSEP_S "gpg", 0, 1);
|
|
|
|
for (sl = sec_nrings; sl; sl = sl->next)
|
|
|
|
keydb_add_resource ( sl->d, 0, 1 );
|
|
|
|
}
|
|
|
|
if( !nrings || default_keyring ) /* add default ring */
|
|
|
|
keydb_add_resource ("pubring" EXTSEP_S "gpg", 0, 0);
|
1998-07-09 13:37:17 +00:00
|
|
|
for(sl = nrings; sl; sl = sl->next )
|
2002-11-08 03:31:21 +00:00
|
|
|
keydb_add_resource ( sl->d, sl->flags, 0 );
|
2002-06-29 13:46:34 +00:00
|
|
|
}
|
1998-07-09 13:37:17 +00:00
|
|
|
FREE_STRLIST(nrings);
|
|
|
|
FREE_STRLIST(sec_nrings);
|
1997-11-18 14:06:00 +00:00
|
|
|
|
1998-09-28 19:25:31 +00:00
|
|
|
|
|
|
|
if( pwfd != -1 ) /* read the passphrase now. */
|
|
|
|
read_passphrase_from_fd( pwfd );
|
|
|
|
|
|
|
|
fname = argc? *argv : NULL;
|
1997-11-18 14:06:00 +00:00
|
|
|
|
1998-03-05 09:22:13 +00:00
|
|
|
switch( cmd ) {
|
|
|
|
case aPrimegen:
|
1998-05-15 18:49:19 +00:00
|
|
|
case aPrintMD:
|
1998-03-05 09:22:13 +00:00
|
|
|
case aPrintMDs:
|
|
|
|
case aGenRandom:
|
|
|
|
case aDeArmor:
|
|
|
|
case aEnArmor:
|
1998-10-07 13:30:43 +00:00
|
|
|
case aFixTrustDB:
|
1998-03-05 09:22:13 +00:00
|
|
|
break;
|
1999-03-11 15:42:06 +00:00
|
|
|
case aExportOwnerTrust: rc = setup_trustdb( 0, trustdb_name ); break;
|
|
|
|
case aListTrustDB: rc = setup_trustdb( argc? 1:0, trustdb_name ); break;
|
|
|
|
default: rc = setup_trustdb(1, trustdb_name ); break;
|
1998-03-05 09:22:13 +00:00
|
|
|
}
|
1998-01-16 21:15:24 +00:00
|
|
|
if( rc )
|
2002-06-29 13:46:34 +00:00
|
|
|
log_error(_("failed to initialize the TrustDB: %s\n"), g10_errstr(rc));
|
|
|
|
|
|
|
|
|
2004-01-22 03:47:05 +00:00
|
|
|
switch (cmd)
|
|
|
|
{
|
2002-06-29 13:46:34 +00:00
|
|
|
case aStore:
|
|
|
|
case aSym:
|
|
|
|
case aSign:
|
|
|
|
case aSignSym:
|
|
|
|
case aClearsign:
|
|
|
|
if (!opt.quiet && any_explicit_recipient)
|
|
|
|
log_info (_("WARNING: recipients (-r) given "
|
|
|
|
"without using public key encryption\n"));
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
2004-01-22 03:47:05 +00:00
|
|
|
}
|
1998-01-12 10:18:17 +00:00
|
|
|
|
2004-01-22 03:47:05 +00:00
|
|
|
switch( cmd )
|
|
|
|
{
|
1997-11-18 14:06:00 +00:00
|
|
|
case aStore: /* only store the file */
|
|
|
|
if( argc > 1 )
|
1998-02-04 18:54:31 +00:00
|
|
|
wrong_args(_("--store [filename]"));
|
1997-11-18 14:06:00 +00:00
|
|
|
if( (rc = encode_store(fname)) )
|
2004-10-13 18:10:06 +00:00
|
|
|
log_error ("storing `%s' failed: %s\n",
|
|
|
|
print_fname_stdin(fname),g10_errstr(rc) );
|
1997-11-18 14:06:00 +00:00
|
|
|
break;
|
|
|
|
case aSym: /* encrypt the given file only with the symmetric cipher */
|
|
|
|
if( argc > 1 )
|
1998-02-04 18:54:31 +00:00
|
|
|
wrong_args(_("--symmetric [filename]"));
|
1997-11-18 14:06:00 +00:00
|
|
|
if( (rc = encode_symmetric(fname)) )
|
2004-10-13 18:10:06 +00:00
|
|
|
log_error (_("symmetric encryption of `%s' failed: %s\n"),
|
|
|
|
print_fname_stdin(fname),g10_errstr(rc) );
|
1997-11-18 14:06:00 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case aEncr: /* encrypt the given file */
|
2003-09-09 00:25:53 +00:00
|
|
|
if(multifile)
|
|
|
|
encode_crypt_files(argc, argv, remusr);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if( argc > 1 )
|
|
|
|
wrong_args(_("--encrypt [filename]"));
|
2003-10-26 03:26:14 +00:00
|
|
|
if( (rc = encode_crypt(fname,remusr,0)) )
|
|
|
|
log_error("%s: encryption failed: %s\n",
|
|
|
|
print_fname_stdin(fname), g10_errstr(rc) );
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case aEncrSym:
|
* misc.c (compress_algo_to_string, string_to_compress_algo,
check_compress_algo): Add bzip2.
* compress.c (compress_filter): Make static to help force the use of
push_compress_filter. Remove default algorithm setting since that is done
in push_compress_filter now.
* main.h: Use named algorithm.
* filter.h, compress.c (push_compress_filter, push_compress_filter2): New.
Figure out which is the appropriate compression filter to use, and push it
into place.
* compress.c (handle_compressed), encode.c (encode_simple, encode_crypt),
sign.c (sign_file, sign_symencrypt_file), import.c (read_block), export.c
(do_export): Use push_compress_filter instead of pushing the compression
filter ourselves.
* compress-bz2.c: New. Bzlib versions of the compression filter routines.
* Makefile.am: Include compress-bz2.c if bz2lib is available.
2003-10-31 05:39:02 +00:00
|
|
|
/* This works with PGP 8 in the sense that it acts just like a
|
|
|
|
symmetric message. It doesn't work at all with 2 or 6. It
|
2003-10-26 03:26:14 +00:00
|
|
|
might work with 7, but alas, I don't have a copy to test
|
|
|
|
with right now. */
|
|
|
|
if( argc > 1 )
|
|
|
|
wrong_args(_("--symmetric --encrypt [filename]"));
|
|
|
|
else if(opt.s2k_mode==0)
|
|
|
|
log_error(_("you cannot use --symmetric --encrypt"
|
|
|
|
" with --s2k-mode 0\n"));
|
|
|
|
else if(PGP2 || PGP6 || PGP7 || RFC1991)
|
|
|
|
log_error(_("you cannot use --symmetric --encrypt"
|
|
|
|
" while in %s mode\n"),compliance_option_string());
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if( (rc = encode_crypt(fname,remusr,1)) )
|
2003-09-09 00:25:53 +00:00
|
|
|
log_error("%s: encryption failed: %s\n",
|
|
|
|
print_fname_stdin(fname), g10_errstr(rc) );
|
|
|
|
}
|
1997-11-24 11:04:11 +00:00
|
|
|
break;
|
2003-10-26 03:26:14 +00:00
|
|
|
|
1997-11-24 11:04:11 +00:00
|
|
|
case aSign: /* sign the given file */
|
1998-01-13 19:04:23 +00:00
|
|
|
sl = NULL;
|
|
|
|
if( detached_sig ) { /* sign all files */
|
|
|
|
for( ; argc; argc--, argv++ )
|
|
|
|
add_to_strlist( &sl, *argv );
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
if( argc > 1 )
|
1998-02-04 18:54:31 +00:00
|
|
|
wrong_args(_("--sign [filename]"));
|
1998-01-13 19:04:23 +00:00
|
|
|
if( argc ) {
|
2002-06-29 13:46:34 +00:00
|
|
|
sl = m_alloc_clear( sizeof *sl + strlen(fname));
|
1998-01-13 19:04:23 +00:00
|
|
|
strcpy(sl->d, fname);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if( (rc = sign_file( sl, detached_sig, locusr, 0, NULL, NULL)) )
|
2002-06-29 13:46:34 +00:00
|
|
|
log_error("signing failed: %s\n", g10_errstr(rc) );
|
1998-01-13 19:04:23 +00:00
|
|
|
free_strlist(sl);
|
1997-11-24 11:04:11 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case aSignEncr: /* sign and encrypt the given file */
|
1997-12-31 12:32:54 +00:00
|
|
|
if( argc > 1 )
|
1998-02-04 18:54:31 +00:00
|
|
|
wrong_args(_("--sign --encrypt [filename]"));
|
1998-01-13 19:04:23 +00:00
|
|
|
if( argc ) {
|
2002-06-29 13:46:34 +00:00
|
|
|
sl = m_alloc_clear( sizeof *sl + strlen(fname));
|
1998-01-13 19:04:23 +00:00
|
|
|
strcpy(sl->d, fname);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
sl = NULL;
|
|
|
|
if( (rc = sign_file(sl, detached_sig, locusr, 1, remusr, NULL)) )
|
2003-11-13 02:54:12 +00:00
|
|
|
log_error("%s: sign+encrypt failed: %s\n",
|
|
|
|
print_fname_stdin(fname), g10_errstr(rc) );
|
1998-01-13 19:04:23 +00:00
|
|
|
free_strlist(sl);
|
1997-11-18 14:06:00 +00:00
|
|
|
break;
|
|
|
|
|
2003-11-13 02:54:12 +00:00
|
|
|
case aSignEncrSym: /* sign and encrypt the given file */
|
|
|
|
if( argc > 1 )
|
|
|
|
wrong_args(_("--symmetric --sign --encrypt [filename]"));
|
|
|
|
else if(opt.s2k_mode==0)
|
|
|
|
log_error(_("you cannot use --symmetric --sign --encrypt"
|
|
|
|
" with --s2k-mode 0\n"));
|
|
|
|
else if(PGP2 || PGP6 || PGP7 || RFC1991)
|
|
|
|
log_error(_("you cannot use --symmetric --sign --encrypt"
|
|
|
|
" while in %s mode\n"),compliance_option_string());
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if( argc )
|
|
|
|
{
|
|
|
|
sl = m_alloc_clear( sizeof *sl + strlen(fname));
|
|
|
|
strcpy(sl->d, fname);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
sl = NULL;
|
|
|
|
if( (rc = sign_file(sl, detached_sig, locusr, 2, remusr, NULL)) )
|
|
|
|
log_error("%s: symmetric+sign+encrypt failed: %s\n",
|
|
|
|
print_fname_stdin(fname), g10_errstr(rc) );
|
|
|
|
free_strlist(sl);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2002-06-29 13:46:34 +00:00
|
|
|
case aSignSym: /* sign and conventionally encrypt the given file */
|
|
|
|
if (argc > 1)
|
|
|
|
wrong_args(_("--sign --symmetric [filename]"));
|
|
|
|
rc = sign_symencrypt_file (fname, locusr);
|
|
|
|
if (rc)
|
|
|
|
log_error("%s: sign+symmetric failed: %s\n",
|
|
|
|
print_fname_stdin(fname), g10_errstr(rc) );
|
|
|
|
break;
|
|
|
|
|
1998-02-04 18:54:31 +00:00
|
|
|
case aClearsign: /* make a clearsig */
|
|
|
|
if( argc > 1 )
|
|
|
|
wrong_args(_("--clearsign [filename]"));
|
|
|
|
if( (rc = clearsign_file(fname, locusr, NULL)) )
|
2002-06-29 13:46:34 +00:00
|
|
|
log_error("%s: clearsign failed: %s\n",
|
|
|
|
print_fname_stdin(fname), g10_errstr(rc) );
|
1998-03-09 21:44:06 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case aVerify:
|
2003-09-09 00:25:53 +00:00
|
|
|
if(multifile)
|
|
|
|
{
|
|
|
|
if( (rc = verify_files( argc, argv ) ))
|
|
|
|
log_error("verify files failed: %s\n", g10_errstr(rc) );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if( (rc = verify_signatures( argc, argv ) ))
|
|
|
|
log_error("verify signatures failed: %s\n", g10_errstr(rc) );
|
|
|
|
}
|
2000-07-14 17:34:53 +00:00
|
|
|
break;
|
|
|
|
|
1998-03-09 21:44:06 +00:00
|
|
|
case aDecrypt:
|
2003-09-09 00:25:53 +00:00
|
|
|
if(multifile)
|
|
|
|
decrypt_messages(argc, argv);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if( argc > 1 )
|
|
|
|
wrong_args(_("--decrypt [filename]"));
|
|
|
|
if( (rc = decrypt_message( fname ) ))
|
|
|
|
log_error("decrypt_message failed: %s\n", g10_errstr(rc) );
|
|
|
|
}
|
1998-02-04 18:54:31 +00:00
|
|
|
break;
|
2002-06-29 13:46:34 +00:00
|
|
|
|
2004-02-12 18:32:09 +00:00
|
|
|
case aSignKey:
|
1999-07-12 16:49:22 +00:00
|
|
|
if( argc != 1 )
|
2004-02-12 18:32:09 +00:00
|
|
|
wrong_args(_("--sign-key user-id"));
|
|
|
|
/* fall through */
|
1999-07-12 16:49:22 +00:00
|
|
|
case aLSignKey:
|
|
|
|
if( argc != 1 )
|
2004-02-12 18:32:09 +00:00
|
|
|
wrong_args(_("--lsign-key user-id"));
|
|
|
|
/* fall through */
|
|
|
|
|
|
|
|
sl=NULL;
|
|
|
|
|
|
|
|
if(cmd==aSignKey)
|
|
|
|
append_to_strlist(&sl,"sign");
|
|
|
|
else if(cmd==aLSignKey)
|
|
|
|
append_to_strlist(&sl,"lsign");
|
|
|
|
else
|
|
|
|
BUG();
|
|
|
|
|
|
|
|
append_to_strlist( &sl, "save" );
|
2002-06-29 13:46:34 +00:00
|
|
|
username = make_username( fname );
|
2004-02-12 18:32:09 +00:00
|
|
|
keyedit_menu(fname, locusr, sl, 0, 0 );
|
|
|
|
m_free(username);
|
|
|
|
free_strlist(sl);
|
|
|
|
break;
|
2002-06-29 13:46:34 +00:00
|
|
|
|
1998-07-06 10:23:57 +00:00
|
|
|
case aEditKey: /* Edit a key signature */
|
1998-11-20 17:42:18 +00:00
|
|
|
if( !argc )
|
1999-07-12 16:49:22 +00:00
|
|
|
wrong_args(_("--edit-key user-id [commands]"));
|
|
|
|
username = make_username( fname );
|
1998-11-20 17:42:18 +00:00
|
|
|
if( argc > 1 ) {
|
|
|
|
sl = NULL;
|
|
|
|
for( argc--, argv++ ; argc; argc--, argv++ )
|
1999-07-12 16:49:22 +00:00
|
|
|
append_to_strlist( &sl, *argv );
|
2004-02-12 18:32:09 +00:00
|
|
|
keyedit_menu( username, locusr, sl, 0, 1 );
|
1998-11-20 17:42:18 +00:00
|
|
|
free_strlist(sl);
|
|
|
|
}
|
|
|
|
else
|
2004-02-12 18:32:09 +00:00
|
|
|
keyedit_menu(username, locusr, NULL, 0, 1 );
|
2002-06-29 13:46:34 +00:00
|
|
|
m_free(username);
|
1998-01-06 21:01:36 +00:00
|
|
|
break;
|
|
|
|
|
2002-06-29 13:46:34 +00:00
|
|
|
case aDeleteKeys:
|
|
|
|
case aDeleteSecretKeys:
|
|
|
|
case aDeleteSecretAndPublicKeys:
|
|
|
|
sl = NULL;
|
|
|
|
/* I'm adding these in reverse order as add_to_strlist2
|
|
|
|
reverses them again, and it's easier to understand in the
|
|
|
|
proper order :) */
|
|
|
|
for( ; argc; argc-- )
|
|
|
|
add_to_strlist2( &sl, argv[argc-1], utf8_strings );
|
|
|
|
delete_keys(sl,cmd==aDeleteSecretKeys,cmd==aDeleteSecretAndPublicKeys);
|
|
|
|
free_strlist(sl);
|
1998-03-03 08:43:28 +00:00
|
|
|
break;
|
|
|
|
|
1998-02-13 20:58:50 +00:00
|
|
|
case aCheckKeys:
|
1998-03-09 21:44:06 +00:00
|
|
|
opt.check_sigs = 1;
|
|
|
|
case aListSigs:
|
|
|
|
opt.list_sigs = 1;
|
|
|
|
case aListKeys:
|
2000-07-14 17:34:53 +00:00
|
|
|
sl = NULL;
|
|
|
|
for( ; argc; argc--, argv++ )
|
|
|
|
add_to_strlist2( &sl, *argv, utf8_strings );
|
|
|
|
public_key_list( sl );
|
|
|
|
free_strlist(sl);
|
1998-05-29 11:53:54 +00:00
|
|
|
break;
|
|
|
|
case aListSecretKeys:
|
2000-07-14 17:34:53 +00:00
|
|
|
sl = NULL;
|
|
|
|
for( ; argc; argc--, argv++ )
|
|
|
|
add_to_strlist2( &sl, *argv, utf8_strings );
|
|
|
|
secret_key_list( sl );
|
|
|
|
free_strlist(sl);
|
1998-03-09 21:44:06 +00:00
|
|
|
break;
|
|
|
|
|
1999-07-12 12:57:54 +00:00
|
|
|
case aKMode: /* list keyring -- NOTE: This will be removed soon */
|
2000-07-14 17:34:53 +00:00
|
|
|
if( argc < 2 ) { /* -kv [userid] */
|
|
|
|
sl = NULL;
|
|
|
|
if (argc && **argv)
|
|
|
|
add_to_strlist2( &sl, *argv, utf8_strings );
|
|
|
|
public_key_list( sl );
|
|
|
|
free_strlist(sl);
|
|
|
|
}
|
1998-03-09 21:44:06 +00:00
|
|
|
else if( argc == 2 ) { /* -kv userid keyring */
|
|
|
|
if( access( argv[1], R_OK ) ) {
|
2004-08-27 17:32:31 +00:00
|
|
|
log_error(_("can't open `%s': %s\n"),
|
1998-03-09 21:44:06 +00:00
|
|
|
print_fname_stdin(argv[1]), strerror(errno));
|
1998-01-05 19:13:15 +00:00
|
|
|
}
|
1998-02-13 20:58:50 +00:00
|
|
|
else {
|
1998-03-09 21:44:06 +00:00
|
|
|
/* add keyring (default keyrings are not registered in this
|
|
|
|
* special case */
|
2002-06-29 13:46:34 +00:00
|
|
|
keydb_add_resource( argv[1], 0, 0 );
|
2000-07-14 17:34:53 +00:00
|
|
|
sl = NULL;
|
|
|
|
if (**argv)
|
|
|
|
add_to_strlist2( &sl, *argv, utf8_strings );
|
|
|
|
public_key_list( sl );
|
|
|
|
free_strlist(sl);
|
1998-02-13 20:58:50 +00:00
|
|
|
}
|
1998-01-05 19:13:15 +00:00
|
|
|
}
|
|
|
|
else
|
1999-07-26 07:44:46 +00:00
|
|
|
wrong_args(_("-k[v][v][v][c] [user-id] [keyring]") );
|
1998-01-05 19:13:15 +00:00
|
|
|
break;
|
1997-12-16 19:15:09 +00:00
|
|
|
|
2000-07-14 17:34:53 +00:00
|
|
|
case aKeygen: /* generate a key */
|
|
|
|
if( opt.batch ) {
|
|
|
|
if( argc > 1 )
|
|
|
|
wrong_args("--gen-key [parameterfile]");
|
2004-09-23 19:34:45 +00:00
|
|
|
generate_keypair( argc? *argv : NULL, NULL, NULL );
|
2000-07-14 17:34:53 +00:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
if( argc )
|
|
|
|
wrong_args("--gen-key");
|
2004-09-23 19:34:45 +00:00
|
|
|
generate_keypair(NULL, NULL, NULL);
|
2000-07-14 17:34:53 +00:00
|
|
|
}
|
1997-11-18 14:06:00 +00:00
|
|
|
break;
|
|
|
|
|
1998-10-25 19:00:01 +00:00
|
|
|
case aFastImport:
|
2004-11-26 15:51:37 +00:00
|
|
|
opt.import_options |= IMPORT_FAST;
|
1998-01-16 21:15:24 +00:00
|
|
|
case aImport:
|
2002-09-23 13:03:52 +00:00
|
|
|
import_keys( argc? argv:NULL, argc, NULL, opt.import_options );
|
1998-01-16 21:15:24 +00:00
|
|
|
break;
|
|
|
|
|
1998-01-26 22:09:01 +00:00
|
|
|
case aExport:
|
1999-01-19 18:37:41 +00:00
|
|
|
case aSendKeys:
|
1999-03-20 10:53:39 +00:00
|
|
|
case aRecvKeys:
|
1998-01-26 22:09:01 +00:00
|
|
|
sl = NULL;
|
|
|
|
for( ; argc; argc--, argv++ )
|
1999-07-12 12:57:54 +00:00
|
|
|
add_to_strlist2( &sl, *argv, utf8_strings );
|
1999-01-19 18:37:41 +00:00
|
|
|
if( cmd == aSendKeys )
|
* packet.h, build-packet.c (build_sig_subpkt), export.c
(do_export_stream), import.c (remove_bad_stuff, import), parse-packet.c
(dump_sig_subpkt, parse_one_sig_subpkt): Remove vestigal code for the old
sig cache subpacket. This wasn't completely harmless as it caused
subpacket 101 to disappear on import and export.
* options.h, armor.c, cipher.c, g10.c, keyedit.c, pkclist.c, sign.c,
encode.c, getkey.c, revoke.c: The current flags for different levels of
PGP-ness are massively complex. This is step one in simplifying them. No
functional change yet, just use a macro to check for compliance level.
* sign.c (sign_file): Fix bug that causes spurious compression preference
warning.
* sign.c (clearsign_file): Fix bug that prevents proper warning message
from appearing when clearsigning in --pgp2 mode with a non-v3 RSA key.
* main.h, misc.c (compliance_option_string, compliance_string,
compliance_failure), pkclist.c (build_pk_list), sign.c (sign_file,
clearsign_file), encode.c (encode_crypt, write_pubkey_enc_from_list): New
functions to put the "this message may not be usable...." warning in one
place.
* options.h, g10.c (main): Part two of the simplification. Use a single
enum to indicate what we are compliant to (1991, 2440, PGPx, etc.)
* g10.c (main): Show errors for failure in export, send-keys, recv-keys,
and refresh-keys.
* options.h, g10.c (main): Give algorithm warnings for algorithms chosen
against the --pgpX and --openpgp rules.
* keydb.h, pkclist.c (algo_available): Make TIGER192 invalid in --openpgp
mode.
* sign.c (sign_file), pkclist.c (algo_available): Allow passing a hint of
0.
2003-05-03 04:07:45 +00:00
|
|
|
rc=keyserver_export( sl );
|
1999-03-20 10:53:39 +00:00
|
|
|
else if( cmd == aRecvKeys )
|
* packet.h, build-packet.c (build_sig_subpkt), export.c
(do_export_stream), import.c (remove_bad_stuff, import), parse-packet.c
(dump_sig_subpkt, parse_one_sig_subpkt): Remove vestigal code for the old
sig cache subpacket. This wasn't completely harmless as it caused
subpacket 101 to disappear on import and export.
* options.h, armor.c, cipher.c, g10.c, keyedit.c, pkclist.c, sign.c,
encode.c, getkey.c, revoke.c: The current flags for different levels of
PGP-ness are massively complex. This is step one in simplifying them. No
functional change yet, just use a macro to check for compliance level.
* sign.c (sign_file): Fix bug that causes spurious compression preference
warning.
* sign.c (clearsign_file): Fix bug that prevents proper warning message
from appearing when clearsigning in --pgp2 mode with a non-v3 RSA key.
* main.h, misc.c (compliance_option_string, compliance_string,
compliance_failure), pkclist.c (build_pk_list), sign.c (sign_file,
clearsign_file), encode.c (encode_crypt, write_pubkey_enc_from_list): New
functions to put the "this message may not be usable...." warning in one
place.
* options.h, g10.c (main): Part two of the simplification. Use a single
enum to indicate what we are compliant to (1991, 2440, PGPx, etc.)
* g10.c (main): Show errors for failure in export, send-keys, recv-keys,
and refresh-keys.
* options.h, g10.c (main): Give algorithm warnings for algorithms chosen
against the --pgpX and --openpgp rules.
* keydb.h, pkclist.c (algo_available): Make TIGER192 invalid in --openpgp
mode.
* sign.c (sign_file), pkclist.c (algo_available): Allow passing a hint of
0.
2003-05-03 04:07:45 +00:00
|
|
|
rc=keyserver_import( sl );
|
1999-01-19 18:37:41 +00:00
|
|
|
else
|
* packet.h, build-packet.c (build_sig_subpkt), export.c
(do_export_stream), import.c (remove_bad_stuff, import), parse-packet.c
(dump_sig_subpkt, parse_one_sig_subpkt): Remove vestigal code for the old
sig cache subpacket. This wasn't completely harmless as it caused
subpacket 101 to disappear on import and export.
* options.h, armor.c, cipher.c, g10.c, keyedit.c, pkclist.c, sign.c,
encode.c, getkey.c, revoke.c: The current flags for different levels of
PGP-ness are massively complex. This is step one in simplifying them. No
functional change yet, just use a macro to check for compliance level.
* sign.c (sign_file): Fix bug that causes spurious compression preference
warning.
* sign.c (clearsign_file): Fix bug that prevents proper warning message
from appearing when clearsigning in --pgp2 mode with a non-v3 RSA key.
* main.h, misc.c (compliance_option_string, compliance_string,
compliance_failure), pkclist.c (build_pk_list), sign.c (sign_file,
clearsign_file), encode.c (encode_crypt, write_pubkey_enc_from_list): New
functions to put the "this message may not be usable...." warning in one
place.
* options.h, g10.c (main): Part two of the simplification. Use a single
enum to indicate what we are compliant to (1991, 2440, PGPx, etc.)
* g10.c (main): Show errors for failure in export, send-keys, recv-keys,
and refresh-keys.
* options.h, g10.c (main): Give algorithm warnings for algorithms chosen
against the --pgpX and --openpgp rules.
* keydb.h, pkclist.c (algo_available): Make TIGER192 invalid in --openpgp
mode.
* sign.c (sign_file), pkclist.c (algo_available): Allow passing a hint of
0.
2003-05-03 04:07:45 +00:00
|
|
|
rc=export_pubkeys( sl, opt.export_options );
|
|
|
|
if(rc)
|
|
|
|
{
|
|
|
|
if(cmd==aSendKeys)
|
|
|
|
log_error(_("keyserver send failed: %s\n"),g10_errstr(rc));
|
|
|
|
else if(cmd==aRecvKeys)
|
|
|
|
log_error(_("keyserver receive failed: %s\n"),g10_errstr(rc));
|
|
|
|
else
|
|
|
|
log_error(_("key export failed: %s\n"),g10_errstr(rc));
|
|
|
|
}
|
1998-01-26 22:09:01 +00:00
|
|
|
free_strlist(sl);
|
|
|
|
break;
|
|
|
|
|
2002-06-29 13:46:34 +00:00
|
|
|
case aSearchKeys:
|
|
|
|
sl = NULL;
|
|
|
|
for( ; argc; argc--, argv++ )
|
|
|
|
append_to_strlist2( &sl, *argv, utf8_strings );
|
* packet.h, build-packet.c (build_sig_subpkt), export.c
(do_export_stream), import.c (remove_bad_stuff, import), parse-packet.c
(dump_sig_subpkt, parse_one_sig_subpkt): Remove vestigal code for the old
sig cache subpacket. This wasn't completely harmless as it caused
subpacket 101 to disappear on import and export.
* options.h, armor.c, cipher.c, g10.c, keyedit.c, pkclist.c, sign.c,
encode.c, getkey.c, revoke.c: The current flags for different levels of
PGP-ness are massively complex. This is step one in simplifying them. No
functional change yet, just use a macro to check for compliance level.
* sign.c (sign_file): Fix bug that causes spurious compression preference
warning.
* sign.c (clearsign_file): Fix bug that prevents proper warning message
from appearing when clearsigning in --pgp2 mode with a non-v3 RSA key.
* main.h, misc.c (compliance_option_string, compliance_string,
compliance_failure), pkclist.c (build_pk_list), sign.c (sign_file,
clearsign_file), encode.c (encode_crypt, write_pubkey_enc_from_list): New
functions to put the "this message may not be usable...." warning in one
place.
* options.h, g10.c (main): Part two of the simplification. Use a single
enum to indicate what we are compliant to (1991, 2440, PGPx, etc.)
* g10.c (main): Show errors for failure in export, send-keys, recv-keys,
and refresh-keys.
* options.h, g10.c (main): Give algorithm warnings for algorithms chosen
against the --pgpX and --openpgp rules.
* keydb.h, pkclist.c (algo_available): Make TIGER192 invalid in --openpgp
mode.
* sign.c (sign_file), pkclist.c (algo_available): Allow passing a hint of
0.
2003-05-03 04:07:45 +00:00
|
|
|
rc=keyserver_search( sl );
|
|
|
|
if(rc)
|
|
|
|
log_error(_("keyserver search failed: %s\n"),g10_errstr(rc));
|
2002-06-29 13:46:34 +00:00
|
|
|
free_strlist(sl);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case aRefreshKeys:
|
|
|
|
sl = NULL;
|
|
|
|
for( ; argc; argc--, argv++ )
|
|
|
|
add_to_strlist2( &sl, *argv, utf8_strings );
|
* packet.h, build-packet.c (build_sig_subpkt), export.c
(do_export_stream), import.c (remove_bad_stuff, import), parse-packet.c
(dump_sig_subpkt, parse_one_sig_subpkt): Remove vestigal code for the old
sig cache subpacket. This wasn't completely harmless as it caused
subpacket 101 to disappear on import and export.
* options.h, armor.c, cipher.c, g10.c, keyedit.c, pkclist.c, sign.c,
encode.c, getkey.c, revoke.c: The current flags for different levels of
PGP-ness are massively complex. This is step one in simplifying them. No
functional change yet, just use a macro to check for compliance level.
* sign.c (sign_file): Fix bug that causes spurious compression preference
warning.
* sign.c (clearsign_file): Fix bug that prevents proper warning message
from appearing when clearsigning in --pgp2 mode with a non-v3 RSA key.
* main.h, misc.c (compliance_option_string, compliance_string,
compliance_failure), pkclist.c (build_pk_list), sign.c (sign_file,
clearsign_file), encode.c (encode_crypt, write_pubkey_enc_from_list): New
functions to put the "this message may not be usable...." warning in one
place.
* options.h, g10.c (main): Part two of the simplification. Use a single
enum to indicate what we are compliant to (1991, 2440, PGPx, etc.)
* g10.c (main): Show errors for failure in export, send-keys, recv-keys,
and refresh-keys.
* options.h, g10.c (main): Give algorithm warnings for algorithms chosen
against the --pgpX and --openpgp rules.
* keydb.h, pkclist.c (algo_available): Make TIGER192 invalid in --openpgp
mode.
* sign.c (sign_file), pkclist.c (algo_available): Allow passing a hint of
0.
2003-05-03 04:07:45 +00:00
|
|
|
rc=keyserver_refresh(sl);
|
|
|
|
if(rc)
|
|
|
|
log_error(_("keyserver refresh failed: %s\n"),g10_errstr(rc));
|
2002-06-29 13:46:34 +00:00
|
|
|
free_strlist(sl);
|
|
|
|
break;
|
|
|
|
|
1998-06-29 12:30:57 +00:00
|
|
|
case aExportSecret:
|
|
|
|
sl = NULL;
|
|
|
|
for( ; argc; argc--, argv++ )
|
1999-07-12 12:57:54 +00:00
|
|
|
add_to_strlist2( &sl, *argv, utf8_strings );
|
1998-06-29 12:30:57 +00:00
|
|
|
export_seckeys( sl );
|
|
|
|
free_strlist(sl);
|
|
|
|
break;
|
|
|
|
|
2000-07-14 17:34:53 +00:00
|
|
|
case aExportSecretSub:
|
|
|
|
sl = NULL;
|
|
|
|
for( ; argc; argc--, argv++ )
|
|
|
|
add_to_strlist2( &sl, *argv, utf8_strings );
|
|
|
|
export_secsubkeys( sl );
|
|
|
|
free_strlist(sl);
|
|
|
|
break;
|
|
|
|
|
1998-02-16 20:05:02 +00:00
|
|
|
case aGenRevoke:
|
|
|
|
if( argc != 1 )
|
|
|
|
wrong_args("--gen-revoke user-id");
|
1999-07-12 12:57:54 +00:00
|
|
|
username = make_username(*argv);
|
|
|
|
gen_revoke( username );
|
2002-06-29 13:46:34 +00:00
|
|
|
m_free( username );
|
|
|
|
break;
|
|
|
|
|
|
|
|
case aDesigRevoke:
|
|
|
|
if( argc != 1 )
|
|
|
|
wrong_args("--desig-revoke user-id");
|
|
|
|
username = make_username(*argv);
|
|
|
|
gen_desig_revoke( username );
|
|
|
|
m_free( username );
|
1998-02-16 20:05:02 +00:00
|
|
|
break;
|
1998-03-05 09:22:13 +00:00
|
|
|
|
|
|
|
case aDeArmor:
|
|
|
|
if( argc > 1 )
|
|
|
|
wrong_args("--dearmor [file]");
|
|
|
|
rc = dearmor_file( argc? *argv: NULL );
|
|
|
|
if( rc )
|
2002-06-29 13:46:34 +00:00
|
|
|
log_error(_("dearmoring failed: %s\n"), g10_errstr(rc));
|
1998-03-05 09:22:13 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case aEnArmor:
|
|
|
|
if( argc > 1 )
|
|
|
|
wrong_args("--enarmor [file]");
|
|
|
|
rc = enarmor_file( argc? *argv: NULL );
|
|
|
|
if( rc )
|
2002-06-29 13:46:34 +00:00
|
|
|
log_error(_("enarmoring failed: %s\n"), g10_errstr(rc));
|
1998-03-05 09:22:13 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case aPrimegen:
|
2002-06-29 13:46:34 +00:00
|
|
|
{ int mode = argc < 2 ? 0 : atoi(*argv);
|
1999-07-13 15:41:14 +00:00
|
|
|
|
|
|
|
if( mode == 1 && argc == 2 ) {
|
|
|
|
mpi_print( stdout, generate_public_prime( atoi(argv[1]) ), 1);
|
|
|
|
}
|
|
|
|
else if( mode == 2 && argc == 3 ) {
|
|
|
|
mpi_print( stdout, generate_elg_prime(
|
|
|
|
0, atoi(argv[1]),
|
|
|
|
atoi(argv[2]), NULL,NULL ), 1);
|
|
|
|
}
|
|
|
|
else if( mode == 3 && argc == 3 ) {
|
|
|
|
MPI *factors;
|
|
|
|
mpi_print( stdout, generate_elg_prime(
|
|
|
|
1, atoi(argv[1]),
|
|
|
|
atoi(argv[2]), NULL,&factors ), 1);
|
|
|
|
putchar('\n');
|
|
|
|
mpi_print( stdout, factors[0], 1 ); /* print q */
|
|
|
|
}
|
|
|
|
else if( mode == 4 && argc == 3 ) {
|
2000-07-14 17:34:53 +00:00
|
|
|
MPI g = mpi_alloc(1);
|
1999-07-13 15:41:14 +00:00
|
|
|
mpi_print( stdout, generate_elg_prime(
|
|
|
|
0, atoi(argv[1]),
|
|
|
|
atoi(argv[2]), g, NULL ), 1);
|
|
|
|
putchar('\n');
|
|
|
|
mpi_print( stdout, g, 1 );
|
2002-06-29 13:46:34 +00:00
|
|
|
mpi_free(g);
|
1999-07-13 15:41:14 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
wrong_args("--gen-prime mode bits [qbits] ");
|
1998-05-05 20:34:20 +00:00
|
|
|
putchar('\n');
|
|
|
|
}
|
1998-03-05 09:22:13 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case aGenRandom:
|
|
|
|
{
|
1999-07-13 15:41:14 +00:00
|
|
|
int level = argc ? atoi(*argv):0;
|
|
|
|
int count = argc > 1 ? atoi(argv[1]): 0;
|
|
|
|
int endless = !count;
|
|
|
|
|
|
|
|
if( argc < 1 || argc > 2 || level < 0 || level > 2 || count < 0 )
|
|
|
|
wrong_args("--gen-random 0|1|2 [count]");
|
|
|
|
|
|
|
|
while( endless || count ) {
|
1998-11-25 11:55:58 +00:00
|
|
|
byte *p;
|
2002-06-29 13:46:34 +00:00
|
|
|
/* Wee need a multiple of 3, so that in case of
|
|
|
|
armored output we get a correct string. No
|
|
|
|
linefolding is done, as it is best to levae this to
|
|
|
|
other tools */
|
|
|
|
size_t n = !endless && count < 99? count : 99;
|
1999-07-13 15:41:14 +00:00
|
|
|
|
2002-06-29 13:46:34 +00:00
|
|
|
p = get_random_bits( n*8, level, 0);
|
* armor.c, g10.c, kbnode.c, misc.c, pkclist.c, sign.c, build-packet.c,
getkey.c, keydb.c, openfile.c, plaintext.c, status.c, gpgv.c, keygen.c,
options.h, sig-check.c, tdbio.h, encode.c, mainproc.c, parse-packet.c,
signal.c, textfilter.c: Edit all preprocessor instructions to remove
whitespace before the '#'. This is not required by C89, but there are some
compilers out there that don't like it.
2003-05-24 21:50:33 +00:00
|
|
|
#ifdef HAVE_DOSISH_SYSTEM
|
2000-07-28 16:19:07 +00:00
|
|
|
setmode ( fileno(stdout), O_BINARY );
|
* armor.c, g10.c, kbnode.c, misc.c, pkclist.c, sign.c, build-packet.c,
getkey.c, keydb.c, openfile.c, plaintext.c, status.c, gpgv.c, keygen.c,
options.h, sig-check.c, tdbio.h, encode.c, mainproc.c, parse-packet.c,
signal.c, textfilter.c: Edit all preprocessor instructions to remove
whitespace before the '#'. This is not required by C89, but there are some
compilers out there that don't like it.
2003-05-24 21:50:33 +00:00
|
|
|
#endif
|
2002-06-29 13:46:34 +00:00
|
|
|
if (opt.armor) {
|
|
|
|
char *tmp = make_radix64_string (p, n);
|
|
|
|
fputs (tmp, stdout);
|
|
|
|
m_free (tmp);
|
|
|
|
if (n%3 == 1)
|
|
|
|
putchar ('=');
|
|
|
|
if (n%3)
|
|
|
|
putchar ('=');
|
|
|
|
} else {
|
|
|
|
fwrite( p, n, 1, stdout );
|
|
|
|
}
|
|
|
|
m_free(p);
|
1999-07-13 15:41:14 +00:00
|
|
|
if( !endless )
|
|
|
|
count -= n;
|
1998-03-05 09:22:13 +00:00
|
|
|
}
|
2002-06-29 13:46:34 +00:00
|
|
|
if (opt.armor)
|
|
|
|
putchar ('\n');
|
1998-03-05 09:22:13 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
1998-05-15 18:49:19 +00:00
|
|
|
case aPrintMD:
|
|
|
|
if( argc < 1)
|
1999-07-13 15:41:14 +00:00
|
|
|
wrong_args("--print-md algo [files]");
|
|
|
|
{
|
|
|
|
int all_algos = (**argv=='*' && !(*argv)[1]);
|
2002-06-29 13:46:34 +00:00
|
|
|
int algo = all_algos? 0 : string_to_digest_algo(*argv);
|
2000-03-24 10:19:50 +00:00
|
|
|
|
|
|
|
if( !algo && !all_algos )
|
|
|
|
log_error(_("invalid hash algorithm `%s'\n"), *argv );
|
|
|
|
else {
|
|
|
|
argc--; argv++;
|
|
|
|
if( !argc )
|
2002-06-29 13:46:34 +00:00
|
|
|
print_mds(NULL, algo);
|
2000-03-24 10:19:50 +00:00
|
|
|
else {
|
|
|
|
for(; argc; argc--, argv++ )
|
2002-06-29 13:46:34 +00:00
|
|
|
print_mds(*argv, algo);
|
1998-05-15 18:49:19 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
1999-07-13 15:41:14 +00:00
|
|
|
case aPrintMDs: /* old option */
|
1998-03-05 09:22:13 +00:00
|
|
|
if( !argc )
|
2002-06-29 13:46:34 +00:00
|
|
|
print_mds(NULL,0);
|
1998-03-05 09:22:13 +00:00
|
|
|
else {
|
|
|
|
for(; argc; argc--, argv++ )
|
2002-06-29 13:46:34 +00:00
|
|
|
print_mds(*argv,0);
|
1998-03-05 09:22:13 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case aListTrustDB:
|
|
|
|
if( !argc )
|
|
|
|
list_trustdb(NULL);
|
|
|
|
else {
|
|
|
|
for( ; argc; argc--, argv++ )
|
|
|
|
list_trustdb( *argv );
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
1998-10-16 16:00:17 +00:00
|
|
|
case aUpdateTrustDB:
|
|
|
|
if( argc )
|
|
|
|
wrong_args("--update-trustdb");
|
|
|
|
update_trustdb();
|
|
|
|
break;
|
|
|
|
|
1998-07-21 12:53:38 +00:00
|
|
|
case aCheckTrustDB:
|
2002-06-29 13:46:34 +00:00
|
|
|
/* Old versions allowed for arguments - ignore them */
|
|
|
|
check_trustdb();
|
1998-07-21 12:53:38 +00:00
|
|
|
break;
|
|
|
|
|
1998-10-07 13:30:43 +00:00
|
|
|
case aFixTrustDB:
|
2000-07-14 17:34:53 +00:00
|
|
|
log_error("this command is not yet implemented.\n");
|
1998-10-07 13:30:43 +00:00
|
|
|
log_error("A workaround is to use \"--export-ownertrust\", remove\n");
|
|
|
|
log_error("the trustdb file and do an \"--import-ownertrust\".\n" );
|
|
|
|
break;
|
|
|
|
|
1998-03-05 09:22:13 +00:00
|
|
|
case aListTrustPath:
|
1998-11-18 19:59:06 +00:00
|
|
|
if( !argc )
|
1999-07-12 16:49:22 +00:00
|
|
|
wrong_args("--list-trust-path <user-ids>");
|
1999-07-12 12:57:54 +00:00
|
|
|
for( ; argc; argc--, argv++ ) {
|
|
|
|
username = make_username( *argv );
|
|
|
|
list_trust_path( username );
|
2002-06-29 13:46:34 +00:00
|
|
|
m_free(username);
|
1999-07-12 12:57:54 +00:00
|
|
|
}
|
1998-03-05 09:22:13 +00:00
|
|
|
break;
|
|
|
|
|
1998-07-29 19:35:05 +00:00
|
|
|
case aExportOwnerTrust:
|
1998-07-06 10:23:57 +00:00
|
|
|
if( argc )
|
1998-07-29 19:35:05 +00:00
|
|
|
wrong_args("--export-ownertrust");
|
|
|
|
export_ownertrust();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case aImportOwnerTrust:
|
|
|
|
if( argc > 1 )
|
|
|
|
wrong_args("--import-ownertrust [file]");
|
|
|
|
import_ownertrust( argc? *argv:NULL );
|
1998-07-06 10:23:57 +00:00
|
|
|
break;
|
2002-06-29 13:46:34 +00:00
|
|
|
|
|
|
|
case aPipeMode:
|
|
|
|
if ( argc )
|
|
|
|
wrong_args ("--pipemode");
|
|
|
|
run_in_pipemode ();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case aRebuildKeydbCaches:
|
|
|
|
if (argc)
|
|
|
|
wrong_args ("--rebuild-keydb-caches");
|
2004-01-20 16:09:38 +00:00
|
|
|
keydb_rebuild_caches (1);
|
2002-06-29 13:46:34 +00:00
|
|
|
break;
|
1998-03-05 09:22:13 +00:00
|
|
|
|
2003-09-28 13:41:58 +00:00
|
|
|
#ifdef ENABLE_CARD_SUPPORT
|
|
|
|
case aCardStatus:
|
|
|
|
if (argc)
|
|
|
|
wrong_args ("--card-status");
|
2003-10-21 18:22:21 +00:00
|
|
|
card_status (stdout, NULL, 0);
|
2003-09-28 13:41:58 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case aCardEdit:
|
|
|
|
if (argc) {
|
|
|
|
sl = NULL;
|
|
|
|
for (argc--, argv++ ; argc; argc--, argv++)
|
|
|
|
append_to_strlist (&sl, *argv);
|
|
|
|
card_edit (sl);
|
|
|
|
free_strlist (sl);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
card_edit (NULL);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case aChangePIN:
|
|
|
|
if (!argc)
|
2004-09-25 13:04:55 +00:00
|
|
|
change_pin (0,1);
|
2003-09-28 13:41:58 +00:00
|
|
|
else if (argc == 1)
|
2004-09-25 13:04:55 +00:00
|
|
|
change_pin (atoi (*argv),1);
|
2003-09-28 13:41:58 +00:00
|
|
|
else
|
|
|
|
wrong_args ("--change-pin [no]");
|
|
|
|
break;
|
|
|
|
#endif /* ENABLE_CARD_SUPPORT*/
|
|
|
|
|
2004-01-22 03:47:05 +00:00
|
|
|
case aListConfig:
|
|
|
|
{
|
|
|
|
char *str=collapse_args(argc,argv);
|
|
|
|
list_config(str);
|
|
|
|
m_free(str);
|
|
|
|
}
|
|
|
|
break;
|
2003-09-28 13:41:58 +00:00
|
|
|
|
1998-01-02 20:40:10 +00:00
|
|
|
case aListPackets:
|
2002-06-29 13:46:34 +00:00
|
|
|
opt.list_packets=2;
|
1997-11-18 14:06:00 +00:00
|
|
|
default:
|
|
|
|
if( argc > 1 )
|
1998-02-04 18:54:31 +00:00
|
|
|
wrong_args(_("[filename]"));
|
1998-11-10 12:59:59 +00:00
|
|
|
/* Issue some output for the unix newbie */
|
|
|
|
if( !fname && !opt.outfile && isatty( fileno(stdin) )
|
|
|
|
&& isatty( fileno(stdout) ) && isatty( fileno(stderr) ) )
|
|
|
|
log_info(_("Go ahead and type your message ...\n"));
|
|
|
|
|
2004-10-13 18:10:06 +00:00
|
|
|
a = iobuf_open(fname);
|
|
|
|
if (a && is_secured_file (iobuf_get_fd (a)))
|
|
|
|
{
|
|
|
|
iobuf_close (a);
|
|
|
|
a = NULL;
|
|
|
|
errno = EPERM;
|
|
|
|
}
|
|
|
|
if( !a )
|
1998-12-29 13:47:31 +00:00
|
|
|
log_error(_("can't open `%s'\n"), print_fname_stdin(fname));
|
1998-02-13 20:58:50 +00:00
|
|
|
else {
|
1998-11-10 12:59:59 +00:00
|
|
|
|
1998-02-13 20:58:50 +00:00
|
|
|
if( !opt.no_armor ) {
|
1998-02-16 20:05:02 +00:00
|
|
|
if( use_armor_filter( a ) ) {
|
|
|
|
memset( &afx, 0, sizeof afx);
|
|
|
|
iobuf_push_filter( a, armor_filter, &afx );
|
|
|
|
}
|
1998-02-13 20:58:50 +00:00
|
|
|
}
|
|
|
|
if( cmd == aListPackets ) {
|
|
|
|
set_packet_list_mode(1);
|
|
|
|
opt.list_packets=1;
|
|
|
|
}
|
1999-05-06 12:26:10 +00:00
|
|
|
rc = proc_packets(NULL, a );
|
|
|
|
if( rc )
|
2002-06-29 13:46:34 +00:00
|
|
|
log_error("processing message failed: %s\n", g10_errstr(rc) );
|
1998-02-13 20:58:50 +00:00
|
|
|
iobuf_close(a);
|
1998-01-02 20:40:10 +00:00
|
|
|
}
|
1997-11-18 14:06:00 +00:00
|
|
|
break;
|
2004-01-22 03:47:05 +00:00
|
|
|
}
|
1997-11-18 14:06:00 +00:00
|
|
|
|
|
|
|
/* cleanup */
|
|
|
|
FREE_STRLIST(remusr);
|
1997-11-24 11:04:11 +00:00
|
|
|
FREE_STRLIST(locusr);
|
2002-06-29 13:46:34 +00:00
|
|
|
g10_exit(0);
|
1998-05-26 13:38:00 +00:00
|
|
|
return 8; /*NEVER REACHED*/
|
1998-01-28 16:09:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
2002-06-29 13:46:34 +00:00
|
|
|
g10_exit( int rc )
|
1998-01-28 16:09:43 +00:00
|
|
|
{
|
2003-10-10 15:12:02 +00:00
|
|
|
#ifdef ENABLE_CARD_SUPPORT
|
|
|
|
card_close ();
|
|
|
|
#endif
|
2000-07-14 17:34:53 +00:00
|
|
|
update_random_seed_file();
|
1999-07-02 09:50:57 +00:00
|
|
|
if( opt.debug & DBG_MEMSTAT_VALUE ) {
|
2002-06-29 13:46:34 +00:00
|
|
|
m_print_stats("on exit");
|
|
|
|
random_dump_stats();
|
1999-07-02 09:50:57 +00:00
|
|
|
}
|
1998-02-11 03:25:44 +00:00
|
|
|
if( opt.debug )
|
2002-06-29 13:46:34 +00:00
|
|
|
secmem_dump_stats();
|
|
|
|
secmem_term();
|
1998-11-10 12:59:59 +00:00
|
|
|
rc = rc? rc : log_get_errorcount(0)? 2 :
|
2002-06-29 13:46:34 +00:00
|
|
|
g10_errors_seen? 1 : 0;
|
1998-01-30 16:23:16 +00:00
|
|
|
exit(rc );
|
1997-11-18 14:06:00 +00:00
|
|
|
}
|
|
|
|
|
1998-07-06 10:23:57 +00:00
|
|
|
|
2003-02-12 05:18:26 +00:00
|
|
|
/* Pretty-print hex hashes. This assumes at least an 80-character
|
|
|
|
display, but there are a few other similar assumptions in the
|
|
|
|
display code. */
|
1998-03-05 09:22:13 +00:00
|
|
|
static void
|
2003-02-12 05:18:26 +00:00
|
|
|
print_hex( MD_HANDLE md, int algo, const char *fname )
|
1998-03-05 09:22:13 +00:00
|
|
|
{
|
2003-02-12 05:18:26 +00:00
|
|
|
int i,n,count,indent=0;
|
|
|
|
const byte *p;
|
1998-03-05 09:22:13 +00:00
|
|
|
|
2003-02-12 05:18:26 +00:00
|
|
|
if(fname)
|
|
|
|
indent=printf("%s: ",fname);
|
|
|
|
|
|
|
|
if(indent>40)
|
|
|
|
{
|
|
|
|
printf("\n");
|
|
|
|
indent=0;
|
1998-03-05 09:22:13 +00:00
|
|
|
}
|
2003-02-12 05:18:26 +00:00
|
|
|
|
|
|
|
if(algo==DIGEST_ALGO_RMD160)
|
|
|
|
indent+=printf("RMD160 = ");
|
|
|
|
else if(algo>0)
|
|
|
|
indent+=printf("%6s = ",digest_algo_to_string(algo));
|
|
|
|
else
|
|
|
|
algo=abs(algo);
|
|
|
|
|
|
|
|
count=indent;
|
|
|
|
|
|
|
|
p = md_read( md, algo );
|
|
|
|
n = md_digest_length(algo);
|
|
|
|
|
|
|
|
count+=printf("%02X",*p++);
|
|
|
|
|
|
|
|
for(i=1;i<n;i++,p++)
|
|
|
|
{
|
|
|
|
if(n==16)
|
|
|
|
{
|
|
|
|
if(count+2>79)
|
|
|
|
{
|
|
|
|
printf("\n%*s",indent," ");
|
|
|
|
count=indent;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
count+=printf(" ");
|
|
|
|
|
|
|
|
if(!(i%8))
|
|
|
|
count+=printf(" ");
|
1998-04-30 14:06:01 +00:00
|
|
|
}
|
2003-02-12 05:18:26 +00:00
|
|
|
else if (n==20)
|
|
|
|
{
|
|
|
|
if(!(i%2))
|
|
|
|
{
|
|
|
|
if(count+4>79)
|
|
|
|
{
|
|
|
|
printf("\n%*s",indent," ");
|
|
|
|
count=indent;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
count+=printf(" ");
|
|
|
|
}
|
|
|
|
|
|
|
|
if(!(i%10))
|
|
|
|
count+=printf(" ");
|
1998-03-05 09:22:13 +00:00
|
|
|
}
|
2003-02-12 05:18:26 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
if(!(i%4))
|
|
|
|
{
|
|
|
|
if(count+8>79)
|
|
|
|
{
|
|
|
|
printf("\n%*s",indent," ");
|
|
|
|
count=indent;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
count+=printf(" ");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
count+=printf("%02X",*p);
|
1998-03-05 09:22:13 +00:00
|
|
|
}
|
2003-02-12 05:18:26 +00:00
|
|
|
|
|
|
|
printf("\n");
|
1998-03-05 09:22:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2002-06-29 13:46:34 +00:00
|
|
|
print_hashline( MD_HANDLE md, int algo, const char *fname )
|
|
|
|
{
|
|
|
|
int i, n;
|
|
|
|
const byte *p;
|
|
|
|
|
|
|
|
if ( fname ) {
|
|
|
|
for (p = fname; *p; p++ ) {
|
|
|
|
if ( *p <= 32 || *p > 127 || *p == ':' || *p == '%' )
|
|
|
|
printf("%%%02X", *p );
|
|
|
|
else
|
|
|
|
putchar( *p );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
putchar(':');
|
|
|
|
printf("%d:", algo );
|
|
|
|
p = md_read( md, algo );
|
|
|
|
n = md_digest_length(algo);
|
|
|
|
for(i=0; i < n ; i++, p++ )
|
|
|
|
printf("%02X", *p );
|
|
|
|
putchar(':');
|
|
|
|
putchar('\n');
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
print_mds( const char *fname, int algo )
|
1998-03-05 09:22:13 +00:00
|
|
|
{
|
|
|
|
FILE *fp;
|
|
|
|
char buf[1024];
|
|
|
|
size_t n;
|
2002-06-29 13:46:34 +00:00
|
|
|
MD_HANDLE md;
|
1998-03-05 09:22:13 +00:00
|
|
|
|
|
|
|
if( !fname ) {
|
|
|
|
fp = stdin;
|
* armor.c, g10.c, kbnode.c, misc.c, pkclist.c, sign.c, build-packet.c,
getkey.c, keydb.c, openfile.c, plaintext.c, status.c, gpgv.c, keygen.c,
options.h, sig-check.c, tdbio.h, encode.c, mainproc.c, parse-packet.c,
signal.c, textfilter.c: Edit all preprocessor instructions to remove
whitespace before the '#'. This is not required by C89, but there are some
compilers out there that don't like it.
2003-05-24 21:50:33 +00:00
|
|
|
#ifdef HAVE_DOSISH_SYSTEM
|
2000-07-28 16:19:07 +00:00
|
|
|
setmode ( fileno(fp) , O_BINARY );
|
* armor.c, g10.c, kbnode.c, misc.c, pkclist.c, sign.c, build-packet.c,
getkey.c, keydb.c, openfile.c, plaintext.c, status.c, gpgv.c, keygen.c,
options.h, sig-check.c, tdbio.h, encode.c, mainproc.c, parse-packet.c,
signal.c, textfilter.c: Edit all preprocessor instructions to remove
whitespace before the '#'. This is not required by C89, but there are some
compilers out there that don't like it.
2003-05-24 21:50:33 +00:00
|
|
|
#endif
|
1998-03-05 09:22:13 +00:00
|
|
|
}
|
1998-05-15 18:49:19 +00:00
|
|
|
else {
|
1998-03-05 09:22:13 +00:00
|
|
|
fp = fopen( fname, "rb" );
|
2004-10-13 18:10:06 +00:00
|
|
|
if (fp && is_secured_file (fileno (fp)))
|
|
|
|
{
|
|
|
|
fclose (fp);
|
|
|
|
fp = NULL;
|
|
|
|
errno = EPERM;
|
|
|
|
}
|
1998-05-15 18:49:19 +00:00
|
|
|
}
|
1998-03-05 09:22:13 +00:00
|
|
|
if( !fp ) {
|
2003-02-12 05:18:26 +00:00
|
|
|
log_error("%s: %s\n", fname?fname:"[stdin]", strerror(errno) );
|
1998-03-05 09:22:13 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2002-06-29 13:46:34 +00:00
|
|
|
md = md_open( 0, 0 );
|
1998-05-15 18:49:19 +00:00
|
|
|
if( algo )
|
2002-06-29 13:46:34 +00:00
|
|
|
md_enable( md, algo );
|
1998-05-15 18:49:19 +00:00
|
|
|
else {
|
2002-06-29 13:46:34 +00:00
|
|
|
md_enable( md, DIGEST_ALGO_MD5 );
|
|
|
|
md_enable( md, DIGEST_ALGO_SHA1 );
|
|
|
|
md_enable( md, DIGEST_ALGO_RMD160 );
|
2003-02-21 20:43:17 +00:00
|
|
|
#ifdef USE_SHA256
|
2003-02-04 19:33:09 +00:00
|
|
|
md_enable( md, DIGEST_ALGO_SHA256 );
|
2003-02-21 20:43:17 +00:00
|
|
|
#endif
|
|
|
|
#ifdef USE_SHA512
|
|
|
|
md_enable( md, DIGEST_ALGO_SHA384 );
|
|
|
|
md_enable( md, DIGEST_ALGO_SHA512 );
|
|
|
|
#endif
|
1998-05-15 18:49:19 +00:00
|
|
|
}
|
1998-03-05 09:22:13 +00:00
|
|
|
|
|
|
|
while( (n=fread( buf, 1, DIM(buf), fp )) )
|
2002-06-29 13:46:34 +00:00
|
|
|
md_write( md, buf, n );
|
1998-03-05 09:22:13 +00:00
|
|
|
if( ferror(fp) )
|
2003-02-12 05:18:26 +00:00
|
|
|
log_error("%s: %s\n", fname?fname:"[stdin]", strerror(errno) );
|
1998-03-05 09:22:13 +00:00
|
|
|
else {
|
2002-06-29 13:46:34 +00:00
|
|
|
md_final(md);
|
|
|
|
if ( opt.with_colons ) {
|
|
|
|
if ( algo )
|
|
|
|
print_hashline( md, algo, fname );
|
|
|
|
else {
|
|
|
|
print_hashline( md, DIGEST_ALGO_MD5, fname );
|
|
|
|
print_hashline( md, DIGEST_ALGO_SHA1, fname );
|
|
|
|
print_hashline( md, DIGEST_ALGO_RMD160, fname );
|
2003-02-21 20:43:17 +00:00
|
|
|
#ifdef USE_SHA256
|
2003-02-04 19:33:09 +00:00
|
|
|
print_hashline( md, DIGEST_ALGO_SHA256, fname );
|
2003-02-21 20:43:17 +00:00
|
|
|
#endif
|
|
|
|
#ifdef USE_SHA512
|
|
|
|
print_hashline( md, DIGEST_ALGO_SHA384, fname );
|
|
|
|
print_hashline( md, DIGEST_ALGO_SHA512, fname );
|
|
|
|
#endif
|
2002-06-29 13:46:34 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
2003-02-12 05:18:26 +00:00
|
|
|
if( algo )
|
|
|
|
print_hex(md,-algo,fname);
|
2002-06-29 13:46:34 +00:00
|
|
|
else {
|
2003-02-12 05:18:26 +00:00
|
|
|
print_hex( md, DIGEST_ALGO_MD5, fname );
|
|
|
|
print_hex( md, DIGEST_ALGO_SHA1, fname );
|
|
|
|
print_hex( md, DIGEST_ALGO_RMD160, fname );
|
2003-02-21 20:43:17 +00:00
|
|
|
#ifdef USE_SHA256
|
2003-02-12 05:18:26 +00:00
|
|
|
print_hex( md, DIGEST_ALGO_SHA256, fname );
|
2003-02-21 20:43:17 +00:00
|
|
|
#endif
|
|
|
|
#ifdef USE_SHA512
|
|
|
|
print_hex( md, DIGEST_ALGO_SHA384, fname );
|
|
|
|
print_hex( md, DIGEST_ALGO_SHA512, fname );
|
|
|
|
#endif
|
2002-06-29 13:46:34 +00:00
|
|
|
}
|
|
|
|
}
|
1998-03-05 09:22:13 +00:00
|
|
|
}
|
2002-06-29 13:46:34 +00:00
|
|
|
md_close(md);
|
1998-03-05 09:22:13 +00:00
|
|
|
|
|
|
|
if( fp != stdin )
|
|
|
|
fclose(fp);
|
|
|
|
}
|
|
|
|
|
1999-05-25 17:56:15 +00:00
|
|
|
|
|
|
|
/****************
|
|
|
|
* Check the supplied name,value string and add it to the notation
|
2002-06-29 13:46:34 +00:00
|
|
|
* data to be used for signatures. which==0 for sig notations, and 1
|
|
|
|
* for cert notations.
|
|
|
|
*/
|
1999-05-25 17:56:15 +00:00
|
|
|
static void
|
2002-06-29 13:46:34 +00:00
|
|
|
add_notation_data( const char *string, int which )
|
1999-05-25 17:56:15 +00:00
|
|
|
{
|
1999-05-26 12:41:46 +00:00
|
|
|
const char *s;
|
2002-06-29 13:46:34 +00:00
|
|
|
STRLIST sl,*notation_data;
|
1999-05-26 12:41:46 +00:00
|
|
|
int critical=0;
|
1999-05-25 17:56:15 +00:00
|
|
|
int highbit=0;
|
2002-11-24 01:49:32 +00:00
|
|
|
int saw_at=0;
|
1999-05-25 17:56:15 +00:00
|
|
|
|
2002-06-29 13:46:34 +00:00
|
|
|
if(which)
|
|
|
|
notation_data=&opt.cert_notation_data;
|
|
|
|
else
|
|
|
|
notation_data=&opt.sig_notation_data;
|
|
|
|
|
1999-05-26 12:41:46 +00:00
|
|
|
if( *string == '!' ) {
|
|
|
|
critical = 1;
|
|
|
|
string++;
|
|
|
|
}
|
|
|
|
|
2002-11-24 01:49:32 +00:00
|
|
|
/* If and when the IETF assigns some official name tags, we'll
|
|
|
|
have to add them here. */
|
|
|
|
|
|
|
|
for( s=string ; *s != '='; s++ )
|
|
|
|
{
|
|
|
|
if( *s=='@')
|
2002-12-03 23:31:48 +00:00
|
|
|
saw_at=1;
|
2002-11-24 01:49:32 +00:00
|
|
|
|
|
|
|
if( !*s || (*s & 0x80) || (!isgraph(*s) && !isspace(*s)) )
|
|
|
|
{
|
2002-06-29 13:46:34 +00:00
|
|
|
log_error(_("a notation name must have only printable characters "
|
|
|
|
"or spaces, and end with an '='\n") );
|
1999-05-25 17:56:15 +00:00
|
|
|
return;
|
2002-11-24 01:49:32 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if(!saw_at && !opt.expert)
|
|
|
|
{
|
* main.h: Create S2K_DIGEST_ALGO macro so we do not need to always set
opt.s2k_digest_algo. This helps fix a problem with PGP 2.x encrypted
symmetric messages. Change all callers (encode.c, g10.c, keyedit.c,
keygen.c, passphrase.c, sign.c).
* armor.c, cardglue.c, getkey.c, import.c, keygen.c: Be consistent in some
more quoted strings. Always use 'user ID', not 'user id', "quotes" for
user IDs, etc.
2004-09-24 20:34:38 +00:00
|
|
|
log_error(_("a user notation name must contain the '@' character\n"));
|
2002-11-24 01:49:32 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2002-06-29 13:46:34 +00:00
|
|
|
/* we only support printable text - therefore we enforce the use
|
1999-05-25 17:56:15 +00:00
|
|
|
* of only printable characters (an empty value is valid) */
|
|
|
|
for( s++; *s ; s++ ) {
|
* parse-packet.c (parse_signature): No need to reserve 8 bytes for the
unhashed signature cache any longer.
* misc.c (pct_expando): Add two new expandos - signer's fingerprint (%g),
and signer's primary fingerprint (%p).
* Makefile.am: Include W32LIBS where appropriate.
* g10.c (main): Add --rfc2440 alias for --openpgp since in a few months,
they won't be the same thing.
* keyserver.c (parse_keyserver_uri): Accept "http" as an alias for "hkp",
since it is occasionally written that way. (keyserver_spawn): Use
ascii_isspace to avoid locale issues.
* keygen.c (ask_user_id): Make --allow-freeform-uid apply to the email
field as well as the name field, and allow mixing fields when it is set.
* options.skel: Use subkeys.pgp.net as the default keyserver.
* trustdb.c (validate_one_keyblock): Certifications on revoked or expired
uids do not count in the web of trust.
* signal.c (init_one_signal, pause_on_sigusr, do_block): Only use
sigprocmask() if we have sigset_t, and only use sigaction() if we have
struct sigaction. This is for Forte c89 on Solaris which seems to define
only the function call half of the two pairs by default.
(pause_on_sigusr): Typo. (do_block): If we can't use sigprocmask() and
sigset_t, try to get the number of signals from NSIG as well as MAXSIG,
and if we can't, fail with an explanation.
* signal.c, tdbio.c: Comment out the transaction code. It was not used in
this version, and was causing some build problems on quasi-posix platforms
(Solaris and Forte c89).
* keylist.c (list_keyblock_colon): Don't include validity values when
listing secret keys since they can be incorrect and/or misleading. This
is a temporary kludge, and will be handled properly in 1.9/2.0.
* mainproc.c (check_sig_and_print): Only show the "key available from"
preferred keyserver line if the key is not currently present.
* keyedit.c (sign_uids): Do not sign expired uids without --expert (same
behavior as revoked uids). Do not allow signing a user ID without a
self-signature. --expert overrides. Add additional prompt to the
signature level question. (menu_expire): When changing expiration dates,
don't replace selfsigs on revoked uids since this would effectively
unrevoke them. There is also no point in replacing expired selfsigs.
This is bug #181
* g10.c (add_notation_data): Make sure that only ascii is passed to
iscntrl. Noted by Christian Biere.
* getkey.c (classify_user_id2): Replaced isspace by spacep
* keygen.c (ask_user_id): Ditto. (get_parameter_algo): Ditto.
* keyedit.c (keyedit_menu): Ditto.
* tdbdump.c (import_ownertrust): Ditto. s/isxdigit/hexdigitp/.
* revoke.c (ask_revocation_reason):
* keyserver.c (keyserver_spawn): Dito.
2003-07-10 14:30:07 +00:00
|
|
|
if ((*s & 0x80))
|
|
|
|
highbit = 1;
|
|
|
|
else if (iscntrl(*s)) {
|
2004-08-27 17:32:31 +00:00
|
|
|
log_error(_("a notation value must not use"
|
|
|
|
" any control characters\n") );
|
1999-05-25 17:56:15 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1999-07-01 10:53:35 +00:00
|
|
|
if( highbit ) /* must use UTF8 encoding */
|
2002-06-29 13:46:34 +00:00
|
|
|
sl = add_to_strlist2( notation_data, string, utf8_strings );
|
1999-05-25 17:56:15 +00:00
|
|
|
else
|
2002-06-29 13:46:34 +00:00
|
|
|
sl = add_to_strlist( notation_data, string );
|
1999-05-26 12:41:46 +00:00
|
|
|
|
|
|
|
if( critical )
|
|
|
|
sl->flags |= 1;
|
|
|
|
}
|
|
|
|
|
2002-06-29 13:46:34 +00:00
|
|
|
static void
|
|
|
|
add_policy_url( const char *string, int which )
|
1999-05-26 12:41:46 +00:00
|
|
|
{
|
2004-05-10 21:46:00 +00:00
|
|
|
unsigned int i,critical=0;
|
2002-06-29 13:46:34 +00:00
|
|
|
STRLIST sl;
|
|
|
|
|
|
|
|
if(*string=='!')
|
|
|
|
{
|
|
|
|
string++;
|
|
|
|
critical=1;
|
1999-05-26 12:41:46 +00:00
|
|
|
}
|
1999-05-25 17:56:15 +00:00
|
|
|
|
2002-06-29 13:46:34 +00:00
|
|
|
for(i=0;i<strlen(string);i++)
|
|
|
|
if(string[i]&0x80 || iscntrl(string[i]))
|
|
|
|
break;
|
|
|
|
|
|
|
|
if(i==0 || i<strlen(string))
|
|
|
|
{
|
|
|
|
if(which)
|
|
|
|
log_error(_("the given certification policy URL is invalid\n"));
|
|
|
|
else
|
|
|
|
log_error(_("the given signature policy URL is invalid\n"));
|
|
|
|
}
|
|
|
|
|
|
|
|
if(which)
|
|
|
|
sl=add_to_strlist( &opt.cert_policy_url, string );
|
|
|
|
else
|
|
|
|
sl=add_to_strlist( &opt.sig_policy_url, string );
|
|
|
|
|
|
|
|
if(critical)
|
|
|
|
sl->flags |= 1;
|
|
|
|
}
|
2003-07-24 19:28:12 +00:00
|
|
|
|
|
|
|
static void
|
|
|
|
add_keyserver_url( const char *string, int which )
|
|
|
|
{
|
2004-05-10 21:46:00 +00:00
|
|
|
unsigned int i,critical=0;
|
2003-07-24 19:28:12 +00:00
|
|
|
STRLIST sl;
|
|
|
|
|
|
|
|
if(*string=='!')
|
|
|
|
{
|
|
|
|
string++;
|
|
|
|
critical=1;
|
|
|
|
}
|
|
|
|
|
|
|
|
for(i=0;i<strlen(string);i++)
|
|
|
|
if(string[i]&0x80 || iscntrl(string[i]))
|
|
|
|
break;
|
|
|
|
|
|
|
|
if(i==0 || i<strlen(string))
|
|
|
|
{
|
|
|
|
if(which)
|
|
|
|
BUG();
|
|
|
|
else
|
2004-08-27 17:32:31 +00:00
|
|
|
log_error(_("the given preferred keyserver URL is invalid\n"));
|
2003-07-24 19:28:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if(which)
|
|
|
|
BUG();
|
|
|
|
else
|
|
|
|
sl=add_to_strlist( &opt.sig_keyserver_url, string );
|
|
|
|
|
|
|
|
if(critical)
|
|
|
|
sl->flags |= 1;
|
|
|
|
}
|