Merge "VPN: Move package intent receiver to ConnectivityService."
am: aff267369c
Change-Id: I3220f34afe7e56bcbde87a8de2b00ecddecbc97a
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user