Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions app/src/main/kotlin/com/simplexray/an/data/source/FileManager.kt
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,8 @@ class FileManager(private val application: Application, private val prefs: Prefe
val preferencesMap: MutableMap<String, Any> = mutableMapOf()
preferencesMap[Preferences.SOCKS_ADDR] = prefs.socksAddress
preferencesMap[Preferences.SOCKS_PORT] = prefs.socksPort
preferencesMap[Preferences.SOCKS_USER] = prefs.socksUsername
preferencesMap[Preferences.SOCKS_PASS] = prefs.socksPassword
preferencesMap[Preferences.DNS_IPV4] = prefs.dnsIpv4
preferencesMap[Preferences.DNS_IPV6] = prefs.dnsIpv6
preferencesMap[Preferences.IPV6] = prefs.ipv6
Expand Down Expand Up @@ -309,6 +311,16 @@ class FileManager(private val application: Application, private val prefs: Prefe
}
}

value = preferencesMap[Preferences.SOCKS_USER]
if (value is String) {
prefs.socksUsername = (value as String?)!!
}

value = preferencesMap[Preferences.SOCKS_PASS]
if (value is String) {
prefs.socksPassword = (value as String?)!!
}

value = preferencesMap[Preferences.DNS_IPV4]
if (value is String) {
prefs.dnsIpv4 = (value as String?)!!
Expand Down
10 changes: 8 additions & 2 deletions app/src/main/kotlin/com/simplexray/an/prefs/Preferences.kt
Original file line number Diff line number Diff line change
Expand Up @@ -112,11 +112,17 @@ class Preferences(context: Context) {
setValueInProvider(SOCKS_PORT, port.toString())
}

val socksUsername: String
var socksUsername: String
get() = getPrefData(SOCKS_USER).first ?: ""
set(user) {
setValueInProvider(SOCKS_USER, user)
}

val socksPassword: String
var socksPassword: String
get() = getPrefData(SOCKS_PASS).first ?: ""
set(pass) {
setValueInProvider(SOCKS_PASS, pass)
}

var dnsIpv4: String
get() = getPrefData(DNS_IPV4).first ?: "8.8.8.8"
Expand Down
26 changes: 26 additions & 0 deletions app/src/main/kotlin/com/simplexray/an/ui/screens/SettingsScreen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,32 @@ fun SettingsScreen(
scope = scope
)

EditableListItemWithBottomSheet(
headline = stringResource(R.string.socks_user),
currentValue = settingsState.socksUser.value,
onValueConfirmed = { newValue -> mainViewModel.updateSocksUser(newValue) },
label = stringResource(R.string.socks_user),
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text),
isError = !settingsState.socksUser.isValid,
errorMessage = settingsState.socksUser.error,
enabled = !vpnDisabled,
sheetState = sheetState,
scope = scope
)

EditableListItemWithBottomSheet(
headline = stringResource(R.string.socks_pass),
currentValue = settingsState.socksPass.value,
onValueConfirmed = { newValue -> mainViewModel.updateSocksPass(newValue) },
label = stringResource(R.string.socks_pass),
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password),
isError = !settingsState.socksPass.isValid,
errorMessage = settingsState.socksPass.error,
enabled = !vpnDisabled,
sheetState = sheetState,
scope = scope
)

EditableListItemWithBottomSheet(
headline = stringResource(R.string.dns_ipv4),
currentValue = settingsState.dnsIpv4.value,
Expand Down
62 changes: 62 additions & 0 deletions app/src/main/kotlin/com/simplexray/an/viewmodel/MainViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,8 @@ class MainViewModel(application: Application) :
private val _settingsState = MutableStateFlow(
SettingsState(
socksPort = InputFieldState(prefs.socksPort.toString()),
socksUser = InputFieldState(prefs.socksUsername),
socksPass = InputFieldState(prefs.socksPassword),
dnsIpv4 = InputFieldState(prefs.dnsIpv4),
dnsIpv6 = InputFieldState(prefs.dnsIpv6),
switches = SwitchStates(
Expand Down Expand Up @@ -165,6 +167,9 @@ class MainViewModel(application: Application) :

init {
Log.d(TAG, "MainViewModel initialized.")

setupGlobalSocksAuthenticator()

viewModelScope.launch(Dispatchers.IO) {
_isServiceEnabled.value = isServiceRunning(application, TProxyService::class.java)

Expand All @@ -177,6 +182,8 @@ class MainViewModel(application: Application) :
private fun updateSettingsState() {
_settingsState.value = _settingsState.value.copy(
socksPort = InputFieldState(prefs.socksPort.toString()),
socksUser = InputFieldState(prefs.socksUsername),
socksPass = InputFieldState(prefs.socksPassword),
dnsIpv4 = InputFieldState(prefs.dnsIpv4),
dnsIpv6 = InputFieldState(prefs.dnsIpv6),
switches = SwitchStates(
Expand Down Expand Up @@ -226,6 +233,21 @@ class MainViewModel(application: Application) :
}
}

private fun setupGlobalSocksAuthenticator() {
java.net.Authenticator.setDefault(object : java.net.Authenticator() {
override fun getPasswordAuthentication(): java.net.PasswordAuthentication? {
val user = prefs.socksUsername
val pass = prefs.socksPassword

return if (user.isNotEmpty() || pass.isNotEmpty()) {
java.net.PasswordAuthentication(user, pass.toCharArray())
} else {
null
}
}
})
}

fun setControlMenuClickable(isClickable: Boolean) {
_controlMenuClickable.value = isClickable
}
Expand Down Expand Up @@ -409,6 +431,46 @@ class MainViewModel(application: Application) :
}
}

fun updateSocksUser(userString: String): Boolean {
val byteCount = userString.toByteArray(Charsets.UTF_8).size
return if (byteCount <= 255) {
prefs.socksUsername = userString
_settingsState.value = _settingsState.value.copy(
socksUser = InputFieldState(userString)
)
true
} else {
_settingsState.value = _settingsState.value.copy(
socksUser = InputFieldState(
value = userString,
error = "Username length must not exceed 255 bytes",
isValid = false
)
)
false
}
}

fun updateSocksPass(passString: String): Boolean {
val byteCount = passString.toByteArray(Charsets.UTF_8).size
return if (byteCount <= 255) {
prefs.socksPassword = passString
_settingsState.value = _settingsState.value.copy(
socksPass = InputFieldState(passString)
)
true
} else {
_settingsState.value = _settingsState.value.copy(
socksPass = InputFieldState(
value = passString,
error = "Password length must not exceed 255 bytes",
isValid = false
)
)
false
}
}

fun updateDnsIpv4(ipv4Addr: String): Boolean {
val matcher = IPV4_PATTERN.matcher(ipv4Addr)
return if (matcher.matches()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ data class FileStates(

data class SettingsState(
val socksPort: InputFieldState,
val socksUser: InputFieldState,
val socksPass: InputFieldState,
val dnsIpv4: InputFieldState,
val dnsIpv6: InputFieldState,
val switches: SwitchStates,
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values-id/strings.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="socks_port">Port SOCKS Target</string>
<string name="socks_pass">Kata Sandi SOCKS</string>
<string name="dns_ipv4">DNS IPv4</string>
<string name="dns_ipv6">DNS IPv6</string>
<string name="ipv6">IPv6</string>
Expand Down Expand Up @@ -119,4 +120,5 @@
<string name="theme_light">Terang</string>
<string name="theme_dark">Gelap</string>
<string name="auto">Otomatis</string>
<string name="socks_user">"Pengguna SOCKS "</string>
</resources>
2 changes: 2 additions & 0 deletions app/src/main/res/values-ru-rRU/strings.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="socks_port">Целевой порт SOCKS</string>
<string name="socks_pass">Пароль SOCKS</string>
<string name="dns_ipv4">DNS IPv4</string>
<string name="dns_ipv6">DNS IPv6</string>
<string name="ipv6">IPv6</string>
Expand Down Expand Up @@ -119,4 +120,5 @@
<string name="theme_light">Светлая</string>
<string name="theme_dark">Тёмная</string>
<string name="auto">Автоматически</string>
<string name="socks_user">Пользователь SOCKS</string>
</resources>
2 changes: 2 additions & 0 deletions app/src/main/res/values-zh/strings.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="socks_port">目标Socks端口</string>
<string name="socks_pass">"SOCKS 密码 "</string>
<string name="dns_ipv4">DNS IPv4</string>
<string name="dns_ipv6">DNS IPv6</string>
<string name="ipv6">IPv6</string>
Expand Down Expand Up @@ -119,4 +120,5 @@
<string name="theme_light">浅色</string>
<string name="theme_dark">深色</string>
<string name="auto">自动</string>
<string name="socks_user">SOCKS 用户</string>
</resources>
2 changes: 2 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
<string name="geosite_url" translatable="false">https://github.com/lhear/v2ray-rules-dat/releases/latest/download/geosite.dat</string>
<string name="connectivity_test_url" translatable="false">http://www.gstatic.com/generate_204</string>
<string name="socks_port">Target SOCKS Port</string>
<string name="socks_user">SOCKS User</string>
<string name="socks_pass">SOCKS Pass</string>
<string name="dns_ipv4">DNS IPv4</string>
<string name="dns_ipv6">DNS IPv6</string>
<string name="ipv6">IPv6</string>
Expand Down
Loading