Otkrivanje aktivnog VPN-a u sandbox Mac aplikaciji
Za ovo pitanje ne postoji javni API, a trik s imenom interfejsa je samo heuristika. Šest provera da odlučite na šta vaša aplikacija zaista treba da se osloni.
Potreban vam je jedan ekran koji se ponaša drugačije kada je tunel aktivan, a nema poziva koji vam to kaže. To je ograničenje pri isporuci: na macOS-u nijedan javni okvir ne izveštava da li je proizvoljan VPN povezan, a na iOS-u status pripada aplikaciji koja je instalirala konfiguraciju. Provere ispod vode od te granice do nečega što možete isporučiti, i svaka od njih može rano završiti pretragu.
Provera 1: može li se na pitanje uopšte odgovoriti?
Sandbox rešava pitanje pre bilo kog API-ja. Proces treće strane ne može da nabroji ekstenziju drugog dobavljača niti može da pročita konfiguraciju te ekstenzije, pa nema podržanog objekta koji se može pitati.
Svaki zaobilazni put udara u isti zid. Liste interfejsa, scutil --nc list i direktna čitanja sistemske konfiguracije ili zahtevaju ovlašćenja koja sandbox uskraćuje ili zavise od ponašanja koje Apple nikada nije obećao. Ako planu treba nešto od toga, problem je u planu. Funkcija izgrađena na nedokumentovanom detalju je zahtev za podršku s datumom isporuke.
Provera 2: da li vaša aplikacija sama upravlja tunelom?
Ako upravlja, imate podržan odgovor za sopstvenu konfiguraciju. Učitajte postavke, obradite grešku, zatim pročitajte status i pretplatite se na promene umesto anketiranja:
vpnManager.loadFromPreferences { error in
// handle a load failure before reading status
}
NotificationCenter.default.addObserver(
forName: .NEVPNStatusDidChange,
object: nil,
queue: nil
) { note in
let status = (note.object as? NEVPNConnection)?.status
}Budite precizni oko toga šta ovo vraća: stanje tunela koji ste instalirali. Korisnik koji pokreće drugi klijent biće prikazan kao nepovezan, i to nije greška u vašem kodu. Odlučite koje od ta dva pitanja vaša funkcija zaista postavlja pre nego što gradite na odgovoru.
Provera 3: šta bi vam heuristika zapravo rekla?
Široko kopiran pristup pita sistemski rečnik proxyja za njegove obuhvaćene unose i čita ključeve, koji su slučajno imena interfejsa:
let settings = CFNetworkCopySystemProxySettings()?.takeRetainedValue() as NSDictionary?
let scoped = settings?["__SCOPED__"] as? [String: Any]
let names = scoped?.keys ?? []Ključ koji počinje sa tap, tun, ppp, ipsec ili utun implicira da je prisutan interfejs obuhvaćen tunelom. Podudaranje celog imena odmah pada, jer je iOS 12 isporučen sa utun1 i utun2, a neki profili se pojavljuju kao ipsec4, ppp0 ili utun0. Umesto toga uporedite prefikse.
Ipak, ime ne identifikuje vlasnika. Sistemske funkcije i ekstenzije drugih dobavljača takođe stvaraju utun interfejse, a jedan može postojati dok ne nosi ništa od vašeg saobraćaja. Čitajte to kao nagoveštaj da je u blizini nešto u obliku tunela, ništa više. Lažno pozitivan rezultat ovde je jeftin ako ograničavate samo jednu funkciju, a skup ako ograničavate ekran za prijavu.
Provera 4: možete li umesto toga da testirate odredište?
Ako aplikacija samo treba da zna da li je interna usluga dostupna, testirajte tu uslugu. Kratka sonda s vremenskim ograničenjem odgovara na pitanje od kojeg funkcija zaista zavisi, i nastavlja da radi kada korisnik promeni klijenta ili tunel promeni oblik.
Dostupnost je zapažanje o vašoj putanji. Ime interfejsa je zaključak o nečemu što graniči s vašom putanjom, zato heuristika stvara rasprave u izveštajima o greškama, a sonda stvara dokaze. Ako sonda ne uspe dok korisnik tvrdi da je VPN uključen, sada imate konkretnu putanju za otklanjanje grešaka: razrešavanje imena, rutu ili dozvolu usluge.
Provera 5: može li platforma da nametne ono što vam treba?
Kada je zahtev garancija da ništa ne izlazi iz tunela, profil je pravo mesto za to, a ne detektor. Uključivanje includeAllNetworks u konfiguraciji punog tunela na iOS 14 ili novijem menja ponašanje platforme umesto da traži od vaše aplikacije da to zaključi. Zastavica je dokumentovana u referenci NEVPNProtocol.
To je druga vrsta odgovora: nametanje umesto posmatranja. Takođe se primenjuje samo na profile koje kontrolišete, pa ne pomaže potrošačkoj aplikaciji koja gleda tuđi tunel.
Provera 6: učinite neuspeh sigurnim i vidljivim
Isključite samo sposobnost kojoj treba tunel i ostavite ostatak aplikacije upotrebljivim. Detektor koji sakrije celo sučelje kad god nije siguran stvara prekid rada za svakoga čiji tunel koristi ime koje nikada niste predvideli. Umesto toga se vratite na konzervativno ponašanje: lokalne funkcije nastavljaju da rade i onemogućen je samo udaljeni poziv kojem tunel zaista treba. Taj izbor je odluka o proizvodu i zaslužuje da bude zapisan pored heuristike.
Zabeležite šta ste primetili: imena interfejsa, verziju platforme i rezultat jedne sonde. To sledeći izveštaj pretvara iz rasprave u proveru. Zatim dajte prednost podržanoj deklaraciji gde je imate, jer upravljana konfiguracija može eksplicitno da nosi nameru i ukloni većinu razloga za proveru imena uopšte.
Ako su vas provere od 1 do 5 ostavile bez podržanog odgovora, isporučite sondu i iskreno označite rezultat. Dokumentovan signal najboljeg napora bolja je odluka o proizvodu od privatnog API-ja koji se kvari u sledećem izdanju.