> Jazyková revize tohoto překladu probíhá. Při nejasnostech porovnejte [anglický originál](https://www.sm.ch-j.eu/docs/i18n/en/remote-editor-latency.md). # Vzdálené ukládání editorů a monitorování latencí ## Kořenové příčiny Předchozí editor nahrál svůj pracovní soubor do mateřského adresáře cíle, který často nelze zapsat prostřednictvím účtu SSH pod `/etc` nebo `/var`. Přejmenování SFTP nedodává autorizovanou cestu sudo, základní kontrolu konfliktu, ověření bezpečnostních metadat nebo spolehlivé přepsání sémantik. Jeho chybový manipulátor smazal dočasnou kopii, odstranění materiálu pro obnovu i když dokončení bylo nejisté. Stav relace dříve exponován pouze stav spojení. Nebylo zjištěno žádné ICMP nebo ověřeno SSH měření odezvy krmení indikátor terminálu. ## Uložit protokol 1. Fixní pomocnice SSH otevře pravidelný, jedno-linkový soubor pomocí popisné relace provoz a `O_NOFOLLOW` pro každou součást cesty. Zachycuje obsah, SHA-256 hash, zařízení/inode, UID, GID, kompletní autorizační bity, nanosekundové modifikace/změnové časy a všechny čitelné rozšířené atributy. Jádro ověřuje hash a dekóduje přísné UTF-8, zachování BOM. Každý dokument dostane neprůhledný `editId`, rozprostřený do svého pluginu, koncové relace a server identity. 2. Neprivilegovaná přípravná operace řeší ověřený účet domov přes `pwd.getpwuid(os.getuid())`, vytváří `$HOME/ch-j-sm/` s režimem `0700` a vytváří soukromý, exkluzivní rekuperační časopis. Nebezpečný domov, symlink pracovní prostor nebo pracovní prostor vlastněný jiným účtem je odmítnut. 3. Core nahrává skrytý, náhodný 128-bit `.tmp` pracovní soubor přes SFTP s exkluzivní tvorba (`wx`), režim `0600` a timeout 60-sekundový kanál/upload. Časopis obsahuje cíl, původní výchozí a očekávaný pracovní hash; neobsahuje žádné pověření. 4. **One SSH exec provádí kompletní finalizaci**, volitelně prostřednictvím existující vykonavatel sudo. Pomocník se bezpečně otevře a pošle soukromou pracovní kopii a spláchne ji. Zamkne původní inodu, zkontroluje její výchozí hodnotu, vytvoří exkluzivní cílový soubor vedle cíle, zapíše veškerý obsah, použije a ověří metadata, znovu zkontroluje originál a nahradí. 5. Stejný směr `os.replace` atomicky nahrazuje cíl. Rodič adresář je spláchnut a konečná cesta, hash, inode a metadata jsou ověřeny. Původní cesta zůstává k dispozici až do nahrazení. Pracovní soubor se nikdy nepřenáší přes souborové systémy a není nikdy odstraněn finalizací. 6. Poté, co Core obdrží ověřený úspěch, samostatný úklid překontroluje finále obsah a bezpečnostní metadata před odstraněním pracovního souboru a deníku. Selhání čištění stále hlásí potvrzené uložení pomocí `recoveryAvailable: true`. Neúspěšné nahrávání, neúspěšné sudo, konflikt, chyba metadat nebo neúspěšná výměna si ponechá původní a jakýkoliv zinscenovaný materiál. Neúplné nahrávky jsou identifikovány jako takové a nelze je obnovit jako kompletní editovaný dokument. Ztracená komunikace SSH, chybějící výstupní stav, timeouty a nečekané výsledky finalizace jsou hlášeny jako **un known** nikdy tak jako uloženy. Jádro blokuje další uložení na nejistém dokumentu; není automatická náhrada retry. ## Metadata, výsady a bezpečnostní hranice Pomocník uchovává a ověřuje UID, GID a všechny POSIX přípustné bity včetně spustitelných, setuidních, setgidních a lepivých bitů. Reprodukuje rozšířené atributy Linux pro byte, včetně POSIX ACLs, kapacit a SELinux etikety. Vlastnictví a obsah souboru jsou nastaveny před bezpečnostními atributy, protože zápisy / šachy mohou vymazat možnosti nebo speciální oprávnění bitů. Zděděné atributy místa určení, které chybí na originálu, jsou odstraněny. Čas úpravy odráží nový zápis a není zkopírován z originálu. Nečitelný nebo nereprezentovatelný atribut operaci přeruší; metadata nejsou tiše upuštěna. Podpisy IMA/EVM jsou výslovně zamítnuty, protože kopírování podpisů integrity s obsahem/inodem by je zneplatnilo. Symlinks v cílové nebo domovské cestě, pevně vázané soubory a nepravidelné soubory jsou odmítnuty. Nepoužívá se žádné místo nebo slabší SFTP přepsání zálohy. Běžně zapisovatelné ukládá běžet jako účet SSH. Chráněné uložení vyžaduje explicitní `{ sudo: true }`; heslo sudo je volitelné pro bezheslo sudo. Hesla jsou validována a předávána pouze na kanálu stdin, nikdy uvnitř příkazu, deníku, pracovního souboru, loggeru nebo vzdálené chyby. Root SSH relace používají stávající přímý kořenový vykonavatel. Neúspěšné oprávnění zanechá původní a pracovní kopii neporušenou. Všechny ukládá jako root (direct root SSH nebo sudo) také odmítnout cílové adresáře / předky vlastněné nebo zapisovatelné jinými účty, nebo mít přístup ACL, spíše než věřit privilegované jméno směrované jiným účtem. Fixní pomocník běží se `python3 -I -B`: ignoruje cesty uživatele Python, pracovní adresář a balíčky uživatelských stránek a píše bez bytecode. Trasy a JSON argumenty jsou shell-citovány v Core. Pluginy nikdy nedostávají libovolné SSH exec nebo SFTP rukojeti. Stávající pískoviště, CSP, zjevná oprávnění, ověření klíčů a ověřování aktualizací zůstávají v provozu. ## Plugin API a zbývající integrace Monaka ** Samostatně distribuovaný Monako/File Manager UI chybí. Jeho UI integrace, sudo pohotovost, špinavý-buffer manipulace a překlady nebylo možné implementovat ani testovat zde.** Sdružený plugin zdroj je Hash & Checksum plugin. Žádný náhradní zdroj File Manager nebyl vynalezen. Stávající metody zůstávají k dispozici. Metody/ opce doplňkové látky jsou vystaveny přednaložením pískem a runtime kontrolovaným oprávněním: ```js const opened = await chjPlugin.files.readText(sessionId, path); // For a protected read, explicitly pass { sudo: true, sudoPassword }. const result = await chjPlugin.files.saveText(sessionId, path, editor.getValue(), { editId: opened.editId, sudo: true, // Include only after the user authorizes elevation. sudoPassword // Omit for passwordless sudo; never persist this value. }); if (result.ok && result.value.status === "saved") { // Mark this exact submitted editor version as saved. Later edits stay dirty. } else { // Keep the Monaco model dirty. Translate result.error.code/status. // result.error.recoveryId/recoveryPath identify retained working material. } await chjPlugin.files.closeText(opened.editId); const recovery = await chjPlugin.files.listRecovery(sessionId); const copy = await chjPlugin.files.readRecovery(sessionId, recoveryId); // Review copy.status and copy.text; open a fresh document before another save. await chjPlugin.files.cleanupRecovery(sessionId, recoveryId); // Cleanup rejects anything whose target is not currently confirmed. ``` Při kontrole cíle je třeba navýšit metody zpětného získávání volitelný konečný argument `{ sudo: true, sudoPassword }`. Uchovávají si ověřený pracovní prostor uživatele, i když je sudo proveden. Časopisy přežijí restart aplikace a SSH se znovu připojí; zotavení nikdy automaticky neopakuje finalizaci. Prohlédněte si znovuobnovený buffer proti nově otevřenému cíli, než ho výslovně uložíte. Stráže `files.read` čtou, kontrolují a řídí. Stráže `files.write` šetří a obnovuje čištění. `writeText` stále odmítá selhání stávajících pluginů; `saveText` vrací strukturovaný obálku `{ ok, value/error }`, protože Electron upouští vlastní vlastnosti na odmítnutých objektech chyby. Dřívější tříargument `writeText` může využít základní hodnoty jediného otevřeného dokumentu. Více živých dokumentů pro stejnou cestu vyžaduje `editId`; nejednoznačné starší hovory selhávají bezpečně místo výběru výchozí hodnoty jiného dokumentu. Pluginy by měly uvolnit nepoužité kliky. Externí UI musí okamžitě zobrazit uložení, udržovat buffery špinavé při selhání, nabízet sudo pouze po selhání oprávnění/autentikace, ukázat konflikty bez přepsání a nabídnout zotavení po ztrátě spojení nebo neznámý výsledek. Musí tyto státy přeložit v češtině, němčině a angličtině. Doporučená kopie stavu: | State | Czech | German | English | | --- | --- | --- | --- | | Saving | Ukládání… | Wird gespeichert… | Saving… | | Confirmed | Uloženo | Gespeichert | Saved | | Failure | Uložení selhalo | Speichern fehlgeschlagen | Save failed | | Sudo required | Vyžadováno oprávnění sudo | sudo-Autorisierung erforderlich | Sudo authorization required | | Conflict | Původní soubor byl změněn | Originaldatei wurde geändert | Original file changed | | Disconnected | Spojení bylo přerušeno | Verbindung unterbrochen | Connection lost | | Unknown | Výsledek uložení není znám | Speicherergebnis unbekannt | Save result unknown | | Recovery | Obnova je dostupná | Wiederherstellung verfügbar | Recovery available | ## Definice kluznosti a životní cyklus **Ping** je latence nahlášená aktuální klientskou stranou ICMP echo odpovědí na vyřešenou IP použitou SSH. Jádro vyvolá ping platformy spustitelný asynchronně s pevným polem argumentu, bez požadavku na spuštění shellu nebo administrátora. Argumenty Linux, macOS (včetně `ping6`) a Windows se vybírají samostatně. Zablokovaná ICMP, chybějící spustitelný počítač, timeout, neplatný výstup nebo odpověď pouze na horní hranici Windows, jako je `<1ms` vytváří nedostupnou hodnotu, nikoli vynalezené číslo. **SSH RTT** je monotonický `performance.now()` trvání pevné `true` exec žádosti o stávající ověřený SSH klient. Zahrnuje nastavení kanálů, zpracování serveru a doručení odpovědí; nejedná se o čistou síť RTT nebo SSH přihlašovací dobu. Přeložené indikátorové tooltip vysvětluje toto rozlišení. Sledování začne, jakmile se terminál připojí. Sondy běží souběžně a synchronně, s pětisekundovým timeoutem požadavku/procesu. Další vzorek je naplánován dvanáct sekund po dokončení předchozího vzorku, což zabraňuje překrytí. Odpojení přeruší ICMP, vymaže časovače, zruší práci SSH a vymaže hodnoty. Kontrola totožnosti záznamu brání zveřejnění předchozího spojení po opětovném připojení. Selhání ICMP nikdy nemění stav spojení SSH. Latency cestuje do existující události `state` / `ssh:state` IPC: ```js latency: { pingMs: 24.1, sshRttMs: 31.25, measuredAt: "…" } ``` Nedostupná čísla jsou `null`. Kompaktní terminálový indikátor používá milisekundy, lokalizovaný nedostupný text a Czech/German/English etikety. Schovává se na odpojení. Nebylo zapotřebí žádné další provedení rendereru nebo IPC požadavku. ## Validace a provozní limity - Spustit od `app/`: `npm ci`, pak `npm test`. - Konečný lokální výsledek: **179 testy; 163 prošel, 0 selhal, 16 přeskočil**. Všechny přeskoky jsou případy souborového systému Linux na tomto hostiteli macOS. `npm ci`, Python syntax kompilace a `git diff --check` úspěšně dokončena. - Testy pokrývají uložení/využití jádra, protokol sudo a redakce hesla, real POSIX shell citující nepřátelské cesty, konflikty, nahrávání, neúspěšný úklid, nejisté výsledky, souběžné dokumenty, IPC oprávnění a latence životního cyklu. - Testy souborového systému Linux provádějí odeslaný vstupní bod Pythonu pomocí soukromého vyhledávání na účtu: vlastnictví/mode/xattrs, POSIX ACLs, symlinks/hardlinks, FIFOs, upload a metadata selhání, náhradní selhání, cílové závody, neznámé výsledky post-replacementu a zotavení. Stage Cross-filesystem používá `/dev/shm` a další souborový systém, je-li k dispozici. Tyto testy přeskočit na non-Linux hostitele; chybějící ACL / samostatné soubory zařízení jsou výslovně vynechány. - Přidaná Linux GitHub Akce spustí kompletní apartmá a opakuje souborový systém Případy jako kořen. Tento workflow nebyl odeslán z tohoto pracovního stromu. - Místní validace byla na macOS. Syntaxe zdroje Pythonu byla zkontrolována s přímým Nástroje příkazové linky Python spustitelné. Skutečný macOS loopback ICMP kontrola kouře vrátila `0.071 ms`. Žádný živý vzdálený SSH server, Runtime Windows, runtime (Linux), SELinux nasazení nebo externí Monako UI byl testován lokálně. - Vzdálená editace textu nyní vyžaduje Linux a Python 3 s deskriptorem-relativní podpora souborového systému/xattru. Chybějící tlumočník selže explicitně. Toto jádro záměrně odmítá nebezpečná metadata, odkazy a konfigurace adresářů. - Uzamčení je poradenství: nespolupracující procesy mohou stále závodit v úzké interval mezi poslední kontrolou výchozí hodnoty a přejmenováním na atomovou energii. Linux neposkytuje žádný obecný atomový obsah-hash porovnat a-nahradit provoz. Kontrola detekuje změny před tímto intervalem; po zachování pracovních kopií podporuje zotavení později. - Na vzdáleném účtu zůstávají údaje o obnově až do potvrzeného vyčištění. Neúplné, Konfliktní a nekontrolovatelné deníky nejsou nikdy potichu vyřazeny. Neexistuje žádná doba platnosti automatického obnovení souboru a žádná možnost nuceného přepisu. - `npm ci` hlášeny výsledky auditu závislosti na závislosti 17 (9 střední, 8 vysoká). Tato změna nemění závislost ani model důvěry v aktualizaci aplikace. Uživatel si vyžádal zachovat změny ve stávajícím pracovním stromu, v současné době `feature/hash-checksum-plugin`; nebyl proveden žádný přepínač větve nebo nepříbuzný úklid. ## Soubory změněny pro tento úkol - `src/main/files/remoteFileService.js` - `src/main/files/remoteEditor.py` (nový) - `src/main/sessions/sessionManager.js` - `src/main/sessions/latencyMonitor.js` (nový) - `src/main/plugins/pluginRuntime.js` - `src/preload/pluginPreload.js` - `src/renderer/app.js` - `src/renderer/index.html` - `src/renderer/styles.css` - `src/renderer/i18n.js` - `test/remoteFileService.test.js` - `test/sessionManager.test.js` - `test/pluginRuntime.test.js` - `test/remoteEditor.test.js` (nový) - `test/remoteEditorProtocol.test.js` (nový) - `test/remoteEditorLinux.test.js` (nový) - `test/fixtures/remoteEditorLinux.py` (nový) - `test/latencyMonitor.test.js` (nový) - `README.md` - `docs/remote-editor-latency.md` (tento soubor) - `../.github/workflows/remote-editor-tests.yml` (nový)