diff --git a/doc/create-setupmethods.qdoc b/doc/create-setupmethods.qdoc index 121f7a27..541e8328 100644 --- a/doc/create-setupmethods.qdoc +++ b/doc/create-setupmethods.qdoc @@ -28,7 +28,7 @@ \endlist - \section1 CreateMethod \b "User" - SetupMethod \b "JustAdd - synchronous" + \section2 CreateMethod \b "User" - SetupMethod \b "JustAdd - synchronous" This is the simplest setup what a device can have. @@ -50,7 +50,7 @@ \endlist \endlist - \section1 CreateMethod \b "User" - SetupMethod \b "JustAdd" - asynchronous + \section2 CreateMethod \b "User" - SetupMethod \b "JustAdd" - asynchronous \image setup-async-resized.png @@ -64,7 +64,7 @@ \endlist \endlist - \section1 CreateMethod \b "auto" - SetupMethod \b "justAdd" + \section2 CreateMethod \b "auto" - SetupMethod \b "justAdd" \image setup-auto-resized.png @@ -83,7 +83,7 @@ \endlist - \section1 CreateMethod \b "Discovery" - SetupMethod \b "JustAdd" + \section2 CreateMethod \b "Discovery" - SetupMethod \b "JustAdd" \image setup-discovery-resized.png @@ -102,7 +102,7 @@ \endlist \endlist - \section1 CreateMethod \b "Discovery" - SetupMethod \b "PushButton" + \section2 CreateMethod \b "Discovery" - SetupMethod \b "PushButton" \image setup-discovery-pairing-resized.png @@ -127,7 +127,7 @@ \endlist \endlist - \section1 CreateMethod \b "Discovery" - SetupMethod \b "EnterPin" + \section2 CreateMethod \b "Discovery" - SetupMethod \b "EnterPin" \image setup-discovery-pairing-resized.png @@ -153,7 +153,7 @@ \endlist - \section1 CreateMethod \b "Discovery" - SetupMethod \b "DisplayPin" + \section2 CreateMethod \b "Discovery" - SetupMethod \b "DisplayPin" \image setup-discovery-display-pin-resized.png diff --git a/doc/getting-started-plugins.qdoc b/doc/getting-started-plugins.qdoc index 95e386eb..1223a1a8 100644 --- a/doc/getting-started-plugins.qdoc +++ b/doc/getting-started-plugins.qdoc @@ -11,11 +11,12 @@ can do with the \l{Device}. \section1 Devices - A device in nymea can represent a real device, a gateway or even a service like weather. When you want to represent you own device / service in nymea, you should try to abstract that device and think in terms like: + A device in nymea can represent a real device, a gateway or even a service like weather. When you want to represent you own device / service in nymea, + you should try to abstract that device and think in terms like: \list \li \l{ParamType}{ParamTypes} \unicode{0x2192} A \l{Device} can have \l{Param}{Params}, which will be needed to set up the device - (like IP addresses or device configurations) and give information for the user like name or location. The \l{ParamType} represents + (like IP addresses or device identification) and give information needed for setup and load a device. The \l{ParamType} represents the description of an actual \l{Param}. \li \l{StateType}{StateTypes} \unicode{0x2192} A \l{Device} can have \l{State}{States}, which basically represent a value of a \l{Device} like \e {current temperature} or \e ON/OFF. The \l{StateType} represents the description of an actual \l{State}. diff --git a/doc/test-plugin.qdoc b/doc/test-plugin.qdoc index d0f547c5..f9a18e9a 100644 --- a/doc/test-plugin.qdoc +++ b/doc/test-plugin.qdoc @@ -12,11 +12,11 @@ To make nymead load the plugin from the plugins build directory, run nymead with an environment variable exported \code - $ NYMEA_PLUGINS_DIR=/path/to/plugin/ nymead + $ NYMEA_PLUGINS_PATH=/path/to/plugin/ nymead -n \endcode In order to easier debug things, it is advised to enable debug output for the device manager and your plugin. E.g. \code - $ NYMEA_PLUGINS_DIR=/path/to/plugin nymead -d DeviceManager,YourPlugin + $ NYMEA_PLUGINS_PATH=/path/to/plugin nymead -n -d DeviceManager -d YourPlugin \endcode */ diff --git a/doc/plugin-wizard.qdoc b/doc/tutorials/plugin-wizard.qdoc similarity index 100% rename from doc/plugin-wizard.qdoc rename to doc/tutorials/plugin-wizard.qdoc diff --git a/libnymea-core/logging/logengine.cpp b/libnymea-core/logging/logengine.cpp index ea0922a8..850508ed 100644 --- a/libnymea-core/logging/logengine.cpp +++ b/libnymea-core/logging/logengine.cpp @@ -132,7 +132,7 @@ namespace nymeaserver { /*! Constructs the log engine with the given parameters. - \a The Qt Database backend to be used. Depending on the installed Qt modules this can be any of QDB2 QIBASE QMYSQL QOCI QODBC QPSQL QSQLITE QSQLITE2 QTDS. + The Qt Database backend to be used. Depending on the installed Qt modules this can be any of QDB2 QIBASE QMYSQL QOCI QODBC QPSQL QSQLITE QSQLITE2 QTDS. \a dbName is the name of the database. In case of SQLITE this should contain a file path. The Driver will create the file if required. In case of using a database server like MYSQL, the database must exist on the host given by \a hostname and be accessible with the given \a username and \a password. */ diff --git a/libnymea-core/nymeacore.cpp b/libnymea-core/nymeacore.cpp index d8b8fe8f..ad6a6cae 100644 --- a/libnymea-core/nymeacore.cpp +++ b/libnymea-core/nymeacore.cpp @@ -88,6 +88,15 @@ This signal is emitted when the configuration of \a rule changed. */ +/*! \fn void nymeaserver::NymeaCore::initialized(); + This signal is emitted when the core is initialized. +*/ + +/*! \fn void nymeaserver::NymeaCore::pluginConfigChanged(const PluginId &id, const ParamList &config); + This signal is emitted when the plugin \a config of the plugin with the given \a id changed. +*/ + + /*! \fn void ruleActiveChanged(const Rule &rule); This signal is emitted when a \a rule changed the active state. A \l{Rule} is active, when all \l{State}{States} match with the \l{StateDescriptor} conditions. @@ -111,7 +120,7 @@ namespace nymeaserver { -NymeaCore* NymeaCore::s_instance = 0; +NymeaCore* NymeaCore::s_instance = nullptr; /*! Returns a pointer to the single \l{NymeaCore} instance. */ NymeaCore *NymeaCore::instance() @@ -154,7 +163,7 @@ void NymeaCore::destroy() delete s_instance; } - s_instance = 0; + s_instance = nullptr; } /*! Removes a configured \l{Device} with the given \a deviceId and \a removePolicyList. */ @@ -471,16 +480,19 @@ NetworkManager *NymeaCore::networkManager() const return m_networkManager; } +/*! Returns a pointer to the \l{UserManager} instance owned by NymeaCore. */ UserManager *NymeaCore::userManager() const { return m_userManager; } +/*! Returns a pointer to the CloudManager instance owned by NymeaCore. */ CloudManager *NymeaCore::cloudManager() const { return m_cloudManager; } +/*! Returns a pointer to the \l{DebugServerHandler} instance owned by NymeaCore. */ DebugServerHandler *NymeaCore::debugServerHandler() const { return m_debugServerHandler; diff --git a/libnymea-core/nymeacore.h b/libnymea-core/nymeacore.h index 6c4ce0ee..c3be0d8b 100644 --- a/libnymea-core/nymeacore.h +++ b/libnymea-core/nymeacore.h @@ -111,7 +111,7 @@ signals: void ruleConfigurationChanged(const Rule &rule); private: - explicit NymeaCore(QObject *parent = 0); + explicit NymeaCore(QObject *parent = nullptr); static NymeaCore *s_instance; NymeaConfiguration *m_configuration; diff --git a/libnymea-core/rule.cpp b/libnymea-core/rule.cpp index 520a9aea..f025cb15 100644 --- a/libnymea-core/rule.cpp +++ b/libnymea-core/rule.cpp @@ -88,11 +88,13 @@ bool Rule::active() const return m_active; } +/*! Returns true if the rule is active regarding the StateEvaluator evaluation. */ bool Rule::statesActive() const { return m_statesActive; } +/*! Returns true if the rule is active regarding the TimeDescriptor evaluation. */ bool Rule::timeActive() const { if (m_timeDescriptor.calendarItems().isEmpty()) diff --git a/libnymea-core/ruleengine.cpp b/libnymea-core/ruleengine.cpp index 98277d81..d9879bd2 100644 --- a/libnymea-core/ruleengine.cpp +++ b/libnymea-core/ruleengine.cpp @@ -87,6 +87,8 @@ the \l{Action}{Actions} without the \l{Event} value. \value RuleErrorNoExitActions This rule does not have any ExitActions which means they cannot be executed. + \value RuleErrorInterfaceNotFound + There is no interface for the given string. */ /*! \enum nymeaserver::RuleEngine::RemovePolicy diff --git a/libnymea-core/servermanager.cpp b/libnymea-core/servermanager.cpp index 83a23006..6b9cbd2b 100644 --- a/libnymea-core/servermanager.cpp +++ b/libnymea-core/servermanager.cpp @@ -44,7 +44,7 @@ namespace nymeaserver { -/*! Constructs a \l{ServerManager} with the given \a parent. */ +/*! Constructs a \l{ServerManager} with the given \a configuration and \a parent. */ ServerManager::ServerManager(NymeaConfiguration *configuration, QObject *parent) : QObject(parent), m_sslConfiguration(QSslConfiguration()) @@ -141,11 +141,13 @@ RestServer *ServerManager::restServer() const return m_restServer; } +/*! Returns the pointer to the created \l{BluetoothServer} in this \l{ServerManager}. */ BluetoothServer *ServerManager::bluetoothServer() const { return m_bluetoothServer; } +/*! Returns the pointer to the created MockTcpServer in this \l{ServerManager}. */ MockTcpServer *ServerManager::mockTcpServer() const { return m_mockTcpServer; @@ -259,6 +261,7 @@ bool ServerManager::loadCertificate(const QString &certificateKeyFileName, const return true; } +/*! Set the server name for all servers to the given \a serverName. */ void ServerManager::setServerName(const QString &serverName) { qCDebug(dcConnection()) << "Server name changed" << serverName; diff --git a/libnymea-core/stateevaluator.cpp b/libnymea-core/stateevaluator.cpp index ea61c597..d1383863 100644 --- a/libnymea-core/stateevaluator.cpp +++ b/libnymea-core/stateevaluator.cpp @@ -194,6 +194,7 @@ void StateEvaluator::removeDevice(const DeviceId &deviceId) } } +/*! Returns a list of \l{DeviceId}{DeviceIds} of this StateEvaluator. */ QList StateEvaluator::containedDevices() const { QList ret; diff --git a/libnymea-core/tcpserver.cpp b/libnymea-core/tcpserver.cpp index 6cc16e20..4552888e 100644 --- a/libnymea-core/tcpserver.cpp +++ b/libnymea-core/tcpserver.cpp @@ -19,6 +19,37 @@ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/*! + \class nymeaserver::SslServer + \brief This class represents the SSL server for nymead. + + \ingroup server + \inmodule core + + \inherits TcpServer + + The SSL server allows clients to connect to the JSON-RPC API over an encrypted SSL/TLS connection. + + \sa WebSocketServer, TransportInterface, TcpServer +*/ + +/*! \fn nymeaserver::SslServer::SslServer(bool sslEnabled, const QSslConfiguration &config, QObject *parent = nullptr) + Constructs a \l{SslServer} with the given \a sslEnabled, \a config and \a parent. +*/ + +/*! \fn void nymeaserver::SslServer::clientConnected(QSslSocket *socket); + This signal is emitted when a new SSL \a socket connected. +*/ + +/*! \fn void nymeaserver::SslServer::clientDisconnected(QSslSocket *socket); + This signal is emitted when a \a socket disconnected. +*/ + +/*! \fn void nymeaserver::SslServer::dataAvailable(QSslSocket *socket, const QByteArray &data); + This signal is emitted when \a data from \a socket is available. +*/ + + /*! \class nymeaserver::TcpServer \brief This class represents the tcp server for nymead. @@ -40,13 +71,13 @@ namespace nymeaserver { -/*! Constructs a \l{TcpServer} with the given \a host, \a port and \a parent. +/*! Constructs a \l{TcpServer} with the given \a configuration, \a sslConfiguration and \a parent. * * \sa ServerManager */ TcpServer::TcpServer(const ServerConfiguration &configuration, const QSslConfiguration &sslConfiguration, QObject *parent) : TransportInterface(configuration, parent), - m_server(NULL), + m_server(nullptr), m_sslConfig(sslConfiguration) { m_avahiService = new QtAvahiService(this); @@ -60,6 +91,7 @@ TcpServer::~TcpServer() stopServer(); } +/*! Returns the URL of this server. */ QUrl TcpServer::serverUrl() const { return QUrl(QString("%1://%2:%3").arg((configuration().sslEnabled ? "nymeas" : "nymea")).arg(configuration().address.toString()).arg(configuration().port)); @@ -76,7 +108,7 @@ void TcpServer::sendData(const QList &clients, const QByteArray &data) /*! Sending \a data to the client with the given \a clientId.*/ void TcpServer::sendData(const QUuid &clientId, const QByteArray &data) { - QTcpSocket *client = 0; + QTcpSocket *client = nullptr; client = m_clientList.value(clientId); if (client) { client->write(data + '\n'); @@ -138,13 +170,13 @@ void TcpServer::resetAvahiService() txt.insert("uuid", NymeaCore::instance()->configuration()->serverUuid().toString()); txt.insert("name", NymeaCore::instance()->configuration()->serverName()); txt.insert("sslEnabled", configuration().sslEnabled ? "true" : "false"); - if (!m_avahiService->registerService(QString("nymea-tcp-%1").arg(configuration().id), configuration().address, configuration().port, "_jsonrpc._tcp", txt)) { + if (!m_avahiService->registerService(QString("nymea-tcp-%1").arg(configuration().id), configuration().address, static_cast(configuration().port), "_jsonrpc._tcp", txt)) { qCWarning(dcTcpServer()) << "Could not register avahi service for" << configuration(); } } -/*! Returns true if this \l{TcpServer} could be reconfigured with the given \a address and \a port. */ +/*! Returns true if this \l{TcpServer} could be reconfigured with the given \a config. */ void TcpServer::reconfigureServer(const ServerConfiguration &config) { if (configuration().address == config.address && @@ -159,6 +191,7 @@ void TcpServer::reconfigureServer(const ServerConfiguration &config) startServer(); } +/*! Sets the name of this server to the given \a serverName. */ void TcpServer::setServerName(const QString &serverName) { m_serverName = serverName; @@ -172,10 +205,10 @@ void TcpServer::setServerName(const QString &serverName) bool TcpServer::startServer() { m_server = new SslServer(configuration().sslEnabled, m_sslConfig); - if(!m_server->listen(configuration().address, configuration().port)) { + if(!m_server->listen(configuration().address, static_cast(configuration().port))) { qCWarning(dcConnection) << "Tcp server error: can not listen on" << configuration().address.toString() << configuration().port; delete m_server; - m_server = NULL; + m_server = nullptr; return false; } @@ -203,10 +236,11 @@ bool TcpServer::stopServer() m_server->close(); m_server->deleteLater(); - m_server = NULL; + m_server = nullptr; return true; } +/*! This method will be called if a new \a socketDescriptor is about to connect to this SslSocket. */ void SslServer::incomingConnection(qintptr socketDescriptor) { QSslSocket *sslSocket = new QSslSocket(this); diff --git a/libnymea-core/tcpserver.h b/libnymea-core/tcpserver.h index 40dde02a..4aa12518 100644 --- a/libnymea-core/tcpserver.h +++ b/libnymea-core/tcpserver.h @@ -72,8 +72,8 @@ class TcpServer : public TransportInterface { Q_OBJECT public: - explicit TcpServer(const ServerConfiguration &configuration, const QSslConfiguration &sslConfiguration, QObject *parent = 0); - ~TcpServer(); + explicit TcpServer(const ServerConfiguration &configuration, const QSslConfiguration &sslConfiguration, QObject *parent = nullptr); + ~TcpServer() override; QUrl serverUrl() const; diff --git a/libnymea-core/time/timedescriptor.cpp b/libnymea-core/time/timedescriptor.cpp index ab56c383..eb00bd46 100644 --- a/libnymea-core/time/timedescriptor.cpp +++ b/libnymea-core/time/timedescriptor.cpp @@ -82,7 +82,7 @@ bool TimeDescriptor::isEmpty() const /*! Returns true if this \l{TimeDescriptor} is valid for the given \a dateTime. A \l{TimeDescriptor} is valid if the \l{TimeEventItem}{TimeEventItems} or \l{CalendarItem}{CalendarItems} match - the given \a dateTime. + the given \a dateTime since the \a lastEvaluationTime. */ bool TimeDescriptor::evaluate(const QDateTime &lastEvaluationTime, const QDateTime &dateTime) const { diff --git a/libnymea-core/time/timeeventitem.cpp b/libnymea-core/time/timeeventitem.cpp index ce19c206..3ef56957 100644 --- a/libnymea-core/time/timeeventitem.cpp +++ b/libnymea-core/time/timeeventitem.cpp @@ -91,7 +91,7 @@ bool TimeEventItem::isValid() const return (!m_dateTime.isNull() != !m_time.isNull()); } -/*! Returns true, if the given \a dateTime matches this \l{TimeEventItem}. */ +/*! Returns true, if the given \a dateTime matches this \l{TimeEventItem} since the last \a lastEvaluationTime. */ bool TimeEventItem::evaluate(const QDateTime &lastEvaluationTime, const QDateTime &dateTime) const { // Check time matches diff --git a/libnymea-core/time/timemanager.cpp b/libnymea-core/time/timemanager.cpp index df034f45..14876caf 100644 --- a/libnymea-core/time/timemanager.cpp +++ b/libnymea-core/time/timemanager.cpp @@ -107,6 +107,10 @@ QList TimeManager::availableTimeZones() const return QTimeZone::availableTimeZoneIds(); } +/*! Stop the time. + * + * \note This method should only be used in tests. +*/ void TimeManager::stopTimer() { qCWarning(dcTimeManager()) << "TimeManager timer stopped. You should only see this in tests."; @@ -114,6 +118,10 @@ void TimeManager::stopTimer() m_nymeaTimer->stop(); } +/*! Set the current time of this TimeManager to the given \a dateTime. + * + * \note This method should only be used in tests. +*/ void TimeManager::setTime(const QDateTime &dateTime) { qCWarning(dcTimeManager()) << "TimeManager time changed" << dateTime.toString("dd.MM.yyyy hh:mm:ss") << "You should only see this in tests."; diff --git a/libnymea-core/tokeninfo.cpp b/libnymea-core/tokeninfo.cpp index 9441e173..03d04c16 100644 --- a/libnymea-core/tokeninfo.cpp +++ b/libnymea-core/tokeninfo.cpp @@ -18,10 +18,23 @@ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/*! + \class nymeaserver::TokenInfo + \brief This class holds information about an authentication token. + + \ingroup user + \inmodule core + + The TokenInfo class holds information about a token used for authentication in the \l{nymeaserver::UserManager}{UserManager}. + + \sa TokenInfo, PushButtonDBusService +*/ + #include "tokeninfo.h" namespace nymeaserver { +/*! Constructs a new token info with the given \a id, \a username, \a creationTime and \a deviceName. */ TokenInfo::TokenInfo(const QUuid &id, const QString &username, const QDateTime &creationTime, const QString &deviceName): m_id(id), m_username(username), @@ -31,21 +44,25 @@ TokenInfo::TokenInfo(const QUuid &id, const QString &username, const QDateTime & } +/*! Returns the id of this TokenInfo. */ QUuid TokenInfo::id() const { return m_id; } +/*! Returns the userename of this TokenInfo. */ QString TokenInfo::username() const { return m_username; } +/*! Returns the creation time of this TokenInfo. */ QDateTime TokenInfo::creationTime() const { return m_creationTime; } +/*! Returns the device name of this TokenInfo. */ QString TokenInfo::deviceName() const { return m_deviceName; diff --git a/libnymea-core/transportinterface.cpp b/libnymea-core/transportinterface.cpp index 61db65fd..badb4f2c 100644 --- a/libnymea-core/transportinterface.cpp +++ b/libnymea-core/transportinterface.cpp @@ -54,20 +54,18 @@ \sa WebSocketServer::stopServer(), TcpServer::stopServer() */ -/*! \fn void nymeaserver::TransportInterface::sendData(const QUuid &clientId, const QVariantMap &data); +/*! \fn void nymeaserver::TransportInterface::sendData(const QUuid &clientId, const QByteArray &data); Pure virtual method for sending \a data to the client with the id \a clientId over the corresponding \l{TransportInterface}. */ -/*! \fn void nymeaserver::TransportInterface::sendData(const QList &clients, const QVariantMap &data); +/*! \fn void nymeaserver::TransportInterface::sendData(const QList &clients, const QByteArray &data); Pure virtual method for sending \a data to \a clients over the corresponding \l{TransportInterface}. */ -/*! \fn void nymeaserver::TransportInterface::dataAvailable(const QUuid &clientId, const QString &targetNamespace, const QString &method, const QVariantMap &message); - This signal is emitted when valid data from the client with the given \a clientId are available. - Data are valid if the corresponding \l{TransportInterface} has parsed successfully the given - \a targetNamespace, \a method and \a message. +/*! \fn void nymeaserver::TransportInterface::dataAvailable(const QUuid &clientId, const QByteArray &data); + This signal is emitted when valid \a data from the client with the given \a clientId are available. - \sa WebSocketServer, TcpServer + \sa WebSocketServer, TcpServer, BluetoothServer */ #include "transportinterface.h" @@ -77,13 +75,14 @@ namespace nymeaserver { -/*! Constructs a \l{TransportInterface} with the given \a parent. */ +/*! Constructs a \l{TransportInterface} with the given \a config and \a parent. */ TransportInterface::TransportInterface(const ServerConfiguration &config, QObject *parent) : QObject(parent), m_config(config) { } +/*! Set the ServerConfiguration of this TransportInterface to the given \a config. */ void TransportInterface::setConfiguration(const ServerConfiguration &config) { m_config = config; @@ -95,6 +94,7 @@ ServerConfiguration TransportInterface::configuration() const return m_config; } +/*! Set the name of this TransportInterface to the given \a serverName. */ void TransportInterface::setServerName(const QString &serverName) { m_serverName = serverName; diff --git a/libnymea-core/transportinterface.h b/libnymea-core/transportinterface.h index 7bea6ec5..eb693c45 100644 --- a/libnymea-core/transportinterface.h +++ b/libnymea-core/transportinterface.h @@ -34,7 +34,7 @@ class TransportInterface : public QObject { Q_OBJECT public: - explicit TransportInterface(const ServerConfiguration &config, QObject *parent = 0); + explicit TransportInterface(const ServerConfiguration &config, QObject *parent = nullptr); virtual ~TransportInterface() = 0; virtual void sendData(const QUuid &clientId, const QByteArray &data) = 0; diff --git a/libnymea-core/usermanager.cpp b/libnymea-core/usermanager.cpp index 68ce6f1d..d61269aa 100644 --- a/libnymea-core/usermanager.cpp +++ b/libnymea-core/usermanager.cpp @@ -18,6 +18,46 @@ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/*! + \class nymeaserver::UserManager + \brief This class represents the manager for the users in nymead. + + \ingroup user + \inmodule core + + The user manager is responsible for managing the user database, tokens and authentication. The user manager + creates a user database where all relevant information will be stored. + + \sa TokenInfo, PushButtonDBusService +*/ + +/*! \enum nymeaserver::UserManager::UserError + + This enum represents the possible errors the \l{UserManager} can have. + + \value UserErrorNoError + No error occured. Everything is ok.4 + \value UserErrorBackendError + Something went wrong in the manager. This is probably caused by a database error. + \value UserErrorInvalidUserId + The given user name is not valid. + \value UserErrorDuplicateUserId + The given user name already exits. Please use a different user name. + \value UserErrorBadPassword + The given password is to weak. Please use a stronger password. + \value UserErrorTokenNotFound + The given token is unknown to the UserManager. + \value UserErrorPermissionDenied + The permission is denied. Either invalid username, password or token. +*/ + +/*! \fn void nymeaserver::UserManager::pushButtonAuthFinished(int transactionId, bool success, const QByteArray &token); + This signal is emitted when the push authentication for the given \a transactionId is finished. + If \a success is true, the resulting \a token contains a non empty string. + + \sa requestPushButtonAuth +*/ + #include "usermanager.h" #include "nymeasettings.h" #include "loggingcategories.h" @@ -35,7 +75,7 @@ namespace nymeaserver { -/** Constructs a new UserManager with the given \a dbName and \a parent. */ +/*! Constructs a new UserManager with the given \a dbName and \a parent. */ UserManager::UserManager(const QString &dbName, QObject *parent): QObject(parent) { @@ -64,7 +104,7 @@ UserManager::UserManager(const QString &dbName, QObject *parent): m_pushButtonTransaction = qMakePair(-1, QString()); } -/** Will return true if the database is working fine but doesn't have any information on users whatsoever. +/*! Will return true if the database is working fine but doesn't have any information on users whatsoever. * That is, neither a user nor an anonimous token. * This may be used to determine whether a first-time setup is required. */ @@ -81,6 +121,7 @@ bool UserManager::initRequired() const return users().isEmpty() && !result.first(); } +/*! Returns the list of user names for this UserManager. */ QStringList UserManager::users() const { QString userQuery("SELECT username FROM users;"); @@ -92,6 +133,7 @@ QStringList UserManager::users() const return ret; } +/*! Creates a new user with the given \a username and \a password. Returns the \l UserError to inform about the result. */ UserManager::UserError UserManager::createUser(const QString &username, const QString &password) { if (!validateUsername(username)) { @@ -126,7 +168,9 @@ UserManager::UserError UserManager::createUser(const QString &username, const QS return UserErrorNoError; } -/** Remove the given user and all of its tokens. If the username is empty, all anonymous tokens (e.g. issued by pushbutton auth) will be cleared. */ +/*! Remove the user with the given \a username and all of its tokens. If the \a username is empty, all anonymous + tokens (e.g. issued by pushbutton auth) will be cleared. +*/ UserManager::UserError UserManager::removeUser(const QString &username) { if (!username.isEmpty()) { @@ -146,11 +190,15 @@ UserManager::UserError UserManager::removeUser(const QString &username) return UserErrorNoError; } +/*! Returns true if the push button authentication is available for this system. */ bool UserManager::pushButtonAuthAvailable() const { return m_pushButtonDBusService->agentAvailable(); } +/*! Authenticated the given \a username with the given \a password for the \a deviceName. If the authentication was + successfull, the token will be returned, otherwise the return value will be an empty byte array. +*/ QByteArray UserManager::authenticate(const QString &username, const QString &password, const QString &deviceName) { if (!validateUsername(username)) { @@ -188,6 +236,7 @@ QByteArray UserManager::authenticate(const QString &username, const QString &pas return token; } +/*! Start the push button authentication for the device with the given \a deviceName. Returns the transaction id as refference to the request. */ int UserManager::requestPushButtonAuth(const QString &deviceName) { if (m_pushButtonTransaction.first != -1) { @@ -201,6 +250,10 @@ int UserManager::requestPushButtonAuth(const QString &deviceName) return transactionId; } +/*! Cancel the push button authentication with the given \a transactionId. + + \sa requestPushButtonAuth +*/ void UserManager::cancelPushButtonAuth(int transactionId) { if (m_pushButtonTransaction.first == -1) { @@ -217,6 +270,7 @@ void UserManager::cancelPushButtonAuth(int transactionId) } +/*! Returns the username for the given \a token. If the token is invalid, an empty string will be returned. */ QString UserManager::userForToken(const QByteArray &token) const { if (!validateToken(token)) { @@ -238,6 +292,10 @@ QString UserManager::userForToken(const QByteArray &token) const return result.value("username").toString(); } +/*! Returns a list of tokens for the given \a username. + + \sa TokenInfo +*/ QList UserManager::tokens(const QString &username) const { QList ret; @@ -260,6 +318,7 @@ QList UserManager::tokens(const QString &username) const return ret; } +/*! Removes the token with the given \a tokenId. Returns \l{UserError} to inform about the result. */ UserManager::UserError UserManager::removeToken(const QUuid &tokenId) { QString removeTokenQuery = QString("DELETE FROM tokens WHERE id = \"%1\";") @@ -278,6 +337,7 @@ UserManager::UserError UserManager::removeToken(const QUuid &tokenId) return UserErrorNoError; } +/*! Returns true, if the given \a token is valid. */ bool UserManager::verifyToken(const QByteArray &token) { if (!validateToken(token)) { diff --git a/libnymea-core/usermanager.h b/libnymea-core/usermanager.h index 116c6841..549d876d 100644 --- a/libnymea-core/usermanager.h +++ b/libnymea-core/usermanager.h @@ -45,7 +45,7 @@ public: UserErrorPermissionDenied }; - explicit UserManager(const QString &dbName, QObject *parent = 0); + explicit UserManager(const QString &dbName, QObject *parent = nullptr); bool initRequired() const; QStringList users() const; diff --git a/libnymea-core/webserver.cpp b/libnymea-core/webserver.cpp index b2bb820a..cce62165 100644 --- a/libnymea-core/webserver.cpp +++ b/libnymea-core/webserver.cpp @@ -93,16 +93,14 @@ namespace nymeaserver { -/*! Constructs a \l{WebServer} with the given \a host, \a port, \a publicFolder and \a parent. +/*! Constructs a \l{WebServer} with the given \a configuration, \a sslConfiguration and \a parent. * - * \sa ServerManager + * \sa ServerManager, WebServerConfiguration */ WebServer::WebServer(const WebServerConfiguration &configuration, const QSslConfiguration &sslConfiguration, QObject *parent) : QTcpServer(parent), - m_avahiService(nullptr), m_configuration(configuration), - m_sslConfiguration(sslConfiguration), - m_enabled(false) + m_sslConfiguration(sslConfiguration) { if (QCoreApplication::instance()->organizationName() == "nymea-test") { m_configuration.publicFolder = QCoreApplication::applicationDirPath(); @@ -121,6 +119,7 @@ WebServer::~WebServer() this->close(); } +/*! Returns the server URL of this WebServer. */ QUrl WebServer::serverUrl() const { return QUrl(QString("%1://%2:%3").arg((m_configuration.sslEnabled ? "https" : "http")).arg(m_configuration.address.toString()).arg(m_configuration.port)); @@ -544,12 +543,15 @@ void WebServer::resetAvahiService() txt.insert("name", NymeaCore::instance()->configuration()->serverName()); txt.insert("sslEnabled", m_configuration.sslEnabled ? "true" : "false"); - if (!m_avahiService->registerService(QString("nymea-http-%1").arg(m_configuration.id), m_configuration.address, m_configuration.port, "_http._tcp", txt)) { + if (!m_avahiService->registerService(QString("nymea-http-%1").arg(m_configuration.id), m_configuration.address, static_cast(m_configuration.port), "_http._tcp", txt)) { qCWarning(dcTcpServer()) << "Could not register avahi service for" << m_configuration; } } -/*! Returns true if this \l{WebServer} could be reconfigured with the given \a address and \a port. */ +/*! Set the configuration of this \l{WebServer} to the given \a config. + * + * \sa WebServerConfiguration + */ void WebServer::reconfigureServer(const WebServerConfiguration &config) { if (m_configuration.address == config.address && @@ -565,6 +567,7 @@ void WebServer::reconfigureServer(const WebServerConfiguration &config) startServer(); } +/*! Sets the server name to the given \a serverName. */ void WebServer::setServerName(const QString &serverName) { m_serverName = serverName; @@ -574,7 +577,7 @@ void WebServer::setServerName(const QString &serverName) /*! Returns true if this \l{WebServer} started successfully. */ bool WebServer::startServer() { - if (!listen(m_configuration.address, m_configuration.port)) { + if (!listen(m_configuration.address, static_cast(m_configuration.port))) { qCWarning(dcWebServer()) << "Webserver could not listen on" << serverUrl().toString() << errorString(); m_enabled = false; return false; diff --git a/libnymea-core/webserver.h b/libnymea-core/webserver.h index 840a561f..894a5bf8 100644 --- a/libnymea-core/webserver.h +++ b/libnymea-core/webserver.h @@ -50,7 +50,7 @@ class WebServerClient : public QObject { Q_OBJECT public: - WebServerClient(const QHostAddress &address, QObject *parent = 0); + WebServerClient(const QHostAddress &address, QObject *parent = nullptr); QHostAddress address() const; @@ -74,8 +74,8 @@ class WebServer : public QTcpServer { Q_OBJECT public: - explicit WebServer(const WebServerConfiguration &configuration, const QSslConfiguration &sslConfiguration, QObject *parent = 0); - ~WebServer(); + explicit WebServer(const WebServerConfiguration &configuration, const QSslConfiguration &sslConfiguration, QObject *parent = nullptr); + ~WebServer() override; QUrl serverUrl() const; @@ -86,12 +86,12 @@ private: QList m_webServerClients; QHash m_incompleteRequests; - QtAvahiService *m_avahiService; + QtAvahiService *m_avahiService = nullptr; QString m_serverName; WebServerConfiguration m_configuration; QSslConfiguration m_sslConfiguration; - bool m_enabled; + bool m_enabled = false; bool verifyFile(QSslSocket *socket, const QString &fileName); QString fileName(const QString &query); diff --git a/libnymea-core/websocketserver.cpp b/libnymea-core/websocketserver.cpp index 73b83cbb..c0946a4b 100644 --- a/libnymea-core/websocketserver.cpp +++ b/libnymea-core/websocketserver.cpp @@ -1,6 +1,6 @@ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright (C) 2015 Simon Stürz * + * Copyright (C) 2015 - 2018 Simon Stürz * * * * This file is part of nymea. * * * @@ -56,13 +56,12 @@ namespace nymeaserver { -/*! Constructs a \l{WebSocketServer} with the given \a address, \a port \a sslEnabled and \a parent. +/*! Constructs a \l{WebSocketServer} with the given \a configuration, \a sslConfiguration and \a parent. * - * \sa ServerManager + * \sa ServerManager, ServerConfiguration */ WebSocketServer::WebSocketServer(const ServerConfiguration &configuration, const QSslConfiguration &sslConfiguration, QObject *parent) : TransportInterface(configuration, parent), - m_server(0), m_sslConfiguration(sslConfiguration), m_enabled(false) { @@ -77,6 +76,7 @@ WebSocketServer::~WebSocketServer() stopServer(); } +/*! Returns the url of this server. */ QUrl WebSocketServer::serverUrl() const { return QUrl(QString("%1://%2:%3").arg((configuration().sslEnabled ? "wss" : "ws")).arg(configuration().address.toString()).arg(configuration().port)); @@ -88,7 +88,7 @@ QUrl WebSocketServer::serverUrl() const */ void WebSocketServer::sendData(const QUuid &clientId, const QByteArray &data) { - QWebSocket *client = 0; + QWebSocket *client = nullptr; client = m_clientList.value(clientId); if (client) { qCDebug(dcWebSocketServerTraffic()) << "Sending data to client" << data; @@ -201,12 +201,12 @@ void WebSocketServer::resetAvahiService() return; m_avahiService->resetService(); - if (!m_avahiService->registerService(QString("nymea-ws-%1").arg(configuration().id), configuration().address, configuration().port, "_ws._tcp", createTxtRecord())) { + if (!m_avahiService->registerService(QString("nymea-ws-%1").arg(configuration().id), configuration().address, static_cast(configuration().port), "_ws._tcp", createTxtRecord())) { qCWarning(dcWebServer()) << "Could not register avahi service for" << configuration(); } } -/*! Returns true if this \l{WebSocketServer} could be reconfigured with the given \a address and \a port. */ +/*! Returns true if this \l{WebSocketServer} could be reconfigured with the given \a config. */ void WebSocketServer::reconfigureServer(const ServerConfiguration &config) { if (configuration() == config && m_server->isListening()) { @@ -224,6 +224,7 @@ void WebSocketServer::reconfigureServer(const ServerConfiguration &config) startServer(); } +/*! Sets the server name to the given \a serverName. */ void WebSocketServer::setServerName(const QString &serverName) { m_serverName = serverName; @@ -245,7 +246,7 @@ bool WebSocketServer::startServer() connect (m_server, &QWebSocketServer::newConnection, this, &WebSocketServer::onClientConnected); connect (m_server, &QWebSocketServer::acceptError, this, &WebSocketServer::onServerError); - if (!m_server->listen(configuration().address, configuration().port)) { + if (!m_server->listen(configuration().address, static_cast(configuration().port))) { qCWarning(dcConnection) << "Websocket server" << m_server->serverName() << "could not listen on" << serverUrl().toString(); return false; } diff --git a/libnymea-core/websocketserver.h b/libnymea-core/websocketserver.h index 79837310..637b7642 100644 --- a/libnymea-core/websocketserver.h +++ b/libnymea-core/websocketserver.h @@ -1,6 +1,6 @@ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright (C) 2015 Simon Stürz * + * Copyright (C) 2015 - 2018 Simon Stürz * * * * This file is part of nymea. * * * @@ -42,8 +42,8 @@ class WebSocketServer : public TransportInterface { Q_OBJECT public: - explicit WebSocketServer(const ServerConfiguration &configuration, const QSslConfiguration &sslConfiguration, QObject *parent = 0); - ~WebSocketServer(); + explicit WebSocketServer(const ServerConfiguration &configuration, const QSslConfiguration &sslConfiguration, QObject *parent = nullptr); + ~WebSocketServer() override; QUrl serverUrl() const; @@ -51,9 +51,9 @@ public: void sendData(const QList &clients, const QByteArray &data) override; private: - QWebSocketServer *m_server; + QWebSocketServer *m_server = nullptr; QHash m_clientList; - QtAvahiService *m_avahiService; + QtAvahiService *m_avahiService = nullptr; QSslConfiguration m_sslConfiguration; bool m_enabled; diff --git a/libnymea/devicemanager.cpp b/libnymea/devicemanager.cpp index ceeb9ae5..7c2ea7a5 100644 --- a/libnymea/devicemanager.cpp +++ b/libnymea/devicemanager.cpp @@ -193,7 +193,7 @@ #include #include -/*! Constructs the DeviceManager with the given \a locale and \a parent. There should only be one DeviceManager in the system created by \l{nymeaserver::NymeaCore}. +/*! Constructs the DeviceManager with the given \a{hardwareManager}, \a locale and \a parent. There should only be one DeviceManager in the system created by \l{nymeaserver::NymeaCore}. * Use \c nymeaserver::NymeaCore::instance()->deviceManager() instead to access the DeviceManager. */ DeviceManager::DeviceManager(HardwareManager *hardwareManager, const QLocale &locale, QObject *parent) : QObject(parent),