summaryrefslogtreecommitdiff
path: root/src/rexmpp_openpgp.c
diff options
context:
space:
mode:
authordefanor <defanor@uberspace.net>2021-02-07 18:49:03 +0300
committerdefanor <defanor@uberspace.net>2021-02-07 18:49:03 +0300
commit4373a677b753297ea59b1c0f80851bd72648c960 (patch)
tree90eecc3a27cb7a300218bcd3f1ffdabbdf64126b /src/rexmpp_openpgp.c
parent8828545f084a5b295ed73a7c8b1655e440f39b71 (diff)
Add the rexmpp_openpgp_retract_key function
Diffstat (limited to 'src/rexmpp_openpgp.c')
-rw-r--r--src/rexmpp_openpgp.c69
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));