31 JAMI_DEBUG(
"Loading account archive ({:d} bytes)",
dat.size());
39 Json::CharReaderBuilder rbuilder;
40 Json::CharReaderBuilder::strictMode(&rbuilder.settings_);
41 auto reader = std::unique_ptr<Json::CharReader>(rbuilder.newCharReader());
43 JAMI_ERR() <<
"Archive JSON parsing error: " <<
err;
44 throw std::runtime_error(
"failed to parse JSON");
51 const auto key =
itr.key().asString();
65 ca_key = std::make_shared<dht::crypto::PrivateKey>(
68 id.first = std::make_shared<dht::crypto::PrivateKey>(
71 id.second = std::make_shared<dht::crypto::Certificate>(
75 dht::InfoHash h {
citr.key().asString()};
76 if (h != dht::InfoHash {})
92 revoked = std::make_shared<dht::crypto::RevocationList>(
97 }
catch (
const std::exception&
ex) {
98 JAMI_ERR(
"Unable to parse JSON entry with value of type %d: %s",
99 (
unsigned)
itr->type(),
103 }
catch (
const std::exception&
ex) {
104 JAMI_ERR(
"Unable to parse JSON: %s",
ex.what());
108 throw std::runtime_error(
"Archive doesn't include account private key");
113AccountArchive::serialize()
const
117 for (
const auto& it : config)
118 root[it.first] = it.second;
120 if (ca_key and *ca_key)
121 root[Conf::RING_CA_KEY] = base64::encode(ca_key->serialize());
123 root[Conf::RING_ACCOUNT_KEY] = base64::encode(
id.first->serialize());
124 root[Conf::RING_ACCOUNT_CERT] = base64::encode(
id.second->getPacked());
125 root[Conf::ETH_KEY] = base64::encode(eth_key);
128 root[Conf::RING_ACCOUNT_CRL] = base64::encode(revoked->getPacked());
130 if (not contacts.empty()) {
131 Json::Value& jsonContacts = root[Conf::RING_ACCOUNT_CONTACTS];
132 for (
const auto& c : contacts)
133 jsonContacts[c.first.toString()] = c.second.toJson();
136 if (not conversations.empty()) {
137 Json::Value& jsonConversations = root[Conf::CONVERSATIONS_KEY];
138 for (
const auto& [key, c] : conversations) {
139 jsonConversations[key] = c.toJson();
143 if (not conversationsRequests.empty()) {
144 Json::Value& jsonConversationsReqs = root[Conf::CONVERSATIONS_REQUESTS_KEY];
145 for (
const auto& [key, value] : conversationsRequests) {
146 jsonConversationsReqs[key] = value.toJson();
150 return json::toString(root);
#define JAMI_DEBUG(formatstr,...)
constexpr const char *const RING_ACCOUNT_CRL
constexpr const char *const RING_ACCOUNT_KEY
constexpr const char *const RING_ACCOUNT_CONTACTS
constexpr const char *const RING_CA_KEY
constexpr const char *const ETH_KEY
constexpr const char *const CONVERSATIONS_KEY
constexpr const char *const RING_ACCOUNT_CERT
constexpr const char *const CONVERSATIONS_REQUESTS_KEY
std::vector< uint8_t > decode(std::string_view str)
void emitSignal(Args... args)
static constexpr const char CA_LIST_FILE[]
static constexpr const char PRIVATE_KEY_FILE[]
static constexpr const char CERTIFICATE_FILE[]
static constexpr const char DHT_PROXY_LIST_URL[]
static constexpr const char PROXY_SERVER[]
static constexpr const char PROXY_ENABLED[]
static constexpr const char PROXY_PUSH_TOKEN[]
static constexpr const char AUTOANSWER[]
std::map< dht::InfoHash, Contact > contacts
Contacts.
void deserialize(std::string_view data, const std::vector< uint8_t > &salt)
Deserialize archive from memory.
std::map< std::string, ConversationRequest > conversationsRequests
std::shared_ptr< dht::crypto::RevocationList > revoked
Revoked devices.
std::shared_ptr< dht::crypto::PrivateKey > ca_key
Generated CA key (for self-signed certificates)
std::vector< uint8_t > password_salt
Salt for the archive encryption password.
std::map< std::string, ConvInfo > conversations
std::vector< uint8_t > eth_key
Ethereum private key.
std::map< std::string, std::string > config
Account configuration.
A ConversationRequest is a request which corresponds to a trust request, but for conversations It's s...