feat: finish wrappers for current libsession group functions
This commit is contained in:
parent
b6ff1deb64
commit
3a50ff185e
|
@ -1 +1 @@
|
|||
Subproject commit d3b902f657083da3f37315327e2722d4fbda411f
|
||||
Subproject commit 883710340a14b74ffbac482b8b4b41aadcad446e
|
|
@ -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");
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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);
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
|
@ -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,
|
||||
)
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue