EuiccChannelManager: check privileges even in "unprivileged" mode

There is no true "unprivileged" mode because we need carrier privileges
either way.
This commit is contained in:
Peter Cai 2023-11-28 22:27:25 -05:00
parent 825b33b1b9
commit 47b2a7060b
3 changed files with 12 additions and 1 deletions

View file

@ -1,5 +1,6 @@
package im.angry.openeuicc.core package im.angry.openeuicc.core
import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.os.Handler import android.os.Handler
import android.os.HandlerThread import android.os.HandlerThread
@ -16,6 +17,7 @@ import java.lang.IllegalArgumentException
import kotlin.coroutines.resume import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine import kotlin.coroutines.suspendCoroutine
@SuppressLint("MissingPermission") // We rely on ARA-based privileges, not READ_PRIVILEGED_PHONE_STATE
open class EuiccChannelManager(protected val context: Context) { open class EuiccChannelManager(protected val context: Context) {
companion object { companion object {
const val TAG = "EuiccChannelManager" const val TAG = "EuiccChannelManager"
@ -33,6 +35,8 @@ open class EuiccChannelManager(protected val context: Context) {
private val handler = Handler(HandlerThread("BaseEuiccChannelManager").also { it.start() }.looper) private val handler = Handler(HandlerThread("BaseEuiccChannelManager").also { it.start() }.looper)
protected open fun checkPrivileges() = tm.hasCarrierPrivileges()
private suspend fun connectSEService(): SEService = suspendCoroutine { cont -> private suspend fun connectSEService(): SEService = suspendCoroutine { cont ->
handler.post { handler.post {
var service: SEService? = null var service: SEService? = null
@ -99,12 +103,15 @@ open class EuiccChannelManager(protected val context: Context) {
} }
fun findEuiccChannelBySlotBlocking(slotId: Int): EuiccChannel? = runBlocking { fun findEuiccChannelBySlotBlocking(slotId: Int): EuiccChannel? = runBlocking {
if (!checkPrivileges()) return@runBlocking null
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
findEuiccChannelBySlot(slotId) findEuiccChannelBySlot(slotId)
} }
} }
suspend fun enumerateEuiccChannels() { suspend fun enumerateEuiccChannels() {
if (!checkPrivileges()) return
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
ensureSEService() ensureSEService()
@ -120,6 +127,8 @@ open class EuiccChannelManager(protected val context: Context) {
get() = channels.toList() get() = channels.toList()
fun invalidate() { fun invalidate() {
if (!checkPrivileges()) return
for (channel in channels) { for (channel in channels) {
channel.close() channel.close()
} }

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="no_euicc">No eUICC card on this device is accessible by this app.\nYou may want to try out the privileged OpenEUICC app instead.</string> <string name="no_euicc">No eUICC card on this device is accessible by this app.\nInsert a supported eUICC card, or try out the privileged OpenEUICC app instead.</string>
<string name="enabled">Enabled</string> <string name="enabled">Enabled</string>
<string name="disabled">Disabled</string> <string name="disabled">Disabled</string>

View file

@ -9,6 +9,8 @@ import java.lang.Exception
import java.lang.IllegalArgumentException import java.lang.IllegalArgumentException
class PrivilegedEuiccChannelManager(context: Context): EuiccChannelManager(context) { class PrivilegedEuiccChannelManager(context: Context): EuiccChannelManager(context) {
override fun checkPrivileges() = true // TODO: Implement proper system app check
override fun tryOpenEuiccChannelPrivileged(uiccInfo: UiccCardInfo, channelInfo: EuiccChannelInfo): EuiccChannel? { override fun tryOpenEuiccChannelPrivileged(uiccInfo: UiccCardInfo, channelInfo: EuiccChannelInfo): EuiccChannel? {
if (uiccInfo.isEuicc && !uiccInfo.isRemovable) { if (uiccInfo.isEuicc && !uiccInfo.isRemovable) {
Log.d(TAG, "Using TelephonyManager for slot ${uiccInfo.slotIndex}") Log.d(TAG, "Using TelephonyManager for slot ${uiccInfo.slotIndex}")