]> git.sommitrealweird.co.uk Git - onak.git/blobdiff - keydb_pg.c
cscvs to tla changeset 46
[onak.git] / keydb_pg.c
index b09c692408627dff5b23e42903322642fb598bb6..f1cd0092feb3669438a9b6726dedd2ac744ee2e2 100644 (file)
@@ -20,6 +20,7 @@
 #include <string.h>
 #include <unistd.h>
 
+#include "hash.h"
 #include "keydb.h"
 #include "keyid.h"
 #include "keyindex.h"
@@ -131,7 +132,8 @@ void endtrans(void)
  *     in and then parse_keys() to parse the packets into a publickey
  *     structure.
  */
-int fetch_key(uint64_t keyid, struct openpgp_publickey **publickey, bool intrans)
+int fetch_key(uint64_t keyid, struct openpgp_publickey **publickey,
+               bool intrans)
 {
        struct openpgp_packet_list *packets = NULL;
        PGresult *result = NULL;
@@ -173,6 +175,8 @@ int fetch_key(uint64_t keyid, struct openpgp_publickey **publickey, bool intrans
                                                &packets);
                                parse_keys(packets, publickey);
                                lo_close(dbconn, fd);
+                               free_packet_list(packets);
+                               packets = NULL;
                        }
                }
        } else if (PQresultStatus(result) != PGRES_TUPLES_OK) {
@@ -237,6 +241,8 @@ int fetch_key_text(const char *search, struct openpgp_publickey **publickey)
                                                &packets);
                                parse_keys(packets, publickey);
                                lo_close(dbconn, fd);
+                               free_packet_list(packets);
+                               packets = NULL;
                        }
                }
        } else if (PQresultStatus(result) != PGRES_TUPLES_OK) {
@@ -259,14 +265,15 @@ int fetch_key_text(const char *search, struct openpgp_publickey **publickey)
  *     Again we just use the hex representation of the keyid as the filename
  *     to store the key to. We flatten the public key to a list of OpenPGP
  *     packets and then use write_openpgp_stream() to write the stream out to
- *     the file. If update is true then we delete the old key first, otherwise we
- *     trust that it doesn't exist.
+ *     the file. If update is true then we delete the old key first, otherwise
+ *     we trust that it doesn't exist.
  */
 int store_key(struct openpgp_publickey *publickey, bool intrans, bool update)
 {
        struct openpgp_packet_list *packets = NULL;
        struct openpgp_packet_list *list_end = NULL;
        struct openpgp_publickey *next = NULL;
+       struct openpgp_signedpacket_list *curuid = NULL;
        PGresult *result = NULL;
        char statement[1024];
        Oid key_oid;
@@ -306,6 +313,8 @@ int store_key(struct openpgp_publickey *publickey, bool intrans, bool update)
                write_openpgp_stream(keydb_putchar, &fd, packets);
                lo_close(dbconn, fd);
        }
+       free_packet_list(packets);
+       packets = NULL;
 
        snprintf(statement, 1023, 
                        "INSERT INTO onak_keys (keyid, keydata) VALUES "
@@ -360,6 +369,19 @@ int store_key(struct openpgp_publickey *publickey, bool intrans, bool update)
                uids = NULL;
        }
 
+       for (curuid = publickey->uids; curuid != NULL; curuid = curuid->next) {
+               for (packets = curuid->sigs; packets != NULL; 
+                               packets = packets->next) {
+                       snprintf(statement, 1023,
+                               "INSERT INTO onak_sigs (signer, signee) "
+                               "VALUES ('%llX', '%llX')",
+                               sig_keyid(packets->packet),
+                               get_keyid(publickey));
+                       result = PQexec(dbconn, statement);
+                       PQclear(result);
+               }
+       }
+
        if (!intrans) {
                result = PQexec(dbconn, "COMMIT");
                PQclear(result);
@@ -412,6 +434,12 @@ int delete_key(uint64_t keyid, bool intrans)
                result = PQexec(dbconn, statement);
                PQclear(result);
 
+               snprintf(statement, 1023,
+                       "DELETE FROM onak_sigs WHERE signee = '%llX'",
+                       keyid);
+               result = PQexec(dbconn, statement);
+               PQclear(result);
+
                snprintf(statement, 1023,
                        "DELETE FROM onak_uids WHERE keyid = '%llX'",
                        keyid);
@@ -465,9 +493,66 @@ char *keyid2uid(uint64_t keyid)
        return uid;
 }
 
+/**
+ *     getkeysigs - Gets a linked list of the signatures on a key.
+ *     @keyid: The keyid to get the sigs for.
+ *
+ *     This function gets the list of signatures on a key. Used for key 
+ *     indexing and doing stats bits.
+ */
+struct ll *getkeysigs(uint64_t keyid)
+{
+       struct ll *sigs = NULL;
+       PGresult *result = NULL;
+       uint64_t signer;
+       char statement[1024];
+       int i, j;
+       int numsigs = 0;
+       bool intrans = false;
+       char *str;
+
+       if (!intrans) {
+               result = PQexec(dbconn, "BEGIN");
+               PQclear(result);
+       }
+
+       snprintf(statement, 1023,
+               "SELECT DISTINCT signer FROM onak_sigs WHERE signee = '%llX'",
+               keyid);
+       result = PQexec(dbconn, statement);
+
+       if (PQresultStatus(result) == PGRES_TUPLES_OK) {
+               numsigs = PQntuples(result);
+               for (i = 0; i < numsigs;  i++) {
+                       j = 0;
+                       signer = 0;
+                       str = PQgetvalue(result, i, 0);
+                       while (str[j] != 0) {
+                               signer <<= 4;
+                               if (str[j] >= '0' && str[j] <= '9') {
+                                       signer += str[j] - '0';
+                               } else {
+                                       signer += str[j] - 'A' + 10;
+                               }
+                               j++;
+                       }
+                       sigs = lladd(sigs, createandaddtohash(signer));
+               }
+       } else if (PQresultStatus(result) != PGRES_TUPLES_OK) {
+               fprintf(stderr, "Problem retrieving key from DB.\n");
+       }
+
+       PQclear(result);
+
+       if (!intrans) {
+               result = PQexec(dbconn, "COMMIT");
+               PQclear(result);
+       }
+       return sigs;
+}
+
 /*
  * Include the basic keydb routines.
  */
-#define NEED_GETKEYSIGS 1
 #define NEED_GETFULLKEYID 1
 #include "keydb.c"