mirror of
https://github.com/QuasarApp/Heart.git
synced 2025-05-12 09:29:41 +00:00
fix testst
This commit is contained in:
parent
c517955a58
commit
ffabb9b2e9
@ -13,7 +13,7 @@ if(TARGET ${PROJECT_NAME})
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(NOT DEFINED HEART_BUILD_LVL)
|
if(NOT DEFINED HEART_BUILD_LVL)
|
||||||
set(HEART_BUILD_LVL 2)
|
set(HEART_BUILD_LVL 1)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
include(QuasarAppLib/CMake/ccache.cmake)
|
include(QuasarAppLib/CMake/ccache.cmake)
|
||||||
|
@ -23,9 +23,11 @@ namespace PKG {
|
|||||||
*/
|
*/
|
||||||
enum class UserRequestType: unsigned char {
|
enum class UserRequestType: unsigned char {
|
||||||
/// Request to registration a new user.
|
/// Request to registration a new user.
|
||||||
SignIn,
|
SignUp,
|
||||||
/// Request to login an exists user.
|
/// Request to login an exists user.
|
||||||
Login,
|
LogIn,
|
||||||
|
/// Request to logout an exists user. This request remove the generated accsses token from server.
|
||||||
|
LogOut,
|
||||||
/// Remove all data of this user from server
|
/// Remove all data of this user from server
|
||||||
Remove
|
Remove
|
||||||
};
|
};
|
||||||
|
@ -19,16 +19,16 @@ SingleServer::SingleServer()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
RegisteruserResult SingleServer::registerNewUser(PKG::UserMember user,
|
UserOperationResult SingleServer::registerNewUser(PKG::UserMember user,
|
||||||
const AbstractNodeInfo *info) {
|
const AbstractNodeInfo *info) {
|
||||||
if (!db()) {
|
if (!db()) {
|
||||||
return RegisteruserResult::InternalError;
|
return UserOperationResult::InternalError;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto localObject = db()->getObject(user);
|
auto localObject = db()->getObject(user);
|
||||||
|
|
||||||
if (localObject) {
|
if (localObject) {
|
||||||
return RegisteruserResult::UserExits;
|
return UserOperationResult::UserExits;
|
||||||
}
|
}
|
||||||
|
|
||||||
user.setAuthenticationData(hashgenerator(user.authenticationData()));
|
user.setAuthenticationData(hashgenerator(user.authenticationData()));
|
||||||
@ -38,37 +38,38 @@ RegisteruserResult SingleServer::registerNewUser(PKG::UserMember user,
|
|||||||
addUpdatePermission(requester, user.dbAddress(), Permission::Write);
|
addUpdatePermission(requester, user.dbAddress(), Permission::Write);
|
||||||
|
|
||||||
if (!db()->insertObject(QSharedPointer<decltype(user)>::create(user))) {
|
if (!db()->insertObject(QSharedPointer<decltype(user)>::create(user))) {
|
||||||
return RegisteruserResult::InternalError;
|
return UserOperationResult::InternalError;
|
||||||
};
|
};
|
||||||
|
|
||||||
return loginUser(user, info);
|
return loginUser(user, info);
|
||||||
}
|
}
|
||||||
|
|
||||||
RegisteruserResult SingleServer::loginUser(PKG::UserMember user,
|
// To-Do fix me bug #12 https://github.com/QuasarApp/Heart/issues/12
|
||||||
|
UserOperationResult SingleServer::loginUser(PKG::UserMember user,
|
||||||
const AbstractNodeInfo *info) {
|
const AbstractNodeInfo *info) {
|
||||||
|
|
||||||
if (!db()) {
|
if (!db()) {
|
||||||
return RegisteruserResult::InternalError;
|
return UserOperationResult::InternalError;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto localObject = db()->getObject(user);
|
auto localObject = db()->getObject(user);
|
||||||
|
|
||||||
if (!localObject) {
|
if (!localObject) {
|
||||||
return RegisteruserResult::UserNotExits;
|
return UserOperationResult::UserNotExits;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (localObject->authenticationData() != hashgenerator(user.authenticationData())) {
|
if (localObject->authenticationData() != hashgenerator(user.authenticationData())) {
|
||||||
return RegisteruserResult::UserInvalidPasswoed;
|
return UserOperationResult::UserInvalidPasswoed;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto nodeinfo = dynamic_cast<const BaseNodeInfo*>(info);
|
auto nodeinfo = dynamic_cast<const BaseNodeInfo*>(info);
|
||||||
if (!nodeinfo)
|
if (!nodeinfo)
|
||||||
return RegisteruserResult::InternalError;
|
return UserOperationResult::InternalError;
|
||||||
|
|
||||||
AccessToken token((nodeinfo->token().toBytes()));
|
AccessToken token((nodeinfo->token().toBytes()));
|
||||||
|
|
||||||
if (token.isValid()) {
|
if (token.isValid()) {
|
||||||
return RegisteruserResult::UserAlreadyLogged;
|
return UserOperationResult::UserAlreadyLogged;
|
||||||
}
|
}
|
||||||
|
|
||||||
token = localObject->token();
|
token = localObject->token();
|
||||||
@ -79,17 +80,53 @@ RegisteruserResult SingleServer::loginUser(PKG::UserMember user,
|
|||||||
|
|
||||||
auto editableNodeInfo = static_cast<BaseNodeInfo*>(getInfoPtr(info->networkAddress()));
|
auto editableNodeInfo = static_cast<BaseNodeInfo*>(getInfoPtr(info->networkAddress()));
|
||||||
if (!editableNodeInfo)
|
if (!editableNodeInfo)
|
||||||
return RegisteruserResult::InternalError;
|
return UserOperationResult::InternalError;
|
||||||
|
|
||||||
editableNodeInfo->setToken(token);
|
editableNodeInfo->setToken(token);
|
||||||
user.setToken(token);
|
user.setToken(token);
|
||||||
user.setAuthenticationData("");
|
user.setAuthenticationData("");
|
||||||
|
|
||||||
if (!sendData(&user, info->networkAddress())) {
|
if (!sendData(&user, info->networkAddress())) {
|
||||||
return RegisteruserResult::InternalError;
|
return UserOperationResult::InternalError;
|
||||||
};
|
};
|
||||||
|
|
||||||
return RegisteruserResult::Success;
|
return UserOperationResult::Success;
|
||||||
|
}
|
||||||
|
|
||||||
|
UserOperationResult SingleServer::loginOutUser(PKG::UserMember user,
|
||||||
|
const AbstractNodeInfo *info) {
|
||||||
|
|
||||||
|
if (!db()) {
|
||||||
|
return UserOperationResult::InternalError;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto localObject = db()->getObject(user);
|
||||||
|
|
||||||
|
if (!localObject) {
|
||||||
|
return UserOperationResult::UserNotExits;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto nodeinfo = dynamic_cast<const BaseNodeInfo*>(info);
|
||||||
|
if (!nodeinfo)
|
||||||
|
return UserOperationResult::InternalError;
|
||||||
|
|
||||||
|
AccessToken token((nodeinfo->token().toBytes()));
|
||||||
|
if (!token.isValid()) {
|
||||||
|
return UserOperationResult::UserNotLogged;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (user.token() != token) {
|
||||||
|
return UserOperationResult::UserNotLogged;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto mutableNodeInfo = dynamic_cast<BaseNodeInfo*>(getInfoPtr(info->networkAddress()));
|
||||||
|
if (!mutableNodeInfo)
|
||||||
|
return UserOperationResult::InternalError;
|
||||||
|
|
||||||
|
mutableNodeInfo->setToken(AccessToken{});
|
||||||
|
|
||||||
|
return UserOperationResult::Success;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
AccessToken SingleServer::generateToken(int length) {
|
AccessToken SingleServer::generateToken(int length) {
|
||||||
@ -134,7 +171,7 @@ bool SingleServer::workWithUserRequest(const QSharedPointer<PKG::UserMember>& ob
|
|||||||
const Package &pkg,
|
const Package &pkg,
|
||||||
const AbstractNodeInfo *sender) {
|
const AbstractNodeInfo *sender) {
|
||||||
|
|
||||||
RegisteruserResult result = RegisteruserResult::InternalError;
|
UserOperationResult result = UserOperationResult::InternalError;
|
||||||
|
|
||||||
auto request = obj.dynamicCast<Request>();
|
auto request = obj.dynamicCast<Request>();
|
||||||
|
|
||||||
@ -142,10 +179,12 @@ bool SingleServer::workWithUserRequest(const QSharedPointer<PKG::UserMember>& ob
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (request->getRequestCmd() == static_cast<quint8>(PKG::UserRequestType::Login)) {
|
if (request->getRequestCmd() == static_cast<quint8>(PKG::UserRequestType::LogIn)) {
|
||||||
result = loginUser(*obj.staticCast<PKG::UserMember>().data(), sender);
|
result = loginUser(*obj.staticCast<PKG::UserMember>().data(), sender);
|
||||||
} else if (request->getRequestCmd() == static_cast<quint8>(PKG::UserRequestType::SignIn)) {
|
} else if (request->getRequestCmd() == static_cast<quint8>(PKG::UserRequestType::SignUp)) {
|
||||||
result = registerNewUser(*obj, sender);
|
result = registerNewUser(*obj, sender);
|
||||||
|
} else if (request->getRequestCmd() == static_cast<quint8>(PKG::UserRequestType::LogOut)) {
|
||||||
|
result = loginOutUser(*obj, sender);
|
||||||
} else if (request->getRequestCmd() == static_cast<quint8>(PKG::UserRequestType::Remove)) {
|
} else if (request->getRequestCmd() == static_cast<quint8>(PKG::UserRequestType::Remove)) {
|
||||||
|
|
||||||
auto requesterId = getSender(sender, obj.data());
|
auto requesterId = getSender(sender, obj.data());
|
||||||
@ -161,7 +200,7 @@ bool SingleServer::workWithUserRequest(const QSharedPointer<PKG::UserMember>& ob
|
|||||||
|
|
||||||
switch (result) {
|
switch (result) {
|
||||||
|
|
||||||
case RegisteruserResult::InternalError: {
|
case UserOperationResult::InternalError: {
|
||||||
QuasarAppUtils::Params::log("Internal error ocured in the loginUser or registerNewUser method.",
|
QuasarAppUtils::Params::log("Internal error ocured in the loginUser or registerNewUser method.",
|
||||||
QuasarAppUtils::Error);
|
QuasarAppUtils::Error);
|
||||||
badRequest(sender->networkAddress(), pkg.hdr,
|
badRequest(sender->networkAddress(), pkg.hdr,
|
||||||
@ -176,7 +215,7 @@ bool SingleServer::workWithUserRequest(const QSharedPointer<PKG::UserMember>& ob
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
case RegisteruserResult::UserExits: {
|
case UserOperationResult::UserExits: {
|
||||||
badRequest(sender->networkAddress(), pkg.hdr,
|
badRequest(sender->networkAddress(), pkg.hdr,
|
||||||
{
|
{
|
||||||
ErrorCodes::InternalError,
|
ErrorCodes::InternalError,
|
||||||
@ -187,7 +226,7 @@ bool SingleServer::workWithUserRequest(const QSharedPointer<PKG::UserMember>& ob
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
case RegisteruserResult::UserNotExits: {
|
case UserOperationResult::UserNotExits: {
|
||||||
badRequest(sender->networkAddress(), pkg.hdr,
|
badRequest(sender->networkAddress(), pkg.hdr,
|
||||||
{
|
{
|
||||||
ErrorCodes::UserNotExits,
|
ErrorCodes::UserNotExits,
|
||||||
@ -198,7 +237,7 @@ bool SingleServer::workWithUserRequest(const QSharedPointer<PKG::UserMember>& ob
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
case RegisteruserResult::UserInvalidPasswoed: {
|
case UserOperationResult::UserInvalidPasswoed: {
|
||||||
badRequest(sender->networkAddress(), pkg.hdr,
|
badRequest(sender->networkAddress(), pkg.hdr,
|
||||||
{
|
{
|
||||||
ErrorCodes::UserInvalidPasswoed,
|
ErrorCodes::UserInvalidPasswoed,
|
||||||
@ -209,7 +248,7 @@ bool SingleServer::workWithUserRequest(const QSharedPointer<PKG::UserMember>& ob
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
case RegisteruserResult::UserAlreadyLogged: {
|
case UserOperationResult::UserAlreadyLogged: {
|
||||||
badRequest(sender->networkAddress(), pkg.hdr,
|
badRequest(sender->networkAddress(), pkg.hdr,
|
||||||
{
|
{
|
||||||
ErrorCodes::UserInvalidPasswoed,
|
ErrorCodes::UserInvalidPasswoed,
|
||||||
@ -220,7 +259,18 @@ bool SingleServer::workWithUserRequest(const QSharedPointer<PKG::UserMember>& ob
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
case RegisteruserResult::Success: {
|
case UserOperationResult::UserNotLogged: {
|
||||||
|
badRequest(sender->networkAddress(), pkg.hdr,
|
||||||
|
{
|
||||||
|
ErrorCodes::UserInvalidPasswoed,
|
||||||
|
"User is not Logged"
|
||||||
|
},
|
||||||
|
REQUEST_LOGIN_ERROR);
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
case UserOperationResult::Success: {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,9 +23,9 @@ class UserMember;
|
|||||||
#define REQUEST_LOGIN_ERROR -1
|
#define REQUEST_LOGIN_ERROR -1
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief The RegisteruserResult enum
|
* @brief The UserOperationResult enum
|
||||||
*/
|
*/
|
||||||
enum class RegisteruserResult {
|
enum class UserOperationResult {
|
||||||
/// User not registered because database not inited or other error occurred.
|
/// User not registered because database not inited or other error occurred.
|
||||||
InternalError,
|
InternalError,
|
||||||
/// User not registered because user already exists.
|
/// User not registered because user already exists.
|
||||||
@ -36,6 +36,8 @@ enum class RegisteruserResult {
|
|||||||
UserInvalidPasswoed,
|
UserInvalidPasswoed,
|
||||||
/// User Already Logged.
|
/// User Already Logged.
|
||||||
UserAlreadyLogged,
|
UserAlreadyLogged,
|
||||||
|
/// User is not Loggined.
|
||||||
|
UserNotLogged,
|
||||||
/// User registered successful.
|
/// User registered successful.
|
||||||
Success
|
Success
|
||||||
};
|
};
|
||||||
@ -68,11 +70,11 @@ protected:
|
|||||||
* @param user This is data of new user.
|
* @param user This is data of new user.
|
||||||
* @param info This is info about requested client.
|
* @param info This is info about requested client.
|
||||||
|
|
||||||
* @return status of registration a new user. For more information about result statuses see the RegisteruserResult enum.
|
* @return status of registration a new user. For more information about result statuses see the UserOperationResult enum.
|
||||||
*
|
*
|
||||||
* @note This method send userData with new token to the client.
|
* @note This method send userData with new token to the client.
|
||||||
*/
|
*/
|
||||||
virtual RegisteruserResult registerNewUser(PKG::UserMember user,
|
virtual UserOperationResult registerNewUser(PKG::UserMember user,
|
||||||
const AbstractNodeInfo* info);
|
const AbstractNodeInfo* info);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -80,11 +82,19 @@ protected:
|
|||||||
* @param user This is user data with name and password.
|
* @param user This is user data with name and password.
|
||||||
* For login use PKG::User::getID and PKG::User::authenticationData like userName and password hash.
|
* For login use PKG::User::getID and PKG::User::authenticationData like userName and password hash.
|
||||||
* @param info This is info about requested client.
|
* @param info This is info about requested client.
|
||||||
* @return status of login a user. For more information about result statuses see the RegisteruserResult enum.
|
* @return status of login a user. For more information about result statuses see the UserOperationResult enum.
|
||||||
*
|
*
|
||||||
* @note This method send userData with new token to the client.
|
* @note This method send userData with new token to the client.
|
||||||
*/
|
*/
|
||||||
virtual RegisteruserResult loginUser(PKG::UserMember user, const AbstractNodeInfo* info);
|
virtual UserOperationResult loginUser(PKG::UserMember user, const AbstractNodeInfo* info);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief loginOutUser This method remove the generated accsses token from server.
|
||||||
|
* @param user This is network member data (user data)
|
||||||
|
* @param info This is info about requested client.
|
||||||
|
* @return status of operation. For more information about result statuses see the UserOperationResult enum.
|
||||||
|
*/
|
||||||
|
virtual UserOperationResult loginOutUser(PKG::UserMember user, const AbstractNodeInfo* info);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief generateToken This method generate a new toke.
|
* @brief generateToken This method generate a new toke.
|
||||||
@ -97,7 +107,9 @@ protected:
|
|||||||
QByteArray hashgenerator(const QByteArray &data) override;
|
QByteArray hashgenerator(const QByteArray &data) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool workWithUserRequest(const QSharedPointer<PKG::UserMember> &obj, const Package &pkg, const AbstractNodeInfo *sender);
|
bool workWithUserRequest(const QSharedPointer<PKG::UserMember> &obj,
|
||||||
|
const Package &pkg,
|
||||||
|
const AbstractNodeInfo *sender);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
#include "singleserverclient.h"
|
#include "singleserverclient.h"
|
||||||
#include "quasarapp.h"
|
#include "quasarapp.h"
|
||||||
|
#include "authrequest.h"
|
||||||
|
|
||||||
namespace QH {
|
namespace QH {
|
||||||
|
|
||||||
@ -14,8 +15,31 @@ SingleServerClient::SingleServerClient() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ParserResult SingleServerClient::parsePackage(const Package &pkg, const AbstractNodeInfo *sender) {
|
ParserResult SingleServerClient::parsePackage(const Package &pkg,
|
||||||
|
const AbstractNodeInfo *sender) {
|
||||||
|
|
||||||
|
auto parentResult = DataBaseNode::parsePackage(pkg, sender);
|
||||||
|
if (parentResult != QH::ParserResult::NotProcessed) {
|
||||||
|
return parentResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (H_16<QH::PKG::UserMember>() == pkg.hdr.command) {
|
||||||
|
QH::PKG::UserMember obj(pkg);
|
||||||
|
|
||||||
|
if (!(obj.isValid() && obj.token().isValid())) {
|
||||||
|
return ParserResult::Error;
|
||||||
|
}
|
||||||
|
|
||||||
|
setMember(obj);
|
||||||
|
|
||||||
|
if (getStatus() == ClientStatus::Loginning)
|
||||||
|
setStatus(ClientStatus::Logined);
|
||||||
|
|
||||||
|
return QH::ParserResult::Processed;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return QH::ParserResult::NotProcessed;
|
||||||
}
|
}
|
||||||
|
|
||||||
ClientStatus SingleServerClient::getStatus() const {
|
ClientStatus SingleServerClient::getStatus() const {
|
||||||
@ -23,11 +47,106 @@ ClientStatus SingleServerClient::getStatus() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool SingleServerClient::login(const QString &userId, const QString &rawPassword) {
|
bool SingleServerClient::login(const QString &userId, const QString &rawPassword) {
|
||||||
|
if (getStatus() < ClientStatus::Connected) {
|
||||||
|
QuasarAppUtils::Params::log("You try make login on the offline client."
|
||||||
|
" Please wait of ClientStatus::Connected status.",
|
||||||
|
QuasarAppUtils::Error);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (getStatus() < ClientStatus::Loginning) {
|
||||||
|
setStatus(ClientStatus::Loginning);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!p_login(userId, hashgenerator(rawPassword.toLatin1()))) {
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SingleServerClient::logout() {
|
||||||
|
if (getStatus() < ClientStatus::Logined) {
|
||||||
|
QuasarAppUtils::Params::log("You try logout on the not Loggined client."
|
||||||
|
" Please wait of ClientStatus::Logined status.",
|
||||||
|
QuasarAppUtils::Error);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QH::PKG::AuthRequest request;
|
||||||
|
const auto &user = getMember();
|
||||||
|
request.setId(user.getId());
|
||||||
|
request.setRequest(PKG::UserRequestType::LogOut);
|
||||||
|
if (!sendData(&request, serverAddress())) {
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SingleServerClient::signup(const QString &userId, const QString &rawPassword) {
|
bool SingleServerClient::signup(const QString &userId, const QString &rawPassword) {
|
||||||
|
if (getStatus() < ClientStatus::Connected) {
|
||||||
|
QuasarAppUtils::Params::log("You try make signup on the offline client."
|
||||||
|
" Please wait of ClientStatus::Connected status.",
|
||||||
|
QuasarAppUtils::Error);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (getStatus() < ClientStatus::Loginning) {
|
||||||
|
setStatus(ClientStatus::Loginning);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!p_signup(userId, hashgenerator(rawPassword.toLatin1()))) {
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SingleServerClient::removeUser() {
|
||||||
|
if (getStatus() < ClientStatus::Logined) {
|
||||||
|
QuasarAppUtils::Params::log("You try make remove on the not Loggined client."
|
||||||
|
" Please wait of ClientStatus::Logined status.",
|
||||||
|
QuasarAppUtils::Error);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QH::PKG::AuthRequest request;
|
||||||
|
const auto &user = getMember();
|
||||||
|
request.setId(user.getId());
|
||||||
|
request.setRequest(PKG::UserRequestType::Remove);
|
||||||
|
if (!sendData(&request, serverAddress())) {
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SingleServerClient::connectToServer() {
|
||||||
|
if (getStatus() >= ClientStatus::Connected) {
|
||||||
|
QuasarAppUtils::Params::log("You try make connect on the online client."
|
||||||
|
" This client alredy connected to server.",
|
||||||
|
QuasarAppUtils::Error);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (getStatus() < ClientStatus::Connecting) {
|
||||||
|
setStatus(ClientStatus::Connecting);
|
||||||
|
}
|
||||||
|
|
||||||
|
addNode(serverAddress());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SingleServerClient::disconnectFromServer() {
|
||||||
|
if (getStatus() == ClientStatus::Dissconnected) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
removeNode(serverAddress());
|
||||||
|
setStatus(ClientStatus::Dissconnected);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SingleServerClient::setStatus(const ClientStatus &status) {
|
void SingleServerClient::setStatus(const ClientStatus &status) {
|
||||||
@ -43,10 +162,40 @@ void SingleServerClient::handleError(unsigned char, const QString &error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool SingleServerClient::p_login(const QString &userId, const QByteArray &hashPassword) {
|
bool SingleServerClient::p_login(const QString &userId, const QByteArray &hashPassword) {
|
||||||
|
QH::PKG::AuthRequest request;
|
||||||
|
request.setId(userId);
|
||||||
|
request.setRequest(QH::PKG::UserRequestType::LogIn);
|
||||||
|
|
||||||
|
if (hashPassword.isEmpty()) {
|
||||||
|
const auto &member = getMember();
|
||||||
|
if (!member.token().isValid()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
request.setToken(member.token());
|
||||||
|
}
|
||||||
|
|
||||||
|
return sendData(&request, serverAddress());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SingleServerClient::p_signIn(const QString &userId, const QByteArray &hashPassword) {
|
bool SingleServerClient::p_signup(const QString &userId, const QByteArray &hashPassword) {
|
||||||
|
QH::PKG::AuthRequest request;
|
||||||
|
request.setId(userId);
|
||||||
|
request.setAuthenticationData(hashPassword);
|
||||||
|
request.setRequest(QH::PKG::UserRequestType::SignUp);
|
||||||
|
|
||||||
|
return sendData(&request, serverAddress());
|
||||||
|
}
|
||||||
|
|
||||||
|
const PKG::UserMember &SingleServerClient::getMember() const {
|
||||||
|
return _member;
|
||||||
|
}
|
||||||
|
|
||||||
|
HostAddress SingleServerClient::serverAddress() const {
|
||||||
|
return HostAddress{"localhost", DEFAULT_PORT};
|
||||||
|
}
|
||||||
|
|
||||||
|
void SingleServerClient::setMember(const PKG::UserMember &member) {
|
||||||
|
_member = member;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -99,7 +99,6 @@ public:
|
|||||||
*/
|
*/
|
||||||
void disconnectFromServer();
|
void disconnectFromServer();
|
||||||
|
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
/**
|
/**
|
||||||
* @brief statusChanged This sigmnal emited when the client change an own status.
|
* @brief statusChanged This sigmnal emited when the client change an own status.
|
||||||
@ -115,6 +114,20 @@ protected:
|
|||||||
*/
|
*/
|
||||||
void setStatus(const ClientStatus &status);
|
void setStatus(const ClientStatus &status);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief getMember This method return the UserMember object of loffined user.
|
||||||
|
* @return UserMember object.
|
||||||
|
*/
|
||||||
|
const PKG::UserMember &getMember() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief serverAddress This method return the addres of server.
|
||||||
|
* Override this method for change server address.
|
||||||
|
* Default implementation return the localhost address with the 3090 port.
|
||||||
|
* @return host of the server.
|
||||||
|
*/
|
||||||
|
virtual HostAddress serverAddress() const;
|
||||||
|
|
||||||
protected slots:
|
protected slots:
|
||||||
/**
|
/**
|
||||||
* @brief handleError This handle method invoked when the client received the BadRequest from server. Ovveride this method for add actions for this event.
|
* @brief handleError This handle method invoked when the client received the BadRequest from server. Ovveride this method for add actions for this event.
|
||||||
@ -126,7 +139,8 @@ protected slots:
|
|||||||
private:
|
private:
|
||||||
|
|
||||||
bool p_login(const QString &userId, const QByteArray &hashPassword = {});
|
bool p_login(const QString &userId, const QByteArray &hashPassword = {});
|
||||||
bool p_signIn(const QString &userId, const QByteArray &hashPassword);
|
bool p_signup(const QString &userId, const QByteArray &hashPassword);
|
||||||
|
void setMember(const PKG::UserMember &member);
|
||||||
|
|
||||||
ClientStatus _status;
|
ClientStatus _status;
|
||||||
PKG::UserMember _member;
|
PKG::UserMember _member;
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
namespace QH {
|
namespace QH {
|
||||||
using namespace PKG;
|
using namespace PKG;
|
||||||
|
|
||||||
bool SqlDBWriter::exec(QSqlQuery *sq,const QString& sqlFile) {
|
bool SqlDBWriter::exec(QSqlQuery *sq, const QString& sqlFile) {
|
||||||
QFile f(sqlFile);
|
QFile f(sqlFile);
|
||||||
bool result = true;
|
bool result = true;
|
||||||
if (f.open(QIODevice::ReadOnly)) {
|
if (f.open(QIODevice::ReadOnly)) {
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit bce113979b640dcf680a8d31ad1c20757fad8082
|
Subproject commit 810376b593479606e4c8841e70676bb1f5790e2c
|
@ -12,4 +12,9 @@
|
|||||||
|
|
||||||
namespace QH {
|
namespace QH {
|
||||||
|
|
||||||
|
bool init() {
|
||||||
|
initResources();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,8 @@
|
|||||||
#include "networknode.h"
|
#include "networknode.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
inline void initResources() { Q_INIT_RESOURCE(ProtockolResusces); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief The QH namespace - QuasarApp Heart namespace. This namespace contains all classes of the Heart library.
|
* @brief The QH namespace - QuasarApp Heart namespace. This namespace contains all classes of the Heart library.
|
||||||
* Usage:
|
* Usage:
|
||||||
@ -164,6 +166,24 @@ protected:
|
|||||||
*\image html Async.svg width=800px
|
*\image html Async.svg width=800px
|
||||||
*/
|
*/
|
||||||
namespace QH {
|
namespace QH {
|
||||||
|
/**
|
||||||
|
* @brief init This method initialize default resources of the Heart Library.
|
||||||
|
* @warning Do not Forget invoke this method before using library.
|
||||||
|
*
|
||||||
|
* Example :
|
||||||
|
* @code {cpp}
|
||||||
|
* #include <heart.h>
|
||||||
|
* int main() {
|
||||||
|
* if (!QH::init()) {
|
||||||
|
* return 1;
|
||||||
|
* }
|
||||||
|
* // some code
|
||||||
|
* return 0
|
||||||
|
* }
|
||||||
|
* @endcode
|
||||||
|
* @return true if all resources initialize successful.
|
||||||
|
*/
|
||||||
|
bool init();
|
||||||
|
|
||||||
/** @brief The PKG namesapce - this namespace contains all default packages of the Heart library.
|
/** @brief The PKG namesapce - this namespace contains all default packages of the Heart library.
|
||||||
* If you want create a pool request for Heart Library with own implemented packages
|
* If you want create a pool request for Heart Library with own implemented packages
|
||||||
|
@ -41,8 +41,8 @@ AbstractNodeTest::AbstractNodeTest() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
AbstractNodeTest::~AbstractNodeTest() {
|
AbstractNodeTest::~AbstractNodeTest() {
|
||||||
delete _nodeA;
|
_nodeA->softDelete();
|
||||||
delete _nodeB;
|
_nodeB->softDelete();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AbstractNodeTest::test() {
|
void AbstractNodeTest::test() {
|
||||||
|
@ -1,6 +1,2 @@
|
|||||||
#include "itest.h"
|
#include "itest.h"
|
||||||
|
|
||||||
iTest::iTest()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
@ -8,7 +8,8 @@
|
|||||||
class iTest
|
class iTest
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
iTest();
|
iTest() = default;
|
||||||
|
virtual ~iTest() = default;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief test run tests of object.
|
* @brief test run tests of object.
|
||||||
|
@ -14,7 +14,6 @@
|
|||||||
#include <hostaddress.h>
|
#include <hostaddress.h>
|
||||||
#include <keystorage.h>
|
#include <keystorage.h>
|
||||||
#include <ping.h>
|
#include <ping.h>
|
||||||
#include <qsecretrsa2048.h>
|
|
||||||
|
|
||||||
class TestingBaseClient: public QH::DataBaseNode {
|
class TestingBaseClient: public QH::DataBaseNode {
|
||||||
|
|
||||||
@ -52,10 +51,9 @@ BaseNodeTest::BaseNodeTest() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
BaseNodeTest::~BaseNodeTest() {
|
BaseNodeTest::~BaseNodeTest() {
|
||||||
delete _client1;
|
_client1->softDelete();
|
||||||
delete _client2;
|
_client2->softDelete();
|
||||||
delete _server;
|
_server->softDelete();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaseNodeTest::test() {
|
void BaseNodeTest::test() {
|
||||||
@ -72,7 +70,7 @@ bool BaseNodeTest::powerTest() {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
delete _nodeAPtr;
|
_nodeAPtr->softDelete();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -32,8 +32,12 @@ bool testCase(const T& t) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define RUN_TEST_CASE(TYPE) \
|
#define RUN_TEST_CASE(TYPE) \
|
||||||
if (!testCase(Case0{})) \
|
{ \
|
||||||
return false;
|
TYPE *tst = new TYPE(); \
|
||||||
|
if (!testCase(*tst)) \
|
||||||
|
return false; \
|
||||||
|
tst->softDelete(); \
|
||||||
|
}
|
||||||
|
|
||||||
bool DataBaseNodeUnitTests::test() {
|
bool DataBaseNodeUnitTests::test() {
|
||||||
RUN_TEST_CASE(Case0)
|
RUN_TEST_CASE(Case0)
|
||||||
|
@ -19,6 +19,7 @@ class DataBaseNodeUnitTests: public iTest {
|
|||||||
// Test interface
|
// Test interface
|
||||||
public:
|
public:
|
||||||
bool test() override;
|
bool test() override;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // DBTESTS_H
|
#endif // DBTESTS_H
|
||||||
|
@ -46,9 +46,9 @@ NetworkNodeTest::NetworkNodeTest() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
NetworkNodeTest::~NetworkNodeTest() {
|
NetworkNodeTest::~NetworkNodeTest() {
|
||||||
delete _nodeA;
|
_nodeA->softDelete();
|
||||||
delete _nodeB;
|
_nodeB->softDelete();
|
||||||
delete _nodeC;
|
_nodeC->softDelete();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -70,7 +70,7 @@ bool NetworkNodeTest::powerTest() {
|
|||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
delete _nodeAPtr;
|
_nodeAPtr->softDelete();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -82,7 +82,7 @@ bool NetworkNodeTest::dbTest() {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
delete node;
|
node->softDelete();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -40,6 +40,8 @@ private slots:
|
|||||||
|
|
||||||
testProtockol::testProtockol() {
|
testProtockol::testProtockol() {
|
||||||
|
|
||||||
|
QH::init();
|
||||||
|
|
||||||
#if HEART_BUILD_LVL >= 0
|
#if HEART_BUILD_LVL >= 0
|
||||||
_tests.push_back(new AbstractNodeTest);
|
_tests.push_back(new AbstractNodeTest);
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user