Skip to content

Commit d512aef

Browse files
authored
mdm: update MDMSettings (and syspolicy) when application restrictions change (#571)
In this PR, we update the Android app to register a broadcast receiver that listens for android.content.Intent.ACTION_APPLICATION_RESTRICTIONS_CHANGED and updates MDMSettings whenever a change occurs. This, in turn, notifies the Go backend and causes it to reload syspolicy, ensuring it reflects the updated MDM settings. Updates tailscale/tailscale#12687 Signed-off-by: Nick Khyl <[email protected]>
1 parent 463c70d commit d512aef

File tree

2 files changed

+29
-0
lines changed

2 files changed

+29
-0
lines changed

android/src/main/java/com/tailscale/ipn/App.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import androidx.lifecycle.ViewModelStoreOwner
2626
import androidx.security.crypto.EncryptedSharedPreferences
2727
import androidx.security.crypto.MasterKey
2828
import com.tailscale.ipn.mdm.MDMSettings
29+
import com.tailscale.ipn.mdm.MDMSettingsChangedReceiver
2930
import com.tailscale.ipn.ui.localapi.Client
3031
import com.tailscale.ipn.ui.localapi.Request
3132
import com.tailscale.ipn.ui.model.Ipn
@@ -71,6 +72,7 @@ class App : UninitializedApp(), libtailscale.AppContext, ViewModelStoreOwner {
7172

7273
val dns = DnsConfig()
7374
private lateinit var connectivityManager: ConnectivityManager
75+
private lateinit var mdmChangeReceiver: MDMSettingsChangedReceiver
7476
private lateinit var app: libtailscale.Application
7577

7678
override val viewModelStore: ViewModelStore
@@ -101,6 +103,11 @@ class App : UninitializedApp(), libtailscale.AppContext, ViewModelStoreOwner {
101103
super.onCreate()
102104
appInstance = this
103105
setUnprotectedInstance(this)
106+
107+
mdmChangeReceiver = MDMSettingsChangedReceiver()
108+
val filter = IntentFilter(Intent.ACTION_APPLICATION_RESTRICTIONS_CHANGED)
109+
registerReceiver(mdmChangeReceiver, filter)
110+
104111
createNotificationChannel(
105112
STATUS_CHANNEL_ID,
106113
getString(R.string.vpn_status),
@@ -124,6 +131,7 @@ class App : UninitializedApp(), libtailscale.AppContext, ViewModelStoreOwner {
124131
notificationManager.cancelAll()
125132
applicationScope.cancel()
126133
viewModelStore.clear()
134+
unregisterReceiver(mdmChangeReceiver)
127135
}
128136

129137
@Volatile private var isInitialized = false
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// Copyright (c) Tailscale Inc & AUTHORS
2+
// SPDX-License-Identifier: BSD-3-Clause
3+
4+
package com.tailscale.ipn.mdm
5+
6+
import android.content.BroadcastReceiver
7+
import android.content.Context
8+
import android.content.Intent
9+
import android.content.RestrictionsManager
10+
import com.tailscale.ipn.App
11+
import com.tailscale.ipn.util.TSLog
12+
13+
class MDMSettingsChangedReceiver : BroadcastReceiver() {
14+
override fun onReceive(context: Context?, intent: Intent?) {
15+
if (intent?.action == android.content.Intent.ACTION_APPLICATION_RESTRICTIONS_CHANGED) {
16+
TSLog.d("syspolicy", "MDM settings changed")
17+
val restrictionsManager = context?.getSystemService(Context.RESTRICTIONS_SERVICE) as RestrictionsManager
18+
MDMSettings.update(App.get(), restrictionsManager)
19+
}
20+
}
21+
}

0 commit comments

Comments
 (0)