X-Git-Url: https://git.sommitrealweird.co.uk/onak.git/blobdiff_plain/5b3f77c7fbafb036d20a1577ed74f475e94ed821..4860ab5af538fd20c7e92e01b883dbbc556863a5:/keydb_pg.c?ds=inline diff --git a/keydb_pg.c b/keydb_pg.c index eee3bde..8e0543b 100644 --- a/keydb_pg.c +++ b/keydb_pg.c @@ -1,9 +1,20 @@ /* * keydb_pg.c - Routines to store and fetch keys in a PostGres database. * - * Jonathan McDowell + * Copyright 2002-2004 Jonathan McDowell * - * 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 @@ -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. @@ -322,7 +405,7 @@ static int pg_store_key(struct openpgp_publickey *publickey, bool intrans, snprintf(statement, 1023, "INSERT INTO onak_keys (keyid, keydata) VALUES " - "('%llX', '%d')", + "('%" PRIX64 "', '%d')", get_keyid(publickey), key_oid); result = PQexec(dbconn, statement); @@ -339,13 +422,13 @@ 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')", + "VALUES ('%" PRIX64 "', '%s', '%c')", get_keyid(publickey), safeuid, (uids[i] == primary) ? 't' : 'f'); @@ -379,7 +462,7 @@ 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)); result = PQexec(dbconn, statement); @@ -395,75 +478,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 +489,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 +506,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 +541,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 +604,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 +624,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);