From 3ab88d06a447c2997a3ad76ec68f36ea8ea389c4 Mon Sep 17 00:00:00 2001 From: Cuynu <90895715+cuynu@users.noreply.github.com> Date: Thu, 27 Oct 2022 23:29:44 +0700 Subject: [PATCH] Sync 1.7.23 --- V2rayNG/app/build.gradle | 4 +- .../kotlin/com/v2ray/ang/dto/V2rayConfig.kt | 5 +- .../kotlin/com/v2ray/ang/dto/VmessQRCode.kt | 3 +- .../kotlin/com/v2ray/ang/ui/ServerActivity.kt | 11 +- .../com/v2ray/ang/util/AngConfigManager.kt | 16 +- .../main/kotlin/com/v2ray/ang/util/Utils.kt | 5 + .../com/v2ray/ang/viewmodel/MainViewModel.kt | 5 +- .../app/src/main/res/layout/tls_layout.xml | 22 +- .../app/src/main/res/values-ru/strings.xml | 228 ++++++++++++++++++ V2rayNG/app/src/main/res/values/arrays.xml | 9 + V2rayNG/app/src/main/res/values/strings.xml | 3 +- 11 files changed, 296 insertions(+), 15 deletions(-) create mode 100644 V2rayNG/app/src/main/res/values-ru/strings.xml diff --git a/V2rayNG/app/build.gradle b/V2rayNG/app/build.gradle index 6b71927..57ba1c7 100644 --- a/V2rayNG/app/build.gradle +++ b/V2rayNG/app/build.gradle @@ -18,8 +18,8 @@ android { minSdkVersion 21 targetSdkVersion Integer.parseInt("$targetSdkVer") multiDexEnabled true - versionCode 476 - versionName "1.7.21" + versionCode 480 + versionName "1.7.23" } if (props["sign"]) { diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/V2rayConfig.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/V2rayConfig.kt index fe5815c..a5fa785 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/V2rayConfig.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/V2rayConfig.kt @@ -259,12 +259,13 @@ data class V2rayConfig( return sni } - fun populateTlsSettings(streamSecurity: String, allowInsecure: Boolean, sni: String, fingerprint: String?) { + fun populateTlsSettings(streamSecurity: String, allowInsecure: Boolean, sni: String, fingerprint: String?, alpns: String?) { security = streamSecurity val tlsSetting = TlsSettingsBean( allowInsecure = allowInsecure, serverName = sni, - fingerprint = fingerprint + fingerprint = fingerprint, + alpn = if (alpns.isNullOrEmpty()) null else alpns.split(",").map { it.trim() }.filter { it.isNotEmpty() } ) if (security == TLS) { tlsSettings = tlsSetting diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/VmessQRCode.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/VmessQRCode.kt index 90d58a5..48f3a34 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/VmessQRCode.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/VmessQRCode.kt @@ -12,4 +12,5 @@ data class VmessQRCode(var v: String = "", var host: String = "", var path: String = "", var tls: String = "", - var sni: String = "") \ No newline at end of file + var sni: String = "", + var alpn: String = "") \ No newline at end of file diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ServerActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ServerActivity.kt index 3c5768d..73696ca 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ServerActivity.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ServerActivity.kt @@ -70,6 +70,9 @@ class ServerActivity : BaseActivity() { private val uTlsItems: Array by lazy { resources.getStringArray(R.array.streamsecurity_utls) } + private val alpns: Array by lazy { + resources.getStringArray(R.array.streamsecurity_alpn) + } // Kotlin synthetics was used, but since it is removed in 1.8. We switch to old manual approach. // We don't use AndroidViewBinding because, it is better to share similar logics for different // protocols. Use findViewById manually ensures the xml are de-coupled with the activity logic. @@ -90,6 +93,7 @@ class ServerActivity : BaseActivity() { private val sp_header_type_title: TextView? by lazy { findViewById(R.id.sp_header_type_title) } private val et_request_host: EditText? by lazy { findViewById(R.id.et_request_host) } private val et_path: EditText? by lazy { findViewById(R.id.et_path) } + private val sp_stream_alpn: Spinner? by lazy { findViewById(R.id.sp_stream_alpn) } //uTLS override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -178,6 +182,10 @@ class ServerActivity : BaseActivity() { val utlsIndex = Utils.arrayFind(uTlsItems, tlsSetting.fingerprint) sp_stream_fingerprint?.setSelection(utlsIndex) } + tlsSetting.alpn?.let { + val alpnIndex = Utils.arrayFind(alpns, Utils.removeWhiteSpace(tlsSetting.alpn.joinToString())!!) + sp_stream_alpn?.setSelection(alpnIndex) + } } } @@ -320,6 +328,7 @@ class ServerActivity : BaseActivity() { val allowInsecureField = sp_allow_insecure?.selectedItemPosition ?: return val streamSecurity = sp_stream_security?.selectedItemPosition ?: return var utlsIndex = sp_stream_fingerprint?.selectedItemPosition ?: return + var alpnIndex = sp_stream_alpn?.selectedItemPosition ?: return var sni = streamSetting.populateTransportSettings( transport = networks[network], @@ -341,7 +350,7 @@ class ServerActivity : BaseActivity() { allowinsecures[allowInsecureField].toBoolean() } - streamSetting.populateTlsSettings(streamSecuritys[streamSecurity], allowInsecure, sni, uTlsItems[utlsIndex]) + streamSetting.populateTlsSettings(streamSecuritys[streamSecurity], allowInsecure, sni, uTlsItems[utlsIndex], alpns[alpnIndex]) } private fun transportTypes(network: String?): Array { diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/AngConfigManager.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/AngConfigManager.kt index 43bff54..b93ac35 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/AngConfigManager.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/AngConfigManager.kt @@ -145,7 +145,7 @@ object AngConfigManager { } var fingerprint = streamSetting.tlsSettings?.fingerprint streamSetting.populateTlsSettings(vmessBean.streamSecurity, allowInsecure, - vmessBean.sni.ifBlank { sni }, fingerprint) + vmessBean.sni.ifBlank { sni }, fingerprint, null) } } val key = MmkvManager.encodeServerConfig(vmessBean.guid, config) @@ -223,7 +223,7 @@ object AngConfigManager { streamSetting.populateTlsSettings(vmessQRCode.tls, allowInsecure, - if (TextUtils.isEmpty(vmessQRCode.sni)) sni else vmessQRCode.sni, fingerprint) + if (TextUtils.isEmpty(vmessQRCode.sni)) sni else vmessQRCode.sni, fingerprint, vmessQRCode.alpn) } } } else if (str.startsWith(EConfigType.SHADOWSOCKS.protocolScheme)) { @@ -306,11 +306,11 @@ object AngConfigManager { val sni = config.outboundBean?.streamSettings?.populateTransportSettings(queryParam["type"] ?: "tcp", queryParam["headerType"], queryParam["host"], queryParam["path"], queryParam["seed"], queryParam["quicSecurity"], queryParam["key"], queryParam["mode"], queryParam["serviceName"]) - config.outboundBean?.streamSettings?.populateTlsSettings(queryParam["security"] ?: TLS, allowInsecure, queryParam["sni"] ?: sni!!, fingerprint) + config.outboundBean?.streamSettings?.populateTlsSettings(queryParam["security"] ?: TLS, allowInsecure, queryParam["sni"] ?: sni!!, fingerprint, queryParam["alpn"]) flow = queryParam["flow"] ?: "" } else { - config.outboundBean?.streamSettings?.populateTlsSettings(TLS, allowInsecure, "", fingerprint) + config.outboundBean?.streamSettings?.populateTlsSettings(TLS, allowInsecure, "", fingerprint, null) } config.outboundBean?.settings?.servers?.get(0)?.let { server -> @@ -339,7 +339,7 @@ object AngConfigManager { val sni = streamSetting.populateTransportSettings(queryParam["type"] ?: "tcp", queryParam["headerType"], queryParam["host"], queryParam["path"], queryParam["seed"], queryParam["quicSecurity"], queryParam["key"], queryParam["mode"], queryParam["serviceName"]) - streamSetting.populateTlsSettings(queryParam["security"] ?: "", allowInsecure, queryParam["sni"] ?: sni, fingerprint) + streamSetting.populateTlsSettings(queryParam["security"] ?: "", allowInsecure, queryParam["sni"] ?: sni, fingerprint, queryParam["alpn"]) } if (config == null){ return R.string.toast_incorrect_protocol @@ -384,7 +384,7 @@ object AngConfigManager { queryParam["host"]?.split("|")?.get(0) ?: "", queryParam["path"]?.takeIf { it.trim() != "/" } ?: "", queryParam["seed"], queryParam["security"], queryParam["key"], queryParam["mode"], queryParam["serviceName"]) - streamSetting.populateTlsSettings(if (tls) TLS else "", allowInsecure, sni, fingerprint) + streamSetting.populateTlsSettings(if (tls) TLS else "", allowInsecure, sni, fingerprint, null) true }.getOrElse { false } } @@ -477,6 +477,7 @@ object AngConfigManager { vmessQRCode.net = streamSetting.network vmessQRCode.tls = streamSetting.security vmessQRCode.sni = streamSetting.tlsSettings?.serverName.orEmpty() + vmessQRCode.alpn = Utils.removeWhiteSpace(streamSetting.tlsSettings?.alpn?.joinToString()).orEmpty() outbound.getTransportSettingDetails()?.let { transportDetails -> vmessQRCode.type = transportDetails[0] vmessQRCode.host = transportDetails[1] @@ -531,6 +532,9 @@ object AngConfigManager { if (!TextUtils.isEmpty(tlsSetting.serverName)) { dicQuery["sni"] = tlsSetting.serverName } + if (!tlsSetting.alpn.isNullOrEmpty() && tlsSetting.alpn.isNotEmpty()) { + dicQuery["alpn"] = Utils.removeWhiteSpace(tlsSetting.alpn.joinToString()).orEmpty() + } } dicQuery["type"] = streamSetting.network.ifEmpty { V2rayConfig.DEFAULT_NETWORK } diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/Utils.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/Utils.kt index d814a95..977a2a9 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/Utils.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/Utils.kt @@ -409,6 +409,7 @@ object Utils { "zh-rCN" -> Locale("zh", "CN") "zh-rTW" -> Locale("zh", "TW") "vi" -> Locale("vi") + "ru" -> Locale("ru") else -> getSysLocale() } @@ -423,5 +424,9 @@ object Utils { .replace(" ","%20") .replace("|","%7C") } + + fun removeWhiteSpace(str: String?): String? { + return str?.replace(" ", "") + } } diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/MainViewModel.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/MainViewModel.kt index 6eb26e1..3067316 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/MainViewModel.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/MainViewModel.kt @@ -61,7 +61,10 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { fun removeServer(guid: String) { serverList.remove(guid) MmkvManager.removeServer(guid) - serversCache.removeAt(getPosition(guid)) + val index = getPosition(guid) + if(index >= 0){ + serversCache.removeAt(index) + } } fun appendCustomConfigServer(server: String) { diff --git a/V2rayNG/app/src/main/res/layout/tls_layout.xml b/V2rayNG/app/src/main/res/layout/tls_layout.xml index 9596b5f..2f1f31f 100644 --- a/V2rayNG/app/src/main/res/layout/tls_layout.xml +++ b/V2rayNG/app/src/main/res/layout/tls_layout.xml @@ -64,13 +64,33 @@ android:layout_width="match_parent" android:layout_height="@dimen/edit_height" android:entries="@array/streamsecurity_utls" - android:nextFocusDown="@+id/sp_allow_insecure" /> + android:nextFocusDown="@+id/sp_stream_alpn" /> + + + + + + + + + v2rayNG + Переключить + Переключить + Первое использование этой функции, пожалуйста, используйте приложение, чтобы добавить сервер + Открыть панель навигации + Закрыть панель навигации + Успешный перенос данных! + Перенос данных не выполнен! + + + Остановить + Разрешение не получено + Ещё… + Запуск служб + Остановка служб + Службы успешно запущены + Сбой при запуске служб + + + Профиль + Добавить профиль + Сохранить профиль + Удалить профиль + Импорт профиля из QR-кода + Импорт профиля из буфера обмена + Ручной ввод профиля Vmess + Ручной ввод профиля VLESS + Ручной ввод профиля Shadowsocks + Ручной ввод профиля Socks + Ручной ввод профиля Trojan + Пользовательский профиль + Импорт из буфера обмена + Импорт с устройства + Импорт из URL + Импорт сканированием URL + Подтверждаете удаление? + Описание + Адрес + Порт + ID + Альтернативный ID + Безопасность + Сеть + Другие параметры + Тип заголовка + Режим gRPC + Запрос узла (WS/H2) / Шифрование QUIC + Путь (WS/H2) / Ключ QUIC / Сид KCP / Сервис gRPC + TLS + uTLS + Разрешать небезопасные + SNI + Адрес + Порт + Пароль + Безопасность + Пароль (необязательно) + Пользователь (необязательно) + Шифрование + Поток + Успешно + Ошибка + Ничего нет + Неправильный протокол + Невозможно декодировать + Выберите файл профиля + Установите файловый менеджер + Изменить профиль + Неправильный профиль + Данные + В буфере обмена нет данных + Неправильный URL + Убедитесь, что входящий порт соответствует настройкам + Профиль повреждён + Узел (SNI) (необязательно) + Невозможно скопировать файл, используйте файловый менеджер + Добавить файлы + Загрузить файлы + + + Загрузка… + Поиск + Выбрать все + Введите ключевые слова + Режим обхода + Автовыбор проксируемых приложений + Загрузка данных + Экспорт в буфер обмена + Импорт из буфера обмена + + + + Настройки + Расширенные настройки + Настройки VPN + Прокси для выбранных приложений + Основной: выделенное приложение соединяется через прокси, не выделенное — напрямую; \n\nРежим обхода: выделенное приложение соединяется напрямую, не выделенное — через прокси.\n\nЕсть возможность автоматического выбора проксируемых приложений в меню. + + Использовать мультиплексирование + Включение может ускорить работу и переключение сети + + Отображение скорости + Показывать текущую скорость в уведомлении.\n\nЗначок будет меняться в зависимости от использования. + + Анализ пакетов + Использовать анализ пакетов (по умолчанию включено) + + Использовать локальную DNS + Обслуживание выполняется DNS-модулем ядра (в настройках маршрутизации рекомендуется выбрать режим «Все, кроме LAN и Китая») + + Использовать поддельную DNS + Локальная DNS возвращает поддельный IP-адрес (быстрее, но может не работать с некоторыми приложениями) + + Предпочитать IPv6 + Предпочитать IPv6-адреса и маршрутизацию + + Маршрутизация + Доменная стратегия + Режим маршрутизации + Пользовательские правила + + Удалённая DNS (необязательно) + DNS + + VPN DNS (только IPv4/v6) + + Внутренняя DNS (необязательно) + DNS + + Разрешать подключения из LAN + Другие устройства могут подключаться к прокси по вашему IP-адресу через протокол SOCKS/HTTP. Используйте только в надёжной сети, чтобы избежать несанкционированного подключения. + Доступ из LAN разрешён, убедитесь, что вы находитесь в надёжной сети + + Разрешать небезопасные + Для TLS по умолчанию разрешены небезопасные соединения + + Порт SOCKS5-прокси + Порт SOCKS5-прокси + + Порт HTTP-прокси + Порт HTTP-прокси + + Локальный порт DNS + Локальный порт DNS + + Подтверждение удаления профиля + Требовать двойное подтверждение удаления профиля + + Обратная связь + Предложить улучшение или сообщить об ошибке на GitHub + Присоединиться к группе в Telegram + Приложение Telegram не найдено + + Содействие + Содействие, нажмите для получения подробной информации (пожертвование может быть удалено) + + Подробность ведения журнала + Режим + Нажмите для получения дополнительной информации + Язык + + Системный журнал + Копировать + Очистить + Перезапуск службы + Удалить все профили + Удалить сбойный профиль (после проверки) + Экспорт всех профилей в буфер обмена + Подписки + примечания + URL (необязательно) + использовать обновление + Обновить подписку + Проверка доступности профилей + Время отклика профилей + Файлы георесурсов + Сортировка по результатам теста + Фильтр профилей + Все профили + + Запуск службы + Подтвердить + + Настройки маршрутизации + Введите требуемые IP/URL через запятую. Не забудьте сохранить изменения. + Сохранить + Очистить + Сканировать и заменить + Сканировать и добавить + Правила по умолчанию + + Проверить подключение + Проверка… + Успешно: рукопожатие HTTP заняло %d мс + Сбой проверки интернет-соединения: %s + Интернет недоступен + Код ошибки: #%d + Подключено, нажмите для проверки + Не подключено + + + QR-код + Экспорт в буфер обмена + Экспорт всего профиля в буфер обмена + + + + Проксируемые + Прямые + Блокируемые + + + + Все через прокси + Все, кроме LAN через прокси + Все, кроме Китая через прокси + Все, кроме LAN и Китая через прокси + Все напрямую + + + + VPN + Только прокси + + + diff --git a/V2rayNG/app/src/main/res/values/arrays.xml b/V2rayNG/app/src/main/res/values/arrays.xml index ad0886e..71d99a2 100644 --- a/V2rayNG/app/src/main/res/values/arrays.xml +++ b/V2rayNG/app/src/main/res/values/arrays.xml @@ -68,6 +68,13 @@ randomized + + + h2 + http/1.1 + h2,http/1.1 + + true @@ -154,6 +161,7 @@ 中文简体 中文繁體 Tiếng Việt + Русский @@ -163,5 +171,6 @@ zh-rCN zh-rTW vi + ru diff --git a/V2rayNG/app/src/main/res/values/strings.xml b/V2rayNG/app/src/main/res/values/strings.xml index 258d275..4f78062 100644 --- a/V2rayNG/app/src/main/res/values/strings.xml +++ b/V2rayNG/app/src/main/res/values/strings.xml @@ -49,7 +49,8 @@ request host(host/ws host/h2 host)/QUIC security path(ws path/h2 path)/QUIC key/kcp seed/gRPC serviceName tls - uTLS + uTLS + alpn allowInsecure SNI address