From bb375918ee492c16f9a164998bfc9c27edc47d90 Mon Sep 17 00:00:00 2001 From: Tony Olagbaiye Date: Thu, 13 Jan 2022 07:31:45 +0000 Subject: [PATCH] some raii --- account.cpp | 29 ++-- account.hh | 7 +- channel.cpp | 2 +- channel.hh | 2 - connection.cpp | 22 +-- connection.hh | 2 - makefile | 2 + message.cpp | 18 +- message.hh | 2 +- omemo.cpp | 462 +++++++++++++++++++++++-------------------------- omemo.hh | 94 ++++++---- pgp.hh | 5 +- plugin.cpp | 13 +- signal.hh | 57 ++++++ strophe.hh | 13 ++ user.cpp | 30 ++-- 16 files changed, 411 insertions(+), 349 deletions(-) create mode 100644 signal.hh create mode 100644 strophe.hh diff --git a/account.cpp b/account.cpp index f012b9a..53dc00d 100644 --- a/account.cpp +++ b/account.cpp @@ -26,16 +26,16 @@ struct t_account *accounts = NULL; struct t_account *last_account = NULL; char *account_options[ACCOUNT_NUM_OPTIONS][2] = -{ { "jid", "" }, - { "password", "" }, - { "tls", "normal" }, - { "nickname", "" }, - { "autoconnect", "" }, - { "resource", "" }, - { "status", "probably about to segfault" }, - { "pgp_pubring_path", "${weechat_data_dir}/pubring.gpg" }, - { "pgp_secring_path", "${weechat_data_dir}/secring.gpg" }, - { "pgp_keyid", "" }, +{ { (char*)"jid", (char*)"" }, + { (char*)"password", (char*)"" }, + { (char*)"tls", (char*)"normal" }, + { (char*)"nickname", (char*)"" }, + { (char*)"autoconnect", (char*)"" }, + { (char*)"resource", (char*)"" }, + { (char*)"status", (char*)"probably about to segfault" }, + { (char*)"pgp_pubring_path", (char*)"${weechat_data_dir}/pubring.gpg" }, + { (char*)"pgp_secring_path", (char*)"${weechat_data_dir}/secring.gpg" }, + { (char*)"pgp_keyid", (char*)"" }, }; struct t_account *account__search(const char *name) @@ -179,7 +179,7 @@ xmpp_stanza_t *account__get_devicelist(struct t_account *account) device = (struct t_account_device*)malloc(sizeof(struct t_account_device)); - device->id = account->omemo->device_id; + device->id = account->omemo.device_id; snprintf(id, sizeof(id), "%u", device->id); device->name = strdup(id); device->label = strdup("weechat"); @@ -195,7 +195,7 @@ xmpp_stanza_t *account__get_devicelist(struct t_account *account) for (device = account->devices; device; device = device->next_device) { - if (device->id != account->omemo->device_id) + if (device->id != account->omemo.device_id) children[i++] = stanza__iq_pubsub_publish_item_list_device( account->context, NULL, with_noop(device->name), NULL); } @@ -446,8 +446,6 @@ struct t_account *account__alloc(const char *name) new_account->buffer = NULL; new_account->buffer_as_string = NULL; - new_account->omemo = NULL; - new_account->devices = NULL; new_account->last_device = NULL; new_account->mam_queries = NULL; @@ -543,9 +541,6 @@ void account__free_data(struct t_account *account) if (account->buffer_as_string) free(account->buffer_as_string); - if (account->omemo) - omemo__free(account->omemo); - //channel__free_all(account); //user__free_all(account); } diff --git a/account.hh b/account.hh index aa1a2e5..28302d6 100644 --- a/account.hh +++ b/account.hh @@ -4,11 +4,12 @@ #pragma once -#ifdef __cplusplus #include #include +#include #include -#endif + +#include "omemo.hh" extern struct t_account *accounts; extern struct t_account *last_account; @@ -113,7 +114,7 @@ struct t_account struct t_gui_buffer *buffer; char *buffer_as_string; - struct t_omemo *omemo; + weechat::xmpp::omemo omemo; struct t_pgp *pgp; struct t_account_device *devices; diff --git a/channel.cpp b/channel.cpp index 6b7d2c9..6625e5f 100644 --- a/channel.cpp +++ b/channel.cpp @@ -1044,7 +1044,7 @@ int channel__send_message(struct t_account *account, struct t_channel *channel, if (account->omemo && channel->omemo.enabled) { - xmpp_stanza_t *encrypted = omemo__encode(account, to, body); + xmpp_stanza_t *encrypted = account->omemo.encode(account, to, body); if (!encrypted) { weechat_printf_date_tags(channel->buffer, 0, "notify_none", "%s%s", diff --git a/channel.hh b/channel.hh index da5b556..3298201 100644 --- a/channel.hh +++ b/channel.hh @@ -4,9 +4,7 @@ #pragma once -#ifdef __cplusplus #include -#endif #define CHANNEL_MEMBERS_SPEAKING_LIMIT 128 diff --git a/connection.cpp b/connection.cpp index 741a1b3..8aaebc2 100644 --- a/connection.cpp +++ b/connection.cpp @@ -395,8 +395,8 @@ int connection__message_handler(xmpp_conn_t *conn, xmpp_stanza_t *stanza, void * { if (account->omemo) { - omemo__handle_devicelist(account->omemo, - from ? from : account_jid(account), items); + account->omemo.handle_devicelist( + from ? from : account_jid(account), items); } children = (xmpp_stanza_t**)malloc(sizeof(*children) * (3 + 1)); @@ -533,7 +533,7 @@ int connection__message_handler(xmpp_conn_t *conn, xmpp_stanza_t *stanza, void * "eu.siacs.conversations.axolotl"); if (encrypted && account->omemo) { - cleartext = omemo__decode(account, from_bare, encrypted); + cleartext = account->omemo.decode(account, from_bare, encrypted); } x = xmpp_stanza_get_child_by_name_and_ns(stanza, "x", "jabber:x:encrypted"); intext = xmpp_stanza_get_text(body); @@ -979,8 +979,8 @@ int connection__iq_handler(xmpp_conn_t *conn, xmpp_stanza_t *stanza, void *userd item, "list", "eu.siacs.conversations.axolotl"); if (list && account->omemo) { - omemo__handle_devicelist(account->omemo, - from ? from : account_jid(account), items); + account->omemo.handle_devicelist( + from ? from : account_jid(account), items); xmpp_stanza_t *children[2] = {NULL}; for (device = xmpp_stanza_get_children(list); @@ -1024,7 +1024,7 @@ int connection__iq_handler(xmpp_conn_t *conn, xmpp_stanza_t *stanza, void *userd dev = (t_account_device*)malloc(sizeof(struct t_account_device)); - dev->id = account->omemo->device_id; + dev->id = account->omemo.device_id; snprintf(id, sizeof(id), "%d", dev->id); dev->name = strdup(id); dev->label = strdup("weechat"); @@ -1082,8 +1082,8 @@ int connection__iq_handler(xmpp_conn_t *conn, xmpp_stanza_t *stanza, void *userd strlen("eu.siacs.conversations.axolotl.bundles:"); if (account->omemo && strlen(items_node) > node_prefix) { - omemo__handle_bundle(account->omemo, - from ? from : account_jid(account), + account->omemo.handle_bundle( + from ? from : account_jid(account), strtol(items_node+node_prefix, NULL, 10), items); @@ -1314,13 +1314,13 @@ void connection__handler(xmpp_conn_t *conn, xmpp_conn_event_t status, xmpp_send(conn, children[0]); xmpp_stanza_release(children[0]); - omemo__init(account->buffer, &account->omemo, account->name); + account->omemo.init(account->buffer, account->name); if (account->omemo) { children[0] = - omemo__get_bundle(account->context, - strdup(account_jid(account)), NULL, account->omemo); + account->omemo.get_bundle(account->context, + strdup(account_jid(account)), NULL); xmpp_send(conn, children[0]); xmpp_stanza_release(children[0]); } diff --git a/connection.hh b/connection.hh index 1fc8c9a..01ea84d 100644 --- a/connection.hh +++ b/connection.hh @@ -4,9 +4,7 @@ #pragma once -#ifdef __cplusplus #include -#endif void connection__init(); diff --git a/makefile b/makefile index 7ea33be..82c74f5 100644 --- a/makefile +++ b/makefile @@ -12,6 +12,7 @@ INCLUDES=-Ilibstrophe -Ideps -Ideps/fmt/include \ $(shell pkg-config --cflags libomemo-c) CFLAGS+=$(DBGCFLAGS) \ -fno-omit-frame-pointer -fPIC \ + -fvisibility=hidden -fvisibility-inlines-hidden \ -std=gnu99 -gdwarf-4 \ -Wall -Wextra -pedantic \ -Werror-implicit-function-declaration \ @@ -20,6 +21,7 @@ CFLAGS+=$(DBGCFLAGS) \ $(INCLUDES) CPPFLAGS+=$(DBGCFLAGS) \ -fno-omit-frame-pointer -fPIC \ + -fvisibility=hidden -fvisibility-inlines-hidden \ -std=c++20 -gdwarf-4 \ -Wall -Wextra -pedantic \ -Wno-missing-field-initializers \ diff --git a/message.cpp b/message.cpp index 13ca97b..c21d6a3 100644 --- a/message.cpp +++ b/message.cpp @@ -37,7 +37,7 @@ char *message__translate_code(struct t_account *account, case '#': /* channel */ if (alttext) { - prefix = "#"; + prefix = (char*)"#"; symbol = strdup(alttext); } else @@ -45,12 +45,12 @@ char *message__translate_code(struct t_account *account, channel = channel__search(account, identifier+1); if (channel) { - prefix = "#"; + prefix = (char*)"#"; symbol = strdup(channel->name); } else { - prefix = "Channel:"; + prefix = (char*)"Channel:"; symbol = strdup(identifier+1); } } @@ -58,7 +58,7 @@ char *message__translate_code(struct t_account *account, case '@': /* user */ if (alttext) { - prefix = "@"; + prefix = (char*)"@"; symbol = strdup(alttext); } else @@ -66,12 +66,12 @@ char *message__translate_code(struct t_account *account, user = user__search(account, identifier+1); if (user) { - prefix = "@"; + prefix = (char*)"@"; symbol = strdup(user->profile.display_name); } else { - prefix = "User:"; + prefix = (char*)"User:"; symbol = strdup(identifier+1); } } @@ -79,17 +79,17 @@ char *message__translate_code(struct t_account *account, case '!': /* special */ if (alttext) { - prefix = "@"; + prefix = (char*)"@"; symbol = strdup(alttext); } else { - prefix = "@"; + prefix = (char*)"@"; symbol = strdup(identifier+1); } break; default: /* url */ - prefix = ""; + prefix = (char*)""; symbol = strdup(code); break; } diff --git a/message.hh b/message.hh index a5ff8ce..52fb6af 100644 --- a/message.hh +++ b/message.hh @@ -7,4 +7,4 @@ #define MESSAGE_MAX_LENGTH 40000 char *message__decode(struct t_account *account, - const char *text); + const char *text); diff --git a/omemo.cpp b/omemo.cpp index b95151f..ecee611 100644 --- a/omemo.cpp +++ b/omemo.cpp @@ -18,26 +18,18 @@ #include #include #include -#include #include #include -struct t_omemo_db { - MDB_env *env; - MDB_dbi dbi_omemo; -}; - -struct t_pre_key { - const char *id; - const char *public_key; -}; - #include "plugin.hh" #include "xmpp/stanza.hh" #include "account.hh" #include "omemo.hh" #include "util.hh" +using namespace weechat::xmpp; +using t_omemo = omemo; + #define mdb_val_str(s) { \ .mv_size = strlen(s), .mv_data = (char*)s \ } @@ -255,7 +247,7 @@ int cp_hmac_sha256_update(void *hmac_context, const uint8_t *data, size_t data_l return SG_SUCCESS; } -int cp_hmac_sha256_final(void *hmac_context, signal_buffer **output, void *user_data) { +int cp_hmac_sha256_final(void *hmac_context, struct signal_buffer **output, void *user_data) { (void) user_data; size_t len = gcry_mac_get_algo_maclen(GCRY_MAC_HMAC_SHA256); @@ -264,7 +256,7 @@ int cp_hmac_sha256_final(void *hmac_context, signal_buffer **output, void *user_ if (gcry_mac_read(*ctx, md.get(), &len)) return SG_ERR_UNKNOWN; - signal_buffer *output_buffer = signal_buffer_create(md.get(), len); + struct signal_buffer *output_buffer = signal_buffer_create(md.get(), len); if (!output_buffer) return SG_ERR_NOMEM; *output = output_buffer; @@ -308,7 +300,7 @@ int cp_sha512_digest_update(void *digest_context, const uint8_t *data, size_t da return SG_SUCCESS; } -int cp_sha512_digest_final(void *digest_context, signal_buffer **output, void *user_data) { +int cp_sha512_digest_final(void *digest_context, struct signal_buffer **output, void *user_data) { (void) user_data; size_t len = gcry_md_get_algo_dlen(GCRY_MD_SHA512); @@ -319,7 +311,7 @@ int cp_sha512_digest_final(void *digest_context, signal_buffer **output, void *u gcry_md_reset(*ctx); - signal_buffer *output_buffer = signal_buffer_create(md, len); + struct signal_buffer *output_buffer = signal_buffer_create(md, len); free(md); if (!output_buffer) return SG_ERR_NOMEM; @@ -338,7 +330,7 @@ void cp_sha512_digest_cleanup(void *digest_context, void *user_data) { } } -int cp_encrypt(signal_buffer **output, +int cp_encrypt(struct signal_buffer **output, int cipher, const uint8_t *key, size_t key_len, const uint8_t *iv, size_t iv_len, @@ -415,7 +407,7 @@ no_error: return SG_SUCCESS; } -int cp_decrypt(signal_buffer **output, +int cp_decrypt(struct signal_buffer **output, int cipher, const uint8_t *key, size_t key_len, const uint8_t *iv, size_t iv_len, @@ -485,23 +477,23 @@ no_error: return SG_SUCCESS; } -int iks_get_identity_key_pair(signal_buffer **public_data, signal_buffer **private_data, void *user_data) +int iks_get_identity_key_pair(struct signal_buffer **public_data, signal_buffer **private_data, void *user_data) { - struct t_omemo *omemo = (struct t_omemo *)user_data; + auto omemo = reinterpret_cast(user_data); MDB_txn *transaction = NULL; MDB_val k_local_private_key = mdb_val_str("local_private_key"); MDB_val k_local_public_key = mdb_val_str("local_public_key"); MDB_val v_local_private_key, v_local_public_key; - if (mdb_txn_begin(omemo->db->env, NULL, MDB_RDONLY, &transaction)) { + if (mdb_txn_begin(omemo->db.env, NULL, MDB_RDONLY, &transaction)) { weechat_printf(NULL, "%sxmpp: failed to open lmdb transaction", weechat_prefix("error")); return -1; } - if (!mdb_get(transaction, omemo->db->dbi_omemo, + if (!mdb_get(transaction, omemo->db.dbi_omemo, &k_local_private_key, &v_local_private_key) && - !mdb_get(transaction, omemo->db->dbi_omemo, + !mdb_get(transaction, omemo->db.dbi_omemo, &k_local_public_key, &v_local_public_key)) { *private_data = signal_buffer_create((const uint8_t*)v_local_private_key.mv_data, v_local_private_key.mv_size); @@ -518,9 +510,9 @@ int iks_get_identity_key_pair(signal_buffer **public_data, signal_buffer **priva struct ratchet_identity_key_pair *identity; signal_protocol_key_helper_generate_identity_key_pair( - &identity, omemo->context); - ec_private_key *private_key = ratchet_identity_key_pair_get_private(identity); - ec_public_key *public_key = ratchet_identity_key_pair_get_public(identity); + &identity, omemo->context.get()); + struct ec_private_key *private_key = ratchet_identity_key_pair_get_private(identity); + struct ec_public_key *public_key = ratchet_identity_key_pair_get_public(identity); ec_private_key_serialize(private_data, private_key); ec_public_key_serialize(public_data, public_key); @@ -531,15 +523,15 @@ int iks_get_identity_key_pair(signal_buffer **public_data, signal_buffer **priva v_local_public_key.mv_size = signal_buffer_len(*public_data); mdb_txn_abort(transaction); - if (mdb_txn_begin(omemo->db->env, NULL, 0, &transaction)) { + if (mdb_txn_begin(omemo->db.env, NULL, 0, &transaction)) { weechat_printf(NULL, "%sxmpp: failed to open lmdb transaction", weechat_prefix("error")); return -1; } - if (mdb_put(transaction, omemo->db->dbi_omemo, + if (mdb_put(transaction, omemo->db.dbi_omemo, &k_local_private_key, &v_local_private_key, MDB_NOOVERWRITE) || - mdb_put(transaction, omemo->db->dbi_omemo, + mdb_put(transaction, omemo->db.dbi_omemo, &k_local_public_key, &v_local_public_key, MDB_NOOVERWRITE)) { weechat_printf(NULL, "%sxmpp: failed to write lmdb value", @@ -557,7 +549,7 @@ int iks_get_identity_key_pair(signal_buffer **public_data, signal_buffer **priva v_local_private_key.mv_size); *public_data = signal_buffer_create((const uint8_t*)v_local_public_key.mv_data, v_local_public_key.mv_size); - omemo->identity = identity; + omemo->identity.reset(identity); } return 0; @@ -568,19 +560,19 @@ cleanup: int iks_get_local_registration_id(void *user_data, uint32_t *registration_id) { - struct t_omemo *omemo = (struct t_omemo *)user_data; + auto omemo = reinterpret_cast(user_data); MDB_txn *transaction = NULL; MDB_val k_local_registration_id = mdb_val_str("local_registration_id"); MDB_val v_local_registration_id = mdb_val_sizeof(uint32_t); // Return the local client's registration ID - if (mdb_txn_begin(omemo->db->env, NULL, MDB_RDONLY, &transaction)) { + if (mdb_txn_begin(omemo->db.env, NULL, MDB_RDONLY, &transaction)) { weechat_printf(NULL, "%sxmpp: failed to open lmdb transaction", weechat_prefix("error")); return -1; } - if (!mdb_get(transaction, omemo->db->dbi_omemo, + if (!mdb_get(transaction, omemo->db.dbi_omemo, &k_local_registration_id, &v_local_registration_id)) { @@ -596,17 +588,17 @@ int iks_get_local_registration_id(void *user_data, uint32_t *registration_id) { uint32_t generated_id; signal_protocol_key_helper_generate_registration_id( - &generated_id, 0, omemo->context); + &generated_id, 0, omemo->context.get()); v_local_registration_id.mv_data = &generated_id; mdb_txn_abort(transaction); - if (mdb_txn_begin(omemo->db->env, NULL, 0, &transaction)) { + if (mdb_txn_begin(omemo->db.env, NULL, 0, &transaction)) { weechat_printf(NULL, "%sxmpp: failed to open lmdb transaction", weechat_prefix("error")); return -1; } - if (mdb_put(transaction, omemo->db->dbi_omemo, + if (mdb_put(transaction, omemo->db.dbi_omemo, &k_local_registration_id, &v_local_registration_id, MDB_NOOVERWRITE)) { @@ -630,9 +622,9 @@ cleanup: return -1; } -int iks_save_identity(const signal_protocol_address *address, uint8_t *key_data, size_t key_len, void *user_data) +int iks_save_identity(const struct signal_protocol_address *address, uint8_t *key_data, size_t key_len, void *user_data) { - struct t_omemo *omemo = (struct t_omemo *)user_data; + auto omemo = reinterpret_cast(user_data); MDB_txn *transaction = NULL; MDB_val k_identity_key = { .mv_size = strlen("identity_key_") + address->name_len @@ -647,13 +639,13 @@ int iks_save_identity(const signal_protocol_address *address, uint8_t *key_data, snprintf((char*)k_identity_key.mv_data, k_identity_key.mv_size + 1, "identity_key_%s_%u", address->name, address->device_id); - if (mdb_txn_begin(omemo->db->env, NULL, 0, &transaction)) { + if (mdb_txn_begin(omemo->db.env, NULL, 0, &transaction)) { weechat_printf(NULL, "%sxmpp: failed to open lmdb transaction", weechat_prefix("error")); return -1; } - if (mdb_put(transaction, omemo->db->dbi_omemo, &k_identity_key, + if (mdb_put(transaction, omemo->db.dbi_omemo, &k_identity_key, &v_identity_key, 0)) { weechat_printf(NULL, "%sxmpp: failed to write lmdb value", weechat_prefix("error")); @@ -672,9 +664,9 @@ cleanup: return -1; } -int iks_is_trusted_identity(const signal_protocol_address *address, uint8_t *key_data, size_t key_len, void *user_data) +int iks_is_trusted_identity(const struct signal_protocol_address *address, uint8_t *key_data, size_t key_len, void *user_data) { - struct t_omemo *omemo = (struct t_omemo *)user_data; + auto omemo = reinterpret_cast(user_data); MDB_txn *transaction = NULL; MDB_val k_identity_key = { .mv_size = strlen("identity_key_") + address->name_len @@ -690,13 +682,13 @@ int iks_is_trusted_identity(const signal_protocol_address *address, uint8_t *key snprintf((char*)k_identity_key.mv_data, k_identity_key.mv_size + 1, "identity_key_%s_%u", address->name, address->device_id); - if (mdb_txn_begin(omemo->db->env, NULL, MDB_RDONLY, &transaction)) { + if (mdb_txn_begin(omemo->db.env, NULL, MDB_RDONLY, &transaction)) { weechat_printf(NULL, "%sxmpp: failed to open lmdb transaction", weechat_prefix("error")); return -1; } - if (mdb_get(transaction, omemo->db->dbi_omemo, &k_identity_key, + if (mdb_get(transaction, omemo->db.dbi_omemo, &k_identity_key, &v_identity_key)) { weechat_printf(NULL, "%sxmpp: failed to read lmdb value", weechat_prefix("error")); @@ -721,14 +713,14 @@ cleanup: void iks_destroy_func(void *user_data) { - struct t_omemo *omemo = (struct t_omemo *)user_data; + auto omemo = reinterpret_cast(user_data); (void) omemo; // Function called to perform cleanup when the data store context is being destroyed } int pks_store_pre_key(uint32_t pre_key_id, uint8_t *record, size_t record_len, void *user_data) { - struct t_omemo *omemo = (struct t_omemo *)user_data; + auto omemo = reinterpret_cast(user_data); MDB_txn *transaction = NULL; MDB_val k_pre_key = { .mv_size = strlen("pre_key_") + 10, // strlen(UINT32_MAX) @@ -742,13 +734,13 @@ int pks_store_pre_key(uint32_t pre_key_id, uint8_t *record, size_t record_len, v snprintf((char*)k_pre_key.mv_data, k_pre_key.mv_size + 1, "pre_key_%-10u", pre_key_id); - if (mdb_txn_begin(omemo->db->env, NULL, 0, &transaction)) { + if (mdb_txn_begin(omemo->db.env, NULL, 0, &transaction)) { weechat_printf(NULL, "%sxmpp: failed to open lmdb transaction", weechat_prefix("error")); return -1; } - if (mdb_put(transaction, omemo->db->dbi_omemo, &k_pre_key, + if (mdb_put(transaction, omemo->db.dbi_omemo, &k_pre_key, &v_pre_key, 0)) { weechat_printf(NULL, "%sxmpp: failed to write lmdb value", weechat_prefix("error")); @@ -769,7 +761,7 @@ cleanup: int pks_contains_pre_key(uint32_t pre_key_id, void *user_data) { - struct t_omemo *omemo = (struct t_omemo *)user_data; + auto omemo = reinterpret_cast(user_data); MDB_txn *transaction = NULL; MDB_val k_pre_key = { .mv_size = strlen("pre_key_") + 10, // strlen(UINT32_MAX) @@ -783,13 +775,13 @@ int pks_contains_pre_key(uint32_t pre_key_id, void *user_data) snprintf((char*)k_pre_key.mv_data, k_pre_key.mv_size + 1, "pre_key_%-10u", pre_key_id); - if (mdb_txn_begin(omemo->db->env, NULL, MDB_RDONLY, &transaction)) { + if (mdb_txn_begin(omemo->db.env, NULL, MDB_RDONLY, &transaction)) { weechat_printf(NULL, "%sxmpp: failed to open lmdb transaction", weechat_prefix("error")); return -1; } - if (mdb_get(transaction, omemo->db->dbi_omemo, &k_pre_key, + if (mdb_get(transaction, omemo->db.dbi_omemo, &k_pre_key, &v_pre_key)) { weechat_printf(NULL, "%sxmpp: failed to read lmdb value", weechat_prefix("error")); @@ -805,27 +797,27 @@ cleanup: return 0; } -uint32_t pks_get_count(struct t_omemo *omemo, int increment) +uint32_t pks_get_count(t_omemo *omemo, int increment) { uint32_t count = PRE_KEY_START; MDB_txn *transaction = NULL; MDB_val k_pre_key_idx = mdb_val_str("pre_key_idx"); MDB_val v_pre_key_idx = mdb_val_intptr(&count); - if (mdb_txn_begin(omemo->db->env, NULL, 0, &transaction)) { + if (mdb_txn_begin(omemo->db.env, NULL, 0, &transaction)) { weechat_printf(NULL, "%sxmpp: failed to open lmdb transaction", weechat_prefix("error")); return -1; } - if (!mdb_get(transaction, omemo->db->dbi_omemo, + if (!mdb_get(transaction, omemo->db.dbi_omemo, &k_pre_key_idx, &v_pre_key_idx)) { if (increment) count += PRE_KEY_COUNT; } - if (mdb_put(transaction, omemo->db->dbi_omemo, + if (mdb_put(transaction, omemo->db.dbi_omemo, &k_pre_key_idx, &v_pre_key_idx, 0)) { weechat_printf(NULL, "%sxmpp: failed to read lmdb value", @@ -845,9 +837,9 @@ cleanup: return 0; } -int pks_load_pre_key(signal_buffer **record, uint32_t pre_key_id, void *user_data) +int pks_load_pre_key(struct signal_buffer **record, uint32_t pre_key_id, void *user_data) { - struct t_omemo *omemo = (struct t_omemo *)user_data; + auto omemo = reinterpret_cast(user_data); MDB_txn *transaction = NULL; MDB_val k_pre_key = { .mv_size = strlen("pre_key_") + 10, // strlen(UINT32_MAX) @@ -861,13 +853,13 @@ int pks_load_pre_key(signal_buffer **record, uint32_t pre_key_id, void *user_dat snprintf((char*)k_pre_key.mv_data, k_pre_key.mv_size + 1, "pre_key_%-10u", pre_key_id); - if (mdb_txn_begin(omemo->db->env, NULL, 0, &transaction)) { + if (mdb_txn_begin(omemo->db.env, NULL, 0, &transaction)) { weechat_printf(NULL, "%sxmpp: failed to open lmdb transaction", weechat_prefix("error")); return -1; } - if (!mdb_get(transaction, omemo->db->dbi_omemo, + if (!mdb_get(transaction, omemo->db.dbi_omemo, &k_pre_key, &v_pre_key)) { *record = signal_buffer_create((const uint8_t*)v_pre_key.mv_data, v_pre_key.mv_size); @@ -887,7 +879,7 @@ int pks_load_pre_key(signal_buffer **record, uint32_t pre_key_id, void *user_dat for (signal_protocol_key_helper_generate_pre_keys(&pre_keys_list, pks_get_count(omemo, 1), PRE_KEY_COUNT, - omemo->context); pre_keys_list; + omemo->context.get()); pre_keys_list; pre_keys_list = signal_protocol_key_helper_key_list_next(pre_keys_list)) { pre_key = signal_protocol_key_helper_key_list_element(pre_keys_list); @@ -907,7 +899,7 @@ cleanup: int pks_remove_pre_key(uint32_t pre_key_id, void *user_data) { - struct t_omemo *omemo = (struct t_omemo *)user_data; + auto omemo = reinterpret_cast(user_data); MDB_txn *transaction = NULL; MDB_val k_pre_key = { .mv_size = strlen("pre_key_") + 10, // strlen(UINT32_MAX) @@ -921,13 +913,13 @@ int pks_remove_pre_key(uint32_t pre_key_id, void *user_data) snprintf((char*)k_pre_key.mv_data, k_pre_key.mv_size + 1, "pre_key_%-10u", pre_key_id); - if (mdb_txn_begin(omemo->db->env, NULL, 0, &transaction)) { + if (mdb_txn_begin(omemo->db.env, NULL, 0, &transaction)) { weechat_printf(NULL, "%sxmpp: failed to open lmdb transaction", weechat_prefix("error")); return -1; } - if (mdb_del(transaction, omemo->db->dbi_omemo, &k_pre_key, + if (mdb_del(transaction, omemo->db.dbi_omemo, &k_pre_key, &v_pre_key)) { weechat_printf(NULL, "%sxmpp: failed to erase lmdb value", weechat_prefix("error")); @@ -948,14 +940,14 @@ cleanup: void pks_destroy_func(void *user_data) { - struct t_omemo *omemo = (struct t_omemo *)user_data; + auto omemo = reinterpret_cast(user_data); (void) omemo; // Function called to perform cleanup when the data store context is being destroyed } -int spks_load_signed_pre_key(signal_buffer **record, uint32_t signed_pre_key_id, void *user_data) +int spks_load_signed_pre_key(struct signal_buffer **record, uint32_t signed_pre_key_id, void *user_data) { - struct t_omemo *omemo = (struct t_omemo *)user_data; + auto omemo = reinterpret_cast(user_data); MDB_txn *transaction = NULL; MDB_val k_signed_pre_key = { .mv_size = strlen("signed_pre_key_") + 10, // strlen(UINT32_MAX) @@ -969,13 +961,13 @@ int spks_load_signed_pre_key(signal_buffer **record, uint32_t signed_pre_key_id, snprintf((char*)k_signed_pre_key.mv_data, k_signed_pre_key.mv_size + 1, "signed_pre_key_%-10u", signed_pre_key_id); - if (mdb_txn_begin(omemo->db->env, NULL, 0, &transaction)) { + if (mdb_txn_begin(omemo->db.env, NULL, 0, &transaction)) { weechat_printf(NULL, "%sxmpp: failed to open lmdb transaction", weechat_prefix("error")); return -1; } - if (!mdb_get(transaction, omemo->db->dbi_omemo, + if (!mdb_get(transaction, omemo->db.dbi_omemo, &k_signed_pre_key, &v_signed_pre_key)) { *record = signal_buffer_create((const uint8_t*)v_signed_pre_key.mv_data, v_signed_pre_key.mv_size); @@ -989,15 +981,15 @@ int spks_load_signed_pre_key(signal_buffer **record, uint32_t signed_pre_key_id, else { session_signed_pre_key *signed_pre_key = NULL; - signal_buffer *serialized_key = NULL; + struct signal_buffer *serialized_key = NULL; - signal_protocol_key_helper_generate_signed_pre_key(&signed_pre_key, omemo->identity, signed_pre_key_id, time(NULL), omemo->context); + signal_protocol_key_helper_generate_signed_pre_key(&signed_pre_key, omemo->identity.get(), signed_pre_key_id, time(NULL), omemo->context.get()); session_signed_pre_key_serialize(&serialized_key, signed_pre_key); v_signed_pre_key.mv_data = signal_buffer_data(serialized_key); v_signed_pre_key.mv_size = signal_buffer_len(serialized_key); - if (mdb_put(transaction, omemo->db->dbi_omemo, + if (mdb_put(transaction, omemo->db.dbi_omemo, &k_signed_pre_key, &v_signed_pre_key, MDB_NOOVERWRITE)) { weechat_printf(NULL, "%sxmpp: failed to read lmdb value", @@ -1022,7 +1014,7 @@ cleanup: int spks_store_signed_pre_key(uint32_t signed_pre_key_id, uint8_t *record, size_t record_len, void *user_data) { - struct t_omemo *omemo = (struct t_omemo *)user_data; + auto omemo = reinterpret_cast(user_data); MDB_txn *transaction = NULL; MDB_val k_signed_pre_key = { .mv_size = strlen("signed_pre_key_") + 10, // strlen(UINT32_MAX) @@ -1036,13 +1028,13 @@ int spks_store_signed_pre_key(uint32_t signed_pre_key_id, uint8_t *record, size_ snprintf((char*)k_signed_pre_key.mv_data, k_signed_pre_key.mv_size + 1, "signed_pre_key_%-10u", signed_pre_key_id); - if (mdb_txn_begin(omemo->db->env, NULL, 0, &transaction)) { + if (mdb_txn_begin(omemo->db.env, NULL, 0, &transaction)) { weechat_printf(NULL, "%sxmpp: failed to open lmdb transaction", weechat_prefix("error")); return -1; } - if (mdb_put(transaction, omemo->db->dbi_omemo, &k_signed_pre_key, + if (mdb_put(transaction, omemo->db.dbi_omemo, &k_signed_pre_key, &v_signed_pre_key, 0)) { weechat_printf(NULL, "%sxmpp: failed to write lmdb value", weechat_prefix("error")); @@ -1063,7 +1055,7 @@ cleanup: int spks_contains_signed_pre_key(uint32_t signed_pre_key_id, void *user_data) { - struct t_omemo *omemo = (struct t_omemo *)user_data; + auto omemo = reinterpret_cast(user_data); MDB_txn *transaction = NULL; MDB_val k_signed_pre_key = { .mv_size = strlen("signed_pre_key_") + 10, // strlen(UINT32_MAX) @@ -1077,13 +1069,13 @@ int spks_contains_signed_pre_key(uint32_t signed_pre_key_id, void *user_data) snprintf((char*)k_signed_pre_key.mv_data, k_signed_pre_key.mv_size + 1, "signed_pre_key_%-10u", signed_pre_key_id); - if (mdb_txn_begin(omemo->db->env, NULL, MDB_RDONLY, &transaction)) { + if (mdb_txn_begin(omemo->db.env, NULL, MDB_RDONLY, &transaction)) { weechat_printf(NULL, "%sxmpp: failed to open lmdb transaction", weechat_prefix("error")); return -1; } - if (mdb_get(transaction, omemo->db->dbi_omemo, &k_signed_pre_key, + if (mdb_get(transaction, omemo->db.dbi_omemo, &k_signed_pre_key, &v_signed_pre_key)) { mdb_txn_abort(transaction); goto cleanup; @@ -1099,7 +1091,7 @@ cleanup: int spks_remove_signed_pre_key(uint32_t signed_pre_key_id, void *user_data) { - struct t_omemo *omemo = (struct t_omemo *)user_data; + auto omemo = reinterpret_cast(user_data); MDB_txn *transaction = NULL; MDB_val k_signed_pre_key = { .mv_size = strlen("signed_pre_key_") + 10, // strlen(UINT32_MAX) @@ -1113,13 +1105,13 @@ int spks_remove_signed_pre_key(uint32_t signed_pre_key_id, void *user_data) snprintf((char*)k_signed_pre_key.mv_data, k_signed_pre_key.mv_size + 1, "signed_pre_key_%-10u", signed_pre_key_id); - if (mdb_txn_begin(omemo->db->env, NULL, 0, &transaction)) { + if (mdb_txn_begin(omemo->db.env, NULL, 0, &transaction)) { weechat_printf(NULL, "%sxmpp: failed to open lmdb transaction", weechat_prefix("error")); return -1; } - if (mdb_del(transaction, omemo->db->dbi_omemo, &k_signed_pre_key, + if (mdb_del(transaction, omemo->db.dbi_omemo, &k_signed_pre_key, &v_signed_pre_key)) { weechat_printf(NULL, "%sxmpp: failed to erase lmdb value", weechat_prefix("error")); @@ -1140,14 +1132,14 @@ cleanup: void spks_destroy_func(void *user_data) { - struct t_omemo *omemo = (struct t_omemo *)user_data; + auto omemo = reinterpret_cast(user_data); (void) omemo; // Function called to perform cleanup when the data store context is being destroyed } -int ss_load_session_func(signal_buffer **record, signal_buffer **user_record, const signal_protocol_address *address, void *user_data) +int ss_load_session_func(struct signal_buffer **record, signal_buffer **user_record, const struct signal_protocol_address *address, void *user_data) { - struct t_omemo *omemo = (struct t_omemo *)user_data; + auto omemo = reinterpret_cast(user_data); MDB_txn *transaction = NULL; MDB_val k_session = { .mv_size = strlen("session_") + 10 + //strlen(address->device_id) + @@ -1171,15 +1163,15 @@ int ss_load_session_func(signal_buffer **record, signal_buffer **user_record, co snprintf((char*)k_user.mv_data, k_user.mv_size + 1, "user_%u_%s", address->device_id, address->name); - if (mdb_txn_begin(omemo->db->env, NULL, MDB_RDONLY, &transaction)) { + if (mdb_txn_begin(omemo->db.env, NULL, MDB_RDONLY, &transaction)) { weechat_printf(NULL, "%sxmpp: failed to open lmdb transaction", weechat_prefix("error")); return -1; } - if (mdb_get(transaction, omemo->db->dbi_omemo, + if (mdb_get(transaction, omemo->db.dbi_omemo, &k_session, &v_session)/* || - mdb_get(transaction, omemo->db->dbi_omemo, + mdb_get(transaction, omemo->db.dbi_omemo, &k_user, &v_user)*/) { mdb_txn_abort(transaction); @@ -1203,7 +1195,7 @@ cleanup: int ss_get_sub_device_sessions_func(signal_int_list **sessions, const char *name, size_t name_len, void *user_data) { - struct t_omemo *omemo = (struct t_omemo *)user_data; + auto omemo = reinterpret_cast(user_data); MDB_txn *transaction = NULL; MDB_val k_device_ids = { .mv_size = strlen("device_ids_") + name_len, @@ -1216,13 +1208,13 @@ int ss_get_sub_device_sessions_func(signal_int_list **sessions, const char *name snprintf((char*)k_device_ids.mv_data, k_device_ids.mv_size + 1, "device_ids_%s", name); - if (mdb_txn_begin(omemo->db->env, NULL, MDB_RDONLY, &transaction)) { + if (mdb_txn_begin(omemo->db.env, NULL, MDB_RDONLY, &transaction)) { weechat_printf(NULL, "%sxmpp: failed to open lmdb transaction", weechat_prefix("error")); return -1; } - if (!mdb_get(transaction, omemo->db->dbi_omemo, + if (!mdb_get(transaction, omemo->db.dbi_omemo, &k_device_ids, &v_device_ids)) { char **argv; @@ -1262,9 +1254,9 @@ cleanup: return -1; } -int ss_store_session_func(const signal_protocol_address *address, uint8_t *record, size_t record_len, uint8_t *user_record, size_t user_record_len, void *user_data) +int ss_store_session_func(const struct signal_protocol_address *address, uint8_t *record, size_t record_len, uint8_t *user_record, size_t user_record_len, void *user_data) { - struct t_omemo *omemo = (struct t_omemo *)user_data; + auto omemo = reinterpret_cast(user_data); MDB_txn *transaction = NULL; MDB_val k_session = { .mv_size = strlen("session_") + 10 + //strlen(address->device_id) + @@ -1290,15 +1282,15 @@ int ss_store_session_func(const signal_protocol_address *address, uint8_t *recor snprintf((char*)k_user.mv_data, k_user.mv_size + 1, "user_%u_%s", address->device_id, address->name); - if (mdb_txn_begin(omemo->db->env, NULL, 0, &transaction)) { + if (mdb_txn_begin(omemo->db.env, NULL, 0, &transaction)) { weechat_printf(NULL, "%sxmpp: failed to open lmdb transaction", weechat_prefix("error")); return -1; } - if (mdb_put(transaction, omemo->db->dbi_omemo, + if (mdb_put(transaction, omemo->db.dbi_omemo, &k_session, &v_session, 0)/* || - mdb_put(transaction, omemo->db->dbi_omemo, + mdb_put(transaction, omemo->db.dbi_omemo, &k_user, &v_user, 0)*/) { weechat_printf(NULL, "%sxmpp: failed to write lmdb value", weechat_prefix("error")); @@ -1317,9 +1309,9 @@ cleanup: return -1; } -int ss_contains_session_func(const signal_protocol_address *address, void *user_data) +int ss_contains_session_func(const struct signal_protocol_address *address, void *user_data) { - struct t_omemo *omemo = (struct t_omemo *)user_data; + auto omemo = reinterpret_cast(user_data); MDB_txn *transaction = NULL; MDB_val k_session = { .mv_size = strlen("session_") + 10 + //strlen(address->device_id) + @@ -1334,13 +1326,13 @@ int ss_contains_session_func(const signal_protocol_address *address, void *user_ snprintf((char*)k_session.mv_data, k_session.mv_size + 1, "session_%u_%s", address->device_id, address->name); - if (mdb_txn_begin(omemo->db->env, NULL, MDB_RDONLY, &transaction)) { + if (mdb_txn_begin(omemo->db.env, NULL, MDB_RDONLY, &transaction)) { weechat_printf(NULL, "%sxmpp: failed to open lmdb transaction", weechat_prefix("error")); return 0; } - if (mdb_get(transaction, omemo->db->dbi_omemo, &k_session, &v_session)) { + if (mdb_get(transaction, omemo->db.dbi_omemo, &k_session, &v_session)) { mdb_txn_abort(transaction); return 0; }; @@ -1349,9 +1341,9 @@ int ss_contains_session_func(const signal_protocol_address *address, void *user_ return 1; } -int ss_delete_session_func(const signal_protocol_address *address, void *user_data) +int ss_delete_session_func(const struct signal_protocol_address *address, void *user_data) { - struct t_omemo *omemo = (struct t_omemo *)user_data; + auto omemo = reinterpret_cast(user_data); MDB_txn *transaction = NULL; MDB_val k_session = { .mv_size = strlen("session_") + 10 + //strlen(address->device_id) + @@ -1366,13 +1358,13 @@ int ss_delete_session_func(const signal_protocol_address *address, void *user_da snprintf((char*)k_session.mv_data, k_session.mv_size + 1, "session_%u_%s", address->device_id, address->name); - if (mdb_txn_begin(omemo->db->env, NULL, 0, &transaction)) { + if (mdb_txn_begin(omemo->db.env, NULL, 0, &transaction)) { weechat_printf(NULL, "%sxmpp: failed to open lmdb transaction", weechat_prefix("error")); return -1; } - if (mdb_del(transaction, omemo->db->dbi_omemo, &k_session, &v_session)) { + if (mdb_del(transaction, omemo->db.dbi_omemo, &k_session, &v_session)) { weechat_printf(NULL, "%sxmpp: failed to erase lmdb value", weechat_prefix("error")); goto cleanup; @@ -1398,7 +1390,7 @@ int ss_delete_all_sessions_func(const char *name, size_t name_len, void *user_da int n = signal_int_list_size(sessions); for (int i = 0; i < n; i++) { - signal_protocol_address address = {.name = name, .name_len = name_len, + struct signal_protocol_address address = {.name = name, .name_len = name_len, .device_id = signal_int_list_at(sessions, i)}; ss_delete_session_func(&address, user_data); } @@ -1408,14 +1400,14 @@ int ss_delete_all_sessions_func(const char *name, size_t name_len, void *user_da void ss_destroy_func(void *user_data) { - struct t_omemo *omemo = (struct t_omemo *)user_data; + auto omemo = reinterpret_cast(user_data); (void) omemo; // Function called to perform cleanup when the data store context is being destroyed } int sks_store_sender_key(const signal_protocol_sender_key_name *sender_key_name, uint8_t *record, size_t record_len, uint8_t *user_record, size_t user_record_len, void *user_data) { - struct t_omemo *omemo = (struct t_omemo *)user_data; + auto omemo = reinterpret_cast(user_data); char *device_list = NULL; MDB_txn *transaction = NULL; MDB_val k_sender_key = { @@ -1457,13 +1449,13 @@ int sks_store_sender_key(const signal_protocol_sender_key_name *sender_key_name, snprintf((char*)k_device_ids.mv_data, k_device_ids.mv_size + 1, "device_ids_%s", sender_key_name->sender.name); - if (mdb_txn_begin(omemo->db->env, NULL, 0, &transaction)) { + if (mdb_txn_begin(omemo->db.env, NULL, 0, &transaction)) { weechat_printf(NULL, "%sxmpp: failed to open lmdb transaction", weechat_prefix("error")); return -1; } - if (!mdb_get(transaction, omemo->db->dbi_omemo, + if (!mdb_get(transaction, omemo->db.dbi_omemo, &k_device_ids, &v_device_ids)) { char **argv; @@ -1496,11 +1488,11 @@ int sks_store_sender_key(const signal_protocol_sender_key_name *sender_key_name, v_device_ids.mv_size = strlen(device_list) + 1; } - if (mdb_put(transaction, omemo->db->dbi_omemo, + if (mdb_put(transaction, omemo->db.dbi_omemo, &k_sender_key, &v_sender_key, 0)/* || - mdb_put(transaction, omemo->db->dbi_omemo, + mdb_put(transaction, omemo->db.dbi_omemo, &k_user, &v_user, 0)*/ || - mdb_put(transaction, omemo->db->dbi_omemo, + mdb_put(transaction, omemo->db.dbi_omemo, &k_device_ids, &v_device_ids, 0)) { weechat_printf(NULL, "%sxmpp: failed to write lmdb value", weechat_prefix("error")); @@ -1521,9 +1513,9 @@ cleanup: return -1; } -int sks_load_sender_key(signal_buffer **record, signal_buffer **user_record, const signal_protocol_sender_key_name *sender_key_name, void *user_data) +int sks_load_sender_key(struct signal_buffer **record, signal_buffer **user_record, const signal_protocol_sender_key_name *sender_key_name, void *user_data) { - struct t_omemo *omemo = (struct t_omemo *)user_data; + auto omemo = reinterpret_cast(user_data); MDB_txn *transaction = NULL; MDB_val k_sender_key = { .mv_size = strlen("sender_key_") + strlen(sender_key_name->group_id) + @@ -1555,15 +1547,15 @@ int sks_load_sender_key(signal_buffer **record, signal_buffer **user_record, con sender_key_name->sender.device_id, sender_key_name->sender.name); - if (mdb_txn_begin(omemo->db->env, NULL, 0, &transaction)) { + if (mdb_txn_begin(omemo->db.env, NULL, 0, &transaction)) { weechat_printf(NULL, "%sxmpp: failed to open lmdb transaction", weechat_prefix("error")); return -1; } - if (mdb_get(transaction, omemo->db->dbi_omemo, + if (mdb_get(transaction, omemo->db.dbi_omemo, &k_sender_key, &v_sender_key)/* && - mdb_get(transaction, omemo->db->dbi_omemo, + mdb_get(transaction, omemo->db.dbi_omemo, &k_user, &v_user)*/) { *record = signal_buffer_create((const uint8_t*)v_sender_key.mv_data, v_sender_key.mv_size); @@ -1588,12 +1580,12 @@ cleanup: void sks_destroy_func(void *user_data) { - struct t_omemo *omemo = (struct t_omemo *)user_data; + auto omemo = reinterpret_cast(user_data); (void) omemo; // Function called to perform cleanup when the data store context is being destroyed } -int dls_store_devicelist(const char *jid, signal_int_list *devicelist, struct t_omemo *omemo) +int dls_store_devicelist(const char *jid, signal_int_list *devicelist, t_omemo *omemo) { MDB_txn *transaction = NULL; MDB_val k_devicelist = { @@ -1620,13 +1612,13 @@ int dls_store_devicelist(const char *jid, signal_int_list *devicelist, struct t_ v_devicelist.mv_size = strlen((const char*)v_devicelist.mv_data); for (char **device = (char **)devices; *device; device++) free(*device); - if (mdb_txn_begin(omemo->db->env, NULL, 0, &transaction)) { + if (mdb_txn_begin(omemo->db.env, NULL, 0, &transaction)) { weechat_printf(NULL, "%sxmpp: failed to open lmdb transaction", weechat_prefix("error")); return -1; } - if (mdb_put(transaction, omemo->db->dbi_omemo, &k_devicelist, + if (mdb_put(transaction, omemo->db.dbi_omemo, &k_devicelist, &v_devicelist, 0)) { weechat_printf(NULL, "%sxmpp: failed to write lmdb value", weechat_prefix("error")); @@ -1645,7 +1637,7 @@ cleanup: return -1; } -int dls_load_devicelist(signal_int_list **devicelist, const char *jid, struct t_omemo *omemo) +int dls_load_devicelist(signal_int_list **devicelist, const char *jid, t_omemo *omemo) { MDB_txn *transaction = NULL; MDB_val k_devicelist = { @@ -1663,13 +1655,13 @@ int dls_load_devicelist(signal_int_list **devicelist, const char *jid, struct t_ int devices_len = 0; char **devices = weechat_string_split((const char*)v_devicelist.mv_data, ";", NULL, 0, 0, &devices_len); - if (mdb_txn_begin(omemo->db->env, NULL, MDB_RDONLY, &transaction)) { + if (mdb_txn_begin(omemo->db.env, NULL, MDB_RDONLY, &transaction)) { weechat_printf(NULL, "%sxmpp: failed to open lmdb transaction", weechat_prefix("error")); return -1; } - if (mdb_get(transaction, omemo->db->dbi_omemo, + if (mdb_get(transaction, omemo->db.dbi_omemo, &k_devicelist, &v_devicelist)) { goto cleanup; @@ -1695,9 +1687,9 @@ cleanup: return -1; } -int bks_store_bundle(signal_protocol_address *address, +int bks_store_bundle(struct signal_protocol_address *address, struct t_pre_key **pre_keys, struct t_pre_key **signed_pre_keys, - const char *signature, const char *identity_key, struct t_omemo *omemo) + const char *signature, const char *identity_key, t_omemo *omemo) { size_t n_pre_keys = -1; while (pre_keys[++n_pre_keys] != NULL); @@ -1730,7 +1722,7 @@ int bks_store_bundle(signal_protocol_address *address, strlen(identity_key), &signing_key_buf); ec_public_key *signing_key; if ((ret = curve_decode_point(&signing_key, signing_key_buf, - signing_key_len, omemo->context))) { + signing_key_len, omemo->context.get()))) { weechat_printf(NULL, "%sxmpp: failed to decode ED25519 prekey", weechat_prefix("error")); return -1; @@ -1800,20 +1792,20 @@ int bks_store_bundle(signal_protocol_address *address, .mv_data = (char*)identity_key, }; - if (mdb_txn_begin(omemo->db->env, NULL, 0, &transaction)) { + if (mdb_txn_begin(omemo->db.env, NULL, 0, &transaction)) { weechat_printf(NULL, "%sxmpp: failed to open lmdb transaction", weechat_prefix("error")); return -1; } int ret; - if ((ret = mdb_put(transaction, omemo->db->dbi_omemo, &k_bundle_pk, + if ((ret = mdb_put(transaction, omemo->db.dbi_omemo, &k_bundle_pk, &v_bundle_pk, 0)) || - (ret = mdb_put(transaction, omemo->db->dbi_omemo, &k_bundle_sk, + (ret = mdb_put(transaction, omemo->db.dbi_omemo, &k_bundle_sk, &v_bundle_sk, 0)) || - (ret = mdb_put(transaction, omemo->db->dbi_omemo, &k_bundle_sg, + (ret = mdb_put(transaction, omemo->db.dbi_omemo, &k_bundle_sg, &v_bundle_sg, 0)) || - (ret = mdb_put(transaction, omemo->db->dbi_omemo, &k_bundle_ik, + (ret = mdb_put(transaction, omemo->db.dbi_omemo, &k_bundle_ik, &v_bundle_ik, 0))) { weechat_printf(NULL, "%sxmpp: failed to write lmdb value '%s'@%u: %s", weechat_prefix("error"), v_bundle_pk.mv_data, v_bundle_pk.mv_size, mdb_strerror(ret)); @@ -1832,7 +1824,7 @@ cleanup: return -1; } -int bks_load_bundle(session_pre_key_bundle **bundle, signal_protocol_address *address, struct t_omemo *omemo) +int bks_load_bundle(session_pre_key_bundle **bundle, struct signal_protocol_address *address, t_omemo *omemo) { MDB_txn *transaction = NULL; const char *jid = address->name; @@ -1869,7 +1861,7 @@ int bks_load_bundle(session_pre_key_bundle **bundle, signal_protocol_address *ad MDB_val v_bundle_ik; int ret; - if ((ret = mdb_txn_begin(omemo->db->env, NULL, MDB_RDONLY, &transaction))) { + if ((ret = mdb_txn_begin(omemo->db.env, NULL, MDB_RDONLY, &transaction))) { weechat_printf(NULL, "%sxmpp: failed to open lmdb transaction", weechat_prefix("error")); return -1; @@ -1885,16 +1877,16 @@ int bks_load_bundle(session_pre_key_bundle **bundle, signal_protocol_address *ad uint32_t pre_key_id; uint32_t signed_pre_key_id; uint8_t *sig_buf; size_t sig_len; - signal_buffer *signature; + struct signal_buffer *signature; uint8_t *key_buf; size_t key_len; - if ((ret = mdb_get(transaction, omemo->db->dbi_omemo, + if ((ret = mdb_get(transaction, omemo->db.dbi_omemo, &k_bundle_pk, &v_bundle_pk)) || - (ret = mdb_get(transaction, omemo->db->dbi_omemo, + (ret = mdb_get(transaction, omemo->db.dbi_omemo, &k_bundle_sk, &v_bundle_sk)) || - (ret = mdb_get(transaction, omemo->db->dbi_omemo, + (ret = mdb_get(transaction, omemo->db.dbi_omemo, &k_bundle_sg, &v_bundle_sg)) || - (ret = mdb_get(transaction, omemo->db->dbi_omemo, + (ret = mdb_get(transaction, omemo->db.dbi_omemo, &k_bundle_ik, &v_bundle_ik))) { goto cleanup; @@ -1910,7 +1902,7 @@ int bks_load_bundle(session_pre_key_bundle **bundle, signal_protocol_address *ad char *key_data = (char *)memchr(bundle_pk, '.', 10 + 1) + 1; uint8_t *key_buf; size_t key_len = base64_decode(key_data, strlen(key_data), &key_buf); - if ((ret = curve_decode_point(&pre_key, key_buf, key_len, omemo->context))) { + if ((ret = curve_decode_point(&pre_key, key_buf, key_len, omemo->context.get()))) { weechat_printf(NULL, "%sxmpp: failed to decode ED25519 prekey", weechat_prefix("error")); goto cleanup; @@ -1924,7 +1916,7 @@ int bks_load_bundle(session_pre_key_bundle **bundle, signal_protocol_address *ad char *key_data = (char *)memchr(bundle_sk, '.', 10 + 1) + 1; uint8_t *key_buf; size_t key_len = base64_decode(key_data, strlen(key_data), &key_buf); - if ((ret = curve_decode_point(&signed_pre_key, key_buf, key_len, omemo->context))) { + if ((ret = curve_decode_point(&signed_pre_key, key_buf, key_len, omemo->context.get()))) { weechat_printf(NULL, "%sxmpp: failed to decode ED25519 signed prekey", weechat_prefix("error")); goto cleanup; @@ -1933,7 +1925,7 @@ int bks_load_bundle(session_pre_key_bundle **bundle, signal_protocol_address *ad sig_len = base64_decode((const char*)v_bundle_sg.mv_data, v_bundle_sg.mv_size, &sig_buf); signature = signal_buffer_create(sig_buf, sig_len); key_len = base64_decode((const char*)v_bundle_ik.mv_data, v_bundle_ik.mv_size, &key_buf); - if ((ret = curve_decode_point(&identity_key, key_buf, key_len, omemo->context))) { + if ((ret = curve_decode_point(&identity_key, key_buf, key_len, omemo->context.get()))) { weechat_printf(NULL, "%sxmpp: failed to decode ED25519 identity key", weechat_prefix("error")); goto cleanup; @@ -1960,7 +1952,8 @@ cleanup: return -1; } -void omemo__log_emit_weechat(int level, const char *message, size_t len, void *user_data) +extern "C" +void log_emit_weechat(int level, const char *message, size_t len, void *user_data) { struct t_gui_buffer *buffer = (struct t_gui_buffer*)user_data; @@ -1976,12 +1969,13 @@ void omemo__log_emit_weechat(int level, const char *message, size_t len, void *u log_level_name[level], len, message); } -xmpp_stanza_t *omemo__get_bundle(xmpp_ctx_t *context, char *from, char *to, - struct t_omemo *omemo) +xmpp_stanza_t *omemo::get_bundle(xmpp_ctx_t *context, char *from, char *to) { + auto omemo = this; + xmpp_stanza_t **children = (xmpp_stanza_t **)malloc(sizeof(*children) * (100 + 1)); xmpp_stanza_t *parent = NULL; - signal_buffer *record = NULL; + struct signal_buffer *record = NULL; ec_key_pair *keypair = NULL; ec_public_key *public_key = NULL; @@ -1993,7 +1987,7 @@ xmpp_stanza_t *omemo__get_bundle(xmpp_ctx_t *context, char *from, char *to, else num_keys++; session_pre_key *pre_key = NULL; session_pre_key_deserialize(&pre_key, signal_buffer_data(record), - signal_buffer_len(record), omemo->context); + signal_buffer_len(record), omemo->context.get()); if (pre_key == 0) (*((int*)0))++; signal_buffer_free(record); keypair = session_pre_key_get_key_pair(pre_key); @@ -2021,7 +2015,7 @@ xmpp_stanza_t *omemo__get_bundle(xmpp_ctx_t *context, char *from, char *to, session_signed_pre_key *signed_pre_key; session_signed_pre_key_deserialize(&signed_pre_key, signal_buffer_data(record), signal_buffer_len(record), - omemo->context); + omemo->context.get()); signal_buffer_free(record); uint32_t signed_pre_key_id = session_signed_pre_key_get_id(signed_pre_key); keypair = session_signed_pre_key_get_key_pair(signed_pre_key); @@ -2069,7 +2063,7 @@ xmpp_stanza_t *omemo__get_bundle(xmpp_ctx_t *context, char *from, char *to, children[0] = stanza__iq_pubsub_publish( context, NULL, children, with_free(bundle_node)); - omemo__handle_bundle(omemo, from, omemo->device_id, children[0]); + omemo->handle_bundle(from, omemo->device_id, children[0]); children[0] = stanza__iq_pubsub( context, NULL, children, with_noop("http://jabber.org/protocol/pubsub")); @@ -2081,41 +2075,35 @@ xmpp_stanza_t *omemo__get_bundle(xmpp_ctx_t *context, char *from, char *to, return parent; } -void omemo__init(struct t_gui_buffer *buffer, struct t_omemo **omemo, - const char *account_name) +void omemo::init(struct t_gui_buffer *buffer, const char *account_name) { - struct t_omemo *new_omemo; + gcry_check_version(nullptr); - gcry_check_version(NULL); + auto omemo = this; - new_omemo = (struct t_omemo*)calloc(1, sizeof(**omemo)); + struct signal_context *context; + signal_context_create(&context, buffer); + omemo->context.reset(context); + signal_context_set_log_function(omemo->context.get(), &log_emit_weechat); - new_omemo->db = (struct t_omemo_db*)malloc(sizeof(struct t_omemo_db)); - - signal_context_create(&new_omemo->context, buffer); - signal_context_set_log_function(new_omemo->context, &omemo__log_emit_weechat); + try { + omemo->db_path = std::shared_ptr( + weechat_string_eval_expression("${weechat_data_dir}/xmpp.omemo.db", + NULL, NULL, NULL), + &free).get(); - int ret; - mdb_env_create(&new_omemo->db->env); - mdb_env_set_maxdbs(new_omemo->db->env, 50); - mdb_env_set_mapsize(new_omemo->db->env, (size_t)1048576 * 8000); // 8000MB map for valgrind - new_omemo->db_path = weechat_string_eval_expression( - "${weechat_data_dir}/xmpp.omemo.db", NULL, NULL, NULL); - if ((ret = mdb_env_open(new_omemo->db->env, new_omemo->db_path, MDB_NOSUBDIR, 0664)) != 0) - { - weechat_printf(NULL, "%sxmpp: failed to open environment file. %s", - weechat_prefix("error"), mdb_strerror(ret)); - return; - } + lmdb::env &env = omemo->db.env; + env = lmdb::env::create(); + env.open(omemo->db_path.data(), MDB_NOSUBDIR, 0664); + env.set_max_dbs(50); + env.set_mapsize((size_t)1048576 * 8000); // 8000MB map for valgrind + env.open(omemo->db_path.data(), MDB_NOSUBDIR, 0664); - try { - MDB_txn *parentTransaction = NULL; - lmdb::txn transaction = lmdb::txn::begin(new_omemo->db->env, parentTransaction); + lmdb::txn parentTransaction(nullptr); + lmdb::txn transaction = lmdb::txn::begin(omemo->db.env, parentTransaction); - size_t db_name_len = strlen("omemo_") + strlen(account_name); - char *db_name = (char *)malloc(sizeof(char) * (db_name_len + 1)); - snprintf(db_name, db_name_len+1, "omemo_%s", account_name); - new_omemo->db->dbi_omemo = lmdb::dbi::open(transaction, db_name, MDB_CREATE); + std::string db_name = fmt::format("omemo_{}", account_name); + omemo->db.dbi_omemo = lmdb::dbi::open(transaction, db_name.data(), MDB_CREATE); transaction.commit(); } catch (const std::exception& ex) { @@ -2136,13 +2124,15 @@ void omemo__init(struct t_gui_buffer *buffer, struct t_omemo **omemo, .sha512_digest_cleanup_func = &cp_sha512_digest_cleanup, .encrypt_func = &cp_encrypt, .decrypt_func = &cp_decrypt, - .user_data = new_omemo, + .user_data = omemo, }; - signal_context_set_crypto_provider(new_omemo->context, &crypto_provider); - signal_context_set_locking_functions(new_omemo->context, &lock_function, &unlock_function); + signal_context_set_crypto_provider(omemo->context.get(), &crypto_provider); + signal_context_set_locking_functions(omemo->context.get(), &lock_function, &unlock_function); - signal_protocol_store_context_create(&new_omemo->store_context, new_omemo->context); + struct signal_protocol_store_context *store_context; + signal_protocol_store_context_create(&store_context, omemo->context.get()); + omemo->store_context.reset(store_context); struct signal_protocol_identity_key_store identity_key_store = { .get_identity_key_pair = &iks_get_identity_key_pair, @@ -2150,11 +2140,11 @@ void omemo__init(struct t_gui_buffer *buffer, struct t_omemo **omemo, .save_identity = &iks_save_identity, .is_trusted_identity = &iks_is_trusted_identity, .destroy_func = &iks_destroy_func, - .user_data = new_omemo, + .user_data = omemo, }; signal_protocol_store_context_set_identity_key_store( - new_omemo->store_context, &identity_key_store); + omemo->store_context.get(), &identity_key_store); struct signal_protocol_pre_key_store pre_key_store = { .load_pre_key = &pks_load_pre_key, @@ -2162,11 +2152,11 @@ void omemo__init(struct t_gui_buffer *buffer, struct t_omemo **omemo, .contains_pre_key = &pks_contains_pre_key, .remove_pre_key = &pks_remove_pre_key, .destroy_func = &pks_destroy_func, - .user_data = new_omemo, + .user_data = omemo, }; signal_protocol_store_context_set_pre_key_store( - new_omemo->store_context, &pre_key_store); + omemo->store_context.get(), &pre_key_store); struct signal_protocol_signed_pre_key_store signed_pre_key_store = { .load_signed_pre_key = &spks_load_signed_pre_key, @@ -2174,11 +2164,11 @@ void omemo__init(struct t_gui_buffer *buffer, struct t_omemo **omemo, .contains_signed_pre_key = &spks_contains_signed_pre_key, .remove_signed_pre_key = &spks_remove_signed_pre_key, .destroy_func = &spks_destroy_func, - .user_data = new_omemo, + .user_data = omemo, }; signal_protocol_store_context_set_signed_pre_key_store( - new_omemo->store_context, &signed_pre_key_store); + omemo->store_context.get(), &signed_pre_key_store); struct signal_protocol_session_store session_store = { .load_session_func = &ss_load_session_func, @@ -2188,44 +2178,43 @@ void omemo__init(struct t_gui_buffer *buffer, struct t_omemo **omemo, .delete_session_func = &ss_delete_session_func, .delete_all_sessions_func = &ss_delete_all_sessions_func, .destroy_func = &ss_destroy_func, - .user_data = new_omemo, + .user_data = omemo, }; signal_protocol_store_context_set_session_store( - new_omemo->store_context, &session_store); + omemo->store_context.get(), &session_store); struct signal_protocol_sender_key_store sender_key_store = { .store_sender_key = &sks_store_sender_key, .load_sender_key = &sks_load_sender_key, .destroy_func = &sks_destroy_func, - .user_data = new_omemo, + .user_data = omemo, }; signal_protocol_store_context_set_sender_key_store( - new_omemo->store_context, &sender_key_store); + omemo->store_context.get(), &sender_key_store); - signal_buffer *public_data, *private_data; - iks_get_local_registration_id(new_omemo, &new_omemo->device_id); - if (!iks_get_identity_key_pair(&public_data, &private_data, new_omemo)) + struct signal_buffer *public_data, *private_data; + iks_get_local_registration_id(omemo, &omemo->device_id); + if (!iks_get_identity_key_pair(&public_data, &private_data, omemo)) { - ec_public_key *public_key = NULL; - ec_private_key *private_key = NULL; + struct ec_public_key *public_key = NULL; + struct ec_private_key *private_key = NULL; curve_decode_point(&public_key, signal_buffer_data(public_data), - signal_buffer_len(public_data), new_omemo->context); + signal_buffer_len(public_data), omemo->context.get()); curve_decode_private_point(&private_key, signal_buffer_data(private_data), - signal_buffer_len(private_data), new_omemo->context); - ratchet_identity_key_pair_create(&new_omemo->identity, public_key, private_key); + signal_buffer_len(private_data), omemo->context.get()); + struct ratchet_identity_key_pair *key_pair; + ratchet_identity_key_pair_create(&key_pair, public_key, private_key); + omemo->identity.reset(key_pair); } weechat_printf(buffer, "%somemo: device = %d", - weechat_prefix("info"), new_omemo->device_id); - - *omemo = new_omemo; + weechat_prefix("info"), omemo->device_id); } -void omemo__handle_devicelist(struct t_omemo *omemo, const char *jid, - xmpp_stanza_t *items) +void omemo::handle_devicelist(const char *jid, xmpp_stanza_t *items) { - (void) omemo; + auto omemo = this; xmpp_stanza_t *item = xmpp_stanza_get_child_by_name(items, "item"); if (!item) return; @@ -2251,9 +2240,10 @@ void omemo__handle_devicelist(struct t_omemo *omemo, const char *jid, signal_int_list_free(devicelist); } -void omemo__handle_bundle(struct t_omemo *omemo, const char *jid, - uint32_t device_id, xmpp_stanza_t *items) +void omemo::handle_bundle(const char *jid, uint32_t device_id, + xmpp_stanza_t *items) { + auto omemo = this; xmpp_stanza_t *item = xmpp_stanza_get_child_by_name(items, "item"); if (!item) return; xmpp_stanza_t *bundle = xmpp_stanza_get_child_by_name(item, "bundle"); @@ -2316,25 +2306,25 @@ void omemo__handle_bundle(struct t_omemo *omemo, const char *jid, }; struct t_pre_key *signed_pre_keys[2] = { &signed_key, NULL }; - signal_protocol_address address = { + struct signal_protocol_address address = { .name = jid, .name_len = strlen(jid), .device_id = (int32_t)device_id }; { ec_public_key *key; uint8_t *key_buf; size_t key_len = base64_decode(identity_key, strlen(identity_key), &key_buf); - curve_decode_point(&key, key_buf, key_len, omemo->context); - signal_protocol_identity_save_identity(omemo->store_context, + curve_decode_point(&key, key_buf, key_len, omemo->context.get()); + signal_protocol_identity_save_identity(omemo->store_context.get(), &address, key); } bks_store_bundle(&address, pre_keys, signed_pre_keys, key_signature, identity_key, omemo); } -char *omemo__decode(struct t_account *account, const char *jid, +char *omemo::decode(struct t_account *account, const char *jid, xmpp_stanza_t *encrypted) { - struct t_omemo *omemo = account->omemo; + auto omemo = &account->omemo; uint8_t *key_data = NULL, *tag_data = NULL, *iv_data = NULL, *payload_data = NULL; size_t key_len = 0, tag_len = 0, iv_len = 0, payload_len = 0; @@ -2380,37 +2370,37 @@ char *omemo__decode(struct t_account *account, const char *jid, continue; int ret; - signal_protocol_address address = { + struct signal_protocol_address address = { .name = jid, .name_len = strlen(jid), .device_id = (int32_t)strtol(source_id, NULL, 10) }; signal_message *key_message = NULL; - signal_buffer *aes_key = NULL; + struct signal_buffer *aes_key = NULL; if (key_prekey) { pre_key_signal_message *pre_key_message = NULL; if ((ret = pre_key_signal_message_deserialize(&pre_key_message, - key_data, key_len, omemo->context))) return NULL; + key_data, key_len, omemo->context.get()))) return NULL; ec_public_key *identity_key = pre_key_signal_message_get_identity_key(pre_key_message); //uint32_t device_id = pre_key_signal_message_get_registration_id(pre_key_message); //uint32_t pre_key_id = pre_key_signal_message_get_pre_key_id(pre_key_message); //uint32_t signed_key_id = pre_key_signal_message_get_signed_pre_key_id(pre_key_message); //ec_public_key *base_key = pre_key_signal_message_get_base_key(pre_key_message); key_message = pre_key_signal_message_get_signal_message(pre_key_message); - signal_buffer *identity_buf; + struct signal_buffer *identity_buf; if ((ret = ec_public_key_serialize(&identity_buf, identity_key))) return NULL; if ((ret = iks_save_identity(&address, signal_buffer_data(identity_buf), signal_buffer_len(identity_buf), omemo))) return NULL; - session_cipher *cipher; - if ((ret = session_cipher_create(&cipher, omemo->store_context, - &address, omemo->context))) return NULL; + struct session_cipher *cipher; + if ((ret = session_cipher_create(&cipher, omemo->store_context.get(), + &address, omemo->context.get()))) return NULL; if ((ret = session_cipher_decrypt_pre_key_signal_message(cipher, pre_key_message, 0, &aes_key))) return NULL; } else { if ((ret = signal_message_deserialize(&key_message, - key_data, key_len, omemo->context))) return NULL; - session_cipher *cipher; - if ((ret = session_cipher_create(&cipher, omemo->store_context, - &address, omemo->context))) return NULL; + key_data, key_len, omemo->context.get()))) return NULL; + struct session_cipher *cipher; + if ((ret = session_cipher_create(&cipher, omemo->store_context.get(), + &address, omemo->context.get()))) return NULL; if ((ret = session_cipher_decrypt_signal_message(cipher, key_message, 0, &aes_key))) return NULL; } @@ -2473,10 +2463,10 @@ char *omemo__decode(struct t_account *account, const char *jid, return NULL; } -xmpp_stanza_t *omemo__encode(struct t_account *account, const char *jid, +xmpp_stanza_t *omemo::encode(struct t_account *account, const char *jid, const char *unencrypted) { - struct t_omemo *omemo = account->omemo; + auto omemo = &account->omemo; uint8_t *key = NULL; uint8_t *iv = NULL; uint8_t *tag = NULL; size_t tag_len = 0; uint8_t *ciphertext = NULL; size_t ciphertext_len = 0; @@ -2516,7 +2506,7 @@ xmpp_stanza_t *omemo__encode(struct t_account *account, const char *jid, for (size_t i = 0; i < signal_int_list_size(devicelist); i++) { uint32_t device_id = signal_int_list_at(devicelist, i); - signal_protocol_address address = { + struct signal_protocol_address address = { .name = target, .name_len = strlen(target), .device_id = (int32_t)device_id}; xmpp_stanza_t *header__key = xmpp_stanza_new(account->context); @@ -2525,22 +2515,22 @@ xmpp_stanza_t *omemo__encode(struct t_account *account, const char *jid, snprintf(device_id_str, 10+1, "%u", device_id); xmpp_stanza_set_attribute(header__key, "rid", device_id_str); - session_builder *builder = NULL; + struct session_builder *builder = NULL; if (((ret = ss_contains_session_func(&address, omemo))) <= 0) { session_pre_key_bundle *bundle; if ((ret = bks_load_bundle(&bundle, &address, omemo))) continue; - if ((ret = session_builder_create(&builder, omemo->store_context, &address, omemo->context))) continue; + if ((ret = session_builder_create(&builder, omemo->store_context.get(), &address, omemo->context.get()))) continue; if ((ret = session_builder_process_pre_key_bundle(builder, bundle))) continue; } - session_cipher *cipher; - if ((ret = session_cipher_create(&cipher, omemo->store_context, &address, omemo->context))) continue; + struct session_cipher *cipher; + if ((ret = session_cipher_create(&cipher, omemo->store_context.get(), &address, omemo->context.get()))) continue; - ciphertext_message *signal_message; + struct ciphertext_message *signal_message; if ((ret = session_cipher_encrypt(cipher, key_and_tag, AES_KEY_SIZE+tag_len, &signal_message))) continue; - signal_buffer *record = ciphertext_message_get_serialized(signal_message); + struct signal_buffer *record = ciphertext_message_get_serialized(signal_message); int prekey = ciphertext_message_get_type(signal_message) == CIPHERTEXT_PREKEY_TYPE ? 1 : 0; @@ -2589,18 +2579,6 @@ xmpp_stanza_t *omemo__encode(struct t_account *account, const char *jid, return encrypted; } -void omemo__free(struct t_omemo *omemo) +omemo::~omemo() { - if (omemo) - { - if (omemo->context) { - signal_context_destroy(omemo->context); - signal_protocol_store_context_destroy(omemo->store_context); - } - if (omemo->identity) - ratchet_identity_key_pair_destroy( - (signal_type_base *)omemo->identity); - free(omemo->db_path); - free(omemo); - } } diff --git a/omemo.hh b/omemo.hh index 80c9ebe..73b9b9e 100644 --- a/omemo.hh +++ b/omemo.hh @@ -2,56 +2,78 @@ // License, version 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. -#ifndef _WEECHAT_XMPP_OMEMO_H_ -#define _WEECHAT_XMPP_OMEMO_H_ +#pragma once -extern const char *OMEMO_ADVICE; +#include +#include +#include +#include +#include +#include +#include -struct t_omemo -{ - struct signal_context *context; - struct signal_protocol_store_context *store_context; +#include "signal.hh" +struct t_account; - struct t_omemo_db *db; - char *db_path; +extern const char *OMEMO_ADVICE; - struct ratchet_identity_key_pair *identity; +namespace weechat::xmpp { - uint32_t device_id; +struct t_pre_key { + const char *id; + const char *public_key; }; -struct t_omemo_bundle_req +struct omemo { - char *id; - char *jid; - char *device; - char *message_text; -}; + libsignal::context context; + libsignal::store_context store_context; -struct t_omemo_devicelist_req -{ - char *id; - struct t_omemo_bundle_req bundle_req; -}; + struct { + lmdb::env env; + lmdb::dbi dbi_omemo; + } db; + std::string db_path; -xmpp_stanza_t *omemo__get_bundle(xmpp_ctx_t *context, char *from, char *to, - struct t_omemo *omemo); + libsignal::identity_key_pair identity; -void omemo__init(struct t_gui_buffer *buffer, struct t_omemo **omemo, - const char *account_name); + std::uint32_t device_id; -void omemo__handle_devicelist(struct t_omemo *omemo, const char *jid, - xmpp_stanza_t *items); + class bundle_request + { + public: + std::string id; + std::string jid; + std::string device; + std::string message_text; + }; -void omemo__handle_bundle(struct t_omemo *omemo, const char *jid, - uint32_t device_id, xmpp_stanza_t *items); + class devicelist_request + { + public: + std::string id; + bundle_request bundle_req; + }; -char *omemo__decode(struct t_account *account, const char *jid, - xmpp_stanza_t *encrypted); + ~omemo(); -xmpp_stanza_t *omemo__encode(struct t_account *account, const char *jid, - const char *unencrypted); + inline operator bool() { return this->context && this->store_context && + this->identity && this->device_id != 0; } -void omemo__free(struct t_omemo *omemo); + xmpp_stanza_t *get_bundle(xmpp_ctx_t *context, char *from, char *to); + + void init(struct t_gui_buffer *buffer, const char *account_name); + + void handle_devicelist(const char *jid, xmpp_stanza_t *items); + + void handle_bundle(const char *jid, std::uint32_t device_id, + xmpp_stanza_t *items); + + char *decode(struct t_account *account, const char *jid, + xmpp_stanza_t *encrypted); + + xmpp_stanza_t *encode(struct t_account *account, const char *jid, + const char *unencrypted); +}; -#endif /*WEECHAT_XMPP_OMEMO_H*/ +} diff --git a/pgp.hh b/pgp.hh index 0e12e6a..fa86414 100644 --- a/pgp.hh +++ b/pgp.hh @@ -2,8 +2,7 @@ // License, version 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. -#ifndef _WEECHAT_XMPP_PGP_H_ -#define _WEECHAT_XMPP_PGP_H_ +#pragma once extern const char *PGP_ADVICE; @@ -24,5 +23,3 @@ char *pgp__encrypt(struct t_gui_buffer *buffer, struct t_pgp *pgp, const char *s char *pgp__verify(struct t_gui_buffer *buffer, struct t_pgp *pgp, const char *certificate); char *pgp__sign(struct t_gui_buffer *buffer, struct t_pgp *pgp, const char *source, const char *message); - -#endif /*WEECHAT_XMPP_PGP_H*/ diff --git a/plugin.cpp b/plugin.cpp index a186495..f5f35ca 100644 --- a/plugin.cpp +++ b/plugin.cpp @@ -18,7 +18,14 @@ #include "buffer.hh" #include "completion.hh" +struct t_weechat_plugin *weechat_xmpp_plugin = NULL; + +struct t_hook *weechat_xmpp_process_timer = NULL; + +struct t_gui_bar_item *weechat_xmpp_typing_bar_item = NULL; + extern "C" { +#pragma GCC visibility push(default) WEECHAT_PLUGIN_NAME(WEECHAT_XMPP_PLUGIN_NAME); WEECHAT_PLUGIN_DESCRIPTION(N_("XMPP client protocol")); WEECHAT_PLUGIN_AUTHOR("bqv "); @@ -27,12 +34,6 @@ WEECHAT_PLUGIN_LICENSE("MPL2"); WEECHAT_PLUGIN_PRIORITY(5500); } -struct t_weechat_plugin *weechat_xmpp_plugin = NULL; - -struct t_hook *weechat_xmpp_process_timer = NULL; - -struct t_gui_bar_item *weechat_xmpp_typing_bar_item = NULL; - extern "C" int weechat_plugin_init(struct t_weechat_plugin *plugin, int argc, char *argv[]) { diff --git a/signal.hh b/signal.hh new file mode 100644 index 0000000..3025e78 --- /dev/null +++ b/signal.hh @@ -0,0 +1,57 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, version 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#pragma once + +#include +#include +#include + +namespace libsignal { + + template + struct deleter { + void operator() (T *ptr) { SIGNAL_UNREF(ptr); } + }; + + template<> + struct deleter { + void operator() (struct signal_context *ptr) + { signal_context_destroy(ptr); } + }; + + template<> + struct deleter { + void operator() (struct signal_protocol_store_context *ptr) + { signal_protocol_store_context_destroy(ptr); } + }; + + template<> + struct deleter { + void operator() (struct ratchet_identity_key_pair *ptr) + { ratchet_identity_key_pair_destroy( + reinterpret_cast(ptr)); } + }; + + template + using object = std::unique_ptr>; + + template + object make(int (*fun)(T**,Args...), Args... args) { + T *result; + fun(&result, args...); + return object(result); + }; + + typedef object context; + + typedef object store_context; + + typedef object identity_key_pair; + + typedef object public_key; + + typedef object private_key; + +} diff --git a/strophe.hh b/strophe.hh new file mode 100644 index 0000000..bb11c73 --- /dev/null +++ b/strophe.hh @@ -0,0 +1,13 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, version 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#pragma once + +#include +#include +#include + +namespace strophe { + +} diff --git a/user.cpp b/user.cpp index 4cf5c7b..97b1cb5 100644 --- a/user.cpp +++ b/user.cpp @@ -103,21 +103,21 @@ void user__nicklist_add(struct t_account *account, ptr_buffer = channel ? channel->buffer : account->buffer; - char *group = "..."; - if (weechat_strcasecmp(user->profile.affiliation, "outcast") == 0) - group = "!"; - if (weechat_strcasecmp(user->profile.role, "visitor") == 0) - group = "?"; - if (weechat_strcasecmp(user->profile.role, "participant") == 0) - group = "+"; - if (weechat_strcasecmp(user->profile.affiliation, "member") == 0) - group = "%"; - if (weechat_strcasecmp(user->profile.role, "moderator") == 0) - group = "@"; - if (weechat_strcasecmp(user->profile.affiliation, "admin") == 0) - group = "&"; - if (weechat_strcasecmp(user->profile.affiliation, "owner") == 0) - group = "~"; + char *group = (char*)"..."; + if (weechat_strcasecmp(user->profile.affiliation, (char*)"outcast") == 0) + group = (char*)"!"; + if (weechat_strcasecmp(user->profile.role, (char*)"visitor") == 0) + group = (char*)"?"; + if (weechat_strcasecmp(user->profile.role, (char*)"participant") == 0) + group = (char*)"+"; + if (weechat_strcasecmp(user->profile.affiliation, (char*)"member") == 0) + group = (char*)"%"; + if (weechat_strcasecmp(user->profile.role, (char*)"moderator") == 0) + group = (char*)"@"; + if (weechat_strcasecmp(user->profile.affiliation, (char*)"admin") == 0) + group = (char*)"&"; + if (weechat_strcasecmp(user->profile.affiliation, (char*)"owner") == 0) + group = (char*)"~"; ptr_group = weechat_nicklist_search_group(ptr_buffer, NULL, group); weechat_nicklist_add_nick(ptr_buffer, ptr_group, name,