Kaidan/src/AccountManager.h

298 lines
7.3 KiB
C++

/*
* Kaidan - A user-friendly XMPP client for every device!
*
* Copyright (C) 2016-2021 Kaidan developers and contributors
* (see the LICENSE file for a full list of copyright authors)
*
* Kaidan is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* In addition, as a special exception, the author of Kaidan gives
* permission to link the code of its release with the OpenSSL
* project's "OpenSSL" library (or with modified versions of it that
* use the same license as the "OpenSSL" library), and distribute the
* linked executables. You must obey the GNU General Public License in
* all respects for all of the code used other than "OpenSSL". If you
* modify this file, you may extend this exception to your version of
* the file, but you are not obligated to do so. If you do not wish to
* do so, delete this exception statement from your version.
*
* Kaidan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Kaidan. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
// Qt
#include <QMutex>
#include <QObject>
class Settings;
class VCardCache;
/**
* This class manages account-related settings.
*/
class AccountManager : public QObject
{
Q_OBJECT
Q_PROPERTY(QString jid READ jid WRITE setJid NOTIFY jidChanged)
Q_PROPERTY(QString password READ password WRITE setPassword NOTIFY passwordChanged)
Q_PROPERTY(QString host READ host WRITE setHost NOTIFY hostChanged)
Q_PROPERTY(quint16 port READ port WRITE setPort NOTIFY portChanged)
Q_PROPERTY(quint16 nonCustomPort READ nonCustomPort CONSTANT)
Q_PROPERTY(QString displayName READ displayName NOTIFY displayNameChanged)
public:
static AccountManager *instance();
AccountManager(Settings *settings, VCardCache *cache, QObject *parent = nullptr);
/**
* Returns the bare JID of the account.
*
* This method is thread-safe.
*/
QString jid();
/**
* Sets the bare JID of the account.
*
* This method is thread-safe.
*
* @param jid bare JID of the account
*/
void setJid(const QString &jid);
/**
* Returns the resource part of the account's full JID.
*/
QString jidResource() const;
/**
* Sets the prefix of the account's full JID's resource part.
*
* The resource prefix is used to create the complete resource. The resource is created by
* appending a dot and random alphanumeric characters.
*
* Example:
* Full JID: alice@example.org/Kaidan.DzF9
* Resource prefix: Kaidan
*
* @param jidResourcePrefix prefix of the account's full JID's resource part
*/
void setJidResourcePrefix(const QString &jidResourcePrefix);
/**
* Returns the password of the account.
*
* This method is thread-safe.
*/
QString password();
/**
* Sets the password of the account.
*
* This method is thread-safe.
*
* @param password password of the account
*/
void setPassword(const QString &password);
/**
* Returns the custom host.
*
* This method is thread-safe.
*
* @return the custom host or an empty string if no custom host is set
*/
QString host();
/**
* Sets a custom host for connecting.
*
* This method is thread-safe.
*
* @param host host to connect to
*/
void setHost(const QString &host);
/**
* Returns the custom port.
*
* This method is thread-safe.
*
* @return the custom port or nonCustomPort if no custom port is set
*/
quint16 port();
/**
* Sets a custom port for connecting.
*
* This method is thread-safe.
*
* @param port port to connect to
*/
void setPort(const quint16 port);
/**
* Returns the port which indicates that no custom port is set.
*/
quint16 nonCustomPort() const;
/**
* Returns the user's display name.
*/
QString displayName();
/**
* Resets the custom connection settings.
*/
Q_INVOKABLE void resetCustomConnectionSettings();
/**
* Provides a way to cache whether the current credentials are new to this client.
*
* The credentials are new to the client if they were not already in use. That is the case
* after entering the credentials the first time to log in or on the first login after
* registration.
*
* @return true if the credentials are new, otherwise false
*/
bool hasNewCredentials() const;
/**
* Sets whether the current credentials are new to this client.
*
* @param hasNewCredentials true if the credentials are new, otherwise false
*/
void setHasNewCredentials(bool hasNewCredentials);
/**
* Returns whether there are enough credentials available to log in to the server.
*/
bool hasEnoughCredentialsForLogin();
/**
* Loads all credentials used to connect to the server.
*
* If credentials are missing for a login, the signal credentialsNeeded() is emitted.
*
* @return true if the credentials could be loaded, otherwise false
*/
Q_INVOKABLE bool loadCredentials();
/**
* Stores the currently set JID in the settings file.
*/
void storeJid();
/**
* Stores the currently set password in the settings file.
*/
void storePassword();
/**
* Stores the currently set custom host and port in the settings file.
*
* If a custom connection setting is not set, it is removed from the settings file.
*/
void storeCustomConnectionSettings();
/**
* Stores credentials (jid, password, etc.) in the settings file.
*/
void storeCredentials();
/**
* Deletes all credentials.
*
* Credentials stored in the settings file are also removed from it.
*/
void deleteCredentials();
/**
* Deletes all account related settings.
*
* Settings stored in the settings file are also removed from it.
*/
void deleteSettings();
/**
* Removes an account.
*
* @param accountJid JID of the account being removed
*/
void removeAccount(const QString &accountJid);
signals:
/**
* Emitted when the JID changed.
*/
void jidChanged();
/**
* Emitted when the password changed.
*/
void passwordChanged();
/**
* Emitted when the custom host changed.
*/
void hostChanged();
/**
* Emitted when the custom port changed.
*/
void portChanged();
/**
* Emitted when the user's display name changed.
*/
void displayNameChanged();
/**
* Emitted when there are no (correct) credentials to log in.
*/
void credentialsNeeded();
/**
* Emitted to remove an account.
*
* @param accountJid JID of the account being removed
*/
void removeAccountRequested(const QString &accountJid);
private:
/**
* Generates the JID's resource part with the set JID resource prefix and a suffix
* consisting of a dot followed by random alphanumeric characters.
*
* @param numberOfRandomSuffixCharacters number of random alphanumeric characters the
* suffix should consist of after the dot
*/
QString generateJidResourceWithRandomSuffix(unsigned int numberOfRandomSuffixCharacters = 4) const;
QMutex m_mutex;
Settings *m_settings;
QString m_jid;
QString m_jidResourcePrefix;
QString m_jidResource;
QString m_password;
QString m_host;
quint16 m_port;
bool m_hasNewCredentials;
static AccountManager *s_instance;
};