Rework trusted fingerprint storage

Stop using "jid:device_id" keys. And move long term storage to its own
file: trust.txt.
This commit is contained in:
Paul Fariello
2019-04-09 06:21:02 +05:20
parent 4ad6904216
commit 25eb138d0b
4 changed files with 90 additions and 29 deletions

View File

@@ -317,18 +317,24 @@ save_identity(const signal_protocol_address *address, uint8_t *key_data,
size_t key_len, void *user_data)
{
identity_key_store_t *identity_key_store = (identity_key_store_t *)user_data;
char *node = g_strdup_printf("%s:%d", address->name, address->device_id);
signal_buffer *buffer = signal_buffer_create(key_data, key_len);
g_hash_table_insert(identity_key_store->trusted, strdup(node), buffer);
GHashTable *trusted = g_hash_table_lookup(identity_key_store->trusted, strdup(address->name));
if (!trusted) {
trusted = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, (GDestroyNotify)signal_buffer_free);
g_hash_table_insert(identity_key_store->trusted, strdup(address->name), trusted);
}
g_hash_table_insert(trusted, GINT_TO_POINTER(address->device_id), buffer);
/* Long term storage */
char *key_b64 = g_base64_encode(key_data, key_len);
g_key_file_set_string(omemo_identity_keyfile(), OMEMO_STORE_GROUP_TRUST, node, key_b64);
char *device_id = g_strdup_printf("%d", address->device_id);
g_key_file_set_string(omemo_trust_keyfile(), address->name, strdup(device_id), key_b64);
g_free(device_id);
g_free(key_b64);
omemo_identity_keyfile_save();
g_free(node);
omemo_trust_keyfile_save();
return SG_SUCCESS;
}
@@ -339,11 +345,14 @@ is_trusted_identity(const signal_protocol_address *address, uint8_t *key_data,
{
int ret;
identity_key_store_t *identity_key_store = (identity_key_store_t *)user_data;
char *node = g_strdup_printf("%s:%d", address->name, address->device_id);
GHashTable *trusted = g_hash_table_lookup(identity_key_store->trusted, address->name);
if (!trusted) {
return 0;
}
signal_buffer *buffer = signal_buffer_create(key_data, key_len);
signal_buffer *original = g_hash_table_lookup(identity_key_store->trusted, node);
g_free(node);
signal_buffer *original = g_hash_table_lookup(trusted, GINT_TO_POINTER(address->device_id));
ret = original != NULL && signal_buffer_compare(buffer, original) == 0;