mirror of
https://github.com/profanity-im/profanity.git
synced 2024-12-04 14:46:46 -05:00
Add OMEMO session long term storage
This commit is contained in:
parent
5eb66aea26
commit
55407ee15f
@ -52,6 +52,8 @@ struct omemo_context_t {
|
|||||||
GHashTable *device_ids;
|
GHashTable *device_ids;
|
||||||
GString *identity_filename;
|
GString *identity_filename;
|
||||||
GKeyFile *identity_keyfile;
|
GKeyFile *identity_keyfile;
|
||||||
|
GString *sessions_filename;
|
||||||
|
GKeyFile *sessions_keyfile;
|
||||||
};
|
};
|
||||||
|
|
||||||
static omemo_context omemo_ctx;
|
static omemo_context omemo_ctx;
|
||||||
@ -169,15 +171,18 @@ omemo_on_connect(ProfAccount *account)
|
|||||||
|
|
||||||
omemo_ctx.identity_filename = g_string_new(basedir->str);
|
omemo_ctx.identity_filename = g_string_new(basedir->str);
|
||||||
g_string_append(omemo_ctx.identity_filename, "identity.txt");
|
g_string_append(omemo_ctx.identity_filename, "identity.txt");
|
||||||
|
omemo_ctx.sessions_filename = g_string_new(basedir->str);
|
||||||
|
g_string_append(omemo_ctx.sessions_filename, "sessions.txt");
|
||||||
|
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
int res = g_mkdir_with_parents(basedir->str, S_IRWXU);
|
int res = g_mkdir_with_parents(basedir->str, S_IRWXU);
|
||||||
if (res == -1) {
|
if (res == -1) {
|
||||||
char *errmsg = strerror(errno);
|
char *errmsg = strerror(errno);
|
||||||
if (errmsg) {
|
if (errmsg) {
|
||||||
log_error("Error creating directory: %s, %s", omemo_ctx.identity_filename->str, errmsg);
|
log_error("Error creating directory: %s, %s", basedir->str, errmsg);
|
||||||
} else {
|
} else {
|
||||||
log_error("Error creating directory: %s", omemo_ctx.identity_filename->str);
|
log_error("Error creating directory: %s", basedir->str);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -208,6 +213,32 @@ omemo_on_connect(ProfAccount *account)
|
|||||||
|
|
||||||
omemo_generate_short_term_crypto_materials(account);
|
omemo_generate_short_term_crypto_materials(account);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
omemo_ctx.sessions_keyfile = g_key_file_new();
|
||||||
|
if (g_key_file_load_from_file(omemo_ctx.sessions_keyfile, omemo_ctx.sessions_filename->str, G_KEY_FILE_KEEP_COMMENTS, NULL)) {
|
||||||
|
int i;
|
||||||
|
char **groups = g_key_file_get_groups(omemo_ctx.sessions_keyfile, NULL);
|
||||||
|
for (i = 0; groups[i] != NULL; i++) {
|
||||||
|
int j;
|
||||||
|
GHashTable *device_store = NULL;
|
||||||
|
|
||||||
|
device_store = g_hash_table_lookup(omemo_ctx.session_store, groups[i]);
|
||||||
|
if (!device_store) {
|
||||||
|
device_store = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, (GDestroyNotify)signal_buffer_free);
|
||||||
|
g_hash_table_insert(omemo_ctx.session_store, groups[i], device_store);
|
||||||
|
}
|
||||||
|
|
||||||
|
char **keys = g_key_file_get_keys(omemo_ctx.sessions_keyfile, groups[i], NULL, NULL);
|
||||||
|
for (j = 0; keys[j] != NULL; j++) {
|
||||||
|
uint32_t id = strtoul(keys[j], NULL, 10);
|
||||||
|
char *record_b64 = g_key_file_get_string(omemo_ctx.sessions_keyfile, groups[i], keys[j], NULL);
|
||||||
|
size_t record_len;
|
||||||
|
unsigned char *record = g_base64_decode(record_b64, &record_len);
|
||||||
|
signal_buffer *buffer = signal_buffer_create(record, record_len);
|
||||||
|
g_hash_table_insert(device_store, GINT_TO_POINTER(id), buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -395,6 +426,22 @@ omemo_set_device_list(const char *const jid, GList * device_list)
|
|||||||
free(barejid);
|
free(barejid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GKeyFile *
|
||||||
|
omemo_sessions_keyfile(void)
|
||||||
|
{
|
||||||
|
return omemo_ctx.sessions_keyfile;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
omemo_sessions_keyfile_save(void)
|
||||||
|
{
|
||||||
|
GError *error = NULL;
|
||||||
|
|
||||||
|
if (!g_key_file_save_to_file(omemo_ctx.sessions_keyfile, omemo_ctx.sessions_filename->str, &error)) {
|
||||||
|
log_error("Error saving OMEMO sessions to: %s, %s", omemo_ctx.sessions_filename->str, error->message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
omemo_start_device_session(const char *const jid, uint32_t device_id,
|
omemo_start_device_session(const char *const jid, uint32_t device_id,
|
||||||
GList *prekeys, uint32_t signed_prekey_id,
|
GList *prekeys, uint32_t signed_prekey_id,
|
||||||
@ -402,7 +449,14 @@ omemo_start_device_session(const char *const jid, uint32_t device_id,
|
|||||||
const unsigned char *const signature, size_t signature_len,
|
const unsigned char *const signature, size_t signature_len,
|
||||||
const unsigned char *const identity_key_raw, size_t identity_key_len)
|
const unsigned char *const identity_key_raw, size_t identity_key_len)
|
||||||
{
|
{
|
||||||
log_info("Start OMEMO session with %s device %d", jid, device_id);
|
signal_protocol_address address = {
|
||||||
|
.name = strdup(jid),
|
||||||
|
.name_len = strlen(jid),
|
||||||
|
.device_id = device_id,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!contains_session(&address, omemo_ctx.session_store)) {
|
||||||
|
log_info("Create OMEMO session with %s device %d", jid, device_id);
|
||||||
session_pre_key_bundle *bundle;
|
session_pre_key_bundle *bundle;
|
||||||
signal_protocol_address *address;
|
signal_protocol_address *address;
|
||||||
|
|
||||||
@ -430,6 +484,7 @@ omemo_start_device_session(const char *const jid, uint32_t device_id,
|
|||||||
session_builder_process_pre_key_bundle(builder, bundle);
|
session_builder_process_pre_key_bundle(builder, bundle);
|
||||||
|
|
||||||
g_list_free_full(prekeys, (GDestroyNotify)free_omemo_key);
|
g_list_free_full(prekeys, (GDestroyNotify)free_omemo_key);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
|
@ -26,6 +26,8 @@ void omemo_signed_prekey(unsigned char **output, size_t *length);
|
|||||||
void omemo_signed_prekey_signature(unsigned char **output, size_t *length);
|
void omemo_signed_prekey_signature(unsigned char **output, size_t *length);
|
||||||
void omemo_prekeys(GList **prekeys, GList **ids, GList **lengths);
|
void omemo_prekeys(GList **prekeys, GList **ids, GList **lengths);
|
||||||
void omemo_set_device_list(const char *const jid, GList * device_list);
|
void omemo_set_device_list(const char *const jid, GList * device_list);
|
||||||
|
GKeyFile *omemo_sessions_keyfile(void);
|
||||||
|
void omemo_sessions_keyfile_save(void);
|
||||||
|
|
||||||
void omemo_start_session(const char *const barejid);
|
void omemo_start_session(const char *const barejid);
|
||||||
void omemo_start_device_session(const char *const jid, uint32_t device_id, GList *prekeys, uint32_t signed_prekey_id, const unsigned char *const signed_prekey, size_t signed_prekey_len, const unsigned char *const signature, size_t signature_len, const unsigned char *const identity_key, size_t identity_key_len);
|
void omemo_start_device_session(const char *const jid, uint32_t device_id, GList *prekeys, uint32_t signed_prekey_id, const unsigned char *const signed_prekey, size_t signed_prekey_len, const unsigned char *const signature, size_t signature_len, const unsigned char *const identity_key, size_t identity_key_len);
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
#include <signal/signal_protocol.h>
|
#include <signal/signal_protocol.h>
|
||||||
|
|
||||||
|
#include "omemo/omemo.h"
|
||||||
#include "omemo/store.h"
|
#include "omemo/store.h"
|
||||||
|
|
||||||
GHashTable *
|
GHashTable *
|
||||||
@ -90,6 +91,13 @@ store_session(const signal_protocol_address *address, uint8_t *record,
|
|||||||
|
|
||||||
signal_buffer *buffer = signal_buffer_create(record, record_len);
|
signal_buffer *buffer = signal_buffer_create(record, record_len);
|
||||||
g_hash_table_insert(device_store, GINT_TO_POINTER(address->device_id), buffer);
|
g_hash_table_insert(device_store, GINT_TO_POINTER(address->device_id), buffer);
|
||||||
|
|
||||||
|
|
||||||
|
char *record_b64 = g_base64_encode(record, record_len);
|
||||||
|
g_key_file_set_string(omemo_sessions_keyfile(), address->name, g_strdup_printf("%d", address->device_id), record_b64);
|
||||||
|
|
||||||
|
omemo_sessions_keyfile_save();
|
||||||
|
|
||||||
return SG_SUCCESS;
|
return SG_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user