diff --git a/mobile/src/main/java/be/mygod/librootkotlinx/AppProcess.kt b/mobile/src/main/java/be/mygod/librootkotlinx/AppProcess.kt index 1dbc20c1..62579137 100644 --- a/mobile/src/main/java/be/mygod/librootkotlinx/AppProcess.kt +++ b/mobile/src/main/java/be/mygod/librootkotlinx/AppProcess.kt @@ -81,7 +81,7 @@ object AppProcess { val script = StringBuilder() val (baseDir, relocated) = if (Build.VERSION.SDK_INT < 29) "/dev" to "/dev/app_process_$token" else { val apexPath = "/apex/$token" - script.appendln("[ -d $apexPath ] || " + + script.appendLine("[ -d $apexPath ] || " + "mkdir $apexPath && " + // we need to mount a new tmpfs to override noexec flag "mount -t tmpfs -o size=1M tmpfs $apexPath || exit 1") @@ -95,13 +95,13 @@ object AppProcess { Logger.me.w("Failed to locate system section", e) "system" } - script.appendln("[ -f $ldConfig ] || " + + script.appendLine("[ -f $ldConfig ] || " + "mkdir -p $apexPath/etc && " + "echo dir.$section = $apexPath >$ldConfig && " + "cat $masterLdConfig >>$ldConfig || exit 1") "$apexPath/bin" to "$apexPath/bin/app_process" } - script.appendln("[ -f $relocated ] || " + + script.appendLine("[ -f $relocated ] || " + "mkdir -p $baseDir && " + "cp $myExe $relocated && " + "chmod 700 $relocated || exit 1") diff --git a/mobile/src/main/java/be/mygod/librootkotlinx/RootServer.kt b/mobile/src/main/java/be/mygod/librootkotlinx/RootServer.kt index d6df27e1..debe59c1 100644 --- a/mobile/src/main/java/be/mygod/librootkotlinx/RootServer.kt +++ b/mobile/src/main/java/be/mygod/librootkotlinx/RootServer.kt @@ -152,7 +152,7 @@ class RootServer { UUID.randomUUID().toString().also { persistence.writeText(it) } } val (script, relocated) = AppProcess.relocateScript(uuid) - script.appendln(AppProcess.launchString(context.packageCodePath, RootServer::class.java.name, relocated, + script.appendLine(AppProcess.launchString(context.packageCodePath, RootServer::class.java.name, relocated, niceName) + " $token2") writer.writeBytes(script.toString()) writer.flush() @@ -409,7 +409,7 @@ class RootServer { Os.dup2(FileDescriptor.err, OsConstants.STDOUT_FILENO) System.setOut(System.err) val writer = writer() - writer.appendln(args[0]) // echo ready signal + writer.appendLine(args[0]) // echo ready signal writer.flush() }) // thread safety: usage of input should be in main thread diff --git a/mobile/src/main/java/be/mygod/vpnhotspot/MainActivity.kt b/mobile/src/main/java/be/mygod/vpnhotspot/MainActivity.kt index 2c24f107..e585f17c 100644 --- a/mobile/src/main/java/be/mygod/vpnhotspot/MainActivity.kt +++ b/mobile/src/main/java/be/mygod/vpnhotspot/MainActivity.kt @@ -6,7 +6,6 @@ import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment -import androidx.lifecycle.observe import be.mygod.vpnhotspot.client.ClientViewModel import be.mygod.vpnhotspot.client.ClientsFragment import be.mygod.vpnhotspot.databinding.ActivityMainBinding diff --git a/mobile/src/main/java/be/mygod/vpnhotspot/RepeaterService.kt b/mobile/src/main/java/be/mygod/vpnhotspot/RepeaterService.kt index 381b46c3..5c7df357 100644 --- a/mobile/src/main/java/be/mygod/vpnhotspot/RepeaterService.kt +++ b/mobile/src/main/java/be/mygod/vpnhotspot/RepeaterService.kt @@ -143,7 +143,7 @@ class RepeaterService : Service(), CoroutineScope, WifiP2pManager.ChannelListene // WifiP2pServiceImpl only removes self address Build.VERSION.SDK_INT >= 29 && address == MacAddressCompat.ANY_ADDRESS || address == ownerAddress } - val main = ownedGroups.minBy { it.networkId } + val main = ownedGroups.minByOrNull { it.networkId } // do not replace current group if it's better if (binder.group?.passphrase == null) binder.group = main return if (main != null) ownedGroups.filter { it.networkId != main.networkId } else emptyList() diff --git a/mobile/src/main/java/be/mygod/vpnhotspot/client/Client.kt b/mobile/src/main/java/be/mygod/vpnhotspot/client/Client.kt index ce9bc2f6..fe8eac65 100644 --- a/mobile/src/main/java/be/mygod/vpnhotspot/client/Client.kt +++ b/mobile/src/main/java/be/mygod/vpnhotspot/client/Client.kt @@ -52,10 +52,10 @@ open class Client(val mac: MacAddressCompat, val iface: String) { val titleSelectable = record.map { it.nickname.isEmpty() } val description = record.map { record -> SpannableStringBuilder().apply { - if (record.nickname.isNotEmpty()) appendln(macIface) + if (record.nickname.isNotEmpty()) appendLine(macIface) ip.entries.forEach { (ip, state) -> append(makeIpSpan(ip)) - appendln(app.getText(when (state) { + appendLine(app.getText(when (state) { IpNeighbour.State.INCOMPLETE -> R.string.connected_state_incomplete IpNeighbour.State.VALID -> R.string.connected_state_valid IpNeighbour.State.FAILED -> R.string.connected_state_failed diff --git a/mobile/src/main/java/be/mygod/vpnhotspot/client/ClientsFragment.kt b/mobile/src/main/java/be/mygod/vpnhotspot/client/ClientsFragment.kt index 11e015b2..928bffdc 100644 --- a/mobile/src/main/java/be/mygod/vpnhotspot/client/ClientsFragment.kt +++ b/mobile/src/main/java/be/mygod/vpnhotspot/client/ClientsFragment.kt @@ -20,7 +20,6 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.lifecycle.findViewTreeLifecycleOwner import androidx.lifecycle.lifecycleScope -import androidx.lifecycle.observe import androidx.recyclerview.widget.DefaultItemAnimator import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.ListAdapter diff --git a/mobile/src/main/java/be/mygod/vpnhotspot/net/Routing.kt b/mobile/src/main/java/be/mygod/vpnhotspot/net/Routing.kt index 841bd58a..51d01c29 100644 --- a/mobile/src/main/java/be/mygod/vpnhotspot/net/Routing.kt +++ b/mobile/src/main/java/be/mygod/vpnhotspot/net/Routing.kt @@ -52,24 +52,24 @@ class Routing(private val caller: Any, private val downstream: String) : IpNeigh const val IP6TABLES = "ip6tables -w" fun appendCleanCommands(commands: BufferedWriter) { - commands.appendln("$IPTABLES -t nat -F PREROUTING") - commands.appendln("while $IPTABLES -D FORWARD -j vpnhotspot_fwd; do done") - commands.appendln("$IPTABLES -F vpnhotspot_fwd") - commands.appendln("$IPTABLES -X vpnhotspot_fwd") - commands.appendln("$IPTABLES -F vpnhotspot_acl") - commands.appendln("$IPTABLES -X vpnhotspot_acl") - commands.appendln("while $IPTABLES -t nat -D POSTROUTING -j vpnhotspot_masquerade; do done") - commands.appendln("$IPTABLES -t nat -F vpnhotspot_masquerade") - commands.appendln("$IPTABLES -t nat -X vpnhotspot_masquerade") - commands.appendln("while $IP6TABLES -D INPUT -j vpnhotspot_filter; do done") - commands.appendln("while $IP6TABLES -D FORWARD -j vpnhotspot_filter; do done") - commands.appendln("while $IP6TABLES -D OUTPUT -j vpnhotspot_filter; do done") - commands.appendln("$IP6TABLES -F vpnhotspot_filter") - commands.appendln("$IP6TABLES -X vpnhotspot_filter") - commands.appendln("while $IP rule del priority $RULE_PRIORITY_DNS; do done") - commands.appendln("while $IP rule del priority $RULE_PRIORITY_UPSTREAM; do done") - commands.appendln("while $IP rule del priority $RULE_PRIORITY_UPSTREAM_FALLBACK; do done") - commands.appendln("while $IP rule del priority $RULE_PRIORITY_UPSTREAM_DISABLE_SYSTEM; do done") + commands.appendLine("$IPTABLES -t nat -F PREROUTING") + commands.appendLine("while $IPTABLES -D FORWARD -j vpnhotspot_fwd; do done") + commands.appendLine("$IPTABLES -F vpnhotspot_fwd") + commands.appendLine("$IPTABLES -X vpnhotspot_fwd") + commands.appendLine("$IPTABLES -F vpnhotspot_acl") + commands.appendLine("$IPTABLES -X vpnhotspot_acl") + commands.appendLine("while $IPTABLES -t nat -D POSTROUTING -j vpnhotspot_masquerade; do done") + commands.appendLine("$IPTABLES -t nat -F vpnhotspot_masquerade") + commands.appendLine("$IPTABLES -t nat -X vpnhotspot_masquerade") + commands.appendLine("while $IP6TABLES -D INPUT -j vpnhotspot_filter; do done") + commands.appendLine("while $IP6TABLES -D FORWARD -j vpnhotspot_filter; do done") + commands.appendLine("while $IP6TABLES -D OUTPUT -j vpnhotspot_filter; do done") + commands.appendLine("$IP6TABLES -F vpnhotspot_filter") + commands.appendLine("$IP6TABLES -X vpnhotspot_filter") + commands.appendLine("while $IP rule del priority $RULE_PRIORITY_DNS; do done") + commands.appendLine("while $IP rule del priority $RULE_PRIORITY_UPSTREAM; do done") + commands.appendLine("while $IP rule del priority $RULE_PRIORITY_UPSTREAM_FALLBACK; do done") + commands.appendLine("while $IP rule del priority $RULE_PRIORITY_UPSTREAM_DISABLE_SYSTEM; do done") } suspend fun clean() { diff --git a/mobile/src/main/java/be/mygod/vpnhotspot/net/wifi/SoftApConfigurationCompat.kt b/mobile/src/main/java/be/mygod/vpnhotspot/net/wifi/SoftApConfigurationCompat.kt index 8a9a8cec..9f73afdc 100644 --- a/mobile/src/main/java/be/mygod/vpnhotspot/net/wifi/SoftApConfigurationCompat.kt +++ b/mobile/src/main/java/be/mygod/vpnhotspot/net/wifi/SoftApConfigurationCompat.kt @@ -219,7 +219,8 @@ data class SoftApConfigurationCompat( SoftApConfiguration.SECURITY_TYPE_WPA2_PSK } android.net.wifi.WifiConfiguration.KeyMgmt.SAE -> SoftApConfiguration.SECURITY_TYPE_WPA3_SAE - else -> android.net.wifi.WifiConfiguration.KeyMgmt.strings.getOrElse(selected) { "?" }.let { + else -> android.net.wifi.WifiConfiguration.KeyMgmt.strings + .getOrElse(selected) { "?" }.let { throw IllegalArgumentException("Unrecognized key management $it ($selected)") } } diff --git a/mobile/src/main/java/be/mygod/vpnhotspot/root/MiscCommands.kt b/mobile/src/main/java/be/mygod/vpnhotspot/root/MiscCommands.kt index b69bb4bf..0dad4af4 100644 --- a/mobile/src/main/java/be/mygod/vpnhotspot/root/MiscCommands.kt +++ b/mobile/src/main/java/be/mygod/vpnhotspot/root/MiscCommands.kt @@ -36,12 +36,12 @@ data class Dump(val path: String, val cacheDir: File = app.deviceStorage.codeCac process.outputStream.bufferedWriter().use { commands -> // https://android.googlesource.com/platform/external/iptables/+/android-7.0.0_r1/iptables/Android.mk#34 val iptablesSave = if (Build.VERSION.SDK_INT < 24) File(cacheDir, "iptables-save").absolutePath.also { - commands.appendln("ln -sf /system/bin/iptables $it") + commands.appendLine("ln -sf /system/bin/iptables $it") } else "iptables-save" val ip6tablesSave = if (Build.VERSION.SDK_INT < 24) File(cacheDir, "ip6tables-save").absolutePath.also { - commands.appendln("ln -sf /system/bin/ip6tables $it") + commands.appendLine("ln -sf /system/bin/ip6tables $it") } else "ip6tables-save" - commands.appendln(""" + commands.appendLine(""" |echo dumpsys ${Context.WIFI_P2P_SERVICE} |dumpsys ${Context.WIFI_P2P_SERVICE} |echo diff --git a/mobile/src/main/java/be/mygod/vpnhotspot/util/Utils.kt b/mobile/src/main/java/be/mygod/vpnhotspot/util/Utils.kt index df82ddc6..7ef937ed 100644 --- a/mobile/src/main/java/be/mygod/vpnhotspot/util/Utils.kt +++ b/mobile/src/main/java/be/mygod/vpnhotspot/util/Utils.kt @@ -92,11 +92,11 @@ fun makeMacSpan(mac: String) = if (app.hasTouch) SpannableString(mac).apply { fun NetworkInterface.formatAddresses(macOnly: Boolean = false) = SpannableStringBuilder().apply { try { - hardwareAddress?.let { appendln(makeMacSpan(MacAddressCompat.bytesToString(it))) } + hardwareAddress?.let { appendLine(makeMacSpan(MacAddressCompat.bytesToString(it))) } } catch (_: SocketException) { } if (!macOnly) for (address in interfaceAddresses) { append(makeIpSpan(address.address)) - appendln("/${address.networkPrefixLength}") + appendLine("/${address.networkPrefixLength}") } }.trimEnd()