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 | |
parent | 8828545f084a5b295ed73a7c8b1655e440f39b71 (diff) |
Add the rexmpp_openpgp_retract_key function
-rw-r--r-- | src/rexmpp_console.c | 5 | ||||
-rw-r--r-- | src/rexmpp_openpgp.c | 69 | ||||
-rw-r--r-- | src/rexmpp_openpgp.h | 1 |
3 files changed, 59 insertions, 16 deletions
diff --git a/src/rexmpp_console.c b/src/rexmpp_console.c index 05f28a0..7884455 100644 --- a/src/rexmpp_console.c +++ b/src/rexmpp_console.c @@ -230,6 +230,7 @@ void rexmpp_console_feed (rexmpp_t *s, char *str, ssize_t str_len) { "gtell <muc jid> <message>\n" "signcrypt <jid> <message>\n" "publish-key <fingerprint>\n" + "retract-key <fingerprint>\n" "join <conference> [as] <nick>\n" "leave <conference> [as] <nick>\n" "roster list\n" @@ -254,6 +255,10 @@ void rexmpp_console_feed (rexmpp_t *s, char *str, ssize_t str_len) { char *fingerprint = strtok_r(NULL, " ", &words_save_ptr); rexmpp_openpgp_publish_key(s, fingerprint); } + if (! strcmp(word, "retract-key")) { + char *fingerprint = strtok_r(NULL, " ", &words_save_ptr); + rexmpp_openpgp_retract_key(s, fingerprint); + } if (! strcmp(word, "tell")) { jid_str = strtok_r(NULL, " ", &words_save_ptr); 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)); diff --git a/src/rexmpp_openpgp.h b/src/rexmpp_openpgp.h index 1835de7..cd3b2f1 100644 --- a/src/rexmpp_openpgp.h +++ b/src/rexmpp_openpgp.h @@ -16,6 +16,7 @@ rexmpp_openpgp_check_keys (rexmpp_t *s, xmlNodePtr items); rexmpp_err_t rexmpp_openpgp_publish_key (rexmpp_t *s, const char *fp); +rexmpp_err_t rexmpp_openpgp_retract_key (rexmpp_t *s, const char *fp); xmlNodePtr rexmpp_openpgp_decrypt_verify (rexmpp_t *s, |