summaryrefslogtreecommitdiff
path: root/service
diff options
context:
space:
mode:
authorTreeHugger Robot <treehugger-gerrit@google.com>2017-06-06 23:42:17 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2017-06-06 23:42:18 +0000
commit2fd51661e2e6a50e7d1de53ab590114d9f4e6789 (patch)
treec55332595ec1abfd699a736fbad04d7ec9c8f20d /service
parent2d02c0b588eb19935ad87b8dae9d6a9839e667c2 (diff)
parent159f2184beb39cfe0d786105cc69e54265747e56 (diff)
Merge "[AWARE] Enforce permissions for Aware data-path PMK usage"
Diffstat (limited to 'service')
-rw-r--r--service/java/com/android/server/wifi/aware/WifiAwareDataPathStateManager.java23
-rw-r--r--service/java/com/android/server/wifi/aware/WifiAwareService.java3
-rw-r--r--service/java/com/android/server/wifi/aware/WifiAwareServiceImpl.java7
-rw-r--r--service/java/com/android/server/wifi/aware/WifiAwareStateManager.java7
4 files changed, 32 insertions, 8 deletions
diff --git a/service/java/com/android/server/wifi/aware/WifiAwareDataPathStateManager.java b/service/java/com/android/server/wifi/aware/WifiAwareDataPathStateManager.java
index e8d9c71bf..d1f009a8d 100644
--- a/service/java/com/android/server/wifi/aware/WifiAwareDataPathStateManager.java
+++ b/service/java/com/android/server/wifi/aware/WifiAwareDataPathStateManager.java
@@ -16,7 +16,9 @@
package com.android.server.wifi.aware;
+import android.Manifest;
import android.content.Context;
+import android.content.pm.PackageManager;
import android.hardware.wifi.V1_0.NanDataPathChannelCfg;
import android.net.ConnectivityManager;
import android.net.IpPrefix;
@@ -40,6 +42,7 @@ import android.util.ArrayMap;
import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.wifi.util.WifiPermissionsWrapper;
import libcore.util.HexEncoding;
@@ -85,6 +88,7 @@ public class WifiAwareDataPathStateManager {
mNetworkRequestsCache = new ArrayMap<>();
private Context mContext;
private WifiAwareMetrics mAwareMetrics;
+ private WifiPermissionsWrapper mPermissionsWrapper;
private Looper mLooper;
private WifiAwareNetworkFactory mNetworkFactory;
private INetworkManagementService mNwService;
@@ -97,11 +101,13 @@ public class WifiAwareDataPathStateManager {
* Initialize the Aware data-path state manager. Specifically register the network factory with
* connectivity service.
*/
- public void start(Context context, Looper looper, WifiAwareMetrics awareMetrics) {
+ public void start(Context context, Looper looper, WifiAwareMetrics awareMetrics,
+ WifiPermissionsWrapper permissionsWrapper) {
if (VDBG) Log.v(TAG, "start");
mContext = context;
mAwareMetrics = awareMetrics;
+ mPermissionsWrapper = permissionsWrapper;
mLooper = looper;
mNetworkCapabilitiesFilter.clearAll();
@@ -600,7 +606,8 @@ public class WifiAwareDataPathStateManager {
return true;
}
- nnri = AwareNetworkRequestInformation.processNetworkSpecifier(networkSpecifier, mMgr);
+ nnri = AwareNetworkRequestInformation.processNetworkSpecifier(networkSpecifier, mMgr,
+ mPermissionsWrapper);
if (nnri == null) {
Log.e(TAG, "WifiAwareNetworkFactory.acceptRequest: request=" + request
+ " - can't parse network specifier");
@@ -824,7 +831,7 @@ public class WifiAwareDataPathStateManager {
public WifiAwareNetworkAgent networkAgent;
static AwareNetworkRequestInformation processNetworkSpecifier(WifiAwareNetworkSpecifier ns,
- WifiAwareStateManager mgr) {
+ WifiAwareStateManager mgr, WifiPermissionsWrapper permissionWrapper) {
int uid, pubSubId = 0;
byte[] peerMac = ns.peerMac;
@@ -917,6 +924,16 @@ public class WifiAwareDataPathStateManager {
return null;
}
+ // validate permission if PMK is used (SystemApi)
+ if (ns.pmk != null && ns.pmk.length != 0) {
+ if (permissionWrapper.getUidPermission(Manifest.permission.CONNECTIVITY_INTERNAL,
+ ns.requestorUid) != PackageManager.PERMISSION_GRANTED) {
+ Log.e(TAG, "processNetworkSpecifier: networkSpecifier=" + ns.toString()
+ + " -- UID doesn't have permission to use PMK API");
+ return null;
+ }
+ }
+
// create container and populate
AwareNetworkRequestInformation nnri = new AwareNetworkRequestInformation();
nnri.state = (ns.role == WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_INITIATOR)
diff --git a/service/java/com/android/server/wifi/aware/WifiAwareService.java b/service/java/com/android/server/wifi/aware/WifiAwareService.java
index 8c405dd63..40baf7eed 100644
--- a/service/java/com/android/server/wifi/aware/WifiAwareService.java
+++ b/service/java/com/android/server/wifi/aware/WifiAwareService.java
@@ -68,7 +68,8 @@ public final class WifiAwareService extends SystemService {
HandlerThread awareHandlerThread = wifiInjector.getWifiAwareHandlerThread();
mImpl.start(awareHandlerThread, wifiAwareStateManager, wifiAwareShellCommand,
- wifiInjector.getWifiMetrics().getWifiAwareMetrics());
+ wifiInjector.getWifiMetrics().getWifiAwareMetrics(),
+ wifiInjector.getWifiPermissionsWrapper());
} else if (phase == SystemService.PHASE_BOOT_COMPLETED) {
mImpl.startLate();
}
diff --git a/service/java/com/android/server/wifi/aware/WifiAwareServiceImpl.java b/service/java/com/android/server/wifi/aware/WifiAwareServiceImpl.java
index ed7390cf6..b77ae6355 100644
--- a/service/java/com/android/server/wifi/aware/WifiAwareServiceImpl.java
+++ b/service/java/com/android/server/wifi/aware/WifiAwareServiceImpl.java
@@ -38,6 +38,8 @@ import android.util.Log;
import android.util.SparseArray;
import android.util.SparseIntArray;
+import com.android.server.wifi.util.WifiPermissionsWrapper;
+
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.Arrays;
@@ -81,12 +83,13 @@ public class WifiAwareServiceImpl extends IWifiAwareManager.Stub {
* the components of the service.
*/
public void start(HandlerThread handlerThread, WifiAwareStateManager awareStateManager,
- WifiAwareShellCommand awareShellCommand, WifiAwareMetrics awareMetrics) {
+ WifiAwareShellCommand awareShellCommand, WifiAwareMetrics awareMetrics,
+ WifiPermissionsWrapper permissionsWrapper) {
Log.i(TAG, "Starting Wi-Fi Aware service");
mStateManager = awareStateManager;
mShellCommand = awareShellCommand;
- mStateManager.start(mContext, handlerThread.getLooper(), awareMetrics);
+ mStateManager.start(mContext, handlerThread.getLooper(), awareMetrics, permissionsWrapper);
}
/**
diff --git a/service/java/com/android/server/wifi/aware/WifiAwareStateManager.java b/service/java/com/android/server/wifi/aware/WifiAwareStateManager.java
index 01e303a7b..671b99e1e 100644
--- a/service/java/com/android/server/wifi/aware/WifiAwareStateManager.java
+++ b/service/java/com/android/server/wifi/aware/WifiAwareStateManager.java
@@ -48,6 +48,7 @@ import com.android.internal.util.MessageUtils;
import com.android.internal.util.State;
import com.android.internal.util.StateMachine;
import com.android.internal.util.WakeupMessage;
+import com.android.server.wifi.util.WifiPermissionsWrapper;
import libcore.util.HexEncoding;
@@ -320,7 +321,8 @@ public class WifiAwareStateManager implements WifiAwareShellCommand.DelegatedShe
*
* @param looper Thread looper on which to run the handler.
*/
- public void start(Context context, Looper looper, WifiAwareMetrics awareMetrics) {
+ public void start(Context context, Looper looper, WifiAwareMetrics awareMetrics,
+ WifiPermissionsWrapper permissionsWrapper) {
Log.i(TAG, "start()");
mContext = context;
@@ -331,7 +333,8 @@ public class WifiAwareStateManager implements WifiAwareShellCommand.DelegatedShe
mRtt = new WifiAwareRttStateManager();
mDataPathMgr = new WifiAwareDataPathStateManager(this);
- mDataPathMgr.start(mContext, mSm.getHandler().getLooper(), awareMetrics);
+ mDataPathMgr.start(mContext, mSm.getHandler().getLooper(), awareMetrics,
+ permissionsWrapper);
mPowerManager = mContext.getSystemService(PowerManager.class);