feat: finish wrappers for current libsession group functions

This commit is contained in:
0x330a 2023-08-28 17:27:20 +10:00
parent b6ff1deb64
commit 3a50ff185e
No known key found for this signature in database
GPG Key ID: 267811D6E6A2698C
9 changed files with 4379 additions and 1859 deletions

@ -1 +1 @@
Subproject commit d3b902f657083da3f37315327e2722d4fbda411f
Subproject commit 883710340a14b74ffbac482b8b4b41aadcad446e

View File

@ -8,19 +8,18 @@ Java_network_loki_messenger_libsession_1util_GroupInfoConfig_00024Companion_newI
JNIEnv *env, jobject thiz, jbyteArray pub_key, jbyteArray secret_key,
jbyteArray initial_dump) {
std::lock_guard guard{util::util_mutex_};
std::optional<session::ustring> secret_key_optional;
std::optional<session::ustring> initial_dump_optional;
std::optional<session::ustring> secret_key_optional{std::nullopt};
std::optional<session::ustring> initial_dump_optional{std::nullopt};
auto pub_key_bytes = util::ustring_from_bytes(env, pub_key);
if (secret_key != nullptr) {
auto secret_key_bytes = util::ustring_from_bytes(env, secret_key);
secret_key_optional = std::optional{secret_key_bytes};
secret_key_optional = secret_key_bytes;
}
if (pub_key != nullptr) {
auto initial_dump_bytes = util::ustring_from_bytes(env, initial_dump);
initial_dump_optional = std::optional{initial_dump_bytes};
initial_dump_optional = initial_dump_bytes;
}
auto initial_dump_bytes = util::ustring_from_bytes(env, initial_dump);
auto* group_info = new session::config::groups::Info(pub_key_bytes, secret_key_optional, initial_dump_optional);
jclass groupInfoClass = env->FindClass("network/loki/messenger/libsession_util/GroupInfoConfig");

View File

@ -1 +1,81 @@
#include "group_keys.h"
#include "group_info.h"
#include "group_members.h"
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 initial_dump,
jobject info,
jobject members) {
// TODO: implement newInstance()
}
extern "C"
JNIEXPORT jobject JNICALL
Java_network_loki_messenger_libsession_1util_GroupKeysConfig_groupKeys(JNIEnv *env, jobject thiz) {
// TODO: implement groupKeys()
}
extern "C"
JNIEXPORT void JNICALL
Java_network_loki_messenger_libsession_1util_GroupKeysConfig_loadKey(JNIEnv *env, jobject thiz,
jbyteArray data,
jbyteArray msg_id,
jlong timestamp_ms,
jobject info_jobject,
jobject members_jobject) {
auto keys = ptrToKeys(env, thiz);
auto data_bytes = util::ustring_from_bytes(env, data);
auto msg_bytes = util::ustring_from_bytes(env, msg_id);
auto info = ptrToInfo(env, info_jobject);
auto members = ptrToMembers(env, members_jobject);
keys->load_key_message(data_bytes, timestamp_ms, *info, *members);
}
extern "C"
JNIEXPORT jboolean JNICALL
Java_network_loki_messenger_libsession_1util_GroupKeysConfig_needsRekey(JNIEnv *env, jobject thiz) {
auto keys = ptrToKeys(env, thiz);
return keys->needs_rekey();
}
extern "C"
JNIEXPORT jbyteArray JNICALL
Java_network_loki_messenger_libsession_1util_GroupKeysConfig_pendingKey(JNIEnv *env, jobject thiz) {
auto keys = ptrToKeys(env, thiz);
auto pending = keys->pending_key();
if (!pending) {
return nullptr;
}
auto pending_bytes = util::bytes_from_ustring(env, *pending);
return pending_bytes;
}
extern "C"
JNIEXPORT jbyteArray JNICALL
Java_network_loki_messenger_libsession_1util_GroupKeysConfig_pendingPush(JNIEnv *env,
jobject thiz) {
auto keys = ptrToKeys(env, thiz);
auto pending = keys->pending_config();
if (!pending) {
return nullptr;
}
auto pending_bytes = util::bytes_from_ustring(env, *pending);
return pending_bytes;
}
extern "C"
JNIEXPORT jbyteArray JNICALL
Java_network_loki_messenger_libsession_1util_GroupKeysConfig_rekey(JNIEnv *env, jobject thiz,
jobject info_jobject, jobject members_jobject) {
auto keys = ptrToKeys(env, thiz);
auto info = ptrToInfo(env, info_jobject);
auto members = ptrToMembers(env, members_jobject);
auto rekey = keys->rekey(*info, *members);
auto rekey_bytes = util::bytes_from_ustring(env, rekey.data());
return rekey_bytes;
}

View File

@ -1 +1,88 @@
#include "group_members.h"
extern "C"
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) {
auto pub_key_bytes = util::ustring_from_bytes(env, pub_key);
std::optional<session::ustring> secret_key_optional{std::nullopt};
std::optional<session::ustring> initial_dump_optional{std::nullopt};
if (secret_key != nullptr) {
auto secret_key_bytes = util::ustring_from_bytes(env, 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* group_members = new session::config::groups::Members(pub_key_bytes, secret_key_optional, initial_dump_optional);
jclass groupMemberClass = env->FindClass("network/loki/messenger/libsession_util/GroupMemberConfig");
jmethodID constructor = env->GetMethodID(groupMemberClass, "<init>", "(J)V");
jobject newConfig = env->NewObject(groupMemberClass, constructor, reinterpret_cast<jlong>(group_members));
return newConfig;
}
extern "C"
JNIEXPORT jobject JNICALL
Java_network_loki_messenger_libsession_1util_GroupMemberConfig_all(JNIEnv *env, jobject thiz) {
auto config = ptrToMembers(env, thiz);
jclass stack = env->FindClass("java/util/Stack");
jmethodID init = env->GetMethodID(stack, "<init>", "()V");
jobject our_stack = env->NewObject(stack, init);
jmethodID push = env->GetMethodID(stack, "push", "(Ljava/lang/Object;)Ljava/lang/Object;");
for (auto& member : *config) {
auto member_obj = util::serialize_group_member(env, member);
env->CallObjectMethod(our_stack, push, member_obj);
}
return our_stack;
}
extern "C"
JNIEXPORT jboolean JNICALL
Java_network_loki_messenger_libsession_1util_GroupMemberConfig_erase(JNIEnv *env, jobject thiz,
jobject group_member) {
auto config = ptrToMembers(env, thiz);
auto member = util::deserialize_group_member(env, group_member);
return config->erase(member.session_id);
}
extern "C"
JNIEXPORT jobject JNICALL
Java_network_loki_messenger_libsession_1util_GroupMemberConfig_get(JNIEnv *env, jobject thiz,
jstring pub_key_hex) {
auto config = ptrToMembers(env, thiz);
auto pub_key_bytes = env->GetStringUTFChars(pub_key_hex, nullptr);
auto member = config->get(pub_key_bytes);
if (!member) {
return nullptr;
}
auto serialized = util::serialize_group_member(env, *member);
env->ReleaseStringUTFChars(pub_key_hex, pub_key_bytes);
return serialized;
}
extern "C"
JNIEXPORT jobject JNICALL
Java_network_loki_messenger_libsession_1util_GroupMemberConfig_getOrConstruct(JNIEnv *env,
jobject thiz,
jstring pub_key_hex) {
auto config = ptrToMembers(env, thiz);
auto pub_key_bytes = env->GetStringUTFChars(pub_key_hex, nullptr);
auto member = config->get_or_construct(pub_key_bytes);
auto serialized = util::serialize_group_member(env, member);
env->ReleaseStringUTFChars(pub_key_hex, pub_key_bytes);
return serialized;
}
extern "C"
JNIEXPORT void JNICALL
Java_network_loki_messenger_libsession_1util_GroupMemberConfig_set(JNIEnv *env, jobject thiz,
jobject group_member) {
auto config = ptrToMembers(env, thiz);
auto deserialized = util::deserialize_group_member(env, group_member);
config->set(deserialized);
}

View File

@ -113,6 +113,78 @@ namespace util {
return std::pair(session::config::expiration_mode::none, 0);
}
jobject serialize_group_member(JNIEnv* env, const session::config::groups::member& member) {
jclass group_member_class = env->FindClass("network/loki/messenger/libsession_util/util/GroupMember");
jmethodID constructor = env->GetMethodID(group_member_class, "<init>", "(Ljava/lang/String;Ljava/lang/String;Lnetwork/loki/messenger/libsession_util/util/UserPic;ZZZZZ)V");
jobject user_pic = serialize_user_pic(env, member.profile_picture);
jstring session_id = env->NewStringUTF(member.session_id.data());
jstring name = env->NewStringUTF(member.name.data());
jboolean invite_failed = member.invite_failed();
jboolean invite_pending = member.invite_pending();
jboolean promoted = member.promoted();
jboolean promotion_failed = member.promotion_failed();
jboolean promotion_pending = member.promotion_pending();
return env->NewObject(group_member_class,
constructor,
session_id,
name,
user_pic,
invite_failed,
invite_pending,
promoted,
promotion_failed,
promotion_pending);
}
session::config::groups::member deserialize_group_member(JNIEnv* env, jobject member) {
jclass group_member_class = env->FindClass("network/loki/messenger/libsession_util/util/GroupMember");
jfieldID session_id_field = env->GetFieldID(group_member_class, "sessionId", "Ljava/lang/String;");
jfieldID name_field = env->GetFieldID(group_member_class, "name", "Ljava/lang/String;");
jfieldID user_pic_field = env->GetFieldID(group_member_class,"profilePicture", "Lnetwork/loki/messenger/libsession_util/util/UserPic;");
jfieldID invite_failed_field = env->GetFieldID(group_member_class, "inviteFailed", "Z");
jfieldID invite_pending_field = env->GetFieldID(group_member_class, "invitePending", "Z");
jfieldID promoted_field = env->GetFieldID(group_member_class, "promoted", "Z");
jfieldID promotion_failed_field = env->GetFieldID(group_member_class, "promotionFailed", "Z");
jfieldID promotion_pending_field = env->GetFieldID(group_member_class, "promotionPending", "Z");
auto session_id = (jstring)env->GetObjectField(member, session_id_field);
auto session_id_bytes = env->GetStringUTFChars(session_id, nullptr);
auto name = (jstring)env->GetObjectField(member, name_field);
auto name_bytes = env->GetStringUTFChars(name, nullptr);
auto user_pic_jobject = env->GetObjectField(member, user_pic_field);
auto user_pic = deserialize_user_pic(env, user_pic_jobject);
auto url_bytes = env->GetStringUTFChars(user_pic.first, nullptr);
auto pic_key = ustring_from_bytes(env, user_pic.second);
auto invite_failed = env->GetBooleanField(member, invite_failed_field);
auto invite_pending = env->GetBooleanField(member, invite_pending_field);
auto promoted = env->GetBooleanField(member, promoted_field);
auto promotion_failed = env->GetBooleanField(member, promotion_failed_field);
auto promotion_pending = env->GetBooleanField(member, promotion_pending_field);
// set up the object
session::config::groups::member group_member(session_id_bytes);
group_member.set_name(name_bytes);
group_member.profile_picture = session::config::profile_pic{url_bytes, pic_key};
if (invite_pending) {
group_member.set_invited(false);
} else if (invite_failed) {
group_member.set_invited(true);
}
if (promotion_pending) {
group_member.set_promoted(false);
} else if (promotion_failed) {
group_member.set_promoted(true);
}
// set promotion TODO
env->ReleaseStringUTFChars(user_pic.first, url_bytes);
env->ReleaseStringUTFChars(session_id, session_id_bytes);
env->ReleaseStringUTFChars(name, name_bytes);
return group_member;
}
jobject jlongFromOptional(JNIEnv* env, std::optional<long long> optional) {
if (!optional) {
return nullptr;

View File

@ -17,12 +17,14 @@ namespace util {
jbyteArray bytes_from_ustring(JNIEnv* env, session::ustring_view from_str);
session::ustring ustring_from_bytes(JNIEnv* env, jbyteArray byteArray);
session::ustring ustring_from_jstring(JNIEnv* env, jstring string);
jobject serialize_user_pic(JNIEnv *env, session::config::profile_pic pic);
std::pair<jstring, jbyteArray> deserialize_user_pic(JNIEnv *env, jobject user_pic);
jobject serialize_base_community(JNIEnv *env, const session::config::community& base_community);
session::config::community deserialize_base_community(JNIEnv *env, jobject base_community);
jobject serialize_expiry(JNIEnv *env, const session::config::expiration_mode& mode, const std::chrono::seconds& time_seconds);
std::pair<session::config::expiration_mode, long> deserialize_expiry(JNIEnv *env, jobject expiry_mode);
jobject serialize_user_pic(JNIEnv* env, session::config::profile_pic pic);
std::pair<jstring, jbyteArray> deserialize_user_pic(JNIEnv* env, jobject user_pic);
jobject serialize_base_community(JNIEnv* env, const session::config::community& base_community);
session::config::community deserialize_base_community(JNIEnv* env, jobject base_community);
jobject serialize_expiry(JNIEnv* env, const session::config::expiration_mode& mode, const std::chrono::seconds& time_seconds);
std::pair<session::config::expiration_mode, long> deserialize_expiry(JNIEnv* env, jobject expiry_mode);
jobject serialize_group_member(JNIEnv* env, const session::config::groups::member& member);
session::config::groups::member deserialize_group_member(JNIEnv* env, jobject member);
jobject jlongFromOptional(JNIEnv* env, std::optional<long long> optional);
jstring jstringFromOptional(JNIEnv* env, std::optional<std::string_view> optional);
}

View File

@ -5,6 +5,7 @@ import network.loki.messenger.libsession_util.util.ConfigPush
import network.loki.messenger.libsession_util.util.Contact
import network.loki.messenger.libsession_util.util.Conversation
import network.loki.messenger.libsession_util.util.GroupInfo
import network.loki.messenger.libsession_util.util.GroupMember
import network.loki.messenger.libsession_util.util.UserPic
import org.session.libsignal.protos.SignalServiceProtos.SharedConfigMessage.Kind
import org.session.libsignal.utilities.IdPrefix
@ -242,8 +243,13 @@ class GroupMemberConfig(pointer: Long): ConfigBase(pointer) {
pubKey: ByteArray,
secretKey: ByteArray?,
initialDump: ByteArray?
)
): GroupMemberConfig
}
external fun all(): List<GroupMember>
external fun erase(groupMember: GroupMember): Boolean
external fun get(pubKeyHex: String): GroupMember?
external fun getOrConstruct(pubKeyHex: String): GroupMember
external fun set(groupMember: GroupMember)
}
class GroupKeysConfig(pointer: Long): ConfigBase(pointer) {
@ -259,4 +265,14 @@ class GroupKeysConfig(pointer: Long): ConfigBase(pointer) {
members: GroupMemberConfig
): GroupKeysConfig
}
external fun groupKeys(): List<ByteArray>
external fun loadKey(data: ByteArray,
msgId: ByteArray,
timestampMs: Long,
info: GroupInfoConfig,
members: GroupMemberConfig)
external fun needsRekey(): Boolean
external fun pendingKey(): ByteArray?
external fun pendingPush(): ByteArray?
external fun rekey(info: GroupInfoConfig, members: GroupMemberConfig): ByteArray
}

View File

@ -0,0 +1,12 @@
package network.loki.messenger.libsession_util.util
data class GroupMember(
val sessionId: String,
val name: String?,
val profilePicture: UserPic?,
val inviteFailed: Boolean,
val invitePending: Boolean,
val promoted: Boolean,
val promotionFailed: Boolean,
val promotionPending: Boolean,
)