cscvs to tla changeset 3
[onak.git] / keydb_file.c
1 /*
2  * keydb.c - Routines to store and fetch keys.
3  *
4  * Jonathan McDowell <noodles@earth.li>
5  *
6  * Copyright 2002 Project Purple
7  */
8
9 #include <sys/types.h>
10 #include <sys/uio.h>
11 #include <errno.h>
12 #include <fcntl.h>
13 #include <stdio.h>
14 #include <stdlib.h>
15 #include <string.h>
16 #include <unistd.h>
17
18 #include "keydb.h"
19 #include "keyid.h"
20 #include "keystructs.h"
21 #include "ll.h"
22 #include "mem.h"
23 #include "onak-conf.h"
24 #include "parsekey.h"
25
26 /**
27  *      keydb_fetchchar - Fetches a char from a file.
28  */
29 static int keydb_fetchchar(void *fd, size_t count, unsigned char *c)
30 {
31         return !(read( *(int *) fd, c, count));
32 }
33
34 /**
35  *      keydb_putchar - Puts a char to a file.
36  */
37 static int keydb_putchar(void *fd, size_t count, unsigned char *c)
38 {
39         return !(write( *(int *) fd, c, count));
40 }
41
42 /**
43  *      initdb - Initialize the key database.
44  *
45  *      This is just a no-op for flat file access.
46  */
47 void initdb(void)
48 {
49 }
50
51 /**
52  *      cleanupdb - De-initialize the key database.
53  *
54  *      This is just a no-op for flat file access.
55  */
56 void cleanupdb(void)
57 {
58 }
59
60 /**
61  *      fetch_key - Given a keyid fetch the key from storage.
62  *      @keyid: The keyid to fetch.
63  *      @publickey: A pointer to a structure to return the key in.
64  *
65  *      We use the hex representation of the keyid as the filename to fetch the
66  *      key from. The key is stored in the file as a binary OpenPGP stream of
67  *      packets, so we can just use read_openpgp_stream() to read the packets
68  *      in and then parse_keys() to parse the packets into a publickey
69  *      structure.
70  */
71 int fetch_key(uint64_t keyid, struct openpgp_publickey **publickey)
72 {
73         struct openpgp_packet_list *packets = NULL;
74         char keyfile[1024];
75         int fd = -1;
76
77         snprintf(keyfile, 1023, "%s/0x%llX", config.file_dbpath,
78                         keyid & 0xFFFFFFFF);
79         fd = open(keyfile, O_RDONLY); // | O_SHLOCK);
80
81         if (fd > -1) {
82                 read_openpgp_stream(keydb_fetchchar, &fd, &packets);
83                 parse_keys(packets, publickey);
84                 close(fd);
85         }
86
87         return (fd > -1);
88 }
89
90 /**
91  *      store_key - Takes a key and stores it.
92  *      @publickey: A pointer to the public key to store.
93  *
94  *      Again we just use the hex representation of the keyid as the filename
95  *      to store the key to. We flatten the public key to a list of OpenPGP
96  *      packets and then use write_openpgp_stream() to write the stream out to
97  *      the file.
98  */
99 int store_key(struct openpgp_publickey *publickey)
100 {
101         struct openpgp_packet_list *packets = NULL;
102         struct openpgp_packet_list *list_end = NULL;
103         struct openpgp_publickey *next = NULL;
104         char keyfile[1024];
105         int fd = -1;
106
107         snprintf(keyfile, 1023, "%s/0x%llX", config.file_dbpath,
108                         get_keyid(publickey) & 0xFFFFFFFF);
109         fd = open(keyfile, O_WRONLY | O_CREAT, 0664); // | O_EXLOCK);
110
111         if (fd > -1) {
112                 next = publickey -> next;
113                 publickey -> next = NULL;
114                 flatten_publickey(publickey, &packets, &list_end);
115                 publickey -> next = next;
116                 
117                 write_openpgp_stream(keydb_putchar, &fd, packets);
118                 close(fd);
119         }
120
121         return (fd > -1);
122 }
123
124 /**
125  *      delete_key - Given a keyid delete the key from storage.
126  *      @keyid: The keyid to delete.
127  *
128  *      This function deletes a public key from whatever storage mechanism we
129  *      are using. Returns 0 if the key existed.
130  */
131 int delete_key(uint64_t keyid)
132 {
133         char keyfile[1024];
134
135         snprintf(keyfile, 1023, "%s/0x%llX", config.file_dbpath,
136                         keyid & 0xFFFFFFFF);
137
138         return unlink(keyfile);
139 }
140
141 /*
142  * Include the basic keydb routines.
143  */
144 #define NEED_KEYID2UID 1
145 #define NEED_GETKEYSIGS 1
146 #define NEED_GETFULLKEYID 1
147 #include "keydb.c"