diff --git a/CMakeLists.txt b/CMakeLists.txt index 9d59db3..da02045 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -58,6 +58,7 @@ find_package(Qt6 REQUIRED COMPONENTS Widgets Sql Xml + Qml ) file(GLOB_RECURSE DB_SOURCES CONFIGURE_DEPENDS @@ -156,6 +157,7 @@ if (WIN32) Qt6::Xml Qt6::Sql Qt6::Network + Qt6::Qml Tesseract::libtesseract ) @@ -171,6 +173,10 @@ if (WIN32) file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/config.ini" DESTINATION "${CMAKE_BINARY_DIR}") file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/no_devices.png" DESTINATION "${CMAKE_BINARY_DIR}") file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/assets/ADBKeyboard.apk" DESTINATION "${CMAKE_BINARY_DIR}/assets") + # Bundled JS scripts — fallback на случай, когда удалённый manifest недоступен + if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/scripts") + file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/scripts" DESTINATION "${CMAKE_BINARY_DIR}") + endif () # adb копируется в post-build чтобы не падать при configure если adb.exe занят file(GLOB _adb_files "${CMAKE_CURRENT_SOURCE_DIR}/tools/adb/windows/*") foreach(_adb_file ${_adb_files}) @@ -228,6 +234,14 @@ if (WIN32) "$/assets/ADBKeyboard.apk" ) + if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/scripts") + add_custom_command(TARGET ARC POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_directory + "${CMAKE_CURRENT_SOURCE_DIR}/scripts" + "$/scripts" + ) + endif () + # Copy OpenSSL DLLs required for HTTPS (Qt SSL backend) file(GLOB _openssl_dlls "${VCPKG_BIN_DIR}/libssl*.dll" "${VCPKG_BIN_DIR}/libcrypto*.dll") @@ -276,6 +290,7 @@ elseif (APPLE) Qt6::Sql Qt6::Xml Qt6::Network + Qt6::Qml tesseract leptonica ) @@ -291,6 +306,9 @@ elseif (APPLE) file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/config.ini" DESTINATION "${CMAKE_BINARY_DIR}") file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/no_devices.png" DESTINATION "${CMAKE_BINARY_DIR}") file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/assets/ADBKeyboard.apk" DESTINATION "${CMAKE_BINARY_DIR}/assets") + if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/scripts") + file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/scripts" DESTINATION "${CMAKE_BINARY_DIR}") + endif () endif () target_include_directories(ARC PRIVATE diff --git a/android/black/GetProfileInfoScript.cpp b/android/black/GetProfileInfoScript.cpp index a51a519..a3210f7 100644 --- a/android/black/GetProfileInfoScript.cpp +++ b/android/black/GetProfileInfoScript.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include "adb/AdbUtils.h" #include "dao/MaterialDAO.h" @@ -10,6 +11,8 @@ #include "dao/DeviceDAO.h" #include "dump/TaskDumpRecorder.h" #include "net/NetworkService.h" +#include "scripting/ScriptRuntime.h" +#include "scripting/ScriptingConfig.h" namespace Black { @@ -25,6 +28,26 @@ GetProfileInfoScript::GetProfileInfoScript( GetProfileInfoScript::~GetProfileInfoScript() = default; void GetProfileInfoScript::doStart() { + // PoC удалённых JS-скриптов: пробуем JS-версию, при engine-ошибке делаем + // прозрачный fallback на C++ ниже. См. docs/remote_scripts.md. + if (Scripting::ScriptingConfig::isEnabled() + && Scripting::ScriptingConfig::isJsEnabledFor("black/get_profile_info")) { + QString jsOut; + const QVariantMap params{ + {"deviceId", m_deviceId}, + {"appCode", m_appCode}, + }; + const auto status = Scripting::ScriptRuntime::run( + "black", "get_profile_info", params, &jsOut); + if (status == Scripting::ScriptRuntime::Result::Completed) { + m_error = jsOut; + emit finishedWithResult(m_error); + return; + } + qWarning() << "[Black::GetProfileInfo] JS path failed (" << jsOut + << ") — fallback to C++ implementation"; + } + DeviceInfo device = DeviceDAO::getDeviceById(m_deviceId); if (device.id.isEmpty()) device = DeviceDAO::findByAdbSerial(m_deviceId); if (!device.adbSerial.isEmpty()) m_deviceId = device.adbSerial; const BankProfileInfo app = BankProfileDAO::getApplication(device.id, m_appCode); diff --git a/config.ini b/config.ini index ef93d27..7dce7b8 100644 --- a/config.ini +++ b/config.ini @@ -41,3 +41,17 @@ currency=TJS country=tajikistan name=Dushanbe City phone_code=992 + +[scripting] +# Глобальный выключатель JS-скриптов. При false весь scripting-слой выключен. +enabled=false +# Список /