added some trust model stuff
[gnupg.git] / g10 / import.c
1 /* import.c
2  *      Copyright (c) 1998 by Werner Koch (dd9jn)
3  *
4  * This file is part of G10.
5  *
6  * G10 is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * G10 is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19  */
20
21 #include <config.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <errno.h>
26 #include <assert.h>
27
28 #include "options.h"
29 #include "packet.h"
30 #include "errors.h"
31 #include "keydb.h"
32 #include "memory.h"
33 #include "util.h"
34 #include "trustdb.h"
35
36
37 /****************
38  * Import the public keys from the given filename.
39  * Import is a somewhat misleading name, as we (only) add informations
40  * about the public keys into aout trustdb.
41  *
42  * NOTE: this function is not really needed and will be changed to
43  *      a function which reads a plain textfile, describing a public
44  *      key and its associated ownertrust.  This can be used (together
45  *      with the export function) to make a backup of the assigned
46  *      ownertrusts.
47  */
48 int
49 import_pubkeys( const char *filename )
50 {
51     int rc;
52     PACKET pkt;
53     int save_mode;
54     ulong offset;
55     IOBUF iobuf = NULL;
56
57     init_packet(&pkt);
58     save_mode = set_packet_list_mode(0);
59
60     if( !(iobuf = iobuf_open( filename )) ) {
61         rc = G10ERR_KEYRING_OPEN;
62         goto leave;
63     }
64
65     while( !(rc=search_packet(iobuf, &pkt, PKT_PUBLIC_CERT, &offset)) ) {
66         PKT_public_cert *pkc = pkt.pkt.public_cert;
67         u32 keyid[2];
68         int otrust;
69
70         assert( pkt.pkttype == PKT_PUBLIC_CERT );
71
72         keyid_from_pkc( pkc, keyid );
73         rc = get_ownertrust( pkc, &otrust );
74         if( rc && rc != -1  ) {
75             log_error("error getting otrust of %08lX: %s\n",
76                                               keyid[1], g10_errstr(rc) );
77         }
78         else if( rc == -1 ) { /* No pubkey in trustDB: Insert */
79             rc = insert_trust_record( pkc );
80             if( rc ) {
81                 log_error("failed to insert it into the trustdb: %s\n",
82                                                           g10_errstr(rc) );
83             }
84             else {
85                 rc = get_ownertrust( pkc, &otrust );
86                 if( rc )
87                     log_fatal("failed to reread the pubkey record: %s\n",
88                                                               g10_errstr(rc) );
89                 log_info("key %08lX inserted in trustdb (localid=%lu)\n",
90                                                  keyid[1], pkc->local_id );
91             }
92         }
93         else
94             log_info("key %08lX  already in trustdb (localid=%lu)\n",
95                                              keyid[1], pkc->local_id );
96
97         free_packet(&pkt);
98     }
99
100     iobuf_close(iobuf);
101     if( !(iobuf = iobuf_open( filename )) ) {
102         rc = G10ERR_KEYRING_OPEN;
103         goto leave;
104     }
105
106     while( !(rc=search_packet(iobuf, &pkt, PKT_PUBLIC_CERT, &offset)) ) {
107         PKT_public_cert *pkc = pkt.pkt.public_cert;
108         u32 keyid[2];
109         int trustlevel;
110
111         assert( pkt.pkttype == PKT_PUBLIC_CERT );
112
113         keyid_from_pkc( pkc, keyid );
114         rc = check_pkc_trust( pkc, &trustlevel );
115         if( rc ) {
116             log_error("error checking trust of %08lX: %s\n",
117                                               keyid[1], g10_errstr(rc) );
118         }
119         else if( trustlevel & TRUST_NO_PUBKEY ) {
120             /* No pubkey in trustDB: Insert and check again */
121             rc = insert_trust_record( pkc );
122             if( rc ) {
123                 log_error("failed to insert it into the trustdb: %s\n",
124                                                           g10_errstr(rc) );
125             }
126             else {
127                 rc = check_pkc_trust( pkc, &trustlevel );
128                 if( rc )
129                     log_fatal("trust check after insert failed: %s\n",
130                                                               g10_errstr(rc) );
131                 if( trustlevel & TRUST_NO_PUBKEY )
132                     BUG();
133             }
134         }
135
136         free_packet(&pkt);
137     }
138
139   leave:
140     iobuf_close(iobuf);
141     free_packet(&pkt);
142     set_packet_list_mode(save_mode);
143     return rc;
144 }
145
146