added option export
[gnupg.git] / g10 / import.c
index 91140d4..0474152 100644 (file)
 
 
 /****************
- * Import the public keys from the given filename.
- * Import is a somewhat misleading name, as we (only) add informations
- * about the public keys into aout trustdb.
+ * Import the public keys from the given filename. Input may be armored.
+ * This function rejects alls keys which are not valid self signed on at
+ * least one userid. Only user ids which are self signed will be imported.
+ * Other signatures are not not checked.
+ *
+ * Actually this functtion does a merge, it works like this:
+ *   FIXME: add handling for revocation certs
+ *
+ *  - get the keyblock
+ *  - check self-signatures and remove all userids and their isgnatures
+ *    without/invalid self-signatures.
+ *  - reject the keyblock, if we have no valid userid.
+ *  - See wether we have this key already in one of our pubrings.
+ *    If not, simply add it to the default keyring.
+ *  - Compare the key and the self-signatures of the new and the one in
+ *    our keyring.  If they are differen something weird is going on;
+ *    ask what to do.
+ *  - See wether we have only non-self-signature on one user id; if not
+ *    ask the user what to do.
+ *  - compare the signatures: If we already have this signature, check
+ *    that they compare okay, if not issue a warning and ask the user.
+ *    (consider to look at the timestamp and use the newest?)
+ *  - Simply add the signature.  Can't verify here because we may not have
+ *    the signatures public key yet; verification is done when putting it
+ *    into the trustdb, which is done automagically as soon as this pubkey
+ *    is used.
+ *  - Proceed with next signature.
  *
- * NOTE: this function is not really needed and will be changed to
- *     a function which reads a plain textfile, describing a public
- *     key and its associated ownertrust.  This can be used (together
- *     with the export function) to make a backup of the assigned
- *     ownertrusts.
  */
 int
 import_pubkeys( const char *filename )
 {
-    int rc;
-    PACKET pkt;
-    int save_mode;
-    ulong offset;
-    IOBUF iobuf = NULL;
-
-    init_packet(&pkt);
-    save_mode = set_packet_list_mode(0);
-
-    if( !(iobuf = iobuf_open( filename )) ) {
-       rc = G10ERR_KEYRING_OPEN;
-       goto leave;
-    }
-
-    while( !(rc=search_packet(iobuf, &pkt, PKT_PUBLIC_CERT, &offset)) ) {
-       PKT_public_cert *pkc = pkt.pkt.public_cert;
-       u32 keyid[2];
-       int otrust;
-
-       assert( pkt.pkttype == PKT_PUBLIC_CERT );
-
-       keyid_from_pkc( pkc, keyid );
-       rc = get_ownertrust( pkc, &otrust );
-       if( rc && rc != -1  ) {
-           log_error("error getting otrust of %08lX: %s\n",
-                                             keyid[1], g10_errstr(rc) );
-       }
-       else if( rc == -1 ) { /* No pubkey in trustDB: Insert */
-           rc = insert_trust_record( pkc );
-           if( rc ) {
-               log_error("failed to insert it into the trustdb: %s\n",
-                                                         g10_errstr(rc) );
-           }
-           else {
-               rc = get_ownertrust( pkc, &otrust );
-               if( rc )
-                   log_fatal("failed to reread the pubkey record: %s\n",
-                                                             g10_errstr(rc) );
-               log_info("key %08lX inserted in trustdb (localid=%lu)\n",
-                                                keyid[1], pkc->local_id );
-           }
-       }
-       else
-           log_info("key %08lX  already in trustdb (localid=%lu)\n",
-                                            keyid[1], pkc->local_id );
-
-       free_packet(&pkt);
-    }
-
-    iobuf_close(iobuf);
-    if( !(iobuf = iobuf_open( filename )) ) {
-       rc = G10ERR_KEYRING_OPEN;
-       goto leave;
-    }
-
-    while( !(rc=search_packet(iobuf, &pkt, PKT_PUBLIC_CERT, &offset)) ) {
-       PKT_public_cert *pkc = pkt.pkt.public_cert;
-       u32 keyid[2];
-       int trustlevel;
-
-       assert( pkt.pkttype == PKT_PUBLIC_CERT );
-
-       keyid_from_pkc( pkc, keyid );
-       rc = check_pkc_trust( pkc, &trustlevel );
-       if( rc ) {
-           log_error("error checking trust of %08lX: %s\n",
-                                             keyid[1], g10_errstr(rc) );
-       }
-       else if( trustlevel & TRUST_NO_PUBKEY ) {
-           /* No pubkey in trustDB: Insert and check again */
-           rc = insert_trust_record( pkc );
-           if( rc ) {
-               log_error("failed to insert it into the trustdb: %s\n",
-                                                         g10_errstr(rc) );
-           }
-           else {
-               rc = check_pkc_trust( pkc, &trustlevel );
-               if( rc )
-                   log_fatal("trust check after insert failed: %s\n",
-                                                             g10_errstr(rc) );
-               if( trustlevel & TRUST_NO_PUBKEY )
-                   BUG();
-           }
-       }
-
-       free_packet(&pkt);
-    }
-
-  leave:
-    iobuf_close(iobuf);
-    free_packet(&pkt);
-    set_packet_list_mode(save_mode);
-    return rc;
+    log_fatal("Not yet implemented");
+    return 0;
 }