Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8ac7391c authored by fionaxu's avatar fionaxu Committed by chen xu
Browse files

support carrier privilege rule for carrier id

Bug: 69807697
Bug: 72665237
Bug: 110559381
Test: Manual test
Change-Id: Ifde01bad372677432e5c302de4944bd6f86f7254
Merged-in: Ifde01bad372677432e5c302de4944bd6f86f7254
parent 2291ba21
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -79,5 +79,9 @@ message CarrierAttribute {
  // [Optional] Prefix of Integrated Circuit Card Identifier. Read from subscription EF_ICCID.
  // Sample values: 894430, 894410
  repeated string iccid_prefix = 8;

  // [Optional] Carrier Privilege Access Rule in hex string.
  // Sample values: 61ed377e85d386a8dfee6b864bd85b0bfaa5af88
  repeated string privilege_access_rule = 9;
};
+38 −22
Original line number Diff line number Diff line
@@ -344,6 +344,7 @@ public class CarrierIdentifier extends Handler {
                cursor.getString(cursor.getColumnIndexOrThrow(CarrierId.All.PLMN)),
                cursor.getString(cursor.getColumnIndexOrThrow(CarrierId.All.SPN)),
                cursor.getString(cursor.getColumnIndexOrThrow(CarrierId.All.APN)),
                cursor.getString(cursor.getColumnIndexOrThrow(CarrierId.All.PRIVILEGE_ACCESS_RULE)),
                cursor.getInt(cursor.getColumnIndexOrThrow(CarrierId.CARRIER_ID)),
                cursor.getString(cursor.getColumnIndexOrThrow(CarrierId.CARRIER_NAME)));
    }
@@ -351,7 +352,7 @@ public class CarrierIdentifier extends Handler {
    /**
     * carrier matching attributes with corresponding cid
     */
    private static class CarrierMatchingRule {
    private class CarrierMatchingRule {
        /**
         * These scores provide the hierarchical relationship between the attributes, intended to
         * resolve conflicts in a deterministic way. The scores are constructed such that a match
@@ -361,26 +362,28 @@ public class CarrierIdentifier extends Handler {
         * rule 1 {mccmnc, imsi} rule 2 {mccmnc, imsi, gid1} and rule 3 {mccmnc, imsi, gid2} all
         * matches with subscription data. rule 2 wins with the highest matching score.
         */
        private static final int SCORE_MCCMNC          = 1 << 7;
        private static final int SCORE_IMSI_PREFIX     = 1 << 6;
        private static final int SCORE_ICCID_PREFIX    = 1 << 5;
        private static final int SCORE_GID1            = 1 << 4;
        private static final int SCORE_GID2            = 1 << 3;
        private static final int SCORE_PLMN            = 1 << 2;
        private static final int SCORE_MCCMNC                   = 1 << 8;
        private static final int SCORE_IMSI_PREFIX              = 1 << 7;
        private static final int SCORE_ICCID_PREFIX             = 1 << 6;
        private static final int SCORE_GID1                     = 1 << 5;
        private static final int SCORE_GID2                     = 1 << 4;
        private static final int SCORE_PLMN                     = 1 << 3;
        private static final int SCORE_PRIVILEGE_ACCESS_RULE    = 1 << 2;
        private static final int SCORE_SPN                      = 1 << 1;
        private static final int SCORE_APN                      = 1 << 0;

        private static final int SCORE_INVALID                  = -1;

        // carrier matching attributes
        private String mMccMnc;
        private String mImsiPrefixPattern;
        private String mIccidPrefix;
        private String mGid1;
        private String mGid2;
        private String mPlmn;
        private String mSpn;
        private String mApn;
        private final String mMccMnc;
        private final String mImsiPrefixPattern;
        private final String mIccidPrefix;
        private final String mGid1;
        private final String mGid2;
        private final String mPlmn;
        private final String mSpn;
        private final String mApn;
        private final String mPrivilegeAccessRule;

        // user-facing carrier name
        private String mName;
@@ -390,8 +393,8 @@ public class CarrierIdentifier extends Handler {
        private int mScore = 0;

        CarrierMatchingRule(String mccmnc, String imsiPrefixPattern, String iccidPrefix,
                String gid1, String gid2, String plmn, String spn, String apn, int cid,
                String name) {
                String gid1, String gid2, String plmn, String spn, String apn,
                String privilegeAccessRule, int cid, String name) {
            mMccMnc = mccmnc;
            mImsiPrefixPattern = imsiPrefixPattern;
            mIccidPrefix = iccidPrefix;
@@ -400,6 +403,7 @@ public class CarrierIdentifier extends Handler {
            mPlmn = plmn;
            mSpn = spn;
            mApn = apn;
            mPrivilegeAccessRule = privilegeAccessRule;
            mCid = cid;
            mName = name;
        }
@@ -464,6 +468,16 @@ public class CarrierIdentifier extends Handler {
                }
                mScore += SCORE_SPN;
            }

            if (mPrivilegeAccessRule != null) {
                if (mUiccProfile == null || !mUiccProfile.hasCarrierPrivilegeRulesLoadedForCertHex(
                        mPrivilegeAccessRule)) {
                    mScore = SCORE_INVALID;
                    return;
                }
                mScore += SCORE_PRIVILEGE_ACCESS_RULE;
            }

            if (mApn != null) {
                if (!CarrierIdentifier.equals(subscriptionRule.mApn, mApn, true)) {
                    mScore = SCORE_INVALID;
@@ -504,6 +518,7 @@ public class CarrierIdentifier extends Handler {
                    + " imsi_prefix: " + mImsiPrefixPattern
                    + " iccid_prefix" + mIccidPrefix
                    + " spn: " + mSpn
                    + " privilege_access_rule: " + mPrivilegeAccessRule
                    + " apn: " + mApn
                    + " name: " + mName
                    + " cid: " + mCid
@@ -542,7 +557,8 @@ public class CarrierIdentifier extends Handler {
        }

        CarrierMatchingRule subscriptionRule = new CarrierMatchingRule(
                mccmnc, imsi, iccid, gid1, gid2, plmn,  spn, apn,
                mccmnc, imsi, iccid, gid1, gid2, plmn, spn, apn, null
                /** fetching privilege access rule is handled by CarrierMatchingRule#match **/,
                TelephonyManager.UNKNOWN_CARRIER_ID, null);

        int maxScore = CarrierMatchingRule.SCORE_INVALID;
+20 −0
Original line number Diff line number Diff line
@@ -1463,6 +1463,26 @@ public class UiccProfile extends IccCard {
                carrierPrivilegeRules.getCarrierPrivilegeStatusForUid(packageManager, uid);
    }

    /**
     * Match the input certificate to any loaded carrier privileges access rules.
     *
     * @param cert certificate in hex string
     * @return true if matching certificate is found. false otherwise.
     */
    public boolean hasCarrierPrivilegeRulesLoadedForCertHex(String cert) {
        UiccCarrierPrivilegeRules carrierPrivilegeRules = getCarrierPrivilegeRules();
        if (carrierPrivilegeRules != null) {
            List<UiccAccessRule> accessRules = carrierPrivilegeRules.getAccessRules();
            for (UiccAccessRule accessRule : accessRules) {
                String certHexString = accessRule.getCertificateHexString();
                if (!TextUtils.isEmpty(certHexString) && certHexString.equalsIgnoreCase(cert)) {
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * Exposes {@link UiccCarrierPrivilegeRules#getCarrierPackageNamesForIntent}.
     */
+5 −0
Original line number Diff line number Diff line
@@ -212,6 +212,7 @@ public class CarrierIdentifierTest extends TelephonyTest {
                                CarrierId.All.PLMN,
                                CarrierId.All.IMSI_PREFIX_XPATTERN,
                                CarrierId.All.ICCID_PREFIX,
                                CarrierId.All.PRIVILEGE_ACCESS_RULE,
                                CarrierId.All.SPN,
                                CarrierId.All.APN,
                                CarrierId.CARRIER_NAME,
@@ -225,6 +226,7 @@ public class CarrierIdentifierTest extends TelephonyTest {
                        null,                   // plmn
                        null,                   // imsi_prefix
                        null,                   // iccid_prefix
                        null,                   // access rule
                        null,                   // spn
                        null,                   // apn
                        NAME,                   // carrier name
@@ -238,6 +240,7 @@ public class CarrierIdentifierTest extends TelephonyTest {
                        null,                   // plmn
                        null,                   // imsi_prefix
                        null,                   // iccid_prefix
                        null,                   // access_rule
                        null,                   // spn
                        null,                   // apn
                        NAME_TMO,               // carrier name
@@ -251,6 +254,7 @@ public class CarrierIdentifierTest extends TelephonyTest {
                        null,                   // plmn
                        null,                   // imsi_prefix
                        null,                   // iccid_prefix
                        null,                   // access_rule
                        SPN_FI,                 // spn
                        null,                   // apn
                        NAME_FI,                // carrier name
@@ -264,6 +268,7 @@ public class CarrierIdentifierTest extends TelephonyTest {
                        null,                   // plmn
                        null,                   // imsi_prefix
                        null,                   // iccid_prefix
                        null,                   // access_rule
                        null,                   // spn
                        APN_DOCOMO,             // apn
                        NAME_DOCOMO,            // carrier name