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.AmneziaVPN CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -24,23 +24,10 @@ ${MACOSX_BUNDLE_BUNDLE_VERSION} NSHumanReadableCopyright ${MACOSX_BUNDLE_COPYRIGHT} + LSApplicationCategoryType + public.app-category.utilities ITSAppUsesNonExemptEncryption - LSRequiresIPhoneOS - - LSSupportsOpeningDocumentsInPlace - - UILaunchStoryboardName - AmneziaVPNLaunchScreen - UIRequiredDeviceCapabilities - - UIRequiresFullScreen - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationPortrait - UISupportedInterfaceOrientations~ipad UIUserInterfaceStyle 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.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)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-extension 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.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 @@ CFBundleDevelopmentRegion en CFBundleExecutable - ${MACOSX_BUNDLE_EXECUTABLE_NAME} + AmneziaVPNNetworkExtension CFBundleIdentifier - ${MACOSX_BUNDLE_GUI_IDENTIFIER} + ${BUILD_IOS_APP_IDENTIFIER}.network-extension CFBundleInfoDictionaryVersion 6.0 CFBundleName - ${MACOSX_BUNDLE_BUNDLE_NAME} + AmneziaVPNNetworkExtension CFBundlePackageType $(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} + AmneziaVPNNetworkExtension NSExtension @@ -38,9 +38,9 @@ com.wireguard.ios.app_group_id - group.${BUILD_IOS_APP_IDENTIFIER} + group.org.amnezia.AmneziaVPN com.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-extension 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 - - + X7UJ388FXK com.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 + en CFBundleExecutable - $(EXECUTABLE_NAME) + AmneziaVPNNetworkExtension + CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) + ${BUILD_IOS_APP_IDENTIFIER}.network-extension CFBundleInfoDictionaryVersion 6.0 CFBundleName - $(PRODUCT_NAME) + AmneziaVPNNetworkExtension CFBundlePackageType $(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 + NSExtension NSExtensionPointIdentifier @@ -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 - - + + AmneziaVPN AmneziaVPN - + 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 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 - + 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 auth TLS مصادقة - + 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 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 + + + 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 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. عند تكوين 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 لل مراجعات والابلاغات عن المشاكل - + GitHub GitHub - + 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 installed AmneziaVPN ليس مٌستخدم او مٌثبت - + 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 protocol VPN بروتوكول - + 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 app AmneziaVPN من اجل تطبيق - + 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 missing OpenVPN تكوين مفقود - + + Background service is not running + + + + + Server error: Packet manager error + + + + SCP error: Generic failure - + OpenVPN management server error OpenVPN خطأ في إدارة الخادم - + OpenVPN executable missing OpenVPN executable مفقود - + Shadowsocks (ss-local) executable missing Shadowsocks (ss-local) executable مفقود - + Cloak (ck-client) executable missing Cloak (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 addresses VPN 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 - + AmneziaDNS AmneziaDNS - + 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 - - + + AmneziaVPN AmneziaVPN - + 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 هش - + SHA512 SHA512 - + SHA384 SHA384 - + SHA256 SHA256 - + SHA3-512 SHA3-512 - + SHA3-384 SHA3-384 - + SHA3-256 SHA3-256 - + whirlpool whirlpool - + BLAKE2b512 BLAKE2b512 - + BLAKE2s256 BLAKE2s256 - + SHA1 SHA1 - - + + Cipher رمزگذاری - + AES-256-GCM AES-256-GCM - + AES-192-GCM AES-192-GCM - + AES-128-GCM AES-128-GCM - + AES-256-CBC AES-256-CBC - + AES-192-CBC AES-192-CBC - + AES-128-CBC AES-128-CBC - + ChaCha20-Poly1305 ChaCha20-Poly1305 - + ARIA-256-CBC ARIA-256-CBC - + CAMELLIA-256-CBC CAMELLIA-256-CBC - + none none - + 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_en https://t.me/amnezia_vpn - + Mail ایمیل - + For reviews and bug reports برای ارائه نظرات و گزارشات باگ - + GitHub GitHub - + https://github.com/amnezia-vpn/amnezia-client https://github.com/amnezia-vpn/amnezia-client - + Website وب سایت - + https://amnezia.org 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 شروع خودکار - + 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 DNS DNS اصلی - + Secondary DNS DNS ثانویه - + 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 code QR-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 error Unknown error @@ -2485,62 +2839,62 @@ It's okay as long as it's from someone you trust. Function not implemented - + Server check failed Server check failed - + Server port already used. Check for another software Server port already used. Check for another software - + Server error: Docker container missing Server error: Docker container missing - + Server error: Docker failed Server error: Docker failed - + Installation canceled by user Installation canceled by user - + The user does not have permission to use sudo The user does not have permission to use sudo - + SSH request was denied SSH request was denied - + SSH request was interrupted SSH request was interrupted - + SSH internal error SSH internal error - + Invalid private key or invalid passphrase entered Invalid private key or invalid passphrase entered - + The selected private key format is not supported, use openssh ED25519 key types or PEM key types The selected private key format is not supported, use openssh ED25519 key types or PEM key types - + Timeout connecting to server Timeout 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 missing OpenVPN config missing - + + Background service is not running + + + + + Server error: Packet manager error + + + + SCP error: Generic failure - + OpenVPN management server error OpenVPN management server error - + OpenVPN executable missing OpenVPN executable missing - + Shadowsocks (ss-local) executable missing Shadowsocks (ss-local) executable missing - + Cloak (ck-client) executable missing Cloak (ck-client) executable missing - + Amnezia helper service error Amnezia helper service error - + OpenSSL failed OpenSSL failed - + Can't connect: another VPN connection is active Can't connect: another VPN connection is active - + Can't setup OpenVPN TAP network adapter Can't setup OpenVPN TAP network adapter - + VPN pool error: no available addresses VPN 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 error Internal error - + IPsec IPsec - + 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 - + AmneziaDNS AmneziaDNS - + 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 match No match - - - Unknown error - Unknown error - error 0x%1: %2 error 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 - + Mbps Mbps @@ -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 - - + + AmneziaVPN AmneziaVPN - + VPN Connected कनेक्ट - + VPN Disconnected कनेक्ट - + AmneziaVPN notification AmneziaVPN अधिसूचना - + 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 protocol VPN प्रोटोकॉल - + 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 app AmneziaVPN ऐप के लिए - OpenVpn native format - OpenVpn मूल स्वरूप + OpenVpn मूल स्वरूप - + WireGuard native format वायरगार्ड मूल प्रारूप - + AmneziaWG native format AmneziaWG मूल प्रारूप - + Shadowsocks native format शैडोसॉक्स मूल प्रारूप - + Cloak native format लबादा देशी स्वरूप - + 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 उपयोगकर्ताओं - + 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 deleted 14 दिनों के बाद लॉगिंग अक्षम कर दी गई, लॉग फ़ाइलें हटा दी गईं @@ -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 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 चयनित निजी कुंजी प्रारूप समर्थित नहीं है, ओपनश ED25519 कुंजी प्रकार या PEM कुंजी प्रकार का उपयोग करें - + Timeout connecting to server सर्वर से कनेक्ट होने का समय समाप्त - + VPN connection error VPN कनेक्शन त्रुटि - + 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 missing OpenVPN प्रबंधन सर्वर त्रुटि - + SCP error: Generic failure एससीपी त्रुटि: सामान्य विफलता - + OpenVPN management server error OpenVPN प्रबंधन सर्वर त्रुटि - + OpenVPN executable missing OpenVPN निष्पादन योग्य गायब है - + Shadowsocks (ss-local) executable missing शैडोसॉक्स (एसएस-स्थानीय) निष्पादन योग्य गायब है - + Cloak (ck-client) executable missing क्लोक (सीके-क्लाइंट) निष्पादन योग्य गायब है - + Amnezia helper service error Amnezia भूलने की बीमारी सहायक सेवा त्रुटि - + OpenSSL failed ओपनएसएसएल विफल रहा - + Can't connect: another VPN connection is active कनेक्ट नहीं हो सकता: कोई अन्य वीपीएन कनेक्शन सक्रिय है - + Can't setup OpenVPN TAP network adapter OpenVPN TAP नेटवर्क एडाप्टर सेटअप नहीं कर सकता - + VPN pool error: no available addresses VPN pool error: لا يوجد عنواين مٌتاحة - + The config does not contain any containers and credentials for connecting to the server कॉन्फ़िगरेशन में सर्वर से कनेक्ट करने के लिए कोई कंटेनर और क्रेडेंशियल नहीं है - + QFile error: The file could not be opened Qफ़ाइल त्रुटि: फ़ाइल खोली नहीं जा सकी - + QFile error: An error occurred when reading from the file Qफ़ाइल त्रुटि: फ़ाइल से पढ़ते समय एक त्रुटि उत्पन्न हुई - + QFile error: The file could not be accessed Qफ़ाइल त्रुटि: फ़ाइल तक नहीं पहुंचा जा सका - + QFile error: An unspecified error occurred Qफ़ाइल त्रुटि: एक अनिर्दिष्ट त्रुटि उत्पन्न हुई - + QFile error: A fatal error occurred Qफ़ाइल त्रुटि: एक घातक त्रुटि उत्पन्न हुई - + QFile error: The operation was aborted Qफ़ाइल त्रुटि: ऑपरेशन निरस्त कर दिया गया था - + Internal error आंतरिक त्रुटि - + IPsec - - + + Website in Tor network टोर नेटवर्क में वेबसाइट - + AmneziaDNS AmneziaDNS - + 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. लचीले कॉन्फ़िगरेशन विकल्पों के साथ ओपनवीपीएन सबसे लोकप्रिय वीपीएन प्रोटोकॉल है। यह कुंजी विनिमय के लिए एसएसएल/टीएलएस के साथ अपने स्वयं के सुरक्षा प्रोटोकॉल का उपयोग करता है. - + 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 Service DNS सेवाएँ @@ -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 first VPN ပရိုတိုကောများကို မထည့်သွင်းရသေးပါ။ ကျေးဇူးပြု၍ 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 code config ဖိုင်၊ 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 tunneling Split tunneling - + Allows you to connect to some sites or applications through a VPN connection and bypass others VPN ချိတ်ဆက်မှုကြားခံ၍ အချို့သောဆိုက်များ သို့မဟုတ် အပလီကေးရှင်းများသို့ ချိတ်ဆက်ဖို့ရန်နှင့် အခြားအရာများကို ကျော်ဖြတ်ရန် လုပ်ဆောင်ပေးသည်။ - + 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 tunneling App အခြေပြု 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 - - + + AmneziaVPN AmneziaVPN - + VPN Connected VPN ချိတ်ဆက်ထားပါပြီ - + VPN Disconnected VPN ဖြုတ်လိုက်ပါပြီ - + 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 tunnelling ဖွင့်ထားပါသည်။ - + Split tunneling disabled split tunnelling ပိတ်ထားပါသည်။ - + VPN protocol VPN ပရိုတိုကော - + 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 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 ဖုံးကွယ်အသွင်ယူမှု ဆက်တင်များ - + Disguised as traffic from traffic အဖြစ် အသွင်ယူထားသည် - + Port Port - - + + Cipher စာဝှက် - + Save သိမ်းဆည်းမည် + + + Unable change settings while there is an active connection + + PageProtocolOpenVpnSettings - + OpenVPN settings OpenVPN ဆက်တင်များ - + VPN address subnet VPN လိပ်စာ ကွန်ရက်ခွဲ - + Network protocol ကွန်ယက် ပရိုတိုကော - + Port Port - + Auto-negotiate encryption အလိုအလျောက် ညှိနှိုင်း ကုဒ်ဝှက်ခြင်း - - + + Hash Hash - + SHA512 SHA512 - + SHA384 SHA384 - + SHA256 SHA256 - + SHA3-512 SHA3-512 - + SHA3-384 SHA3-384 - + SHA3-256 SHA3-256 - + whirlpool whirlpool - + BLAKE2b512 BLAKE2b512 - + BLAKE2s256 BLAKE2s256 - + SHA1 SHA1 - - + + Cipher စာဝှက် - + AES-256-GCM AES-256-GCM - + AES-192-GCM AES-192-GCM - + AES-128-GCM AES-128-GCM - + AES-256-CBC AES-256-CBC - + AES-192-CBC AES-192-CBC - + AES-128-CBC AES-128-CBC - + ChaCha20-Poly1305 ChaCha20-Poly1305 - + ARIA-256-CBC ARIA-256-CBC - + CAMELLIA-256-CBC CAMELLIA-256-CBC - + none none - + TLS auth TLS auth - + Block DNS requests outside of VPN VPN ပြင်ပရှိ 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 settings Shadowsocks ဆက်တင်များ - + Port Port - - + + Cipher စာဝှက် - + Save သိမ်းဆည်းမည် + + + Unable change settings while there is an active connection + + PageProtocolWireGuardSettings - + WG settings - + Port 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 + 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 settings SFTP ဆက်တင်များ - + Host Host - - - - + + + + Copied ကူးယူပြီးပါပြီ - + Port Port - + 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 there SFTP ဖယ်ရှားပါ - + 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 settings Tor ဝဘ်ဆိုက်ဆက်တင်များ - + 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 အပလီကေးရှင်း - + Backup backup ယူမည် - + About AmneziaVPN AmneziaVPN အကြောင်း - + 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 သည် အခမဲ့ဖြစ်ပြီး open-source application တစ်ခုဖြစ်သည်။ သင်နှစ်သက်ပါက developer များကို ပံ့ပိုးနိုင်ပါသည်။ - + Contacts ဆက်သွယ်ရန်လိပ်စာများ - + Telegram group Telegram ဂရု - + To discuss features feature များကိုဆွေးနွေးရန် - + https://t.me/amnezia_vpn_en https://t.me/amnezia_vpn - + Mail မေးလ် - + For reviews and bug reports သုံးသပ်ချက်များနှင့် ချွတ်ယွင်းချက်အစီရင်ခံစာများအတွက် - + GitHub GitHub - + https://github.com/amnezia-vpn/amnezia-client https://github.com/amnezia-vpn/amnezia-client - + Website ဝဘ်ဆိုက် - + https://amnezia.org https://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 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 ဝက်ဆိုဒ်အခြေပြု split tunneling - + Allows you to select which sites you want to access through the VPN VPN မှတဆင့် သင်ဝင်ရောက်လိုသည့်ဆိုဒ်များကို ရွေးချယ်စေနိုင်သည် - + App-based split tunneling App အခြေပြု 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 servers DNS ဆာဗာများ - + If AmneziaDNS is not used or installed AmneziaDNS ကို အသုံးမပြု သို့မဟုတ် ထည့်သွင်းခြင်းမပြုသည့်အခါ - + Primary DNS Primary DNS - + Secondary DNS Secondary 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 config API 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 tunneling Split tunneling - + Mode Mode - + 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 file config ဖိုင်ကိုဖွင့်မည် - + QR code QR-ကုဒ် - + Key as text Key ကိုစာသားအဖြစ် @@ -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:22 255.255.255.255:22 - + SSH Username SSH အသုံးပြုသူအမည် - + 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 empty IP လိပ်စာသည် ဗလာမဖြစ်ရပါ - + 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 protocol VPN ပရိုတိုကောကို ရွေးပါ။ - + 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 ကွန်ရက်ပရိုတိုကော - + Port Port - + Install ထည်သွင်းမည် + + + The port must be in the range of 1 to 65535 + + PageSetupWizardProtocols - + VPN protocol VPN ပရိုတိုကော - + 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-guide https://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://... ဖြင့် စတင်သော စာကြောင်း... - + Key Key - + 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 format OpenVPN မူရင်းဖောမတ် - + WireGuard native format WireGuard မူရင်းဖော်မတ် - + Connection ချိတ်ဆက်မှု - - + + Server ဆာဗာ - + Config revoked Config ကိုပြန်ရုပ်သိမ်းလိုက်ပါပြီ - + Connection to ဤဆာဗာသို့ချိတ်ဆက်မှု - + File with connection settings to ဤဆာဗာနှင့်ချိတ်ဆက်မှု ဆက်တင်များပါရှိသော ဖိုင် - + Save OpenVPN config OpenVPN config ကိုသိမ်းဆည်းမည် - + Save WireGuard config WireGuard config ကိုသိမ်းဆည်းမည် - + Save AmneziaWG config AmneziaWG config ကိုသိမ်းဆည်းမည် - + Save Shadowsocks config Shadowsocks config ကိုသိမ်းဆည်းမည် - + Save Cloak config Cloak config ကိုသိမ်းဆည်းမည် - + + 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 အတွက် 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 denied SSH တောင်းဆိုမှု ငြင်းဆိုခံလိုက်ရပါသည် - + SSH request was interrupted SSH တောင်းဆိုမှု အနှောက်အယက်ခံလိုက်ရပါသည် - + 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 server Config တွင် ဆာဗာသို့ချိတ်ဆက်ရန်အတွက် ကွန်တိန်နာများနှင့် အထောက်အထားများ မပါဝင်ပါ - + Error when retrieving configuration from API API မှ စီစဉ်သတ်မှတ်မှုကို ရယူသည့်အခါ အမှားအယွင်းဖြစ်ပေါ်နေသည် - + This config has already been added to the application ဤ config ကို အပလီကေးရှင်းထဲသို့ ထည့်သွင်းပြီးဖြစ်သည် - + ErrorCode: %1. မှားယွင်းမှုကုတ်: %1. - + OpenVPN config missing OpenVPN config ပျောက်ဆုံးနေပါသည် - + + Background service is not running + + + + + Server error: Packet manager error + + + + SCP error: Generic failure - + OpenVPN management server error OpenVPN စီမံခန့်ခွဲမှုဆာဗာ အမှားအယွင်း - + OpenVPN executable missing OpenVPN စီမံလုပ်ဆောင်နိုင်မှု ပျောက်ဆုံးနေပါသည် - + Shadowsocks (ss-local) executable missing Shadowsocks (ss-local) executable ပျောက်နေပါသည် - + Cloak (ck-client) executable missing Cloak (ck-client) စီမံလုပ်ဆောင်နိုင်မှု ပျောက်ဆုံးနေပါသည် - + Amnezia helper service error Amnezia helper ဝန်ဆောင်မှု မှားယွင်းမှု - + OpenSSL failed OpenSSL မအောင်မြင်ပါ - + Can't connect: another VPN connection is active ချိတ်ဆက်၍မရပါ: အခြား VPN ချိတ်ဆက်မှုတစ်ခုရှိနေပါသည် - + Can't setup OpenVPN TAP network adapter OpenVPN TAP ကွန်ရက် adapter ကို စနစ်တည်ဆောက်၍မရပါ - + VPN pool error: no available addresses VPN pool မှားယွင်းမှု: ရရှိနိုင်သောလိပ်စာများမရှိပါ - + VPN connection error VPN ချိတ်ဆက်မှုမှားယွင်းနေပါသည် - 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 IPsec - + 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 Service DNS ဝန်ဆောင်မှု - + SFTP file sharing service SFTP ဖိုင်မျှဝေခြင်းဆားဗစ် - - + + Website in Tor network Tor ကွန်ရက်ထဲရှိ ဝဘ်ဆိုဒ် - + AmneziaDNS AmneziaDNS - + 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 service SFTP ဝန်ဆောင်မှု + + + + + 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 string 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" 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 - + Mbps Mbps @@ -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 - + Low Low - + High Medium သို့မဟုတ် 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 first 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 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 - - + + AmneziaVPN AmneziaVPN - + VPN Connected VPN подключен - + VPN Disconnected VPN выключен - + 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 VPN протокол - + 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 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. Все пользователи, с которыми вы поделились конфигурацией вашего 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 Хэш - + SHA512 SHA512 - + SHA384 SHA384 - + SHA256 SHA256 - + SHA3-512 SHA3-512 - + SHA3-384 SHA3-384 - + SHA3-256 SHA3-256 - + whirlpool whirlpool - + BLAKE2b512 BLAKE2b512 - + BLAKE2s256 BLAKE2s256 - + SHA1 SHA1 - - + + Cipher Шифрование - + AES-256-GCM AES-256-GCM - + AES-192-GCM AES-192-GCM - + AES-128-GCM AES-128-GCM - + AES-256-CBC AES-256-CBC - + AES-192-CBC AES-192-CBC - + AES-128-CBC AES-128-CBC - + ChaCha20-Poly1305 ChaCha20-Poly1305 - + ARIA-256-CBC ARIA-256-CBC - + CAMELLIA-256-CBC CAMELLIA-256-CBC - + none none - + TLS auth TLS авторизация - + 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 Порт - + MTU MTU - + + 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_en https://t.me/amnezia_vpn - + Mail Почта - + For reviews and bug reports Для отзывов и сообщений об ошибках - + GitHub GitHub - + https://github.com/amnezia-vpn/amnezia-client https://github.com/amnezia-vpn/amnezia-client - + Website Веб-сайт - + https://amnezia.org 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 Разрешить скриншоты приложения - + 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 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 Позволяет выбирать, к каким сайтам подключаться через 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 servers DNS-серверы @@ -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 code QR-код - + 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:22 255.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 protocol VPN-протокол - + 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-guide https://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 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 Тайм-аут подключения к серверу - + 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 Внутренняя ошибка - + IPsec IPsec - + 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 service SFTP-сервис для обмена файлами - - + + Website in Tor network Веб-сайт в сети Tor - + AmneziaDNS AmneziaDNS - + 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 first VPN протоколи не встановлено. Будь-ласка, встановіть 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 - - + + AmneziaVPN AmneziaVPN - + VPN Connected VPN Підключено - + VPN Disconnected VPN Вимкнено - + 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 protocol VPN протокол - + 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 PageProtocolOpenVpnSettings - + OpenVPN settings налаштування OpenVPN @@ -525,168 +559,173 @@ Already installed containers were found on the server. All installed containers Підмережа для VPN - + VPN address subnet - + Network protocol Мережевий притокол - + Port Порт - + Auto-negotiate encryption Автоматично отримувати шифрування - - + + Hash Хеш - + SHA512 SHA512 - + SHA384 SHA384 - + SHA256 SHA256 - + SHA3-512 SHA3-512 - + SHA3-384 SHA3-384 - + SHA3-256 SHA3-256 - + whirlpool whirlpool - + BLAKE2b512 BLAKE2b512 - + BLAKE2s256 BLAKE2s256 - + SHA1 SHA1 - - + + Cipher Шифрування - + AES-256-GCM AES-256-GCM - + AES-192-GCM AES-192-GCM - + AES-128-GCM AES-128-GCM - + AES-256-CBC AES-256-CBC - + AES-192-CBC AES-192-CBC - + AES-128-CBC AES-128-CBC - + ChaCha20-Poly1305 ChaCha20-Poly1305 - + ARIA-256-CBC ARIA-256-CBC - + CAMELLIA-256-CBC CAMELLIA-256-CBC - + none none - + TLS auth TLS авторизація - + Block DNS requests outside of VPN Блокувати DNS запити за межами VPN тунеля - + Additional client configuration commands Додаткові команди конфігурації клієнта - - + + Commands: Команди: - + Additional server configuration commands Додаткові команти конфігурації сервера - + Save Зберегти + + + Unable change settings while there is an active connection + + Remove OpenVPN Видалити OpenVPN @@ -719,32 +758,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. @@ -757,12 +796,12 @@ Already installed containers were found on the server. All installed containers Користувачі, з якими ви поділились цим протоколм, більше не зможуть до нього підключитись. - + Continue Продовжити - + Cancel Відмінити @@ -770,26 +809,31 @@ 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 + + Save and Restart Amnezia Зберегти і перезавантажити @@ -798,43 +842,53 @@ Already installed containers were found on the server. All installed containers PageProtocolWireGuardSettings - + WG settings - + Port Порт - + MTU - + Save Зберегти + + + Unable change settings while there is an active connection + + PageProtocolXraySettings - + XRay settings - + Disguised as traffic from Замаскувати трафік під - + Save Зберегти + + + Unable change settings while there is an active connection + + PageServerContainers @@ -846,65 +900,70 @@ 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 Порт @@ -913,97 +972,167 @@ Already installed containers were found on the server. All installed containers Логін - + 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 в якості домена. @@ -1012,22 +1141,22 @@ Already installed containers were found on the server. All installed containers При налаштуванні WordPress, вкажіть цей Onion в якості домена. - + Remove website Видалити сайт - + The site with all data will be removed from the tor network. Сайт з усіма даними буде видалено з мережі Tor. - + Continue Продовжити - + Cancel Відмінити @@ -1035,37 +1164,37 @@ Already installed containers were found on the server. All installed containers PageSettings - + Settings Налаштування - + Servers Сервери - + Connection Підключення - + Application Застосунок - + Backup Резервне копіювання - + About AmneziaVPN Про AmneziaVPN - + Close application Закрити застосунок @@ -1077,7 +1206,7 @@ Already installed containers were found on the server. All installed containers Підтримайте проект донатом - + Support Amnezia Підтримайте Amnezia @@ -1102,72 +1231,72 @@ 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. - + Contacts Контакти - + Telegram group Група в Telegram - + To discuss features Для дискусій - + https://t.me/amnezia_vpn_en https://t.me/amnezia_vpn - + Mail Пошта - + For reviews and bug reports Для відгуків і повідомлень про помилки - + GitHub GitHub - + https://github.com/amnezia-vpn/amnezia-client https://github.com/amnezia-vpn/amnezia-client - + Website Веб-сайт - + https://amnezia.org https://amnezia.org - + Software version: %1 Версія ПЗ: %1 - + Check for updates Перевірити оновлення - + Privacy Policy @@ -1175,52 +1304,57 @@ Already installed containers were found on the server. All installed containers PageSettingsAppSplitTunneling - + + Cannot change split tunneling settings during active connection + Не можна змінити налаштування роздільного тунелювання при підключеному VPN + + + 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 (*.*) @@ -1228,90 +1362,105 @@ 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 Підключення до 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 @@ -1320,7 +1469,7 @@ Already installed containers were found on the server. All installed containers Резервне копіювання - + Settings restored from backup file Відновлення налаштувань із бекап файлу @@ -1329,76 +1478,81 @@ Already installed containers were found on the server. All installed containers Бекап конфігурація - + 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. - + 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 З'єднання @@ -1411,42 +1565,57 @@ Already installed containers were found on the server. All installed containers Підключення до VPN при старті застосунку - + Use AmneziaDNS Використовувати AmneziaDNS - + If AmneziaDNS is installed on the server Якщо він встановлений на сервері - + 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 Дозволяє доступ до одних сайтів через VPN, а для інших в обхід VPN - + App-based split tunneling Роздільне VPN-тунелювання застосунків @@ -1458,12 +1627,12 @@ Already installed containers were found on the server. All installed containers PageSettingsDns - + Default server does not support custom DNS Сервер за замовчуванням не підтримує користувацький DNS - + DNS servers DNS сервер @@ -1472,52 +1641,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 Зберегти налаштування @@ -1530,67 +1699,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 Видалити логи @@ -1598,7 +1767,7 @@ Already installed containers were found on the server. All installed containers PageSettingsServerData - + All installed containers have been added to the application Всі встановлені протоколи та сервіси були додані в застосунок @@ -1615,7 +1784,7 @@ Already installed containers were found on the server. All installed containers Видалити кеш Amnezia? - + No new installed containers found Нові встановлені протоколи і сервіси не виявлені @@ -1625,82 +1794,102 @@ 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 + + + + Remove server from application - + Do you want to remove the server from application? Ви впевнені, що хочете видалити сервер із застосунку? - + + Cannot remove server during active connection + + + + Clear server from Amnezia software - + Do you want to clear server from Amnezia software? - + 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 + + + + + Cannot reset API config during active connection + + Do you want to clear server Amnezia-installed services? Ви хочете очистити сервер від сервісів Amnezia? - + Reset API config Скинути API конфігурацію - + Do you want to reset API config? Ви хочете скинути API конфігурацію @@ -1713,7 +1902,7 @@ Already installed containers were found on the server. All installed containers Видалити сервер із застосунку? - + All installed AmneziaVPN services will still remain on the server. Всі встановлені сервіси та протоколи Amnezia все ще залишаться на сервері. @@ -1733,27 +1922,27 @@ Already installed containers were found on the server. All installed containers PageSettingsServerInfo - + Server name Імя сервера - + Save Зберегти - + Protocols Протоколи - + Services Сервіси - + Management @@ -1765,37 +1954,47 @@ 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 + + + + + Cannot remove active container + + - + - + Remove Видалити - + Remove %1 from server? Видалити %1 з сервера? - + All users with whom you shared a connection will no longer be able to connect to it. Користувачі, з якими ви поділились цим протоколм, більше не зможуть до нього підключитись. @@ -1804,14 +2003,14 @@ Already installed containers were found on the server. All installed containers Користувачі, з якими ви поділились цим протоколм, більше не зможуть до нього підключитись. - - + + Continue Продовжити - - + + Cancel Відмінити @@ -1819,7 +2018,7 @@ Already installed containers were found on the server. All installed containers PageSettingsServersList - + Servers Сервери @@ -1831,32 +2030,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 Роздільне VPN-тунелювання - + Mode Режим - + Remove Видалити - + Continue Продовжити - + Cancel Відмінити @@ -1865,70 +2064,70 @@ 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 Не можна змінити налаштування роздільного тунелювання при підключеному VPN - + Default server does not support split tunneling function - + website or IP вебсайт або IP - + 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 Додати імпортовані сайти до існуючих @@ -1936,7 +2135,7 @@ Already installed containers were found on the server. All installed containers PageSetupWizardConfigSource - + Server connection Підключення до сервера @@ -1949,37 +2148,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 code QR-код - + Key as text Ключ у вигляді тексту @@ -1991,7 +2190,7 @@ It's okay as long as it's from someone you trust. Підключення до сервера - + Server IP address [:port] Server IP address [:port] @@ -2004,7 +2203,7 @@ It's okay as long as it's from someone you trust. Password / SSH private key - + Continue Продовжити @@ -2015,7 +2214,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 @@ -2024,42 +2223,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:22 - + SSH Username - + Password or 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 empty Поле IP address не може бути пустим - + Login cannot be empty Поле Login не може бути пустим - + Password/private key cannot be empty Поле Password/Private key не може бути пустим @@ -2067,17 +2266,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 - + Skip setup @@ -2090,7 +2289,7 @@ and will not be shared or disclosed to the Amnezia or any third parties Вибрати VPN-протокол - + Continue Продовжити @@ -2102,7 +2301,7 @@ and will not be shared or disclosed to the Amnezia or any third parties PageSetupWizardInstalling - + The server has already been added to the application Сервер уже додано в застосунок @@ -2115,33 +2314,33 @@ and will not be shared or disclosed to the Amnezia or any third parties зайнятий встановленням інших протоколів та сервісів. Встановлення Amnezia - + 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 хвилин @@ -2149,45 +2348,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 protocol VPN протокол - + 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-проксі, TOR-сайт и SFTP. @@ -2195,7 +2399,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-код і утримуйте її протягом декількох секунд. @@ -2203,32 +2407,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. Простий і безкоштовний застосунок для запуска self-hosted 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 @@ -2236,27 +2440,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 Продовжити @@ -2264,7 +2468,7 @@ and will not be shared or disclosed to the Amnezia or any third parties PageSetupWizardViewConfig - + New connection Нове підключення @@ -2277,22 +2481,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 Підключитись @@ -2300,12 +2509,12 @@ and will not be shared or disclosed to the Amnezia or any third parties PageShare - + OpenVPN native format OpenVPN нативний формат - + WireGuard native format WireGuard нативний формат @@ -2314,7 +2523,7 @@ and will not be shared or disclosed to the Amnezia or any third parties VPN-Доступ - + Connection З'єднання @@ -2327,8 +2536,8 @@ and will not be shared or disclosed to the Amnezia or any third parties Доступ до керування сервером. Користувач, з яким ви ділитесь повним доступом до підключення, зможе додавати та видаляти протоколи і служби на сервері, а також змінювати налаштування. - - + + Server Сервер @@ -2382,103 +2591,122 @@ and will not be shared or disclosed to the Amnezia or any third parties - + 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 Відмінити @@ -2487,25 +2715,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 Поділитись @@ -2513,49 +2741,49 @@ 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 Файл з налаштуванням доступу до @@ -2563,7 +2791,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 @@ -2571,7 +2799,7 @@ and will not be shared or disclosed to the Amnezia or any third parties PopupType - + Close Закрити @@ -2820,6 +3048,7 @@ and will not be shared or disclosed to the Amnezia or any third parties + Unknown error Unknown error @@ -2829,72 +3058,77 @@ and will not be shared or disclosed to the Amnezia or any third parties Function not implemented - + + Background service is not running + + + + Server check failed Server check failed - + Server port already used. Check for another software Server port already used. Check for another software - + Server error: Docker container missing Server error: Docker container missing - + Server error: Docker failed Server error: Docker failed - + Installation canceled by user Installation canceled by user - + The user does not have permission to use sudo The user does not have permission to use sudo - + Server error: Packet manager error - + SSH request was denied SSH request was denied - + SSH request was interrupted SSH request was interrupted - + SSH internal error SSH internal error - + Invalid private key or invalid passphrase entered Invalid private key or invalid passphrase entered - + The selected private key format is not supported, use openssh ED25519 key types or PEM key types The selected private key format is not supported, use openssh ED25519 key types or PEM key types - + Timeout connecting to server Timeout connecting to server - + SCP error: Generic failure @@ -2951,22 +3185,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 - + This config has already been added to the application Ця конфігурація вже була додана в застосунок - + ErrorCode: %1. @@ -2975,117 +3209,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 config missing - + OpenVPN management server error OpenVPN management server error - + OpenVPN executable missing OpenVPN executable missing - + Shadowsocks (ss-local) executable missing Shadowsocks (ss-local) executable missing - + Cloak (ck-client) executable missing Cloak (ck-client) executable missing - + Amnezia helper service error Amnezia helper service error - + OpenSSL failed OpenSSL failed - + Can't connect: another VPN connection is active Can't connect: another VPN connection is active - + Can't setup OpenVPN TAP network adapter Can't setup OpenVPN TAP network adapter - + VPN pool error: no available addresses VPN pool error: no available addresses - + VPN connection error + + + In the response from the server, an empty config was received + + - QFile error: The file could not be opened + SSL error occurred - QFile error: An error occurred when reading from the file - - - - - QFile error: The file could not be accessed - - - - - QFile error: An unspecified error occurred + Server response timeout on api request - QFile error: A fatal error occurred + QFile error: The file could not be opened - QFile error: The operation was aborted + 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 Internal error - + IPsec IPsec - + 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 під HTTPS трафік і захистом від active-probing. Підходить для регіонів з самим високим рівнем цензури. - + + 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. @@ -3107,7 +3361,7 @@ If there is a extreme level of Internet censorship in your region, we advise you - + 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. @@ -3120,7 +3374,7 @@ WireGuard is very susceptible to blocking due to its distinct packet signatures. - + 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. @@ -3128,7 +3382,7 @@ Unlike older protocols such as VMess, VLESS, and the XTLS-Vision transport, REAL - + 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. @@ -3149,63 +3403,62 @@ 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 - + AmneziaDNS AmneziaDNS - + 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. - 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-сервер на AmneziaDNS. Це підвищить вашу рівень захищеності в інтернеті. - + 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. @@ -3224,7 +3477,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 @@ -3239,7 +3492,7 @@ It employs its unique security protocol, leveraging the strength of SSL/TLS for * Працює по мережевому протоколу TCP. - + After installation, Amnezia will create a file storage on your server. You will be able to access it using @@ -3308,7 +3561,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. @@ -3337,10 +3590,17 @@ This means that AmneziaWG keeps the fast performance of the original while addin Файлове сховище для безпечного зберігання даних - + SFTP service Сервіс SFTP + + + + + SOCKS5 proxy server + + Entry not found @@ -3391,21 +3651,147 @@ This means that AmneziaWG keeps the fast performance of the original while addin No match No match - - - Unknown error - Unknown error - error 0x%1: %2 error 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 Выберите язык @@ -3427,7 +3813,7 @@ This means that AmneziaWG keeps the fast performance of the original while addin SettingsController - + All settings have been reset to default values Всі налаштування були скинуті до значення "По замовчуванню" @@ -3436,7 +3822,7 @@ This means that AmneziaWG keeps the fast performance of the original while addin Кеш профілю очищено - + Backup file is corrupted Backup файл пошкодженно @@ -3460,23 +3846,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-код, ключ чи файл налаштувань" @@ -3560,7 +3946,7 @@ This means that AmneziaWG keeps the fast performance of the original while addin TextFieldWithHeaderType - + The field can't be empty Поле не може бути пустим @@ -3568,7 +3954,7 @@ This means that AmneziaWG keeps the fast performance of the original while addin VpnConnection - + Mbps Mbps @@ -3576,42 +3962,42 @@ This means that AmneziaWG keeps the fast performance of the original while addin VpnProtocol - + Unknown Невідомий - + Disconnected Відключено - + Preparing Підготовка - + Connecting... Підключення... - + Connected Підключено - + Disconnecting... Відключення... - + Reconnecting... Перепідключення... - + Error Помилка @@ -3619,38 +4005,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 @@ -3672,12 +4052,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_ur_PK.ts b/client/translations/amneziavpn_ur_PK.ts index 4f3d74b5..3675ed93 100644 --- a/client/translations/amneziavpn_ur_PK.ts +++ b/client/translations/amneziavpn_ur_PK.ts @@ -14,12 +14,12 @@ یہ ایپلیکیشن پہلے سے شامل کیا گیا ہے - + The selected applications have been added منتخب شدہ ایپلیکیشنز شامل کردی گئی ہیں - + Application removed: %1 ایپلیکیشن ہٹا دی گئی: %1 @@ -35,61 +35,61 @@ ConnectionController - - - - + + + + Connect جوڑنا - + The selected protocol is not supported on the current platform منتخب کردہ پروٹوکول موجودہ پلیٹ فارم پر تعاون یافتہ نہیں ہے - + VPN Protocols is not installed. Please install VPN container at first وی پی این پروٹوکول انسٹال نہیں ہے,براہ کرم پہلےوی پی این کنٹینر انسٹال کریں - + unable to create configuration تشکیل تیار کرنے میں ناکام - + Connecting... جوڑاجارھاھے.... - + Connected جوڑاجارھاھے - + Reconnecting... دوبارہ جوڑنےکی کوشش... - + Disconnecting... منقطع کرنا... - + Preparing... تیاری کیا جا رہا ہے... - + Settings updated successfully, reconnnection... ترتیب ک ھوگی،دوبارہ جوڑنےکی کوشش... - + Settings updated successfully دوبارہ ترتیب تاذہ کامیاب @@ -138,7 +138,7 @@ ExportController - + Access error! رساءی ناممکن! @@ -200,85 +200,90 @@ 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' سرور '%2' سے %1 ہٹا دیا گیا ہے - + %1 cached profile cleared %1 کیش کردہ پروفائل ختم کر دی گئی - + Please login as the user براہ کرم صارف کے طور پر لاگ ان کریں - + Server added successfully سرور کامیابی سے شامل کیا گیا @@ -322,30 +327,30 @@ Already installed containers were found on the server. All installed containers NotificationHandler - - + + AmneziaVPN The translation of "AmneziaVPN" in Urdu would be: امنیزیا وی پی ای - + VPN Connected وی پی این متصل ہوگیا - + VPN Disconnected وی پی این منقطع ہوگیا - + AmneziaVPN notification امنیزیا وی پی این کی اطلاعات - + Unsecured network detected: غیر محفوظ نیٹ ورک کا پتہ لگایا گیا ہے: @@ -850,7 +855,7 @@ Already installed containers were found on the server. All installed containers - + Copied نقل کر دیا گیا @@ -870,53 +875,125 @@ Already installed containers were found on the server. All installed containers پاس ورڈ - + Mount folder on device آلے پر فولڈر ماؤنٹ کریں - + In order to mount remote SFTP folder as local drive, perform following steps: <br> ریموٹ SFTP فولڈر کو لوکل ڈرائیو کے طور پر ماؤنٹ کرنے کے لیے، درج ذیل اقدامات کریں - + <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 کو ہٹا دیں اور وہاں ذخیرہ شدہ تمام ڈیٹا کو ختم کر دیں - + Remove SFTP and all data stored there? SFTP اور وہاں ذخیرہ کردہ تمام ڈیٹا کو ہٹائیں؟ - + Continue جاری رہے - + Cancel منسوخ کریں + + PageServiceSocksProxySettings + + + Settings updated successfully + + + + + + SOCKS5 settings + + + + + Host + The term "Host" in the context of SFTP (Secure File Transfer Protocol) can be translated into Urdu as: + +میزبان + + + + + + + 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 @@ -1099,14 +1176,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 + @@ -1152,92 +1237,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 ایپ شروع ہونے پر 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. تمام ترتیبات کو معمولی حالت پر لوٹایا جائے گا۔ سب انسٹال کیے گئے امنیزیا وی پی این سروسزسرورپرموجودرہیںگی. - + Continue جاری رکھیں - + Cancel منسوخ - + Cannot reset settings during active connection چالو کنکشن کے دوران ترتیبات کو دوبارہ ترتیب نہیں دی جا سکتی @@ -1334,7 +1429,7 @@ Already installed containers were found on the server. All installed containers ایمنیزیا ڈی این ایس کو استعمال نہیں کیا گیا ہو یا اسے انسٹال نہیں کیا گیاہے - + Allows you to use the VPN only for certain Apps آپ کو صرف مخصوص ایپلیکیشنز کے لئے وی پی این استعمال کرنے کی اجازت دیتا ہے @@ -1364,10 +1459,25 @@ 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 + + PageSettingsDns @@ -1655,27 +1765,27 @@ Already installed containers were found on the server. All installed containers PageSettingsServerProtocol - + settings ترتیبات - + Clear %1 profile %1 پروفائل کو صاف کریں - + Clear %1 profile? کیا آپ واقعی %1 پروفائل کو صاف کرنا چاہتے ہیں؟ - + Unable to clear %1 profile while there is an active connection فعال کنکشن کے دوران %1 پروفائل کو صاف نہیں کیا جا سکتا - + Cannot remove active container فعال کنٹینر کو ہٹانا ممکن نہیں @@ -1685,29 +1795,29 @@ Already installed containers were found on the server. All installed containers - + Remove ہٹائیں - + All users with whom you shared a connection will no longer be able to connect to it. آپ نے جن کے ساتھ کنکشن شئیر کیا تھا، ان تمام صارفین کو اس سے جڑنے کی اجازت نہیں ہوگی. - + Remove %1 from server? کیا آپ سرور سے %1 کو ہٹانا چاہتے ہیں؟ - - + + Continue براہ کرم جاری رکھیں - - + + Cancel منسوخ @@ -2016,16 +2126,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 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، انسٹال کر سکتے ہیں۔ @@ -2033,7 +2148,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 کوڈ پر موجود کریں اور کچھ سیکنڈ کے لئے رکھیں. @@ -2122,12 +2237,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 کنکٹ @@ -2165,124 +2280,142 @@ Already installed containers were found on the server. All installed containers "XRay کنفیگ کو محفوظ کریں - + For the AmneziaVPN app AmneziaVPN ایپ کے لئے - OpenVpn native format - OpenVPN کا اصل فارمیٹ + OpenVPN کا اصل فارمیٹ - + WireGuard native format وائر گارڈ کا اصل فارمیٹ - + AmneziaWG native format ایمنیزیا ڈبلیو جی کا اصل فارمیٹ - + Shadowsocks native format شیڈو ساکس کا اصل فارمیٹ - + 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 صارفین - + Share VPN access without the ability to manage the server سرور کو منظم کرنے کی صلاحیت کے بغیر وی پی این کی دسترسی شیئر - + 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 کنکشن - + Server سرور @@ -2292,8 +2425,8 @@ Already installed containers were found on the server. All installed containers کنکشن کی ترتیبات کی فائل - + Protocol پروٹوکول @@ -2308,19 +2441,24 @@ Already installed containers were found on the server. All installed containers کنفیگ منسوخ - + + OpenVPN native format + + + + User name صارف کا نام - + Connection format کنکشن فارمیٹ - - + + Share شیئر @@ -2379,7 +2517,7 @@ Already installed containers were found on the server. All installed containers PageStart - + Logging was disabled after 14 days, log files were deleted لاگنگ کو 14 دنوں کے بعد غیر فعال کر دیا گیا، لاگ فائلوں کو حذف کر دیا گیا @@ -2387,7 +2525,7 @@ Already installed containers were found on the server. All installed containers PopupType - + Close بند @@ -2630,10 +2768,17 @@ Already installed containers were found on the server. All installed containers QObject - + SFTP service ایس ایف ٹی پی سروس + + + + + SOCKS5 proxy server + + No error @@ -2641,6 +2786,7 @@ Already installed containers were found on the server. All installed containers + Unknown error نامعلوم خامی @@ -2650,233 +2796,258 @@ Already installed containers were found on the server. All installed containers فنکشن نافذ نہیں ہوا - + 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 استعمال کرنے کی اجازت نہیں ہے - + 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 سرور سے منسلک ہونے کا ٹائم آؤٹ - + VPN connection error VPN کنکشن کی خرابی - + Error when retrieving configuration from API آپی سے کنفیگریشن بازیافت کرتے وقت خرابی - + This config has already been added to the application یہ تشکیل پہلے ہی ایپلی کیشن میں شامل کی جا چکی ہے - + ErrorCode: %1. ایرر کوڈ: %1. - + OpenVPN config missing OpenVPN تشکیل غائب ہے - + + Background service is not running + + + + Server error: Packet manager error سرور خطا: پیکیج منیجر خطا - + SCP error: Generic failure ایس سی پی کی خرابی: عام ناکامی - + OpenVPN management server error OpenVPN مینجمنٹ سرور کی خرابی - + OpenVPN executable missing OpenVPN قابل عمل غائب ہے - + Shadowsocks (ss-local) executable missing شیڈو ساکس (ss-local) قابل عمل غائب - + Cloak (ck-client) executable missing Cloak (ck-client) قابل عمل غائب - + Amnezia helper service error ایمنیزیا مددگار سروس کی خرابی - + 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 پول کی خرابی: کوئی پتہ دستیاب نہیں ہے - + The config does not contain any containers and credentials for connecting to the server ترتیب میں سرور سے منسلک ہونے کے لیے کوئی کنٹینرز اور اسناد نہیں ہیں + + + 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 error: The file could not be accessed QFile کی خرابی: فائل تک رسائی نہیں ہو سکی - + 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 ٹور نیٹ ورک میں ویب سائٹ - + AmneziaDNS ایمنیزیا ڈی این ایس - + 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. اوپن وی پی این لچکدار ترتیب کے اختیارات کے ساتھ سب سے زیادہ مقبول 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. شیڈو ساکس - 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. اوپن وی پی این اوور کلوک - اوپن وی پی این کے ساتھ وی پی این کو ویب ٹریفک کے طور پر چھپانا اور ایکٹیو پروبنگ ڈٹیکشن کے خلاف تحفظ۔ سنسرشپ کی اعلی ترین سطح والے خطوں میں بلاکنگ کو نظرانداز کرنے کے لیے مثالی. - + 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. حقیقت کے ساتھ ایکسرےواقعیت کے ساتھ ایکس رے - سب سے زیادہ انٹرنیٹ سینسرشپ والے ممالک کے لئے مناسب ہے۔ ٹریفک ویب ٹریفک کی سطح TLS پر ماسکنگ اور فعال پرابنگ کے طریقوں سے شناخت سے بچائے جانے کی حفاظت۔ - + + 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. @@ -2899,7 +3070,7 @@ If there is a extreme level of Internet censorship in your region, we advise you - + 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. @@ -2912,7 +3083,7 @@ WireGuard is very susceptible to blocking due to its distinct packet signatures. ایک نسبتاً نیا مقبول وی پی این پروٹوکول جس میں سادہ معماری ہے۔ وائر گارڈ تمام آلات پر مضبوط وی پی این کنکشن اور اعلی کارکردگی فراہم کرتا ہے۔ اس میں ہارڈ کوڈ کردہ انکرپشن سیٹنگز استعمال کی جاتی ہیں۔ وائر گارڈ کو اوپن وی پی این سے موازنہ کرنے پر لیٹنسی میں کمی اور بہتر ڈیٹا ٹرانسفر تھروپٹ حاصل ہوتی ہے۔ وائر گارڈ کا مخصوص پیکٹ سائنیچرز کی وجہ سے بلاک کرنا زیادہ آسان ہوتا ہے۔ کچھ دوسرے وی پی این پروٹوکول کے مخالف، جو اوبفسکیشن ٹیکنیکس کا استعمال کرتے ہیں، وائر گارڈ کے پیکٹس کے مسلسل سائنیچر پیٹرنز کو زیادہ آسانی سے پہچانا جا سکتا ہے اور اس طرح معقد ڈیپ پیکٹ انسپیکشن (DPI) سسٹمز اور دیگر نیٹ ورک مانیٹرنگ ٹولز کے ذریعے بلاک کیا جا سکتا ہے۔ * تمام پلیٹ فارمز پر دستیاب ہے * کم بجلی کی استعمال * کم سیٹنگز کی تعداد * ڈی پی آئی تجزیہ سسٹمز کے ذریعے آسانی سے پہچانا جاتا ہے، بلاک کرنے کے لئے زیادہ متاثر ہے * یو ڈی پی نیٹ ورک پروٹوکول پر کام کرتا ہے. - + 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. @@ -2924,7 +3095,7 @@ Unlike older protocols such as VMess, VLESS, and the XTLS-Vision transport, REAL یہ REALITY کو سخت سینسرشپ والے ماحولوں میں انٹرنیٹ کی آزادی کو برقرار رکھنے کے لئے ایک مضبوط حل بناتا ہے۔ - + After installation, Amnezia will create a file storage on your server. You will be able to access it using @@ -2936,32 +3107,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. وائر گارڈ - اعلی کارکردگی، تیز رفتار اور کم بجلی کی کھپت کے ساتھ نیا مقبول 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 پر مبنی۔ یہ وائر گارڈ کی طرح تیز ہے، لیکن رکاوٹوں کے خلاف بہت مزاحم ہے۔ اعلی درجے کی سنسر شپ والے خطوں کے لیے تجویز کردہ۔ - 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 سرور کو اپنے سے تبدیل کریں۔ اس سے آپ کی رازداری کی سطح میں اضافہ ہوگا. - + 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. @@ -2973,7 +3143,7 @@ It employs its unique security protocol, leveraging the strength of SSL/TLS for OpenVPN دستیاب سب سے زیادہ مقبول اور وقتی آزمائشی VPN پروٹوکولز میں سے ایک ہے۔ یہ انکرپشن اور کلیدی تبادلے کے لیے SSL/TLS کی طاقت کا فائدہ اٹھاتے ہوئے اپنا منفرد سیکیورٹی پروٹوکول استعمال کرتا ہے۔ مزید برآں، توثیق کے بہت سے طریقوں کے لیے OpenVPN کی حمایت اسے ورسٹائل اور قابل موافق بناتی ہے، جو آلات اور آپریٹنگ سسٹم کی ایک وسیع رینج کو پورا کرتی ہے۔ اوپن سورس کی نوعیت کی وجہ سے، اوپن وی پی این کو عالمی برادری کی طرف سے وسیع جانچ سے فائدہ ہوتا ہے، جو اس کی سلامتی کو مسلسل تقویت دیتا ہے۔ کارکردگی، سیکورٹی اور مطابقت کے مضبوط توازن کے ساتھ، OpenVPN رازداری کے بارے میں شعور رکھنے والے افراد اور کاروباروں کے لیے یکساں انتخاب ہے۔ * تمام پلیٹ فارمز پر AmneziaVPN میں دستیاب ہے * موبائل آلات پر بجلی کی عام کھپت * صارف کو مختلف آپریٹنگ سسٹمز اور ڈیوائسز کے ساتھ کام کرنے کی ضرورت کے مطابق لچکدار تخصیص * DPI تجزیہ سسٹمز کے ذریعہ پہچانا جاتا ہے اور اس وجہ سے بلاک کرنے کا خطرہ ہوتا ہے * 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 @@ -2983,7 +3153,7 @@ It employs its unique security protocol, leveraging the strength of SSL/TLS for شیڈو ساکس، SOCKS5 پروٹوکول سے متاثر، AEAD سائفر کا استعمال کرتے ہوئے کنکشن کی حفاظت کرتا ہے۔ اگرچہ شیڈو ساکس کو سمجھدار اور شناخت کرنے کے لیے چیلنج کرنے کے لیے ڈیزائن کیا گیا ہے، لیکن یہ معیاری HTTPS کنکشن سے مماثل نہیں ہے۔ تاہم، کچھ ٹریفک تجزیہ نظام اب بھی شیڈو ساکس کنکشن کا پتہ لگا سکتے ہیں۔ Amnezia میں محدود تعاون کی وجہ سے، AmneziaWG پروٹوکول استعمال کرنے کی سفارش کی جاتی ہے۔ * صرف ڈیسک ٹاپ پلیٹ فارمز پر AmneziaVPN میں دستیاب ہے * قابل ترتیب انکرپشن پروٹوکول * کچھ DPI سسٹمز کے ذریعے قابل شناخت * 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. @@ -2996,7 +3166,7 @@ This means that AmneziaWG keeps the fast performance of the original while addin ایک معاصر اشارہ جاتا ہے مقبول وی پی این پروٹوکول کا امنیزیہ ڈبلیو جی۔ امنیزیہ ڈبلیو جی وائر گارڈ کے بنیادی ڈھانچے پر مبنی ہے، جس نے اس کی آسانی سے معماری اور ایکسیلنٹ کارکردگی کی خصوصیات کو برقرار رکھا۔ جبکہ وائر گارڈ کو اس کی کارآمدی کے لئے جانا جاتا ہے، اس میں اپنے ممتاز پیکٹ سائنیچرز کی وجہ سے آسانی سے پہچان میں مسائل پیش آتے تھے۔ امنیزیہ ڈبلیو جی اس مسئلے کا حل پیش کرتا ہے بہتر اوبفسکیشن میتھڈس کے ذریعے، جس سے اس کی ٹریفک عام انٹرنیٹ ٹریفک کے ساتھ مل جل کر رہتی ہے۔ اس سے مطلب یہ ہے کہ امنیزیہ ڈبلیو جی نے اصل وائر گارڈ کی تیزی کارکردگی کو برقرار رکھا جبکہ اس میں ایک اضافی پردہ شامل کیا، جو اسے ایک تیز اور پرانے طریقہ سے وی پی این کنکشن کی درخواست کرنے والوں کے لئے ایک عمدہ چوئس بناتا ہے۔ * تمام پلیٹ فارمز پر دستیاب ہے * کم بجلی کی استعمال * کم سیٹنگز کی تعداد * ڈی پی آئی تجزیہ سسٹمز سے پہچانا نہیں جاتا، بند کرنے کے لئے مزید مضبوط ہے * یو ڈی پی نیٹ ورک پروٹوکول پر کام کرتا ہے۔ - + 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. @@ -3009,7 +3179,7 @@ While it offers a blend of security, stability, and speed, it's essential t IKEv2، IPSec انکرپشن پرت کے ساتھ جوڑا، ایک جدید اور مستحکم VPN پروٹوکول کے طور پر کھڑا ہے۔ اس کی امتیازی خصوصیات میں سے ایک نیٹ ورکس اور ڈیوائسز کے درمیان تیزی سے سوئچ کرنے کی صلاحیت ہے، جو اسے متحرک نیٹ ورک کے ماحول میں خاص طور پر موافق بناتی ہے۔ اگرچہ یہ سیکیورٹی، استحکام اور رفتار کا امتزاج پیش کرتا ہے، لیکن یہ نوٹ کرنا ضروری ہے کہ IKEv2 کا آسانی سے پتہ لگایا جا سکتا ہے اور یہ بلاک کرنے کے لیے حساس ہے۔ * صرف ونڈوز پر AmneziaVPN میں دستیاب ہے * کم بجلی کی کھپت، موبائل ڈیوائسز پر * کم سے کم کنفیگریشن * DPI تجزیہ سسٹمز کے ذریعے پہچانا جاتا ہے * UDP نیٹ ورک پروٹوکول، پورٹ 500 اور 4500 پر کام .کرتا ہے - + DNS Service DNS سروس @@ -3063,16 +3233,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 @@ -3099,12 +3395,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 تمام ترتیبات کو ڈیفالٹ اقدار پر دوبارہ ترتیب دیا گیا ہے @@ -3236,7 +3532,7 @@ While it offers a blend of security, stability, and speed, it's essential t VpnConnection - + Mbps ایم بی پی ایس @@ -3244,42 +3540,42 @@ While it offers a blend of security, stability, and speed, it's essential t VpnProtocol - + Unknown نامعلوم - + Disconnected منقطع - + Preparing تیاری مکمل - + Connecting... منسلک ہو رہا ہے... - + Connected منسلک - + Disconnecting... منقطع ہو رہا ہے... - + Reconnecting... دوبارہ منسلک ہو رہا ہے... - + Error خرابی @@ -3287,34 +3583,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_zh_CN.ts b/client/translations/amneziavpn_zh_CN.ts index 6f357da6..4bc46aa5 100644 --- a/client/translations/amneziavpn_zh_CN.ts +++ b/client/translations/amneziavpn_zh_CN.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协议 - + 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 配置文件,授权码或二维码 @@ -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 of %2. + + + In the imported configuration, potentially dangerous lines were found: + + InstallController @@ -185,55 +237,58 @@ 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 在服务上发现已经安装协议并添加至应用 - + 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' 上移除 @@ -251,16 +306,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 @@ -282,28 +355,28 @@ Already installed containers were found on the server. All installed containers NotificationHandler - - + + AmneziaVPN - + VPN Connected 已连接到VPN - + VPN Disconnected 已从VPN断开 - + AmneziaVPN notification AmneziaVPN 提示 - + Unsecured network detected: 发现不安全网络 @@ -324,32 +397,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 已建立连接时无法更改服务器配置 @@ -357,270 +430,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 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 - + 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 auth TLS认证 - + Block DNS requests outside of VPN 阻止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. - 与您共享连接的所有用户将无法再连接到该连接。 + 与您共享连接的所有用户将无法再连接到该连接。 - + Save 保存 @@ -629,25 +719,23 @@ Already installed containers were found on the server. All installed containers 与您共享连接的所有用户将无法再连接到此链接 - Continue - 继续 + 继续 - Cancel - 取消 + 取消 PageProtocolRaw - + settings 配置 - + Show connection options 显示连接选项 @@ -656,22 +744,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. 与您共享连接的所有用户将无法再连接到该连接。 @@ -684,12 +772,12 @@ Already installed containers were found on the server. All installed containers 与您共享连接的所有用户将无法再连接到此链接 - + Continue 继续 - + Cancel 取消 @@ -697,110 +785,135 @@ 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 + + + 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. 其地址与您的服务器地址相同。您可以在 设置 连接 中进行配置。 - + Remove 移除 - + Remove %1 from server? 从服务器移除 %1 ? + + + Cannot remove Amnezia DNS from running server + + from server? 从服务器 - + Continue 继续 - + Cancel 取消 @@ -808,145 +921,215 @@ Already installed containers were found on the server. All installed containers 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. 用 <a href="https://www.torproject.org/download/" style="color: #FBB26A;">Tor 浏览器</a> 打开上面网址. - + After creating your onion site, it takes a few minutes for the Tor network to make it available for use. 创建您的洋葱网站后,需要几分钟时间,才能使其在Tor网络上可用 - + When configuring WordPress set the this onion address as domain. 配置 WordPress 时,将此洋葱地址设置为域。 - + Remove website 移除网站 - + The site with all data will be removed from the tor network. 网站及其所有数据将从 Tor 网络中删除 - + Continue 继续 - + Cancel 取消 @@ -954,37 +1137,37 @@ Already installed containers were found on the server. All installed containers PageSettings - + Settings 设置 - + Servers 服务器 - + Connection 连接 - + Application 应用 - + Backup 备份 - + About AmneziaVPN 关于 - + Close application 关闭应用 @@ -998,95 +1181,163 @@ And if you don't like the app, all the more support it - the donation will 如果您不喜欢,请捐助支持我们改进它。 - + 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_en - + Mail 邮件 - + For reviews and bug reports 用于评论和提交软件的缺陷 - + GitHub GitHub - + https://github.com/amnezia-vpn/amnezia-client 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 自动运行 @@ -1099,80 +1350,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 从备份文件还原配置 @@ -1181,105 +1437,125 @@ 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 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 + + + KillSwitch + + + + + Disables your internet if your encrypted VPN connection drops out for any reason. + + + + + Cannot change killSwitch settings during active connection + + Use AmneziaDNS if installed on the server 使用AmneziaDNS,如其已安装在服务器上 - + Use AmneziaDNS 使用AmneziaDNS - + If AmneziaDNS is installed on the server 如果已在服务器安装AmneziaDNS - + DNS servers DNS服务器 @@ -1288,17 +1564,17 @@ And if you don't like the app, all the more support it - the donation will 如果未使用或未安装AmneziaDNS - + Site-based split tunneling 基于网站的隧道分离 - + Allows you to select which sites you want to access through the VPN 配置想要通过VPN访问网站 - + App-based split tunneling 基于应用的隧道分离 @@ -1322,62 +1598,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 installed 如果未使用或未安装AmneziaDNS - + Primary DNS 首选 DNS - + Secondary DNS 备用 DNS - + Restore default 恢复默认配置 - + Restore default DNS settings? 是否恢复默认DNS配置? - + Continue 继续 - + Cancel 取消 - + Settings have been reset 已重置 - + Save 保存 - + Settings saved 配置已保存 @@ -1390,67 +1666,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) - + Logs file saved 日志文件已保存 - + Save logs to file 保存日志到文件 - + Clear logs? 清理日志? - + Continue 继续 - + Cancel 取消 - + Logs have been cleaned up 日志已清理 - + Clear logs 清理日志 @@ -1458,37 +1734,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软件吗? @@ -1498,79 +1771,97 @@ 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 + + Remove server? 移除本地服务器信息? - + All installed AmneziaVPN services will still remain on the server. 所有已安装的 AmneziaVPN 服务仍将保留在服务器上。 - + Clear server from Amnezia software 清理Amnezia中服务器信息 @@ -1586,27 +1877,27 @@ And if you don't like the app, all the more support it - the donation will PageSettingsServerInfo - + Server name 服务器名 - + Save 保存 - + Protocols 协议 - + Services 服务 - + Management 管理 @@ -1618,20 +1909,45 @@ 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 + + All users who you shared a connection with will no longer be able to connect to it. 使用此共享连接的所有用户,将无法再连接它。 @@ -1641,7 +1957,7 @@ And if you don't like the app, all the more support it - the donation will 从服务器 - + Remove %1 from server? 从服务器移除 %1 ? @@ -1650,12 +1966,14 @@ And if you don't like the app, all the more support it - the donation will 与您共享连接的所有用户将无法再连接到此链接 - + + Continue 继续 - + + Cancel 取消 @@ -1663,7 +1981,7 @@ And if you don't like the app, all the more support it - the donation will PageSettingsServersList - + Servers 服务器 @@ -1683,7 +2001,7 @@ And if you don't like the app, all the more support it - the donation will 网站级VPN分流 - + Default server does not support split tunneling function 默认服务器不支持分离隧道功能 @@ -1692,32 +2010,32 @@ And if you don't like the app, all the more support it - the donation will 仅使用VPN访问 - + Addresses from the list should not be accessed via VPN 不使用VPN访问 - + Split tunneling 隧道分离 - + Mode 规则 - + Remove 移除 - + Continue 继续 - + Cancel 取消 @@ -1730,65 +2048,65 @@ And if you don't like the app, all the more support it - the donation will 导入/导出网站 - + 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) - + Import a list of sites 导入网址列表 - + Replace site list 替换网址列表 - - + + Open sites file 打开网址文件 - + Add imported sites to existing ones 将导入的网址添加到现有网址中 @@ -1796,7 +2114,7 @@ And if you don't like the app, all the more support it - the donation will PageSetupWizardConfigSource - + Server connection 服务器连接 @@ -1808,37 +2126,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 二维码 - + Key as text 授权码文本 @@ -1850,12 +2168,12 @@ It's okay as long as it's from someone you trust. 连接服务器 - + Configure your server 配置服务器 - + Server IP address [:port] 服务器IP [:端口] @@ -1868,12 +2186,12 @@ It's okay as long as it's from someone you trust. 密码 或 私钥 - + Continue 继续 - + All data you enter will remain strictly confidential and will not be shared or disclosed to the Amnezia or any third parties 您输入的所有数据将严格保密,不会与 Amnezia 或任何第三方共享或披露 @@ -1884,37 +2202,37 @@ and will not be shared or disclosed to the Amnezia or any third parties 不会向 Amnezia 或任何第三方分享或披露 - + 255.255.255.255:22 - + SSH Username SSH 用户名 - + 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 密码或私钥不能为空 @@ -1922,17 +2240,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 跳过设置 @@ -1945,7 +2263,7 @@ and will not be shared or disclosed to the Amnezia or any third parties 我想选择VPN协议 - + Continue 继续 @@ -1958,27 +2276,27 @@ and will not be shared or disclosed to the Amnezia or any third parties 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 取消安装 @@ -1991,12 +2309,12 @@ and will not be shared or disclosed to the Amnezia or any third parties 正安装其他软件。Amnezia安装 - + will pause until the server finishes installing other software 将暂停,直到其他软件安装完成。 - + Installing 安装中 @@ -2004,45 +2322,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 protocol VPN 协议 - + 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。 @@ -2050,7 +2373,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. 将相机对准二维码并按住几秒钟 @@ -2058,32 +2381,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-guide @@ -2091,27 +2414,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 继续 @@ -2119,7 +2442,7 @@ and will not be shared or disclosed to the Amnezia or any third parties PageSetupWizardViewConfig - + New connection 新连接 @@ -2128,22 +2451,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 连接 @@ -2151,133 +2479,162 @@ and will not be shared or disclosed to the Amnezia or any third parties PageShare - + Save OpenVPN config 保存OpenVPN配置 - + Save WireGuard config 保存WireGuard配置 - + Save AmneziaWG config 保存 AmneziaWG 配置 - + Save Shadowsocks config 保存 Shadowsocks 配置 - + Save Cloak config 保存斗篷配置 - + + Save XRay config + + + + For the AmneziaVPN app AmneziaVPN 应用 - + 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 取消 @@ -2290,7 +2647,7 @@ and will not be shared or disclosed to the Amnezia or any third parties 访问VPN - + Connection 连接 @@ -2319,8 +2676,8 @@ and will not be shared or disclosed to the Amnezia or any third parties 服务器 - - + + Server 服务器 @@ -2333,7 +2690,7 @@ and will not be shared or disclosed to the Amnezia or any third parties 访问配置文件的内容为: - + File with connection settings to 连接配置文件的内容为: @@ -2342,35 +2699,35 @@ and will not be shared or disclosed to the Amnezia or any third parties 协议 - - + + Protocol 协议 - + Connection to 连接到 - + Config revoked 配置已撤销 - + User name 用户名 - - + + Connection format 连接格式 - - + + Share 共享 @@ -2378,50 +2735,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 连接配置文件的内容为 @@ -2429,7 +2786,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 @@ -2437,7 +2794,7 @@ and will not be shared or disclosed to the Amnezia or any third parties PopupType - + Close 关闭 @@ -2680,10 +3037,17 @@ and will not be shared or disclosed to the Amnezia or any third parties QObject - + SFTP service SFTP 服务 + + + + + SOCKS5 proxy server + + No error @@ -2691,6 +3055,7 @@ and will not be shared or disclosed to the Amnezia or any third parties + Unknown error 未知错误 @@ -2700,67 +3065,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 用户没有root权限 - + + Server error: Packet manager error + + + + 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 连接服务器超时 - + SCP error: Generic failure @@ -2817,52 +3192,67 @@ and will not be shared or disclosed to the Amnezia or any third parties Sftp 错误: 远程驱动器中没有媒介 - + VPN connection error VPN 连接错误 - + Error when retrieving configuration from API 从 API 检索配置时出错 - + This config has already been added to the application 该配置已添加到应用程序中 - 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 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 - + ErrorCode: %1. 错误代码: %1. @@ -2871,57 +3261,57 @@ and will not be shared or disclosed to the Amnezia or any third parties 配置保存到磁盘失败 - + 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 池错误:没有可用地址 - + The config does not contain any containers and credentials for connecting to the server 配置不包含任何用于连接服务器的容器和凭据 @@ -2930,43 +3320,61 @@ and will not be shared or disclosed to the Amnezia or any third parties 该配置不包含任何用于连接到服务器的容器和凭据。 - + Internal error - + IPsec - - + + Website in Tor network 在 Tor 网络中架设网站 - + AmneziaDNS AmneziaDNS - + 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流量,使其类似于正常的网络流量,但在一些高度审查的地区可能会被分析系统识别. - + + 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. + + + + + 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 @@ -2989,12 +3397,12 @@ For more detailed information, you can OpenVPN over Cloak - OpenVPN与VPN结合,伪装成Web流量,并保护免受主动探测的侦测。非常适合在具有最高审查水平的地区绕过封锁 - + 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. @@ -3016,7 +3424,7 @@ If there is a extreme level of Internet censorship in your region, we advise you - + 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. @@ -3041,32 +3449,31 @@ WireGuard非常容易被阻挡,因为其独特的数据包签名。与一些 Shadowsocks - 混淆 VPN 流量,使其与正常的 Web 流量相似,但在一些审查力度高的地区可以被分析系统识别。 - + 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结合,伪装成Web流量,并保护免受主动探测的侦测。非常适合在具有最高审查水平的地区绕过封锁. - + 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 一样快,但非常抗堵塞。推荐用于审查较严的地区。 - 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 服务器替换为您自己的。这将提高您的隐私保护级别。 @@ -3075,7 +3482,7 @@ WireGuard非常容易被阻挡,因为其独特的数据包签名。与一些 在您的服务器上创建文件仓库,以便安全地存储和传输文件 - + 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. @@ -3094,7 +3501,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 @@ -3166,7 +3573,7 @@ WireGuard is very susceptible to blocking due to its distinct packet signatures. * 通过 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. @@ -3187,7 +3594,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. @@ -3228,7 +3635,7 @@ While it offers a blend of security, stability, and speed, it's essential t IPsec 容器 - + DNS Service DNS 服务 @@ -3286,21 +3693,147 @@ 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 - + Choose language 选择语言 @@ -3322,19 +3855,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 - 缓存的配置文件已清除 + 缓存的配置文件已清除 @@ -3356,18 +3888,18 @@ While it offers a blend of security, stability, and speed, it's essential t 拷贝 - - + + Copied 已拷贝 - + Copy config string 复制配置字符串 - + Show connection settings 显示连接配置 @@ -3376,7 +3908,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" 要应用二维码到 Amnezia,请底部工具栏点击“+”→“连接方式”→“二维码、授权码或配置文件” @@ -3460,7 +3992,7 @@ While it offers a blend of security, stability, and speed, it's essential t TextFieldWithHeaderType - + The field can't be empty 输入不能为空 @@ -3468,7 +4000,7 @@ While it offers a blend of security, stability, and speed, it's essential t VpnConnection - + Mbps @@ -3476,42 +4008,42 @@ While it offers a blend of security, stability, and speed, it's essential t VpnProtocol - + Unknown 未知 - + Disconnected 连接已断开 - + Preparing 准备中 - + Connecting... 连接中 - + Connected 已连接 - + Disconnecting... 断开中 - + Reconnecting... 重连中 - + Error 错误 @@ -3519,38 +4051,32 @@ 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 协议都被阻止。如果其他选项不起作用,推荐此选项。 - - - High - + 大多数 VPN 协议都被阻止。如果其他选项不起作用,推荐此选项。 Medium @@ -3572,12 +4098,12 @@ While it offers a blend of security, stability, and speed, it's essential t main2 - + Private key passphrase 私钥密码 - + Save 保存 diff --git a/client/ui/controllers/connectionController.cpp b/client/ui/controllers/connectionController.cpp index 76c352f4..8e39bab0 100644 --- a/client/ui/controllers/connectionController.cpp +++ b/client/ui/controllers/connectionController.cpp @@ -1,5 +1,7 @@ #include "connectionController.h" +#define Q_OS_IOS 1 + #if defined(Q_OS_ANDROID) || defined(Q_OS_IOS) #include #else diff --git a/client/ui/controllers/pageController.cpp b/client/ui/controllers/pageController.cpp index 3c6583d3..99e4bf5a 100644 --- a/client/ui/controllers/pageController.cpp +++ b/client/ui/controllers/pageController.cpp @@ -2,6 +2,8 @@ #include "utils/converter.h" #include "core/errorstrings.h" +#define Q_OS_IOS 1 + #if defined(Q_OS_ANDROID) || defined(Q_OS_IOS) #include #else @@ -37,8 +39,8 @@ PageController::PageController(const QSharedPointer &serversModel, #endif #if defined Q_OS_MACX - connect(this, &PageController::raiseMainWindow, []() { setDockIconVisible(true); }); - connect(this, &PageController::hideMainWindow, []() { setDockIconVisible(false); }); + // connect(this, &PageController::raiseMainWindow, []() { setDockIconVisible(true); }); + // connect(this, &PageController::hideMainWindow, []() { setDockIconVisible(false); }); #endif connect(this, qOverload(&PageController::showErrorMessage), this, &PageController::onShowErrorMessage); @@ -134,7 +136,7 @@ void PageController::showOnStartup() #ifdef Q_OS_WIN emit hideMainWindow(); #elif defined Q_OS_MACX - setDockIconVisible(false); + // setDockIconVisible(false); #endif } } diff --git a/client/ui/notificationhandler.cpp b/client/ui/notificationhandler.cpp index 5efb45c4..5d2353d0 100644 --- a/client/ui/notificationhandler.cpp +++ b/client/ui/notificationhandler.cpp @@ -5,6 +5,8 @@ #include #include "notificationhandler.h" +#define Q_OS_IOS 1 + #if defined(Q_OS_IOS) # include "platforms/ios/iosnotificationhandler.h" #else @@ -14,7 +16,7 @@ // static NotificationHandler* NotificationHandler::create(QObject* parent) { #if defined(Q_OS_IOS) - return new IOSNotificationHandler(parent); + return nullptr;//new IOSNotificationHandler(parent); #else # if defined(Q_OS_LINUX) diff --git a/client/ui/qml/Pages2/PageSetupWizardQrReader.qml b/client/ui/qml/Pages2/PageSetupWizardQrReader.qml index 1fa71592..cfe3942b 100644 --- a/client/ui/qml/Pages2/PageSetupWizardQrReader.qml +++ b/client/ui/qml/Pages2/PageSetupWizardQrReader.qml @@ -4,7 +4,6 @@ import QtQuick.Layouts import QtQuick.Dialogs import PageEnum 1.0 -import QRCodeReader 1.0 import "./" import "../Controls2" @@ -63,23 +62,5 @@ PageType { color: "transparent" //radius: 16 - QRCodeReader { - id: qrCodeReader - - onCodeReaded: function(code) { - ImportController.parseQrCodeChunk(code) - progressBar.value = ImportController.getQrCodeScanProgressBarValue() - header.progressString = ImportController.getQrCodeScanProgressString() - } - - Component.onCompleted: { - qrCodeReader.setCameraSize(Qt.rect(qrCodeRectange.x, - qrCodeRectange.y, - qrCodeRectange.width, - qrCodeRectange.height)) - qrCodeReader.startReading() - } - Component.onDestruction: qrCodeReader.stopReading() - } } } diff --git a/client/ui/qml/Pages2/PageStart.qml b/client/ui/qml/Pages2/PageStart.qml index 5585631e..3589831e 100644 --- a/client/ui/qml/Pages2/PageStart.qml +++ b/client/ui/qml/Pages2/PageStart.qml @@ -213,8 +213,8 @@ PageType { startY: 0 PathLine { x: width; y: 0 } - PathLine { x: width; y: height - 1 } - PathLine { x: 0; y: height - 1 } + PathLine { x: width; y: tabBar.height - 1 } + PathLine { x: 0; y: tabBar.height - 1 } PathLine { x: 0; y: 0 } strokeWidth: 1 diff --git a/client/ui/systemtray_notificationhandler.h b/client/ui/systemtray_notificationhandler.h index 60bf0b35..a0cd0eff 100644 --- a/client/ui/systemtray_notificationhandler.h +++ b/client/ui/systemtray_notificationhandler.h @@ -7,9 +7,6 @@ #include "notificationhandler.h" -#include -#include - class SystemTrayNotificationHandler : public NotificationHandler { Q_OBJECT diff --git a/client/vpnconnection.cpp b/client/vpnconnection.cpp index daff1187..cae0f756 100644 --- a/client/vpnconnection.cpp +++ b/client/vpnconnection.cpp @@ -12,6 +12,8 @@ #include #include "core/controllers/serverController.h" +#define Q_OS_IOS 1 + #ifdef AMNEZIA_DESKTOP #include "core/ipcclient.h" #include "ipc.h" diff --git a/networkextensionDebug.entitlements b/networkextensionDebug.entitlements new file mode 100644 index 00000000..92432b56 --- /dev/null +++ b/networkextensionDebug.entitlements @@ -0,0 +1,18 @@ + + + + + com.apple.developer.networking.networkextension + + packet-tunnel-provider + + com.apple.security.application-groups + + group.org.amnezia.AmneziaVPN + + keychain-access-groups + + $(AppIdentifierPrefix)group.org.amnezia.AmneziaVPN + + +