diff options
author | defanor <defanor@uberspace.net> | 2021-02-07 19:46:30 +0300 |
---|---|---|
committer | defanor <defanor@uberspace.net> | 2021-02-07 19:46:30 +0300 |
commit | 002937b365969329f8345e8161e1fc12520e2312 (patch) | |
tree | d8484ae2d5e4f0fe504839f10a946da6d1574610 | |
parent | 4373a677b753297ea59b1c0f80851bd72648c960 (diff) |
Delete OpenPGP key node on key retraction
-rw-r--r-- | src/rexmpp_openpgp.c | 33 | ||||
-rw-r--r-- | src/rexmpp_openpgp.h | 2 |
2 files changed, 31 insertions, 4 deletions
diff --git a/src/rexmpp_openpgp.c b/src/rexmpp_openpgp.c index ff59a7a..9447157 100644 --- a/src/rexmpp_openpgp.c +++ b/src/rexmpp_openpgp.c @@ -259,6 +259,24 @@ void rexmpp_pgp_key_fp_list_upload (rexmpp_t *s, xmlNodePtr metadata) { rexmpp_iq_new(s, "set", NULL, pubsub, rexmpp_pgp_key_publish_list_iq); } +void rexmpp_pgp_key_delete_iq (rexmpp_t *s, + xmlNodePtr req, + xmlNodePtr response, + int success) +{ + (void)response; + if (! success) { + rexmpp_log(s, LOG_WARNING, "Failed to delete an OpenpPGP key"); + return; + } + xmlNodePtr pubsub = xmlFirstElementChild(req); + xmlNodePtr publish = xmlFirstElementChild(pubsub); + char *node = xmlGetProp(publish, "node"); + char *fingerprint = node + 31; + rexmpp_log(s, LOG_INFO, "Removed OpenpPGP key %s", fingerprint); + free(node); +} + void rexmpp_pgp_key_publish_iq (rexmpp_t *s, xmlNodePtr req, xmlNodePtr response, @@ -296,7 +314,7 @@ void rexmpp_pgp_key_publish_iq (rexmpp_t *s, rexmpp_pgp_key_fp_list_upload(s, metadata); } -rexmpp_err_t rexmpp_openpgp_retract_key (rexmpp_t *s, const char *fp) { +void 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; @@ -325,9 +343,18 @@ rexmpp_err_t rexmpp_openpgp_retract_key (rexmpp_t *s, const char *fp) { } } - /* TODO: delete the key node too. */ + char node_str[72]; + snprintf(node_str, 72, "urn:xmpp:openpgp:0:public-keys:%s", fp); - return REXMPP_SUCCESS; + xmlNodePtr delete = xmlNewNode(NULL, "delete"); + xmlNewNs(delete, "http://jabber.org/protocol/pubsub#owner", NULL); + xmlNewProp(delete, "node", node_str); + + xmlNodePtr pubsub = xmlNewNode(NULL, "pubsub"); + xmlNewNs(pubsub, "http://jabber.org/protocol/pubsub#owner", NULL); + xmlAddChild(pubsub, delete); + + rexmpp_iq_new(s, "set", NULL, pubsub, rexmpp_pgp_key_delete_iq); } rexmpp_err_t rexmpp_openpgp_publish_key (rexmpp_t *s, const char *fp) { diff --git a/src/rexmpp_openpgp.h b/src/rexmpp_openpgp.h index cd3b2f1..3785254 100644 --- a/src/rexmpp_openpgp.h +++ b/src/rexmpp_openpgp.h @@ -16,7 +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); +void rexmpp_openpgp_retract_key (rexmpp_t *s, const char *fp); xmlNodePtr rexmpp_openpgp_decrypt_verify (rexmpp_t *s, |