[AWARE] Check dynamic location permission

Add check for dynamic location permission.

Bug: 70499417
Test: unit tests, integration tests, CtsVerifier
Change-Id: I69ac0b46ecad27eca45853848cd17fc1f2ec9eef
diff --git a/service/java/com/android/server/wifi/aware/WifiAwareService.java b/service/java/com/android/server/wifi/aware/WifiAwareService.java
index 40b2e39..f38c373 100644
--- a/service/java/com/android/server/wifi/aware/WifiAwareService.java
+++ b/service/java/com/android/server/wifi/aware/WifiAwareService.java
@@ -69,6 +69,7 @@
             HandlerThread awareHandlerThread = wifiInjector.getWifiAwareHandlerThread();
             mImpl.start(awareHandlerThread, wifiAwareStateManager, wifiAwareShellCommand,
                     wifiInjector.getWifiMetrics().getWifiAwareMetrics(),
+                    wifiInjector.getWifiPermissionsUtil(),
                     wifiInjector.getWifiPermissionsWrapper(), wifiInjector.getFrameworkFacade(),
                     wifiAwareNativeManager, wifiAwareNativeApi, wifiAwareNativeCallback);
         } else if (phase == SystemService.PHASE_BOOT_COMPLETED) {
diff --git a/service/java/com/android/server/wifi/aware/WifiAwareServiceImpl.java b/service/java/com/android/server/wifi/aware/WifiAwareServiceImpl.java
index 27261e0..f92249e 100644
--- a/service/java/com/android/server/wifi/aware/WifiAwareServiceImpl.java
+++ b/service/java/com/android/server/wifi/aware/WifiAwareServiceImpl.java
@@ -44,6 +44,7 @@
 
 import com.android.server.wifi.FrameworkFacade;
 import com.android.server.wifi.WifiInjector;
+import com.android.server.wifi.util.WifiPermissionsUtil;
 import com.android.server.wifi.util.WifiPermissionsWrapper;
 
 import java.io.FileDescriptor;
@@ -62,6 +63,7 @@
     /* package */ boolean mDbg = false;
 
     private Context mContext;
+    private WifiPermissionsUtil mWifiPermissionsUtil;
     private WifiAwareStateManager mStateManager;
     private WifiAwareShellCommand mShellCommand;
 
@@ -89,11 +91,13 @@
      */
     public void start(HandlerThread handlerThread, WifiAwareStateManager awareStateManager,
             WifiAwareShellCommand awareShellCommand, WifiAwareMetrics awareMetrics,
-            WifiPermissionsWrapper permissionsWrapper, FrameworkFacade frameworkFacade,
-            WifiAwareNativeManager wifiAwareNativeManager, WifiAwareNativeApi wifiAwareNativeApi,
+            WifiPermissionsUtil wifiPermissionsUtil, WifiPermissionsWrapper permissionsWrapper,
+            FrameworkFacade frameworkFacade, WifiAwareNativeManager wifiAwareNativeManager,
+            WifiAwareNativeApi wifiAwareNativeApi,
             WifiAwareNativeCallback wifiAwareNativeCallback) {
         Log.i(TAG, "Starting Wi-Fi Aware service");
 
+        mWifiPermissionsUtil = wifiPermissionsUtil;
         mStateManager = awareStateManager;
         mShellCommand = awareShellCommand;
         mStateManager.start(mContext, handlerThread.getLooper(), awareMetrics, permissionsWrapper);
@@ -177,7 +181,7 @@
         }
 
         if (notifyOnIdentityChanged) {
-            enforceLocationPermission();
+            enforceLocationPermission(callingPackage, getMockableCallingUid());
         }
 
         if (configRequest != null) {
@@ -277,11 +281,11 @@
     }
 
     @Override
-    public void publish(int clientId, PublishConfig publishConfig,
+    public void publish(String callingPackage, int clientId, PublishConfig publishConfig,
             IWifiAwareDiscoverySessionCallback callback) {
         enforceAccessPermission();
         enforceChangePermission();
-        enforceLocationPermission();
+        enforceLocationPermission(callingPackage, getMockableCallingUid());
 
         if (callback == null) {
             throw new IllegalArgumentException("Callback must not be null");
@@ -324,11 +328,11 @@
     }
 
     @Override
-    public void subscribe(int clientId, SubscribeConfig subscribeConfig,
+    public void subscribe(String callingPackage, int clientId, SubscribeConfig subscribeConfig,
             IWifiAwareDiscoverySessionCallback callback) {
         enforceAccessPermission();
         enforceChangePermission();
-        enforceLocationPermission();
+        enforceLocationPermission(callingPackage, getMockableCallingUid());
 
         if (callback == null) {
             throw new IllegalArgumentException("Callback must not be null");
@@ -450,9 +454,8 @@
         mContext.enforceCallingOrSelfPermission(android.Manifest.permission.CHANGE_WIFI_STATE, TAG);
     }
 
-    private void enforceLocationPermission() {
-        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION,
-                TAG);
+    private void enforceLocationPermission(String callingPackage, int uid) {
+        mWifiPermissionsUtil.enforceLocationPermission(callingPackage, uid);
     }
 
     private void enforceNetworkStackPermission() {
diff --git a/tests/wifitests/src/com/android/server/wifi/aware/WifiAwareDataPathStateManagerTest.java b/tests/wifitests/src/com/android/server/wifi/aware/WifiAwareDataPathStateManagerTest.java
index f168c8c..537845c 100644
--- a/tests/wifitests/src/com/android/server/wifi/aware/WifiAwareDataPathStateManagerTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/aware/WifiAwareDataPathStateManagerTest.java
@@ -1213,12 +1213,12 @@
         if (doPublish) {
             sessionCaptor.getValue().publish(publishConfig, mockSessionCallback,
                     mMockLooperHandler);
-            inOrderS.verify(mockAwareService).publish(eq(clientId), eq(publishConfig),
+            inOrderS.verify(mockAwareService).publish(any(), eq(clientId), eq(publishConfig),
                     sessionProxyCallback.capture());
         } else {
             sessionCaptor.getValue().subscribe(subscribeConfig, mockSessionCallback,
                     mMockLooperHandler);
-            inOrderS.verify(mockAwareService).subscribe(eq(clientId), eq(subscribeConfig),
+            inOrderS.verify(mockAwareService).subscribe(any(), eq(clientId), eq(subscribeConfig),
                     sessionProxyCallback.capture());
         }
         sessionProxyCallback.getValue().onSessionStarted(sessionId);
diff --git a/tests/wifitests/src/com/android/server/wifi/aware/WifiAwareServiceImplTest.java b/tests/wifitests/src/com/android/server/wifi/aware/WifiAwareServiceImplTest.java
index 2d17751..a12e41f 100644
--- a/tests/wifitests/src/com/android/server/wifi/aware/WifiAwareServiceImplTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/aware/WifiAwareServiceImplTest.java
@@ -49,6 +49,7 @@
 import android.util.SparseIntArray;
 
 import com.android.server.wifi.FrameworkFacade;
+import com.android.server.wifi.util.WifiPermissionsUtil;
 import com.android.server.wifi.util.WifiPermissionsWrapper;
 
 import org.junit.Before;
@@ -72,6 +73,7 @@
 
     private WifiAwareServiceImplSpy mDut;
     private int mDefaultUid = 1500;
+    private String mPackageName = "some.package";
     private TestLooper mMockLooper;
 
     @Mock
@@ -91,6 +93,7 @@
     @Mock
     private IWifiAwareDiscoverySessionCallback mSessionCallbackMock;
     @Mock private WifiAwareMetrics mAwareMetricsMock;
+    @Mock private WifiPermissionsUtil mWifiPermissionsUtil;
     @Mock private WifiPermissionsWrapper mPermissionsWrapperMock;
     @Mock
     FrameworkFacade mFrameworkFacade;
@@ -139,7 +142,7 @@
         mDut = new WifiAwareServiceImplSpy(mContextMock);
         mDut.fakeUid = mDefaultUid;
         mDut.start(mHandlerThreadMock, mAwareStateManagerMock, mWifiAwareShellCommandMock,
-                mAwareMetricsMock, mPermissionsWrapperMock, mFrameworkFacade,
+                mAwareMetricsMock, mWifiPermissionsUtil, mPermissionsWrapperMock, mFrameworkFacade,
                 mock(WifiAwareNativeManager.class), mock(WifiAwareNativeApi.class),
                 mock(WifiAwareNativeCallback.class));
         verify(mAwareStateManagerMock).start(eq(mContextMock), any(), eq(mAwareMetricsMock),
@@ -247,7 +250,7 @@
 
         PublishConfig publishConfig = new PublishConfig.Builder().setServiceName("valid.value")
                 .build();
-        mDut.publish(clientId, publishConfig, mSessionCallbackMock);
+        mDut.publish(mPackageName, clientId, publishConfig, mSessionCallbackMock);
 
         verify(mAwareStateManagerMock).publish(clientId, publishConfig, mSessionCallbackMock);
         assertTrue("SecurityException for invalid access from wrong UID thrown", failsAsExpected);
@@ -267,7 +270,7 @@
         IWifiAwareDiscoverySessionCallback mockCallback = mock(
                 IWifiAwareDiscoverySessionCallback.class);
 
-        mDut.publish(clientId, publishConfig, mockCallback);
+        mDut.publish(mPackageName, clientId, publishConfig, mockCallback);
     }
 
     /**
@@ -284,7 +287,7 @@
         IWifiAwareDiscoverySessionCallback mockCallback = mock(
                 IWifiAwareDiscoverySessionCallback.class);
 
-        mDut.subscribe(clientId, subscribeConfig, mockCallback);
+        mDut.subscribe(mPackageName, clientId, subscribeConfig, mockCallback);
     }
 
 
@@ -351,7 +354,7 @@
         IWifiAwareDiscoverySessionCallback mockCallback = mock(
                 IWifiAwareDiscoverySessionCallback.class);
 
-        mDut.publish(clientId, publishConfig, mockCallback);
+        mDut.publish(mPackageName, clientId, publishConfig, mockCallback);
 
         verify(mAwareStateManagerMock).publish(clientId, publishConfig, mockCallback);
     }
@@ -446,7 +449,7 @@
         IWifiAwareDiscoverySessionCallback mockCallback = mock(
                 IWifiAwareDiscoverySessionCallback.class);
 
-        mDut.subscribe(clientId, subscribeConfig, mockCallback);
+        mDut.subscribe(mPackageName, clientId, subscribeConfig, mockCallback);
 
         verify(mAwareStateManagerMock).subscribe(clientId, subscribeConfig, mockCallback);
     }
@@ -632,7 +635,7 @@
         IWifiAwareDiscoverySessionCallback mockCallback = mock(
                 IWifiAwareDiscoverySessionCallback.class);
 
-        mDut.publish(clientId, publishConfig, mockCallback);
+        mDut.publish(mPackageName, clientId, publishConfig, mockCallback);
 
         verify(mAwareStateManagerMock).publish(clientId, publishConfig, mockCallback);
     }
@@ -648,7 +651,7 @@
         IWifiAwareDiscoverySessionCallback mockCallback = mock(
                 IWifiAwareDiscoverySessionCallback.class);
 
-        mDut.subscribe(clientId, subscribeConfig, mockCallback);
+        mDut.subscribe(mPackageName, clientId, subscribeConfig, mockCallback);
 
         verify(mAwareStateManagerMock).subscribe(clientId, subscribeConfig, mockCallback);
     }