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