some bug fixes
[gnupg.git] / g10 / pkclist.c
index 4f52eeb..d2b4eb2 100644 (file)
 #define CONTROL_D ('D' - 'A' + 1)
 
 
+static void
+show_paths( ulong lid, int only_first )
+{
+    void *context = NULL;
+    unsigned otrust, validity;
+    int last_level, level;
+
+    last_level = 0;
+    while( (level=enum_cert_paths( &context, &lid, &otrust, &validity)) != -1){
+       char *p;
+       int rc;
+       size_t n;
+       u32 keyid[2];
+       PKT_public_key *pk ;
+
+       if( level < last_level && only_first )
+           break;
+       last_level = level;
+
+       rc = keyid_from_lid( lid, keyid );
+       if( rc ) {
+           log_error("ooops: can't get keyid for lid %lu\n", lid);
+           return;
+       }
+
+       pk = m_alloc_clear( sizeof *pk );
+       rc = get_pubkey( pk, keyid );
+       if( rc ) {
+           log_error("key %08lX: public key not found: %s\n",
+                                   (ulong)keyid[1], g10_errstr(rc) );
+           return;
+       }
+
+       tty_printf("%*s%4u%c/%08lX.%lu %s \"",
+                 level*2, "",
+                 nbits_from_pk( pk ), pubkey_letter( pk->pubkey_algo ),
+                 (ulong)keyid[1], lid, datestr_from_pk( pk ) );
+       p = get_user_id( keyid, &n );
+       tty_print_string( p, n ),
+       m_free(p);
+       tty_printf("\"\n");
+       free_public_key( pk );
+    }
+    enum_cert_paths( &context, NULL, NULL, NULL ); /* release context */
+    tty_printf("\n");
+}
+
+
+
+
 /****************
  * Returns true if an ownertrust has changed.
  */
@@ -68,7 +118,7 @@ edit_ownertrust( ulong lid, int mode )
     }
 
     if( !mode ) {
-       tty_printf(_("No owner trust defined for %lu:\n"
+       tty_printf(_("No trust value assigned to %lu:\n"
                   "%4u%c/%08lX %s \""), lid,
                  nbits_from_pk( pk ), pubkey_letter( pk->pubkey_algo ),
                  (ulong)keyid[1], datestr_from_pk( pk ) );
@@ -115,7 +165,9 @@ edit_ownertrust( ulong lid, int mode )
            break;
        }
        else if( *p == ans[0] || *p == ans[1] ) {
-           tty_printf(_("You will see a list of signators etc. here\n"));
+           tty_printf(_(
+               "Certificates leading to an ultimately trusted key:\n"));
+           show_paths( lid, 1  );
        }
        else if( mode && (*p == ans[2] || *p == ans[3] || *p == CONTROL_D ) ) {
            break ; /* back to the menu */
@@ -138,8 +190,8 @@ add_ownertrust( PKT_public_key *pk )
     int rc;
     void *context = NULL;
     ulong lid;
-    unsigned trust;
-    int any=0;
+    unsigned otrust, validity;
+    int any=0, changed=0, any_undefined=0;
 
     tty_printf(
 _("Could not find a valid trust path to the key.  Let's see whether we\n"
@@ -152,24 +204,25 @@ _("Could not find a valid trust path to the key.  Let's see whether we\n"
     }
 
     lid = pk->local_id;
-    while( !(rc=enum_trust_web( &context, &lid )) ) {
-       rc = get_ownertrust( lid, &trust );
-       if( rc )
-           log_fatal("Ooops: couldn't get owner trust for %lu\n", lid);
-       if( trust == TRUST_UNDEFINED || trust == TRUST_EXPIRED ||
-           trust == TRUST_UNKNOWN ) {
+    while( enum_cert_paths( &context, &lid, &otrust, &validity ) != -1 ) {
+       any=1;
+       if( otrust == TRUST_UNDEFINED || otrust == TRUST_EXPIRED ||
+           otrust == TRUST_UNKNOWN ) {
+           any_undefined=1;
            if( edit_ownertrust( lid, 0 ) )
-               any=1;
+               changed=1;
        }
     }
-    if( rc == -1 )
-       rc = 0;
-    enum_trust_web( &context, NULL ); /* close */
+    enum_cert_paths( &context, NULL, NULL, NULL ); /* release context */
 
     if( !any )
-       tty_printf(_("No owner trust values changed.\n\n") );
+       tty_printf(_("No path leading to one of our keys found.\n\n") );
+    else if( !any_undefined )
+       tty_printf(_("No certificates with undefined trust found.\n\n") );
+    else if( !changed )
+       tty_printf(_("No trust values changed.\n\n") );
 
-    return rc? rc : any? 0:-1;
+    return any? 0:-1;
 }
 
 /****************
@@ -182,7 +235,8 @@ do_we_trust( PKT_public_key *pk, int trustlevel )
     int rc;
 
     if( (trustlevel & TRUST_FLAG_REVOKED) ) {
-       log_info("key has been revoked!\n");
+       log_info(_("key %08lX: key has been revoked!\n"),
+                                       (ulong)keyid_from_pk( pk, NULL) );
        if( opt.batch )
            return 0;
 
@@ -209,12 +263,14 @@ do_we_trust( PKT_public_key *pk, int trustlevel )
        return do_we_trust( pk, trustlevel );
 
       case TRUST_EXPIRED:
-       log_info("key has expired\n");
+       log_info(_("%08lX: key has expired\n"),
+                                   (ulong)keyid_from_pk( pk, NULL) );
        return 0; /* no */
 
       case TRUST_UNDEFINED:
        if( opt.batch || opt.answer_no )
-           log_info("no info to calculate a trust probability\n");
+           log_info(_("%08lX: no info to calculate a trust probability\n"),
+                                       (ulong)keyid_from_pk( pk, NULL) );
        else {
            rc = add_ownertrust( pk );
            if( !rc ) {
@@ -229,22 +285,24 @@ do_we_trust( PKT_public_key *pk, int trustlevel )
        return 0;
 
       case TRUST_NEVER:
-       log_info("We do NOT trust this key\n");
+       log_info(_("%08lX: We do NOT trust this key\n"),
+                                       (ulong)keyid_from_pk( pk, NULL) );
        return 0; /* no */
 
       case TRUST_MARGINAL:
-       log_info("I'm not sure whether this key really belongs to the owner\n"
-                "but I proceed anyway\n");
+       log_info(
+       _("%08lX: It is not sure taht this key really belongs to the owner\n"
+        "but it is accepted anyway\n"), (ulong)keyid_from_pk( pk, NULL) );
        return 1; /* yes */
 
       case TRUST_FULLY:
        if( opt.verbose )
-           log_info("This key probably belongs to the owner\n");
+           log_info(_("This key probably belongs to the owner\n"));
        return 1; /* yes */
 
       case TRUST_ULTIMATE:
        if( opt.verbose )
-           log_info("This key belongs to us (we have the secret key)\n");
+           log_info(_("This key belongs to us (we have the secret key)\n"));
        return 1; /* yes */
 
       default: BUG();
@@ -420,8 +478,8 @@ build_pk_list( STRLIST remusr, PK_LIST *ret_pk_list, unsigned usage )
        for(;;) {
            rc = 0;
            m_free(answer);
-           answer = cpr_get(N_("pklist.user_id.enter"),
-                             _("Enter the user ID: "));
+           answer = cpr_get_utf8(N_("pklist.user_id.enter"),
+                                  _("Enter the user ID: "));
            trim_spaces(answer);
            cpr_kill_prompt();
            if( !*answer )
@@ -430,7 +488,7 @@ build_pk_list( STRLIST remusr, PK_LIST *ret_pk_list, unsigned usage )
                free_public_key( pk );
            pk = m_alloc_clear( sizeof *pk );
            pk->pubkey_usage = usage;
-           rc = get_pubkey_byname( pk, answer );
+           rc = get_pubkey_byname( NULL, pk, answer, NULL );
            if( rc )
                tty_printf(_("No such user ID.\n"));
            else if( !(rc=check_pubkey_algo2(pk->pubkey_algo, usage)) ) {
@@ -464,7 +522,7 @@ build_pk_list( STRLIST remusr, PK_LIST *ret_pk_list, unsigned usage )
 
            pk = m_alloc_clear( sizeof *pk );
            pk->pubkey_usage = usage;
-           if( (rc = get_pubkey_byname( pk, remusr->d )) ) {
+           if( (rc = get_pubkey_byname( NULL, pk, remusr->d, NULL )) ) {
                free_public_key( pk ); pk = NULL;
                log_error(_("%s: skipped: %s\n"), remusr->d, g10_errstr(rc) );
            }