Allow requestNetworkScan to return sanitized info

If an app doesn't have location permissions or if the system location
switch is off, allow requestNetworkScan to still function, but sanitize
the returned CellInfo objects first and disallow certain input arguments

Bug: 126779616
Test: CTS
Change-Id: Ic9c44043bd30d402f128bf0723f2b0bf6c420e3e
This commit is contained in:
Hall Liu
2019-02-28 15:29:19 -08:00
parent dedc27142d
commit c9d7430685
16 changed files with 141 additions and 3 deletions

View File

@@ -109,6 +109,22 @@ public abstract class CellIdentity implements Parcelable {
return mType;
}
/**
* @return MCC or null for CDMA
* @hide
*/
public String getMccString() {
return mMccStr;
}
/**
* @return MNC or null for CDMA
* @hide
*/
public String getMncString() {
return mMncStr;
}
/**
* Returns the channel number of the cell identity.
*

View File

@@ -109,6 +109,13 @@ public final class CellIdentityCdma extends CellIdentity {
return new CellIdentityCdma(this);
}
/** @hide */
public CellIdentityCdma sanitizeLocationInfo() {
return new CellIdentityCdma(CellInfo.UNAVAILABLE, CellInfo.UNAVAILABLE,
CellInfo.UNAVAILABLE, CellInfo.UNAVAILABLE, CellInfo.UNAVAILABLE,
mAlphaLong, mAlphaShort);
}
/**
* Take the latitude and longitude in 1/4 seconds and see if
* the reported location is on Null Island.

View File

@@ -97,6 +97,12 @@ public final class CellIdentityGsm extends CellIdentity {
return new CellIdentityGsm(this);
}
/** @hide */
public CellIdentityGsm sanitizeLocationInfo() {
return new CellIdentityGsm(CellInfo.UNAVAILABLE, CellInfo.UNAVAILABLE, CellInfo.UNAVAILABLE,
CellInfo.UNAVAILABLE, mMccStr, mMncStr, mAlphaLong, mAlphaShort);
}
/**
* @return 3-digit Mobile Country Code, 0..999,
* {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} if unavailable.

View File

@@ -113,6 +113,13 @@ public final class CellIdentityLte extends CellIdentity {
cid.mMncStr, cid.mAlphaLong, cid.mAlphaShort);
}
/** @hide */
public CellIdentityLte sanitizeLocationInfo() {
return new CellIdentityLte(CellInfo.UNAVAILABLE, CellInfo.UNAVAILABLE, CellInfo.UNAVAILABLE,
CellInfo.UNAVAILABLE, CellInfo.UNAVAILABLE,
mMccStr, mMncStr, mAlphaLong, mAlphaShort);
}
CellIdentityLte copy() {
return new CellIdentityLte(this);
}

View File

@@ -46,7 +46,7 @@ public final class CellIdentityNr extends CellIdentity {
*
* @hide
*/
public CellIdentityNr(int pci, int tac, int nrArfcn, String mccStr, String mncStr,
public CellIdentityNr(int pci, int tac, int nrArfcn, String mccStr, String mncStr,
long nci, String alphal, String alphas) {
super(TAG, CellInfo.TYPE_NR, mccStr, mncStr, alphal, alphas);
mPci = pci;
@@ -55,6 +55,12 @@ public final class CellIdentityNr extends CellIdentity {
mNci = nci;
}
/** @hide */
public CellIdentityNr sanitizeLocationInfo() {
return new CellIdentityNr(CellInfo.UNAVAILABLE, CellInfo.UNAVAILABLE, CellInfo.UNAVAILABLE,
mMccStr, mMncStr, CellInfo.UNAVAILABLE, mAlphaLong, mAlphaShort);
}
/**
* @return a CellLocation object for this CellIdentity.
* @hide

View File

@@ -90,6 +90,12 @@ public final class CellIdentityTdscdma extends CellIdentity {
cid.uarfcn, cid.operatorNames.alphaLong, cid.operatorNames.alphaShort);
}
/** @hide */
public CellIdentityTdscdma sanitizeLocationInfo() {
return new CellIdentityTdscdma(mMccStr, mMncStr, CellInfo.UNAVAILABLE, CellInfo.UNAVAILABLE,
CellInfo.UNAVAILABLE, CellInfo.UNAVAILABLE, mAlphaLong, mAlphaShort);
}
CellIdentityTdscdma copy() {
return new CellIdentityTdscdma(this);
}

View File

@@ -91,6 +91,13 @@ public final class CellIdentityWcdma extends CellIdentity {
cid.mMncStr, cid.mAlphaLong, cid.mAlphaShort);
}
/** @hide */
public CellIdentityWcdma sanitizeLocationInfo() {
return new CellIdentityWcdma(CellInfo.UNAVAILABLE, CellInfo.UNAVAILABLE,
CellInfo.UNAVAILABLE, CellInfo.UNAVAILABLE, mMccStr, mMncStr,
mAlphaLong, mAlphaShort);
}
CellIdentityWcdma copy() {
return new CellIdentityWcdma(this);
}

View File

@@ -197,6 +197,11 @@ public abstract class CellInfo implements Parcelable {
@NonNull
public abstract CellSignalStrength getCellSignalStrength();
/** @hide */
public CellInfo sanitizeLocationInfo() {
return null;
}
/**
* Gets the connection status of this cell.
*

View File

@@ -90,6 +90,15 @@ public final class CellInfoCdma extends CellInfo implements Parcelable {
public CellSignalStrengthCdma getCellSignalStrength() {
return mCellSignalStrengthCdma;
}
/** @hide */
@Override
public CellInfo sanitizeLocationInfo() {
CellInfoCdma result = new CellInfoCdma(this);
result.mCellIdentityCdma = mCellIdentityCdma.sanitizeLocationInfo();
return result;
}
/** @hide */
public void setCellSignalStrength(CellSignalStrengthCdma css) {
mCellSignalStrengthCdma = css;

View File

@@ -84,6 +84,15 @@ public final class CellInfoGsm extends CellInfo implements Parcelable {
public CellSignalStrengthGsm getCellSignalStrength() {
return mCellSignalStrengthGsm;
}
/** @hide */
@Override
public CellInfo sanitizeLocationInfo() {
CellInfoGsm result = new CellInfoGsm(this);
result.mCellIdentityGsm = mCellIdentityGsm.sanitizeLocationInfo();
return result;
}
/** @hide */
public void setCellSignalStrength(CellSignalStrengthGsm css) {
mCellSignalStrengthGsm = css;

View File

@@ -96,6 +96,15 @@ public final class CellInfoLte extends CellInfo implements Parcelable {
if (DBG) log("getCellSignalStrength: " + mCellSignalStrengthLte);
return mCellSignalStrengthLte;
}
/** @hide */
@Override
public CellInfo sanitizeLocationInfo() {
CellInfoLte result = new CellInfoLte(this);
result.mCellIdentityLte = mCellIdentityLte.sanitizeLocationInfo();
return result;
}
/** @hide */
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
public void setCellSignalStrength(CellSignalStrengthLte css) {

View File

@@ -36,6 +36,13 @@ public final class CellInfoNr extends CellInfo {
mCellSignalStrength = CellSignalStrengthNr.CREATOR.createFromParcel(in);
}
private CellInfoNr(CellInfoNr other, boolean sanitizeLocationInfo) {
super(other);
mCellIdentity = sanitizeLocationInfo ? other.mCellIdentity.sanitizeLocationInfo()
: other.mCellIdentity;
mCellSignalStrength = other.mCellSignalStrength;
}
@Override
@NonNull
public CellIdentity getCellIdentity() {
@@ -48,6 +55,12 @@ public final class CellInfoNr extends CellInfo {
return mCellSignalStrength;
}
/** @hide */
@Override
public CellInfo sanitizeLocationInfo() {
return new CellInfoNr(this, true);
}
@Override
public int hashCode() {
return Objects.hash(super.hashCode(), mCellIdentity, mCellSignalStrength);

View File

@@ -90,6 +90,14 @@ public final class CellInfoTdscdma extends CellInfo implements Parcelable {
return mCellSignalStrengthTdscdma;
}
/** @hide */
@Override
public CellInfo sanitizeLocationInfo() {
CellInfoTdscdma result = new CellInfoTdscdma(this);
result.mCellIdentityTdscdma = mCellIdentityTdscdma.sanitizeLocationInfo();
return result;
}
/** @hide */
public void setCellSignalStrength(CellSignalStrengthTdscdma css) {
mCellSignalStrengthTdscdma = css;

View File

@@ -84,6 +84,15 @@ public final class CellInfoWcdma extends CellInfo implements Parcelable {
public CellSignalStrengthWcdma getCellSignalStrength() {
return mCellSignalStrengthWcdma;
}
/** @hide */
@Override
public CellInfo sanitizeLocationInfo() {
CellInfoWcdma result = new CellInfoWcdma(this);
result.mCellIdentityWcdma = mCellIdentityWcdma.sanitizeLocationInfo();
return result;
}
/** @hide */
public void setCellSignalStrength(CellSignalStrengthWcdma css) {
mCellSignalStrengthWcdma = css;

View File

@@ -6869,6 +6869,17 @@ public class TelephonyManager {
* app has carrier privileges (see {@link #hasCarrierPrivileges})
* and {@link android.Manifest.permission#ACCESS_FINE_LOCATION}.
*
* If the system-wide location switch is off, apps may still call this API, with the
* following constraints:
* <ol>
* <li>The app must hold the {@code android.permission.NETWORK_SCAN} permission.</li>
* <li>The app must not supply any specific bands or channels to scan.</li>
* <li>The app must only specify MCC/MNC pairs that are
* associated to a SIM in the device.</li>
* <li>Returned results will have no meaningful info other than signal strength
* and MCC/MNC info.</li>
* </ol>
*
* @param request Contains all the RAT with bands/channels that need to be scanned.
* @param executor The executor through which the callback should be invoked. Since the scan
* request may trigger multiple callbacks and they must be invoked in the same order as

View File

@@ -53,6 +53,11 @@ public final class TelephonyScanManager {
public static final int CALLBACK_SCAN_ERROR = 2;
/** @hide */
public static final int CALLBACK_SCAN_COMPLETE = 3;
/** @hide */
public static final int CALLBACK_RESTRICTED_SCAN_RESULTS = 4;
/** @hide */
public static final int INVALID_SCAN_ID = -1;
/**
* The caller of
@@ -129,6 +134,7 @@ public final class TelephonyScanManager {
}
switch (message.what) {
case CALLBACK_RESTRICTED_SCAN_RESULTS:
case CALLBACK_SCAN_RESULTS:
try {
final Bundle b = message.getData();
@@ -137,9 +143,9 @@ public final class TelephonyScanManager {
for (int i = 0; i < parcelables.length; i++) {
ci[i] = (CellInfo) parcelables[i];
}
executor.execute(() ->{
executor.execute(() -> {
Rlog.d(TAG, "onResults: " + ci.toString());
callback.onResults((List<CellInfo>) Arrays.asList(ci));
callback.onResults(Arrays.asList(ci));
});
} catch (Exception e) {
Rlog.e(TAG, "Exception in networkscan callback onResults", e);
@@ -200,6 +206,10 @@ public final class TelephonyScanManager {
if (telephony != null) {
int scanId = telephony.requestNetworkScan(
subId, request, mMessenger, new Binder(), callingPackage);
if (scanId == INVALID_SCAN_ID) {
Rlog.e(TAG, "Failed to initiate network scan");
return null;
}
saveScanInfo(scanId, request, executor, callback);
return new NetworkScan(scanId, subId);
}