* sign.c (update_keysig_packet): Policies and notations should be stripped
[gnupg.git] / g10 / tdbdump.c
1 /* tdbdump.c
2  * Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
3  *
4  * This file is part of GnuPG.
5  *
6  * GnuPG 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  * GnuPG 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 <ctype.h>
27 #include <assert.h>
28 #include <sys/types.h>
29 #include <sys/stat.h>
30 #include <fcntl.h>
31 #include <unistd.h>
32
33 #include "errors.h"
34 #include "iobuf.h"
35 #include "keydb.h"
36 #include "memory.h"
37 #include "util.h"
38 #include "trustdb.h"
39 #include "options.h"
40 #include "packet.h"
41 #include "main.h"
42 #include "i18n.h"
43 #include "tdbio.h"
44
45
46 #define HEXTOBIN(x) ( (x) >= '0' && (x) <= '9' ? ((x)-'0') : \
47                       (x) >= 'A' && (x) <= 'F' ? ((x)-'A'+10) : ((x)-'a'+10))
48
49
50 /****************
51  * Wirte a record but die on error
52  */
53 static void
54 write_record( TRUSTREC *rec )
55 {
56     int rc = tdbio_write_record( rec );
57     if( !rc )
58         return;
59     log_error(_("trust record %lu, type %d: write failed: %s\n"),
60                             rec->recnum, rec->rectype, g10_errstr(rc) );
61     tdbio_invalid();
62 }
63
64
65 /****************
66  * Dump the entire trustdb or only the entries of one key.
67  */
68 void
69 list_trustdb( const char *username )
70 {
71     TRUSTREC rec;
72
73     init_trustdb();
74     /* for now we ignore the user ID */
75     if (1) {
76         ulong recnum;
77         int i;
78
79         printf("TrustDB: %s\n", tdbio_get_dbname() );
80         for(i=9+strlen(tdbio_get_dbname()); i > 0; i-- )
81             putchar('-');
82         putchar('\n');
83         for(recnum=0; !tdbio_read_record( recnum, &rec, 0); recnum++ )
84             tdbio_dump_record( &rec, stdout );
85     }
86 }
87
88
89
90
91
92 /****************
93  * Print a list of all defined owner trust value.
94  */
95 void
96 export_ownertrust()
97 {
98     TRUSTREC rec;
99     ulong recnum;
100     int i;
101     byte *p;
102
103     init_trustdb();
104     printf(_("# List of assigned trustvalues, created %s\n"
105              "# (Use \"gpg --import-ownertrust\" to restore them)\n"),
106            asctimestamp( make_timestamp() ) );
107     for(recnum=0; !tdbio_read_record( recnum, &rec, 0); recnum++ ) {
108         if( rec.rectype == RECTYPE_TRUST ) {
109             if( !rec.r.trust.ownertrust )
110                 continue;
111             p = rec.r.trust.fingerprint;
112             for(i=0; i < 20; i++, p++ )
113                 printf("%02X", *p );
114             printf(":%u:\n", (unsigned int)rec.r.trust.ownertrust );
115         }
116     }
117 }
118
119
120 void
121 import_ownertrust( const char *fname )
122 {
123     FILE *fp;
124     int is_stdin=0;
125     char line[256];
126     char *p;
127     size_t n, fprlen;
128     unsigned int otrust;
129     byte fpr[20];
130     int any = 0;
131     int rc;
132
133     init_trustdb();
134     if( !fname || (*fname == '-' && !fname[1]) ) {
135         fp = stdin;
136         fname = "[stdin]";
137         is_stdin = 1;
138     }
139     else if( !(fp = fopen( fname, "r" )) ) {
140         log_error_f(fname, _("can't open file: %s\n"), strerror(errno) );
141         return;
142     }
143
144     while( fgets( line, DIM(line)-1, fp ) ) {
145         TRUSTREC rec;
146
147         if( !*line || *line == '#' )
148             continue;
149         n = strlen(line);
150         if( line[n-1] != '\n' ) {
151             log_error_f(fname, _("line too long\n") );
152             /* ... or last line does not have a LF */
153             break; /* can't continue */
154         }
155         for(p = line; *p && *p != ':' ; p++ )
156             if( !hexdigitp(p) )
157                 break;
158         if( *p != ':' ) {
159             log_error_f(fname, _("error: missing colon\n") );
160             continue;
161         }
162         fprlen = p - line;
163         if( fprlen != 32 && fprlen != 40 ) {
164             log_error_f(fname, _("error: invalid fingerprint\n") );
165             continue;
166         }
167         if( sscanf(p, ":%u:", &otrust ) != 1 ) {
168             log_error_f(fname, _("error: no ownertrust value\n") );
169             continue;
170         }
171         if( !otrust )
172             continue; /* no otrust defined - no need to update or insert */
173         /* convert the ascii fingerprint to binary */
174         for(p=line, fprlen=0; fprlen < 20 && *p != ':'; p += 2 )
175             fpr[fprlen++] = HEXTOBIN(p[0]) * 16 + HEXTOBIN(p[1]);
176         while (fprlen < 20)
177             fpr[fprlen++] = 0;
178         
179         rc = tdbio_search_trust_byfpr (fpr, &rec);
180         if( !rc ) { /* found: update */
181             if (rec.r.trust.ownertrust != otrust)
182               {
183                 if( rec.r.trust.ownertrust )
184                   log_info("changing ownertrust from %u to %u\n",
185                            rec.r.trust.ownertrust, otrust );
186                 else
187                   log_info("setting ownertrust to %u\n", otrust );
188                 rec.r.trust.ownertrust = otrust;
189                 write_record (&rec );
190                 any = 1;
191               }
192         }
193         else if( rc == -1 ) { /* not found: insert */
194             log_info("inserting ownertrust of %u\n", otrust );
195             memset (&rec, 0, sizeof rec);
196             rec.recnum = tdbio_new_recnum ();
197             rec.rectype = RECTYPE_TRUST;
198             memcpy (rec.r.trust.fingerprint, fpr, 20);
199             rec.r.trust.ownertrust = otrust;
200             write_record (&rec );
201             any = 1;
202         }
203         else /* error */
204             log_error_f(fname, _("error finding trust record: %s\n"),
205                                                     g10_errstr(rc));
206     }
207     if( ferror(fp) )
208         log_error_f(fname, _("read error: %s\n"), strerror(errno) );
209     if( !is_stdin )
210         fclose(fp);
211     
212     if (any)
213       {
214         revalidation_mark ();
215         rc = tdbio_sync ();
216         if (rc)
217           log_error (_("trustdb: sync failed: %s\n"), g10_errstr(rc) );
218       }
219     
220 }
221
222