From 6f58f19958456f69deb6f1cb00732b95674e0d2a Mon Sep 17 00:00:00 2001 From: Mykola Baibuz Date: Mon, 8 Jul 2024 08:12:10 -0700 Subject: [PATCH 01/22] MacOS NE dirty build --- client/3rd-prebuilt | 2 +- client/3rd/OpenVPNAdapter | 2 +- client/CMakeLists.txt | 2 + client/amnezia_application.cpp | 2 +- client/amnezia_application.h | 2 + client/cmake/3rdparty.cmake | 12 +- client/cmake/ios-arch-fixup.cmake | 2 +- client/cmake/ios.cmake | 4 +- client/configurators/openvpn_configurator.cpp | 2 + client/configurators/ssh_configurator.cpp | 6 +- client/core/controllers/apiController.cpp | 2 + client/core/ipcclient.h | 6 +- client/core/privileged_process.h | 18 +- client/ios/networkextension/CMakeLists.txt | 6 +- client/ios/scripts/openvpn.sh | 2 +- client/platforms/ios/QRCodeReaderBase.h | 8 - client/platforms/ios/QRCodeReaderBase.mm | 28 +- client/platforms/ios/QtAppDelegate.h | 2 +- client/platforms/ios/QtAppDelegate.mm | 4 +- client/platforms/ios/ScreenProtection.swift | 81 +- client/platforms/ios/ios_controller.mm | 72 +- client/platforms/ios/ios_controller_wrapper.h | 8 +- .../platforms/ios/ios_controller_wrapper.mm | 28 +- .../platforms/ios/iosnotificationhandler.mm | 5 +- client/protocols/openvpnovercloakprotocol.h | 2 +- client/protocols/openvpnprotocol.h | 4 +- client/protocols/shadowsocksvpnprotocol.h | 4 +- client/protocols/vpnprotocol.cpp | 18 +- client/translations/amneziavpn_ar_EG.ts | 1636 ++++++++++------ client/translations/amneziavpn_fa_IR.ts | 1638 ++++++++++------ client/translations/amneziavpn_hi_IN.ts | 670 +++++-- client/translations/amneziavpn_my_MM.ts | 1638 ++++++++++------ client/translations/amneziavpn_ru_RU.ts | 1642 +++++++++++------ client/translations/amneziavpn_uk_UA.ts | 1456 +++++++++------ client/translations/amneziavpn_ur_PK.ts | 720 +++++--- client/translations/amneziavpn_zh_CN.ts | 1640 ++++++++++------ .../ui/controllers/connectionController.cpp | 2 + client/ui/controllers/pageController.cpp | 8 +- client/ui/notificationhandler.cpp | 4 +- .../ui/qml/Pages2/PageSetupWizardQrReader.qml | 19 - client/ui/systemtray_notificationhandler.h | 3 - client/vpnconnection.cpp | 2 + networkextensionDebug.entitlements | 18 + 43 files changed, 7454 insertions(+), 3976 deletions(-) create mode 100644 networkextensionDebug.entitlements 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..e2714918 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(IOS 1) set_property(GLOBAL PROPERTY USE_FOLDERS ON) set_property(GLOBAL PROPERTY AUTOGEN_TARGETS_FOLDER "Autogen") @@ -384,4 +385,5 @@ if(NOT IOS AND NOT ANDROID) endif() target_sources(${PROJECT} PRIVATE ${SOURCES} ${HEADERS} ${RESOURCES} ${QRC} ${I18NQRC}) +set(IOS 0) 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/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..70e2ec6e 100644 --- a/client/cmake/ios.cmake +++ b/client/cmake/ios.cmake @@ -11,7 +11,7 @@ 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 +20,7 @@ find_library(FW_NETWORKEXTENSION NetworkExtension) set(LIBS ${LIBS} ${FW_AUTHENTICATIONSERVICES} - ${FW_UIKIT} +# ${FW_UIKIT} ${FW_AVFOUNDATION} ${FW_FOUNDATION} ${FW_STOREKIT} 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/networkextension/CMakeLists.txt b/client/ios/networkextension/CMakeLists.txt index 7302ba68..76bd33e2 100644 --- a/client/ios/networkextension/CMakeLists.txt +++ b/client/ios/networkextension/CMakeLists.txt @@ -52,9 +52,9 @@ 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}) +#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}\") diff --git a/client/ios/scripts/openvpn.sh b/client/ios/scripts/openvpn.sh index 544b8078..db55542d 100755 --- a/client/ios/scripts/openvpn.sh +++ b/client/ios/scripts/openvpn.sh @@ -11,7 +11,7 @@ EOF cd 3rd/OpenVPNAdapter - if $XCODEBUILD -scheme OpenVPNAdapter -configuration Release -xcconfig Configuration/amnezia.xcconfig -sdk iphoneos -destination 'generic/platform=iOS' -project OpenVPNAdapter.xcodeproj ; then + if $XCODEBUILD -scheme OpenVPNAdapter -configuration Release -xcconfig Configuration/amnezia.xcconfig -sdk macosx14.2 -destination 'generic/platform=MacOS' -project OpenVPNAdapter.xcodeproj ; then echo "OpenVPNAdapter built successfully" else echo "OpenVPNAdapter build failed" 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..1d3b38ab 100644 --- a/client/platforms/ios/ios_controller.mm +++ b/client/platforms/ios/ios_controller.mm @@ -27,15 +27,15 @@ 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; -} +//static UIViewController* getViewController() { +// NSArray *windows = [[UIApplication sharedApplication]windows]; +// for (UIWindow *window in windows) { +// if (window.isKeyWindow) { +// return window.rootViewController; +// } +// } +// return nil; +//} Vpn::ConnectionState iosStatusToState(NEVPNStatus status) { switch (status) { @@ -748,24 +748,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 +775,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/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/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 + + + From a2ec75219e6fb56ace4cf44574f4e6994edbac09 Mon Sep 17 00:00:00 2001 From: pokamest Date: Tue, 9 Jul 2024 15:49:49 -0700 Subject: [PATCH 02/22] build fix --- CMakeLists.txt | 11 +++-------- client/CMakeLists.txt | 2 +- client/cmake/ios.cmake | 12 ++++++++---- client/ios/app/Info.plist.in | 15 --------------- 4 files changed, 12 insertions(+), 28 deletions(-) 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/client/CMakeLists.txt b/client/CMakeLists.txt index e2714918..251a4aae 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -344,7 +344,7 @@ endif() if(IOS) include(cmake/ios.cmake) - include(cmake/ios-arch-fixup.cmake) + #include(cmake/ios-arch-fixup.cmake) elseif(APPLE AND NOT IOS) include(cmake/osxtools.cmake) include(cmake/macos.cmake) diff --git a/client/cmake/ios.cmake b/client/cmake/ios.cmake index 70e2ec6e..7b6b2cfd 100644 --- a/client/cmake/ios.cmake +++ b/client/cmake/ios.cmake @@ -1,10 +1,14 @@ message("Client iOS build") -set(CMAKE_OSX_DEPLOYMENT_TARGET 13.0) + +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) @@ -111,13 +115,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 ) diff --git a/client/ios/app/Info.plist.in b/client/ios/app/Info.plist.in index 45b08cc9..7587b4ce 100644 --- a/client/ios/app/Info.plist.in +++ b/client/ios/app/Info.plist.in @@ -26,21 +26,6 @@ ${MACOSX_BUNDLE_COPYRIGHT} ITSAppUsesNonExemptEncryption - LSRequiresIPhoneOS - - LSSupportsOpeningDocumentsInPlace - - UILaunchStoryboardName - AmneziaVPNLaunchScreen - UIRequiredDeviceCapabilities - - UIRequiresFullScreen - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationPortrait - UISupportedInterfaceOrientations~ipad UIUserInterfaceStyle From 82f59035747f6600b5989bab37903e4dbd039af4 Mon Sep 17 00:00:00 2001 From: pokamest Date: Thu, 11 Jul 2024 05:56:35 -0700 Subject: [PATCH 03/22] Request permissions for NE --- client/platforms/ios/ios_controller.mm | 27 ++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/client/platforms/ios/ios_controller.mm b/client/platforms/ios/ios_controller.mm index 1d3b38ab..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"; @@ -37,6 +39,26 @@ const char* MessageKey::SplitTunnelSites = "SplitTunnelSites"; // 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: @@ -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 { From c96b268a09750d2ce4e47d75dcf7f34d2ba9d7ad Mon Sep 17 00:00:00 2001 From: pokamest Date: Mon, 15 Jul 2024 17:29:07 -0700 Subject: [PATCH 04/22] WIP --- client/cmake/ios.cmake | 46 +++++++++++--- client/ios/app/Info.plist.in | 2 +- client/ios/app/main.entitlements | 33 +++++++--- .../AmneziaVPNNetworkExtension.entitlements | 6 ++ client/ios/networkextension/CMakeLists.txt | 60 +++++++++++++++---- client/ios/networkextension/Info.plist.in | 16 ++--- .../AmneziaVPNNetworkExtension.entitlements | 7 ++- 7 files changed, 135 insertions(+), 35 deletions(-) diff --git a/client/cmake/ios.cmake b/client/cmake/ios.cmake index 7b6b2cfd..d3be7d47 100644 --- a/client/cmake/ios.cmake +++ b/client/cmake/ios.cmake @@ -62,7 +62,6 @@ set_target_properties(${PROJECT} PROPERTIES 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}" @@ -76,15 +75,23 @@ set_target_properties(${PROJECT} PROPERTIES 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 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 Automatic 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_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" @@ -133,6 +140,31 @@ 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) + +#if(CMAKE_BUILD_TYPE STREQUAL "Release") + add_custom_command(TARGET ${PROJECT} POST_BUILD + COMMAND ${QT_BIN_DIR_DETECTED}/macdeployqt $ -appstore-compliant -qmldir=${CMAKE_CURRENT_SOURCE_DIR} + ) + + SET(SIGN_CMD codesign --deep --force --sign 'Apple Distribution: Privacy Technologies OU \(X7UJ388FXK\)' --timestamp --options runtime $) + message(${SIGN_CMD}) + + + add_custom_command(TARGET ${PROJECT} POST_BUILD + COMMAND ${SIGN_CMD} + ) + + # add_custom_command(TARGET ${PROJECT} POST_BUILD + # COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/ios/scripts/sign_macos_appstore.sh $ + # ) +#endif() diff --git a/client/ios/app/Info.plist.in b/client/ios/app/Info.plist.in index 7587b4ce..590c946b 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 diff --git a/client/ios/app/main.entitlements b/client/ios/app/main.entitlements index d9f00bb1..052abf4b 100644 --- a/client/ios/app/main.entitlements +++ b/client/ios/app/main.entitlements @@ -2,19 +2,38 @@ + com.apple.application-identifier + X7UJ388FXK.org.amnezia.AmneziaVPN + com.apple.developer.networking.networkextension packet-tunnel-provider - com.apple.security.application-groups - - group.org.amnezia.AmneziaVPN - - com.apple.security.files.user-selected.read-write - + keychain-access-groups - $(AppIdentifierPrefix)group.org.amnezia.AmneziaVPN + $(DEVELOPMENT_TEAM).* + + com.apple.developer.team-identifier + $(DEVELOPMENT_TEAM) + + 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.files.user-selected.read-write + + diff --git a/client/ios/networkextension/AmneziaVPNNetworkExtension.entitlements b/client/ios/networkextension/AmneziaVPNNetworkExtension.entitlements index 92432b56..fee97bb6 100644 --- a/client/ios/networkextension/AmneziaVPNNetworkExtension.entitlements +++ b/client/ios/networkextension/AmneziaVPNNetworkExtension.entitlements @@ -2,6 +2,12 @@ + com.apple.security.app-sandbox + + com.apple.security.network.client + + com.apple.security.network.server + com.apple.developer.networking.networkextension packet-tunnel-provider diff --git a/client/ios/networkextension/CMakeLists.txt b/client/ios/networkextension/CMakeLists.txt index 76bd33e2..6bd47927 100644 --- a/client/ios/networkextension/CMakeLists.txt +++ b/client/ios/networkextension/CMakeLists.txt @@ -3,16 +3,18 @@ enable_language(Swift) 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" @@ -27,12 +29,18 @@ 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_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" ) set_target_properties(networkextension PROPERTIES @@ -52,6 +60,36 @@ 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_property(TARGET networkextension 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") + + + #target_link_libraries(networkextension PRIVATE ${FW_ASSETS_LIBRARY}) #target_link_libraries(networkextension PRIVATE ${FW_MOBILE_CORE}) #target_link_libraries(networkextension PRIVATE ${FW_UI_KIT}) diff --git a/client/ios/networkextension/Info.plist.in b/client/ios/networkextension/Info.plist.in index 54d9d8d9..4be5d9ac 100644 --- a/client/ios/networkextension/Info.plist.in +++ b/client/ios/networkextension/Info.plist.in @@ -8,17 +8,17 @@ ${MACOSX_BUNDLE_EXECUTABLE_NAME} 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/macos/networkextension/AmneziaVPNNetworkExtension.entitlements b/client/macos/networkextension/AmneziaVPNNetworkExtension.entitlements index b4f08784..6f2345de 100644 --- a/client/macos/networkextension/AmneziaVPNNetworkExtension.entitlements +++ b/client/macos/networkextension/AmneziaVPNNetworkExtension.entitlements @@ -4,7 +4,12 @@ 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 From ddfb60a047aadca8f2543fd4b3c71dc598f27da8 Mon Sep 17 00:00:00 2001 From: pokamest Date: Fri, 23 Aug 2024 15:14:46 -0700 Subject: [PATCH 05/22] build fix --- "\t\t\tRelease.entitlements" | 24 ++++++++++++ client/cmake/ios.cmake | 10 ++--- client/ios/app/Info.plist.in | 2 + client/ios/app/main.entitlements | 39 +++++++------------ .../AmneziaVPNNetworkExtension.entitlements | 18 +++++---- client/ios/scripts/openvpn.sh | 4 +- 6 files changed, 60 insertions(+), 37 deletions(-) create mode 100644 "\t\t\tRelease.entitlements" diff --git "a/\t\t\tRelease.entitlements" "b/\t\t\tRelease.entitlements" new file mode 100644 index 00000000..0f5cadd9 --- /dev/null +++ "b/\t\t\tRelease.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/cmake/ios.cmake b/client/cmake/ios.cmake index d3be7d47..488d0741 100644 --- a/client/cmake/ios.cmake +++ b/client/cmake/ios.cmake @@ -156,13 +156,13 @@ get_filename_component(QT_BIN_DIR_DETECTED "${QtCore_location}/../../../../../bi COMMAND ${QT_BIN_DIR_DETECTED}/macdeployqt $ -appstore-compliant -qmldir=${CMAKE_CURRENT_SOURCE_DIR} ) - SET(SIGN_CMD codesign --deep --force --sign 'Apple Distribution: Privacy Technologies OU \(X7UJ388FXK\)' --timestamp --options runtime $) - message(${SIGN_CMD}) + # SET(SIGN_CMD codesign --deep --force --sign 'Apple Distribution: Privacy Technologies OU \(X7UJ388FXK\)' --timestamp --options runtime $) + # message(${SIGN_CMD}) - add_custom_command(TARGET ${PROJECT} POST_BUILD - COMMAND ${SIGN_CMD} - ) + # add_custom_command(TARGET ${PROJECT} POST_BUILD + # COMMAND ${SIGN_CMD} + # ) # add_custom_command(TARGET ${PROJECT} POST_BUILD # COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/ios/scripts/sign_macos_appstore.sh $ diff --git a/client/ios/app/Info.plist.in b/client/ios/app/Info.plist.in index 590c946b..c2d3471d 100644 --- a/client/ios/app/Info.plist.in +++ b/client/ios/app/Info.plist.in @@ -24,6 +24,8 @@ ${MACOSX_BUNDLE_BUNDLE_VERSION} NSHumanReadableCopyright ${MACOSX_BUNDLE_COPYRIGHT} + LSApplicationCategoryType + public.app-category.utilities ITSAppUsesNonExemptEncryption UISupportedInterfaceOrientations~ipad diff --git a/client/ios/app/main.entitlements b/client/ios/app/main.entitlements index 052abf4b..e65e88c7 100644 --- a/client/ios/app/main.entitlements +++ b/client/ios/app/main.entitlements @@ -2,38 +2,29 @@ - com.apple.application-identifier - X7UJ388FXK.org.amnezia.AmneziaVPN - + com.apple.application-identifier + X7UJ388FXK.org.amnezia.AmneziaVPN com.apple.developer.networking.networkextension packet-tunnel-provider - - keychain-access-groups - - $(DEVELOPMENT_TEAM).* - - com.apple.developer.team-identifier - $(DEVELOPMENT_TEAM) - + X7UJ388FXK 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.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/ios/networkextension/AmneziaVPNNetworkExtension.entitlements b/client/ios/networkextension/AmneziaVPNNetworkExtension.entitlements index fee97bb6..1d6ec4a1 100644 --- a/client/ios/networkextension/AmneziaVPNNetworkExtension.entitlements +++ b/client/ios/networkextension/AmneziaVPNNetworkExtension.entitlements @@ -2,23 +2,27 @@ - com.apple.security.app-sandbox - - com.apple.security.network.client - - com.apple.security.network.server - + 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/scripts/openvpn.sh b/client/ios/scripts/openvpn.sh index db55542d..75a89ac0 100755 --- a/client/ios/scripts/openvpn.sh +++ b/client/ios/scripts/openvpn.sh @@ -11,9 +11,11 @@ EOF cd 3rd/OpenVPNAdapter - if $XCODEBUILD -scheme OpenVPNAdapter -configuration Release -xcconfig Configuration/amnezia.xcconfig -sdk macosx14.2 -destination 'generic/platform=MacOS' -project OpenVPNAdapter.xcodeproj ; then + if $XCODEBUILD -scheme OpenVPNAdapter -configuration Release -xcconfig Configuration/amnezia.xcconfig -sdk macosx14.5 -destination 'generic/platform=MacOS' -project OpenVPNAdapter.xcodeproj ; then echo "OpenVPNAdapter built successfully" else echo "OpenVPNAdapter build failed" fi + + rm -rf ./build/Release-iphoneos/OpenVPNAdapter.framework/Versions/A/_CodeSignature cd ../../ From 7b1df79da5b23bb2b6a0e9be484fbfcf26240b3a Mon Sep 17 00:00:00 2001 From: Garegin866 Date: Fri, 26 Jul 2024 22:26:15 +0400 Subject: [PATCH 06/22] Fixed ui bug on qt6.7 --- client/ui/qml/Pages2/PageStart.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 From f844351afd0e8a871891673bfae70ed8df3ac351 Mon Sep 17 00:00:00 2001 From: pokamest Date: Wed, 28 Aug 2024 18:46:01 -0700 Subject: [PATCH 07/22] wip --- client/cmake/ios.cmake | 51 +++++++++++++--------- client/ios/networkextension/CMakeLists.txt | 34 ++++++++++++--- client/ios/networkextension/Info.plist.in | 2 +- 3 files changed, 60 insertions(+), 27 deletions(-) diff --git a/client/cmake/ios.cmake b/client/cmake/ios.cmake index 488d0741..f1038cf1 100644 --- a/client/cmake/ios.cmake +++ b/client/cmake/ios.cmake @@ -52,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}) @@ -59,7 +72,7 @@ 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_BUNDLE_VERSION "${CMAKE_PROJECT_VERSION_TWEAK}" @@ -73,7 +86,7 @@ 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 "NO" XCODE_EMBED_FRAMEWORKS_REMOVE_HEADERS_ON_COPY "YES" @@ -82,14 +95,14 @@ set_target_properties(${PROJECT} PROPERTIES 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_STYLE Automatic + #XCODE_ATTRIBUTE_CODE_SIGN_STYLE Manual - XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "Apple Distribution: Privacy Technologies OU (X7UJ388FXK)" + #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 "Mac AppStore AmneziaVPN" #XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER[variant=Debug] "Mac AppStore AmneziaVPN" ) @@ -151,20 +164,18 @@ message(${QtCore_location}) get_filename_component(QT_BIN_DIR_DETECTED "${QtCore_location}/../../../../../bin" ABSOLUTE) -#if(CMAKE_BUILD_TYPE STREQUAL "Release") - add_custom_command(TARGET ${PROJECT} POST_BUILD - COMMAND ${QT_BIN_DIR_DETECTED}/macdeployqt $ -appstore-compliant -qmldir=${CMAKE_CURRENT_SOURCE_DIR} - ) - # SET(SIGN_CMD codesign --deep --force --sign 'Apple Distribution: Privacy Technologies OU \(X7UJ388FXK\)' --timestamp --options runtime $) - # message(${SIGN_CMD}) +# 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} - # ) - - # add_custom_command(TARGET ${PROJECT} POST_BUILD - # COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/ios/scripts/sign_macos_appstore.sh $ - # ) -#endif() +# add_custom_command(TARGET ${PROJECT} POST_BUILD +# COMMAND ${SIGN_CMD} +# ) +# endif() diff --git a/client/ios/networkextension/CMakeLists.txt b/client/ios/networkextension/CMakeLists.txt index 6bd47927..b2f78174 100644 --- a/client/ios/networkextension/CMakeLists.txt +++ b/client/ios/networkextension/CMakeLists.txt @@ -18,6 +18,7 @@ set_target_properties(networkextension PROPERTIES 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}" @@ -29,20 +30,41 @@ set_target_properties(networkextension PROPERTIES 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_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_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_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" diff --git a/client/ios/networkextension/Info.plist.in b/client/ios/networkextension/Info.plist.in index 4be5d9ac..5ceaa356 100644 --- a/client/ios/networkextension/Info.plist.in +++ b/client/ios/networkextension/Info.plist.in @@ -5,7 +5,7 @@ CFBundleDevelopmentRegion en CFBundleExecutable - ${MACOSX_BUNDLE_EXECUTABLE_NAME} + AmneziaVPNNetworkExtension CFBundleIdentifier ${BUILD_IOS_APP_IDENTIFIER}.network-extension From fa9d6f1e755eeb9d5b09d4e1622ca0146a8e2495 Mon Sep 17 00:00:00 2001 From: Anh Viet Date: Wed, 25 Sep 2024 22:09:02 +0700 Subject: [PATCH 08/22] switch frrm branch macos-dirty-build --- .gitignore | 4 +++- "\t\t\tRelease.entitlements" => Release.entitlements | 0 client/3rd-prebuilt | 2 +- client/3rd/SortFilterProxyModel | 2 +- client/3rd/amneziawg-apple | 2 +- client/3rd/qtkeychain | 2 +- 6 files changed, 7 insertions(+), 5 deletions(-) rename "\t\t\tRelease.entitlements" => Release.entitlements (100%) 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/\t\t\tRelease.entitlements" b/Release.entitlements similarity index 100% rename from "\t\t\tRelease.entitlements" rename to Release.entitlements diff --git a/client/3rd-prebuilt b/client/3rd-prebuilt index eab32a8e..c38a587f 160000 --- a/client/3rd-prebuilt +++ b/client/3rd-prebuilt @@ -1 +1 @@ -Subproject commit eab32a8e63494517fdb5644fbd7235343b937052 +Subproject commit c38a587fcda89bab4009560d36239fa8de74705e diff --git a/client/3rd/SortFilterProxyModel b/client/3rd/SortFilterProxyModel index f2881493..15ccba1f 160000 --- a/client/3rd/SortFilterProxyModel +++ b/client/3rd/SortFilterProxyModel @@ -1 +1 @@ -Subproject commit f2881493e42bd7b7d5b7abe804dad084dd610b71 +Subproject commit 15ccba1f14b7136b6ddba8cf18c154f8593ace62 diff --git a/client/3rd/amneziawg-apple b/client/3rd/amneziawg-apple index 76e7db55..13e0361f 160000 --- a/client/3rd/amneziawg-apple +++ b/client/3rd/amneziawg-apple @@ -1 +1 @@ -Subproject commit 76e7db556a6d7e2582f9481df91db188a46c009c +Subproject commit 13e0361fd8f3e7c4ecd1d587f76ba916e862d216 diff --git a/client/3rd/qtkeychain b/client/3rd/qtkeychain index 74776e2a..100c8dbd 160000 --- a/client/3rd/qtkeychain +++ b/client/3rd/qtkeychain @@ -1 +1 @@ -Subproject commit 74776e2a3e2d98d19943e0968901c5b5e04cc1bd +Subproject commit 100c8dbd30a02199efcde7a8069c262bb285a984 From 667c5529fed687c1182479069723a07fabf62c93 Mon Sep 17 00:00:00 2001 From: Anh TV Date: Wed, 25 Sep 2024 22:21:17 +0700 Subject: [PATCH 09/22] build for macos --- client/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 251a4aae..bde3d0cc 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.25.0 FATAL_ERROR) set(PROJECT AmneziaVPN) project(${PROJECT}) -set(IOS 1) +set(APPLE 1) set_property(GLOBAL PROPERTY USE_FOLDERS ON) set_property(GLOBAL PROPERTY AUTOGEN_TARGETS_FOLDER "Autogen") @@ -343,9 +343,11 @@ if(ANDROID) endif() if(IOS) + message("Client >> Cmake: iOS build") include(cmake/ios.cmake) #include(cmake/ios-arch-fixup.cmake) elseif(APPLE AND NOT IOS) + message("Client >> Cmake: OSX build") include(cmake/osxtools.cmake) include(cmake/macos.cmake) endif() From 162d21b80dfc3caaad9405a46b4b28d1c046f340 Mon Sep 17 00:00:00 2001 From: Anh Viet Date: Thu, 26 Sep 2024 22:26:10 +0700 Subject: [PATCH 10/22] build --- client/3rd-prebuilt | 2 +- client/3rd/SortFilterProxyModel | 2 +- client/3rd/amneziawg-apple | 2 +- client/3rd/qtkeychain | 2 +- client/CMakeLists.txt | 1 + 5 files changed, 5 insertions(+), 4 deletions(-) diff --git a/client/3rd-prebuilt b/client/3rd-prebuilt index c38a587f..eab32a8e 160000 --- a/client/3rd-prebuilt +++ b/client/3rd-prebuilt @@ -1 +1 @@ -Subproject commit c38a587fcda89bab4009560d36239fa8de74705e +Subproject commit eab32a8e63494517fdb5644fbd7235343b937052 diff --git a/client/3rd/SortFilterProxyModel b/client/3rd/SortFilterProxyModel index 15ccba1f..f2881493 160000 --- a/client/3rd/SortFilterProxyModel +++ b/client/3rd/SortFilterProxyModel @@ -1 +1 @@ -Subproject commit 15ccba1f14b7136b6ddba8cf18c154f8593ace62 +Subproject commit f2881493e42bd7b7d5b7abe804dad084dd610b71 diff --git a/client/3rd/amneziawg-apple b/client/3rd/amneziawg-apple index 13e0361f..76e7db55 160000 --- a/client/3rd/amneziawg-apple +++ b/client/3rd/amneziawg-apple @@ -1 +1 @@ -Subproject commit 13e0361fd8f3e7c4ecd1d587f76ba916e862d216 +Subproject commit 76e7db556a6d7e2582f9481df91db188a46c009c diff --git a/client/3rd/qtkeychain b/client/3rd/qtkeychain index 100c8dbd..74776e2a 160000 --- a/client/3rd/qtkeychain +++ b/client/3rd/qtkeychain @@ -1 +1 @@ -Subproject commit 100c8dbd30a02199efcde7a8069c262bb285a984 +Subproject commit 74776e2a3e2d98d19943e0968901c5b5e04cc1bd diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index bde3d0cc..bed47ec7 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(IOS 1) set(APPLE 1) set_property(GLOBAL PROPERTY USE_FOLDERS ON) From 773bc0d5a3c2b07621c19a5e57255f219811a9f9 Mon Sep 17 00:00:00 2001 From: Anh TV Date: Thu, 26 Sep 2024 22:47:02 +0700 Subject: [PATCH 11/22] add message for iOS build --- client/CMakeLists.txt | 8 ++++++-- client/cmake/ios.cmake | 2 +- client/cmake/macos.cmake | 2 +- client/ios/networkextension/CMakeLists.txt | 5 ++++- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index bed47ec7..0700c2d7 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.25.0 FATAL_ERROR) set(PROJECT AmneziaVPN) project(${PROJECT}) -set(IOS 1) +# set(IOS 1) set(APPLE 1) set_property(GLOBAL PROPERTY USE_FOLDERS ON) @@ -63,7 +63,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 @@ -95,6 +95,10 @@ if(IOS) WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) endif() +# if(APPLE) +# 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") diff --git a/client/cmake/ios.cmake b/client/cmake/ios.cmake index f1038cf1..23bf5a66 100644 --- a/client/cmake/ios.cmake +++ b/client/cmake/ios.cmake @@ -1,4 +1,4 @@ -message("Client iOS build") +message("Client ==> iOS build") set_target_properties(${PROJECT} PROPERTIES MACOSX_BUNDLE TRUE) set(CMAKE_OSX_ARCHITECTURES "x86_64" CACHE INTERNAL "" FORCE) diff --git a/client/cmake/macos.cmake b/client/cmake/macos.cmake index 7b7cd381..ecfca2e9 100644 --- a/client/cmake/macos.cmake +++ b/client/cmake/macos.cmake @@ -1,4 +1,4 @@ -message("MAC build") +message("Client >> MacOS build") find_library(FW_SYSTEMCONFIG SystemConfiguration) find_library(FW_SERVICEMGMT ServiceManagement) diff --git a/client/ios/networkextension/CMakeLists.txt b/client/ios/networkextension/CMakeLists.txt index b2f78174..f47ca947 100644 --- a/client/ios/networkextension/CMakeLists.txt +++ b/client/ios/networkextension/CMakeLists.txt @@ -1,5 +1,5 @@ enable_language(Swift) - +message("Client message >> iOS build >> networkextension") set(CLIENT_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..) add_executable(networkextension) @@ -122,6 +122,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 From b36e4b65cea391163b8562a7cda5db726bf6ad45 Mon Sep 17 00:00:00 2001 From: Anh TV Date: Thu, 26 Sep 2024 22:47:18 +0700 Subject: [PATCH 12/22] add message for iOS build --- client/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 0700c2d7..a197f3da 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -3,8 +3,8 @@ cmake_minimum_required(VERSION 3.25.0 FATAL_ERROR) set(PROJECT AmneziaVPN) project(${PROJECT}) -# set(IOS 1) -set(APPLE 1) +set(IOS 1) +# set(APPLE 1) set_property(GLOBAL PROPERTY USE_FOLDERS ON) set_property(GLOBAL PROPERTY AUTOGEN_TARGETS_FOLDER "Autogen") From 953c8fce2dc0d25f7ae2fd79f5e91447297a3d22 Mon Sep 17 00:00:00 2001 From: Anh Viet Date: Fri, 27 Sep 2024 23:18:23 +0700 Subject: [PATCH 13/22] add hev5 --- client/cmake/ios.cmake | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/client/cmake/ios.cmake b/client/cmake/ios.cmake index 23bf5a66..59949cd3 100644 --- a/client/cmake/ios.cmake +++ b/client/cmake/ios.cmake @@ -1,5 +1,20 @@ message("Client ==> iOS build") +# Đường dẫn tới thư mục chứa HevSocks5Tunnel.xcframework +set(HEV_SOCKS5_TUNNEL_PATH "/Users/anhviet/Documents/VPN/new/amnezia-client/client/3rd-prebuilt/3rd-prebuilt/xray/HevSocks5Tunnel.xcframework") + +# Đường dẫn tới thư viện .a +set(HEV_SOCKS5_TUNNEL_LIB "${HEV_SOCKS5_TUNNEL_PATH}/ios-arm64/libhev-socks5-tunnel.a") + +# Đường dẫn tới tệp header +set(HEV_SOCKS5_TUNNEL_INCLUDE_DIR "${HEV_SOCKS5_TUNNEL_PATH}/ios-arm64/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) From e11ad03b7600debdee8c1e7b4de4ff02475be92b Mon Sep 17 00:00:00 2001 From: Anh Viet Date: Sat, 28 Sep 2024 22:38:06 +0700 Subject: [PATCH 14/22] clean file --- client/cmake/ios.cmake | 6 +++--- client/ios/scripts/openvpn.sh | 18 ++++++++++-------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/client/cmake/ios.cmake b/client/cmake/ios.cmake index 59949cd3..0bfafb48 100644 --- a/client/cmake/ios.cmake +++ b/client/cmake/ios.cmake @@ -1,13 +1,13 @@ message("Client ==> iOS build") # Đường dẫn tới thư mục chứa HevSocks5Tunnel.xcframework -set(HEV_SOCKS5_TUNNEL_PATH "/Users/anhviet/Documents/VPN/new/amnezia-client/client/3rd-prebuilt/3rd-prebuilt/xray/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-arm64/libhev-socks5-tunnel.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-arm64/Headers") +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}) diff --git a/client/ios/scripts/openvpn.sh b/client/ios/scripts/openvpn.sh index 75a89ac0..704807be 100755 --- a/client/ios/scripts/openvpn.sh +++ b/client/ios/scripts/openvpn.sh @@ -9,13 +9,15 @@ PATCH="/usr/bin/patch" BUILT_PRODUCTS_DIR = $WORKINGDIR/3rd/OpenVPNAdapter/build/Release-iphoneos EOF +# Lấy phiên bản SDK macOS hiện tại +MACOSX_SDK=$(xcodebuild -showsdks | grep macosx | sed -E 's/.*macosx([0-9]+\.[0-9]+).*/macosx\1/') - cd 3rd/OpenVPNAdapter - if $XCODEBUILD -scheme OpenVPNAdapter -configuration Release -xcconfig Configuration/amnezia.xcconfig -sdk macosx14.5 -destination 'generic/platform=MacOS' -project OpenVPNAdapter.xcodeproj ; then - echo "OpenVPNAdapter built successfully" - else - echo "OpenVPNAdapter build failed" - fi +cd 3rd/OpenVPNAdapter +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" +else + echo "OpenVPNAdapter build failed ..." +fi - rm -rf ./build/Release-iphoneos/OpenVPNAdapter.framework/Versions/A/_CodeSignature - cd ../../ +rm -rf ./build/Release-iphoneos/OpenVPNAdapter.framework/Versions/A/_CodeSignature +cd ../../ From 610aa89696df4ee1117a387b23e635a9f24e7e32 Mon Sep 17 00:00:00 2001 From: Anh TV Date: Sat, 28 Sep 2024 23:07:29 +0700 Subject: [PATCH 15/22] add Cmake build for networkextension version macox --- client/CMakeLists.txt | 31 +-- client/cmake/apple.cmake | 197 ++++++++++++++++++ client/cmake/macos.cmake | 2 +- .../AmneziaVPNNetworkExtension.entitlements | 33 +-- ...AmneziaVPNNetworkExtension.entitlements.bk | 47 +++++ client/macos/networkextension/CMakeLists.txt | 185 ++++++++++++++++ client/macos/networkextension/Info.plist | 29 ++- client/macos/networkextension/Info.plist.bk | 35 ++++ .../networkextension/PrivacyInfo.xcprivacy | 25 +++ ...ireGuardNetworkExtension-Bridging-Header.h | 8 +- ...GuardNetworkExtension-Bridging-Header.h.bk | 25 +++ .../wireguard-go-version.h.in | 3 + 12 files changed, 564 insertions(+), 56 deletions(-) create mode 100644 client/cmake/apple.cmake create mode 100644 client/macos/networkextension/AmneziaVPNNetworkExtension.entitlements.bk create mode 100644 client/macos/networkextension/CMakeLists.txt create mode 100644 client/macos/networkextension/Info.plist.bk create mode 100644 client/macos/networkextension/PrivacyInfo.xcprivacy create mode 100644 client/macos/networkextension/WireGuardNetworkExtension-Bridging-Header.h.bk create mode 100644 client/macos/networkextension/wireguard-go-version.h.in diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index a197f3da..4165a954 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -26,7 +26,7 @@ execute_process( add_definitions(-DGIT_COMMIT_HASH="${GIT_COMMIT_HASH}") -if(IOS) +if(IOS OR APPLE) set(PACKAGES ${PACKAGES} Multimedia) endif() @@ -43,7 +43,7 @@ set(LIBS ${LIBS} Qt6::Core5Compat Qt6::Concurrent ) -if(IOS) +if(IOS OR APPLE) set(LIBS ${LIBS} Qt6::Multimedia) endif() @@ -90,7 +90,8 @@ configure_file(${CMAKE_CURRENT_LIST_DIR}/translations/translations.qrc.in ${CMAK qt6_add_resources(QRC ${I18NQRC} ${CMAKE_CURRENT_BINARY_DIR}/translations.qrc) # -- i18n end -if(IOS) +if(IOS OR APPLE) + message("Client >> Cmake build OpenVPN: iOS or OSX build") execute_process(COMMAND bash ${CMAKE_CURRENT_LIST_DIR}/ios/scripts/openvpn.sh args WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) endif() @@ -108,7 +109,7 @@ if(IS_CI) endif() endif() - +message("Client >> Cmake build 3rdparty") include(${CMAKE_CURRENT_LIST_DIR}/cmake/3rdparty.cmake) include_directories( @@ -157,7 +158,7 @@ include_directories(mozilla) include_directories(mozilla/shared) include_directories(mozilla/models) -if(NOT IOS) +if(NOT IOS OR NOT APPLE) set(HEADERS ${HEADERS} ${CMAKE_CURRENT_LIST_DIR}/platforms/ios/QRCodeReaderBase.h ) @@ -206,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 APPLE) set(SOURCES ${SOURCES} ${CMAKE_CURRENT_LIST_DIR}/platforms/ios/QRCodeReaderBase.cpp ) @@ -314,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 (APPLE AND NOT IOS) OR (LINUX AND NOT ANDROID)) +if(WIN32 OR (LINUX AND NOT ANDROID)) message("Client desktop build") add_compile_definitions(AMNEZIA_DESKTOP) @@ -347,14 +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) +elseif(APPLE AND NOT IOS) # all version message("Client >> Cmake: OSX build") - include(cmake/osxtools.cmake) - include(cmake/macos.cmake) + include(cmake/apple.cmake) + # include(cmake/osxtools.cmake) + # include(cmake/macos.cmake) endif() target_link_libraries(${PROJECT} PRIVATE ${LIBS}) @@ -369,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(APPLE AND NOT IOS) +# set(DEPLOY_PLATFORM_PATH "macos") endif() -if(NOT IOS AND NOT ANDROID) +if(NOT IOS AND NOT ANDROID AND NOT APPLE) add_custom_command( TARGET ${PROJECT} POST_BUILD COMMAND ${CMAKE_COMMAND} -E $,copy_directory,true> diff --git a/client/cmake/apple.cmake b/client/cmake/apple.cmake new file mode 100644 index 00000000..a77073ee --- /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_IOS_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_IOS_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-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 ecfca2e9..1805b4ea 100644 --- a/client/cmake/macos.cmake +++ b/client/cmake/macos.cmake @@ -1,4 +1,4 @@ -message("Client >> MacOS build") +message("Client macos.cmake >> MacOS build") find_library(FW_SYSTEMCONFIG SystemConfiguration) find_library(FW_SERVICEMGMT ServiceManagement) diff --git a/client/macos/networkextension/AmneziaVPNNetworkExtension.entitlements b/client/macos/networkextension/AmneziaVPNNetworkExtension.entitlements index 6f2345de..1d6ec4a1 100644 --- a/client/macos/networkextension/AmneziaVPNNetworkExtension.entitlements +++ b/client/macos/networkextension/AmneziaVPNNetworkExtension.entitlements @@ -3,45 +3,26 @@ com.apple.application-identifier - $(DEVELOPMENT_TEAM).$(NETEXT_ID_MACOS) - com.apple.security.app-sandbox - - com.apple.security.network.client - - com.apple.security.network.server - + 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..f47ca947 --- /dev/null +++ b/client/macos/networkextension/CMakeLists.txt @@ -0,0 +1,185 @@ +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_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}" + 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_property(TARGET networkextension 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") + + + +#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/ios/HevSocksTunnel.swift + ${CLIENT_ROOT_DIR}/platforms/ios/NELogController.swift + ${CLIENT_ROOT_DIR}/platforms/ios/Log.swift + ${CLIENT_ROOT_DIR}/platforms/ios/LogRecord.swift + ${CLIENT_ROOT_DIR}/platforms/ios/PacketTunnelProvider.swift + ${CLIENT_ROOT_DIR}/platforms/ios/PacketTunnelProvider+WireGuard.swift + ${CLIENT_ROOT_DIR}/platforms/ios/PacketTunnelProvider+OpenVPN.swift + ${CLIENT_ROOT_DIR}/platforms/ios/PacketTunnelProvider+Xray.swift + ${CLIENT_ROOT_DIR}/platforms/ios/WGConfig.swift + ${CLIENT_ROOT_DIR}/platforms/ios/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) + +target_link_libraries(networkextension PRIVATE ${CLIENT_ROOT_DIR}/3rd-prebuilt/3rd-prebuilt/xray/HevSocks5Tunnel.xcframework) 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/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 From 2bc837cce4f34d70f730dd22cc3ece0ac1ffa199 Mon Sep 17 00:00:00 2001 From: Macbook Date: Mon, 30 Sep 2024 22:31:30 +0700 Subject: [PATCH 16/22] update cmake apple --- client/CMakeLists.txt | 4 ++-- client/cmake/apple.cmake | 6 +++--- client/ios/scripts/openvpn.sh | 30 ++++++++++++++++++------------ 3 files changed, 23 insertions(+), 17 deletions(-) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 4165a954..c84d4a7a 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -3,8 +3,8 @@ cmake_minimum_required(VERSION 3.25.0 FATAL_ERROR) set(PROJECT AmneziaVPN) project(${PROJECT}) -set(IOS 1) -# set(APPLE 1) +#set(IOS 1) +set(APPLE 1) set_property(GLOBAL PROPERTY USE_FOLDERS ON) set_property(GLOBAL PROPERTY AUTOGEN_TARGETS_FOLDER "Autogen") diff --git a/client/cmake/apple.cmake b/client/cmake/apple.cmake index a77073ee..613b3496 100644 --- a/client/cmake/apple.cmake +++ b/client/cmake/apple.cmake @@ -166,13 +166,13 @@ add_subdirectory(macos/networkextension) add_dependencies(${PROJECT} networkextension) set_property(TARGET ${PROJECT} PROPERTY XCODE_EMBED_FRAMEWORKS - "${CMAKE_CURRENT_SOURCE_DIR}/3rd/OpenVPNAdapter/build/Release-iphoneos/OpenVPNAdapter.framework" + "${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-iphoneos) -target_link_libraries("networkextension" PRIVATE "${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-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") diff --git a/client/ios/scripts/openvpn.sh b/client/ios/scripts/openvpn.sh index 704807be..ce8f6054 100755 --- a/client/ios/scripts/openvpn.sh +++ b/client/ios/scripts/openvpn.sh @@ -2,22 +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 -# Lấy phiên bản SDK macOS hiện tại -MACOSX_SDK=$(xcodebuild -showsdks | grep macosx | sed -E 's/.*macosx([0-9]+\.[0-9]+).*/macosx\1/') - +# Fetch the current macOS SDK version dynamically +MACOSX_SDK=macosx15.0 cd 3rd/OpenVPNAdapter -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" + +# 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 build failed ..." + echo "OpenVPNAdapter macOS build failed ..." fi -rm -rf ./build/Release-iphoneos/OpenVPNAdapter.framework/Versions/A/_CodeSignature +# Remove CodeSignature if needed for macOS +rm -rf ./build/Release-macos/OpenVPNAdapter.framework/Versions/A/_CodeSignature + cd ../../ From 478ba6e1895a8b84680979e3b7e08c3ed6ab5c7e Mon Sep 17 00:00:00 2001 From: Macbook Date: Mon, 30 Sep 2024 22:38:40 +0700 Subject: [PATCH 17/22] build openvpn adapter for macos --- client/macos/networkextension/Info.plist.in | 46 +++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 client/macos/networkextension/Info.plist.in 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 + + From ed7a78c75ae7accc12a3558da74983eb6345aeed Mon Sep 17 00:00:00 2001 From: Macbook Date: Tue, 1 Oct 2024 23:24:38 +0700 Subject: [PATCH 18/22] update build hev5, openadapter for macos NE, code + config --- client/CMakeLists.txt | 4 ++-- client/ios/networkextension/CMakeLists.txt | 14 ++++++++------ ...ireGuardNetworkExtension-Bridging-Header.h | 4 ++++ client/platforms/ios/HevSocksTunnel.swift | 19 ++++++++++--------- 4 files changed, 24 insertions(+), 17 deletions(-) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index c84d4a7a..50a1a59d 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -3,8 +3,8 @@ cmake_minimum_required(VERSION 3.25.0 FATAL_ERROR) set(PROJECT AmneziaVPN) project(${PROJECT}) -#set(IOS 1) -set(APPLE 1) +set(IOS 1) +#set(APPLE 1) set_property(GLOBAL PROPERTY USE_FOLDERS ON) set_property(GLOBAL PROPERTY AUTOGEN_TARGETS_FOLDER "Autogen") diff --git a/client/ios/networkextension/CMakeLists.txt b/client/ios/networkextension/CMakeLists.txt index f47ca947..2296fb0d 100644 --- a/client/ios/networkextension/CMakeLists.txt +++ b/client/ios/networkextension/CMakeLists.txt @@ -103,12 +103,12 @@ find_library(FW_LIBRESOLV libresolv.9.tbd) -# set_property(TARGET networkextension PROPERTY XCODE_EMBED_FRAMEWORKS -# "${CMAKE_CURRENT_SOURCE_DIR}/3rd/OpenVPNAdapter/build/Release-iphoneos/OpenVPNAdapter.framework" -# ) +set_property(TARGET networkextension 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-iphoneos) -# target_link_libraries("networkextension" PRIVATE "${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-macos) +target_link_libraries("networkextension" PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/3rd/OpenVPNAdapter/build/Release-macos/OpenVPNAdapter.framework") @@ -182,4 +182,6 @@ 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) +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) diff --git a/client/ios/networkextension/WireGuardNetworkExtension-Bridging-Header.h b/client/ios/networkextension/WireGuardNetworkExtension-Bridging-Header.h index 2cca0fc8..8e4a1268 100644 --- a/client/ios/networkextension/WireGuardNetworkExtension-Bridging-Header.h +++ b/client/ios/networkextension/WireGuardNetworkExtension-Bridging-Header.h @@ -19,3 +19,7 @@ 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); +void hev_socks5_tunnel_main(void); \ No newline at end of file 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 */, From 85d7dfe7dffb798a5ccf46df50f4a18445a5b333 Mon Sep 17 00:00:00 2001 From: Macbook Date: Wed, 2 Oct 2024 21:24:51 +0700 Subject: [PATCH 19/22] build success --- client/cmake/ios.cmake | 15 ----------- client/ios/networkextension/CMakeLists.txt | 25 +++++++++++++------ ...ireGuardNetworkExtension-Bridging-Header.h | 3 ++- 3 files changed, 20 insertions(+), 23 deletions(-) diff --git a/client/cmake/ios.cmake b/client/cmake/ios.cmake index 0bfafb48..23bf5a66 100644 --- a/client/cmake/ios.cmake +++ b/client/cmake/ios.cmake @@ -1,20 +1,5 @@ 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) diff --git a/client/ios/networkextension/CMakeLists.txt b/client/ios/networkextension/CMakeLists.txt index 2296fb0d..7ab941e5 100644 --- a/client/ios/networkextension/CMakeLists.txt +++ b/client/ios/networkextension/CMakeLists.txt @@ -103,12 +103,19 @@ find_library(FW_LIBRESOLV libresolv.9.tbd) -set_property(TARGET networkextension PROPERTY XCODE_EMBED_FRAMEWORKS - "${CMAKE_CURRENT_SOURCE_DIR}/3rd/OpenVPNAdapter/build/Release-macos/OpenVPNAdapter.framework" - ) +# Set the root directory +set(CLIENT_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..) -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") +# 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") @@ -182,6 +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/macos-arm64_x86_64/libhev-socks5-tunnel.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) +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/WireGuardNetworkExtension-Bridging-Header.h b/client/ios/networkextension/WireGuardNetworkExtension-Bridging-Header.h index 8e4a1268..f911e186 100644 --- a/client/ios/networkextension/WireGuardNetworkExtension-Bridging-Header.h +++ b/client/ios/networkextension/WireGuardNetworkExtension-Bridging-Header.h @@ -22,4 +22,5 @@ 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); -void hev_socks5_tunnel_main(void); \ No newline at end of file +// Updated function definition in C +int hev_socks5_tunnel_main(const char* configFile, int fd); From f9138d34c409fc4d99568c4bd33f4b690ab535c8 Mon Sep 17 00:00:00 2001 From: Macbook Date: Wed, 2 Oct 2024 22:37:30 +0700 Subject: [PATCH 20/22] run success --- client/CMakeLists.txt | 25 ++++++ client/cmake/macos.cmake | 171 ++++++++++++++++++++++++++++++++------- 2 files changed, 168 insertions(+), 28 deletions(-) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 50a1a59d..70f17354 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -396,4 +396,29 @@ 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 '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() + qt_finalize_target(${PROJECT}) diff --git a/client/cmake/macos.cmake b/client/cmake/macos.cmake index 1805b4ea..dbf1df86 100644 --- a/client/cmake/macos.cmake +++ b/client/cmake/macos.cmake @@ -1,34 +1,55 @@ -message("Client macos.cmake >> MacOS 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 ==> MacOX 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/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}/ui/macos_util.mm + ${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) @@ -36,17 +57,111 @@ 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_IOS_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_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/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 +) + +add_subdirectory(ios/networkextension) +add_dependencies(${PROJECT} networkextension) + +set_property(TARGET ${PROJECT} PROPERTY XCODE_EMBED_FRAMEWORKS + "${CMAKE_CURRENT_SOURCE_DIR}/3rd/OpenVPNAdapter/build/Release-macos/OpenVPNAdapter.framework" ) -message("OSX_SDK_PATH is: ${OSX_SDK_PATH}") + + + +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) From d4056381daf1a491b6fb1d0f85b325e6b8290a78 Mon Sep 17 00:00:00 2001 From: Macbook Date: Thu, 3 Oct 2024 20:13:38 +0700 Subject: [PATCH 21/22] update cmake client folder --- client/CMakeLists.txt | 42 +++++++++++++++---------------- client/macos/scripts/clangwrap.sh | 14 +++++++++++ client/macos/scripts/openvpn.sh | 29 +++++++++++++++++++++ 3 files changed, 64 insertions(+), 21 deletions(-) create mode 100755 client/macos/scripts/clangwrap.sh create mode 100755 client/macos/scripts/openvpn.sh diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 70f17354..da5248ce 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -3,8 +3,7 @@ cmake_minimum_required(VERSION 3.25.0 FATAL_ERROR) set(PROJECT AmneziaVPN) project(${PROJECT}) -set(IOS 1) -#set(APPLE 1) +set(MACOX 1) set_property(GLOBAL PROPERTY USE_FOLDERS ON) set_property(GLOBAL PROPERTY AUTOGEN_TARGETS_FOLDER "Autogen") @@ -26,11 +25,11 @@ execute_process( add_definitions(-DGIT_COMMIT_HASH="${GIT_COMMIT_HASH}") -if(IOS OR APPLE) +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() @@ -43,18 +42,18 @@ set(LIBS ${LIBS} Qt6::Core5Compat Qt6::Concurrent ) -if(IOS OR APPLE) +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() @@ -90,15 +89,16 @@ configure_file(${CMAKE_CURRENT_LIST_DIR}/translations/translations.qrc.in ${CMAK qt6_add_resources(QRC ${I18NQRC} ${CMAKE_CURRENT_BINARY_DIR}/translations.qrc) # -- i18n end -if(IOS OR APPLE) - message("Client >> Cmake build OpenVPN: iOS or OSX build") +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(APPLE) -# execute_process(COMMAND bash ${CMAKE_CURRENT_LIST_DIR}/macos/scripts/openvpn.sh args -# WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) +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) @@ -158,7 +158,7 @@ include_directories(mozilla) include_directories(mozilla/shared) include_directories(mozilla/models) -if(NOT IOS OR NOT APPLE) +if(NOT IOS OR NOT MACOX) set(HEADERS ${HEADERS} ${CMAKE_CURRENT_LIST_DIR}/platforms/ios/QRCodeReaderBase.h ) @@ -207,7 +207,7 @@ if(CMAKE_BUILD_TYPE STREQUAL "Debug") target_compile_definitions(${PROJECT} PRIVATE "MZ_DEBUG") endif() -if(NOT IOS OR NOT APPLE) +if(NOT IOS OR NOT MACOX) set(SOURCES ${SOURCES} ${CMAKE_CURRENT_LIST_DIR}/platforms/ios/QRCodeReaderBase.cpp ) @@ -287,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) @@ -315,7 +315,7 @@ 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) @@ -353,9 +353,9 @@ 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) # all version +elseif(MACOX AND NOT IOS) # all version message("Client >> Cmake: OSX build") - include(cmake/apple.cmake) + include(cmake/MACOX.cmake) # include(cmake/osxtools.cmake) # include(cmake/macos.cmake) endif() @@ -372,11 +372,11 @@ if(WIN32) endif() elseif(LINUX) set(DEPLOY_PLATFORM_PATH "linux/client") -# elseif(APPLE AND NOT IOS) +# elseif(MACOX AND NOT IOS) # set(DEPLOY_PLATFORM_PATH "macos") endif() -if(NOT IOS AND NOT ANDROID AND NOT APPLE) +if(NOT IOS AND NOT ANDROID AND NOT MACOX) add_custom_command( TARGET ${PROJECT} POST_BUILD COMMAND ${CMAKE_COMMAND} -E $,copy_directory,true> @@ -412,7 +412,7 @@ add_custom_command(TARGET ${PROJECT} POST_BUILD # Nếu ở chế độ Release, ký mã gói ứng dụng if(CMAKE_BUILD_TYPE STREQUAL "Release") - SET(SIGN_CMD codesign --deep --force --sign 'Apple Distribution: Privacy Technologies OU \(X7UJ388FXK\)' --timestamp --options runtime $) + SET(SIGN_CMD codesign --deep --force --sign 'MACOX Distribution: Privacy Technologies OU \(X7UJ388FXK\)' --timestamp --options runtime $) message("Manual signing bundle...") message(${SIGN_CMD}) 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 ../../ From 9aab2a44315b590324b34f5eafda8c1cfc138f1c Mon Sep 17 00:00:00 2001 From: Anh TV Date: Thu, 3 Oct 2024 20:30:04 +0700 Subject: [PATCH 22/22] clean build file --- client/CMakeLists.txt | 4 +- client/cmake/apple.cmake | 4 +- client/cmake/macos.cmake | 78 +- .../app/AmneziaVPNLaunchScreen.storyboard | 43 + client/macos/app/Info.plist.in | 165 ++++ .../Media.xcassets/AppIcon.appiconset/100.png | Bin 0 -> 4617 bytes .../AppIcon.appiconset/1024.png | Bin 0 -> 47183 bytes .../Media.xcassets/AppIcon.appiconset/114.png | Bin 0 -> 5240 bytes .../Media.xcassets/AppIcon.appiconset/120.png | Bin 0 -> 5452 bytes .../Media.xcassets/AppIcon.appiconset/144.png | Bin 0 -> 6697 bytes .../Media.xcassets/AppIcon.appiconset/152.png | Bin 0 -> 6866 bytes .../Media.xcassets/AppIcon.appiconset/167.png | Bin 0 -> 7581 bytes .../Media.xcassets/AppIcon.appiconset/180.png | Bin 0 -> 8048 bytes .../Media.xcassets/AppIcon.appiconset/20.png | Bin 0 -> 767 bytes .../Media.xcassets/AppIcon.appiconset/29.png | Bin 0 -> 1211 bytes .../Media.xcassets/AppIcon.appiconset/40.png | Bin 0 -> 1719 bytes .../Media.xcassets/AppIcon.appiconset/50.png | Bin 0 -> 2199 bytes .../Media.xcassets/AppIcon.appiconset/57.png | Bin 0 -> 2602 bytes .../Media.xcassets/AppIcon.appiconset/58.png | Bin 0 -> 2595 bytes .../Media.xcassets/AppIcon.appiconset/60.png | Bin 0 -> 2742 bytes .../Media.xcassets/AppIcon.appiconset/72.png | Bin 0 -> 3338 bytes .../Media.xcassets/AppIcon.appiconset/76.png | Bin 0 -> 3496 bytes .../Media.xcassets/AppIcon.appiconset/80.png | Bin 0 -> 3684 bytes .../Media.xcassets/AppIcon.appiconset/87.png | Bin 0 -> 4007 bytes .../AppIcon.appiconset/Contents.json | 290 ++++++ client/macos/app/Media.xcassets/Contents.json | 6 + client/macos/app/PrivacyInfo.xcprivacy | 33 + client/macos/app/launch.png | Bin 0 -> 597286 bytes client/macos/app/main.entitlements | 30 + client/macos/networkextension/CMakeLists.txt | 51 +- client/platforms/macos/HevSocksTunnel.swift | 74 ++ client/platforms/macos/Log.swift | 122 +++ client/platforms/macos/LogController.swift | 33 + client/platforms/macos/LogRecord.swift | 103 +++ client/platforms/macos/NELogController.swift | 22 + .../macos/PacketTunnelProvider+OpenVPN.swift | 234 +++++ .../PacketTunnelProvider+WireGuard.swift | 187 ++++ .../macos/PacketTunnelProvider+Xray.swift | 166 ++++ .../macos/PacketTunnelProvider.swift | 234 +++++ client/platforms/macos/QRCodeReaderBase.cpp | 14 + client/platforms/macos/QRCodeReaderBase.h | 20 + client/platforms/macos/QRCodeReaderBase.mm | 110 +++ .../macos/QtAppDelegate-C-Interface.h | 6 + client/platforms/macos/QtAppDelegate.h | 7 + client/platforms/macos/QtAppDelegate.mm | 61 ++ client/platforms/macos/ScreenProtection.swift | 10 + client/platforms/macos/VPNCController.swift | 50 + client/platforms/macos/WGConfig.swift | 94 ++ .../macos/WireGuard-Bridging-Header.h | 28 + client/platforms/macos/ios_controller.h | 99 ++ client/platforms/macos/ios_controller.mm | 851 ++++++++++++++++++ .../platforms/macos/ios_controller_wrapper.h | 25 + .../platforms/macos/ios_controller_wrapper.mm | 45 + client/platforms/macos/iosglue.mm | 244 +++++ client/platforms/macos/iosnetworkwatcher.h | 31 + client/platforms/macos/iosnetworkwatcher.mm | 69 ++ .../platforms/macos/iosnotificationhandler.h | 28 + .../platforms/macos/iosnotificationhandler.mm | 90 ++ 58 files changed, 3706 insertions(+), 55 deletions(-) create mode 100644 client/macos/app/AmneziaVPNLaunchScreen.storyboard create mode 100644 client/macos/app/Info.plist.in create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/100.png create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/1024.png create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/114.png create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/120.png create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/144.png create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/152.png create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/167.png create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/180.png create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/20.png create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/29.png create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/40.png create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/50.png create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/57.png create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/58.png create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/60.png create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/72.png create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/76.png create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/80.png create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/87.png create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/Contents.json create mode 100644 client/macos/app/Media.xcassets/Contents.json create mode 100644 client/macos/app/PrivacyInfo.xcprivacy create mode 100644 client/macos/app/launch.png create mode 100644 client/macos/app/main.entitlements create mode 100644 client/platforms/macos/HevSocksTunnel.swift create mode 100644 client/platforms/macos/Log.swift create mode 100644 client/platforms/macos/LogController.swift create mode 100644 client/platforms/macos/LogRecord.swift create mode 100644 client/platforms/macos/NELogController.swift create mode 100644 client/platforms/macos/PacketTunnelProvider+OpenVPN.swift create mode 100644 client/platforms/macos/PacketTunnelProvider+WireGuard.swift create mode 100644 client/platforms/macos/PacketTunnelProvider+Xray.swift create mode 100644 client/platforms/macos/PacketTunnelProvider.swift create mode 100644 client/platforms/macos/QRCodeReaderBase.cpp create mode 100644 client/platforms/macos/QRCodeReaderBase.h create mode 100644 client/platforms/macos/QRCodeReaderBase.mm create mode 100644 client/platforms/macos/QtAppDelegate-C-Interface.h create mode 100644 client/platforms/macos/QtAppDelegate.h create mode 100644 client/platforms/macos/QtAppDelegate.mm create mode 100644 client/platforms/macos/ScreenProtection.swift create mode 100644 client/platforms/macos/VPNCController.swift create mode 100644 client/platforms/macos/WGConfig.swift create mode 100644 client/platforms/macos/WireGuard-Bridging-Header.h create mode 100644 client/platforms/macos/ios_controller.h create mode 100644 client/platforms/macos/ios_controller.mm create mode 100644 client/platforms/macos/ios_controller_wrapper.h create mode 100644 client/platforms/macos/ios_controller_wrapper.mm create mode 100644 client/platforms/macos/iosglue.mm create mode 100644 client/platforms/macos/iosnetworkwatcher.h create mode 100644 client/platforms/macos/iosnetworkwatcher.mm create mode 100644 client/platforms/macos/iosnotificationhandler.h create mode 100644 client/platforms/macos/iosnotificationhandler.mm diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index da5248ce..94906da0 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -355,7 +355,7 @@ if(IOS) # only for iOS or OSX #include(cmake/ios-arch-fixup.cmake) elseif(MACOX AND NOT IOS) # all version message("Client >> Cmake: OSX build") - include(cmake/MACOX.cmake) + include(cmake/macos.cmake) # include(cmake/osxtools.cmake) # include(cmake/macos.cmake) endif() @@ -395,7 +395,7 @@ if(NOT IOS AND NOT ANDROID AND NOT MACOX) endif() target_sources(${PROJECT} PRIVATE ${SOURCES} ${HEADERS} ${RESOURCES} ${QRC} ${I18NQRC}) -set(IOS 0) +# 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 diff --git a/client/cmake/apple.cmake b/client/cmake/apple.cmake index 613b3496..11e58be6 100644 --- a/client/cmake/apple.cmake +++ b/client/cmake/apple.cmake @@ -93,7 +93,7 @@ set_target_properties(${PROJECT} PROPERTIES 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_IOS_APP_IDENTIFIER}" + 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}" @@ -134,7 +134,7 @@ set_target_properties(${PROJECT} PROPERTIES 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\" + -DVPN_NE_BUNDLEID=\"${BUILD_OSX_APP_IDENTIFIER}.network-extension\" ) set(WG_APPLE_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/3rd/amneziawg-apple/Sources) diff --git a/client/cmake/macos.cmake b/client/cmake/macos.cmake index dbf1df86..12e26ac3 100644 --- a/client/cmake/macos.cmake +++ b/client/cmake/macos.cmake @@ -1,4 +1,4 @@ -message("Client ==> MacOX build") +message("Client ==> iOS build") set_target_properties(${PROJECT} PROPERTIES MACOSX_BUNDLE TRUE) set(CMAKE_OSX_ARCHITECTURES "x86_64" CACHE INTERNAL "" FORCE) @@ -34,22 +34,22 @@ set(LIBS ${LIBS} 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 + ${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}/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 + ${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) @@ -71,15 +71,15 @@ 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_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_IOS_APP_IDENTIFIER}" - XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS "${CMAKE_CURRENT_SOURCE_DIR}/ios/app/main.entitlements" + 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" @@ -127,36 +127,36 @@ 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 + ${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 ) 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 + # ${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}/ios/app/AmneziaVPNLaunchScreen.storyboard - ${CMAKE_CURRENT_SOURCE_DIR}/ios/app/Media.xcassets - ${CMAKE_CURRENT_SOURCE_DIR}/ios/app/PrivacyInfo.xcprivacy + # ${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(ios/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_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") +# 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") @@ -165,3 +165,17 @@ 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/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 0000000000000000000000000000000000000000..bbe3d54668b21b394ee80e299c691446804f140d GIT binary patch literal 4617 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%0D@$?fW)yh@lQd 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 OFP$?wTdZgQ;Qs(OiyJZk literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f88f66c774dcff452a2bac52483e35166c84c310 GIT binary patch literal 5240 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..51829dc1342bc39b907cf52a5dfeede1985308bb GIT binary patch literal 5452 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0e28bd7b43b4d4eeca39f597456a2f5631b8e739 GIT binary patch literal 6697 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 TGE!b7C=?}mb-5}TaPa>C=#WKm literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..44858c5a539e75930f1a2df0c2208127943f1030 GIT binary patch literal 7581 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 T7d+4lnu?^Xpdnu=YaaF=im8=v literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..911f5491eff0c4e75f8a33510029d9d7ad636c3c GIT binary patch literal 8048 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..bf9a2c1910f598d599d971baead3b34956e7a310 GIT binary patch literal 1211 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 N002ovPDHLkV1gfpErkF8 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..83c3e6b7ae98c4923bfdb5efcd03fcec550a6bea GIT binary patch literal 2199 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 M07*qoM6N<$f;5=#=Kufz literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2714c6bfd2efb872d6e71a0d202e21c612581866 GIT binary patch literal 2595 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d0f203630e5ec2ec3b1985288cefe1b86bb047e7 GIT binary patch literal 3338 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 W8X(74iC$#@0000(aDAZ2J5$RZ4t#%5nGJ_Xl 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 + + + + 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 0000000000000000000000000000000000000000..175b1afc81ded929f2c92f7b41c84826d1a9f1fe GIT binary patch literal 597286 zcmWifWl+>#7so+Sy1N@hTBKt|S`ZMBh80kdj-_j*L1Gb5kd*F{&ZSqR8|m&^I(GN> z{GS(h&Yd%N=Ds@LIrn})Cq`FWjhKLe01FF?SVLV|4+{(Dzby_H-qZgAl$k&5zku(i zZUVu=BBcEP!p2I^r28+44bfA3ja4gSolnB8p?_WzS!*@ zgh`ukU}A4(4Q+Q$pb;YhWy)k&V%t?>t9{kcE{l2!>O9!Gq;2PL%pnx>ap301`*%P) z5R6_4UV)xs6llh(FsJ)SG_V z-he}Z-cjj__*?iU*;31Kw|P)zQGQlu4^TW|a}3F>-CWAFS?silPqR*_uCD$`TI8qo zng80AvC}6uW5cKaZ;Zlq`|5E+PTvk)hUk*eq0j))@hAB=18B3(w*uowv)(}~Ek;SQ zO__hTH#Oy0&F&$89?VXTGTn+TJ@g+e1Cy>njt&xi^ulI|zA?)kIuhFDi-^G4V8&$r z(N%QtIsT5l6C4bn?&>xqFOKNc+9C1%<2E6Iw#mc7%aR!ApRug4fJJw18Sw89o3A7H zY{uHMIJYG1m@THnn!Z5qpW6ZuQ~+@&5#S?Wiy^;{5O+PZC(L(ZPDpd|VG>SKnf8N;%oq`rd zwR${-tj)m6F`C2V`GfC+fJo?#>!sx6L0A>rh<{CdX#Az6nF7Q z@hbpx1UtAYTcDue2fE{x&byRUW0tG;i#g>vAF4@EpsRufg|f!lJpbBJ80*qH1ZRxX z$2=8+_Wzu`2i54furJp`&n+#8Dl)y+dk#FnfnskYwo8YO@G=e=0Unp?MbpQz zy|H7C#IF{t4z=5psX5|=g^(&FyZq~|Us{g4qQBA%ytfM69C*OMou^#4DNzd6sS9zU zhO-9Q7v}>PU;FRB?y8wzxzjt=d@EI=J41olHlo%!iw+~5w&ceT)vnaDV>D>H0<&Z<-bomT8n2XIB z(@^cCVQZ^;&_M#Hm(ZrzLcoh_;=35MPVo5O5=8zVbOty-7hkb1TJmS)DtOuv?>+@Y z>s&#D4`g#TP3LB*A6yqp0hnx#|AzrHwD2zWq1-m!t?(t(@k>sD>TP^`w(2?Zu7of4 zGSSpw0h7_Z{HV9(G+n9E4Gs&LmFaB~YdQ#pj`X&gZkh&OJv;%*OzJG0HvWa*Uecmh z^-qlwlKeJ+*a&=Oegw*wU@YgvSv}^MIJm>KR_O)y_$y4{N%=0~5j#$LK+@Wd_gJMW zta91q-jLYDnCR?|eBm`y*~4(&yJ^b7RMb+@HrX3;WA1D(wF@7D)F=F!dj`Lz4E102 zd1!l&U;jgpZ8!K{GOLijapwD{+{~j&4pE_Z7P?H75JDubIqyPiyM63)nqw(b9k3PT z5H&?K!tn?!*4_)Rjm*QeoiDbhF1*)vZ}6yCqvzsXoR>MOzRwR^1i#SB*em=~`h6_f zruHjARgjPXHbB3i8uVJEfK2~go7E=;&J)ia9p`tH;ppeEaq#)(yrFhcmHeCwrNSK8 zkq-IkJTY&iCr?`7Oo4+`VMQT2WJ0d#)ci>c)a@3c_8uvm7rkA&sC8a?Fde7+E{Wc` zBe1}mGkra}WZ7a>=InMGO&MmCp%0Ja7kXhb;c5f#(URDc;GlOU)z_+YM_jPU} zy+;R!^9NUW1LL3P3Eeg=C13Zx=%(u-Jh=ZPSS(W75*v*w9C%Uu)8h<+%(&;gBn<0X{jdDLA7vzYKY(9fS-9t)ok_+Ftl1 zrf!BpRX8^QyU*i`%U3x`R-2m&L_|a-&>E?x)cUkt zl+-~Sv;GJxiI_7l{)>*_wLLRH|KQC5=)x|i86rO(oH_TZ&khZ*hdbvVF0%Zy^E0Cz z`S)O00p74A1jMq%BQS`y_UYLbuv);}J3NMk5?1&ebgqPqae%5DFpxMy% z4zJQCqsE}Kz;@|N#5i13>VZpj+;;2QD`;~ZXdazGrtTq3mDWtq5|&vbS8xWv7^3EJ zdVos!F8nyvbfMui$B9#m zZ0_}8uh*D7J#KS5juGnrdjDHzC-KZLv5w-s`5!QaP=*xEw!-q)pUhlG#IMJs#fXe*#Y&~ctE~m@{TLC2t4$=ELglBOn1NjG{vHC zp|}(>N6kBEBD-&74My_y9$Q9r2qrA}u#DSwKznNDl4-N4iXmz~efll?_U0Sc5?{s}`H{iZ1#eYFH2#mF1Y z%>DE@pxaRK>inS)2Ht>1K)-#IBd;BRA3~K)mtUh{9;?~J;BQ}u1G4D9RZ<5O5Y-T0 zvNpQK9Yu}>%9P#aLg+C+cPY!0+M8XJJ9SH)4*4nAWp38FU=n|CO`C{Q-vkx=CH^Ti zo}5bJG54DBd?NmXBLY#2@mp}|DsKQcOkF}r!;H%?F!Ft;jr&dCGa2j69A|AbtPoHG zFX@WN4!T~1Xk}Hy3J>R1vg0LloX9d?8qE+kIfE;*Q;J1A9BAUAR;&x5FVLVM%HX^A zXjs|~+S+S!)`Hau4Il73TSb*Nba~RqfrAz>Oxp)AyJhactBI7?=*K zOls7gjk>z<5|%hA*446IU(*>w4Y8;~^9(Zy^jcm$Un{|{r(j4%($mu7%G@4`w!hSy z!>THg_#D}FiH|FAiLLbylx!c!7hbzd;}eHt_Y03F_3TIx&lrS^dRN#rx2!n-*@t>pS}$D zACOX-w$tK{nIZ3e11C|Jr&^JYG-Le3Wrr@JMe!T4#U@w;+Do?_rmS zCL*JtY8Pyd)P-*8bTjvzLEL*=c^CD<`La0c3&wYKWp zsSLIy_7$e$3l2T3KY)T$!uGi=U+~T%MEDvbo|Y|!NNxwd5+0vDgKw}NaXQBD zpYPPwRjd%>HdQ>;1R99b5+Ng|31D68QQpUI0~3|*U;c|@PRIStbLP1FWaByyD8u&D zmk(ChZNQ`&^7(POMD>eBmh&hio!)OhSQe-`{c*lDVBUx+}g3 z5oH-Hz{Qi0MBQ@89$ydDKTE}i$RHg*23@(wG)eTU>1x5nd=WCvP*5_9f4JnH2Z z3fI@Qo4K(YIsJD~?;vn|f3Dflbdlx}7mdy5tQ^Oij3&0kesU15aG+caEPPV?x#j6c zzt#<8-PTN;hMyMS{d4b?NYgFZmR~rzh>`uJh=`nK%>YgfaqwcHD<$n!%it%ck@wBv zBzO_60%`XRRp*PI3n!CC8ne~{AFFr@e6G|#ov2k^eQT$9T@arnT*%$~pDG*0KljrM zlXd||k->YEm9MwCdAj|w$;5ZHp5qm3foq4X>riBWC5PX~cD67Hn0~yhVmkkEN?j{u z90a;4XMZO5S$|;=<0jf#qFY5MAoJ;`Fq2OEk*~sPwWPvZN#-X5R3!MKTlfDsz49a# zdU`oUIm-Pk#sf}<6 z&KZ@=qG31$y9F=;hun3x(J0bU9jRGD1qCy49V|#*7L$%!jF_>ON<9k2zCl@5oS%bO8 z>qcFDu0Rq!cVq7zBdYd5`rztSGF{ExOq@9!`GYnjk1MkJ+FyXF6;mGjz6wws$m$E9 zow^*HY7{X5F2v_vN=si`UB3rrc;coSG#0Zp0ry;D1XO?;-PE>2Ire>y8=#R*J>ef5 z5e=f+OXxRkvohK3n;x6Av}`5KInT#H;po*=3$BvM}jm8*w37oMc0sd>M8@ev$C_4{#JYK}|&faOPQ4a)GNpx#>0?Roh#!D!*| z=viH_rcXp8v^~=TnODU8MLT~zY>T3`nYj|A#OJZD4TQZc2R6Us4oLQ`?Mpsvf8(Rj z!CSW?vbQs{eNOhBskkGlB8tc|tH0k8MDxb4ew|L}8FcZ-FDo$ozMo&-o6+Vpfsikp zip5bYKVwoN_L%JvG;^c2(q5DQOVq|En6h?foR*N5js3gHH|zxH*SZj zvY5QfdlG5hHPIHw2!*j}Q%ti^qu_PzSxui0C%VoXTOR zO`9*F)Udu<&+W!K=|YLj@2i}Pw}Rt`6~RC5`CV*+g9K!Y4GmDjInM3(q*tts0EB%# z)uv!y+97jh&hoxj7`VwFhXkaHn3>}&u1;iv@wY;PZ zry}i*LkP1Ble81KzHDcw4qa76sJROU3k1}j!9)RrcUxw z1~d(*r{7};uwr9=hV?OU9nn)+{|pxJ-q`1d{h;~CId9NQPS8e>oNi2}(PO)FEX_CW zh;2)^9`I!!mx=AZvH4HbPp!zP;m>n|sSP4&p9lrA&M&^bcWQsikKLDu;u&5**UHKM zOes%%OeFR*q7k{pHN^rh&TWCdO;ht+;W?5t>%AzEz_)kv%5IN)s|r~yjtMmzm|7w} zXFQc@Hmb$@#6qkxVZe<|-Tiv_B^>EHMRsxRwcBtsBzIbIJYr2bXI`h)87ck5Nn_EG z#b`P+^zKwL4iVT(!SDd(_3_Nv*@LxA{NZl_HZRN-=~TuWbmIN^3RzI6iqRKq`2-9j>h0 zXF9uk(Nb6Q?u#MjRzx{O)(ks6@N?1nK-%m&ZEIIk#o3~i`&haN0{`>WPU$EIcP)9g zCl&$c-=oTFFIek-MQ4~ZzQsuuZPJZ%JbKwKd$Wt~0c`4~W(R=Y{r5;hbdzxcF&qIk z$xwOQO_zCpy2rRoiHU0AzRgK9Z=7bsMBM|Qj^%eP+FWme&XAMaRmoB&pbF?HzRlY8 z+^6fI3{wEj2+OcDRmH8by)$6(HUJ>9v z4Rqhv|4m*#tNHTD+uHfXP5)XDZ$|s?fxDTQ3dg)%vH_NX+?MY&^86pdAzn@|&#G@4 za-fyKKM8R->jz_leCO!L0K@5wUA3mjm{+AU?WNMy(+9|uD&!;E7#(Z8e$P!F>^>~y z5AK2b&8Z7i=&++fzt-VOJ!UpMZnbte0+Ga6r@)GYc_-%&Hd{T52>96z#xoByOX4X= z7TTfLqSJ_b9%64D%y{2#z`K$nGMmqHwviOVpQdTRreK~`Fe_i}t;l&GkUp$~q&+Q8 zlaA>+9bhM4Z*B^1mGxCm`dstpNcEh%_UDYMX_@VX`})JC)+A*oVgo26@v~p z9&&K$yNA-I?8;KitV&@2NLRsse~g7?^|3V1wG^?>W8V$;ByzBdW+iX3QQjuOrt@3tn* zQ<$dufUS5$9WBOo{+}2Ri66;aZgrd9xMh!LkqP%#6&1%6SJ(@p0H#*|P~e+O3fBna zd)cd65nlKgXY(d=#G8SV5>lV*fTJX-@OGnigWp4_^C0}F`XW{NioR5P?WXF8SB zBN9SoFfk)$J^^V_m^t@v6q_c`nhc3C0daTa{geRvJ?QXq>iFg!1ns;sWLyrM38X}^ zI>Qt>Fjc@Y+{;uh@sO_hy5vc0_{=Tv0#{a*Ps!pkM_ThCO*R_B3JOtS9XbD)rJr=O zlRmnu0BZZ@ss}li*fds0S0maCVklSL`=N_j3Z$C``bT@PUk4gaPA)PBK(w)rKmx1S z7?G`O{Dt$>5+35ibJwmFX{shdL5Tialo1NX!+d+Qv}rs)*GP!*LF=G~TCI~z#4J`V zN&Oz-HEO}lTNqfvOz*1$%fX)zzW({$v+rhsJAzmJsL~$@di)Q(*=Y`p@w(qsbEks1 zYCzEUAG#`DA)Zc{)P2&*_2IJmZh^H$D)Q=3qmh<2TeR@4R>(A=8fjYz-yI7Ttq;Ja z?e95YNt-R@lc3L#&jQ+@>M?z68$SJFFi)lX`9(<@{i~k_VPT0I!zWv8o=Hl2A4p3K z1fJhcC@b?aAoSL#hKolFei2hfEj}cPGt1&Ei2)p&_SHc%*M$GZ}AIs5oq-t|IJv&hwN6Kn%PRh|nGDoX75a|G~WL zFCMyTX%M@0_S4r!=w}B@eRdoVQiM8Qz05#^lL$7Gi=*XF(FFyh<590^uB&a)*6hxA zL>#p+IW)oOn$D>|bej;vIeC(DdpTksgM3N#ydb63y4hwEde3#!qhK+yUu@ij)F$By z7H{16Ix28iO8i>dYUj1K;jtcDMIyQEHC?ywKig}6tp zw0k`g*g5lGRqC)5!AJG316~#}_d&aGD_Na`<21A2Gl0%R`(wdU&P>8~uQ@p61Dq=pu3+I(xgIcosgCry-e|j#?zSPj@Kx+TkS|7 zf1so=ZzK29-`|s7-zmhqhCh|>Q31nZ zjZHdfe{LaSJlxC5ZeLvnFk8PGK+%1A)ErV>hv5A?`(X3ORUR< zciozJ94nG4Th1!s^A}pm(U{kKfOR+dhM)BM%BbxoE#tR-({V|OMVDil*mtvk$X}S2 z_-vJNDI3Kmj{AA&;!VhFAGrSca6Z@0buY=5;Q}!Z0^T=zP9QxE*_Scxu2!*j6C4PZ zDsoR2;pqIxJ{o3~ULZ{zZ5D3B7HV%*{2{3MLex4KZN7o8NitE-OV^yR6SquUP~8Qf zn&00_(2|H?HUur7QAx|WDXpsMhsx-N0x{(kcT_}0`lPF|oS`Nxy*Isfs2#|BLGbJv z*z2=%5Uv{_gfISkjyN;pjS_{@c1;Qsf!ps5`}C3id_IaNW!VGd{&S%V^j5SyyDoUR zx-PcsPi6OgN_Eh|vjwJgPAWj^oHrjP{(%x;@w;!5T z#pm-D{;M%PSRR*1Z8LY^Z}uAlAv7aKZ98JYLFlBw|Ao39i(xQ#&OYcGz7Fl*!lUC6 z%DHS2in)Uh#Mgv^gz^+>N2X=<+c&wY zRTDbEHeMs$&iVJ0tQ$xc+WsqNCfVS6%106b-CTh)q5C(72I5?$K~T$jc$}p2!R?JS zR2m?Uni;z-Mbn@%UgdVgtY@qW9yl_5d-VOu1;5h@efMn0pT!pUUhs`^+O*o~^yw6> z?~+fdT9+JXdJ*@r2=|1i z<=S`0MJ=IYIkOrMT~*r;qLw&1+K$*irQcYR%tC;_uu3535^^|NL#3uXl=jqpT7p*o zCVACDU!cmsEN&S7uzo0XlzR()>YdL!aLqMhrmdCvV1yE`6@_2>{Tpij!BAISwd)ml z)c}GwZW-&hZLl>;qCs)#Ohn}nxyhAl!A$-fE;^rORk_3mFx6I$)f>>%FH_2op4K>l z_F{?E+=`RGn2W%f3V29zQziz~>%Hj`tP>S1@%evm%V-(6mOuKo9W)cZhN&RJeX z78J)P3nr*11%yHX{lYXoX z+iS{b3Fo5kqHB4&g)@dTqUu6{Uu+ef!GRp(T)B`~!Q4_pfvBj-sw7w1^vCBh_C+2z z=X3qe&{Q|`lHY_96Sp7{8rd1SkE-e_tc|~1P>Xq=Zr{<*vv4#mpVt{{GBLXz#Og7hz(yHR zBi)14M5p56VK`GxX~i{%-w64SXUDwl_?Ov!C@e7$0$84|PwfUZW)%s7au}jyZ0mOh zO<%yI#-NeVVSPw(hmU8#9d?^ZxS8jxhQVZpk!~`X%U>7*0AdFkgk!`B2mErV_VvY3 zEU4eXQeP2KW;B?9XU7#*WSwLQaF?^7?a6Pr4oVNSGHUb1<}DR1@|9YMiQD~*JOF3S zYtSS=4g_J*-e2LMt1SsAZb~2)yA-} zZE+v#e@w2y(WK2azt0|nbaO^Mgoov&^ADfV3E43tMdz859cmG@@%{k+Om5c-|(d>^;Txy+5*`O9Xu=u(ixXn zI#SvxQ_M6O3kD$~U~iZT2iHCxq$$c6M128-hbQ`y@kl5ic^AYPkh}lN74r{_lf``h zl}+T^NsBkxbqo1Dip?n$!Wv~z5c_b{=DTTB#4{4OjZI@ns5kgPrW-C0I-l!vQJFZ^ z&w}O0@qW>&zq|ES`BGn6?k#;eY#t{)PEI&mfVixpZigLhJypjR*ncn^vGXb1Bg`%SHb=9c zCTuzA*aQwiKyxz@b^%RTccuXaNd0HfaCmzV2PP}8AoAA)=Z7&= z`eStSoFkU!!KbFD98_ktIMbFr!JOC>?66#UA7OI;pO6)7!=I>5rU+=R#KxaPdX;l9 zY(_56u8}r)5r4frokM}Uz*b_G^_s&_Fp;yY@-3aRhf1m)i==jA@eh@cTMb__z&qkk zlA14ft5aZ`(VIEEk-zk)=qc)`SO|x=k?kwwef}lKw9C29=tjdMO2^2c%H%=R#A;T_ zha-B&xh4umQMJh8zO5en>Gf}4DeIZIeBo%mH?~bNzP*7ZmTSD;A1xifm?ny}`w-Wi<$T+vOmxpJ6gTNO zfEr(|pQdMpyLKhZp5A7^{B;kj^|joEPE&Ty$DEDOGgW&iur$4i)kY~PJ`4NM&7mb{ zt4m3hrAQ!Xeitp`oMp1ehkn;#r$A9mC`s@;HEl)6-D+*+mRYr#spYj_c;G4DGLW=@^Kgj zj>IpTvAe|&KC)rzTb9nd7)@kK*B5b3Y`HF3SwbosWr4pwdMdB)JaNVx>~lm~ltj1I z5Ptg^bxycBz%3zn`BHHA!7Q_}vT00nv01()6sfhw_Vx8;Ft!Rl!%!Wu@c_{UN^5PM zrZkRE$|xl9cO%Yipn}`Kix+X}YPDyij2=b`k>YLsB%RKRNAzELg<)gRzY(qj%r0$$ z(_bwR!vCJ$khP#NnDyhTd3sXxUEg=$&Tx~V@oN#+Ir;FIaZT{pNLw?Dd zfS{2c(5cXTc@{0`_37*J1P>D+hzT=Jn;&c@1SpfuI{!X&JpBqKmG{zFY+HGn>ixhi zeJ+dk(auJD=~*-*bQ^{zS~A-#n$?xiu=g?^S*nOmGY57j)51dxBdTp#3FJW`;^Y0? zFscEt>-G5wnQ4Reg04V9_ps=|Lgj%oSm8-S1sU20$_#XEF$018#t(D%FuHTG-bqA~ z=+L;g+3*Td=dB?lrU)q9UO!8H)8fhq4D|sKn8N`jyG+BO2HQpQY0cJ{DOuhfjb;|R zbKcj&zeduBGb`p^Xp@|A9|gwYRlbF_+Fyb$k}*0&4hR*6j%mQ23C57YL+8T7qZ8;G zZ9KXzn@4t^lV)?aifMQoS)F5qGUmSoJB*gDYNJ3yJ{uNSz;5MQ4s!Wj!On|M8P$ch zHLZ`*!_lU7)pH-WB^7o2g3?1Xe%W;uE!<0qpEv{yWX7LYh)=NLbrdKFQvnP;J3}!jg>bb8LOH9O04M^?d#YAlt!^C_tBuLe(n+NYlXS-fF*U=c%u``bF7|UV}RQQgFr&r0}sg22m?! zYgh3JWb1D)`=cY!TZ|?rD)Ma*5xCel7XNRl3*}bu{mv~ga$_=>e}kF~Wg|f$aMU-w zGe6qL*_nSB+ATACXb{SM2#)l1 zXBuki-05T`yZJZE`rp_zB3tm<}%OMBD$Vw$a)oXyBhdg zE)D-mBi3wXDM4Q+rg|#Mx4Vsj0w6@sok|ed6~MCFfvG-Q_`FMhSbY3If9SJ1hoshLc5j+#R$iLA*~b)e+_vX{ z35aw)9z95##Pjf>Ni6iRDI=^qnu0p4@lE=Gt-qy0Tcwy3WJ&ke&Nf5=6fcX2e*w6*soyWl&6dP$OXG3_? zzA6(v=GXxXuJvGaOyk=lFl&;uY9EC=-Tk!Q-WgLkE<4qHbUttAQm`v9w?9bivf&`# zyliyc`;-I_N@HW{40q0I`@!$aG>fl*1OIb)$m8r(*X{_iaZi0Y@)-E-0&%CY@iL=y zTYFK+_8u_#JgnY*v-=eJNX<4|QMcAyv_$;Jv5R(0M4i(_V5C@On$Qe}I3z z*n`AjKzN_QRDD2{*Yl`$%rEkc7Z%D|ev%g1HcT3fEgQZ(o*+s*HT!){k-W~?P-v*tbnL(v8>L&J0MP~aUV>XdE9+4$lky$wt9#QfUvP4~ zyL=T%$%O?*@9tp?9s+#xLUjZ zg~xtzig!*hQ&2?}VRFzEtikfXM%oYHj^#y%lw;Qq-rf0$yX5ZOKxR%1d~ABl$>PR% zVW`72-;HSvo|Vn~J z)iG!K>h|gs61*CVJLS|vQ~)k_`uKV>>%4xbC5Elh4NR8Fd-l=QwI5dNe*%sQ7B zO&83u&Hrlo<_wCQwk#L4lT8q%U!3Y4+u2Gn7;g)s!NnuI5R6-;3n}*XT{o=zE_(Y{ zx3DQwQ6Vyw#r$|wjHWs8xl@!D5+vrCnL{Uk`rXE5Rm=!8btSvjM&&hr4Lmb z>lN6V=aw{nM8RrVYU!cs9#(o7hS|JuW?G;)w^XQzz36N$f|XuC5?1%%8_;>c;qgKl zGxs1{tq2MiTjJ=MFJS@x>nf?dLbq6m6#7U}v-#hC;eiz;3Kk0eH4<}eH zN>8t$uWiU{?|up0!tVXU6Sw|K@b!?4{7hb^5}6l|(_K3>;D-`e&(#Hq~R$uDK}9^ImM$D%3khJWXB*Fq+Z+GXn|LSOkHgQ zn|8W&ELG4H1hX2;QkI_m+VLi2zsy9Cvbdw7$K}K(q7#LmHxYxupt-Z10`%cfu;~3C z-0m%!^vhdgitze>TRxZIhePY30rxMza+=3G;Z)c*J3YIELP}rFw?*)hx4kp36Pme? zNyyK18M%cn#hN?2lq2oD#r+l|(!M{8zdUStEt0G_-KnIf|8nIFmmBWihr0k z{!rtV{Y|cy;gE`i`W6%PVUyM7nIvOqK%;!N((}SqbGE&}yT6s1R`;8{MC7Omi7kO( zqHla;xONk*yauEgQ6mXvwrbIFCC={XH%pNE9`{(LYL~heW61aw>t@R8yMBu&o5s3y zMqNTRvfKX~oIbsW+U)uO)xy)C7IvigCEITEzor3>V@6wPx8E_nFSj&_7gVKu{XjGgAYLUCeG7mM|6{LnKNNTEN(W_@#^C=FD@hg-5qkZ z1_7R{|3H7dL*!=k0mvp-zgft0bv%XZ!9L; z_1PWs?A$~;T^ugF&nVW#)@j~_e%4Evz~bUTSk6vZ{Vcuq^fG-`nKf2*A%zXCv>t$t z7^u-w=+)xo0P{`#HkKJ|t;8_*?1dgKSK{I4*Utlo8udWg37VPXU=RC*ZzW^h??10L zayva|%l#%qqYPrbc&4o9EZjHos7Hz>fm;~ov%6UTyx8cn_ZoQanrg6)5yJ0k)0*OL z-VI9Vh`4?x5xPYGD~L$fTJvcGvrl+Dq^t4SN6wUoz>e=7L9{riKq~E7j|Y*KImf01 zv-_>x<{ILG$;&amNSm!J=SfrqI9XeI9-2_PktDE|)`HPJ|;7&vD> zg*w-1PP*zyqCR(_K_uJyW=rhTH6`Z#*Wl-()H9awA*ct+bbA^omM~7Y<*u(eH{J9f za)YL2q`_#O>6B#N!*@5|min9h(G}9UiU=h~k^|)4=b_i+$me!alHhK=bUau=bB>=RNLnH|cM9Y!6IhpLIy?4H;+y|dVu^0KPm`^`k>I~E zFK~2{zQv|qJtfh+9q{np<$~U(w*RYxP6O0GNu?2bTw7V`$e?`9%hv~l*J@uspPaZy z&m*|*mT2jvemT&X3ucGYURC49#@8|4uY*|>BIlylnJVwAuSs7#W{Pc9b`;q*Y1rpK z*1jNC&S=-fkub8B=d9eed2eO&;;chUP9$FU8$or*)4R_F~d_r$`Xc}wA>DN?yGRXTp4&EZ&A&9ZLJcUsu3g5c6k)Y;u zx(|5wQbRR8JX$za3&Sinya*SsUPb2c_wx}j#Kuf)tS)6XyX|f2-I8N}qPdhbM{tr+ zDs@9YcXPT_Ihh9yKwA8(+3vYr=H%bQn2RR>(gP50I=6PQK3Qxf+Zr(0fJA$&_Aq7+=qua(&OVmEbv}4MjSdX^$vJ%jFH2N zp(XO(xyt(HPMU7idJ)IF=KX;cG1H?zSLXnyO$^^@NmE<(h4N0o{2!lX#Pv<)3-}!H zign?^ZU(&@KP$HNv7bn~MB43Ae+vI?4N0gNekvq;6NIR;G;074jFayKy(}h3opzx7 zuj z>nC(6Co>UL1(J9n+7j*XpOaAan^^)exIEkb_dboduNY#GxfOvnAP!X-3~;i$*(?hH z6{ShwN-xvCC3uNtj_vfQE>whTEs5djf%yv@K=WThPs5r(o~$ z_yrpKmG7^wm`ZKzC>W(?gYxD!pTFQjFT9-=s(ZInHt*CBzNxe*AM9)uGdRTlG=|n$ zh#jjz@#UE;?NMG7C7X562ImhDWeQ0unVtE)@;tsa%Y0dx&0e#s+v%k39DeJ?#xQl?^q*@P-2mthIE?8 zvuROlIsH~OW}>#1M9ZS+BEZV|a2z`OiNO6b*<6F3Kd^$qJg@TpAJk*?Yj%P|$&PKS z_ED|vWZC;Yd9^RZQeFw)N*#xm(&XB;OjysL+98?l{z0=(HVe$d!&-j2uRr4p)w^Q7 zE?x%*%;f@J6F`ho8L1V@;!j45s{iqeTU^N{B#fjqFiw$S>V3fQhhq_|!OcVLBCiS9 zDcmJbN%+=|=&%fM-vgoE%ZAc5x=#>6l$#?Rdn#=})#$6P2;iURQW*c6KGU9eWg~k{ z5Y;=Khs0h9%yCbbB{;)1G)?*nzV&6gXgrq8If!K6SQfbQVntLnyIwU(9A_su_La4+ zF?+OS3N%qIP7`yEwFBYh8>@ue73*kg}x~ zKTBbUgVjqsv(OZc)9iZ=}X`ku4DUa1RG6KgfOHwJ-z+v(Cdww}8jCWu`C8)h+%YqT)x|UeW-KK^8$5HI*C_!;o6N zJ|)f0(btx@kIIG0@|`uJb?BNKYjTj3xV%2#$m)`lsyCaz5WtTDUir2BiTX>WQxW2u2C`T@!+`6oYfN7kJ;`0AHoZVr+7Ji!86 zsP;Wchg6@1t z1c%qtGBeQ+_|cxXxw(jGqzgc$qY&PRl&PBfaB=lKRbMxeQQN8nd(Xl0 zKltn>Q6IW_A5QYjon_Vav^;^)CLLj_&+YkeH~g!V#>RM8b2!WfId`AK-PLEOkeahQ zEQ>$%9+1S~NR&(bT0xXC%i0wPB2UdJ@_~_vCm4I9h3Z%Flud<3aM=@$4C`!)ty)Kd z!p;-A$US($$8+eV|KgY9JNJP?;JrbuT@0&Pw#prcqTy}9b5*7B-Xrp+yoc*7EibDi zflsdMT?Ce*Ejg*t7vZkoOh3ShtTzwx;_jv z{A-jQ^?eo;eL8#nZ!A1cw%e?o#HJv6sV0 z``(bh>qX0bJ$@6;9yjBHDUl}S&udz=8~fU>e!a%$@{mP)#|GuiH*ujbB>^ApfnBEB z8+21LRN*n<>vkT~@Is}oV~*<_reO0Y!%IvL+uQ8w{Xl$>tVGCl>K#m~be-GB?V&9| zk~PJO1{423iq7({$-a%lN_Tfkj*^s)DcvC40+Py*?(Qklji59WB&53(ndCsayOBm1 zIbiI1cwSup!1ejPIOF&pXToMOKy_G3Av}5H^E}8PRGJ;}fsEIuPn0(hhNZH@ZcRep zamD9>Do7LQ({Nh~ezX0DCHtlTL*DnKSFhVKvrxac*EEnn#P{cODP$~HeEkL(M6u5I z#?r4OIRXAB?XG^y>p!2Ncw!PB^T^NQ$uBmheTL^OLUsG+=G-Qw45|t*TUu2`(uTEd z3_3d}M8E40|A&!Kvbv$&+A>Br7@DBDlvWMuKWz01pFiPt*eMpvLQX^b0$Zsus8-Z9 z*30|L&N~+wbkiY0+`g5Q1-kb-{5!YLG%_ zjx-zdi}oak%PwWWQbq`djgq#2q|`#vTp;M*s34>4nl4A?-K~1gd3y>pMIG^GS^yJ5 zC%Kmxv!!wm-3?I`ddRiaGHpId&G@-OE&w$JY>pVHpE;Pi)9&8?#2n_u0&eal?UKn0 z?*mU8S9{MC#w{($v`3O}9Nz!xlz>C{N|J8Q8wThy>F;5(GrVF^2GKI~696l*?x1k6 zPlP2Sr|zoo?1t~k1$edk{XZ`_fa zHgyfM)OAGHk}ng;q~5*|E%UT`99#KGVqeYnq$cOq4nv;O6PbBMprHsH{k{1sD+3Lj#Z^GeK#f%j_6 zq2^WK$i!=)%-|>Zt z@JUa)$fl3c4QMb)ELd z-nm7`v3eAI6=D3x+HEE}DHBNDpQqJ_qWTq>T1Z6_NBK)R#MEfJ`5oL9mt7*@{^T~L zH7A0;8uK0aeVmQ>ZMEVY-&gw%l_}OV(c%G91s-?@?b(Z1!5Y%9292NpCSR?-I36}1~_*<3I_?D z@q4diqG_nlKV$W}ENX?88Q-uznLj`8wjt`Pjn+?;D_qLlWM*uad`=k+;HIyYPO^9cVqMfLdYVgkv>oy)e^ zA3ohg$BaCu9Hr&r+LD3zqP*R*u5JGy0W)HxSvO8PUfD;5`c_2-agmKX^Y@2o`1JB4 zYE<4Gv0c^HxV0b?$IH{g{@8CtZbZ9|KS$CqI?cj%gR6zh-z<+%U(iGb&GkXm>0Wki zk8d4}h&yd;+YMsV8l`GV49KEXnhI=2#*|F|Tj6gH0iZE}uJcf5oBt;47K#9@0Eh>p zP=I}X`9}C|&N8wrk}GA?bi31`^E3Nxt{P8E2jED%IcC$N?usMc5Z)@bdJ6Nwl6wlp ze8hm;0@)T$0`D1wm;L!HkA0qt)yHzCf4fcMaUD3W)@a`N??*YSB$F2c zsQ-K4h%Zb6@K}?bNXQEjg(UyjggbB9l$qSO2GI)gw-?Ek>j+iQl<)0SrE6I%gs9(z=8m#OvIj7)3q#MLT@4_O!bv>s}O~y5xMS1$-$*3dd`Q zz|xx{<$=_5^QCTOg<6798c{x}WO;#$5h_8x|E8q!o~3>bWv8wqA)S!0kHEQoPhWpp zu4RkkPs=!nRNlGM{O^+?mv94~uJB{sHY@Gl5p~~HdQ)v~;$#`q+bA{>N@WHw<-q8U zkrLf~yLVfi;RdcZ&)y)cyJk7A^p9}%8e9m5r-e%2j7#0G#)h*=S2djct6XFH+4`;` zGpvsIko2EwgBg=yaoBE<(PWH*iQt53BajZCNQbD!9qjny?g7lj$K9%A^TSWr5o zS*^MV)6kLAOjHiu6khDVVT&^*wh`M1Eyuoog*dj(Du_>c-fn` zGwGeNrwOm*SDa4JLErixRvk;!s+a0h9=9+jP)2**wa?Mr*y_w*Tl%A+PL#EEoSxDx zY$Qjc3?KM`_vbqrJlodT9}S%|a5f()FtRR7_%ehrA!hU11hNanT0TeZ5}*6>$Nnt0 z@P5am5yqFR;f`uen7QS)`J;gConUxPyel-2>_m@V=qSkz@7w^7dOLXQ)tLqz_*Pjy zTMf|Di9_~3XiaQTL8~hCj2<)jMG}0&!(~a=pZ7?H_n^I`z{CF$LBVxT=WFhKn(u?| z&ne#bM$ZpIl;7}k&vkr>BbWee%Os^AKGRYHqI#dfq^--^+!B(QS|8XPAY)i&=(D%M z_v^vmWOtzB{Q{co^Vj_nK#zX)4gd(%kvS=A|{-; z)eb@l+-#N2-9o)~Q(lx5l>7O6t-Vq*ZF0XQfAH4`%(nAbuYY1&a`QW?@iK&eaBUyh31qrHwlEx zY1>(c{k70TftuM{YiW1%(@?` z*PotCSb|(2bJFX(pJSkV>3?-)0>9{fqY=0Vad9=&hq+nZ&+ZQe>*qptWp=E*jsxGm zTY)hoeIIY4+bqC>t14~Wu>#Xe#PA)S8qQgb5&L`3w>M6rSFDz$va+H5@qcHx^n3WM0Cjfn0|y(}ose;Mq$remZx$J__l{zPv(BOQKz^jm_V zl+Y>Qp*48%?54W#h8)8QQ-v1Dl`OdjbcLMXxr2KqvvhYXuXD`5>`bs#Pr)0qAN6qP zGYOhc^{<`UI6R@l7@uuw1=US`1A^9JmxL}EB3RY->t=mSa$nkQRHOuY%Oca26wBdX z;<(Ff+x!_O!^A6_-rQ+Lwg`S+mhebXV-TAOKThSL9@vy9x+jp{P1w~A@nXYvee_+= zu035)#`6yGZ@qHYCL7qmqU4*dIO?5PbSuit6V-R^X0;D@C8u`2Q1cd^Aio`Jr9ZQD z)AMydj^1whN@&IO8Z0K#Bms}2faDuyW;IY3AvUx2Bg_uA1n~L|c6#`Gcj`>u3?lGN znQ3E*3^tclc3#zvck1dwPR(Q3l}njg|I?RkS00?KkKkA*+9xS>6w~1#=mO0u2MWp1 zKdj#!25UYn+)1=}&K&~Q1jn}`oua<~_H*EV+8C_H^l^aZv z*0z2_`_#Z`K%f5&i?oszYL2>8?iA*q_Nd+8;z%}#-PI5<4LmCP_*aX6rwjKx>sgzO zSAT^z@hrcCdOJnBG2o^j8pX@^p_|~04926eNd@~)LY7@-ixtR56AK)VG+8FsOrt+C zzwt4~r@(nz&0>;2Bl`usLfDH?q-Asa;1#v2u?OL8?FCqv*;e==XjUoguM57kQi?um zm8A)w4dUe&C3d)0A0;7){h!Juck;|XD! zz}kISn_a3iz3$;JYFAJtRoN$FP0MCDVZ1j-O4J6en$u#OES|w*O?{4{@Yq<@*zeVT zs+%)WHc5{h9Lz%ljO+rtb~JjX3U@2>b^rKq+BRzjBx{L9T&8(#`_Ia05y>ye5Cpug zIl1Rz=h zo6!64nnBFBfHj?-W=wu1>by4#aMhy7z`_cd{IA?b63-afL!w~@;MhY4V zRGbris;>X0lg=yP3V0YA=He_0Gep%!fA?*!i-p9vwfPGZe-bGU*hWSth<}8-iZ9RqcIx zN2W*uo})m&Rme|iX1Zo zS4~`L+qK_b2zl#2AI%X#2%it>W%;(Q2{+)+swe0m-o1BD+Tg}bh5h-6+c=n_XG^?yZMss~lA%9D+Y`gzjI*t_-}HWlKkFa?pK#T36Xve3a2h=Y|ilKV2X$sM|UcI2kfvwn#ysv%$dlj-CpogDx=Z%=d`ds(x@QI1!N^_J>eE_lT$$^_g1Qf>Qo@Q@Inc51D=~ADg0JECKBhE~?Sx;YfZQYN zhhl;xd6WI7u^)WYUKYI>5Evq4*-3!0*`-8})dXg@T4gN@?cOtvpF-<7ig(h&6{0DW zPyp4v16c(oKw%4e<;m`EdjIZ+_;4*2{H!)>KmSSqJ?`9_cg=bU4IPK}Hv9?X&jr*2 ziogZ#Fy8Y1VaDyNT_#7b-bwlWeJGkL1pBt=$6e)?oZ%Y z&sEqqqTisNGg?o6O~^WQQF@Z^=$DE4_nE3A$5al@nMg4*kmIBCzQm4=j=9eGW67q8 zNO3Mkh8@k4=ZU6lrQn1q++voYKi(3tEs6ygKPQkrTgg@uOWWc{c;~;_Q;ue#HoQ%l z@}2eaewIflfky>pem2$TI!m;4Be*=i|9n{CBZ>5Dx+dBO)af$GpDe zyQJoS1i6pnnhmR*iE7PQm4?huRE*x+M1foNK=$nD7EOI2;g2MqaIRm<3JKvrRAhsJq;ax!fIroz_Syo{3vHK>IJ=IJdh50z08MT zGx$0Xa!gHmSoGg0H7<)zN3vR945kcrAyU9tlP9@1?*v2vPWj@;@%6POQ%Cm!pj3LR zXMfU?0CX&HmOx(~N|HRG;2bh*HhTEZAdAm5DY>}GCD(X1z$f;;Gj=<`@n?Ciu>T)9 z0kXyyIenNv`~hgL6Vp8F*5C=Ko4Bx(^6bqwvz4Pa@x#wXjX5q9Ky2C6DSF!{4xmdT zaM_~Z<#b)lO%aMd#P-HL04`mBjGd$6vQ*!2Y3Y+Pb{2F2^LwAJGh+o@hhHH65zK8f zy=YPQF?@3n2hP2a{<~@c8Yt>JuHpDbR z5z24e2IT{MTn~dl6Yx`nvP`+JO?+kkhnT1QIJy*|UjpF<&m>5iy5Gjr(Ku2F zb2k$b4;bD|tNq7f7VPu61nE3RpC04reI@=uPSrftH()PN^ocTC-TjwcuO&nW#NFek zsrEuYm|1d*gNL)?i7a|qKlYh=Y^q5OQ z;WxqeUB%QL)_AM}$xe?B z;jS=KjigO$w(rSnwC(B`XQ*6>hdx9Fb5iuja>$_cBJtm6;Jt8TjXc@*y{@2uL+A}_ zmTE@{f&6K0UfsFJD)+@25}1#OjW-qYl`u2HZ=mgrOkx$AK4n-u4(-!GCM{oikE=crj9%8gs*6BN6})>FSQ zJ(c*i@~%IZJts;(NPD5VwvxNnxn%`$4|0)_JFtgZy63X*b6a{y#toZM%wI1m-plZUO;T_b*p7 z^p5G)z6smj-v42aa5gn3uhrsOoFPpW9!}5-mymsU|^;{4|vc|RXD<`fId-}!td7aUcOJV)}& z8=UyHeJ<76v~v4kI0fc)d}JwKw}bu%te@L@@%D<&1-aCv1MzV8vN>N@2D5tNq z?&33K7c&R){fq1fr?bJ~ky@yCoKGpqk|`Ob^tykwkC0FAs(8 zo~C@74i<8Kp2KN4b-gp^Hf6TjLOj^JpLudS%?1(9Jug|=)?Q%!X4W9Z81|_xhZNJKA_|JE*erj4Nn3Bkw1N+O5j!BFa4iZ-1A9iFT)#Wu^(-oxjsk*c*r8dNSlR4gMBmF(_85O(5`6ZH?DoJ-*g1$g{B%fp zQs!;{M~p@rM&ynRt+8A{71kF~@>}V9`+N&eiDTR1j|VYN;@{js3@$KAEey4vdj({t z1V9(*7{__PTUeYeAyM~NioK>I-;Byca-FGc?KqR?_vXt)yezI0Fk@Nu2#c+b89Cy= z%P{@ucL^+GHpUwah~<*b2H08jQh6=bO21t0z#K%amIXAwhdmqaP1xY}BiT!`zw1zt zDKA#EddF8OpHf|4O&EQzIFkLsLB?CUx-gr-vV)n|8&|-GOG?&8 zAmoWD=``xGF@70#Ka=>y9wdQ;Q`WZxhUZyj=RH+sw$(1;=Z?@@c?i9&9+ubI8|s05 zHPrBkMcd!3@^rQUH1m7%j zMl4Die^;v7@?xRBP-YbMp9ScJm9)i^ma)$&>ur1~#uAHp^T{jSq&#-DSNlH#Gn(#AoVLcw7Ywoz z#esHdA4`L2dLB@W4V$@{3ukYNmbX9FHh^WsT+l(4bLSUN1Ta}s52C~HbCk$csu>6? zy(DEKEj@YrV}0pTpLq6k4mF1TA>ck`H*@73_>(qbg8KIZ7-4)|umJIWMhAjvktGJ` zOGzuQZ zoe|p>?L80MZ%gDs?arNfW}s3`@5#eimG8cfnXYkm*atZU99JSqYNl|3=&0LbfJnOQ zwb_TPz{zy~Rugl}A1jrZZ{+?HA^?j6i*AUddmXrB^yJF0de?vn=9npVP>Tli6!Urt+osAltHXkRJUKR$--zymamI_V(H5cV0lIo^1!N67yu zJ~lt(2lOOi*ED0Wnj90*)kPs)`%ZgfzJB>o#w0$Kk?mo6Ya*oF2|<;(agw=90WUR4 zL8#Dl|5+2;hSS=17Z7o?_d5trPj6s&s=iXnN?{4M??-hPVmi{_Tny}DUr^h#ckZlz zHXK+23unTDy`zE-!rlSh@PF4Qr2jB(OM)1`(BoRU-~K<>xBKu|O~Q7OmOf<45c`rC z5fph3ybAOCx3e6f^RI53jS=?NB*S}lYmv^;!9EQ%6j5}dx|{RgYC0a+F-`W%{w0=q zST|tTs|E}j@=NF=v)R(Ur2X2ajAlJ_Kw=KnEkzF;=lxnJ4*DP!)N_MdoUH8xC3&In zVDFg*Mh$wkgAfG`&n;T#5NXH#W8yo$<9^-T@g>2G9veX7hhz|<1vAg|9C2QBBE#}h zqXvxcaS3*jZWil4gx>02ALKvk{y!-(BuB)y*^F`cWz;~=K$6hD2~!9TwX)xbuMRu| z$76f~{O?OUo$cd!k3t9git*g`@)mFIA0i_?GI08mmc%do2(dSk=S}Rv6HNB*3bcMh zwzBsbT;dN3DL?}G>P>QuOPqhMm!ZxDW!$^X>n%=`*Ci5lW9i-vSZ9$;^jJ!vm&&GR z$)?VRzJ^vTy#1kbGIoVnrk3>WMW*e{F`{D=3JHD6nr~?|?MMjjy0TN1LONkr>lON= zv4J2FtbG*Qr^kg|h(QtbQG`!0(6TZx8t8Bo8gkM9>E)~i?u_kX{dm#i-xpeN$*kwa zbW$^Td|0-P=fjM z6`y36@B@^%jnuWCyY(9sQ_L#2HTmEl%q@L)s*}JSVvHnx418%VlAXhZtvph8^d!-~b>S=_q=}aG0;fU|O z$6=$K?gzZ`l?Ef_%;2MV}>CHJq7W$!gWqI~YF~}+lVyj+OfEAQ4GO9rG zw~snXF{UcJ&u4tahXv7>a3UUb?TWP?`n2E$$f?bILbHG46l;!y`sm}h&iB>rqbMx=7US+Rq568Z)o1QJ|mL66|VinjM z;RV?;nv%!t^*wLi47roIqc^BtuEIq6F(iMv1<%$yFx=W3>?BGK`^}4jT?=|IwzkaW z+q0Zy1bY2QY8SvL^0O}2(H>&T2i^rx{y`uE?|2tFN&zkQ++ zEsQm&bkesjhHf(-3Mb)+3geY0`q-AbKx9wwHZg3m);avhDU^PJ_#IMoBAANWUn1>| zsa03)*-5(S3uOxK>%a>Q96!to~fatE#~ogE@vW@r{abY*On)2{Cj+?z*`MX~J& zmhD8bOo;X;KrHMW82X^1iTf_jAlLF`hC+IuuS1q6)WB9q!+o!8JUuVP&p|PTpi&q0 z`xIL0q`7tFOFd%8ZCm@>74x0ZbNUZ-Py$R}QC!LfgHK=I?pHk<%jVyY-v~XOldBzg zv_*9ZN8I9K+^p8$ud^T4U#`J&o_FrI?On5id;5{WR8sx)LTDzSJC{{wn*QWg#B3np zp63SI1*g0r##DDb6d@V2UQ(%@-e4P_X9}camDNh-F7^j3`_i-8$C)e!`MF}-7SaCt z&$RoS+r(-kJr(`ovq0-{^g=lJuK(rM?lBORQ`LR;Sh4^7A|&y+OK>*99e`{H0V z@XPWO!3^+Y9q4>_#y=6;dRs+@8Ppp7iy$4tH*Fa%pGlSslIyj09){lzr+%1!4p=c8 z+>;wGmH!e*Hj=WwSTk6crxogyKe7P!P5XD6vV3IBE6#~|H{1@)HIPjS>F9NNv+XR|CXQ0kkiGvh|V)m)lpKd4LtHxH(DdgjzW#_>r#saCCM>(H4cPeOf zR?4Q|Jk6pRVxT7efZACenR~;uQ9ggMxpOgrn}$nsnz%1GPA_33!UZCM34Z;6s=Z0mbXsIHqyb(RUj!HLK*+Mn!H zvf+QjscU1c%kgk=pZ(Raiu~{9bq`Y~?Uv!Jeacpg7)twlNkRjW1L_m!C+EznR=0}6 z)-b*C`u^d}pl1a`)=VqN|2XnGzJEj2`Tgjtqjdk=**W}4`4M37 z9@E*VP_7WB_@>jAY>9+`?EIc~6Dr^6w9D?{ z!qeu&C?IU(Wpc5=yIdIr1=|d5Cnvr|*}Jv#0~c8tayn73tyx`JM)K>|)`HyzuJQ)J zGdgvLgY9mge1(vmn&Iv8t+m7)0#2fM=)@#HL3zyZ)9r%m`agko$k%Hdk<&AWK`s3N z5zuhOW5%$u{zD@CRn^;KPga3YP6+4=^`YJx?9@QWsULiU__N#fZC!5K!$kW53Tw6T zC+`A|q*#rQtr?81UjB0lhpCPk$XG4Src&dq?A#GD#bvc1Lfi@zYm*fvkElPkJuFy; zmi>~xn2}~oxkNmevS2MQY2K+UxVv#FfK5rXou-j+<3lHLtrMkVklA!}AM{)HBM%&{ zm$r_f%M8_uvm-W@z?8Gt5V>smYSWT*CvKX=5t^OW|F%afG=b^kzikV~JY?fIRH`JE2K<3f6 z#Dz{X7qAd(0lYwv+1s5?@K~^@D9z^Z!uu5@htT6HH|h6qmiAv5A(B5rAG2K^_wJ2`6LA%uhC}&DF=zz zSGPZUb-v~2^In18XSsc3?uT1w7eEbl-r_><(@*0H*2@-7&zcpga!evAVPRnjpvr~w zF^)I+5Dv}D2q1MPn1m7_L*L1yn+7?T9D+-1J9j;9MMA|6hq4}W%>5r*I&IeoK6>h0 z>va9N?XmpjHm;6ve|kR_1#Kk=9&puh8uEGtFbbZ|5FO0eZmyg=6^v7%4{<*Y8%V-X zoR*(W?5-JVnFEcH!0-l~o;%qW+y`AW8yQOD3^Ae}^_n<{GoLB{@Suv(%eXpYK#>9` zw>Ew$$!~aD^^d$*Z6>brZr3PpzXIv4r#!Rp!K5LXFR)++lfz&IpUpvnc~KM2l&D(g z3maYaluws3wu=v9<6UP&4C(E84Zwj4z)B5GHQVk`x^ZAC(UG4z+>J5Nu3MWZGHAzd zM{zTVTd}~Js(WRW%3Lh%XA`P|JAF_aoU)ln=yz=NbUC;t*&+wAps zQjSc`O7%|hYRu+wAf6Y8R6IE%-3rMU5So{1D#YF3Mlx7n+K=Ge8bb;Fr%fWqKAfDP zL24CSzCiqp!U?;KZSG;sWpDe+oZ^E%MddDBNclxd3{4cH84K10<14XF0*k31mg(Y7 z4W^VtG$1K4xnqHE@m}?)PhC8fk9i4rayS5|hQi75giD+6t3nx>kU_yz#QZVy^#_*6 z!L)`~jJCA&LyJTMAmKHR9>i*RXvD@snlsvk#~;X)*y7qs0B4h)z6l$E5i z?S-?ESIVPQAwK?J z^$`4`o&BBXg3qLI6rc}J;;l5pEE4MZZ|~|g_Dm&4B!_(ZG1c7k6$j{!O2Tt`9b7D> zW@dl}i**Os%F>CbJ7rJaSvUEl{47bOhpj*n(5Lqx*izQuw9>)HY@OEXr6qhtVFQDf zmfZ&q}kju@tS4UVm<|+Gyu)jfj*vorq!~MJ?yCD6&E7FA)jS%Uj zFx9eN^+lkUcUN&T3N^Q;$%J8bOO#z$GpL@Of8rI#sw@y~U7QQV;5??^#zO_%&G_h{ zbLA5h(lfLE(gKusf;9|ZNdOx?O(zyw+M^7`EKrt=T|foFemG%1}vons?I>$T;P;N$Jk#J_a1EGHN2pYU7AoQFSZ)}qS7){Bi*qXs86b@jJ7 zlZgYUzQrY2o-U!F*0bJ!Jn0htTUst{1g833BK(A!jBg2#daDj7PPrWJ@RhHh5d+Pq zP#W<)u8)q6jS90wePwGt3Ja>xeDhQ9LaqnWW7`+oK#S%xvB0jhQ6G+ykBN4Io6p`Su-*K8oeN0t|8u6{AE z8e*rVtU3HJiV`iY3m}`WFtpao%K9KxmD)HUivu4Wuw#>2iosN?VJY?UZSB zuyAT{k8Fgbm8G=`66#(f6d&_oCMyAUejVlBP0wsZ?|LXoeyG#V5xfv~*ckHTjJH{+8dH8hDXkARt7jA9wL}cRRUwekIIr-5MY{|C*{KAzL;%GgANSk zXDii!pUb^JUmKWxbn)sBUyP{Rn&Oqc_RR=9`1EjG$~0JqYDc-LUXwjy!3|yXfnfjD z;Po9QF`erdl}!lAGw1?qef+8WU8xfoIdfv}^rzZvl?bb9tM{9a>$_bVwF8J{D3c0v zF210%SXpg|LSKxttEv$C(2PJUBh;YU_rLz9uXH6k!e1-IovlDYD!bF6equ1erIynA zmj0kS^~I;&XNPb`<$p(4Sw5{2vr&a7(U~V_Zpnu-_d#9Y+3vSgy&=JOyW?7*5YoZ% zAq6`F%>uoyS<3ou^^3^i*W=WQ2Wr>}pZUj>)hv!*X`i9S=6JnB-uvy#Hf8iVR0>|- zsv#71RWV~-rZwLRe<-Eh>gxp69^>ZD_;(>HM#7q?U&U3gDNH=xlO)}U>j@Hgv=48# zDdn5Vs|FfQ=1>|Vn~gFaC5lfy-Q)0N)r8SBYaM$XAtu3Z8!zEsFw`pOJSOHTs8%B* zolf9u1U5h(a8C+=$g7bDBrA*&G7#@RpwT@UC@?z(li{QwtG!imF2JU%hlF{sH^dsl z3@gnMJNG*G?732Z&!yo0$4hWj;Jhc>78r$Ze8dNs!mlZJv`=v?YLTML$Eeg3 zg^#fS*zX{ICY6xwT#C-3YrD<%p{^-#2xcF_-*i(Ncz6zA($xbfYs^&tu=CyJ)FjDl z!>OA$K+a7#ZHH|v0mR?(zQA~o2x5M zqulh#@YC3~j$YJ7kB=s)i7(1 zzr9XIL5q@*%PYTw=v_lo1cxPh1y7>tqN4O}L$>>p;?Cw=P$915SZqgWf42Q|q|q`x zdTgc23@L`@!i!Dn^&}`5+QBKqWyGH@^K}KNTz?K3-ixay1Ww{@!i!}>T-m)M+*8I@ z^k;vNFuw%>w^DkB%jqDK?yy|JEt5IEf2sUQNE%qk5e?ZX)L@C?x&SJqkC-G9)D=wu zH+zNL|3kp{6+f7z1nAeiaeZfno@?7+xbYded+mK0i7E`##w*@~$%x=hhNvnSUHq1i z6hY0g7?XK|Y19YOtO0Dmfunm~jJ~La#WRT)tFK7Q$GJ}Nc8w7i_CqhKP|LM@J})V| zu^~bSE8(`opLa4$ zDy5IzS7xD#kzFbU6a#9@@z5DiQYGV$(^|xAM`Nu!SqW54vpLpv6XwXp90Oe96 zgTbt~Cpb@9=BLDmKvv{QQ{lFa#RmKi6&N3kd*~kEi3uzKd8zv7#*#BdlmK}{&A(K! zX#l5toJJ}mgmSFM(bm$tIVG|c$rbAJTGX7``OF~{U@{;ZD`l>jpU6saYc9AA3UBi9 z)i`t5T7x$Jk<`At)&s~#C8YZEDF3`Ij>0DgpA^PabRC30r)LHDRqkw<_mR-WE1Spf zS!u{|M33xTYpnHchD6BHvZ={N@-emg6{fNm+Pb$zu{@m9E6ifouG} zLx+F@#5ClO69u6-id`D>45CWpMGB^!n7KV4%W)DX$R?K_>Qy;HS3$mvl-NtYxe^P? zyLvK&<@J+1C1|W;$>FW&V9ye--A8p=my!L_rSV9vqmrA_6p;ciL-v`1QR>$TvRZ6j z%a|gAlnMx!nsf7K7R>I&4*Fj~gvDLI3`nW!p1db))}DHv5jTlk*T0 zc6NS>wunZYU&q$}leAa7k(Zmvjw`j{&>&VQ8Gqj^Qo|qXqfs+n3Oq&A6Hzm!N2yP# z$0bDog&DK-jL$k4%+(Uj@)}_6+g|K@W~}c8~P~gcLr@qufhY?Fy01^Y-m!TT{!D?>^46WtIoa&c!+_OxOv~e zr>7qrw4Dt7H32yc+$-3$g&o}S{Ah5DxKwjFu3&( zivU_2pr;d#bN`G1uI~T?GfZ;S+cNCeezfz?ZSQTJT$S9di8ol9j4=(7>G-ysP3IxJ zKLvLqTI>a-8|s8liA`z>60Oj3J&lFEJZ zgvxf=C>Iis^9MA*fHQ+|z{)0$$x`1+=ks@uxRhC>P@IR`2)~}|S?6{FqcRVNidtm{I{I_%khg9v zApR(8#hBkfQ*ZkXr)5$*5#)%}>dlyS+(~}s$-@b=YakJ<94s+P}&9a%iD`(VhpHM1eNmR9Vs84sAhqveqPp= zbBaP@ynvKOmb5o;zbOS0zC zb=Rp{3ah5B%42PE85FTwe5c*;Bm4-MqG4ix@|104PZvjJ2X}FKJcnVcNJikpmJbJc zyY9%u+VfM8Rj}{`wD>LIG1e$t zjJ#)2k>pC0|1g+~kq1}S68!M0n0L2PVU~!~sG=6Bs$P5a97{Lm-9WE8c0IMUlbspI zX2E=Z&NiCcgrDlu{cE?s9Gf=Eo@2zihn8O|Gp3)U${`q^nR|a!wWb?dq+Zlt>+<}#oI^70n$=nVD+lBwuxo11%1 z)zcdA(naB6G?qBj&a;%Z6N|nvVEB*N`1km(1=RdnnrZqd_}85Ign!>$|2Zbc8SqN3 z^nAc`thQnoOx9R^X}xv9|G(9LR>3w%=~rS>4Jq+yj8kkOgz$4MO(< z;R41m3bBmMz9_LzMH|@5@TIF&K*XA(w#C|(d|`hwOZw``rsAbMp(JiX=%FFN zTveOcOB?QvBTy6{KMOm8Kmnb3AWTRfctn2H;&5WGUzhl9tD+Q-klJXa_PRY~vGz5? z>lcaz^ReWF<%WN^J%nHMhiiPbyxoLL*CXOMIf*Mc#jmxEX7SU3e+gOWchBE=pc?m;GJLu~)K0#2dG;-wV$o4oU5xU5q`r{b@)1=Yjv7FCDMR4&VXfp$(d2 z?Gz)OOOsa*Z-I*#k5Bk7i&P%^4}N*me<=AU{f|>O2mk%2sa77`@UNcGZq@&)6O_bF ztr4&W8RwRR{|RB*Qvh+Kn$Tg0&X9ZTX$Q%r6dS|zf7fQvL+FL)WLR5z@)`fIQ$K4= zpt1V7Bq&%r_}cp#|GI#M95OrC0!P}#9J2*;s*i=SFqgzwUuVeO@5H~w0rAnkVjbRT zd>L=-^PDr=MgJ?r$0U9yhN+nB&lOXjJ1(gsX11+!bEeqEr&ONU7`~!!v>y8Z%;VnD z>umgEde!<{{ZFoC?$wI<$=%ZVVEwq1$*m(rU4GO5P z+{UtF=VVBXqjezhHGS4v{Z|0Kw>s{id2k`fSeA2qLr?_;@kGV^CG^jdlIh&UqV# zB`@fDeS48hv06Tb+UBAumdy!MuUi)u{E@$#Xt!9Z?YSqV(*}X!}_P&rueVjKMkOZC%veEK=`AUPu}8$@3B?-p`A|?#LtG1U}a8Zs?IfM z88Ai4jq@A-ezKIgzcXDuA26(9I~N+NFHbx|KK6oO8hf!uu^j4C&VFZAbyH( z`2qh=yj(2@3#s!h|7RTfmS#6sT`bhaURsj=6o+9f{cgMIzu1`2&&F$O++#D^ZTt0A zY=OnfTXUgEW9|M_EE~7K6`@u~g-ONMnu(&ChyHzt_?O}pKEL8$Yp!SQf1U{0ckD}D zP|F2Jm}`2W)H(4_PP^eB{lF8*DdiXBW`y2tE%?NtLmA2^==Y2J{N&{m{-MdqN4Y1D zGFh0#5%xINHs{7mTsOu4^5e(lT^nrQBKG&9cW#z&lGO`yp#lFekIa{`ICh(_ew;Be zA9L*!{BJCEq@^A95&x`l&@SSL;}!oA>;npj(E9(T|G917HY*zrNLN^Pt$B}Xyy^dH zU3f|YSPPAtVC_}^^_b#QY}w~lC5BADi?4%=wjn%!OWLH)X-{wYyK$h~W~_`A z{r_R9+1(l^{2EfrOpcAstr3NJ7I(MSruhjCT{X?bd1GAgXuiJbf5Z_7&CT*wY3qPJ z)I?4TJzPTt@k9OSG>2!85C8RF|MLe>?jJ~q4jLZU5VLpwoPZ|qMF*t&y zQK#XsJ5NJoEH#oAtbPy^&c_XjkoksrB_53h<50B=czbNeUU9sMDdNMdELQf(Dj%PT z&|={g^tP^bV`UT6XaMkPb=zvOl(Bv`T+xU1VQZGRsSXqBxF~h^pT!0V6+o5Pj1Av* zul+LKbuBSHHvhZ~YaY=RNbvbK-kne@87HPZ4<(NP2ha zsZr)YkT;&blr(2TXFkopjj5{VcR1Js^UXfP-N~hT;{P1{&MD6)=j^u_#y0E~|7V<_ zSrBmIKNkM;1O62UDIN=}*KY4t-;Ox`sZMIa&I{PU{Gt+QJY#sDcPAs9vmZX)ejqo9 ze?N9cXlv?u+_VZsXmwfrF{+9zK^Im_w*}Y@G11qt=;s4xryL+zO>wop@YHacAvuU+C>0$uS5^NhYIz7XH}D*z5GTv^O5kWsuKUyh*) z2o0U&6{U8@jD0>ojLq>R8dbvMZioxq(1CTZLja5g&6t7Mdn>=p8HMKn&fGr3JrrM~0i7sqXt&8v< zwxPeX$)n7CTrISo2*$BY2xO3h>}r{M5{HUM7h^j9Tmy@p+nEQO^ih&O_KDAGn+bA69QY4{;bh77Pe^w{!2!ya8|HH-n*tl@ zfB9fs9%G7ldD@5NRINMC6yF$*avNqYCAZk)X`42o$GqpspgvK6Gp#U;kbWn-vOfu3 zy&tP)>lyO4=42JDJH``UPtNgl+TJjhXF-19=83iHC2Z#p*JRvqWSYoY9%Gni5WDa9 z{86CcM!nLXj~`-r>JKU9C1!hFM?e!>yQRWx3wieHD>~K9VycfQH#s7}FbMr{Zs#&0oJn7$91NEsLd;AMNCzmm=@(KAy@9rNg zB8B-A(*=!`cKC=lgY|7Yuz%t|;?0m)=RB(6;82N;5lPjl|1a+^xarvi3u<@Upt^U} z{~lv%HO4HC8erL`B$fYf^k30`XeIp6JKKi;@58I#q5o>4V5%-=3;v(x(0_bZ^TemI zCsqvAHe&D?%RVdqF~ zBV`vk1RIZCJa!=F8zm*$z4YH~5r1diBd5<;=Zte%KjTGkEG$LJ6URR2C0>Ew);aYb z+?(MFK>e?~@uksYT-ij{Bn3jL`N7}Av#$^UHM8T3^P0h9i@F*%)i^K-C<%-4X6r?+ zSQuBwNJ3K(UXpAUSDZ>MwlFRhA(D^0_F_%JJIPG)5{uFT9O7q!p3<&3on-wJ#|6A+gVrHp=wGrZ-FAL;_;fx8 z_d5<5#K%~AZnoaZah^~({`vI=6{Qe-(!CKZ%_9gxM&Ob6vI1pF1;^HbR}oJuPAs99 zh;s~bwfYvmfrm3fiY_@^<7IN3i_f75}-x}WePkJ0Cd7eh5pulN_r!Cblf=ZpS-w}Aeyd8e4p^t0$V z@`8{1rlZQf=HPKS@gJ**B_^Q%5kg;u;~W1$=x&=~!3F=WS2jq#7t&S!bpXlx)#o@# z3$98exUAbo$w~I_@!#}zTLb$f5CrT@h|p#AO8#fsWY02 zuK!+FM0ouVIK>5s%U-qN=lIw9dyhLmSNj6rukl{%{|KiT$G_IYZbn$mL%q{H$~EoUr;h}JBa?=G8xbTgXA=3^Nz_u8A4LFFDr&COTvnh%yh9?V}!Moj}RuVUtZet z$ANBwrNk!sL1T|%!sn>X_DIq=z9R5xGvF^DU`2N9W&ied$TFV!J!aB(nP%c;h~2pX zaost+`tKrPJqdF9uRiEL+OQaZ@c*rWf0sIHtkF048iC}P`fbcW8*6|aDe=RbY!_R&e z1g#^2f5s(~DPd(&7cuCsYeD>vc3F9XcvSJOg9|(IHTJv=Kb2*?V4lxE$zQH5k3W0U zzGgt*MK2|GHutQh;vW)$R*dz`j`tc*wMm?vIR7+5u0C2d_(-e+w2ted7ntI}zq}Xx z4>un8C&vT-8Z-T#cpk;G;@f!+k`RiKiTzEEevAK@-w-(04;%ipWyGofhT32Paz*uI z9~k^M`2W5BXWDN&*^QpImxRDR>owQcn(TYXYd*#Wm{E*lh!pKsT|ISY=e4f)@R!AE zn*_V|zFWUS0pfYTeNP!T#GZ9Goxd5T`GEjA{xwqr{2KgxZdLE~zczE8PRYlK-O-O@ z-t->?e|)7#ShCr^N}ueg_4&vxkAbhx;yH<-g(Tcv#sBbONO*$0!)1Ls zi#zg?oI~eEFKKT6miU_$D{s)xQ`SxGH0f9yt{H&2(7^bOLgbf3f`(_t1^-`{ed^Ei zPVg-M=j3DA8k2LF!B5@oM`-c3b01HV5 zOWJ++CDxWOA9hP(jE$rw#)6bZ+th8w2{!W1igMKIs4;s_=%_UpU)xVf;&scnVW4Uy z7iTfF)$y|ji18(* z(yJJO*EUy7l&rWV-$&GCwV@*Q$@)-*XUB?sm< z3i0@FNn3EqAocsdEfMHnQl8P?-{LNn)du^n3F|c=`5(r~CYdf2U{Q|FixB z6L=4w+bTKvn$O3bH^o14S!_Aflj&FyhX2trJvRvTW4$kTH5UHuLP#uIM*kz;^gnaW zm!eTuyOcLnYJ&ArL6h5(|_?#^)|%7$p8ND|7mgzrR7OHlu!le`_cB_X`Ao^F>}{ z-Vh;WKI!L(6PKGG-G0*yXt9i`Kib;l-N$YWa8uyBRolip{!cA&Sf@Sp@i+XRv21^S zrrPa@)qCHS|2o~u*_wl0=*7w%jTFKWzOM0>x3T=a9$P#)`(*~pC+EKR^#iU{|6xnp zA3Pr5@3HlU|6n}`?9OM#25rx6>wj4O(2jfjHvaG0@q7G-75J#{R^5X;@CT?=cXZ!P zqs7+`n*Zt_KF5yRHfsH_>Ho?0j(^@9x#j*XF8W?;Mj60dLQWRHpdu1*i?^pG|tl>-- ze~H7>H&zXzY`XQIFpczg7h^0c?J1q@6T8{rXPahJH1vL4Z&EQa&=r5 zHW?Ur$FCu@MUSD&(!kE(k0i;V7E7J?FPOeKQx@DX3+v8Dt+joK~hj&p3{`SKqk! zs7agqJ#t6###{)Gr;IT|71Ceu?*oZ&%-40Qw{AE1zr>~w?6{!=irmTX$#KX36S{gy zI%qFU-pA?ZQTz?smF8F5Zl7yBP9L%Bx6=0M;?LhiS?_Ip;6G%kp0@OvJo}hI=qPWe z;Qt!J;o!Y*@m}*>H2&jlt6*4QDRv0{r=VK+er*HuEi2cK*p*7I7Mf~D@yW$`5b^J~-J#&KJVo6SW{a5`Dsozx3 z$t)%QzT=;5OYr~GDo@?zVq-oWpVBQAd-aO{2>n{raZ-jc{+0eamKa#UZit2qZQ*>N(4cCd;f&WkSKXU;156jQEZp!OhD`y1{I2;^|=?wn}Q;^;emzj&P3c<1d z81J*b$R{kh@Ipb4TKi1*wx@~>eHD*k;)#fRXSe)pBzxA<(xjcih!qD6mgId*D}r|o=~X!YE8`}r639mZ^fL*&j_%2jv?=H zu*U{5S@0y8cH4wN23JA)sL$#_#QE93qk=hfL-2VZFKZP_rKNu6r6791VnktN-$e=l z5-jj69(5moopnO;y(z?BYn1J+uz1ymPGjn&g{tS=cB zVv1uRoXa}e{@UxaZ7vD=I;NesFR%F+j?)+X19MXxPSGPj_Sy5K3VV-BEeSC_BCoMV zPJ+x=OlH2FcFTVzXBh!2eq#B0kmrqjfu*oDBn5;EXPte^EP#*aR9Js=Pv&&!5&!%} zY!*b1pbF2V_}r7(SDYIEyN%mdc7mBl2y#vuPjX9nOj@JSpzH3X(>=M4%*ABGf2J0+dLn|) zb64bw{~FgVu3iDN+XF!^WdlyV84hD8ueZ1LK*Yz$Pd?byem zCe->m_;;SyxEn!~?%Ft9Z9e4V@AO}{@R$tm#4G+SA7;PAY{u(BdhEmYg@5$ZA*$Pb z!aswKd7*O=ztex{q>lO0XU97(<01Ej_d;XPI;(jR$Hn#J);vV$;l1mN@n`86GLPcy z5_hP8wUbyry6REf^*{99aqn);*VKfspJv$}Zv0boFp%nJ9Q8l+(fN0;hvBg-99*At z7Dpv@f*-<+gRs_~aDb zkdva+y9x)mbv!L@kN~T%0$=A(ErK-1Qfep=LCneP{5YE|cv{dE`#T?KNB-P_`tG+* zm?8)bOFZyxk$6P^g)Cn^RSFuR0^f_+nG@JY83 zaRbEj=FcA!^I)NX0%j`msH&I9oy4fewlFAo(u>G+aQb%)a}|v#1w@^~t$h}TQu3c@ z{Nk@OX^b$RI-feWv`OhRJ}6pQnY!0HzWI&h+IxinNKPu?ki6I-7D7{_gY_!2$=o}H&y7`0VC0>b1Ir_1&x>Z<>JEOg_# zRtN|6TG{tR8}~Q;*ZFNjPLCZ=eE)18Q^LJ38c)_wVHS4br%?Q1_0kl5SOC5)$2693Qz zZTtOk>%Y#FOaEVVB;&Ge{4cvl|Kp6&(&jKtIuBsvutBTddC;|3*vj=l^H!?UrTflH?$dZA?#VddyH`h#3JRW;DXkv@in+=>q9u zkS;J2rYj*{fGZI1z%{%J&%itILMQlkt>qE!u~ydEr`117vvaB{bNxib3U`mp%B*er z55fP!c;iuO8*-<_CFK26{hx>X^n<0ws-^7ClDgGja`FhJ&epi>JH_>w#Cmg5wUKz( zzKV;l^B!^F=kq`Q`C{53)>&_k&~~qs`0VphXZ9&xuH%g7=l>tHd#7S*u!n7RRiu6E z6xPC|iQjK4?PG1yb}}#EDZ(1XK#D_BVDy#y7K}B1_Enth><{r#0W1=sqrgvKx-Z4t zkC8ijmq%i^S0NDJ39bnLvo}&s*(>|m7Wzs+1AcNg+r$vPZEG59Sc2O$s0w13#!S&1 zIR)l?Hh1S0?pqx8dwx}-n+S+6Q{b?#{`2_px-nw8uKB_|l=<|c$RYOoIP`e*W{+j4 zot#_THPZj77{UyeG(Oc*He5DcS5I@dL9lAR(TA}T z3XfIcIde&}`(^&}VL_(z1IkG$rGc&kxdZH@b8w8-Uj6oT+31ChUVND+li0n!otld7c3nA(B59$4lGEtN6p^8N438_TP?ZFm>D+MOpiU| z-{Jt#wit(U4-=wCBcB=kibkrpr@i$!UyS&`@gMLQgwCTe4;TmwvLlAIWZN(M;ZyP) z+QzTq-?pp%Hx7!ohH&){h3S6k6g5FPQ1RdUeH-L@=>O0`@=Z0N_{&Z_#35%4+PA|j zUZk+L+&(X!3^32S%f8%^SeVvw{`N7<=8Iv4f2p5D|1tB$aX>c! z#DDRs=9tc9$2jKMCNB8b3&?h8<3DuGuw!!M=)!2{3hlnwPrb{c*|I;t(m(b|WID<3 z4(3meIMBv`m)12*qb&vh9q#;6{jag@(C^x8-|2+6`cM4hLH|?S_Z%tBrP4f-5(@vY zY~%Rtqvuhdysvm)B%&<#HC*nbeaTaY>*7nuh4&9Sj^>%VvcmQ0h3bi!xKhy7{~SjP zGRa~1mS71p1hu0QwlCBn=_!j%(lKZeR2&Nef?yFP1;r+tDipQxCV_R!f0IrJUD6z5 z3~|x@>;n~xmUkOfe|V~{#9)%w= cVPJnIjgYhuLRl5Vzr-Lwzz7U0*`f$-#f&kZ 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

VO{oqgPPCX*u4lwi^s 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

+VT)EO}_=MjWvji@5&IT8|LkX)fhT9g_cLG#* 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�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 + + + + 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/CMakeLists.txt b/client/macos/networkextension/CMakeLists.txt index f47ca947..a061148f 100644 --- a/client/macos/networkextension/CMakeLists.txt +++ b/client/macos/networkextension/CMakeLists.txt @@ -1,5 +1,5 @@ enable_language(Swift) -message("Client message >> iOS build >> networkextension") +message("Client message >> macos build >> networkextension") set(CLIENT_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..) add_executable(networkextension) @@ -17,8 +17,8 @@ set_target_properties(networkextension PROPERTIES 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_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}" @@ -103,12 +103,19 @@ find_library(FW_LIBRESOLV libresolv.9.tbd) -# set_property(TARGET networkextension PROPERTY XCODE_EMBED_FRAMEWORKS -# "${CMAKE_CURRENT_SOURCE_DIR}/3rd/OpenVPNAdapter/build/Release-iphoneos/OpenVPNAdapter.framework" -# ) +# Set the root directory +set(CLIENT_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..) -# 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") +# 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") @@ -145,16 +152,16 @@ target_sources(networkextension PRIVATE ${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/ios/HevSocksTunnel.swift - ${CLIENT_ROOT_DIR}/platforms/ios/NELogController.swift - ${CLIENT_ROOT_DIR}/platforms/ios/Log.swift - ${CLIENT_ROOT_DIR}/platforms/ios/LogRecord.swift - ${CLIENT_ROOT_DIR}/platforms/ios/PacketTunnelProvider.swift - ${CLIENT_ROOT_DIR}/platforms/ios/PacketTunnelProvider+WireGuard.swift - ${CLIENT_ROOT_DIR}/platforms/ios/PacketTunnelProvider+OpenVPN.swift - ${CLIENT_ROOT_DIR}/platforms/ios/PacketTunnelProvider+Xray.swift - ${CLIENT_ROOT_DIR}/platforms/ios/WGConfig.swift - ${CLIENT_ROOT_DIR}/platforms/ios/iosglue.mm + ${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 @@ -182,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/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"); + } + }]; +}*/