Zarządzanie kontami
W tej części dowiemy się, jak zarządzać kontem Jami. Oznacza to, jak utworzyć konto Jami, zmodyfikować podstawowe ustawienia i usunąć konto. Ta część NIE wyjaśni, co oznaczają wszystkie ustawienia ani jak możemy użyć konta do wykonania jakiejkolwiek czynności, takiej jak dodanie kontaktu.
Czym jest konto
W Jami konto jest łańcuchem certyfikatów X509 zawierającym zazwyczaj 3 certyfikaty:
CA (samodzielnie podpisany, jeśli wygenerowany lokalnie lub przez firmę)
Konto (gdzie odcisk palca klucza publicznego nazywany jest „Jami ID”)
Urządzenie
Dzięki temu firma może w razie potrzeby cofnąć dostęp do konta, a konto może cofnąć dostęp do urządzenia (na przykład w przypadku kradzieży).
Tworzenie nowego konta
/Stronka demonów
API
W cx.ring.Ring.ConfigurationManager:
<method name="addAccount" tp:name-for-bindings="addAccount">
<tp:docstring>
Add a new account. When created, the signal <tp:member-ref>accountsChanged</tp:member-ref> is emitted. The clients must then call <tp:member-ref>getAccountList</tp:member-ref> to update their internal data structure.
<tp:rationale>If no details are specified, the default parameters are used.</tp:rationale>
<tp:rationale>The core tries to register the account as soon it is created.</tp:rationale>
</tp:docstring>
<annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="MapStringString"/>
<arg type="a{ss}" name="details" direction="in" tp:type="String_String_Map">
<tp:docstring>
The new account settings
</tp:docstring>
</arg>
<arg type="s" name="createdAccountId" direction="out">
<tp:docstring>
A new account ID
</tp:docstring>
</arg>
</method>
The details can be retrieved from the method getAccountTemplate(type)
with type=JAMI
or type=SIP
. For example, this is the following code used in LRC.
std::string
NewAccountModel::createNewAccount(profile::Type type,
const std::string& displayName,
const std::string& archivePath,
const std::string& password,
const std::string& pin)
{
MapStringString details = type == profile::Type::SIP?
ConfigurationManager::instance().getAccountTemplate("SIP") :
ConfigurationManager::instance().getAccountTemplate("JAMI");
using namespace libjami::Account;
details[ConfProperties::TYPE] = type == profile::Type::SIP? "SIP" : "JAMI";
details[ConfProperties::DISPLAYNAME] = displayName.c_str();
details[ConfProperties::ALIAS] = displayName.c_str();
details[ConfProperties::UPNP_ENABLED] = "true";
details[ConfProperties::ARCHIVE_PASSWORD] = password.c_str();
details[ConfProperties::ARCHIVE_PIN] = pin.c_str();
details[ConfProperties::ARCHIVE_PATH] = archivePath.c_str();
QString accountId = ConfigurationManager::instance().addAccount(details);
return accountId.toStdString();
}
W przypadku dodawania nowego konta, zostanie wysłany sygnał accountsChanged
. Klient powinien po tym sygnale aktualizować swoją wewnętrzną strukturę za pomocą innych metod w ConfigurationManager.
Węgiel
Główna logika utworzenia nowego konta znajduje się w src/ringdht/ringaccount.cpp
, w RingAccount::createAccount
Jak to działa, od zera
Konto Jami jest w rzeczywistości reprezentowane przez niektóre pliki przechowywane w archiwum gzip. Jeśli podczas tworzenia konta zostanie podane hasło, archiwum zostanie zaszyfrowane w następujący sposób: dht::crypto::aesEncrypt(archive, password)
(dht::crypto::aesEncrypt
jest zdefiniowane w OpenDHT i używa nettle/{aes,gcm}
). To jest to, co archiwum będzie zawierać duży plik JSON:
Klucz prywatny
ringAccountKey
i łańcuch certyfikatówringAccountCert
(kodujący bazę 64)Zgenerowany klucz CA (dla autografów certyfikatów)
ringCAKey
Wyrzucone urządzenia
ringAccountCRL
Klucz prywatny ethereum
ethKey
dla urządzenia. Jest on używany tylko podczas rejestracji nazwy nans.jami.net
. Nieobowiązkowe.Kontakty
Ustawienia konta
Więc, wygenerujmy go!
TDO
Usunięcie konta
Usunięcie konta Jami jest bardzo proste. Ponieważ klucze znajdują się tylko na urządzeniu, jeśli klucze zostaną usunięte… konto zostanie usunięte! Jedyną rzeczą poza urządzeniem jest nazwa użytkownika na serwerze nazw. Aby usunąć te informacje, zależy to od sposobu działania serwera nazw. Na przykład, nie jest to możliwe z https://ns.jami.net
/Stronka demonów
API
W cx.ring.Ring.ConfigurationManager:
<method name="removeAccount" tp:name-for-bindings="removeAccount">
<tp:docstring>
Remove an existing account. When removed, the signal <tp:member-ref>accountsChanged</tp:member-ref> is emitted. The clients must then call <tp:member-ref>getAccountList</tp:member-ref> to update their internal data structure.
</tp:docstring>
<arg type="s" name="accoundID" direction="in">
<tp:docstring>
The account to remove, identified by its ID
</tp:docstring>
</arg>
</method>
W przypadku usunięcia konta zostanie wysłany sygnał accountsChanged
. Klient powinien po tym sygnale aktualizować swoją wewnętrzną strukturę za pomocą innych metod w ConfigurationManager.
Węgiel
Główna logika tworzenia nowego konta znajduje się w src/manager.cpp
, w Manager::removeAccount
. Usuwa on pliki konta i aktualizuje konfigurację (dring.yml
).
Aktualizacja szczegółów konta
API
W cx.ring.Ring.ConfigurationManager:
<method name="setAccountDetails" tp:name-for-bindings="setAccountDetails">
<tp:docstring>
Send new account parameters, or account parameters changes, to the core. The hash table is not required to be complete, only the updated parameters may be specified.
<tp:rationale>Account settings are written to the configuration file when the app properly quits.</tp:rationale>
<tp:rationale>After calling this method, the core will emit the signal <tp:member-ref>accountDetailsChanged</tp:member-ref> with the updated data. The client must subscribe to this signal and use it to update its internal data structure.</tp:rationale>
</tp:docstring>
<arg type="s" name="accountID" direction="in">
</arg>
<annotation name="org.qtproject.QtDBus.QtTypeName.In1" value="MapStringString"/>
<arg type="a{ss}" name="details" direction="in" tp:type="String_String_Map">
</arg>
</method>
Mapa może zawierać częściową aktualizację i accountDetailsChanged
zostanie wyemitowane po powodzeniu. getAccountDetails
Dodaj urządzenie
Istnieją dwie możliwości dodania urządzenia.
Kopia zapasowa archiwum (następnie import z kopii zapasowej)
API
W cx.ring.Ring.ConfigurationManager:
<method name="exportToFile" tp:name-for-bindings="exportToFile">
<tp:added version="5.1.0"/>
<tp:docstring>
Copy the account archive to the path provided in argument.
</tp:docstring>
<arg type="s" name="accountID" direction="in">
</arg>
<arg type="s" name="destinationPath" direction="in">
</arg>
<arg type="s" name="password" direction="in">
</arg>
<arg type="b" name="success" direction="out">
<tp:docstring>
True if the operation was initialized successfully.
</tp:docstring>
</arg>
</method>
Eksport na DHT
API
W cx.ring.Ring.ConfigurationManager:
<method name="exportOnRing" tp:name-for-bindings="exportOnRing">
<tp:docstring>
Export account on the DHT using the given password and generated PIN (returned through exportOnRingEnded signal).
</tp:docstring>
<arg type="s" name="accountID" direction="in">
</arg>
<arg type="s" name="password" direction="in">
</arg>
<arg type="b" name="success" direction="out">
<tp:docstring>
True if the operation was initialized successfully. exportOnRingEnded will be trigered on completion.
</tp:docstring>
</arg>
</method>
Następnie emitowany jest exportOnRingEnded
.
Odwołaj urządzenie
API
<method name="revokeDevice" tp:name-for-bindings="revokeDevice">
<tp:docstring>
Revoke device attached to the given Jami account, and publish the new revocation list.
</tp:docstring>
<arg type="s" name="accountID" direction="in">
</arg>
<arg type="s" name="password" direction="in">
</arg>
<arg type="s" name="deviceId" direction="in">
</arg>
<arg type="b" name="success" direction="out">
<tp:docstring>
True if the operation was performed successfully.
</tp:docstring>
</arg>
</method>
<signal name="deviceRevocationEnded" tp:name-for-bindings="deviceRevocationEnded">
<tp:docstring>
Notify clients when the revokeDevice operation ended.
</tp:docstring>
<arg type="s" name="accountID">
</arg>
<arg type="s" name="deviceId">
</arg>
<arg type="i" name="status">
<tp:docstring>
Status code: 0 for success
<ul>
<li>SUCCESS = 0 everything went fine. Device is now revoked.</li>
<li>WRONG_PASSWORD = 1 revocation failed: wrong password.</li>
<li>UNKNOWN_DEVICE = 2 revocation failed: unknown device.</li>
</ul>
</tp:docstring>
</arg>
</signal>