39#include <dhtnet/ip_utils.h>
40#include <dhtnet/upnp/upnp_context.h>
41#include <dhtnet/certstore.h>
46#include <TargetConditionals.h>
80std::map<std::string, std::string>
86std::map<std::string, std::string>
92std::map<std::string, std::string>
98 .getSerializedChecks();
99 }
catch (
const std::runtime_error& e) {
100 JAMI_WARN(
"Certificate loading failed: %s", e.what());
105std::map<std::string, std::string>
107 const std::string& certificate,
108 const std::string& privateKey,
109 const std::string& privateKeyPass,
110 const std::string& caList)
114 return TlsValidator {acc->certStore(), certificate, privateKey, privateKeyPass, caList}
116 }
catch (
const std::runtime_error& e) {
117 JAMI_WARN(
"Certificate loading failed: %s", e.what());
123std::map<std::string, std::string>
129 .getSerializedDetails();
130 }
catch (
const std::runtime_error& e) {
131 JAMI_WARN(
"Certificate loading failed: %s", e.what());
136std::map<std::string, std::string>
138 const std::string& certificate,
139 const std::string& privateKey,
140 const std::string& privateKeyPassword)
143 auto crt = std::make_shared<dht::crypto::Certificate>(
146 TlsValidator validator {acc->certStore(), certificate, privateKey, privateKeyPassword};
147 acc->certStore().pinCertificate(validator.getCertificate(),
false);
150 }
catch (
const std::runtime_error& e) {
151 JAMI_WARN(
"Certificate loading failed: %s", e.what());
156std::vector<std::string>
160 return acc->certStore().getPinnedCertificates();
164std::vector<std::string>
165pinCertificate(
const std::string& accountId,
const std::vector<uint8_t>& certificate,
bool local)
168 return acc->certStore().pinCertificate(certificate, local);
176 acc->certStore().pinCertificatePath(path);
183 return acc->certStore().unpinCertificate(certId);
191 return acc->certStore().unpinCertificatePath(path);
199 acc->dht()->findCertificate(dht::InfoHash(certId),
200 [](
const std::shared_ptr<dht::crypto::Certificate>& crt) {});
208 const std::string& certId,
209 const std::string& ststr)
213 auto status = dhtnet::tls::TrustStore::statusFromStr(ststr.c_str());
214 return acc->setCertificateStatus(certId, status);
216 }
catch (
const std::out_of_range&) {
221std::vector<std::string>
224 auto status = dhtnet::tls::TrustStore::statusFromStr(ststr.c_str());
226 return acc->getCertificatesByStatus(status);
231setAccountDetails(
const std::string& accountId,
const std::map<std::string, std::string>& details)
258 return acc->isPasswordValid(password);
266 return acc->getPasswordKey(password);
278 const std::string& to,
279 const std::map<std::string, std::string>& payloads,
282 bool onlyConnected = flags & 0x1;
290 return acc->getLastMessages(base_timestamp);
294std::map<std::string, std::string>
302 const std::string& displayName,
303 const std::string& avatar,
304 const std::string& fileType,
308 acc->updateProfile(displayName, avatar, fileType, flag);
331setIsComposing(
const std::string& accountId,
const std::string& conversationUri,
bool isWriting)
334 acc->setIsComposing(conversationUri, isWriting);
339 const std::string& conversationUri,
340 const std::string& messageId,
344 return acc->setMessageDisplayed(conversationUri, messageId, status);
349addDevice(
const std::string& accountId,
const std::string& uri)
351 JAMI_DEBUG(
"[LinkDevice {}] exportToPeer called.", accountId);
353 return account->addDevice(uri);
362 return account->confirmAddDevice(op_id);
371 return account->cancelAddDevice(op_id);
378 const std::string& credentialsFromUser,
379 const std::string& scheme)
383 account->provideAccountAuthentication(credentialsFromUser, scheme);
391 const std::string& destinationPath,
392 const std::string& scheme,
393 const std::string& password)
396 return account->exportArchive(destinationPath, scheme, password);
403 const std::string& deviceId,
404 const std::string& scheme,
405 const std::string& password)
408 return account->revokeDevice(deviceId, scheme, password);
413std::map<std::string, std::string>
417 return acc->getKnownDevices();
423 const std::string& password_old,
424 const std::string& password_new)
427 return acc->changeArchivePassword(password_old, password_new);
434addContact(
const std::string& accountId,
const std::string& uri)
437 return acc->addContact(uri);
441removeContact(
const std::string& accountId,
const std::string& uri,
bool ban)
444 return acc->removeContact(uri, ban);
447std::map<std::string, std::string>
451 return acc->getContactDetails(uri);
455std::vector<std::map<std::string, std::string>>
459 return acc->getContacts();
464std::vector<std::map<std::string, std::string>>
468 return acc->getTrustRequests();
476 return acc->acceptTrustRequest(from);
484 return acc->discardTrustRequest(from);
490 const std::string& to,
491 const std::vector<uint8_t>& payload)
494 acc->sendTrustRequest(to, payload);
498std::map<std::string, std::string>
509addAccount(
const std::map<std::string, std::string>& details,
const std::string& accountId)
520std::vector<std::map<std::string, std::string>>
526std::vector<std::map<std::string, std::string>>
538std::vector<std::string>
551 std::vector<unsigned> list {
558std::vector<std::string>
564std::vector<std::string>
569 JAMI_ERR(
"SIP account %s doesn't exist", accountId.c_str());
575 const unsigned& codecId,
576 const std::map<std::string, std::string>& details)
580 JAMI_ERR(
"Unable to find account %s. Unable to set codec details", accountId.c_str());
586 JAMI_ERR(
"Unable to find codec %d", codecId);
591 if (
auto foundCodec = std::static_pointer_cast<jami::SystemAudioCodecInfo>(codec)) {
592 foundCodec->setCodecSpecifications(details);
599 if (
auto foundCodec = std::static_pointer_cast<jami::SystemVideoCodecInfo>(codec)) {
600 foundCodec->setCodecSpecifications(details);
601 JAMI_WARN(
"parameters for %s changed ", foundCodec->name.c_str());
603 if (call->getVideoCodec() == foundCodec) {
604 JAMI_WARN(
"%s running. Need to restart encoding", foundCodec->name.c_str());
605 call->restartMediaSender();
612 }
catch (
const std::exception& e) {
613 JAMI_ERR(
"Unable to set codec specifications: %s", e.what());
619std::map<std::string, std::string>
624 JAMI_ERR(
"Unable to find account %s return default codec details", accountId.c_str());
635 if (
auto foundCodec = std::static_pointer_cast<jami::SystemAudioCodecInfo>(codec))
636 return foundCodec->getCodecSpecifications();
639 if (
auto foundCodec = std::static_pointer_cast<jami::SystemVideoCodecInfo>(codec))
640 return foundCodec->getCodecSpecifications();
650 return acc->getActiveCodecs();
651 JAMI_ERR(
"Unable to find account %s, returning default", accountId.c_str());
659 acc->setActiveCodecs(list);
662 JAMI_ERR(
"Unable to find account %s", accountId.c_str());
666std::vector<std::string>
678std::vector<std::string>
684std::vector<std::string>
714std::vector<std::string>
736 JAMI_DBG(
"Get audio plugin %s", plugin.c_str());
850std::vector<std::string>
872 JAMI_DBG(
"set volume for %s: %f", device.c_str(), value);
874 if (device ==
"speaker")
875 audiolayer->setPlaybackGain(value);
876 else if (device ==
"mic")
877 audiolayer->setCaptureGain(value);
881 JAMI_ERR(
"Audio layer not valid while updating volume");
889 if (device ==
"speaker")
890 return audiolayer->getPlaybackGain();
892 return audiolayer->getCaptureGain();
895 JAMI_ERR(
"Audio layer not valid while updating volume");
917 return audiolayer->isCaptureMuted();
927 return audiolayer->muteCapture(mute);
937 return audiolayer->isPlaybackMuted();
947 return audiolayer->mutePlayback(mute);
957 return audiolayer->isRingtoneMuted();
967 return audiolayer->muteRingtone(mute);
982 return dhtnet::ip_utils::getInterfaceAddr(interface, AF_INET);
985std::vector<std::string>
988 return dhtnet::ip_utils::getAllIpInterface();
991std::vector<std::string>
994 return dhtnet::ip_utils::getAllIpInterfaceByName();
997std::vector<std::map<std::string, std::string>>
1001 return sipaccount->getCredentials();
1007 const std::vector<std::map<std::string, std::string>>& details)
1010 sipaccount->doUnregister();
1011 sipaccount->editConfig(
1013 sipaccount->loadConfig();
1014 if (sipaccount->isEnabled())
1015 sipaccount->doRegister();
1023 JAMI_WARN(
"received connectivity changed - attempting to re-connect enabled accounts");
1026#if !(defined(TARGET_OS_IOS) && TARGET_OS_IOS)
1029 }
catch (std::runtime_error& e) {
1030 JAMI_ERR(
"UPnP context error: %s", e.what());
1035 account->connectivityChanged();
1040lookupName(
const std::string& account,
const std::string& nameserver,
const std::string& name)
1043 if (account.empty()) {
1044 auto cb = [name](
const std::string& regName,
1045 const std::string& address,
1053 if (nameserver.empty())
1059 acc->lookupName(name);
1067lookupAddress(
const std::string& account,
const std::string& nameserver,
const std::string& address)
1070 if (account.empty()) {
1073 [address](
const std::string& regName,
1074 const std::string& addr,
1077 "", address, (
int) response, addr, regName);
1081 acc->lookupAddress(address);
1092 return acc->searchUser(query);
1099 const std::string& name,
1100 const std::string& scheme,
1101 const std::string& password)
1105 acc->registerName(name, scheme, password);
1116 account->setPushNotificationToken(token);
1124 account->setPushNotificationTopic(topic);
1132 account->setPushNotificationConfig(data);
1140 auto it = data.find(
"to");
1141 if (it != data.end()) {
1143 account->pushNotificationReceived(from, data);
1145#if defined(__ANDROID__) || defined(ANDROID) || defined(__Apple__)
1148 sipAccount->pushNotificationReceived(from, data);
1152 }
catch (
const std::exception& e) {
1153 JAMI_ERR(
"Error processing push notification: %s", e.what());
1175std::vector<std::string>
Account specific keys/constants that must be shared in daemon and clients.
static std::vector< unsigned > getDefaultCodecsId()
static std::map< std::string, std::string > getDefaultCodecDetails(const unsigned &codecId)
bool setRecordPath(const std::string &r)
static std::vector< std::string > getSupportedAudioManagers()
const std::string & getRecordPath() const
Ring Account is build on top of SIPAccountBase and uses DHT to handle call connectivity.
void setRingingTimeout(int timeout)
Set ringing timeout (number of seconds after which a call will enter BUSY state if not answered).
void setAudioDevice(int index, AudioDeviceType streamType)
Set audio device.
std::map< std::string, std::string > getAccountDetails(const std::string &accountID) const
Retrieve details about a given account.
void enableLocalModerators(const std::string &accountID, bool state)
void loadAccountAndConversation(const std::string &accountId, bool loadAll, const std::string &convId)
std::vector< std::shared_ptr< T > > getAllAccounts() const
Get a list of account pointers of type T (baseclass Account)
std::vector< std::string > getDefaultModerators(const std::string &accountID)
std::vector< std::string > getAccountList() const
Get account list.
bool isLocalModeratorsEnabled(const std::string &accountID)
void setAccountsOrder(const std::string &order)
Set the account order in the config file.
void setAllModerators(const std::string &accountID, bool allModerators)
std::vector< std::map< std::string, std::string > > getConnectionList(const std::string &accountId, const std::string &conversationId)
static LIBJAMI_TEST_EXPORT Manager & instance()
void setAccountActive(const std::string &accountID, bool active, bool shutdownConnections)
void registerAccounts()
Send registration for all enabled accounts.
std::shared_ptr< dhtnet::upnp::UPnPContext > upnpContext() const
void setHistoryLimit(int days)
Set the maximum number of days to keep in the history.
std::map< std::string, std::string > getVolatileAccountDetails(const std::string &accountID) const
Retrieve volatile details such as recent registration errors.
std::shared_ptr< T > getAccount(std::string_view accountId) const
Get an account pointer, looks for account of type T.
std::vector< std::string > getAudioOutputDeviceList()
Get list of supported audio output device.
bool getIsAlwaysRecording() const
Get is always recording functionality.
void setAccountDetails(const std::string &accountID, const std::map< std::string, std::string > &details)
Save the details of an existing account, given the account ID This will load the configuration map wi...
std::string addAccount(const std::map< std::string, std::string > &details, const std::string &accountId={})
Add a new account, and give it a new account ID automatically.
void saveConfig()
Save config to file.
void setNoiseSuppressState(const std::string &state)
Set the noise reduction engine state in the current audio layer.
std::vector< std::map< std::string, std::string > > getChannelList(const std::string &accountId, const std::string &connectionId)
std::string getAudioManager() const
Get the audio manager.
void setAudioPlugin(const std::string &audioPlugin)
Set input audio plugin.
void setDefaultModerator(const std::string &accountID, const std::string &peerURI, bool state)
std::map< std::string, std::string > getNearbyPeers(const std::string &accountID)
bool setAudioManager(const std::string &api)
Set the audio manager.
RingBufferPool & getRingBufferPool()
Return a pointer to the instance of the RingBufferPool.
int getRingingTimeout() const
Get ringing timeout (number of seconds after which a call will enter BUSY state if not answered).
int getAudioInputDeviceIndex(const std::string &name)
Get index of an audio device.
VoipPreference voipPreferences
Voip related preferences.
void monitor(bool continuous)
uint64_t sendTextMessage(const std::string &accountID, const std::string &to, const std::map< std::string, std::string > &payloads, bool fromPlugin=false, bool onlyConnected=false)
int getHistoryLimit() const
Get the maximum number of days to keep in the history.
bool isAllModerators(const std::string &accountID)
std::string getCurrentAudioOutputPlugin() const
Get current alsa plugin.
void setIsAlwaysRecording(bool isAlwaysRec)
Set is always recording functionality, every calls will then be set in RECORDING mode once answered.
std::string getNoiseSuppressState() const
Get the noise reduction engine state from the current audio layer.
void removeAccount(const std::string &accountID, bool flush=false)
Delete an existing account, unregister VoIPLink associated, and purge from configuration.
bool isAGCEnabled() const
void setAGCState(bool enabled)
void sendRegister(const std::string &accountId, bool enable)
ConfigurationManager - Send registration request.
std::vector< std::string > getAudioInputDeviceList()
Get list of supported audio input device.
AudioPreference audioPreference
Audio preferences.
int getAudioOutputDeviceIndex(const std::string &name)
int getMessageStatus(uint64_t id) const
std::vector< std::string > getCurrentAudioDevicesIndex()
Get string array representing integer indexes of output, input, and ringtone device.
void lookupName(const std::string &name, LookupCallback cb)
void lookupAddress(const std::string &addr, LookupCallback cb)
static void lookupUri(std::string_view uri, const std::string &default_server, LookupCallback cb)
static NameDirectory & instance()
void setAudioMeterState(const std::string &id, bool state)
bool isAudioMeterActive(const std::string &id)
static const std::vector< std::string > & getSupportedTlsCiphers()
static const std::vector< std::string > & getSupportedTlsProtocols()
void setPlayDtmf(bool dtmf)
std::shared_ptr< dht::crypto::Certificate > getCertificate() const
std::map< std::string, std::string > getSerializedChecks()
Convert all checks results into a string map.
std::map< std::string, std::string > getSerializedDetails()
Get a map with all common certificate details.
#define JAMI_DEBUG(formatstr,...)
void set_resource_dir_path(const std::filesystem::path &resourceDirPath)
Set the program's resource directory path.
std::vector< uint8_t > loadFile(const std::filesystem::path &path, const std::filesystem::path &default_dir)
Read the full content of a file at path.
decltype(getGlobalInstance< SystemCodecContainer >) & getSystemCodecContainer
void emitSignal(Args... args)
static constexpr const char RING[]
static constexpr const char SIP[]
static constexpr char FAILED[]
static constexpr char EXIST[]
std::vector< std::string > getDefaultModerators(const std::string &accountId)
Get default moderators for an account.
bool unpinCertificate(const std::string &accountId, const std::string &certId)
bool cancelMessage(const std::string &accountId, uint64_t messageId)
void setRingingTimeout(int32_t timeout)
void muteRingtone(bool mute)
std::vector< std::string > pinCertificate(const std::string &accountId, const std::vector< uint8_t > &certificate, bool local)
std::vector< Message > getLastMessages(const std::string &accountId, const uint64_t &base_timestamp)
void setAudioPlugin(const std::string &audioPlugin)
void setActiveCodecList(const std::string &accountId, const std::vector< unsigned > &list)
void setAccountDetails(const std::string &accountId, const std::map< std::string, std::string > &details)
void setHistoryLimit(int32_t days)
void setAccountsOrder(const std::string &order)
void setVolume(const std::string &device, double value)
std::vector< std::map< std::string, std::string > > getChannelList(const std::string &accountId, const std::string &connectionId)
std::vector< unsigned > getCodecList()
Send the list of all codecs loaded to the client through DBus.
bool isLocalModeratorsEnabled(const std::string &accountId)
Get local moderators state.
void setRecordPath(const std::string &recPath)
bool setCertificateStatus(const std::string &accountId, const std::string &certId, const std::string &ststr)
bool setAudioManager(const std::string &api)
uint64_t sendAccountTextMessage(const std::string &accountId, const std::string &to, const std::map< std::string, std::string > &payloads, int32_t flags)
void setAudioRingtoneDevice(int32_t index)
std::string getAddrFromInterfaceName(const std::string &interface)
bool lookupName(const std::string &account, const std::string &nameserver, const std::string &name)
int32_t getRecordQuality()
std::vector< std::string > getAudioPluginList()
void loadAccountAndConversation(const std::string &accountId, bool loadAll, const std::string &convId)
bool searchUser(const std::string &account, const std::string &query)
int32_t getAudioOutputDeviceIndex(const std::string &name)
void setPushNotificationToken(const std::string &token)
Set the device push notification token (for all accounts).
void setAudioMeterState(const std::string &id, bool state)
Enables/disables an audio meter for the specified @id.
bool confirmAddDevice(const std::string &accountId, uint32_t op_id)
void setIsAlwaysRecording(bool rec)
int32_t getRingingTimeout()
bool setCodecDetails(const std::string &accountId, const unsigned &codecId, const std::map< std::string, std::string > &details)
void mutePlayback(bool mute)
void sendTrustRequest(const std::string &accountId, const std::string &to, const std::vector< uint8_t > &payload)
void pushNotificationReceived(const std::string &from, const std::map< std::string, std::string > &data)
To be called by clients with relevant data when a push notification is received.
void registerConfHandlers(const std::map< std::string, std::shared_ptr< CallbackWrapperBase > > &handlers)
std::vector< std::string > getPinnedCertificates(const std::string &accountId)
std::map< std::string, std::string > getCertificateDetailsPath(const std::string &accountId, const std::string &certificate, const std::string &privateKey, const std::string &privateKeyPassword)
std::vector< std::string > getAccountList()
bool isAllModerators(const std::string &accountId)
Get all moderators state.
std::vector< unsigned > getActiveCodecList(const std::string &accountId)
std::vector< std::string > getSupportedAudioManagers()
std::map< std::string, std::string > getContactDetails(const std::string &accountId, const std::string &uri)
int32_t getAudioInputDeviceIndex(const std::string &name)
void updateProfile(const std::string &accountId, const std::string &displayName, const std::string &avatar, const std::string &fileType, int32_t flag)
void setAccountActive(const std::string &accountId, bool enable, bool shutdownConnections)
std::map< std::string, std::string > getCodecDetails(const std::string &accountId, const unsigned &codecId)
std::string addAccount(const std::map< std::string, std::string > &details, const std::string &accountId)
int32_t addDevice(const std::string &accountId, const std::string &uri)
bool acceptTrustRequest(const std::string &accountId, const std::string &from)
void setIsComposing(const std::string &accountId, const std::string &conversationUri, bool isWriting)
void setRecordPreview(bool rec)
void muteCapture(bool mute)
bool revokeDevice(const std::string &accountId, const std::string &deviceId, const std::string &scheme, const std::string &password)
bool changeAccountPassword(const std::string &accountId, const std::string &password_old, const std::string &password_new)
void setResourceDirPath(const std::string &resourceDir)
Set the resource directory path.
void setAudioInputDevice(int32_t index)
std::string getCurrentAudioOutputPlugin()
std::vector< std::string > getAllIpInterface()
bool pinRemoteCertificate(const std::string &accountId, const std::string &certId)
void setPushNotificationTopic(const std::string &topic)
Set the topic for ios bundle_id for ios 14.5 and higher bundle_id.voip for ios prior 14....
double getVolume(const std::string &device)
void setAudioOutputDevice(int32_t index)
std::vector< std::string > getCertificatesByStatus(const std::string &accountId, const std::string &ststr)
void registerSignalHandlers(const std::map< std::string, std::shared_ptr< CallbackWrapperBase > > &handlers)
std::map< std::string, std::string > getCertificateDetails(const std::string &accountId, const std::string &certificate)
std::vector< std::map< std::string, std::string > > getCredentials(const std::string &accountId)
constexpr unsigned CODECS_NOT_LOADED
std::string getRecordPath()
bool isAudioMeterActive(const std::string &id)
Returns whether or not the audio meter is enabled for ring buffer @id.
bool getIsAlwaysRecording()
std::vector< std::string > getAllIpInterfaceByName()
void sendRegister(const std::string &accountId, bool enable)
std::string getNoiseSuppressState()
bool exportToFile(const std::string &accountId, const std::string &destinationPath, const std::string &scheme, const std::string &password)
int32_t getHistoryLimit()
void setNoiseSuppressState(const std::string &state)
bool lookupAddress(const std::string &account, const std::string &nameserver, const std::string &address)
std::vector< std::map< std::string, std::string > > getConnectionList(const std::string &accountId, const std::string &conversationId)
bool registerName(const std::string &account, const std::string &name, const std::string &scheme, const std::string &password)
std::vector< std::string > getAudioInputDeviceList()
bool isPasswordValid(const std::string &accountId, const std::string &password)
std::vector< uint8_t > getPasswordKey(const std::string &accountID, const std::string &password)
std::vector< std::string > getCurrentAudioDevicesIndex()
std::vector< std::map< std::string, std::string > > getTrustRequests(const std::string &accountId)
void setAgcState(bool enabled)
void enableLocalModerators(const std::string &accountId, bool isModEnabled)
Enable/disable local moderators for conferences.
void addContact(const std::string &accountId, const std::string &uri)
std::map< std::string, std::string > getKnownRingDevices(const std::string &accountId)
void removeAccount(const std::string &accountId)
void setRecordQuality(int32_t quality)
std::map< std::string, std::string > getAccountDetails(const std::string &accountId)
bool provideAccountAuthentication(const std::string &accountId, const std::string &credentialsFromUser, const std::string &scheme)
std::vector< std::string > getSupportedTlsMethod()
bool discardTrustRequest(const std::string &accountId, const std::string &from)
void setAllModerators(const std::string &accountId, bool allModerators)
Enable/disable all moderators for conferences.
int getMessageStatus(uint64_t messageId)
std::vector< std::string > getAudioOutputDeviceList()
std::map< std::string, std::string > getVolatileAccountDetails(const std::string &accountId)
void setCredentials(const std::string &accountId, const std::vector< std::map< std::string, std::string > > &details)
void connectivityChanged()
bool setMessageDisplayed(const std::string &accountId, const std::string &conversationUri, const std::string &messageId, int status)
void pinCertificatePath(const std::string &accountId, const std::string &path)
std::map< std::string, std::string > getAccountTemplate(const std::string &accountType)
This function is used as a base for new accounts for clients that support it.
void removeContact(const std::string &accountId, const std::string &uri, bool ban)
std::map< std::string, std::string > validateCertificate(const std::string &accountId, const std::string &certificate)
std::map< std::string, std::string > getNearbyPeers(const std::string &accountId)
bool cancelAddDevice(const std::string &accountId, uint32_t op_id)
void registerAllAccounts()
std::vector< std::map< std::string, std::string > > getContacts(const std::string &accountId)
void setPushNotificationConfig(const std::map< std::string, std::string > &data)
void monitor(bool continuous)
unsigned unpinCertificatePath(const std::string &accountId, const std::string &path)
std::vector< std::string > getSupportedCiphers(const std::string &accountId)
void setDefaultModerator(const std::string &accountId, const std::string &peerURI, bool state)
Add/remove default moderator for conferences.
std::map< std::string, std::string > validateCertificatePath(const std::string &accountId, const std::string &certificate, const std::string &privateKey, const std::string &privateKeyPass, const std::string &caList)
std::string getAudioManager()
A SIP Account specify SIP specific functions and object = SIPCall/SIPVoIPLink)
std::map< std::string, std::string > toMap() const override
std::map< std::string, std::string > toMap() const override
void setCredentials(const std::vector< std::map< std::string, std::string > > &creds)