> A fordítás nyelvi ellenőrzése folyamatban van. Ha egy rész nem egyértelmű, tekintse meg az [angol eredetit](https://www.sm.ch-j.eu/docs/i18n/en/remote-editor-latency.md). # Távoli szerkesztő mentése és késleltetés ellenőrzése ## Gyökér okok Az előző szerkesztő feltöltötte a munkafájlját a célkönyvtárba, amelyet gyakran nem tud megírni a SSH fiók `/etc` vagy `/var` alatt. A SFTP rename nem adott át engedélyezett sudo útvonalat, alapkonfliktusellenőrzést, biztonsági metaadatok ellenőrzését vagy megbízható felülírását. Hibakezelője törölte az ideiglenes másolatot, eltávolítva a visszanyerési anyagot még akkor is, ha a befejezés bizonytalan volt. A munkamenet állapota korábban csak a kapcsolat állapotát fedte fel. Nem volt ICMP vagy hitelesített SSH válaszmérés, amely a termináljelzőt táplálta volna. ## Protokoll mentése 1. A fix SSH segítő egy rendszeres, egy linkes fájlt nyit meg a deszkriptor-relatív a műveletek és a `O_NOFOLLOW` minden útvonalkomponensre. Ez rögzíti a tartalmat, SHA-256 hash, eszköz / inóda, UID, GID, teljes engedély bitek, nanoszekundum módosítás/módosítási idők és minden olvasható kiterjesztett attribútumok. A törzs ellenőrzi a hash-t és dekódolja a szigorú UTF-8-t, megőrizve egy BOM-ot. Minden dokumentum átlátszatlan `editId`-t kap, mely a plugin, terminál session és szerver identitására terjed ki. 2. Egy kiváltságos előkészítési művelet megoldja a hitelesített számla home through `pwd.getpwuid(os.getuid())`, create `$HOME/ch-j-sm/` with mode `0700` és létrehoz egy privát, exkluzív helyreállítási naplót. Egy másik fiók tulajdonában lévő nem biztonságos otthont, szimlink munkateret vagy munkateret elutasítanak. 3. A 128-bit `.tmp` working file feltöltése a SFTP segítségével exkluzív alkotás (`wx`), mód `0600` és egy hatvan másodperces csatorna/feltöltési idő. A napló tartalmazza a célt, az eredeti alaphelyzetet és a várt munka hash; nem tartalmaz igazolványokat. 4. A **one SSH exec a teljes véglegesítést a **-n keresztül végzi el, opcionálisan a a meglévő sudo végrehajtó. A segítő biztonságosan kinyitja és hashes a privát munkapéldányt, majd leöblíti. Ez zárolja az eredeti inode, ellenőrzi a kiindulási, létrehoz egy exkluzív célfájl mellett a cél, írja minden tartalmat, alkalmazza és ellenőrzi metaadatokat, ellenőrzi az eredeti újra, és öblíti a cserét. 5. Egy azonos rendező `os.replace` atomilag helyettesíti a célpontot. A szülő A könyvtárat áthúzták, és a végső útvonal, hash, inóda és metaadatok is hitelesek. Az eredeti út a csereig elérhető. A munkafájlt soha nem mozgatják át a fájlrendszereken, és soha nem távolítják el véglegesítéssel. 6. Miután Core kapott egy ellenőrzött sikert, külön tisztítás újra ellenőrzi a végső tartalom- és biztonsági metaadatok a munkafájl és a napló eltávolítása előtt. A takarítás sikertelensége még mindig egy megerősített mentést jelent a `recoveryAvailable: true`-val. A nem sikerült feltöltés, sikertelen sudo, konfliktus, metaadat hiba vagy hibás csere tartja az eredeti és bármilyen színpadi anyag. A hiányos feltöltéseket ilyenként azonosították, és nem lehet teljes szerkesztett dokumentumként visszaállítani. Elveszett SSH kommunikáció, hiányzó kilépési állapot, időkimaradások és váratlan véglegesítési eredmények jelentik, mint **unknown**, soha nem mentett. A Core egy másik mentést blokkol egy bizonytalan dokumentumon; nincs automatikus csereismétlés. ## Metaadatok, kiváltságok és biztonsági határok A segítő megőrzi és ellenőrzi az UID-t, a GID-t és minden POSIX-engedély bitet, beleértve a végrehajtható, setuid, setgid és ragadós részeket. Reprodukálja a Linux kiterjesztett attribútumokat bájtra, beleértve a POSIX ACL-eket, képességeket és SELinux címkéket. A tulajdonjog és a fájltartalom a biztonsági attribútumok előtt van beállítva, mert az írások/csatlakozók képesek a képességek vagy különleges engedély bitek megtisztítására. Eltávolítják azokat az örökölt rendeltetési attribútumokat, amelyek nem szerepelnek az eredetiben. A módosítási idő az új írást tükrözi, és nem másolja le az eredetiből. Egy olvashatatlan vagy irreleváns attribútum megszakítja a műveletet; a metaadatokat nem némán ejtik. Az IMA/EVM aláírásokat kifejezetten elutasítják, mivel a tartalom másolása/az inode-bound integritás aláírások érvénytelenné tenné azokat. A cél vagy otthoni útvonal szimlinkjeit, a merev fájlokat és a nem szabályos fájlokat elutasítják. A SFTP-t nem használják a helyükön lévő vagy gyengébb visszaírásra. A hagyományos írható mentések a SSH fiókként futnak. Védett mentések explicit `{ sudo: true }`-t igényelnek; a sudo jelszó nem kötelező jelszó nélküli sudo esetén. Jelszavakat csak a stdin csatornán érvényesítenek és adnak át, soha nem kerülnek be a parancsba, naplóba, munkafájlba, loggerbe vagy távoli hibába. Root SSH munkamenetek használja a meglévő közvetlen root executor. A hibás engedély sértetlenül hagyja az eredetit és a munkapéldányt. A rootként végrehajtott összes mentés (közvetlen gyökér SSH vagy sudo) szintén visszautasítja a más számlák tulajdonában lévő, illetve megírható célkönyvtárakat/ellenzőket, vagy ACL-t vezet, ahelyett hogy egy másik fiók által ellenőrzött privilegizált elérést bízna meg. A fix segítő `python3 -I -B`-vel fut: figyelmen kívül hagyja a felhasználó Python útvonalait, a munkakönyvtárat és a felhasználói oldal csomagjait, és nem ír bytecode-et. Az utak és a JSON érvek shell-quoted in Core. A plugins soha nem kap önkényes SSH exec vagy SFTP fogantyúkat. Meglévő homokozó, CSP, nyilvánvaló engedélyek, gépi kulcs ellenőrzése és frissítés ellenőrzése továbbra is használatban van. ## Plugin API és Monaco további integrációja **A külön elosztott Monaco/File Manager UI hiányzik ebből a pénztárból. Az UI integráció, sudo azonnali, piszkos-puffer kezelése és a fordítások nem lehet végrehajtani vagy tesztelni itt.** A kötegelt bővítmény forrása a Hash & Checksum plugin. Nem találták fel a Fájlkezelő helyettesítő forrását. A meglévő módszerek továbbra is rendelkezésre állnak. Az adalékanyag módszereit/lehetőségeit a homokozós előterhelés és az engedély nélküli futási idő teszi ki: ```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. ``` A helyreállítási módszerek elfogadják a `{ sudo: true, sudoPassword }` opcionális végső érvelését, amikor egy cél eléréséhez magasságra van szükség. Megtartják a hiteles felhasználó munkaterületét, még akkor is, ha azt sudo-n keresztül hajtják végre. A naplók túlélik az alkalmazás újraindítását és a SSH újracsatlakozását; a helyreállítás soha nem ismételi meg automatikusan a véglegesítést. Felül kell vizsgálni a visszanyert puffert egy frissen megnyitott célponttal szemben, mielőtt kifejezetten megmentenék. `files.read` őrök olvasnak, ellenőrzik és kezelik a kiadást. A `files.write` őrök takarítják és javítják a tisztítást. A `writeText` még mindig elutasítja a meglévő bővítmények sikertelenségét; a `saveText` strukturált `{ ok, value/error }` borítékot ad vissza, mert a Electron egyedi tulajdonságokat dob le az elutasított Error objektumokra. A `writeText` egy hagyományos három érv alapján egyetlen nyílt dokumentum alapvonalát használhatja fel. Az azonos útvonalhoz szükséges több élő dokumentum `editId`-t igényel; a kétértelmű hagyatéki hívások biztonságosan nem egy másik dokumentum alapvonalát választják. A bővítményeknek fel nem használt fogantyúkat kell kioldaniuk. A külső UI-nak azonnal meg kell jelenítenie a mentést, a puffereket bepiszkolnia kell a hiba miatt, csak engedély/engedélykivonási hibák után kínál sudo-t, túlírás nélküli konfliktusokat kell mutatnia, és a kapcsolat elvesztése vagy ismeretlen kimenetele után helyreállítást kell felajánlania. Le kell fordítania ezeket az államokat cseh, német és angol nyelven. Javasolt állapotmásolat: | 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 | ## Latencia-meghatározások és életciklus **Ping!** a tényleges ügyféloldali ICMP echo válasz által jelentett késleltetés az általa használt megoldott IP-re SSH. A Core egy fix argumentum tömbbel szinkronizálható platform ping-et használ shell vagy adminisztrátori startup követelmény nélkül. A Linux, macOS (beleértve a `ping6`-t) és a Windows argumentumokat külön választjuk. Blokkolt ICMP, hiányzó futtatható, időkimaradás, érvénytelen kimenet vagy csak felső határú Windows válasz, mint például a `<1ms` nem elérhető értéket eredményez, nem pedig feltalált számot. **SSH RTT** a `performance.now()` állandó `true` exec kérésének egy monoton SSH kliensre vonatkozó időtartama. Magában foglalja a csatorna beállítását, a szerver feldolgozását és a válaszadást; nem tiszta hálózat RTT vagy SSH Bejelentkezési idő. A lefordított mutató eszköztár ezt a különbséget magyarázza. A megfigyelés elkezdődik, amint a terminál csatlakozik. A szonda egyszerre és szinkronizálva fut, öt másodperces kérés/folyamatidővel. A következő mintát az előző minta befejezése után 12 másodperccel tervezik, megakadályozva ezzel az átfedést. Lekapcsolás megszakítja az ICMP-t, törli az időzítőket, megszünteti a SSH munkát és tisztázza az értékeket. A személyazonosság-ellenőrzések megakadályozzák, hogy az előzetes kapcsolat újrakapcsolatot követően közzétegyék. Az ICMP hiba soha nem változtatja meg a SSH kapcsolat állapotát. Latency a meglévő `state` eseményen / `ssh:state` IPC hasznos teher: ```js latency: { pingMs: 24.1, sshRttMs: 31.25, measuredAt: "…" } ``` A nem elérhető számok `null`. A kompakt terminál mutató milliszekundumokat használ, lokalizált nem elérhető szöveget és cseh/German/English címkéket. Elrejtőzik a lekapcsolásnál. Nem volt szükség további renderelési végrehajtási képességre vagy IPC-kérésre. ## Hitelesítési és működési határértékek - Fuss a `app/`: `npm ci`, majd `npm test`. - Végeredmény: **179 tesztek; 163 átment, 0 nem sikerült, 16 lelépett**. Minden skip a Linux fájlrendszeres esetek ezen a macOS gépen. `npm ci`, Python szintaxis összeállítás és `git diff --check` sikeresen befejeződött. - A tesztek magukban foglalják a Core mentés/helyreállítást, a sudo protokollt és a jelszófeltöltést. valódi POSIX shell idézve ellenséges utak, konfliktusok, feltöltések, sikertelen tisztítás, bizonytalan eredmények, párhuzamos dokumentumok, IPC engedélyek és latencia életciklus. - Linux fájlrendszer tesztek a szállított Python belépési pont, egy privát teszt számla-home keresés: tulajdonos/mode/xattrs, POSIX ACLs, szimlinkek/hardlinkek, FIFO-k, feltöltési és metaadat hibák, cserehibák, célversenyek, ismeretlen poszt-helyreállítási eredmények és helyreállítás. A keresztfájlrendszer megállítása `/dev/shm`-t és egy másik fájlrendszert használ, ha rendelkezésre áll. Ezek a tesztek kihagyják a nem Linux hostokat; a hiányzó ACL/önálló fájlrendszer-létesítményeket kifejezetten kihagyják. - A hozzáadott Linux GitHub Műveletek a teljes program futtatása és ismétlése fájlrendszer Az esetek mint gyökér. Ezt a munkafolyamatot még nem küldték el erről a dolgozófáról. - A helyi validálás a macOS-n volt. A Python forrás szintaxisát a közvetlen Parancssor eszközök Python végrehajtható. Egy igazi macOS loopback ICMP füst ellenőrzés visszatért `0.071 ms`. Nincs élő távoli SSH szerver, Windows runtime, Linux futásidő, SElinux telepítés vagy külső Monaco UI tesztelték helyben. - A távoli szöveg szerkesztése Linux és Python 3 megjelöléssel fájlrendszer/xattr támogatás. Egy hiányzó tolmács egyértelműen megbukik. Ez a Core szándékosan megtagadja a nem biztonságos metaadatokat, linkeket és könyvtári konfigurációkat. - A zárolás tanácsadás: a nem együttműködő folyamatok továbbra is versenyezhetnek a keskeny az utolsó kiindulási ellenőrzés és az atomi átnevezés közötti időköz. A Linux nem szállít általános atomtartalom-hash összehasonlítást és helyváltoztatást. Az ellenőrzések ezen időszak előtt változásokat észlelnek; a megőrzött munkapéldányok támogatják a felépülést. - A visszaszerzési adatok a távoli számlán maradnak, amíg egy megerősített tisztítást nem végeznek. Nem teljes. A ellentmondásos és ellenőrizhetetlen folyóiratokat soha nem némán dobják ki. Nincs automatikus visszaszerzés-fájl lejárat és nincs kényszer felülírás opció. - `npm ci` jelentett 17 függőségi ellenőrzési eredmények (9 közepes, 8 magas). Ez a változás nem változtatja meg a függőségeket vagy az alkalmazás naprakész bizalmi modelljét. A felhasználó kérte, hogy a meglévő munkafában, jelenleg `feature/hash-checksum-plugin`-ban tartsa meg a változásokat; nem történt ágkapcsoló vagy független tisztítás. ## Fájlok módosultak ehhez a feladathoz - `src/main/files/remoteFileService.js` - `src/main/files/remoteEditor.py` (új) - `src/main/sessions/sessionManager.js` - `src/main/sessions/latencyMonitor.js` (új) - `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` (új) - `test/remoteEditorProtocol.test.js` (új) - `test/remoteEditorLinux.test.js` (új) - `test/fixtures/remoteEditorLinux.py` (új) - `test/latencyMonitor.test.js` (új) - `README.md` - `docs/remote-editor-latency.md` (ez a fájl) - `../.github/workflows/remote-editor-tests.yml` (új)