diff options
author | defanor <defanor@uberspace.net> | 2021-02-07 18:49:03 +0300 |
---|---|---|
committer | defanor <defanor@uberspace.net> | 2021-02-07 18:49:03 +0300 |
commit | 4373a677b753297ea59b1c0f80851bd72648c960 (patch) | |
tree | 90eecc3a27cb7a300218bcd3f1ffdabbdf64126b /src/rexmpp_openpgp.c | |
parent | 8828545f084a5b295ed73a7c8b1655e440f39b71 (diff) |
Add the rexmpp_openpgp_retract_key function
Diffstat (limited to 'src/rexmpp_openpgp.c')
-rw-r--r-- | src/rexmpp_openpgp.c | 69 |
1 files changed, 53 insertions, 16 deletions
diff --git a/src/rexmpp_openpgp.c b/src/rexmpp_openpgp.c index a87df67..ff59a7a 100644 --- a/src/rexmpp_openpgp.c +++ b/src/rexmpp_openpgp.c @@ -238,6 +238,27 @@ void rexmpp_pgp_key_publish_list_iq (rexmpp_t *s, rexmpp_log(s, LOG_INFO, "Published an OpenpPGP key list"); } +void rexmpp_pgp_key_fp_list_upload (rexmpp_t *s, xmlNodePtr metadata) { + xmlNodePtr keylist = xmlNewNode(NULL, "public-keys-list"); + xmlNewNs(keylist, "urn:xmpp:openpgp:0", NULL); + xmlAddChild(keylist, metadata); + + xmlNodePtr item = xmlNewNode(NULL, "item"); + xmlNewNs(item, "http://jabber.org/protocol/pubsub", NULL); + xmlAddChild(item, keylist); + + xmlNodePtr publish = xmlNewNode(NULL, "publish"); + xmlNewNs(publish, "http://jabber.org/protocol/pubsub", NULL); + xmlNewProp(publish, "node", "urn:xmpp:openpgp:0:public-keys"); + xmlAddChild(publish, item); + + xmlNodePtr pubsub = xmlNewNode(NULL, "pubsub"); + xmlNewNs(pubsub, "http://jabber.org/protocol/pubsub", NULL); + xmlAddChild(pubsub, publish); + + rexmpp_iq_new(s, "set", NULL, pubsub, rexmpp_pgp_key_publish_list_iq); +} + void rexmpp_pgp_key_publish_iq (rexmpp_t *s, xmlNodePtr req, xmlNodePtr response, @@ -272,27 +293,43 @@ void rexmpp_pgp_key_publish_iq (rexmpp_t *s, metadata->next = xmlCopyNodeList(fps); } - xmlNodePtr keylist = xmlNewNode(NULL, "public-keys-list"); - xmlNewNs(keylist, "urn:xmpp:openpgp:0", NULL); - xmlAddChild(keylist, metadata); - - xmlNodePtr item = xmlNewNode(NULL, "item"); - xmlNewNs(item, "http://jabber.org/protocol/pubsub", NULL); - xmlAddChild(item, keylist); + rexmpp_pgp_key_fp_list_upload(s, metadata); +} - publish = xmlNewNode(NULL, "publish"); - xmlNewNs(publish, "http://jabber.org/protocol/pubsub", NULL); - xmlNewProp(publish, "node", "urn:xmpp:openpgp:0:public-keys"); - xmlAddChild(publish, item); +rexmpp_err_t rexmpp_openpgp_retract_key (rexmpp_t *s, const char *fp) { + xmlNodePtr metadata, prev = NULL; + for (metadata = rexmpp_published_fingerprints(s, s->assigned_jid.bare); + metadata != NULL; + prev = metadata, metadata = xmlNextElementSibling(metadata)) { + if (! rexmpp_xml_match(metadata, "urn:xmpp:openpgp:0", "pubkey-metadata")) { + continue; + } + char *fingerprint = xmlGetProp(metadata, "v4-fingerprint"); + if (fingerprint == NULL) { + rexmpp_log(s, LOG_WARNING, "No fingerprint found in pubkey-metadata"); + continue; + } + int matches = (strcmp(fingerprint, fp) == 0); + free(fingerprint); + if (matches) { + xmlNodePtr new_fp_list = NULL; + if (prev != NULL) { + prev->next = metadata->next; + new_fp_list = rexmpp_published_fingerprints(s, s->assigned_jid.bare); + } else { + new_fp_list = metadata->next; + } + xmlFreeNode(metadata); + rexmpp_pgp_key_fp_list_upload(s, new_fp_list); + break; + } + } - pubsub = xmlNewNode(NULL, "pubsub"); - xmlNewNs(pubsub, "http://jabber.org/protocol/pubsub", NULL); - xmlAddChild(pubsub, publish); + /* TODO: delete the key node too. */ - rexmpp_iq_new(s, "set", NULL, pubsub, rexmpp_pgp_key_publish_list_iq); + return REXMPP_SUCCESS; } - rexmpp_err_t rexmpp_openpgp_publish_key (rexmpp_t *s, const char *fp) { if (strlen(fp) != 40) { rexmpp_log(s, LOG_ERR, "Wrong fingerprint length: %d", strlen(fp)); |