feat: adding more closed group in recipient logic, adding more wrappers for user groups and serializing / deserializing the closed groups in user group type

This commit is contained in:
0x330a
2023-08-30 17:48:21 +10:00
parent 0692768f97
commit b42b9fa414
9 changed files with 104 additions and 4 deletions

View File

@@ -17,10 +17,12 @@ Java_network_loki_messenger_libsession_1util_GroupKeysConfig_00024Companion_newI
auto pub_key_bytes = util::ustring_from_bytes(env, group_public_key);
std::optional<session::ustring> secret_key_optional{std::nullopt};
std::optional<session::ustring> initial_dump_optional{std::nullopt};
if (env->GetArrayLength(group_secret_key) == 32 || env->GetArrayLength(group_secret_key) == 64) {
auto secret_key_bytes = util::ustring_from_bytes(env, group_secret_key);
secret_key_optional = secret_key_bytes;
}
if (env->GetArrayLength(initial_dump) > 0) {
auto initial_dump_bytes = util::ustring_from_bytes(env, initial_dump);
initial_dump_optional = initial_dump_bytes;

View File

@@ -270,4 +270,22 @@ Java_network_loki_messenger_libsession_1util_UserGroupsConfig_eraseLegacyGroup(J
bool return_bool = conf->erase_legacy_group(session_id_bytes);
env->ReleaseStringUTFChars(session_id, session_id_bytes);
return return_bool;
}
extern "C"
JNIEXPORT jobject JNICALL
Java_network_loki_messenger_libsession_1util_UserGroupsConfig_getClosedGroup(JNIEnv *env,
jobject thiz,
jstring session_id) {
std::lock_guard guard{util::util_mutex_};
auto config = ptrToUserGroups(env, thiz);
auto session_id_bytes = env->GetStringUTFChars(session_id, nullptr);
auto group = config->get_group(session_id_bytes);
env->ReleaseStringUTFChars(session_id, session_id_bytes);
if (group) {
return serialize_group_info(env, *group);
}
return nullptr;
}

View File

@@ -127,6 +127,40 @@ inline jobject serialize_legacy_group_info(JNIEnv *env, session::config::legacy_
return serialized;
}
inline jobject serialize_group_info(JNIEnv* env, session::config::group_info info) {
jstring session_id = env->NewStringUTF(info.id.data());
jbyteArray admin_bytes = util::bytes_from_ustring(env, info.secretkey);
jbyteArray auth_bytes = util::bytes_from_ustring(env, info.auth_sig);
jclass group_info_class = env->FindClass("network/loki/messenger/libsession_util/util/GroupInfo$ClosedGroupInfo");
jmethodID constructor = env->GetMethodID(group_info_class, "<init>", "(Ljava/lang/String;[B[B)V");
jobject return_object = env->NewObject(group_info_class,constructor,
session_id, admin_bytes, auth_bytes);
return return_object;
}
inline session::config::group_info deserialize_group_info(JNIEnv* env, jobject info_serialized) {
jclass closed_group_class = env->FindClass("network/loki/messenger/libsession_util/util/GroupInfo$ClosedGroupInfo");
jfieldID id_field = env->GetFieldID(closed_group_class, "groupSessionId", "Ljava/lang/String;");
jfieldID secret_field = env->GetFieldID(closed_group_class, "adminKey", "[B");
jfieldID auth_field = env->GetFieldID(closed_group_class, "signingKey", "[B");
jstring id_jstring = (jstring)env->GetObjectField(info_serialized, id_field);
jbyteArray secret_jBytes = (jbyteArray)env->GetObjectField(info_serialized, secret_field);
jbyteArray auth_jBytes = (jbyteArray)env->GetObjectField(info_serialized, auth_field);
auto id_bytes = env->GetStringUTFChars(id_jstring, nullptr);
auto secret_bytes = util::ustring_from_bytes(env, secret_jBytes);
auto auth_bytes = util::ustring_from_bytes(env, auth_jBytes);
session::config::group_info group_info(id_bytes);
group_info.auth_sig = auth_bytes;
group_info.secretkey = secret_bytes;
env->ReleaseStringUTFChars(id_jstring, id_bytes);
return group_info;
}
inline jobject serialize_community_info(JNIEnv *env, session::config::community_info info) {
auto priority = info.priority;
auto serialized_info = util::serialize_base_community(env, info);

View File

@@ -205,6 +205,9 @@ class UserGroupsConfig(pointer: Long): ConfigBase(pointer) {
external fun all(): List<GroupInfo>
external fun allCommunityInfo(): List<GroupInfo.CommunityGroupInfo>
external fun allLegacyGroupInfo(): List<GroupInfo.LegacyGroupInfo>
external fun getClosedGroup(sessionId: String): GroupInfo.ClosedGroupInfo?
external fun getOrConstructClosedGroup(sessionId: String): GroupInfo.ClosedGroupInfo
external fun all():
}
class GroupInfoConfig(pointer: Long): ConfigBase(pointer) {

View File

@@ -4,6 +4,38 @@ sealed class GroupInfo {
data class CommunityGroupInfo(val community: BaseCommunityInfo, val priority: Int) : GroupInfo()
data class ClosedGroupInfo(
val groupSessionId: String,
val adminKey: ByteArray?,
val signingKey: ByteArray?
): GroupInfo() {
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as ClosedGroupInfo
if (groupSessionId != other.groupSessionId) return false
if (adminKey != null) {
if (other.adminKey == null) return false
if (!adminKey.contentEquals(other.adminKey)) return false
} else if (other.adminKey != null) return false
if (signingKey != null) {
if (other.signingKey == null) return false
if (!signingKey.contentEquals(other.signingKey)) return false
} else if (other.signingKey != null) return false
return true
}
override fun hashCode(): Int {
var result = groupSessionId.hashCode()
result = 31 * result + (adminKey?.contentHashCode() ?: 0)
result = 31 * result + (signingKey?.contentHashCode() ?: 0)
return result
}
}
data class LegacyGroupInfo(
val sessionId: String,
val name: String,