diff --git a/client/cmake/ios.cmake b/client/cmake/ios.cmake
index ab820c712..1e30afb1e 100644
--- a/client/cmake/ios.cmake
+++ b/client/cmake/ios.cmake
@@ -136,10 +136,21 @@ set_property(TARGET ${PROJECT} APPEND PROPERTY RESOURCE
add_subdirectory(ios/networkextension)
add_dependencies(${PROJECT} networkextension)
-set_property(TARGET ${PROJECT} PROPERTY XCODE_EMBED_FRAMEWORKS
- "${CMAKE_CURRENT_SOURCE_DIR}/3rd-prebuilt/3rd-prebuilt/openvpn/apple/OpenVPNAdapter-ios/OpenVPNAdapter.framework"
+set(OPENVPN_FRAMEWORK_DIR "${CMAKE_CURRENT_SOURCE_DIR}/3rd-prebuilt/3rd-prebuilt/openvpn/apple/OpenVPNAdapter-ios")
+set(OPENVPN_EMBEDDED_FRAMEWORKS
+ "${OPENVPN_FRAMEWORK_DIR}/OpenVPNAdapter.framework"
+ "${OPENVPN_FRAMEWORK_DIR}/OpenVPNClient.framework"
+ "${OPENVPN_FRAMEWORK_DIR}/mbedTLS.framework"
+ "${OPENVPN_FRAMEWORK_DIR}/LZ4.framework"
)
-set(CMAKE_XCODE_ATTRIBUTE_FRAMEWORK_SEARCH_PATHS ${CMAKE_CURRENT_SOURCE_DIR}/3rd-prebuilt/3rd-prebuilt/openvpn/apple/OpenVPNAdapter-ios/)
-target_link_libraries("networkextension" PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/3rd-prebuilt/3rd-prebuilt/openvpn/apple/OpenVPNAdapter-ios/OpenVPNAdapter.framework")
+set_property(TARGET ${PROJECT} PROPERTY XCODE_EMBED_FRAMEWORKS "${OPENVPN_EMBEDDED_FRAMEWORKS}")
+set(CMAKE_XCODE_ATTRIBUTE_FRAMEWORK_SEARCH_PATHS "$(inherited) ${OPENVPN_FRAMEWORK_DIR}")
+foreach(_framework ${OPENVPN_EMBEDDED_FRAMEWORKS})
+ target_link_libraries(networkextension PRIVATE "${_framework}")
+endforeach()
+
+set_property(TARGET networkextension PROPERTY XCODE_EMBED_FRAMEWORKS "${OPENVPN_EMBEDDED_FRAMEWORKS}")
+set_property(TARGET networkextension PROPERTY XCODE_EMBED_FRAMEWORKS_CODE_SIGN_ON_COPY ON)
+set_property(TARGET networkextension PROPERTY XCODE_ATTRIBUTE_FRAMEWORK_SEARCH_PATHS "$(inherited) ${OPENVPN_FRAMEWORK_DIR}")
diff --git a/client/configurators/openvpn_configurator.cpp b/client/configurators/openvpn_configurator.cpp
index bb3dbd4c6..75c611d76 100644
--- a/client/configurators/openvpn_configurator.cpp
+++ b/client/configurators/openvpn_configurator.cpp
@@ -83,12 +83,30 @@ QString OpenVpnConfigurator::createConfig(const ServerCredentials &credentials,
return "";
}
+ auto sanitizeStaticKey = [](const QString &key) {
+ QStringList lines = key.split('\n');
+ QStringList filtered;
+ filtered.reserve(lines.size());
+ for (const QString &line : lines) {
+ const QString trimmed = line.trimmed();
+ if (trimmed.startsWith('#')) {
+ continue;
+ }
+ filtered.append(line);
+ }
+ QString result = filtered.join('\n');
+ if (!result.endsWith('\n')) {
+ result.append('\n');
+ }
+ return result;
+ };
+
config.replace("$OPENVPN_CA_CERT", connData.caCert);
config.replace("$OPENVPN_CLIENT_CERT", connData.clientCert);
config.replace("$OPENVPN_PRIV_KEY", connData.privKey);
if (config.contains("$OPENVPN_TA_KEY")) {
- config.replace("$OPENVPN_TA_KEY", connData.taKey);
+ config.replace("$OPENVPN_TA_KEY", sanitizeStaticKey(connData.taKey));
} else {
config.replace("", "");
config.replace("", "");
@@ -117,7 +135,7 @@ QString OpenVpnConfigurator::processConfigWithLocalSettings(const QPair Void) {
ovpnLog(.info, message: "Setup and launch")
- let str = String(decoding: ovpnConfiguration, as: UTF8.self)
+ var configString = String(decoding: ovpnConfiguration, as: UTF8.self)
+
+ let digest = SHA256.hash(data: ovpnConfiguration)
+ let digestString = digest.map { String(format: "%02x", $0) }.joined()
+ ovpnLog(.info, title: "ConfigDigest", message: digestString)
+
+ let hasTlsAuthOpen = configString.contains("")
+ let hasTlsAuthClose = configString.contains("")
+ ovpnLog(.info, title: "ConfigFlags", message: "tls-auth open=\(hasTlsAuthOpen) close=\(hasTlsAuthClose)")
+
+ let lines = configString.split(separator: "\n")
+ let head = lines.prefix(10).joined(separator: "\n")
+ let tail = lines.suffix(10).joined(separator: "\n")
+ ovpnLog(.debug, title: "ConfigHead", message: head)
+ ovpnLog(.debug, title: "ConfigTail", message: tail)
+
+ if let start = configString.range(of: ""),
+ let end = configString.range(of: "", range: start.upperBound..