Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@
plugins {
alias(libs.plugins.android.library) apply false
alias(libs.plugins.kotlin.android) apply false
alias(libs.plugins.kotlinx.serialization) apply false
}
7 changes: 4 additions & 3 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
[versions]
agp = "8.13.0"
kotlin = "2.2.20"
agp = "8.13.1"
kotlin = "2.2.21"

[libraries]
junit = { module = "junit:junit", version = "4.13.2" }
androidx-test-runner = { module = "androidx.test:runner", version = "1.7.0" }
androidx-test-rules = { module = "androidx.test:rules", version = "1.7.0" }
androidx-test-ext = { module = "androidx.test.ext:junit", version = "1.3.0" }
androidx-annotations = { module = "androidx.annotation:annotation", version = "1.9.1" }
kotlinx-serialization-core = { module = "org.jetbrains.kotlinx:kotlinx-serialization-core", version = "1.9.0" }

[plugins]
android-library = { id = "com.android.library", version.ref = "agp" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }

kotlinx-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
2 changes: 2 additions & 0 deletions library/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget
plugins {
alias(libs.plugins.android.library)
alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlinx.serialization)
id("maven-publish")
}

Expand Down Expand Up @@ -119,4 +120,5 @@ dependencies {
androidTestImplementation(libs.androidx.test.ext)

implementation(libs.androidx.annotations)
implementation(libs.kotlinx.serialization.core)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package network.loki.messenger.libsession_util.protocol

import androidx.test.ext.junit.runners.AndroidJUnit4
import network.loki.messenger.libsession_util.pro.BackendRequests
import org.junit.Assert.assertNotNull
import org.junit.Test
import org.junit.runner.RunWith

@RunWith(AndroidJUnit4::class)
class BackendRequestsTest {

@Test
fun getProviderMetadataWorks() {
val metadata = BackendRequests.getPaymentProviderMetadata(BackendRequests.PAYMENT_PROVIDER_GOOGLE_PLAY)
assertNotNull(metadata)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package network.loki.messenger.libsession_util.protocol

import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.Assert.assertEquals
import org.junit.Test
import org.junit.runner.RunWith

@RunWith(AndroidJUnit4::class)
class SessionProtocolTest {

@Test
fun proFeaturesForMessageWorks() {
val proposedFeatures = ProFeatures.from(listOf(ProFeature.PRO_BADGE))
val result = SessionProtocol.proFeaturesForMessage(
messageBody = "Hello, Session Pro!",
proposedFeatures
)

assertEquals(ProFeaturesForMsg.Status.Success, result.status)
assertEquals(19, result.codepointCount)
assertEquals(proposedFeatures, result.features)
}
}
4 changes: 4 additions & 0 deletions library/src/main/cpp/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,8 @@ set(SOURCES
attachments.cpp
webp_utils.cpp
gif_utils.cpp
pro_backend.cpp
pro_proof_util.cpp

${cgif_SOURCE_DIR}/src/cgif.c
${cgif_SOURCE_DIR}/src/cgif_rgb.c
Expand Down Expand Up @@ -158,4 +160,6 @@ target_link_libraries( # Specifies the target library.
webpdemux
webpdecoder
yuv
nlohmann_json
oxenc
)
3 changes: 2 additions & 1 deletion library/src/main/cpp/attachments.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include <jni.h>
#include <session/attachments.hpp>
#include "jni_utils.h"
#include "util.h"

using namespace session::attachment;
using namespace jni_utils;
Expand Down Expand Up @@ -49,7 +50,7 @@ Java_network_loki_messenger_libsession_1util_encrypt_Attachments_encryptBytes(JN
);


return util::bytes_from_span(env, std::span(reinterpret_cast<unsigned char *>(key.data()), key.size()));
return util::bytes_from_span(env, std::span(reinterpret_cast<unsigned char *>(key.data()), key.size())).release();
});
}

Expand Down
14 changes: 7 additions & 7 deletions library/src/main/cpp/blinded_key.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ Java_network_loki_messenger_libsession_1util_util_BlindKeyAPI_blindVersionKeyPai
jbyteArray ed25519_secret_key) {
return jni_utils::run_catching_cxx_exception_or_throws<jobject>(env, [=] {
const auto [pk, sk] = session::blind_version_key_pair(util::vector_from_bytes(env, ed25519_secret_key));
return jni_utils::new_key_pair(env, util::bytes_from_span(env, pk), util::bytes_from_span(env, sk));
return jni_utils::new_key_pair(env, util::bytes_from_span(env, pk).get(), util::bytes_from_span(env, sk).get());
});
}
extern "C"
Expand All @@ -32,7 +32,7 @@ Java_network_loki_messenger_libsession_1util_util_BlindKeyAPI_blindVersionSign(J
session::Platform::android,
timestamp
);
return util::bytes_from_vector(env, bytes);
return util::bytes_from_vector(env, bytes).release();
});
}

Expand All @@ -53,7 +53,7 @@ Java_network_loki_messenger_libsession_1util_util_BlindKeyAPI_blindVersionSignRe
jni_utils::JavaStringRef(env, path).view(),
body ? std::make_optional(jni_utils::JavaByteArrayRef(env, body).get()) : std::nullopt
);
return util::bytes_from_vector(env, bytes);
return util::bytes_from_vector(env, bytes).release();
});
}

Expand All @@ -68,7 +68,7 @@ Java_network_loki_messenger_libsession_1util_util_BlindKeyAPI_blind15KeyPair(JNI
jni_utils::JavaByteArrayRef(env, ed25519_secret_key).get(),
jni_utils::JavaByteArrayRef(env, server_pub_key).get()
);
return jni_utils::new_key_pair(env, util::bytes_from_span(env, pk), util::bytes_from_span(env, sk));
return jni_utils::new_key_pair(env, util::bytes_from_span(env, pk).get(), util::bytes_from_span(env, sk).get());
});
}

Expand All @@ -84,7 +84,7 @@ Java_network_loki_messenger_libsession_1util_util_BlindKeyAPI_blind15Sign(JNIEnv
jni_utils::JavaStringRef(env, server_pub_key).view(),
jni_utils::JavaByteArrayRef(env, message).get()
);
return util::bytes_from_vector(env, data);
return util::bytes_from_vector(env, data).release();
});
}

Expand Down Expand Up @@ -128,9 +128,9 @@ Java_network_loki_messenger_libsession_1util_util_BlindKeyAPI_blind25Id(JNIEnv *
jstring session_id,
jstring server_pub_key) {
return jni_utils::run_catching_cxx_exception_or_throws<jstring>(env, [=]() -> jstring {
return util::jstringFromOptional(env, session::blind25_id(
return jni_utils::jstring_from_optional(env, session::blind25_id(
jni_utils::JavaStringRef(env, session_id).view(),
jni_utils::JavaStringRef(env, server_pub_key).view()
));
)).release();
});
}
79 changes: 46 additions & 33 deletions library/src/main/cpp/config_base.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,43 @@
#include "util.h"
#include "jni_utils.h"


std::pair<std::string, std::vector<unsigned char>> extractHashAndData(JNIEnv *env, jobject kotlin_pair) {
jni_utils::JavaLocalRef<jclass> pair(env, env->GetObjectClass(kotlin_pair));
jfieldID first = env->GetFieldID(pair.get(), "first", "Ljava/lang/Object;");
jfieldID second = env->GetFieldID(pair.get(), "second", "Ljava/lang/Object;");
auto hash_as_jstring = jni_utils::JavaLocalRef(env, reinterpret_cast<jstring>(env->GetObjectField(kotlin_pair, first)));
auto data_as_jbytes = jni_utils::JavaLocalRef(env, reinterpret_cast<jbyteArray>(env->GetObjectField(kotlin_pair, second)));

return std::make_pair(
std::string(jni_utils::JavaStringRef(env, hash_as_jstring.get()).view()),
jni_utils::JavaByteArrayRef(env, data_as_jbytes.get()).copy()
);
}

struct JavaConfigClassInfo : public jni_utils::JavaClassInfo {
jfieldID pointer_field;

JavaConfigClassInfo(JNIEnv *env, jobject obj)
:JavaClassInfo(env, obj),
pointer_field(env->GetFieldID(java_class, "pointer", "J")) {}

static const JavaConfigClassInfo& get(JNIEnv *env, jobject obj) {
static JavaConfigClassInfo class_info(env, obj);
return class_info;
}
};

session::config::ConfigBase* ptrToConfigBase(JNIEnv *env, jobject obj) {
return reinterpret_cast<session::config::ConfigBase*>(
env->GetLongField(obj, JavaConfigClassInfo::get(env, obj).pointer_field));
}

session::config::ConfigSig* ptrToConfigSig(JNIEnv* env, jobject obj) {
return reinterpret_cast<session::config::ConfigSig*>(
env->GetLongField(obj, JavaConfigClassInfo::get(env, obj).pointer_field));
}

extern "C" {
JNIEXPORT jboolean JNICALL
Java_network_loki_messenger_libsession_1util_ConfigBase_dirty(JNIEnv *env, jobject thiz) {
Expand Down Expand Up @@ -33,9 +70,14 @@ Java_network_loki_messenger_libsession_1util_ConfigBase_push(JNIEnv *env, jobjec

jobject obsoleteHashes = jni_utils::jstring_list_from_collection(env, to_delete);

jclass returnObjectClass = env->FindClass("network/loki/messenger/libsession_util/util/ConfigPush");
jmethodID methodId = env->GetMethodID(returnObjectClass, "<init>", "(Ljava/util/List;JLjava/util/List;)V");
return env->NewObject(returnObjectClass, methodId, messages, static_cast<jlong>(seq_no), obsoleteHashes);
static jni_utils::BasicJavaClassInfo class_info(
env,
"network/loki/messenger/libsession_util/util/ConfigPush",
"(Ljava/util/List;JLjava/util/List;)V"
);

return env->NewObject(class_info.java_class, class_info.constructor,
messages, static_cast<jlong>(seq_no), obsoleteHashes);
});
}

Expand All @@ -49,8 +91,7 @@ JNIEXPORT jbyteArray JNICALL
Java_network_loki_messenger_libsession_1util_ConfigBase_dump(JNIEnv *env, jobject thiz) {
auto config = ptrToConfigBase(env, thiz);
auto dumped = config->dump();
jbyteArray bytes = util::bytes_from_vector(env, dumped);
return bytes;
return util::bytes_from_vector(env, dumped).release();
}

JNIEXPORT jstring JNICALL
Expand Down Expand Up @@ -96,34 +137,6 @@ Java_network_loki_messenger_libsession_1util_ConfigBase_merge___3Lkotlin_Pair_2(

#pragma clang diagnostic pop
}
extern "C"
JNIEXPORT jint JNICALL
Java_network_loki_messenger_libsession_1util_ConfigBase_configNamespace(JNIEnv *env, jobject thiz) {
auto conf = ptrToConfigBase(env, thiz);
return (std::int16_t) conf->storage_namespace();
}
extern "C"
JNIEXPORT jclass JNICALL
Java_network_loki_messenger_libsession_1util_ConfigBase_00024Companion_kindFor(JNIEnv *env,
jobject thiz,
jint config_namespace) {
auto user_class = env->FindClass("network/loki/messenger/libsession_util/UserProfile");
auto contact_class = env->FindClass("network/loki/messenger/libsession_util/Contacts");
auto convo_volatile_class = env->FindClass("network/loki/messenger/libsession_util/ConversationVolatileConfig");
auto group_list_class = env->FindClass("network/loki/messenger/libsession_util/UserGroupsConfig");
switch (config_namespace) {
case (int)session::config::Namespace::UserProfile:
return user_class;
case (int)session::config::Namespace::Contacts:
return contact_class;
case (int)session::config::Namespace::ConvoInfoVolatile:
return convo_volatile_class;
case (int)session::config::Namespace::UserGroups:
return group_list_class;
default:
return nullptr;
}
}

extern "C"
JNIEXPORT jobject JNICALL
Expand Down
33 changes: 4 additions & 29 deletions library/src/main/cpp/config_base.h
Original file line number Diff line number Diff line change
@@ -1,36 +1,11 @@
#ifndef SESSION_ANDROID_CONFIG_BASE_H
#define SESSION_ANDROID_CONFIG_BASE_H

#include "session/config/base.hpp"
#include "util.h"
#include "jni_utils.h"
#include <jni.h>
#include <string>
#include <vector>

inline session::config::ConfigBase* ptrToConfigBase(JNIEnv *env, jobject obj) {
auto baseClass = jni_utils::JavaLocalRef(env, env->FindClass("network/loki/messenger/libsession_util/ConfigBase"));
jfieldID pointerField = env->GetFieldID(baseClass.get(), "pointer", "J");
return (session::config::ConfigBase*) env->GetLongField(obj, pointerField);
}
#include <session/config/base.hpp>

inline std::pair<std::string, std::vector<unsigned char>> extractHashAndData(JNIEnv *env, jobject kotlin_pair) {
auto pair = jni_utils::JavaLocalRef(env, env->FindClass("kotlin/Pair"));
jfieldID first = env->GetFieldID(pair.get(), "first", "Ljava/lang/Object;");
jfieldID second = env->GetFieldID(pair.get(), "second", "Ljava/lang/Object;");
auto hash_as_jstring = jni_utils::JavaLocalRef(env, reinterpret_cast<jstring>(env->GetObjectField(kotlin_pair, first)));
auto data_as_jbytes = jni_utils::JavaLocalRef(env, reinterpret_cast<jbyteArray>(env->GetObjectField(kotlin_pair, second)));

return std::make_pair(
std::string(jni_utils::JavaStringRef(env, hash_as_jstring.get()).view()),
jni_utils::JavaByteArrayRef(env, data_as_jbytes.get()).copy()
);
}
#include <jni.h>

inline session::config::ConfigSig* ptrToConfigSig(JNIEnv* env, jobject obj) {
auto sigClass = jni_utils::JavaLocalRef(env, env->FindClass("network/loki/messenger/libsession_util/ConfigSig"));
jfieldID pointerField = env->GetFieldID(sigClass.get(), "pointer", "J");
return (session::config::ConfigSig*) env->GetLongField(obj, pointerField);
}
session::config::ConfigBase* ptrToConfigBase(JNIEnv *env, jobject obj);
session::config::ConfigSig* ptrToConfigSig(JNIEnv* env, jobject obj);

#endif
Loading