Skip to content

Commit 611a7d1

Browse files
SessionHero01SessionHero01
authored andcommitted
Added integration for new properties in user config
1 parent a23afd0 commit 611a7d1

File tree

13 files changed

+278
-104
lines changed

13 files changed

+278
-104
lines changed

library/src/main/cpp/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ set(SOURCES
9696
webp_utils.cpp
9797
gif_utils.cpp
9898
pro_backend.cpp
99-
pro_proof.cpp
99+
pro_proof_util.cpp
100100

101101
${cgif_SOURCE_DIR}/src/cgif.c
102102
${cgif_SOURCE_DIR}/src/cgif_rgb.c

library/src/main/cpp/pro_backend.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,14 +76,14 @@ Java_network_loki_messenger_libsession_1util_pro_BackendRequests_getPaymentProvi
7676
auto clazz = env->FindClass("network/loki/messenger/libsession_util/protocol/PaymentProviderMetadata");
7777
return env->NewObject(
7878
clazz,
79-
env->GetMethodID(clazz, "<init>", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"),
79+
env->GetMethodID(clazz, "<init>", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"),
8080
util::jstringFromOptional(env, std::string_view(metadata.device.data, metadata.device.size)),
8181
util::jstringFromOptional(env, std::string_view(metadata.store.data, metadata.store.size)),
8282
util::jstringFromOptional(env, std::string_view(metadata.platform.data, metadata.platform.size)),
8383
util::jstringFromOptional(env, std::string_view(metadata.platform_account.data, metadata.platform_account.size)),
84-
util::jstringFromOptional(env, std::string_view(metadata.refund_url.data, metadata.refund_url.size)),
85-
util::jstringFromOptional(env, std::string_view(metadata.refund_after_platform_deadline_url.data, metadata.refund_after_platform_deadline_url.size)),
84+
util::jstringFromOptional(env, std::string_view(metadata.refund_platform_url.data, metadata.refund_platform_url.size)),
8685
util::jstringFromOptional(env, std::string_view(metadata.refund_support_url.data, metadata.refund_support_url.size)),
86+
util::jstringFromOptional(env, std::string_view(metadata.refund_status_url.data, metadata.refund_status_url.size)),
8787
util::jstringFromOptional(env, std::string_view(metadata.update_subscription_url.data, metadata.update_subscription_url.size)),
8888
util::jstringFromOptional(env, std::string_view(metadata.cancel_subscription_url.data, metadata.cancel_subscription_url.size))
8989
);

library/src/main/cpp/pro_proof.cpp

Lines changed: 0 additions & 51 deletions
This file was deleted.
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
#include <session/session_protocol.hpp>
2+
#include <oxenc/base64.h>
3+
#include <oxenc/hex.h>
4+
#include <nlohmann/json.hpp>
5+
#include <jni.h>
6+
7+
#include "util.h"
8+
#include "jni_utils.h"
9+
#include "pro_proof_util.h"
10+
11+
using namespace jni_utils;
12+
13+
template <size_t N>
14+
static std::array<unsigned char, N> from_hex(std::span<char> input) {
15+
std::array<unsigned char, N> output = {0};
16+
oxenc::from_hex(input.begin(), input.end(), output.begin());
17+
return output;
18+
}
19+
20+
session::ProProof java_to_cpp_proof(JNIEnv *env, jobject proof) {
21+
struct ProProofMethods {
22+
jmethodID get_version;
23+
jmethodID get_gen_index_hash;
24+
jmethodID get_rotating_pub_key;
25+
jmethodID get_expiry_ms;
26+
jmethodID get_signature;
27+
28+
ProProofMethods(JNIEnv *env, jclass clazz) {
29+
get_version = env->GetMethodID(clazz, "getVersion", "()I");
30+
get_gen_index_hash = env->GetMethodID(clazz, "getGenIndexHashHex", "()Ljava/lang/String;");
31+
get_rotating_pub_key = env->GetMethodID(clazz, "getRotatingPubKeyHex", "()Ljava/lang/String;");
32+
get_expiry_ms = env->GetMethodID(clazz, "getExpiryMs", "()J");
33+
get_signature = env->GetMethodID(clazz, "getSignatureHex", "()Ljava/lang/String;");
34+
}
35+
};
36+
37+
// Cache method IDs
38+
static ProProofMethods methods(env, jni_utils::JavaLocalRef(env, env->GetObjectClass(proof)).get());
39+
40+
jni_utils::JavaLocalRef<jstring> gen_index_hash(env, (jstring) env->CallObjectMethod(proof, methods.get_gen_index_hash));
41+
jni_utils::JavaLocalRef<jstring> rotating_pub_key(env, (jstring) env->CallObjectMethod(proof, methods.get_rotating_pub_key));
42+
jni_utils::JavaLocalRef<jstring> signature(env, (jstring) env->CallObjectMethod(proof, methods.get_signature));
43+
44+
return {
45+
.version = static_cast<std::uint8_t>(env->CallIntMethod(proof, methods.get_version)),
46+
.gen_index_hash = from_hex<32>(jni_utils::JavaStringRef(env, gen_index_hash.get()).get()),
47+
.rotating_pubkey = from_hex<32>(jni_utils::JavaStringRef(env, rotating_pub_key.get()).get()),
48+
.expiry_unix_ts = std::chrono::sys_time<std::chrono::milliseconds>(
49+
std::chrono::milliseconds(env->CallLongMethod(proof, methods.get_expiry_ms))),
50+
.sig = from_hex<64>(jni_utils::JavaStringRef(env, signature.get()).get()),
51+
};
52+
}
53+
54+
jobject cpp_to_java_proof(JNIEnv *env, const session::ProProof &proof) {
55+
JavaLocalRef<jclass> pro_proof_clazz(env, env->FindClass(
56+
"network/loki/messenger/libsession_util/pro/ProProof"));
57+
jmethodID init = env->GetMethodID(pro_proof_clazz.get(), "<init>", "(I[B[BJ[B)V");
58+
return env->NewObject(
59+
pro_proof_clazz.get(),
60+
init,
61+
static_cast<jint>(proof.version),
62+
util::bytes_from_span(env, proof.gen_index_hash),
63+
util::bytes_from_span(env, proof.rotating_pubkey),
64+
static_cast<jlong>(proof.expiry_unix_ts.time_since_epoch().count()),
65+
util::bytes_from_span(env, proof.sig)
66+
);
67+
}
68+
69+
extern "C"
70+
JNIEXPORT jint JNICALL
71+
Java_network_loki_messenger_libsession_1util_pro_ProProof_nativeStatus(JNIEnv *env, jobject thiz,
72+
jlong now_unix_ts,
73+
jbyteArray verify_pub_key,
74+
jbyteArray signed_message_data,
75+
jbyteArray signed_message_signature) {
76+
return run_catching_cxx_exception_or_throws<jint>(env, [=]() {
77+
std::optional<session::ProSignedMessage> signed_msg;
78+
JavaByteArrayRef signed_message_data_ref(env, signed_message_data);
79+
JavaByteArrayRef signed_message_signature_ref(env, signed_message_signature);
80+
81+
if (signed_message_data && signed_message_signature) {
82+
signed_msg.emplace(session::ProSignedMessage {
83+
.sig = signed_message_signature_ref.get(),
84+
.msg = signed_message_data_ref.get(),
85+
});
86+
}
87+
88+
return static_cast<jint>(java_to_cpp_proof(env, thiz).status(
89+
JavaByteArrayRef(env, verify_pub_key).get(),
90+
std::chrono::sys_time<std::chrono::milliseconds>{std::chrono::milliseconds(now_unix_ts)},
91+
signed_msg
92+
));
93+
});
94+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#pragma once
2+
3+
#include <session/session_protocol.hpp>
4+
#include <jni.h>
5+
6+
session::ProProof java_to_cpp_proof(JNIEnv *, jobject proof);
7+
jobject cpp_to_java_proof(JNIEnv *, const session::ProProof &proof);

library/src/main/cpp/protocol.cpp

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,11 @@
33
#include <session/sodium_array.hpp>
44

55
#include "jni_utils.h"
6+
#include "pro_proof_util.h"
67

78
using namespace jni_utils;
89

910

10-
static JavaLocalRef<jobject> serializeProProof(JNIEnv *env, const session::ProProof &proof) {
11-
JavaLocalRef<jclass> pro_proof_clazz(env, env->FindClass(
12-
"network/loki/messenger/libsession_util/pro/ProProof"));
13-
jmethodID init = env->GetMethodID(pro_proof_clazz.get(), "<init>", "(I[B[BJ[B)V");
14-
return {env, env->NewObject(
15-
pro_proof_clazz.get(),
16-
init,
17-
static_cast<jint>(proof.version),
18-
util::bytes_from_span(env, proof.gen_index_hash),
19-
util::bytes_from_span(env, proof.rotating_pubkey),
20-
static_cast<jlong>(proof.expiry_unix_ts.time_since_epoch().count()),
21-
util::bytes_from_span(env, proof.sig)
22-
)};
23-
}
2411

2512
static JavaLocalRef<jobject> serializeEnvelop(JNIEnv *env, const session::Envelope &envelope) {
2613
JavaLocalRef envelopClass(env, env->FindClass(
@@ -60,7 +47,7 @@ static jobject serializeDecodedEnvelope(JNIEnv *env, const session::DecodedEnvel
6047
serializeEnvelop(env, envelop.envelope).get(),
6148
envelop.pro ? static_cast<jint>(envelop.pro->status)
6249
: static_cast<jint>(-1),
63-
envelop.pro ? serializeProProof(env, envelop.pro->proof).get() : nullptr,
50+
envelop.pro ? JavaLocalRef(env, cpp_to_java_proof(env, envelop.pro->proof)).get() : nullptr,
6451
static_cast<jlong>(envelop.pro ? envelop.pro->features : 0),
6552
content.get(),
6653
sender_ed25519.get(),
@@ -174,7 +161,7 @@ Java_network_loki_messenger_libsession_1util_protocol_SessionProtocol_decodeForC
174161
init,
175162
decoded.pro ? static_cast<jint>(decoded.pro->status)
176163
: static_cast<jint>(-1),
177-
decoded.pro ? serializeProProof(env, decoded.pro->proof).get() : nullptr,
164+
decoded.pro ? JavaLocalRef(env, cpp_to_java_proof(env, decoded.pro->proof)).get() : nullptr,
178165
static_cast<jlong>(decoded.pro ? decoded.pro->features : 0),
179166
util::bytes_from_vector(env, decoded.content_plaintext)
180167
);

library/src/main/cpp/user_profile.cpp

Lines changed: 101 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
#include "user_profile.h"
22
#include "util.h"
3+
#include "pro_proof_util.h"
34

45
extern "C" {
56
JNIEXPORT void JNICALL
67
Java_network_loki_messenger_libsession_1util_UserProfile_setName(
7-
JNIEnv* env,
8+
JNIEnv *env,
89
jobject thiz,
910
jstring newName) {
1011
auto profile = ptrToProfile(env, thiz);
@@ -57,7 +58,7 @@ Java_network_loki_messenger_libsession_1util_UserProfile_setNtsExpiry(JNIEnv *en
5758
jobject expiry_mode) {
5859
auto profile = ptrToProfile(env, thiz);
5960
auto expiry = util::deserialize_expiry(env, expiry_mode);
60-
profile->set_nts_expiry(std::chrono::seconds (expiry.second));
61+
profile->set_nts_expiry(std::chrono::seconds(expiry.second));
6162
}
6263

6364
extern "C"
@@ -66,10 +67,12 @@ Java_network_loki_messenger_libsession_1util_UserProfile_getNtsExpiry(JNIEnv *en
6667
auto profile = ptrToProfile(env, thiz);
6768
auto nts_expiry = profile->get_nts_expiry();
6869
if (nts_expiry == std::nullopt) {
69-
auto expiry = util::serialize_expiry(env, session::config::expiration_mode::none, std::chrono::seconds(0));
70+
auto expiry = util::serialize_expiry(env, session::config::expiration_mode::none,
71+
std::chrono::seconds(0));
7072
return expiry;
7173
}
72-
auto expiry = util::serialize_expiry(env, session::config::expiration_mode::after_send, std::chrono::seconds(*nts_expiry));
74+
auto expiry = util::serialize_expiry(env, session::config::expiration_mode::after_send,
75+
std::chrono::seconds(*nts_expiry));
7376
return expiry;
7477
}
7578

@@ -90,7 +93,7 @@ JNIEXPORT void JNICALL
9093
Java_network_loki_messenger_libsession_1util_UserProfile_setCommunityMessageRequests(
9194
JNIEnv *env, jobject thiz, jboolean blocks) {
9295
auto profile = ptrToProfile(env, thiz);
93-
profile->set_blinded_msgreqs(std::optional{(bool)blocks});
96+
profile->set_blinded_msgreqs(std::optional{(bool) blocks});
9497
}
9598

9699
extern "C"
@@ -113,4 +116,97 @@ JNIEXPORT void JNICALL
113116
Java_network_loki_messenger_libsession_1util_UserProfile_setReuploadedPic(JNIEnv *env, jobject thiz,
114117
jobject user_pic) {
115118
ptrToProfile(env, thiz)->set_reupload_profile_pic(util::deserialize_user_pic(env, user_pic));
119+
}
120+
121+
extern "C"
122+
JNIEXPORT void JNICALL
123+
Java_network_loki_messenger_libsession_1util_UserProfile_removeProConfig(JNIEnv *env,
124+
jobject thiz) {
125+
ptrToProfile(env, thiz)->remove_pro_config();
126+
}
127+
128+
extern "C"
129+
JNIEXPORT void JNICALL
130+
Java_network_loki_messenger_libsession_1util_UserProfile_setProConfig(JNIEnv *env, jobject thiz,
131+
jobject proof,
132+
jbyteArray rotating_private_key) {
133+
jni_utils::run_catching_cxx_exception_or_throws<void>(env, [=]() {
134+
135+
jni_utils::JavaByteArrayRef key_ref(env, rotating_private_key);
136+
auto r = key_ref.get();
137+
session::cleared_uc64 rotating_privkey;
138+
std::copy(r.begin(), r.end(), rotating_privkey.begin());
139+
140+
ptrToProfile(env, thiz)->set_pro_config(
141+
{
142+
.rotating_privkey = rotating_privkey,
143+
.proof = java_to_cpp_proof(env, proof),
144+
}
145+
);
146+
});
147+
}
148+
149+
extern "C"
150+
JNIEXPORT void JNICALL
151+
Java_network_loki_messenger_libsession_1util_UserProfile_setProBadge(JNIEnv *env, jobject thiz,
152+
jboolean pro_badge) {
153+
ptrToProfile(env, thiz)->set_pro_badge(pro_badge);
154+
}
155+
156+
extern "C"
157+
JNIEXPORT void JNICALL
158+
Java_network_loki_messenger_libsession_1util_UserProfile_setAnimatedAvatar(JNIEnv *env,
159+
jobject thiz,
160+
jboolean enabled) {
161+
ptrToProfile(env, thiz)->set_animated_avatar(enabled);
162+
}
163+
164+
extern "C"
165+
JNIEXPORT void JNICALL
166+
Java_network_loki_messenger_libsession_1util_UserProfile_setProAccessExpiryMs(JNIEnv *env,
167+
jobject thiz,
168+
jlong epoch_mills) {
169+
ptrToProfile(env, thiz)->set_pro_access_expiry(std::chrono::sys_time<std::chrono::milliseconds>{
170+
std::chrono::milliseconds{epoch_mills}
171+
});
172+
}
173+
174+
extern "C"
175+
JNIEXPORT void JNICALL
176+
Java_network_loki_messenger_libsession_1util_UserProfile_removeProAccessExpiry(JNIEnv *env,
177+
jobject thiz) {
178+
ptrToProfile(env, thiz)->set_pro_access_expiry(std::nullopt);
179+
}
180+
181+
extern "C"
182+
JNIEXPORT jlong JNICALL
183+
Java_network_loki_messenger_libsession_1util_UserProfile_getProFeaturesRaw(JNIEnv *env,
184+
jobject thiz) {
185+
return static_cast<jlong>(ptrToProfile(env, thiz)->get_pro_features());
186+
}
187+
188+
extern "C"
189+
JNIEXPORT jobject JNICALL
190+
Java_network_loki_messenger_libsession_1util_UserProfile_getProConfig(JNIEnv *env, jobject thiz) {
191+
auto profile = ptrToProfile(env, thiz)->get_pro_config();
192+
if (profile) {
193+
return nullptr;
194+
}
195+
196+
auto clazz = env->FindClass("network/loki/messenger/libsession_util/pro/ProConfig");
197+
auto constructor = env->GetMethodID(clazz, "<init>", "(Lnetwork/loki/messenger/libsession_util/pro/ProProof;[B)V");
198+
199+
return env->NewObject(clazz,
200+
constructor,
201+
cpp_to_java_proof(env, profile->proof),
202+
util::bytes_from_span(env, profile->rotating_privkey)
203+
);
204+
}
205+
206+
extern "C"
207+
JNIEXPORT jlong JNICALL
208+
Java_network_loki_messenger_libsession_1util_UserProfile_getProAccessExpiryMsOrZero(JNIEnv *env,
209+
jobject thiz) {
210+
auto expiry = ptrToProfile(env, thiz)->get_pro_access_expiry();
211+
return expiry ? expiry->time_since_epoch().count() : 0;
116212
}

0 commit comments

Comments
 (0)