diff --git a/.gitignore b/.gitignore
index 5b90fd55..8e4083ce 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,6 +9,8 @@ deploy/build_32/*
deploy/build_64/*
winbuild*.bat
.cache/
+client/3rd-prebuilt/
+client/3rd/OpenVPNAdapter/
# Qt-es
@@ -133,4 +135,4 @@ client/3rd/ShadowSocks/ss_ios.xcconfig
out/
# CMake files
-CMakeFiles/
\ No newline at end of file
+CMakeFiles/
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2dbf778d..8dc49f39 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -31,14 +31,9 @@ set(QT_BUILD_TOOLS_WHEN_CROSS_COMPILING ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
-if(APPLE AND NOT IOS)
- set(CMAKE_OSX_ARCHITECTURES "x86_64")
-endif()
+
+set(CMAKE_OSX_ARCHITECTURES "x86_64")
+
add_subdirectory(client)
-if(NOT IOS AND NOT ANDROID)
- add_subdirectory(service)
-
- include(${CMAKE_SOURCE_DIR}/deploy/installer/config.cmake)
-endif()
diff --git a/Release.entitlements b/Release.entitlements
new file mode 100644
index 00000000..0f5cadd9
--- /dev/null
+++ b/Release.entitlements
@@ -0,0 +1,24 @@
+
+
+
+
+ com.apple.developer.networking.networkextension
+
+ packet-tunnel-provider
+
+ com.apple.security.app-sandbox
+
+ com.apple.security.application-groups
+
+ group.org.amnezia.AmneziaVPN
+
+ com.apple.security.network.client
+
+ com.apple.security.network.server
+
+ keychain-access-groups
+
+ $(AppIdentifierPrefix)org.amnezia.AmneziaVPN.network-extension
+
+
+
diff --git a/client/3rd-prebuilt b/client/3rd-prebuilt
index ff8445c8..eab32a8e 160000
--- a/client/3rd-prebuilt
+++ b/client/3rd-prebuilt
@@ -1 +1 @@
-Subproject commit ff8445c8aa1cda38497bb6f6cb0e520f5a3c8de0
+Subproject commit eab32a8e63494517fdb5644fbd7235343b937052
diff --git a/client/3rd/OpenVPNAdapter b/client/3rd/OpenVPNAdapter
index 7c821a8d..b7d88501 160000
--- a/client/3rd/OpenVPNAdapter
+++ b/client/3rd/OpenVPNAdapter
@@ -1 +1 @@
-Subproject commit 7c821a8d5c1ad5ad94e0763b4f25a875b5a6fe1b
+Subproject commit b7d88501b1bb8bcb7088cdf927f2b401c130d4c7
diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt
index 1fc28b82..94906da0 100644
--- a/client/CMakeLists.txt
+++ b/client/CMakeLists.txt
@@ -3,6 +3,7 @@ cmake_minimum_required(VERSION 3.25.0 FATAL_ERROR)
set(PROJECT AmneziaVPN)
project(${PROJECT})
+set(MACOX 1)
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
set_property(GLOBAL PROPERTY AUTOGEN_TARGETS_FOLDER "Autogen")
@@ -24,11 +25,11 @@ execute_process(
add_definitions(-DGIT_COMMIT_HASH="${GIT_COMMIT_HASH}")
-if(IOS)
+if(IOS OR MACOX)
set(PACKAGES ${PACKAGES} Multimedia)
endif()
-if(WIN32 OR (APPLE AND NOT IOS) OR (LINUX AND NOT ANDROID))
+if(WIN32 OR (MACOX AND NOT IOS) OR (LINUX AND NOT ANDROID))
set(PACKAGES ${PACKAGES} Widgets)
endif()
@@ -41,18 +42,18 @@ set(LIBS ${LIBS}
Qt6::Core5Compat Qt6::Concurrent
)
-if(IOS)
+if(IOS OR MACOX)
set(LIBS ${LIBS} Qt6::Multimedia)
endif()
-if(WIN32 OR (APPLE AND NOT IOS) OR (LINUX AND NOT ANDROID))
+if(WIN32 OR (MACOX AND NOT IOS) OR (LINUX AND NOT ANDROID))
set(LIBS ${LIBS} Qt6::Widgets)
endif()
qt_standard_project_setup()
qt_add_executable(${PROJECT} MANUAL_FINALIZATION)
-if(WIN32 OR (APPLE AND NOT IOS) OR (LINUX AND NOT ANDROID))
+if(WIN32 OR (MACOX AND NOT IOS) OR (LINUX AND NOT ANDROID))
qt_add_repc_replicas(${PROJECT} ${CMAKE_CURRENT_LIST_DIR}/../ipc/ipc_interface.rep)
qt_add_repc_replicas(${PROJECT} ${CMAKE_CURRENT_LIST_DIR}/../ipc/ipc_process_interface.rep)
endif()
@@ -61,7 +62,7 @@ qt6_add_resources(QRC ${QRC} ${CMAKE_CURRENT_LIST_DIR}/resources.qrc)
# -- i18n begin
set(CMAKE_AUTORCC ON)
-
+# module language
set(AMNEZIAVPN_TS_FILES
${CMAKE_CURRENT_LIST_DIR}/translations/amneziavpn_ru_RU.ts
${CMAKE_CURRENT_LIST_DIR}/translations/amneziavpn_zh_CN.ts
@@ -89,10 +90,16 @@ qt6_add_resources(QRC ${I18NQRC} ${CMAKE_CURRENT_BINARY_DIR}/translations.qrc)
# -- i18n end
if(IOS)
+ message("Client >> Cmake build OpenVPN: iOS")
execute_process(COMMAND bash ${CMAKE_CURRENT_LIST_DIR}/ios/scripts/openvpn.sh args
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR})
endif()
+if(MACOX)
+ message("Client >> Cmake build OpenVPN: OSX build")
+ execute_process(COMMAND bash ${CMAKE_CURRENT_LIST_DIR}/macos/scripts/openvpn.sh args
+ WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR})
+
set(IS_CI ${CI})
if(IS_CI)
message("Detected CI env")
@@ -102,7 +109,7 @@ if(IS_CI)
endif()
endif()
-
+message("Client >> Cmake build 3rdparty")
include(${CMAKE_CURRENT_LIST_DIR}/cmake/3rdparty.cmake)
include_directories(
@@ -151,7 +158,7 @@ include_directories(mozilla)
include_directories(mozilla/shared)
include_directories(mozilla/models)
-if(NOT IOS)
+if(NOT IOS OR NOT MACOX)
set(HEADERS ${HEADERS}
${CMAKE_CURRENT_LIST_DIR}/platforms/ios/QRCodeReaderBase.h
)
@@ -200,7 +207,7 @@ if(CMAKE_BUILD_TYPE STREQUAL "Debug")
target_compile_definitions(${PROJECT} PRIVATE "MZ_DEBUG")
endif()
-if(NOT IOS)
+if(NOT IOS OR NOT MACOX)
set(SOURCES ${SOURCES}
${CMAKE_CURRENT_LIST_DIR}/platforms/ios/QRCodeReaderBase.cpp
)
@@ -280,7 +287,7 @@ if(WIN32)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
endif()
-if(APPLE)
+if(MACOX)
cmake_policy(SET CMP0099 OLD)
cmake_policy(SET CMP0114 NEW)
@@ -308,7 +315,8 @@ if(LINUX AND NOT ANDROID)
link_directories(${CMAKE_CURRENT_LIST_DIR}/platforms/linux)
endif()
-if(WIN32 OR (APPLE AND NOT IOS) OR (LINUX AND NOT ANDROID))
+# if(WIN32 OR (MACOX AND NOT IOS) OR (LINUX AND NOT ANDROID))
+if(WIN32 OR (LINUX AND NOT ANDROID))
message("Client desktop build")
add_compile_definitions(AMNEZIA_DESKTOP)
@@ -341,12 +349,15 @@ if(ANDROID)
include(cmake/android.cmake)
endif()
-if(IOS)
+if(IOS) # only for iOS or OSX
+ message("Client >> Cmake: iOS build")
include(cmake/ios.cmake)
- include(cmake/ios-arch-fixup.cmake)
-elseif(APPLE AND NOT IOS)
- include(cmake/osxtools.cmake)
+ #include(cmake/ios-arch-fixup.cmake)
+elseif(MACOX AND NOT IOS) # all version
+ message("Client >> Cmake: OSX build")
include(cmake/macos.cmake)
+ # include(cmake/osxtools.cmake)
+ # include(cmake/macos.cmake)
endif()
target_link_libraries(${PROJECT} PRIVATE ${LIBS})
@@ -361,11 +372,11 @@ if(WIN32)
endif()
elseif(LINUX)
set(DEPLOY_PLATFORM_PATH "linux/client")
-elseif(APPLE AND NOT IOS)
- set(DEPLOY_PLATFORM_PATH "macos")
+# elseif(MACOX AND NOT IOS)
+# set(DEPLOY_PLATFORM_PATH "macos")
endif()
-if(NOT IOS AND NOT ANDROID)
+if(NOT IOS AND NOT ANDROID AND NOT MACOX)
add_custom_command(
TARGET ${PROJECT} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E $,copy_directory,true>
@@ -384,4 +395,30 @@ if(NOT IOS AND NOT ANDROID)
endif()
target_sources(${PROJECT} PRIVATE ${SOURCES} ${HEADERS} ${RESOURCES} ${QRC} ${I18NQRC})
+# set(IOS 0)
+# Sao chép QtConcurrent.framework vào thư mục Frameworks
+add_custom_command(TARGET ${PROJECT} POST_BUILD
+ COMMAND ${CMAKE_COMMAND} -E make_directory
+ "$/Contents/Frameworks"
+ COMMAND ${CMAKE_COMMAND} -E copy_directory
+ "/Users/macbook/Qt/6.8.0/macos/lib/QtConcurrent.framework"
+ "$/Contents/Frameworks/QtConcurrent.framework"
+)
+
+# Triển khai ứng dụng với macdeployqt và ký mã (nếu cần)
+add_custom_command(TARGET ${PROJECT} POST_BUILD
+ COMMAND ${QT_BIN_DIR_DETECTED}/macdeployqt $ -appstore-compliant -qmldir=${CMAKE_CURRENT_SOURCE_DIR}
+)
+
+# Nếu ở chế độ Release, ký mã gói ứng dụng
+if(CMAKE_BUILD_TYPE STREQUAL "Release")
+ SET(SIGN_CMD codesign --deep --force --sign 'MACOX Distribution: Privacy Technologies OU \(X7UJ388FXK\)' --timestamp --options runtime $)
+ message("Manual signing bundle...")
+ message(${SIGN_CMD})
+
+ add_custom_command(TARGET ${PROJECT} POST_BUILD
+ COMMAND ${SIGN_CMD}
+ )
+endif()
+
qt_finalize_target(${PROJECT})
diff --git a/client/amnezia_application.cpp b/client/amnezia_application.cpp
index eb1eab45..943cbf3a 100644
--- a/client/amnezia_application.cpp
+++ b/client/amnezia_application.cpp
@@ -217,7 +217,7 @@ void AmneziaApplication::registerTypes()
declareQmlProtocolEnum();
declareQmlContainerEnum();
- qmlRegisterType("QRCodeReader", 1, 0, "QRCodeReader");
+ // qmlRegisterType("QRCodeReader", 1, 0, "QRCodeReader");
m_containerProps.reset(new ContainerProps());
qmlRegisterSingletonInstance("ContainerProps", 1, 0, "ContainerProps", m_containerProps.get());
diff --git a/client/amnezia_application.h b/client/amnezia_application.h
index b15d55d7..b38992a4 100644
--- a/client/amnezia_application.h
+++ b/client/amnezia_application.h
@@ -1,6 +1,8 @@
#ifndef AMNEZIA_APPLICATION_H
#define AMNEZIA_APPLICATION_H
+#define Q_OS_IOS 1
+
#include
#include
#include
diff --git a/client/cmake/3rdparty.cmake b/client/cmake/3rdparty.cmake
index ec544764..acc99d84 100644
--- a/client/cmake/3rdparty.cmake
+++ b/client/cmake/3rdparty.cmake
@@ -38,12 +38,12 @@ elseif(APPLE AND NOT IOS)
set(OPENSSL_LIB_SSL_PATH "${OPENSSL_ROOT_DIR}/macos/lib/libssl.a")
set(OPENSSL_LIB_CRYPTO_PATH "${OPENSSL_ROOT_DIR}/macos/lib/libcrypto.a")
elseif(IOS)
- set(LIBSSH_INCLUDE_DIR "${LIBSSH_ROOT_DIR}/ios/arm64")
- set(LIBSSH_LIB_PATH "${LIBSSH_ROOT_DIR}/ios/arm64/libssh.a")
- set(ZLIB_LIB_PATH "${LIBSSH_ROOT_DIR}/ios/arm64/libz.a")
- set(OPENSSL_INCLUDE_DIR "${OPENSSL_ROOT_DIR}/ios/iphone/include")
- set(OPENSSL_LIB_SSL_PATH "${OPENSSL_ROOT_DIR}/ios/iphone/lib/libssl.a")
- set(OPENSSL_LIB_CRYPTO_PATH "${OPENSSL_ROOT_DIR}/ios/iphone/lib/libcrypto.a")
+ set(LIBSSH_INCLUDE_DIR "${LIBSSH_ROOT_DIR}/macos/x86_64")
+ set(LIBSSH_LIB_PATH "${LIBSSH_ROOT_DIR}/macos/x86_64/libssh.a")
+ set(ZLIB_LIB_PATH "${LIBSSH_ROOT_DIR}/macos/x86_64/libz.a")
+ set(OPENSSL_INCLUDE_DIR "${OPENSSL_ROOT_DIR}/macos/include")
+ set(OPENSSL_LIB_SSL_PATH "${OPENSSL_ROOT_DIR}/macos/lib/libssl.a")
+ set(OPENSSL_LIB_CRYPTO_PATH "${OPENSSL_ROOT_DIR}/macos/lib/libcrypto.a")
elseif(ANDROID)
set(abi ${CMAKE_ANDROID_ARCH_ABI})
set(LIBSSH_INCLUDE_DIR "${LIBSSH_ROOT_DIR}/android/${abi}")
diff --git a/client/cmake/apple.cmake b/client/cmake/apple.cmake
new file mode 100644
index 00000000..11e58be6
--- /dev/null
+++ b/client/cmake/apple.cmake
@@ -0,0 +1,197 @@
+message("Client ==> iOS build")
+
+# Đường dẫn tới thư mục chứa HevSocks5Tunnel.xcframework
+set(HEV_SOCKS5_TUNNEL_PATH "${CMAKE_CURRENT_SOURCE_DIR}/3rd-prebuilt/3rd-prebuilt/xray")
+
+# Đường dẫn tới thư viện .a
+set(HEV_SOCKS5_TUNNEL_LIB "${HEV_SOCKS5_TUNNEL_PATH}/ios/libhev-socks5-tunnel.a")
+
+# Đường dẫn tới tệp header
+set(HEV_SOCKS5_TUNNEL_INCLUDE_DIR "${HEV_SOCKS5_TUNNEL_PATH}/ios/Headers")
+
+# Thêm tệp header vào include directories
+target_include_directories(${PROJECT} PRIVATE ${HEV_SOCKS5_TUNNEL_INCLUDE_DIR})
+
+# Liên kết thư viện tĩnh vào mục tiêu (target) của bạn
+target_link_libraries(${PROJECT} PRIVATE ${HEV_SOCKS5_TUNNEL_LIB})
+
+set_target_properties(${PROJECT} PROPERTIES MACOSX_BUNDLE TRUE)
+set(CMAKE_OSX_ARCHITECTURES "x86_64" CACHE INTERNAL "" FORCE)
+set(CMAKE_OSX_DEPLOYMENT_TARGET 10.15)
+
+set(APPLE_PROJECT_VERSION ${CMAKE_PROJECT_VERSION_MAJOR}.${CMAKE_PROJECT_VERSION_MINOR}.${CMAKE_PROJECT_VERSION_PATCH})
+
+
+enable_language(OBJC)
+# enable_language(OBJCXX)
+enable_language(Swift)
+
+find_package(Qt6 REQUIRED COMPONENTS ShaderTools)
+set(LIBS ${LIBS} Qt6::ShaderTools)
+
+find_library(FW_AUTHENTICATIONSERVICES AuthenticationServices)
+#find_library(FW_UIKIT UIKit)
+find_library(FW_AVFOUNDATION AVFoundation)
+find_library(FW_FOUNDATION Foundation)
+find_library(FW_STOREKIT StoreKit)
+find_library(FW_USERNOTIFICATIONS UserNotifications)
+find_library(FW_NETWORKEXTENSION NetworkExtension)
+
+set(LIBS ${LIBS}
+ ${FW_AUTHENTICATIONSERVICES}
+# ${FW_UIKIT}
+ ${FW_AVFOUNDATION}
+ ${FW_FOUNDATION}
+ ${FW_STOREKIT}
+ ${FW_USERNOTIFICATIONS}
+ ${FW_NETWORKEXTENSION}
+)
+
+
+set(HEADERS ${HEADERS}
+ ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/ios_controller.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/ios_controller_wrapper.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/iosnotificationhandler.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/QtAppDelegate.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/QtAppDelegate-C-Interface.h
+)
+set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/ios_controller.h PROPERTIES OBJECTIVE_CPP_HEADER TRUE)
+
+
+set(SOURCES ${SOURCES}
+ ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/ios_controller.mm
+ ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/ios_controller_wrapper.mm
+ ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/iosnotificationhandler.mm
+ ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/iosglue.mm
+ ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/QRCodeReaderBase.mm
+ ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/QtAppDelegate.mm
+)
+
+set(ICON_FILE ${CMAKE_CURRENT_SOURCE_DIR}/images/app.icns)
+set(MACOSX_BUNDLE_ICON_FILE app.icns)
+set_source_files_properties(${ICON_FILE} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
+set(SOURCES ${SOURCES} ${ICON_FILE})
+
+# set(HEADERS ${HEADERS}
+# ${CMAKE_CURRENT_SOURCE_DIR}/ui/macos_util.h
+# )
+
+# set(SOURCES ${SOURCES}
+# ${CMAKE_CURRENT_SOURCE_DIR}/ui/macos_util.mm
+# )
+
+
+target_include_directories(${PROJECT} PRIVATE ${Qt6Gui_PRIVATE_INCLUDE_DIRS})
+
+
+set_target_properties(${PROJECT} PROPERTIES
+ XCODE_LINK_BUILD_PHASE_MODE KNOWN_LOCATION
+ MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/ios/app/Info.plist.in
+ #MACOSX_BUNDLE_ICON_FILE "AppIcon"
+ MACOSX_BUNDLE_INFO_STRING "AmneziaVPN"
+ MACOSX_BUNDLE_BUNDLE_NAME "AmneziaVPN"
+ MACOSX_BUNDLE_BUNDLE_VERSION "${CMAKE_PROJECT_VERSION_TWEAK}"
+ MACOSX_BUNDLE_LONG_VERSION_STRING "${APPLE_PROJECT_VERSION}-${CMAKE_PROJECT_VERSION_TWEAK}"
+ MACOSX_BUNDLE_SHORT_VERSION_STRING "${APPLE_PROJECT_VERSION}"
+ XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "${BUILD_OSX_APP_IDENTIFIER}"
+ XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS "${CMAKE_CURRENT_SOURCE_DIR}/ios/app/main.entitlements"
+ XCODE_ATTRIBUTE_MARKETING_VERSION "${APPLE_PROJECT_VERSION}"
+ XCODE_ATTRIBUTE_CURRENT_PROJECT_VERSION "${CMAKE_PROJECT_VERSION_TWEAK}"
+ XCODE_ATTRIBUTE_PRODUCT_NAME "AmneziaVPN"
+ XCODE_ATTRIBUTE_BUNDLE_INFO_STRING "AmneziaVPN"
+ XCODE_GENERATE_SCHEME TRUE
+ XCODE_ATTRIBUTE_ENABLE_BITCODE "NO"
+ #XCODE_ATTRIBUTE_ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon"
+ XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1,2"
+ XCODE_EMBED_FRAMEWORKS_CODE_SIGN_ON_COPY "NO"
+ XCODE_EMBED_FRAMEWORKS_REMOVE_HEADERS_ON_COPY "YES"
+
+ XCODE_LINK_BUILD_PHASE_MODE KNOWN_LOCATION
+ XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/../Frameworks"
+ XCODE_EMBED_APP_EXTENSIONS networkextension
+
+ XCODE_ATTRIBUTE_CODE_SIGN_STYLE Automatic
+ #XCODE_ATTRIBUTE_CODE_SIGN_STYLE Manual
+
+ #XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "Apple Distribution: Privacy Technologies OU (X7UJ388FXK)"
+ #XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY[variant=Debug] "Apple Development"
+
+
+ #XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER "Mac AppStore AmneziaVPN"
+ #XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER[variant=Debug] "Mac AppStore AmneziaVPN"
+
+)
+set_target_properties(${PROJECT} PROPERTIES
+ XCODE_ATTRIBUTE_SWIFT_VERSION "5.0"
+ XCODE_ATTRIBUTE_CLANG_ENABLE_MODULES "YES"
+ XCODE_ATTRIBUTE_SWIFT_PRECOMPILE_BRIDGING_HEADER "NO"
+ XCODE_ATTRIBUTE_SWIFT_OBJC_INTERFACE_HEADER_NAME "AmneziaVPN-Swift.h"
+ XCODE_ATTRIBUTE_SWIFT_OBJC_INTEROP_MODE "objcxx"
+)
+set_target_properties(${PROJECT} PROPERTIES
+ XCODE_ATTRIBUTE_DEVELOPMENT_TEAM "X7UJ388FXK"
+)
+target_include_directories(${PROJECT} PRIVATE ${CMAKE_CURRENT_LIST_DIR})
+target_compile_options(${PROJECT} PRIVATE
+ -DGROUP_ID=\"${BUILD_IOS_GROUP_IDENTIFIER}\"
+ -DVPN_NE_BUNDLEID=\"${BUILD_OSX_APP_IDENTIFIER}.network-extension\"
+)
+
+set(WG_APPLE_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/3rd/amneziawg-apple/Sources)
+
+target_sources(${PROJECT} PRIVATE
+# ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/iosvpnprotocol.swift
+ ${WG_APPLE_SOURCE_DIR}/WireGuardKitC/x25519.c
+ ${CLIENT_ROOT_DIR}/platforms/ios/LogController.swift
+ ${CLIENT_ROOT_DIR}/platforms/ios/Log.swift
+ ${CLIENT_ROOT_DIR}/platforms/ios/LogRecord.swift
+ ${CLIENT_ROOT_DIR}/platforms/ios/ScreenProtection.swift
+ ${CLIENT_ROOT_DIR}/platforms/ios/VPNCController.swift
+)
+
+target_sources(${PROJECT} PRIVATE
+ #${CMAKE_CURRENT_SOURCE_DIR}/ios/app/AmneziaVPNLaunchScreen.storyboard
+ ${CMAKE_CURRENT_SOURCE_DIR}/ios/app/Media.xcassets
+ ${CMAKE_CURRENT_SOURCE_DIR}/ios/app/PrivacyInfo.xcprivacy
+)
+
+set_property(TARGET ${PROJECT} APPEND PROPERTY RESOURCE
+ #${CMAKE_CURRENT_SOURCE_DIR}/ios/app/AmneziaVPNLaunchScreen.storyboard
+ ${CMAKE_CURRENT_SOURCE_DIR}/ios/app/Media.xcassets
+ ${CMAKE_CURRENT_SOURCE_DIR}/ios/app/PrivacyInfo.xcprivacy
+)
+
+message("Client ==> build networkextension")
+add_subdirectory(macos/networkextension)
+add_dependencies(${PROJECT} networkextension)
+
+set_property(TARGET ${PROJECT} PROPERTY XCODE_EMBED_FRAMEWORKS
+ "${CMAKE_CURRENT_SOURCE_DIR}/3rd/OpenVPNAdapter/build/Release-macos/OpenVPNAdapter.framework"
+)
+
+
+
+set(CMAKE_XCODE_ATTRIBUTE_FRAMEWORK_SEARCH_PATHS ${CMAKE_CURRENT_SOURCE_DIR}/3rd/OpenVPNAdapter/build/Release-macos)
+target_link_libraries("networkextension" PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/3rd/OpenVPNAdapter/build/Release-macos/OpenVPNAdapter.framework")
+
+get_target_property(QtCore_location Qt6::Core LOCATION)
+message("QtCore_location")
+message(${QtCore_location})
+
+get_filename_component(QT_BIN_DIR_DETECTED "${QtCore_location}/../../../../../bin" ABSOLUTE)
+
+
+# add_custom_command(TARGET ${PROJECT} POST_BUILD
+# COMMAND ${QT_BIN_DIR_DETECTED}/macdeployqt $ -appstore-compliant -qmldir=${CMAKE_CURRENT_SOURCE_DIR}
+# )
+
+# if(CMAKE_BUILD_TYPE STREQUAL "Release")
+# SET(SIGN_CMD codesign --deep --force --sign 'Apple Distribution: Privacy Technologies OU \(X7UJ388FXK\)' --timestamp --options runtime $)
+# message("Manual signing bundle...")
+# message(${SIGN_CMD})
+
+
+# add_custom_command(TARGET ${PROJECT} POST_BUILD
+# COMMAND ${SIGN_CMD}
+# )
+# endif()
diff --git a/client/cmake/ios-arch-fixup.cmake b/client/cmake/ios-arch-fixup.cmake
index 0f349f8d..0f55af5d 100644
--- a/client/cmake/ios-arch-fixup.cmake
+++ b/client/cmake/ios-arch-fixup.cmake
@@ -37,7 +37,7 @@ while(IOS_TARGETS)
## I just want to say it's amazing this doesn't explode with syntax errors.
message("Patching architectures for ${TARGET_NAME}")
set_target_properties(${TARGET_NAME} PROPERTIES
- XCODE_ATTRIBUTE_ARCHS[sdk=iphoneos*] "arm64"
+ XCODE_ATTRIBUTE_ARCHS[sdk=macosx*] "x86_64"
XCODE_ATTRIBUTE_ARCHS[sdk=iphonesimulator*] "x86_64"
)
endwhile()
\ No newline at end of file
diff --git a/client/cmake/ios.cmake b/client/cmake/ios.cmake
index 5fda3506..23bf5a66 100644
--- a/client/cmake/ios.cmake
+++ b/client/cmake/ios.cmake
@@ -1,17 +1,21 @@
-message("Client iOS build")
-set(CMAKE_OSX_DEPLOYMENT_TARGET 13.0)
+message("Client ==> iOS build")
+
+set_target_properties(${PROJECT} PROPERTIES MACOSX_BUNDLE TRUE)
+set(CMAKE_OSX_ARCHITECTURES "x86_64" CACHE INTERNAL "" FORCE)
+set(CMAKE_OSX_DEPLOYMENT_TARGET 10.15)
+
set(APPLE_PROJECT_VERSION ${CMAKE_PROJECT_VERSION_MAJOR}.${CMAKE_PROJECT_VERSION_MINOR}.${CMAKE_PROJECT_VERSION_PATCH})
enable_language(OBJC)
-enable_language(OBJCXX)
+# enable_language(OBJCXX)
enable_language(Swift)
find_package(Qt6 REQUIRED COMPONENTS ShaderTools)
set(LIBS ${LIBS} Qt6::ShaderTools)
find_library(FW_AUTHENTICATIONSERVICES AuthenticationServices)
-find_library(FW_UIKIT UIKit)
+#find_library(FW_UIKIT UIKit)
find_library(FW_AVFOUNDATION AVFoundation)
find_library(FW_FOUNDATION Foundation)
find_library(FW_STOREKIT StoreKit)
@@ -20,7 +24,7 @@ find_library(FW_NETWORKEXTENSION NetworkExtension)
set(LIBS ${LIBS}
${FW_AUTHENTICATIONSERVICES}
- ${FW_UIKIT}
+# ${FW_UIKIT}
${FW_AVFOUNDATION}
${FW_FOUNDATION}
${FW_STOREKIT}
@@ -48,6 +52,19 @@ set(SOURCES ${SOURCES}
${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/QtAppDelegate.mm
)
+set(ICON_FILE ${CMAKE_CURRENT_SOURCE_DIR}/images/app.icns)
+set(MACOSX_BUNDLE_ICON_FILE app.icns)
+set_source_files_properties(${ICON_FILE} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
+set(SOURCES ${SOURCES} ${ICON_FILE})
+
+# set(HEADERS ${HEADERS}
+# ${CMAKE_CURRENT_SOURCE_DIR}/ui/macos_util.h
+# )
+
+# set(SOURCES ${SOURCES}
+# ${CMAKE_CURRENT_SOURCE_DIR}/ui/macos_util.mm
+# )
+
target_include_directories(${PROJECT} PRIVATE ${Qt6Gui_PRIVATE_INCLUDE_DIRS})
@@ -55,10 +72,9 @@ target_include_directories(${PROJECT} PRIVATE ${Qt6Gui_PRIVATE_INCLUDE_DIRS})
set_target_properties(${PROJECT} PROPERTIES
XCODE_LINK_BUILD_PHASE_MODE KNOWN_LOCATION
MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/ios/app/Info.plist.in
- MACOSX_BUNDLE_ICON_FILE "AppIcon"
+ #MACOSX_BUNDLE_ICON_FILE "AppIcon"
MACOSX_BUNDLE_INFO_STRING "AmneziaVPN"
MACOSX_BUNDLE_BUNDLE_NAME "AmneziaVPN"
- MACOSX_BUNDLE_GUI_IDENTIFIER "${BUILD_IOS_APP_IDENTIFIER}"
MACOSX_BUNDLE_BUNDLE_VERSION "${CMAKE_PROJECT_VERSION_TWEAK}"
MACOSX_BUNDLE_LONG_VERSION_STRING "${APPLE_PROJECT_VERSION}-${CMAKE_PROJECT_VERSION_TWEAK}"
MACOSX_BUNDLE_SHORT_VERSION_STRING "${APPLE_PROJECT_VERSION}"
@@ -70,17 +86,25 @@ set_target_properties(${PROJECT} PROPERTIES
XCODE_ATTRIBUTE_BUNDLE_INFO_STRING "AmneziaVPN"
XCODE_GENERATE_SCHEME TRUE
XCODE_ATTRIBUTE_ENABLE_BITCODE "NO"
- XCODE_ATTRIBUTE_ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon"
+ #XCODE_ATTRIBUTE_ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon"
XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1,2"
- XCODE_EMBED_FRAMEWORKS_CODE_SIGN_ON_COPY ON
+ XCODE_EMBED_FRAMEWORKS_CODE_SIGN_ON_COPY "NO"
+ XCODE_EMBED_FRAMEWORKS_REMOVE_HEADERS_ON_COPY "YES"
+
XCODE_LINK_BUILD_PHASE_MODE KNOWN_LOCATION
- XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/Frameworks"
+ XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/../Frameworks"
XCODE_EMBED_APP_EXTENSIONS networkextension
- XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "Apple Distribution"
- XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY[variant=Debug] "Apple Development"
- XCODE_ATTRIBUTE_CODE_SIGN_STYLE Manual
- XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER "match AppStore org.amnezia.AmneziaVPN"
- XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER[variant=Debug] "match Development org.amnezia.AmneziaVPN"
+
+ XCODE_ATTRIBUTE_CODE_SIGN_STYLE Automatic
+ #XCODE_ATTRIBUTE_CODE_SIGN_STYLE Manual
+
+ #XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "Apple Distribution: Privacy Technologies OU (X7UJ388FXK)"
+ #XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY[variant=Debug] "Apple Development"
+
+
+ #XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER "Mac AppStore AmneziaVPN"
+ #XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER[variant=Debug] "Mac AppStore AmneziaVPN"
+
)
set_target_properties(${PROJECT} PROPERTIES
XCODE_ATTRIBUTE_SWIFT_VERSION "5.0"
@@ -111,13 +135,13 @@ target_sources(${PROJECT} PRIVATE
)
target_sources(${PROJECT} PRIVATE
- ${CMAKE_CURRENT_SOURCE_DIR}/ios/app/AmneziaVPNLaunchScreen.storyboard
+ #${CMAKE_CURRENT_SOURCE_DIR}/ios/app/AmneziaVPNLaunchScreen.storyboard
${CMAKE_CURRENT_SOURCE_DIR}/ios/app/Media.xcassets
${CMAKE_CURRENT_SOURCE_DIR}/ios/app/PrivacyInfo.xcprivacy
)
set_property(TARGET ${PROJECT} APPEND PROPERTY RESOURCE
- ${CMAKE_CURRENT_SOURCE_DIR}/ios/app/AmneziaVPNLaunchScreen.storyboard
+ #${CMAKE_CURRENT_SOURCE_DIR}/ios/app/AmneziaVPNLaunchScreen.storyboard
${CMAKE_CURRENT_SOURCE_DIR}/ios/app/Media.xcassets
${CMAKE_CURRENT_SOURCE_DIR}/ios/app/PrivacyInfo.xcprivacy
)
@@ -129,6 +153,29 @@ set_property(TARGET ${PROJECT} PROPERTY XCODE_EMBED_FRAMEWORKS
"${CMAKE_CURRENT_SOURCE_DIR}/3rd/OpenVPNAdapter/build/Release-iphoneos/OpenVPNAdapter.framework"
)
+
+
set(CMAKE_XCODE_ATTRIBUTE_FRAMEWORK_SEARCH_PATHS ${CMAKE_CURRENT_SOURCE_DIR}/3rd/OpenVPNAdapter/build/Release-iphoneos)
target_link_libraries("networkextension" PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/3rd/OpenVPNAdapter/build/Release-iphoneos/OpenVPNAdapter.framework")
+get_target_property(QtCore_location Qt6::Core LOCATION)
+message("QtCore_location")
+message(${QtCore_location})
+
+get_filename_component(QT_BIN_DIR_DETECTED "${QtCore_location}/../../../../../bin" ABSOLUTE)
+
+
+# add_custom_command(TARGET ${PROJECT} POST_BUILD
+# COMMAND ${QT_BIN_DIR_DETECTED}/macdeployqt $ -appstore-compliant -qmldir=${CMAKE_CURRENT_SOURCE_DIR}
+# )
+
+# if(CMAKE_BUILD_TYPE STREQUAL "Release")
+# SET(SIGN_CMD codesign --deep --force --sign 'Apple Distribution: Privacy Technologies OU \(X7UJ388FXK\)' --timestamp --options runtime $)
+# message("Manual signing bundle...")
+# message(${SIGN_CMD})
+
+
+# add_custom_command(TARGET ${PROJECT} POST_BUILD
+# COMMAND ${SIGN_CMD}
+# )
+# endif()
diff --git a/client/cmake/macos.cmake b/client/cmake/macos.cmake
index 7b7cd381..12e26ac3 100644
--- a/client/cmake/macos.cmake
+++ b/client/cmake/macos.cmake
@@ -1,34 +1,55 @@
-message("MAC build")
-
-find_library(FW_SYSTEMCONFIG SystemConfiguration)
-find_library(FW_SERVICEMGMT ServiceManagement)
-find_library(FW_SECURITY Security)
-find_library(FW_COREWLAN CoreWLAN)
-find_library(FW_NETWORK Network)
-find_library(FW_USER_NOTIFICATIONS UserNotifications)
-find_library(FW_NETWORK_EXTENSION NetworkExtension)
-
-set(LIBS ${LIBS}
- ${FW_SYSTEMCONFIG}
- ${FW_SERVICEMGMT}
- ${FW_SECURITY}
- ${FW_COREWLAN}
- ${FW_NETWORK}
- ${FW_USERNOTIFICATIONS}
- ${FW_NETWORK_EXTENSION}
-)
+message("Client ==> iOS build")
set_target_properties(${PROJECT} PROPERTIES MACOSX_BUNDLE TRUE)
set(CMAKE_OSX_ARCHITECTURES "x86_64" CACHE INTERNAL "" FORCE)
set(CMAKE_OSX_DEPLOYMENT_TARGET 10.15)
+set(APPLE_PROJECT_VERSION ${CMAKE_PROJECT_VERSION_MAJOR}.${CMAKE_PROJECT_VERSION_MINOR}.${CMAKE_PROJECT_VERSION_PATCH})
-set(HEADERS ${HEADERS}
- ${CMAKE_CURRENT_SOURCE_DIR}/ui/macos_util.h
+
+enable_language(OBJC)
+# enable_language(OBJCXX)
+enable_language(Swift)
+
+find_package(Qt6 REQUIRED COMPONENTS ShaderTools)
+set(LIBS ${LIBS} Qt6::ShaderTools)
+
+find_library(FW_AUTHENTICATIONSERVICES AuthenticationServices)
+#find_library(FW_UIKIT UIKit)
+find_library(FW_AVFOUNDATION AVFoundation)
+find_library(FW_FOUNDATION Foundation)
+find_library(FW_STOREKIT StoreKit)
+find_library(FW_USERNOTIFICATIONS UserNotifications)
+find_library(FW_NETWORKEXTENSION NetworkExtension)
+
+set(LIBS ${LIBS}
+ ${FW_AUTHENTICATIONSERVICES}
+# ${FW_UIKIT}
+ ${FW_AVFOUNDATION}
+ ${FW_FOUNDATION}
+ ${FW_STOREKIT}
+ ${FW_USERNOTIFICATIONS}
+ ${FW_NETWORKEXTENSION}
)
+
+set(HEADERS ${HEADERS}
+ ${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos/ios_controller.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos/ios_controller_wrapper.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos/iosnotificationhandler.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos/QtAppDelegate.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos/QtAppDelegate-C-Interface.h
+)
+set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/ios_controller.h PROPERTIES OBJECTIVE_CPP_HEADER TRUE)
+
+
set(SOURCES ${SOURCES}
- ${CMAKE_CURRENT_SOURCE_DIR}/ui/macos_util.mm
+ ${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos/ios_controller.mm
+ ${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos/ios_controller_wrapper.mm
+ ${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos/iosnotificationhandler.mm
+ ${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos/iosglue.mm
+ ${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos/QRCodeReaderBase.mm
+ ${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos/QtAppDelegate.mm
)
set(ICON_FILE ${CMAKE_CURRENT_SOURCE_DIR}/images/app.icns)
@@ -36,17 +57,125 @@ set(MACOSX_BUNDLE_ICON_FILE app.icns)
set_source_files_properties(${ICON_FILE} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
set(SOURCES ${SOURCES} ${ICON_FILE})
+# set(HEADERS ${HEADERS}
+# ${CMAKE_CURRENT_SOURCE_DIR}/ui/macos_util.h
+# )
+
+# set(SOURCES ${SOURCES}
+# ${CMAKE_CURRENT_SOURCE_DIR}/ui/macos_util.mm
+# )
+
+
+target_include_directories(${PROJECT} PRIVATE ${Qt6Gui_PRIVATE_INCLUDE_DIRS})
+
+
+set_target_properties(${PROJECT} PROPERTIES
+ XCODE_LINK_BUILD_PHASE_MODE KNOWN_LOCATION
+ MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/macos/app/Info.plist.in
+ #MACOSX_BUNDLE_ICON_FILE "AppIcon"
+ MACOSX_BUNDLE_INFO_STRING "AmneziaVPN"
+ MACOSX_BUNDLE_BUNDLE_NAME "AmneziaVPN"
+ MACOSX_BUNDLE_BUNDLE_VERSION "${CMAKE_PROJECT_VERSION_TWEAK}"
+ MACOSX_BUNDLE_LONG_VERSION_STRING "${APPLE_PROJECT_VERSION}-${CMAKE_PROJECT_VERSION_TWEAK}"
+ MACOSX_BUNDLE_SHORT_VERSION_STRING "${APPLE_PROJECT_VERSION}"
+ XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "${BUILD_OSX_APP_IDENTIFIER}"
+ XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS "${CMAKE_CURRENT_SOURCE_DIR}/macos/app/main.entitlements"
+ XCODE_ATTRIBUTE_MARKETING_VERSION "${APPLE_PROJECT_VERSION}"
+ XCODE_ATTRIBUTE_CURRENT_PROJECT_VERSION "${CMAKE_PROJECT_VERSION_TWEAK}"
+ XCODE_ATTRIBUTE_PRODUCT_NAME "AmneziaVPN"
+ XCODE_ATTRIBUTE_BUNDLE_INFO_STRING "AmneziaVPN"
+ XCODE_GENERATE_SCHEME TRUE
+ XCODE_ATTRIBUTE_ENABLE_BITCODE "NO"
+ #XCODE_ATTRIBUTE_ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon"
+ XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1,2"
+ XCODE_EMBED_FRAMEWORKS_CODE_SIGN_ON_COPY "NO"
+ XCODE_EMBED_FRAMEWORKS_REMOVE_HEADERS_ON_COPY "YES"
+
+ XCODE_LINK_BUILD_PHASE_MODE KNOWN_LOCATION
+ XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/../Frameworks"
+ XCODE_EMBED_APP_EXTENSIONS networkextension
+
+ XCODE_ATTRIBUTE_CODE_SIGN_STYLE Automatic
+ #XCODE_ATTRIBUTE_CODE_SIGN_STYLE Manual
+
+ #XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "Apple Distribution: Privacy Technologies OU (X7UJ388FXK)"
+ #XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY[variant=Debug] "Apple Development"
+
+
+ #XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER "Mac AppStore AmneziaVPN"
+ #XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER[variant=Debug] "Mac AppStore AmneziaVPN"
+
+)
+set_target_properties(${PROJECT} PROPERTIES
+ XCODE_ATTRIBUTE_SWIFT_VERSION "5.0"
+ XCODE_ATTRIBUTE_CLANG_ENABLE_MODULES "YES"
+ XCODE_ATTRIBUTE_SWIFT_PRECOMPILE_BRIDGING_HEADER "NO"
+ XCODE_ATTRIBUTE_SWIFT_OBJC_INTERFACE_HEADER_NAME "AmneziaVPN-Swift.h"
+ XCODE_ATTRIBUTE_SWIFT_OBJC_INTEROP_MODE "objcxx"
+)
+set_target_properties(${PROJECT} PROPERTIES
+ XCODE_ATTRIBUTE_DEVELOPMENT_TEAM "X7UJ388FXK"
+)
+target_include_directories(${PROJECT} PRIVATE ${CMAKE_CURRENT_LIST_DIR})
target_compile_options(${PROJECT} PRIVATE
-DGROUP_ID=\"${BUILD_IOS_GROUP_IDENTIFIER}\"
-DVPN_NE_BUNDLEID=\"${BUILD_IOS_APP_IDENTIFIER}.network-extension\"
)
-# Get SDK path
-execute_process(
- COMMAND sh -c "xcrun --sdk macosx --show-sdk-path"
- OUTPUT_VARIABLE OSX_SDK_PATH
- OUTPUT_STRIP_TRAILING_WHITESPACE
+set(WG_APPLE_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/3rd/amneziawg-apple/Sources)
+
+target_sources(${PROJECT} PRIVATE
+# ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/iosvpnprotocol.swift
+ ${WG_APPLE_SOURCE_DIR}/WireGuardKitC/x25519.c
+ ${CLIENT_ROOT_DIR}/platforms/macos/LogController.swift
+ ${CLIENT_ROOT_DIR}/platforms/macos/Log.swift
+ ${CLIENT_ROOT_DIR}/platforms/macos/LogRecord.swift
+ ${CLIENT_ROOT_DIR}/platforms/macos/ScreenProtection.swift
+ ${CLIENT_ROOT_DIR}/platforms/macos/VPNCController.swift
)
-message("OSX_SDK_PATH is: ${OSX_SDK_PATH}")
+
+target_sources(${PROJECT} PRIVATE
+ # ${CMAKE_CURRENT_SOURCE_DIR}/macos/app/AmneziaVPNLaunchScreen.storyboard
+ ${CMAKE_CURRENT_SOURCE_DIR}/macos/app/Media.xcassets
+ ${CMAKE_CURRENT_SOURCE_DIR}/macos/app/PrivacyInfo.xcprivacy
+)
+
+set_property(TARGET ${PROJECT} APPEND PROPERTY RESOURCE
+ # ${CMAKE_CURRENT_SOURCE_DIR}/macos/app/AmneziaVPNLaunchScreen.storyboard
+ ${CMAKE_CURRENT_SOURCE_DIR}/macos/app/Media.xcassets
+ ${CMAKE_CURRENT_SOURCE_DIR}/macos/app/PrivacyInfo.xcprivacy
+)
+
+add_subdirectory(macos/networkextension)
+add_dependencies(${PROJECT} networkextension)
+
+# set_property(TARGET ${PROJECT} PROPERTY XCODE_EMBED_FRAMEWORKS
+# "${CMAKE_CURRENT_SOURCE_DIR}/3rd/OpenVPNAdapter/build/Release-macos/OpenVPNAdapter.framework"
+# )
+
+# set(CMAKE_XCODE_ATTRIBUTE_FRAMEWORK_SEARCH_PATHS ${CMAKE_CURRENT_SOURCE_DIR}/3rd/OpenVPNAdapter/build/Release-macos)
+# target_link_libraries("networkextension" PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/3rd/OpenVPNAdapter/build/Release-macos/OpenVPNAdapter.framework")
+
+get_target_property(QtCore_location Qt6::Core LOCATION)
+message("QtCore_location")
+message(${QtCore_location})
+
+get_filename_component(QT_BIN_DIR_DETECTED "${QtCore_location}/../../../../../bin" ABSOLUTE)
+
+
+# add_custom_command(TARGET ${PROJECT} POST_BUILD
+# COMMAND ${QT_BIN_DIR_DETECTED}/macdeployqt $ -appstore-compliant -qmldir=${CMAKE_CURRENT_SOURCE_DIR}
+# )
+
+# if(CMAKE_BUILD_TYPE STREQUAL "Release")
+# SET(SIGN_CMD codesign --deep --force --sign 'Apple Distribution: Privacy Technologies OU \(X7UJ388FXK\)' --timestamp --options runtime $)
+# message("Manual signing bundle...")
+# message(${SIGN_CMD})
+
+
+# add_custom_command(TARGET ${PROJECT} POST_BUILD
+# COMMAND ${SIGN_CMD}
+# )
+# endif()
diff --git a/client/configurators/openvpn_configurator.cpp b/client/configurators/openvpn_configurator.cpp
index c4bdf860..cddf4f8c 100644
--- a/client/configurators/openvpn_configurator.cpp
+++ b/client/configurators/openvpn_configurator.cpp
@@ -1,5 +1,7 @@
#include "openvpn_configurator.h"
+#define Q_OS_IOS 1
+
#include
#include
#include
diff --git a/client/configurators/ssh_configurator.cpp b/client/configurators/ssh_configurator.cpp
index 308f5947..009ab166 100644
--- a/client/configurators/ssh_configurator.cpp
+++ b/client/configurators/ssh_configurator.cpp
@@ -1,5 +1,7 @@
#include "ssh_configurator.h"
+#define Q_OS_IOS 1
+
#include
#include
#include
@@ -101,8 +103,8 @@ QProcessEnvironment SshConfigurator::prepareEnv()
pathEnvVar.clear();
pathEnvVar.prepend(QDir::toNativeSeparators(QApplication::applicationDirPath()) + "\\cygwin;");
pathEnvVar.prepend(QDir::toNativeSeparators(QApplication::applicationDirPath()) + "\\openvpn;");
-#elif defined(Q_OS_MACX)
- pathEnvVar.prepend(QDir::toNativeSeparators(QApplication::applicationDirPath()) + "/Contents/MacOS");
+//#elif defined(Q_OS_MACX)
+// pathEnvVar.prepend(QDir::toNativeSeparators(QApplication::applicationDirPath()) + "/Contents/MacOS");
#endif
env.insert("PATH", pathEnvVar);
diff --git a/client/core/controllers/apiController.cpp b/client/core/controllers/apiController.cpp
index 35b459be..e5ec06d4 100644
--- a/client/core/controllers/apiController.cpp
+++ b/client/core/controllers/apiController.cpp
@@ -1,3 +1,5 @@
+#define Q_OS_IOS 1
+
#include "apiController.h"
#include
diff --git a/client/core/ipcclient.h b/client/core/ipcclient.h
index ab5d750a..ceb32abf 100644
--- a/client/core/ipcclient.h
+++ b/client/core/ipcclient.h
@@ -5,10 +5,12 @@
#include
#include "ipc.h"
-#include "rep_ipc_interface_replica.h"
+//#include "rep_ipc_interface_replica.h"
#include "privileged_process.h"
+/*
+
class IpcClient : public QObject
{
Q_OBJECT
@@ -46,6 +48,6 @@ private:
bool m_isSocketConnected {false};
static IpcClient *m_instance;
-};
+}; */
#endif // IPCCLIENT_H
diff --git a/client/core/privileged_process.h b/client/core/privileged_process.h
index 4d08c043..247e8f4b 100644
--- a/client/core/privileged_process.h
+++ b/client/core/privileged_process.h
@@ -3,21 +3,21 @@
#include
-#include "rep_ipc_process_interface_replica.h"
+// #include "rep_ipc_process_interface_replica.h"
// This class is dangerous - instance of this class casted from base class,
// so it support only functions
// Do not add any members into it
//
-class PrivilegedProcess : public IpcProcessInterfaceReplica
-{
- Q_OBJECT
-public:
- PrivilegedProcess();
- ~PrivilegedProcess() override;
+//class PrivilegedProcess : public IpcProcessInterfaceReplica
+//{
+// Q_OBJECT
+//public:
+// PrivilegedProcess();
+// ~PrivilegedProcess() override;
- void waitForFinished(int msecs);
+// void waitForFinished(int msecs);
-};
+//};
#endif // PRIVILEGED_PROCESS_H
diff --git a/client/ios/app/Info.plist.in b/client/ios/app/Info.plist.in
index 45b08cc9..c2d3471d 100644
--- a/client/ios/app/Info.plist.in
+++ b/client/ios/app/Info.plist.in
@@ -11,7 +11,7 @@
CFBundleExecutable${MACOSX_BUNDLE_EXECUTABLE_NAME}CFBundleIdentifier
- ${MACOSX_BUNDLE_GUI_IDENTIFIER}
+ org.amnezia.AmneziaVPNCFBundleInfoDictionaryVersion6.0CFBundleName
@@ -24,23 +24,10 @@
${MACOSX_BUNDLE_BUNDLE_VERSION}NSHumanReadableCopyright${MACOSX_BUNDLE_COPYRIGHT}
+ LSApplicationCategoryType
+ public.app-category.utilitiesITSAppUsesNonExemptEncryption
- LSRequiresIPhoneOS
-
- LSSupportsOpeningDocumentsInPlace
-
- UILaunchStoryboardName
- AmneziaVPNLaunchScreen
- UIRequiredDeviceCapabilities
-
- UIRequiresFullScreen
-
- UISupportedInterfaceOrientations
-
- UIInterfaceOrientationPortraitUpsideDown
- UIInterfaceOrientationPortrait
- UISupportedInterfaceOrientations~ipadUIUserInterfaceStyle
diff --git a/client/ios/app/main.entitlements b/client/ios/app/main.entitlements
index d9f00bb1..e65e88c7 100644
--- a/client/ios/app/main.entitlements
+++ b/client/ios/app/main.entitlements
@@ -2,19 +2,29 @@
+ com.apple.application-identifier
+ X7UJ388FXK.org.amnezia.AmneziaVPNcom.apple.developer.networking.networkextensionpacket-tunnel-provider
+ com.apple.developer.team-identifier
+ X7UJ388FXK
+ com.apple.security.app-sandbox
+ com.apple.security.application-groupsgroup.org.amnezia.AmneziaVPNcom.apple.security.files.user-selected.read-write
+ com.apple.security.network.client
+
+ com.apple.security.network.server
+ keychain-access-groups
- $(AppIdentifierPrefix)group.org.amnezia.AmneziaVPN
+ $(AppIdentifierPrefix)org.amnezia.AmneziaVPN
diff --git a/client/ios/networkextension/AmneziaVPNNetworkExtension.entitlements b/client/ios/networkextension/AmneziaVPNNetworkExtension.entitlements
index 92432b56..1d6ec4a1 100644
--- a/client/ios/networkextension/AmneziaVPNNetworkExtension.entitlements
+++ b/client/ios/networkextension/AmneziaVPNNetworkExtension.entitlements
@@ -2,17 +2,27 @@
+ com.apple.application-identifier
+ X7UJ388FXK.org.amnezia.AmneziaVPN.network-extensioncom.apple.developer.networking.networkextensionpacket-tunnel-provider
+ com.apple.developer.team-identifier
+ X7UJ388FXK
+ com.apple.security.app-sandbox
+ com.apple.security.application-groupsgroup.org.amnezia.AmneziaVPN
+ com.apple.security.network.client
+
+ com.apple.security.network.server
+ keychain-access-groups
- $(AppIdentifierPrefix)group.org.amnezia.AmneziaVPN
+ $(AppIdentifierPrefix)org.amnezia.AmneziaVPN.network-extension
diff --git a/client/ios/networkextension/CMakeLists.txt b/client/ios/networkextension/CMakeLists.txt
index 7302ba68..7ab941e5 100644
--- a/client/ios/networkextension/CMakeLists.txt
+++ b/client/ios/networkextension/CMakeLists.txt
@@ -1,21 +1,24 @@
enable_language(Swift)
-
+message("Client message >> iOS build >> networkextension")
set(CLIENT_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..)
add_executable(networkextension)
+
+configure_file(
+ ${CMAKE_CURRENT_LIST_DIR}/Info.plist.in
+ ${CMAKE_CURRENT_BINARY_DIR}/Info.plist
+)
+
set_target_properties(networkextension PROPERTIES
XCODE_PRODUCT_TYPE com.apple.product-type.app-extension
BUNDLE_EXTENSION appex
- MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist.in
- MACOSX_BUNDLE_INFO_STRING "AmneziaVPNNetworkExtension"
- MACOSX_BUNDLE_BUNDLE_NAME "AmneziaVPNNetworkExtension"
- MACOSX_BUNDLE_GUI_IDENTIFIER "${BUILD_IOS_APP_IDENTIFIER}.network-extension"
- MACOSX_BUNDLE_BUNDLE_VERSION "${CMAKE_PROJECT_VERSION_TWEAK}"
- MACOSX_BUNDLE_LONG_VERSION_STRING "${APPLE_PROJECT_VERSION}-${CMAKE_PROJECT_VERSION_TWEAK}"
+ #MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_BINARY_DIR}/Info.plist
+
MACOSX_BUNDLE_SHORT_VERSION_STRING "${APPLE_PROJECT_VERSION}"
XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "${BUILD_IOS_APP_IDENTIFIER}.network-extension"
+ XCODE_ATTRIBUTE_PRODUCT_BUNDLE_NAME "${BUILD_IOS_APP_IDENTIFIER}.network-extension"
XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS ${CMAKE_CURRENT_SOURCE_DIR}/AmneziaVPNNetworkExtension.entitlements
XCODE_ATTRIBUTE_MARKETING_VERSION "${APP_MAJOR_VERSION}"
XCODE_ATTRIBUTE_CURRENT_PROJECT_VERSION "${BUILD_ID}"
@@ -27,14 +30,41 @@ set_target_properties(networkextension PROPERTIES
XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/../../Frameworks"
- XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "Apple Distribution"
- XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY[variant=Debug] "Apple Development"
+ # XCODE_ATTRIBUTE_CODE_SIGN_STYLE Automatic
+ # #XCODE_ATTRIBUTE_CODE_SIGN_STYLE Manual
- XCODE_ATTRIBUTE_CODE_SIGN_STYLE Manual
- XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER "match AppStore org.amnezia.AmneziaVPN.network-extension"
- XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER[variant=Debug] "match Development org.amnezia.AmneziaVPN.network-extension"
+ # #XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "Apple Distribution: Privacy Technologies OU (X7UJ388FXK)"
+ # #XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY[variant=Debug] "Apple Development"
+
+
+ # #XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER "Mac AppStore AmneziaVPN.network-extension"
+ # #XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER[variant=Debug] "Mac AppStore AmneziaVPN.network-extension"
+
+ XCODE_ATTRIBUTE_INFOPLIST_FILE "${CMAKE_CURRENT_BINARY_DIR}/Info.plist"
+ XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/../../../../Frameworks @loader_path/../../../../Frameworks"
)
+if(CMAKE_BUILD_TYPE STREQUAL "Debug")
+ set_target_properties(networkextension PROPERTIES
+ XCODE_ATTRIBUTE_CODE_SIGN_STYLE Automatic
+ )
+endif()
+
+if(CMAKE_BUILD_TYPE STREQUAL "Release")
+ set_target_properties(networkextension PROPERTIES
+ XCODE_ATTRIBUTE_CODE_SIGN_STYLE Automatic
+ #XCODE_ATTRIBUTE_CODE_SIGN_STYLE Manual
+
+ #XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "Apple Distribution: Privacy Technologies OU (X7UJ388FXK)"
+ #XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY[variant=Debug] "Apple Development"
+
+
+ #XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER "Mac AppStore AmneziaVPN.network-extension"
+ #XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER[variant=Debug] "Mac AppStore AmneziaVPN.network-extension"
+ )
+endif()
+
+
set_target_properties(networkextension PROPERTIES
XCODE_ATTRIBUTE_SWIFT_VERSION "5.0"
XCODE_ATTRIBUTE_CLANG_ENABLE_MODULES "YES"
@@ -52,9 +82,46 @@ find_library(FW_MOBILE_CORE MobileCoreServices)
find_library(FW_UI_KIT UIKit)
find_library(FW_LIBRESOLV libresolv.9.tbd)
-target_link_libraries(networkextension PRIVATE ${FW_ASSETS_LIBRARY})
-target_link_libraries(networkextension PRIVATE ${FW_MOBILE_CORE})
-target_link_libraries(networkextension PRIVATE ${FW_UI_KIT})
+# set(OpenVPNAdapter_DIR "${CLIENT_ROOT_DIR}/3rd/")
+
+# find_library(OPENVPN_ADAPTER_LIBRARY OpenVPNAdapter PATHS ${OpenVPNAdapter_DIR})
+# target_link_libraries(networkextension PRIVATE ${OPENVPN_ADAPTER_LIBRARY})
+
+# add_custom_command(TARGET networkextension PRE_BUILD
+# COMMAND ${CMAKE_COMMAND} -E make_directory $/../Frameworks
+# )
+
+
+# add_custom_command(TARGET networkextension POST_BUILD
+# COMMAND ${CMAKE_COMMAND} -E echo "Copying ${OPENVPN_ADAPTER_LIBRARY} to $/../Frameworks/"
+# COMMAND ${CMAKE_COMMAND} -E copy_if_different
+# ${OPENVPN_ADAPTER_LIBRARY}
+# $/../Frameworks/
+# COMMAND ${CMAKE_COMMAND} -E echo "Copy complete"
+# )
+
+
+
+
+# Set the root directory
+set(CLIENT_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..)
+
+# Embedding the framework using CLIENT_ROOT_DIR
+set_property(TARGET networkextension PROPERTY XCODE_EMBED_FRAMEWORKS
+ "${CLIENT_ROOT_DIR}/3rd/OpenVPNAdapter/build/Release-macos/OpenVPNAdapter.framework"
+)
+
+# Setting the framework search paths using CLIENT_ROOT_DIR
+set(CMAKE_XCODE_ATTRIBUTE_FRAMEWORK_SEARCH_PATHS "${CLIENT_ROOT_DIR}/3rd/OpenVPNAdapter/build/Release-macos")
+
+# Linking the framework using CLIENT_ROOT_DIR
+target_link_libraries("networkextension" PRIVATE "${CLIENT_ROOT_DIR}/3rd/OpenVPNAdapter/build/Release-macos/OpenVPNAdapter.framework")
+
+
+
+#target_link_libraries(networkextension PRIVATE ${FW_ASSETS_LIBRARY})
+#target_link_libraries(networkextension PRIVATE ${FW_MOBILE_CORE})
+#target_link_libraries(networkextension PRIVATE ${FW_UI_KIT})
target_link_libraries(networkextension PRIVATE ${FW_LIBRESOLV})
target_compile_options(networkextension PRIVATE -DGROUP_ID=\"${BUILD_IOS_GROUP_IDENTIFIER}\")
@@ -62,6 +129,9 @@ target_compile_options(networkextension PRIVATE -DNETWORK_EXTENSION=1)
set(WG_APPLE_SOURCE_DIR ${CLIENT_ROOT_DIR}/3rd/amneziawg-apple/Sources)
+message("WG_APPLE_SOURCE_DIR is: ${WG_APPLE_SOURCE_DIR}")
+message("CLIENT_ROOT_DIR is: ${CLIENT_ROOT_DIR}")
+
target_sources(networkextension PRIVATE
${WG_APPLE_SOURCE_DIR}/WireGuardKit/WireGuardAdapter.swift
${WG_APPLE_SOURCE_DIR}/WireGuardKit/PacketTunnelSettingsGenerator.swift
@@ -119,4 +189,10 @@ target_include_directories(networkextension PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
target_link_libraries(networkextension PRIVATE ${CLIENT_ROOT_DIR}/3rd-prebuilt/3rd-prebuilt/wireguard/ios/arm64/libwg-go.a)
-target_link_libraries(networkextension PRIVATE ${CLIENT_ROOT_DIR}/3rd-prebuilt/3rd-prebuilt/xray/HevSocks5Tunnel.xcframework)
+# Print the root directory for debugging purposes
+message("---------")
+message(${CLIENT_ROOT_DIR})
+message(${CLIENT_ROOT_DIR}/3rd-prebuilt/3rd-prebuilt/xray/HevSocks5Tunnel.xcframework/macos-arm64_x86_64/libhev-socks5-tunnel.a)
+target_link_libraries("networkextension" PRIVATE "${CLIENT_ROOT_DIR}/3rd-prebuilt/3rd-prebuilt/xray/HevSocks5Tunnel.xcframework/macos-arm64_x86_64/libhev-socks5-tunnel.a")
+
+target_include_directories(networkextension PRIVATE ${CLIENT_ROOT_DIR}/3rd-prebuilt/3rd-prebuilt/xray/HevSocks5Tunnel.xcframework/macos-arm64_x86_64/Headers)
\ No newline at end of file
diff --git a/client/ios/networkextension/Info.plist.in b/client/ios/networkextension/Info.plist.in
index 54d9d8d9..5ceaa356 100644
--- a/client/ios/networkextension/Info.plist.in
+++ b/client/ios/networkextension/Info.plist.in
@@ -5,20 +5,20 @@
CFBundleDevelopmentRegionenCFBundleExecutable
- ${MACOSX_BUNDLE_EXECUTABLE_NAME}
+ AmneziaVPNNetworkExtensionCFBundleIdentifier
- ${MACOSX_BUNDLE_GUI_IDENTIFIER}
+ ${BUILD_IOS_APP_IDENTIFIER}.network-extensionCFBundleInfoDictionaryVersion6.0CFBundleName
- ${MACOSX_BUNDLE_BUNDLE_NAME}
+ AmneziaVPNNetworkExtensionCFBundlePackageType$(PRODUCT_BUNDLE_PACKAGE_TYPE)CFBundleShortVersionString
- ${MACOSX_BUNDLE_SHORT_VERSION_STRING}
+ ${APPLE_PROJECT_VERSION}CFBundleVersion
- ${MACOSX_BUNDLE_BUNDLE_VERSION}
+ ${CMAKE_PROJECT_VERSION_TWEAK}ITSAppUsesNonExemptEncryption
@@ -27,7 +27,7 @@
${CMAKE_OSX_DEPLOYMENT_TARGET}CFBundleDisplayName
- ${MACOSX_BUNDLE_INFO_STRING}
+ AmneziaVPNNetworkExtensionNSExtension
@@ -38,9 +38,9 @@
com.wireguard.ios.app_group_id
- group.${BUILD_IOS_APP_IDENTIFIER}
+ group.org.amnezia.AmneziaVPNcom.wireguard.macos.app_group_id
- ${BUILD_VPN_DEVELOPMENT_TEAM}.group.${BUILD_OSX_APP_IDENTIFIER}
+ ${BUILD_VPN_DEVELOPMENT_TEAM}.group.org.amnezia.AmneziaVPN
-
\ No newline at end of file
+
diff --git a/client/ios/networkextension/WireGuardNetworkExtension-Bridging-Header.h b/client/ios/networkextension/WireGuardNetworkExtension-Bridging-Header.h
index 2cca0fc8..f911e186 100644
--- a/client/ios/networkextension/WireGuardNetworkExtension-Bridging-Header.h
+++ b/client/ios/networkextension/WireGuardNetworkExtension-Bridging-Header.h
@@ -19,3 +19,8 @@ bool key_from_hex(uint8_t key[WG_KEY_LEN], const char* hex);
bool key_eq(const uint8_t key1[WG_KEY_LEN], const uint8_t key2[WG_KEY_LEN]);
void write_msg_to_log(const char* tag, const char* msg);
+
+// Khai báo hàm C để Swift có thể sử dụng
+void hev_socks5_tunnel_quit(void);
+// Updated function definition in C
+int hev_socks5_tunnel_main(const char* configFile, int fd);
diff --git a/client/ios/scripts/openvpn.sh b/client/ios/scripts/openvpn.sh
index 544b8078..ce8f6054 100755
--- a/client/ios/scripts/openvpn.sh
+++ b/client/ios/scripts/openvpn.sh
@@ -2,18 +2,28 @@ XCODEBUILD="/usr/bin/xcodebuild"
WORKINGDIR=`pwd`
PATCH="/usr/bin/patch"
- cat $WORKINGDIR/3rd/OpenVPNAdapter/Configuration/Project.xcconfig > $WORKINGDIR/3rd/OpenVPNAdapter/Configuration/amnezia.xcconfig
- cat << EOF >> $WORKINGDIR/3rd/OpenVPNAdapter/Configuration/amnezia.xcconfig
- PROJECT_TEMP_DIR = $WORKINGDIR/3rd/OpenVPNAdapter/build/OpenVPNAdapter.build
- CONFIGURATION_BUILD_DIR = $WORKINGDIR/3rd/OpenVPNAdapter/build/Release-iphoneos
- BUILT_PRODUCTS_DIR = $WORKINGDIR/3rd/OpenVPNAdapter/build/Release-iphoneos
+# Copy the Project.xcconfig settings to amnezia.xcconfig
+cat $WORKINGDIR/3rd/OpenVPNAdapter/Configuration/Project.xcconfig > $WORKINGDIR/3rd/OpenVPNAdapter/Configuration/amnezia.xcconfig
+
+# Append macOS-specific build directory configurations to amnezia.xcconfig
+cat << EOF >> $WORKINGDIR/3rd/OpenVPNAdapter/Configuration/amnezia.xcconfig
+PROJECT_TEMP_DIR = $WORKINGDIR/3rd/OpenVPNAdapter/build/OpenVPNAdapter.build
+CONFIGURATION_BUILD_DIR = $WORKINGDIR/3rd/OpenVPNAdapter/build/Release-macos
+BUILT_PRODUCTS_DIR = $WORKINGDIR/3rd/OpenVPNAdapter/build/Release-macos
EOF
+# Fetch the current macOS SDK version dynamically
+MACOSX_SDK=macosx15.0
+cd 3rd/OpenVPNAdapter
- cd 3rd/OpenVPNAdapter
- if $XCODEBUILD -scheme OpenVPNAdapter -configuration Release -xcconfig Configuration/amnezia.xcconfig -sdk iphoneos -destination 'generic/platform=iOS' -project OpenVPNAdapter.xcodeproj ; then
- echo "OpenVPNAdapter built successfully"
- else
- echo "OpenVPNAdapter build failed"
- fi
- cd ../../
+# Build for macOS using the correct SDK and destination
+if $XCODEBUILD -scheme OpenVPNAdapter -configuration Release -xcconfig Configuration/amnezia.xcconfig -sdk $MACOSX_SDK -destination 'generic/platform=macOS' -project OpenVPNAdapter.xcodeproj ; then
+ echo "OpenVPNAdapter built successfully for macOS"
+else
+ echo "OpenVPNAdapter macOS build failed ..."
+fi
+
+# Remove CodeSignature if needed for macOS
+rm -rf ./build/Release-macos/OpenVPNAdapter.framework/Versions/A/_CodeSignature
+
+cd ../../
diff --git a/client/macos/app/AmneziaVPNLaunchScreen.storyboard b/client/macos/app/AmneziaVPNLaunchScreen.storyboard
new file mode 100644
index 00000000..92f79f7e
--- /dev/null
+++ b/client/macos/app/AmneziaVPNLaunchScreen.storyboard
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/client/macos/app/Info.plist.in b/client/macos/app/Info.plist.in
new file mode 100644
index 00000000..c2d3471d
--- /dev/null
+++ b/client/macos/app/Info.plist.in
@@ -0,0 +1,165 @@
+
+
+
+
+ CFBundleAllowMixedLocalizations
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleDisplayName
+ ${QT_INTERNAL_DOLLAR_VAR}{PRODUCT_NAME}
+ CFBundleExecutable
+ ${MACOSX_BUNDLE_EXECUTABLE_NAME}
+ CFBundleIdentifier
+ org.amnezia.AmneziaVPN
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ ${MACOSX_BUNDLE_BUNDLE_NAME}
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ ${MACOSX_BUNDLE_SHORT_VERSION_STRING}
+ CFBundleVersion
+ ${MACOSX_BUNDLE_BUNDLE_VERSION}
+ NSHumanReadableCopyright
+ ${MACOSX_BUNDLE_COPYRIGHT}
+ LSApplicationCategoryType
+ public.app-category.utilities
+ ITSAppUsesNonExemptEncryption
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIUserInterfaceStyle
+ Light
+ com.wireguard.ios.app_group_id
+ group.org.amnezia.AmneziaVPN
+ UIViewControllerBasedStatusBarAppearance
+
+ NSCameraUsageDescription
+ Amnezia VPN needs access to the camera for reading QR-codes.
+ NSAppTransportSecurity
+
+ NSAllowsArbitraryLoads
+
+ NSAllowsLocalNetworking
+
+
+ CFBundleIcons
+
+ CFBundleIcons~ipad
+
+ UTImportedTypeDeclarations
+
+
+ UTTypeConformsTo
+
+ public.data
+
+ UTTypeDescription
+ Amnezia VPN config
+ UTTypeIconFiles
+
+ UTTypeIdentifier
+ org.amnezia.AmneziaVPN.amnezia-config
+ UTTypeTagSpecification
+
+ public.filename-extension
+
+ vpn
+
+ public.mime-type
+
+ text/plain
+
+
+
+
+ UTTypeConformsTo
+
+ public.data
+
+ UTTypeDescription
+ WireGuard config
+ UTTypeIconFiles
+
+ UTTypeIdentifier
+ org.amnezia.AmneziaVPN.wireguard-config
+ UTTypeTagSpecification
+
+ public.filename-extension
+
+ conf
+ cfg
+
+ public.mime-type
+
+ text/plain
+
+
+
+
+ UTTypeConformsTo
+
+ public.data
+
+ UTTypeDescription
+ OpenVPN config
+ UTTypeIconFiles
+
+ UTTypeIdentifier
+ org.amnezia.AmneziaVPN.openvpn-config
+ UTTypeTagSpecification
+
+ public.filename-extension
+
+ ovpn
+
+ public.mime-type
+
+ text/plain
+
+
+
+
+ UTTypeConformsTo
+
+ public.data
+
+ UTTypeDescription
+ AmneziaVPN backup file
+ UTTypeIconFiles
+
+ UTTypeIdentifier
+ org.amnezia.AmneziaVPN.backup-config
+ UTTypeTagSpecification
+
+ public.filename-extension
+
+ backup
+
+ public.mime-type
+
+ text/plain
+
+
+
+
+ CFBundleDocumentTypes
+
+
+ CFBundleTypeName
+ Amnezia VPN config
+ LSHandlerRank
+ Alternate
+ LSItemContentTypes
+
+ org.amnezia.AmneziaVPN.amnezia-config
+ org.amnezia.AmneziaVPN.wireguard-config
+ org.amnezia.AmneziaVPN.openvpn-config
+ org.amnezia.AmneziaVPN.backup-config
+
+
+
+
+
diff --git a/client/macos/app/Media.xcassets/AppIcon.appiconset/100.png b/client/macos/app/Media.xcassets/AppIcon.appiconset/100.png
new file mode 100644
index 00000000..bbe3d546
Binary files /dev/null and b/client/macos/app/Media.xcassets/AppIcon.appiconset/100.png differ
diff --git a/client/macos/app/Media.xcassets/AppIcon.appiconset/1024.png b/client/macos/app/Media.xcassets/AppIcon.appiconset/1024.png
new file mode 100644
index 00000000..0f2ba915
Binary files /dev/null and b/client/macos/app/Media.xcassets/AppIcon.appiconset/1024.png differ
diff --git a/client/macos/app/Media.xcassets/AppIcon.appiconset/114.png b/client/macos/app/Media.xcassets/AppIcon.appiconset/114.png
new file mode 100644
index 00000000..f88f66c7
Binary files /dev/null and b/client/macos/app/Media.xcassets/AppIcon.appiconset/114.png differ
diff --git a/client/macos/app/Media.xcassets/AppIcon.appiconset/120.png b/client/macos/app/Media.xcassets/AppIcon.appiconset/120.png
new file mode 100644
index 00000000..51829dc1
Binary files /dev/null and b/client/macos/app/Media.xcassets/AppIcon.appiconset/120.png differ
diff --git a/client/macos/app/Media.xcassets/AppIcon.appiconset/144.png b/client/macos/app/Media.xcassets/AppIcon.appiconset/144.png
new file mode 100644
index 00000000..0e28bd7b
Binary files /dev/null and b/client/macos/app/Media.xcassets/AppIcon.appiconset/144.png differ
diff --git a/client/macos/app/Media.xcassets/AppIcon.appiconset/152.png b/client/macos/app/Media.xcassets/AppIcon.appiconset/152.png
new file mode 100644
index 00000000..81066df7
Binary files /dev/null and b/client/macos/app/Media.xcassets/AppIcon.appiconset/152.png differ
diff --git a/client/macos/app/Media.xcassets/AppIcon.appiconset/167.png b/client/macos/app/Media.xcassets/AppIcon.appiconset/167.png
new file mode 100644
index 00000000..44858c5a
Binary files /dev/null and b/client/macos/app/Media.xcassets/AppIcon.appiconset/167.png differ
diff --git a/client/macos/app/Media.xcassets/AppIcon.appiconset/180.png b/client/macos/app/Media.xcassets/AppIcon.appiconset/180.png
new file mode 100644
index 00000000..911f5491
Binary files /dev/null and b/client/macos/app/Media.xcassets/AppIcon.appiconset/180.png differ
diff --git a/client/macos/app/Media.xcassets/AppIcon.appiconset/20.png b/client/macos/app/Media.xcassets/AppIcon.appiconset/20.png
new file mode 100644
index 00000000..bb44c366
Binary files /dev/null and b/client/macos/app/Media.xcassets/AppIcon.appiconset/20.png differ
diff --git a/client/macos/app/Media.xcassets/AppIcon.appiconset/29.png b/client/macos/app/Media.xcassets/AppIcon.appiconset/29.png
new file mode 100644
index 00000000..bf9a2c19
Binary files /dev/null and b/client/macos/app/Media.xcassets/AppIcon.appiconset/29.png differ
diff --git a/client/macos/app/Media.xcassets/AppIcon.appiconset/40.png b/client/macos/app/Media.xcassets/AppIcon.appiconset/40.png
new file mode 100644
index 00000000..dbcf6fad
Binary files /dev/null and b/client/macos/app/Media.xcassets/AppIcon.appiconset/40.png differ
diff --git a/client/macos/app/Media.xcassets/AppIcon.appiconset/50.png b/client/macos/app/Media.xcassets/AppIcon.appiconset/50.png
new file mode 100644
index 00000000..83c3e6b7
Binary files /dev/null and b/client/macos/app/Media.xcassets/AppIcon.appiconset/50.png differ
diff --git a/client/macos/app/Media.xcassets/AppIcon.appiconset/57.png b/client/macos/app/Media.xcassets/AppIcon.appiconset/57.png
new file mode 100644
index 00000000..f2a56e74
Binary files /dev/null and b/client/macos/app/Media.xcassets/AppIcon.appiconset/57.png differ
diff --git a/client/macos/app/Media.xcassets/AppIcon.appiconset/58.png b/client/macos/app/Media.xcassets/AppIcon.appiconset/58.png
new file mode 100644
index 00000000..2714c6bf
Binary files /dev/null and b/client/macos/app/Media.xcassets/AppIcon.appiconset/58.png differ
diff --git a/client/macos/app/Media.xcassets/AppIcon.appiconset/60.png b/client/macos/app/Media.xcassets/AppIcon.appiconset/60.png
new file mode 100644
index 00000000..a7303586
Binary files /dev/null and b/client/macos/app/Media.xcassets/AppIcon.appiconset/60.png differ
diff --git a/client/macos/app/Media.xcassets/AppIcon.appiconset/72.png b/client/macos/app/Media.xcassets/AppIcon.appiconset/72.png
new file mode 100644
index 00000000..d0f20363
Binary files /dev/null and b/client/macos/app/Media.xcassets/AppIcon.appiconset/72.png differ
diff --git a/client/macos/app/Media.xcassets/AppIcon.appiconset/76.png b/client/macos/app/Media.xcassets/AppIcon.appiconset/76.png
new file mode 100644
index 00000000..ccf90ddc
Binary files /dev/null and b/client/macos/app/Media.xcassets/AppIcon.appiconset/76.png differ
diff --git a/client/macos/app/Media.xcassets/AppIcon.appiconset/80.png b/client/macos/app/Media.xcassets/AppIcon.appiconset/80.png
new file mode 100644
index 00000000..9f7b1037
Binary files /dev/null and b/client/macos/app/Media.xcassets/AppIcon.appiconset/80.png differ
diff --git a/client/macos/app/Media.xcassets/AppIcon.appiconset/87.png b/client/macos/app/Media.xcassets/AppIcon.appiconset/87.png
new file mode 100644
index 00000000..918e04f6
Binary files /dev/null and b/client/macos/app/Media.xcassets/AppIcon.appiconset/87.png differ
diff --git a/client/macos/app/Media.xcassets/AppIcon.appiconset/Contents.json b/client/macos/app/Media.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 00000000..3d771d98
--- /dev/null
+++ b/client/macos/app/Media.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,290 @@
+{
+ "images" : [
+ {
+ "filename" : "40.png",
+ "idiom" : "iphone",
+ "scale" : "2x",
+ "size" : "20x20"
+ },
+ {
+ "filename" : "60.png",
+ "idiom" : "iphone",
+ "scale" : "3x",
+ "size" : "20x20"
+ },
+ {
+ "filename" : "29.png",
+ "idiom" : "iphone",
+ "scale" : "1x",
+ "size" : "29x29"
+ },
+ {
+ "filename" : "58.png",
+ "idiom" : "iphone",
+ "scale" : "2x",
+ "size" : "29x29"
+ },
+ {
+ "filename" : "87.png",
+ "idiom" : "iphone",
+ "scale" : "3x",
+ "size" : "29x29"
+ },
+ {
+ "filename" : "80.png",
+ "idiom" : "iphone",
+ "scale" : "2x",
+ "size" : "40x40"
+ },
+ {
+ "filename" : "120.png",
+ "idiom" : "iphone",
+ "scale" : "3x",
+ "size" : "40x40"
+ },
+ {
+ "filename" : "57.png",
+ "idiom" : "iphone",
+ "scale" : "1x",
+ "size" : "57x57"
+ },
+ {
+ "filename" : "114.png",
+ "idiom" : "iphone",
+ "scale" : "2x",
+ "size" : "57x57"
+ },
+ {
+ "filename" : "120.png",
+ "idiom" : "iphone",
+ "scale" : "2x",
+ "size" : "60x60"
+ },
+ {
+ "filename" : "180.png",
+ "idiom" : "iphone",
+ "scale" : "3x",
+ "size" : "60x60"
+ },
+ {
+ "filename" : "20.png",
+ "idiom" : "ipad",
+ "scale" : "1x",
+ "size" : "20x20"
+ },
+ {
+ "filename" : "40.png",
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "20x20"
+ },
+ {
+ "filename" : "29.png",
+ "idiom" : "ipad",
+ "scale" : "1x",
+ "size" : "29x29"
+ },
+ {
+ "filename" : "58.png",
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "29x29"
+ },
+ {
+ "filename" : "40.png",
+ "idiom" : "ipad",
+ "scale" : "1x",
+ "size" : "40x40"
+ },
+ {
+ "filename" : "80.png",
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "40x40"
+ },
+ {
+ "filename" : "50.png",
+ "idiom" : "ipad",
+ "scale" : "1x",
+ "size" : "50x50"
+ },
+ {
+ "filename" : "100.png",
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "50x50"
+ },
+ {
+ "filename" : "72.png",
+ "idiom" : "ipad",
+ "scale" : "1x",
+ "size" : "72x72"
+ },
+ {
+ "filename" : "144.png",
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "72x72"
+ },
+ {
+ "filename" : "76.png",
+ "idiom" : "ipad",
+ "scale" : "1x",
+ "size" : "76x76"
+ },
+ {
+ "filename" : "152.png",
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "76x76"
+ },
+ {
+ "filename" : "167.png",
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "83.5x83.5"
+ },
+ {
+ "filename" : "1024.png",
+ "idiom" : "ios-marketing",
+ "scale" : "1x",
+ "size" : "1024x1024"
+ },
+ {
+ "idiom" : "watch",
+ "role" : "notificationCenter",
+ "scale" : "2x",
+ "size" : "24x24",
+ "subtype" : "38mm"
+ },
+ {
+ "idiom" : "watch",
+ "role" : "notificationCenter",
+ "scale" : "2x",
+ "size" : "27.5x27.5",
+ "subtype" : "42mm"
+ },
+ {
+ "idiom" : "watch",
+ "role" : "companionSettings",
+ "scale" : "2x",
+ "size" : "29x29"
+ },
+ {
+ "idiom" : "watch",
+ "role" : "companionSettings",
+ "scale" : "3x",
+ "size" : "29x29"
+ },
+ {
+ "idiom" : "watch",
+ "role" : "notificationCenter",
+ "scale" : "2x",
+ "size" : "33x33",
+ "subtype" : "45mm"
+ },
+ {
+ "idiom" : "watch",
+ "role" : "appLauncher",
+ "scale" : "2x",
+ "size" : "40x40",
+ "subtype" : "38mm"
+ },
+ {
+ "idiom" : "watch",
+ "role" : "appLauncher",
+ "scale" : "2x",
+ "size" : "44x44",
+ "subtype" : "40mm"
+ },
+ {
+ "idiom" : "watch",
+ "role" : "appLauncher",
+ "scale" : "2x",
+ "size" : "46x46",
+ "subtype" : "41mm"
+ },
+ {
+ "idiom" : "watch",
+ "role" : "appLauncher",
+ "scale" : "2x",
+ "size" : "50x50",
+ "subtype" : "44mm"
+ },
+ {
+ "idiom" : "watch",
+ "role" : "appLauncher",
+ "scale" : "2x",
+ "size" : "51x51",
+ "subtype" : "45mm"
+ },
+ {
+ "idiom" : "watch",
+ "role" : "appLauncher",
+ "scale" : "2x",
+ "size" : "54x54",
+ "subtype" : "49mm"
+ },
+ {
+ "idiom" : "watch",
+ "role" : "quickLook",
+ "scale" : "2x",
+ "size" : "86x86",
+ "subtype" : "38mm"
+ },
+ {
+ "idiom" : "watch",
+ "role" : "quickLook",
+ "scale" : "2x",
+ "size" : "98x98",
+ "subtype" : "42mm"
+ },
+ {
+ "idiom" : "watch",
+ "role" : "quickLook",
+ "scale" : "2x",
+ "size" : "108x108",
+ "subtype" : "44mm"
+ },
+ {
+ "idiom" : "watch",
+ "role" : "quickLook",
+ "scale" : "2x",
+ "size" : "117x117",
+ "subtype" : "45mm"
+ },
+ {
+ "idiom" : "watch",
+ "role" : "quickLook",
+ "scale" : "2x",
+ "size" : "129x129",
+ "subtype" : "49mm"
+ },
+ {
+ "idiom" : "watch-marketing",
+ "scale" : "1x",
+ "size" : "1024x1024"
+ },
+ {
+ "idiom" : "car",
+ "scale" : "2x",
+ "size" : "60"
+ },
+ {
+ "idiom" : "car",
+ "scale" : "3x",
+ "size" : "60"
+ },
+ {
+ "idiom" : "watch",
+ "role" : "longLook",
+ "scale" : "2x",
+ "size" : "44x44",
+ "subtype" : "42mm"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/client/macos/app/Media.xcassets/Contents.json b/client/macos/app/Media.xcassets/Contents.json
new file mode 100644
index 00000000..73c00596
--- /dev/null
+++ b/client/macos/app/Media.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/client/macos/app/PrivacyInfo.xcprivacy b/client/macos/app/PrivacyInfo.xcprivacy
new file mode 100644
index 00000000..24e32f37
--- /dev/null
+++ b/client/macos/app/PrivacyInfo.xcprivacy
@@ -0,0 +1,33 @@
+
+
+
+
+ NSPrivacyAccessedAPITypes
+
+
+ NSPrivacyAccessedAPIType
+ NSPrivacyAccessedAPICategoryFileTimestamp
+ NSPrivacyAccessedAPITypeReasons
+
+ C617.1
+
+
+
+ NSPrivacyAccessedAPIType
+ NSPrivacyAccessedAPICategoryUserDefaults
+ NSPrivacyAccessedAPITypeReasons
+
+ 1C8F.1
+
+
+
+ NSPrivacyAccessedAPIType
+ NSPrivacyAccessedAPICategorySystemBootTime
+ NSPrivacyAccessedAPITypeReasons
+
+ 35F9.1
+
+
+
+
+
diff --git a/client/macos/app/launch.png b/client/macos/app/launch.png
new file mode 100644
index 00000000..175b1afc
Binary files /dev/null and b/client/macos/app/launch.png differ
diff --git a/client/macos/app/main.entitlements b/client/macos/app/main.entitlements
new file mode 100644
index 00000000..e65e88c7
--- /dev/null
+++ b/client/macos/app/main.entitlements
@@ -0,0 +1,30 @@
+
+
+
+
+ com.apple.application-identifier
+ X7UJ388FXK.org.amnezia.AmneziaVPN
+ com.apple.developer.networking.networkextension
+
+ packet-tunnel-provider
+
+ com.apple.developer.team-identifier
+ X7UJ388FXK
+ com.apple.security.app-sandbox
+
+ com.apple.security.application-groups
+
+ group.org.amnezia.AmneziaVPN
+
+ com.apple.security.files.user-selected.read-write
+
+ com.apple.security.network.client
+
+ com.apple.security.network.server
+
+ keychain-access-groups
+
+ $(AppIdentifierPrefix)org.amnezia.AmneziaVPN
+
+
+
diff --git a/client/macos/networkextension/AmneziaVPNNetworkExtension.entitlements b/client/macos/networkextension/AmneziaVPNNetworkExtension.entitlements
index b4f08784..1d6ec4a1 100644
--- a/client/macos/networkextension/AmneziaVPNNetworkExtension.entitlements
+++ b/client/macos/networkextension/AmneziaVPNNetworkExtension.entitlements
@@ -3,40 +3,26 @@
com.apple.application-identifier
- $(DEVELOPMENT_TEAM).$(NETEXT_ID_MACOS)
-
+ X7UJ388FXK.org.amnezia.AmneziaVPN.network-extensioncom.apple.developer.networking.networkextensionpacket-tunnel-provider
-
- keychain-access-groups
-
- $(DEVELOPMENT_TEAM).*
-
-
com.apple.developer.team-identifier
- $(DEVELOPMENT_TEAM)
-
- com.apple.developer.system-extension.install
-
-
+ X7UJ388FXKcom.apple.security.app-sandbox
-
com.apple.security.application-groups
- $(DEVELOPMENT_TEAM).$(GROUP_ID_MACOS)
+ group.org.amnezia.AmneziaVPN
-
com.apple.security.network.client
-
com.apple.security.network.server
- com.apple.security.app-sandbox
-
- com.apple.private.network.socket-delegate
-
+ keychain-access-groups
+
+ $(AppIdentifierPrefix)org.amnezia.AmneziaVPN.network-extension
+
diff --git a/client/macos/networkextension/AmneziaVPNNetworkExtension.entitlements.bk b/client/macos/networkextension/AmneziaVPNNetworkExtension.entitlements.bk
new file mode 100644
index 00000000..6f2345de
--- /dev/null
+++ b/client/macos/networkextension/AmneziaVPNNetworkExtension.entitlements.bk
@@ -0,0 +1,47 @@
+
+
+
+
+ com.apple.application-identifier
+ $(DEVELOPMENT_TEAM).$(NETEXT_ID_MACOS)
+ com.apple.security.app-sandbox
+
+ com.apple.security.network.client
+
+ com.apple.security.network.server
+
+ com.apple.developer.networking.networkextension
+
+ packet-tunnel-provider
+
+
+ keychain-access-groups
+
+ $(DEVELOPMENT_TEAM).*
+
+
+ com.apple.developer.team-identifier
+ $(DEVELOPMENT_TEAM)
+
+ com.apple.developer.system-extension.install
+
+
+ com.apple.security.app-sandbox
+
+
+ com.apple.security.application-groups
+
+ $(DEVELOPMENT_TEAM).$(GROUP_ID_MACOS)
+
+
+ com.apple.security.network.client
+
+
+ com.apple.security.network.server
+
+ com.apple.security.app-sandbox
+
+ com.apple.private.network.socket-delegate
+
+
+
diff --git a/client/macos/networkextension/CMakeLists.txt b/client/macos/networkextension/CMakeLists.txt
new file mode 100644
index 00000000..a061148f
--- /dev/null
+++ b/client/macos/networkextension/CMakeLists.txt
@@ -0,0 +1,198 @@
+enable_language(Swift)
+message("Client message >> macos build >> networkextension")
+set(CLIENT_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..)
+
+add_executable(networkextension)
+
+configure_file(
+ ${CMAKE_CURRENT_LIST_DIR}/Info.plist.in
+ ${CMAKE_CURRENT_BINARY_DIR}/Info.plist
+)
+
+set_target_properties(networkextension PROPERTIES
+ XCODE_PRODUCT_TYPE com.apple.product-type.app-extension
+ BUNDLE_EXTENSION appex
+
+ #MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_BINARY_DIR}/Info.plist
+
+ MACOSX_BUNDLE_SHORT_VERSION_STRING "${APPLE_PROJECT_VERSION}"
+
+ XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "${BUILD_OSX_APP_IDENTIFIER}.network-extension"
+ XCODE_ATTRIBUTE_PRODUCT_BUNDLE_NAME "${BUILD_OSX_APP_IDENTIFIER}.network-extension"
+ XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS ${CMAKE_CURRENT_SOURCE_DIR}/AmneziaVPNNetworkExtension.entitlements
+ XCODE_ATTRIBUTE_MARKETING_VERSION "${APP_MAJOR_VERSION}"
+ XCODE_ATTRIBUTE_CURRENT_PROJECT_VERSION "${BUILD_ID}"
+ XCODE_ATTRIBUTE_PRODUCT_NAME "AmneziaVPNNetworkExtension"
+
+ XCODE_ATTRIBUTE_APPLICATION_EXTENSION_API_ONLY "YES"
+ XCODE_ATTRIBUTE_ENABLE_BITCODE "NO"
+ XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1,2"
+
+ XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/../../Frameworks"
+
+ # XCODE_ATTRIBUTE_CODE_SIGN_STYLE Automatic
+ # #XCODE_ATTRIBUTE_CODE_SIGN_STYLE Manual
+
+ # #XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "Apple Distribution: Privacy Technologies OU (X7UJ388FXK)"
+ # #XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY[variant=Debug] "Apple Development"
+
+
+ # #XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER "Mac AppStore AmneziaVPN.network-extension"
+ # #XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER[variant=Debug] "Mac AppStore AmneziaVPN.network-extension"
+
+ XCODE_ATTRIBUTE_INFOPLIST_FILE "${CMAKE_CURRENT_BINARY_DIR}/Info.plist"
+ XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/../../../../Frameworks @loader_path/../../../../Frameworks"
+)
+
+if(CMAKE_BUILD_TYPE STREQUAL "Debug")
+ set_target_properties(networkextension PROPERTIES
+ XCODE_ATTRIBUTE_CODE_SIGN_STYLE Automatic
+ )
+endif()
+
+if(CMAKE_BUILD_TYPE STREQUAL "Release")
+ set_target_properties(networkextension PROPERTIES
+ XCODE_ATTRIBUTE_CODE_SIGN_STYLE Automatic
+ #XCODE_ATTRIBUTE_CODE_SIGN_STYLE Manual
+
+ #XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "Apple Distribution: Privacy Technologies OU (X7UJ388FXK)"
+ #XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY[variant=Debug] "Apple Development"
+
+
+ #XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER "Mac AppStore AmneziaVPN.network-extension"
+ #XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER[variant=Debug] "Mac AppStore AmneziaVPN.network-extension"
+ )
+endif()
+
+
+set_target_properties(networkextension PROPERTIES
+ XCODE_ATTRIBUTE_SWIFT_VERSION "5.0"
+ XCODE_ATTRIBUTE_CLANG_ENABLE_MODULES "YES"
+ XCODE_ATTRIBUTE_SWIFT_OBJC_BRIDGING_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/WireGuardNetworkExtension-Bridging-Header.h"
+ XCODE_ATTRIBUTE_SWIFT_OPTIMIZATION_LEVEL "-Onone"
+ XCODE_ATTRIBUTE_SWIFT_PRECOMPILE_BRIDGING_HEADER "NO"
+)
+
+set_target_properties("networkextension" PROPERTIES
+ XCODE_ATTRIBUTE_DEVELOPMENT_TEAM "X7UJ388FXK"
+)
+
+find_library(FW_ASSETS_LIBRARY AssetsLibrary)
+find_library(FW_MOBILE_CORE MobileCoreServices)
+find_library(FW_UI_KIT UIKit)
+find_library(FW_LIBRESOLV libresolv.9.tbd)
+
+# set(OpenVPNAdapter_DIR "${CLIENT_ROOT_DIR}/3rd/")
+
+# find_library(OPENVPN_ADAPTER_LIBRARY OpenVPNAdapter PATHS ${OpenVPNAdapter_DIR})
+# target_link_libraries(networkextension PRIVATE ${OPENVPN_ADAPTER_LIBRARY})
+
+# add_custom_command(TARGET networkextension PRE_BUILD
+# COMMAND ${CMAKE_COMMAND} -E make_directory $/../Frameworks
+# )
+
+
+# add_custom_command(TARGET networkextension POST_BUILD
+# COMMAND ${CMAKE_COMMAND} -E echo "Copying ${OPENVPN_ADAPTER_LIBRARY} to $/../Frameworks/"
+# COMMAND ${CMAKE_COMMAND} -E copy_if_different
+# ${OPENVPN_ADAPTER_LIBRARY}
+# $/../Frameworks/
+# COMMAND ${CMAKE_COMMAND} -E echo "Copy complete"
+# )
+
+
+
+
+# Set the root directory
+set(CLIENT_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..)
+
+# Embedding the framework using CLIENT_ROOT_DIR
+set_property(TARGET networkextension PROPERTY XCODE_EMBED_FRAMEWORKS
+ "${CLIENT_ROOT_DIR}/3rd/OpenVPNAdapter/build/Release-macos/OpenVPNAdapter.framework"
+)
+
+# Setting the framework search paths using CLIENT_ROOT_DIR
+set(CMAKE_XCODE_ATTRIBUTE_FRAMEWORK_SEARCH_PATHS "${CLIENT_ROOT_DIR}/3rd/OpenVPNAdapter/build/Release-macos")
+
+# Linking the framework using CLIENT_ROOT_DIR
+target_link_libraries("networkextension" PRIVATE "${CLIENT_ROOT_DIR}/3rd/OpenVPNAdapter/build/Release-macos/OpenVPNAdapter.framework")
+
+
+
+#target_link_libraries(networkextension PRIVATE ${FW_ASSETS_LIBRARY})
+#target_link_libraries(networkextension PRIVATE ${FW_MOBILE_CORE})
+#target_link_libraries(networkextension PRIVATE ${FW_UI_KIT})
+target_link_libraries(networkextension PRIVATE ${FW_LIBRESOLV})
+
+target_compile_options(networkextension PRIVATE -DGROUP_ID=\"${BUILD_IOS_GROUP_IDENTIFIER}\")
+target_compile_options(networkextension PRIVATE -DNETWORK_EXTENSION=1)
+
+set(WG_APPLE_SOURCE_DIR ${CLIENT_ROOT_DIR}/3rd/amneziawg-apple/Sources)
+
+message("WG_APPLE_SOURCE_DIR is: ${WG_APPLE_SOURCE_DIR}")
+message("CLIENT_ROOT_DIR is: ${CLIENT_ROOT_DIR}")
+
+target_sources(networkextension PRIVATE
+ ${WG_APPLE_SOURCE_DIR}/WireGuardKit/WireGuardAdapter.swift
+ ${WG_APPLE_SOURCE_DIR}/WireGuardKit/PacketTunnelSettingsGenerator.swift
+ ${WG_APPLE_SOURCE_DIR}/WireGuardKit/DNSResolver.swift
+ ${WG_APPLE_SOURCE_DIR}/WireGuardNetworkExtension/ErrorNotifier.swift
+ ${WG_APPLE_SOURCE_DIR}/Shared/Keychain.swift
+ ${WG_APPLE_SOURCE_DIR}/Shared/Model/TunnelConfiguration+WgQuickConfig.swift
+ ${WG_APPLE_SOURCE_DIR}/Shared/Model/NETunnelProviderProtocol+Extension.swift
+ ${WG_APPLE_SOURCE_DIR}/Shared/Model/String+ArrayConversion.swift
+ ${WG_APPLE_SOURCE_DIR}/WireGuardKit/TunnelConfiguration.swift
+ ${WG_APPLE_SOURCE_DIR}/WireGuardKit/IPAddressRange.swift
+ ${WG_APPLE_SOURCE_DIR}/WireGuardKit/Endpoint.swift
+ ${WG_APPLE_SOURCE_DIR}/WireGuardKit/DNSServer.swift
+ ${WG_APPLE_SOURCE_DIR}/WireGuardKit/InterfaceConfiguration.swift
+ ${WG_APPLE_SOURCE_DIR}/WireGuardKit/PeerConfiguration.swift
+ ${WG_APPLE_SOURCE_DIR}/Shared/FileManager+Extension.swift
+ ${WG_APPLE_SOURCE_DIR}/WireGuardKitC/x25519.c
+ ${WG_APPLE_SOURCE_DIR}/WireGuardKit/Array+ConcurrentMap.swift
+ ${WG_APPLE_SOURCE_DIR}/WireGuardKit/IPAddress+AddrInfo.swift
+ ${WG_APPLE_SOURCE_DIR}/WireGuardKit/PrivateKey.swift
+ ${CLIENT_ROOT_DIR}/platforms/macos/HevSocksTunnel.swift
+ ${CLIENT_ROOT_DIR}/platforms/macos/NELogController.swift
+ ${CLIENT_ROOT_DIR}/platforms/macos/Log.swift
+ ${CLIENT_ROOT_DIR}/platforms/macos/LogRecord.swift
+ ${CLIENT_ROOT_DIR}/platforms/macos/PacketTunnelProvider.swift
+ ${CLIENT_ROOT_DIR}/platforms/macos/PacketTunnelProvider+WireGuard.swift
+ ${CLIENT_ROOT_DIR}/platforms/macos/PacketTunnelProvider+OpenVPN.swift
+ ${CLIENT_ROOT_DIR}/platforms/macos/PacketTunnelProvider+Xray.swift
+ ${CLIENT_ROOT_DIR}/platforms/macos/WGConfig.swift
+ ${CLIENT_ROOT_DIR}/platforms/macos/iosglue.mm
+)
+
+target_sources(networkextension PRIVATE
+ ${CMAKE_CURRENT_SOURCE_DIR}/PrivacyInfo.xcprivacy
+)
+
+set_property(TARGET networkextension APPEND PROPERTY RESOURCE
+ ${CMAKE_CURRENT_SOURCE_DIR}/PrivacyInfo.xcprivacy
+)
+
+## Build wireguard-go-version.h
+execute_process(
+ COMMAND go list -m golang.zx2c4.com/wireguard
+ WORKING_DIRECTORY ${CLIENT_ROOT_DIR}/3rd/wireguard-apple/Sources/WireGuardKitGo
+ OUTPUT_VARIABLE WG_VERSION_FULL
+)
+string(REGEX REPLACE ".*v\([0-9.]*\).*" "\\1" WG_VERSION_STRING 1.1.1)
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/wireguard-go-version.h.in
+ ${CMAKE_CURRENT_BINARY_DIR}/wireguard-go-version.h)
+target_sources(networkextension PRIVATE
+ ${CMAKE_CURRENT_BINARY_DIR}/wireguard-go-version.h)
+
+target_include_directories(networkextension PRIVATE ${CLIENT_ROOT_DIR})
+target_include_directories(networkextension PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
+
+target_link_libraries(networkextension PRIVATE ${CLIENT_ROOT_DIR}/3rd-prebuilt/3rd-prebuilt/wireguard/ios/arm64/libwg-go.a)
+
+# Print the root directory for debugging purposes
+# message("---------")
+# message(${CLIENT_ROOT_DIR})
+# message(${CLIENT_ROOT_DIR}/3rd-prebuilt/3rd-prebuilt/xray/HevSocks5Tunnel.xcframework/macos-arm64_x86_64/libhev-socks5-tunnel.a)
+target_link_libraries("networkextension" PRIVATE "${CLIENT_ROOT_DIR}/3rd-prebuilt/3rd-prebuilt/xray/HevSocks5Tunnel.xcframework/macos-arm64_x86_64/libhev-socks5-tunnel.a")
+
+target_include_directories(networkextension PRIVATE ${CLIENT_ROOT_DIR}/3rd-prebuilt/3rd-prebuilt/xray/HevSocks5Tunnel.xcframework/macos-arm64_x86_64/Headers)
\ No newline at end of file
diff --git a/client/macos/networkextension/Info.plist b/client/macos/networkextension/Info.plist
index 96d82459..5ceaa356 100644
--- a/client/macos/networkextension/Info.plist
+++ b/client/macos/networkextension/Info.plist
@@ -3,27 +3,32 @@
CFBundleDevelopmentRegion
- $(DEVELOPMENT_LANGUAGE)
- CFBundleDisplayName
- AmneziaVPNNetworkExtension
+ enCFBundleExecutable
- $(EXECUTABLE_NAME)
+ AmneziaVPNNetworkExtension
+
CFBundleIdentifier
- $(PRODUCT_BUNDLE_IDENTIFIER)
+ ${BUILD_IOS_APP_IDENTIFIER}.network-extensionCFBundleInfoDictionaryVersion6.0CFBundleName
- $(PRODUCT_NAME)
+ AmneziaVPNNetworkExtensionCFBundlePackageType$(PRODUCT_BUNDLE_PACKAGE_TYPE)CFBundleShortVersionString
- $(MARKETING_VERSION)
+ ${APPLE_PROJECT_VERSION}CFBundleVersion
- $(CURRENT_PROJECT_VERSION)
+ ${CMAKE_PROJECT_VERSION_TWEAK}
+
ITSAppUsesNonExemptEncryption
+
LSMinimumSystemVersion
- $(MACOSX_DEPLOYMENT_TARGET)
+ ${CMAKE_OSX_DEPLOYMENT_TARGET}
+
+ CFBundleDisplayName
+ AmneziaVPNNetworkExtension
+
NSExtensionNSExtensionPointIdentifier
@@ -31,5 +36,11 @@
NSExtensionPrincipalClass$(PRODUCT_MODULE_NAME).PacketTunnelProvider
+
+ com.wireguard.ios.app_group_id
+ group.org.amnezia.AmneziaVPN
+
+ com.wireguard.macos.app_group_id
+ ${BUILD_VPN_DEVELOPMENT_TEAM}.group.org.amnezia.AmneziaVPN
diff --git a/client/macos/networkextension/Info.plist.bk b/client/macos/networkextension/Info.plist.bk
new file mode 100644
index 00000000..96d82459
--- /dev/null
+++ b/client/macos/networkextension/Info.plist.bk
@@ -0,0 +1,35 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleDisplayName
+ AmneziaVPNNetworkExtension
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ $(PRODUCT_BUNDLE_PACKAGE_TYPE)
+ CFBundleShortVersionString
+ $(MARKETING_VERSION)
+ CFBundleVersion
+ $(CURRENT_PROJECT_VERSION)
+ ITSAppUsesNonExemptEncryption
+
+ LSMinimumSystemVersion
+ $(MACOSX_DEPLOYMENT_TARGET)
+ NSExtension
+
+ NSExtensionPointIdentifier
+ com.apple.networkextension.packet-tunnel
+ NSExtensionPrincipalClass
+ $(PRODUCT_MODULE_NAME).PacketTunnelProvider
+
+
+
diff --git a/client/macos/networkextension/Info.plist.in b/client/macos/networkextension/Info.plist.in
new file mode 100644
index 00000000..5ceaa356
--- /dev/null
+++ b/client/macos/networkextension/Info.plist.in
@@ -0,0 +1,46 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleExecutable
+ AmneziaVPNNetworkExtension
+
+ CFBundleIdentifier
+ ${BUILD_IOS_APP_IDENTIFIER}.network-extension
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ AmneziaVPNNetworkExtension
+ CFBundlePackageType
+ $(PRODUCT_BUNDLE_PACKAGE_TYPE)
+ CFBundleShortVersionString
+ ${APPLE_PROJECT_VERSION}
+ CFBundleVersion
+ ${CMAKE_PROJECT_VERSION_TWEAK}
+
+ ITSAppUsesNonExemptEncryption
+
+
+ LSMinimumSystemVersion
+ ${CMAKE_OSX_DEPLOYMENT_TARGET}
+
+ CFBundleDisplayName
+ AmneziaVPNNetworkExtension
+
+ NSExtension
+
+ NSExtensionPointIdentifier
+ com.apple.networkextension.packet-tunnel
+ NSExtensionPrincipalClass
+ $(PRODUCT_MODULE_NAME).PacketTunnelProvider
+
+
+ com.wireguard.ios.app_group_id
+ group.org.amnezia.AmneziaVPN
+
+ com.wireguard.macos.app_group_id
+ ${BUILD_VPN_DEVELOPMENT_TEAM}.group.org.amnezia.AmneziaVPN
+
+
diff --git a/client/macos/networkextension/PrivacyInfo.xcprivacy b/client/macos/networkextension/PrivacyInfo.xcprivacy
new file mode 100644
index 00000000..380e0b7b
--- /dev/null
+++ b/client/macos/networkextension/PrivacyInfo.xcprivacy
@@ -0,0 +1,25 @@
+
+
+
+
+ NSPrivacyAccessedAPITypes
+
+
+ NSPrivacyAccessedAPIType
+ NSPrivacyAccessedAPICategoryUserDefaults
+ NSPrivacyAccessedAPITypeReasons
+
+ 1C8F.1
+
+
+
+ NSPrivacyAccessedAPIType
+ NSPrivacyAccessedAPICategoryFileTimestamp
+ NSPrivacyAccessedAPITypeReasons
+
+ C617.1
+
+
+
+
+
diff --git a/client/macos/networkextension/WireGuardNetworkExtension-Bridging-Header.h b/client/macos/networkextension/WireGuardNetworkExtension-Bridging-Header.h
index 4ae7bded..2cca0fc8 100644
--- a/client/macos/networkextension/WireGuardNetworkExtension-Bridging-Header.h
+++ b/client/macos/networkextension/WireGuardNetworkExtension-Bridging-Header.h
@@ -1,10 +1,6 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include "macos/gobridge/wireguard.h"
#include "wireguard-go-version.h"
-#include "3rd/awg-apple/Sources/WireGuardKitC/WireGuardKitC.h"
+#include "3rd/amneziawg-apple/Sources/WireGuardKitGo/wireguard.h"
+#include "3rd/amneziawg-apple/Sources/WireGuardKitC/WireGuardKitC.h"
#include
#include
diff --git a/client/macos/networkextension/WireGuardNetworkExtension-Bridging-Header.h.bk b/client/macos/networkextension/WireGuardNetworkExtension-Bridging-Header.h.bk
new file mode 100644
index 00000000..4ae7bded
--- /dev/null
+++ b/client/macos/networkextension/WireGuardNetworkExtension-Bridging-Header.h.bk
@@ -0,0 +1,25 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "macos/gobridge/wireguard.h"
+#include "wireguard-go-version.h"
+#include "3rd/awg-apple/Sources/WireGuardKitC/WireGuardKitC.h"
+
+#include
+#include
+
+#define WG_KEY_LEN (32)
+#define WG_KEY_LEN_BASE64 (45)
+#define WG_KEY_LEN_HEX (65)
+
+void key_to_base64(char base64[WG_KEY_LEN_BASE64],
+ const uint8_t key[WG_KEY_LEN]);
+bool key_from_base64(uint8_t key[WG_KEY_LEN], const char* base64);
+
+void key_to_hex(char hex[WG_KEY_LEN_HEX], const uint8_t key[WG_KEY_LEN]);
+bool key_from_hex(uint8_t key[WG_KEY_LEN], const char* hex);
+
+bool key_eq(const uint8_t key1[WG_KEY_LEN], const uint8_t key2[WG_KEY_LEN]);
+
+void write_msg_to_log(const char* tag, const char* msg);
diff --git a/client/macos/networkextension/wireguard-go-version.h.in b/client/macos/networkextension/wireguard-go-version.h.in
new file mode 100644
index 00000000..860bc3c3
--- /dev/null
+++ b/client/macos/networkextension/wireguard-go-version.h.in
@@ -0,0 +1,3 @@
+#ifndef WIREGUARD_GO_VERSION
+#define WIREGUARD_GO_VERSION "@WG_VERSION_STRING@"
+#endif // WIREGUARD_GO_VERSION
\ No newline at end of file
diff --git a/client/macos/scripts/clangwrap.sh b/client/macos/scripts/clangwrap.sh
new file mode 100755
index 00000000..763187e3
--- /dev/null
+++ b/client/macos/scripts/clangwrap.sh
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+# go/clangwrap.sh
+
+SDK_PATH=`xcrun --sdk $SDK --show-sdk-path`
+CLANG=`xcrun --sdk $SDK --find clang`
+
+if [ "$GOARCH" == "amd64" ]; then
+ CARCH="x86_64"
+elif [ "$GOARCH" == "arm64" ]; then
+ CARCH="arm64"
+fi
+
+exec $CLANG -arch $CARCH -isysroot $SDK_PATH -mios-version-min=10.0 "$@"
diff --git a/client/macos/scripts/openvpn.sh b/client/macos/scripts/openvpn.sh
new file mode 100755
index 00000000..ce8f6054
--- /dev/null
+++ b/client/macos/scripts/openvpn.sh
@@ -0,0 +1,29 @@
+XCODEBUILD="/usr/bin/xcodebuild"
+WORKINGDIR=`pwd`
+PATCH="/usr/bin/patch"
+
+# Copy the Project.xcconfig settings to amnezia.xcconfig
+cat $WORKINGDIR/3rd/OpenVPNAdapter/Configuration/Project.xcconfig > $WORKINGDIR/3rd/OpenVPNAdapter/Configuration/amnezia.xcconfig
+
+# Append macOS-specific build directory configurations to amnezia.xcconfig
+cat << EOF >> $WORKINGDIR/3rd/OpenVPNAdapter/Configuration/amnezia.xcconfig
+PROJECT_TEMP_DIR = $WORKINGDIR/3rd/OpenVPNAdapter/build/OpenVPNAdapter.build
+CONFIGURATION_BUILD_DIR = $WORKINGDIR/3rd/OpenVPNAdapter/build/Release-macos
+BUILT_PRODUCTS_DIR = $WORKINGDIR/3rd/OpenVPNAdapter/build/Release-macos
+EOF
+
+# Fetch the current macOS SDK version dynamically
+MACOSX_SDK=macosx15.0
+cd 3rd/OpenVPNAdapter
+
+# Build for macOS using the correct SDK and destination
+if $XCODEBUILD -scheme OpenVPNAdapter -configuration Release -xcconfig Configuration/amnezia.xcconfig -sdk $MACOSX_SDK -destination 'generic/platform=macOS' -project OpenVPNAdapter.xcodeproj ; then
+ echo "OpenVPNAdapter built successfully for macOS"
+else
+ echo "OpenVPNAdapter macOS build failed ..."
+fi
+
+# Remove CodeSignature if needed for macOS
+rm -rf ./build/Release-macos/OpenVPNAdapter.framework/Versions/A/_CodeSignature
+
+cd ../../
diff --git a/client/platforms/ios/HevSocksTunnel.swift b/client/platforms/ios/HevSocksTunnel.swift
index a86a0758..1b914218 100644
--- a/client/platforms/ios/HevSocksTunnel.swift
+++ b/client/platforms/ios/HevSocksTunnel.swift
@@ -1,4 +1,5 @@
-import HevSocks5Tunnel
+import Darwin
+import SystemConfiguration
public enum Socks5Tunnel {
@@ -6,23 +7,23 @@ public enum Socks5Tunnel {
var ctlInfo = ctl_info()
withUnsafeMutablePointer(to: &ctlInfo.ctl_name) {
$0.withMemoryRebound(to: CChar.self, capacity: MemoryLayout.size(ofValue: $0.pointee)) {
- _ = strcpy($0, "com.apple.net.utun_control")
+ _ = strcpy($0, "com.apple.net.utun_control") // strcpy comes from Darwin
}
}
for fd: Int32 in 0...1024 {
var addr = sockaddr_ctl()
var ret: Int32 = -1
- var len = socklen_t(MemoryLayout.size(ofValue: addr))
+ var len = socklen_t(MemoryLayout.size(ofValue: addr)) // socklen_t comes from Darwin
withUnsafeMutablePointer(to: &addr) {
- $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {
- ret = getpeername(fd, $0, &len)
+ $0.withMemoryRebound(to: sockaddr.self, capacity: 1) { // sockaddr from Darwin
+ ret = getpeername(fd, $0, &len) // getpeername from Darwin
}
}
- if ret != 0 || addr.sc_family != AF_SYSTEM {
+ if ret != 0 || addr.sc_family != AF_SYSTEM { // AF_SYSTEM from Darwin
continue
}
if ctlInfo.ctl_id == 0 {
- ret = ioctl(fd, CTLIOCGINFO, &ctlInfo)
+ ret = ioctl(fd, CTLIOCGINFO, &ctlInfo) // ioctl from Darwin
if ret != 0 {
continue
}
@@ -38,12 +39,12 @@ public enum Socks5Tunnel {
guard let tunnelFileDescriptor = self.tunnelFileDescriptor else {
return nil
}
- var buffer = [UInt8](repeating: 0, count: Int(IFNAMSIZ))
+ var buffer = [UInt8](repeating: 0, count: Int(IFNAMSIZ)) // IFNAMSIZ from Darwin
return buffer.withUnsafeMutableBufferPointer { mutableBufferPointer in
guard let baseAddress = mutableBufferPointer.baseAddress else {
return nil
}
- var ifnameSize = socklen_t(IFNAMSIZ)
+ var ifnameSize = socklen_t(IFNAMSIZ) // socklen_t and IFNAMSIZ from Darwin
let result = getsockopt(
tunnelFileDescriptor,
2 /* SYSPROTO_CONTROL */,
diff --git a/client/platforms/ios/QRCodeReaderBase.h b/client/platforms/ios/QRCodeReaderBase.h
index 29a4946d..83a766d0 100644
--- a/client/platforms/ios/QRCodeReaderBase.h
+++ b/client/platforms/ios/QRCodeReaderBase.h
@@ -8,14 +8,6 @@ class QRCodeReader: public QObject {
Q_OBJECT
public:
- QRCodeReader();
-
- QRect cameraSize();
-
-public slots:
- void startReading();
- void stopReading();
- void setCameraSize(QRect value);
signals:
void codeReaded(QString code);
diff --git a/client/platforms/ios/QRCodeReaderBase.mm b/client/platforms/ios/QRCodeReaderBase.mm
index af879e2f..e08feb74 100644
--- a/client/platforms/ios/QRCodeReaderBase.mm
+++ b/client/platforms/ios/QRCodeReaderBase.mm
@@ -1,12 +1,12 @@
#include "QRCodeReaderBase.h"
-#import
+//#import
#import
-@interface QRCodeReaderImpl : UIViewController
-@end
+//@interface QRCodeReaderImpl : UIViewController
+//@end
-@interface QRCodeReaderImpl ()
+/*@interface QRCodeReaderImpl ()
@property (nonatomic) QRCodeReader* qrCodeReader;
@property (nonatomic, strong) AVCaptureSession *captureSession;
@property (nonatomic, strong) AVCaptureVideoPreviewLayer *videoPreviewPlayer;
@@ -15,15 +15,15 @@
@implementation QRCodeReaderImpl
-- (void)viewDidLoad {
- [super viewDidLoad];
+//- (void)viewDidLoad {
+// [super viewDidLoad];
- _captureSession = nil;
-}
+// _captureSession = nil;
+//}
-- (void)setQrCodeReader: (QRCodeReader*)value {
- _qrCodeReader = value;
-}
+//- (void)setQrCodeReader: (QRCodeReader*)value {
+// _qrCodeReader = value;
+//}
- (BOOL)startReading {
NSError *error;
@@ -49,7 +49,7 @@
_videoPreviewPlayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession: _captureSession];
- CGFloat statusBarHeight = [UIApplication sharedApplication].statusBarFrame.size.height;
+ //CGFloat statusBarHeight = [UIApplication sharedApplication].statusBarFrame.size.height;
QRect cameraRect = _qrCodeReader->cameraSize();
CGRect cameraCGRect = CGRectMake(cameraRect.x(),
@@ -60,7 +60,7 @@
[_videoPreviewPlayer setVideoGravity: AVLayerVideoGravityResizeAspectFill];
[_videoPreviewPlayer setFrame: cameraCGRect];
- CALayer* layer = [UIApplication sharedApplication].keyWindow.layer;
+ // CALayer* layer = [UIApplication sharedApplication].keyWindow.layer;
[layer addSublayer: _videoPreviewPlayer];
[_captureSession startRunning];
@@ -107,4 +107,4 @@ void QRCodeReader::startReading() {
void QRCodeReader::stopReading() {
[m_qrCodeReader stopReading];
-}
+}*/
diff --git a/client/platforms/ios/QtAppDelegate.h b/client/platforms/ios/QtAppDelegate.h
index c2c1d2d3..19978965 100644
--- a/client/platforms/ios/QtAppDelegate.h
+++ b/client/platforms/ios/QtAppDelegate.h
@@ -1,4 +1,4 @@
-#import
+//#import
@interface QIOSApplicationDelegate
@end
diff --git a/client/platforms/ios/QtAppDelegate.mm b/client/platforms/ios/QtAppDelegate.mm
index bd7ad6b1..2ac7e612 100644
--- a/client/platforms/ios/QtAppDelegate.mm
+++ b/client/platforms/ios/QtAppDelegate.mm
@@ -6,7 +6,7 @@
@implementation QIOSApplicationDelegate (AmneziaVPNDelegate)
-- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
+/*- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[application setMinimumBackgroundFetchInterval: UIApplicationBackgroundFetchIntervalMinimum];
// Override point for customization after application launch.
@@ -56,6 +56,6 @@
return YES;
}
return NO;
-}
+}*/
@end
diff --git a/client/platforms/ios/ScreenProtection.swift b/client/platforms/ios/ScreenProtection.swift
index 1355dc13..1e85479b 100644
--- a/client/platforms/ios/ScreenProtection.swift
+++ b/client/platforms/ios/ScreenProtection.swift
@@ -1,87 +1,10 @@
-import UIKit
+//import UIKit
public func toggleScreenshots(_ isEnabled: Bool) {
- let window = UIApplication.shared.keyWindows.first!
-
- if isEnabled {
- ScreenProtection.shared.disable(for: window.rootViewController!.view)
- } else {
- ScreenProtection.shared.enable(for: window.rootViewController!.view)
- }
-}
-
-extension UIApplication {
- var keyWindows: [UIWindow] {
- connectedScenes
- .compactMap {
- if #available(iOS 15.0, *) {
- ($0 as? UIWindowScene)?.keyWindow
- } else {
- ($0 as? UIWindowScene)?.windows.first { $0.isKeyWindow }
- }
- }
- }
+
}
class ScreenProtection {
- public static let shared = ScreenProtection()
- var pairs = [ProtectionPair]()
- private var blurView: UIVisualEffectView?
- private var recordingObservation: NSKeyValueObservation?
-
- public func enable(for view: UIView) {
- DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
- view.subviews.forEach {
- self.pairs.append(ProtectionPair(from: $0))
- }
- }
- }
-
- public func disable(for view: UIView) {
- DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
- self.pairs.forEach {
- $0.removeProtection()
- }
-
- self.pairs.removeAll()
- }
- }
-}
-
-struct ProtectionPair {
- let textField: UITextField
- let layer: CALayer
-
- init(from view: UIView) {
- let secureTextField = UITextField()
- secureTextField.backgroundColor = .clear
- secureTextField.translatesAutoresizingMaskIntoConstraints = false
- secureTextField.isSecureTextEntry = true
-
- view.insertSubview(secureTextField, at: 0)
- secureTextField.isUserInteractionEnabled = false
-
- view.layer.superlayer?.addSublayer(secureTextField.layer)
- secureTextField.layer.sublayers?.last?.addSublayer(view.layer)
-
- secureTextField.topAnchor.constraint(equalTo: view.topAnchor, constant: 0).isActive = true
- secureTextField.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true
- secureTextField.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0).isActive = true
- secureTextField.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0).isActive = true
-
- self.init(textField: secureTextField, layer: view.layer)
- }
-
- init(textField: UITextField, layer: CALayer) {
- self.textField = textField
- self.layer = layer
- }
-
- func removeProtection() {
- textField.superview?.superview?.layer.addSublayer(layer)
- textField.layer.removeFromSuperlayer()
- textField.removeFromSuperview()
- }
}
diff --git a/client/platforms/ios/ios_controller.mm b/client/platforms/ios/ios_controller.mm
index a2819c6c..7308b178 100644
--- a/client/platforms/ios/ios_controller.mm
+++ b/client/platforms/ios/ios_controller.mm
@@ -11,6 +11,8 @@
#include "../protocols/vpnprotocol.h"
#import "ios_controller_wrapper.h"
+#include
+
const char* Action::start = "start";
const char* Action::restart = "restart";
const char* Action::stop = "stop";
@@ -27,14 +29,34 @@ const char* MessageKey::isOnDemand = "is-on-demand";
const char* MessageKey::SplitTunnelType = "SplitTunnelType";
const char* MessageKey::SplitTunnelSites = "SplitTunnelSites";
-static UIViewController* getViewController() {
- NSArray *windows = [[UIApplication sharedApplication]windows];
- for (UIWindow *window in windows) {
- if (window.isKeyWindow) {
- return window.rootViewController;
- }
+//static UIViewController* getViewController() {
+// NSArray *windows = [[UIApplication sharedApplication]windows];
+// for (UIWindow *window in windows) {
+// if (window.isKeyWindow) {
+// return window.rootViewController;
+// }
+// }
+// return nil;
+//}
+
+OSStatus requestAuthorization() {
+ AuthorizationRef authRef;
+ OSStatus status = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, kAuthorizationFlagDefaults, &authRef);
+ if (status != errAuthorizationSuccess) {
+ qDebug() << "Authorization failed with status:" << status;
+ return status;
}
- return nil;
+
+ AuthorizationItem authItem = {kAuthorizationRightExecute, 0, NULL, 0};
+ AuthorizationRights authRights = {1, &authItem};
+ AuthorizationFlags flags = kAuthorizationFlagDefaults | kAuthorizationFlagInteractionAllowed | kAuthorizationFlagExtendRights;
+
+ status = AuthorizationCopyRights(authRef, &authRights, NULL, flags, NULL);
+ if (status != errAuthorizationSuccess) {
+ qDebug() << "Authorization rights copy failed with status:" << status;
+ }
+
+ return status;
}
Vpn::ConnectionState iosStatusToState(NEVPNStatus status) {
@@ -84,6 +106,11 @@ IosController* IosController::Instance() {
bool IosController::initialize()
{
+ if (requestAuthorization() != errAuthorizationSuccess) {
+ emit connectionStateChanged(Vpn::ConnectionState::Error);
+ return false;
+ }
+
__block bool ok = true;
[NETunnelProviderManager loadAllFromPreferencesWithCompletionHandler:^(NSArray * _Nullable managers, NSError * _Nullable error) {
@try {
@@ -748,24 +775,24 @@ bool IosController::shareText(const QStringList& filesToSend) {
[sharingItems addObject:logFileUrl];
}
- UIViewController *qtController = getViewController();
- if (!qtController) return;
+ // UIViewController *qtController = getViewController();
+ // if (!qtController) return;
- UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:sharingItems applicationActivities:nil];
+ // UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:sharingItems applicationActivities:nil];
__block bool isAccepted = false;
- [activityController setCompletionWithItemsHandler:^(NSString *activityType, BOOL completed, NSArray *returnedItems, NSError *activityError) {
- isAccepted = completed;
- emit finished();
- }];
+ // [activityController setCompletionWithItemsHandler:^(NSString *activityType, BOOL completed, NSArray *returnedItems, NSError *activityError) {
+ // isAccepted = completed;
+ // emit finished();
+ // }];
- [qtController presentViewController:activityController animated:YES completion:nil];
- UIPopoverPresentationController *popController = activityController.popoverPresentationController;
- if (popController) {
- popController.sourceView = qtController.view;
- popController.sourceRect = CGRectMake(100, 100, 100, 100);
- }
+// [qtController presentViewController:activityController animated:YES completion:nil];
+// UIPopoverPresentationController *popController = activityController.popoverPresentationController;
+// if (popController) {
+// popController.sourceView = qtController.view;
+// popController.sourceRect = CGRectMake(100, 100, 100, 100);
+// }
QEventLoop wait;
QObject::connect(this, &IosController::finished, &wait, &QEventLoop::quit);
@@ -775,26 +802,26 @@ bool IosController::shareText(const QStringList& filesToSend) {
}
QString IosController::openFile() {
- UIDocumentPickerViewController *documentPicker = [[UIDocumentPickerViewController alloc] initWithDocumentTypes:@[@"public.item"] inMode:UIDocumentPickerModeOpen];
+ // UIDocumentPickerViewController *documentPicker = [[UIDocumentPickerViewController alloc] initWithDocumentTypes:@[@"public.item"] inMode:UIDocumentPickerModeOpen];
- DocumentPickerDelegate *documentPickerDelegate = [[DocumentPickerDelegate alloc] init];
- documentPicker.delegate = documentPickerDelegate;
+ // DocumentPickerDelegate *documentPickerDelegate = [[DocumentPickerDelegate alloc] init];
+ // documentPicker.delegate = documentPickerDelegate;
- UIViewController *qtController = getViewController();
- if (!qtController) return;
+ // UIViewController *qtController = getViewController();
+ // if (!qtController) return;
- [qtController presentViewController:documentPicker animated:YES completion:nil];
+ // [qtController presentViewController:documentPicker animated:YES completion:nil];
__block QString filePath;
- documentPickerDelegate.documentPickerClosedCallback = ^(NSString *path) {
- if (path) {
- filePath = QString::fromUtf8(path.UTF8String);
- } else {
- filePath = QString();
- }
- emit finished();
- };
+ // documentPickerDelegate.documentPickerClosedCallback = ^(NSString *path) {
+ // if (path) {
+ // filePath = QString::fromUtf8(path.UTF8String);
+ // } else {
+ // filePath = QString();
+ // }
+ // emit finished();
+ // };
QEventLoop wait;
QObject::connect(this, &IosController::finished, &wait, &QEventLoop::quit);
diff --git a/client/platforms/ios/ios_controller_wrapper.h b/client/platforms/ios/ios_controller_wrapper.h
index f0333d77..106880e8 100644
--- a/client/platforms/ios/ios_controller_wrapper.h
+++ b/client/platforms/ios/ios_controller_wrapper.h
@@ -1,7 +1,7 @@
#import
#import
#import
-#include
+//#include
#include
class IosController;
@@ -18,8 +18,8 @@ class IosController;
typedef void (^DocumentPickerClosedCallback)(NSString *path);
-@interface DocumentPickerDelegate : NSObject
+//@interface DocumentPickerDelegate : NSObject
-@property (nonatomic, copy) DocumentPickerClosedCallback documentPickerClosedCallback;
+//@property (nonatomic, copy) DocumentPickerClosedCallback documentPickerClosedCallback;
-@end
+//@end
diff --git a/client/platforms/ios/ios_controller_wrapper.mm b/client/platforms/ios/ios_controller_wrapper.mm
index 1f8c938f..f5aa3e4f 100644
--- a/client/platforms/ios/ios_controller_wrapper.mm
+++ b/client/platforms/ios/ios_controller_wrapper.mm
@@ -26,20 +26,20 @@
@end
-@implementation DocumentPickerDelegate
+//@implementation DocumentPickerDelegate
-- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentsAtURLs:(NSArray *)urls {
- for (NSURL *url in urls) {
- if (self.documentPickerClosedCallback) {
- self.documentPickerClosedCallback([url path]);
- }
- }
-}
+//- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentsAtURLs:(NSArray *)urls {
+// for (NSURL *url in urls) {
+// if (self.documentPickerClosedCallback) {
+// self.documentPickerClosedCallback([url path]);
+// }
+// }
+//}
-- (void)documentPickerWasCancelled:(UIDocumentPickerViewController *)controller {
- if (self.documentPickerClosedCallback) {
- self.documentPickerClosedCallback(nil);
- }
-}
+//- (void)documentPickerWasCancelled:(UIDocumentPickerViewController *)controller {
+// if (self.documentPickerClosedCallback) {
+// self.documentPickerClosedCallback(nil);
+// }
+//}
-@end
\ No newline at end of file
+//@end
diff --git a/client/platforms/ios/iosnotificationhandler.mm b/client/platforms/ios/iosnotificationhandler.mm
index efa48385..5759c892 100644
--- a/client/platforms/ios/iosnotificationhandler.mm
+++ b/client/platforms/ios/iosnotificationhandler.mm
@@ -6,8 +6,9 @@
#import
#import
-#import
+//#import
+/*
@interface IOSNotificationDelegate
: UIResponder {
IOSNotificationHandler* m_iosNotificationHandler;
@@ -86,4 +87,4 @@ void IOSNotificationHandler::notify(NotificationHandler::Message type, const QSt
NSLog(@"Local Notification failed");
}
}];
-}
+}*/
diff --git a/client/platforms/macos/HevSocksTunnel.swift b/client/platforms/macos/HevSocksTunnel.swift
new file mode 100644
index 00000000..1b914218
--- /dev/null
+++ b/client/platforms/macos/HevSocksTunnel.swift
@@ -0,0 +1,74 @@
+import Darwin
+import SystemConfiguration
+
+public enum Socks5Tunnel {
+
+ private static var tunnelFileDescriptor: Int32? {
+ var ctlInfo = ctl_info()
+ withUnsafeMutablePointer(to: &ctlInfo.ctl_name) {
+ $0.withMemoryRebound(to: CChar.self, capacity: MemoryLayout.size(ofValue: $0.pointee)) {
+ _ = strcpy($0, "com.apple.net.utun_control") // strcpy comes from Darwin
+ }
+ }
+ for fd: Int32 in 0...1024 {
+ var addr = sockaddr_ctl()
+ var ret: Int32 = -1
+ var len = socklen_t(MemoryLayout.size(ofValue: addr)) // socklen_t comes from Darwin
+ withUnsafeMutablePointer(to: &addr) {
+ $0.withMemoryRebound(to: sockaddr.self, capacity: 1) { // sockaddr from Darwin
+ ret = getpeername(fd, $0, &len) // getpeername from Darwin
+ }
+ }
+ if ret != 0 || addr.sc_family != AF_SYSTEM { // AF_SYSTEM from Darwin
+ continue
+ }
+ if ctlInfo.ctl_id == 0 {
+ ret = ioctl(fd, CTLIOCGINFO, &ctlInfo) // ioctl from Darwin
+ if ret != 0 {
+ continue
+ }
+ }
+ if addr.sc_id == ctlInfo.ctl_id {
+ return fd
+ }
+ }
+ return nil
+ }
+
+ private static var interfaceName: String? {
+ guard let tunnelFileDescriptor = self.tunnelFileDescriptor else {
+ return nil
+ }
+ var buffer = [UInt8](repeating: 0, count: Int(IFNAMSIZ)) // IFNAMSIZ from Darwin
+ return buffer.withUnsafeMutableBufferPointer { mutableBufferPointer in
+ guard let baseAddress = mutableBufferPointer.baseAddress else {
+ return nil
+ }
+ var ifnameSize = socklen_t(IFNAMSIZ) // socklen_t and IFNAMSIZ from Darwin
+ let result = getsockopt(
+ tunnelFileDescriptor,
+ 2 /* SYSPROTO_CONTROL */,
+ 2 /* UTUN_OPT_IFNAME */,
+ baseAddress,
+ &ifnameSize
+ )
+ if result == 0 {
+ return String(cString: baseAddress)
+ } else {
+ return nil
+ }
+ }
+ }
+
+ @discardableResult
+ public static func run(withConfig filePath: String) -> Int32 {
+ guard let fileDescriptor = self.tunnelFileDescriptor else {
+ fatalError("Get tunnel file descriptor failed.")
+ }
+ return hev_socks5_tunnel_main(filePath.cString(using: .utf8), fileDescriptor)
+ }
+
+ public static func quit() {
+ hev_socks5_tunnel_quit()
+ }
+}
diff --git a/client/platforms/macos/Log.swift b/client/platforms/macos/Log.swift
new file mode 100644
index 00000000..d2222f9d
--- /dev/null
+++ b/client/platforms/macos/Log.swift
@@ -0,0 +1,122 @@
+import Foundation
+import os.log
+
+struct Log {
+ static let osLog = Logger()
+
+ private static let IsLoggingEnabledKey = "IsLoggingEnabled"
+ static var isLoggingEnabled: Bool {
+ get {
+ sharedUserDefaults.bool(forKey: IsLoggingEnabledKey)
+ }
+ set {
+ sharedUserDefaults.setValue(newValue, forKey: IsLoggingEnabledKey)
+ }
+ }
+
+ private static let appGroupID = "group.org.amnezia.AmneziaVPN"
+
+ static let appLogURL = {
+ let sharedContainerURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: appGroupID)!
+ return sharedContainerURL.appendingPathComponent("app.log", isDirectory: false)
+ }()
+
+ static let neLogURL = {
+ let sharedContainerURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: appGroupID)!
+ return sharedContainerURL.appendingPathComponent("ne.log", isDirectory: false)
+ }()
+
+ private static var sharedUserDefaults = {
+ UserDefaults(suiteName: appGroupID)!
+ }()
+
+ static let dateFormatter: DateFormatter = {
+ let dateFormatter = DateFormatter()
+ dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
+ return dateFormatter
+ }()
+
+ var records = [Record]()
+
+ var lastRecordDate = Date.distantPast
+
+ init() {
+ self.records = []
+ }
+
+ init(_ str: String) {
+ records = str.split(whereSeparator: \.isNewline)
+ .map {
+ if let record = Record(String($0)) {
+ lastRecordDate = record.date
+ return record
+ } else {
+ return Record(date: lastRecordDate, level: .error, message: "LOG: \($0)")
+ }
+ }
+ }
+
+ init?(at url: URL) {
+ if !FileManager.default.fileExists(atPath: url.path) {
+ guard (try? "".data(using: .utf8)?.write(to: url)) != nil else { return nil }
+ }
+
+ guard let fileHandle = try? FileHandle(forUpdating: url) else { return nil }
+
+ defer { fileHandle.closeFile() }
+
+ guard
+ let data = try? fileHandle.readToEnd(),
+ let str = String(data: data, encoding: .utf8) else {
+ return nil
+ }
+
+ self.init(str)
+ }
+
+ static func log(_ type: OSLogType, title: String = "", message: String, url: URL = neLogURL) {
+ NSLog("\(title) \(message)")
+
+ guard isLoggingEnabled else { return }
+
+ osLog.log(level: type, "\(title) \(message)")
+
+ let date = Date()
+ let level = Record.Level(from: type)
+ let messages = message.split(whereSeparator: \.isNewline)
+
+ for index in 0.. std.string {
+ let qtLog = Log(String(describing: qtString))
+ var log = qtLog
+
+ if let appLog = Log(at: Log.appLogURL) {
+ appLog.records.forEach {
+ log.records.append($0)
+ }
+ }
+
+ if let neLog = Log(at: Log.neLogURL) {
+ neLog.records.forEach {
+ log.records.append($0)
+ }
+ }
+
+ log.records.sort {
+ $0.date < $1.date
+ }
+
+ return std.string(log.description)
+}
+
+public func swiftDeleteLog() {
+ Log.clear(at: Log.appLogURL)
+ Log.clear(at: Log.neLogURL)
+}
+
+public func toggleLogging(_ isEnabled: Bool) {
+ Log.isLoggingEnabled = isEnabled
+}
diff --git a/client/platforms/macos/LogRecord.swift b/client/platforms/macos/LogRecord.swift
new file mode 100644
index 00000000..658d10cf
--- /dev/null
+++ b/client/platforms/macos/LogRecord.swift
@@ -0,0 +1,103 @@
+import Foundation
+import os.log
+
+extension Log {
+ struct Record {
+ let date: Date
+ let level: Level
+ let message: String
+
+ init?(_ str: String) {
+ let dateStr = String(str.prefix(19))
+ guard let date = Log.dateFormatter.date(from: dateStr) else { return nil }
+
+ let str = str.dropFirst(20)
+
+ guard let endIndex = str.firstIndex(of: " ") else { return nil }
+ let levelStr = String(str[str.startIndex.. Void) {
+ guard let protocolConfiguration = self.protocolConfiguration as? NETunnelProviderProtocol,
+ let providerConfiguration = protocolConfiguration.providerConfiguration,
+ let openVPNConfigData = providerConfiguration[Constants.ovpnConfigKey] as? Data else {
+ ovpnLog(.error, message: "Can't start")
+ return
+ }
+
+ do {
+ let openVPNConfig = try JSONDecoder().decode(OpenVPNConfig.self, from: openVPNConfigData)
+ ovpnLog(.info, title: "config: ", message: openVPNConfig.str)
+ let ovpnConfiguration = Data(openVPNConfig.config.utf8)
+ setupAndlaunchOpenVPN(withConfig: ovpnConfiguration, completionHandler: completionHandler)
+ } catch {
+ ovpnLog(.error, message: "Can't parse config: \(error.localizedDescription)")
+
+ if let underlyingError = (error as NSError).userInfo[NSUnderlyingErrorKey] as? NSError {
+ ovpnLog(.error, message: "Can't parse config: \(underlyingError.localizedDescription)")
+ }
+
+ return
+ }
+ }
+
+ private func setupAndlaunchOpenVPN(withConfig ovpnConfiguration: Data,
+ withShadowSocks viaSS: Bool = false,
+ completionHandler: @escaping (Error?) -> Void) {
+ ovpnLog(.info, message: "Setup and launch")
+
+ let str = String(decoding: ovpnConfiguration, as: UTF8.self)
+
+ let configuration = OpenVPNConfiguration()
+ configuration.fileContent = ovpnConfiguration
+ if str.contains("cloak") {
+ configuration.setPTCloak()
+ }
+
+ let evaluation: OpenVPNConfigurationEvaluation?
+ do {
+ ovpnAdapter = OpenVPNAdapter()
+ ovpnAdapter?.delegate = self
+ evaluation = try ovpnAdapter?.apply(configuration: configuration)
+
+ } catch {
+ completionHandler(error)
+ return
+ }
+
+ if evaluation?.autologin == false {
+ ovpnLog(.info, message: "Implement login with user credentials")
+ }
+
+ vpnReachability.startTracking { [weak self] status in
+ guard status == .reachableViaWiFi else { return }
+ self?.ovpnAdapter?.reconnect(afterTimeInterval: 5)
+ }
+
+ startHandler = completionHandler
+ ovpnAdapter?.connect(using: packetFlow)
+ }
+
+ func handleOpenVPNStatusMessage(_ messageData: Data, completionHandler: ((Data?) -> Void)? = nil) {
+ guard let completionHandler = completionHandler else { return }
+ let bytesin = ovpnAdapter?.transportStatistics.bytesIn
+ let bytesout = ovpnAdapter?.transportStatistics.bytesOut
+
+ guard let bytesin, let bytesout else {
+ completionHandler(nil)
+ return
+ }
+
+ let response: [String: Any] = [
+ "rx_bytes": bytesin,
+ "tx_bytes": bytesout
+ ]
+
+ completionHandler(try? JSONSerialization.data(withJSONObject: response, options: []))
+ }
+
+ func stopOpenVPN(with reason: NEProviderStopReason, completionHandler: @escaping () -> Void) {
+ ovpnLog(.info, message: "Stopping tunnel: reason: \(reason.description)")
+
+ stopHandler = completionHandler
+ if vpnReachability.isTracking {
+ vpnReachability.stopTracking()
+ }
+ ovpnAdapter?.disconnect()
+ }
+}
+
+extension PacketTunnelProvider: OpenVPNAdapterDelegate {
+ // OpenVPNAdapter calls this delegate method to configure a VPN tunnel.
+ // `completionHandler` callback requires an object conforming to `OpenVPNAdapterPacketFlow`
+ // protocol if the tunnel is configured without errors. Otherwise send nil.
+ // `OpenVPNAdapterPacketFlow` method signatures are similar to `NEPacketTunnelFlow` so
+ // you can just extend that class to adopt `OpenVPNAdapterPacketFlow` protocol and
+ // send `self.packetFlow` to `completionHandler` callback.
+ func openVPNAdapter(
+ _ openVPNAdapter: OpenVPNAdapter,
+ configureTunnelWithNetworkSettings networkSettings: NEPacketTunnelNetworkSettings?,
+ completionHandler: @escaping (Error?) -> Void
+ ) {
+ // In order to direct all DNS queries first to the VPN DNS servers before the primary DNS servers
+ // send empty string to NEDNSSettings.matchDomains
+ networkSettings?.dnsSettings?.matchDomains = [""]
+
+ if splitTunnelType == 1 {
+ var ipv4IncludedRoutes = [NEIPv4Route]()
+
+ guard let splitTunnelSites else {
+ completionHandler(NSError(domain: "Split tunnel sited not setted up", code: 0))
+ return
+ }
+
+ for allowedIPString in splitTunnelSites {
+ if let allowedIP = IPAddressRange(from: allowedIPString) {
+ ipv4IncludedRoutes.append(NEIPv4Route(
+ destinationAddress: "\(allowedIP.address)",
+ subnetMask: "\(allowedIP.subnetMask())"))
+ }
+ }
+
+ networkSettings?.ipv4Settings?.includedRoutes = ipv4IncludedRoutes
+ } else {
+ if splitTunnelType == 2 {
+ var ipv4ExcludedRoutes = [NEIPv4Route]()
+ var ipv4IncludedRoutes = [NEIPv4Route]()
+ var ipv6IncludedRoutes = [NEIPv6Route]()
+
+ guard let splitTunnelSites else {
+ completionHandler(NSError(domain: "Split tunnel sited not setted up", code: 0))
+ return
+ }
+
+ for excludeIPString in splitTunnelSites {
+ if let excludeIP = IPAddressRange(from: excludeIPString) {
+ ipv4ExcludedRoutes.append(NEIPv4Route(
+ destinationAddress: "\(excludeIP.address)",
+ subnetMask: "\(excludeIP.subnetMask())"))
+ }
+ }
+
+ if let allIPv4 = IPAddressRange(from: "0.0.0.0/0") {
+ ipv4IncludedRoutes.append(NEIPv4Route(
+ destinationAddress: "\(allIPv4.address)",
+ subnetMask: "\(allIPv4.subnetMask())"))
+ }
+ if let allIPv6 = IPAddressRange(from: "::/0") {
+ ipv6IncludedRoutes.append(NEIPv6Route(
+ destinationAddress: "\(allIPv6.address)",
+ networkPrefixLength: NSNumber(value: allIPv6.networkPrefixLength)))
+ }
+ networkSettings?.ipv4Settings?.includedRoutes = ipv4IncludedRoutes
+ networkSettings?.ipv6Settings?.includedRoutes = ipv6IncludedRoutes
+ networkSettings?.ipv4Settings?.excludedRoutes = ipv4ExcludedRoutes
+ }
+ }
+
+ // Set the network settings for the current tunneling session.
+ setTunnelNetworkSettings(networkSettings, completionHandler: completionHandler)
+ }
+
+ // Process events returned by the OpenVPN library
+ func openVPNAdapter(
+ _ openVPNAdapter: OpenVPNAdapter,
+ handleEvent event: OpenVPNAdapterEvent,
+ message: String?) {
+ switch event {
+ case .connected:
+ if reasserting {
+ reasserting = false
+ }
+
+ guard let startHandler = startHandler else { return }
+
+ startHandler(nil)
+ self.startHandler = nil
+ case .disconnected:
+ guard let stopHandler = stopHandler else { return }
+
+ if vpnReachability.isTracking {
+ vpnReachability.stopTracking()
+ }
+
+ stopHandler()
+ self.stopHandler = nil
+ case .reconnecting:
+ reasserting = true
+ default:
+ break
+ }
+ }
+
+ // Handle errors thrown by the OpenVPN library
+ func openVPNAdapter(_ openVPNAdapter: OpenVPNAdapter, handleError error: Error) {
+ // Handle only fatal errors
+ guard let fatal = (error as NSError).userInfo[OpenVPNAdapterErrorFatalKey] as? Bool,
+ fatal == true else { return }
+
+ if vpnReachability.isTracking {
+ vpnReachability.stopTracking()
+ }
+
+ if let startHandler {
+ startHandler(error)
+ self.startHandler = nil
+ } else {
+ cancelTunnelWithError(error)
+ }
+ }
+
+ // Use this method to process any log message returned by OpenVPN library.
+ func openVPNAdapter(_ openVPNAdapter: OpenVPNAdapter, handleLogMessage logMessage: String) {
+ // Handle log messages
+ ovpnLog(.info, message: logMessage)
+ }
+}
+
+extension NEPacketTunnelFlow: OpenVPNAdapterPacketFlow {}
diff --git a/client/platforms/macos/PacketTunnelProvider+WireGuard.swift b/client/platforms/macos/PacketTunnelProvider+WireGuard.swift
new file mode 100644
index 00000000..18200c7f
--- /dev/null
+++ b/client/platforms/macos/PacketTunnelProvider+WireGuard.swift
@@ -0,0 +1,187 @@
+import Foundation
+import NetworkExtension
+
+extension PacketTunnelProvider {
+ func startWireguard(activationAttemptId: String?,
+ errorNotifier: ErrorNotifier,
+ completionHandler: @escaping (Error?) -> Void) {
+ guard let protocolConfiguration = self.protocolConfiguration as? NETunnelProviderProtocol,
+ let providerConfiguration = protocolConfiguration.providerConfiguration,
+ let wgConfigData: Data = providerConfiguration[Constants.wireGuardConfigKey] as? Data else {
+ wg_log(.error, message: "Can't start, config missing")
+ completionHandler(nil)
+ return
+ }
+
+ do {
+ let wgConfig = try JSONDecoder().decode(WGConfig.self, from: wgConfigData)
+ let wgConfigStr = wgConfig.str
+ wg_log(.info, title: "config: ", message: wgConfig.redux)
+
+ let tunnelConfiguration = try TunnelConfiguration(fromWgQuickConfig: wgConfigStr)
+
+ if tunnelConfiguration.peers.first!.allowedIPs
+ .map({ $0.stringRepresentation })
+ .joined(separator: ", ") == "0.0.0.0/0, ::/0" {
+ if wgConfig.splitTunnelType == 1 {
+ for index in tunnelConfiguration.peers.indices {
+ tunnelConfiguration.peers[index].allowedIPs.removeAll()
+ var allowedIPs = [IPAddressRange]()
+
+ for allowedIPString in wgConfig.splitTunnelSites {
+ if let allowedIP = IPAddressRange(from: allowedIPString) {
+ allowedIPs.append(allowedIP)
+ }
+ }
+
+ tunnelConfiguration.peers[index].allowedIPs = allowedIPs
+ }
+ } else if wgConfig.splitTunnelType == 2 {
+ for index in tunnelConfiguration.peers.indices {
+ var excludeIPs = [IPAddressRange]()
+
+ for excludeIPString in wgConfig.splitTunnelSites {
+ if let excludeIP = IPAddressRange(from: excludeIPString) {
+ excludeIPs.append(excludeIP)
+ }
+ }
+
+ tunnelConfiguration.peers[index].excludeIPs = excludeIPs
+ }
+ }
+ }
+
+ wg_log(.info, message: "Starting tunnel from the " +
+ (activationAttemptId == nil ? "OS directly, rather than the app" : "app"))
+
+ // Start the tunnel
+ wgAdapter = WireGuardAdapter(with: self) { logLevel, message in
+ wg_log(logLevel.osLogLevel, message: message)
+ }
+
+ wgAdapter?.start(tunnelConfiguration: tunnelConfiguration) { [weak self] adapterError in
+ guard let adapterError else {
+ let interfaceName = self?.wgAdapter?.interfaceName ?? "unknown"
+ wg_log(.info, message: "Tunnel interface is \(interfaceName)")
+ completionHandler(nil)
+ return
+ }
+
+ switch adapterError {
+ case .cannotLocateTunnelFileDescriptor:
+ wg_log(.error, staticMessage: "Starting tunnel failed: could not determine file descriptor")
+ errorNotifier.notify(PacketTunnelProviderError.couldNotDetermineFileDescriptor)
+ completionHandler(PacketTunnelProviderError.couldNotDetermineFileDescriptor)
+ case .dnsResolution(let dnsErrors):
+ let hostnamesWithDnsResolutionFailure = dnsErrors.map { $0.address }
+ .joined(separator: ", ")
+ wg_log(.error, message:
+ "DNS resolution failed for the following hostnames: \(hostnamesWithDnsResolutionFailure)")
+ errorNotifier.notify(PacketTunnelProviderError.dnsResolutionFailure)
+ completionHandler(PacketTunnelProviderError.dnsResolutionFailure)
+ case .setNetworkSettings(let error):
+ wg_log(.error, message:
+ "Starting tunnel failed with setTunnelNetworkSettings returning \(error.localizedDescription)")
+ errorNotifier.notify(PacketTunnelProviderError.couldNotSetNetworkSettings)
+ completionHandler(PacketTunnelProviderError.couldNotSetNetworkSettings)
+ case .startWireGuardBackend(let errorCode):
+ wg_log(.error, message: "Starting tunnel failed with wgTurnOn returning \(errorCode)")
+ errorNotifier.notify(PacketTunnelProviderError.couldNotStartBackend)
+ completionHandler(PacketTunnelProviderError.couldNotStartBackend)
+ case .invalidState:
+ fatalError()
+ }
+ }
+ } catch {
+ wg_log(.error, message: "Can't parse WG config: \(error.localizedDescription)")
+ completionHandler(nil)
+ return
+ }
+ }
+
+ func handleWireguardStatusMessage(_ messageData: Data, completionHandler: ((Data?) -> Void)? = nil) {
+ guard let completionHandler = completionHandler else { return }
+ wgAdapter?.getRuntimeConfiguration { settings in
+ let components = settings!.components(separatedBy: "\n")
+
+ var settingsDictionary: [String: String] = [:]
+ for component in components {
+ let pair = component.components(separatedBy: "=")
+ if pair.count == 2 {
+ settingsDictionary[pair[0]] = pair[1]
+ }
+ }
+
+ let response: [String: Any] = [
+ "rx_bytes": settingsDictionary["rx_bytes"] ?? "0",
+ "tx_bytes": settingsDictionary["tx_bytes"] ?? "0"
+ ]
+
+ completionHandler(try? JSONSerialization.data(withJSONObject: response, options: []))
+ }
+ }
+
+ private func handleWireguardAppMessage(_ messageData: Data, completionHandler: ((Data?) -> Void)? = nil) {
+ guard let completionHandler = completionHandler else { return }
+ if messageData.count == 1 && messageData[0] == 0 {
+ wgAdapter?.getRuntimeConfiguration { settings in
+ var data: Data?
+ if let settings {
+ data = settings.data(using: .utf8)!
+ }
+ completionHandler(data)
+ }
+ } else if messageData.count >= 1 {
+ // Updates the tunnel configuration and responds with the active configuration
+ wg_log(.info, message: "Switching tunnel configuration")
+ guard let configString = String(data: messageData, encoding: .utf8)
+ else {
+ completionHandler(nil)
+ return
+ }
+
+ do {
+ let tunnelConfiguration = try TunnelConfiguration(fromWgQuickConfig: configString)
+ wgAdapter?.update(tunnelConfiguration: tunnelConfiguration) { [weak self] error in
+ if let error {
+ wg_log(.error, message: "Failed to switch tunnel configuration: \(error.localizedDescription)")
+ completionHandler(nil)
+ return
+ }
+
+ self?.wgAdapter?.getRuntimeConfiguration { settings in
+ var data: Data?
+ if let settings {
+ data = settings.data(using: .utf8)!
+ }
+ completionHandler(data)
+ }
+ }
+ } catch {
+ completionHandler(nil)
+ }
+ } else {
+ completionHandler(nil)
+ }
+ }
+
+ func stopWireguard(with reason: NEProviderStopReason, completionHandler: @escaping () -> Void) {
+ wg_log(.info, message: "Stopping tunnel: reason: \(reason.description)")
+
+ wgAdapter?.stop { error in
+ ErrorNotifier.removeLastErrorFile()
+
+ if let error {
+ wg_log(.error, message: "Failed to stop WireGuard adapter: \(error.localizedDescription)")
+ }
+ completionHandler()
+
+#if os(macOS)
+ // HACK: This is a filthy hack to work around Apple bug 32073323 (dup'd by us as 47526107).
+ // Remove it when they finally fix this upstream and the fix has been rolled out to
+ // sufficient quantities of users.
+ exit(0)
+#endif
+ }
+ }
+}
diff --git a/client/platforms/macos/PacketTunnelProvider+Xray.swift b/client/platforms/macos/PacketTunnelProvider+Xray.swift
new file mode 100644
index 00000000..277980d6
--- /dev/null
+++ b/client/platforms/macos/PacketTunnelProvider+Xray.swift
@@ -0,0 +1,166 @@
+import Foundation
+import NetworkExtension
+import WireGuardKitGo
+
+enum XrayErrors: Error {
+ case noXrayConfig
+ case cantSaveXrayConfig
+ case cantParseListenAndPort
+ case cantSaveHevSocksConfig
+}
+
+extension Constants {
+ static let cachesDirectory: URL = {
+ if let cachesDirectoryURL = FileManager.default.urls(for: .cachesDirectory,
+ in: .userDomainMask).first {
+ return cachesDirectoryURL
+ } else {
+ fatalError("Unable to retrieve caches directory.")
+ }
+ }()
+}
+
+extension PacketTunnelProvider {
+ func startXray(completionHandler: @escaping (Error?) -> Void) {
+
+ // Xray configuration
+ guard let protocolConfiguration = self.protocolConfiguration as? NETunnelProviderProtocol,
+ let providerConfiguration = protocolConfiguration.providerConfiguration,
+ let xrayConfigData = providerConfiguration[Constants.xrayConfigKey] as? Data else {
+ xrayLog(.error, message: "Can't get xray configuration")
+ completionHandler(XrayErrors.noXrayConfig)
+ return
+ }
+
+ // Tunnel settings
+ let ipv6Enabled = true
+ let hideVPNIcon = false
+
+ let settings = NEPacketTunnelNetworkSettings(tunnelRemoteAddress: "254.1.1.1")
+ settings.mtu = 9000
+
+ settings.ipv4Settings = {
+ let settings = NEIPv4Settings(addresses: ["198.18.0.1"], subnetMasks: ["255.255.0.0"])
+ settings.includedRoutes = [NEIPv4Route.default()]
+ return settings
+ }()
+
+ settings.ipv6Settings = {
+ guard ipv6Enabled else {
+ return nil
+ }
+ let settings = NEIPv6Settings(addresses: ["fd6e:a81b:704f:1211::1"], networkPrefixLengths: [64])
+ settings.includedRoutes = [NEIPv6Route.default()]
+ if hideVPNIcon {
+ settings.excludedRoutes = [NEIPv6Route(destinationAddress: "::", networkPrefixLength: 128)]
+ }
+ return settings
+ }()
+
+ let dns = ["8.8.4.4","1.1.1.1"]
+ settings.dnsSettings = NEDNSSettings(servers: dns)
+
+ do {
+ let port = 10808
+ let address = "::1"
+
+ let jsonDict = try JSONSerialization.jsonObject(with: xrayConfigData,
+ options: []) as? [String: Any]
+
+ guard var jsonDict else {
+ xrayLog(.error, message: "Can't parse address and port for hevSocks")
+ completionHandler(XrayErrors.cantParseListenAndPort)
+ return
+ }
+
+ if var inboundsArray = jsonDict["inbounds"] as? [[String: Any]], !inboundsArray.isEmpty {
+ inboundsArray[0]["port"] = port
+ inboundsArray[0]["listen"] = address
+ jsonDict["inbounds"] = inboundsArray
+ }
+
+ let updatedData = try JSONSerialization.data(withJSONObject: jsonDict, options: [])
+
+ setTunnelNetworkSettings(settings) { [weak self] error in
+ if let error {
+ completionHandler(error)
+ return
+ }
+
+ // Launch xray
+ self?.setupAndStartXray(configData: updatedData) { xrayError in
+ if let xrayError {
+ completionHandler(xrayError)
+ return
+ }
+
+ // Launch hevSocks
+ self?.setupAndRunTun2socks(configData: updatedData,
+ address: address,
+ port: port,
+ completionHandler: completionHandler)
+ }
+ }
+ } catch {
+ completionHandler(error)
+ return
+ }
+ }
+
+ func stopXray(completionHandler: () -> Void) {
+ Socks5Tunnel.quit()
+ LibXrayStopXray()
+ completionHandler()
+ }
+
+ private func setupAndStartXray(configData: Data,
+ completionHandler: @escaping (Error?) -> Void) {
+ let path = Constants.cachesDirectory.appendingPathComponent("config.json", isDirectory: false).path
+ guard FileManager.default.createFile(atPath: path, contents: configData) else {
+ xrayLog(.error, message: "Can't save xray configuration")
+ completionHandler(XrayErrors.cantSaveXrayConfig)
+ return
+ }
+
+ LibXrayRunXray(nil,
+ path,
+ Int64.max)
+
+ completionHandler(nil)
+ xrayLog(.info, message: "Xray started")
+ }
+
+ private func setupAndRunTun2socks(configData: Data,
+ address: String,
+ port: Int,
+ completionHandler: @escaping (Error?) -> Void) {
+ let config = """
+ tunnel:
+ mtu: 9000
+ socks5:
+ port: \(port)
+ address: \(address)
+ udp: 'udp'
+ misc:
+ task-stack-size: 20480
+ connect-timeout: 5000
+ read-write-timeout: 60000
+ log-file: stderr
+ log-level: error
+ limit-nofile: 65535
+ """
+
+ let configurationFilePath = Constants.cachesDirectory.appendingPathComponent("config.yml", isDirectory: false).path
+ guard FileManager.default.createFile(atPath: configurationFilePath, contents: config.data(using: .utf8)!) else {
+ xrayLog(.info, message: "Cant save hevSocks configuration")
+ completionHandler(XrayErrors.cantSaveHevSocksConfig)
+ return
+ }
+
+ DispatchQueue.global().async {
+ xrayLog(.info, message: "Hev socks started")
+ completionHandler(nil)
+ Socks5Tunnel.run(withConfig: configurationFilePath)
+ }
+ }
+}
diff --git a/client/platforms/macos/PacketTunnelProvider.swift b/client/platforms/macos/PacketTunnelProvider.swift
new file mode 100644
index 00000000..9a5a5846
--- /dev/null
+++ b/client/platforms/macos/PacketTunnelProvider.swift
@@ -0,0 +1,234 @@
+import Foundation
+import NetworkExtension
+import os
+import Darwin
+import OpenVPNAdapter
+
+enum TunnelProtoType: String {
+ case wireguard, openvpn, xray
+
+}
+
+struct Constants {
+ static let kDefaultPathKey = "defaultPath"
+ static let processQueueName = "org.amnezia.process-packets"
+ static let kActivationAttemptId = "activationAttemptId"
+ static let ovpnConfigKey = "ovpn"
+ static let xrayConfigKey = "xray"
+ static let wireGuardConfigKey = "wireguard"
+ static let loggerTag = "NET"
+
+ static let kActionStart = "start"
+ static let kActionRestart = "restart"
+ static let kActionStop = "stop"
+ static let kActionGetTunnelId = "getTunnelId"
+ static let kActionStatus = "status"
+ static let kActionIsServerReachable = "isServerReachable"
+ static let kMessageKeyAction = "action"
+ static let kMessageKeyTunnelId = "tunnelId"
+ static let kMessageKeyConfig = "config"
+ static let kMessageKeyErrorCode = "errorCode"
+ static let kMessageKeyHost = "host"
+ static let kMessageKeyPort = "port"
+ static let kMessageKeyOnDemand = "is-on-demand"
+ static let kMessageKeySplitTunnelType = "SplitTunnelType"
+ static let kMessageKeySplitTunnelSites = "SplitTunnelSites"
+}
+
+class PacketTunnelProvider: NEPacketTunnelProvider {
+ var wgAdapter: WireGuardAdapter?
+ var ovpnAdapter: OpenVPNAdapter?
+
+ var splitTunnelType: Int?
+ var splitTunnelSites: [String]?
+
+ let vpnReachability = OpenVPNReachability()
+
+ var startHandler: ((Error?) -> Void)?
+ var stopHandler: (() -> Void)?
+ var protoType: TunnelProtoType?
+
+ override func handleAppMessage(_ messageData: Data, completionHandler: ((Data?) -> Void)? = nil) {
+ guard let message = String(data: messageData, encoding: .utf8) else {
+ if let completionHandler {
+ completionHandler(nil)
+ }
+ return
+ }
+
+ neLog(.info, title: "App said: ", message: message)
+
+ guard let message = try? JSONSerialization.jsonObject(with: messageData, options: []) as? [String: Any] else {
+ neLog(.error, message: "Failed to serialize message from app")
+ return
+ }
+
+ guard let completionHandler else {
+ neLog(.error, message: "Missing message completion handler")
+ return
+ }
+
+ guard let action = message[Constants.kMessageKeyAction] as? String else {
+ neLog(.error, message: "Missing action key in app message")
+ completionHandler(nil)
+ return
+ }
+
+ if action == Constants.kActionStatus {
+ handleStatusAppMessage(messageData,
+ completionHandler: completionHandler)
+ }
+ }
+
+ override func startTunnel(options: [String : NSObject]? = nil,
+ completionHandler: @escaping ((any Error)?) -> Void) {
+ let activationAttemptId = options?[Constants.kActivationAttemptId] as? String
+ let errorNotifier = ErrorNotifier(activationAttemptId: activationAttemptId)
+
+ neLog(.info, message: "Start tunnel")
+
+ if let protocolConfiguration = protocolConfiguration as? NETunnelProviderProtocol {
+ let providerConfiguration = protocolConfiguration.providerConfiguration
+ if (providerConfiguration?[Constants.ovpnConfigKey] as? Data) != nil {
+ protoType = .openvpn
+ } else if (providerConfiguration?[Constants.wireGuardConfigKey] as? Data) != nil {
+ protoType = .wireguard
+ } else if (providerConfiguration?[Constants.xrayConfigKey] as? Data) != nil {
+ protoType = .xray
+ }
+ }
+
+ guard let protoType else {
+ let error = NSError(domain: "Protocol is not selected", code: 0)
+ completionHandler(error)
+ return
+ }
+
+ switch protoType {
+ case .wireguard:
+ startWireguard(activationAttemptId: activationAttemptId,
+ errorNotifier: errorNotifier,
+ completionHandler: completionHandler)
+ case .openvpn:
+ startOpenVPN(completionHandler: completionHandler)
+ case .xray:
+ startXray(completionHandler: completionHandler)
+
+ }
+ }
+
+
+ override func stopTunnel(with reason: NEProviderStopReason, completionHandler: @escaping () -> Void) {
+ guard let protoType else {
+ completionHandler()
+ return
+ }
+
+ switch protoType {
+ case .wireguard:
+ stopWireguard(with: reason,
+ completionHandler: completionHandler)
+ case .openvpn:
+ stopOpenVPN(with: reason,
+ completionHandler: completionHandler)
+ case .xray:
+ stopXray(completionHandler: completionHandler)
+ }
+ }
+
+ func handleStatusAppMessage(_ messageData: Data, completionHandler: ((Data?) -> Void)? = nil) {
+ guard let protoType else {
+ completionHandler?(nil)
+ return
+ }
+
+ switch protoType {
+ case .wireguard:
+ handleWireguardStatusMessage(messageData, completionHandler: completionHandler)
+ case .openvpn:
+ handleOpenVPNStatusMessage(messageData, completionHandler: completionHandler)
+ case .xray:
+ break;
+ }
+ }
+
+ // MARK: Network observing methods
+ override func observeValue(forKeyPath keyPath: String?,
+ of object: Any?,
+ change: [NSKeyValueChangeKey: Any]?,
+ context: UnsafeMutableRawPointer?) {
+ guard Constants.kDefaultPathKey != keyPath else { return }
+ // Since iOS 11, we have observed that this KVO event fires repeatedly when connecting over Wifi,
+ // even though the underlying network has not changed (i.e. `isEqualToPath` returns false),
+ // leading to "wakeup crashes" due to excessive network activity. Guard against false positives by
+ // comparing the paths' string description, which includes properties not exposed by the class
+ guard let lastPath: NWPath = change?[.oldKey] as? NWPath,
+ let defPath = defaultPath,
+ lastPath != defPath || lastPath.description != defPath.description else {
+ return
+ }
+ DispatchQueue.main.async { [weak self] in
+ guard let self, self.defaultPath != nil else { return }
+ self.handle(networkChange: self.defaultPath!) { _ in }
+ }
+ }
+
+ private func handle(networkChange changePath: NWPath, completion: @escaping (Error?) -> Void) {
+ wg_log(.info, message: "Tunnel restarted.")
+ startTunnel(options: nil, completionHandler: completion)
+ }
+}
+
+extension WireGuardLogLevel {
+ var osLogLevel: OSLogType {
+ switch self {
+ case .verbose:
+ return .debug
+ case .error:
+ return .error
+ }
+ }
+}
+
+extension NEProviderStopReason: CustomStringConvertible {
+ public var description: String {
+ switch self {
+ case .none:
+ return "No specific reason"
+ case .userInitiated:
+ return "The user stopped the NE"
+ case .providerFailed:
+ return "The NE failed to function correctly"
+ case .noNetworkAvailable:
+ return "No network connectivity is currently available"
+ case .unrecoverableNetworkChange:
+ return "The device’s network connectivity changed"
+ case .providerDisabled:
+ return "The NE was disabled"
+ case .authenticationCanceled:
+ return "The authentication process was canceled"
+ case .configurationFailed:
+ return "The VPNC is invalid"
+ case .idleTimeout:
+ return "The session timed out"
+ case .configurationDisabled:
+ return "The VPNC was disabled"
+ case .configurationRemoved:
+ return "The VPNC was removed"
+ case .superceded:
+ return "VPNC was superceded by a higher-priority VPNC"
+ case .userLogout:
+ return "The user logged out"
+ case .userSwitch:
+ return "The current console user changed"
+ case .connectionFailed:
+ return "The connection failed"
+ case .sleep:
+ return "A stop reason indicating the VPNC enabled disconnect on sleep and the device went to sleep"
+ case .appUpdate:
+ return "appUpdat"
+ @unknown default:
+ return "@unknown default"
+ }
+ }
+}
diff --git a/client/platforms/macos/QRCodeReaderBase.cpp b/client/platforms/macos/QRCodeReaderBase.cpp
new file mode 100644
index 00000000..c3148a85
--- /dev/null
+++ b/client/platforms/macos/QRCodeReaderBase.cpp
@@ -0,0 +1,14 @@
+#include "QRCodeReaderBase.h"
+
+QRCodeReader::QRCodeReader()
+{
+
+}
+
+QRect QRCodeReader::cameraSize() {
+ return QRect();
+}
+
+void QRCodeReader::startReading() {}
+void QRCodeReader::stopReading() {}
+void QRCodeReader::setCameraSize(QRect) {}
diff --git a/client/platforms/macos/QRCodeReaderBase.h b/client/platforms/macos/QRCodeReaderBase.h
new file mode 100644
index 00000000..83a766d0
--- /dev/null
+++ b/client/platforms/macos/QRCodeReaderBase.h
@@ -0,0 +1,20 @@
+#ifndef QRCODEREADERBASE_H
+#define QRCODEREADERBASE_H
+
+#include
+#include
+
+class QRCodeReader: public QObject {
+ Q_OBJECT
+
+public:
+
+signals:
+ void codeReaded(QString code);
+
+private:
+ void* m_qrCodeReader;
+ QRect m_cameraSize;
+};
+
+#endif // QRCODEREADERBASE_H
diff --git a/client/platforms/macos/QRCodeReaderBase.mm b/client/platforms/macos/QRCodeReaderBase.mm
new file mode 100644
index 00000000..e08feb74
--- /dev/null
+++ b/client/platforms/macos/QRCodeReaderBase.mm
@@ -0,0 +1,110 @@
+#include "QRCodeReaderBase.h"
+
+//#import
+#import
+
+//@interface QRCodeReaderImpl : UIViewController
+//@end
+
+/*@interface QRCodeReaderImpl ()
+@property (nonatomic) QRCodeReader* qrCodeReader;
+@property (nonatomic, strong) AVCaptureSession *captureSession;
+@property (nonatomic, strong) AVCaptureVideoPreviewLayer *videoPreviewPlayer;
+@end
+
+
+@implementation QRCodeReaderImpl
+
+//- (void)viewDidLoad {
+// [super viewDidLoad];
+
+// _captureSession = nil;
+//}
+
+//- (void)setQrCodeReader: (QRCodeReader*)value {
+// _qrCodeReader = value;
+//}
+
+- (BOOL)startReading {
+ NSError *error;
+
+ AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType: AVMediaTypeVideo];
+ AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice: captureDevice error: &error];
+
+ if(!deviceInput) {
+ NSLog(@"Error %@", error.localizedDescription);
+ return NO;
+ }
+
+ _captureSession = [[AVCaptureSession alloc]init];
+ [_captureSession addInput:deviceInput];
+
+ AVCaptureMetadataOutput *capturedMetadataOutput = [[AVCaptureMetadataOutput alloc] init];
+ [_captureSession addOutput:capturedMetadataOutput];
+
+ dispatch_queue_t dispatchQueue;
+ dispatchQueue = dispatch_queue_create("myQueue", NULL);
+ [capturedMetadataOutput setMetadataObjectsDelegate: self queue: dispatchQueue];
+ [capturedMetadataOutput setMetadataObjectTypes: [NSArray arrayWithObject:AVMetadataObjectTypeQRCode]];
+
+ _videoPreviewPlayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession: _captureSession];
+
+ //CGFloat statusBarHeight = [UIApplication sharedApplication].statusBarFrame.size.height;
+
+ QRect cameraRect = _qrCodeReader->cameraSize();
+ CGRect cameraCGRect = CGRectMake(cameraRect.x(),
+ cameraRect.y() + statusBarHeight,
+ cameraRect.width(),
+ cameraRect.height());
+
+ [_videoPreviewPlayer setVideoGravity: AVLayerVideoGravityResizeAspectFill];
+ [_videoPreviewPlayer setFrame: cameraCGRect];
+
+ // CALayer* layer = [UIApplication sharedApplication].keyWindow.layer;
+ [layer addSublayer: _videoPreviewPlayer];
+
+ [_captureSession startRunning];
+
+ return YES;
+}
+
+- (void)stopReading {
+ [_captureSession stopRunning];
+ _captureSession = nil;
+
+ [_videoPreviewPlayer removeFromSuperlayer];
+}
+
+- (void)captureOutput:(AVCaptureOutput *)output didOutputMetadataObjects:(NSArray<__kindof AVMetadataObject *> *)metadataObjects fromConnection:(AVCaptureConnection *)connection {
+
+ if (metadataObjects != nil && metadataObjects.count > 0) {
+ AVMetadataMachineReadableCodeObject *metadataObject = [metadataObjects objectAtIndex:0];
+
+ if ([[metadataObject type] isEqualToString: AVMetadataObjectTypeQRCode]) {
+ _qrCodeReader->emit codeReaded([metadataObject stringValue].UTF8String);
+ }
+ }
+}
+
+@end
+
+QRCodeReader::QRCodeReader() {
+ m_qrCodeReader = [[QRCodeReaderImpl alloc] init];
+ [m_qrCodeReader setQrCodeReader: this];
+}
+
+QRect QRCodeReader::cameraSize() {
+ return m_cameraSize;
+}
+
+void QRCodeReader::setCameraSize(QRect value) {
+ m_cameraSize = value;
+}
+
+void QRCodeReader::startReading() {
+ [m_qrCodeReader startReading];
+}
+
+void QRCodeReader::stopReading() {
+ [m_qrCodeReader stopReading];
+}*/
diff --git a/client/platforms/macos/QtAppDelegate-C-Interface.h b/client/platforms/macos/QtAppDelegate-C-Interface.h
new file mode 100644
index 00000000..dd358097
--- /dev/null
+++ b/client/platforms/macos/QtAppDelegate-C-Interface.h
@@ -0,0 +1,6 @@
+#ifndef QTAPPDELEGATECINTERFACE_H
+#define QTAPPDELEGATECINTERFACE_H
+
+void QtAppDelegateInitialize();
+
+#endif // QTAPPDELEGATECINTERFACE_H
diff --git a/client/platforms/macos/QtAppDelegate.h b/client/platforms/macos/QtAppDelegate.h
new file mode 100644
index 00000000..19978965
--- /dev/null
+++ b/client/platforms/macos/QtAppDelegate.h
@@ -0,0 +1,7 @@
+//#import
+
+@interface QIOSApplicationDelegate
+@end
+
+@interface QIOSApplicationDelegate (AmneziaVPNDelegate)
+@end
diff --git a/client/platforms/macos/QtAppDelegate.mm b/client/platforms/macos/QtAppDelegate.mm
new file mode 100644
index 00000000..2ac7e612
--- /dev/null
+++ b/client/platforms/macos/QtAppDelegate.mm
@@ -0,0 +1,61 @@
+#import "QtAppDelegate.h"
+#import "ios_controller.h"
+
+#include
+
+
+@implementation QIOSApplicationDelegate (AmneziaVPNDelegate)
+
+/*- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
+{
+ [application setMinimumBackgroundFetchInterval: UIApplicationBackgroundFetchIntervalMinimum];
+ // Override point for customization after application launch.
+ NSLog(@"Application didFinishLaunchingWithOptions");
+ return YES;
+}
+
+- (void)applicationDidEnterBackground:(UIApplication *)application
+{
+ // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
+ // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
+ NSLog(@"In the background");
+}
+
+- (void)applicationWillEnterForeground:(UIApplication *)application
+{
+ // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
+ NSLog(@"In the foreground");
+}
+
+-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
+ // We will add content here soon.
+ NSLog(@"In the completionHandler");
+}
+
+- (BOOL)application:(UIApplication *)app
+ openURL:(NSURL *)url
+ options:(NSDictionary *)options {
+ if (url.fileURL) {
+ QString filePath(url.path.UTF8String);
+ if (filePath.isEmpty()) return NO;
+
+ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
+ NSLog(@"Application openURL: %@", url);
+
+ if (filePath.contains("backup")) {
+ IosController::Instance()->importBackupFromOutside(filePath);
+ } else {
+ QFile file(filePath);
+ bool isOpenFile = file.open(QIODevice::ReadOnly);
+ QByteArray data = file.readAll();
+
+ IosController::Instance()->importConfigFromOutside(QString(data));
+ }
+ });
+
+ return YES;
+ }
+ return NO;
+}*/
+
+@end
diff --git a/client/platforms/macos/ScreenProtection.swift b/client/platforms/macos/ScreenProtection.swift
new file mode 100644
index 00000000..1e85479b
--- /dev/null
+++ b/client/platforms/macos/ScreenProtection.swift
@@ -0,0 +1,10 @@
+//import UIKit
+
+public func toggleScreenshots(_ isEnabled: Bool) {
+
+}
+
+class ScreenProtection {
+
+
+}
diff --git a/client/platforms/macos/VPNCController.swift b/client/platforms/macos/VPNCController.swift
new file mode 100644
index 00000000..3ad0cbbf
--- /dev/null
+++ b/client/platforms/macos/VPNCController.swift
@@ -0,0 +1,50 @@
+import Foundation
+import NetworkExtension
+
+public func removeVPNC(_ vpncName: std.string) {
+ let vpncName = String(describing: vpncName)
+
+ Task {
+ await getManagers()?.first { manager in
+ if let name = manager.localizedDescription, name == vpncName {
+ Task {
+ await remove(manager)
+ }
+
+ return true
+ } else {
+ return false
+ }
+ }
+ }
+}
+
+public func clearSettings() {
+ Task {
+ await getManagers()?.forEach { manager in
+ Task {
+ await remove(manager)
+ }
+ }
+ }
+}
+
+func getManagers() async -> [NETunnelProviderManager]? {
+ do {
+ return try await NETunnelProviderManager.loadAllFromPreferences()
+ } catch {
+ log(.error, title: "VPNC: ", message: "loadAllFromPreferences error: \(error.localizedDescription)")
+ return nil
+ }
+}
+
+func remove(_ manager: NETunnelProviderManager) async {
+ let vpncName = manager.localizedDescription ?? "Unknown"
+ do {
+ try await manager.removeFromPreferences()
+ try await manager.loadFromPreferences()
+ log(.info, title: "VPNC: ", message: "Remove \(vpncName)")
+ } catch {
+ log(.error, title: "VPNC: ", message: "Failed to remove \(vpncName) (\(error.localizedDescription))")
+ }
+}
diff --git a/client/platforms/macos/WGConfig.swift b/client/platforms/macos/WGConfig.swift
new file mode 100644
index 00000000..e3b67efe
--- /dev/null
+++ b/client/platforms/macos/WGConfig.swift
@@ -0,0 +1,94 @@
+import Foundation
+
+struct WGConfig: Decodable {
+ let initPacketMagicHeader, responsePacketMagicHeader: String?
+ let underloadPacketMagicHeader, transportPacketMagicHeader: String?
+ let junkPacketCount, junkPacketMinSize, junkPacketMaxSize: String?
+ let initPacketJunkSize, responsePacketJunkSize: String?
+ let dns1: String
+ let dns2: String
+ let mtu: String
+ let hostName: String
+ let port: Int
+ let clientIP: String
+ let clientPrivateKey: String
+ let serverPublicKey: String
+ let presharedKey: String?
+ var allowedIPs: [String]
+ var persistentKeepAlive: String
+ let splitTunnelType: Int
+ let splitTunnelSites: [String]
+
+ enum CodingKeys: String, CodingKey {
+ case initPacketMagicHeader = "H1", responsePacketMagicHeader = "H2"
+ case underloadPacketMagicHeader = "H3", transportPacketMagicHeader = "H4"
+ case junkPacketCount = "Jc", junkPacketMinSize = "Jmin", junkPacketMaxSize = "Jmax"
+ case initPacketJunkSize = "S1", responsePacketJunkSize = "S2"
+ case dns1
+ case dns2
+ case mtu
+ case hostName
+ case port
+ case clientIP = "client_ip"
+ case clientPrivateKey = "client_priv_key"
+ case serverPublicKey = "server_pub_key"
+ case presharedKey = "psk_key"
+ case allowedIPs = "allowed_ips"
+ case persistentKeepAlive = "persistent_keep_alive"
+ case splitTunnelType
+ case splitTunnelSites
+ }
+
+ var settings: String {
+ junkPacketCount == nil ? "" :
+ """
+ Jc = \(junkPacketCount!)
+ Jmin = \(junkPacketMinSize!)
+ Jmax = \(junkPacketMaxSize!)
+ S1 = \(initPacketJunkSize!)
+ S2 = \(responsePacketJunkSize!)
+ H1 = \(initPacketMagicHeader!)
+ H2 = \(responsePacketMagicHeader!)
+ H3 = \(underloadPacketMagicHeader!)
+ H4 = \(transportPacketMagicHeader!)
+
+ """
+ }
+
+ var str: String {
+ """
+ [Interface]
+ Address = \(clientIP)
+ DNS = \(dns1), \(dns2)
+ MTU = \(mtu)
+ PrivateKey = \(clientPrivateKey)
+ \(settings)
+ [Peer]
+ PublicKey = \(serverPublicKey)
+ \(presharedKey == nil ? "" : "PresharedKey = \(presharedKey!)")
+ AllowedIPs = \(allowedIPs.joined(separator: ", "))
+ Endpoint = \(hostName):\(port)
+ PersistentKeepalive = \(persistentKeepAlive)
+ """
+ }
+
+ var redux: String {
+ """
+ [Interface]
+ Address = \(clientIP)
+ DNS = \(dns1), \(dns2)
+ MTU = \(mtu)
+ PrivateKey = ***
+ \(settings)
+ [Peer]
+ PublicKey = ***
+ PresharedKey = ***
+ AllowedIPs = \(allowedIPs.joined(separator: ", "))
+ Endpoint = \(hostName):\(port)
+ PersistentKeepalive = \(persistentKeepAlive)
+
+ SplitTunnelType = \(splitTunnelType)
+ SplitTunnelSites = \(splitTunnelSites.joined(separator: ", "))
+ """
+ }
+}
diff --git a/client/platforms/macos/WireGuard-Bridging-Header.h b/client/platforms/macos/WireGuard-Bridging-Header.h
new file mode 100644
index 00000000..0183367b
--- /dev/null
+++ b/client/platforms/macos/WireGuard-Bridging-Header.h
@@ -0,0 +1,28 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "3rd/amneziawg-apple/Sources/WireGuardKitC/WireGuardKitC.h"
+
+#include
+#include
+
+#define WG_KEY_LEN (32)
+#define WG_KEY_LEN_BASE64 (45)
+#define WG_KEY_LEN_HEX (65)
+
+void key_to_base64(char base64[WG_KEY_LEN_BASE64],
+ const uint8_t key[WG_KEY_LEN]);
+bool key_from_base64(uint8_t key[WG_KEY_LEN], const char* base64);
+
+void key_to_hex(char hex[WG_KEY_LEN_HEX], const uint8_t key[WG_KEY_LEN]);
+bool key_from_hex(uint8_t key[WG_KEY_LEN], const char* hex);
+
+bool key_eq(const uint8_t key1[WG_KEY_LEN], const uint8_t key2[WG_KEY_LEN]);
+
+void write_msg_to_log(const char* tag, const char* msg);
+
+#import "TargetConditionals.h"
+#if TARGET_OS_OSX
+# include
+#endif
diff --git a/client/platforms/macos/ios_controller.h b/client/platforms/macos/ios_controller.h
new file mode 100644
index 00000000..8e13eaa9
--- /dev/null
+++ b/client/platforms/macos/ios_controller.h
@@ -0,0 +1,99 @@
+#ifndef IOS_CONTROLLER_H
+#define IOS_CONTROLLER_H
+
+#include "protocols/vpnprotocol.h"
+
+#ifdef __OBJC__
+ #import
+@class NETunnelProviderManager;
+#endif
+
+using namespace amnezia;
+
+struct Action
+{
+ static const char *start;
+ static const char *restart;
+ static const char *stop;
+ static const char *getTunnelId;
+ static const char *getStatus;
+};
+
+struct MessageKey
+{
+ static const char *action;
+ static const char *tunnelId;
+ static const char *config;
+ static const char *errorCode;
+ static const char *host;
+ static const char *port;
+ static const char *isOnDemand;
+ static const char *SplitTunnelType;
+ static const char *SplitTunnelSites;
+};
+
+class IosController : public QObject
+{
+ Q_OBJECT
+
+public:
+ static IosController *Instance();
+
+ virtual ~IosController() override = default;
+
+ bool initialize();
+ bool connectVpn(amnezia::Proto proto, const QJsonObject &configuration);
+ void disconnectVpn();
+
+ void vpnStatusDidChange(void *pNotification);
+ void vpnConfigurationDidChange(void *pNotification);
+
+ void getBackendLogs(std::function &&callback);
+ void checkStatus();
+
+ bool shareText(const QStringList &filesToSend);
+ QString openFile();
+
+ void requestInetAccess();
+signals:
+ void connectionStateChanged(Vpn::ConnectionState state);
+ void bytesChanged(quint64 receivedBytes, quint64 sentBytes);
+ void importConfigFromOutside(const QString);
+ void importBackupFromOutside(const QString);
+
+ void finished();
+
+protected slots:
+
+private:
+ explicit IosController();
+
+ bool setupOpenVPN();
+ bool setupCloak();
+ bool setupWireGuard();
+ bool setupAwg();
+ bool setupXray();
+
+ bool startOpenVPN(const QString &config);
+ bool startWireGuard(const QString &jsonConfig);
+ bool startXray(const QString &jsonConfig);
+
+ void startTunnel();
+
+private:
+ void *m_iosControllerWrapper {};
+#ifdef __OBJC__
+ NETunnelProviderManager *m_currentTunnel {};
+ NSString *m_serverAddress {};
+ bool isOurManager(NETunnelProviderManager *manager);
+ void sendVpnExtensionMessage(NSDictionary *message, std::function callback = nullptr);
+#endif
+
+ amnezia::Proto m_proto;
+ QJsonObject m_rawConfig;
+ QString m_tunnelId;
+ uint64_t m_txBytes;
+ uint64_t m_rxBytes;
+};
+
+#endif // IOS_CONTROLLER_H
diff --git a/client/platforms/macos/ios_controller.mm b/client/platforms/macos/ios_controller.mm
new file mode 100644
index 00000000..7308b178
--- /dev/null
+++ b/client/platforms/macos/ios_controller.mm
@@ -0,0 +1,851 @@
+#include "ios_controller.h"
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "../protocols/vpnprotocol.h"
+#import "ios_controller_wrapper.h"
+
+#include
+
+const char* Action::start = "start";
+const char* Action::restart = "restart";
+const char* Action::stop = "stop";
+const char* Action::getTunnelId = "getTunnelId";
+const char* Action::getStatus = "status";
+
+const char* MessageKey::action = "action";
+const char* MessageKey::tunnelId = "tunnelId";
+const char* MessageKey::config = "config";
+const char* MessageKey::errorCode = "errorCode";
+const char* MessageKey::host = "host";
+const char* MessageKey::port = "port";
+const char* MessageKey::isOnDemand = "is-on-demand";
+const char* MessageKey::SplitTunnelType = "SplitTunnelType";
+const char* MessageKey::SplitTunnelSites = "SplitTunnelSites";
+
+//static UIViewController* getViewController() {
+// NSArray *windows = [[UIApplication sharedApplication]windows];
+// for (UIWindow *window in windows) {
+// if (window.isKeyWindow) {
+// return window.rootViewController;
+// }
+// }
+// return nil;
+//}
+
+OSStatus requestAuthorization() {
+ AuthorizationRef authRef;
+ OSStatus status = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, kAuthorizationFlagDefaults, &authRef);
+ if (status != errAuthorizationSuccess) {
+ qDebug() << "Authorization failed with status:" << status;
+ return status;
+ }
+
+ AuthorizationItem authItem = {kAuthorizationRightExecute, 0, NULL, 0};
+ AuthorizationRights authRights = {1, &authItem};
+ AuthorizationFlags flags = kAuthorizationFlagDefaults | kAuthorizationFlagInteractionAllowed | kAuthorizationFlagExtendRights;
+
+ status = AuthorizationCopyRights(authRef, &authRights, NULL, flags, NULL);
+ if (status != errAuthorizationSuccess) {
+ qDebug() << "Authorization rights copy failed with status:" << status;
+ }
+
+ return status;
+}
+
+Vpn::ConnectionState iosStatusToState(NEVPNStatus status) {
+ switch (status) {
+ case NEVPNStatusInvalid:
+ return Vpn::ConnectionState::Unknown;
+ case NEVPNStatusDisconnected:
+ return Vpn::ConnectionState::Disconnected;
+ case NEVPNStatusConnecting:
+ return Vpn::ConnectionState::Connecting;
+ case NEVPNStatusConnected:
+ return Vpn::ConnectionState::Connected;
+ case NEVPNStatusReasserting:
+ return Vpn::ConnectionState::Connecting;
+ case NEVPNStatusDisconnecting:
+ return Vpn::ConnectionState::Disconnecting;
+ default:
+ return Vpn::ConnectionState::Unknown;
+}
+}
+
+namespace {
+IosController* s_instance = nullptr;
+}
+
+IosController::IosController() : QObject()
+{
+ s_instance = this;
+ m_iosControllerWrapper = [[IosControllerWrapper alloc] initWithCppController:this];
+
+ [[NSNotificationCenter defaultCenter]
+ removeObserver: (__bridge NSObject *)m_iosControllerWrapper];
+ [[NSNotificationCenter defaultCenter]
+ addObserver: (__bridge NSObject *)m_iosControllerWrapper selector:@selector(vpnStatusDidChange:) name:NEVPNStatusDidChangeNotification object:nil];
+ [[NSNotificationCenter defaultCenter]
+ addObserver: (__bridge NSObject *)m_iosControllerWrapper selector:@selector(vpnConfigurationDidChange:) name:NEVPNConfigurationChangeNotification object:nil];
+
+}
+
+IosController* IosController::Instance() {
+ if (!s_instance) {
+ s_instance = new IosController();
+ }
+
+ return s_instance;
+}
+
+bool IosController::initialize()
+{
+ if (requestAuthorization() != errAuthorizationSuccess) {
+ emit connectionStateChanged(Vpn::ConnectionState::Error);
+ return false;
+ }
+
+ __block bool ok = true;
+ [NETunnelProviderManager loadAllFromPreferencesWithCompletionHandler:^(NSArray * _Nullable managers, NSError * _Nullable error) {
+ @try {
+ if (error) {
+ qDebug() << "IosController::initialize : Error:" << [error.localizedDescription UTF8String];
+ emit connectionStateChanged(Vpn::ConnectionState::Error);
+ ok = false;
+ return;
+ }
+
+ NSInteger managerCount = managers.count;
+ qDebug() << "IosController::initialize : We have received managers:" << (long)managerCount;
+
+
+ for (NETunnelProviderManager *manager in managers) {
+ qDebug() << "IosController::initialize : VPNC: " << manager.localizedDescription;
+
+ if (manager.connection.status == NEVPNStatusConnected) {
+ m_currentTunnel = manager;
+ qDebug() << "IosController::initialize : VPN already connected with" << manager.localizedDescription;
+ emit connectionStateChanged(Vpn::ConnectionState::Connected);
+ break;
+
+ // TODO: show connected state
+ }
+ }
+ }
+ @catch (NSException *exception) {
+ qDebug() << "IosController::setTunnel : exception" << QString::fromNSString(exception.reason);
+ ok = false;
+ }
+ }];
+
+ return ok;
+}
+
+bool IosController::connectVpn(amnezia::Proto proto, const QJsonObject& configuration)
+{
+ m_proto = proto;
+ m_rawConfig = configuration;
+ m_serverAddress = configuration.value(config_key::hostName).toString().toNSString();
+
+ QString tunnelName;
+ if (configuration.value(config_key::description).toString().isEmpty()) {
+ tunnelName = QString("%1 %2")
+ .arg(configuration.value(config_key::hostName).toString())
+ .arg(ProtocolProps::protoToString(proto));
+ }
+ else {
+ tunnelName = QString("%1 (%2) %3")
+ .arg(configuration.value(config_key::description).toString())
+ .arg(configuration.value(config_key::hostName).toString())
+ .arg(ProtocolProps::protoToString(proto));
+ }
+
+ qDebug() << "IosController::connectVpn" << tunnelName;
+
+ m_currentTunnel = nullptr;
+
+ dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
+ __block bool ok = true;
+ __block bool isNewTunnelCreated = false;
+
+ [NETunnelProviderManager loadAllFromPreferencesWithCompletionHandler:^(NSArray * _Nullable managers, NSError * _Nullable error) {
+ @try {
+ if (error) {
+ qDebug() << "IosController::connectVpn : VPNC: loadAllFromPreferences error:" << [error.localizedDescription UTF8String];
+ emit connectionStateChanged(Vpn::ConnectionState::Error);
+ ok = false;
+ return;
+ }
+
+ NSInteger managerCount = managers.count;
+ qDebug() << "IosController::connectVpn : We have received managers:" << (long)managerCount;
+
+
+ for (NETunnelProviderManager *manager in managers) {
+ if ([manager.localizedDescription isEqualToString:tunnelName.toNSString()]) {
+ m_currentTunnel = manager;
+ qDebug() << "IosController::connectVpn : Using existing tunnel:" << manager.localizedDescription;
+ if (manager.connection.status == NEVPNStatusConnected) {
+ emit connectionStateChanged(Vpn::ConnectionState::Connected);
+ return;
+ }
+
+ break;
+ }
+ }
+
+ if (!m_currentTunnel) {
+ isNewTunnelCreated = true;
+ m_currentTunnel = [[NETunnelProviderManager alloc] init];
+ m_currentTunnel.localizedDescription = [NSString stringWithUTF8String:tunnelName.toStdString().c_str()];
+ qDebug() << "IosController::connectVpn : Creating new tunnel" << m_currentTunnel.localizedDescription;
+ }
+
+ }
+ @catch (NSException *exception) {
+ qDebug() << "IosController::connectVpn : exception" << QString::fromNSString(exception.reason);
+ ok = false;
+ m_currentTunnel = nullptr;
+ }
+ @finally {
+ dispatch_semaphore_signal(semaphore);
+ }
+ }];
+
+ dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
+ if (!ok) return false;
+
+ [[NSNotificationCenter defaultCenter]
+ removeObserver:(__bridge NSObject *)m_iosControllerWrapper];
+
+ [[NSNotificationCenter defaultCenter]
+ addObserver:(__bridge NSObject *)m_iosControllerWrapper
+ selector:@selector(vpnStatusDidChange:)
+ name:NEVPNStatusDidChangeNotification
+ object:m_currentTunnel.connection];
+
+
+ if (proto == amnezia::Proto::OpenVpn) {
+ return setupOpenVPN();
+ }
+ if (proto == amnezia::Proto::Cloak) {
+ return setupCloak();
+ }
+ if (proto == amnezia::Proto::WireGuard) {
+ return setupWireGuard();
+ }
+ if (proto == amnezia::Proto::Awg) {
+ return setupAwg();
+ }
+ if (proto == amnezia::Proto::Xray) {
+ return setupXray();
+ }
+
+ return false;
+}
+
+void IosController::disconnectVpn()
+{
+ if (!m_currentTunnel) {
+ return;
+ }
+
+ if ([m_currentTunnel.connection isKindOfClass:[NETunnelProviderSession class]]) {
+ [(NETunnelProviderSession *)m_currentTunnel.connection stopTunnel];
+ }
+}
+
+
+void IosController::checkStatus()
+{
+ NSString *actionKey = [NSString stringWithUTF8String:MessageKey::action];
+ NSString *actionValue = [NSString stringWithUTF8String:Action::getStatus];
+ NSString *tunnelIdKey = [NSString stringWithUTF8String:MessageKey::tunnelId];
+ NSString *tunnelIdValue = !m_tunnelId.isEmpty() ? m_tunnelId.toNSString() : @"";
+
+ NSDictionary* message = @{actionKey: actionValue, tunnelIdKey: tunnelIdValue};
+ sendVpnExtensionMessage(message, [&](NSDictionary* response){
+ uint64_t txBytes = [response[@"tx_bytes"] intValue];
+ uint64_t rxBytes = [response[@"rx_bytes"] intValue];
+ emit bytesChanged(rxBytes - m_rxBytes, txBytes - m_txBytes);
+ m_rxBytes = rxBytes;
+ m_txBytes = txBytes;
+ });
+}
+
+void IosController::vpnStatusDidChange(void *pNotification)
+{
+ NETunnelProviderSession *session = (NETunnelProviderSession *)pNotification;
+
+ if (session /* && session == TunnelManager.session */ ) {
+ qDebug() << "IosController::vpnStatusDidChange" << iosStatusToState(session.status) << session;
+
+ if (session.status == NEVPNStatusDisconnected) {
+ if (@available(iOS 16.0, *)) {
+ [session fetchLastDisconnectErrorWithCompletionHandler:^(NSError * _Nullable error) {
+ if (error != nil) {
+ qDebug() << "Disconnect error" << error.domain << error.code << error.localizedDescription;
+
+ if ([error.domain isEqualToString:NEVPNConnectionErrorDomain]) {
+ switch (error.code) {
+ case NEVPNConnectionErrorOverslept:
+ qDebug() << "Disconnect error info" << "The VPN connection was terminated because the system slept for an extended period of time.";
+ break;
+ case NEVPNConnectionErrorNoNetworkAvailable:
+ qDebug() << "Disconnect error info" << "The VPN connection could not be established because the system is not connected to a network.";
+ break;
+ case NEVPNConnectionErrorUnrecoverableNetworkChange:
+ qDebug() << "Disconnect error info" << "The VPN connection was terminated because the network conditions changed in such a way that the VPN connection could not be maintained.";
+ break;
+ case NEVPNConnectionErrorConfigurationFailed:
+ qDebug() << "Disconnect error info" << "The VPN connection could not be established because the configuration is invalid. ";
+ break;
+ case NEVPNConnectionErrorServerAddressResolutionFailed:
+ qDebug() << "Disconnect error info" << "The address of the VPN server could not be determined.";
+ break;
+ case NEVPNConnectionErrorServerNotResponding:
+ qDebug() << "Disconnect error info" << "Network communication with the VPN server has failed.";
+ break;
+ case NEVPNConnectionErrorServerDead:
+ qDebug() << "Disconnect error info" << "The VPN server is no longer functioning.";
+ break;
+ case NEVPNConnectionErrorAuthenticationFailed:
+ qDebug() << "Disconnect error info" << "The user credentials were rejected by the VPN server.";
+ break;
+ case NEVPNConnectionErrorClientCertificateInvalid:
+ qDebug() << "Disconnect error info" << "The client certificate is invalid.";
+ break;
+ case NEVPNConnectionErrorClientCertificateNotYetValid:
+ qDebug() << "Disconnect error info" << "The client certificate will not be valid until some future point in time.";
+ break;
+ case NEVPNConnectionErrorClientCertificateExpired:
+ qDebug() << "Disconnect error info" << "The validity period of the client certificate has passed.";
+ break;
+ case NEVPNConnectionErrorPluginFailed:
+ qDebug() << "Disconnect error info" << "The VPN plugin died unexpectedly.";
+ break;
+ case NEVPNConnectionErrorConfigurationNotFound:
+ qDebug() << "Disconnect error info" << "The VPN configuration could not be found.";
+ break;
+ case NEVPNConnectionErrorPluginDisabled:
+ qDebug() << "Disconnect error info" << "The VPN plugin could not be found or needed to be updated.";
+ break;
+ case NEVPNConnectionErrorNegotiationFailed:
+ qDebug() << "Disconnect error info" << "The VPN protocol negotiation failed.";
+ break;
+ case NEVPNConnectionErrorServerDisconnected:
+ qDebug() << "Disconnect error info" << "The VPN server terminated the connection.";
+ break;
+ case NEVPNConnectionErrorServerCertificateInvalid:
+ qDebug() << "Disconnect error info" << "The server certificate is invalid.";
+ break;
+ case NEVPNConnectionErrorServerCertificateNotYetValid:
+ qDebug() << "Disconnect error info" << "The server certificate will not be valid until some future point in time.";
+ break;
+ case NEVPNConnectionErrorServerCertificateExpired:
+ qDebug() << "Disconnect error info" << "The validity period of the server certificate has passed.";
+ break;
+ default:
+ qDebug() << "Disconnect error info" << "Unknown code.";
+ break;
+ }
+ }
+
+ NSError *underlyingError = error.userInfo[@"NSUnderlyingError"];
+ if (underlyingError != nil) {
+ qDebug() << "Disconnect underlying error" << underlyingError.domain << underlyingError.code << underlyingError.localizedDescription;
+
+ if ([underlyingError.domain isEqualToString:@"NEAgentErrorDomain"]) {
+ switch (underlyingError.code) {
+ case 1:
+ qDebug() << "Disconnect underlying error" << "General. Use sysdiagnose.";
+ break;
+ case 2:
+ qDebug() << "Disconnect underlying error" << "Plug-in unavailable. Use sysdiagnose.";
+ break;
+ default:
+ qDebug() << "Disconnect underlying error" << "Unknown code. Use sysdiagnose.";
+ break;
+ }
+ }
+ }
+ } else {
+ qDebug() << "Disconnect error is absent";
+ }
+ }];
+ } else {
+ qDebug() << "Disconnect error is unavailable on iOS < 16.0";
+ }
+ }
+
+ emit connectionStateChanged(iosStatusToState(session.status));
+ }
+}
+
+void IosController::vpnConfigurationDidChange(void *pNotification)
+{
+ qDebug() << "IosController::vpnConfigurationDidChange" << pNotification;
+}
+
+bool IosController::setupOpenVPN()
+{
+ QJsonObject ovpn = m_rawConfig[ProtocolProps::key_proto_config_data(amnezia::Proto::OpenVpn)].toObject();
+ QString ovpnConfig = ovpn[config_key::config].toString();
+
+ QJsonObject openVPNConfig {};
+ openVPNConfig.insert(config_key::config, ovpnConfig);
+
+ if (ovpn.contains(config_key::mtu)) {
+ openVPNConfig.insert(config_key::mtu, ovpn[config_key::mtu]);
+ } else {
+ openVPNConfig.insert(config_key::mtu, protocols::openvpn::defaultMtu);
+ }
+
+ openVPNConfig.insert(config_key::splitTunnelType, m_rawConfig[config_key::splitTunnelType]);
+
+ QJsonArray splitTunnelSites = m_rawConfig[config_key::splitTunnelSites].toArray();
+
+ for(int index = 0; index < splitTunnelSites.count(); index++) {
+ splitTunnelSites[index] = splitTunnelSites[index].toString().remove(" ");
+ }
+
+ openVPNConfig.insert(config_key::splitTunnelSites, splitTunnelSites);
+
+ QJsonDocument openVPNConfigDoc(openVPNConfig);
+ QString openVPNConfigStr(openVPNConfigDoc.toJson(QJsonDocument::Compact));
+
+ return startOpenVPN(openVPNConfigStr);
+}
+
+bool IosController::setupCloak()
+{
+ m_serverAddress = @"127.0.0.1";
+ QJsonObject ovpn = m_rawConfig[ProtocolProps::key_proto_config_data(amnezia::Proto::OpenVpn)].toObject();
+ QString ovpnConfig = ovpn[config_key::config].toString();
+
+ QJsonObject cloak = m_rawConfig[ProtocolProps::key_proto_config_data(amnezia::Proto::Cloak)].toObject();
+
+ cloak["NumConn"] = 1;
+ if (cloak.contains("remote")) {
+ cloak["RemoteHost"] = cloak["remote"].toString();
+ }
+ if (cloak.contains("port")) {
+ cloak["RemotePort"] = cloak["port"].toString();
+ }
+ cloak.remove("remote");
+ cloak.remove("port");
+ cloak.remove("transport_proto");
+
+ QJsonObject jsonObject {};
+ foreach(const QString& key, cloak.keys()) {
+ if(key == "NumConn" or key == "StreamTimeout"){
+ jsonObject.insert(key, cloak.value(key).toInt());
+ }else{
+ jsonObject.insert(key, cloak.value(key).toString());
+ }
+ }
+ QJsonDocument doc(jsonObject);
+ QString strJson(doc.toJson(QJsonDocument::Compact));
+ QString cloakBase64 = strJson.toUtf8().toBase64();
+ ovpnConfig.append("\n\n");
+ ovpnConfig.append(cloakBase64);
+ ovpnConfig.append("\n\n");
+
+ QJsonObject openVPNConfig {};
+ openVPNConfig.insert(config_key::config, ovpnConfig);
+
+ if (ovpn.contains(config_key::mtu)) {
+ openVPNConfig.insert(config_key::mtu, ovpn[config_key::mtu]);
+ } else {
+ openVPNConfig.insert(config_key::mtu, protocols::openvpn::defaultMtu);
+ }
+
+ openVPNConfig.insert(config_key::splitTunnelType, m_rawConfig[config_key::splitTunnelType]);
+
+ QJsonArray splitTunnelSites = m_rawConfig[config_key::splitTunnelSites].toArray();
+
+ for(int index = 0; index < splitTunnelSites.count(); index++) {
+ splitTunnelSites[index] = splitTunnelSites[index].toString().remove(" ");
+ }
+
+ openVPNConfig.insert(config_key::splitTunnelSites, splitTunnelSites);
+
+ QJsonDocument openVPNConfigDoc(openVPNConfig);
+ QString openVPNConfigStr(openVPNConfigDoc.toJson(QJsonDocument::Compact));
+
+ return startOpenVPN(openVPNConfigStr);
+}
+
+bool IosController::setupWireGuard()
+{
+ QJsonObject config = m_rawConfig[ProtocolProps::key_proto_config_data(amnezia::Proto::WireGuard)].toObject();
+
+ QJsonObject wgConfig {};
+ wgConfig.insert(config_key::dns1, m_rawConfig[config_key::dns1]);
+ wgConfig.insert(config_key::dns2, m_rawConfig[config_key::dns2]);
+
+ if (config.contains(config_key::mtu)) {
+ wgConfig.insert(config_key::mtu, config[config_key::mtu]);
+ } else {
+ wgConfig.insert(config_key::mtu, protocols::wireguard::defaultMtu);
+ }
+
+ wgConfig.insert(config_key::hostName, config[config_key::hostName]);
+ wgConfig.insert(config_key::port, config[config_key::port]);
+ wgConfig.insert(config_key::client_ip, config[config_key::client_ip]);
+ wgConfig.insert(config_key::client_priv_key, config[config_key::client_priv_key]);
+ wgConfig.insert(config_key::server_pub_key, config[config_key::server_pub_key]);
+ wgConfig.insert(config_key::psk_key, config[config_key::psk_key]);
+ wgConfig.insert(config_key::splitTunnelType, m_rawConfig[config_key::splitTunnelType]);
+
+ QJsonArray splitTunnelSites = m_rawConfig[config_key::splitTunnelSites].toArray();
+
+ for(int index = 0; index < splitTunnelSites.count(); index++) {
+ splitTunnelSites[index] = splitTunnelSites[index].toString().remove(" ");
+ }
+
+ wgConfig.insert(config_key::splitTunnelSites, splitTunnelSites);
+
+ if (config.contains(config_key::allowed_ips) && config[config_key::allowed_ips].isArray()) {
+ wgConfig.insert(config_key::allowed_ips, config[config_key::allowed_ips]);
+ } else {
+ QJsonArray allowed_ips { "0.0.0.0/0", "::/0" };
+ wgConfig.insert(config_key::allowed_ips, allowed_ips);
+ }
+
+ if (config.contains(config_key::persistent_keep_alive)) {
+ wgConfig.insert(config_key::persistent_keep_alive, config[config_key::persistent_keep_alive]);
+ } else {
+ wgConfig.insert(config_key::persistent_keep_alive, "25");
+ }
+
+ QJsonDocument wgConfigDoc(wgConfig);
+ QString wgConfigDocStr(wgConfigDoc.toJson(QJsonDocument::Compact));
+
+ return startWireGuard(wgConfigDocStr);
+}
+
+bool IosController::setupXray()
+{
+ QJsonObject config = m_rawConfig[ProtocolProps::key_proto_config_data(amnezia::Proto::Xray)].toObject();
+ QJsonDocument xrayConfigDoc(config);
+ QString xrayConfigStr(xrayConfigDoc.toJson(QJsonDocument::Compact));
+
+ return startXray(xrayConfigStr);
+}
+
+bool IosController::setupAwg()
+{
+ QJsonObject config = m_rawConfig[ProtocolProps::key_proto_config_data(amnezia::Proto::Awg)].toObject();
+
+ QJsonObject wgConfig {};
+ wgConfig.insert(config_key::dns1, m_rawConfig[config_key::dns1]);
+ wgConfig.insert(config_key::dns2, m_rawConfig[config_key::dns2]);
+
+ if (config.contains(config_key::mtu)) {
+ wgConfig.insert(config_key::mtu, config[config_key::mtu]);
+ } else {
+ wgConfig.insert(config_key::mtu, protocols::awg::defaultMtu);
+ }
+
+ wgConfig.insert(config_key::hostName, config[config_key::hostName]);
+ wgConfig.insert(config_key::port, config[config_key::port]);
+ wgConfig.insert(config_key::client_ip, config[config_key::client_ip]);
+ wgConfig.insert(config_key::client_priv_key, config[config_key::client_priv_key]);
+ wgConfig.insert(config_key::server_pub_key, config[config_key::server_pub_key]);
+ wgConfig.insert(config_key::psk_key, config[config_key::psk_key]);
+ wgConfig.insert(config_key::splitTunnelType, m_rawConfig[config_key::splitTunnelType]);
+
+ QJsonArray splitTunnelSites = m_rawConfig[config_key::splitTunnelSites].toArray();
+
+ for(int index = 0; index < splitTunnelSites.count(); index++) {
+ splitTunnelSites[index] = splitTunnelSites[index].toString().remove(" ");
+ }
+
+ wgConfig.insert(config_key::splitTunnelSites, splitTunnelSites);
+
+ if (config.contains(config_key::allowed_ips) && config[config_key::allowed_ips].isArray()) {
+ wgConfig.insert(config_key::allowed_ips, config[config_key::allowed_ips]);
+ } else {
+ QJsonArray allowed_ips { "0.0.0.0/0", "::/0" };
+ wgConfig.insert(config_key::allowed_ips, allowed_ips);
+ }
+
+ if (config.contains(config_key::persistent_keep_alive)) {
+ wgConfig.insert(config_key::persistent_keep_alive, config[config_key::persistent_keep_alive]);
+ } else {
+ wgConfig.insert(config_key::persistent_keep_alive, "25");
+ }
+
+ wgConfig.insert(config_key::initPacketMagicHeader, config[config_key::initPacketMagicHeader]);
+ wgConfig.insert(config_key::responsePacketMagicHeader, config[config_key::responsePacketMagicHeader]);
+ wgConfig.insert(config_key::underloadPacketMagicHeader, config[config_key::underloadPacketMagicHeader]);
+ wgConfig.insert(config_key::transportPacketMagicHeader, config[config_key::transportPacketMagicHeader]);
+
+ wgConfig.insert(config_key::initPacketJunkSize, config[config_key::initPacketJunkSize]);
+ wgConfig.insert(config_key::responsePacketJunkSize, config[config_key::responsePacketJunkSize]);
+
+ wgConfig.insert(config_key::junkPacketCount, config[config_key::junkPacketCount]);
+ wgConfig.insert(config_key::junkPacketMinSize, config[config_key::junkPacketMinSize]);
+ wgConfig.insert(config_key::junkPacketMaxSize, config[config_key::junkPacketMaxSize]);
+
+ QJsonDocument wgConfigDoc(wgConfig);
+ QString wgConfigDocStr(wgConfigDoc.toJson(QJsonDocument::Compact));
+
+ return startWireGuard(wgConfigDocStr);
+}
+
+bool IosController::startOpenVPN(const QString &config)
+{
+ qDebug() << "IosController::startOpenVPN";
+
+ NETunnelProviderProtocol *tunnelProtocol = [[NETunnelProviderProtocol alloc] init];
+ tunnelProtocol.providerBundleIdentifier = [NSString stringWithUTF8String:VPN_NE_BUNDLEID];
+ tunnelProtocol.providerConfiguration = @{@"ovpn": [[NSString stringWithUTF8String:config.toStdString().c_str()] dataUsingEncoding:NSUTF8StringEncoding]};
+ tunnelProtocol.serverAddress = m_serverAddress;
+
+ m_currentTunnel.protocolConfiguration = tunnelProtocol;
+
+ startTunnel();
+}
+
+bool IosController::startWireGuard(const QString &config)
+{
+ qDebug() << "IosController::startWireGuard";
+
+ NETunnelProviderProtocol *tunnelProtocol = [[NETunnelProviderProtocol alloc] init];
+ tunnelProtocol.providerBundleIdentifier = [NSString stringWithUTF8String:VPN_NE_BUNDLEID];
+ tunnelProtocol.providerConfiguration = @{@"wireguard": [[NSString stringWithUTF8String:config.toStdString().c_str()] dataUsingEncoding:NSUTF8StringEncoding]};
+ tunnelProtocol.serverAddress = m_serverAddress;
+
+ m_currentTunnel.protocolConfiguration = tunnelProtocol;
+
+ startTunnel();
+}
+
+bool IosController::startXray(const QString &config)
+{
+ qDebug() << "IosController::startXray";
+
+ NETunnelProviderProtocol *tunnelProtocol = [[NETunnelProviderProtocol alloc] init];
+ tunnelProtocol.providerBundleIdentifier = [NSString stringWithUTF8String:VPN_NE_BUNDLEID];
+ tunnelProtocol.providerConfiguration = @{@"xray": [[NSString stringWithUTF8String:config.toStdString().c_str()] dataUsingEncoding:NSUTF8StringEncoding]};
+ tunnelProtocol.serverAddress = m_serverAddress;
+
+ m_currentTunnel.protocolConfiguration = tunnelProtocol;
+
+ startTunnel();
+}
+
+void IosController::startTunnel()
+{
+ NSString *protocolName = @"Unknown";
+
+ NETunnelProviderProtocol *tunnelProtocol = (NETunnelProviderProtocol *)m_currentTunnel.protocolConfiguration;
+ if (tunnelProtocol.providerConfiguration[@"wireguard"] != nil) {
+ protocolName = @"WireGuard";
+ } else if (tunnelProtocol.providerConfiguration[@"ovpn"] != nil) {
+ protocolName = @"OpenVPN";
+ }
+
+ m_rxBytes = 0;
+ m_txBytes = 0;
+
+ [m_currentTunnel setEnabled:YES];
+
+ [m_currentTunnel saveToPreferencesWithCompletionHandler:^(NSError *saveError) {
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+
+ if (saveError) {
+ qDebug().nospace() << "IosController::startTunnel" << protocolName << ": Connect " << protocolName << " Tunnel Save Error" << saveError.localizedDescription.UTF8String;
+ emit connectionStateChanged(Vpn::ConnectionState::Error);
+ return;
+ }
+
+ [m_currentTunnel loadFromPreferencesWithCompletionHandler:^(NSError *loadError) {
+ if (loadError) {
+ qDebug().nospace() << "IosController::startTunnel :" << m_currentTunnel.localizedDescription << protocolName << ": Connect " << protocolName << " Tunnel Load Error" << loadError.localizedDescription.UTF8String;
+ emit connectionStateChanged(Vpn::ConnectionState::Error);
+ return;
+ }
+
+ NSError *startError = nil;
+ qDebug() << iosStatusToState(m_currentTunnel.connection.status);
+
+ BOOL started = [m_currentTunnel.connection startVPNTunnelWithOptions:nil andReturnError:&startError];
+
+ if (!started || startError) {
+ qDebug().nospace() << "IosController::startTunnel :" << m_currentTunnel.localizedDescription << protocolName << " : Connect " << protocolName << " Tunnel Start Error"
+ << (startError ? startError.localizedDescription.UTF8String : "");
+ emit connectionStateChanged(Vpn::ConnectionState::Error);
+ } else {
+ qDebug().nospace() << "IosController::startTunnel :" << m_currentTunnel.localizedDescription << protocolName << " : Starting the tunnel succeeded";
+ }
+ }];
+ });
+ }];
+}
+
+bool IosController::isOurManager(NETunnelProviderManager* manager) {
+ NETunnelProviderProtocol* tunnelProto = (NETunnelProviderProtocol*)manager.protocolConfiguration;
+
+ if (!tunnelProto) {
+ qDebug() << "Ignoring manager because the proto is invalid";
+ return false;
+ }
+
+ if (!tunnelProto.providerBundleIdentifier) {
+ qDebug() << "Ignoring manager because the bundle identifier is null";
+ return false;
+ }
+
+ if (![tunnelProto.providerBundleIdentifier isEqualToString:[NSString stringWithUTF8String:VPN_NE_BUNDLEID]]) {
+ qDebug() << "Ignoring manager because the bundle identifier doesn't match";
+ return false;
+ }
+
+ qDebug() << "Found the manager with the correct bundle identifier:" << QString::fromNSString(tunnelProto.providerBundleIdentifier);
+
+ return true;
+}
+
+void IosController::sendVpnExtensionMessage(NSDictionary* message, std::function callback)
+{
+ if (!m_currentTunnel) {
+ qDebug() << "Cannot set an extension callback without a tunnel manager";
+ return;
+ }
+
+ NSError *error = nil;
+ NSData *data = [NSJSONSerialization dataWithJSONObject:message options:0 error:&error];
+
+ if (!data || error) {
+ qDebug() << "Failed to serialize message to VpnExtension as JSON. Error:"
+ << [error.localizedDescription UTF8String];
+ return;
+ }
+
+ void (^completionHandler)(NSData *) = ^(NSData *responseData) {
+ if (!responseData) {
+ if (callback) callback(nil);
+ return;
+ }
+
+ NSError *deserializeError = nil;
+ NSDictionary *response = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&deserializeError];
+
+ if (response && [response isKindOfClass:[NSDictionary class]]) {
+ if (callback) callback(response);
+ return;
+ } else if (deserializeError) {
+ qDebug() << "Failed to deserialize the VpnExtension response";
+ }
+
+ if (callback) callback(nil);
+ };
+
+ NETunnelProviderSession *session = (NETunnelProviderSession *)m_currentTunnel.connection;
+
+ NSError *sendError = nil;
+
+ if ([session respondsToSelector:@selector(sendProviderMessage:returnError:responseHandler:)]) {
+ [session sendProviderMessage:data returnError:&sendError responseHandler:completionHandler];
+ } else {
+ qDebug() << "Method sendProviderMessage:responseHandler:error: does not exist";
+ }
+
+ if (sendError) {
+ qDebug() << "Failed to send message to VpnExtension. Error:"
+ << [sendError.localizedDescription UTF8String];
+ }
+
+}
+
+bool IosController::shareText(const QStringList& filesToSend) {
+ NSMutableArray *sharingItems = [NSMutableArray new];
+
+ for (int i = 0; i < filesToSend.size(); i++) {
+ NSURL *logFileUrl = [[NSURL alloc] initFileURLWithPath:filesToSend[i].toNSString()];
+ [sharingItems addObject:logFileUrl];
+ }
+
+ // UIViewController *qtController = getViewController();
+ // if (!qtController) return;
+
+ // UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:sharingItems applicationActivities:nil];
+
+ __block bool isAccepted = false;
+
+ // [activityController setCompletionWithItemsHandler:^(NSString *activityType, BOOL completed, NSArray *returnedItems, NSError *activityError) {
+ // isAccepted = completed;
+ // emit finished();
+ // }];
+
+// [qtController presentViewController:activityController animated:YES completion:nil];
+// UIPopoverPresentationController *popController = activityController.popoverPresentationController;
+// if (popController) {
+// popController.sourceView = qtController.view;
+// popController.sourceRect = CGRectMake(100, 100, 100, 100);
+// }
+
+ QEventLoop wait;
+ QObject::connect(this, &IosController::finished, &wait, &QEventLoop::quit);
+ wait.exec();
+
+ return isAccepted;
+}
+
+QString IosController::openFile() {
+ // UIDocumentPickerViewController *documentPicker = [[UIDocumentPickerViewController alloc] initWithDocumentTypes:@[@"public.item"] inMode:UIDocumentPickerModeOpen];
+
+ // DocumentPickerDelegate *documentPickerDelegate = [[DocumentPickerDelegate alloc] init];
+ // documentPicker.delegate = documentPickerDelegate;
+
+ // UIViewController *qtController = getViewController();
+ // if (!qtController) return;
+
+ // [qtController presentViewController:documentPicker animated:YES completion:nil];
+
+ __block QString filePath;
+
+ // documentPickerDelegate.documentPickerClosedCallback = ^(NSString *path) {
+ // if (path) {
+ // filePath = QString::fromUtf8(path.UTF8String);
+ // } else {
+ // filePath = QString();
+ // }
+ // emit finished();
+ // };
+
+ QEventLoop wait;
+ QObject::connect(this, &IosController::finished, &wait, &QEventLoop::quit);
+ wait.exec();
+
+ return filePath;
+}
+
+void IosController::requestInetAccess() {
+ NSURL *url = [NSURL URLWithString:@"http://captive.apple.com/generate_204"];
+ if (url) {
+ qDebug() << "IosController::requestInetAccess URL error";
+ return;
+ }
+
+ NSURLSession *session = [NSURLSession sharedSession];
+ NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
+ if (error) {
+ qDebug() << "IosController::requestInetAccess error:" << error.localizedDescription;
+ } else {
+ NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
+ QString responseBody = QString::fromUtf8((const char*)data.bytes, data.length);
+ qDebug() << "IosController::requestInetAccess server response:" << httpResponse.statusCode << "\n\n" <
+#import
+#import
+//#include
+#include
+
+class IosController;
+
+@interface IosControllerWrapper : NSObject {
+ IosController *cppController;
+}
+
+- (instancetype)initWithCppController:(IosController *)controller;
+- (void)vpnStatusDidChange:(NSNotification *)notification;
+- (void)vpnConfigurationDidChange:(NSNotification *)notification;
+
+@end
+
+typedef void (^DocumentPickerClosedCallback)(NSString *path);
+
+//@interface DocumentPickerDelegate : NSObject
+
+//@property (nonatomic, copy) DocumentPickerClosedCallback documentPickerClosedCallback;
+
+//@end
diff --git a/client/platforms/macos/ios_controller_wrapper.mm b/client/platforms/macos/ios_controller_wrapper.mm
new file mode 100644
index 00000000..f5aa3e4f
--- /dev/null
+++ b/client/platforms/macos/ios_controller_wrapper.mm
@@ -0,0 +1,45 @@
+#import "ios_controller_wrapper.h"
+#include "ios_controller.h"
+
+@implementation IosControllerWrapper
+
+- (instancetype)initWithCppController:(IosController *)controller {
+ self = [super init];
+ if (self) {
+ cppController = controller;
+ }
+ return self;
+}
+
+- (void)vpnStatusDidChange:(NSNotification *)notification {
+
+ NETunnelProviderSession *session = (NETunnelProviderSession *)notification.object;
+
+ if (session ) {
+ cppController->vpnStatusDidChange(session);
+ }
+}
+
+- (void) vpnConfigurationDidChange:(NSNotification *)notification {
+// cppController->vpnStatusDidChange(notification);
+}
+
+@end
+
+//@implementation DocumentPickerDelegate
+
+//- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentsAtURLs:(NSArray *)urls {
+// for (NSURL *url in urls) {
+// if (self.documentPickerClosedCallback) {
+// self.documentPickerClosedCallback([url path]);
+// }
+// }
+//}
+
+//- (void)documentPickerWasCancelled:(UIDocumentPickerViewController *)controller {
+// if (self.documentPickerClosedCallback) {
+// self.documentPickerClosedCallback(nil);
+// }
+//}
+
+//@end
diff --git a/client/platforms/macos/iosglue.mm b/client/platforms/macos/iosglue.mm
new file mode 100644
index 00000000..1f3283e8
--- /dev/null
+++ b/client/platforms/macos/iosglue.mm
@@ -0,0 +1,244 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// This file contains all the C functions needed by the Wireguard swift code.
+
+#include
+#include
+
+#ifndef NETWORK_EXTENSION
+//# include "logger.h"
+#else
+# import
+# import
+#endif
+
+#define MAX_LOG_FILE_SIZE 204800
+
+// Key base64/hex functions
+// ------------------------
+
+#define WG_KEY_LEN (32)
+#define WG_KEY_LEN_BASE64 (45)
+#define WG_KEY_LEN_HEX (65)
+
+#define EXPORT __attribute__((visibility("default")))
+
+extern "C" {
+EXPORT void key_to_base64(char base64[WG_KEY_LEN_BASE64], const uint8_t key[WG_KEY_LEN]);
+EXPORT bool key_from_base64(uint8_t key[WG_KEY_LEN], const char* base64);
+
+EXPORT void key_to_hex(char hex[WG_KEY_LEN_HEX], const uint8_t key[WG_KEY_LEN]);
+EXPORT bool key_from_hex(uint8_t key[WG_KEY_LEN], const char* hex);
+
+EXPORT bool key_eq(const uint8_t key1[WG_KEY_LEN], const uint8_t key2[WG_KEY_LEN]);
+
+EXPORT void write_msg_to_log(const char* tag, const char* msg);
+}
+
+EXPORT void key_to_base64(char base64[WG_KEY_LEN_BASE64], const uint8_t key[WG_KEY_LEN]) {
+ const char range[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+ const char padchar = '=';
+ int padlen = 0;
+
+ char* out = base64;
+ const uint8_t* in = key;
+
+ for (int i = 0; i < WG_KEY_LEN;) {
+ int chunk = 0;
+ chunk |= int(in[i++]) << 16;
+ if (i == WG_KEY_LEN) {
+ padlen = 2;
+ } else {
+ chunk |= int(in[i++]) << 8;
+ if (i == WG_KEY_LEN) {
+ padlen = 1;
+ } else {
+ chunk |= int(in[i++]);
+ }
+ }
+
+ int j = (chunk & 0x00fc0000) >> 18;
+ int k = (chunk & 0x0003f000) >> 12;
+ int l = (chunk & 0x00000fc0) >> 6;
+ int m = (chunk & 0x0000003f);
+
+ *out++ = range[j];
+ *out++ = range[k];
+
+ if (padlen > 1) {
+ *out++ = padchar;
+ } else {
+ *out++ = range[l];
+ }
+ if (padlen > 0) {
+ *out++ = padchar;
+ } else {
+ *out++ = range[m];
+ }
+ }
+
+ base64[WG_KEY_LEN_BASE64 - 1] = 0;
+}
+
+EXPORT bool key_from_base64(uint8_t key[WG_KEY_LEN], const char* base64) {
+ if (strlen(base64) != WG_KEY_LEN_BASE64 - 1 || base64[WG_KEY_LEN_BASE64 - 2] != '=') {
+ return false;
+ }
+
+ unsigned int buf = 0;
+ int nbits = 0;
+ uint8_t* out = key;
+ int offset = 0;
+ for (int i = 0; i < WG_KEY_LEN_BASE64; ++i) {
+ int ch = base64[i];
+ int d;
+
+ if (ch >= 'A' && ch <= 'Z') {
+ d = ch - 'A';
+ } else if (ch >= 'a' && ch <= 'z') {
+ d = ch - 'a' + 26;
+ } else if (ch >= '0' && ch <= '9') {
+ d = ch - '0' + 52;
+ } else if (ch == '+') {
+ d = 62;
+ } else if (ch == '/') {
+ d = 63;
+ } else {
+ d = -1;
+ }
+
+ if (d != -1) {
+ buf = (buf << 6) | d;
+ nbits += 6;
+ if (nbits >= 8) {
+ nbits -= 8;
+ out[offset++] = buf >> nbits;
+ buf &= (1 << nbits) - 1;
+ }
+ }
+ }
+
+ return true;
+}
+
+inline char toHex(uint8_t value) { return "0123456789abcdef"[value & 0xF]; }
+
+inline int fromHex(uint8_t c) {
+ return ((c >= '0') && (c <= '9'))
+ ? int(c - '0')
+ : ((c >= 'A') && (c <= 'F')) ? int(c - 'A' + 10)
+ : ((c >= 'a') && (c <= 'f')) ? int(c - 'a' + 10) : -1;
+}
+
+EXPORT void key_to_hex(char hex[WG_KEY_LEN_HEX], const uint8_t key[WG_KEY_LEN]) {
+ char* hexData = hex;
+ const unsigned char* data = (const unsigned char*)key;
+ for (int i = 0, o = 0; i < WG_KEY_LEN; ++i) {
+ hexData[o++] = toHex(data[i] >> 4);
+ hexData[o++] = toHex(data[i] & 0xf);
+ }
+
+ hex[WG_KEY_LEN_HEX - 1] = 0;
+}
+
+EXPORT bool key_from_hex(uint8_t key[WG_KEY_LEN], const char* hex) {
+ if (strlen(hex) != WG_KEY_LEN_HEX - 1) {
+ return false;
+ }
+
+ bool odd_digit = true;
+ unsigned char* result = (unsigned char*)key + WG_KEY_LEN;
+ for (int i = WG_KEY_LEN_HEX - 1; i >= 0; --i) {
+ int tmp = fromHex((unsigned char)(hex[i]));
+ if (tmp == -1) {
+ continue;
+ }
+
+ if (odd_digit) {
+ --result;
+ *result = tmp;
+ odd_digit = false;
+ } else {
+ *result |= tmp << 4;
+ odd_digit = true;
+ }
+ }
+
+ return true;
+}
+
+EXPORT bool key_eq(const uint8_t key1[WG_KEY_LEN], const uint8_t key2[WG_KEY_LEN]) {
+ for (int i = 0; i < WG_KEY_LEN; i++) {
+ if (key1[i] != key2[i]) {
+ return false;
+ }
+ }
+ return true;
+}
+
+// Logging functions
+// -----------------
+
+
+EXPORT void write_msg_to_log(const char* tag, const char* msg) {
+#ifndef NETWORK_EXTENSION
+// logger.debug() << "Swift log - tag:" << tag << "msg: " << msg;
+#else
+ os_log_with_type(OS_LOG_DEFAULT, OS_LOG_TYPE_DEBUG, "tag: %s - msg: %s", tag, msg);
+
+ @autoreleasepool {
+ NSString* groupId = [NSString stringWithUTF8String:GROUP_ID];
+ NSURL* groupPath =
+ [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:groupId];
+
+ NSURL* pathUrl = [groupPath URLByAppendingPathComponent:@"networkextension.log"];
+ NSString* path = [pathUrl path];
+
+ if (![[NSFileManager defaultManager] fileExistsAtPath:path]) {
+ [[NSFileManager defaultManager] createFileAtPath:path contents:nil attributes:nil];
+ } else {
+ NSError* error = nil;
+
+ NSDictionary* fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:path
+ error:&error];
+
+ if (error) {
+ return;
+ }
+
+ NSNumber* fileSizeNumber = [fileAttributes objectForKey:NSFileSize];
+ long long fileSize = [fileSizeNumber longLongValue];
+
+ if (fileSize > MAX_LOG_FILE_SIZE) {
+ [[NSFileManager defaultManager] removeItemAtPath:path error:&error];
+ [[NSFileManager defaultManager] createFileAtPath:path contents:nil attributes:nil];
+ }
+ }
+
+ NSError* error = nil;
+ NSFileHandle* fh = [NSFileHandle fileHandleForWritingToURL:pathUrl error:&error];
+ if (!fh) {
+ return;
+ }
+
+ NSString* dateString = [NSDateFormatter localizedStringFromDate:[NSDate date]
+ dateStyle:NSDateFormatterShortStyle
+ timeStyle:NSDateFormatterFullStyle];
+
+ NSString* str = [NSString stringWithFormat:@" - %s\n", msg];
+ NSData* data =
+ [[dateString stringByAppendingString:str] dataUsingEncoding:NSUTF8StringEncoding];
+
+ @try {
+ [fh seekToEndOfFile];
+ [fh writeData:data];
+ } @catch (NSException* exception) {
+ }
+
+ [fh closeFile];
+ }
+
+#endif
+}
diff --git a/client/platforms/macos/iosnetworkwatcher.h b/client/platforms/macos/iosnetworkwatcher.h
new file mode 100644
index 00000000..70609e1f
--- /dev/null
+++ b/client/platforms/macos/iosnetworkwatcher.h
@@ -0,0 +1,31 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef IOSNETWORKWATCHER_H
+#define IOSNETWORKWATCHER_H
+
+#include
+
+#include "networkwatcherimpl.h"
+
+class IOSNetworkWatcher : public NetworkWatcherImpl {
+ public:
+ explicit IOSNetworkWatcher(QObject* parent);
+ ~IOSNetworkWatcher();
+
+ void initialize() override;
+
+ private:
+ NetworkWatcherImpl::TransportType toTransportType(nw_path_t path);
+ void controllerStateChanged();
+
+ NetworkWatcherImpl::TransportType m_currentDefaultTransport =
+ NetworkWatcherImpl::TransportType_Unknown;
+ NetworkWatcherImpl::TransportType m_currentVPNTransport =
+ NetworkWatcherImpl::TransportType_Unknown;
+ nw_path_monitor_t m_networkMonitor = nil;
+ nw_connection_t m_observableConnection = nil;
+};
+
+#endif // IOSNETWORKWATCHER_H
diff --git a/client/platforms/macos/iosnetworkwatcher.mm b/client/platforms/macos/iosnetworkwatcher.mm
new file mode 100644
index 00000000..720b303b
--- /dev/null
+++ b/client/platforms/macos/iosnetworkwatcher.mm
@@ -0,0 +1,69 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "iosnetworkwatcher.h"
+
+#include "leakdetector.h"
+#include "logger.h"
+
+#import
+
+namespace {
+Logger logger("IOSNetworkWatcher");
+dispatch_queue_t s_queue = dispatch_queue_create("VPNNetwork.queue", DISPATCH_QUEUE_SERIAL);
+}
+
+IOSNetworkWatcher::IOSNetworkWatcher(QObject* parent) : NetworkWatcherImpl(parent) {
+ MZ_COUNT_CTOR(IOSNetworkWatcher);
+}
+
+IOSNetworkWatcher::~IOSNetworkWatcher() {
+ MZ_COUNT_DTOR(IOSNetworkWatcher);
+ if (m_networkMonitor != nil) {
+ nw_path_monitor_cancel(m_networkMonitor);
+ nw_release(m_networkMonitor);
+ }
+}
+
+void IOSNetworkWatcher::initialize() {
+ m_networkMonitor = nw_path_monitor_create();
+ nw_path_monitor_set_queue(m_networkMonitor, s_queue);
+ nw_path_monitor_set_update_handler(m_networkMonitor, ^(nw_path_t _Nonnull path) {
+ m_currentDefaultTransport = toTransportType(path);
+ });
+ nw_path_monitor_start(m_networkMonitor);
+
+ //TODO IMPL FOR AMNEZIA
+}
+
+NetworkWatcherImpl::TransportType IOSNetworkWatcher::toTransportType(nw_path_t path) {
+ if (path == nil) {
+ return NetworkWatcherImpl::TransportType_Unknown;
+ }
+ auto status = nw_path_get_status(path);
+ if (status != nw_path_status_satisfied && status != nw_path_status_satisfiable) {
+ // We're offline.
+ return NetworkWatcherImpl::TransportType_None;
+ }
+ if (nw_path_uses_interface_type(path, nw_interface_type_wifi)) {
+ return NetworkWatcherImpl::TransportType_WiFi;
+ }
+ if (nw_path_uses_interface_type(path, nw_interface_type_wired)) {
+ return NetworkWatcherImpl::TransportType_Ethernet;
+ }
+ if (nw_path_uses_interface_type(path, nw_interface_type_cellular)) {
+ return NetworkWatcherImpl::TransportType_Cellular;
+ }
+ if (nw_path_uses_interface_type(path, nw_interface_type_other)) {
+ return NetworkWatcherImpl::TransportType_Other;
+ }
+ if (nw_path_uses_interface_type(path, nw_interface_type_loopback)) {
+ return NetworkWatcherImpl::TransportType_Other;
+ }
+ return NetworkWatcherImpl::TransportType_Unknown;
+}
+
+void IOSNetworkWatcher::controllerStateChanged() {
+ //TODO IMPL FOR AMNEZIA
+}
diff --git a/client/platforms/macos/iosnotificationhandler.h b/client/platforms/macos/iosnotificationhandler.h
new file mode 100644
index 00000000..2845016a
--- /dev/null
+++ b/client/platforms/macos/iosnotificationhandler.h
@@ -0,0 +1,28 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef IOSNOTIFICATIONHANDLER_H
+#define IOSNOTIFICATIONHANDLER_H
+
+#include "ui/notificationhandler.h"
+
+#include
+
+class IOSNotificationHandler final : public NotificationHandler {
+ Q_DISABLE_COPY_MOVE(IOSNotificationHandler)
+
+ public:
+ IOSNotificationHandler(QObject* parent);
+ ~IOSNotificationHandler();
+
+ protected:
+ void notify(Message type, const QString& title, const QString& message,
+ int timerMsec) override;
+
+ private:
+ void* m_delegate = nullptr;
+};
+
+
+#endif // IOSNOTIFICATIONHANDLER_H
diff --git a/client/platforms/macos/iosnotificationhandler.mm b/client/platforms/macos/iosnotificationhandler.mm
new file mode 100644
index 00000000..5759c892
--- /dev/null
+++ b/client/platforms/macos/iosnotificationhandler.mm
@@ -0,0 +1,90 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "platforms/ios/iosnotificationhandler.h"
+
+#import
+#import
+//#import
+
+/*
+@interface IOSNotificationDelegate
+ : UIResponder {
+ IOSNotificationHandler* m_iosNotificationHandler;
+}
+@end
+
+@implementation IOSNotificationDelegate
+
+- (id)initWithObject:(IOSNotificationHandler*)notification {
+ self = [super init];
+ if (self) {
+ m_iosNotificationHandler = notification;
+ }
+ return self;
+}
+
+- (void)userNotificationCenter:(UNUserNotificationCenter*)center
+ willPresentNotification:(UNNotification*)notification
+ withCompletionHandler:
+ (void (^)(UNNotificationPresentationOptions options))completionHandler {
+ Q_UNUSED(center)
+ completionHandler(UNNotificationPresentationOptionAlert);
+}
+
+- (void)userNotificationCenter:(UNUserNotificationCenter*)center
+ didReceiveNotificationResponse:(UNNotificationResponse*)response
+ withCompletionHandler:(void (^)())completionHandler {
+ Q_UNUSED(center)
+ Q_UNUSED(response)
+ completionHandler();
+}
+@end
+
+IOSNotificationHandler::IOSNotificationHandler(QObject* parent) : NotificationHandler(parent) {
+
+ UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];
+ [center requestAuthorizationWithOptions:(UNAuthorizationOptionSound | UNAuthorizationOptionAlert |
+ UNAuthorizationOptionBadge)
+ completionHandler:^(BOOL granted, NSError* _Nullable error) {
+ Q_UNUSED(granted);
+ if (!error) {
+ m_delegate = [[IOSNotificationDelegate alloc] initWithObject:this];
+ }
+ }];
+}
+
+IOSNotificationHandler::~IOSNotificationHandler() { }
+
+void IOSNotificationHandler::notify(NotificationHandler::Message type, const QString& title,
+ const QString& message, int timerMsec) {
+ Q_UNUSED(type);
+
+ if (!m_delegate) {
+ return;
+ }
+
+ UNMutableNotificationContent* content = [[UNMutableNotificationContent alloc] init];
+ content.title = title.toNSString();
+ content.body = message.toNSString();
+ content.sound = [UNNotificationSound defaultSound];
+
+ int timerSec = timerMsec / 1000;
+ UNTimeIntervalNotificationTrigger* trigger =
+ [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:timerSec repeats:NO];
+
+ UNNotificationRequest* request = [UNNotificationRequest requestWithIdentifier:@"amneziavpn"
+ content:content
+ trigger:trigger];
+
+ UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];
+ center.delegate = id(m_delegate);
+
+ [center addNotificationRequest:request
+ withCompletionHandler:^(NSError* _Nullable error) {
+ if (error) {
+ NSLog(@"Local Notification failed");
+ }
+ }];
+}*/
diff --git a/client/protocols/openvpnovercloakprotocol.h b/client/protocols/openvpnovercloakprotocol.h
index 7fa3551e..a828e0d3 100644
--- a/client/protocols/openvpnovercloakprotocol.h
+++ b/client/protocols/openvpnovercloakprotocol.h
@@ -26,7 +26,7 @@ private:
#ifndef Q_OS_IOS
QProcess m_ckProcess;
#endif
- QTemporaryFile m_cloakCfgFile;
+ // QTemporaryFile m_cloakCfgFile;
QMetaObject::Connection m_errorHandlerConnection;
};
diff --git a/client/protocols/openvpnprotocol.h b/client/protocols/openvpnprotocol.h
index b07d1268..0b3576cd 100644
--- a/client/protocols/openvpnprotocol.h
+++ b/client/protocols/openvpnprotocol.h
@@ -45,7 +45,7 @@ private:
ManagementServer m_managementServer;
QString m_configFileName;
QJsonObject m_configData;
- QTemporaryFile m_configFile;
+ // QTemporaryFile m_configFile;
uint selectMgmtPort();
@@ -53,7 +53,7 @@ private:
void updateRouteGateway(QString line);
void updateVpnGateway(const QString &line);
- QSharedPointer m_openVpnProcess;
+ // QSharedPointer m_openVpnProcess;
};
#endif // OPENVPNPROTOCOL_H
diff --git a/client/protocols/shadowsocksvpnprotocol.h b/client/protocols/shadowsocksvpnprotocol.h
index e5851255..abdb8286 100644
--- a/client/protocols/shadowsocksvpnprotocol.h
+++ b/client/protocols/shadowsocksvpnprotocol.h
@@ -5,6 +5,8 @@
#include "QProcess"
#include "containers/containers_defs.h"
+#define Q_OS_IOS 1
+
class ShadowSocksVpnProtocol : public OpenVpnProtocol
{
public:
@@ -27,7 +29,7 @@ private:
#ifndef Q_OS_IOS
QProcess m_ssProcess;
#endif
- QTemporaryFile m_shadowSocksCfgFile;
+// QTemporaryFile m_shadowSocksCfgFile;
};
#endif // SHADOWSOCKSVPNPROTOCOL_H
diff --git a/client/protocols/vpnprotocol.cpp b/client/protocols/vpnprotocol.cpp
index 056089b8..70c767a7 100644
--- a/client/protocols/vpnprotocol.cpp
+++ b/client/protocols/vpnprotocol.cpp
@@ -1,16 +1,11 @@
#include
#include
+#define Q_OS_IOS 1
+
#include "core/errorstrings.h"
#include "vpnprotocol.h"
-#if defined(Q_OS_WINDOWS) || defined(Q_OS_MACX) || (defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID))
- #include "openvpnovercloakprotocol.h"
- #include "openvpnprotocol.h"
- #include "shadowsocksvpnprotocol.h"
- #include "wireguardprotocol.h"
- #include "xrayprotocol.h"
-#endif
#ifdef Q_OS_WINDOWS
#include "ikev2_vpn_protocol_windows.h"
@@ -108,15 +103,6 @@ VpnProtocol *VpnProtocol::factory(DockerContainer container, const QJsonObject &
switch (container) {
#if defined(Q_OS_WINDOWS)
case DockerContainer::Ipsec: return new Ikev2Protocol(configuration);
-#endif
-#if defined(Q_OS_WINDOWS) || defined(Q_OS_MACX) || (defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID))
- case DockerContainer::OpenVpn: return new OpenVpnProtocol(configuration);
- case DockerContainer::Cloak: return new OpenVpnOverCloakProtocol(configuration);
- case DockerContainer::ShadowSocks: return new ShadowSocksVpnProtocol(configuration);
- case DockerContainer::WireGuard: return new WireguardProtocol(configuration);
- case DockerContainer::Awg: return new WireguardProtocol(configuration);
- case DockerContainer::Xray: return new XrayProtocol(configuration);
- case DockerContainer::SSXray: return new XrayProtocol(configuration);
#endif
default: return nullptr;
}
diff --git a/client/translations/amneziavpn_ar_EG.ts b/client/translations/amneziavpn_ar_EG.ts
index 8e6f2764..941aa7ee 100644
--- a/client/translations/amneziavpn_ar_EG.ts
+++ b/client/translations/amneziavpn_ar_EG.ts
@@ -1,67 +1,113 @@
+
+ AppSplitTunnelingController
+
+
+ Application added: %1
+
+
+
+
+ The application has already been added
+
+
+
+
+ The selected applications have been added
+
+
+
+
+ Application removed: %1
+
+
+
+
+ ConnectButton
+
+
+ Unable to disconnect during configuration preparation
+
+
+ConnectionController
-
-
-
-
+
+
+
+ Connectاتصل
-
+ VPN Protocols is not installed.
Please install VPN container at firstلم يتم تثبيت بروتوكولات VPN, من فضلك قم بتنزيل حاوية VPN اولاً
-
+ Connecting...اتصال...
-
+ Connectedتم الاتصال
-
+ Reconnecting...إعادة الاتصال...
-
+ Disconnecting...إنهاء الاتصال...
-
+
+ Preparing...
+
+
+
+ Settings updated successfully, reconnnection...تم تحديث الاعدادات بنجاح, جاري إعادة الاتصال...
-
+ Settings updated successfullyتم تحديث الاعدادات بنجاح
+
+
+ The selected protocol is not supported on the current platform
+ البروتوكول المحدد غير مدعوم علي المنصة الحالية
+
+
+
+ unable to create configuration
+
+ ConnectionTypeSelectionDrawer
-
+ Add new connectionإضافة اتصال جديد
-
+ Configure your serverقم بتهيئة الخادم الخاص بك
-
+ Open config file, key or QR codeافتح ملف تعريف, مفتاح تعريف او رمز QR
@@ -92,7 +138,7 @@
ExportController
-
+ Access error!خطأ في الوصول!
@@ -100,57 +146,58 @@
HomeContainersListView
-
+ Unable change protocol while there is an active connectionقم بتغيير البروتوكول عند تواجد اتصال
- The selected protocol is not supported on the current platform
- البروتوكول المحدد غير مدعوم علي المنصة الحالية
+ البروتوكول المحدد غير مدعوم علي المنصة الحاليةHomeSplitTunnelingDrawer
-
+ Split tunnelingتقسيم الانفاق
-
+ Allows you to connect to some sites or applications through a VPN connection and bypass othersيسمح لك بألاتصال ببعض المواقع او البرامج خلال اتصال VPN و تجاوز الاخرين
-
+ Split tunneling on the serverتقسيم الانفاق علي الخادم
-
+ Enabled
Can't be disabled for current serverمٌفعل
لا يمكن إقافة للخادم الحالي
-
+ Site-based split tunnelingانقسام الانفاق القائم علي الموقع
-
+
+ Enabledمٌفعل
-
+
+ Disabledمٌعطل
-
+ App-based split tunnelingانقسام الانفاق القائم علي التطبيق
@@ -158,21 +205,26 @@ Can't be disabled for current server
ImportController
-
+ Unable to open file
-
-
+
+ Invalid configuration file
-
+ Scanned %1 of %2.تم فحص%1 من %2.
+
+
+ In the imported configuration, potentially dangerous lines were found:
+
+ InstallController
@@ -185,26 +237,24 @@ Can't be disabled for current server
بالفعل مٌثبت علي الخادم
-
-
+ %1 installed successfully. %1 تم التثبيت بنجاح.
-
-
+ %1 is already installed on the server. %1 بالفعل مٌثبت علي الخادم.
-
+
Added containers that were already installed on the server
تمت إضافة الحاويات التي كانت مٌثبتة بالفعل علي الخادم
-
+
Already installed containers were found on the server. All installed containers have been added to the application
@@ -212,30 +262,35 @@ Already installed containers were found on the server. All installed containers
تمت إضافة جميع الحاويات المٌثبتة إلي التطبيق
-
+ Settings updated successfullyتم تحديث الاعدادات بنجاح
-
+ Server '%1' was rebootedتمت إعادة تشغيل الخادم%1
-
+ Server '%1' was removedتمت إزالة الخادم '%1'
-
+ All containers from server '%1' have been removedقد تم حذفها '%1' جميع الحاويات من الخادم
-
+ %1 has been removed from the server '%2'%1 تم حدف '%2' اسم الخادم
+
+
+ %1 cached profile cleared
+
+ 1% has been removed from the server '%2'%1 من الخادم '%2' تم مسحة
@@ -253,16 +308,34 @@ Already installed containers were found on the server. All installed containers
قد تمت إزالتة من الخادم
-
+ Please login as the userمن فضلك قم بتسجيل الدخول كمستخدم
-
+ Server added successfullyتمت إضافة الخادم بنجاح
+
+ InstalledAppsDrawer
+
+
+ Choose application
+
+
+
+
+ application name
+
+
+
+
+ Add selected
+
+
+KeyChainClass
@@ -284,28 +357,28 @@ Already installed containers were found on the server. All installed containers
NotificationHandler
-
-
+
+ AmneziaVPNAmneziaVPN
-
+ VPN Connectedتم الاتصال
-
+ VPN Disconnectedتم إنهاء الاتصال
-
+ AmneziaVPN notificationإشعار من AmneziaVPN
-
+ Unsecured network detected: تم العثور علي شبكة غير مؤمنة:
@@ -326,32 +399,32 @@ Already installed containers were found on the server. All installed containers
PageHome
-
+ Logging enabled
-
+ Split tunneling enabledتقسيم الانفاق مٌفعل
-
+ Split tunneling disabledتقسيم الانفاق مٌعطل
-
+ VPN protocolبروتوكول VPN
-
+ Serversالخوادم
-
+ Unable change server while there is an active connectionلا يمكن تغير الخادم بينما هناك اتصال مفعل
@@ -359,270 +432,287 @@ Already installed containers were found on the server. All installed containers
PageProtocolAwgSettings
-
+ AmneziaWG settingsاعدادات AmneziaWG
-
+ Portمنفذ
-
+ MTU
- Remove AmneziaWG
- قم بحذف AmneziaWG
+ قم بحذف AmneziaWG
- Remove AmneziaWG from server?
- قم بحذف AmneziaWG من الخادم؟
+ قم بحذف AmneziaWG من الخادم؟
-
-
+ All users with whom you shared a connection with will no longer be able to connect to it.جميع المستخدمين الذين شاركت معهم اتصال لن يكونو قادرين علي الاتصال مرة اخري.
-
+ Saveاحفظ
-
+
+ The values of the H1-H4 fields must be unique
+
+
+
+
+ The value of the field S1 + message initiation size (148) must not equal S2 + message response size (92)
+
+
+
+ Save settings?احفظ الإعدادات؟
-
-
+ Continueواصل
-
-
+ Cancelإلغاء
+
+
+ Unable change settings while there is an active connection
+
+ PageProtocolCloakSettings
-
+ Cloak settingsCloak إعدادات
-
+ Disguised as traffic fromمتنكراً في حركة مرور من
-
+ Portمنفذ
-
-
+
+ Cipherالشفرة
-
+ Saveاحفظ
+
+
+ Unable change settings while there is an active connection
+
+ PageProtocolOpenVpnSettings
-
+ OpenVPN settingsOpenVPN اعدادات
-
+ VPN address subnetالشبكة الفرعية لعنوان VPN
-
+ Network protocolبروتوكول الشبكة
-
+ Portمنفذ
-
+ Auto-negotiate encryptionالتفاوض التلقائي علي الشبكة
-
-
+
+ Hash
-
+ SHA512
-
+ SHA384
-
+ SHA256
-
+ SHA3-512
-
+ SHA3-384
-
+ SHA3-256
-
+ whirlpool
-
+ BLAKE2b512
-
+ BLAKE2s256
-
+ SHA1
-
-
+
+ Cipherشفرة
-
+ AES-256-GCM
-
+ AES-192-GCM
-
+ AES-128-GCM
-
+ AES-256-CBC
-
+ AES-192-CBC
-
+ AES-128-CBC
-
+ ChaCha20-Poly1305
-
+ ARIA-256-CBC
-
+ CAMELLIA-256-CBC
-
+ noneلا شئ
-
+ TLS authTLS مصادقة
-
+ Block DNS requests outside of VPNاحظر طلبات DNS خارج ال VPN
-
+ Additional client configuration commandsاوامر تكوين العميل الاضافية
-
-
+
+ Commands:الاوامر:
-
+ Additional server configuration commandsاوامر تكوين الخادم الاضافية
-
+
+ Unable change settings while there is an active connection
+
+
+ Remove OpenVPN
- احذف OpenVPN
+ احذف OpenVPN
- Remove OpenVPN from server?
- احذف OpenVPN من الخادم?
+ احذف OpenVPN من الخادم?
- All users with whom you shared a connection with will no longer be able to connect to it.
- جميع المستخدمين الذين شاركت معهم اتصال لن يكونو قادرين علي الاتصال مرة اخري.
+ جميع المستخدمين الذين شاركت معهم اتصال لن يكونو قادرين علي الاتصال مرة اخري.
-
+ Saveاحفظ
@@ -631,25 +721,23 @@ Already installed containers were found on the server. All installed containers
جميع المستخدمين الذين شاركت اتصال معهم لن يستطيعو الاتصال بعد الان
- Continue
- واصل
+ واصل
- Cancel
- إلغاء
+ إلغاءPageProtocolRaw
-
+ settings إعدادات
-
+ Show connection optionsاظهر اختيارات الاتصال
@@ -658,22 +746,22 @@ Already installed containers were found on the server. All installed containers
اختيارات الاتصال
-
+ Connection options %1%1 اختيارات الاتصال
-
+ Remove احذف
-
+ Remove %1 from server?احذف %1 من الخادم ?
-
+ All users with whom you shared a connection with will no longer be able to connect to it.جميع المستخدمين الذين شاركت معهم اتصال لن يكونو قادرين علي الاتصال مرة اخري.
@@ -686,12 +774,12 @@ Already installed containers were found on the server. All installed containers
جميع المستخدمين الذين شاركت اتصال معهم لن يستطيعو الاتصال بعد الان
-
+ Continueواصل
-
+ Cancelإلغاء
@@ -699,110 +787,135 @@ Already installed containers were found on the server. All installed containers
PageProtocolShadowSocksSettings
-
+ Shadowsocks settingsShadowsocks إعدادات
-
+ Portمنفذ
-
-
+
+ Cipherتشفير
-
+ Saveاحفظ
+
+
+ Unable change settings while there is an active connection
+
+ PageProtocolWireGuardSettings
-
+ WG settings
-
+ Portمنفذ
-
+ MTU
-
- Remove WG
+
+ Unable change settings while there is an active connection
-
- Remove WG from server?
-
-
-
- All users with whom you shared a connection will no longer be able to connect to it.
- جميع المستخدمين الذين شاركت معاهم اتصال لن يستطيعو الاتصال بعد الان.
+ جميع المستخدمين الذين شاركت معاهم اتصال لن يستطيعو الاتصال بعد الان.
- Continue
- واصل
+ واصل
- Cancel
- إلغاء
+ إلغاء
-
+ Saveاحفظ
+
+ PageProtocolXraySettings
+
+
+ XRay settings
+
+
+
+
+ Disguised as traffic from
+ متنكراً في حركة مرور من
+
+
+
+ Save
+ احفظ
+
+
+
+ Unable change settings while there is an active connection
+
+
+PageServiceDnsSettings
-
+ A DNS service is installed on your server, and it is only accessible via VPN.
تم تثبيت خدمة DNS علي الخادم الخاص بك, و فقط متاح من خلال VPN.
-
+ The DNS address is the same as the address of your server. You can configure DNS in the settings, under the connections tab.عنوان ال DNS متطابق لنفس عنوان الخادم بك, يمكنك تهيئة DNS في الاعدادات, تحت علامة تبويب الاتصال.
-
+ Remove احذف
-
+ Remove %1 from server?احذف %1 ?
+
+
+ Cannot remove Amnezia DNS from running server
+
+ from server? من الخادم
-
+ Continueواصل
-
+ Cancelإلغاء
@@ -810,145 +923,215 @@ Already installed containers were found on the server. All installed containers
PageServiceSftpSettings
-
+ Settings updated successfullyتم تحديث الإعدادات بنجاح
-
+ SFTP settingsSFTP إعدادات
-
+ Hostاستضافة
-
-
-
-
+
+
+
+ Copiedتم الاستنساخ
-
+ Portمنفذ
-
+ User nameاسم المستخدم
-
+ Passwordكلمة المرور
-
+ Mount folder on deviceقم بتثبيت المجلد علي الجهاز
-
+ In order to mount remote SFTP folder as local drive, perform following steps: <br>لتثبيت مجلد SFTP كمحرك اقراص محلي, اتبع هذه الخطوات : <br>
-
-
+
+ <br>1. Install the latest version of <br>1. تحميل اخر اصدار من
-
-
+
+ <br>2. Install the latest version of <br>2. تحمير اخر اصدار من
-
+ Detailed instructionsتعليمات مفصلة
-
+ Remove SFTP and all data stored thereامسح SFTP وجميع البيانات المخزنة
-
+ Remove SFTP and all data stored there?امسح SFTP وجميع البيانات المخزنة؟
-
+ Continueواصل
-
+ Cancelإلغاء
+
+ PageServiceSocksProxySettings
+
+
+ Settings updated successfully
+
+
+
+
+
+ SOCKS5 settings
+
+
+
+
+ Host
+ استضافة
+
+
+
+
+
+
+ Copied
+
+
+
+
+
+ Port
+ منفذ
+
+
+
+ User name
+ اسم المستخدم
+
+
+
+
+ Password
+ كلمة المرور
+
+
+
+ Username
+
+
+
+
+
+ Change connection settings
+
+
+
+
+ The port must be in the range of 1 to 65535
+
+
+
+
+ Password cannot be empty
+
+
+
+
+ Username cannot be empty
+
+
+PageServiceTorWebsiteSettings
-
+ Settings updated successfullyتم تحديث الإعدادات بنجاح
-
+ Tor website settingsTor إعدادات متصفح
-
+ Website addressعنوان المتصفح
-
+ Copiedتم الاستنساخ
-
+ Use <a href="https://www.torproject.org/download/" style="color: #FBB26A;">Tor Browser</a> to open this URL.
-
+ After creating your onion site, it takes a few minutes for the Tor network to make it available for use.
-
+ When configuring WordPress set the this onion address as domain.عند تكوين WordPress قم بتعيين عنوان ال onion هذا ك domain.
-
+ Remove websiteاحذف متصفح
-
+ The site with all data will be removed from the tor network.سيتم حذف الموقع وجميع البيانات من الشبكة.
-
+ Continueواصل
-
+ Cancelإلغاء
@@ -956,37 +1139,37 @@ Already installed containers were found on the server. All installed containers
PageSettings
-
+ Settingsإعدادات
-
+ Serversالخوادم
-
+ Connectionالاتصال
-
+ Applicationتطبيق
-
+ Backupنسخة احتياطية
-
+ About AmneziaVPNعن AmneziaVPN
-
+ Close applicationإغلاق التطبيق
@@ -1000,95 +1183,163 @@ And if you don't like the app, all the more support it - the donation will
وإذا لما يعجبك, فهذا سبب اكبر لدعمة - تستخدم التبرعات في تطوير التطبيق
-
+ Support Amneziaدعم Amenzia
-
+ Amnezia is a free and open-source application. You can support the developers if you like it.هو تطبيق مجاني ومفتوح المصدر يمكنك دعم مطورين Amnezia إذا اعجبك.
-
+ Contactsالتواصل
-
+ Telegram groupمجموعة ال Telegram
-
+ To discuss featuresلمناقشة الميزات
-
+ https://t.me/amnezia_vpn_en
-
+ Mailالبريد
-
+ For reviews and bug reportsلل مراجعات والابلاغات عن المشاكل
-
+ GitHubGitHub
-
+ https://github.com/amnezia-vpn/amnezia-client
-
+ Websiteموقع
-
+ https://amnezia.org
-
+ Software version: %1%1 :إصدار البرنامج
-
+ Check for updatesتحقق من وجود تحديثات
-
+ Privacy Policyسياسات الخصوصية
+
+ PageSettingsAppSplitTunneling
+
+
+ Cannot change split tunneling settings during active connection
+ لا يمكن تغير إعدادات تقسيم الانفاق بينما هناك اتصال مٌفعل
+
+
+
+ Only the apps from the list should have access via VPN
+
+
+
+
+ Apps from the list should not have access via VPN
+
+
+
+
+ App split tunneling
+
+
+
+
+ Mode
+ وضع
+
+
+
+ Remove
+ احذف
+
+
+
+ Continue
+ واصل
+
+
+
+ Cancel
+ إلغاء
+
+
+
+ application name
+
+
+
+
+ Open executable file
+
+
+
+
+ Executable file (*.*)
+
+
+PageSettingsApplication
-
+ Applicationتطبيق
-
+ Allow application screenshotsاسمح بلقطات شاشة التطبيق
-
+
+ Enable notifications
+
+
+
+
+ Enable notifications to show the VPN state in the status bar
+
+
+
+ Auto startتشغيل تلقائي
@@ -1101,80 +1352,85 @@ And if you don't like the app, all the more support it - the donation will
يبدأ
-
+ Launch the application every time the device is startsقم بتشغيل التطبيق فكل مرة يتم فيها تشغيل الجهاز
-
+ Auto connectاتصال تلقائي
-
+ Connect to VPN on app startاتصل ب ال VPN عند تشغيل التطبيق
-
+ Start minimizedابدأ ب الحجم الادني
-
+ Launch application minimizedتشغيل التطبيق في الحد الادني
-
+ Languageاللغة
-
+ Loggingتسجيل
-
+ Enabledمٌفعل
-
+ Disabledمٌعطل
-
+ Reset settings and remove all data from the applicationإعادة ضبط الاعدادات ومسح جميع البيانات من التطبيق
-
+ Reset settings and remove all data from the application?إعادة ضبط الاعدادات ومسح جميع البيانات من التطبيق؟
-
+ All settings will be reset to default. All installed AmneziaVPN services will still remain on the server.سيتم ضبط الاعدادات الافتراضية. جميع خدمات AmneziaVPN المٌثبتة ستبقي علي الخادم.
-
+ Continueواصل
-
+ Cancelإلغاء
+
+
+ Cannot reset settings during active connection
+
+ PageSettingsBackup
-
+ Settings restored from backup fileتم إعادة الاعدادات من ملف نسخة احتياطية
@@ -1183,86 +1439,91 @@ And if you don't like the app, all the more support it - the donation will
سيساعدك علي إعادة إعدادات الاتصال بسرعة عند إعادة تثبيت التطبيق
-
+ Back up your configurationقم بعمل نسخة احتياطية
-
+ You can save your settings to a backup file to restore them the next time you install the application.يمكنك حفظ الإعدادات في ملف نسخة احتياطية لأعادتهم في المرة القادمة التي تثبت فيها التطبيق.
-
+ The backup will contain your passwords and private keys for all servers added to AmneziaVPN. Keep this information in a secure place.ستحتوي النسخة الاحتياطية علي كلمات مرورك و المفاتيح الخاصة للخوادم المٌضافة إلي AmneziaVPN. احفظ هذه المعلومات في مكان امن.
-
+ Make a backupإضافة نسخة احتياطية
-
+ Save backup fileاحفظ ملف النسخه الاحتياطيه
-
-
+
+ Backup files (*.backup)ملفات نٌسخ احتياطية (*.backup)
-
+ Backup file savedتم حفظ ملف النسخ الاحتياطي
-
+ Restore from backupاسترجاع من ملف يحتوي علي نسخة احتياطية
-
+ Open backup fileافتح ملف نسخ احتياطي
-
+ Import settings from a backup file?استرد الإعدادات من ملف نسخ احتياطي؟
-
+ All current settings will be resetستتم إعادة ضبط جميع الإعدادات الحالية
-
+ Continueواصل
-
+ Cancelإلغاء
+
+
+ Cannot restore backup settings during active connection
+
+ PageSettingsConnection
-
+ Connectionالاتصال
-
+ When AmneziaDNS is not used or installedعندما يكون AmneziaDNS غير مٌثبت او غير مستخدم
-
+ Allows you to use the VPN only for certain Appsيسمح لك بأستخدام ال VPN علي تطبيقات معينة
@@ -1271,35 +1532,50 @@ And if you don't like the app, all the more support it - the donation will
استخدم AmneziaDNS إذا كان مٌثبت علي الخادم
-
+ Use AmneziaDNSاستخدم AmneziaDNS
-
+ If AmneziaDNS is installed on the serverفي حالة كان AmneziaDNS مٌثبت علي الخادم
-
+ DNS serversخوادم DNS
-
+ Site-based split tunnelingانقسام الانفاق القائم علي الموقع
-
+ Allows you to select which sites you want to access through the VPNيسمح لك بتحديد اي موقع تريد الوصول له عن طريق ال VPN
-
+ App-based split tunnelingانقسام الانفاق القائم علي التطبيق
+
+
+ KillSwitch
+
+
+
+
+ Disables your internet if your encrypted VPN connection drops out for any reason.
+
+
+
+
+ Cannot change killSwitch settings during active connection
+
+ Split site tunnelingقسم نفق الموقع
@@ -1316,62 +1592,62 @@ And if you don't like the app, all the more support it - the donation will
PageSettingsDns
-
+ Default server does not support custom DNSالخادم الافتراضي لا يدعم DNS مخصص
-
+ DNS serversخوادم ال DNS
-
+ If AmneziaDNS is not used or installedAmneziaVPN ليس مٌستخدم او مٌثبت
-
+ Primary DNSالرئيسي DNS
-
+ Secondary DNSالثانوي DNS
-
+ Restore defaultاستعادة الافتراضي
-
+ Restore default DNS settings?قم بأعادة ضبط إعدادات ال DNS الافتراضية؟
-
+ Continueواصل
-
+ Cancelإلغاء
-
+ Settings have been resetلم يتم إعادة ضبط الإعدادات
-
+ Saveاحفظ
-
+ Settings savedتم حفظ الإعدادات
@@ -1384,67 +1660,67 @@ And if you don't like the app, all the more support it - the donation will
-
+ Loggingالتسجيل
-
+ Enabling this function will save application's logs automatically. By default, logging functionality is disabled. Enable log saving in case of application malfunction.سيتم حفظ سجلات البرنامج بشكل تلقائي عند تفعيل هذه الميزة, بشكل افتراضي, هذه الميزة مٌعطلة. قم بتفعيل هذه الميزة في حالة هناك خلل في التطبيق.
-
+ Save logsاحفظ السجلات
-
+ Open folder with logsافتح مجلد يحتوي علي سجلات
-
+ Saveاحفظ
-
+ Logs files (*.log)ملفات الولوج (*.log)
-
+ Logs file savedتم حفظ ملف السجل
-
+ Save logs to fileاحفظ السجلات في ملف
-
+ Clear logs?مسح السجلات؟
-
+ Continueواصل
-
+ Cancelإلغاء
-
+ Logs have been cleaned upتم مسح السجلات
-
+ Clear logsاحذف السجلات
@@ -1452,37 +1728,34 @@ And if you don't like the app, all the more support it - the donation will
PageSettingsServerData
-
+ All installed containers have been added to the applicationتمت إضافة جميع الحاويات المٌثبتة للتطبيق
-
+ No new installed containers foundلم يتم العثور علي اي حاويات جديدة مٌثبتة
- Clear Amnezia cache
- حذف ذاكرة تخزين Amnezia المؤقتة
+ حذف ذاكرة تخزين Amnezia المؤقتة
- May be needed when changing other settings
- قد يكون ضروري عند تغير الإعدادات الاخري
+ قد يكون ضروري عند تغير الإعدادات الاخري
- Clear cached profiles?
- حذف الملفات الشخصية المخزنة مؤقتاً؟
+ حذف الملفات الشخصية المخزنة مؤقتاً؟
-
+ Do you want to reboot the server?هل تريد إعادة تشغيل الخادم؟
-
+ Do you want to clear server from Amnezia software?هل تريد حذف الخادم من Amnezia?
@@ -1492,75 +1765,93 @@ And if you don't like the app, all the more support it - the donation will
-
-
-
-
-
+
+
+
+ Continueواصل
-
-
-
-
-
+
+
+
+ Cancelإلغاء
-
+ Check the server for previously installed Amnezia servicesافحص الخادم عن اي خدمات Amnezia مٌثبتة سابقاُ
-
+ Add them to the application if they were not displayedاضفهم إلي التطبيق إذا لم يكونو ظاهرين
-
+ Reboot serverإعادة تشغيل الخادم
-
+ The reboot process may take approximately 30 seconds. Are you sure you wish to proceed?عملية إعادة التشغيل قد تستغرق 30 ثانية, هل تريد الاستكمال؟
-
+
+ Cannot reboot server during active connection
+
+
+
+ Remove server from applicationاحذف خادم من التطبيق
-
+ Do you want to remove the server from application?هل تريد حذف الخادم من التطبيق؟
-
+
+ Cannot remove server during active connection
+
+
+
+ All users whom you shared a connection with will no longer be able to connect to it.جميع المستخدمين الذين شاركت معهم اتصال لن يستطيعو الاتصال مرة اخري.
-
+
+ Cannot clear server from Amnezia software during active connection
+
+
+
+ Reset API configإعادة تكوين API
-
+ Do you want to reset API config?هل تريد إعادة تكوين API?
-
+
+ Cannot reset API config during active connection
+
+
+
+ All installed AmneziaVPN services will still remain on the server.جميع خدمات AmneziaVPN المٌثبتة ستظل علي الخادم.
-
+ Clear server from Amnezia softwareاحذف خادم من Amnezia
@@ -1568,27 +1859,27 @@ And if you don't like the app, all the more support it - the donation will
PageSettingsServerInfo
-
+ Server nameاسم الخادم
-
+ Saveاحفظ
-
+ Protocolsالبروتوكولات
-
+ Servicesالخدمات
-
+ Managementالإدارة
@@ -1596,26 +1887,51 @@ And if you don't like the app, all the more support it - the donation will
PageSettingsServerProtocol
-
+ settings الإعدادات
-
+
+ Clear %1 profile
+
+
+
+
+ Clear %1 profile?
+
+
+
+
+
+
+
+
+
+ Unable to clear %1 profile while there is an active connection
+
+
+
+ Remove احذف
-
+ All users with whom you shared a connection will no longer be able to connect to it.جميع المستخدمين الذين شاركت معاهم اتصال لن يستطيعو الاتصال بعد الان.
+
+
+ Cannot remove active container
+
+ from server? من الخادم؟
-
+ Remove %1 from server?احذف %1 من الخادم ?
@@ -1624,12 +1940,14 @@ And if you don't like the app, all the more support it - the donation will
جميع المستخدمين الذين شاركت اتصال معهم لن يستطيعو الاتصال بعد الان
-
+
+ Continueواصل
-
+
+ Cancelإلغاء
@@ -1637,7 +1955,7 @@ And if you don't like the app, all the more support it - the donation will
PageSettingsServersList
-
+ Serversالخوادم
@@ -1657,100 +1975,100 @@ And if you don't like the app, all the more support it - the donation will
قسم نفق الموقع
-
+ Default server does not support split tunneling functionالسرفر الافتراضي لا يدعم ميزة تقسيم الانفاق
-
+ Addresses from the list should not be accessed via VPNلا يجب الولوج للعنواين المذكورة هنا من خلال ال VPN
-
+ Split tunnelingتقسيم الانفاق
-
+ Modeوضع
-
+ Remove احذف
-
+ Continueواصل
-
+ Cancelإلغاء
-
+ Only the sites listed here will be accessed through the VPNسيتم الولوج للمواقع المذكورة هنا فقط عن طريق ال VPN
-
+ Cannot change split tunneling settings during active connectionلا يمكن تغير إعدادات تقسيم الانفاق بينما هناك اتصال مٌفعل
-
+ website or IPموقع او IP
-
+ Import / Export Sites
-
+ Importاسترد
-
+ Save site listاحفظ قائمة المواقع
-
+ Save sitesاحفظ المواقع
-
-
-
+
+
+ Sites files (*.json)
-
+ Import a list of sitesاسترد قائمة من المواقع
-
+ Replace site listتبديل قائمة المواقع
-
-
+
+ Open sites fileافتح ملف المواقع
-
+ Add imported sites to existing onesإضافة المواقع المستردة للمواقع الموجودة
@@ -1758,7 +2076,7 @@ And if you don't like the app, all the more support it - the donation will
PageSetupWizardConfigSource
-
+ Server connectionاتصال الخادم
@@ -1771,37 +2089,37 @@ It's okay as long as it's from someone you trust.
لا بأس طالما انه من شخص تثق به.
-
+ Do not use connection codes from untrusted sources, as they may be created to intercept your data.لا تستخدم رموز اتصال من مصادر غير موثوقة, حيث قد يكون تم إنشاؤها لاعتراض بياناتك.
-
+ What do you have?ماذا لديك؟
-
+ File with connection settings or backupملف إعدادات اتصال او نسخ احتياطي
-
+ File with connection settingsملف إعدادات اتصال
-
+ Open config fileافتح ملف تكوين
-
+ QR codeرمز QR
-
+ Key as textمفتاح كنص
@@ -1809,57 +2127,57 @@ It's okay as long as it's from someone you trust.
PageSetupWizardCredentials
-
+ Configure your serverتكوين الخادم الخاص بك
-
+ Server IP address [:port]عنوان خادم IP [:منفذ]
-
+ Continueواصل
-
+ All data you enter will remain strictly confidential and will not be shared or disclosed to the Amnezia or any third partiesستظل جميع البيانات التي تدخلها سرية للغاية ولن تتم مشاركتها أو الكشف عنها ل Amnezia أو أي طرف ثالث
-
+ 255.255.255.255:22
-
+ SSH Username
-
+ Password or SSH private keyكلمة مرور او مفتاح SSH خاص
-
+ Ip address cannot be emptyلا يمكن لعنوان IP ان يكون فارغ
-
+ Enter the address in the format 255.255.255.255:88ادخل العنوان في شكل 255.255.255.255:88
-
+ Login cannot be emptyتسجيل دخول لا يمكن ان يكون فارغ
-
+ Password/private key cannot be emptyكلمة مرور/مفتاح خاص لأ يمكن ان يكونو فارغين
@@ -1867,22 +2185,22 @@ It's okay as long as it's from someone you trust.
PageSetupWizardEasy
-
+ What is the level of internet control in your region?ما هو مستوي التحكم في الانترنت في منطقتك؟
-
+ Choose a VPN protocolاختر بروتوكول VPN
-
+ Skip setupتخطي الإعداد
-
+ Continueواصل
@@ -1891,37 +2209,37 @@ It's okay as long as it's from someone you trust.
PageSetupWizardInstalling
-
+ Usually it takes no more than 5 minutesعادة لا تستغرق اكثر من 5 دقائق
-
+ The server has already been added to the applicationتمت إضافة الخادم بالفعل للتطبيق
-
+ Amnezia has detected that your server is currently اكتشف Amnezia الخادم الخاص بك موجود حاليًا
-
+ busy installing other software. Amnezia installation مشغول بتثبيت برامج اخري, تثبيت Amnezia
-
+ Cancel installationإلغاء التثبيت
-
+ will pause until the server finishes installing other softwareسيتوقف مؤقتًا حتى ينتهي الخادم من تثبيت البرامج الأخرى
-
+ Installingجاري التثبيت
@@ -1929,45 +2247,50 @@ It's okay as long as it's from someone you trust.
PageSetupWizardProtocolSettings
-
+ Installing %1تثبيت %1
-
+ More detailedاكثر تفصيلاً
-
+ Closeاغلق
-
+ Network protocolبروتوكول شبكة
-
+ Portمنفذ
-
+ Installتثبيت
+
+
+ The port must be in the range of 1 to 65535
+
+ PageSetupWizardProtocols
-
+ VPN protocolVPN بروتوكول
-
+ Choose the one with the highest priority for you. Later, you can install other protocols and additional services, such as DNS proxy and SFTP.اختر بالنسبة للأولوية القصوى بالنسبة لك. ويمكنك لاحقًا تثبيت بروتوكولات وخدمات إضافية أخرى، مثل وكيل DNS وSFTP.
@@ -1975,7 +2298,7 @@ It's okay as long as it's from someone you trust.
PageSetupWizardQrReader
-
+ Point the camera at the QR code and hold for a couple of seconds. قم بتوجيه الكاميرا نحو رمز QR و اثبت لبضع ثوان.
@@ -1983,32 +2306,32 @@ It's okay as long as it's from someone you trust.
PageSetupWizardStart
-
+ Settings restored from backup fileتم استرداد الإعدادات من ملف نسخة احتياطية
-
+ Free service for creating a personal VPN on your server.خدمة مجانية لأنشاء VPN شخصي علي الخادم الشخصي.
-
+ Helps you access blocked content without revealing your privacy, even to VPN providers. يساعدك في الولوج للمحتوي المحظور بدون إظهار خصوصيات, حتي لمزود ال VPN.
-
+ I have the data to connectلدي البيانات المطلوبة للأتصال
-
+ I have nothingليس لدي اي شئ
-
+ https://amnezia.org/instructions/0_starter-guide
@@ -2016,28 +2339,28 @@ It's okay as long as it's from someone you trust.
PageSetupWizardTextKey
-
+ Connection keyمفتاح اتصال
-
+ A line that starts with vpn://...يجب ان تٌكتب بهذه الطريقة حتي بوجود التحذير كي تظهر بشكل صحيح داخل التطبيقسطر يبدأ ب ...//:vpn
-
+ Keyمفتاح
-
+ Insertادخل
-
+ Continueواصل
@@ -2045,27 +2368,32 @@ It's okay as long as it's from someone you trust.
PageSetupWizardViewConfig
-
+ New connectionاتصال جديد
-
+ Collapse contentطي المحتوي
-
+ Show contentاظهر المحتوي
-
+
+ Enable WireGuard obfuscation. It may be useful if WireGuard is blocked on your provider.
+
+
+
+ Use connection codes only from sources you trust. Codes from public sources may have been created to intercept your data.استخدم رموز اتصال فقط من المصادر التي تثق بها, ربما تم إنشاء رموز من مصادر عامة لاعتراض بياناتك.
-
+ Connectاتصل
@@ -2073,138 +2401,167 @@ It's okay as long as it's from someone you trust.
PageShare
-
+ Save OpenVPN configاحفظ تكوين OpenVPN
-
+ Save WireGuard configاحفظ تكوين WireGuard
-
+ Save AmneziaWG configاحفظ تكوين AmneziaWG
-
+ Save Shadowsocks configاحفظ تكوين Shadowsocks
-
+ Save Cloak configاحفظ تكوين Cloak
-
+
+ Save XRay config
+
+
+
+ For the AmneziaVPN appAmneziaVPN من اجل تطبيق
-
+ OpenVPN native formatتنسيق OpenVPN الاصلي
-
+ WireGuard native formatتنسيق WireGuard الاصلي
-
+ AmneziaWG native formatتنسيق AmneziaWG اصلي
-
+ Shadowsocks native formatتنسيق Shadowsocks الاصلي
-
+ Cloak native formatتنسيق Cloak الاصلي
-
+
+ XRay native format
+
+
+
+ Share VPN Accessشارك اتصال VPN
-
+ Share full access to the server and VPNشارك ولوج كامل للخادم و ال VPN
-
+ Use for your own devices, or share with those you trust to manage the server.استخدمه للأجهزة الخاصة بك، أو شاركه مع من تثق بهم لإدارة الخادم.
-
-
+
+ Usersالمستخدمين
-
+ Share VPN access without the ability to manage the serverشارك اتصال VPN بدون القدرة علي إدارة الخادم
-
+ Searchابحث
-
- Creation date:
- تاريخ الإنشاء:
+
+ Creation date: %1
+
-
+
+ Latest handshake: %1
+
+
+
+
+ Data received: %1
+
+
+
+
+ Data sent: %1
+
+
+
+ Creation date:
+ تاريخ الإنشاء:
+
+
+ Renameإعادة التسمية
-
+ Client nameاسم العميل
-
+ Saveاحفظ
-
+ Revokeسحب وإبطال
-
+ Revoke the config for a user - %1?سحب وإبطال للمستخدم - %1?
-
+ The user will no longer be able to connect to your server.المستخدم لن يكون قادر علي الاتصال بعد الان.
-
+ Continueواصل
-
+ Cancelإلغاء
-
+ Connectionالاتصال
@@ -2217,13 +2574,13 @@ It's okay as long as it's from someone you trust.
الخوادم
-
-
+
+ Serverخادم
-
+ File with connection settings to ملف بإعدادات إلي
@@ -2232,35 +2589,35 @@ It's okay as long as it's from someone you trust.
البروتوكولات
-
-
+
+ Protocolبروتوكول
-
+ Connection to اتصال إلي
-
+ Config revokedتم سحب وإبطال التكوين
-
+ User nameاسم المستخدم
-
-
+
+ Connection formatتنسيق الاتصال
-
-
+
+ Shareشارك
@@ -2268,50 +2625,50 @@ It's okay as long as it's from someone you trust.
PageShareFullAccess
-
+ Full access to the server and VPNولوج كامل للخادم و ال VPN
-
+ We recommend that you use full access to the server only for your own additional devices.
نحن ننصحك بأستخدام ولوج كامل للخادم فقط لأجهزتك الاضافية.
-
+ If you share full access with other people, they can remove and add protocols and services to the server, which will cause the VPN to work incorrectly for all users. إذا شاركت ولوج كامل مع الاشخاص, سيكونو قادرين علي حذف وإضافة بروتوكولات و خدمات إلي الخادم, والذي سيجعل VPN يعمل بشكل غير صحيح لجميع المستخدمين.
-
-
+
+ Serverخادم
-
+ Accessing التواصل
-
+ File with accessing settings to ملف مع إعدادات الوصول إلي
-
+ Shareمشاركة
-
+ Connection to اتصال إلي
-
+ File with connection settings to معلف مع إعدادات الاتصال إلي
@@ -2319,7 +2676,7 @@ It's okay as long as it's from someone you trust.
PageStart
-
+ Logging was disabled after 14 days, log files were deleted
@@ -2327,7 +2684,7 @@ It's okay as long as it's from someone you trust.
PopupType
-
+ Closeاغلاق
@@ -2570,10 +2927,17 @@ It's okay as long as it's from someone you trust.
QObject
-
+ SFTP serviceخدمة SFTP
+
+
+
+
+ SOCKS5 proxy server
+
+ No error
@@ -2581,6 +2945,7 @@ It's okay as long as it's from someone you trust.
+ Unknown errorخطأ غير معروف
@@ -2590,62 +2955,62 @@ It's okay as long as it's from someone you trust.
لم يتم تنفيذ الوظيفة
-
+ Server check failedفشل في فحص الخادم
-
+ Server port already used. Check for another softwareمنفذ الخادم بالفعل مٌستخدم, تحقق من باقي التطبيقات
-
+ Server error: Docker container missingخطأ من الخادم: حاوية Docker مفقودة
-
+ Server error: Docker failedخطأ من الخادم: فشل Docker
-
+ Installation canceled by userتم اغلاق التثبيت بواسطة المستخدم
-
+ The user does not have permission to use sudoليس لدي المستخدم الصلحيات لأستخدام sudo
-
+ SSH request was deniedطلب SSH محظو
-
+ SSH request was interruptedإنقطع طلب SSH
-
+ SSH internal errorمشكلة داخلية SSH
-
+ Invalid private key or invalid passphrase enteredمفتا ح خاص غير صحيح او عبارة مرور غير صحيحة
-
+ The selected private key format is not supported, use openssh ED25519 key types or PEM key typesالتنسيق المٌحدد للمفتاح الخاص غير مدعوم, استخدم نوع مفتاح openssh ED25519 او نوع مفتاح PEM
-
+ Timeout connecting to serverانتهت مدة الاتصال بالخادم
@@ -2694,165 +3059,200 @@ It's okay as long as it's from someone you trust.
خطأ Sftp: لا يوجد وسائط في القرص البعيد
-
+ VPN connection error
-
+ Error when retrieving configuration from APIخطأ عند استرداد التكوين من API
-
+ This config has already been added to the applicationهذا التكوين بالفعل تمت إضافتة للبرنامج
-
+ ErrorCode: %1.
-
+ OpenVPN config missingOpenVPN تكوين مفقود
-
+
+ Background service is not running
+
+
+
+
+ Server error: Packet manager error
+
+
+
+ SCP error: Generic failure
-
+ OpenVPN management server errorOpenVPN خطأ في إدارة الخادم
-
+ OpenVPN executable missingOpenVPN executable مفقود
-
+ Shadowsocks (ss-local) executable missingShadowsocks (ss-local) executable مفقود
-
+ Cloak (ck-client) executable missingCloak (ck-client) executable مفقود
-
+ Amnezia helper service errorخطأ في خدمة مٌساعد Amnezia
-
+ OpenSSL failedفشل OpenSSL
-
+ Can't connect: another VPN connection is activeلا يمكن الاتصال: هناك اتصال VPN اخر بالفعل يعمل
-
+ Can't setup OpenVPN TAP network adapterلا يمك نتثبيت محول شبكة OpenVPN TAP
-
+ VPN pool error: no available addressesVPN pool error: لا يوجد عنواين مٌتاحة
-
+ The config does not contain any containers and credentials for connecting to the serverالتكوين لا يحتوي علي اي حاويات و اعتماد للأتصال بالخادم
- QFile error: The file could not be opened
+ In the response from the server, an empty config was received
- QFile error: An error occurred when reading from the file
+ SSL error occurred
- QFile error: The file could not be accessed
-
-
-
-
- QFile error: An unspecified error occurred
-
-
-
-
- QFile error: A fatal error occurred
+ Server response timeout on api request
- QFile error: The operation was aborted
+ QFile error: The file could not be opened
+
+
+
+
+ QFile error: An error occurred when reading from the file
+
+
+
+
+ QFile error: The file could not be accessed
+
+
+
+
+ QFile error: An unspecified error occurred
+ QFile error: A fatal error occurred
+
+
+
+
+ QFile error: The operation was aborted
+
+
+
+ Internal errorخطأ داخلي
-
+ IPsec
-
-
+
+ Website in Tor networkموقع في شبكة Tor
-
+ AmneziaDNSAmneziaDNS
-
+ SFTP file sharing serviceملف SFTP: خدمة المشاركة
-
+ OpenVPN is the most popular VPN protocol, with flexible configuration options. It uses its own security protocol with SSL/TLS for key exchange.بروتوكول OpenVPN احد اشهر بروتوكولات VPN, مع مرونة في إعدادات التكوين. يستخدم بروتوكول امان خاص به مع SSL/TLS لتغير المفاتيح.
-
+ Shadowsocks - masks VPN traffic, making it similar to normal web traffic, but it may be recognized by analysis systems in some highly censored regions.بروتوكول Shadowsocks- يتنكر في حركة مرور VPN, يبدو ك حركة مرور الويب العادية
ولكن قد يتم التعرف عليه من خلال أنظمة التحليل في بعض المناطق شديدة الرقابة.
-
+ OpenVPN over Cloak - OpenVPN with VPN masquerading as web traffic and protection against active-probing detection. Ideal for bypassing blocking in regions with the highest levels of censorship.بروتوكول OpenVPN over Cloak هو OpenVPN مع VPN يتنكر كحركة مرور على الويب ويوفر الحماية
ضد عمليات الكشف النشط. مثالية لتجاوز الحجب في المناطق ذات أعلى مستويات الرقابة.
-
+
+ XRay with REALITY - Suitable for countries with the highest level of internet censorship. Traffic masking as web traffic at the TLS level, and protection against detection by active probing methods.
+
+
+
+
+ IKEv2/IPsec - Modern stable protocol, a bit faster than others, restores connection after signal loss. It has native support on the latest versions of Android and iOS.
+
+
+
+ Create a file vault on your server to securely store and transfer files.انشأ مخزن ملفات علي الخادم الخاص بك حتي تخزن الملفات و تنقلها بسرية.
-
+ This is a combination of the OpenVPN protocol and the Cloak plugin designed specifically for protecting against blocking.
OpenVPN provides a secure VPN connection by encrypting all internet traffic between the client and the server.
@@ -2893,7 +3293,7 @@ Cloak يحمي OpenVPN من ان يٌكتشف والحجب
-
+ A relatively new popular VPN protocol with a simplified architecture.
WireGuard provides stable VPN connection and high performance on all devices. It uses hard-coded encryption settings. WireGuard compared to OpenVPN has lower latency and better data transfer throughput.
WireGuard is very susceptible to blocking due to its distinct packet signatures. Unlike some other VPN protocols that employ obfuscation techniques, the consistent signature patterns of WireGuard packets can be more easily identified and thus blocked by advanced Deep Packet Inspection (DPI) systems and other network monitoring tools.
@@ -2914,7 +3314,15 @@ WireGuard is very susceptible to blocking due to its distinct packet signatures.
* يعمل عبر بروتوكول شبكة UDP.
-
+
+ The REALITY protocol, a pioneering development by the creators of XRay, is specifically designed to counteract the highest levels of internet censorship through its novel approach to evasion.
+It uniquely identifies censors during the TLS handshake phase, seamlessly operating as a proxy for legitimate clients while diverting censors to genuine websites like google.com, thus presenting an authentic TLS certificate and data.
+This advanced capability differentiates REALITY from similar technologies by its ability to disguise web traffic as coming from random, legitimate sites without the need for specific configurations.
+Unlike older protocols such as VMess, VLESS, and the XTLS-Vision transport, REALITY's innovative "friend or foe" recognition at the TLS handshake enhances security and circumvents detection by sophisticated DPI systems employing active probing techniques. This makes REALITY a robust solution for maintaining internet freedom in environments with stringent censorship.
+
+
+
+ After installation, Amnezia will create a
file storage on your server. You will be able to access it using
@@ -2933,32 +3341,31 @@ For more detailed information, you can
إيجادها في قسم الدعم تحت "انشاء مخزن ملفات SFTP."
-
+ WireGuard - New popular VPN protocol with high performance, high speed and low power consumption. Recommended for regions with low levels of censorship.بروتوكول WireGuard - بروتوكول شائع ب اداء عالي, سرعة عالية واستهلاك قليل للطاقة. ينصح للمناطق ذات مستوي منخفض من الرقابة.
-
+ AmneziaWG - Special protocol from Amnezia, based on WireGuard. It's fast like WireGuard, but very resistant to blockages. Recommended for regions with high levels of censorship.بروتوكول AmneziaWG - بروتوكول خاص من Amnezia, يعتمد علي WireGuard. سريع مثل WireGuard, لكن مقاوم جداً للحجب. ينصح للمناطق ذات مستوي عالي من الرقابة.
- IKEv2/IPsec - Modern stable protocol, a bit faster than others, restores connection after signal loss.
- بروتوكول IKEv2/IPsec - بروتوكول مستقر حديث, اسرع بقليل من الباقي, يسترجع الاتصال بعد خسارة الاشارة.
+ بروتوكول IKEv2/IPsec - بروتوكول مستقر حديث, اسرع بقليل من الباقي, يسترجع الاتصال بعد خسارة الاشارة.
-
+ Deploy a WordPress site on the Tor network in two clicks.انشر موقع WordPress علي شبكة Tor في ضغطتين.
-
+ Replace the current DNS server with your own. This will increase your privacy level.استبدل خادم ال DNS الحالي مع الخادم الخاص بك, هذا سيزيد من خصوصيتك.
-
+ OpenVPN stands as one of the most popular and time-tested VPN protocols available.
It employs its unique security protocol, leveraging the strength of SSL/TLS for encryption and key exchange. Furthermore, OpenVPN's support for a multitude of authentication methods makes it versatile and adaptable, catering to a wide range of devices and operating systems. Due to its open-source nature, OpenVPN benefits from extensive scrutiny by the global community, which continually reinforces its security. With a strong balance of performance, security, and compatibility, OpenVPN remains a top choice for privacy-conscious individuals and businesses alike.
@@ -2977,7 +3384,7 @@ It employs its unique security protocol, leveraging the strength of SSL/TLS for
* يمكن ان يعمل علي بروتوكولات شبكة TCP و UDP.
-
+ Shadowsocks, inspired by the SOCKS5 protocol, safeguards the connection using the AEAD cipher. Although Shadowsocks is designed to be discreet and challenging to identify, it isn't identical to a standard HTTPS connection.However, certain traffic analysis systems might still detect a Shadowsocks connection. Due to limited support in Amnezia, it's recommended to use AmneziaWG protocol.
* Available in the AmneziaVPN only on desktop platforms
@@ -2992,7 +3399,7 @@ It employs its unique security protocol, leveraging the strength of SSL/TLS for
* يعمل عبر بروتوكول شبكة TCP.
-
+ A modern iteration of the popular VPN protocol, AmneziaWG builds upon the foundation set by WireGuard, retaining its simplified architecture and high-performance capabilities across devices.
While WireGuard is known for its efficiency, it had issues with being easily detected due to its distinct packet signatures. AmneziaWG solves this problem by using better obfuscation methods, making its traffic blend in with regular internet traffic.
This means that AmneziaWG keeps the fast performance of the original while adding an extra layer of stealth, making it a great choice for those wanting a fast and discreet VPN connection.
@@ -3013,7 +3420,7 @@ This means that AmneziaWG keeps the fast performance of the original while addin
* يعمل عبر بروتوكول شبكة UDP.
-
+ IKEv2, paired with the IPSec encryption layer, stands as a modern and stable VPN protocol.
One of its distinguishing features is its ability to swiftly switch between networks and devices, making it particularly adaptive in dynamic network environments.
While it offers a blend of security, stability, and speed, it's essential to note that IKEv2 can be easily detected and is susceptible to blocking.
@@ -3033,7 +3440,7 @@ While it offers a blend of security, stability, and speed, it's essential t
* يعمل عبر بروتوكول شبكة UDP, منفذ 500 و منفذ 4500.
-
+ DNS Serviceخدمة ال DNS
@@ -3087,21 +3494,147 @@ While it offers a blend of security, stability, and speed, it's essential t
No matchلا تطباق
-
-
- Unknown error
- خطأ غير معروف
- error 0x%1: %2خطأ %1: %2
+
+
+ vmess:// url is invalid
+
+
+
+
+ Invalid streamSettings protocol:
+
+
+
+
+ Unknown transport method:
+
+
+
+
+ VMess string should start with 'vmess://'
+
+
+
+
+ VMess string should be a valid base64 string
+
+
+
+
+ JSON should not be empty
+
+
+
+
+ VLESS link should start with vless://
+
+
+
+
+ link parse failed: %1
+
+
+
+
+ empty host
+
+
+
+
+ missing port
+
+
+
+
+ missing uuid
+
+
+
+
+ Invalid ssd link: json: field %1 must exist
+
+
+
+
+ Invalid ssd link: json: field %1 must be valid port number
+
+
+
+
+ Invalid ssd link: json: field %1 must be of type 'string'
+
+
+
+
+ Invalid ssd link: json: field %1 must be an array
+
+
+
+
+ Skipping invalid ssd server: server must be an object
+
+
+
+
+ Skipping invalid ssd server: missing required field %1
+
+
+
+
+ Skipping invalid ssd server: field %1 should be of type 'string'
+
+
+
+
+ Invalid ssd link: should begin with ssd://
+
+
+
+
+ Invalid ssd link: base64 parse failed
+
+
+
+
+ Invalid ssd link: json parse failed
+
+
+
+
+ Invalid ssd link: rc4-md5 encryption is not supported by v2ray-core
+
+
+
+
+ SS URI is too short
+
+
+
+
+
+ Can't find the colon separator between method and password
+
+
+
+
+ Can't find the at separator between password and hostname
+
+
+
+
+ Can't find the colon separator between hostname and port
+
+ SelectLanguageDrawer
-
+ Choose languageاختر لغة
@@ -3123,19 +3656,18 @@ While it offers a blend of security, stability, and speed, it's essential t
SettingsController
-
+ Backup file is corruptedملف النسخه الاحتياطيه تالف
-
+ All settings have been reset to default valuesتم استرجاع جميع الإعدادات للإعدادات الافتراضية
- Cached profiles cleared
- تم حذف الملفات الشخصية المٌخزنة مؤقتاُ
+ تم حذف الملفات الشخصية المٌخزنة مؤقتاُ
@@ -3157,18 +3689,18 @@ While it offers a blend of security, stability, and speed, it's essential t
انسخ
-
-
+
+ Copiedتم النسخ
-
+ Copy config stringانسخ نص التكوين
-
+ Show connection settingsاظهر إعدادات الاتصال
@@ -3177,7 +3709,7 @@ While it offers a blend of security, stability, and speed, it's essential t
展示内容
-
+ To read the QR code in the Amnezia app, select "Add server" → "I have data to connect" → "QR code, key or settings file"حتي تقرأ رمز ال QR في تطبيق Amnezia, اختار "إضافة خادم" - "لدي بيانات الاتصال" - "رمز Qr, او مفتاح تعريف او ملف إعدادات"
@@ -3261,7 +3793,7 @@ While it offers a blend of security, stability, and speed, it's essential t
TextFieldWithHeaderType
-
+ The field can't be emptyالحقل لا يمكن ان يكون فارغ
@@ -3269,7 +3801,7 @@ While it offers a blend of security, stability, and speed, it's essential t
VpnConnection
-
+ Mbps
@@ -3277,42 +3809,42 @@ While it offers a blend of security, stability, and speed, it's essential t
VpnProtocol
-
+ Unknownغير معرف
-
+ Disconnectedانقطع الاتصال
-
+ Preparingجاري التحضير
-
+ Connecting...جاري الاتصال...
-
+ Connectedتم الاتصال
-
+ Disconnecting...جاري قطع الاتصال...
-
+ Reconnecting...جاري إعادة الاتصال...
-
+ Errorخطأ
@@ -3320,45 +3852,43 @@ While it offers a blend of security, stability, and speed, it's essential t
amnezia::ContainerProps
-
+ Lowمنخفض
-
+ Highمتوسط او عالي
- Extreme
- شديد
+ شديد
-
+ I just want to increase the level of my privacy.انا فقط اريد زيادة مستوي الخصوصية.
-
+ I want to bypass censorship. This option recommended in most cases.أريد تجاوز الرقابة. يوصى بهذا الخيار في معظم الحالات.
- Most VPN protocols are blocked. Recommended if other options are not working.
- يتم حظر معظم بروتوكولات VPN. يوصى به إذا كانت الخيارات الأخرى لا تعمل.
+ يتم حظر معظم بروتوكولات VPN. يوصى به إذا كانت الخيارات الأخرى لا تعمل.main2
-
+ Private key passphraseعبارة المرور الخاصة بالمفتاح
-
+ Saveاحفظ
diff --git a/client/translations/amneziavpn_fa_IR.ts b/client/translations/amneziavpn_fa_IR.ts
index e91be74b..2f7e74cc 100644
--- a/client/translations/amneziavpn_fa_IR.ts
+++ b/client/translations/amneziavpn_fa_IR.ts
@@ -1,51 +1,97 @@
+
+ AppSplitTunnelingController
+
+
+ Application added: %1
+
+
+
+
+ The application has already been added
+
+
+
+
+ The selected applications have been added
+
+
+
+
+ Application removed: %1
+
+
+
+
+ ConnectButton
+
+
+ Unable to disconnect during configuration preparation
+
+
+ConnectionController
-
+ VPN Protocols is not installed.
Please install VPN container at firstپروتکل ویپیان نصب نشده است
لطفا کانتینر ویپیان را نصب کنید
-
+ Connecting...در حال ارتباط...
-
+ Connectedمتصل
-
+
+ Preparing...
+
+
+
+ Settings updated successfully, reconnnection...تنظیمات به روز رسانی شد
در حال اتصال دوباره...
-
+ Settings updated successfullyتنظیمات با موفقیت بهروزرسانی شدند
-
+
+ The selected protocol is not supported on the current platform
+ پروتکل انتخاب شده بر روی این پلتفرم پشتیبانی نمیشود
+
+
+
+ unable to create configuration
+
+
+
+ Reconnecting...اتصال دوباره...
-
-
-
-
+
+
+
+ Connectاتصال
-
+ Disconnecting...قطع ارتباط...
@@ -53,17 +99,17 @@
ConnectionTypeSelectionDrawer
-
+ Add new connectionایجاد ارتباط جدید
-
+ Configure your serverتنظیم سرور
-
+ Open config file, key or QR codeبارگذاری فایل تنظیمات، کلید یا QR Code
@@ -94,7 +140,7 @@
ExportController
-
+ Access error!خطای دسترسی!
@@ -102,56 +148,57 @@
HomeContainersListView
-
+ Unable change protocol while there is an active connectionامکان تغییر پروتکل در هنگام متصل بودن وجود ندارد
- The selected protocol is not supported on the current platform
- پروتکل انتخاب شده بر روی این پلتفرم پشتیبانی نمیشود
+ پروتکل انتخاب شده بر روی این پلتفرم پشتیبانی نمیشودHomeSplitTunnelingDrawer
-
+ Split tunnelingجداسازی ترافیک
-
+ Allows you to connect to some sites or applications through a VPN connection and bypass othersاجازه میدهد به شما که از طریق اتصال VPN به برخی از وبسایتها یا برنامهها وصل شوید و از دیگران عبور کنید
-
+ Split tunneling on the serverتقسیم تونلها در سرور
-
+ Enabled
Can't be disabled for current serverفعال
-
+ Site-based split tunnelingجداسازی ترافیک بر اساس سایت
-
+
+ Enabledفعال
-
+
+ Disabledغیر فعال
-
+ App-based split tunnelingجداسازی ترافیک بر اساس نرمافزار
@@ -159,86 +206,112 @@ Can't be disabled for current server
ImportController
-
+ Unable to open file
-
-
+
+ Invalid configuration file
-
+ Scanned %1 of %2.ارزیابی %1 از %2.
+
+
+ In the imported configuration, potentially dangerous lines were found:
+
+ InstallController
-
-
+ %1 installed successfully. %1 با موفقیت نصب شد.
-
-
+ %1 is already installed on the server. %1 در حال حاضر بر روی سرور نصب شده است.
-
+
Added containers that were already installed on the server
کانتینرهایی که بر روی سرور موجود بودند اضافه شدند
-
+
Already installed containers were found on the server. All installed containers have been added to the application
کانتینرهای نصب شده بر روی سرور شناسایی شدند. تمام کانتینترهای نصب شده به نرم افزار اضافه شدند
-
+ Settings updated successfullyتنظیمات با موفقیت بهروزرسانی شدند
-
+ Server '%1' was rebootedسرور %1 راه اندازی مجدد شد
-
+ Server '%1' was removedسرور %1 حذف شد
-
+ All containers from server '%1' have been removedتمام کانتینترها از سرور %1 حذف شدند
-
+ %1 has been removed from the server '%2'%1 از سرور %2 حذف شد
-
+
+ %1 cached profile cleared
+
+
+
+ Please login as the userلطفا به عنوان کاربر وارد شوید
-
+ Server added successfullyسرور با موفقیت اضافه شد
+
+ InstalledAppsDrawer
+
+
+ Choose application
+
+
+
+
+ application name
+
+
+
+
+ Add selected
+
+
+KeyChainClass
@@ -260,28 +333,28 @@ Already installed containers were found on the server. All installed containers
NotificationHandler
-
-
+
+ AmneziaVPNAmneziaVPN
-
+ VPN Connectedویپیان وصل شد
-
+ VPN Disconnectedویپیان قطع شد
-
+ AmneziaVPN notificationاخطار AmneziaVPN
-
+ Unsecured network detected: شبکه ناامن شناسایی شد:
@@ -302,32 +375,32 @@ Already installed containers were found on the server. All installed containers
PageHome
-
+ Logging enabled
-
+ Split tunneling enabledفعال شدن تونل تقسیمشده
-
+ Split tunneling disabledتونل تقسیمشده غیرفعال شده
-
+ VPN protocolپروتکل ویپیان
-
+ Serversسرورها
-
+ Unable change server while there is an active connectionامکان تغییر سرور در هنگام متصل بودن وجود ندارد
@@ -335,280 +408,295 @@ Already installed containers were found on the server. All installed containers
PageProtocolAwgSettings
-
+ AmneziaWG settingsتنظیمات AmneziaWG
-
+ Portپورت
-
+ MTU
- Remove AmneziaWG
- حذف AmneziaWG
+ حذف AmneziaWG
- Remove AmneziaWG from server?
- آیا میخواهید AmneziaWG از سرور حذف شود؟
+ آیا میخواهید AmneziaWG از سرور حذف شود؟
-
-
+ All users with whom you shared a connection with will no longer be able to connect to it.همه کاربرانی که با آنها ارتباطی به اشتراک گذاشتهاید دیگر قادر به اتصال به آن نخواهند بود.
-
+ Saveذخیره
-
+
+ The values of the H1-H4 fields must be unique
+
+
+
+
+ The value of the field S1 + message initiation size (148) must not equal S2 + message response size (92)
+
+
+
+ Save settings?تنظیمات را ذخیره کن?
-
-
+ Continueادامه
-
-
+ Cancelکنسل
+
+
+ Unable change settings while there is an active connection
+
+ PageProtocolCloakSettings
-
+ Cloak settingsتنظیمات Cloak
-
+ Disguised as traffic fromپنهان کردن به عنوان ترافیک از
-
+ Portپورت
-
-
+
+ Cipherرمزگذاری
-
+ Saveذخیره
+
+
+ Unable change settings while there is an active connection
+
+ PageProtocolOpenVpnSettings
-
+ OpenVPN settingsتنظیمات OpenVPN
-
+ VPN address subnetزیرشبکه آدرس VPN
-
+ Network protocolپروتکل شبکه
-
+ Portپورت
-
+ Auto-negotiate encryptionرمزگذاری خودکار
-
-
+
+ Hashهش
-
+ SHA512SHA512
-
+ SHA384SHA384
-
+ SHA256SHA256
-
+ SHA3-512SHA3-512
-
+ SHA3-384SHA3-384
-
+ SHA3-256SHA3-256
-
+ whirlpoolwhirlpool
-
+ BLAKE2b512BLAKE2b512
-
+ BLAKE2s256BLAKE2s256
-
+ SHA1SHA1
-
-
+
+ Cipherرمزگذاری
-
+ AES-256-GCMAES-256-GCM
-
+ AES-192-GCMAES-192-GCM
-
+ AES-128-GCMAES-128-GCM
-
+ AES-256-CBCAES-256-CBC
-
+ AES-192-CBCAES-192-CBC
-
+ AES-128-CBCAES-128-CBC
-
+ ChaCha20-Poly1305ChaCha20-Poly1305
-
+ ARIA-256-CBCARIA-256-CBC
-
+ CAMELLIA-256-CBCCAMELLIA-256-CBC
-
+ nonenone
-
+ TLS authاعتبار TLS
-
+ Block DNS requests outside of VPNمسدود کردن درخواستهای DNS خارج از ویپیان
-
+ Additional client configuration commandsتنظیمات و دستورات اضافه برنامه متصل شونده
-
-
+
+ Commands:دستورات:
-
+ Additional server configuration commandsتنظیمات و دستورات اضافه سرور
-
+
+ Unable change settings while there is an active connection
+
+
+ Remove OpenVPN
- حذف OpenVPN
+ حذف OpenVPN
- Remove OpenVPN from server?
- آیا میخواهید OpenVPN از سرور حذف شود؟
+ آیا میخواهید OpenVPN از سرور حذف شود؟
- All users with whom you shared a connection with will no longer be able to connect to it.
- همه کاربرانی که با آنها ارتباطی به اشتراک گذاشتهاید دیگر قادر به اتصال به آن نخواهند بود.
+ همه کاربرانی که با آنها ارتباطی به اشتراک گذاشتهاید دیگر قادر به اتصال به آن نخواهند بود.
- Continue
- ادامه
+ ادامه
- Cancel
- کنسل
+ کنسل
-
+ Saveذخیره
@@ -616,32 +704,32 @@ Already installed containers were found on the server. All installed containers
PageProtocolRaw
-
+ settings تنظیمات
-
+ Show connection optionsنمایش تنظیمات اتصال
-
+ Connection options %1تنظیمات اتصال %1
-
+ Remove حذف
-
+ Remove %1 from server?%1 از سرور حذف شود؟
-
+ All users with whom you shared a connection with will no longer be able to connect to it.همه کاربرانی که با آنها ارتباطی به اشتراک گذاشتهاید دیگر قادر به اتصال به آن نخواهند بود.
@@ -650,12 +738,12 @@ Already installed containers were found on the server. All installed containers
همه کاربرانی که با آن این پروتکل VPN را به اشتراک گذاشتهاید دیگر نمیتوانند به آن متصل شوند.
-
+ Continueادامه
-
+ Cancelکنسل
@@ -663,75 +751,91 @@ Already installed containers were found on the server. All installed containers
PageProtocolShadowSocksSettings
-
+ Shadowsocks settingsتنظیمات Shadowsocks
-
+ Portپورت
-
-
+
+ Cipherرمزگذاری
-
+ Saveذخیره
+
+
+ Unable change settings while there is an active connection
+
+ PageProtocolWireGuardSettings
-
+ WG settings
-
+ Portپورت
-
+ MTU
-
- Remove WG
+
+ Unable change settings while there is an active connection
-
- Remove WG from server?
-
-
-
- All users with whom you shared a connection will no longer be able to connect to it.
- تمام کاربرانی که این ارتباط را با آنها به اشتراک گذاشتهاید دیگر نمیتوانند به آن متصل شوند.
+ تمام کاربرانی که این ارتباط را با آنها به اشتراک گذاشتهاید دیگر نمیتوانند به آن متصل شوند.
-
- Continue
-
-
-
- Cancel
- کنسل
+ کنسل
-
+ Saveذخیره
+
+ PageProtocolXraySettings
+
+
+ XRay settings
+
+
+
+
+ Disguised as traffic from
+ پنهان کردن به عنوان ترافیک از
+
+
+
+ Save
+ ذخیره
+
+
+
+ Unable change settings while there is an active connection
+
+
+PageServerContainers
@@ -742,180 +846,255 @@ Already installed containers were found on the server. All installed containers
PageServiceDnsSettings
-
+ A DNS service is installed on your server, and it is only accessible via VPN.
یک سرویس DSN بر روی سرور شما نصب شده و فقط از طریق ویپیان قابل دسترسی میباشد.
-
+ The DNS address is the same as the address of your server. You can configure DNS in the settings, under the connections tab.آدرس DSN همان آدرس سرور شماست. میتوانید از قسمت تنظیمات و تب اتصالات DSN خود را تنظیم کنید.
-
+ Remove جذف
-
+ Remove %1 from server?%1 از سرور حذف شود؟
-
+ Continueادامه
-
+ Cancelکنسل
+
+
+ Cannot remove Amnezia DNS from running server
+
+ PageServiceSftpSettings
-
+ Settings updated successfullyتنظیمات با موفقیت بهروزرسانی شد
-
+ SFTP settingsتنظیمات SFTP
-
+ Hostهاست
-
-
-
-
+
+
+
+ Copiedکپی شد
-
+ Portپورت
-
+ User nameنام کاربری
-
+ Passwordرمز عبور
-
+ Mount folder on deviceبارگذاری پوشه بر روی دستگاه
-
+ In order to mount remote SFTP folder as local drive, perform following steps: <br>برای بارگذاری پوشه SFTP بر روی درایو محلی قدمهای زیر را انجام دهید: <br>
-
-
+
+ <br>1. Install the latest version of <br> 1. آخرین نسخه را نصب کنید
-
-
+
+ <br>2. Install the latest version of <br> 2. آخرین نسخه را نصب کنید
-
+ Detailed instructionsجزییات دستورالعملها
-
+ Remove SFTP and all data stored thereحذف SFTP و تمام دادههای ذخیره شده در آن
-
+ Remove SFTP and all data stored there?پوشه SFTP و تمام دادههای آن حذف شوند؟
-
+ Continueادامه
-
+ Cancelکنسل
+
+ PageServiceSocksProxySettings
+
+
+ Settings updated successfully
+
+
+
+
+
+ SOCKS5 settings
+
+
+
+
+ Host
+ هاست
+
+
+
+
+
+
+ Copied
+ کپی شد
+
+
+
+
+ Port
+ پورت
+
+
+
+ User name
+ نام کاربری
+
+
+
+
+ Password
+ رمز عبور
+
+
+
+ Username
+
+
+
+
+
+ Change connection settings
+
+
+
+
+ The port must be in the range of 1 to 65535
+
+
+
+
+ Password cannot be empty
+
+
+
+
+ Username cannot be empty
+
+
+PageServiceTorWebsiteSettings
-
+ Settings updated successfullyتنظیمات با موفقیت بهروزرسانی شد
-
+ Tor website settingsتنظیمات وبسایت Tor
-
+ Website addressآدرس وبسایت
-
+ Copiedکپی شد
-
+ Use <a href="https://www.torproject.org/download/" style="color: #FBB26A;">Tor Browser</a> to open this URL.
-
+ After creating your onion site, it takes a few minutes for the Tor network to make it available for use.پس از ایجاد سایت پیاز خود، چند دقیقه طول میکشد تا شبکه تور آن را برای استفاده فراهم کند.
-
+ When configuring WordPress set the this onion address as domain.زمانی که سایت وردپرس را تنظیم میکنید این آدرس پیازی را به عنوان دامنه قرار دهید.
-
+ Remove websiteحذف وب سایت
-
+ The site with all data will be removed from the tor network.سایت با تمام دادهها از شبکه Tor حذف خواهد شد.
-
+ Continueادامه
-
+ Cancelکنسل
@@ -923,37 +1102,37 @@ Already installed containers were found on the server. All installed containers
PageSettings
-
+ Settingsتنظیمات
-
+ Serversسرورها
-
+ Connectionارتباط
-
+ Applicationنرمافزار
-
+ Backupبکآپ
-
+ About AmneziaVPNدرباره Amnezia
-
+ Close applicationبستن نرمافزار
@@ -961,287 +1140,380 @@ Already installed containers were found on the server. All installed containers
PageSettingsAbout
-
+ Support Amneziaپشتیبانی از Amnezia
-
+ Amnezia is a free and open-source application. You can support the developers if you like it.Amnezia یک برنامه رایگان و متن باز است. اگر دوست دارید می توانید از توسعه دهندگان حمایت کنید.
-
+ Contactsمخاطب
-
+ Telegram groupگروه تلگرام
-
+ To discuss featuresبرای گفتگو در مورد ویژگیها
-
+ https://t.me/amnezia_vpn_enhttps://t.me/amnezia_vpn
-
+ Mailایمیل
-
+ For reviews and bug reportsبرای ارائه نظرات و گزارشات باگ
-
+ GitHubGitHub
-
+ https://github.com/amnezia-vpn/amnezia-clienthttps://github.com/amnezia-vpn/amnezia-client
-
+ Websiteوب سایت
-
+ https://amnezia.orghttps://amnezia.org
-
+ Software version: %1%1 :نسخه نرمافزار
-
+ Check for updatesبررسی بروزرسانی
-
+ Privacy Policy
+
+ PageSettingsAppSplitTunneling
+
+
+ Cannot change split tunneling settings during active connection
+ نمی توان تنظیمات تونل تقسیم را در طول اتصال فعال تغییر داد
+
+
+
+ Only the apps from the list should have access via VPN
+
+
+
+
+ Apps from the list should not have access via VPN
+
+
+
+
+ App split tunneling
+
+
+
+
+ Mode
+ حالت
+
+
+
+ Remove
+
+
+
+
+ Continue
+
+
+
+
+ Cancel
+ کنسل
+
+
+
+ application name
+
+
+
+
+ Open executable file
+
+
+
+
+ Executable file (*.*)
+
+
+PageSettingsApplication
-
+ Applicationنرم افزار
-
+ Allow application screenshotsمجوز اسکرینشات در برنامه
-
+
+ Enable notifications
+
+
+
+
+ Enable notifications to show the VPN state in the status bar
+
+
+
+ Auto startشروع خودکار
-
+ Launch the application every time the device is startsراهاندازی نرمافزار با هر بار روشن شدن دستگاه
-
+ Auto connectاتصال خودکار
-
+ Connect to VPN on app startاتصال به ویپیان با شروع نرمافزار
-
+ Start minimizedشروع به صورت کوچک
-
+ Launch application minimizedراهاندازی برنامه به صورت کوچک
-
+ Languageزبان
-
+ Loggingگزارشات
-
+ Enabledفعال
-
+ Disabledغیر فعال
-
+ Reset settings and remove all data from the applicationریست کردن تنظیمات و حذف تمام دادهها از نرمافزار
-
+ Reset settings and remove all data from the application?ریست کردن تنظیمات و حذف تمام دادهها از نرمافزار؟
-
+ All settings will be reset to default. All installed AmneziaVPN services will still remain on the server.تمام تنظیمات به حالت پیشفرض ریست میشوند. تمام سرویسهای Amnezia بر روی سرور باقی میمانند.
-
+ Continueادامه
-
+ Cancelکنسل
+
+
+ Cannot reset settings during active connection
+
+ PageSettingsBackup
-
+ Settings restored from backup fileتنظیمات از فایل پشتیبان بازیابی شد
-
+ Back up your configurationیک نسخه پشتیبان از تنظیمات خود تهیه
-
+ You can save your settings to a backup file to restore them the next time you install the application.میتوانید تنظیمات را در یک فایل پشتیبان ذخیره کرده و دفعه بعد که نرمافزار را نصب کردید آنها را بازیابی کنید.
-
+ The backup will contain your passwords and private keys for all servers added to AmneziaVPN. Keep this information in a secure place.پشتیبان حاوی رمزهای عبور و کلیدهای خصوصی شما برای تمام سرورهای اضافه شده به AmneziaVPN خواهد بود. این اطلاعات را در یک مکان امن نگه دارید
-
+ Make a backupایجاد یک پشتیبان
-
+ Save backup fileذخیره فایل پشتیبان
-
-
+
+ Backup files (*.backup)Backup files (*.backup)
-
+ Backup file savedفایل پشتیبان ذخیره شد
-
+ Restore from backupبازیابی از پشتیبان
-
+ Open backup fileباز کردن فایل پشتیبان
-
+ Import settings from a backup file?ورود تنظیمات از فایل پشتیبان؟
-
+ All current settings will be resetتمام تنظیمات جاری ریست خواهد شد
-
+ Continueادامه
-
+ Cancelکنسل
+
+
+ Cannot restore backup settings during active connection
+
+ PageSettingsConnection
-
+ Connectionارتباط
-
+ Use AmneziaDNSاستفاده از AmneziaDNS
-
+ If AmneziaDNS is installed on the serverاگر AmneziaDNS بر روی سرور نصب شده باشد
-
+ DNS serversسرورهای DNS
-
+ When AmneziaDNS is not used or installedوقتی AmneziaDNS استفاده نشده یا نصب نشده است
-
+ Allows you to use the VPN only for certain Appsبه شما امکان می دهد از VPN فقط برای برخی برنامه ها استفاده کنید
-
+
+ KillSwitch
+
+
+
+
+ Disables your internet if your encrypted VPN connection drops out for any reason.
+
+
+
+
+ Cannot change killSwitch settings during active connection
+
+
+
+ Site-based split tunnelingجداسازی ترافیک بر اساس سایت
-
+ Allows you to select which sites you want to access through the VPNمیتوانید مشخص کنید که چه سایتهایی از ویپیان استفاده کنند
-
+ App-based split tunnelingجداسازی ترافیک بر اساس نرمافزار
@@ -1249,62 +1521,62 @@ Already installed containers were found on the server. All installed containers
PageSettingsDns
-
+ Default server does not support custom DNSسرور پیشفرض از دیاناس سفارشی پشتیبانی نمیکند
-
+ DNS serversسرورهای DNS
-
+ If AmneziaDNS is not used or installedاگر AmneziaDNS نصب نباشد یا استفاده نشود
-
+ Primary DNSDNS اصلی
-
+ Secondary DNSDNS ثانویه
-
+ Restore defaultبازگشت به پیشفرض
-
+ Restore default DNS settings?بازگشت به تنظیمات پیشفرض DNS؟
-
+ Continueادامه
-
+ Cancelکنسل
-
+ Settings have been resetتنظیمات ریست شد
-
+ Saveذخیره
-
+ Settings savedذخیره تنظیمات
@@ -1317,67 +1589,67 @@ Already installed containers were found on the server. All installed containers
-
+ Loggingگزارشات
-
+ Enabling this function will save application's logs automatically. By default, logging functionality is disabled. Enable log saving in case of application malfunction.فعال کردن این عملکرد باعث ذخیره خودکار لاگهای برنامه میشود. به طور پیشفرض، قابلیت ثبت لاگ غیرفعال است. در صورت بروز خطا در برنامه، ذخیره لاگ را فعال کنید.
-
+ Save logsذخیره گزارشات
-
+ Open folder with logsباز کردن پوشه گزارشات
-
+ Saveذخیره
-
+ Logs files (*.log)Logs files (*.log)
-
+ Logs file savedفایل گزارشات ذخیره شد
-
+ Save logs to fileذخیره گزارشات در فایل
-
+ Clear logs?پاک کردن گزارشات؟
-
+ Continueادامه
-
+ Cancelکنسل
-
+ Logs have been cleaned upگزارشات پاک شدند
-
+ Clear logsپاک کردن گزارشات
@@ -1385,27 +1657,24 @@ Already installed containers were found on the server. All installed containers
PageSettingsServerData
-
+ All installed containers have been added to the applicationتمام کانتینرهای نصب شده به نرمافزار اضافه شدند
- Clear Amnezia cache
- پاک کردن حافظه داخلی Amnezia
+ پاک کردن حافظه داخلی Amnezia
- May be needed when changing other settings
- وقتی تنظیمات دیگر را تغییر دهید ممکن است نیاز باشد
+ وقتی تنظیمات دیگر را تغییر دهید ممکن است نیاز باشد
- Clear cached profiles?
- پاک کردن پروفایل ذخیره شده؟
+ پاک کردن پروفایل ذخیره شده؟
-
+ No new installed containers foundکانتینر نصب شده جدیدی پیدا نشد
@@ -1415,85 +1684,103 @@ Already installed containers were found on the server. All installed containers
-
-
-
-
-
+
+
+
+ Continueادامه
-
-
-
-
-
+
+
+
+ Cancelکنسل
-
+ Check the server for previously installed Amnezia servicesچک کردن سرویسهای نصب شده Amnezia بر روی سرور
-
+ Add them to the application if they were not displayedاضافه کردن آنها به نرمافزار اگر نمایش داده نشدهاند
-
+ Reboot serverسرور را دوباره راهاندازی کنید
-
+ Do you want to reboot the server?آیا میخواهید سرور را دوباره راهاندازی کنید؟
-
+ The reboot process may take approximately 30 seconds. Are you sure you wish to proceed?فرآیند راهاندازی ممکن است حدود ۳۰ ثانیه طول بکشد. آیا مطمئن هستید که میخواهید ادامه دهید؟
-
+
+ Cannot reboot server during active connection
+
+
+
+ Do you want to remove the server from application?آیا میخواهید سرور را از برنامه حذف کنید؟
-
+
+ Cannot remove server during active connection
+
+
+
+ Do you want to clear server from Amnezia software?آیا میخواهید سرور را از نرمافزار Amnezia پاک کنید؟
-
+ All users whom you shared a connection with will no longer be able to connect to it.همه کاربرانی که با آنها ارتباطی به اشتراک گذاشتهاید دیگر قادر به اتصال به آن نخواهند بود.
-
+
+ Cannot clear server from Amnezia software during active connection
+
+
+
+ Reset API configتنظیمات API را بازنشانی کنید
-
+ Do you want to reset API config?آیا می خواهید پیکربندی API را بازنشانی کنید؟
-
+
+ Cannot reset API config during active connection
+
+
+
+ Remove server from applicationحذف کردن سرور از نرمافزار
-
+ All installed AmneziaVPN services will still remain on the server.تمام سرویسهای نصبشده Amnezia همچنان بر روی سرور باقی خواهند ماند.
-
+ Clear server from Amnezia softwareپاک کردن سرور از نرمافزار Amnezia
@@ -1501,27 +1788,27 @@ Already installed containers were found on the server. All installed containers
PageSettingsServerInfo
-
+ Server nameنام سرور
-
+ Saveذخیره
-
+ Protocolsپروتکلها
-
+ Servicesسرویسها
-
+ Managementمدیریت
@@ -1529,32 +1816,59 @@ Already installed containers were found on the server. All installed containers
PageSettingsServerProtocol
-
+ settings تنظیمات
-
+
+ Clear %1 profile
+
+
+
+
+ Clear %1 profile?
+
+
+
+
+
+
+
+
+
+ Unable to clear %1 profile while there is an active connection
+
+
+
+ Remove حذف
-
+ Remove %1 from server?حذف %1 از سرور؟
-
+ All users with whom you shared a connection will no longer be able to connect to it.تمام کاربرانی که این ارتباط را با آنها به اشتراک گذاشتهاید دیگر نمیتوانند به آن متصل شوند.
-
+
+ Cannot remove active container
+
+
+
+
+ Continueادامه
-
+
+ Cancelکنسل
@@ -1562,7 +1876,7 @@ Already installed containers were found on the server. All installed containers
PageSettingsServersList
-
+ Serversسرورها
@@ -1570,100 +1884,100 @@ Already installed containers were found on the server. All installed containers
PageSettingsSplitTunneling
-
+ Default server does not support split tunneling functionسرور پیشفرض از عملکرد تونلسازی تقسیم شده پشتیبانی نمیکند
-
+ Addresses from the list should not be accessed via VPNدسترسی به آدرسهای لیست بدون ویپیان
-
+ Split tunnelingجداسازی ترافیک
-
+ Modeحالت
-
+ Remove حذف
-
+ Continueادامه
-
+ Cancelکنسل
-
+ Cannot change split tunneling settings during active connectionنمی توان تنظیمات تونل تقسیم را در طول اتصال فعال تغییر داد
-
+ Only the sites listed here will be accessed through the VPNتنها سایتهای موجود در اینجا از طریق VPN دسترسی داده خواهند شد
-
+ website or IPوبسایت یا آدرس IP
-
+ Import / Export Sitesوارد کردن / صادر کردن وبسایتها
-
+ Importبارگذاری
-
+ Save site listذخیره لیست سایتها
-
+ Save sitesذخیره سایتها
-
-
-
+
+
+ Sites files (*.json)Sites files (*.json)
-
+ Import a list of sitesبارگذاری لیست سایتها
-
+ Replace site listجایگزین کردن لیست سایت
-
-
+
+ Open sites fileباز کردن فایل سایتها
-
+ Add imported sites to existing onesاضافه کردن سایتهای بارگذاری شده به سایتهای موجود
@@ -1671,7 +1985,7 @@ Already installed containers were found on the server. All installed containers
PageSetupWizardConfigSource
-
+ Server connectionارتباط سرور
@@ -1684,37 +1998,37 @@ It's okay as long as it's from someone you trust.
ایرادی ندارد که از طرف کسی باشد که به او اعتماد دارید.
-
+ Do not use connection codes from untrusted sources, as they may be created to intercept your data.از کدهای اتصال از منابع نامعتبر استفاده نکنید، زیرا ممکن است برای رهگیری داده های شما ایجاد شده باشند.
-
+ What do you have?چی داری؟
-
+ File with connection settingsفایل شامل تنظیمات اتصال
-
+ File with connection settings or backupفایل شامل تنظیمات اتصال یا بکآپ
-
+ Open config fileباز کردن فایل تنظیمات
-
+ QR codeQR-Code
-
+ Key as textمتن شامل کلید
@@ -1722,57 +2036,57 @@ It's okay as long as it's from someone you trust.
PageSetupWizardCredentials
-
+ Server IP address [:port]آدرس آیپی سرور (:پورت)
-
+ Continueادامه
-
+ Enter the address in the format 255.255.255.255:88آدرس را با فرمت 255.255.255.255:88 وارد کنید
-
+ Configure your serverسرور خود را پیکربندی کنید
-
+ 255.255.255.255:22
-
+ SSH Username
-
+ Password or SSH private keyرمز عبور یا کلید خصوصی SSH
-
+ All data you enter will remain strictly confidential and will not be shared or disclosed to the Amnezia or any third partiesتمام دادههایی که شما وارد میکنید به شدت محرمانه است و با Amnezia یا هر شخص ثالث دیگری به اشتراک گذاشته نمیشود
-
+ Ip address cannot be emptyآدرس آیپی نمیتواند خالی باشد
-
+ Login cannot be emptyنامکاربری نمیتواند خالی باشد
-
+ Password/private key cannot be emptyپسورد یا کلید خصوصی نمیتواند خالی باشد
@@ -1780,22 +2094,22 @@ It's okay as long as it's from someone you trust.
PageSetupWizardEasy
-
+ What is the level of internet control in your region?سطح کنترل اینترنت در منطقه شما چگونه است؟
-
+ Choose a VPN protocolیک پروتکل VPN را انتخاب کنید
-
+ Skip setupرد شدن از تنظیم
-
+ Continueادامه
@@ -1803,38 +2117,38 @@ It's okay as long as it's from someone you trust.
PageSetupWizardInstalling
-
+ The server has already been added to the applicationسرور در حال حاضر به نرمافزار اضافه شده است
-
+ Amnezia has detected that your server is currently Amnezia has detected that your server is currently
-
+ busy installing other software. Amnezia installation مشغول نصب نرم افزارهای دیگر نصب Amnezia
-
+ will pause until the server finishes installing other softwareمتوقف شده تا زمانی که سرور نصب نرمافزار دیگر را تمام کند
-
+ Installingدر حال نصب
-
+ Cancel installationلغو عملیات نصب
-
+ Usually it takes no more than 5 minutesمعمولا بیش از 5 دقیقه طول نمیکشد
@@ -1842,45 +2156,50 @@ It's okay as long as it's from someone you trust.
PageSetupWizardProtocolSettings
-
+ Installing %1در حال نصب %1
-
+ More detailedجزییات بیشتر
-
+ Closeبستن
-
+ Network protocolپروتکل شبکه
-
+ Portپورت
-
+ Installنصب
+
+
+ The port must be in the range of 1 to 65535
+
+ PageSetupWizardProtocols
-
+ VPN protocolپروتکل ویپیان
-
+ Choose the one with the highest priority for you. Later, you can install other protocols and additional services, such as DNS proxy and SFTP.پروتکلی که بیشترین اولویت را برای شما دارد انتخاب کنید. بعدا، میتوانید پروتکلها و سرویسهای اضافه مانند پروکسی DNS و SFTP را هم نصب کنید.
@@ -1888,7 +2207,7 @@ It's okay as long as it's from someone you trust.
PageSetupWizardQrReader
-
+ Point the camera at the QR code and hold for a couple of seconds. دوربین را روی QR Code بگیرید و برای چند ثانیه آن را نگه دارید.
@@ -1896,32 +2215,32 @@ It's okay as long as it's from someone you trust.
PageSetupWizardStart
-
+ Settings restored from backup fileتنظیمات از فایل بکآپ بازیابی شدند
-
+ Free service for creating a personal VPN on your server.سرویس رایگان برای ایجاد ویپیان شخصی بر روی سرور خودتان.
-
+ Helps you access blocked content without revealing your privacy, even to VPN providers. به شما کمک میکند که بدون فاش کردن حریم شخصی خودتان, حتی برای ارائه دهنده ویپیان به محتوای مسدود شده دسترسی پیدا کنید.
-
+ I have the data to connectمن داده برای اتصال دارم
-
+ I have nothingمن هیچی ندارم
-
+ https://amnezia.org/instructions/0_starter-guide
@@ -1929,27 +2248,27 @@ It's okay as long as it's from someone you trust.
PageSetupWizardTextKey
-
+ Connection keyکلید ارتباط
-
+ A line that starts with vpn://...خطی که با آن شروع می شود vpn://...
-
+ Keyکلید
-
+ Insertوارد کردن
-
+ Continueادامه
@@ -1957,27 +2276,32 @@ It's okay as long as it's from someone you trust.
PageSetupWizardViewConfig
-
+ New connectionارتباط جدید
-
+ Collapse contentجمع کردن محتوا
-
+ Show contentنمایش محتوا
-
+
+ Enable WireGuard obfuscation. It may be useful if WireGuard is blocked on your provider.
+
+
+
+ Use connection codes only from sources you trust. Codes from public sources may have been created to intercept your data.از کدهای اتصال فقط از منابع مورد اعتماد خود استفاده کنید. ممکن است کدهایی از منابع عمومی برای رهگیری داده های شما ایجاد شده باشند
-
+ Connectاتصال
@@ -1985,182 +2309,211 @@ It's okay as long as it's from someone you trust.
PageShare
-
+ OpenVPN native formatفرمت OpenVPN
-
+ WireGuard native formatفرمت WireGuard
-
+ Connectionارتباط
-
-
+
+ Serverسرور
-
+ Config revokedتنظیمات ابطالشد
-
+ Connection to ارتباط با
-
+ File with connection settings to فایل شامل تنظیمات ارتباط با
-
+ Save OpenVPN configذخیره تنظیمات OpenVPN
-
+ Save WireGuard configذخیره تنظیمات WireGuard
-
+ Save AmneziaWG configتنظیمات AmneziaWG را ذخیره کنید
-
+ Save Shadowsocks configذخیره تنظیمات Shadowsocks
-
+ Save Cloak configذخیره تنظیمات Cloak
-
+
+ Save XRay config
+
+
+
+ For the AmneziaVPN appبرای نرمافزار AmneziaVPN
-
+ AmneziaWG native formatفرمت بومی AmneziaWG
-
+ Shadowsocks native formatفرمت Shadowsocks
-
+ Cloak native formatفرمت Cloak
-
+
+ XRay native format
+
+
+
+ Share VPN Accessاتصال vpn را به اشتراک بگذارید
-
+ Share full access to the server and VPNبه اشتراک گذاشتن دسترسی کامل به سرور و ویپیان
-
+ Use for your own devices, or share with those you trust to manage the server.برای دستگاههای خودتان استفاده کنید یا با آنهایی که برای مدیریت سرور به آنها اعتماد دارید به اشتراک بگذارید.
-
-
+
+ Usersکاربران
-
+ User nameنام کاربری
-
+ Searchجستجو
-
- Creation date:
- تاریخ ایجاد:
+
+ Creation date: %1
+
-
+
+ Latest handshake: %1
+
+
+
+
+ Data received: %1
+
+
+
+
+ Data sent: %1
+
+
+
+ Creation date:
+ تاریخ ایجاد:
+
+
+ Renameتغییر نام
-
+ Client nameنام کلاینت
-
+ Saveذخیره
-
+ Revokeابطال
-
+ Revoke the config for a user - %1?لغو پیکربندی برای یک کاربر - %1?
-
+ The user will no longer be able to connect to your server.کاربر دیگر نمیتواند به سرور وصل شود.
-
+ Continueادامه
-
+ Cancelکنسل
-
+ Share VPN access without the ability to manage the serverبه اشتراک گذاشتن دسترسی ویپیان بدون امکان مدیریت سرور
-
-
+
+ Protocolپروتکل
-
-
+
+ Connection formatفرمت ارتباط
-
-
+
+ Shareاشتراکگذاری
@@ -2168,50 +2521,50 @@ It's okay as long as it's from someone you trust.
PageShareFullAccess
-
+ Full access to the server and VPNدسترسی کامل به سرور و ویپیان
-
+ We recommend that you use full access to the server only for your own additional devices.
ما پیشنهاد میکنیم که ازحالت دسترسی کامل به سرور فقط برای دستگاههای دیگر خودتان استفاده کنید.
-
+ If you share full access with other people, they can remove and add protocols and services to the server, which will cause the VPN to work incorrectly for all users. اگر دسترسی کامل را با دیگران به اشتراک بگذارید، آنها میتوانند پروتکلها و سرویسها را حذف یا اضافه کنند که باعث میشود که ویپیان دیگر برای سایر کاربران کار نکند.
-
-
+
+ Serverسرور
-
+ Accessing در حال دسترسی به
-
+ File with accessing settings to فایل شامل تنظیمات دسترسی به
-
+ Shareاشتراکگذاری
-
+ Connection to ارتباط با
-
+ File with connection settings to فایل شامل تنظیمات ارتباط با
@@ -2219,7 +2572,7 @@ It's okay as long as it's from someone you trust.
PageStart
-
+ Logging was disabled after 14 days, log files were deleted
@@ -2227,7 +2580,7 @@ It's okay as long as it's from someone you trust.
PopupType
-
+ Closeبستن
@@ -2476,6 +2829,7 @@ It's okay as long as it's from someone you trust.
+ Unknown errorUnknown error
@@ -2485,62 +2839,62 @@ It's okay as long as it's from someone you trust.
Function not implemented
-
+ Server check failedServer check failed
-
+ Server port already used. Check for another softwareServer port already used. Check for another software
-
+ Server error: Docker container missingServer error: Docker container missing
-
+ Server error: Docker failedServer error: Docker failed
-
+ Installation canceled by userInstallation canceled by user
-
+ The user does not have permission to use sudoThe user does not have permission to use sudo
-
+ SSH request was deniedSSH request was denied
-
+ SSH request was interruptedSSH request was interrupted
-
+ SSH internal errorSSH internal error
-
+ Invalid private key or invalid passphrase enteredInvalid private key or invalid passphrase entered
-
+ The selected private key format is not supported, use openssh ED25519 key types or PEM key typesThe selected private key format is not supported, use openssh ED25519 key types or PEM key types
-
+ Timeout connecting to serverTimeout connecting to server
@@ -2597,142 +2951,177 @@ It's okay as long as it's from someone you trust.
Sftp error: No media was in remote drive
-
+ The config does not contain any containers and credentials for connecting to the serverتنظیمات شامل هیچ کانتینر یا اعتبارنامهای برای اتصال به سرور نیست
-
+ VPN connection errorخطای اتصال VPN
-
+ Error when retrieving configuration from APIخطا هنگام بازیابی پیکربندی از API
-
+ This config has already been added to the applicationاین پیکربندی قبلاً به برنامه اضافه شده است
-
+ ErrorCode: %1. کد خطا: %1.
-
+ OpenVPN config missingOpenVPN config missing
-
+
+ Background service is not running
+
+
+
+
+ Server error: Packet manager error
+
+
+
+ SCP error: Generic failure
-
+ OpenVPN management server errorOpenVPN management server error
-
+ OpenVPN executable missingOpenVPN executable missing
-
+ Shadowsocks (ss-local) executable missingShadowsocks (ss-local) executable missing
-
+ Cloak (ck-client) executable missingCloak (ck-client) executable missing
-
+ Amnezia helper service errorAmnezia helper service error
-
+ OpenSSL failedOpenSSL failed
-
+ Can't connect: another VPN connection is activeCan't connect: another VPN connection is active
-
+ Can't setup OpenVPN TAP network adapterCan't setup OpenVPN TAP network adapter
-
+ VPN pool error: no available addressesVPN pool error: no available addresses
- QFile error: The file could not be opened
+ In the response from the server, an empty config was received
- QFile error: An error occurred when reading from the file
+ SSL error occurred
- QFile error: The file could not be accessed
-
-
-
-
- QFile error: An unspecified error occurred
-
-
-
-
- QFile error: A fatal error occurred
+ Server response timeout on api request
- QFile error: The operation was aborted
+ QFile error: The file could not be opened
+
+
+
+
+ QFile error: An error occurred when reading from the file
+
+
+
+
+ QFile error: The file could not be accessed
+
+
+
+
+ QFile error: An unspecified error occurred
+ QFile error: A fatal error occurred
+
+
+
+
+ QFile error: The operation was aborted
+
+
+
+ Internal errorInternal error
-
+ IPsecIPsec
-
+ Shadowsocks - masks VPN traffic, making it similar to normal web traffic, but it may be recognized by analysis systems in some highly censored regions.شدوساکس - ترافیک VPN را پنهان می کند، به طوری که مشابه ترافیک وب عادی می شود، اما ممکن است توسط سیستم های تجزیه و تحلیل در برخی از مناطق با سانسور شدید شناسایی شود.
-
+ OpenVPN over Cloak - OpenVPN with VPN masquerading as web traffic and protection against active-probing detection. Ideal for bypassing blocking in regions with the highest levels of censorship.OpenVPN روی Cloak - OpenVPN با VPN که به عنوان ترافیک وب پنهان میشود و مقاومت در برابر تشخیص فعال از طریق پیشرفته. ایدهآل برای دور زدن مسدود کردن در مناطق با بالاترین سطوح سانسور.
-
+
+ XRay with REALITY - Suitable for countries with the highest level of internet censorship. Traffic masking as web traffic at the TLS level, and protection against detection by active probing methods.
+
+
+
+
+ IKEv2/IPsec - Modern stable protocol, a bit faster than others, restores connection after signal loss. It has native support on the latest versions of Android and iOS.
+
+
+
+ Create a file vault on your server to securely store and transfer files.ساختن یک گنجانده فایل بر روی سرور شما برای ذخیره و انتقال ایمن فایلها.
-
+ This is a combination of the OpenVPN protocol and the Cloak plugin designed specifically for protecting against blocking.
OpenVPN provides a secure VPN connection by encrypting all internet traffic between the client and the server.
@@ -2771,7 +3160,7 @@ Cloak میتواند اطلاعات فراداده بسته را تغییر
-
+ A relatively new popular VPN protocol with a simplified architecture.
WireGuard provides stable VPN connection and high performance on all devices. It uses hard-coded encryption settings. WireGuard compared to OpenVPN has lower latency and better data transfer throughput.
WireGuard is very susceptible to blocking due to its distinct packet signatures. Unlike some other VPN protocols that employ obfuscation techniques, the consistent signature patterns of WireGuard packets can be more easily identified and thus blocked by advanced Deep Packet Inspection (DPI) systems and other network monitoring tools.
@@ -2792,7 +3181,15 @@ WireGuard به دلیل امضاهای بسته متمایز خود، بسیار
* روی پروتکل شبکه UDP کار می کند.
-
+
+ The REALITY protocol, a pioneering development by the creators of XRay, is specifically designed to counteract the highest levels of internet censorship through its novel approach to evasion.
+It uniquely identifies censors during the TLS handshake phase, seamlessly operating as a proxy for legitimate clients while diverting censors to genuine websites like google.com, thus presenting an authentic TLS certificate and data.
+This advanced capability differentiates REALITY from similar technologies by its ability to disguise web traffic as coming from random, legitimate sites without the need for specific configurations.
+Unlike older protocols such as VMess, VLESS, and the XTLS-Vision transport, REALITY's innovative "friend or foe" recognition at the TLS handshake enhances security and circumvents detection by sophisticated DPI systems employing active probing techniques. This makes REALITY a robust solution for maintaining internet freedom in environments with stringent censorship.
+
+
+
+ IKEv2, paired with the IPSec encryption layer, stands as a modern and stable VPN protocol.
One of its distinguishing features is its ability to swiftly switch between networks and devices, making it particularly adaptive in dynamic network environments.
While it offers a blend of security, stability, and speed, it's essential to note that IKEv2 can be easily detected and is susceptible to blocking.
@@ -2813,58 +3210,57 @@ While it offers a blend of security, stability, and speed, it's essential t
* روی پروتکل شبکه UDP، پورتهای 500 و 4500 کار میکند.
-
+ DNS Serviceسرویس DNS
-
+ SFTP file sharing serviceسرویس فایل اشتراک SFTP
-
-
+
+ Website in Tor networkوب سایت در شبکه Tor
-
+ AmneziaDNSAmneziaDNS
-
+ OpenVPN is the most popular VPN protocol, with flexible configuration options. It uses its own security protocol with SSL/TLS for key exchange.پروتکل OpenVPN یکی از پروتکلهای ویپیان محبوب میباشد با تنظیمات و پیکربندیهای قابل تغییر. از پروتکل امنیتی داخلی خود با تبادل کلید SSL/TLS استفاده میکند.
-
+ WireGuard - New popular VPN protocol with high performance, high speed and low power consumption. Recommended for regions with low levels of censorship.پروتکل WireGuard یک پروتکل ویپیان جدید با عملکرد بسیار خوب، سرعت بالا و مصرف انرژی پایین. برای مناطقی که سطح سانسور پایینی دارند پیشنهاد میشود.
-
+ AmneziaWG - Special protocol from Amnezia, based on WireGuard. It's fast like WireGuard, but very resistant to blockages. Recommended for regions with high levels of censorship.پروتکل AmneziaWG یک پروتکل اختصاصی Amnezia که بر اساس WireGaurd کار میکند. به اندازه WireGaurd پرسرعت است و در عین حال بسیار مقاوم به بلاک شدن توسط شبکه ست. مناسب برای مناطق با سطح سانسور بالاست.
- IKEv2/IPsec - Modern stable protocol, a bit faster than others, restores connection after signal loss.
- پروتکل IKEv2/IPsec پروتکلی پایدار و مدرن که مقداری سریعتر از سایر پروتکلهاست. بعد از قطع سیگنال دوباره اتصال را بازیابی میکند.
+ پروتکل IKEv2/IPsec پروتکلی پایدار و مدرن که مقداری سریعتر از سایر پروتکلهاست. بعد از قطع سیگنال دوباره اتصال را بازیابی میکند.
-
+ Deploy a WordPress site on the Tor network in two clicks.با دو کلیک یک سایت وردپرس در شبکه Tor راهاندازی کنید.
-
+ Replace the current DNS server with your own. This will increase your privacy level.سرور DNS را با مال خودتان جایگزین کنید. این کار سطح حریم خصوصی شما را افزایش میدهد.
-
+ OpenVPN stands as one of the most popular and time-tested VPN protocols available.
It employs its unique security protocol, leveraging the strength of SSL/TLS for encryption and key exchange. Furthermore, OpenVPN's support for a multitude of authentication methods makes it versatile and adaptable, catering to a wide range of devices and operating systems. Due to its open-source nature, OpenVPN benefits from extensive scrutiny by the global community, which continually reinforces its security. With a strong balance of performance, security, and compatibility, OpenVPN remains a top choice for privacy-conscious individuals and businesses alike.
@@ -2887,7 +3283,7 @@ It employs its unique security protocol, leveraging the strength of SSL/TLS for
* امکان کار بر روی دو پروتکل TCP و UDP
-
+ Shadowsocks, inspired by the SOCKS5 protocol, safeguards the connection using the AEAD cipher. Although Shadowsocks is designed to be discreet and challenging to identify, it isn't identical to a standard HTTPS connection.However, certain traffic analysis systems might still detect a Shadowsocks connection. Due to limited support in Amnezia, it's recommended to use AmneziaWG protocol.
* Available in the AmneziaVPN only on desktop platforms
@@ -2902,7 +3298,7 @@ It employs its unique security protocol, leveraging the strength of SSL/TLS for
* عملکرد بر روی پروتکل شبکه TCP
-
+ A modern iteration of the popular VPN protocol, AmneziaWG builds upon the foundation set by WireGuard, retaining its simplified architecture and high-performance capabilities across devices.
While WireGuard is known for its efficiency, it had issues with being easily detected due to its distinct packet signatures. AmneziaWG solves this problem by using better obfuscation methods, making its traffic blend in with regular internet traffic.
This means that AmneziaWG keeps the fast performance of the original while adding an extra layer of stealth, making it a great choice for those wanting a fast and discreet VPN connection.
@@ -2923,7 +3319,7 @@ This means that AmneziaWG keeps the fast performance of the original while addin
* کار بر روی پروتکل شبکه UDP
-
+ After installation, Amnezia will create a
file storage on your server. You will be able to access it using
@@ -2942,10 +3338,17 @@ For more detailed information, you can
آن را در بخش پشتیبانی تحت "ایجاد ذخیره سازی فایل SFTP" پیدا کنید."
-
+ SFTP serviceسرویس SFTP
+
+
+
+
+ SOCKS5 proxy server
+
+ Entry not found
@@ -2996,21 +3399,147 @@ For more detailed information, you can
No matchNo match
-
-
- Unknown error
- Unknown error
- error 0x%1: %2error 0x%1: %2
+
+
+ vmess:// url is invalid
+
+
+
+
+ Invalid streamSettings protocol:
+
+
+
+
+ Unknown transport method:
+
+
+
+
+ VMess string should start with 'vmess://'
+
+
+
+
+ VMess string should be a valid base64 string
+
+
+
+
+ JSON should not be empty
+
+
+
+
+ VLESS link should start with vless://
+
+
+
+
+ link parse failed: %1
+
+
+
+
+ empty host
+
+
+
+
+ missing port
+
+
+
+
+ missing uuid
+
+
+
+
+ Invalid ssd link: json: field %1 must exist
+
+
+
+
+ Invalid ssd link: json: field %1 must be valid port number
+
+
+
+
+ Invalid ssd link: json: field %1 must be of type 'string'
+
+
+
+
+ Invalid ssd link: json: field %1 must be an array
+
+
+
+
+ Skipping invalid ssd server: server must be an object
+
+
+
+
+ Skipping invalid ssd server: missing required field %1
+
+
+
+
+ Skipping invalid ssd server: field %1 should be of type 'string'
+
+
+
+
+ Invalid ssd link: should begin with ssd://
+
+
+
+
+ Invalid ssd link: base64 parse failed
+
+
+
+
+ Invalid ssd link: json parse failed
+
+
+
+
+ Invalid ssd link: rc4-md5 encryption is not supported by v2ray-core
+
+
+
+
+ SS URI is too short
+
+
+
+
+
+ Can't find the colon separator between method and password
+
+
+
+
+ Can't find the at separator between password and hostname
+
+
+
+
+ Can't find the colon separator between hostname and port
+
+ SelectLanguageDrawer
-
+ Choose languageانتخاب زبان
@@ -3032,17 +3561,16 @@ For more detailed information, you can
SettingsController
-
+ All settings have been reset to default valuesتمام تنظیمات به مقادیر پیش فرض ریست شد
- Cached profiles cleared
- پروفایل ذخیره شده پاک شد
+ پروفایل ذخیره شده پاک شد
-
+ Backup file is corruptedفایل بکآپ خراب شده است
@@ -3066,23 +3594,23 @@ For more detailed information, you can
کپی
-
-
+
+ Copiedکپی شد
-
+ Copy config stringکپیکردن متن تنظیمات
-
+ Show connection settingsنمایش تنظیمات ارتباط
-
+ To read the QR code in the Amnezia app, select "Add server" → "I have data to connect" → "QR code, key or settings file"برای خواندن QR Code در نرمافزار AmneziaVPN "اضافه کردن سرور" -> "من داده برای اتصال دارم" -> "QR Code، کلید یا فایل تنظیمات"
@@ -3166,7 +3694,7 @@ For more detailed information, you can
TextFieldWithHeaderType
-
+ The field can't be emptyاین فیلد نمیتواند خالی باشد.
@@ -3174,7 +3702,7 @@ For more detailed information, you can
VpnConnection
-
+ MbpsMbps
@@ -3182,42 +3710,42 @@ For more detailed information, you can
VpnProtocol
-
+ Unknownناشناخته
-
+ Disconnectedقطع شده
-
+ Preparingدرحال آمادهسازی
-
+ Connecting...برقراری ارتباط...
-
+ Connectedوصل شد
-
+ Disconnecting...در حال قطع شدن...
-
+ Reconnecting...برقراری ارتباط دوباره...
-
+ Errorخطا
@@ -3225,45 +3753,43 @@ For more detailed information, you can
amnezia::ContainerProps
-
+ Lowپایین
-
+ Highمتوسط یا بالا
- Extreme
- شدید
+ شدید
-
+ I just want to increase the level of my privacy.من فقط میخواهم سطح حریم شخصی خودم را بالا ببرم
-
+ I want to bypass censorship. This option recommended in most cases.من میخواهم از سانسور عبور کنم. این گزینه در اکثر موارد توصیه میشود
- Most VPN protocols are blocked. Recommended if other options are not working.
- اکثر پروتکلهای ویپیان مسدود شدهاند. در مواردی که بقیه گزینهها کار نمیکنند توصی میشود.
+ اکثر پروتکلهای ویپیان مسدود شدهاند. در مواردی که بقیه گزینهها کار نمیکنند توصی میشود.main2
-
+ Private key passphraseعبارت کلید خصوصی
-
+ Saveذخیره
diff --git a/client/translations/amneziavpn_hi_IN.ts b/client/translations/amneziavpn_hi_IN.ts
index 68f324c6..c13af2c2 100644
--- a/client/translations/amneziavpn_hi_IN.ts
+++ b/client/translations/amneziavpn_hi_IN.ts
@@ -35,62 +35,62 @@
ConnectionController
-
-
-
-
+
+
+
+ Connectकनेक्ट
-
+ VPN Protocols is not installed.
Please install VPN container at firstपीएन प्रोटोकॉल स्थापित नहीं है.
कृपया पहले वीपीएन कंटेनर स्थापित करें
-
+ Connectedजुड़ा हुआ
-
+ The selected protocol is not supported on the current platformचयनित प्रोटोकॉल वर्तमान प्लेटफ़ॉर्म पर समर्थित नहीं है
-
+ unable to create configurationकॉन्फ़िगरेशन बनाने में असमर्थ
-
+ Connecting...कनेक्ट...
-
+ Reconnecting...पुनः कनेक्ट हो रहा है...
-
+ Disconnecting...डिस्कनेक्ट हो रहा है...
-
+ Preparing...तैयार कर रहे हैं...
-
+ Settings updated successfully, reconnnection...सेटिंग्स सफलतापूर्वक अपडेट हो गईं...
-
+ Settings updated successfullyसेटिंग्स सफलतापूर्वक अपडेट हो गईं
@@ -139,7 +139,7 @@
ExportController
-
+ Access error!प्रवेश त्रुटि!
@@ -202,85 +202,90 @@ Can't be disabled for current server
ImportController
-
+ Unable to open fileफाइल खोलने में असमर्थ
-
-
+
+ Invalid configuration fileअमान्य कॉन्फ़िगरेशन फ़ाइल
-
+ Scanned %1 of %2.%2 में से %1 स्कैन किया गया.
+
+
+ In the imported configuration, potentially dangerous lines were found:
+
+ InstallController
-
+ %1 installed successfully. %1 सफलतापूर्वक स्थापित हुआ.
-
+ %1 is already installed on the server. %1 पहले से ही सर्वर पर स्थापित है.
-
+
Added containers that were already installed on the server
सर्वर पर पहले से स्थापित कंटेनर जोड़े गए
-
+
Already installed containers were found on the server. All installed containers have been added to the application
सर्वर पर पहले से स्थापित कंटेनर पाए गए। सभी स्थापित कंटेनरों को एप्लिकेशन में जोड़ दिया गया है
-
+ Settings updated successfullyसेटिंग्स सफलतापूर्वक अपडेट हो गईं
-
+ Server '%1' was rebootedसर्वर '%1' रीबूट किया गया था
-
+ Server '%1' was removedसर्वर '%1' रीबूट किया गया था
-
+ All containers from server '%1' have been removedसर्वर '%1' से सभी कंटेनर हटा दिए गए हैं
-
+ %1 has been removed from the server '%2'%1 को सर्वर '%2' से हटा दिया गया है
-
+ %1 cached profile cleared%1 कैश्ड प्रोफ़ाइल साफ़ की गई
-
+ Please login as the userकृपया उपयोगकर्ता के रूप में लॉगिन करें
-
+ Server added successfullyसर्वर सफलतापूर्वक जोड़ा गया
@@ -324,28 +329,28 @@ Already installed containers were found on the server. All installed containers
NotificationHandler
-
-
+
+ AmneziaVPNAmneziaVPN
-
+ VPN Connectedकनेक्ट
-
+ VPN Disconnectedकनेक्ट
-
+ AmneziaVPN notificationAmneziaVPN अधिसूचना
-
+ Unsecured network detected: असुरक्षित नेटवर्क का पता चला:
@@ -915,6 +920,76 @@ Already installed containers were found on the server. All installed containers
रद्द करना
+
+ PageServiceSocksProxySettings
+
+
+ Settings updated successfully
+ सेटिंग्स सफलतापूर्वक अपडेट हो गईं
+
+
+
+
+ SOCKS5 settings
+
+
+
+
+ Host
+ मेज़बान
+
+
+
+
+
+
+ Copied
+ कॉपी किया गया
+
+
+
+
+ Port
+
+
+
+
+ User name
+ उपयोगकर्ता नाम
+
+
+
+
+ Password
+ पासवर्ड
+
+
+
+ Username
+
+
+
+
+
+ Change connection settings
+
+
+
+
+ The port must be in the range of 1 to 65535
+
+
+
+
+ Password cannot be empty
+
+
+
+
+ Username cannot be empty
+
+
+PageServiceTorWebsiteSettings
@@ -1097,14 +1172,22 @@ Already installed containers were found on the server. All installed containers
सक्रिय कनेक्शन के दौरान स्प्लिट टनलिंग सेटिंग्स को नहीं बदला जा सकता
- Only the Apps listed here will be accessed through the VPN
- केवल यहां सूचीबद्ध ऐप्स को ही वीपीएन के माध्यम से एक्सेस किया जाएगा
+ केवल यहां सूचीबद्ध ऐप्स को ही वीपीएन के माध्यम से एक्सेस किया जाएगा
+
+
+ Apps from the list should not be accessed via VPN
+ सूची के ऐप्स को वीपीएन के माध्यम से एक्सेस नहीं किया जाना चाहिए
+
+
+
+ Only the apps from the list should have access via VPN
+
- Apps from the list should not be accessed via VPN
- सूची के ऐप्स को वीपीएन के माध्यम से एक्सेस नहीं किया जाना चाहिए
+ Apps from the list should not have access via VPN
+
@@ -1150,92 +1233,102 @@ Already installed containers were found on the server. All installed containers
PageSettingsApplication
-
+ Applicationएप्लिकेशन
-
+ Allow application screenshotsएप्लिकेशन स्क्रीनशॉट की अनुमति दें
-
+
+ Enable notifications
+
+
+
+
+ Enable notifications to show the VPN state in the status bar
+
+
+
+ Auto startऑटो स्टार्ट
-
+ Launch the application every time the device is startsहर बार डिवाइस चालू होने पर एप्लिकेशन लॉन्च करें
-
+ Auto connectऑटो कनेक्ट
-
+ Connect to VPN on app startऐप शुरू होने पर वीपीएन से कनेक्ट करें
-
+ Start minimizedस्टार्ट को मिनिमाइज किया गया
-
+ Launch application minimizedलॉन्च एप्लिकेशन को न्यूनतम किया गया
-
+ Languageभाषा
-
+ Loggingलॉगिंग
-
+ Enabledसक्रिय किया
-
+ Disabledअक्षम
-
+ Reset settings and remove all data from the applicationसेटिंग्स रीसेट करें और एप्लिकेशन से सभी डेटा हटा दें
-
+ Reset settings and remove all data from the application?सेटिंग्स रीसेट करें और एप्लिकेशन से सभी डेटा हटा दें?
-
+ All settings will be reset to default. All installed AmneziaVPN services will still remain on the server.सभी सेटिंग्स डिफ़ॉल्ट पर रीसेट हो जाएंगी. सभी स्थापित AmneziaVPN सेवाएँ अभी भी सर्वर पर रहेंगी।.
-
+ Continueजारी रखना
-
+ Cancelरद्द करना
-
+ Cannot reset settings during active connectionसक्रिय कनेक्शन के दौरान सेटिंग्स रीसेट नहीं की जा सकतीं
@@ -1332,7 +1425,7 @@ Already installed containers were found on the server. All installed containers
जब AmneziaDNS का उपयोग या स्थापित नहीं किया जाता है
-
+ Allows you to use the VPN only for certain Appsआपको केवल कुछ ऐप्स के लिए वीपीएन का उपयोग करने की अनुमति देता है
@@ -1362,22 +1455,22 @@ Already installed containers were found on the server. All installed containers
आपको यह चुनने की अनुमति देता है कि आप वीपीएन के माध्यम से किन साइटों तक पहुंचना चाहते हैं
-
+ App-based split tunnelingऐप-आधारित स्प्लिट टनलिंग
-
+ KillSwitchस्विच बन्द कर दो
-
+ Disables your internet if your encrypted VPN connection drops out for any reason.यदि आपका एन्क्रिप्टेड वीपीएन कनेक्शन किसी भी कारण से बंद हो जाता है तो आपका इंटरनेट अक्षम कर देता है.
-
+ Cannot change killSwitch settings during active connectionसक्रिय कनेक्शन के दौरान किलस्विच सेटिंग्स को नहीं बदला जा सकता
@@ -1668,17 +1761,17 @@ Already installed containers were found on the server. All installed containers
PageSettingsServerProtocol
-
+ settings समायोजन
-
+ Clear %1 profile%1 प्रोफ़ाइल साफ़ करें
-
+ Clear %1 profile?%1 प्रोफ़ाइल साफ़ करें?
@@ -1688,39 +1781,39 @@ Already installed containers were found on the server. All installed containers
-
+ Unable to clear %1 profile while there is an active connectionसक्रिय कनेक्शन होने पर %1 प्रोफ़ाइल साफ़ करने में असमर्थ
-
+ Remove निकालना
-
+ All users with whom you shared a connection will no longer be able to connect to it.वे सभी उपयोगकर्ता जिनके साथ आपने कनेक्शन साझा किया था, वे अब इससे कनेक्ट नहीं हो पाएंगे.
-
+ Cannot remove active containerसक्रिय कंटेनर को हटाया नहीं जा सकता
-
+ Remove %1 from server?सर्वर से %1 हटाएँ?
-
-
+
+ Continueजारी रखना
-
-
+
+ Cancelरद्द करना
@@ -2029,16 +2122,21 @@ Already installed containers were found on the server. All installed containers
Installस्थापित करना
+
+
+ The port must be in the range of 1 to 65535
+
+ PageSetupWizardProtocols
-
+ VPN protocolVPN प्रोटोकॉल
-
+ Choose the one with the highest priority for you. Later, you can install other protocols and additional services, such as DNS proxy and SFTP.वह चुनें जो आपके लिए सर्वोच्च प्राथमिकता हो। बाद में, आप अन्य प्रोटोकॉल और अतिरिक्त सेवाएँ, जैसे DNS प्रॉक्सी और SFTP स्थापित कर सकते हैं.
@@ -2046,7 +2144,7 @@ Already installed containers were found on the server. All installed containers
PageSetupWizardQrReader
-
+ Point the camera at the QR code and hold for a couple of seconds. कैमरे को QR कोड पर रखें और कुछ सेकंड के लिए रोककर रखें.
@@ -2135,12 +2233,12 @@ Already installed containers were found on the server. All installed containers
वायरगार्ड अस्पष्टीकरण सक्षम करें. यदि आपके प्रदाता पर वायरगार्ड अवरुद्ध है तो यह उपयोगी हो सकता है.
-
+ Use connection codes only from sources you trust. Codes from public sources may have been created to intercept your data.केवल उन स्रोतों से कनेक्शन कोड का उपयोग करें जिन पर आपको भरोसा है। हो सकता है कि आपके डेटा को इंटरसेप्ट करने के लिए सार्वजनिक स्रोतों से कोड बनाए गए हों.
-
+ Connectकनेक्ट
@@ -2178,88 +2276,87 @@ Already installed containers were found on the server. All installed containers
एक्सरे कॉन्फिगरेशन सहेजें
-
+ For the AmneziaVPN appAmneziaVPN ऐप के लिए
- OpenVpn native format
- OpenVpn मूल स्वरूप
+ OpenVpn मूल स्वरूप
-
+ WireGuard native formatवायरगार्ड मूल प्रारूप
-
+ AmneziaWG native formatAmneziaWG मूल प्रारूप
-
+ Shadowsocks native formatशैडोसॉक्स मूल प्रारूप
-
+ Cloak native formatलबादा देशी स्वरूप
-
+ XRay native formatएक्सरे देशी प्रारूप
-
+ Share VPN AccessVPN एक्सेस साझा करें
-
+ Share full access to the server and VPNसर्वर और वीपीएन तक पूर्ण पहुंच साझा करें
-
+ Use for your own devices, or share with those you trust to manage the server.अपने स्वयं के उपकरणों के लिए उपयोग करें, या सर्वर को प्रबंधित करने के लिए उन लोगों के साथ साझा करें जिन पर आप भरोसा करते हैं.
-
-
+
+ Usersउपयोगकर्ताओं
-
+ Share VPN access without the ability to manage the serverसर्वर को प्रबंधित करने की क्षमता के बिना वीपीएन एक्सेस साझा करें
-
+ Searchखोज
-
+ Creation date: %1निर्माण दिनांक: %1
-
+ Latest handshake: %1नवीनतम हाथ मिलाना: %1
-
+ Data received: %1प्राप्त डेटा: %1
-
+ Data sent: %1डेटा भेजा गया: %1
@@ -2268,53 +2365,53 @@ Already installed containers were found on the server. All installed containers
निर्माण तिथि:
-
+ Renameनाम बदलें
-
+ Client nameग्राहक नाम
-
+ Saveसहेजें
-
+ Revokeनिरस्त करें
-
+ Revoke the config for a user - %1?किसी उपयोक्ता के लिए कॉन्फ़िगरेशन निरस्त करें - %1?
-
+ The user will no longer be able to connect to your server.उपयोगकर्ता अब आपके सर्वर से कनेक्ट नहीं हो पाएगा.
-
+ Continueजारी रखना
-
+ Cancelरद्द करना
-
+ Connectionकनेक्शन
-
+ Serverसर्वर
@@ -2324,8 +2421,8 @@ Already installed containers were found on the server. All installed containers
कनेक्शन सेटिंग्स वाली फ़ाइल
-
+ Protocolशिष्टाचार
@@ -2340,19 +2437,24 @@ Already installed containers were found on the server. All installed containers
कॉन्फ़िगरेशन निरस्त कर दिया गया
-
+
+ OpenVPN native format
+
+
+
+ User nameउपयोगकर्ता नाम
-
+ Connection formatकनेक्शन प्रारूप
-
-
+
+ Shareशेयर करना
@@ -2411,7 +2513,7 @@ Already installed containers were found on the server. All installed containers
PageStart
-
+ Logging was disabled after 14 days, log files were deleted14 दिनों के बाद लॉगिंग अक्षम कर दी गई, लॉग फ़ाइलें हटा दी गईं
@@ -2419,7 +2521,7 @@ Already installed containers were found on the server. All installed containers
PopupType
-
+ Closeबंद करना
@@ -2662,10 +2764,17 @@ Already installed containers were found on the server. All installed containers
QObject
-
+ SFTP serviceएसएफटीपी सेवा
+
+
+
+
+ SOCKS5 proxy server
+
+ No error
@@ -2673,6 +2782,7 @@ Already installed containers were found on the server. All installed containers
+ Unknown errorअज्ञात त्रुटि
@@ -2682,233 +2792,258 @@ Already installed containers were found on the server. All installed containers
फ़ंक्शन क्रियान्वित नहीं किया गया
-
+
+ Background service is not running
+
+
+
+ Server check failedसर्वर जाँच विफल रही
-
+ Server port already used. Check for another softwareसर्वर पोर्ट पहले ही उपयोग किया जा चुका है. किसी अन्य सॉफ़्टवेयर की जाँच करें
-
+ Server error: Docker container missingसर्वर त्रुटि: डॉकर कंटेनर गायब है
-
+ Server error: Docker failedसर्वर त्रुटि: डॉकर विफल
-
+ Installation canceled by userउपयोगकर्ता द्वारा इंस्टॉलेशन रद्द कर दिया गया
-
+ The user does not have permission to use sudoउपयोगकर्ता के पास sudo का उपयोग करने की अनुमति नहीं है
-
+ Server error: Packet manager errorसर्वर त्रुटि: पैकेट प्रबंधक त्रुटि
-
+ SSH request was deniedSSH अनुरोध अस्वीकार कर दिया गया
-
+ SSH request was interruptedSSH अनुरोध बाधित हो गया था
-
+ SSH internal errorSSH आंतरिक त्रुटि
-
+ Invalid private key or invalid passphrase enteredअमान्य निजी कुंजी या अमान्य पासफ़्रेज़ दर्ज किया गया
-
+ The selected private key format is not supported, use openssh ED25519 key types or PEM key typesचयनित निजी कुंजी प्रारूप समर्थित नहीं है, ओपनश ED25519 कुंजी प्रकार या PEM कुंजी प्रकार का उपयोग करें
-
+ Timeout connecting to serverसर्वर से कनेक्ट होने का समय समाप्त
-
+ VPN connection errorVPN कनेक्शन त्रुटि
-
+ Error when retrieving configuration from APIएपीआई से कॉन्फ़िगरेशन पुनर्प्राप्त करते समय त्रुटि
-
+ This config has already been added to the applicationयह कॉन्फ़िगरेशन पहले ही एप्लिकेशन में जोड़ा जा चुका है
-
+
+ In the response from the server, an empty config was received
+
+
+
+
+ SSL error occurred
+
+
+
+
+ Server response timeout on api request
+
+
+
+ ErrorCode: %1. ErrorCode: %1.
-
+ OpenVPN config missingOpenVPN प्रबंधन सर्वर त्रुटि
-
+ SCP error: Generic failureएससीपी त्रुटि: सामान्य विफलता
-
+ OpenVPN management server errorOpenVPN प्रबंधन सर्वर त्रुटि
-
+ OpenVPN executable missingOpenVPN निष्पादन योग्य गायब है
-
+ Shadowsocks (ss-local) executable missingशैडोसॉक्स (एसएस-स्थानीय) निष्पादन योग्य गायब है
-
+ Cloak (ck-client) executable missingक्लोक (सीके-क्लाइंट) निष्पादन योग्य गायब है
-
+ Amnezia helper service errorAmnezia भूलने की बीमारी सहायक सेवा त्रुटि
-
+ OpenSSL failedओपनएसएसएल विफल रहा
-
+ Can't connect: another VPN connection is activeकनेक्ट नहीं हो सकता: कोई अन्य वीपीएन कनेक्शन सक्रिय है
-
+ Can't setup OpenVPN TAP network adapterOpenVPN TAP नेटवर्क एडाप्टर सेटअप नहीं कर सकता
-
+ VPN pool error: no available addressesVPN pool error: لا يوجد عنواين مٌتاحة
-
+ The config does not contain any containers and credentials for connecting to the serverकॉन्फ़िगरेशन में सर्वर से कनेक्ट करने के लिए कोई कंटेनर और क्रेडेंशियल नहीं है
-
+ QFile error: The file could not be openedQफ़ाइल त्रुटि: फ़ाइल खोली नहीं जा सकी
-
+ QFile error: An error occurred when reading from the fileQफ़ाइल त्रुटि: फ़ाइल से पढ़ते समय एक त्रुटि उत्पन्न हुई
-
+ QFile error: The file could not be accessedQफ़ाइल त्रुटि: फ़ाइल तक नहीं पहुंचा जा सका
-
+ QFile error: An unspecified error occurredQफ़ाइल त्रुटि: एक अनिर्दिष्ट त्रुटि उत्पन्न हुई
-
+ QFile error: A fatal error occurredQफ़ाइल त्रुटि: एक घातक त्रुटि उत्पन्न हुई
-
+ QFile error: The operation was abortedQफ़ाइल त्रुटि: ऑपरेशन निरस्त कर दिया गया था
-
+ Internal errorआंतरिक त्रुटि
-
+ IPsec
-
-
+
+ Website in Tor networkटोर नेटवर्क में वेबसाइट
-
+ AmneziaDNSAmneziaDNS
-
+ SFTP file sharing serviceSFTP फ़ाइल साझाकरण सेवा
-
+ OpenVPN is the most popular VPN protocol, with flexible configuration options. It uses its own security protocol with SSL/TLS for key exchange.लचीले कॉन्फ़िगरेशन विकल्पों के साथ ओपनवीपीएन सबसे लोकप्रिय वीपीएन प्रोटोकॉल है। यह कुंजी विनिमय के लिए एसएसएल/टीएलएस के साथ अपने स्वयं के सुरक्षा प्रोटोकॉल का उपयोग करता है.
-
+ Shadowsocks - masks VPN traffic, making it similar to normal web traffic, but it may be recognized by analysis systems in some highly censored regions.शैडोसॉक्स - वीपीएन ट्रैफ़िक को मास्क करता है, जिससे यह सामान्य वेब ट्रैफ़िक के समान हो जाता है, लेकिन इसे कुछ अत्यधिक सेंसर किए गए क्षेत्रों में विश्लेषण प्रणालियों द्वारा पहचाना जा सकता है.
-
+ OpenVPN over Cloak - OpenVPN with VPN masquerading as web traffic and protection against active-probing detection. Ideal for bypassing blocking in regions with the highest levels of censorship.क्लोक पर ओपनवीपीएन - ओपनवीपीएन वीपीएन के साथ वेब ट्रैफिक और सक्रिय-जांच पहचान के खिलाफ सुरक्षा का मुखौटा लगाता है। उच्चतम स्तर की सेंसरशिप वाले क्षेत्रों में अवरोध को दूर करने के लिए आदर्श.
-
+ XRay with REALITY - Suitable for countries with the highest level of internet censorship. Traffic masking as web traffic at the TLS level, and protection against detection by active probing methods.वास्तविकता के साथ एक्सरे - उच्चतम स्तर की इंटरनेट सेंसरशिप वाले देशों के लिए उपयुक्त। टीएलएस स्तर पर ट्रैफ़िक को वेब ट्रैफ़िक के रूप में छिपाया जाता है, और सक्रिय जांच विधियों द्वारा पता लगाने से सुरक्षा प्रदान की जाती है.
-
+
+ IKEv2/IPsec - Modern stable protocol, a bit faster than others, restores connection after signal loss. It has native support on the latest versions of Android and iOS.
+
+
+
+ Create a file vault on your server to securely store and transfer files.फ़ाइलों को सुरक्षित रूप से संग्रहीत और स्थानांतरित करने के लिए अपने सर्वर पर एक फ़ाइल वॉल्ट बनाएं.
-
+ This is a combination of the OpenVPN protocol and the Cloak plugin designed specifically for protecting against blocking.
OpenVPN provides a secure VPN connection by encrypting all internet traffic between the client and the server.
@@ -2947,7 +3082,7 @@ OpenVPN क्लाइंट और सर्वर के बीच सभी
-
+ A relatively new popular VPN protocol with a simplified architecture.
WireGuard provides stable VPN connection and high performance on all devices. It uses hard-coded encryption settings. WireGuard compared to OpenVPN has lower latency and better data transfer throughput.
WireGuard is very susceptible to blocking due to its distinct packet signatures. Unlike some other VPN protocols that employ obfuscation techniques, the consistent signature patterns of WireGuard packets can be more easily identified and thus blocked by advanced Deep Packet Inspection (DPI) systems and other network monitoring tools.
@@ -2968,7 +3103,7 @@ WireGuard is very susceptible to blocking due to its distinct packet signatures.
* यूडीपी नेटवर्क प्रोटोकॉल पर काम करता है।.
-
+ After installation, Amnezia will create a
file storage on your server. You will be able to access it using
@@ -2987,32 +3122,31 @@ For more detailed information, you can
इसे "एसएफटीपी फ़ाइल संग्रहण बनाएं" के अंतर्गत सहायता अनुभाग में ढूंढें
-
+ WireGuard - New popular VPN protocol with high performance, high speed and low power consumption. Recommended for regions with low levels of censorship.वायरगार्ड - उच्च प्रदर्शन, उच्च गति और कम बिजली की खपत के साथ नया लोकप्रिय वीपीएन प्रोटोकॉल। सेंसरशिप के निम्न स्तर वाले क्षेत्रों के लिए अनुशंसित.
-
+ AmneziaWG - Special protocol from Amnezia, based on WireGuard. It's fast like WireGuard, but very resistant to blockages. Recommended for regions with high levels of censorship.AmneziaWG - वायरगार्ड पर आधारित Amnezia का विशेष प्रोटोकॉल। यह वायरगार्ड की तरह तेज़ है, लेकिन रुकावटों के प्रति बहुत प्रतिरोधी है। उच्च स्तर की सेंसरशिप वाले क्षेत्रों के लिए अनुशंसित.
- IKEv2/IPsec - Modern stable protocol, a bit faster than others, restores connection after signal loss.
- IKEv2/IPsec - आधुनिक स्थिर प्रोटोकॉल, दूसरों की तुलना में थोड़ा तेज़, सिग्नल हानि के बाद कनेक्शन पुनर्स्थापित करता है।
+ IKEv2/IPsec - आधुनिक स्थिर प्रोटोकॉल, दूसरों की तुलना में थोड़ा तेज़, सिग्नल हानि के बाद कनेक्शन पुनर्स्थापित करता है।
-
+ Deploy a WordPress site on the Tor network in two clicks.दो क्लिक में टोर नेटवर्क पर एक वर्डप्रेस साइट तैनात करें।.
-
+ Replace the current DNS server with your own. This will increase your privacy level.वर्तमान DNS सर्वर को अपने स्वयं के DNS सर्वर से बदलें। इससे आपकी गोपनीयता का स्तर बढ़ जाएगा.
-
+ OpenVPN stands as one of the most popular and time-tested VPN protocols available.
It employs its unique security protocol, leveraging the strength of SSL/TLS for encryption and key exchange. Furthermore, OpenVPN's support for a multitude of authentication methods makes it versatile and adaptable, catering to a wide range of devices and operating systems. Due to its open-source nature, OpenVPN benefits from extensive scrutiny by the global community, which continually reinforces its security. With a strong balance of performance, security, and compatibility, OpenVPN remains a top choice for privacy-conscious individuals and businesses alike.
@@ -3031,7 +3165,7 @@ It employs its unique security protocol, leveraging the strength of SSL/TLS for
* टीसीपी और यूडीपी दोनों नेटवर्क प्रोटोकॉल पर काम कर सकता है।.
-
+ Shadowsocks, inspired by the SOCKS5 protocol, safeguards the connection using the AEAD cipher. Although Shadowsocks is designed to be discreet and challenging to identify, it isn't identical to a standard HTTPS connection.However, certain traffic analysis systems might still detect a Shadowsocks connection. Due to limited support in Amnezia, it's recommended to use AmneziaWG protocol.
* Available in the AmneziaVPN only on desktop platforms
@@ -3046,7 +3180,7 @@ It employs its unique security protocol, leveraging the strength of SSL/TLS for
* टीसीपी नेटवर्क प्रोटोकॉल पर काम करता है।.
-
+ A modern iteration of the popular VPN protocol, AmneziaWG builds upon the foundation set by WireGuard, retaining its simplified architecture and high-performance capabilities across devices.
While WireGuard is known for its efficiency, it had issues with being easily detected due to its distinct packet signatures. AmneziaWG solves this problem by using better obfuscation methods, making its traffic blend in with regular internet traffic.
This means that AmneziaWG keeps the fast performance of the original while adding an extra layer of stealth, making it a great choice for those wanting a fast and discreet VPN connection.
@@ -3067,7 +3201,7 @@ This means that AmneziaWG keeps the fast performance of the original while addin
* यूडीपी नेटवर्क प्रोटोकॉल पर काम करता है।.
-
+ The REALITY protocol, a pioneering development by the creators of XRay, is specifically designed to counteract the highest levels of internet censorship through its novel approach to evasion.
It uniquely identifies censors during the TLS handshake phase, seamlessly operating as a proxy for legitimate clients while diverting censors to genuine websites like google.com, thus presenting an authentic TLS certificate and data.
This advanced capability differentiates REALITY from similar technologies by its ability to disguise web traffic as coming from random, legitimate sites without the need for specific configurations.
@@ -3078,7 +3212,7 @@ Unlike older protocols such as VMess, VLESS, and the XTLS-Vision transport, REAL
VMess, VLESS और XTLS-Vision ट्रांसपोर्ट जैसे पुराने प्रोटोकॉल के विपरीत, TLS हैंडशेक पर REALITY की अभिनव "दोस्त या दुश्मन" पहचान सुरक्षा को बढ़ाती है और सक्रिय जांच तकनीकों को नियोजित करने वाले परिष्कृत DPI सिस्टम द्वारा पहचान को रोकती है। यह REALITY को कठोर सेंसरशिप वाले वातावरण में इंटरनेट की स्वतंत्रता बनाए रखने के लिए एक मजबूत समाधान बनाता है.
-
+ IKEv2, paired with the IPSec encryption layer, stands as a modern and stable VPN protocol.
One of its distinguishing features is its ability to swiftly switch between networks and devices, making it particularly adaptive in dynamic network environments.
While it offers a blend of security, stability, and speed, it's essential to note that IKEv2 can be easily detected and is susceptible to blocking.
@@ -3099,7 +3233,7 @@ While it offers a blend of security, stability, and speed, it's essential t
* यूडीपी नेटवर्क प्रोटोकॉल, पोर्ट 500 और 4500 पर काम करता है.
-
+ DNS ServiceDNS सेवाएँ
@@ -3153,16 +3287,142 @@ While it offers a blend of security, stability, and speed, it's essential t
No matchकोई मुकाबला नहीं
-
-
- Unknown error
- अज्ञात त्रुटि
- error 0x%1: %2त्रुटि 0x%1: %2
+
+
+ vmess:// url is invalid
+
+
+
+
+ Invalid streamSettings protocol:
+
+
+
+
+ Unknown transport method:
+
+
+
+
+ VMess string should start with 'vmess://'
+
+
+
+
+ VMess string should be a valid base64 string
+
+
+
+
+ JSON should not be empty
+
+
+
+
+ VLESS link should start with vless://
+
+
+
+
+ link parse failed: %1
+
+
+
+
+ empty host
+
+
+
+
+ missing port
+
+
+
+
+ missing uuid
+
+
+
+
+ Invalid ssd link: json: field %1 must exist
+
+
+
+
+ Invalid ssd link: json: field %1 must be valid port number
+
+
+
+
+ Invalid ssd link: json: field %1 must be of type 'string'
+
+
+
+
+ Invalid ssd link: json: field %1 must be an array
+
+
+
+
+ Skipping invalid ssd server: server must be an object
+
+
+
+
+ Skipping invalid ssd server: missing required field %1
+
+
+
+
+ Skipping invalid ssd server: field %1 should be of type 'string'
+
+
+
+
+ Invalid ssd link: should begin with ssd://
+
+
+
+
+ Invalid ssd link: base64 parse failed
+
+
+
+
+ Invalid ssd link: json parse failed
+
+
+
+
+ Invalid ssd link: rc4-md5 encryption is not supported by v2ray-core
+
+
+
+
+ SS URI is too short
+
+
+
+
+
+ Can't find the colon separator between method and password
+
+
+
+
+ Can't find the at separator between password and hostname
+
+
+
+
+ Can't find the colon separator between hostname and port
+
+ SelectLanguageDrawer
@@ -3189,12 +3449,12 @@ While it offers a blend of security, stability, and speed, it's essential t
SettingsController
-
+ Backup file is corruptedबैकअप फ़ाइल दूषित है
-
+ All settings have been reset to default valuesसभी सेटिंग्स को डिफ़ॉल्ट मानों पर रीसेट कर दिया गया है
@@ -3326,7 +3586,7 @@ While it offers a blend of security, stability, and speed, it's essential t
VpnConnection
-
+ Mbps
@@ -3334,42 +3594,42 @@ While it offers a blend of security, stability, and speed, it's essential t
VpnProtocol
-
+ Unknownअज्ञात
-
+ Disconnectedاडिस्कनेक्ट किया गया
-
+ Preparingतैयार कर रहे हैं
-
+ Connecting...कनेक्ट...
-
+ Connectedजुड़ा हुआ
-
+ Disconnecting...कनेक्ट...
-
+ Reconnecting...कनेक्ट...
-
+ Errorगलती
@@ -3377,34 +3637,36 @@ While it offers a blend of security, stability, and speed, it's essential t
amnezia::ContainerProps
-
+ Lowकम
- Medium or High
- मध्यम या उच्च
+ मध्यम या उच्च
- Extreme
- चरम
+ चरम
-
+
+ High
+
+
+
+ I just want to increase the level of my privacy.मैं बस अपनी गोपनीयता का स्तर बढ़ाना चाहता हूं.
-
+ I want to bypass censorship. This option recommended in most cases.मैं सेंसरशिप को दरकिनार करना चाहता हूं। अधिकांश मामलों में इस विकल्प की अनुशंसा की जाती है.
- Most VPN protocols are blocked. Recommended if other options are not working.
- अधिकांश वीपीएन प्रोटोकॉल अवरुद्ध हैं। यदि अन्य विकल्प काम नहीं कर रहे हों तो अनुशंसित.
+ अधिकांश वीपीएन प्रोटोकॉल अवरुद्ध हैं। यदि अन्य विकल्प काम नहीं कर रहे हों तो अनुशंसित.
diff --git a/client/translations/amneziavpn_my_MM.ts b/client/translations/amneziavpn_my_MM.ts
index 25970722..b2c98dfd 100644
--- a/client/translations/amneziavpn_my_MM.ts
+++ b/client/translations/amneziavpn_my_MM.ts
@@ -1,50 +1,96 @@
+
+ AppSplitTunnelingController
+
+
+ Application added: %1
+
+
+
+
+ The application has already been added
+
+
+
+
+ The selected applications have been added
+
+
+
+
+ Application removed: %1
+
+
+
+
+ ConnectButton
+
+
+ Unable to disconnect during configuration preparation
+
+
+ConnectionController
-
+ VPN Protocols is not installed.
Please install VPN container at firstVPN ပရိုတိုကောများကို မထည့်သွင်းရသေးပါ။
ကျေးဇူးပြု၍ VPN ကွန်တိန်နာကို အရင်ထည့်သွင်းပါ။
-
+ Connecting...ချိတ်ဆက်နေပါပြီ...
-
+ Connectedချိတ်ဆက်ပြီးသွားပါပြီ
-
+
+ Preparing...
+
+
+
+ Settings updated successfully, reconnnection...ဆက်တင်များကို အောင်မြင်စွာ အပ်ဒိတ်လုပ်ပြီးပါပြီ၊ ပြန်လည်ချိတ်ဆက်နေပါသည်...
-
+ Settings updated successfullyဆက်တင်များကို အောင်မြင်စွာ အပ်ဒိတ်လုပ်ပြီးပါပြီ။
-
+
+ The selected protocol is not supported on the current platform
+ ရွေးချယ်ထားသော ပရိုတိုကောကို လက်ရှိပလက်ဖောင်းပေါ်တွင် အထောက်အပံ့မပေးထားပါ။
+
+
+
+ unable to create configuration
+
+
+
+ Reconnecting...ပြန်လည်ချိတ်ဆက်နေပါသည်...
-
-
-
-
+
+
+
+ Connectချိတ်ဆက်မည်
-
+ Disconnecting...အဆက်အသွယ်ဖြတ်နေပါသည်...
@@ -52,17 +98,17 @@
ConnectionTypeSelectionDrawer
-
+ Add new connectionချိတ်ဆက်မှုအသစ်ထည့်သွင်းပါ။
-
+ Configure your serverသင်၏ဆာဗာကို စီစဉ်ချိန်ညှိပါ။
-
+ Open config file, key or QR codeconfig ဖိုင်၊ key သို့မဟုတ် QR ကုဒ်ကို ဖွင့်ပါ။
@@ -93,7 +139,7 @@
ExportController
-
+ Access error!အသုံးပြုခွင့်တွင်အမှားပါနေပါသည်!
@@ -101,57 +147,58 @@
HomeContainersListView
-
+ Unable change protocol while there is an active connectionလက်ရှိချိတ်ဆက်မှုတစ်ခုရှိနေချိန်တွင် ပရိုတိုကောကို ပြောင်းလဲ၍မရပါ။
- The selected protocol is not supported on the current platform
- ရွေးချယ်ထားသော ပရိုတိုကောကို လက်ရှိပလက်ဖောင်းပေါ်တွင် အထောက်အပံ့မပေးထားပါ။
+ ရွေးချယ်ထားသော ပရိုတိုကောကို လက်ရှိပလက်ဖောင်းပေါ်တွင် အထောက်အပံ့မပေးထားပါ။HomeSplitTunnelingDrawer
-
+ Split tunnelingSplit tunneling
-
+ Allows you to connect to some sites or applications through a VPN connection and bypass othersVPN ချိတ်ဆက်မှုကြားခံ၍ အချို့သောဆိုက်များ သို့မဟုတ် အပလီကေးရှင်းများသို့ ချိတ်ဆက်ဖို့ရန်နှင့် အခြားအရာများကို ကျော်ဖြတ်ရန် လုပ်ဆောင်ပေးသည်။
-
+ Split tunneling on the serverဆာဗာပေါ်တွင် split tunneling အသုံးပြုထားပါသည်။
-
+ Enabled
Can't be disabled for current serverဖွင့်ထားပါသည်။
လက်ရှိဆာဗာအတွက် ပိတ်၍မရပါ။
-
+ Site-based split tunnelingဝက်ဆိုဒ်အခြေပြု split tunneling
-
+
+ Enabledဖွင့်ထားပါသည်။
-
+
+ Disabledပိတ်ထားပါသည်။
-
+ App-based split tunnelingApp အခြေပြု split tunneling
@@ -159,86 +206,112 @@ Can't be disabled for current server
ImportController
-
+ Unable to open file
-
-
+
+ Invalid configuration file
-
+ Scanned %1 of %2.%2 ၏ %1 ကို စကင်န်ဖတ်ထားသည်.
+
+
+ In the imported configuration, potentially dangerous lines were found:
+
+ InstallController
-
-
+ %1 installed successfully. %1 ကို အောင်မြင်စွာ ထည့်သွင်းပြီးပါပြီ.
-
-
+ %1 is already installed on the server. %1 ကို ဆာဗာတွင် ထည့်သွင်းပြီးဖြစ်သည်.
-
+
Added containers that were already installed on the server
ဆာဗာတွင် ထည့်သွင်းပြီးသား ကွန်တိန်နာများကို ပေါင်းထည့်ပြီးပါပြီ။
-
+
Already installed containers were found on the server. All installed containers have been added to the application
ထည့်သွင်းပြီးသား ကွန်တိန်နာများကို ဆာဗာပေါ်တွင် တွေ့ရှိခဲ့သည်။ ထည့်သွင်းထားသည့် ကွန်တိန်နာအားလုံးကို အပလီကေးရှင်းထဲသို့ ပေါင်းထည့်ပြီးပါပြီ။
-
+ Settings updated successfullyဆက်တင်များကို အောင်မြင်စွာ အပ်ဒိတ်လုပ်ပြီးပါပြီ။
-
+ Server '%1' was rebootedဆာဗာ '%1' ကို ပြန်လည်စတင်ခဲ့သည်။
-
+ Server '%1' was removedဆာဗာ '%1' ကို ဖယ်ရှားခဲ့သည်။
-
+ All containers from server '%1' have been removedဆာဗာ '%1' မှ ကွန်တိန်နာအားလုံးကို ဖယ်ရှားလိုက်ပါပြီ။
-
+ %1 has been removed from the server '%2'%1 ကို ဆာဗာ '%2' မှ ဖယ်ရှားလိုက်ပါပြီ
-
+
+ %1 cached profile cleared
+
+
+
+ Please login as the userအသုံးပြုသူအဖြစ် log in ဝင်ရောက်ပါ။
-
+ Server added successfullyဆာဗာကို အောင်မြင်စွာ ထည့်သွင်းပြီးပါပြီ။
+
+ InstalledAppsDrawer
+
+
+ Choose application
+
+
+
+
+ application name
+
+
+
+
+ Add selected
+
+
+KeyChainClass
@@ -260,28 +333,28 @@ Already installed containers were found on the server. All installed containers
NotificationHandler
-
-
+
+ AmneziaVPNAmneziaVPN
-
+ VPN ConnectedVPN ချိတ်ဆက်ထားပါပြီ
-
+ VPN DisconnectedVPN ဖြုတ်လိုက်ပါပြီ
-
+ AmneziaVPN notificationAmneziaVPN နိုတီ
-
+ Unsecured network detected: လုံခြုံမှုမရှိသောကွန်ရက်မှန်း ထောက်လှန်းမိသည်:
@@ -302,32 +375,32 @@ Already installed containers were found on the server. All installed containers
PageHome
-
+ Logging enabled
-
+ Split tunneling enabledsplit tunnelling ဖွင့်ထားပါသည်။
-
+ Split tunneling disabledsplit tunnelling ပိတ်ထားပါသည်။
-
+ VPN protocolVPN ပရိုတိုကော
-
+ Serversဆာဗာများ
-
+ Unable change server while there is an active connectionလက်ရှိချိတ်ဆက်မှုတစ်ခုရှိနေချိန်တွင် ဆာဗာကို ပြောင်းလဲ၍မရပါ။
@@ -335,280 +408,295 @@ Already installed containers were found on the server. All installed containers
PageProtocolAwgSettings
-
+ AmneziaWG settingsAmneziaWG ဆက်တင်များ
-
+ PortPort
-
+ MTU
- Remove AmneziaWG
- AmneziaWG ကို ဖယ်ရှားမည်။
+ AmneziaWG ကို ဖယ်ရှားမည်။
- Remove AmneziaWG from server?
- AmneziaWG ကို ဆာဗာမှ ဖယ်ရှားမည်လား?
+ AmneziaWG ကို ဆာဗာမှ ဖယ်ရှားမည်လား?
-
-
+ All users with whom you shared a connection with will no longer be able to connect to it.သင့်တွင် သင့်ကိုမည်သည့် ချိတ်ဆက်ထားသော အသုံးပြုသူများသည် အကြောင်းအရာသို့ ဆက်သွယ်ရန် မရနိုင်ပါ။
-
+ Saveသိမ်းဆည်းမည်
-
+
+ The values of the H1-H4 fields must be unique
+
+
+
+
+ The value of the field S1 + message initiation size (148) must not equal S2 + message response size (92)
+
+
+
+ Save settings?သိမ်းဆည်းမည်လား။
-
-
+ Continueဆက်လက်လုပ်ဆောင်မည်
-
-
+ Cancelပယ်ဖျက်မည်
+
+
+ Unable change settings while there is an active connection
+
+ PageProtocolCloakSettings
-
+ Cloak settingsဖုံးကွယ်အသွင်ယူမှု ဆက်တင်များ
-
+ Disguised as traffic fromtraffic အဖြစ် အသွင်ယူထားသည်
-
+ PortPort
-
-
+
+ Cipherစာဝှက်
-
+ Saveသိမ်းဆည်းမည်
+
+
+ Unable change settings while there is an active connection
+
+ PageProtocolOpenVpnSettings
-
+ OpenVPN settingsOpenVPN ဆက်တင်များ
-
+ VPN address subnetVPN လိပ်စာ ကွန်ရက်ခွဲ
-
+ Network protocolကွန်ယက် ပရိုတိုကော
-
+ PortPort
-
+ Auto-negotiate encryptionအလိုအလျောက် ညှိနှိုင်း ကုဒ်ဝှက်ခြင်း
-
-
+
+ HashHash
-
+ SHA512SHA512
-
+ SHA384SHA384
-
+ SHA256SHA256
-
+ SHA3-512SHA3-512
-
+ SHA3-384SHA3-384
-
+ SHA3-256SHA3-256
-
+ whirlpoolwhirlpool
-
+ BLAKE2b512BLAKE2b512
-
+ BLAKE2s256BLAKE2s256
-
+ SHA1SHA1
-
-
+
+ Cipherစာဝှက်
-
+ AES-256-GCMAES-256-GCM
-
+ AES-192-GCMAES-192-GCM
-
+ AES-128-GCMAES-128-GCM
-
+ AES-256-CBCAES-256-CBC
-
+ AES-192-CBCAES-192-CBC
-
+ AES-128-CBCAES-128-CBC
-
+ ChaCha20-Poly1305ChaCha20-Poly1305
-
+ ARIA-256-CBCARIA-256-CBC
-
+ CAMELLIA-256-CBCCAMELLIA-256-CBC
-
+ nonenone
-
+ TLS authTLS auth
-
+ Block DNS requests outside of VPNVPN ပြင်ပရှိ DNS တောင်းဆိုမှုများကို ပိတ်ပင်မည်။
-
+ Additional client configuration commandsထပ်တိုး client ဖွဲ့စည်းမှုဆိုင်ရာ ညွှန်ကြားချက်များ
-
-
+
+ Commands:အမိန့်ပေးခိုင်းစေချက်များ:
-
+ Additional server configuration commandsထပ်တိုး ဆာဗာ ဖွဲ့စည်းမှုဆိုင်ရာ ညွှန်ကြားချက်များ
-
+
+ Unable change settings while there is an active connection
+
+
+ Remove OpenVPN
- AmneziaWG ကို ဖယ်ရှားမည်။
+ AmneziaWG ကို ဖယ်ရှားမည်။
- Remove OpenVPN from server?
- AmneziaWG ကို ဆာဗာမှ ဖယ်ရှားမည်လား?
+ AmneziaWG ကို ဆာဗာမှ ဖယ်ရှားမည်လား?
- All users with whom you shared a connection with will no longer be able to connect to it.
- သင့်တွင် သင့်ကိုမည်သည့် ချိတ်ဆက်ထားသော အသုံးပြုသူများသည် အကြောင်းအရာသို့ ဆက်သွယ်ရန် မရနိုင်ပါ။
+ သင့်တွင် သင့်ကိုမည်သည့် ချိတ်ဆက်ထားသော အသုံးပြုသူများသည် အကြောင်းအရာသို့ ဆက်သွယ်ရန် မရနိုင်ပါ။
- Continue
- ဆက်လက်လုပ်ဆောင်မည်
+ ဆက်လက်လုပ်ဆောင်မည်
- Cancel
- ပယ်ဖျက်မည်
+ ပယ်ဖျက်မည်
-
+ Saveသိမ်းဆည်းမည်
@@ -616,32 +704,32 @@ Already installed containers were found on the server. All installed containers
PageProtocolRaw
-
+ settings ဆက်တင်များ
-
+ Show connection optionsချိတ်ဆက်မှုရွေးချယ်စရာများကို ပြပါ။
-
+ Connection options %1ချိတ်ဆက်မှုရွေးချယ်စရာများ %1
-
+ Remove ဖယ်ရှားမည်
-
+ Remove %1 from server?%1 ကို ဆာဗာမှ ဖယ်ရှားမည်လား?
-
+ All users with whom you shared a connection with will no longer be able to connect to it.သင့်တွင် သင့်ကိုမည်သည့် ချိတ်ဆက်ထားသော အသုံးပြုသူများသည် အကြောင်းအရာသို့ ဆက်သွယ်ရန် မရနိုင်ပါ။
@@ -650,12 +738,12 @@ Already installed containers were found on the server. All installed containers
Все пользователи, с которыми вы поделились этим VPN-протоколом, больше не смогут к нему подключаться.
-
+ Continueဆက်လက်လုပ်ဆောင်မည်
-
+ Cancelပယ်ဖျက်မည်
@@ -663,75 +751,91 @@ Already installed containers were found on the server. All installed containers
PageProtocolShadowSocksSettings
-
+ Shadowsocks settingsShadowsocks ဆက်တင်များ
-
+ PortPort
-
-
+
+ Cipherစာဝှက်
-
+ Saveသိမ်းဆည်းမည်
+
+
+ Unable change settings while there is an active connection
+
+ PageProtocolWireGuardSettings
-
+ WG settings
-
+ PortPort
-
+ MTU
-
- Remove WG
+
+ Unable change settings while there is an active connection
-
- Remove WG from server?
-
-
-
- All users with whom you shared a connection will no longer be able to connect to it.
- သင်နှင့်အတူချိတ်ဆက်မှုတစ်ခုကို မျှဝေထားသည့် အသုံးပြုသူအားလုံး ဤချိတ်ဆက်မှုကိုချိတ်ဆက်နိုင်တော့မည်မဟုတ်ပါ.
+ သင်နှင့်အတူချိတ်ဆက်မှုတစ်ခုကို မျှဝေထားသည့် အသုံးပြုသူအားလုံး ဤချိတ်ဆက်မှုကိုချိတ်ဆက်နိုင်တော့မည်မဟုတ်ပါ.
-
- Continue
-
-
-
- Cancel
- ပယ်ဖျက်မည်
+ ပယ်ဖျက်မည်
-
+ Saveသိမ်းဆည်းမည်
+
+ PageProtocolXraySettings
+
+
+ XRay settings
+
+
+
+
+ Disguised as traffic from
+ traffic အဖြစ် အသွင်ယူထားသည်
+
+
+
+ Save
+ သိမ်းဆည်းမည်
+
+
+
+ Unable change settings while there is an active connection
+
+
+PageServerContainers
@@ -742,180 +846,255 @@ Already installed containers were found on the server. All installed containers
PageServiceDnsSettings
-
+ A DNS service is installed on your server, and it is only accessible via VPN.
DNS ဝန်ဆောင်မှုကို သင့်ဆာဗာတွင် ထည့်သွင်းထားပြီးဖြစ်ပြီး ၎င်းကို VPN မှတစ်ဆင့်သာ အသုံးပြုနိုင်သည်.
-
+ The DNS address is the same as the address of your server. You can configure DNS in the settings, under the connections tab.DNS လိပ်စာသည် သင့်ဆာဗာလိပ်စာနှင့် အတူတူပင်ဖြစ်ပါသည်။ ချိတ်ဆက်မှုတက်ဘ်အောက်ရှိ ဆက်တင်များတွင် DNS ကို ပြင်ဆင်ချိန်ညှိနိုင်ပါသည်.
-
+ Remove ဖယ်ရှားမည်
-
+ Remove %1 from server?%1 ကို ဆာဗာမှ ဖယ်ရှားမည်လား?
-
+ Continueဆက်လက်လုပ်ဆောင်မည်
-
+ Cancelပယ်ဖျက်မည်
+
+
+ Cannot remove Amnezia DNS from running server
+
+ PageServiceSftpSettings
-
+ Settings updated successfullyဆက်တင်များကို အောင်မြင်စွာ အပ်ဒိတ်လုပ်ပြီးပါပြီ။
-
+ SFTP settingsSFTP ဆက်တင်များ
-
+ HostHost
-
-
-
-
+
+
+
+ Copiedကူးယူပြီးပါပြီ
-
+ PortPort
-
+ User nameအသုံးပြုသူနာမည်
-
+ Passwordစကားဝှက်
-
+ Mount folder on deviceဖိုင်တွဲကို စက်တွင် တပ်ဆင်မည်။
-
+ In order to mount remote SFTP folder as local drive, perform following steps: <br>အဝေးမှ SFTP ဖိုင်တွဲကို စက်တွင်း drive အဖြစ် တပ်ဆင်ရန်အတွက် အောက်ပါအဆင့်များကို လုပ်ဆောင်ပါ: <br>
-
-
+
+ <br>1. Install the latest version of <br>၁။ နောက်ဆုံးထွက်ဗားရှင်းကို ထည့်သွင်းမည်
-
-
+
+ <br>2. Install the latest version of <br>၂။ နောက်ဆုံးထွက်ဗားရှင်းကို ထည့်သွင်းမည်
-
+ Detailed instructionsအသေးစိတ်ညွှန်ကြားချက်များ
-
+ Remove SFTP and all data stored thereSFTP ဖယ်ရှားပါ
-
+ Remove SFTP and all data stored there?SFTP နှင့် ထိုနေရာတွင် သိမ်းဆည်းထားသည့် ဒေတာအားလုံးကို ဖယ်ရှားမည်လား?
-
+ Continueဆက်လက်လုပ်ဆောင်မည်
-
+ Cancelပယ်ဖျက်မည်
+
+ PageServiceSocksProxySettings
+
+
+ Settings updated successfully
+ ဆက်တင်များကို အောင်မြင်စွာ အပ်ဒိတ်လုပ်ပြီးပါပြီ။
+
+
+
+
+ SOCKS5 settings
+
+
+
+
+ Host
+ Host
+
+
+
+
+
+
+ Copied
+ ကူးယူပြီးပါပြီ
+
+
+
+
+ Port
+ Port
+
+
+
+ User name
+ အသုံးပြုသူနာမည်
+
+
+
+
+ Password
+ စကားဝှက်
+
+
+
+ Username
+
+
+
+
+
+ Change connection settings
+
+
+
+
+ The port must be in the range of 1 to 65535
+
+
+
+
+ Password cannot be empty
+
+
+
+
+ Username cannot be empty
+
+
+PageServiceTorWebsiteSettings
-
+ Settings updated successfullyဆက်တင်များကို အောင်မြင်စွာ အပ်ဒိတ်လုပ်ပြီးပါပြီ။
-
+ Tor website settingsTor ဝဘ်ဆိုက်ဆက်တင်များ
-
+ Website addressဝဘ်ဆိုဒ်လိပ်စာ
-
+ Copiedကူးယူပြီးပါပြီ
-
+ Use <a href="https://www.torproject.org/download/" style="color: #FBB26A;">Tor Browser</a> to open this URL.ဤ URL ကိုဖွင့်ရန် <a href="https://www.torproject.org/download/" style="color: #FBB26A;">Tor Browser</a> ကို အသုံးပြုပါ.
-
+ After creating your onion site, it takes a few minutes for the Tor network to make it available for use.သင်၏ onion ဆိုက်ကို ဖန်တီးပြီးနောက်၊ Tor ကွန်ရက်က ၄င်းကိုအသုံးပြုနိုင်အောင်ပြုလုပ်ပေးရန် မိနစ်အနည်းငယ်အချိန်ယူသည်.
-
+ When configuring WordPress set the this onion address as domain.WordPress ကို ချိန်ညှိသည့်အခါ ဤ onion လိပ်စာကို domain အဖြစ် သတ်မှတ်ပါ.
-
+ Remove websiteဝဘ်ဆိုက်ကိုဖယ်ရှားမည်
-
+ The site with all data will be removed from the tor network.ဒေတာအားလုံးပါသည့် ဆိုက်ကို tor ကွန်ရက်မှ ဖယ်ရှားပါမည်.
-
+ Continueဆက်လက်လုပ်ဆောင်မည်
-
+ Cancelပယ်ဖျက်မည်
@@ -923,37 +1102,37 @@ Already installed containers were found on the server. All installed containers
PageSettings
-
+ Settingsဆက်တင်များ
-
+ Serversဆာဗာများ
-
+ Connectionချိတ်ဆက်မှု
-
+ Applicationအပလီကေးရှင်း
-
+ Backupbackup ယူမည်
-
+ About AmneziaVPNAmneziaVPN အကြောင်း
-
+ Close applicationအပလီကေးရှင်းကို ပိတ်မည်
@@ -961,287 +1140,380 @@ Already installed containers were found on the server. All installed containers
PageSettingsAbout
-
+ Support AmneziaAmnezia ကိုကူညီပံ့ပိုးမည်
-
+ Amnezia is a free and open-source application. You can support the developers if you like it.Amnezia သည် အခမဲ့ဖြစ်ပြီး open-source application တစ်ခုဖြစ်သည်။ သင်နှစ်သက်ပါက developer များကို ပံ့ပိုးနိုင်ပါသည်။
-
+ Contactsဆက်သွယ်ရန်လိပ်စာများ
-
+ Telegram groupTelegram ဂရု
-
+ To discuss featuresfeature များကိုဆွေးနွေးရန်
-
+ https://t.me/amnezia_vpn_enhttps://t.me/amnezia_vpn
-
+ Mailမေးလ်
-
+ For reviews and bug reportsသုံးသပ်ချက်များနှင့် ချွတ်ယွင်းချက်အစီရင်ခံစာများအတွက်
-
+ GitHubGitHub
-
+ https://github.com/amnezia-vpn/amnezia-clienthttps://github.com/amnezia-vpn/amnezia-client
-
+ Websiteဝဘ်ဆိုက်
-
+ https://amnezia.orghttps://amnezia.org
-
+ Software version: %1ဆော့ဖ်ဝဲဗားရှင်း: %1
-
+ Check for updatesအပ်ဒိတ်များရှိမရှိ စစ်ဆေးမည်
-
+ Privacy Policyကိုယ်ရေးအချက်အလက်မူဝါဒ
+
+ PageSettingsAppSplitTunneling
+
+
+ Cannot change split tunneling settings during active connection
+ လက်ရှိချိတ်ဆက်မှုတစ်ခုရှိနေချိန်တွင် split tunneling ဆက်တင်များကို ပြောင်းလဲ၍မရပါ
+
+
+
+ Only the apps from the list should have access via VPN
+
+
+
+
+ Apps from the list should not have access via VPN
+
+
+
+
+ App split tunneling
+
+
+
+
+ Mode
+ Mode
+
+
+
+ Remove
+ ဖယ်ရှားမည်
+
+
+
+ Continue
+
+
+
+
+ Cancel
+ ပယ်ဖျက်မည်
+
+
+
+ application name
+
+
+
+
+ Open executable file
+
+
+
+
+ Executable file (*.*)
+
+
+PageSettingsApplication
-
+ Applicationအပလီကေးရှင်း
-
+ Allow application screenshotsအပလီကေးရှင်းကို screenshot ရိုက်ရန်ခွင့်ပြုမည်
-
+
+ Enable notifications
+
+
+
+
+ Enable notifications to show the VPN state in the status bar
+
+
+
+ Auto startအလိုအလျှောက်စတင်မည်
-
+ Launch the application every time the device is startsစက်စတင်ချိန်တိုင်း အပလီကေးရှင်းကို စတင်မည်
-
+ Auto connectအလိုအလျှောက်ချိတ်ဆက်မည်
-
+ Connect to VPN on app startအက်ပ်စတင်ချိန်တွင် VPN သို့ ချိတ်ဆက်မည်
-
+ Start minimizedအက်ပ်စတင်သည့်အခါ minimized ထားပြီးစတင်မည်
-
+ Launch application minimizedအက်ပ်စတင်သည့်အခါ minimized ထားပြီးစတင်မည်
-
+ Languageဘာသာစကား
-
+ Loggingလော့ဂ်အင်
-
+ Enabledဖွင့်ထားပါသည်
-
+ Disabledပိတ်ထားပါသည်
-
+ Reset settings and remove all data from the applicationဆက်တင်များနဂိုတိုင်းထားပြီး အပလီကေးရှင်းမှဒေတာအားလုံးဖယ်ရှားမည်
-
+ Reset settings and remove all data from the application?ဆက်တင်များကို ပြန်လည်သတ်မှတ်ပြီး အပလီကေးရှင်းမှ ဒေတာအားလုံးကို ဖယ်ရှားမည်လား?
-
+ All settings will be reset to default. All installed AmneziaVPN services will still remain on the server.ဆက်တင်အားလုံးကို မူရင်းအတိုင်း ပြန်လည်သတ်မှတ်ပါမည်. ထည့်သွင်းထားသော AmneziaVPN ဝန်ဆောင်မှုများအားလုံးသည် ဆာဗာပေါ်တွင် ဆက်လက်ရှိနေမည်ဖြစ်သည်.
-
+ Continueဆက်လက်လုပ်ဆောင်မည်
-
+ Cancelပယ်ဖျက်မည်
+
+
+ Cannot reset settings during active connection
+
+ PageSettingsBackup
-
+ Settings restored from backup fileဆက်တင်များကို အရန်ဖိုင်မှ ပြန်လည်ရယူပြီးပါပြီ
-
+ Back up your configurationသင်၏ဖွဲ့စည်းပုံကို အရန်သိမ်းပါ။
-
+ You can save your settings to a backup file to restore them the next time you install the application.သင်၏ဆက်တင်များကို အရန်ဖိုင်တွင် သိမ်းဆည်းထားခြင်းဖြင့် အပလီကေးရှင်းကို နောက်တစ်ကြိမ်ထည့်သွင်းသည့်အခါ ၎င်းဆက်တင်များကို ပြန်လည်ရယူနိုင်သည်.
-
+ The backup will contain your passwords and private keys for all servers added to AmneziaVPN. Keep this information in a secure place.မိတ္တူတွင် AmneziaVPN သို့ ထည့်ထားသော ဆာဗာအားလုံးအတွက် သင့်စကားဝှက်များနှင့် လျှို့ဝှက်သော့များ ပါဝင်ပါမည်။ ဤအချက်အလက်ကို လုံခြုံသောနေရာတွင် ထားပါ။
-
+ Make a backupအရန်ဖိုင်တစ်ခု ပြုလုပ်မည်
-
+ Save backup fileအရန်ဖိုင်ကို သိမ်းဆည်းမည်
-
-
+
+ Backup files (*.backup)ဖိုင်များကိုအရန်သိမ်းဆည်းမည် (*.backup)
-
+ Backup file savedဖိုင်များကိုအရန်သိမ်းဆည်းပြီးပါပြီ
-
+ Restore from backupအရန်သိမ်းထားသည့်ဖိုင်မှ ပြန်လည်ရယူမည်
-
+ Open backup fileအရန်သိမ်းထားသည့်ဖိုင်ကို ဖွင့်မည်
-
+ Import settings from a backup file?ဆက်တင်များကို အရန်ဖိုင်တစ်ခုမှ ပြန်လည်တင်သွင်းမည်လား?
-
+ All current settings will be resetလက်ရှိဆက်တင်များအားလုံးကို ပြန်လည်သတ်မှတ်ပါမည်
-
+ Continueဆက်လက်လုပ်ဆောင်မည်
-
+ Cancelပယ်ဖျက်မည်
+
+
+ Cannot restore backup settings during active connection
+
+ PageSettingsConnection
-
+ Connectionချိတ်ဆက်မှု
-
+ Use AmneziaDNSAmneziaDNS ကို အသုံးပြုမည်
-
+ If AmneziaDNS is installed on the serverအကယ်၍ AmneziaDNS ကို ဆာဗာတွင် ထည့်သွင်းထားလျှင်
-
+ DNS serversDNS ဆာဗာများ
-
+ When AmneziaDNS is not used or installedAmneziaDNS ကို အသုံးမပြု သို့မဟုတ် ထည့်သွင်းခြင်းမပြုသည့်အခါ
-
+ Allows you to use the VPN only for certain Appsအချို့သောအက်ပ်များအတွက်သာ VPN ကို အသုံးပြုခွင့်ပေးသည်
-
+
+ KillSwitch
+
+
+
+
+ Disables your internet if your encrypted VPN connection drops out for any reason.
+
+
+
+
+ Cannot change killSwitch settings during active connection
+
+
+
+ Site-based split tunnelingဝက်ဆိုဒ်အခြေပြု split tunneling
-
+ Allows you to select which sites you want to access through the VPNVPN မှတဆင့် သင်ဝင်ရောက်လိုသည့်ဆိုဒ်များကို ရွေးချယ်စေနိုင်သည်
-
+ App-based split tunnelingApp အခြေပြု split tunneling
@@ -1249,62 +1521,62 @@ Already installed containers were found on the server. All installed containers
PageSettingsDns
-
+ Default server does not support custom DNSမူရင်းဆာဗာသည် စိတ်ကြိုက် DNS ကို အထောက်အပံ့မပေးပါ
-
+ DNS serversDNS ဆာဗာများ
-
+ If AmneziaDNS is not used or installedAmneziaDNS ကို အသုံးမပြု သို့မဟုတ် ထည့်သွင်းခြင်းမပြုသည့်အခါ
-
+ Primary DNSPrimary DNS
-
+ Secondary DNSSecondary DNS
-
+ Restore defaultမူရင်းအတိုင်းပြန်လည်ထားရှိမည်
-
+ Restore default DNS settings?မူရင်း DNS ဆက်တင်များကို ပြန်လည်ရယူလိုပါသလား?
-
+ Continueဆက်လက်လုပ်ဆောင်မည်
-
+ Cancelပယ်ဖျက်မည်
-
+ Settings have been resetဆက်တင်များကို ပြန်လည်သတ်မှတ်ပြီးပါပြီ
-
+ Saveသိမ်းဆည်းမည်
-
+ Settings savedဆက်တင်များကို သိမ်းဆည်းပြီးပြီ
@@ -1317,68 +1589,68 @@ Already installed containers were found on the server. All installed containers
-
+ Loggingလော့ဂ်အင်
-
+ Enabling this function will save application's logs automatically. By default, logging functionality is disabled. Enable log saving in case of application malfunction.ဤလုပ်ဆောင်ချက်ကို ဖွင့်ခြင်းဖြင့် အပလီကေးရှင်း၏ မှတ်တမ်းများကို အလိုအလျောက် သိမ်းဆည်းပေးမည် ဖြစ်ပြီး မူရင်းအတိုင်း၊ မှတ်တမ်းလုပ်ဆောင်ချက်ကို ပိတ်ထားသည်။ အပလီကေးရှင်းချို့ယွင်းချက်ရှိသောအခါ မှတ်တမ်းသိမ်းဆည်းခြင်းကို ဖွင့်ပါ။
-
+ Save logsမှတ်တမ်းများကိုသိမ်းဆည်းမည်
-
+ Open folder with logsမှတ်တမ်းများဖြင့် ဖိုင်တွဲကိုဖွင့်မည်
-
+ Saveသိမ်းဆည်းမည်
-
+ Logs files (*.log)မှတ်တမ်းဖိုင်များ (*.log)မှတ်တမ်းဖိုင်များ (*.log)
-
+ Logs file savedမှတ်တမ်းဖိုင်များသိမ်းဆည်းပြီးပါပြီ
-
+ Save logs to fileမှတ်တမ်းများကို ဖိုင်တွင်သိမ်းဆည်းမည်
-
+ Clear logs?မှတ်တမ်းများရှင်းလင်းမည်လား?
-
+ Continueဆက်လက်လုပ်ဆောင်မည်
-
+ Cancelပယ်ဖျက်မည်
-
+ Logs have been cleaned upမှတ်တမ်းများကို ရှင်းလင်းပြီးပါပြီ
-
+ Clear logsမှတ်တမ်းများရှင်းလင်းမည်
@@ -1386,27 +1658,24 @@ Already installed containers were found on the server. All installed containers
PageSettingsServerData
-
+ All installed containers have been added to the applicationထည့်သွင်းထားသည့် ကွန်တိန်နာအားလုံးကို အပလီကေးရှင်းသို့ ပေါင်းထည့်လိုက်ပြီ
- Clear Amnezia cache
- Amnezia ကက်ရှ်ဖိုင်များကို ရှင်းလင်းမည်
+ Amnezia ကက်ရှ်ဖိုင်များကို ရှင်းလင်းမည်
- May be needed when changing other settings
- အခြားဆက်တင်များကို ပြောင်းလဲသည့်အခါ လိုအပ်နိုင်သည်
+ အခြားဆက်တင်များကို ပြောင်းလဲသည့်အခါ လိုအပ်နိုင်သည်
- Clear cached profiles?
- ကက်ရှ်ပရိုဖိုင်များကို ရှင်းမည်လား?
+ ကက်ရှ်ပရိုဖိုင်များကို ရှင်းမည်လား?
-
+ No new installed containers foundအသစ်ထည့်သွင်းထားသော ကွန်တိန်နာများ မတွေ့ရှိပါ
@@ -1416,85 +1685,103 @@ Already installed containers were found on the server. All installed containers
-
-
-
-
-
+
+
+
+ Continueဆက်လက်လုပ်ဆောင်မည်
-
-
-
-
-
+
+
+
+ Cancelပယ်ဖျက်မည်
-
+ Check the server for previously installed Amnezia servicesယခင်က ထည့်သွင်းထားသော Amnezia ဝန်ဆောင်မှုများရှိမရှိ ဆာဗာကို စစ်ဆေးမည်
-
+ Add them to the application if they were not displayedဖော်ဆောင်ပြသခြင်းမရှိပါက ၎င်းတို့ကို အပလီကေးရှင်းထဲသို့ ထည့်မည်
-
+ Reboot serverဆာဗာကို ပြန်လည်စတင်မည်
-
+ Do you want to reboot the server?ဆာဗာကို ပြန်လည်စတင်ချင်ပါသလား?
-
+ The reboot process may take approximately 30 seconds. Are you sure you wish to proceed?ပြန်လည်စတင်သည့် လုပ်ငန်းစဉ်သည် စက္ကန့် 30 ခန့် ကြာနိုင်သည်. ဆက်လက်လုပ်ဆောင်လိုပါသလား?
-
+
+ Cannot reboot server during active connection
+
+
+
+ Do you want to remove the server from application?ဆာဗာကို အပလီကေးရှင်းမှဖယ်ရှားချင်ပါသလား?
-
+
+ Cannot remove server during active connection
+
+
+
+ Do you want to clear server from Amnezia software?ဆာဗာကို Amnezia ဆော့ဖ်ဝဲလ်မှ ရှင်းလင်းလိုပါသလား?
-
+ All users whom you shared a connection with will no longer be able to connect to it.သင်ချိတ်ဆက်မှုတစ်ခုနှင့် မျှဝေထားသည့် အသုံးပြုသူအားလုံး ၎င်းကို ချိတ်ဆက်နိုင်တော့မည်မဟုတ်ပါ။
-
+
+ Cannot clear server from Amnezia software during active connection
+
+
+
+ Reset API configAPI config ကို ပြန်လည်သတ်မှတ်မည်
-
+ Do you want to reset API config?API config ကို ပြန်လည်သတ်မှတ်ချင်ပါသလား?
-
+
+ Cannot reset API config during active connection
+
+
+
+ Remove server from applicationဆာဗာကို အပလီကေးရှင်းမှဖယ်ရှားမည်
-
+ All installed AmneziaVPN services will still remain on the server.ထည့်သွင်းထားသော AmneziaVPN ဝန်ဆောင်မှုများအားလုံးသည် ဆာဗာပေါ်တွင် ဆက်လက်ရှိနေမည်ဖြစ်သည်.
-
+ Clear server from Amnezia softwareဆာဗာကို Amnezia ဆော့ဖ်ဝဲလ်မှ ရှင်းလင်းမည်
@@ -1502,27 +1789,27 @@ Already installed containers were found on the server. All installed containers
PageSettingsServerInfo
-
+ Server nameဆာဗာအမည်
-
+ Saveသိမ်းဆည်းမည်
-
+ Protocolsပရိုတိုကောများ
-
+ Servicesဝန်ဆောင်မှုများ
-
+ Managementစီမံခန့်ခွဲမှု
@@ -1530,32 +1817,59 @@ Already installed containers were found on the server. All installed containers
PageSettingsServerProtocol
-
+ settings ဆက်တင်များ
-
+
+ Clear %1 profile
+
+
+
+
+ Clear %1 profile?
+
+
+
+
+
+
+
+
+
+ Unable to clear %1 profile while there is an active connection
+
+
+
+ Remove ဖယ်ရှားမည်
-
+ Remove %1 from server?%1 ကို ဆာဗာမှ ဖယ်ရှားမည်လား?
-
+ All users with whom you shared a connection will no longer be able to connect to it.သင်နှင့်အတူချိတ်ဆက်မှုတစ်ခုကို မျှဝေထားသည့် အသုံးပြုသူအားလုံး ဤချိတ်ဆက်မှုကိုချိတ်ဆက်နိုင်တော့မည်မဟုတ်ပါ.
-
+
+ Cannot remove active container
+
+
+
+
+ Continueဆက်လက်လုပ်ဆောင်မည်
-
+
+ Cancelပယ်ဖျက်မည်
@@ -1563,7 +1877,7 @@ Already installed containers were found on the server. All installed containers
PageSettingsServersList
-
+ Serversဆာဗာများ
@@ -1571,100 +1885,100 @@ Already installed containers were found on the server. All installed containers
PageSettingsSplitTunneling
-
+ Default server does not support split tunneling functionမူရင်းဆာဗာသည် split tunneling လုပ်ဆောင်ချက်ကို အထောက်အပံ့မပေးပါ
-
+ Addresses from the list should not be accessed via VPNစာရင်းတွင်ဖော်ပြထားသောလိပ်စာများကို VPN ဖြင့် ဝင်ရောက်ခြင်းပြုနိုင်လိမ့်မည် မဟုတ်ပေ
-
+ Split tunnelingSplit tunneling
-
+ ModeMode
-
+ Remove ဖယ်ရှားမည်
-
+ Continueဆက်လက်လုပ်ဆောင်မည်
-
+ Cancelပယ်ဖျက်မည်
-
+ Import / Export Sitesဆိုက်များ သွင်း/ထုတ်မည်
-
+ Only the sites listed here will be accessed through the VPNဤနေရာတွင်ဖော်ပြထားသောဆိုက်များကိုသာ VPN မှတဆင့်ဝင်ရောက်ပါမည်
-
+ Cannot change split tunneling settings during active connectionလက်ရှိချိတ်ဆက်မှုတစ်ခုရှိနေချိန်တွင် split tunneling ဆက်တင်များကို ပြောင်းလဲ၍မရပါ
-
+ website or IPဝဘ်ဆိုက် သို့မဟုတ် IP
-
+ Importတင်သွင်းမည်
-
+ Save site listဆိုက်စာရင်းကို သိမ်းဆည်းမည်
-
+ Save sitesဆိုက်များသိမ်းဆည်းမည်
-
-
-
+
+
+ Sites files (*.json)ဆိုက်ဖိုင်များ (*.json)
-
+ Import a list of sitesဆိုက်စာရင်းတစ်ခု တင်သွင်းမည်
-
+ Replace site listဆိုက်စာရင်းကို အစားထိုးမည်
-
-
+
+ Open sites fileဆိုက်ဖိုင်များ ဖွင့်မည်
-
+ Add imported sites to existing onesတင်သွင်းထားသော ဆိုက်များကို ရှိပြီးသားဆိုက်များထဲသို့ ထည့်မည်
@@ -1672,7 +1986,7 @@ Already installed containers were found on the server. All installed containers
PageSetupWizardConfigSource
-
+ Server connectionဆာဗာချိတ်ဆက်မှု
@@ -1685,37 +1999,37 @@ It's okay as long as it's from someone you trust.
သင်ယုံကြည်ရတဲ့သူတစ်ယောက်ဆီမှ ရရှိတဲ့ကုဒ်ဖြစ်နေသရွေ့တော့ အဆင်ပြေပါသည်.
-
+ Do not use connection codes from untrusted sources, as they may be created to intercept your data.သင့်ဒေတာကို ကြားဖြတ်ရန် ဖန်တီးထားနိုင်သောကြောင့် မယုံကြည်ရသော ရင်းမြစ်များမှ ချိတ်ဆက်ကုဒ်များကို မသုံးပါနှင့်။
-
+ What do you have?သင့်တွင်ဘာရှိပါသလဲ?
-
+ File with connection settingsချိတ်ဆက်မှုဆက်တင်များပါဝင်သောဖိုင်
-
+ File with connection settings or backupချိတ်ဆက်မှုဆက်တင်များ သို့မဟုတ် အရန်သိမ်းဆည်းထားမှုပါဝင်သောဖိုင်
-
+ Open config fileconfig ဖိုင်ကိုဖွင့်မည်
-
+ QR codeQR-ကုဒ်
-
+ Key as textKey ကိုစာသားအဖြစ်
@@ -1723,57 +2037,57 @@ It's okay as long as it's from someone you trust.
PageSetupWizardCredentials
-
+ Server IP address [:port]ဆာဗာ IP လိပ်စာ [:port]
-
+ Continueဆက်လက်လုပ်ဆောင်မည်
-
+ Enter the address in the format 255.255.255.255:88လိပ်စာကို 255.255.255.255:88 ဖော်မတ်ဖြင့် ထည့်ပါ
-
+ Configure your serverသင်၏ဆာဗာကို စီစဉ်ချိန်ညှိပါ။
-
+ 255.255.255.255:22255.255.255.255:22
-
+ SSH UsernameSSH အသုံးပြုသူအမည်
-
+ Password or SSH private keyစကားဝှက် သိုမဟုတ် SSH private key
-
+ All data you enter will remain strictly confidential and will not be shared or disclosed to the Amnezia or any third partiesသင်ထည့်သွင်းသည့်ဒေတာအားလုံးကို တင်းကြပ်လုံခြုံစွာလျှို့ဝှက်ထားမည်ဖြစ်ပြီး Amnezia သို့မဟုတ် မည်သည့်ပြင်ပအဖွဲ့အစည်းကိုမျှ မျှဝေမည် သို့မဟုတ် ထုတ်ဖော်မည်မဟုတ်ပါ
-
+ Ip address cannot be emptyIP လိပ်စာသည် ဗလာမဖြစ်ရပါ
-
+ Login cannot be emptyလော့ဂ်အင်အချက်အလက်သည် ဗလာမဖြစ်ရပါ
-
+ Password/private key cannot be emptyစကားဝှက်/private key သည် ဗလာမဖြစ်ရပါ
@@ -1781,22 +2095,22 @@ It's okay as long as it's from someone you trust.
PageSetupWizardEasy
-
+ What is the level of internet control in your region?သင့်ဒေသရှိ အင်တာနက်ထိန်းချုပ်မှုအဆင့်က ဘယ်လောက်ရှိပါသလဲ?
-
+ Choose a VPN protocolVPN ပရိုတိုကောကို ရွေးပါ။
-
+ Skip setupစနစ်ထည့်သွင်းမှုကို ကျော်သွားပါ။
-
+ Continueဆက်လက်လုပ်ဆောင်မည်
@@ -1804,38 +2118,38 @@ It's okay as long as it's from someone you trust.
PageSetupWizardInstalling
-
+ The server has already been added to the applicationဆာဗာကို အပလီကေးရှင်းတွင် ထည့်သွင်းပြီးပါပြီ
-
+ Amnezia has detected that your server is currently Amnezia သည် သင့်ဆာဗာက
-
+ busy installing other software. Amnezia installation အခြားဆော့ဖ်ဝဲကို ထည့်သွင်းနေသောကြောင့် အလုပ်ရှုပ်နေကြောင်းထောက်လှန်းမိပါသည်. Amnezia ထည့်သွင်းခြင်းလုပ်ငန်းစဥ်
-
+ will pause until the server finishes installing other softwareဆာဗာကို အခြားဆော့ဖ်ဝဲကို ထည့်သွင်းခြင်း မပြီးမချင်း ခေတ္တရပ်ထားပါမည်
-
+ Installingထည့်သွင်းနေသည်
-
+ Cancel installationထည့်သွင်းမှုကို ပယ်ဖျက်မည်
-
+ Usually it takes no more than 5 minutesများသောအားဖြင့် 5 မိနစ်ထက်မပိုပါ
@@ -1843,45 +2157,50 @@ It's okay as long as it's from someone you trust.
PageSetupWizardProtocolSettings
-
+ Installing %1ထည့်သွင်းနေသည် %1
-
+ More detailedပိုမိုအသေးစိတ်
-
+ Closeပိတ်မည်
-
+ Network protocolကွန်ရက်ပရိုတိုကော
-
+ PortPort
-
+ Installထည်သွင်းမည်
+
+
+ The port must be in the range of 1 to 65535
+
+ PageSetupWizardProtocols
-
+ VPN protocolVPN ပရိုတိုကော
-
+ Choose the one with the highest priority for you. Later, you can install other protocols and additional services, such as DNS proxy and SFTP.သင့်အတွက် ဦးစားပေးအဖြစ်ဆုံးကို ရွေးချယ်ပါ. နောက်ပိုင်းတွင်၊ သင်သည် DNS proxy နှင့် SFTP ကဲ့သို့သော အခြားပရိုတိုကောများနှင့် ထပ်ဆောင်းဝန်ဆောင်မှုများကို ထည့်သွင်းနိုင်သည်.
@@ -1889,7 +2208,7 @@ It's okay as long as it's from someone you trust.
PageSetupWizardQrReader
-
+ Point the camera at the QR code and hold for a couple of seconds. ကင်မရာနှင့် QR ကုဒ်ကို ချိန်ပြီး စက္ကန့်အနည်းငယ်လောက် ငြိမ်ထားပေးပါ.
@@ -1897,32 +2216,32 @@ It's okay as long as it's from someone you trust.
PageSetupWizardStart
-
+ Settings restored from backup fileဆက်တင်များကို အရန်သိမ်းဆည်းထားသောဖိုင်မှ ပြန်လည်ရယူပြီးပါပြီ
-
+ Free service for creating a personal VPN on your server.သင့်ဆာဗာပေါ်တွင် ကိုယ်ပိုင် VPN ဖန်တီးရန်အတွက် အခမဲ့ဝန်ဆောင်မှု.
-
+ Helps you access blocked content without revealing your privacy, even to VPN providers. အခြား VPN ဝန်ဆောင်မှုများကိုပင် သင်၏ privacy ကိုမဖော်ပြဘဲ ပိတ်ဆို့ထားသော အကြောင်းအရာများကို သင်ဝင်ရောက်ကြည့်ရှုနိုင်ရန် အကူအညီပေးပါသည်.
-
+ I have the data to connectကျွန်ုပ်တွင်ချိတ်ဆက်ဖို့အတွက်ဒေတာရှိသည်
-
+ I have nothingကျွန်ုပ်တွင်ဘာမှမရှိပါ
-
+ https://amnezia.org/instructions/0_starter-guidehttps://amnezia.org/instructions/0_starter-guide
@@ -1930,27 +2249,27 @@ It's okay as long as it's from someone you trust.
PageSetupWizardTextKey
-
+ Connection keyချိန်ဆက်မှု key
-
+ A line that starts with vpn://...vpn://... ဖြင့် စတင်သော စာကြောင်း...
-
+ KeyKey
-
+ Insertထည်သွင်းမည်
-
+ Continueဆက်လက်လုပ်ဆောင်မည်
@@ -1958,27 +2277,32 @@ It's okay as long as it's from someone you trust.
PageSetupWizardViewConfig
-
+ New connectionချိတ်ဆက်မှုအသစ်
-
+ Collapse contentအကြောင်းအရာများကိုဖြန့်ချမည်
-
+ Show contentအကြောင်းအရာများကိုပြမည်
-
+
+ Enable WireGuard obfuscation. It may be useful if WireGuard is blocked on your provider.
+
+
+
+ Use connection codes only from sources you trust. Codes from public sources may have been created to intercept your data.သင်ယုံကြည်ရသော ရင်းမြစ်များမှသာ ချိတ်ဆက်ကုဒ်များကို အသုံးပြုပါ။ သင့်ဒေတာကို ကြားဖြတ်ရန် အများသူငှာ ရင်းမြစ်များမှ ကုဒ်များကို ဖန်တီးထားသည်။
-
+ Connectချိတ်ဆက်မည်
@@ -1986,182 +2310,211 @@ It's okay as long as it's from someone you trust.
PageShare
-
+ OpenVPN native formatOpenVPN မူရင်းဖောမတ်
-
+ WireGuard native formatWireGuard မူရင်းဖော်မတ်
-
+ Connectionချိတ်ဆက်မှု
-
-
+
+ Serverဆာဗာ
-
+ Config revokedConfig ကိုပြန်ရုပ်သိမ်းလိုက်ပါပြီ
-
+ Connection to ဤဆာဗာသို့ချိတ်ဆက်မှု
-
+ File with connection settings to ဤဆာဗာနှင့်ချိတ်ဆက်မှု ဆက်တင်များပါရှိသော ဖိုင်
-
+ Save OpenVPN configOpenVPN config ကိုသိမ်းဆည်းမည်
-
+ Save WireGuard configWireGuard config ကိုသိမ်းဆည်းမည်
-
+ Save AmneziaWG configAmneziaWG config ကိုသိမ်းဆည်းမည်
-
+ Save Shadowsocks configShadowsocks config ကိုသိမ်းဆည်းမည်
-
+ Save Cloak configCloak config ကိုသိမ်းဆည်းမည်
-
+
+ Save XRay config
+
+
+
+ For the AmneziaVPN appAmneziaVPN အက်ပ်အတွက်
-
+ AmneziaWG native formatAmneziaWG မူရင်းဖော်မတ်
-
+ Shadowsocks native formatShadowsocks မူရင်းဖောမတ်
-
+ Cloak native formatCloak မူရင်းဖော်မတ်
-
+
+ XRay native format
+
+
+
+ Share VPN AccessVPN အသုံးပြုခွင့်ကိုမျှဝေမည်
-
+ Share full access to the server and VPNဆာဗာနှင့် VPN သို့ အပြည့်အဝဝင်ရောက်ခွင့်ကို မျှဝေမည်
-
+ Use for your own devices, or share with those you trust to manage the server.သင့်ကိုယ်ပိုင်စက်ပစ္စည်းများအတွက် အသုံးပြုရန် သို့မဟုတ် ဆာဗာကို စီမံခန့်ခွဲရန် သင်ယုံကြည်ရသူများနှင့် မျှဝေရန်.
-
-
+
+ Usersအသုံးပြုသူများ
-
+ User nameအသုံးပြုသူနာမည်
-
+ Searchရှာဖွေမည်
-
- Creation date:
- ဖန်တီးပြုလုပ်သည့်ရက်စွဲ:
+
+ Creation date: %1
+
-
+
+ Latest handshake: %1
+
+
+
+
+ Data received: %1
+
+
+
+
+ Data sent: %1
+
+
+
+ Creation date:
+ ဖန်တီးပြုလုပ်သည့်ရက်စွဲ:
+
+
+ Renameအမည်ပြောင်းမည်
-
+ Client nameကလိုင်းရင့်အမည်
-
+ Saveသိမ်းဆည်းမည်
-
+ Revokeပြန်ရုပ်သိမ်းမည်
-
+ Revoke the config for a user - %1?အသုံးပြုသူ %1 အတွက် config ကို ပြန်လည်ရုပ်သိမ်းမည်လား?
-
+ The user will no longer be able to connect to your server.ဤအသုံးပြုသူသည် သင့်ဆာဗာသို့ ချိတ်ဆက်နိုင်တော့မည်မဟုတ်ပါ.
-
+ Continueဆက်လက်လုပ်ဆောင်မည်
-
+ Cancelပယ်ဖျက်မည်
-
+ Share VPN access without the ability to manage the serverဆာဗာကို စီမံခန့်ခွဲနိုင်စွမ်းမပါရှိဘဲ VPN အသုံးပြုခွင့်ကို မျှဝေမည်
-
-
+
+ Protocolပရိုတိုကော
-
-
+
+ Connection formatချိတ်ဆက်မှုဖောမတ်
-
-
+
+ Shareမျှဝေမည်
@@ -2169,50 +2522,50 @@ It's okay as long as it's from someone you trust.
PageShareFullAccess
-
+ Full access to the server and VPNဆာဗာနှင့် VPN ကို အပြည့်အဝဝင်ရောက်ခွင့်
-
+ We recommend that you use full access to the server only for your own additional devices.
သင့်ကိုယ်ပိုင်အပိုပစ္စည်းများအတွက်သာ ဆာဗာသို့ အပြည့်အဝဝင်ရောက်ခွင့်ကို အသုံးပြုရန် ကျွန်ုပ်တို့ အကြံပြုပါသည်.
-
+ If you share full access with other people, they can remove and add protocols and services to the server, which will cause the VPN to work incorrectly for all users. သင်သည် အခြားသူများနှင့် အပြည့်အဝဝင်ရောက်ခွင့်ကို မျှဝေပါက၊ ၎င်းတို့သည် ပရိုတိုကောများနှင့် ဝန်ဆောင်မှုများကို ဆာဗာသို့ထည့်သွင်းခြင်း ဆာဗာမှဖယ်ရှားခြင်းများ ပြုလုပ်နိုင်သောကြောင့် အသုံးပြုသူများအားလုံးအတွက် VPN မှားယွင်းစွာ လုပ်ဆောင်ခြင်းများဖြစ်စေနိုင်ပါသည်.
-
-
+
+ Serverဆာဗာ
-
+ Accessing ဝင်ရောက်နေသည်
-
+ File with accessing settings to ဤဆာဗာနှင့်ဝင်ရောက်နိုင်မှု ဆက်တင်များပါရှိသော ဖိုင်
-
+ Shareမျှဝေမည်
-
+ Connection to ဤဆာဗာသို့ချိတ်ဆက်မှု
-
+ File with connection settings to ဤဆာဗာနှင့်ချိတ်ဆက်မှု ဆက်တင်များပါရှိသော ဖိုင်
@@ -2220,7 +2573,7 @@ It's okay as long as it's from someone you trust.
PageStart
-
+ Logging was disabled after 14 days, log files were deleted
@@ -2228,7 +2581,7 @@ It's okay as long as it's from someone you trust.
PopupType
-
+ Closeပိတ်မည်
@@ -2477,6 +2830,7 @@ It's okay as long as it's from someone you trust.
+ Unknown errorအမည်မသိ မှားယွင်းမှု
@@ -2486,62 +2840,62 @@ It's okay as long as it's from someone you trust.
လုပ်ဆောင်ချက်ကို မတတ်ဆင်ရသေးပါ
-
+ Server check failedဆာဗာစစ်ဆေးမှု မအောင်မြင်ပါ
-
+ Server port already used. Check for another softwareဆာဗာ Port ကို အသုံးပြုပြီးဖြစ်သည်. အခြားဆော့ဖ်ဝဲရှိမရှိ စစ်ဆေးပါ
-
+ Server error: Docker container missingဆာဗာ မှားယွင်းမှု: Docker ကွန်တိန်နာ ပျောက်နေသည်
-
+ Server error: Docker failedဆာဗာ မှားယွင်းမှု: Docker မအောင်မြင်ပါ
-
+ Installation canceled by userထည့်သွင်းမှုကို အသုံးပြုသူမှ ပယ်ဖျက်လိုက်သည်
-
+ The user does not have permission to use sudoဤအသုံးပြုသူသည် sudo ကိုအသုံးပြုရန်ခွင့်ပြုချက်မရှိပါ
-
+ SSH request was deniedSSH တောင်းဆိုမှု ငြင်းဆိုခံလိုက်ရပါသည်
-
+ SSH request was interruptedSSH တောင်းဆိုမှု အနှောက်အယက်ခံလိုက်ရပါသည်
-
+ SSH internal errorစက်တွင်းဖြစ်သော SSH မှားယွင်းမှု
-
+ Invalid private key or invalid passphrase enteredမမှန်ကန်သော ကိုယ်ပိုင် key သို့မဟုတ် မမှန်ကန်သော စကားဝှက်ကို ထည့်သွင်းထားသည်
-
+ The selected private key format is not supported, use openssh ED25519 key types or PEM key typesရွေးချယ်ထားသော ကိုယ်ပိုင် key ဖော်မတ်ကို ထောက်ပံ့မှုမပေးပါ၊ openssh ED25519 key အမျိုးအစားများ သို့မဟုတ် PEM သော့အမျိုးအစားများကို အသုံးပြုပါ
-
+ Timeout connecting to serverဆာဗာသို့ ချိတ်ဆက်ခြင်း အချိန်ကုန်သွားသည်
@@ -2598,142 +2952,177 @@ It's okay as long as it's from someone you trust.
Sftp မှားယွင်းမှု: မီဒီယာသည် အဝေးမှ drive ထဲတွင် မရှိခဲ့ပါ
-
+ The config does not contain any containers and credentials for connecting to the serverConfig တွင် ဆာဗာသို့ချိတ်ဆက်ရန်အတွက် ကွန်တိန်နာများနှင့် အထောက်အထားများ မပါဝင်ပါ
-
+ Error when retrieving configuration from APIAPI မှ စီစဉ်သတ်မှတ်မှုကို ရယူသည့်အခါ အမှားအယွင်းဖြစ်ပေါ်နေသည်
-
+ This config has already been added to the applicationဤ config ကို အပလီကေးရှင်းထဲသို့ ထည့်သွင်းပြီးဖြစ်သည်
-
+ ErrorCode: %1. မှားယွင်းမှုကုတ်: %1.
-
+ OpenVPN config missingOpenVPN config ပျောက်ဆုံးနေပါသည်
-
+
+ Background service is not running
+
+
+
+
+ Server error: Packet manager error
+
+
+
+ SCP error: Generic failure
-
+ OpenVPN management server errorOpenVPN စီမံခန့်ခွဲမှုဆာဗာ အမှားအယွင်း
-
+ OpenVPN executable missingOpenVPN စီမံလုပ်ဆောင်နိုင်မှု ပျောက်ဆုံးနေပါသည်
-
+ Shadowsocks (ss-local) executable missingShadowsocks (ss-local) executable ပျောက်နေပါသည်
-
+ Cloak (ck-client) executable missingCloak (ck-client) စီမံလုပ်ဆောင်နိုင်မှု ပျောက်ဆုံးနေပါသည်
-
+ Amnezia helper service errorAmnezia helper ဝန်ဆောင်မှု မှားယွင်းမှု
-
+ OpenSSL failedOpenSSL မအောင်မြင်ပါ
-
+ Can't connect: another VPN connection is activeချိတ်ဆက်၍မရပါ: အခြား VPN ချိတ်ဆက်မှုတစ်ခုရှိနေပါသည်
-
+ Can't setup OpenVPN TAP network adapterOpenVPN TAP ကွန်ရက် adapter ကို စနစ်တည်ဆောက်၍မရပါ
-
+ VPN pool error: no available addressesVPN pool မှားယွင်းမှု: ရရှိနိုင်သောလိပ်စာများမရှိပါ
-
+ VPN connection errorVPN ချိတ်ဆက်မှုမှားယွင်းနေပါသည်
- QFile error: The file could not be opened
+ In the response from the server, an empty config was received
- QFile error: An error occurred when reading from the file
+ SSL error occurred
- QFile error: The file could not be accessed
-
-
-
-
- QFile error: An unspecified error occurred
-
-
-
-
- QFile error: A fatal error occurred
+ Server response timeout on api request
- QFile error: The operation was aborted
+ QFile error: The file could not be opened
+
+
+
+
+ QFile error: An error occurred when reading from the file
+
+
+
+
+ QFile error: The file could not be accessed
+
+
+
+
+ QFile error: An unspecified error occurred
+ QFile error: A fatal error occurred
+
+
+
+
+ QFile error: The operation was aborted
+
+
+
+ Internal errorစက်တွင်းဖြစ်သော မှားယွင်းမှု
-
+ IPsecIPsec
-
+ Shadowsocks - masks VPN traffic, making it similar to normal web traffic, but it may be recognized by analysis systems in some highly censored regions.Shadowsocks - ၎င်းသည် ပုံမှန်ဝဘ်လမ်းကြောင်းနှင့် ဆင်တူစေရန် VPN အသွားအလာကို ဖုံးကွယ်ထားသော်လည်း ၎င်းကို အချို့သော ဆင်ဆာဖြတ်ထားသော ဒေသများရှိ ခွဲခြမ်းစိတ်ဖြာမှုစနစ်များက ထောက်လှန်းသိရှိနိုင်ပါသည်.
-
+ OpenVPN over Cloak - OpenVPN with VPN masquerading as web traffic and protection against active-probing detection. Ideal for bypassing blocking in regions with the highest levels of censorship.OpenVPN over Cloak - ဝဘ်အသွားအလာအဖြစ် ဟန်ဆောင်ထားသည့် VPN ပါသော OpenVPN နှင့် active-probing ထောက်လှမ်းခြင်းမှ ကာကွယ်ပေးခြင်း. ဆင်ဆာဖြတ်တောက်မှု အမြင့်ဆုံးအဆင့်ရှိသော ဒေသများတွင် ပိတ်ဆို့ခြင်းများကို ကျော်ဖြတ်ရန်အတွက် အကောင်းဆုံးဖြစ်သည်.
-
+
+ XRay with REALITY - Suitable for countries with the highest level of internet censorship. Traffic masking as web traffic at the TLS level, and protection against detection by active probing methods.
+
+
+
+
+ IKEv2/IPsec - Modern stable protocol, a bit faster than others, restores connection after signal loss. It has native support on the latest versions of Android and iOS.
+
+
+
+ Create a file vault on your server to securely store and transfer files.ဖိုင်များကို လုံခြုံစွာသိမ်းဆည်းရန်နှင့် လွှဲပြောင်းရန်အတွက် သင့်ဆာဗာပေါ်တွင် fire vault တစ်ခု ဖန်တီးပါ.
-
+ This is a combination of the OpenVPN protocol and the Cloak plugin designed specifically for protecting against blocking.
OpenVPN provides a secure VPN connection by encrypting all internet traffic between the client and the server.
@@ -2772,7 +3161,7 @@ Cloak သည် ပက်ကတ်မက်တာဒေတာကို မွမ
-
+ A relatively new popular VPN protocol with a simplified architecture.
WireGuard provides stable VPN connection and high performance on all devices. It uses hard-coded encryption settings. WireGuard compared to OpenVPN has lower latency and better data transfer throughput.
WireGuard is very susceptible to blocking due to its distinct packet signatures. Unlike some other VPN protocols that employ obfuscation techniques, the consistent signature patterns of WireGuard packets can be more easily identified and thus blocked by advanced Deep Packet Inspection (DPI) systems and other network monitoring tools.
@@ -2793,7 +3182,15 @@ WireGuard သည် ၎င်း၏ ကွဲပြားသော packet လက
* UDP ကွန်ရက်ပရိုတိုကောပေါ်တွင် အလုပ်လုပ်သည်။.
-
+
+ The REALITY protocol, a pioneering development by the creators of XRay, is specifically designed to counteract the highest levels of internet censorship through its novel approach to evasion.
+It uniquely identifies censors during the TLS handshake phase, seamlessly operating as a proxy for legitimate clients while diverting censors to genuine websites like google.com, thus presenting an authentic TLS certificate and data.
+This advanced capability differentiates REALITY from similar technologies by its ability to disguise web traffic as coming from random, legitimate sites without the need for specific configurations.
+Unlike older protocols such as VMess, VLESS, and the XTLS-Vision transport, REALITY's innovative "friend or foe" recognition at the TLS handshake enhances security and circumvents detection by sophisticated DPI systems employing active probing techniques. This makes REALITY a robust solution for maintaining internet freedom in environments with stringent censorship.
+
+
+
+ IKEv2, paired with the IPSec encryption layer, stands as a modern and stable VPN protocol.
One of its distinguishing features is its ability to swiftly switch between networks and devices, making it particularly adaptive in dynamic network environments.
While it offers a blend of security, stability, and speed, it's essential to note that IKEv2 can be easily detected and is susceptible to blocking.
@@ -2814,58 +3211,57 @@ IKEv2 သည် လုံခြုံရေး၊ တည်ငြိမ်မှ
* UDP ကွန်ရက်ပရိုတိုကော၊ port 500 နှင့် 4500 ကျော်တွင် အလုပ်လုပ်သည်။.
-
+ DNS ServiceDNS ဝန်ဆောင်မှု
-
+ SFTP file sharing serviceSFTP ဖိုင်မျှဝေခြင်းဆားဗစ်
-
-
+
+ Website in Tor networkTor ကွန်ရက်ထဲရှိ ဝဘ်ဆိုဒ်
-
+ AmneziaDNSAmneziaDNS
-
+ OpenVPN is the most popular VPN protocol, with flexible configuration options. It uses its own security protocol with SSL/TLS for key exchange.OpenVPN သည် ပြောင်းလွယ်ပြင်လွယ် ဖွဲ့စည်းမှုရွေးချယ်စရာများပါရှိသော လူကြိုက်အများဆုံး VPN ပရိုတိုကောဖြစ်သည်. ၎င်းသည် key လဲလှယ်မှုအတွက် SSL/TLS ဖြင့် ၎င်း၏ကိုယ်ပိုင်လုံခြုံရေးပရိုတိုကောကို အသုံးပြုသည်.
-
+ WireGuard - New popular VPN protocol with high performance, high speed and low power consumption. Recommended for regions with low levels of censorship.WireGuard - မြင့်မားသောစွမ်းဆောင်ရည်၊ မြန်နှုန်းမြင့်နှင့် ပါဝါသုံးစွဲမှုနည်းသော လူကြိုက်များသော VPN ပရိုတိုကောအသစ်. ဆင်ဆာဖြတ်မှုအဆင့်နိမ့်သော ဒေသများတွင်အသုံးပြုရန်အကြံပြုထားသည်.
-
+ AmneziaWG - Special protocol from Amnezia, based on WireGuard. It's fast like WireGuard, but very resistant to blockages. Recommended for regions with high levels of censorship.AmneziaWG - WireGuard ကိုအခြေခံထားသော Amnezia မှ အထူးပရိုတိုကော. ၎င်းသည် WireGuard ကဲ့သို့မြန်ဆန်သော်ပြီး ပိတ်ဆို့ခြင်းများကိုလည်း ခံနိုင်ရည်ရှိပါသည်. ဆင်ဆာဖြတ်တောက်မှု မြင့်မားသော ဒေသများတွင်အသုံးပြုရန် အကြံပြုပါသည်.
- IKEv2/IPsec - Modern stable protocol, a bit faster than others, restores connection after signal loss.
- IKEv2/IPsec - ခေတ်မီတည်ငြိမ်သောပရိုတိုကော၊ အခြားအရာများထက်အနည်းငယ်ပိုမြန်သည်၊ signal ပျောက်ဆုံးပြီးနောက် ချိတ်ဆက်မှုကို ပြန်လည်ရယူပေးသည်.
+ IKEv2/IPsec - ခေတ်မီတည်ငြိမ်သောပရိုတိုကော၊ အခြားအရာများထက်အနည်းငယ်ပိုမြန်သည်၊ signal ပျောက်ဆုံးပြီးနောက် ချိတ်ဆက်မှုကို ပြန်လည်ရယူပေးသည်.
-
+ Deploy a WordPress site on the Tor network in two clicks.ကလစ်နှစ်ချက်နှိပ်ရုံဖြင့် Tor ကွန်ရက်ပေါ်တွင် WordPress ဆိုက်တစ်ခုကို ဖြန့်ကျက်လိုက်ပါ.
-
+ Replace the current DNS server with your own. This will increase your privacy level.လက်ရှိ DNS ဆာဗာကို သင့်ကိုယ်ပိုင် DNS ဆာဗာဖြင့် အစားထိုးပါ. ဤသို့ပြုလုပ်ခြင်းသည် သင်၏ကိုယ်ရေးကိုယ်တာလုံခြုံမှုအဆင့်ကို တိုးမြှင့်ပေးလိမ့်မည်.
-
+ OpenVPN stands as one of the most popular and time-tested VPN protocols available.
It employs its unique security protocol, leveraging the strength of SSL/TLS for encryption and key exchange. Furthermore, OpenVPN's support for a multitude of authentication methods makes it versatile and adaptable, catering to a wide range of devices and operating systems. Due to its open-source nature, OpenVPN benefits from extensive scrutiny by the global community, which continually reinforces its security. With a strong balance of performance, security, and compatibility, OpenVPN remains a top choice for privacy-conscious individuals and businesses alike.
@@ -2884,7 +3280,7 @@ It employs its unique security protocol, leveraging the strength of SSL/TLS for
* TCP နှင့် UDP ကွန်ရက် ပရိုတိုကော နှစ်ခုလုံးတွင် လည်ပတ်နိုင်သည်။.
-
+ Shadowsocks, inspired by the SOCKS5 protocol, safeguards the connection using the AEAD cipher. Although Shadowsocks is designed to be discreet and challenging to identify, it isn't identical to a standard HTTPS connection.However, certain traffic analysis systems might still detect a Shadowsocks connection. Due to limited support in Amnezia, it's recommended to use AmneziaWG protocol.
* Available in the AmneziaVPN only on desktop platforms
@@ -2899,7 +3295,7 @@ It employs its unique security protocol, leveraging the strength of SSL/TLS for
* TCP ကွန်ရက် ပရိုတိုကောပေါ်တွင် အလုပ်လုပ်သည်။.
-
+ A modern iteration of the popular VPN protocol, AmneziaWG builds upon the foundation set by WireGuard, retaining its simplified architecture and high-performance capabilities across devices.
While WireGuard is known for its efficiency, it had issues with being easily detected due to its distinct packet signatures. AmneziaWG solves this problem by using better obfuscation methods, making its traffic blend in with regular internet traffic.
This means that AmneziaWG keeps the fast performance of the original while adding an extra layer of stealth, making it a great choice for those wanting a fast and discreet VPN connection.
@@ -2920,7 +3316,7 @@ WireGuard သည် ၎င်း၏ စွမ်းဆောင်ရည်အ
* UDP ကွန်ရက်ပရိုတိုကောပေါ်တွင် အလုပ်လုပ်သည်။.
-
+ After installation, Amnezia will create a
file storage on your server. You will be able to access it using
@@ -2939,10 +3335,17 @@ For more detailed information, you can
"create SFTP file storage." အောက်ရှိ ပံ့ပိုးမှုကဏ္ဍတွင် ၎င်းကိုရှာပါ။
-
+ SFTP serviceSFTP ဝန်ဆောင်မှု
+
+
+
+
+ SOCKS5 proxy server
+
+ Entry not found
@@ -2993,21 +3396,147 @@ For more detailed information, you can
No matchကိုက်ညီမှုမရှိပါ
-
-
- Unknown error
- အမည်မသိ မှားယွင်းမှု
- error 0x%1: %2မှားယွင်းမှု 0x%1: %2
+
+
+ vmess:// url is invalid
+
+
+
+
+ Invalid streamSettings protocol:
+
+
+
+
+ Unknown transport method:
+
+
+
+
+ VMess string should start with 'vmess://'
+
+
+
+
+ VMess string should be a valid base64 string
+
+
+
+
+ JSON should not be empty
+
+
+
+
+ VLESS link should start with vless://
+
+
+
+
+ link parse failed: %1
+
+
+
+
+ empty host
+
+
+
+
+ missing port
+
+
+
+
+ missing uuid
+
+
+
+
+ Invalid ssd link: json: field %1 must exist
+
+
+
+
+ Invalid ssd link: json: field %1 must be valid port number
+
+
+
+
+ Invalid ssd link: json: field %1 must be of type 'string'
+
+
+
+
+ Invalid ssd link: json: field %1 must be an array
+
+
+
+
+ Skipping invalid ssd server: server must be an object
+
+
+
+
+ Skipping invalid ssd server: missing required field %1
+
+
+
+
+ Skipping invalid ssd server: field %1 should be of type 'string'
+
+
+
+
+ Invalid ssd link: should begin with ssd://
+
+
+
+
+ Invalid ssd link: base64 parse failed
+
+
+
+
+ Invalid ssd link: json parse failed
+
+
+
+
+ Invalid ssd link: rc4-md5 encryption is not supported by v2ray-core
+
+
+
+
+ SS URI is too short
+
+
+
+
+
+ Can't find the colon separator between method and password
+
+
+
+
+ Can't find the at separator between password and hostname
+
+
+
+
+ Can't find the colon separator between hostname and port
+
+ SelectLanguageDrawer
-
+ Choose languageဘာသာစကားကို ရွေးချယ်ပါ
@@ -3029,17 +3558,16 @@ For more detailed information, you can
SettingsController
-
+ All settings have been reset to default valuesဆက်တင်အားလုံးကို မူရင်းတန်ဖိုးများအဖြစ် ပြန်လည်သတ်မှတ်ထားသည်
- Cached profiles cleared
- ကက်ရှ်ပရိုဖိုင်များကို ရှင်းလင်းပြီးပါပြီ
+ ကက်ရှ်ပရိုဖိုင်များကို ရှင်းလင်းပြီးပါပြီ
-
+ Backup file is corruptedအရန်သိမ်းထားသည့်ဖိုင်ပျက်ဆီးနေသည်
@@ -3063,23 +3591,23 @@ For more detailed information, you can
ကူးယူမည်
-
-
+
+ Copiedကူးယူပြီးပါပြီ
-
+ Copy config stringconfig string ကိုကူးယူမည်
-
+ Show connection settingsချိတ်ဆက်မှုဆက်တင်များကို ပြပါ
-
+ To read the QR code in the Amnezia app, select "Add server" → "I have data to connect" → "QR code, key or settings file"Amnezia အက်ပ်ရှိ QR ကုဒ်ကိုဖတ်ရန်အတွက်အောက်ပါအတိုင်း ရွေးချယ်ပါ "ဆာဗာထည့်ရန်" → "ချိတ်ဆက်ရန် ဒေတာရှိသည်" → "QR ကုဒ်၊ key သို့မဟုတ် ဆက်တင်ဖိုင်"
@@ -3163,7 +3691,7 @@ For more detailed information, you can
TextFieldWithHeaderType
-
+ The field can't be emptyဖြည့်သွင်းရမည့်နေရာသည် အလွတ်မဖြစ်ရပါ
@@ -3171,7 +3699,7 @@ For more detailed information, you can
VpnConnection
-
+ MbpsMbps
@@ -3179,42 +3707,42 @@ For more detailed information, you can
VpnProtocol
-
+ Unknownအမည်မသိ
-
+ Disconnectedဖြုတ်လိုက်ပါပြီ
-
+ Preparingပြင်ဆင်နေပါသည်
-
+ Connecting...ချိတ်ဆက်နေပါပြီ...
-
+ Connectedချိတ်ဆက်ပြီးသွားပါပြီ
-
+ Disconnecting...အဆက်အသွယ်ဖြတ်နေပါသည်...
-
+ Reconnecting...ပြန်လည်ချိတ်ဆက်နေပါသည်...
-
+ Errorမှားယွင်းမှု
@@ -3222,45 +3750,43 @@ For more detailed information, you can
amnezia::ContainerProps
-
+ LowLow
-
+ HighMedium သို့မဟုတ် High
- Extreme
- Extreme
+ Extreme
-
+ I just want to increase the level of my privacy.ကျွန်ုပ်၏ကိုယ်ရေးကိုယ်တာလုံခြုံမှုအဆင့်ကို မြှင့်တင်လိုပါသည်.
-
+ I want to bypass censorship. This option recommended in most cases.ဆင်ဆာဖြတ်တောက်ခြင်းကို ကျော်ဖြတ်ချင်ပါသည်. ဤရွေးချယ်မှုကို ကိစ္စအများစုအတွက် အကြံပြုထားသည်.
- Most VPN protocols are blocked. Recommended if other options are not working.
- VPN ပရိုတိုကောအများစုကို ပိတ်ဆို့ထားသည်. အခြားရွေးချယ်စရာများ အလုပ်မလုပ်ပါက အသုံးပြုရန်အကြံပြုထားသည်.
+ VPN ပရိုတိုကောအများစုကို ပိတ်ဆို့ထားသည်. အခြားရွေးချယ်စရာများ အလုပ်မလုပ်ပါက အသုံးပြုရန်အကြံပြုထားသည်.main2
-
+ Private key passphraseကိုယ်ပိုင် key စကားဝှက်
-
+ Saveသိမ်းဆည်းမည်
diff --git a/client/translations/amneziavpn_ru_RU.ts b/client/translations/amneziavpn_ru_RU.ts
index 905ed3e0..b9c98862 100644
--- a/client/translations/amneziavpn_ru_RU.ts
+++ b/client/translations/amneziavpn_ru_RU.ts
@@ -1,50 +1,96 @@
+
+ AppSplitTunnelingController
+
+
+ Application added: %1
+
+
+
+
+ The application has already been added
+
+
+
+
+ The selected applications have been added
+
+
+
+
+ Application removed: %1
+
+
+
+
+ ConnectButton
+
+
+ Unable to disconnect during configuration preparation
+
+
+ConnectionController
-
+ VPN Protocols is not installed.
Please install VPN container at firstVPN-протоколы не установлены.
Пожалуйста, установите протокол
-
+ Connecting...Подключение...
-
+ ConnectedПодключено
-
+
+ Preparing...
+
+
+
+ Settings updated successfully, reconnnection...Настройки успешно обновлены, переподключение...
-
+ Settings updated successfullyНастройки успешно обновлены
-
+
+ The selected protocol is not supported on the current platform
+ Выбранный протокол не поддерживается на данном устройстве
+
+
+
+ unable to create configuration
+
+
+
+ Reconnecting...Переподключение...
-
-
-
-
+
+
+
+ ConnectПодключиться
-
+ Disconnecting...Отключение...
@@ -52,17 +98,17 @@
ConnectionTypeSelectionDrawer
-
+ Add new connectionДобавить новое соединение
-
+ Configure your serverНастроить свой сервер
-
+ Open config file, key or QR codeОткрыть файл конфигурации, ключ или QR-код
@@ -93,7 +139,7 @@
ExportController
-
+ Access error!Ошибка доступа!
@@ -101,57 +147,58 @@
HomeContainersListView
-
+ Unable change protocol while there is an active connectionНевозможно изменить протокол при активном соединении
- The selected protocol is not supported on the current platform
- Выбранный протокол не поддерживается на данном устройстве
+ Выбранный протокол не поддерживается на данном устройствеHomeSplitTunnelingDrawer
-
+ Split tunnelingРаздельное VPN-туннелирование
-
+ Allows you to connect to some sites or applications through a VPN connection and bypass othersПозволяет подключаться к одним сайтам или приложениям через VPN-соединение, а к другим — в обход него
-
+ Split tunneling on the serverРаздельное туннелирование на сервере
-
+ Enabled
Can't be disabled for current serverВключено
Невозможно отключить для текущего сервера
-
+ Site-based split tunnelingРаздельное туннелирование сайтов
-
+
+ EnabledВключено
-
+
+ DisabledОтключено
-
+ App-based split tunnelingРаздельное туннелирование приложений
@@ -159,86 +206,112 @@ Can't be disabled for current server
ImportController
-
+ Unable to open fileНевозможно открыть файл
-
-
+
+ Invalid configuration fileНеверный файл конфигурации
-
+ Scanned %1 of %2.Отсканировано %1 из %2.
+
+
+ In the imported configuration, potentially dangerous lines were found:
+
+ InstallController
-
-
+ %1 installed successfully. %1 успешно установлен.
-
-
+ %1 is already installed on the server. %1 уже установлен на сервер.
-
+
Added containers that were already installed on the server
Добавлены сервисы и протоколы, которые были ранее установлены на сервер
-
+
Already installed containers were found on the server. All installed containers have been added to the application
На сервере обнаружены установленные протоколы и сервисы. Все они были добавлены в приложение
-
+ Settings updated successfullyНастройки успешно обновлены
-
+ Server '%1' was rebootedСервер '%1' был перезагружен
-
+ Server '%1' was removedСервер '%1' был удален
-
+ All containers from server '%1' have been removedВсе протоколы и сервисы были удалены с сервера '%1'
-
+ %1 has been removed from the server '%2'%1 был удален с сервера '%2'
-
+
+ %1 cached profile cleared
+
+
+
+ Please login as the userПожалуйста, войдите в систему от имени пользователя
-
+ Server added successfullyСервер успешно добавлен
+
+ InstalledAppsDrawer
+
+
+ Choose application
+
+
+
+
+ application name
+
+
+
+
+ Add selected
+
+
+KeyChainClass
@@ -260,28 +333,28 @@ Already installed containers were found on the server. All installed containers
NotificationHandler
-
-
+
+ AmneziaVPNAmneziaVPN
-
+ VPN ConnectedVPN подключен
-
+ VPN DisconnectedVPN выключен
-
+ AmneziaVPN notificationУведомление AmneziaVPN
-
+ Unsecured network detected: Обнаружена незащищенная сеть:
@@ -302,32 +375,32 @@ Already installed containers were found on the server. All installed containers
PageHome
-
+ Logging enabledЛогирование включено
-
+ Split tunneling enabledРаздельное туннелирование включено
-
+ Split tunneling disabledРаздельное туннелирование выключено
-
+ VPN protocolVPN протокол
-
+ ServersСерверы
-
+ Unable change server while there is an active connectionНевозможно изменить сервер при активном соединении
@@ -335,280 +408,295 @@ Already installed containers were found on the server. All installed containers
PageProtocolAwgSettings
-
+ AmneziaWG settingsНастройки AmneziaWG
-
+ PortПорт
-
+ MTUMTU
- Remove AmneziaWG
- Удалить AmneziaWG
+ Удалить AmneziaWG
- Remove AmneziaWG from server?
- Удалить AmneziaWG с сервера?
+ Удалить AmneziaWG с сервера?
-
-
+ All users with whom you shared a connection with will no longer be able to connect to it.Все пользователи, с которыми вы поделились конфигурацией вашего VPN, больше не смогут к нему подключаться.
-
+ SaveСохранить
-
+
+ The values of the H1-H4 fields must be unique
+
+
+
+
+ The value of the field S1 + message initiation size (148) must not equal S2 + message response size (92)
+
+
+
+ Save settings?Сохранить настройки?
-
-
+ ContinueПродолжить
-
-
+ CancelОтменить
+
+
+ Unable change settings while there is an active connection
+
+ PageProtocolCloakSettings
-
+ Cloak settingsНастройки Cloak
-
+ Disguised as traffic fromЗамаскировать трафик под
-
+ PortПорт
-
-
+
+ CipherШифрование
-
+ SaveСохранить
+
+
+ Unable change settings while there is an active connection
+
+ PageProtocolOpenVpnSettings
-
+ OpenVPN settingsНастройки OpenVPN
-
+ VPN address subnetПодсеть VPN-адресов
-
+ Network protocolСетевой протокол
-
+ PortПорт
-
+ Auto-negotiate encryptionШифрование с автоматическим согласованием
-
-
+
+ HashХэш
-
+ SHA512SHA512
-
+ SHA384SHA384
-
+ SHA256SHA256
-
+ SHA3-512SHA3-512
-
+ SHA3-384SHA3-384
-
+ SHA3-256SHA3-256
-
+ whirlpoolwhirlpool
-
+ BLAKE2b512BLAKE2b512
-
+ BLAKE2s256BLAKE2s256
-
+ SHA1SHA1
-
-
+
+ CipherШифрование
-
+ AES-256-GCMAES-256-GCM
-
+ AES-192-GCMAES-192-GCM
-
+ AES-128-GCMAES-128-GCM
-
+ AES-256-CBCAES-256-CBC
-
+ AES-192-CBCAES-192-CBC
-
+ AES-128-CBCAES-128-CBC
-
+ ChaCha20-Poly1305ChaCha20-Poly1305
-
+ ARIA-256-CBCARIA-256-CBC
-
+ CAMELLIA-256-CBCCAMELLIA-256-CBC
-
+ nonenone
-
+ TLS authTLS авторизация
-
+ Block DNS requests outside of VPNБлокировать DNS-запросы за пределами VPN
-
+ Additional client configuration commandsДополнительные команды конфигурации клиента
-
-
+
+ Commands:Команды:
-
+ Additional server configuration commandsДополнительные команды конфигурации сервера
-
+
+ Unable change settings while there is an active connection
+
+
+ Remove OpenVPN
- Удалить OpenVPN
+ Удалить OpenVPN
- Remove OpenVPN from server?
- Удалить OpenVPN с сервера?
+ Удалить OpenVPN с сервера?
- All users with whom you shared a connection with will no longer be able to connect to it.
- Все пользователи, с которыми вы поделились конфигурацией вашего VPN, больше не смогут к нему подключаться.
+ Все пользователи, с которыми вы поделились конфигурацией вашего VPN, больше не смогут к нему подключаться.
- Continue
- Продолжить
+ Продолжить
- Cancel
- Отменить
+ Отменить
-
+ SaveСохранить
@@ -616,32 +704,32 @@ Already installed containers were found on the server. All installed containers
PageProtocolRaw
-
+ settings настройки
-
+ Show connection optionsПоказать параметры подключения
-
+ Connection options %1Параметры подключения %1
-
+ Remove Удалить
-
+ Remove %1 from server?Удалить %1 с сервера?
-
+ All users with whom you shared a connection with will no longer be able to connect to it.Все пользователи, с которыми вы поделились конфигурацией вашего VPN, больше не смогут к нему подключаться.
@@ -650,12 +738,12 @@ Already installed containers were found on the server. All installed containers
Все пользователи, с которыми вы поделились этим VPN-протоколом, больше не смогут к нему подключаться.
-
+ ContinueПродолжить
-
+ CancelОтменить
@@ -663,75 +751,103 @@ Already installed containers were found on the server. All installed containers
PageProtocolShadowSocksSettings
-
+ Shadowsocks settingsНастройки Shadowsocks
-
+ PortПорт
-
-
+
+ CipherШифрование
-
+ SaveСохранить
+
+
+ Unable change settings while there is an active connection
+
+ PageProtocolWireGuardSettings
-
+ WG settingsНастройки WG
-
+ PortПорт
-
+ MTUMTU
-
+
+ Unable change settings while there is an active connection
+
+
+ Remove WG
- Удалить WG
+ Удалить WG
- Remove WG from server?
- Удалить WG с сервера?
+ Удалить WG с сервера?
- All users with whom you shared a connection will no longer be able to connect to it.
- Все пользователи, с которыми вы поделились конфигурацией вашего VPN, больше не смогут к нему подключаться.
+ Все пользователи, с которыми вы поделились конфигурацией вашего VPN, больше не смогут к нему подключаться.
- Continue
- Продолжить
+ Продолжить
- Cancel
- Отменить
+ Отменить
-
+ SaveСохранить
+
+ PageProtocolXraySettings
+
+
+ XRay settings
+
+
+
+
+ Disguised as traffic from
+ Замаскировать трафик под
+
+
+
+ Save
+ Сохранить
+
+
+
+ Unable change settings while there is an active connection
+
+
+PageServerContainers
@@ -742,180 +858,255 @@ Already installed containers were found on the server. All installed containers
PageServiceDnsSettings
-
+ A DNS service is installed on your server, and it is only accessible via VPN.
На вашем сервере установлен DNS-сервис, доступ к нему возможен только через VPN.
-
+ The DNS address is the same as the address of your server. You can configure DNS in the settings, under the connections tab.Адрес DNS совпадает с адресом вашего сервера. Настроить DNS можно во вкладке "Соединение" настроек приложения.
-
+ Remove Удалить
-
+ Remove %1 from server?Удалить %1 с сервера?
-
+ ContinueПродолжить
-
+ CancelОтменить
+
+
+ Cannot remove Amnezia DNS from running server
+
+ PageServiceSftpSettings
-
+ Settings updated successfullyНастройки успешно обновлены
-
+ SFTP settingsНастройки SFTP
-
+ HostХост
-
-
-
-
+
+
+
+ CopiedСкопировано
-
+ PortПорт
-
+ User nameИмя пользователя
-
+ PasswordПароль
-
+ Mount folder on deviceСмонтировать папку на устройстве
-
+ In order to mount remote SFTP folder as local drive, perform following steps: <br>Чтобы смонтировать SFTP-папку как локальный диск, выполните следующие действия: <br>
-
-
+
+ <br>1. Install the latest version of <br>1. Установите последнюю версию
-
-
+
+ <br>2. Install the latest version of <br>2. Установите последнюю версию
-
+ Detailed instructionsПодробные инструкции
-
+ Remove SFTP and all data stored thereУдалить SFTP-хранилище со всеми данными
-
+ Remove SFTP and all data stored there?Удалить SFTP-хранилище и все хранящиеся там данные?
-
+ ContinueПродолжить
-
+ CancelОтменить
+
+ PageServiceSocksProxySettings
+
+
+ Settings updated successfully
+ Настройки успешно обновлены
+
+
+
+
+ SOCKS5 settings
+
+
+
+
+ Host
+ Хост
+
+
+
+
+
+
+ Copied
+ Скопировано
+
+
+
+
+ Port
+ Порт
+
+
+
+ User name
+ Имя пользователя
+
+
+
+
+ Password
+ Пароль
+
+
+
+ Username
+
+
+
+
+
+ Change connection settings
+
+
+
+
+ The port must be in the range of 1 to 65535
+
+
+
+
+ Password cannot be empty
+
+
+
+
+ Username cannot be empty
+
+
+PageServiceTorWebsiteSettings
-
+ Settings updated successfullyНастройки успешно обновлены
-
+ Tor website settingsНастройки сайта в сети Тоr
-
+ Website addressАдрес сайта
-
+ CopiedСкопировано
-
+ Use <a href="https://www.torproject.org/download/" style="color: #FBB26A;">Tor Browser</a> to open this URL.Используйте <a href="https://www.torproject.org/download/" style="color: #FBB26A;">Tor Browser</a> для открытия этой ссылки.
-
+ After creating your onion site, it takes a few minutes for the Tor network to make it available for use.Через несколько минут после установки ваш onion-сайт станет доступен в сети Tor.
-
+ When configuring WordPress set the this onion address as domain.При настройке WordPress укажите этот onion-адрес в качестве домена.
-
+ Remove websiteУдалить сайт
-
+ The site with all data will be removed from the tor network.Сайт со всеми данными будет удален из сети Tor.
-
+ ContinueПродолжить
-
+ CancelОтменить
@@ -923,37 +1114,37 @@ Already installed containers were found on the server. All installed containers
PageSettings
-
+ SettingsНастройки
-
+ ServersСерверы
-
+ ConnectionСоединение
-
+ ApplicationПриложение
-
+ BackupРезервное копирование
-
+ About AmneziaVPNОб AmneziaVPN
-
+ Close applicationЗакрыть приложение
@@ -961,7 +1152,7 @@ Already installed containers were found on the server. All installed containers
PageSettingsAbout
-
+ Support AmneziaПоддержите Amnezia
@@ -970,173 +1161,236 @@ Already installed containers were found on the server. All installed containers
Показать другие способы на GitHub
-
+ Amnezia is a free and open-source application. You can support the developers if you like it.Amnezia — это бесплатное приложение с открытым исходным кодом. Поддержите разработчиков, если оно вам нравится.
-
+ ContactsКонтакты
-
+ Telegram groupГруппа в Telegram
-
+ To discuss featuresДля обсуждения возможностей
-
+ https://t.me/amnezia_vpn_enhttps://t.me/amnezia_vpn
-
+ MailПочта
-
+ For reviews and bug reportsДля отзывов и сообщений об ошибках
-
+ GitHubGitHub
-
+ https://github.com/amnezia-vpn/amnezia-clienthttps://github.com/amnezia-vpn/amnezia-client
-
+ WebsiteВеб-сайт
-
+ https://amnezia.orghttps://amnezia.org
-
+ Software version: %1Версия ПО: %1
-
+ Check for updatesПроверить обновления
-
+ Privacy PolicyПолитика конфиденциальности
+
+ PageSettingsAppSplitTunneling
+
+
+ Cannot change split tunneling settings during active connection
+ Невозможно изменить настройки раздельного туннелирования при активном соединении
+
+
+
+ Only the apps from the list should have access via VPN
+
+
+
+
+ Apps from the list should not have access via VPN
+
+
+
+
+ App split tunneling
+
+
+
+
+ Mode
+ Режим
+
+
+
+ Remove
+ Удалить
+
+
+
+ Continue
+ Продолжить
+
+
+
+ Cancel
+ Отменить
+
+
+
+ application name
+
+
+
+
+ Open executable file
+
+
+
+
+ Executable file (*.*)
+
+
+PageSettingsApplication
-
+ ApplicationПриложение
-
+ Allow application screenshotsРазрешить скриншоты приложения
-
+ Auto startАвтозапуск
-
+ Launch the application every time the device is startsЗапускать приложение при загрузке устройства
-
+ Auto connectАвтоподключение
-
+ Connect to VPN on app startПодключаться к VPN при запуске приложения
-
+ Start minimizedЗапускать в свернутом виде
-
+ Launch application minimizedЗапускать приложение в свернутом виде
-
+ LanguageЯзык
-
+ Enable notificationsВключить уведомления
-
+ Enable notifications to show the VPN state in the status barВключить уведомления для отображения статуса VPN в строке состояния
-
+ LoggingЛогирование
-
+ EnabledВключено
-
+ DisabledОтключено
-
+ Reset settings and remove all data from the applicationСбросить настройки и удалить все данные из приложения
-
+ Reset settings and remove all data from the application?Сбросить настройки и удалить все данные из приложения?
-
+ All settings will be reset to default. All installed AmneziaVPN services will still remain on the server.Все настройки будут сброшены до значений по умолчанию. Все установленные сервисы AmneziaVPN останутся на сервере.
-
+ ContinueПродолжить
-
+ CancelОтменить
+
+
+ Cannot reset settings during active connection
+
+ PageSettingsBackup
@@ -1145,12 +1399,12 @@ Already installed containers were found on the server. All installed containers
Резервное копирование
-
+ Settings restored from backup fileНастройки восстановлены из файла резервной копии
-
+ Back up your configurationСоздать резервную копию конфигурации
@@ -1159,71 +1413,76 @@ Already installed containers were found on the server. All installed containers
Резервная копия конфигурации
-
+ You can save your settings to a backup file to restore them the next time you install the application.Вы можете сохранить настройки в файл резервной копии, чтобы восстановить их при следующей установке приложения.
-
+ The backup will contain your passwords and private keys for all servers added to AmneziaVPN. Keep this information in a secure place.Резервная копия будет содержать ваши пароли и закрытые ключи для всех серверов, добавленных в AmneziaVPN. Храните эту информацию в надежном месте.
-
+ Make a backupСоздать резервную копию
-
+ Save backup fileСохранить резервную копию
-
-
+
+ Backup files (*.backup)Файлы резервных копий (*.backup)
-
+ Backup file savedРезервная копия сохранена
-
+ Restore from backupВосстановить из резервной копии
-
+ Open backup fileОткрыть резервную копию
-
+ Import settings from a backup file?Импортировать настройки из резервной копии?
-
+ All current settings will be resetВсе текущие настройки будут сброшены
-
+ ContinueПродолжить
-
+ CancelОтменить
+
+
+ Cannot restore backup settings during active connection
+
+ PageSettingsConnection
-
+ ConnectionСоединение
@@ -1236,42 +1495,57 @@ Already installed containers were found on the server. All installed containers
Подключение к VPN при запуске приложения
-
+ Use AmneziaDNSИспользовать AmneziaDNS
-
+ If AmneziaDNS is installed on the serverЕсли AmneziaDNS установлен на сервере
-
+ DNS serversDNS-серверы
-
+ When AmneziaDNS is not used or installedКогда AmneziaDNS не используется или не установлен
-
+ Allows you to use the VPN only for certain AppsПозволяет использовать VPN только для определенных приложений
-
+
+ KillSwitch
+
+
+
+
+ Disables your internet if your encrypted VPN connection drops out for any reason.
+
+
+
+
+ Cannot change killSwitch settings during active connection
+
+
+
+ Site-based split tunnelingРаздельное туннелирование сайтов
-
+ Allows you to select which sites you want to access through the VPNПозволяет выбирать, к каким сайтам подключаться через VPN
-
+ App-based split tunnelingРаздельное туннелирование приложений
@@ -1283,12 +1557,12 @@ Already installed containers were found on the server. All installed containers
PageSettingsDns
-
+ Default server does not support custom DNSСервер по умолчанию не поддерживает пользовательские DNS
-
+ DNS serversDNS-серверы
@@ -1297,52 +1571,52 @@ Already installed containers were found on the server. All installed containers
Когда AmneziaDNS не используется или не установлен
-
+ If AmneziaDNS is not used or installedЕсли AmneziaDNS не используется или не установлен
-
+ Primary DNSПервичный DNS
-
+ Secondary DNSВторичный DNS
-
+ Restore defaultВосстановить по умолчанию
-
+ Restore default DNS settings?Восстановить настройки DNS по умолчанию?
-
+ ContinueПродолжить
-
+ CancelОтменить
-
+ Settings have been resetНастройки сброшены
-
+ SaveСохранить
-
+ Settings savedНастройки сохранены
@@ -1355,67 +1629,67 @@ Already installed containers were found on the server. All installed containers
Логирование включено. Обратите внимание, что логирование будет автоматически отключено через 14 дней, и все логи будут удалены.
-
+ LoggingЛогирование
-
+ Enabling this function will save application's logs automatically. By default, logging functionality is disabled. Enable log saving in case of application malfunction.Включение этой функции позволяет сохранять логи на вашем устройстве. По умолчанию она отключена. Включите сохранение логов в случае сбоев в работе приложения.
-
+ Save logsСохранять логи
-
+ Open folder with logsОткрыть папку с логами
-
+ SaveСохранить
-
+ Logs files (*.log)Файлы логов (*.log)
-
+ Logs file savedФайл с логами сохранен
-
+ Save logs to fileСохранить логи в файл
-
+ Clear logs?Очистить логи?
-
+ ContinueПродолжить
-
+ CancelОтменить
-
+ Logs have been cleaned upЛоги очищены
-
+ Clear logsОчистить логи
@@ -1423,27 +1697,24 @@ Already installed containers were found on the server. All installed containers
PageSettingsServerData
-
+ All installed containers have been added to the applicationВсе установленные протоколы и сервисы были добавлены в приложение
- Clear Amnezia cache
- Очистить кэш Amnezia
+ Очистить кэш Amnezia
- May be needed when changing other settings
- Может понадобиться при изменении других настроек
+ Может понадобиться при изменении других настроек
- Clear cached profiles?
- Удалить кэш Amnezia?
+ Удалить кэш Amnezia?
-
+ No new installed containers foundНовые установленные протоколы и сервисы не обнаружены
@@ -1453,75 +1724,93 @@ Already installed containers were found on the server. All installed containers
-
-
-
-
-
+
+
+
+ ContinueПродолжить
-
-
-
-
-
+
+
+
+ CancelОтменить
-
+ Check the server for previously installed Amnezia servicesПроверить сервер на наличие ранее установленных сервисов Amnezia
-
+ Add them to the application if they were not displayedДобавить их в приложение, если они не отображаются
-
+ Reboot serverПерезагрузить сервер
-
+ Do you want to reboot the server?Вы уверены, что хотите перезагрузить сервер?
-
+ The reboot process may take approximately 30 seconds. Are you sure you wish to proceed?Процесс перезагрузки может занять около 30 секунд. Вы уверены, что хотите продолжить?
-
+
+ Cannot reboot server during active connection
+
+
+
+ Do you want to remove the server from application?Вы уверены, что хотите удалить сервер из приложения?
-
+
+ Cannot remove server during active connection
+
+
+
+ Do you want to clear server from Amnezia software?Вы хотите очистить сервер от всех сервисов Amnezia?
-
+ All users whom you shared a connection with will no longer be able to connect to it.Все пользователи, с которыми вы поделились конфигурацией вашего VPN, больше не смогут к нему подключаться.
-
+
+ Cannot clear server from Amnezia software during active connection
+
+
+
+ Reset API configСбросить конфигурацию API
-
+ Do you want to reset API config?Вы хотите сбросить конфигурацию API?
-
+
+ Cannot reset API config during active connection
+
+
+
+ Remove server from applicationУдалить сервер из приложения
@@ -1530,12 +1819,12 @@ Already installed containers were found on the server. All installed containers
Удалить сервер?
-
+ All installed AmneziaVPN services will still remain on the server.Все установленные сервисы и протоколы Amnezia останутся на сервере.
-
+ Clear server from Amnezia softwareОчистить сервер от протоколов и сервисов Amnezia
@@ -1551,27 +1840,27 @@ Already installed containers were found on the server. All installed containers
PageSettingsServerInfo
-
+ Server nameИмя сервера
-
+ SaveСохранить
-
+ ProtocolsПротоколы
-
+ ServicesСервисы
-
+ ManagementУправление
@@ -1583,36 +1872,63 @@ Already installed containers were found on the server. All installed containers
PageSettingsServerProtocol
-
+ settings настройки
-
+
+ Clear %1 profile
+
+
+
+
+ Clear %1 profile?
+
+
+
+
+
+
+
+
+
+ Unable to clear %1 profile while there is an active connection
+
+
+
+ Remove Удалить
-
+ Remove %1 from server?Удалить %1 с сервера?
-
+ All users with whom you shared a connection will no longer be able to connect to it.Все пользователи, с которыми вы поделились конфигурацией вашего VPN, больше не смогут к нему подключаться.
+
+
+ Cannot remove active container
+
+ All users who you shared a connection with will no longer be able to connect to it.Все пользователи, с которыми вы поделились VPN, больше не смогут к нему подключаться.
-
+
+ ContinueПродолжить
-
+
+ CancelОтменить
@@ -1620,7 +1936,7 @@ Already installed containers were found on the server. All installed containers
PageSettingsServersList
-
+ ServersСерверы
@@ -1628,7 +1944,7 @@ Already installed containers were found on the server. All installed containers
PageSettingsSplitTunneling
-
+ Default server does not support split tunneling functionСервер по умолчанию не поддерживает раздельное туннелирование
@@ -1637,32 +1953,32 @@ Already installed containers were found on the server. All installed containers
Только адреса из списка должны открываться через VPN
-
+ Addresses from the list should not be accessed via VPNАдреса из списка не должны открываться через VPN
-
+ Split tunnelingРаздельное туннелирование
-
+ ModeРежим
-
+ Remove Удалить
-
+ ContinueПродолжить
-
+ CancelОтменить
@@ -1671,81 +1987,73 @@ Already installed containers were found on the server. All installed containers
Сайт или IP
-
+ Import / Export SitesИмпорт/экспорт сайтов
-
+ Only the sites listed here will be accessed through the VPNТолько адреса из списка должны открываться через VPN
-
+ Cannot change split tunneling settings during active connectionНевозможно изменить настройки раздельного туннелирования при активном соединении
-
+ website or IPвеб-сайт или IP
-
+ ImportИмпорт
-
+ Save site listСохранить список сайтов
-
+ Save sitesСохранить
-
-
-
+
+
+ Sites files (*.json)Файлы сайтов (*.json)
-
+ Import a list of sitesИмпортировать список с сайтами
-
+ Replace site listЗаменить список с сайтами
-
-
+
+ Open sites fileОткрыть список с сайтами
-
+ Add imported sites to existing onesДобавить импортированные сайты к существующим
-
- PageSettingsAppSplitTunneling
-
-
- Cannot change split tunneling settings during active connection
- Невозможно изменить настройки раздельного туннелирования при активном соединении
-
-PageSetupWizardConfigSource
-
+ Server connectionПодключение к серверу
@@ -1758,37 +2066,37 @@ It's okay as long as it's from someone you trust.
Всё в порядке, если кодом поделился пользователь, которому вы доверяете.
-
+ Do not use connection codes from untrusted sources, as they may be created to intercept your data.Не используйте коды подключения из ненадежных источников, так как они могут быть созданы для перехвата ваших данных.
-
+ What do you have?Что у вас есть?
-
+ File with connection settingsФайл с настройками подключения
-
+ File with connection settings or backupФайл с настройками подключения или резервной копией
-
+ Open config fileОткрыть файл с конфигурацией
-
+ QR codeQR-код
-
+ Key as textКлюч в виде текста
@@ -1800,7 +2108,7 @@ It's okay as long as it's from someone you trust.
Подключение к серверу
-
+ Server IP address [:port]IP-адрес[:порт] сервера
@@ -1813,7 +2121,7 @@ It's okay as long as it's from someone you trust.
Password / SSH private key
-
+ ContinueПродолжить
@@ -1823,7 +2131,7 @@ and will not be shared or disclosed to the Amnezia or any third parties
Все данные, которые вы вводите, останутся строго конфиденциальными и не будут переданы или раскрыты Amnezia или каким-либо третьим лицам
-
+ Enter the address in the format 255.255.255.255:88Введите адрес в формате 255.255.255.255:88
@@ -1832,42 +2140,42 @@ and will not be shared or disclosed to the Amnezia or any third parties
Login to connect via SSH
-
+ Configure your serverНастроить ваш сервер
-
+ 255.255.255.255:22255.255.255.255:22
-
+ SSH UsernameИмя пользователя SSH
-
+ Password or SSH private keyПароль или закрытый ключ SSH
-
+ All data you enter will remain strictly confidential and will not be shared or disclosed to the Amnezia or any third partiesВсе данные, которые вы вводите, останутся строго конфиденциальными и не будут переданы или раскрыты Amnezia или каким-либо третьим лицам
-
+ Ip address cannot be emptyПоле с IP-адресом не может быть пустым
-
+ Login cannot be emptyПоле с логином не может быть пустым
-
+ Password/private key cannot be emptyПоле с паролем/закрытым ключом не может быть пустым
@@ -1875,17 +2183,17 @@ and will not be shared or disclosed to the Amnezia or any third parties
PageSetupWizardEasy
-
+ What is the level of internet control in your region?Какой уровень контроля над интернетом в вашем регионе?
-
+ Choose a VPN protocolВыберите VPN-протокол
-
+ Skip setupПропустить настройку
@@ -1898,7 +2206,7 @@ and will not be shared or disclosed to the Amnezia or any third parties
Выбрать VPN-протокол
-
+ ContinueПродолжить
@@ -1910,46 +2218,38 @@ and will not be shared or disclosed to the Amnezia or any third parties
PageSetupWizardInstalling
-
+ The server has already been added to the applicationСервер уже был добавлен в приложение
- Amnezia has detected that your server is currently
- Amnezia обнаружила, что ваш сервер в настоящее время
-
-
- busy installing other software. Amnezia installation
- занят установкой других протоколов или сервисов. Установка Amnezia
-
-
-
+ Amnezia has detected that your server is currently Amnezia обнаружила, что ваш сервер в настоящее время
-
+ busy installing other software. Amnezia installation
- занят установкой другого ПО. Установка Amnezia
+ занят установкой других протоколов или сервисов. Установка Amnezia
-
+ will pause until the server finishes installing other softwareбудет приостановлена до тех пор, пока сервер не завершит установку другого ПО
-
+ InstallingУстановка
-
+ Cancel installationОтменить установку
-
+ Usually it takes no more than 5 minutesОбычно это занимает не более 5 минут
@@ -1957,45 +2257,50 @@ and will not be shared or disclosed to the Amnezia or any third parties
PageSetupWizardProtocolSettings
-
+ Installing %1Устанавливается %1
-
+ More detailedПодробнее
-
+ CloseЗакрыть
-
+ Network protocolСетевой протокол
-
+ PortПорт
-
+ InstallУстановить
+
+
+ The port must be in the range of 1 to 65535
+
+ PageSetupWizardProtocols
-
+ VPN protocolVPN-протокол
-
+ Choose the one with the highest priority for you. Later, you can install other protocols and additional services, such as DNS proxy and SFTP.Выберите протокол, который вам больше подходит. В дальнейшем можно установить другие протоколы и дополнительные сервисы, такие как DNS-прокси и SFTP.
@@ -2003,7 +2308,7 @@ and will not be shared or disclosed to the Amnezia or any third parties
PageSetupWizardQrReader
-
+ Point the camera at the QR code and hold for a couple of seconds. Наведите камеру на QR-код и удерживайте ее в течение нескольких секунд.
@@ -2011,32 +2316,32 @@ and will not be shared or disclosed to the Amnezia or any third parties
PageSetupWizardStart
-
+ Settings restored from backup fileНастройки восстановлены из резервной копии
-
+ Free service for creating a personal VPN on your server.Простое и бесплатное приложение для запуска собственного VPN на своем сервере.
-
+ Helps you access blocked content without revealing your privacy, even to VPN providers. Помогает получить доступ к заблокированному контенту, не раскрывая вашу конфиденциальность даже провайдерам VPN.
-
+ I have the data to connectУ меня есть данные для подключения
-
+ I have nothingУ меня ничего нет
-
+ https://amnezia.org/instructions/0_starter-guidehttps://amnezia.org/ru/starter-guide
@@ -2044,27 +2349,27 @@ and will not be shared or disclosed to the Amnezia or any third parties
PageSetupWizardTextKey
-
+ Connection keyКлюч для подключения
-
+ A line that starts with vpn://...Строка, которая начинается с vpn://...
-
+ KeyКлюч
-
+ InsertВставить
-
+ ContinueПродолжить
@@ -2072,7 +2377,7 @@ and will not be shared or disclosed to the Amnezia or any third parties
PageSetupWizardViewConfig
-
+ New connectionНовое соединение
@@ -2081,22 +2386,27 @@ and will not be shared or disclosed to the Amnezia or any third parties
Не используйте код подключения из публичных источников. Его могли создать, чтобы перехватить ваши данные.
-
+ Collapse contentСвернуть
-
+ Show contentПоказать
-
+
+ Enable WireGuard obfuscation. It may be useful if WireGuard is blocked on your provider.
+
+
+
+ Use connection codes only from sources you trust. Codes from public sources may have been created to intercept your data.Используйте файлы конфигурации только из тех источников, которым вы доверяете. Файлы из общедоступных источников могли быть созданы с целью перехвата ваших личных данных.
-
+ ConnectПодключиться
@@ -2104,12 +2414,12 @@ and will not be shared or disclosed to the Amnezia or any third parties
PageShare
-
+ OpenVPN native formatОригинальный формат OpenVPN
-
+ WireGuard native formatОригинальный формат WireGuard
@@ -2118,7 +2428,7 @@ and will not be shared or disclosed to the Amnezia or any third parties
VPN-Доступ
-
+ ConnectionСоединение
@@ -2131,8 +2441,8 @@ and will not be shared or disclosed to the Amnezia or any third parties
Доступ к управлению сервером. Пользователь, с которым вы делитесь полным доступом к соединению, сможет добавлять и удалять ваши протоколы и службы на сервере, а также изменять настройки.
-
-
+
+ ServerСервер
@@ -2141,138 +2451,167 @@ and will not be shared or disclosed to the Amnezia or any third parties
Доступ
-
+ Config revokedКонфигурация отозвана
-
+ Connection to Подключение к
-
+ File with connection settings to Файл с настройками доступа к
-
+ Save OpenVPN configСохранить конфигурацию OpenVPN
-
+ Save WireGuard configСохранить конфигурацию WireGuard
-
+ Save AmneziaWG configСохранить конфигурацию AmneziaWG
-
+ Save Shadowsocks configСохранить конфигурацию Shadowsocks
-
+ Save Cloak configСохранить конфигурацию Cloak
-
+
+ Save XRay config
+
+
+
+ For the AmneziaVPN appДля приложения AmneziaVPN
-
+ AmneziaWG native formatОригинальный формат AmneziaWG
-
+ Shadowsocks native formatОригинальный формат Shadowsocks
-
+ Cloak native formatОригинальный формат Cloak
-
+
+ XRay native format
+
+
+
+ Share VPN AccessПоделиться VPN
-
+ Share full access to the server and VPNПоделиться полным доступом к серверу и VPN
-
+ Use for your own devices, or share with those you trust to manage the server.Используйте для собственных устройств или передайте управление сервером тем, кому вы доверяете.
-
-
+
+ UsersПользователи
-
+ User nameИмя пользователя
-
+ SearchПоиск
-
- Creation date:
- Дата создания:
+
+ Creation date: %1
+
-
+
+ Latest handshake: %1
+
+
+
+
+ Data received: %1
+
+
+
+
+ Data sent: %1
+
+
+
+ Creation date:
+ Дата создания:
+
+
+ RenameПереименовать
-
+ Client nameИмя клиента
-
+ SaveСохранить
-
+ RevokeОтозвать
-
+ Revoke the config for a user - %1?Отозвать конфигурацию для пользователя - %1?
-
+ The user will no longer be able to connect to your server.Пользователь больше не сможет подключаться к вашему серверу.
-
+ ContinueПродолжить
-
+ CancelОтменить
@@ -2281,25 +2620,25 @@ and will not be shared or disclosed to the Amnezia or any third parties
Полный доступ
-
+ Share VPN access without the ability to manage the serverПоделиться доступом к VPN без возможности управления сервером
-
-
+
+ ProtocolПротокол
-
-
+
+ Connection formatФормат подключения
-
-
+
+ ShareПоделиться
@@ -2307,50 +2646,50 @@ and will not be shared or disclosed to the Amnezia or any third parties
PageShareFullAccess
-
+ Full access to the server and VPNПолный доступ к серверу и VPN
-
+ We recommend that you use full access to the server only for your own additional devices.
Мы рекомендуем использовать полный доступ к серверу только для собственных устройств.
-
+ If you share full access with other people, they can remove and add protocols and services to the server, which will cause the VPN to work incorrectly for all users. Если вы поделитесь полным доступом с другими людьми, то они смогут удалять и добавлять протоколы и сервисы на сервер, что приведет к некорректной работе VPN для всех пользователей.
-
-
+
+ ServerСервер
-
+ Accessing Доступ
-
+ File with accessing settings to Файл с настройками доступа к
-
+ ShareПоделиться
-
+ Connection to Подключение к
-
+ File with connection settings to Файл с настройками доступа к
@@ -2358,7 +2697,7 @@ and will not be shared or disclosed to the Amnezia or any third parties
PageStart
-
+ Logging was disabled after 14 days, log files were deletedЛогирование было отключено по прошествии 14 дней, файлы логов были удалены.
@@ -2366,7 +2705,7 @@ and will not be shared or disclosed to the Amnezia or any third parties
PopupType
-
+ CloseЗакрыть
@@ -2614,9 +2953,8 @@ and will not be shared or disclosed to the Amnezia or any third parties
Нет ошибки
- Unknown Error
- Неизвестная ошибка
+ Неизвестная ошибка
@@ -2624,67 +2962,77 @@ and will not be shared or disclosed to the Amnezia or any third parties
Функция не реализована
-
+
+ Background service is not running
+
+
+
+ Server check failedПроверка сервера завершилась неудачей
-
+ Server port already used. Check for another softwareПорт сервера уже используется. Проверьте наличие другого ПО
-
+ Server error: Docker container missingОшибка сервера: отсутствует Docker-контейнер
-
+ Server error: Docker failedОшибка сервера: сбой в работе Docker
-
+ Installation canceled by userУстановка отменена пользователем
-
+ The user does not have permission to use sudoУ пользователя нет прав на использование sudo
-
+
+ Server error: Packet manager error
+
+
+
+ SSH request was deniedSSH-запрос был отклонён
-
+ SSH request was interruptedSSH-запрос был прерван
-
+ SSH internal errorВнутренняя ошибка SSH
-
+ Invalid private key or invalid passphrase enteredВведен неверный закрытый ключ или неверная парольная фраза
-
+ The selected private key format is not supported, use openssh ED25519 key types or PEM key typesВыбранный формат закрытого ключа не поддерживается, используйте типы ключей openssh ED25519 или PEM
-
+ Timeout connecting to serverТайм-аут подключения к серверу
-
+ SCP error: Generic failureОшибка SCP: общий сбой
@@ -2741,22 +3089,22 @@ and will not be shared or disclosed to the Amnezia or any third parties
Sftp error: No media was in remote drive
-
+ The config does not contain any containers and credentials for connecting to the serverКонфигурация не содержит каких-либо контейнеров и учетных данных для подключения к серверу
-
+ Error when retrieving configuration from APIОшибка при получении конфигурации из API
-
+ This config has already been added to the applicationДанная конфигурация уже была добавлена в приложение
-
+ ErrorCode: %1. Код ошибки: %1.
@@ -2765,117 +3113,137 @@ and will not be shared or disclosed to the Amnezia or any third parties
Failed to save config to disk
-
+ OpenVPN config missingОтсутствует конфигурация OpenVPN
-
+ OpenVPN management server errorСерверная ошибка управлением OpenVPN
-
+ OpenVPN executable missingОтсутствует исполняемый файл OpenVPN
-
+ Shadowsocks (ss-local) executable missingОтсутствует исполняемый файл Shadowsocks (ss-local)
-
+ Cloak (ck-client) executable missingОтсутствует исполняемый файл Cloak (ck-client)
-
+ Amnezia helper service errorОшибка вспомогательной службы Amnezia
-
+ OpenSSL failedОшибка OpenSSL
-
+ Can't connect: another VPN connection is activeНевозможно подключиться: активно другое VPN-соединение
-
+ Can't setup OpenVPN TAP network adapterНевозможно настроить сетевой адаптер OpenVPN TAP
-
+ VPN pool error: no available addressesОшибка пула VPN: нет доступных адресов
-
+ VPN connection errorОшибка VPN-соединения
+ In the response from the server, an empty config was received
+
+
+
+
+ SSL error occurred
+
+
+
+
+ Server response timeout on api request
+
+
+
+ QFile error: The file could not be openedОшибка QFile: не удалось открыть файл
-
+ QFile error: An error occurred when reading from the fileОшибка QFile: произошла ошибка при чтении из файла
-
+ QFile error: The file could not be accessedОшибка QFile: не удалось получить доступ к файлу
-
+ QFile error: An unspecified error occurredОшибка QFile: произошла неизвестная ошибка
-
+ QFile error: A fatal error occurredОшибка QFile: произошла фатальная ошибка
-
+ QFile error: The operation was abortedОшибка QFile: операция была прервана
-
+ Internal errorВнутренняя ошибка
-
+ IPsecIPsec
-
+ Shadowsocks - masks VPN traffic, making it similar to normal web traffic, but it may be recognized by analysis systems in some highly censored regions.Shadowsocks маскирует VPN-трафик под обычный веб-трафик, но распознается системами анализа в некоторых регионах с высоким уровнем цензуры.
-
+ OpenVPN over Cloak - OpenVPN with VPN masquerading as web traffic and protection against active-probing detection. Ideal for bypassing blocking in regions with the highest levels of censorship.OpenVPN over Cloak — это OpenVPN с маскировкой VPN-трафика под обычный веб-трафик и защитой от обнаружения активным зондированием. Подходит для регионов с самым высоким уровнем цензуры.
-
+
+ IKEv2/IPsec - Modern stable protocol, a bit faster than others, restores connection after signal loss. It has native support on the latest versions of Android and iOS.
+
+
+
+ Create a file vault on your server to securely store and transfer files.Создайте на сервере файловое хранилище для безопасного хранения и передачи файлов.
-
+ This is a combination of the OpenVPN protocol and the Cloak plugin designed specifically for protecting against blocking.
OpenVPN provides a secure VPN connection by encrypting all internet traffic between the client and the server.
@@ -2913,7 +3281,7 @@ Cloak изменяет метаданные пакетов таким образ
* Работает по сетевому протоколу TCP, использует порт 443
-
+ A relatively new popular VPN protocol with a simplified architecture.
WireGuard provides stable VPN connection and high performance on all devices. It uses hard-coded encryption settings. WireGuard compared to OpenVPN has lower latency and better data transfer throughput.
WireGuard is very susceptible to blocking due to its distinct packet signatures. Unlike some other VPN protocols that employ obfuscation techniques, the consistent signature patterns of WireGuard packets can be more easily identified and thus blocked by advanced Deep Packet Inspection (DPI) systems and other network monitoring tools.
@@ -2934,7 +3302,15 @@ WireGuard очень уязвим для блокировки из-за хара
* Работает по сетевому протоколу UDP
-
+
+ The REALITY protocol, a pioneering development by the creators of XRay, is specifically designed to counteract the highest levels of internet censorship through its novel approach to evasion.
+It uniquely identifies censors during the TLS handshake phase, seamlessly operating as a proxy for legitimate clients while diverting censors to genuine websites like google.com, thus presenting an authentic TLS certificate and data.
+This advanced capability differentiates REALITY from similar technologies by its ability to disguise web traffic as coming from random, legitimate sites without the need for specific configurations.
+Unlike older protocols such as VMess, VLESS, and the XTLS-Vision transport, REALITY's innovative "friend or foe" recognition at the TLS handshake enhances security and circumvents detection by sophisticated DPI systems employing active probing techniques. This makes REALITY a robust solution for maintaining internet freedom in environments with stringent censorship.
+
+
+
+ IKEv2, paired with the IPSec encryption layer, stands as a modern and stable VPN protocol.
One of its distinguishing features is its ability to swiftly switch between networks and devices, making it particularly adaptive in dynamic network environments.
While it offers a blend of security, stability, and speed, it's essential to note that IKEv2 can be easily detected and is susceptible to blocking.
@@ -2955,63 +3331,62 @@ While it offers a blend of security, stability, and speed, it's essential t
* Работает по сетевому протоколу UDP, использует порты 500 и 4500
-
+ DNS ServiceСервис DNS
-
+ SFTP file sharing serviceSFTP-сервис для обмена файлами
-
-
+
+ Website in Tor networkВеб-сайт в сети Tor
-
+ AmneziaDNSAmneziaDNS
-
+ OpenVPN is the most popular VPN protocol, with flexible configuration options. It uses its own security protocol with SSL/TLS for key exchange.OpenVPN — популярный VPN-протокол с гибкой настройкой. Имеет собственный протокол безопасности с SSL/TLS для обмена ключами.
-
+ WireGuard - New popular VPN protocol with high performance, high speed and low power consumption. Recommended for regions with low levels of censorship.WireGuard — популярный VPN-протокол с высокой производительностью, высокой скоростью и низким энергопотреблением. Рекомендуется для регионов с низким уровнем цензуры.
-
+ AmneziaWG - Special protocol from Amnezia, based on WireGuard. It's fast like WireGuard, but very resistant to blockages. Recommended for regions with high levels of censorship.AmneziaWG — специальный протокол от Amnezia, основанный на протоколе WireGuard. Он такой же быстрый, как WireGuard, но очень устойчив к блокировкам. Рекомендуется для регионов с высоким уровнем цензуры.
-
+ XRay with REALITY - Suitable for countries with the highest level of internet censorship. Traffic masking as web traffic at the TLS level, and protection against detection by active probing methods.XRay with REALITY подойдет для стран с самым высоким уровнем цензуры. Маскировка трафика под веб-трафик на уровне TLS и защита от обнаружения методами активного зондирования.
- IKEv2/IPsec - Modern stable protocol, a bit faster than others, restores connection after signal loss.
- IKEv2/IPsec — современный стабильный протокол, немного быстрее других, восстанавливает соединение после потери сигнала.
+ IKEv2/IPsec — современный стабильный протокол, немного быстрее других, восстанавливает соединение после потери сигнала.
-
+ Deploy a WordPress site on the Tor network in two clicks.Разверните сайт на WordPress в сети Tor в два клика.
-
+ Replace the current DNS server with your own. This will increase your privacy level.Замените текущий DNS-сервер на свой собственный. Это повысит уровень вашей конфиденциальности.
-
+ OpenVPN stands as one of the most popular and time-tested VPN protocols available.
It employs its unique security protocol, leveraging the strength of SSL/TLS for encryption and key exchange. Furthermore, OpenVPN's support for a multitude of authentication methods makes it versatile and adaptable, catering to a wide range of devices and operating systems. Due to its open-source nature, OpenVPN benefits from extensive scrutiny by the global community, which continually reinforces its security. With a strong balance of performance, security, and compatibility, OpenVPN remains a top choice for privacy-conscious individuals and businesses alike.
@@ -3030,7 +3405,7 @@ It employs its unique security protocol, leveraging the strength of SSL/TLS for
* Может работать по сетевым протоколам TCP и UDP
-
+ Shadowsocks, inspired by the SOCKS5 protocol, safeguards the connection using the AEAD cipher. Although Shadowsocks is designed to be discreet and challenging to identify, it isn't identical to a standard HTTPS connection.However, certain traffic analysis systems might still detect a Shadowsocks connection. Due to limited support in Amnezia, it's recommended to use AmneziaWG protocol.
* Available in the AmneziaVPN only on desktop platforms
@@ -3045,18 +3420,17 @@ It employs its unique security protocol, leveraging the strength of SSL/TLS for
* Работает по сетевому протоколу TCP
- The REALITY protocol, a pioneering development by the creators of XRay, is specifically designed to counteract the highest levels of internet censorship through its novel approach to evasion.
It uniquely identifies censors during the TLS handshake phase, seamlessly operating as a proxy for legitimate clients while diverting censors to genuine websites like google.com, thus presenting an authentic TLS certificate and data.
This advanced capability differentiates REALITY from similar technologies by its ability to disguise web traffic as coming from random, legitimate sites without the need for specific configurations.
Unlike older protocols such as VMess, VLESS, and the XTLS-Vision transport, REALITY's innovative "friend or foe" recognition at the TLS handshake enhances security and circumvents detection by sophisticated DPI systems employing active probing techniques. This makes REALITY a robust solution for maintaining internet freedom in environments with stringent censorship.
- Протокол REALITY, новаторская разработка создателей XRay, специально спроектирован для противодействия самой строгой цензуре с помощью нового способа обхода блокировок.
+ Протокол REALITY, новаторская разработка создателей XRay, специально спроектирован для противодействия самой строгой цензуре с помощью нового способа обхода блокировок.
Он уникальным образом идентифицирует цензоров на этапе TLS-рукопожатия, беспрепятственно работая в качестве прокси для реальных клиентов и перенаправляя цензоров на реальные сайты, такие как google.com, тем самым предъявляя подлинный TLS-сертификат и данные.
REALITY отличается от аналогичных технологий благодаря способности без специальной настройки маскировать веб-трафик так, как будто он поступает со случайных легитимных сайтов.
В отличие от более старых протоколов, таких как VMess, VLESS и XTLS-Vision, технология распознавания "друг или враг" на этапе TLS-рукопожатия повышает безопасность и обходит обнаружение сложными системами DPI-анализа, которые используют методы активного зондирования. Это делает REALITY эффективным решением для поддержания свободы интернета в регионах с жесткой цензурой.
-
+ After installation, Amnezia will create a
file storage on your server. You will be able to access it using
@@ -3133,7 +3507,7 @@ WireGuard очень восприимчив к блокированию из-з
* Работает по сетевому протоколу UDP.
-
+ A modern iteration of the popular VPN protocol, AmneziaWG builds upon the foundation set by WireGuard, retaining its simplified architecture and high-performance capabilities across devices.
While WireGuard is known for its efficiency, it had issues with being easily detected due to its distinct packet signatures. AmneziaWG solves this problem by using better obfuscation methods, making its traffic blend in with regular internet traffic.
This means that AmneziaWG keeps the fast performance of the original while adding an extra layer of stealth, making it a great choice for those wanting a fast and discreet VPN connection.
@@ -3162,9 +3536,8 @@ This means that AmneziaWG keeps the fast performance of the original while addin
Файловое хранилище для безопасного хранения данных
- Sftp service
- SFTP-сервис
+ SFTP-сервис
@@ -3217,6 +3590,7 @@ This means that AmneziaWG keeps the fast performance of the original while addin
Нет совпадений
+ Unknown errorНеизвестная ошибка
@@ -3226,11 +3600,154 @@ This means that AmneziaWG keeps the fast performance of the original while addin
error 0x%1: %2Ошибка 0x%1: %2
+
+
+ SFTP service
+
+
+
+
+
+
+ SOCKS5 proxy server
+
+
+
+
+ vmess:// url is invalid
+
+
+
+
+ Invalid streamSettings protocol:
+
+
+
+
+ Unknown transport method:
+
+
+
+
+ VMess string should start with 'vmess://'
+
+
+
+
+ VMess string should be a valid base64 string
+
+
+
+
+ JSON should not be empty
+
+
+
+
+ VLESS link should start with vless://
+
+
+
+
+ link parse failed: %1
+
+
+
+
+ empty host
+
+
+
+
+ missing port
+
+
+
+
+ missing uuid
+
+
+
+
+ Invalid ssd link: json: field %1 must exist
+
+
+
+
+ Invalid ssd link: json: field %1 must be valid port number
+
+
+
+
+ Invalid ssd link: json: field %1 must be of type 'string'
+
+
+
+
+ Invalid ssd link: json: field %1 must be an array
+
+
+
+
+ Skipping invalid ssd server: server must be an object
+
+
+
+
+ Skipping invalid ssd server: missing required field %1
+
+
+
+
+ Skipping invalid ssd server: field %1 should be of type 'string'
+
+
+
+
+ Invalid ssd link: should begin with ssd://
+
+
+
+
+ Invalid ssd link: base64 parse failed
+
+
+
+
+ Invalid ssd link: json parse failed
+
+
+
+
+ Invalid ssd link: rc4-md5 encryption is not supported by v2ray-core
+
+
+
+
+ SS URI is too short
+
+
+
+
+
+ Can't find the colon separator between method and password
+
+
+
+
+ Can't find the at separator between password and hostname
+
+
+
+
+ Can't find the colon separator between hostname and port
+
+ SelectLanguageDrawer
-
+ Choose languageВыберите язык
@@ -3252,17 +3769,16 @@ This means that AmneziaWG keeps the fast performance of the original while addin
SettingsController
-
+ All settings have been reset to default valuesВсе настройки сброшены до значений по умолчанию
- Cached profiles cleared
- Закэшированные профили очищены
+ Закэшированные профили очищены
-
+ Backup file is corruptedФайл резервной копии поврежден
@@ -3286,23 +3802,23 @@ This means that AmneziaWG keeps the fast performance of the original while addin
Скопировать
-
-
+
+ CopiedСкопировано
-
+ Copy config stringСкопировать строку конфигурации
-
+ Show connection settingsПоказать настройки подключения
-
+ To read the QR code in the Amnezia app, select "Add server" → "I have data to connect" → "QR code, key or settings file"Для считывания QR-кода в приложении Amnezia выберите "Добавить сервер" → "У меня есть данные для подключения" → "Открыть файл конфигурации, ключ или QR-код"
@@ -3386,7 +3902,7 @@ This means that AmneziaWG keeps the fast performance of the original while addin
TextFieldWithHeaderType
-
+ The field can't be emptyПоле не может быть пустым
@@ -3394,7 +3910,7 @@ This means that AmneziaWG keeps the fast performance of the original while addin
VpnConnection
-
+ MbpsМбит/с
@@ -3402,42 +3918,42 @@ This means that AmneziaWG keeps the fast performance of the original while addin
VpnProtocol
-
+ UnknownНеизвестный
-
+ DisconnectedОтключено
-
+ PreparingПодготовка
-
+ Connecting...Подключение...
-
+ ConnectedПодключено
-
+ Disconnecting...Отключение...
-
+ Reconnecting...Переподключение...
-
+ ErrorОшибка
@@ -3445,38 +3961,32 @@ This means that AmneziaWG keeps the fast performance of the original while addin
amnezia::ContainerProps
-
+ LowНизкий
-
+ HighВысокий
- Extreme
- Экстремальный
+ Экстремальный
-
+ I just want to increase the level of my privacy.Я просто хочу повысить уровень своей приватности.
-
+ I want to bypass censorship. This option recommended in most cases.Я хочу обойти блокировки. Этот вариант рекомендуется в большинстве случаев.
- Most VPN protocols are blocked. Recommended if other options are not working.
- Большинство VPN-протоколов заблокированы. Рекомендуется, если другие варианты не работают.
-
-
- High
- Высокий
+ Большинство VPN-протоколов заблокированы. Рекомендуется, если другие варианты не работают.Medium
@@ -3498,12 +4008,12 @@ This means that AmneziaWG keeps the fast performance of the original while addin
main2
-
+ Private key passphraseПарольная фраза для закрытого ключа
-
+ SaveСохранить
diff --git a/client/translations/amneziavpn_uk_UA.ts b/client/translations/amneziavpn_uk_UA.ts
index f968793a..491b018a 100644
--- a/client/translations/amneziavpn_uk_UA.ts
+++ b/client/translations/amneziavpn_uk_UA.ts
@@ -37,12 +37,12 @@
-
+ The selected applications have been added
-
+ Application removed: %1
@@ -58,57 +58,62 @@
ConnectionController
-
+ VPN Protocols is not installed.
Please install VPN container at firstVPN протоколи не встановлено.
Будь-ласка, встановіть VPN контейнер
-
+ unable to create configuration
-
+ Connecting...Підключення...
-
+ ConnectedПідключено
-
+ Preparing...
-
+ Settings updated successfully, reconnnection...Налаштування оновлено, підключення...
-
+ Settings updated successfullyНалаштування оновлено.
-
+
+ The selected protocol is not supported on the current platform
+ Вибраний протокол не підтримується на цьому пристрої
+
+
+ Reconnecting...Перепідключення...
-
-
-
-
+
+
+
+ ConnectПідключитись
-
+ Disconnecting...Відключаємось...
@@ -116,17 +121,17 @@
ConnectionTypeSelectionDrawer
-
+ Add new connectionДодати нове з'єднання
-
+ Configure your serverНалаштувати свій сервер
-
+ Open config file, key or QR codeВідкрити файл конфігурації, ключ або QR код
@@ -157,7 +162,7 @@
ExportController
-
+ Access error!Помилка доступу!
@@ -165,14 +170,13 @@
HomeContainersListView
-
+ Unable change protocol while there is an active connectionНеможливо змінити протокол при активному підключенні
- The selected protocol is not supported on the current platform
- Вибраний протокол не підтримується на цьому пристрої
+ Вибраний протокол не підтримується на цьому пристроїReconnect via VPN Procotol:
@@ -182,46 +186,46 @@
HomeSplitTunnelingDrawer
-
+ Split tunnelingРоздільне тунелювання
-
+ Allows you to connect to some sites or applications through a VPN connection and bypass othersДозволяє підключатись до одних сайтів та застосунків через захищене з'єднання, а іншим в обхід нього
-
+ Split tunneling on the serverРоздільне тунелювання на сервері
-
+ Enabled
Can't be disabled for current serverУвімкнено.
Не може бути вимкнено для даного сервера.
-
+ Site-based split tunnelingРоздільне тунелювання по сайтам
-
-
+
+ EnabledУвімкнено
-
-
+
+ DisabledВимкнено
-
+ App-based split tunnelingРоздільне тунелювання застосунків
@@ -229,84 +233,89 @@ Can't be disabled for current server
ImportController
-
+ Unable to open file
-
-
+
+ Invalid configuration file
-
+ Scanned %1 of %2.Відскановано %1 з %2.
+
+
+ In the imported configuration, potentially dangerous lines were found:
+
+ InstallController
-
+ %1 installed successfully. %1 встановлено.
-
+ %1 is already installed on the server. %1 вже встановлено на сервері.
-
+
Added containers that were already installed on the serverДодані сервіси і протоколи, які були раніше встановлені на сервері
-
+
Already installed containers were found on the server. All installed containers have been added to the application
На сервері знайдені сервіси та протоколи, всі вони додані в застосунок
-
+ Settings updated successfullyНалаштування оновлено
-
+ Server '%1' was rebootedСервер '%1' перезавантажено
-
+ Server '%1' was removedСервер '%1' був видалений
-
+ All containers from server '%1' have been removedВсі сервіси та протоколи були видалені з сервера '%1'
-
+ %1 has been removed from the server '%2'%1 був видалений з сервера '%2'
-
+ %1 cached profile cleared
-
+ Please login as the userБуль-ласка, увійдіть в систему від імені користувача
-
+ Server added successfullyСервер додано
@@ -314,12 +323,17 @@ Already installed containers were found on the server. All installed containers
InstalledAppsDrawer
-
+ Choose application
-
+
+ application name
+
+
+
+ Add selected
@@ -345,28 +359,28 @@ Already installed containers were found on the server. All installed containers
NotificationHandler
-
-
+
+ AmneziaVPNAmneziaVPN
-
+ VPN ConnectedVPN Підключено
-
+ VPN DisconnectedVPN Вимкнено
-
+ AmneziaVPN notificationСповіщення AmneziaVPN
-
+ Unsecured network detected: Знайдена не захищена мережа:
@@ -387,32 +401,32 @@ Already installed containers were found on the server. All installed containers
PageHome
-
+ Logging enabled
-
+ Split tunneling enabledРоздільне тунелювання увімкнено
-
+ Split tunneling disabledРоздільне тунелювання вимкнено
-
+ VPN protocolVPN протокол
-
+ ServersСервери
-
+ Unable change server while there is an active connectionНе можна змінити сервер при активному підключенні
@@ -420,35 +434,50 @@ Already installed containers were found on the server. All installed containers
PageProtocolAwgSettings
-
+ AmneziaWG settingsналаштування AmneziaWG
-
+ PortПорт
-
+ MTU
-
+ SaveЗберегти
-
+
+ The values of the H1-H4 fields must be unique
+
+
+
+
+ The value of the field S1 + message initiation size (148) must not equal S2 + message response size (92)
+
+
+
+ Save settings?
-
+ All users with whom you shared a connection with will no longer be able to connect to it.
+
+
+ Unable change settings while there is an active connection
+
+ Remove AmneziaWGВидалити AmneziaWG
@@ -466,12 +495,12 @@ Already installed containers were found on the server. All installed containers
Користувачі, з якими ви поділились цим протоколм, більше не зможуть до нього підключитись.
-
+ ContinueПродовжити
-
+ CancelВідмінити
@@ -483,31 +512,36 @@ Already installed containers were found on the server. All installed containers
PageProtocolCloakSettings
-
+ Cloak settingsНалаштування Cloak
-
+ Disguised as traffic fromЗамаскувати трафік під
-
+ PortПорт
-
-
+
+ CipherШифрування
-
+ SaveЗберегти
+
+
+ Unable change settings while there is an active connection
+
+ Save and Restart AmneziaЗберегти і перезавантажити Amnezia
@@ -516,7 +550,7 @@ Already installed containers were found on the server. All installed containers