Update Debian Vcs-* fields to point to git repository
[onak.git] / keydb_pg.c
index eee3bde34d7c7bbb3e3812f68cd66c63bb891c3d..1ec0a1a570e16fb0c71397a7055b2207dc213944 100644 (file)
@@ -1,9 +1,20 @@
 /*
  * keydb_pg.c - Routines to store and fetch keys in a PostGres database.
  *
- * Jonathan McDowell <noodles@earth.li>
+ * Copyright 2002-2004 Jonathan McDowell <noodles@earth.li>
  *
- * Copyright 2002-2004 Project Purple
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
 #include <postgresql/libpq-fe.h>
@@ -36,7 +47,7 @@ static PGconn *dbconn = NULL;
 /**
  *     keydb_fetchchar - Fetches a char from a file.
  */
-static int keydb_fetchchar(void *fd, size_t count, unsigned char *c)
+static int keydb_fetchchar(void *fd, size_t count, void *c)
 {
        return (!lo_read(dbconn, *(int *) fd, (char *) c, count));
 }
@@ -44,7 +55,7 @@ static int keydb_fetchchar(void *fd, size_t count, unsigned char *c)
 /**
  *     keydb_putchar - Puts a char to a file.
  */
-static int keydb_putchar(void *fd, size_t count, unsigned char *c)
+static int keydb_putchar(void *fd, size_t count, void *c)
 {
        return !(lo_write(dbconn, *(int *) fd, (char *) c, count));
 }
@@ -150,12 +161,13 @@ static int pg_fetch_key(uint64_t keyid, struct openpgp_publickey **publickey,
        
        if (keyid > 0xFFFFFFFF) {
                snprintf(statement, 1023,
-                       "SELECT keydata FROM onak_keys WHERE keyid = '%llX'",
+                       "SELECT keydata FROM onak_keys WHERE keyid = '%"
+                       PRIX64 "'",
                        keyid);
        } else {
                snprintf(statement, 1023,
                        "SELECT keydata FROM onak_keys WHERE keyid "
-                       "LIKE '%%%llX'",
+                       "LIKE '%%%" PRIX64 "'",
                        keyid);
        }
        result = PQexec(dbconn, statement);
@@ -218,7 +230,7 @@ static int pg_fetch_key_text(const char *search,
 
        newsearch = malloc(strlen(search) * 2 + 1);
        memset(newsearch, 0, strlen(search) * 2 + 1);
-       PQescapeString(newsearch, search, strlen(search));
+       PQescapeStringConn(dbconn, newsearch, search, strlen(search), NULL);
        snprintf(statement, 1023,
                        "SELECT DISTINCT onak_keys.keydata FROM onak_keys, "
                        "onak_uids WHERE onak_keys.keyid = onak_uids.keyid "
@@ -259,6 +271,77 @@ static int pg_fetch_key_text(const char *search,
        return (numkeys);
 }
 
+/**
+ *     delete_key - Given a keyid delete the key from storage.
+ *     @keyid: The keyid to delete.
+ *     @intrans: If we're already in a transaction.
+ *
+ *     This function deletes a public key from whatever storage mechanism we
+ *     are using. Returns 0 if the key existed.
+ */
+static int pg_delete_key(uint64_t keyid, bool intrans)
+{
+       PGresult *result = NULL;
+       char *oids = NULL;
+       char statement[1024];
+       int found = 1;
+       int i;
+       Oid key_oid;
+
+       if (!intrans) {
+               result = PQexec(dbconn, "BEGIN");
+               PQclear(result);
+       }
+       
+       snprintf(statement, 1023,
+                       "SELECT keydata FROM onak_keys WHERE keyid = '%"
+                       PRIX64 "'",
+                       keyid);
+       result = PQexec(dbconn, statement);
+
+       if (PQresultStatus(result) == PGRES_TUPLES_OK) {
+               found = 0;
+               i = PQntuples(result);
+               while (i > 0) {
+                       oids = PQgetvalue(result, i-1, 0);
+                       key_oid = (Oid) atoi(oids);
+                       lo_unlink(dbconn, key_oid);
+                       i--;
+               }
+               PQclear(result);
+
+               snprintf(statement, 1023,
+                       "DELETE FROM onak_keys WHERE keyid = '%" PRIX64 "'",
+                       keyid);
+               result = PQexec(dbconn, statement);
+               PQclear(result);
+
+               snprintf(statement, 1023,
+                       "DELETE FROM onak_sigs WHERE signee = '%" PRIX64 "'",
+                       keyid);
+               result = PQexec(dbconn, statement);
+               PQclear(result);
+
+               snprintf(statement, 1023,
+                       "DELETE FROM onak_uids WHERE keyid = '%" PRIX64 "'",
+                       keyid);
+               result = PQexec(dbconn, statement);
+       } else if (PQresultStatus(result) != PGRES_TUPLES_OK) {
+               logthing(LOGTHING_ERROR,
+                               "Problem retrieving key (%" PRIX64
+                               ") from DB.",
+                               keyid);
+       }
+
+       PQclear(result);
+
+       if (!intrans) {
+               result = PQexec(dbconn, "COMMIT");
+               PQclear(result);
+       }
+       return (found);
+}
+
 /**
  *     store_key - Takes a key and stores it.
  *     @publickey: A pointer to the public key to store.
@@ -286,12 +369,15 @@ static int pg_store_key(struct openpgp_publickey *publickey, bool intrans,
        char *primary = NULL;
        char *safeuid = NULL;
        int i;
+       uint64_t keyid;
 
        if (!intrans) {
                result = PQexec(dbconn, "BEGIN");
                PQclear(result);
        }
 
+       get_keyid(publickey, &keyid);
+
        /*
         * Delete the key if we already have it.
         *
@@ -301,7 +387,7 @@ static int pg_store_key(struct openpgp_publickey *publickey, bool intrans,
         * it definitely needs updated.
         */
        if (update) {
-               pg_delete_key(get_keyid(publickey), true);
+               pg_delete_key(keyid, true);
        }
 
        next = publickey->next;
@@ -322,8 +408,8 @@ static int pg_store_key(struct openpgp_publickey *publickey, bool intrans,
 
        snprintf(statement, 1023, 
                        "INSERT INTO onak_keys (keyid, keydata) VALUES "
-                       "('%llX', '%d')", 
-                       get_keyid(publickey),
+                       "('%" PRIX64 "', '%d')", 
+                       keyid,
                        key_oid);
        result = PQexec(dbconn, statement);
 
@@ -339,14 +425,14 @@ static int pg_store_key(struct openpgp_publickey *publickey, bool intrans,
                        safeuid = malloc(strlen(uids[i]) * 2 + 1);
                        if (safeuid != NULL) {
                                memset(safeuid, 0, strlen(uids[i]) * 2 + 1);
-                               PQescapeString(safeuid, uids[i],
-                                               strlen(uids[i]));
+                               PQescapeStringConn(dbconn, safeuid, uids[i],
+                                               strlen(uids[i]), NULL);
 
                                snprintf(statement, 1023,
                                        "INSERT INTO onak_uids "
                                        "(keyid, uid, pri) "
-                                       "VALUES ('%llX', '%s', '%c')",
-                                       get_keyid(publickey),
+                                       "VALUES ('%" PRIX64 "', '%s', '%c')",
+                                       keyid,
                                        safeuid,
                                        (uids[i] == primary) ? 't' : 'f');
                                result = PQexec(dbconn, statement);
@@ -379,9 +465,9 @@ static int pg_store_key(struct openpgp_publickey *publickey, bool intrans,
                                packets = packets->next) {
                        snprintf(statement, 1023,
                                "INSERT INTO onak_sigs (signer, signee) "
-                               "VALUES ('%llX', '%llX')",
+                               "VALUES ('%" PRIX64 "', '%" PRIX64 "')",
                                sig_keyid(packets->packet),
-                               get_keyid(publickey));
+                               keyid);
                        result = PQexec(dbconn, statement);
                        PQclear(result);
                }
@@ -395,75 +481,6 @@ static int pg_store_key(struct openpgp_publickey *publickey, bool intrans,
        return 0;
 }
 
-/**
- *     delete_key - Given a keyid delete the key from storage.
- *     @keyid: The keyid to delete.
- *     @intrans: If we're already in a transaction.
- *
- *     This function deletes a public key from whatever storage mechanism we
- *     are using. Returns 0 if the key existed.
- */
-static int pg_delete_key(uint64_t keyid, bool intrans)
-{
-       PGresult *result = NULL;
-       char *oids = NULL;
-       char statement[1024];
-       int found = 1;
-       int i;
-       Oid key_oid;
-
-       if (!intrans) {
-               result = PQexec(dbconn, "BEGIN");
-               PQclear(result);
-       }
-       
-       snprintf(statement, 1023,
-                       "SELECT keydata FROM onak_keys WHERE keyid = '%llX'",
-                       keyid);
-       result = PQexec(dbconn, statement);
-
-       if (PQresultStatus(result) == PGRES_TUPLES_OK) {
-               found = 0;
-               i = PQntuples(result);
-               while (i > 0) {
-                       oids = PQgetvalue(result, i-1, 0);
-                       key_oid = (Oid) atoi(oids);
-                       lo_unlink(dbconn, key_oid);
-                       i--;
-               }
-               PQclear(result);
-
-               snprintf(statement, 1023,
-                       "DELETE FROM onak_keys WHERE keyid = '%llX'",
-                       keyid);
-               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);
-               result = PQexec(dbconn, statement);
-       } else if (PQresultStatus(result) != PGRES_TUPLES_OK) {
-               logthing(LOGTHING_ERROR,
-                               "Problem retrieving key (%llX) from DB.",
-                               keyid);
-       }
-
-       PQclear(result);
-
-       if (!intrans) {
-               result = PQexec(dbconn, "COMMIT");
-               PQclear(result);
-       }
-       return (found);
-}
-
 /**
  *     keyid2uid - Takes a keyid and returns the primary UID for it.
  *     @keyid: The keyid to lookup.
@@ -475,7 +492,8 @@ static char *pg_keyid2uid(uint64_t keyid)
        char *uid = NULL;
 
        snprintf(statement, 1023,
-               "SELECT uid FROM onak_uids WHERE keyid = '%llX' AND pri = 't'",
+               "SELECT uid FROM onak_uids WHERE keyid = '%" PRIX64
+               "' AND pri = 't'",
                keyid);
        result = PQexec(dbconn, statement);
 
@@ -491,7 +509,8 @@ static char *pg_keyid2uid(uint64_t keyid)
                uid = strdup(PQgetvalue(result, 0, 0));
        } else if (PQresultStatus(result) != PGRES_TUPLES_OK) {
                logthing(LOGTHING_ERROR,
-                               "Problem retrieving key (%llX) from DB.",
+                               "Problem retrieving key (%" PRIX64
+                               ") from DB.",
                                keyid);
        }
 
@@ -525,7 +544,8 @@ static struct ll *pg_getkeysigs(uint64_t keyid, bool *revoked)
        }
 
        snprintf(statement, 1023,
-               "SELECT DISTINCT signer FROM onak_sigs WHERE signee = '%llX'",
+               "SELECT DISTINCT signer FROM onak_sigs WHERE signee = '%"
+               PRIX64 "'",
                keyid);
        result = PQexec(dbconn, statement);
 
@@ -587,7 +607,6 @@ static int pg_iterate_keys(void (*iterfunc)(void *ctx,
        struct openpgp_publickey *key = NULL;
        PGresult *result = NULL;
        char *oids = NULL;
-       char statement[1024];
        int fd = -1;
        int i = 0;
        int numkeys = 0;
@@ -608,7 +627,7 @@ static int pg_iterate_keys(void (*iterfunc)(void *ctx,
                        } else {
                                read_openpgp_stream(keydb_fetchchar, &fd,
                                                &packets, 0);
-                               parse_keys(packets, key);
+                               parse_keys(packets, &key);
                                lo_close(dbconn, fd);
 
                                iterfunc(ctx, key);