Steven
Steven5 min. skaitymo

Jūsų „Mac" programa gauna prieigą prie mikrofono — ir kaskart paleidus ją pamiršta

„GeekBye" paprašė leidimo naudoti mikrofoną, jį suteikėte, ir viskas veikė. Kitą kartą paleidus: dingo. O programa apskritai nepasirodė Sistemos nuostatose → Mikrofonas. Kaltininku buvo „macOS" saugumo funkcija, tyliai paleidžianti programą iš kelio, kuris pranyksta — štai diagnozė ir pataisa vienu paspaudimu.

macOS
Leidimai
Inžinerija
„GeekBye" leidimai
Jūsų „Mac" programa gauna prieigą prie mikrofono — ir kaskart paleidus ją pamiršta

Štai klaida, dėl kurios imi abejoti savo akimis. Įsidiegiate „GeekBye", jis paprašo prieigos prie mikrofono, spustelite Leisti, ir transkripcija veikia. Puiku. Uždarote, kitą rytą atidarote — o jis prašo prieigos prie mikrofono vėl. Einate patikrinti Sistemos nuostatų → Privatumas ir saugumas → Mikrofonas, kad pataisytumėte rankomis, o „GeekBye" sąraše apskritai nėra. Ne uždrausta. Ne leista. Tiesiog nėra, tarsi jis niekada ir neprašė.

Kiekvienas atskiras dalykas atrodė teisingas. Užklausa buvo tikra. Leidimas tą akimirką veikė. Programa buvo tinkamai pasirašyta ir notarizuota su teisingomis naudojimo eilutėmis. Ir vis dėlto suteiktas leidimas kaskart paleidus išgaruodavo. „GeekBye" v2.0.6 tai pataisė — o pirminė priežastis yra vienas gudriausių dalykų, kuriuos „macOS" daro, kad jus apsaugotų.

Funkcija, kuri slėpė programą nuo jos pačios

Kaltininkas yra „macOS App Translocation", „Gatekeeper" saugumo funkcija. Kai atsisiunčiate programą ir paleidžiate ją tiesiai iš DMG arba iš ~/Downloads aplanko — bet kur, kur ji tebėra „karantine" — „macOS" iš tikrųjų paleidžia ją ne ten, kur ją matote. Jis skaidriai nukopijuoja ją į atsitiktinį tik skaitymui skirtą kelią giliai po /private/var/folders/.../AppTranslocation/… ir paleidžia kopiją. Tai gera apsauga: ji neleidžia kenksmingam atsisiuntimui klastoti šalia esančių failų.

Bet štai susidūrimas. „macOS" leidimų sistema (TCC — tai, kas seka, kas gali naudoti jūsų mikrofoną, kamerą, ekraną) atpažįsta programą pagal jos kelią ir kodo tapatumą. Kai programa yra translokuota, tas kelias yra atsitiktinis ir laikinas. Taigi kai suteikiate prieigą prie mikrofono, „macOS" stropiai užfiksuoja suteikimą — keliui, kurio kitą kartą paleidus nebus. Atidarote programą vėl, „macOS" translokuoja ją į kitą atsitiktinį kelią, mato programą, apie kurią neturi jokio įrašo, ir klausia iš naujo. O kadangi tas fantominis kelias niekada nėra stabili vieta, programa niekada neįgyja nuolatinės eilutės Sistemos nuostatose → Mikrofonas.

Programa suteikdavo leidimą vaiduokliui.

Būtent todėl su tuo susidūrė tik kai kurie žmonės. Jei jūsų „GeekBye" kopija jau gyveno /Applications — nes nutempėte ją ten arba nes ji ten atsidūrė per automatinį atnaujinimą — nėra karantino, nėra translokacijos, kelias stabilus, ir viskas išlieka tobulai. Klaida buvo nematoma mums ir kiekvienam po pirmojo įdiegimo, o tai kaip tik toks klaidos tipas, kuris išgyvena ilgiausiai.

Pataisa: suteikite programai tikrus namus

Kadangi visa problema — nestabilus kelias, pataisa yra perkelti programą į stabilų. v2.0.6 aptinka, kai „GeekBye" veikia translokuotas (arba tiesiog veikia už /Applications ribų), ir siūlo vienu paspaudimu „Move to Applications" — naudodamas „macOS" perkėlimo iškvietimą, kuris nukopijuoja paketą į /Applications ir iš ten jį paleidžia iš naujo. Nuo tos akimirkos programa turi pastovų tapatumą: mikrofono suteikimas laikosi, ekrano įrašymas laikosi, o „GeekBye" pagaliau pasirodo Sistemos nuostatose ten, kur to tikitės.

Užklausa dėl to yra mandagi. Ji siūlo Move to Applications, Not Now ir Don't Ask Again — ir įsimena paskutinį pasirinkimą, tad programa niekada neįkyri tam, kuris turi sąmoningą priežastį paleisti ją iš kitur. Sprendimas, ar apskritai rodyti užklausą, izoliuotas į mažas, grynas funkcijas (ar ši versija translokuota? ar ji už /Applications ribų? ar naudotojas ją nutildė?), tad logika padengta vienetiniais testais be poreikio paleisti tikrą notarizuotą versiją tikrame karantino tome.

Tas pats leidimas supaprastino ir pačią leidimų patirtį. „GeekBye" anksčiau iššokdavo su pritaikytu, savadarbiu vidiniu leidimų langu — keliais šimtais sąsajos eilučių, mėginančių atkartoti tai, ką OS ir taip daro gerai. v2.0.6 jį ištrynė ir atsirėmė į savąją „macOS" leidimų užklausą, paremtą tyliu, neblokuojančiu skydeliu, kuris pasirodo tik tada, kai reikalingo leidimo iš tikrųjų trūksta. Mažiau kodo ir elgsena, kurią naudotojai jau atpažįsta, nes visos kitos „Mac" programos veikia taip pat.

Dalis, kuria labiausiai didžiuojuosi: įrodėme tai anksčiau, nei patikėjome

Būtų buvę lengva translokaciją atspėti ir išleisti pataisą. Vietoj to leidimas pirmiausia išleido paleisties diagnostiką: paleidus „GeekBye" dabar praneša savo paties vykdomojo failo kelią ir tai, ar jis translokuotas, ar yra /Applications viduje, bei esamą mikrofono ir ekrano leidimų būseną. Ši telemetrija tikėtiną teoriją pavertė patvirtinta — gamybos duomenys parodė, kad paveikti seansai iš tikrųjų veikė iš translokuotų kelių už /Applications ribų, būtent kaip ir buvo numatyta.

Ši tvarka svarbi. „Užklausa pasirodo, bet leidimas nesilaiko" turi kelis galimus paaiškinimus — parašo problema, trūkstama naudojimo eilutė, teisių (entitlement) klausimas, TCC duomenų bazės keistenybė. API lygmens priežastis atmetėme (užklausos kelias buvo akivaizdžiai teisingas), o paskui leidome realaus pasaulio duomenims nurodyti į tapatumo/kelio sluoksnį, užuot išleidę pataisą su viltimi ir tikėdamiesi, kad pagalbos užklausos nustos ateiti.

Trys dalykai, kurių moko ši klaida

  1. Leidimas, kuris klausia, bet nesilaiko, yra tapatumo, o ne API problema. Jei užklausos kodas teisingas, o suteikimas vis tiek dingsta, liaukitės perrašinėję užklausą. Paklauskite, prie kokio kelio ir kodo tapatumo OS sieja suteikimą — ir ar tas tapatumas stabilus tarp paleidimų.
  2. Išleiskite diagnostiką kartu su (arba prieš) pataisą. Keli laukai — iš kur veikiu, kokia mano leidimų būsena — pavertė pagrįstą spėjimą patvirtinta pirmine priežastimi ir tiksliai pasakė, kurie naudotojai buvo paveikti. Aprūpinkite prietaisais ribą, kurią įtariate, prieš ją lopdami.
  3. Klaidos, kurios slepiasi nuo kūrėjų, yra tos, kurios veikia „netinkamoje" aplinkoje. Mūsiškė gyveno /Applications kiekvienoje kūrėjo mašinoje, tad buvo struktūriškai nematoma mums, tuo pat metu paliesdama pirmakart besinaudojančius. Kai pranešimas neatsikartoja, pirmasis klausimas yra kuo skiriasi vieta, kur tai veikia, o ne ar naudotojas klysta.

„GeekBye" v2.0.6 išleido perkėlimo užklausą ir diagnostiką kartu. Dėl platesnio patikimumo lanko, į kurį tai įsirašo, žr. kiek iš tikrųjų kainuoja 2 versija (v2.0.0) ir kodėl ekrano įrašymas fiksuoja ne tą monitorių (v2.0.10) — dar viena klaida, iškilusi tik konkrečioje aplinkoje. Dėl gretimo smulkių detalių leidimo, ramus programinis įrankis: mirgėjimo pataisa ir atsakymo režimo žetonas (v2.0.3 + v2.0.5).

Susiję straipsniai

Programinės įrangos tobulinimo anatomija: kaip kodo peržiūra pagavo tai, ko testai negalėjo
Steven
Steven5 min. skaitymo

Programinės įrangos tobulinimo anatomija: kaip kodo peržiūra pagavo tai, ko testai negalėjo

Per visą GeekBye v2 seriją kartojasi tas pats: pataisa praeina kiekvieną testą kūrėjo kompiuteryje, o paskui kodo peržiūra įrodo, kad ji būtų sugedusi beveik visiems. Tai devynių leidimų darbo eiga — peržiūros vartai, pagavimai pataisos etape ir „patikrink prieš išsiuntimą" disciplina, kuri „man veikia" paverčia „veikia".

Inžinerija
Procesas
Kodo peržiūra
Vienas CSS kintamasis, penki peržiūros ratai ir Swift įrankių grandinė, kuri melavo
Steven
Steven6 min. skaitymo

Vienas CSS kintamasis, penki peržiūros ratai ir Swift įrankių grandinė, kuri melavo

GeekBye v2.0.7 padarė visą perdangą reguliuojamai permatomą — kas skamba kaip vienos eilutės CSS pakeitimas, tačiau tikrai juo nebuvo. Tikroji istorija yra tai, ką pagavo kodo peržiūra: du paviršiai, kurie atsisakė blukti, įrašų juosta, kuri prie to paties permatomumo atrodė ne taip, ir sukompiliuotas dvejetainis failas, kuris svyravo 672 baitais, nes mūsų pačių dokumentai peržiūrėtojui nurodė neteisingą Swift versiją.

Inžinerija
Dizainas
Kūrimas
Rami programinė įranga: kaip pašalinome mirgantį jungiklį ir išmokėme pokalbį pasakyti, kokiu režimu jis veikia
Steven
Steven5 min. skaitymo

Rami programinė įranga: kaip pašalinome mirgantį jungiklį ir išmokėme pokalbį pasakyti, kokiu režimu jis veikia

Du nedideli GeekBye leidimai, be jokių pagrindinių funkcijų — tik nustatymų jungiklis, kuris nustojo mirgėti, ir pokalbio asistentas, kuris pagaliau pasako, ar atsakė susitikimo režimu, ar kodavimo režimu. Štai kiek iš tikrųjų kainuoja „rami programinė įranga“ — po vieną smulkmeną.

Produktas
Dizainas
Inžinerija