Update core documentation and fix inline warnings
This commit is contained in:
parent
50bd22cedd
commit
dcd410457d
@ -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
|
||||
|
||||
|
||||
@ -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}.
|
||||
|
||||
@ -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
|
||||
*/
|
||||
|
||||
@ -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.
|
||||
*/
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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())
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -194,6 +194,7 @@ void StateEvaluator::removeDevice(const DeviceId &deviceId)
|
||||
}
|
||||
}
|
||||
|
||||
/*! Returns a list of \l{DeviceId}{DeviceIds} of this StateEvaluator. */
|
||||
QList<DeviceId> StateEvaluator::containedDevices() const
|
||||
{
|
||||
QList<DeviceId> ret;
|
||||
|
||||
@ -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<QUuid> &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<quint16>(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<quint16>(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);
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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
|
||||
{
|
||||
|
||||
@ -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
|
||||
|
||||
@ -107,6 +107,10 @@ QList<QByteArray> 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.";
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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<QUuid> &clients, const QVariantMap &data);
|
||||
/*! \fn void nymeaserver::TransportInterface::sendData(const QList<QUuid> &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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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<int, QString>(-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<TokenInfo> UserManager::tokens(const QString &username) const
|
||||
{
|
||||
QList<TokenInfo> ret;
|
||||
@ -260,6 +318,7 @@ QList<TokenInfo> 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)) {
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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<quint16>(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<quint16>(m_configuration.port))) {
|
||||
qCWarning(dcWebServer()) << "Webserver could not listen on" << serverUrl().toString() << errorString();
|
||||
m_enabled = false;
|
||||
return false;
|
||||
|
||||
@ -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<WebServerClient *> m_webServerClients;
|
||||
QHash<QSslSocket *, HttpRequest> 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);
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
* *
|
||||
* Copyright (C) 2015 Simon Stürz <simon.stuerz@guh.io> *
|
||||
* Copyright (C) 2015 - 2018 Simon Stürz <simon.stuerz@guh.io> *
|
||||
* *
|
||||
* 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<quint16>(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<quint16>(configuration().port))) {
|
||||
qCWarning(dcConnection) << "Websocket server" << m_server->serverName() << "could not listen on" << serverUrl().toString();
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
* *
|
||||
* Copyright (C) 2015 Simon Stürz <simon.stuerz@guh.io> *
|
||||
* Copyright (C) 2015 - 2018 Simon Stürz <simon.stuerz@guh.io> *
|
||||
* *
|
||||
* 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<QUuid> &clients, const QByteArray &data) override;
|
||||
|
||||
private:
|
||||
QWebSocketServer *m_server;
|
||||
QWebSocketServer *m_server = nullptr;
|
||||
QHash<QUuid, QWebSocket *> m_clientList;
|
||||
QtAvahiService *m_avahiService;
|
||||
QtAvahiService *m_avahiService = nullptr;
|
||||
QSslConfiguration m_sslConfiguration;
|
||||
bool m_enabled;
|
||||
|
||||
|
||||
@ -193,7 +193,7 @@
|
||||
#include <QStandardPaths>
|
||||
#include <QDir>
|
||||
|
||||
/*! 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),
|
||||
|
||||
Reference in New Issue
Block a user