From bde61a117fde2bf5be8f6d121ecd47727cfacfdd Mon Sep 17 00:00:00 2001
From: "danil.martynenko" <danil.martynenko@demlabs.net>
Date: Thu, 20 Feb 2025 16:02:04 +0300
Subject: [PATCH] [*] Executing the script after joining the server or after
 disconnecting from the server for CLI client

---
 vpn/client/DapCmdHandlers/DapCmdConnect.cpp | 11 ++++++++++-
 vpn/client/DapCmdHandlers/DapCmdConnect.h   |  3 +++
 vpn/qml/handlers/DapCmdConnect.cpp          |  8 ++++++--
 vpn/qml/handlers/DapCmdConnect.h            |  5 +++--
 4 files changed, 22 insertions(+), 5 deletions(-)

diff --git a/vpn/client/DapCmdHandlers/DapCmdConnect.cpp b/vpn/client/DapCmdHandlers/DapCmdConnect.cpp
index fe9b4ffd0..35120d878 100644
--- a/vpn/client/DapCmdHandlers/DapCmdConnect.cpp
+++ b/vpn/client/DapCmdHandlers/DapCmdConnect.cpp
@@ -71,7 +71,9 @@ void DapCmdConnect::handle(const QJsonObject* params)
     QMap<QString, QJsonValue> mandatoryConnParams = {
         {ADDRESS_KEY, params->value(ADDRESS_KEY)},
         {PORT_KEY, params->value(PORT_KEY)},
-        {UPDATE_ROUTE_TABLE, params->value(UPDATE_ROUTE_TABLE)}
+        {UPDATE_ROUTE_TABLE, params->value(UPDATE_ROUTE_TABLE)},
+        {RUN_SCRIPT_PATH, params->value(RUN_SCRIPT_PATH)},
+        {RUN_SCRIPT_AFTER_CONNECT, params->value(RUN_SCRIPT_AFTER_CONNECT)}
     };
 
     if (!mandatoryConnParams[ADDRESS_KEY].isString() || !mandatoryConnParams[PORT_KEY].isDouble()) {
@@ -93,6 +95,13 @@ void DapCmdConnect::handle(const QJsonObject* params)
     uint16_t port = uint16_t(mandatoryConnParams[PORT_KEY].toInt());
     QString address = mandatoryConnParams[ADDRESS_KEY].toString();
 
+    QString runScriptPath = mandatoryConnParams[RUN_SCRIPT_PATH].toString();
+
+    if (!runScriptPath.isEmpty()){
+        bool runAfterConnect = mandatoryConnParams[RUN_SCRIPT_AFTER_CONNECT].toBool(true);
+        emit sigSetRunScript(runScriptPath, runAfterConnect);
+    }
+
     qDebug() << "Address:" << address << ", Port:" << port << ", UpdateRouteTable:" << updateRouteTable;
     qDebug() << "SerialKey:" << (serialKey.isEmpty() ? "No serial key provided" : "Serial key provided");
 
diff --git a/vpn/client/DapCmdHandlers/DapCmdConnect.h b/vpn/client/DapCmdHandlers/DapCmdConnect.h
index 7786d0f50..1d8bac67d 100644
--- a/vpn/client/DapCmdHandlers/DapCmdConnect.h
+++ b/vpn/client/DapCmdHandlers/DapCmdConnect.h
@@ -24,6 +24,7 @@ signals:
     void sigConnectNoAuth(const QString& address, uint16_t port);
     void sigDisconnect();
     void sigRestartService(bool if_runnning);
+    void sigSetRunScript(const QString& runScriptPath, bool runAfterConnect);
 
 private:
     const QString ACTION_KEY = "action";
@@ -33,6 +34,8 @@ private:
     const QString ADDRESS_KEY = "address";
     const QString PORT_KEY = "port";
     const QString UPDATE_ROUTE_TABLE = "updateRouteTable";
+    const QString RUN_SCRIPT_PATH = "run_script_path";
+    const QString RUN_SCRIPT_AFTER_CONNECT = "run_script_after_connect";
 
     const QString CODE_KEY = "code";
     const QString MESSAGE_KEY = "message";
diff --git a/vpn/qml/handlers/DapCmdConnect.cpp b/vpn/qml/handlers/DapCmdConnect.cpp
index 3da24dc60..56aabea35 100644
--- a/vpn/qml/handlers/DapCmdConnect.cpp
+++ b/vpn/qml/handlers/DapCmdConnect.cpp
@@ -7,7 +7,8 @@ DapCmdConnect::DapCmdConnect(QObject *parent)
 }
 
 void DapCmdConnect::sendCmdConnect(const QString& a_addr, quint16 a_port,
-                                   const QString& a_user, const QString& a_pswd,  const QString& a_serial, const bool a_updateRouteTable)
+                                   const QString& a_user, const QString& a_pswd,  const QString& a_serial, const bool a_updateRouteTable,
+                                   const QString& a_runScriptPath, const bool a_runAfterConnect)
 {
     QJsonObject obj;
     obj["action"] = "Connect";
@@ -20,7 +21,10 @@ void DapCmdConnect::sendCmdConnect(const QString& a_addr, quint16 a_port,
         obj["password"] = a_pswd;
     if ( !a_serial.isEmpty() )
         obj["serial"] = QString(a_serial).remove('-');
-    obj["port"] = a_port;
+    if ( !a_runScriptPath.isEmpty() ) {
+        obj["run_script_path"] = QString(a_runScriptPath);
+        obj["run_script_after_connect"] = a_runAfterConnect;
+    }
 
     sendCmd(&obj);
 }
diff --git a/vpn/qml/handlers/DapCmdConnect.h b/vpn/qml/handlers/DapCmdConnect.h
index 552bd94a6..aa873fea6 100644
--- a/vpn/qml/handlers/DapCmdConnect.h
+++ b/vpn/qml/handlers/DapCmdConnect.h
@@ -11,8 +11,9 @@ public:
     explicit DapCmdConnect(QObject *parent = nullptr);
 
 public slots:
-    void sendCmdConnect(const QString& a_addr, quint16 a_port,
-                        const QString& a_user= QString(), const QString& a_pswd = QString(),  const QString& a_serial= QString(), const bool a_updateRouteTable = true);
+    void sendCmdConnect(const QString& a_addr, quint16 a_port, const QString& a_user = QString(), const QString& a_pswd = QString(),
+                        const QString& a_serial = QString(), const bool a_updateRouteTable = true,
+                        const QString& a_runScriptPath = QString(), const bool a_runAfterConnect = false);
     void sendCmdConnectByOrder(const QString& a_addr);
 
 
-- 
GitLab