diff --git a/client/amnezia_application.cpp b/client/amnezia_application.cpp index 2e3b7866..fe360818 100644 --- a/client/amnezia_application.cpp +++ b/client/amnezia_application.cpp @@ -361,7 +361,7 @@ void AmneziaApplication::initControllers() m_settings, m_configurator)); m_engine->rootContext()->setContextProperty("ExportController", m_exportController.get()); - m_settingsController.reset(new SettingsController(m_serversModel, m_containersModel, m_languageModel, m_settings)); + m_settingsController.reset(new SettingsController(m_serversModel, m_containersModel, m_languageModel, m_sitesModel, m_settings)); m_engine->rootContext()->setContextProperty("SettingsController", m_settingsController.get()); if (m_settingsController->isAutoConnectEnabled() && m_serversModel->getDefaultServerIndex() >= 0) { QTimer::singleShot(1000, this, [this]() { m_connectionController->openConnection(); }); diff --git a/client/core/controllers/serverController.cpp b/client/core/controllers/serverController.cpp index 36560e10..afb6263d 100644 --- a/client/core/controllers/serverController.cpp +++ b/client/core/controllers/serverController.cpp @@ -168,7 +168,7 @@ ErrorCode ServerController::uploadTextFileToContainer(DockerContainer container, } else return ErrorCode::NotImplementedError; - if (stdOut.contains("Error: No such container:")) { + if (stdOut.contains("Error") && stdOut.contains("No such container")) { return ErrorCode::ServerContainerMissingError; } @@ -211,8 +211,14 @@ ErrorCode ServerController::uploadFileToHost(const ServerCredentials &credential localFile.write(data); localFile.close(); +#ifdef Q_OS_WINDOWS + error = m_sshClient.sftpFileCopy(overwriteMode, localFile.fileName().toLocal8Bit().toStdString(), remotePath.toStdString(), + "non_desc"); +#else error = m_sshClient.sftpFileCopy(overwriteMode, localFile.fileName().toStdString(), remotePath.toStdString(), "non_desc"); +#endif + if (error != ErrorCode::NoError) { return error; } diff --git a/client/secure_qsettings.h b/client/secure_qsettings.h index 7421ce01..89147fc1 100644 --- a/client/secure_qsettings.h +++ b/client/secure_qsettings.h @@ -14,12 +14,14 @@ constexpr const char *keyChainName = "AmneziaVPN-Keychain"; class SecureQSettings : public QObject { + Q_OBJECT + public: explicit SecureQSettings(const QString &organization, const QString &application = QString(), QObject *parent = nullptr); - QVariant value(const QString &key, const QVariant &defaultValue = QVariant()) const; - void setValue(const QString &key, const QVariant &value); + Q_INVOKABLE QVariant value(const QString &key, const QVariant &defaultValue = QVariant()) const; + Q_INVOKABLE void setValue(const QString &key, const QVariant &value); void remove(const QString &key); void sync(); diff --git a/client/server_scripts/check_server_is_busy.sh b/client/server_scripts/check_server_is_busy.sh index e1ba63f8..4e6a2c26 100644 --- a/client/server_scripts/check_server_is_busy.sh +++ b/client/server_scripts/check_server_is_busy.sh @@ -1,5 +1,6 @@ if which apt-get > /dev/null 2>&1; then LOCK_FILE="/var/lib/dpkg/lock-frontend";\ elif which dnf > /dev/null 2>&1; then LOCK_FILE="/var/run/dnf.pid";\ elif which yum > /dev/null 2>&1; then LOCK_FILE="/var/run/yum.pid";\ +elif which pacman > /dev/null 2>&1; then LOCK_FILE="/var/lib/pacman/db.lck";\ else echo "Packet manager not found"; echo "Internal error"; exit 1; fi;\ -if command -v fuser > /dev/null 2>&1; then sudo fuser $LOCK_FILE 2>/dev/null; else echo "fuser not installed"; fi +if command -v fuser > /dev/null 2>&1; then sudo fuser $LOCK_FILE 2>/dev/null; else echo "fuser not installed"; fi diff --git a/client/server_scripts/install_docker.sh b/client/server_scripts/install_docker.sh index 6f19e090..6fed78c0 100644 --- a/client/server_scripts/install_docker.sh +++ b/client/server_scripts/install_docker.sh @@ -1,6 +1,7 @@ if which apt-get > /dev/null 2>&1; then pm=$(which apt-get); silent_inst="-yq install"; check_pkgs="-yq update"; docker_pkg="docker.io"; dist="debian";\ elif which dnf > /dev/null 2>&1; then pm=$(which dnf); silent_inst="-yq install"; check_pkgs="-yq check-update"; docker_pkg="docker"; dist="fedora";\ elif which yum > /dev/null 2>&1; then pm=$(which yum); silent_inst="-y -q install"; check_pkgs="-y -q check-update"; docker_pkg="docker"; dist="centos";\ +elif which pacman > /dev/null 2>&1; then pm=$(which pacman); silent_inst="-S --noconfirm --noprogressbar --quiet"; check_pkgs="> /dev/null 2>&1"; docker_pkg="docker"; dist="archlinux";\ else echo "Packet manager not found"; exit 1; fi;\ echo "Dist: $dist, Packet manager: $pm, Install command: $silent_inst, Check pkgs command: $check_pkgs, Docker pkg: $docker_pkg";\ if [ "$dist" = "debian" ]; then export DEBIAN_FRONTEND=noninteractive; fi;\ diff --git a/client/settings.cpp b/client/settings.cpp index 4757dba6..f3fb57a7 100644 --- a/client/settings.cpp +++ b/client/settings.cpp @@ -1,4 +1,8 @@ #include "settings.h" + +#include "QThread" +#include "QCoreApplication" + #include "utilities.h" #include "version.h" @@ -12,10 +16,10 @@ Settings::Settings(QObject *parent) : QObject(parent), m_settings(ORGANIZATION_N { // Import old settings if (serversCount() == 0) { - QString user = m_settings.value("Server/userName").toString(); - QString password = m_settings.value("Server/password").toString(); - QString serverName = m_settings.value("Server/serverName").toString(); - int port = m_settings.value("Server/serverPort").toInt(); + QString user = value("Server/userName").toString(); + QString password = value("Server/password").toString(); + QString serverName = value("Server/serverName").toString(); + int port = value("Server/serverPort").toInt(); if (!user.isEmpty() && !password.isEmpty() && !serverName.isEmpty()) { QJsonObject server; @@ -211,7 +215,7 @@ QString Settings::nextAvailableServerName() const void Settings::setSaveLogs(bool enabled) { - m_settings.setValue("Conf/saveLogs", enabled); + setValue("Conf/saveLogs", enabled); if (!isSaveLogs()) { Logger::deInit(); } else { @@ -233,7 +237,7 @@ QString Settings::routeModeString(RouteMode mode) const Settings::RouteMode Settings::routeMode() const { - return static_cast(m_settings.value("Conf/routeMode", 0).toInt()); + return static_cast(value("Conf/routeMode", 0).toInt()); } bool Settings::addVpnSite(RouteMode mode, const QString &site, const QString &ip) @@ -321,12 +325,12 @@ void Settings::removeAllVpnSites(RouteMode mode) QString Settings::primaryDns() const { - return m_settings.value("Conf/primaryDns", cloudFlareNs1).toString(); + return value("Conf/primaryDns", cloudFlareNs1).toString(); } QString Settings::secondaryDns() const { - return m_settings.value("Conf/secondaryDns", cloudFlareNs2).toString(); + return value("Conf/secondaryDns", cloudFlareNs2).toString(); } void Settings::clearSettings() @@ -351,3 +355,30 @@ ServerCredentials Settings::serverCredentials(int index) const return credentials; } + +QVariant Settings::value(const QString &key, const QVariant &defaultValue) const +{ + QVariant returnValue; + if (QThread::currentThread() == QCoreApplication::instance()->thread()) { + returnValue = m_settings.value(key, defaultValue); + } else { + QMetaObject::invokeMethod(&m_settings, "value", + Qt::BlockingQueuedConnection, + Q_RETURN_ARG(QVariant, returnValue), + Q_ARG(const QString&, key), + Q_ARG(const QVariant&, defaultValue)); + } + return returnValue; +} + +void Settings::setValue(const QString &key, const QVariant &value) +{ + if (QThread::currentThread() == QCoreApplication::instance()->thread()) { + m_settings.setValue(key, value); + } else { + QMetaObject::invokeMethod(&m_settings, "setValue", + Qt::BlockingQueuedConnection, + Q_ARG(const QString&, key), + Q_ARG(const QVariant&, value)); + } +} diff --git a/client/settings.h b/client/settings.h index f530f6c5..50a28dc4 100644 --- a/client/settings.h +++ b/client/settings.h @@ -29,11 +29,11 @@ public: QJsonArray serversArray() const { - return QJsonDocument::fromJson(m_settings.value("Servers/serversList").toByteArray()).array(); + return QJsonDocument::fromJson(value("Servers/serversList").toByteArray()).array(); } void setServersArray(const QJsonArray &servers) { - m_settings.setValue("Servers/serversList", QJsonDocument(servers).toJson()); + setValue("Servers/serversList", QJsonDocument(servers).toJson()); } // Servers section @@ -45,11 +45,11 @@ public: int defaultServerIndex() const { - return m_settings.value("Servers/defaultServerIndex", 0).toInt(); + return value("Servers/defaultServerIndex", 0).toInt(); } void setDefaultServer(int index) { - m_settings.setValue("Servers/defaultServerIndex", index); + setValue("Servers/defaultServerIndex", index); } QJsonObject defaultServer() const { @@ -78,25 +78,25 @@ public: // App settings section bool isAutoConnect() const { - return m_settings.value("Conf/autoConnect", false).toBool(); + return value("Conf/autoConnect", false).toBool(); } void setAutoConnect(bool enabled) { - m_settings.setValue("Conf/autoConnect", enabled); + setValue("Conf/autoConnect", enabled); } bool isStartMinimized() const { - return m_settings.value("Conf/startMinimized", false).toBool(); + return value("Conf/startMinimized", false).toBool(); } void setStartMinimized(bool enabled) { - m_settings.setValue("Conf/startMinimized", enabled); + setValue("Conf/startMinimized", enabled); } bool isSaveLogs() const { - return m_settings.value("Conf/saveLogs", false).toBool(); + return value("Conf/saveLogs", false).toBool(); } void setSaveLogs(bool enabled); @@ -110,15 +110,15 @@ public: QString routeModeString(RouteMode mode) const; RouteMode routeMode() const; - void setRouteMode(RouteMode mode) { m_settings.setValue("Conf/routeMode", mode); } + void setRouteMode(RouteMode mode) { setValue("Conf/routeMode", mode); } QVariantMap vpnSites(RouteMode mode) const { - return m_settings.value("Conf/" + routeModeString(mode)).toMap(); + return value("Conf/" + routeModeString(mode)).toMap(); } void setVpnSites(RouteMode mode, const QVariantMap &sites) { - m_settings.setValue("Conf/" + routeModeString(mode), sites); + setValue("Conf/" + routeModeString(mode), sites); m_settings.sync(); } bool addVpnSite(RouteMode mode, const QString &site, const QString &ip = ""); @@ -132,11 +132,11 @@ public: bool useAmneziaDns() const { - return m_settings.value("Conf/useAmneziaDns", true).toBool(); + return value("Conf/useAmneziaDns", true).toBool(); } void setUseAmneziaDns(bool enabled) { - m_settings.setValue("Conf/useAmneziaDns", enabled); + setValue("Conf/useAmneziaDns", enabled); } QString primaryDns() const; @@ -145,13 +145,13 @@ public: // QString primaryDns() const { return m_primaryDns; } void setPrimaryDns(const QString &primaryDns) { - m_settings.setValue("Conf/primaryDns", primaryDns); + setValue("Conf/primaryDns", primaryDns); } // QString secondaryDns() const { return m_secondaryDns; } void setSecondaryDns(const QString &secondaryDns) { - m_settings.setValue("Conf/secondaryDns", secondaryDns); + setValue("Conf/secondaryDns", secondaryDns); } static const char cloudFlareNs1[]; @@ -171,20 +171,20 @@ public: QLocale getAppLanguage() { - return m_settings.value("Conf/appLanguage", QLocale()).toLocale(); + return value("Conf/appLanguage", QLocale()).toLocale(); }; void setAppLanguage(QLocale locale) { - m_settings.setValue("Conf/appLanguage", locale); + setValue("Conf/appLanguage", locale); }; bool isScreenshotsEnabled() const { - return m_settings.value("Conf/screenshotsEnabled", false).toBool(); + return value("Conf/screenshotsEnabled", false).toBool(); } void setScreenshotsEnabled(bool enabled) { - m_settings.setValue("Conf/screenshotsEnabled", enabled); + setValue("Conf/screenshotsEnabled", enabled); } void clearSettings(); @@ -193,7 +193,10 @@ signals: void saveLogsChanged(); private: - SecureQSettings m_settings; + QVariant value(const QString &key, const QVariant &defaultValue = QVariant()) const; + void setValue(const QString &key, const QVariant &value); + + mutable SecureQSettings m_settings; }; #endif // SETTINGS_H diff --git a/client/translations/amneziavpn_fa_IR.ts b/client/translations/amneziavpn_fa_IR.ts index 7471208b..bf93a619 100644 --- a/client/translations/amneziavpn_fa_IR.ts +++ b/client/translations/amneziavpn_fa_IR.ts @@ -15,15 +15,13 @@ AndroidController - AmneziaVPN - AmneziaVPN + AmneziaVPN - VPN Connected Refers to the app - which is currently running the background and waiting - وی‎پی‎ان متصل است + وی‎پی‎ان متصل است @@ -31,7 +29,7 @@ Error when retrieving configuration from cloud server - + خطا در حین دریافت پیکربندی از سمت سرور @@ -46,7 +44,7 @@ Connection... - ارتباط + در حال ارتباط... @@ -62,12 +60,12 @@ Settings updated successfully - + تنظیمات با موفقیت به‎روز‎رسانی شدند Reconnection... - در حال اتصال دوباره... + اتصال دوباره... @@ -152,7 +150,7 @@ ImportController - + Scanned %1 of %2. ارزیابی %1 از %2. @@ -245,12 +243,12 @@ Already installed containers were found on the server. All installed containers VPN Connected - وی‎پی‎ان متصل است + وی‎پی‎ان وصل شد VPN Disconnected - وی‎پی‎ان قطع است + وی‎پی‎ان قطع شد @@ -1430,22 +1428,22 @@ Already installed containers were found on the server. All installed containers نام سرور - + Save ذخیره - + Protocols پروتکل‎ها - + Services سرویس‎ها - + Data داده @@ -1682,7 +1680,7 @@ and will not be shared or disclosed to the Amnezia or any third parties All data you enter will remain strictly confidential and will not be shared or disclosed to the Amnezia or any third parties - + تمام داده‎هایی که شما وارد می‎کنید به شدت محرمانه‎ است و با Amnezia یا هر شخص ثالث دیگری به اشتراک گذاشته نمی‎شود @@ -1766,7 +1764,7 @@ and will not be shared or disclosed to the Amnezia or any third parties Cancel installation - + لغو عملیات نصب @@ -1918,12 +1916,12 @@ and will not be shared or disclosed to the Amnezia or any third parties OpenVpn native format - فرمت محلی OpenVPN + فرمت OpenVPN WireGuard native format - فرمت محلی WireGuard + فرمت WireGuard VPN Access @@ -1943,8 +1941,8 @@ and will not be shared or disclosed to the Amnezia or any third parties Доступ к управлению сервером. Пользователь, с которым вы делитесь полным доступом к соединению, сможет добавлять и удалять ваши протоколы и службы на сервере, а также изменять настройки. - + Server سرور @@ -1959,7 +1957,7 @@ and will not be shared or disclosed to the Amnezia or any third parties Config revoked - + تنظیمات ابطال‎شد @@ -1984,12 +1982,12 @@ and will not be shared or disclosed to the Amnezia or any third parties Save ShadowSocks config - + ذخیره تنظیمات ShadowSocks Save Cloak config - + ذخیره تنظیمات Cloak @@ -1999,12 +1997,12 @@ and will not be shared or disclosed to the Amnezia or any third parties ShadowSocks native format - + فرمت ShadowSocks Cloak native format - + فرمت Cloak @@ -2014,68 +2012,77 @@ and will not be shared or disclosed to the Amnezia or any third parties 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: - + Rename - + تغییر نام - + Client name - + نام کلاینت - + Save - ذخیره + ذخیره - + Revoke + ابطال + + + + Revoke the config for a user - %1? - Revoke the config for a user - - + ابطال تنظیمات برای کاربر - + The user will no longer be able to connect to your server. - + کاربر دیگر نمی‎تواند به سرور وصل شود. - + Continue - + ادامه - + Cancel - کنسل + کنسل Full access @@ -2091,20 +2098,20 @@ and will not be shared or disclosed to the Amnezia or any third parties به اشتراک گذاری دسترسی به مدیریت سرور. کاربری که دسترسی کامل سرور با او به اشتراک گذاشته می‎شود می‎تواند پروتکل‌‎ها و سرویس‎ها را در سرور حذف یا اضافه کند و یا تنظیمات سرور را تغییر دهد. - + Protocol پروتکل - + Connection format فرمت ارتباط - + Share اشتراک‎گذاری @@ -2114,49 +2121,50 @@ and will not be shared or disclosed to the Amnezia or any third parties 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 - فایل شامل تنظیمات ارتباط با + فایل شامل تنظیمات ارتباط با @@ -2547,6 +2555,11 @@ and will not be shared or disclosed to the Amnezia or any third parties The config does not contain any containers and credentials for connecting to the server + تنظیمات شامل هیچ کانتینر یا اعتبارنامه‎ای برای اتصال به سرور نیست + + + + VPN connection error @@ -2608,7 +2621,7 @@ and will not be shared or disclosed to the Amnezia or any third parties The config does not contain any containers and credentiaks for connecting to the server - + Internal error Internal error @@ -2628,31 +2641,31 @@ While it offers a blend of security, stability, and speed, it's essential t * Minimal configuration * Recognised by DPI analysis systems * Works over UDP network protocol, ports 500 and 4500. - IKEv2 в сочетании с уровнем шифрования IPSec это современный и стабильный протокол VPN. -Он может быстро переключаться между сетями и устройствами, что делает его особенно адаптивным в динамичных сетевых средах. -Несмотря на сочетание безопасности, стабильности и скорости, необходимо отметить, что IKEv2 легко обнаруживается и подвержен блокировке. + پروتکل IKEv2 به همراه لایه رمزنگاری IPSec به عنوان پروتکل وی‎پی‎ان مدرن و پایدار است. +یکی از قابلیت‎‎های متمایز این پروتکل قابلیت سوییچ بین شبکه‎ها و دستگاه‎هاست که قابلیت انطباق بالایی در محیط شبکه‎های دینامیک را دارد +در حالیکه ترکیبی از امنیت، پایداری و سرعت را ارائه میدهد اما مهم است که اشاره کنیم IKEv2 به راحتی قابل تشخیص در شبکه و بلاک شدن میباشد. -* Доступно в AmneziaVPN только для Windows. -* Низкое энергопотребление, на мобильных устройствах -* Минимальная конфигурация -* Распознается системами DPI-анализа -* Работает по сетевому протоколу UDP, порты 500 и 4500. +* در AmneziaVPN فقط بر روی ویندوز در دسترس است +* مصرف باتری کم روی دستگاه‎های موبایل +* تنظیمات ساده +* امکان شناسایی شدن در شبکه‎های تحلیل DPI +* روی پروتکل شبکه UDP، پورت‎های 500 و 4500 کار می‎کند. DNS Service - DNS Сервис + سرویس DNS Sftp file sharing service - Сервис обмена файлами Sftp + سرویس اشتراک گذاری فایل Sftp Website in Tor network - Веб-сайт в сети Tor + وب سایت در شبکه Tor @@ -2662,47 +2675,47 @@ While it offers a blend of security, stability, and speed, it's essential t 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 для обмена ключами. + پروتکل OpenVPN یکی از پروتکل‎های وی‎پی‎ان محبوب می‎باشد با تنظیمات و پیکربندی‎های قابل تغییر. از پروتکل امنیتی داخلی خود با تبادل کلید SSL/TLS استفاده می‎کند. ShadowSocks - masks VPN traffic, making it similar to normal web traffic, but is recognised by analysis systems in some highly censored regions. - ShadowSocks - маскирует VPN-трафик под обычный веб-трафик, но распознается системами анализа в некоторых регионах с высоким уровнем цензуры. + پروتکل ShadowSocks ترافیک وی‎پی‎ان را پنهان و آن را شبیه ترافیک عادی وب می‎کند، اما در مناطقی که سانسور شدیدی اعمال می‎شود با سیستم‎های تحلیلی قابل شناسایی است. OpenVPN over Cloak - OpenVPN with VPN masquerading as web traffic and protection against active-probbing detection. Ideal for bypassing blocking in regions with the highest levels of censorship. - OpenVPN over Cloak - OpenVPN с маскировкой VPN под web-трафик и защитой от обнаружения active-probbing. Подходит для регионов с самым высоким уровнем цензуры. + پروتکل OpenVPN over Cloak که همان پروتکل OpenVPN با قابلیت پنهان کردن ترافیک از سیستم‎های تحلیل فعال برروی شبکه. ایده‎آل برای گذر از ممنوعیت در مناطقی که سانسور شدیدی اعمال می‎کنند. WireGuard - New popular VPN protocol with high performance, high speed and low power consumption. Recommended for regions with low levels of censorship. - WireGuard - Популярный VPN-протокол с высокой производительностью, высокой скоростью и низким энергопотреблением. Для регионов с низким уровнем цензуры. + پروتکل 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, но очень устойчив к блокировкам. Рекомендуется для регионов с высоким уровнем цензуры. + پروتکل AmneziaWG یک پروتکل اختصاصی Amnezia که بر اساس WireGaurd کار میکند. به اندازه WireGaurd پرسرعت است و در عین حال بسیار مقاوم به بلاک شدن توسط شبکه ست. مناسب برای مناطق با سطح سانسور بالاست. IKEv2 - 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. - IKEv2 Современный стабильный протокол, немного быстрее других восстанавливает соединение после потери сигнала. Имеет нативную поддержку последних версиий Android и iOS. + پروتکل IKEv2 پروتکلی پایدار و مدرن که مقداری سریعتر از سایر پروتکل‎هاست. بعد از قطع سیگنال دوباره اتصال را بازیابی می‎کند. به صورت پیش‎فرض بر روی آخرین نسخه دستگاه‎های اندروید و iOS پیشتیبانی می‎شود. Deploy a WordPress site on the Tor network in two clicks. - Разверните сайт на WordPress в сети Tor в два клика. + با دو کلیک یک سایت وردپرس در شبکه Tor راه‎اندازی کنید. Replace the current DNS server with your own. This will increase your privacy level. - Замените DNS-сервер на Amnezia DNS. Это повысит уровень конфиденциальности. + سرور DNS را با مال خودتان جایگزین کنید. این کار سطح حریم خصوصی شما را افزایش می‎دهد. Creates a file vault on your server to securely store and transfer files. - Создайте на сервере файловое хранилище для безопасного хранения и передачи файлов. + یک محفظه ایمن بر روی سرور خودتان ایجاد کنید که به طور امن بتوانید فایل‎ها را ذخیره و جابجا کنید. @@ -2714,14 +2727,18 @@ It employs its unique security protocol, leveraging the strength of SSL/TLS for * Flexible customisation to suit user needs to work with different operating systems and devices * Recognised by DPI analysis systems and therefore susceptible to blocking * Can operate over both TCP and UDP network protocols. - OpenVPN однин из самых популярных и проверенных временем VPN-протоколов. -В нем используется уникальный протокол безопасности, опирающийся на протокол SSL/TLS для шифрования и обмена ключами. Кроме того, поддержка OpenVPN множества методов аутентификации делает его универсальным и адаптируемым к широкому спектру устройств и операционных систем. Благодаря открытому исходному коду OpenVPN подвергается тщательному анализу со стороны мирового сообщества, что постоянно повышает его безопасность. Благодаря оптимальному соотношению производительности, безопасности и совместимости OpenVPN остается лучшим выбором как для частных лиц, так и для компаний, заботящихся о конфиденциальности. + پروتکل OpenVPN یکی از پروتکل‎های محبوب و تست شده در دسترس می‎باشد که از پروتکل امنیتی مخصوص خودش استفاده میکند. +از امتیازات SSL/TLS برای رمزنگاری و تبادل کلید استفاده میکند. +همچنین OpenVPN از روش‎های چندگانه‎ای برای احراز هویت پشتیبانی می‎کند که آن را قابل انطباق و منعطف میکند. +از طیف وسیعی از دستگاه‎ها و سیستم عامل‎ها نیز پشتیبانی می‎کند. +به دلیل طبیعت متن-باز آن، OpenVPN از بررسی گسترده توسط یک جامعه جهانی سود می‎برد که باعث بهتر شدن وضعیت امنیتی آن می‎شود. +به دلیل تعادل قوی بین عملکرد، امنیت و سازگاری OpenVPN تبدیل به یکی از انتخاب‎های اصلی برای اشخاص آگاه بر حریم خصوصی و تجارت‎های مشابه شده است. -* Доступность AmneziaVPN для всех платформ -* Нормальное энергопотребление на мобильных устройствах -* Гибкая настройка под нужды пользователя для работы с различными операционными системами и устройствами -* Распознается системами DPI-анализа и поэтому подвержен блокировке -* Может работать по сетевым протоколам TCP и UDP. +* بر روی تمام سیستم‎عامل‎ها در AmneziaVPN در دسترس است. +* مصرف انرژی عادی بر روی دستگاه‎های موبایل +* قابلیت شخصی‎سازی منعطف مطابق با نیاز شما که امکان کار بر روی دستگاه‎ها و سیستم عامل‎های مختلف را می‎دهد. +* قابل شناسایی توسط سیستم‎های تحلیل عمیق DPI در شبکه و در نتیجه امکان بلاک شدن +* امکان کار بر روی دو پروتکل TCP و UDP @@ -2733,12 +2750,13 @@ It employs its unique security protocol, leveraging the strength of SSL/TLS for * Configurable encryption protocol * Detectable by some DPI systems * Works over TCP network protocol. - Shadowsocks, создан на основе протокола SOCKS5, защищает соединение с помощью шифра AEAD. Несмотря на то, что протокол Shadowsocks разработан таким образом, чтобы быть незаметным и сложным для идентификации, он не идентичен стандартному HTTPS-соединению. Однако некоторые системы анализа трафика все же могут обнаружить соединение Shadowsocks. В связи с ограниченной поддержкой в Amnezia рекомендуется использовать протокол AmneziaWG, или OpenVPN over Cloak. + پروتکل Shadowsocks، الهام گرفته از پروتکل Socks5، اتصال را با استفاده از رمزگذاری AEAD امن میکند. اگرچه Shadowsocks طوری طراحی شده که برای شناسایی در شبکه چالش‎برانگیز باشد و محتاط عمل کند اما این پروتکل مانند یک اتصال استاندارد HTTPS نیست و برخی از سیستم‎های تحلیل ترافیک مشخص ممکن است بتوانند اتصال Shadowsocks را شناسایی کنند. به دلیل محدودیت پشتیبانی در Amnezia پیشنهاد می‎شود که از َAmneziaWG استفاده شود. -* Доступен в AmneziaVPN только на ПК ноутбуках. -* Настраиваемый протокол шифрования -* Обнаруживается некоторыми DPI-системами -* Работает по сетевому протоколу TCP. +* فقط بر روی پلتفرم دسکتاپ بر روی Amnezia قابل دسترس است +* مصرف انرژی عادی در دستگاه‎های موبایل +* پروتکل رمزنگاری قابل پیکربندی +* قابل شناسایی توسط برخی سیستم‎های تحلیل عمیق DPI +* عملکرد بر روی پروتکل شبکه TCP @@ -2760,23 +2778,24 @@ If there is a extreme level of Internet censorship in your region, we advise you * Not recognised by DPI analysis systems * Works over TCP network protocol, 443 port. - OpenVPN over Cloak - это комбинация протокола OpenVPN и плагина Cloak, разработанного специально для защиты от блокировок. + این یک ترکیب از پروتکل OpenVPN و افزونه Cloak می‎باشد که به طور خاص برای محافظت از بلاک شدن طراحی شده است. -OpenVPN обеспечивает безопасное VPN-соединение за счет шифрования всего интернет-трафика между клиентом и сервером. +پروتکل OpenVPN با رمزنگاری تمام ترافیک اینترنت بین دستگاه و سرور یک اتصال وی‎پی‎ان امن را فراهم می‎کند. -Cloak защищает OpenVPN от обнаружения и блокировок. +افزونه Cloak از OpenVPN در مقابل شناسایی و بلاک شدن محافظت می‎کند -Cloak может изменять метаданные пакетов. Он полностью маскирует VPN-трафик под обычный веб-трафик, а также защищает VPN от обнаружения с помощью Active Probing. Это делает его очень устойчивым к обнаружению +افزونه Cloak می‎تواند داده‎های بسته ترافیکی را تغییر دهد و در نتیجه ترافیک وی‎پی‎ان شبیه ترافیک عادی وب می‎شود و همچنین از وی‎پی‎ان در مقابل شناسایی شدن توسط DPI محافظت می‎کند. این باعث می‎شود که این پروتکل به شناسایی‎شدن بسیار مقاوم باشد -Сразу же после получения первого пакета данных Cloak проверяет подлинность входящего соединения. Если аутентификация не проходит, плагин маскирует сервер под поддельный сайт, и ваш VPN становится невидимым для аналитических систем. +درست بعد از دریافت اولین بسته داده،افزونه Cloak اتصال ورودی را احراز هویت می‎کند و اگر عملیات احراز هویت انجام نشود Cloak سرور را به عنوان یک وب سایت جعلی در‎ می‎آورد و وی‎پی‎ان شما را از تحلیل شبکه پنهان می‎کند. -Если в вашем регионе существует экстремальный уровень цензуры в Интернете, мы советуем вам при первом подключении использовать только OpenVPN через Cloak +اگر در منطقه شما سطح بالایی از سانسور وجود دارد ما به شما پیشنهاد می‎کنیم از اولین ارتباط تنها از OpenVPN over Cloak استفاده کنید. -* Доступность AmneziaVPN на всех платформах -* Высокое энергопотребление на мобильных устройствах -* Гибкие настройки -* Не распознается системами DPI-анализа -* Работает по сетевому протоколу TCP, 443 порт. + +* بر روی تمام پلتفرم‎ها در AmneziaVPN در دسترس است +* مصرف بالای انرژی در دستگاه‎های موبایل +* تنظیمات منطعف +* غیرقابل تشخیص و شناسایی توسط سیستم‎های تحلیل عمیق DPI +* کار کردن روی پروتکل شبکه TCP، پورت 443 @@ -2790,15 +2809,15 @@ WireGuard is very susceptible to blocking due to its distinct packet signatures. * Minimum number of settings * Easily recognised by DPI analysis systems, susceptible to blocking * Works over UDP network protocol. - WireGuard - относительно новый популярный VPN-протокол с упрощенной архитектурой. -Обеспечивает стабильное VPN-соединение, высокую производительность на всех устройствах. Использует жестко заданные настройки шифрования. WireGuard по сравнению с OpenVPN имеет меньшую задержку и лучшую пропускную способность при передаче данных. -WireGuard очень восприимчив к блокированию из-за особенностей сигнатур пакетов. В отличие от некоторых других VPN-протоколов, использующих методы обфускации, последовательные сигнатуры пакетов WireGuard легче выявляются и, соответственно, блокируются современными системами глубокой проверки пакетов (DPI) и другими средствами сетевого мониторинга. + یک پروتکل نسبتا محبوب وی‎پی‎ان با معماری ساده +اتصال وی‎پی‎‎ان پایدار با عملکرد بالا بر روی تمام دستگاه‎‌ها فراهم می‎کند. از تنظیمات ثابت برای رمزنگاری استفاده می‎کند و در مقایسه با OpenVPN سرعت بهتری در انتقال اطلاعات دارد. +پروتکل WireGaurd به دلیل امضای بسته داده مخصوص، احتمال بسیار بالایی برای شناسایی و بلاک شدن دارد.برعکس سایر پروتکل‎های وی‎پی‎ان که از روش‎های مخفی کردن استفاده می‎کنند، امضای ثابت WireGuard به راحتی می‎تواند توسط سیستم‎های تحلیل عمیق DPI یا سایر روش‎های بررسی شبکه شناسایی و بلاک شود. -* Доступность AmneziaVPN для всех платформ -* Низкое энергопотребление -* Минимальное количество настроек -* Легко распознается системами DPI-анализа, подвержен блокировке -* Работает по сетевому протоколу UDP. +* بر روی تمام پلتفرم‌ها در AmneziaVPN قابل دسترسی است. +* مصرف انرژی پایین +* کمترین میزان تنظیمات +* امکان شناسایی شدن توسط سیستم‎های تحلیل عمیق DPI به آسانی و بلاک شدن +* کار بر روی پروتکل شبکه UDP @@ -2811,15 +2830,15 @@ This means that AmneziaWG keeps the fast performance of the original while addin * Minimum number of settings * Not recognised by DPI analysis systems, resistant to blocking * Works over UDP network protocol. - AmneziaWG - усовершенствованная версия популярного VPN-протокола Wireguard. AmneziaWG опирается на фундамент, заложенный WireGuard, сохраняя упрощенную архитектуру и высокопроизводительные возможности работы на разных устройствах. -Хотя WireGuard известен своей эффективностью, у него были проблемы с обнаружением из-за характерных сигнатур пакетов. AmneziaWG решает эту проблему за счет использования более совершенных методов обфускации, благодаря чему его трафик сливается с обычным интернет-трафиком. -Таким образом, AmneziaWG сохраняет высокую производительность оригинала, добавляя при этом дополнительный уровень скрытности, что делает его отличным выбором для тех, кому нужно быстрое и незаметное VPN-соединение. + یک نسخه مدرن از پروتکل وی‎پی‎ان محبوب، AmneziaWG بر روی پایه‎های WireGuard ساخته شده و معماری ساده و عملکرد بالای آن را بر روی تمام دستگاه‎ها حفظ کرده است. +در حالی‎که WireGuard به دلیل بازدهی آن شناخته می‎شود اما امکان شناسایی شدن بالا به دلیل امضای ثابت بسته داده‎های آن یکی از مشکلات آن است. AmneziaWG این مشکل را با استفاده از متدهای مخفی سازی حل کرده و در نتیجه ترافیک آن همانند با ترافیک عادی اینترنت است. +این بدین معنی است که AmneziaWG عملکرد سریع اصلی را حفظ کرده و یک لایه پنهان سازی به آن اضافه کرده که باعث می‎شود که به انتخابی عالی برای آنها که وی‎پی‎ان امن و سریع می‎خواهند تبدیل شود. -* Доступность AmneziaVPN на всех платформах -* Низкое энергопотребление -* Минимальное количество настроек -* Не распознается системами DPI-анализа, устойчив к блокировке -* Работает по сетевому протоколу UDP. +* بر روی تمام پلتفرم‌ها در AmneziaVPN قابل دسترسی است. +* مصرف انرژی پایین +* کمترین میزان تنظیمات +* غیرقابل تشخیص توسط سیستم‎های تحلیل عمیق DPI و مقاوم به بلاک شدن +* کار بر روی پروتکل شبکه UDP AmneziaWG container @@ -2828,12 +2847,12 @@ This means that AmneziaWG keeps the fast performance of the original while addin Sftp file sharing service - is secure FTP service - Сервис обмена файлами Sftp - безопасный FTP-сервис + سرویس اشتراک فایل Sftp یک سرویس امن FTP می‎باشد Sftp service - Сервис SFTP + سرویس Sftp @@ -2895,6 +2914,16 @@ This means that AmneziaWG keeps the fast performance of the original while addin error 0x%1: %2 error 0x%1: %2 + + + WireGuard Configuration Highlighter + هایلایتر پیکربندی WireGuard + + + + &Randomize colors + رنگ‎های تصادفی + SelectLanguageDrawer @@ -2968,7 +2997,7 @@ This means that AmneziaWG keeps the fast performance of the original while addin Copy config string - + کپی‎کردن متن تنظیمات @@ -3048,7 +3077,7 @@ This means that AmneziaWG keeps the fast performance of the original while addin Visit Website - بازدید وب‎سایت + بازدید وب سایت @@ -3068,7 +3097,7 @@ This means that AmneziaWG keeps the fast performance of the original while addin VpnConnection - + Mbps Mbps diff --git a/client/ui/controllers/settingsController.cpp b/client/ui/controllers/settingsController.cpp index 4656e4a8..f7345608 100644 --- a/client/ui/controllers/settingsController.cpp +++ b/client/ui/controllers/settingsController.cpp @@ -14,11 +14,13 @@ SettingsController::SettingsController(const QSharedPointer &serversModel, const QSharedPointer &containersModel, const QSharedPointer &languageModel, + const QSharedPointer &sitesModel, const std::shared_ptr &settings, QObject *parent) : QObject(parent), m_serversModel(serversModel), m_containersModel(containersModel), m_languageModel(languageModel), + m_sitesModel(sitesModel), m_settings(settings) { m_appVersion = QString("%1: %2 (%3)").arg(tr("Software version"), QString(APP_VERSION), __DATE__); @@ -133,6 +135,7 @@ void SettingsController::clearSettings() m_serversModel->resetModel(); m_languageModel->changeLanguage( static_cast(m_languageModel->getCurrentLanguageIndex())); + m_sitesModel->setRouteMode(Settings::RouteMode::VpnAllSites); emit changeSettingsFinished(tr("All settings have been reset to default values")); } diff --git a/client/ui/controllers/settingsController.h b/client/ui/controllers/settingsController.h index 710d255f..a6cbc587 100644 --- a/client/ui/controllers/settingsController.h +++ b/client/ui/controllers/settingsController.h @@ -6,6 +6,7 @@ #include "ui/models/containers_model.h" #include "ui/models/languageModel.h" #include "ui/models/servers_model.h" +#include "ui/models/sites_model.h" class SettingsController : public QObject { @@ -14,6 +15,7 @@ public: explicit SettingsController(const QSharedPointer &serversModel, const QSharedPointer &containersModel, const QSharedPointer &languageModel, + const QSharedPointer &sitesModel, const std::shared_ptr &settings, QObject *parent = nullptr); Q_PROPERTY(QString primaryDns READ getPrimaryDns WRITE setPrimaryDns NOTIFY primaryDnsChanged) @@ -76,6 +78,7 @@ private: QSharedPointer m_serversModel; QSharedPointer m_containersModel; QSharedPointer m_languageModel; + QSharedPointer m_sitesModel; std::shared_ptr m_settings; QString m_appVersion; diff --git a/client/ui/models/clientManagementModel.cpp b/client/ui/models/clientManagementModel.cpp index f1576d08..5c89382b 100644 --- a/client/ui/models/clientManagementModel.cpp +++ b/client/ui/models/clientManagementModel.cpp @@ -231,7 +231,7 @@ ErrorCode ClientManagementModel::appendClient(const QString &clientId, const QSt } } - beginInsertRows(QModelIndex(), rowCount(), 1); + beginInsertRows(QModelIndex(), rowCount(), rowCount() + 1); QJsonObject client; client[configKey::clientId] = clientId; diff --git a/client/ui/qml/Pages2/PageSettingsAbout.qml b/client/ui/qml/Pages2/PageSettingsAbout.qml index eaa9eb3d..b387cc64 100644 --- a/client/ui/qml/Pages2/PageSettingsAbout.qml +++ b/client/ui/qml/Pages2/PageSettingsAbout.qml @@ -101,7 +101,7 @@ PageType { text: qsTr("Show other methods on Github") - onClicked: Qt.openUrlExternally("https://github.com/amnezia-vpn/amnezia-client#donate") + onClicked: Qt.openUrlExternally(qsTr("https://github.com/amnezia-vpn/amnezia-client#donate")) } ParagraphTextType { diff --git a/client/ui/qml/Pages2/PageSetupWizardStart.qml b/client/ui/qml/Pages2/PageSetupWizardStart.qml index 2f89bc57..a820ac71 100644 --- a/client/ui/qml/Pages2/PageSetupWizardStart.qml +++ b/client/ui/qml/Pages2/PageSetupWizardStart.qml @@ -135,7 +135,7 @@ PageType { text: qsTr("I have nothing") - onClicked: Qt.openUrlExternally("https://amnezia.org/instructions/0_starter-guide") + onClicked: Qt.openUrlExternally(qsTr("https://amnezia.org/instructions/0_starter-guide")) } } diff --git a/deploy/data/macos/update-resolv-conf.sh b/deploy/data/macos/update-resolv-conf.sh index 09759269..6d5bf3b5 100755 --- a/deploy/data/macos/update-resolv-conf.sh +++ b/deploy/data/macos/update-resolv-conf.sh @@ -2,7 +2,7 @@ # Mac name-resolution updater based on @cl's script here: # https://blog.netnerds.net/2011/10/openvpn-update-client-dns-on-mac-os-x-using-from-the-command-line/ -# Openvpn envvar parsing taken from the script in debian's openvpn package. +# Openvpn envar parsing taken from the script in debian's openvpn package. # Smushed together and improved by @andrewgdotcom. # Parses DHCP options from openvpn to update resolv.conf @@ -10,6 +10,8 @@ # up /etc/openvpn/update-resolv-conf # down /etc/openvpn/update-resolv-conf +echo "*** starting update-resolv-config script ***" + [ "$script_type" ] || exit 0 [ "$dev" ] || exit 0 @@ -34,11 +36,11 @@ update_all_dns() echo updating dns for $adapter # set dns server to the vpn dns server if [[ "${SRCHS[@]}" ]]; then - networksetup -setsearchdomains "$adapter" "${SRCHS[@]}" + networksetup -setsearchdomains "$adapter" "${SRCHS[@]}" fi if [[ "${NMSRVRS[@]}" ]]; then - networksetup -setdnsservers "$adapter" "${NMSRVRS[@]}" - fi + networksetup -setdnsservers "$adapter" "${NMSRVRS[@]}" + fi done } @@ -61,7 +63,7 @@ case "$script_type" in if [ "$part1" = "dhcp-option" ] ; then if [ "$part2" = "DNS" ] ; then NMSRVRS=(${NMSRVRS[@]} $part3) - elif [ "$part2" = "DOMAIN" ] ; then + elif [ "$part2" = "DOMAIN" ] || [ "$part2" = "DOMAIN-SEARCH" ]; then SRCHS=(${SRCHS[@]} $part3) fi fi @@ -72,3 +74,5 @@ case "$script_type" in clear_all_dns ;; esac + +echo "*** finished update-resolv-config script ***"