16a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistpackage com.android.server.wifi.hotspot2.pps;
26a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvistimport android.util.Log;
477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
507a3f9d97394b97965e6754271fb66c1d6bd1753Jan Nordqvistimport com.android.server.wifi.SIMAccessor;
66a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport com.android.server.wifi.anqp.ANQPElement;
707f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvistimport com.android.server.wifi.anqp.CellularNetwork;
86a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport com.android.server.wifi.anqp.DomainNameElement;
96a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport com.android.server.wifi.anqp.NAIRealmElement;
106a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport com.android.server.wifi.anqp.RoamingConsortiumElement;
116a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport com.android.server.wifi.anqp.ThreeGPPNetworkElement;
1271a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvistimport com.android.server.wifi.hotspot2.AuthMatch;
1377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvistimport com.android.server.wifi.hotspot2.NetworkDetail;
146a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport com.android.server.wifi.hotspot2.PasspointMatch;
1571a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvistimport com.android.server.wifi.hotspot2.Utils;
166a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
176a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport java.util.ArrayList;
1805d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvistimport java.util.Collection;
1977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvistimport java.util.Collections;
2077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvistimport java.util.HashSet;
216a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport java.util.List;
226a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport java.util.Map;
236a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport java.util.Set;
246a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
256a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport static com.android.server.wifi.anqp.Constants.ANQPElementType;
266a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
276a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistpublic class HomeSP {
2877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    private final Map<String, Long> mSSIDs;        // SSID, HESSID, [0,N]
2971a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    private final String mFQDN;
306a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    private final DomainMatcher mDomainMatcher;
3105d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist    private final Set<String> mOtherHomePartners;
32a1edc185d46d85e04930a5e12b465de9fea64afeJan Nordqvist    private final HashSet<Long> mRoamingConsortiums;    // [0,N]
336a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    private final Set<Long> mMatchAnyOIs;           // [0,N]
346a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    private final List<Long> mMatchAllOIs;          // [0,N]
356a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
3671a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    private final Credential mCredential;
376a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
386a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    // Informational:
396a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    private final String mFriendlyName;             // [1]
406a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    private final String mIconURL;                  // [0,1]
416a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
4277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    public HomeSP(Map<String, Long> ssidMap,
436a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                   /*@NotNull*/ String fqdn,
44a1edc185d46d85e04930a5e12b465de9fea64afeJan Nordqvist                   /*@NotNull*/ HashSet<Long> roamingConsortiums,
456a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                   /*@NotNull*/ Set<String> otherHomePartners,
466a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                   /*@NotNull*/ Set<Long> matchAnyOIs,
476a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                   /*@NotNull*/ List<Long> matchAllOIs,
486a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                   String friendlyName,
496a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                   String iconURL,
5071a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                   Credential credential) {
516a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
526a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        mSSIDs = ssidMap;
53c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist        List<List<String>> otherPartners = new ArrayList<>(otherHomePartners.size());
546a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        for (String otherPartner : otherHomePartners) {
5571a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist            otherPartners.add(Utils.splitDomain(otherPartner));
566a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        }
5705d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist        mOtherHomePartners = otherHomePartners;
5871a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mFQDN = fqdn;
5971a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mDomainMatcher = new DomainMatcher(Utils.splitDomain(fqdn), otherPartners);
606a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        mRoamingConsortiums = roamingConsortiums;
616a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        mMatchAnyOIs = matchAnyOIs;
626a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        mMatchAllOIs = matchAllOIs;
636a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        mFriendlyName = friendlyName;
646a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        mIconURL = iconURL;
6571a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mCredential = credential;
666a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    }
676a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
68820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist    public HomeSP getClone(String password) {
69820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist        if (getCredential().hasDisregardPassword()) {
70820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist            return new HomeSP(mSSIDs,
71820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist                    mFQDN,
72820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist                    mRoamingConsortiums,
73820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist                    mOtherHomePartners,
74820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist                    mMatchAnyOIs,
75820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist                    mMatchAllOIs,
76820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist                    mFriendlyName,
77820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist                    mIconURL,
78820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist                    new Credential(mCredential, password));
79820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist        }
80820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist        else {
81820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist            return this;
82820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist        }
83820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist    }
84820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist
8577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    public PasspointMatch match(NetworkDetail networkDetail,
86a1edc185d46d85e04930a5e12b465de9fea64afeJan Nordqvist                                Map<ANQPElementType, ANQPElement> anqpElementMap,
8707a3f9d97394b97965e6754271fb66c1d6bd1753Jan Nordqvist                                SIMAccessor simAccessor) {
886a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
8907f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist        List<String> imsis = simAccessor.getMatchingImsis(mCredential.getImsi());
90866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist
9107f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist        PasspointMatch spMatch = matchSP(networkDetail, anqpElementMap, imsis);
92866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist
93c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist        if (spMatch == PasspointMatch.Incomplete || spMatch == PasspointMatch.Declined) {
9407f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist            return spMatch;
95866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist        }
9607f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist
9707f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist        if (imsiMatch(imsis, (ThreeGPPNetworkElement)
9807f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist                anqpElementMap.get(ANQPElementType.ANQP3GPPNetwork)) != null) {
99c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist            // PLMN match, promote sp match to roaming if necessary.
100c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist            return spMatch == PasspointMatch.None ? PasspointMatch.RoamingProvider : spMatch;
101866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist        }
10207f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist
10307f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist        NAIRealmElement naiRealmElement =
10407f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist                (NAIRealmElement) anqpElementMap.get(ANQPElementType.ANQPNAIRealm);
10507f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist
106c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist        int authMatch = naiRealmElement != null ?
107c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist                naiRealmElement.match(mCredential) :
108c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist                AuthMatch.Indeterminate;
109c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist
11007f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist        Log.d(Utils.hs2LogTag(getClass()), networkDetail.toKeyString() + " match on " + mFQDN +
111c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist                ": " + spMatch + ", auth " + AuthMatch.toString(authMatch));
112c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist
113c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist        if (authMatch == AuthMatch.None) {
114c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist            // Distinct auth mismatch, demote authentication.
115c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist            return PasspointMatch.None;
116c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist        }
117c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist        else if ((authMatch & AuthMatch.Realm) == 0) {
118c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist            // No realm match, return sp match as is.
119c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist            return spMatch;
120c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist        }
121c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist        else {
122c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist            // Realm match, promote sp match to roaming if necessary.
123c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist            return spMatch == PasspointMatch.None ? PasspointMatch.RoamingProvider : spMatch;
124c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist        }
125866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist    }
126866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist
127866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist    public PasspointMatch matchSP(NetworkDetail networkDetail,
128866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist                                Map<ANQPElementType, ANQPElement> anqpElementMap,
12907f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist                                List<String> imsis) {
130866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist
13177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        if (mSSIDs.containsKey(networkDetail.getSSID())) {
13277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist            Long hessid = mSSIDs.get(networkDetail.getSSID());
13377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist            if (hessid == null || networkDetail.getHESSID() == hessid) {
1341c03d75c73b9f5fa24a795a0d546f4f56b82ab9bJan Nordqvist                Log.d(Utils.hs2LogTag(getClass()), "match SSID");
1356a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                return PasspointMatch.HomeProvider;
1366a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist            }
1376a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        }
1386a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
13903a529ae85d526110f2a715168739618f0775493Jan Nordqvist        Set<Long> anOIs = new HashSet<>();
1406a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
14177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        if (networkDetail.getRoamingConsortiums() != null) {
14277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist            for (long oi : networkDetail.getRoamingConsortiums()) {
14377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist                anOIs.add(oi);
1446a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist            }
1456a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        }
14677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        RoamingConsortiumElement rcElement = anqpElementMap != null ?
14777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist                (RoamingConsortiumElement) anqpElementMap.get(ANQPElementType.ANQPRoamingConsortium)
14877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist                : null;
14977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        if (rcElement != null) {
15077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist            anOIs.addAll(rcElement.getOIs());
1516a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        }
1526a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
153866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist        // It may seem reasonable to check for home provider match prior to checking for roaming
154866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist        // relationship, but it is possible to avoid an ANQP query if it turns out that the
155866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist        // "match all" rule fails based only on beacon info only.
156866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist        boolean roamingMatch = false;
15771a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist
15877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        if (!mMatchAllOIs.isEmpty()) {
15977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist            boolean matchesAll = true;
16077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
16177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist            for (long spOI : mMatchAllOIs) {
16277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist                if (!anOIs.contains(spOI)) {
16377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist                    matchesAll = false;
16477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist                    break;
1656a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                }
1666a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist            }
16777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist            if (matchesAll) {
168866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist                roamingMatch = true;
16977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist            }
17077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist            else {
17177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist                if (anqpElementMap != null || networkDetail.getAnqpOICount() == 0) {
17277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist                    return PasspointMatch.Declined;
17377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist                }
17477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist                else {
17577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist                    return PasspointMatch.Incomplete;
1766a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                }
1776a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist            }
1786a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        }
1796a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
180866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist        if (!roamingMatch &&
18177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist                (!Collections.disjoint(mMatchAnyOIs, anOIs) ||
18277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist                        !Collections.disjoint(mRoamingConsortiums, anOIs))) {
183866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist            roamingMatch = true;
18477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        }
18577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
1866a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        if (anqpElementMap == null) {
1876a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist            return PasspointMatch.Incomplete;
1886a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        }
1896a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
1906a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        DomainNameElement domainNameElement =
1916a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                (DomainNameElement) anqpElementMap.get(ANQPElementType.ANQPDomName);
1926a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
1936a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        if (domainNameElement != null) {
1946a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist            for (String domain : domainNameElement.getDomains()) {
19577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist                List<String> anLabels = Utils.splitDomain(domain);
19677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist                DomainMatcher.Match match = mDomainMatcher.isSubDomain(anLabels);
1976a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                if (match != DomainMatcher.Match.None) {
1986a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                    return PasspointMatch.HomeProvider;
1996a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                }
200a1edc185d46d85e04930a5e12b465de9fea64afeJan Nordqvist
20107f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist                if (imsiMatch(imsis, anLabels) != null) {
20207a3f9d97394b97965e6754271fb66c1d6bd1753Jan Nordqvist                    return PasspointMatch.HomeProvider;
20377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist                }
2046a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist            }
2056a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        }
2066a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
207866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist        return roamingMatch ? PasspointMatch.RoamingProvider : PasspointMatch.None;
2086a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    }
2096a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
21007f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist    private String imsiMatch(List<String> imsis, ThreeGPPNetworkElement plmnElement) {
21107f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist        if (imsis == null || plmnElement == null || plmnElement.getPlmns().isEmpty()) {
21207f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist            return null;
21307f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist        }
21407f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist        for (CellularNetwork network : plmnElement.getPlmns()) {
21507f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist            for (String mccMnc : network) {
21607f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist                String imsi = imsiMatch(imsis, mccMnc);
21707f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist                if (imsi != null) {
21807f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist                    return imsi;
21907f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist                }
22007f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist            }
22107f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist        }
22207f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist        return null;
22307f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist    }
22407f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist
22507f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist    private String imsiMatch(List<String> imsis, List<String> fqdn) {
22607f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist        if (imsis == null) {
22707f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist            return null;
22807f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist        }
22907f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist        String mccMnc = Utils.getMccMnc(fqdn);
23007f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist        return mccMnc != null ? imsiMatch(imsis, mccMnc) : null;
23107f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist    }
23207f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist
23307f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist    private String imsiMatch(List<String> imsis, String mccMnc) {
23407f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist        if (mCredential.getImsi().matchesMccMnc(mccMnc)) {
23507f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist            for (String imsi : imsis) {
23607f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist                if (imsi.startsWith(mccMnc)) {
23707f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist                    return imsi;
23807f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist                }
23907f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist            }
24007f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist        }
24107f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist        return null;
24207f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist    }
24307f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist
24403e92b925a595a1a467290a2d54ca2602cce9b9eVinit Deshpande    public String getFQDN() { return mFQDN; }
24503e92b925a595a1a467290a2d54ca2602cce9b9eVinit Deshpande    public String getFriendlyName() { return mFriendlyName; }
246a1edc185d46d85e04930a5e12b465de9fea64afeJan Nordqvist    public HashSet<Long> getRoamingConsortiums() { return mRoamingConsortiums; }
24703e92b925a595a1a467290a2d54ca2602cce9b9eVinit Deshpande    public Credential getCredential() { return mCredential; }
2486a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
24905d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist    public Map<String, Long> getSSIDs() {
25005d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist        return mSSIDs;
25105d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist    }
25205d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist
25305d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist    public Collection<String> getOtherHomePartners() {
25405d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist        return mOtherHomePartners;
25505d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist    }
25605d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist
25705d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist    public Set<Long> getMatchAnyOIs() {
25805d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist        return mMatchAnyOIs;
25905d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist    }
26005d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist
26105d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist    public List<Long> getMatchAllOIs() {
26205d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist        return mMatchAllOIs;
26305d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist    }
26405d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist
26505d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist    public String getIconURL() {
26605d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist        return mIconURL;
26705d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist    }
26805d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist
26905d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist    public boolean deepEquals(HomeSP other) {
27005d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist        return mFQDN.equals(other.mFQDN) &&
27105d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist                mSSIDs.equals(other.mSSIDs) &&
27205d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist                mOtherHomePartners.equals(other.mOtherHomePartners) &&
27305d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist                mRoamingConsortiums.equals(other.mRoamingConsortiums) &&
27405d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist                mMatchAnyOIs.equals(other.mMatchAnyOIs) &&
27505d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist                mMatchAllOIs.equals(other.mMatchAllOIs) &&
27605d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist                mFriendlyName.equals(other.mFriendlyName) &&
27705d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist                Utils.compare(mIconURL, other.mIconURL) == 0 &&
27805d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist                mCredential.equals(other.mCredential);
27905d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist    }
28005d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist
28171a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    @Override
28271a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    public boolean equals(Object thatObject) {
28371a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        if (this == thatObject) {
28471a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist            return true;
28571a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        } else if (thatObject == null || getClass() != thatObject.getClass()) {
28671a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist            return false;
2876a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        }
2886a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
28971a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        HomeSP that = (HomeSP) thatObject;
29071a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        return mFQDN.equals(that.mFQDN);
29171a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    }
29271a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist
29371a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    @Override
29471a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    public int hashCode() {
29571a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        return mFQDN.hashCode();
29671a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    }
29771a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist
29871a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    @Override
29971a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    public String toString() {
30071a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        return "HomeSP{" +
30171a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                "mSSIDs=" + mSSIDs +
30271a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                ", mFQDN='" + mFQDN + '\'' +
30371a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                ", mDomainMatcher=" + mDomainMatcher +
30471a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                ", mRoamingConsortiums={" + Utils.roamingConsortiumsToString(mRoamingConsortiums) +
30571a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                '}' +
30671a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                ", mMatchAnyOIs={" + Utils.roamingConsortiumsToString(mMatchAnyOIs) + '}' +
30771a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                ", mMatchAllOIs={" + Utils.roamingConsortiumsToString(mMatchAllOIs) + '}' +
30871a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                ", mCredential=" + mCredential +
30971a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                ", mFriendlyName='" + mFriendlyName + '\'' +
31071a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                ", mIconURL='" + mIconURL + '\'' +
31171a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                '}';
3126a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    }
3136a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist}
314