2019-02-13 13:03:40 +03:00
|
|
|
#include "server.h"
|
|
|
|
#include "quasarapp.h"
|
|
|
|
#include <QTcpSocket>
|
2019-03-05 13:38:20 +03:00
|
|
|
#include <factorynetobjects.h>
|
2019-02-13 13:03:40 +03:00
|
|
|
|
|
|
|
namespace ClientProtocol {
|
|
|
|
|
|
|
|
bool Server::parsePackage(const Package &pkg, QTcpSocket* sender) {
|
|
|
|
if (!pkg.isValid()) {
|
|
|
|
QuasarAppUtils::Params::verboseLog("incomming package is not valid!");
|
2019-03-09 12:30:42 +03:00
|
|
|
changeKarma(sender->peerAddress(), CRITICAL_ERROOR);
|
2019-02-13 13:03:40 +03:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!sender->isValid()) {
|
|
|
|
QuasarAppUtils::Params::verboseLog("incomming package is not valid!");
|
2019-03-09 12:30:42 +03:00
|
|
|
changeKarma(sender->peerAddress(), LOGICK_ERROOR);
|
2019-02-13 13:03:40 +03:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch (pkg.hdr.command) {
|
2019-03-05 00:48:32 +03:00
|
|
|
case NetworkClasses::Ping: {
|
2019-02-13 13:03:40 +03:00
|
|
|
|
2019-03-05 13:38:20 +03:00
|
|
|
if (pkg.hdr.type != Request) {
|
2019-02-13 13:03:40 +03:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2019-03-05 13:38:20 +03:00
|
|
|
Package pcg;
|
2019-02-13 13:03:40 +03:00
|
|
|
|
2019-03-05 13:38:20 +03:00
|
|
|
auto map = FactoryNetObjects::build(NetworkClasses::Ping);
|
|
|
|
if (!pcg.create(map, Responke)) {
|
|
|
|
return false;
|
|
|
|
};
|
2019-02-13 13:03:40 +03:00
|
|
|
|
2019-03-05 13:38:20 +03:00
|
|
|
if (!sendPackage(pcg, sender)) {
|
2019-02-13 13:03:40 +03:00
|
|
|
QuasarAppUtils::Params::verboseLog("!responce not sendet!");
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2019-03-09 12:30:42 +03:00
|
|
|
default: {
|
|
|
|
QVariantMap data;
|
|
|
|
pkg.parse(data);
|
|
|
|
emit incomingReques(data, sender->peerAddress());
|
2019-02-13 13:03:40 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2019-03-05 13:38:20 +03:00
|
|
|
bool Server::sendPackage(Package &pkg, QTcpSocket * target) {
|
|
|
|
if (!pkg.isValid()) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!target->isValid()) {
|
|
|
|
qCritical() << "destination server not valid!";
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!target->waitForConnected()) {
|
|
|
|
qCritical() << "no connected to server! " << target->errorString();
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
auto bytes = pkg.toBytes();
|
|
|
|
bool sendet = bytes.size() == target->write(bytes);
|
|
|
|
|
|
|
|
return sendet;
|
|
|
|
}
|
|
|
|
|
2019-03-09 12:30:42 +03:00
|
|
|
void Server::ban(const QHostAddress& target) {
|
2019-03-10 16:56:42 +03:00
|
|
|
_karma.insert(target, BANED_KARMA);
|
2019-03-09 12:30:42 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
void Server::unBan(const QHostAddress& target) {
|
2019-03-10 16:56:42 +03:00
|
|
|
_karma.insert(target, RESTORE_KARMA);
|
2019-03-09 12:30:42 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
void Server::registerSocket(const QTcpSocket *socket) {
|
2019-03-10 16:56:42 +03:00
|
|
|
if (!_karma.contains(socket->peerAddress())) {
|
|
|
|
_karma.insert(socket->peerAddress(), DEFAULT_KARMA);
|
2019-03-09 12:30:42 +03:00
|
|
|
connect(socket, &QTcpSocket::readyRead, this, &Server::avelableBytes);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Server::changeKarma(const QHostAddress &addresss, int diff) {
|
2019-03-10 16:56:42 +03:00
|
|
|
int objKarma = _karma.value(addresss, NOT_VALID_CARMA);
|
2019-03-09 12:30:42 +03:00
|
|
|
|
|
|
|
if (objKarma >= NOT_VALID_CARMA) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (objKarma <= BANED_KARMA) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2019-03-10 16:56:42 +03:00
|
|
|
_karma.insert(addresss, objKarma + diff);
|
2019-03-09 12:30:42 +03:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Server::isBaned(const QTcpSocket * adr) const {
|
2019-03-10 16:56:42 +03:00
|
|
|
return _karma.value(adr->peerAddress(), NOT_VALID_CARMA) < 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Server::saveKarma() const {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Server::loadKarma() {
|
|
|
|
return false;
|
2019-03-09 12:30:42 +03:00
|
|
|
}
|
|
|
|
|
2019-02-13 13:03:40 +03:00
|
|
|
void Server::avelableBytes() {
|
|
|
|
auto client = dynamic_cast<QTcpSocket*>(sender());
|
|
|
|
|
|
|
|
if (!client) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
auto array = client->readAll();
|
|
|
|
|
|
|
|
if (_downloadPackage.hdr.isValid()) {
|
|
|
|
_downloadPackage.data.append(array);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
memcpy(&_downloadPackage.hdr,
|
2019-02-14 14:09:17 +03:00
|
|
|
array.data(), sizeof(Header));
|
|
|
|
_downloadPackage.data.append(array.mid(sizeof(Header)));
|
2019-02-13 13:03:40 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
if (_downloadPackage.isValid()) {
|
|
|
|
parsePackage(_downloadPackage, client);
|
|
|
|
_downloadPackage.reset();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Server::handleIncommingConnection() {
|
|
|
|
while (hasPendingConnections()) {
|
|
|
|
auto socket = nextPendingConnection();
|
2019-03-09 12:30:42 +03:00
|
|
|
|
|
|
|
if (isBaned(socket)) {
|
|
|
|
socket->abort();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
registerSocket(socket);
|
2019-02-13 13:03:40 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Server::Server(QObject *ptr) :
|
|
|
|
QTcpServer (ptr) {
|
|
|
|
|
|
|
|
connect(this, &Server::newConnection, this, &Server::handleIncommingConnection);
|
|
|
|
}
|
|
|
|
|
|
|
|
Server::~Server() {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Server::run(const QString &ip, unsigned short port) {
|
|
|
|
if (!listen(QHostAddress(ip), port) ) {
|
|
|
|
QuasarAppUtils::Params::verboseLog("listing fail " + this->errorString());
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2019-03-10 16:56:42 +03:00
|
|
|
void Server::stop(bool reset) {
|
|
|
|
close();
|
|
|
|
|
|
|
|
if (reset) {
|
|
|
|
for (auto socket: _connections) {
|
|
|
|
socket->deleteLater();
|
|
|
|
}
|
|
|
|
_connections.clear();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
QString Server::getWorkState() const {
|
|
|
|
if (isListening()) {
|
|
|
|
if (hasPendingConnections())
|
|
|
|
return "Work";
|
|
|
|
else {
|
|
|
|
return "overload";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return "Not running";
|
|
|
|
}
|
|
|
|
|
|
|
|
QString Server::connectionState() const {
|
|
|
|
return QString("%0 / %1").arg(_connections.size()).arg(maxPendingConnections());
|
|
|
|
}
|
|
|
|
|
|
|
|
int Server::banedCount() const {
|
|
|
|
int count = 0;
|
|
|
|
for (int i :_karma) {
|
|
|
|
if (i <= 0) {
|
|
|
|
count++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return count;
|
|
|
|
}
|
|
|
|
|
2019-02-13 13:03:40 +03:00
|
|
|
}
|