From 563407e42a548905e452aeefc7e3f1e4cd28b4b6 Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Fri, 22 Jul 2022 11:12:52 +0200 Subject: [PATCH] android: Mark PendingIntents as immutable via FLAG_IMMUTABLE Setting this or explicitly FLAG_MUTABLE is required when targeting Android 12. References strongswan/strongswan#1151 --- .../android/logic/CharonVpnService.java | 25 +++++++++++++++---- .../strongswan/android/logic/Scheduler.java | 7 +++++- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/logic/CharonVpnService.java b/src/frontends/android/app/src/main/java/org/strongswan/android/logic/CharonVpnService.java index dccc298268..165f479dc7 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/logic/CharonVpnService.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/logic/CharonVpnService.java @@ -461,8 +461,13 @@ public class CharonVpnService extends VpnService implements Runnable, VpnStateSe intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setAction(VpnProfileControlActivity.START_PROFILE); intent.putExtra(VpnProfileControlActivity.EXTRA_VPN_PROFILE_ID, profile.getUUID().toString()); + int flags = PendingIntent.FLAG_UPDATE_CURRENT; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) + { + flags |= PendingIntent.FLAG_IMMUTABLE; + } PendingIntent pending = PendingIntent.getActivity(getApplicationContext(), 0, intent, - PendingIntent.FLAG_UPDATE_CURRENT); + flags); builder.addAction(R.drawable.ic_notification_connecting, getString(R.string.retry), pending); add_action = true; } @@ -491,6 +496,12 @@ public class CharonVpnService extends VpnService implements Runnable, VpnStateSe } } builder.setContentTitle(getString(s)); + + int flags = PendingIntent.FLAG_UPDATE_CURRENT; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) + { + flags |= PendingIntent.FLAG_IMMUTABLE; + } if (!publicVersion) { if (add_action) @@ -498,7 +509,7 @@ public class CharonVpnService extends VpnService implements Runnable, VpnStateSe Intent intent = new Intent(getApplicationContext(), VpnProfileControlActivity.class); intent.setAction(VpnProfileControlActivity.DISCONNECT); PendingIntent pending = PendingIntent.getActivity(getApplicationContext(), 0, intent, - PendingIntent.FLAG_UPDATE_CURRENT); + flags); builder.addAction(R.drawable.ic_notification_disconnect, getString(R.string.disconnect), pending); } if (error == ErrorState.NO_ERROR) @@ -510,7 +521,7 @@ public class CharonVpnService extends VpnService implements Runnable, VpnStateSe Intent intent = new Intent(getApplicationContext(), MainActivity.class); PendingIntent pending = PendingIntent.getActivity(getApplicationContext(), 0, intent, - PendingIntent.FLAG_UPDATE_CURRENT); + flags); builder.setContentIntent(pending); return builder.build(); } @@ -820,8 +831,12 @@ public class CharonVpnService extends VpnService implements Runnable, VpnStateSe * we just use our main Activity */ Context context = getApplicationContext(); Intent intent = new Intent(context, MainActivity.class); - PendingIntent pending = PendingIntent.getActivity(context, 0, intent, - PendingIntent.FLAG_UPDATE_CURRENT); + int flags = PendingIntent.FLAG_UPDATE_CURRENT; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) + { + flags |= PendingIntent.FLAG_IMMUTABLE; + } + PendingIntent pending = PendingIntent.getActivity(context, 0, intent, flags); builder.setConfigureIntent(pending); /* mark all VPN connections as unmetered (default changed for Android 10) */ diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/logic/Scheduler.java b/src/frontends/android/app/src/main/java/org/strongswan/android/logic/Scheduler.java index 1b6f412b26..7ad181bc1c 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/logic/Scheduler.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/logic/Scheduler.java @@ -82,7 +82,12 @@ public class Scheduler extends BroadcastReceiver /* using component/class doesn't work with dynamic broadcast receivers */ Intent intent = new Intent(EXECUTE_JOB); intent.setPackage(mContext.getPackageName()); - return PendingIntent.getBroadcast(mContext, 0, intent, 0); + int flags = 0; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) + { + flags |= PendingIntent.FLAG_IMMUTABLE; + } + return PendingIntent.getBroadcast(mContext, 0, intent, flags); } /** -- 2.47.2