feat: finish user group wrappers and start volatile convo

This commit is contained in:
0x330a
2023-09-01 13:36:41 +10:00
parent afcce2f068
commit 3fe2250469
12 changed files with 84 additions and 14 deletions

View File

@@ -12,7 +12,6 @@ import org.junit.Test
import org.junit.runner.RunWith
import org.session.libsignal.utilities.Hex
import org.session.libsignal.utilities.Log
import org.session.libsignal.utilities.toHexString
/**
* Instrumented test, which will execute on an Android device.
@@ -655,4 +654,17 @@ class InstrumentedTests {
assertThat(keys.pendingKey(), notNullValue())
}
@Test
fun testGroupMembership() {
val (userPublic, userSecret) = keyPair
val userCurve = Sodium.ed25519PkToCurve25519(userPublic)
val groupConfig = UserGroupsConfig.newInstance(userSecret)
val group = groupConfig.createGroup()
val groupSecret = group.adminKey
val groupPublic = Hex.fromStringCondensed(group.groupSessionId.publicKey)
groupConfig.set(group)
val allClosedGroups = groupConfig.all()
assertThat(allClosedGroups, equalTo(1))
}
}

View File

@@ -349,4 +349,34 @@ Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_allLegac
for (auto contact = convos->begin_legacy_groups(); contact != convos->end(); ++contact)
env->CallObjectMethod(our_stack, push, serialize_legacy_group(env, *contact));
return our_stack;
}
extern "C"
JNIEXPORT jobject JNICALL
Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_getClosedGroup(JNIEnv *env,
jobject thiz,
jstring session_id) {
auto config = ptrToConvoInfo(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) {
auto serialized = serialize_closed_group(env, *group);
return serialized;
}
return nullptr;
}
extern "C"
JNIEXPORT jobject JNICALL
Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_getOrConstructClosedGroup(
JNIEnv *env, jobject thiz, jstring session_id) {
// TODO: implement getOrConstructClosedGroup()
}
extern "C"
JNIEXPORT jboolean JNICALL
Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_eraseClosedGroup(
JNIEnv *env, jobject thiz, jstring session_id) {
// TODO: implement eraseClosedGroup()
}

View File

@@ -42,6 +42,15 @@ inline jobject serialize_legacy_group(JNIEnv *env, session::config::convo::legac
return serialized;
}
inline jobject serialize_closed_group(JNIEnv* env, session::config::convo::group group) {
jclass clazz = env->FindClass("network/loki/messenger/libsession_util/util/Conversation$ClosedGroup");
jmethodID constructor = env->GetMethodID(clazz, "<init>", "(Ljava/lang/String;JZ)V");
auto session_id = env->NewStringUTF(group.id.data());
auto last_read = group.last_read;
auto unread = group.unread;
return env->NewObject(clazz, constructor, session_id, last_read, unread);
}
inline jobject serialize_any(JNIEnv *env, session::config::convo::any any) {
if (auto* dm = std::get_if<session::config::convo::one_to_one>(&any)) {
return serialize_one_to_one(env, *dm);

View File

@@ -203,6 +203,7 @@ inline jobject iterator_as_java_stack(JNIEnv *env, const session::config::UserGr
} else if (auto* community = std::get_if<session::config::community_info>(&item)) {
serialized = serialize_community_info(env, *community);
} else if (auto* closed = std::get_if<session::config::group_info>(&item)) {
LOGD("Item is closed group");
serialized = serialize_closed_group_info(env, *closed);
}
if (serialized != nullptr) {
@@ -218,6 +219,8 @@ JNIEXPORT jobject JNICALL
Java_network_loki_messenger_libsession_1util_UserGroupsConfig_all(JNIEnv *env, jobject thiz) {
std::lock_guard lock{util::util_mutex_};
auto conf = ptrToUserGroups(env, thiz);
bool isFin = conf->begin().done();
LOGD("Group iterator has more: %d", isFin);
jobject all_stack = iterator_as_java_stack(env, conf->begin(), conf->end());
return all_stack;
}
@@ -325,7 +328,9 @@ Java_network_loki_messenger_libsession_1util_UserGroupsConfig_allClosedGroupInfo
jobject thiz) {
std::lock_guard lock{util::util_mutex_};
auto conf = ptrToUserGroups(env, thiz);
return nullptr;
auto closed_group_stack = iterator_as_java_stack(env, conf->begin_groups(), conf->end());
return closed_group_stack;
}
extern "C"
@@ -341,7 +346,7 @@ Java_network_loki_messenger_libsession_1util_UserGroupsConfig_createGroup(JNIEnv
extern "C"
JNIEXPORT jlong JNICALL
Java_network_loki_messenger_libsession_1util_UserGroupsConfig_sizeClosedGroup(JNIEnv *env,
Java_network_loki_messenger_libsession_1util_UserGroupsConfig_sizeClosedGroup(JNIEnv *env,
jobject thiz) {
std::lock_guard guard{util::util_mutex_};
auto config = ptrToUserGroups(env, thiz);

View File

@@ -6,7 +6,6 @@
#include "util.h"
#include "conversation.h"
#include "session/config/user_groups.hpp"
#include <android/log.h>
inline session::config::UserGroups* ptrToUserGroups(JNIEnv *env, jobject obj) {
jclass configClass = env->FindClass("network/loki/messenger/libsession_util/UserGroupsConfig");

View File

@@ -11,6 +11,13 @@
#include "session/config/profile_pic.hpp"
#include "session/config/user_groups.hpp"
#include "session/config/expiring.hpp"
#include <android/log.h>
#define LOG_TAG "libsession-jni"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,LOG_TAG,__VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
namespace util {
extern std::mutex util_mutex_;

View File

@@ -158,8 +158,12 @@ class ConversationVolatileConfig(pointer: Long): ConfigBase(pointer) {
external fun getLegacyClosedGroup(groupId: String): Conversation.LegacyGroup?
external fun getOrConstructLegacyGroup(groupId: String): Conversation.LegacyGroup
external fun eraseLegacyClosedGroup(groupId: String): Boolean
external fun erase(conversation: Conversation): Boolean
external fun getClosedGroup(sessionId: String): Conversation.ClosedGroup?
external fun getOrConstructClosedGroup(sessionId: String): Conversation.ClosedGroup
external fun eraseClosedGroup(sessionId: String): Boolean
external fun erase(conversation: Conversation): Boolean
external fun set(toStore: Conversation)
/**

View File

@@ -22,4 +22,10 @@ sealed class Conversation {
override var lastRead: Long,
override var unread: Boolean
): Conversation()
data class ClosedGroup(
val sessionId: String,
override var lastRead: Long,
override var unread: Boolean
): Conversation()
}