From 08e150ffd017cf82838b0cb81d72dda6a2a9d72f Mon Sep 17 00:00:00 2001
From: "danil.martynenko" <danil.martynenko@demlabs.net>
Date: Fri, 20 Dec 2024 17:19:05 +0300
Subject: [PATCH] [*] fixed reset serial key

---
 core/DapSession.cpp                           | 57 +++++++------------
 vpn/client/DapCmdHandlers/DapCmdConnect.cpp   | 50 ++++++++--------
 .../DapCmdHandlers/DapCmdResetSerialKey.cpp   | 14 +++--
 vpn/qml/handlers/DapCmdResetSerialKey.cpp     |  5 +-
 4 files changed, 59 insertions(+), 67 deletions(-)

diff --git a/core/DapSession.cpp b/core/DapSession.cpp
index efb2b4b7b..d8f99b6b2 100644
--- a/core/DapSession.cpp
+++ b/core/DapSession.cpp
@@ -820,57 +820,44 @@ void DapSession::answerBugReport()
 
 void DapSession::errorResetSerialKey(const QString& error)
 {
-    qDebug() << "Reset serial key error: network error";
-    emit sigResetSerialKeyError (2, tr ("Reset error: ") + error);
+    qDebug() << "Reset serial key error: " << error;
+    int errorCode = (error == "Serial key expired") ? 1 : 2;
+    emit sigResetSerialKeyError(errorCode, tr("Reset error: ") + error);
 }
+// At some point, expired keys started being identified as an error,
+// which led to the invocation of the errorResetSerialKey callback.
+// Therefore, duplication ("Serial key expired") is kept in both errorResetSerialKey and onResetSerialKey.
 
 void DapSession::onResetSerialKey()
 {
-    if(m_netKeyActivateReply->getReplyData().size() <= 0 )
-    {
-        emit errorResetSerialKey (tr ("Wrong answer from server"));
+    if (m_netKeyActivateReply->getReplyData().isEmpty()) {
+        emit sigResetSerialKeyError(2, tr("Wrong answer from server"));
         return;
     }
 
     QByteArray replyArr;
     m_dapCryptCDB->decode(m_netKeyActivateReply->getReplyData(), replyArr, KeyRoleSession);
-    qDebug() << "Serial key reset reply: " << QString::fromUtf8(replyArr);
+    qDebug() << "Processing serial key reset, reply: " << QString::fromUtf8(replyArr);
 
     QString op_code = QString::fromUtf8(replyArr).left(4);
 
-    if (op_code == OP_CODE_GENERAL_ERR)
-    {
-        emit sigResetSerialKeyError (1, tr ("Unknown authorization error"));
-        return;
-    }
-    else if (op_code == OP_CODE_ALREADY_ACTIVATED)
-    {
-        emit sigResetSerialKeyError (1, tr ("Serial key already activated on another device"));
-        return;
-    }
-    else if (op_code == OP_CODE_NOT_FOUND_LOGIN_IN_DB)
-    {
-        emit sigResetSerialKeyError (1, isSerial ? tr("Serial key not found in database") : tr ("Login not found in database"));
-        return;
-    }
-    else if (op_code == OP_CODE_SUBSCRIBE_EXPIRED)
-    {
-        emit sigResetSerialKeyError (1, tr ("Serial key expired"));
-        return;
-    }
-    else if (op_code == OP_CODE_CANT_CONNECTION_TO_DB)
-    {
-        emit sigResetSerialKeyError (1, tr ("Can't connect to database"));
-        return;
-    }
-    else if (op_code == OP_CODE_INCORRECT_SYM)
-    {
-        emit sigResetSerialKeyError(1, tr ("Incorrect symbols in request"));
+    static const QMap<QString, QString> errorMessages = {
+        {OP_CODE_GENERAL_ERR, tr("Unknown authorization error")},
+        {OP_CODE_ALREADY_ACTIVATED, tr("Serial key already activated on another device")},
+        {OP_CODE_NOT_FOUND_LOGIN_IN_DB, isSerial ? tr("Serial key not found in database") : tr("Login not found in database")},
+        {OP_CODE_SUBSCRIBE_EXPIRED, tr("Serial key expired")},
+        {OP_CODE_CANT_CONNECTION_TO_DB, tr("Can't connect to database")},
+        {OP_CODE_INCORRECT_SYM, tr("Incorrect symbols in request")}
+    };
+
+    if (errorMessages.contains(op_code)) {
+        emit sigResetSerialKeyError(1, errorMessages.value(op_code));
         return;
     }
 
-    emit sigSerialKeyReseted (tr ("Serial key reset successfully"));
+    emit sigSerialKeyReseted(tr("Serial key reset successfully"));
 }
+
 void DapSession::answerBugReportsStatus()
 {
     if (!m_netBugReportsStatusReply)
diff --git a/vpn/client/DapCmdHandlers/DapCmdConnect.cpp b/vpn/client/DapCmdHandlers/DapCmdConnect.cpp
index b23d46a06..ed292a324 100644
--- a/vpn/client/DapCmdHandlers/DapCmdConnect.cpp
+++ b/vpn/client/DapCmdHandlers/DapCmdConnect.cpp
@@ -54,26 +54,17 @@ void DapCmdConnect::handle(const QJsonObject* params)
 {
     DapCmdServiceAbstract::handle(params);
 
-    if (params->contains(ACTION_KEY))
-    {
-        //this is disconnect request
-        QString req = params->value(ACTION_KEY).toString();
-        if (req == "Disconnect")
-        {
+    if (params->contains(ACTION_KEY)) {
+        QString req = params->value(ACTION_KEY).toString("");
+        if (req == "Disconnect") {
             qDebug() << "DapCmdConnect::Disconnect signal";
             emit sigDisconnect();
             return;
-        }
-
-        if (req == "RestartService")
-        {
+        } else if (req == "RestartService") {
             qDebug() << "DapCmdConnect::RestartService signal";
             emit sigRestartService(false);
             return;
-        }
-
-        if (req == "RestartServiceIfRunning")
-        {
+        } else if (req == "RestartServiceIfRunning") {
             qDebug() << "DapCmdConnect::RestartServiceIfRunning signal";
             emit sigRestartService(true);
             return;
@@ -86,27 +77,34 @@ void DapCmdConnect::handle(const QJsonObject* params)
         {UPDATE_ROUTE_TABLE, params->value(UPDATE_ROUTE_TABLE)}
     };
 
+    if (!mandatoryConnParams[ADDRESS_KEY].isString() || !mandatoryConnParams[PORT_KEY].isDouble()) {
+        qWarning() << "Missing or invalid mandatory connection parameters";
+        return;
+    }
+
     bool updateRouteTable = mandatoryConnParams[UPDATE_ROUTE_TABLE].toBool(true);
     QString serialKey;
 
-    if(params->contains("serial"))
-    {
-        serialKey = params->value("serial").toString();
-    }
-    else
-    {
-        serialKey = QString(DapServiceDataLocal::instance()->serialKeyData()->serialKey()).remove('-');
+    if (params->contains("serial")) {
+        serialKey = params->value("serial").toString().remove('-');
+        if (serialKey.isEmpty()) {
+            serialKey = DapServiceDataLocal::instance()->serialKeyData()->serialKey().remove('-');
+        }
+    } else {
+        serialKey = DapServiceDataLocal::instance()->serialKeyData()->serialKey().remove('-');
     }
 
     uint16_t port = uint16_t(mandatoryConnParams[PORT_KEY].toInt());
     QString address = mandatoryConnParams[ADDRESS_KEY].toString();
 
-    if (!serialKey.isEmpty())
-    {
+    qDebug() << "Address:" << address << ", Port:" << port << ", UpdateRouteTable:" << updateRouteTable;
+    qDebug() << "SerialKey:" << (serialKey.isEmpty() ? "No serial key provided" : "Serial key provided");
+
+    if (!serialKey.isEmpty()) {
         emit sigConnect(serialKey, "", "", address, port, updateRouteTable);
-    }
-    else
-    {
+    } else {
         emit sigConnectNoAuth(address, port);
     }
 }
+
+
diff --git a/vpn/client/DapCmdHandlers/DapCmdResetSerialKey.cpp b/vpn/client/DapCmdHandlers/DapCmdResetSerialKey.cpp
index 85a75975f..973e4a204 100644
--- a/vpn/client/DapCmdHandlers/DapCmdResetSerialKey.cpp
+++ b/vpn/client/DapCmdHandlers/DapCmdResetSerialKey.cpp
@@ -3,22 +3,25 @@
 DapCmdResetSerialKey::DapCmdResetSerialKey(QObject *parent)
     : DapCmdServiceAbstract (DapJsonCmdType::SEND_RESET_SERIAL_KEY_REQUEST, parent)
 {
+}
+
+void DapCmdResetSerialKey::handle(const QJsonObject *params)
+{
+    DapCmdServiceAbstract::handle(params);
+
     connect(this, &DapCmdResetSerialKey::sigResetSerialKeyReplied, [&] (const QString& reply) {
         QJsonObject l_obj;
         l_obj["reset_reply"] = reply;
         sendCmd(&l_obj);
     });
-}
 
-void DapCmdResetSerialKey::handle(const QJsonObject *params)
-{
-    DapCmdServiceAbstract::handle(params);
     emit sigResetRequestSent();
 }
 
 void DapCmdResetSerialKey::sendResetSerialError(const int& a_errorCode, const QString& error)
 {
-    qWarning() <<"Error message: "<< error;
+    qWarning() << "Error code: " << a_errorCode << ", message: " << error;
+
     QJsonObject response;
     QJsonObject errorObj;
 
@@ -28,3 +31,4 @@ void DapCmdResetSerialKey::sendResetSerialError(const int& a_errorCode, const QS
 
     sendCmd(&response);
 }
+
diff --git a/vpn/qml/handlers/DapCmdResetSerialKey.cpp b/vpn/qml/handlers/DapCmdResetSerialKey.cpp
index 3e5650b0b..fe1d3fd2a 100644
--- a/vpn/qml/handlers/DapCmdResetSerialKey.cpp
+++ b/vpn/qml/handlers/DapCmdResetSerialKey.cpp
@@ -22,7 +22,7 @@ void DapCmdResetSerialKey::handleResult(const QJsonObject& result)
 
 void DapCmdResetSerialKey::handleError(int code, const QString& message)
 {
-    Q_UNUSED(code); Q_UNUSED(message);
+    qWarning() << "Error code:" << code << ", message:" << message;
     qWarning() << *m_errorObject;
 
     switch (code) {
@@ -32,6 +32,9 @@ void DapCmdResetSerialKey::handleError(int code, const QString& message)
     case 2:
         emit sigResetSerialKeyErrorSetOnlyMessage(message);
         break;
+    default:
+        qWarning() << "Unknown error code received.";
+        break;
     }
 }
 
-- 
GitLab