diff --git a/libsession-util/src/main/cpp/group_keys.cpp b/libsession-util/src/main/cpp/group_keys.cpp index f68b93ccf7..240635b939 100644 --- a/libsession-util/src/main/cpp/group_keys.cpp +++ b/libsession-util/src/main/cpp/group_keys.cpp @@ -6,18 +6,58 @@ extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_GroupKeysConfig_00024Companion_newInstance(JNIEnv *env, jobject thiz, - jbyteArray public_key, - jbyteArray secret_key, + jbyteArray user_secret_key, + jbyteArray group_public_key, + jbyteArray group_secret_key, jbyteArray initial_dump, - jobject info, - jobject members) { - // TODO: implement newInstance() + jobject info_jobject, + jobject members_jobject) { + std::lock_guard lock{util::util_mutex_}; + auto user_key_bytes = util::ustring_from_bytes(env, user_secret_key); + auto pub_key_bytes = util::ustring_from_bytes(env, group_public_key); + std::optional secret_key_optional{std::nullopt}; + std::optional initial_dump_optional{std::nullopt}; + if (group_secret_key != nullptr) { + auto secret_key_bytes = util::ustring_from_bytes(env, group_secret_key); + secret_key_optional = secret_key_bytes; + } + if (initial_dump != nullptr) { + auto initial_dump_bytes = util::ustring_from_bytes(env, initial_dump); + initial_dump_optional = initial_dump_bytes; + } + + auto info = ptrToInfo(env, info_jobject); + auto members = ptrToMembers(env, members_jobject); + + auto* keys = new session::config::groups::Keys(user_key_bytes, + pub_key_bytes, + secret_key_optional, + initial_dump_optional, + *info, + *members); + + jclass groupKeysConfig = env->FindClass("network/loki/messenger/libsession_util/GroupKeysConfig"); + jmethodID constructor = env->GetMethodID(groupKeysConfig, "", "(J)V"); + jobject newConfig = env->NewObject(groupKeysConfig, constructor, reinterpret_cast(keys)); + + return newConfig; } extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_GroupKeysConfig_groupKeys(JNIEnv *env, jobject thiz) { - // TODO: implement groupKeys() + std::lock_guard lock{util::util_mutex_}; + auto config = ptrToKeys(env, thiz); + auto keys = config->group_keys(); + jclass stack = env->FindClass("java/util/Stack"); + jmethodID init = env->GetMethodID(stack, "", "()V"); + jobject our_stack = env->NewObject(stack, init); + jmethodID push = env->GetMethodID(stack, "push", "(Ljava/lang/Object;)Ljava/lang/Object;"); + for (auto& key : keys) { + auto key_bytes = util::bytes_from_ustring(env, key.data()); + env->CallObjectMethod(our_stack, push, key_bytes); + } + return our_stack; } extern "C" @@ -28,6 +68,7 @@ Java_network_loki_messenger_libsession_1util_GroupKeysConfig_loadKey(JNIEnv *env jlong timestamp_ms, jobject info_jobject, jobject members_jobject) { + std::lock_guard lock{util::util_mutex_}; auto keys = ptrToKeys(env, thiz); auto data_bytes = util::ustring_from_bytes(env, data); auto msg_bytes = util::ustring_from_bytes(env, msg_id); @@ -39,6 +80,7 @@ Java_network_loki_messenger_libsession_1util_GroupKeysConfig_loadKey(JNIEnv *env extern "C" JNIEXPORT jboolean JNICALL Java_network_loki_messenger_libsession_1util_GroupKeysConfig_needsRekey(JNIEnv *env, jobject thiz) { + std::lock_guard lock{util::util_mutex_}; auto keys = ptrToKeys(env, thiz); return keys->needs_rekey(); } @@ -46,6 +88,7 @@ Java_network_loki_messenger_libsession_1util_GroupKeysConfig_needsRekey(JNIEnv * extern "C" JNIEXPORT jbyteArray JNICALL Java_network_loki_messenger_libsession_1util_GroupKeysConfig_pendingKey(JNIEnv *env, jobject thiz) { + std::lock_guard lock{util::util_mutex_}; auto keys = ptrToKeys(env, thiz); auto pending = keys->pending_key(); if (!pending) { @@ -59,6 +102,7 @@ extern "C" JNIEXPORT jbyteArray JNICALL Java_network_loki_messenger_libsession_1util_GroupKeysConfig_pendingPush(JNIEnv *env, jobject thiz) { + std::lock_guard lock{util::util_mutex_}; auto keys = ptrToKeys(env, thiz); auto pending = keys->pending_config(); if (!pending) { @@ -72,6 +116,7 @@ extern "C" JNIEXPORT jbyteArray JNICALL Java_network_loki_messenger_libsession_1util_GroupKeysConfig_rekey(JNIEnv *env, jobject thiz, jobject info_jobject, jobject members_jobject) { + std::lock_guard lock{util::util_mutex_}; auto keys = ptrToKeys(env, thiz); auto info = ptrToInfo(env, info_jobject); auto members = ptrToMembers(env, members_jobject); diff --git a/libsession-util/src/main/cpp/group_members.cpp b/libsession-util/src/main/cpp/group_members.cpp index 001ed56e13..32d08e5aa6 100644 --- a/libsession-util/src/main/cpp/group_members.cpp +++ b/libsession-util/src/main/cpp/group_members.cpp @@ -5,6 +5,7 @@ JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_GroupMemberConfig_00024Companion_newInstance( JNIEnv *env, jobject thiz, jbyteArray pub_key, jbyteArray secret_key, jbyteArray initial_dump) { + std::lock_guard lock{util::util_mutex_}; auto pub_key_bytes = util::ustring_from_bytes(env, pub_key); std::optional secret_key_optional{std::nullopt}; std::optional initial_dump_optional{std::nullopt}; @@ -29,6 +30,7 @@ Java_network_loki_messenger_libsession_1util_GroupMemberConfig_00024Companion_ne extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_GroupMemberConfig_all(JNIEnv *env, jobject thiz) { + std::lock_guard lock{util::util_mutex_}; auto config = ptrToMembers(env, thiz); jclass stack = env->FindClass("java/util/Stack"); jmethodID init = env->GetMethodID(stack, "", "()V"); @@ -54,6 +56,7 @@ extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_GroupMemberConfig_get(JNIEnv *env, jobject thiz, jstring pub_key_hex) { + std::lock_guard lock{util::util_mutex_}; auto config = ptrToMembers(env, thiz); auto pub_key_bytes = env->GetStringUTFChars(pub_key_hex, nullptr); auto member = config->get(pub_key_bytes); @@ -70,6 +73,7 @@ JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_GroupMemberConfig_getOrConstruct(JNIEnv *env, jobject thiz, jstring pub_key_hex) { + std::lock_guard lock{util::util_mutex_}; auto config = ptrToMembers(env, thiz); auto pub_key_bytes = env->GetStringUTFChars(pub_key_hex, nullptr); auto member = config->get_or_construct(pub_key_bytes); @@ -82,6 +86,7 @@ extern "C" JNIEXPORT void JNICALL Java_network_loki_messenger_libsession_1util_GroupMemberConfig_set(JNIEnv *env, jobject thiz, jobject group_member) { + std::lock_guard lock{util::util_mutex_}; auto config = ptrToMembers(env, thiz); auto deserialized = util::deserialize_group_member(env, group_member); config->set(deserialized); diff --git a/libsession-util/src/main/java/network/loki/messenger/libsession_util/Config.kt b/libsession-util/src/main/java/network/loki/messenger/libsession_util/Config.kt index 19ee03c897..914169c532 100644 --- a/libsession-util/src/main/java/network/loki/messenger/libsession_util/Config.kt +++ b/libsession-util/src/main/java/network/loki/messenger/libsession_util/Config.kt @@ -10,6 +10,7 @@ import network.loki.messenger.libsession_util.util.UserPic import org.session.libsignal.protos.SignalServiceProtos.SharedConfigMessage.Kind import org.session.libsignal.utilities.IdPrefix import org.session.libsignal.utilities.Log +import java.util.Stack sealed class ConfigBase(protected val /* yucky */ pointer: Long) { @@ -245,7 +246,7 @@ class GroupMemberConfig(pointer: Long): ConfigBase(pointer) { initialDump: ByteArray? ): GroupMemberConfig } - external fun all(): List + external fun all(): Stack external fun erase(groupMember: GroupMember): Boolean external fun get(pubKeyHex: String): GroupMember? external fun getOrConstruct(pubKeyHex: String): GroupMember @@ -258,14 +259,15 @@ class GroupKeysConfig(pointer: Long): ConfigBase(pointer) { System.loadLibrary("session_util") } external fun newInstance( - publicKey: ByteArray, - secretKey: ByteArray?, + userSecretKey: ByteArray, + groupPublicKey: ByteArray, + groupSecretKey: ByteArray?, initialDump: ByteArray?, info: GroupInfoConfig, members: GroupMemberConfig ): GroupKeysConfig } - external fun groupKeys(): List + external fun groupKeys(): Stack external fun loadKey(data: ByteArray, msgId: ByteArray, timestampMs: Long,