Misc BSSID fixes
This commit is contained in:
@@ -14,7 +14,7 @@ import java.io.File
|
||||
* https://android.googlesource.com/platform/external/wpa_supplicant_8/+/d2986c2/wpa_supplicant/config.c#488
|
||||
* https://android.googlesource.com/platform/external/wpa_supplicant_8/+/6fa46df/wpa_supplicant/config_file.c#182
|
||||
*/
|
||||
class P2pSupplicantConfiguration(private val group: WifiP2pGroup?, vararg ownerAddresses: String?) {
|
||||
class P2pSupplicantConfiguration(private val group: WifiP2pGroup? = null, ownerAddress: String? = null) {
|
||||
companion object {
|
||||
private const val TAG = "P2pSupplicantConfiguration"
|
||||
private const val CONF_PATH_TREBLE = "/data/vendor/wifi/wpa/p2p_supplicant.conf"
|
||||
@@ -49,96 +49,95 @@ class P2pSupplicantConfiguration(private val group: WifiP2pGroup?, vararg ownerA
|
||||
private data class Content(val lines: ArrayList<Any>, var target: NetworkBlock, var persistentMacLine: Int?,
|
||||
var legacy: Boolean)
|
||||
|
||||
private val content by lazy {
|
||||
RootSession.use {
|
||||
val result = ArrayList<Any>()
|
||||
var target: NetworkBlock? = null
|
||||
var persistentMacLine: Int? = null
|
||||
val command = "cat $CONF_PATH_TREBLE || cat $CONF_PATH_LEGACY"
|
||||
val shell = it.execQuiet(command)
|
||||
RootSession.checkOutput(command, shell, false, false)
|
||||
val parser = Parser(shell.out)
|
||||
try {
|
||||
var bssids = (listOf(group?.owner?.deviceAddress, RepeaterService.lastMac) + ownerAddresses)
|
||||
.filterNotNull()
|
||||
.distinct()
|
||||
.filter {
|
||||
try {
|
||||
val mac = MacAddressCompat.fromString(it)
|
||||
mac != MacAddressCompat.ALL_ZEROS_ADDRESS && mac != MacAddressCompat.ANY_ADDRESS
|
||||
} catch (_: IllegalArgumentException) {
|
||||
false
|
||||
}
|
||||
private val content = RootSession.use {
|
||||
val result = ArrayList<Any>()
|
||||
var target: NetworkBlock? = null
|
||||
var persistentMacLine: Int? = null
|
||||
val command = "cat $CONF_PATH_TREBLE || cat $CONF_PATH_LEGACY"
|
||||
val shell = it.execQuiet(command)
|
||||
RootSession.checkOutput(command, shell, false, false)
|
||||
val parser = Parser(shell.out)
|
||||
try {
|
||||
var bssids = listOfNotNull(group?.owner?.deviceAddress, ownerAddress)
|
||||
.distinct()
|
||||
.filter {
|
||||
try {
|
||||
val mac = MacAddressCompat.fromString(it)
|
||||
mac != MacAddressCompat.ALL_ZEROS_ADDRESS && mac != MacAddressCompat.ANY_ADDRESS
|
||||
} catch (_: IllegalArgumentException) {
|
||||
false
|
||||
}
|
||||
while (parser.next()) {
|
||||
if (parser.trimmed.startsWith("network={")) {
|
||||
val block = NetworkBlock()
|
||||
block.add(parser.line)
|
||||
while (parser.next() && !parser.trimmed.startsWith('}')) {
|
||||
if (parser.trimmed.startsWith("ssid=")) {
|
||||
check(block.ssidLine == null)
|
||||
block.ssidLine = block.size
|
||||
} else if (parser.trimmed.startsWith("mode=3")) block.groupOwner = true else {
|
||||
val match = networkParser.find(parser.trimmed)
|
||||
if (match != null) match.groupValues[2].also { matchedBssid ->
|
||||
if (matchedBssid.isEmpty()) {
|
||||
check(block.pskLine == null && block.psk == null)
|
||||
if (match.groups[5] != null) {
|
||||
block.psk = match.groupValues[5].apply { check(length in 8..63) }
|
||||
}
|
||||
block.pskLine = block.size
|
||||
} else if (bssids.any { matchedBssid.equals(it, true) }) {
|
||||
block.bssid = matchedBssid
|
||||
block.bssidLine = block.size
|
||||
}
|
||||
while (parser.next()) {
|
||||
if (parser.trimmed.startsWith("network={")) {
|
||||
val block = NetworkBlock()
|
||||
block.add(parser.line)
|
||||
while (parser.next() && !parser.trimmed.startsWith('}')) {
|
||||
if (parser.trimmed.startsWith("ssid=")) {
|
||||
check(block.ssidLine == null)
|
||||
block.ssidLine = block.size
|
||||
} else if (parser.trimmed.startsWith("mode=3")) block.groupOwner = true else {
|
||||
val match = networkParser.find(parser.trimmed)
|
||||
if (match != null) match.groupValues[2].also { matchedBssid ->
|
||||
if (matchedBssid.isEmpty()) {
|
||||
check(block.pskLine == null && block.psk == null)
|
||||
if (match.groups[5] != null) {
|
||||
block.psk = match.groupValues[5].apply { check(length in 8..63) }
|
||||
}
|
||||
block.pskLine = block.size
|
||||
} else if (bssids.any { matchedBssid.equals(it, true) }) {
|
||||
block.bssid = matchedBssid
|
||||
block.bssidLine = block.size
|
||||
}
|
||||
}
|
||||
block.add(parser.line)
|
||||
}
|
||||
block.add(parser.line)
|
||||
result.add(block)
|
||||
if (block.bssid != null && block.groupOwner && target == null) { // keep first only
|
||||
check(block.ssidLine != null && block.pskLine != null)
|
||||
target = block
|
||||
}
|
||||
} else {
|
||||
if (parser.trimmed.startsWith(PERSISTENT_MAC)) {
|
||||
require(persistentMacLine == null) { "Duplicated $PERSISTENT_MAC" }
|
||||
persistentMacLine = result.size
|
||||
bssids = listOf(parser.trimmed.substring(PERSISTENT_MAC.length))
|
||||
}
|
||||
result.add(parser.line)
|
||||
}
|
||||
block.add(parser.line)
|
||||
result.add(block)
|
||||
if (block.bssid != null && block.groupOwner && target == null) { // keep first only
|
||||
check(block.ssidLine != null && block.pskLine != null)
|
||||
target = block
|
||||
}
|
||||
} else {
|
||||
if (parser.trimmed.startsWith(PERSISTENT_MAC)) {
|
||||
require(persistentMacLine == null) { "Duplicated $PERSISTENT_MAC" }
|
||||
persistentMacLine = result.size
|
||||
bssids = listOf(parser.trimmed.substring(PERSISTENT_MAC.length))
|
||||
}
|
||||
result.add(parser.line)
|
||||
}
|
||||
if (target == null && !RepeaterService.persistentSupported) {
|
||||
result.add("")
|
||||
result.add(NetworkBlock().apply {
|
||||
// generate a basic network block, it is likely that vendor is going to add more stuff here
|
||||
add("network={")
|
||||
ssidLine = size
|
||||
add("")
|
||||
add("\tbssid=$bssid")
|
||||
pskLine = size
|
||||
add("")
|
||||
add("\tproto=RSN")
|
||||
add("\tkey_mgmt=WPA-PSK")
|
||||
add("\tpairwise=CCMP")
|
||||
add("\tauth_alg=OPEN")
|
||||
add("\tmode=3")
|
||||
add("\tdisabled=2")
|
||||
add("}")
|
||||
if (target == null) target = this
|
||||
})
|
||||
}
|
||||
Content(result, target!!, persistentMacLine, shell.err.isNotEmpty())
|
||||
} catch (e: RuntimeException) {
|
||||
FirebaseCrashlytics.getInstance().apply {
|
||||
setCustomKey(TAG, parser.lines.joinToString("\n"))
|
||||
setCustomKey("$TAG.ownerAddresses", ownerAddresses.joinToString())
|
||||
setCustomKey("$TAG.p2pGroup", group.toString())
|
||||
}
|
||||
throw e
|
||||
}
|
||||
if (target == null && !RepeaterService.persistentSupported) {
|
||||
result.add("")
|
||||
result.add(NetworkBlock().apply {
|
||||
// generate a basic network block, it is likely that vendor is going to add more stuff here
|
||||
add("network={")
|
||||
ssidLine = size
|
||||
add("")
|
||||
add("\tbssid=$bssid")
|
||||
pskLine = size
|
||||
add("")
|
||||
add("\tproto=RSN")
|
||||
add("\tkey_mgmt=WPA-PSK")
|
||||
add("\tpairwise=CCMP")
|
||||
add("\tauth_alg=OPEN")
|
||||
add("\tmode=3")
|
||||
add("\tdisabled=2")
|
||||
add("}")
|
||||
if (target == null) target = this
|
||||
})
|
||||
}
|
||||
Content(result, target!!.apply {
|
||||
RepeaterService.lastMac = bssid!!
|
||||
}, persistentMacLine, shell.err.isNotEmpty())
|
||||
} catch (e: RuntimeException) {
|
||||
FirebaseCrashlytics.getInstance().apply {
|
||||
setCustomKey(TAG, parser.lines.joinToString("\n"))
|
||||
setCustomKey("$TAG.ownerAddress", ownerAddress.toString())
|
||||
setCustomKey("$TAG.p2pGroup", group.toString())
|
||||
}
|
||||
throw e
|
||||
}
|
||||
}
|
||||
val psk = group?.passphrase ?: content.target.psk!!
|
||||
|
||||
Reference in New Issue
Block a user