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
- A fix SSH segítő egy rendszeres, egy linkes fájlt nyit meg a deszkriptor-relatív
a műveletek és a
O_NOFOLLOWminden ú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átszatlaneditId-t kap, mely a plugin, terminál session és szerver identitására terjed ki. - 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 mode0700é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. - A 128-bit
.tmpworking file feltöltése a SFTP segítségével exkluzív alkotás (wx), mód0600é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. - 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.
- Egy azonos rendező
os.replaceatomilag 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. - 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:
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:
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, majdnpm 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 ésgit diff --checksikeresen 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 cijelentett 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.jssrc/main/files/remoteEditor.py(új)src/main/sessions/sessionManager.jssrc/main/sessions/latencyMonitor.js(új)src/main/plugins/pluginRuntime.jssrc/preload/pluginPreload.jssrc/renderer/app.jssrc/renderer/index.htmlsrc/renderer/styles.csssrc/renderer/i18n.jstest/remoteFileService.test.jstest/sessionManager.test.jstest/pluginRuntime.test.jstest/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.mddocs/remote-editor-latency.md(ez a fájl)../.github/workflows/remote-editor-tests.yml(új)