Steven
Steven5 min čítania

Vaša Mac aplikácia získa prístup k mikrofónu — a pri každom spustení naň zabudne

GeekBye požiadal o prístup k mikrofónu, udelili ste ho a fungovalo to. Ďalšie spustenie: preč. A aplikácia sa v Nastaveniach systému → Mikrofón vôbec neobjavila. Vinníkom bola bezpečnostná funkcia macOS, ktorá aplikáciu potichu spúšťala z cesty, čo zmizne — tu je diagnóza a náprava na jedno kliknutie.

macOS
Povolenia
Inžinierstvo
Vydania GeekBye
Vaša Mac aplikácia získa prístup k mikrofónu — a pri každom spustení naň zabudne

Tu je chyba, pri ktorej začnete pochybovať o vlastných očiach. Nainštalujete GeekBye, požiada o prístup k mikrofónu, kliknete na Povoliť a prepis funguje. Skvelé. Zatvoríte ho, na druhé ráno otvoríte — a on žiada o prístup k mikrofónu znova. Idete skontrolovať Nastavenia systému → Súkromie a bezpečnosť → Mikrofón, aby ste to opravili ručne, a GeekBye v zozname vôbec nie je. Nie zamietnutý. Nie povolený. Jednoducho chýba, akoby sa nikdy nepýtal.

Každý jednotlivý kúsok vyzeral správne. Výzva bola skutočná. Povolenie v tej chvíli fungovalo. Aplikácia bola riadne podpísaná a notarizovaná so správnymi reťazcami o použití. A napriek tomu sa udelené povolenie pri každom spustení vyparilo. GeekBye v2.0.6 to opravil — a hlavná príčina je jedna z najprefíkanejších vecí, ktoré macOS robí, aby vás chránil.

Funkcia, ktorá skrývala aplikáciu pred ňou samou

Vinníkom je macOS App Translocation, bezpečnostná funkcia Gatekeeperu. Keď si stiahnete aplikáciu a spustíte ju priamo z DMG alebo z priečinka ~/Downloads — kdekoľvek, kde je ešte „v karanténe" — macOS ju v skutočnosti nespúšťa tam, kde ju vidíte. Priehľadne ju skopíruje do náhodnej cesty len na čítanie hlboko pod /private/var/folders/.../AppTranslocation/… a spustí túto kópiu. Je to dobrá obrana: bráni škodlivému stiahnutiu manipulovať so súbormi vedľa seba.

Ale tu je kolízia. Systém povolení macOS (TCC — to, čo sleduje, kto môže používať váš mikrofón, kameru, obrazovku) identifikuje aplikáciu podľa jej cesty a identity kódu. Keď je aplikácia translokovaná, tá cesta je náhodná a dočasná. Takže keď udelíte prístup k mikrofónu, macOS svedomito zaznamená udelenie — voči ceste, ktorá pri ďalšom spustení nebude existovať. Otvoríte aplikáciu znova, macOS ju translokuje na inú náhodnú cestu, vidí aplikáciu, o ktorej nemá žiadny záznam, a pýta sa znova. A keďže tá fantómová cesta nikdy nie je stabilným miestom, aplikácia nikdy nezíska trvalý riadok v Nastaveniach systému → Mikrofón.

Aplikácia udeľovala povolenie duchovi.

Práve preto naň narazili iba niektorí ľudia. Ak vaša kópia GeekBye už bývala v /Applications — lebo ste ju tam pretiahli alebo sa tam dostala cez automatickú aktualizáciu — niet karantény, niet translokácie, cesta je stabilná a všetko zostáva zachované dokonale. Chyba bola neviditeľná pre nás aj pre každého po prvej inštalácii, čo je presne ten typ chyby, ktorý prežije najdlhšie.

Náprava: dajte aplikácii skutočný domov

Keďže celý problém je nestabilná cesta, náprava spočíva v tom, dostať aplikáciu na stabilnú. v2.0.6 zistí, keď GeekBye beží translokovaný (alebo len beží mimo /Applications), a ponúkne na jedno kliknutie „Move to Applications" — pomocou volania na presun v macOS, ktoré skopíruje balík do /Applications a odtiaľ ho znova spustí. Od tej chvíle má aplikácia pevnú identitu: udelenie mikrofónu drží, nahrávanie obrazovky drží a GeekBye sa konečne objaví v Nastaveniach systému tam, kde by ste to čakali.

Výzva je pri tom zdvorilá. Ponúka Move to Applications, Not Now a Don't Ask Again — a zapamätá si poslednú voľbu, takže aplikácia nikdy neotravuje niekoho, kto má zámerný dôvod spúšťať ju odinakiaľ. Rozhodnutie o tom, či výzvu vôbec zobraziť, je izolované do malých, čistých funkcií (je táto zostava translokovaná? je mimo /Applications? potlačil ju používateľ?), takže logika je pokrytá jednotkovými testami bez toho, aby bolo treba spustiť skutočnú notarizovanú zostavu na skutočnom karanténnom zväzku.

To isté vydanie zjednodušilo aj samotný zážitok s povoleniami. GeekBye kedysi vyskakoval s vlastným, na mieru šitým vstavaným oknom povolení — pár stoviek riadkov rozhrania, ktoré sa snažili napodobniť niečo, čo OS aj tak robí dobre. v2.0.6 ho zmazal a oprel sa o natívnu výzvu povolení macOS, podoprenú tichým, neblokujúcim bannerom, ktorý sa objaví iba vtedy, keď požadované povolenie naozaj chýba. Menej kódu a správanie, ktoré používatelia už poznajú, lebo každá iná Mac aplikácia funguje rovnako.

Časť, na ktorú som najviac hrdý: dokázali sme to skôr, než sme tomu uverili

Bolo by ľahké translokáciu uhádnuť a vydať nápravu. Namiesto toho vydanie najprv vypustilo štartovaciu diagnostiku: pri spustení GeekBye teraz hlási vlastnú cestu spustiteľného súboru a to, či je translokovaný, či je vnútri /Applications, a aktuálny stav povolení mikrofónu a obrazovky. Táto telemetria premenila pravdepodobnú teóriu na potvrdenú — produkčné dáta ukázali, že zasiahnuté relácie skutočne bežali z translokovaných ciest mimo /Applications, presne ako sa predpokladalo.

Toto poradie je dôležité. „Výzva sa objaví, ale povolenie nedrží" má viacero možných vysvetlení — problém s podpisom, chýbajúci reťazec o použití, otázka oprávnenia (entitlement), zvláštnosť databázy TCC. Príčiny na úrovni API sme vylúčili (cesta požiadavky bola preukázateľne správna), a potom sme nechali reálne dáta ukázať na vrstvu identity/cesty, namiesto toho, aby sme vydali nápravu s nádejou a dúfali, že tikety na podporu prestanú chodiť.

Tri veci, ktoré táto chyba učí

  1. Povolenie, ktoré sa pýta, ale nedrží, je problém identity, nie API. Ak je kód požiadavky správny a udelenie aj tak zmizne, prestaňte prepisovať požiadavku. Spýtajte sa, na akú cestu a identitu kódu OS udelenie viaže — a či je táto identita stabilná naprieč spusteniami.
  2. Vydajte diagnostiku spolu s (alebo pred) nápravou. Zopár polí — odkiaľ bežím, aký je môj stav povolení — premenilo kvalifikovaný odhad na overenú hlavnú príčinu a povedalo nám presne, ktorí používatelia boli zasiahnutí. Vybavte prístrojmi hranicu, ktorú podozrievate, skôr než ju zaláti.
  3. Chyby, ktoré sa skrývajú pred vývojármi, sú tie, čo bežia v „nesprávnom" prostredí. Naša bývala v /Applications na každom vývojárskom stroji, takže bola pre nás štrukturálne neviditeľná, no zároveň zasahovala prvých používateľov. Keď sa hlásenie nedá reprodukovať, prvá otázka znie čo je iné na mieste, kde to beží, nie či sa používateľ mýli.

GeekBye v2.0.6 vydal výzvu na presun a diagnostiku spolu. Pre širší oblúk spoľahlivosti, do ktorého to zapadá, pozri koľko naozaj stojí verzia 2 (v2.0.0) a prečo nahrávanie obrazovky zachytáva nesprávny monitor (v2.0.10) — ďalšiu chybu, ktorá sa vynorila iba v konkrétnom prostredí. Pre vydanie s drobnými detailmi po susedstve, pokojný softvér: oprava blikania a čip režimu odpovede (v2.0.3 + v2.0.5).

Súvisiace články

Anatómia dodania softvéru do dokonalosti: ako code review zachytilo to, čo testy nedokázali
Steven
Steven6 min čítania

Anatómia dodania softvéru do dokonalosti: ako code review zachytilo to, čo testy nedokázali

Naprieč celou sériou GeekBye v2 sa opakuje to isté: oprava prejde každým testom na stroji vývojára a potom code review dokáže, že by zlyhala takmer u každého. Toto je pracovný postup za deviatimi vydaniami — brána review, záchyty vo fáze opravy a disciplína „otestuj pred odoslaním", ktorá mení „u mňa to funguje" na „funguje to".

Inžinierstvo
Proces
Revízia kódu
Jedna CSS premenná, päť kôl revízie a Swift toolchain, ktorý klamal
Steven
Steven6 min čítania

Jedna CSS premenná, päť kôl revízie a Swift toolchain, ktorý klamal

GeekBye v2.0.7 spravil celý overlay nastaviteľne priehľadným — čo znie ako jednoriadková zmena v CSS a rozhodne ňou nebolo. Skutočný príbeh je o tom, čo odhalila revízia kódu: dva povrchy, ktoré odmietali zmiznúť, nahrávacia lišta, ktorá vyzerala zle pri rovnakej nepriehľadnosti, a skompilovaná binárka, ktorá sa hompáľala o 672 bajtov, pretože naša vlastná dokumentácia povedala recenzentovi nesprávnu verziu Swift.

Inžinierstvo
Dizajn
Zostavenie
Pokojný softvér: Ako sme zabili blikajúci prepínač a naučili chat povedať, v akom režime práve je
Steven
Steven6 min čítania

Pokojný softvér: Ako sme zabili blikajúci prepínač a naučili chat povedať, v akom režime práve je

Dve malé vydania GeekBye, žiadne titulné funkcie — len prepínač v nastaveniach, ktorý prestal blikať, a chatovací asistent, ktorý vám konečne povie, či odpovedal v režime stretnutia alebo v režime kódovania. Toto je skutočná cena „pokojného softvéru", jeden detail po druhom.

Produkt
Dizajn
Inžinierstvo