Merge "VPN: Move package intent receiver to ConnectivityService."

am: aff267369c

Change-Id: I3220f34afe7e56bcbde87a8de2b00ecddecbc97a
This commit is contained in:
Junyu Lai
2018-12-11 03:36:18 -08:00
committed by android-build-merger
2 changed files with 41 additions and 68 deletions

View File

@@ -902,6 +902,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
// Listen to package add and removal events for all users. // Listen to package add and removal events for all users.
intentFilter = new IntentFilter(); intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED); intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
intentFilter.addAction(Intent.ACTION_PACKAGE_REPLACED);
intentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED); intentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
intentFilter.addDataScheme("package"); intentFilter.addDataScheme("package");
mContext.registerReceiverAsUser( mContext.registerReceiverAsUser(
@@ -4203,12 +4204,46 @@ public class ConnectivityService extends IConnectivityManager.Stub
mPermissionMonitor.onPackageAdded(packageName, uid); mPermissionMonitor.onPackageAdded(packageName, uid);
} }
private void onPackageRemoved(String packageName, int uid) { private void onPackageReplaced(String packageName, int uid) {
if (TextUtils.isEmpty(packageName) || uid < 0) {
Slog.wtf(TAG, "Invalid package in onPackageReplaced: " + packageName + " | " + uid);
return;
}
final int userId = UserHandle.getUserId(uid);
synchronized (mVpns) {
final Vpn vpn = mVpns.get(userId);
if (vpn == null) {
return;
}
// Legacy always-on VPN won't be affected since the package name is not set.
if (TextUtils.equals(vpn.getAlwaysOnPackage(), packageName)) {
Slog.d(TAG, "Restarting always-on VPN package " + packageName + " for user "
+ userId);
vpn.startAlwaysOnVpn();
}
}
}
private void onPackageRemoved(String packageName, int uid, boolean isReplacing) {
if (TextUtils.isEmpty(packageName) || uid < 0) { if (TextUtils.isEmpty(packageName) || uid < 0) {
Slog.wtf(TAG, "Invalid package in onPackageRemoved: " + packageName + " | " + uid); Slog.wtf(TAG, "Invalid package in onPackageRemoved: " + packageName + " | " + uid);
return; return;
} }
mPermissionMonitor.onPackageRemoved(uid); mPermissionMonitor.onPackageRemoved(uid);
final int userId = UserHandle.getUserId(uid);
synchronized (mVpns) {
final Vpn vpn = mVpns.get(userId);
if (vpn == null) {
return;
}
// Legacy always-on VPN won't be affected since the package name is not set.
if (TextUtils.equals(vpn.getAlwaysOnPackage(), packageName) && !isReplacing) {
Slog.d(TAG, "Removing always-on VPN package " + packageName + " for user "
+ userId);
vpn.setAlwaysOnPackage(null, false);
}
}
} }
private void onUserUnlocked(int userId) { private void onUserUnlocked(int userId) {
@@ -4245,8 +4280,12 @@ public class ConnectivityService extends IConnectivityManager.Stub
onUserUnlocked(userId); onUserUnlocked(userId);
} else if (Intent.ACTION_PACKAGE_ADDED.equals(action)) { } else if (Intent.ACTION_PACKAGE_ADDED.equals(action)) {
onPackageAdded(packageName, uid); onPackageAdded(packageName, uid);
} else if (Intent.ACTION_PACKAGE_REPLACED.equals(action)) {
onPackageReplaced(packageName, uid);
} else if (Intent.ACTION_PACKAGE_REMOVED.equals(action)) { } else if (Intent.ACTION_PACKAGE_REMOVED.equals(action)) {
onPackageRemoved(packageName, uid); final boolean isReplacing = intent.getBooleanExtra(
Intent.EXTRA_REPLACING, false);
onPackageRemoved(packageName, uid, isReplacing);
} }
} }
}; };

View File

@@ -206,45 +206,6 @@ public class Vpn {
// Handle of the user initiating VPN. // Handle of the user initiating VPN.
private final int mUserHandle; private final int mUserHandle;
// Listen to package removal and change events (update/uninstall) for this user
private final BroadcastReceiver mPackageIntentReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final Uri data = intent.getData();
final String packageName = data == null ? null : data.getSchemeSpecificPart();
if (packageName == null) {
return;
}
synchronized (Vpn.this) {
// Avoid race where always-on package has been unset
if (!packageName.equals(getAlwaysOnPackage())) {
return;
}
final String action = intent.getAction();
Log.i(TAG, "Received broadcast " + action + " for always-on VPN package "
+ packageName + " in user " + mUserHandle);
switch(action) {
case Intent.ACTION_PACKAGE_REPLACED:
// Start vpn after app upgrade
startAlwaysOnVpn();
break;
case Intent.ACTION_PACKAGE_REMOVED:
final boolean isPackageRemoved = !intent.getBooleanExtra(
Intent.EXTRA_REPLACING, false);
if (isPackageRemoved) {
setAlwaysOnPackage(null, false);
}
break;
}
}
}
};
private boolean mIsPackageIntentReceiverRegistered = false;
public Vpn(Looper looper, Context context, INetworkManagementService netService, public Vpn(Looper looper, Context context, INetworkManagementService netService,
@UserIdInt int userHandle) { @UserIdInt int userHandle) {
this(looper, context, netService, userHandle, new SystemServices(context)); this(looper, context, netService, userHandle, new SystemServices(context));
@@ -500,7 +461,6 @@ public class Vpn {
// Prepare this app. The notification will update as a side-effect of updateState(). // Prepare this app. The notification will update as a side-effect of updateState().
prepareInternal(packageName); prepareInternal(packageName);
} }
maybeRegisterPackageChangeReceiverLocked(packageName);
setVpnForcedLocked(mLockdown); setVpnForcedLocked(mLockdown);
return true; return true;
} }
@@ -509,31 +469,6 @@ public class Vpn {
return packageName == null || VpnConfig.LEGACY_VPN.equals(packageName); return packageName == null || VpnConfig.LEGACY_VPN.equals(packageName);
} }
private void unregisterPackageChangeReceiverLocked() {
if (mIsPackageIntentReceiverRegistered) {
mContext.unregisterReceiver(mPackageIntentReceiver);
mIsPackageIntentReceiverRegistered = false;
}
}
private void maybeRegisterPackageChangeReceiverLocked(String packageName) {
// Unregister IntentFilter listening for previous always-on package change
unregisterPackageChangeReceiverLocked();
if (!isNullOrLegacyVpn(packageName)) {
mIsPackageIntentReceiverRegistered = true;
IntentFilter intentFilter = new IntentFilter();
// Protected intent can only be sent by system. No permission required in register.
intentFilter.addAction(Intent.ACTION_PACKAGE_REPLACED);
intentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
intentFilter.addDataScheme("package");
intentFilter.addDataSchemeSpecificPart(packageName, PatternMatcher.PATTERN_LITERAL);
mContext.registerReceiverAsUser(
mPackageIntentReceiver, UserHandle.of(mUserHandle), intentFilter, null, null);
}
}
/** /**
* @return the package name of the VPN controller responsible for always-on VPN, * @return the package name of the VPN controller responsible for always-on VPN,
* or {@code null} if none is set or always-on VPN is controlled through * or {@code null} if none is set or always-on VPN is controlled through
@@ -1302,7 +1237,6 @@ public class Vpn {
setLockdown(false); setLockdown(false);
mAlwaysOn = false; mAlwaysOn = false;
unregisterPackageChangeReceiverLocked();
// Quit any active connections // Quit any active connections
agentDisconnect(); agentDisconnect();
} }