LCOV - code coverage report
Current view: top level - src/jamidht - jamiaccount_config.cpp (source / functions) Coverage Total Hit
Test: jami-coverage-filtered.info Lines: 70.9 % 141 100
Test Date: 2026-06-13 09:18:46 Functions: 50.0 % 6 3

            Line data    Source code
       1              : /*
       2              :  *  Copyright (C) 2004-2026 Savoir-faire Linux Inc.
       3              :  *
       4              :  *  This program is free software: you can redistribute it and/or modify
       5              :  *  it under the terms of the GNU General Public License as published by
       6              :  *  the Free Software Foundation, either version 3 of the License, or
       7              :  *  (at your option) any later version.
       8              :  *
       9              :  *  This program is distributed in the hope that it will be useful,
      10              :  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
      11              :  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
      12              :  *  GNU General Public License for more details.
      13              :  *
      14              :  *  You should have received a copy of the GNU General Public License
      15              :  *  along with this program. If not, see <https://www.gnu.org/licenses/>.
      16              :  */
      17              : #include "jamiaccount_config.h"
      18              : #include "account_const.h"
      19              : #include "account_schema.h"
      20              : #include "configkeys.h"
      21              : #include "fileutils.h"
      22              : #include "config/account_config_utils.h"
      23              : 
      24              : namespace jami {
      25              : 
      26              : namespace Conf {
      27              : constexpr const char* const TLS_KEY = "tls";
      28              : constexpr const char* CERTIFICATE_KEY = "certificate";
      29              : constexpr const char* CALIST_KEY = "calist";
      30              : const char* const TLS_PASSWORD_KEY = "password";
      31              : const char* const PRIVATE_KEY_KEY = "privateKey";
      32              : } // namespace Conf
      33              : 
      34              : static const JamiAccountConfig DEFAULT_CONFIG {};
      35              : 
      36              : void
      37         2563 : JamiAccountConfig::serialize(YAML::Emitter& out) const
      38              : {
      39         2563 :     out << YAML::BeginMap;
      40         2563 :     SipAccountBaseConfig::serializeDiff(out, DEFAULT_CONFIG);
      41         2563 :     SERIALIZE_CONFIG(Conf::DHT_PORT_KEY, dhtPort);
      42         2563 :     SERIALIZE_CONFIG(Conf::DHT_PUBLIC_IN_CALLS, allowPublicIncoming);
      43         2563 :     SERIALIZE_CONFIG(Conf::DHT_ALLOW_PEERS_FROM_HISTORY, allowPeersFromHistory);
      44         2563 :     SERIALIZE_CONFIG(Conf::DHT_ALLOW_PEERS_FROM_CONTACT, allowPeersFromContact);
      45         2563 :     SERIALIZE_CONFIG(Conf::DHT_ALLOW_PEERS_FROM_TRUSTED, allowPeersFromTrusted);
      46         2563 :     SERIALIZE_CONFIG(libjami::Account::ConfProperties::DHT_PEER_DISCOVERY, dhtPeerDiscovery);
      47         2563 :     SERIALIZE_CONFIG(libjami::Account::ConfProperties::ACCOUNT_PEER_DISCOVERY, accountPeerDiscovery);
      48         2563 :     SERIALIZE_CONFIG(libjami::Account::ConfProperties::ACCOUNT_PUBLISH, accountPublish);
      49         2563 :     SERIALIZE_CONFIG(Conf::PROXY_ENABLED_KEY, proxyEnabled);
      50         2563 :     SERIALIZE_CONFIG(Conf::PROXY_SERVER_KEY, proxyServer);
      51         2563 :     SERIALIZE_CONFIG(libjami::Account::ConfProperties::PROXY_LIST_ENABLED, proxyListEnabled);
      52         2563 :     SERIALIZE_CONFIG(libjami::Account::ConfProperties::DHT_PROXY_LIST_URL, proxyListUrl);
      53         2563 :     SERIALIZE_CONFIG(libjami::Account::ConfProperties::DHT_PROXY_SERVER_ENABLED, dhtProxyServerEnabled);
      54         2563 :     SERIALIZE_CONFIG(libjami::Account::ConfProperties::DHT_PROXY_SERVER_PORT, dhtProxyServerPort);
      55         2563 :     SERIALIZE_CONFIG(libjami::Account::ConfProperties::Nameserver::URI, nameServer);
      56         2563 :     SERIALIZE_CONFIG(libjami::Account::VolatileProperties::REGISTERED_NAME, registeredName);
      57         2563 :     SERIALIZE_PATH(libjami::Account::ConfProperties::ARCHIVE_PATH, archivePath);
      58         2563 :     SERIALIZE_CONFIG(libjami::Account::ConfProperties::ARCHIVE_HAS_PASSWORD, archiveHasPassword);
      59         2563 :     SERIALIZE_CONFIG(libjami::Account::ConfProperties::DEVICE_NAME, deviceName);
      60         2563 :     SERIALIZE_CONFIG(libjami::Account::ConfProperties::MANAGER_URI, managerUri);
      61         2563 :     SERIALIZE_CONFIG(libjami::Account::ConfProperties::MANAGER_USERNAME, managerUsername);
      62         2563 :     SERIALIZE_CONFIG(libjami::Account::ConfProperties::DHT::PUBLIC_IN_CALLS, dhtPublicInCalls);
      63              : 
      64         2563 :     out << YAML::Key << Conf::RING_ACCOUNT_RECEIPT << YAML::Value << receipt;
      65         2563 :     if (receiptSignature.size() > 0)
      66              :         out << YAML::Key << Conf::RING_ACCOUNT_RECEIPT_SIG << YAML::Value
      67          869 :             << YAML::Binary(receiptSignature.data(), receiptSignature.size());
      68              : 
      69              :     // tls submap
      70         2563 :     out << YAML::Key << Conf::TLS_KEY << YAML::Value << YAML::BeginMap;
      71         2563 :     SERIALIZE_PATH(Conf::CALIST_KEY, tlsCaListFile);
      72         2563 :     SERIALIZE_PATH(Conf::CERTIFICATE_KEY, tlsCertificateFile);
      73         2563 :     SERIALIZE_CONFIG(Conf::TLS_PASSWORD_KEY, tlsPassword);
      74         2563 :     SERIALIZE_PATH(Conf::PRIVATE_KEY_KEY, tlsPrivateKeyFile);
      75         2563 :     out << YAML::EndMap;
      76              : 
      77         2563 :     out << YAML::EndMap;
      78         2563 : }
      79              : 
      80              : void
      81            0 : JamiAccountConfig::unserialize(const YAML::Node& node)
      82              : {
      83              :     using yaml_utils::parseValueOptional;
      84              :     using yaml_utils::parsePathOptional;
      85            0 :     SipAccountBaseConfig::unserialize(node);
      86              : 
      87              :     // get tls submap
      88              :     try {
      89            0 :         const auto& tlsMap = node[Conf::TLS_KEY];
      90            0 :         parsePathOptional(tlsMap, Conf::CERTIFICATE_KEY, tlsCertificateFile, path);
      91            0 :         parsePathOptional(tlsMap, Conf::CALIST_KEY, tlsCaListFile, path);
      92            0 :         parseValueOptional(tlsMap, Conf::TLS_PASSWORD_KEY, tlsPassword);
      93            0 :         parsePathOptional(tlsMap, Conf::PRIVATE_KEY_KEY, tlsPrivateKeyFile, path);
      94            0 :     } catch (...) {
      95            0 :     }
      96            0 :     parseValueOptional(node, Conf::DHT_PORT_KEY, dhtPort);
      97            0 :     parseValueOptional(node, Conf::DHT_ALLOW_PEERS_FROM_HISTORY, allowPeersFromHistory);
      98            0 :     parseValueOptional(node, Conf::DHT_ALLOW_PEERS_FROM_CONTACT, allowPeersFromContact);
      99            0 :     parseValueOptional(node, Conf::DHT_ALLOW_PEERS_FROM_TRUSTED, allowPeersFromTrusted);
     100              : 
     101            0 :     parseValueOptional(node, Conf::PROXY_ENABLED_KEY, proxyEnabled);
     102            0 :     parseValueOptional(node, Conf::PROXY_SERVER_KEY, proxyServer);
     103            0 :     parseValueOptional(node, libjami::Account::ConfProperties::DHT_PROXY_LIST_URL, proxyListUrl);
     104            0 :     parseValueOptional(node, libjami::Account::ConfProperties::PROXY_LIST_ENABLED, proxyListEnabled);
     105              : 
     106            0 :     parseValueOptional(node, libjami::Account::ConfProperties::DHT_PROXY_SERVER_ENABLED, dhtProxyServerEnabled);
     107            0 :     parseValueOptional(node, libjami::Account::ConfProperties::DHT_PROXY_SERVER_PORT, dhtProxyServerPort);
     108              : 
     109            0 :     parseValueOptional(node, libjami::Account::ConfProperties::DEVICE_NAME, deviceName);
     110            0 :     parseValueOptional(node, libjami::Account::ConfProperties::MANAGER_URI, managerUri);
     111            0 :     parseValueOptional(node, libjami::Account::ConfProperties::MANAGER_USERNAME, managerUsername);
     112            0 :     parseValueOptional(node, libjami::Account::ConfProperties::DHT::PUBLIC_IN_CALLS, dhtPublicInCalls);
     113              : 
     114            0 :     parsePathOptional(node, libjami::Account::ConfProperties::ARCHIVE_PATH, archivePath, path);
     115            0 :     parseValueOptional(node, libjami::Account::ConfProperties::ARCHIVE_HAS_PASSWORD, archiveHasPassword);
     116              : 
     117              :     try {
     118            0 :         parseValueOptional(node, Conf::RING_ACCOUNT_RECEIPT, receipt);
     119            0 :         auto receipt_sig = node[Conf::RING_ACCOUNT_RECEIPT_SIG].as<YAML::Binary>();
     120            0 :         receiptSignature = {receipt_sig.data(), receipt_sig.data() + receipt_sig.size()};
     121            0 :     } catch (const std::exception& e) {
     122            0 :         JAMI_WARNING("Unable to read receipt: {}", e.what());
     123            0 :     }
     124              : 
     125            0 :     parseValueOptional(node, libjami::Account::ConfProperties::DHT_PEER_DISCOVERY, dhtPeerDiscovery);
     126            0 :     parseValueOptional(node, libjami::Account::ConfProperties::ACCOUNT_PEER_DISCOVERY, accountPeerDiscovery);
     127            0 :     parseValueOptional(node, libjami::Account::ConfProperties::ACCOUNT_PUBLISH, accountPublish);
     128            0 :     parseValueOptional(node, libjami::Account::ConfProperties::Nameserver::URI, nameServer);
     129            0 :     parseValueOptional(node, libjami::Account::VolatileProperties::REGISTERED_NAME, registeredName);
     130            0 :     parseValueOptional(node, Conf::DHT_PUBLIC_IN_CALLS, allowPublicIncoming);
     131            0 : }
     132              : 
     133              : std::map<std::string, std::string>
     134          564 : JamiAccountConfig::toMap() const
     135              : {
     136          564 :     std::map<std::string, std::string> a = SipAccountBaseConfig::toMap();
     137          564 :     a.emplace(Conf::CONFIG_DHT_PORT, std::to_string(dhtPort));
     138          564 :     a.emplace(Conf::CONFIG_DHT_PUBLIC_IN_CALLS, allowPublicIncoming ? TRUE_STR : FALSE_STR);
     139          564 :     a.emplace(libjami::Account::ConfProperties::DHT_PEER_DISCOVERY, dhtPeerDiscovery ? TRUE_STR : FALSE_STR);
     140          564 :     a.emplace(libjami::Account::ConfProperties::ACCOUNT_PEER_DISCOVERY, accountPeerDiscovery ? TRUE_STR : FALSE_STR);
     141          564 :     a.emplace(libjami::Account::ConfProperties::ACCOUNT_PUBLISH, accountPublish ? TRUE_STR : FALSE_STR);
     142          564 :     a.emplace(libjami::Account::ConfProperties::DEVICE_NAME, deviceName);
     143          564 :     a.emplace(libjami::Account::ConfProperties::Presence::SUPPORT_SUBSCRIBE, TRUE_STR);
     144          564 :     if (not archivePath.empty() or not managerUri.empty())
     145          564 :         a.emplace(libjami::Account::ConfProperties::ARCHIVE_HAS_PASSWORD, archiveHasPassword ? TRUE_STR : FALSE_STR);
     146              : 
     147          564 :     a.emplace(Conf::CONFIG_TLS_CA_LIST_FILE, fileutils::getFullPath(path, tlsCaListFile).string());
     148          564 :     a.emplace(Conf::CONFIG_TLS_CERTIFICATE_FILE, fileutils::getFullPath(path, tlsCertificateFile).string());
     149          564 :     a.emplace(Conf::CONFIG_TLS_PRIVATE_KEY_FILE, fileutils::getFullPath(path, tlsPrivateKeyFile).string());
     150          564 :     a.emplace(Conf::CONFIG_TLS_PASSWORD, tlsPassword);
     151          564 :     a.emplace(libjami::Account::ConfProperties::ALLOW_CERT_FROM_HISTORY, allowPeersFromHistory ? TRUE_STR : FALSE_STR);
     152          564 :     a.emplace(libjami::Account::ConfProperties::ALLOW_CERT_FROM_CONTACT, allowPeersFromContact ? TRUE_STR : FALSE_STR);
     153          564 :     a.emplace(libjami::Account::ConfProperties::ALLOW_CERT_FROM_TRUSTED, allowPeersFromTrusted ? TRUE_STR : FALSE_STR);
     154          564 :     a.emplace(libjami::Account::ConfProperties::PROXY_ENABLED, proxyEnabled ? TRUE_STR : FALSE_STR);
     155          564 :     a.emplace(libjami::Account::ConfProperties::PROXY_LIST_ENABLED, proxyListEnabled ? TRUE_STR : FALSE_STR);
     156          564 :     a.emplace(libjami::Account::ConfProperties::PROXY_SERVER, proxyServer);
     157          564 :     a.emplace(libjami::Account::ConfProperties::DHT_PROXY_LIST_URL, proxyListUrl);
     158              : 
     159          564 :     a.emplace(libjami::Account::ConfProperties::DHT_PROXY_SERVER_ENABLED, dhtProxyServerEnabled ? TRUE_STR : FALSE_STR);
     160          564 :     a.emplace(libjami::Account::ConfProperties::DHT_PROXY_SERVER_PORT, std::to_string(dhtProxyServerPort));
     161              : 
     162          564 :     a.emplace(libjami::Account::ConfProperties::MANAGER_URI, managerUri);
     163          564 :     a.emplace(libjami::Account::ConfProperties::MANAGER_USERNAME, managerUsername);
     164          564 :     a.emplace(libjami::Account::ConfProperties::DHT::PUBLIC_IN_CALLS, dhtPublicInCalls ? TRUE_STR : FALSE_STR);
     165          564 :     a.emplace(libjami::Account::ConfProperties::Nameserver::URI, nameServer);
     166          564 :     return a;
     167            0 : }
     168              : 
     169              : void
     170         1568 : JamiAccountConfig::fromMap(const std::map<std::string, std::string>& details)
     171              : {
     172         1568 :     SipAccountBaseConfig::fromMap(details);
     173              :     // TLS
     174         1568 :     parsePath(details, Conf::CONFIG_TLS_CA_LIST_FILE, tlsCaListFile, path);
     175         1568 :     parsePath(details, Conf::CONFIG_TLS_CERTIFICATE_FILE, tlsCertificateFile, path);
     176         1568 :     parsePath(details, Conf::CONFIG_TLS_PRIVATE_KEY_FILE, tlsPrivateKeyFile, path);
     177         1568 :     parseString(details, Conf::CONFIG_TLS_PASSWORD, tlsPassword);
     178              : 
     179         1568 :     if (hostname.empty())
     180            0 :         hostname = DHT_DEFAULT_BOOTSTRAP;
     181         1568 :     parseString(details, libjami::Account::ConfProperties::BOOTSTRAP_LIST_URL, bootstrapListUrl);
     182         1568 :     parseInt(details, Conf::CONFIG_DHT_PORT, dhtPort);
     183         1568 :     parseBool(details, Conf::CONFIG_DHT_PUBLIC_IN_CALLS, allowPublicIncoming);
     184         1568 :     parseBool(details, libjami::Account::ConfProperties::DHT_PEER_DISCOVERY, dhtPeerDiscovery);
     185         1568 :     parseBool(details, libjami::Account::ConfProperties::ACCOUNT_PEER_DISCOVERY, accountPeerDiscovery);
     186         1568 :     parseBool(details, libjami::Account::ConfProperties::ACCOUNT_PUBLISH, accountPublish);
     187         1568 :     parseBool(details, libjami::Account::ConfProperties::ALLOW_CERT_FROM_HISTORY, allowPeersFromHistory);
     188         1568 :     parseBool(details, libjami::Account::ConfProperties::ALLOW_CERT_FROM_CONTACT, allowPeersFromContact);
     189         1568 :     parseBool(details, libjami::Account::ConfProperties::ALLOW_CERT_FROM_TRUSTED, allowPeersFromTrusted);
     190              : 
     191         1568 :     parseString(details, libjami::Account::ConfProperties::MANAGER_URI, managerUri);
     192         1568 :     parseString(details, libjami::Account::ConfProperties::MANAGER_USERNAME, managerUsername);
     193         1568 :     parseBool(details, libjami::Account::ConfProperties::DHT::PUBLIC_IN_CALLS, dhtPublicInCalls);
     194              :     // parseString(details, libjami::Account::ConfProperties::USERNAME, username);
     195              : 
     196         1568 :     parseString(details, libjami::Account::ConfProperties::ARCHIVE_PASSWORD, credentials.archive_password);
     197         1568 :     parseString(details, libjami::Account::ConfProperties::ARCHIVE_PASSWORD_SCHEME, credentials.archive_password_scheme);
     198         1568 :     parseString(details, libjami::Account::ConfProperties::ARCHIVE_PATH, credentials.archive_path);
     199         1568 :     parseString(details, libjami::Account::ConfProperties::DEVICE_NAME, deviceName);
     200         1568 :     parseString(details, libjami::Account::ConfProperties::ARCHIVE_URL, archive_url);
     201              : 
     202         1568 :     auto oldProxyServer = proxyServer, oldProxyServerList = proxyListUrl;
     203         1568 :     parseString(details, libjami::Account::ConfProperties::DHT_PROXY_LIST_URL, proxyListUrl);
     204         1568 :     parseBool(details, libjami::Account::ConfProperties::PROXY_ENABLED, proxyEnabled);
     205         1568 :     parseBool(details, libjami::Account::ConfProperties::PROXY_LIST_ENABLED, proxyListEnabled);
     206         1568 :     parseString(details, libjami::Account::ConfProperties::PROXY_SERVER, proxyServer);
     207              : 
     208         1568 :     parseBool(details, libjami::Account::ConfProperties::DHT_PROXY_SERVER_ENABLED, dhtProxyServerEnabled);
     209         1568 :     parseInt(details, libjami::Account::ConfProperties::DHT_PROXY_SERVER_PORT, dhtProxyServerPort);
     210              : 
     211         1568 :     parseString(details, libjami::Account::ConfProperties::UI_CUSTOMIZATION, uiCustomization);
     212         1568 :     if (not managerUri.empty() and managerUri.rfind("http", 0) != 0) {
     213            0 :         managerUri = "https://" + managerUri;
     214              :     }
     215              : 
     216         1568 :     parseString(details, libjami::Account::ConfProperties::Nameserver::URI, nameServer);
     217         1568 : }
     218              : 
     219              : } // namespace jami
        

Generated by: LCOV version 2.0-1