Heart/ClientProtocol/abstractnode.h

286 lines
5.6 KiB
C
Raw Normal View History

2019-10-09 17:58:58 +03:00
#ifndef ABSTRACTNODE_H
#define ABSTRACTNODE_H
2019-10-10 17:56:57 +03:00
#include "abstractnodeinfo.h"
2019-10-09 17:58:58 +03:00
#include "clientprotocol.h"
#include <QAbstractSocket>
2019-10-15 17:27:27 +03:00
#include <QSslConfiguration>
2019-10-10 17:56:57 +03:00
#include <QTcpServer>
2019-10-14 18:20:29 +03:00
class QSslCertificate;
class QSslKey;
2019-10-15 17:27:27 +03:00
class EVP_PKEY;
class QSslConfiguration;
2019-10-09 17:58:58 +03:00
namespace ClientProtocol {
2019-10-15 17:27:27 +03:00
enum class SslMode {
NoSSL,
InitFromSystem,
InitSelfSigned
};
2019-10-10 17:56:57 +03:00
/**
* @brief The NodeInfoData struct
*/
struct NodeInfoData {
AbstractNodeInfo info;
BasePackage pkg;
};
2019-10-15 17:27:27 +03:00
/**
* @brief The SslSrtData struct
*/
struct SslSrtData {
QString country = "BY";
QString organization = "QuasarApp";
QString commonName = "Dev";
long long endTime = 31536000L; //1 year
};
2019-10-10 17:56:57 +03:00
#define CRITICAL_ERROOR -50
#define LOGICK_ERROOR -20
#define REQUEST_ERROR -5
class AbstractData;
/**
* @brief The AbstractNode class
*/
class AbstractNode : public QTcpServer
2019-10-09 17:58:58 +03:00
{
2019-10-10 17:56:57 +03:00
Q_OBJECT
2019-10-09 17:58:58 +03:00
public:
2019-10-10 17:56:57 +03:00
/**
* @brief AbstractNode
* @param ssl
* @param ptr
*/
2019-10-15 17:27:27 +03:00
AbstractNode(SslMode mode = SslMode::NoSSL, QObject * ptr = nullptr);
2019-10-10 17:56:57 +03:00
/**
* @brief run
* @param addres
* @param port
* @return
*/
virtual bool run(const QString& addres, unsigned short port);
/**
* @brief stop stop this node
*/
virtual void stop();
/**
* @brief getInfo
* @param id of selected node
2019-10-11 18:30:09 +03:00
* @return pointer to information about node
2019-10-10 17:56:57 +03:00
*/
virtual AbstractNodeInfo *getInfoPtr(quint32 id);
2019-10-11 18:30:09 +03:00
/**
* @brief getInfo
* @param id
* @return information about Node
*/
2019-10-10 17:56:57 +03:00
virtual AbstractNodeInfo getInfo(quint32 id) const;
2019-10-11 18:30:09 +03:00
/**
* @brief getInfo
* @param id of selected node
* @return pointer to information about node
*/
virtual AbstractNodeInfo *getInfoPtr(const QHostAddress &id);
/**
* @brief getInfo
* @param id peer adders
* @return information about Node
*/
virtual AbstractNodeInfo getInfo(const QHostAddress &id) const;
2019-10-10 17:56:57 +03:00
/**
* @brief ban
* @param target id of ban node
*/
virtual void ban(quint32 target);
/**
* @brief unBan
* @param target id of unban node
*/
virtual void unBan(quint32 target);
/**
* @brief port
* @return current node port
*/
unsigned short port() const;
/**
* @brief address
* @return return current adders
*/
QHostAddress address() const;
2019-10-14 18:20:29 +03:00
/**
2019-10-15 17:27:27 +03:00
* @brief getSslConfig
* @return current ssl configuration on this nod
2019-10-14 18:20:29 +03:00
*/
2019-10-15 17:27:27 +03:00
QSslConfiguration getSslConfig() const;
2019-10-14 18:20:29 +03:00
2019-10-10 17:56:57 +03:00
~AbstractNode() override;
2019-10-15 17:27:27 +03:00
SslMode getMode() const;
2019-10-10 17:56:57 +03:00
signals:
void incomingReques(BasePackage pkg, quint32 sender);
protected:
2019-10-15 17:27:27 +03:00
/**
* @brief generateRSAforSSL
* @param pkey -
* @return
*/
virtual bool generateRSAforSSL(EVP_PKEY* pkey) const;
/**
* @brief generateSslData - generate new ssl data
* @param data - sign data
* @param r_srt - result srt
* @param r_key - result private key
* @return true if all good
*/
virtual bool generateSslDataPrivate(const SslSrtData& data, QSslCertificate& r_srt, QSslKey& r_key);
/**
* @brief selfSignedSslConfiguration
* @return generate new keys and use it
*/
virtual QSslConfiguration selfSignedSslConfiguration();
2019-10-10 17:56:57 +03:00
/**
* @brief registerSocket
* @param socket
* @return
*/
virtual bool registerSocket(QAbstractSocket *socket);
/**
* @brief parsePackage
* @param pkg
* @param sender
* @return
*/
2019-10-11 18:30:09 +03:00
virtual bool parsePackage(const BasePackage &pkg, AbstractNodeInfo *sender);
2019-10-10 17:56:57 +03:00
/**
* @brief sendPackage
* @param pkg
* @param target
* @return
*/
virtual bool sendPackage(const BasePackage &pkg, QAbstractSocket *target);
/**
* @brief sendResponse
* @param resp
* @param address
* @param req
* @return
*/
virtual bool sendResponse(const AbstractData& resp, quint32 address,
2019-10-15 17:27:27 +03:00
const BaseHeader *req = nullptr);
2019-10-10 17:56:57 +03:00
/**
* @brief badRequest
* @param address
* @param req
*/
virtual void badRequest(quint32 address, const BaseHeader &req);
/**
* @brief getWorkState
* @return string of work state
*/
virtual QString getWorkState() const;
/**
* @brief connectionState
* @return string with count users state
*/
virtual QString connectionState() const;
/**
* @brief baned
* @return
*/
QStringList baned() const;
/**
* @brief connectionsCount
* @return
*/
int connectionsCount() const;
/**
* @brief isBaned
* @param socket
* @return
*/
bool isBaned(QAbstractSocket* socket) const;
/**
* @brief incomingConnection
* @param handle
*/
void incomingConnection(qintptr handle) override;
2019-10-15 17:27:27 +03:00
/**
* @brief changeTrust change trust of connected node
* @param id - id of select node
* @param diff
* @return true if all good
*/
2019-10-10 17:56:57 +03:00
bool changeTrust(quint32 id, int diff);
2019-10-11 18:30:09 +03:00
/**
* @brief incomingConnection for ssl sockets
* @param handle - handle of socket
*/
2019-10-15 17:27:27 +03:00
virtual void incomingSsl(qintptr handle);
2019-10-11 18:30:09 +03:00
/**
* @brief incomingConnection for tcp sockets
* @param handle - handle of socket
*/
2019-10-15 17:27:27 +03:00
virtual void incomingTcp(qintptr handle);
2019-10-10 17:56:57 +03:00
2019-10-15 17:27:27 +03:00
/**
* @brief setMode - invoke this method befor run method
* @param mode
*/
bool setMode(const SslMode &mode);
2019-10-11 18:30:09 +03:00
2019-10-15 17:27:27 +03:00
private slots:
2019-10-11 18:30:09 +03:00
2019-10-10 17:56:57 +03:00
void avelableBytes();
void handleDisconnected();
private:
2019-10-15 17:27:27 +03:00
SslMode _mode;
QSslConfiguration _ssl;
2019-10-10 17:56:57 +03:00
QHash<unsigned int, NodeInfoData> _connections;
2019-10-09 17:58:58 +03:00
};
}
#endif // ABSTRACTNODE_H