Skip to content

Commit a3f1685

Browse files
authored
Merge pull request #50 from session-foundation/feat/add-contact-pro-details-tracking
feat: add tracking of pro features for contacts/convo
2 parents 0efc996 + aac9e56 commit a3f1685

File tree

16 files changed

+261
-102
lines changed

16 files changed

+261
-102
lines changed

include/pro/types.hpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,12 @@ struct toJs_impl<session::DecodedPro> {
6969
Napi::Object operator()(const Napi::Env& env, const session::DecodedPro decoded_pro) {
7070
auto obj = Napi::Object::New(env);
7171

72-
obj["proStatus"] =
73-
toJs(env,
74-
decoded_pro.status == ProStatus::InvalidProBackendSig ? "InvalidProBackendSig"
75-
: decoded_pro.status == ProStatus::InvalidUserSig ? "InvalidUserSig"
76-
: "Valid");
72+
obj["proStatus"] = toJs(
73+
env,
74+
decoded_pro.status == ProStatus::Valid || decoded_pro.status == ProStatus::Expired
75+
? "ValidOrExpired"
76+
: decoded_pro.status == ProStatus::InvalidProBackendSig ? "InvalidProBackendSig"
77+
: "InvalidUserSig");
7778
obj["proProof"] = toJs(env, decoded_pro.proof);
7879
obj["proProfileBitset"] = proProfileBitsetToJS(env, decoded_pro.profile_bitset);
7980
obj["proMessageBitset"] = proMessageBitsetToJS(env, decoded_pro.msg_bitset);

include/user_config.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,11 @@ class UserConfigWrapper : public ConfigBaseImpl, public Napi::ObjectWrap<UserCon
4040
void setProConfig(const Napi::CallbackInfo& info);
4141
Napi::Value removeProConfig(const Napi::CallbackInfo& info);
4242

43+
Napi::Value getProAccessExpiry(const Napi::CallbackInfo& info);
4344
Napi::Value getProProfileBitset(const Napi::CallbackInfo& info);
4445
void setProBadge(const Napi::CallbackInfo& info);
4546
void setAnimatedAvatar(const Napi::CallbackInfo& info);
47+
void setProAccessExpiry(const Napi::CallbackInfo& info);
4648

4749
Napi::Value generateProMasterKey(const Napi::CallbackInfo& info);
4850
Napi::Value generateRotatingPrivKeyHex(const Napi::CallbackInfo& info);

include/utilities.hpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <vector>
1414

1515
#include "oxen/log/catlogger.hpp"
16+
#include "oxenc/base64.h"
1617
#include "oxenc/hex.h"
1718
#include "session/config/namespaces.hpp"
1819
#include "session/config/profile_pic.hpp"
@@ -43,6 +44,7 @@ void assertInfoMinLength(const Napi::CallbackInfo& info, const int minLength);
4344

4445
void assertIsStringOrNull(const Napi::Value& value, const std::string& identifier = "");
4546
void assertIsNumber(const Napi::Value& value, const std::string& identifier);
47+
void assertIsNumberOrNull(const Napi::Value& val, const std::string& identifier);
4648
void assertIsBigint(const Napi::Value& val, const std::string& identifier);
4749
void assertIsArray(const Napi::Value& value, const std::string& identifier);
4850
void assertIsObject(const Napi::Value& value);
@@ -80,10 +82,15 @@ int64_t toCppInteger(Napi::Value x, const std::string& identifier, bool allowUnd
8082
int64_t toCppIntegerB(Napi::Value x, const std::string& identifier, bool allowUndefined = false);
8183

8284
std::optional<int64_t> maybeNonemptyInt(Napi::Value x, const std::string& identifier);
85+
std::optional<int64_t> maybeNonemptyIntB(Napi::Value x, const std::string& identifier);
86+
8387
std::optional<bool> maybeNonemptyBoolean(Napi::Value x, const std::string& identifier);
8488
std::optional<std::chrono::sys_seconds> maybeNonemptySysSeconds(
8589
Napi::Value x, const std::string& identifier);
8690

91+
std::optional<std::chrono::sys_time<std::chrono::milliseconds>> maybeNonemptyTimeMs(
92+
Napi::Value x, const std::string& identifier);
93+
8794
std::chrono::sys_seconds toCppSysSeconds(Napi::Value x, const std::string& identifier);
8895
std::chrono::sys_time<std::chrono::milliseconds> toCppSysMs(
8996
Napi::Value x, const std::string& identifier);
@@ -425,6 +432,21 @@ std::array<uint8_t, N> from_hex_to_array(std::string x) {
425432
return result;
426433
}
427434

435+
template <std::size_t N>
436+
std::array<uint8_t, N> from_base64_to_array(std::string x) {
437+
std::string as_b64 = oxenc::from_base64(x);
438+
if (as_b64.size() != N) {
439+
throw std::invalid_argument(fmt::format(
440+
"from_base64_to_array: Decoded v64 size mismatch: expected {}, got {}",
441+
N,
442+
as_b64.size()));
443+
}
444+
445+
std::array<uint8_t, N> result;
446+
std::memcpy(result.data(), as_b64.data(), N);
447+
return result;
448+
}
449+
428450
std::vector<unsigned char> from_hex_to_vector(std::string_view x);
429451

430452
std::span<const uint8_t> from_base64_to_span(std::string_view x);

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"main": "index.js",
33
"name": "libsession_util_nodejs",
44
"description": "Wrappers for the Session Util Library",
5-
"version": "0.6.5",
5+
"version": "0.6.6",
66
"license": "GPL-3.0",
77
"author": {
88
"name": "Oxen Project",

src/constants.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include "session/config/groups/info.hpp"
66
#include "session/config/user_groups.hpp"
77
#include "session/pro_backend.h"
8+
#include "session/session_protocol.h"
89
#include "session/version.h"
910
#include "utilities.hpp"
1011
#include "version.h"
@@ -17,11 +18,11 @@ Napi::Object ConstantsWrapper::Init(Napi::Env env, Napi::Object exports) {
1718
const char* class_name = "CONSTANTS";
1819

1920
auto pro_urls = Napi::Object::New(env);
20-
pro_urls["roadmap"] = toJs(env, SESSION_PRO_URLS.roadmap);
21-
pro_urls["privacy_policy"] = toJs(env, SESSION_PRO_URLS.privacy_policy);
22-
pro_urls["terms_of_service"] = toJs(env, SESSION_PRO_URLS.terms_of_service);
23-
pro_urls["pro_access_not_found"] = toJs(env, SESSION_PRO_URLS.pro_access_not_found);
24-
pro_urls["support_url"] = toJs(env, SESSION_PRO_URLS.support_url);
21+
pro_urls["roadmap"] = toJs(env, SESSION_PROTOCOL_STRINGS.url_pro_roadmap);
22+
pro_urls["privacy_policy"] = toJs(env, SESSION_PROTOCOL_STRINGS.url_privacy_policy);
23+
pro_urls["terms_of_service"] = toJs(env, SESSION_PROTOCOL_STRINGS.url_terms_of_service);
24+
pro_urls["pro_access_not_found"] = toJs(env, SESSION_PROTOCOL_STRINGS.url_pro_access_not_found);
25+
pro_urls["support_url"] = toJs(env, SESSION_PROTOCOL_STRINGS.url_pro_support);
2526

2627
auto pro_provider_nil = Napi::Object::New(env);
2728
pro_provider_nil["device"] = toJs(

src/contacts_config.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include "profile_pic.hpp"
66
#include "session/config/expiring.hpp"
77
#include "session/types.hpp"
8+
#include "utilities.hpp"
89

910
namespace session::nodeapi {
1011

@@ -51,6 +52,7 @@ struct toJs_impl<contact_info> {
5152
obj["expirationMode"] = toJs(env, expiration_mode_string(contact.exp_mode));
5253
obj["expirationTimerSeconds"] = toJs(env, contact.exp_timer.count());
5354
obj["profilePicture"] = toJs(env, contact.profile_picture);
55+
obj["proProfileBitset"] = proProfileBitsetToJS(env, contact.profile_bitset);
5456

5557
return obj;
5658
}
@@ -160,6 +162,11 @@ void ContactsConfigWrapper::set(const Napi::CallbackInfo& info) {
160162
contact.profile_picture.clear();
161163
}
162164

165+
if (auto proProfileBitset = maybeNonemptyIntB(
166+
obj.Get("proProfileBitset"), "ContactsConfigWrapper.set proProfileBitset")) {
167+
contact.profile_bitset.data = *proProfileBitset;
168+
}
169+
163170
config.set(contact);
164171
});
165172
}

0 commit comments

Comments
 (0)