Compare commits

...

12 Commits

Author SHA1 Message Date
armv9
2c2b6dc1a8 1.4.1 2025-10-30 16:22:25 +09:00
armv9
6c0b8dd450 update preview version 2025-10-26 14:55:39 +09:00
armv9
731064cf88 Reload package cache when entering the app list 2025-10-26 14:55:29 +09:00
armv9
ec76238dd1 Add a hint for an empty app list 2025-10-26 14:29:08 +09:00
armv9
963418f9e3 Add permission for some CN ROMs 2025-10-26 13:28:30 +09:00
armv9
e6071e35f2 update core 2025-10-23 11:23:09 +09:00
armv9
b39ac9a8f0 fix: 修复老版本 grpc 数据读取 2025-10-21 21:58:37 +09:00
armv9
aa275d5e10 update preview version 2025-10-21 21:42:44 +09:00
starifly
4326aab16d fix: 修复 grpc case 缺少 break 导致序列化数据错乱 2025-10-21 21:32:30 +09:00
mak7im01
110f3b21b2
Update Russian translation (#1052)
Added new lines with translation
2025-10-21 21:32:11 +09:00
xymopen_Official
596b9ebfbb
fix: Certain single-label domain names can only be resolved by InetAddress.getAllByName() but not Network.getAllByName() (#1050) 2025-10-21 21:31:41 +09:00
armv9
2d32653f5b update core 2025-10-15 10:01:25 +09:00
17 changed files with 125 additions and 65 deletions

View File

@ -22,7 +22,9 @@
<uses-permission <uses-permission
android:name="android.permission.QUERY_ALL_PACKAGES" android:name="android.permission.QUERY_ALL_PACKAGES"
tools:ignore="QueryAllPackagesPermission" /> tools:ignore="PackageVisibilityPolicy" />
<uses-permission android:name="com.android.permission.GET_INSTALLED_APPS" />
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" /> <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />

View File

@ -112,7 +112,7 @@ public abstract class StandardV2RayBean extends AbstractBean {
@Override @Override
public void serialize(ByteBufferOutput output) { public void serialize(ByteBufferOutput output) {
output.writeInt(3); output.writeInt(4);
super.serialize(output); super.serialize(output);
output.writeString(uuid); output.writeString(uuid);
output.writeString(encryption); output.writeString(encryption);
@ -133,18 +133,15 @@ public abstract class StandardV2RayBean extends AbstractBean {
output.writeString(earlyDataHeaderName); output.writeString(earlyDataHeaderName);
break; break;
} }
case "http": { case "http":
case "httpupgrade": {
output.writeString(host); output.writeString(host);
output.writeString(path); output.writeString(path);
break; break;
} }
case "grpc": { case "grpc": {
output.writeString(path); output.writeString(path);
} break;
case "httpupgrade": {
output.writeString(host);
output.writeString(path);
} }
} }
@ -193,17 +190,20 @@ public abstract class StandardV2RayBean extends AbstractBean {
earlyDataHeaderName = input.readString(); earlyDataHeaderName = input.readString();
break; break;
} }
case "http": { case "http":
case "httpupgrade": {
host = input.readString(); host = input.readString();
path = input.readString(); path = input.readString();
break; break;
} }
case "grpc": { case "grpc": {
path = input.readString(); path = input.readString();
} if (version < 4) {
case "httpupgrade": { // 解决老版本数据的读取问题
host = input.readString(); input.readString();
path = input.readString(); input.readString();
}
break;
} }
} }

View File

@ -2,7 +2,6 @@ package io.nekohasekai.sagernet.ui
import android.content.Intent import android.content.Intent
import android.content.pm.ApplicationInfo import android.content.pm.ApplicationInfo
import android.content.pm.PackageInfo
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.os.Bundle import android.os.Bundle
@ -45,6 +44,11 @@ import kotlin.coroutines.coroutineContext
class AppListActivity : ThemedActivity() { class AppListActivity : ThemedActivity() {
companion object { companion object {
private const val SWITCH = "switch" private const val SWITCH = "switch"
private val cachedApps
get() = PackageCache.installedPackages.toMutableMap().apply {
remove(BuildConfig.APPLICATION_ID)
}
} }
private class ProxiedApp( private class ProxiedApp(
@ -96,7 +100,8 @@ class AppListActivity : ThemedActivity() {
var filteredApps = apps var filteredApps = apps
suspend fun reload() { suspend fun reload() {
apps = getCachedApps().mapNotNull { (packageName, packageInfo) -> PackageCache.reload()
apps = cachedApps.mapNotNull { (packageName, packageInfo) ->
coroutineContext[Job]!!.ensureActive() coroutineContext[Job]!!.ensureActive()
packageInfo.applicationInfo?.let { ProxiedApp(packageManager, it, packageName) } packageInfo.applicationInfo?.let { ProxiedApp(packageManager, it, packageName) }
}.sortedWith(compareBy({ !isProxiedApp(it) }, { it.name.toString() })) }.sortedWith(compareBy({ !isProxiedApp(it) }, { it.name.toString() }))
@ -156,7 +161,7 @@ class AppListActivity : ThemedActivity() {
private fun initProxiedUids(str: String = DataStore.routePackages) { private fun initProxiedUids(str: String = DataStore.routePackages) {
proxiedUids.clear() proxiedUids.clear()
val apps = getCachedApps() val apps = cachedApps
for (line in str.lineSequence()) { for (line in str.lineSequence()) {
val app = (apps[line] ?: continue) val app = (apps[line] ?: continue)
val uid = app.applicationInfo?.uid ?: continue val uid = app.applicationInfo?.uid ?: continue
@ -174,14 +179,12 @@ class AppListActivity : ThemedActivity() {
val adapter = binding.list.adapter as AppsAdapter val adapter = binding.list.adapter as AppsAdapter
withContext(Dispatchers.IO) { adapter.reload() } withContext(Dispatchers.IO) { adapter.reload() }
adapter.filter.filter(binding.search.text?.toString() ?: "") adapter.filter.filter(binding.search.text?.toString() ?: "")
binding.list.crossFadeFrom(loading) if (apps.isEmpty()) {
} binding.list.visibility = View.GONE
} binding.appPlaceholder.root.crossFadeFrom(loading)
} else {
fun getCachedApps(): MutableMap<String, PackageInfo> { binding.list.crossFadeFrom(loading)
val packages = PackageCache.installedPackages }
return packages.toMutableMap().apply {
remove(BuildConfig.APPLICATION_ID)
} }
} }
@ -191,6 +194,14 @@ class AppListActivity : ThemedActivity() {
binding = LayoutAppListBinding.inflate(layoutInflater) binding = LayoutAppListBinding.inflate(layoutInflater)
setContentView(binding.root) setContentView(binding.root)
binding.appPlaceholder.openSettings.setOnClickListener {
val intent =
Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply {
data = android.net.Uri.fromParts("package", packageName, null)
}
startActivity(intent)
}
setSupportActionBar(binding.toolbar) setSupportActionBar(binding.toolbar)
supportActionBar?.apply { supportActionBar?.apply {
setTitle(R.string.select_apps) setTitle(R.string.select_apps)

View File

@ -106,6 +106,7 @@ class AppManagerActivity : ThemedActivity() {
var filteredApps = apps var filteredApps = apps
suspend fun reload() { suspend fun reload() {
PackageCache.reload()
apps = cachedApps.mapNotNull { (packageName, packageInfo) -> apps = cachedApps.mapNotNull { (packageName, packageInfo) ->
coroutineContext[Job]!!.ensureActive() coroutineContext[Job]!!.ensureActive()
packageInfo.applicationInfo?.let { ProxiedApp(packageManager, it, packageName) } packageInfo.applicationInfo?.let { ProxiedApp(packageManager, it, packageName) }
@ -184,7 +185,12 @@ class AppManagerActivity : ThemedActivity() {
val adapter = binding.list.adapter as AppsAdapter val adapter = binding.list.adapter as AppsAdapter
withContext(Dispatchers.IO) { adapter.reload() } withContext(Dispatchers.IO) { adapter.reload() }
adapter.filter.filter(binding.search.text?.toString() ?: "") adapter.filter.filter(binding.search.text?.toString() ?: "")
binding.list.crossFadeFrom(loading) if (apps.isEmpty()) {
binding.list.visibility = View.GONE
binding.appPlaceholder.root.crossFadeFrom(loading)
} else {
binding.list.crossFadeFrom(loading)
}
} }
} }
@ -194,6 +200,14 @@ class AppManagerActivity : ThemedActivity() {
binding = LayoutAppsBinding.inflate(layoutInflater) binding = LayoutAppsBinding.inflate(layoutInflater)
setContentView(binding.root) setContentView(binding.root)
binding.appPlaceholder.openSettings.setOnClickListener {
val intent =
Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply {
data = android.net.Uri.fromParts("package", packageName, null)
}
startActivity(intent)
}
setSupportActionBar(binding.toolbar) setSupportActionBar(binding.toolbar)
supportActionBar?.apply { supportActionBar?.apply {
setTitle(R.string.proxied_apps) setTitle(R.string.proxied_apps)

View File

@ -67,15 +67,6 @@ object PackageCache {
operator fun get(uid: Int) = uidMap[uid] operator fun get(uid: Int) = uidMap[uid]
operator fun get(packageName: String) = packageMap[packageName] operator fun get(packageName: String) = packageMap[packageName]
suspend fun awaitLoad() {
if (::packageMap.isInitialized) {
return
}
loaded.withLock {
// just await
}
}
fun awaitLoadSync() { fun awaitLoadSync() {
if (::packageMap.isInitialized) { if (::packageMap.isInitialized) {
return return

View File

@ -128,11 +128,11 @@ object LocalResolverImpl : LocalDNSTransport {
// 老版本系统,继续用阻塞的 InetAddress // 老版本系统,继续用阻塞的 InetAddress
try { try {
val u = SagerNet.underlyingNetwork val u = SagerNet.underlyingNetwork
val answer = if (u != null) { val answer = try {
u.getAllByName(domain) u?.getAllByName(domain)
} else { } catch (e: UnknownHostException) {
InetAddress.getAllByName(domain) null
} } ?: InetAddress.getAllByName(domain)
if (answer != null) { if (answer != null) {
ctx.success(answer.mapNotNull { it.hostAddress }.joinToString("\n")) ctx.success(answer.mapNotNull { it.hostAddress }.joinToString("\n"))
} else { } else {

View File

@ -116,4 +116,8 @@
app:layout_behavior="@string/appbar_scrolling_view_behavior" app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:listitem="@layout/layout_apps_item" /> tools:listitem="@layout/layout_apps_item" />
<include
android:id="@+id/app_placeholder"
layout="@layout/layout_app_placeholder" />
</androidx.coordinatorlayout.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
android:padding="32dp"
android:visibility="gone">
<TextView
android:id="@+id/empty_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:paddingBottom="16dp"
android:text="@string/app_list_permission_denied"
android:textColor="?attr/colorOnBackground"
android:textSize="16sp" />
<com.google.android.material.button.MaterialButton
android:id="@+id/open_settings"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/open_app_settings" />
</LinearLayout>

View File

@ -153,4 +153,8 @@
app:layout_behavior="@string/appbar_scrolling_view_behavior" app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:listitem="@layout/layout_apps_item" /> tools:listitem="@layout/layout_apps_item" />
<include
android:id="@+id/app_placeholder"
layout="@layout/layout_app_placeholder" />
</androidx.coordinatorlayout.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@ -208,7 +208,6 @@
<string name="action_trojan_go" translatable="false">Trojan Go</string> <string name="action_trojan_go" translatable="false">Trojan Go</string>
<string name="action_mieru" translatable="false">Mieru</string> <string name="action_mieru" translatable="false">Mieru</string>
<string name="action_naive" translatable="false">Naïve</string> <string name="action_naive" translatable="false">Naïve</string>
<string name="action_ping_tunnel" translatable="false">Ping Tunnel</string>
<string name="action_hysteria" translatable="false">Hysteria</string> <string name="action_hysteria" translatable="false">Hysteria</string>
<string name="action_ssh" translatable="false">SSH</string> <string name="action_ssh" translatable="false">SSH</string>
<string name="action_wireguard" translatable="false">WireGuard</string> <string name="action_wireguard" translatable="false">WireGuard</string>
@ -521,10 +520,7 @@
<string name="enable_ech">فعال کردن ECH</string> <string name="enable_ech">فعال کردن ECH</string>
<string name="enable_ech_sum">فعال کردن ECH</string> <string name="enable_ech_sum">فعال کردن ECH</string>
<string name="ech_settings">تنظیمات ECH</string> <string name="ech_settings">تنظیمات ECH</string>
<string name="pq_signature_schemes_enabled">فعال کردن پشتیبانی از امضای مجوز post-quantum همتا</string>
<string name="dynamic_record_sizing_disabled">اندازه تطبیقی ​​رکوردهای TLS را غیرفعال می‌کند</string>
<string name="ech_config">پیکربندی ECH</string> <string name="ech_config">پیکربندی ECH</string>
<string name="dynamic_record_sizing_sum">اگر فعال باشد، همیشه از بزرگترین اندازه رکورد TLS ممکن استفاده می‌شود. در صورت غیرفعال کردن، اندازه رکوردهای TLS ممکن است در تلاش برای بهبود تاخیر تنظیم شود.</string>
<string name="http_upgrade_host">میزبان HTTPUpgrade</string> <string name="http_upgrade_host">میزبان HTTPUpgrade</string>
<string name="http_upgrade_path">مسیر HTTPUpgrade</string> <string name="http_upgrade_path">مسیر HTTPUpgrade</string>
<string name="update_current_subscription">به‌روزرسانی اشتراک این گروه</string> <string name="update_current_subscription">به‌روزرسانی اشتراک این گروه</string>

View File

@ -75,6 +75,9 @@
<string name="chain_settings">Настройки цепочки</string> <string name="chain_settings">Настройки цепочки</string>
<string name="character_counter_content_description">Введено символов: %1$d из %2$d</string> <string name="character_counter_content_description">Введено символов: %1$d из %2$d</string>
<string name="character_counter_overflowed_content_description">Превышено ограничение на количество символов (%1$d из %2$d)</string> <string name="character_counter_overflowed_content_description">Превышено ограничение на количество символов (%1$d из %2$d)</string>
<string name="check_update_no">Обновления не найдены.</string>
<string name="check_update_preview">Проверить наличие обновлений предварительной версии</string>
<string name="check_update_release">Проверить наличие обновлений релизнойной версии</string>
<string name="circular_reference">Циклическая ссылка</string> <string name="circular_reference">Циклическая ссылка</string>
<string name="circular_reference_sum">Маршрут не может содержать сам себя.</string> <string name="circular_reference_sum">Маршрут не может содержать сам себя.</string>
<string name="clear_logcat">Очистить журнал</string> <string name="clear_logcat">Очистить журнал</string>
@ -250,6 +253,7 @@
<string name="menu_traffic">Трафик</string> <string name="menu_traffic">Трафик</string>
<string name="metered">Подсказка о соединении с лимитным тарифным планом</string> <string name="metered">Подсказка о соединении с лимитным тарифным планом</string>
<string name="metered_summary">Подсказывать системе, что VPN следует рассматривать как сеть с лимитным тарифным планом</string> <string name="metered_summary">Подсказывать системе, что VPN следует рассматривать как сеть с лимитным тарифным планом</string>
<string name="minimize">Свернуть</string>
<string name="missing_plugin">Отсутствующий плагин</string> <string name="missing_plugin">Отсутствующий плагин</string>
<string name="move">Переместить</string> <string name="move">Переместить</string>
<string name="mtrl_badge_numberless_content_description">Новое уведомление</string> <string name="mtrl_badge_numberless_content_description">Новое уведомление</string>
@ -319,6 +323,7 @@
<string name="port_transproxy">Транспрокси-порт</string> <string name="port_transproxy">Транспрокси-порт</string>
<string name="prefer">Предпочитать</string> <string name="prefer">Предпочитать</string>
<string name="preference_copied">Текст "%1$s" скопирован в буфер обмена</string> <string name="preference_copied">Текст "%1$s" скопирован в буфер обмена</string>
<string name="preview_version_hint">Это приложение является предварительной версией и может содержать множество проблем. Если вы не хотите тестировать его, скачайте релизную версию с GitHub!</string>
<string name="profile_config">Конфигурация профиля</string> <string name="profile_config">Конфигурация профиля</string>
<string name="profile_empty">Пожалуйста, выберите профиль</string> <string name="profile_empty">Пожалуйста, выберите профиль</string>
<string name="profile_import">Импортировать профиль</string> <string name="profile_import">Импортировать профиль</string>
@ -342,6 +347,8 @@
<string name="remote_dns">Удаленный DNS</string> <string name="remote_dns">Удаленный DNS</string>
<string name="remove_duplicate">Удалить дубликаты серверов</string> <string name="remove_duplicate">Удалить дубликаты серверов</string>
<string name="reset_connections">Сбросить соединения</string> <string name="reset_connections">Сбросить соединения</string>
<string name="reset_settings">Восстановить настройки по умолчанию</string>
<string name="reset_settings_message">Восстановить настройки по умолчанию, такие данные, как узлы и группы, будут сохранены. Для полной очистки данных, очистите данные приложения непосредственно в системных настройках.</string>
<string name="resolve_destination">Определить адрес назначения</string> <string name="resolve_destination">Определить адрес назначения</string>
<string name="resolve_destination_summary">Если адрес назначения является доменом, то он передается в соответствии с правилом IPv6.</string> <string name="resolve_destination_summary">Если адрес назначения является доменом, то он передается в соответствии с правилом IPv6.</string>
<string name="route_add">Создать маршрут</string> <string name="route_add">Создать маршрут</string>
@ -453,6 +460,8 @@
<string name="unsaved_changes_prompt">Есть несохраненные изменения. Сохранить?</string> <string name="unsaved_changes_prompt">Есть несохраненные изменения. Сохранить?</string>
<string name="update_all_subscription">Обновить все подписки</string> <string name="update_all_subscription">Обновить все подписки</string>
<string name="update_current_subscription">Обновить подписку текущей группы</string> <string name="update_current_subscription">Обновить подписку текущей группы</string>
<string name="update_dialog_message">Текущая версия: %1$s\nДоступная версия: %2$s\nХотите загрузить её?</string>
<string name="update_dialog_title">Доступна новая версия</string>
<string name="update_settings">Обновить настройки</string> <string name="update_settings">Обновить настройки</string>
<string name="update_subscription_warning">Прокси-сервер не подключен, вы уверены, что хотите продолжить обновление?</string> <string name="update_subscription_warning">Прокси-сервер не подключен, вы уверены, что хотите продолжить обновление?</string>
<string name="update_when_connected_only">Обновлять только при подключении</string> <string name="update_when_connected_only">Обновлять только при подключении</string>

View File

@ -495,4 +495,6 @@
<string name="reset_settings">恢复默认设置</string> <string name="reset_settings">恢复默认设置</string>
<string name="reset_settings_message">恢复默认设置,但节点、分组等数据将保留。如需完全清除数据,请在系统设置中直接清除应用数据。</string> <string name="reset_settings_message">恢复默认设置,但节点、分组等数据将保留。如需完全清除数据,请在系统设置中直接清除应用数据。</string>
<string name="minimize">最小化</string> <string name="minimize">最小化</string>
<string name="app_list_permission_denied">无法读取已安装的应用。\n这通常是由于系统限制了应用的读取权限例如某些中国厂商系统。\n请在系统设置中授予权限。</string>
<string name="open_app_settings">打开系统设置</string>
</resources> </resources>

View File

@ -575,4 +575,6 @@
<string name="reset_settings">Restore default settings</string> <string name="reset_settings">Restore default settings</string>
<string name="reset_settings_message">Restore default settings, but data such as nodes and groups will be retained. To completely clear data, clear application data directly in the system settings.</string> <string name="reset_settings_message">Restore default settings, but data such as nodes and groups will be retained. To completely clear data, clear application data directly in the system settings.</string>
<string name="minimize">Minimize</string> <string name="minimize">Minimize</string>
<string name="app_list_permission_denied">Unable to read installed apps.\nThis is usually because the system has restricted app read permissions.\nPlease grant permissions in the system settings.</string>
<string name="open_app_settings">Open System Settings</string>
</resources> </resources>

View File

@ -1,2 +1,2 @@
export COMMIT_SING_BOX="b250e570fe32ff8fd2e34f29afb8e87f83d3cab3" export COMMIT_SING_BOX="9beb42f553ebdf575f497c01c33ffa7b6df17efb"
export COMMIT_LIBNEKO="1c47a3af71990a7b2192e03292b4d246c308ef0b" export COMMIT_LIBNEKO="1c47a3af71990a7b2192e03292b4d246c308ef0b"

View File

@ -8,11 +8,11 @@ require (
github.com/matsuridayo/libneko v1.0.0 // replaced github.com/matsuridayo/libneko v1.0.0 // replaced
github.com/miekg/dns v1.1.67 github.com/miekg/dns v1.1.67
github.com/oschwald/maxminddb-golang v1.13.1 github.com/oschwald/maxminddb-golang v1.13.1
github.com/sagernet/quic-go v0.52.0-sing-box-mod.2 github.com/sagernet/quic-go v0.52.0-sing-box-mod.3
github.com/sagernet/sing v0.7.12 github.com/sagernet/sing v0.7.13
github.com/sagernet/sing-box v1.0.0 // replaced github.com/sagernet/sing-box v1.0.0 // replaced
github.com/sagernet/sing-tun v0.7.2 github.com/sagernet/sing-tun v0.7.3
github.com/ulikunitz/xz v0.5.11 github.com/ulikunitz/xz v0.5.15
golang.org/x/mobile v0.0.0-20231108233038-35478a0c49da golang.org/x/mobile v0.0.0-20231108233038-35478a0c49da
golang.org/x/sys v0.35.0 golang.org/x/sys v0.35.0
) )
@ -42,8 +42,8 @@ require (
github.com/logrusorgru/aurora v2.0.3+incompatible // indirect github.com/logrusorgru/aurora v2.0.3+incompatible // indirect
github.com/mdlayher/netlink v1.7.3-0.20250113171957-fbb4dce95f42 // indirect github.com/mdlayher/netlink v1.7.3-0.20250113171957-fbb4dce95f42 // indirect
github.com/mdlayher/socket v0.5.1 // indirect github.com/mdlayher/socket v0.5.1 // indirect
github.com/metacubex/tfo-go v0.0.0-20250516165257-e29c16ae41d4 // indirect github.com/metacubex/tfo-go v0.0.0-20250921095601-b102db4216c0 // indirect
github.com/metacubex/utls v1.8.0 // indirect github.com/metacubex/utls v1.8.3 // indirect
github.com/mholt/acmez/v3 v3.1.2 // indirect github.com/mholt/acmez/v3 v3.1.2 // indirect
github.com/quic-go/qpack v0.5.1 // indirect github.com/quic-go/qpack v0.5.1 // indirect
github.com/sagernet/bbolt v0.0.0-20231014093535-ea5cb2fe9f0a // indirect github.com/sagernet/bbolt v0.0.0-20231014093535-ea5cb2fe9f0a // indirect

View File

@ -59,10 +59,10 @@ github.com/mdlayher/netlink v1.7.3-0.20250113171957-fbb4dce95f42 h1:A1Cq6Ysb0GM0
github.com/mdlayher/netlink v1.7.3-0.20250113171957-fbb4dce95f42/go.mod h1:BB4YCPDOzfy7FniQ/lxuYQ3dgmM2cZumHbK8RpTjN2o= github.com/mdlayher/netlink v1.7.3-0.20250113171957-fbb4dce95f42/go.mod h1:BB4YCPDOzfy7FniQ/lxuYQ3dgmM2cZumHbK8RpTjN2o=
github.com/mdlayher/socket v0.5.1 h1:VZaqt6RkGkt2OE9l3GcC6nZkqD3xKeQLyfleW/uBcos= github.com/mdlayher/socket v0.5.1 h1:VZaqt6RkGkt2OE9l3GcC6nZkqD3xKeQLyfleW/uBcos=
github.com/mdlayher/socket v0.5.1/go.mod h1:TjPLHI1UgwEv5J1B5q0zTZq12A/6H7nKmtTanQE37IQ= github.com/mdlayher/socket v0.5.1/go.mod h1:TjPLHI1UgwEv5J1B5q0zTZq12A/6H7nKmtTanQE37IQ=
github.com/metacubex/tfo-go v0.0.0-20250516165257-e29c16ae41d4 h1:j1VRTiC9JLR4nUbSikx9OGdu/3AgFDqgcLj4GoqyQkc= github.com/metacubex/tfo-go v0.0.0-20250921095601-b102db4216c0 h1:Ui+/2s5Qz0lSnDUBmEL12M5Oi/PzvFxGTNohm8ZcsmE=
github.com/metacubex/tfo-go v0.0.0-20250516165257-e29c16ae41d4/go.mod h1:l9oLnLoEXyGZ5RVLsh7QCC5XsouTUyKk4F2nLm2DHLw= github.com/metacubex/tfo-go v0.0.0-20250921095601-b102db4216c0/go.mod h1:l9oLnLoEXyGZ5RVLsh7QCC5XsouTUyKk4F2nLm2DHLw=
github.com/metacubex/utls v1.8.0 h1:mSYi6FMnmc5riARl5UZDmWVy710z+P5b7xuGW0lV9ac= github.com/metacubex/utls v1.8.3 h1:0m/yCxm3SK6kWve2lKiFb1pue1wHitJ8sQQD4Ikqde4=
github.com/metacubex/utls v1.8.0/go.mod h1:FdjYzVfCtgtna19hX0ER1Xsa5uJInwdQ4IcaaI98lEQ= github.com/metacubex/utls v1.8.3/go.mod h1:kncGGVhFaoGn5M3pFe3SXhZCzsbCJayNOH4UEqTKTko=
github.com/mholt/acmez/v3 v3.1.2 h1:auob8J/0FhmdClQicvJvuDavgd5ezwLBfKuYmynhYzc= github.com/mholt/acmez/v3 v3.1.2 h1:auob8J/0FhmdClQicvJvuDavgd5ezwLBfKuYmynhYzc=
github.com/mholt/acmez/v3 v3.1.2/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ= github.com/mholt/acmez/v3 v3.1.2/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ=
github.com/miekg/dns v1.1.67 h1:kg0EHj0G4bfT5/oOys6HhZw4vmMlnoZ+gDu8tJ/AlI0= github.com/miekg/dns v1.1.67 h1:kg0EHj0G4bfT5/oOys6HhZw4vmMlnoZ+gDu8tJ/AlI0=
@ -86,11 +86,11 @@ github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a h1:ObwtHN2VpqE0ZN
github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a/go.mod h1:xLnfdiJbSp8rNqYEdIW/6eDO4mVoogml14Bh2hSiFpM= github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a/go.mod h1:xLnfdiJbSp8rNqYEdIW/6eDO4mVoogml14Bh2hSiFpM=
github.com/sagernet/nftables v0.3.0-beta.4 h1:kbULlAwAC3jvdGAC1P5Fa3GSxVwQJibNenDW2zaXr8I= github.com/sagernet/nftables v0.3.0-beta.4 h1:kbULlAwAC3jvdGAC1P5Fa3GSxVwQJibNenDW2zaXr8I=
github.com/sagernet/nftables v0.3.0-beta.4/go.mod h1:OQXAjvjNGGFxaTgVCSTRIhYB5/llyVDeapVoENYBDS8= github.com/sagernet/nftables v0.3.0-beta.4/go.mod h1:OQXAjvjNGGFxaTgVCSTRIhYB5/llyVDeapVoENYBDS8=
github.com/sagernet/quic-go v0.52.0-sing-box-mod.2 h1:QTPr/ptUPsgregVfFXReBFrhv/8U83deZG8urQ7pWYI= github.com/sagernet/quic-go v0.52.0-sing-box-mod.3 h1:ySqffGm82rPqI1TUPqmtHIYd12pfEGScygnOxjTL56w=
github.com/sagernet/quic-go v0.52.0-sing-box-mod.2/go.mod h1:OV+V5kEBb8kJS7k29MzDu6oj9GyMc7HA07sE1tedxz4= github.com/sagernet/quic-go v0.52.0-sing-box-mod.3/go.mod h1:OV+V5kEBb8kJS7k29MzDu6oj9GyMc7HA07sE1tedxz4=
github.com/sagernet/sing v0.6.9/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak= github.com/sagernet/sing v0.6.9/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak=
github.com/sagernet/sing v0.7.12 h1:MpMbO56crPRZTbltoj1wGk4Xj9+GiwH1wTO4s3fz1EA= github.com/sagernet/sing v0.7.13 h1:XNYgd8e3cxMULs/LLJspdn/deHrnPWyrrglNHeCUAYM=
github.com/sagernet/sing v0.7.12/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak= github.com/sagernet/sing v0.7.13/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak=
github.com/sagernet/sing-mux v0.3.3 h1:YFgt9plMWzH994BMZLmyKL37PdIVaIilwP0Jg+EcLfw= github.com/sagernet/sing-mux v0.3.3 h1:YFgt9plMWzH994BMZLmyKL37PdIVaIilwP0Jg+EcLfw=
github.com/sagernet/sing-mux v0.3.3/go.mod h1:pht8iFY4c9Xltj7rhVd208npkNaeCxzyXCgulDPLUDA= github.com/sagernet/sing-mux v0.3.3/go.mod h1:pht8iFY4c9Xltj7rhVd208npkNaeCxzyXCgulDPLUDA=
github.com/sagernet/sing-quic v0.5.2-0.20250909083218-00a55617c0fb h1:5Wx3XeTiKrrrcrAky7Hc1bO3CGxrvho2Vu5b/adlEIM= github.com/sagernet/sing-quic v0.5.2-0.20250909083218-00a55617c0fb h1:5Wx3XeTiKrrrcrAky7Hc1bO3CGxrvho2Vu5b/adlEIM=
@ -101,8 +101,8 @@ github.com/sagernet/sing-shadowsocks2 v0.2.1 h1:dWV9OXCeFPuYGHb6IRqlSptVnSzOelnq
github.com/sagernet/sing-shadowsocks2 v0.2.1/go.mod h1:RnXS0lExcDAovvDeniJ4IKa2IuChrdipolPYWBv9hWQ= github.com/sagernet/sing-shadowsocks2 v0.2.1/go.mod h1:RnXS0lExcDAovvDeniJ4IKa2IuChrdipolPYWBv9hWQ=
github.com/sagernet/sing-shadowtls v0.2.1-0.20250503051639-fcd445d33c11 h1:tK+75l64tm9WvEFrYRE1t0YxoFdWQqw/h7Uhzj0vJ+w= github.com/sagernet/sing-shadowtls v0.2.1-0.20250503051639-fcd445d33c11 h1:tK+75l64tm9WvEFrYRE1t0YxoFdWQqw/h7Uhzj0vJ+w=
github.com/sagernet/sing-shadowtls v0.2.1-0.20250503051639-fcd445d33c11/go.mod h1:sWqKnGlMipCHaGsw1sTTlimyUpgzP4WP3pjhCsYt9oA= github.com/sagernet/sing-shadowtls v0.2.1-0.20250503051639-fcd445d33c11/go.mod h1:sWqKnGlMipCHaGsw1sTTlimyUpgzP4WP3pjhCsYt9oA=
github.com/sagernet/sing-tun v0.7.2 h1:uJkAZM0KBqIYzrq077QGqdvj/+4i/pMOx6Pnx0jYqAs= github.com/sagernet/sing-tun v0.7.3 h1:MFnAir+l24ElEyxdfwtY8mqvUUL9nPnL9TDYLkOmVes=
github.com/sagernet/sing-tun v0.7.2/go.mod h1:pUEjh9YHQ2gJT6Lk0TYDklh3WJy7lz+848vleGM3JPM= github.com/sagernet/sing-tun v0.7.3/go.mod h1:pUEjh9YHQ2gJT6Lk0TYDklh3WJy7lz+848vleGM3JPM=
github.com/sagernet/sing-vmess v0.2.7 h1:2ee+9kO0xW5P4mfe6TYVWf9VtY8k1JhNysBqsiYj0sk= github.com/sagernet/sing-vmess v0.2.7 h1:2ee+9kO0xW5P4mfe6TYVWf9VtY8k1JhNysBqsiYj0sk=
github.com/sagernet/sing-vmess v0.2.7/go.mod h1:5aYoOtYksAyS0NXDm0qKeTYW1yoE1bJVcv+XLcVoyJs= github.com/sagernet/sing-vmess v0.2.7/go.mod h1:5aYoOtYksAyS0NXDm0qKeTYW1yoE1bJVcv+XLcVoyJs=
github.com/sagernet/smux v1.5.34-mod.2 h1:gkmBjIjlJ2zQKpLigOkFur5kBKdV6bNRoFu2WkltRQ4= github.com/sagernet/smux v1.5.34-mod.2 h1:gkmBjIjlJ2zQKpLigOkFur5kBKdV6bNRoFu2WkltRQ4=
@ -122,8 +122,8 @@ github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXl
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= github.com/ulikunitz/xz v0.5.15 h1:9DNdB5s+SgV3bQ2ApL10xRc35ck0DuIX/isZvIk+ubY=
github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.15/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
github.com/vishvananda/netns v0.0.5 h1:DfiHV+j8bA32MFM7bfEunvT8IAqQ/NzSJHtcmW5zdEY= github.com/vishvananda/netns v0.0.5 h1:DfiHV+j8bA32MFM7bfEunvT8IAqQ/NzSJHtcmW5zdEY=
github.com/vishvananda/netns v0.0.5/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM= github.com/vishvananda/netns v0.0.5/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM=
github.com/zeebo/assert v1.1.0 h1:hU1L1vLTHsnO8x8c9KAR5GmM5QscxHg5RNU5z5qbUWY= github.com/zeebo/assert v1.1.0 h1:hU1L1vLTHsnO8x8c9KAR5GmM5QscxHg5RNU5z5qbUWY=

View File

@ -1,4 +1,4 @@
PACKAGE_NAME=moe.nb4a PACKAGE_NAME=moe.nb4a
VERSION_NAME=1.4.0 VERSION_NAME=1.4.1
PRE_VERSION_NAME=pre-1.4.1-20251007-1 PRE_VERSION_NAME=pre-1.4.1-20251026-2
VERSION_CODE=44 VERSION_CODE=45