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:

  1. CA (samodzielnie podpisany, jeśli wygenerowany lokalnie lub przez firmę)

  2. Konto (gdzie odcisk palca klucza publicznego nazywany jest „Jami ID”)

  3. 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:

  1. Klucz prywatny ringAccountKey i łańcuch certyfikatów ringAccountCert (kodujący bazę 64)

  2. Zgenerowany klucz CA (dla autografów certyfikatów) ringCAKey

  3. Wyrzucone urządzenia ringAccountCRL

  4. Klucz prywatny ethereum ethKey dla urządzenia. Jest on używany tylko podczas rejestracji nazwy na ns.jami.net. Nieobowiązkowe.

  5. Kontakty

  6. 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>