diff --git a/app/src/main/java/com/droiddeck/launcher/runtime/LinuxNetworkLinkComponent.kt b/app/src/main/java/com/droiddeck/launcher/runtime/LinuxNetworkLinkComponent.kt index ac87bd0aa..45f07471b 100644 --- a/app/src/main/java/com/droiddeck/launcher/runtime/LinuxNetworkLinkComponent.kt +++ b/app/src/main/java/com/droiddeck/launcher/runtime/LinuxNetworkLinkComponent.kt @@ -301,15 +301,18 @@ class LinuxNetworkLinkComponent( } } - private fun seededMac(): String { - val id = Settings.Secure.getString(appContext.contentResolver, Settings.Secure.ANDROID_ID) ?: "bannerlator" - val bytes = java.security.MessageDigest.getInstance("SHA-1").digest(id.toByteArray()) - val b0 = (bytes[0].toInt() and 0xfc) or 0x02 - return listOf(b0, bytes[1].toInt(), bytes[2].toInt(), bytes[3].toInt(), bytes[4].toInt(), bytes[5].toInt()) - .joinToString(":") { "%02x".format(it and 0xff) } - } + private fun seededMac(): String = + seededMac { Settings.Secure.getString(appContext.contentResolver, Settings.Secure.ANDROID_ID) } companion object { + internal fun seededMac(readId: () -> String?): String { + val id = runCatching(readId).getOrNull() ?: "bannerlator" + val bytes = java.security.MessageDigest.getInstance("SHA-1").digest(id.toByteArray()) + val b0 = (bytes[0].toInt() and 0xfc) or 0x02 + return listOf(b0, bytes[1].toInt(), bytes[2].toInt(), bytes[3].toInt(), bytes[4].toInt(), bytes[5].toInt()) + .joinToString(":") { "%02x".format(it and 0xff) } + } + private const val TAG = "LinuxNetworkLink" private const val LINK_FILE = "etc/droiddeck-net" private const val LINK_INDEX = 2 diff --git a/app/src/test/java/com/droiddeck/launcher/runtime/SeededMacTest.kt b/app/src/test/java/com/droiddeck/launcher/runtime/SeededMacTest.kt new file mode 100644 index 000000000..e7a521263 --- /dev/null +++ b/app/src/test/java/com/droiddeck/launcher/runtime/SeededMacTest.kt @@ -0,0 +1,21 @@ +package com.droiddeck.launcher.runtime + +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNotEquals +import org.junit.Test + +class SeededMacTest { + @Test + fun theAndroidIdSeedsAStableLocalMac() { + val mac = LinuxNetworkLinkComponent.seededMac { "0123456789abcdef" } + assertEquals(mac, LinuxNetworkLinkComponent.seededMac { "0123456789abcdef" }) + assertNotEquals(mac, LinuxNetworkLinkComponent.seededMac { null }) + assertEquals(0x02, mac.substringBefore(':').toInt(16) and 0x03) + } + + @Test + fun aRomThatThrowsOnTheAndroidIdReadFallsBackToTheDefaultSeed() { + val mac = LinuxNetworkLinkComponent.seededMac { throw IllegalArgumentException("Illegal char: - at offset 8") } + assertEquals(LinuxNetworkLinkComponent.seededMac { null }, mac) + } +}