diff --git a/android/src/main/java/com/tailscale/ipn/App.kt b/android/src/main/java/com/tailscale/ipn/App.kt index ce20f33..7665ee7 100644 --- a/android/src/main/java/com/tailscale/ipn/App.kt +++ b/android/src/main/java/com/tailscale/ipn/App.kt @@ -453,17 +453,19 @@ class App : Application(), libtailscale.AppContext { return downloads } - @Throws(IOException::class, GeneralSecurityException::class) + @Throws( + IOException::class, GeneralSecurityException::class, MDMSettings.NoSuchKeyException::class) override fun getSyspolicyBooleanValue(key: String): Boolean { return getSyspolicyStringValue(key) == "true" } - @Throws(IOException::class, GeneralSecurityException::class) + @Throws( + IOException::class, GeneralSecurityException::class, MDMSettings.NoSuchKeyException::class) override fun getSyspolicyStringValue(key: String): String { return MDMSettings.allSettingsByKey[key]?.flow?.value?.toString() ?: run { - Log.d("MDM", "$key is not defined on Android. Returning empty.") - "" + Log.d("MDM", "$key is not defined on Android. Throwing NoSuchKeyException.") + throw MDMSettings.NoSuchKeyException() } } } diff --git a/android/src/main/java/com/tailscale/ipn/mdm/MDMSettings.kt b/android/src/main/java/com/tailscale/ipn/mdm/MDMSettings.kt index 24364c0..d1d9223 100644 --- a/android/src/main/java/com/tailscale/ipn/mdm/MDMSettings.kt +++ b/android/src/main/java/com/tailscale/ipn/mdm/MDMSettings.kt @@ -11,6 +11,11 @@ import kotlin.reflect.full.isSubclassOf import kotlin.reflect.jvm.jvmErasure object MDMSettings { + // The String message used in this NoSuchKeyException must match the value of + // syspolicy.ErrNoSuchKey defined in Go, since the backend checks the value + // returned by the handler for equality using errors.Is(). + class NoSuchKeyException : Exception("no such key") + val forceEnabled = BooleanMDMSetting("ForceEnabled", "Force Enabled Connection Toggle") val exitNodeID = StringMDMSetting("ExitNodeID", "Forced Exit Node: Stable ID")