summaryrefslogtreecommitdiff
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
parent8828545f084a5b295ed73a7c8b1655e440f39b71 (diff)
Add the rexmpp_openpgp_retract_key function
-rw-r--r--src/rexmpp_console.c5
-rw-r--r--src/rexmpp_openpgp.c69
-rw-r--r--src/rexmpp_openpgp.h1
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,