> Tämän käännöksen kielentarkistus on kesken. Vertaa epäselviä kohtia [englanninkieliseen alkuperäiseen tekstiin](https://www.sm.ch-j.eu/docs/i18n/en/remote-editor-latency.md). # Etäeditorin tallennus ja latenssin seuranta ## Syyt Edellinen editori latasi työtiedostonsa kohteen emohakemistoon, jota SSH-tili ei useinkaan voi kirjoittaa `/etc`:n tai `/var`in alle. SFTP uudelleennimeä annettu ei valtuutettua sudo-polkua, perustason konfliktitarkastusta, tietoturvametatietojen todentamista tai luotettavaa ylikirjoitusta semantiikasta. Sen virheenkäsittelijä poisti väliaikaisen kopion ja poisti perintämateriaalin silloinkin, kun valmistuminen oli epävarmaa. Istunnon tila paljasti aiemmin vain yhteyden tilan. Pääteindikaattoria syöttävää SSH-vastemittausta ei ole vahvistettu. ## Tallenna protokolla 1. Kiinteä SSH-auttaja avaa säännöllisen, yhden linkin tiedoston käyttäen kuvaajan suhteellista versiota toiminnot ja `O_NOFOLLOW` jokaiselle polkukomponentille. Se vangitsee sisällön, SHA-256-hashin, laitteen/inodin, UID:n, GID:n ja täydelliset lupabitit, nanosekundin muuntamisen/muutosajat sekä kaikki luettavissa olevat laajennetut ominaisuudet. Core tarkistaa hasiksen ja purkaa koodit tiukasti UTF-8:ltä, säilyttäen BOM:n. Jokainen asiakirja saa läpinäkymättömän `editId`:n, joka on suunnattu sen liitännän, pääteistunnon ja palvelimen henkilöllisyyden mukaan. 2. Luottamuksettoman tilin selvittäminen Koti `pwd.getpwuid(os.getuid())`:n kautta, luo `$HOME/ch-j-sm/`-moodilla `0700` ja luo yksityisen, yksinomaisen perintälehden. Toisen tilin omistama turvaton koti, symlink-työtila tai työtila hylätään. 3. Core lataa piilotetun, satunnaisen 128-Bitti `.tmp` työtiedosto läpi SFTP ilun Yksinomainen luonti (`wx`), tila `0600` ja kuudenkymmenen sekunnin kanava/laajennusaikalisä. Lehdessä on tavoite, alkuperäinen perustaso ja odotettu työhash; siinä ei ole valtakirjoja. 4. **Yksi SSH Exec suorittaa koko maalinteon**, vapaaehtoinen kautta olemassa oleva sudon toteuttaja. Auttaja avaa turvallisesti yksityisen työkopion ja huuhtelee sen. Se lukitsee alkuperäisen inodin, tarkistaa sen perustason, luo kohteen viereen eksklusiivisen kohdetiedoston, kirjoittaa kaiken sisällön, soveltaa ja todentaa metatiedot, tarkistaa alkuperäisen uudelleen ja huuhtoo tilalle. 5. Sama kansio `os.replace` korvaa kohteen atomisesti. Vanhempi Hakemisto huuhtoutuu ja lopullinen polku, hash, inodi ja metatiedot todennetaan. Alkuperäinen polku on saatavilla, kunnes se vaihdetaan. Työtiedostoa ei koskaan siirretä tiedostojärjestelmien välillä, eikä sitä koskaan poisteta viimeistelemällä. 6. Kun Core on saanut varmistuneen menestyksen, erillinen puhdistus tarkistaa finaalin sisällön ja tietoturvan metatiedot ennen työtiedoston ja lehden poistamista. Siivousvirhe raportoi yhä varmistuneesta tallenteesta `recoveryAvailable: true`:llä. Epäonnistunut lataus, epäonnistunut sudo, ristiriita, metadatavirhe tai epäonnistunut vaihto pitää alkuperäisen ja kaikki lavastetut aineistot. Epätäydelliset lähetykset tunnistetaan sellaisenaan, eikä niitä voida palauttaa täydellisinä muokattuina asiakirjoina. Menetetty SSH-viestintä, puuttuva poistumistila, aikakatkaisut ja odottamattomat viimeistelytulokset ilmoitetaan **untuntemattomana**:nä, joka ei koskaan ole tallennettuna. Ydin estää toisen tallenteen epävarmassa asiakirjassa; automaattista korvaamista ei ole. ## Metatiedot, oikeudet ja turvallisuusrajat Auttaja säilyttää ja tarkistaa UID:n, GID:n ja kaikki POSIX-lupabitit, mukaan lukien suorituskelpoiset, asetuoidut, setgid- ja tahmeat kappaleet. Se toistaa Linux-laajennetut attribuutit tavulle, mukaan lukien POSIX ACLs, ominaisuudet ja SELinux-tarrat. Omistus ja tiedostojen sisältö asetetaan ennen turvallisuusominaisuuksia, koska kirjoittelut/laput voivat selvittää ominaisuuksia tai erikoisoikeuksia. Perityt kohteen ominaisuudet, jotka puuttuvat alkuperäisestä, poistetaan. Muutosaika heijastaa uutta kirjoitusta eikä sitä kopioida alkuperäisestä. Unrepreadable tai unrepresentable attribuutti keskeyttää toiminnan; metadataa ei pudoteta hiljaa. IMA/EVM-allekirjoitukset torjutaan selkeästi, koska sisällön kopioiminen/sitominen eheyteen mitätöisi ne. Symlinkit kohde- tai kotipolulla, kovasidotut tiedostot ja epäsäännölliset tiedostot hylätään. Ei käytössä ole mitään paikan päällä olevaa tai heikompaa SFTP- varaosaa. Tavanomainen kirjoitettava tallentaa SSH-tilin. Suojattu tallennus vaatii selkeän `{ sudo: true }`-salasanan; salasanattomaan sudoon voi käyttää myös sudo-salasanoja. Salasanat validoidaan ja välitetään vain kanavalla stdin, ei koskaan komennon, päiväkirjan, työtiedoston, kirjaajan tai etävirheen sisällä. Root SSH - istunnot käyttävät olemassa olevaa suoraa juurisuorittajaa. Epäonnistunut valtuutus jättää alkuperäisen ja työkopion koskemattomaksi. Kaikki juurina (suora juuri SSH tai sudo) suoritetut tallennukset hylkäävät myös muiden tilien omistamat tai kirjoitettavat kohdehakemistot/-esittäjät tai käyttävät ACL:ää sen sijaan, että luottaisivat toisen tilin hallitsemaan etuoikeutettuun polunimeen. Kiinteä auttaja toimii `python3 -I -B`:llä: se ei huomioi käyttäjä Python-polkuja, työhakemistoa ja käyttäjäsivustopaketteja eikä kirjoita tavukoodia. Polkuja ja JSON Coressa on kuorittu argumentteja. Liitännäiset eivät koskaan saa mielivaltaista SSH execiä tai SFTP-kahvoja. Käytössä on edelleen olemassa oleva hiekkalaatikko CSP, manifestioikeudet, isäntäavainvarmennus ja päivitysvarmennus. ## Liitännäinen API ja jäljellä oleva Monaco-integraatio **Erikseen jaettu Monacon/Tiedostopäällikkö UI on poissa tästä kassasta. Sen UI-integraatiota, sudo nopeata, likaista buffer-käsittelyä ja käännöksiä ei voitu toteuttaa tai testata täällä.** Liitännäinen on Hash & Checksum -liitännäinen. Mitään korviketiedostojen hallintalähdettä ei keksitty. Nykyisiä menetelmiä on edelleen saatavilla. Lisäaineiden menetelmille/vaihtoehdoille altistuu hiekkalaatikoitu esikuormitus ja luvan tarkastama ajoaika: ```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. ``` Recovery methods hyväksyy valinnaisen lopullisen `{ sudo: true, sudoPassword }`- argumentin, kun kohteen tarkastaminen vaatii nousua. Ne säilyttävät todennetun käyttäjän työtilan myös silloin, kun se suoritetaan sudolla. Lehdet selviytyvät sovelluksesta uudelleen ja SSH kytketään uudelleen; toipuminen ei koskaan automaattisesti toista viimeistelyä. Tarkista talteen otettua puskuria vasta avattua kohdetta vasten, ennen kuin se nimenomaisesti säästetään. `files.read`-vartijat lukevat, tarkastavat ja käsittelevät julkaisua. `files.write`-suojat säästävät ja korjaavat. `writeText` torjuu yhä olemassa olevien liitännäisten epäonnistumisen; `saveText` palauttaa strukturoidun `{ ok, value/error }`-korun, koska Electron pudottaa omia ominaisuuksia hylätyille Error-objekteille. Perinnöllinen kolmeosainen `writeText` voi käyttää yhden avoimen asiakirjan perustasoa. Useita saman polun eläviä asiakirjoja vaatii `editId`:n, moniselitteiset puhelut epäonnistuvat turvallisesti sen sijaan, että ne valitsisivat toisen asiakirjan perustason. Liitännäisten tulisi vapauttaa käyttämätön kahva. Ulkoisen käyttöliittymän on näytettävä tallennus välittömästi, pidettävä puskurit likaisina epäonnistumisen varalta, tarjottava sudoa vasta lupa-/varmennusvirheiden jälkeen, osoitettava ristiriitoja ilman ylikirjoitusta ja tarjottava palautusta yhteyden menetyksen tai tuntemattoman lopputuloksen jälkeen. Sen on käännettävä nämä osavaltiot tšekiksi, saksaksi ja englanniksi. Ehdotettu tilakopio: | 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 | ## Latenssimääritelmät ja elinkaari **Ping** on latenssi, josta raportoi todellinen asiakaspuolen ICMP-vastaaja selvitetylle tutkimusajanjaksolle SSH. Core vetoaa alustan ping-suorittimeen epäyhtenäisesti kiinteällä parametrisarjalla, ilman kuori- tai hallintakäynnistysvaatimusta. Linux, macOS (mukaan lukien `ping6`) ja Windows- argumentit valitaan erikseen. Estetty ICMP, puuttuva suoritustiedosto, aikakatkaisu, epäkelpo ulostulo tai vain ylärajalla oleva Windows-vastaus, kuten `<1ms`, tuottaa epätodennäköisen arvon, ei keksittyä lukua. **SSH RTT** on yksitoikkoinen `performance.now()`-ohjelma, jonka kesto on kiinteä `true` -ohjelma, joka koskee olemassa olevaa varmennettua SSH:n asiakasta. Se sisältää kanavan asettelun, palvelimen prosessoinnin ja vastaustoimitukset; se ei ole puhdas verkon RTT tai SSH kirjautumisaika. Käännetty indikaattorin työkaluvihje selittää tämän eron. Seuranta käynnistyy heti, kun pääte yhdistyy. Probeja kulkee samanaikaisesti ja epäyhtäjaksoisesti viiden sekunnin aikalisällä. Seuraava näyte on määrä ottaa 12 sekuntia edellisen näytteen valmistumisen jälkeen, mikä estää päällekkäisyydet. Katkaise keskeytykset ICMP:ltä, poista ajastimet, peruuttaa SSH-työn ja poistaa arvot. Tallennetun henkilöllisyyden tarkastukset estävät etukäteisyhteyden julkaisemisen yhteyden uudelleen liittämisen jälkeen. ICMP:n epäonnistuminen ei koskaan muuta SSH-yhteystilaa. Latenssi kulkee nykyisen `state`-tapahtuman / `ssh:state` IPC:n hyötykuorman sisällä: ```js latency: { pingMs: 24.1, sshRttMs: 31.25, measuredAt: "…" } ``` Saatavilla olevat numerot ovat `null`. Kompaktipäätemittarissa käytetään millisekuntia, lokalisoitua, saatavilla olevaa tekstiä ja Tšekin /German/English-tarroja. Se piiloutuu irtikytkentään. Lisärenderin suorituskykyä tai IPC-pyyntöä ei tarvittu. ## Validointi- ja toimintarajat - Juokse `app/`:stä: `npm ci`, sitten `npm test`. - Lopullinen paikallinen tulos: **179-testit; 163 läpäisi, 0 epäonnistui ja 16 jätti **:n väliin. Kaikki hypyt ovatko Linux-tiedostojärjestelmän jutut tässä macOS -isännässä. `npm ci`, Python syntaksikokoelma ja `git diff --check` valmistuivat onnistuneesti. - Testit kattavat Core save/recovery, sudo-protokollan ja salasanojen uudelleenjaon, Real POSIX -kuori siteeraa vihamielisiä polkuja, konflikteja, latauksia, epäonnistuneita siivouksia, epävarmoja tuloksia, samanaikaisia asiakirjoja, IPC-oikeuksia ja latenssin elinkaarta. - Linux-tiedostojärjestelmätestit käyttävät lähetettyä Python- sisääntulopistettä yksityisellä Testaa tilin kotihaku: omistus/mode/xattrs, POSIX ACLs, symlinkit/hardlinkit, FIFO-tiedot, lataus- ja metadatavirheet, korvausviat, kohdekilpailut, tuntemattomat korvausten jälkeiset tulokset ja palautuminen. Cross-filesystem -lavastus käyttää `/dev/shm`:tä ja toista tiedostojärjestelmää, kun se on saatavilla. Nämä testit jäävät väliin muilla kuin Linux-isännöillä; puuttuvat ACL/erillistiedostojärjestelmät jätetään nimenomaisesti huomiotta. - Lisätty Linux GitHub Toimintojen tehtävä suorittaa koko ohjelman ja toistaa tiedostojärjestelmän tapauksia juurina. Tätä työnkulkua ei ole lähetetty tästä työpuusta. - Paikallinen varmennus tehtiin macOS:llä. Python-lähdesyntaksi tarkistettiin suoralla Komentolinja Työkalut Python-teloitettava. Oikea macOS-lopback ICMP:n savushekki palautti `0.071 ms`:n. Paikallisesti ei testattu livekauko SSH-palvelinta, Windows -runtimea, Linux:n juoksuaikaa, SELinuxin käyttöönottoa tai Monacon ulkoista UI:tä. - Etätekstin muokkaus vaatii nyt Linux:tä ja Python 3'ta kuvaajan kanssa. Filesystem/xattr-tuki. Puuttuva tulkki epäonnistuu selvästi. Tämä Core kieltäytyy tarkoituksellisesti turvattomista metatiedoista, linkeistä ja hakemistoasetuksista. - Lukitus on neuvoa-antavaa: yhteistyöhön osallistumattomat prosessit voivat yhä kilpailla kapealla viimeisen lähtötarkastuksen ja atomin uudelleennimen välisen ajan. Linux ei toimita mitään yleistä atomisisältö-hash-vertailu- ja -korvaustoimintaa. Tarkastukset havaitsevat muutoksia ennen kyseistä aikaväliä; säilytetyt työkopiot tukevat toipumista jälkeenpäin. - Perintätiedot pysyvät etätilillä, kunnes puhdistus on varmistettu. Epätäydellinen Ristiriitaisia ja tutkimattomia lehtiä ei koskaan heitetä hiljaisesti pois. Ei ole automaattista palautustiedoston vanhenemista eikä pakkokorvausvaihtoehtoa. - `npm ci` raportoi 17-riippuvuusauditoinnin löydöksistä (9 kohtalainen, 8 korkea). Tämä muutos ei muuta riippuvuuksia tai sovelluksen päivitysluottamusmallia. Käyttäjä pyysi säilyttämään olemassa olevan työpuun, tällä hetkellä `feature/hash-checksum-plugin`:n, muutokset; mitään haarakytkimestä tai irrallista puhdistusta ei tehty. ## Tehtävään vaihdetut tiedostot - `src/main/files/remoteFileService.js` - `src/main/files/remoteEditor.py` (uusi) - `src/main/sessions/sessionManager.js` - `src/main/sessions/latencyMonitor.js` (uusi) - `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` (uusi) - `test/remoteEditorProtocol.test.js` (uusi) - `test/remoteEditorLinux.test.js` (uusi) - `test/fixtures/remoteEditorLinux.py` (uusi) - `test/latencyMonitor.test.js` (uusi) - `README.md` - `docs/remote-editor-latency.md` (tämä tiedosto) - `../.github/workflows/remote-editor-tests.yml` (uusi)