aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--g10/ChangeLog16
-rw-r--r--g10/g10.c168
2 files changed, 169 insertions, 15 deletions
diff --git a/g10/ChangeLog b/g10/ChangeLog
index e9521dbde..8aebfadff 100644
--- a/g10/ChangeLog
+++ b/g10/ChangeLog
@@ -1,10 +1,22 @@
2004-01-21 David Shaw <[email protected]>
+ * g10.c (list_config): New function to dump config options to
+ stdout. Currently requires --with-colons.
+ (collapse_args): New function to turn argc/argv into a single
+ string.
+ (main): Use it here to pass list_config() more than one argument
+ as a single string.
+ (print_algo_numbers): Helper to print algorithm number for
+ --list-config "pubkey", "cipher", "hash"/"digest", and "compress"
+ config options.
+
* packet.h, getkey.c (merge_selfsigs, merge_selfsigs_main),
pkclist.c (check_signatures_trust): Indicate who has revoked a key
(the owner or a designated revoker). If a key was revoked by
- both, prefer the owner.
-
+ both, prefer the owner. If a subkey is already revoked by the
+ owner, don't allow a designated revokation of the whole key to
+ override this. We're still revoked either way, of course.
+
* keyedit.c (print_and_check_one_sig, keyedit_menu): Use the
COLUMNS environment variable (if any) to hint how wide the
terminal is. Disabled on _WIN32. Suggested by Janusz
diff --git a/g10/g10.c b/g10/g10.c
index d6d518b2d..f40b7923e 100644
--- a/g10/g10.c
+++ b/g10/g10.c
@@ -1,6 +1,6 @@
/* g10.c - The GnuPG utility (main for gpg)
- * Copyright (C) 1998, 1999, 2000, 2001, 2002,
- * 2003 Free Software Foundation, Inc.
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003
+ * 2004 Free Software Foundation, Inc.
*
* This file is part of GnuPG.
*
@@ -93,6 +93,7 @@ enum cmd_and_opt_values
aLSignKey,
aNRSignKey,
aNRLSignKey,
+ aListConfig,
aListPackets,
aEditKey,
aDeleteKeys,
@@ -388,6 +389,7 @@ static ARGPARSE_OPTS opts[] = {
{ aCardEdit, "card-edit", 256, N_("change data on a card")},
{ aChangePIN, "change-pin", 256, N_("change a card's PIN")},
#endif
+ { aListConfig, "list-config", 256, "@"},
{ aListPackets, "list-packets",256, "@"},
{ aExportOwnerTrust, "export-ownertrust", 256, "@"},
{ aImportOwnerTrust, "import-ownertrust", 256, "@"},
@@ -907,7 +909,8 @@ set_cmd( enum cmd_and_opt_values *ret_cmd, enum cmd_and_opt_values new_cmd )
}
-static void add_group(char *string)
+static void
+add_group(char *string)
{
char *name,*value;
struct groupitem *item;
@@ -943,11 +946,11 @@ static void add_group(char *string)
0) The homedir. It must be x00, a directory, and owned by the
user.
- 1) The options file. Okay unless it or its containing directory is
- group or other writable or not owned by us. disable exec in this
- case.
+ 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.
- 2) Extensions. Same as #2.
+ 2) Extensions. Same as #1.
Returns true if the item is unsafe. */
static int
@@ -1142,6 +1145,133 @@ check_permissions(const char *path,int item)
return 0;
}
+
+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," ")))
+ {
+ 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");
+ }
+ }
+
+ if(show_all || ascii_strcasecmp(name,"version")==0)
+ {
+ printf("cfg:version:");
+ print_string(stdout,VERSION,strlen(VERSION),':');
+ printf("\n");
+ }
+
+ if(show_all || ascii_strcasecmp(name,"pubkey")==0)
+ {
+ printf("cfg:pubkey:");
+ print_algo_numbers(check_pubkey_algo);
+ printf("\n");
+ }
+
+ if(show_all || ascii_strcasecmp(name,"cipher")==0)
+ {
+ printf("cfg:cipher:");
+ print_algo_numbers(check_cipher_algo);
+ printf("\n");
+ }
+
+ if(show_all
+ || ascii_strcasecmp(name,"digest")==0
+ || ascii_strcasecmp(name,"hash")==0)
+ {
+ printf("cfg:digest:");
+ print_algo_numbers(check_digest_algo);
+ printf("\n");
+ }
+
+ if(show_all || ascii_strcasecmp(name,"compress")==0)
+ {
+ printf("cfg:compress:");
+ print_algo_numbers(check_compress_algo);
+ printf("\n");
+ }
+
+ if(show_all)
+ break;
+ }
+}
+
+
+/* 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;
+}
+
+
int
main( int argc, char **argv )
{
@@ -1413,6 +1543,7 @@ main( int argc, char **argv )
switch( pargs.r_opt )
{
case aCheckKeys: set_cmd( &cmd, aCheckKeys); break;
+ case aListConfig: set_cmd( &cmd, aListConfig); break;
case aListPackets: set_cmd( &cmd, aListPackets); break;
case aImport: set_cmd( &cmd, aImport); break;
case aFastImport: set_cmd( &cmd, aFastImport); break;
@@ -1429,8 +1560,10 @@ main( int argc, char **argv )
case aListSigs: set_cmd( &cmd, aListSigs); break;
case aExportSecret: set_cmd( &cmd, aExportSecret); break;
case aExportSecretSub: set_cmd( &cmd, aExportSecretSub); break;
- case aDeleteSecretKeys: set_cmd( &cmd, aDeleteSecretKeys);
- greeting=1; break;
+ case aDeleteSecretKeys:
+ set_cmd( &cmd, aDeleteSecretKeys);
+ greeting=1;
+ break;
case aDeleteSecretAndPublicKeys:
set_cmd( &cmd, aDeleteSecretAndPublicKeys);
greeting=1;
@@ -2476,7 +2609,8 @@ main( int argc, char **argv )
log_error(_("failed to initialize the TrustDB: %s\n"), g10_errstr(rc));
- switch (cmd) {
+ switch (cmd)
+ {
case aStore:
case aSym:
case aSign:
@@ -2488,9 +2622,10 @@ main( int argc, char **argv )
break;
default:
break;
- }
+ }
- switch( cmd ) {
+ switch( cmd )
+ {
case aStore: /* only store the file */
if( argc > 1 )
wrong_args(_("--store [filename]"));
@@ -3055,6 +3190,13 @@ main( int argc, char **argv )
break;
#endif /* ENABLE_CARD_SUPPORT*/
+ case aListConfig:
+ {
+ char *str=collapse_args(argc,argv);
+ list_config(str);
+ m_free(str);
+ }
+ break;
case aListPackets:
opt.list_packets=2;
@@ -3086,7 +3228,7 @@ main( int argc, char **argv )
iobuf_close(a);
}
break;
- }
+ }
/* cleanup */
FREE_STRLIST(remusr);