> Den här översättningen granskas språkligt. Jämför otydliga avsnitt med det [engelska originalet](https://www.sm.ch-j.eu/docs/i18n/en/remote-editor-latency.md). # Fjärrredigerare som sparar och latensövervakning ## Rotorsaker Den tidigare editorn laddade upp sin arbetsfil i målfärgens överliggande katalog, som ofta inte kan skrivas av SSH-kontot under `/etc` eller `/var`. SFTP bytte namn gav ingen auktoriserad sudobana, baslinje konfliktkontroll, säkerhetsmetadataverifiering eller tillförlitlig överskrivning semantik. Dess felhanterare tog bort den tillfälliga kopian och tog bort återvinningsmaterial även när det var osäkert. Sessionsstatusen visade tidigare endast anslutningstillståndet. Det fanns ingen ICMP eller autentiserad SSH responsmätning som matade terminalindikatorn. ## Spara protokoll 1. En fast SSH-hjälpare öppnar en vanlig enkellänkfil med deskriptor-relativ operationer och `O_NOFOLLOW` för varje sökväg komponent. Den fångar innehållet, SHA-256 hash, enhet/inod, UID, GID, fullständiga behörighetsbitar, nanosekund ändrings-/ändringstider och alla läsbara utökade attribut. Kärnan verifierar hash och avkodar strikt UTF-8, bevara en BOM. Varje dokument får en ogenomskinlig `editId`, som skickas till dess plugin, terminal session och server identitet. 2. En oförutsedd förberedelse åtgärd löser det autentiserade kontots hemma genom `pwd.getpwuid(os.getuid())`, skapar `$HOME/ch-j-sm/` med läge `0700` och skapar en privat, exklusiv återhämtningsjournal. Ett osäkert hem, symlinkarbetsutrymme eller arbetsutrymme som ägs av ett annat konto avvisas. 3. Kärnan laddar upp en dold, slumpmässig 128-bit `.tmp` arbetsfil genom SFTP med Exklusivt skapande (`wx`), läge `0600` och en sextiosekunders kanal/uppladdning timeout. Tidskriften innehåller mål, original baslinje och förväntad arbetshash; den innehåller inga referenser. 4. **One SSH exec utför hela finalization**, valfritt genom befintlig sudo- executor. Hjälparen öppnar sig säkert och hashar den privata arbetskopian och spolar ner den. Den låser den ursprungliga inoden, kontrollerar dess baslinje, skapar en exklusiv målfil bredvid målet, skriver allt innehåll, tillämpar och verifierar metadata, kontrollerar originalet igen, och spolar ut bytet. 5. En samma-katalog `os.replace` atomärt ersätter målet. Föräldrarna Katalogen spolas och den slutliga sökvägen, hash, inode och metadata verifieras. Den ursprungliga sökvägen är fortfarande tillgänglig tills den ersätts. Arbetsfilen flyttas aldrig över filsystem och tas aldrig bort genom slutgranskning. 6. Efter Core får en verifierad framgång, en separat städkontroll om finalen innehåll och säkerhetsmetadata innan du tar bort arbetsfilen och tidskriften. Rensningsfel rapporterar fortfarande en bekräftad spara med `recoveryAvailable: true`. Misslyckades ladda upp, misslyckades sudo, konflikt, metadata fel eller misslyckad ersättning behåller det ursprungliga och alla iscensatta materialet. Ofullständiga uppladdningar identifieras som sådana och kan inte återvinnas som ett fullständigt redigerat dokument. Förlorad SSH kommunikation, saknade utgång status, timeouts och oväntade slutresultat rapporteras som **unknown**, aldrig så sparad. Kärna blockerar en annan spara på ett osäkert dokument; det finns ingen automatisk ersättning försök. ## Metadata, privilegier och säkerhetsgränser Hjälparen bevarar och verifierar UID, GID och alla POSIX behörighetsbitar, inklusive körbara, setuid, setgid och klibbiga bitar. Den återger Linux utökade attribut byte för byte, inklusive POSIX ACL, funktioner och SELinux-etiketter. Äganderätt och filinnehåll ställs in före säkerhetsattribut, eftersom skrivning/chown kan rensa funktioner eller särskilda behörighetsbitar. Ärvda målattribut som saknas på originalet tas bort. Ändringstiden återspeglar den nya texten och kopieras inte från originalet. Ett oläsbart eller orepresentabelt attribut avbryter operationen. Metadata släpps inte tyst. IMA/EVM-signaturer avvisas uttryckligen eftersom kopiering av innehåll/inomliggande integritetssignaturer skulle ogiltigförklara dem. Symlänkar i mål- eller hemsökvägen, hårdkopplade filer och icke-regelbundna filer avvisas. Ingen på plats eller svagare SFTP överskriva reserv används. Vanliga skrivbara sparar körs som SSH-konto. Skyddade räddningar kräver explicit `{ sudo: true }`; ett sudolösenord är valfritt för lösenordslös sudo. Lösenord valideras och skickas endast på kanal stdin, aldrig inne i kommandot, journal, arbetsfil, logger eller fjärrfel. Root SSH-sessioner använder den befintliga direkta root-drivrutinen. Misslyckad behörighet lämnar originalet och arbetskopian intakt. Alla sparar körs som root (direkt root SSH eller sudo) också avvisa målkataloger / ansökare ägs eller skrivbar av andra konton, eller bär en tillgång ACL, snarare än att lita på ett privilegierat sökväg som styrs av ett annat konto. Den fasta hjälparen körs med `python3 -I -B`: den ignorerar användaren Python-sökvägar, arbetskatalogen och användarwebbplatspaket, och skriver ingen bytekod. Paths och JSON argument är skal-citerade i Core. Insticksprogram får aldrig godtyckliga SSH exec eller SFTP handtag. Befintlig sandlåda, CSP, manifestbehörigheter, verifiering av värdnyckeln och uppdateringskontroll är fortfarande i bruk. ## Insticksprogram API och återstående Monaco integration **Den separat distribuerade Monaco/File Manager UI är frånvarande från denna kassan. Dess UI integration, sudo prompt, smutsiga buffer hantering och översättningar kunde inte genomföras eller testas här.** Den medföljande plugin källan är Hash & Checksum plugin. Ingen alternativ filhanterarens källa uppfanns. De befintliga metoderna är fortfarande tillgängliga. Tillsatsmetoder/alternativ exponeras av den sandlådaade förspänningen och behörighetskontrollerad körtid: ```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. ``` Återvinningsmetoder accepterar en valfri slutlig `{ sudo: true, sudoPassword }` argument vid inspektion av ett mål kräver höjning. De behåller den autentiserade användarens arbetsyta även när den utförs via sudo. Journaler överlever omstart av appen och SSH återansluter. Återhämtningen upprepar aldrig automatiskt slutanpassningen. Granska en återvunnen buffert mot ett nyöppnat mål innan du uttryckligen sparar den. `files.read`-skydd läser, inspekterar och hanterar release. `files.write` vakter sparar och återhämtning rensning. `writeText` avvisar fortfarande vid fel för befintliga plugins; `saveText` returnerar ett strukturerat `{ ok, value/error }` kuvert eftersom Electron släpper anpassade egenskaper på förkastade Felobjekt. En äldre treargument `writeText` kan använda baslinjen för ett enda öppet dokument. Flera levande dokument för samma sökväg kräver `editId`; tvetydiga äldre samtal misslyckas säkert i stället för att välja ett annat dokuments baslinje. Insticksprogram bör frigöra oanvända handtag. Den externa UI måste visa sparande omedelbart, hålla buffertar smutsiga vid fel, erbjuda sudo endast efter tillstånd / autentisering misslyckanden, visa konflikter utan överskrivning, och erbjuda återhämtning efter anslutning förlust eller ett okänt resultat. Den måste översätta dessa stater på tjeckiska, tyska och engelska. Föreslagen tillståndskopia: | 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 | ## Definitioner av latens och livscykel **Ping** är den latency som rapporteras av ett faktiskt klientsides-ICMP ekosvar på det av ICMP fastställda IP som används av SSH. Core åberopar plattforms ping körbar asynkront med en fast argument array, utan ett skal eller administratör start krav. Linux, macOS (inklusive `ping6`) och Windows argument väljs separat. Blockerad ICMP, ett felande körbart program, en tidsgräns, ogiltig utgång eller ett Windows-svar som `<1ms` ger ett otillgängligt värde, inte ett uppfunnet nummer. **SSH RTT Ordförande** är monotont `performance.now()` varaktighet för en bestämd `true` exec begäran om den befintliga autentiserade SSH klient. Det inkluderar kanalinställning, serverbearbetning och svar leverans; det är inte ren nätverk RTT eller SSH inloggningstid. Den översatta indikator verktygstips förklarar denna distinktion. Övervakningen startar så snart terminalen ansluter. Probes körs samtidigt och asynkront, med en fem sekunders begäran / process timeout. Nästa prov planeras tolv sekunder efter det föregående provet, vilket förhindrar överlappning. Koppla ner avbryta ICMP, rensar timer, avbryter pågående SSH arbete och rensar värden. Registeridentitetskontroller hindrar en tidigare anslutning från att publicera efter återanslutning. ICMP-fel ändrar aldrig SSH anslutningstillstånd. Latency färdas inuti den befintliga `state` händelsen / `ssh:state` IPC nyttolast: ```js latency: { pingMs: 24.1, sshRttMs: 31.25, measuredAt: "…" } ``` Otillgängliga nummer är `null`. Den kompakta terminalindikatorn använder millisekunder, lokaliserad otillgänglig text och tjeckiska /German/English etiketter. Den gömmer sig på frånkoppling. Det behövdes ingen ytterligare verkställande förmåga för att utföra en avsändare eller begäran om IPC. ## Validering och driftsbegränsningar - Kör från `app/`: `npm ci`, sedan `npm test`. - Slutligt lokalt resultat: **179 tester; 163 passerade, 0 misslyckades, 16 hoppade över**. Alla hoppar är Linux filsystem fall på denna macOS värd. `npm ci`, Python syntax sammanställning och `git diff --check` avslutade framgångsrikt. - Testerna täcker Core sparar / återvinning, sudo protokoll och lösenord reaction, Real POSIX skal citat av fientliga vägar, konflikter, uppladdningar, misslyckad rensning, osäkra resultat, samtidiga dokument, IPC behörigheter och latens livscykel. - Linux filsystem tester utöva den levererade Python ingångspunkten, med hjälp av en privat Test account-home uppslagning: ägande /mode/xattrs, POSIX ACLs, symlinks/hardlinks, FIFOs, uppladdning och metadata misslyckanden, ersättningsfel, mållopp, okända resultat efter ersättning och återhämtning. Cross-filesystem iscensättning använder `/dev/shm` och ett annat filsystem när det är tillgängligt. Dessa tester hoppar över på icke-Linux värdar; saknade ACL / separat filsystem faciliteter är uttryckligen hoppat över. - Det tillagda Linux GitHub Actions-jobbet kör hela sviten och upprepar filsystemet Fall som rot. Detta arbetsflöde har inte skickats från detta arbetsträd. - Lokal validering skedde på macOS. Syntax från Python- källan kontrollerades med den direkta Kommandoradsverktyg Python körbar. En riktig macOS loopback ICMP rökkontroll returnerade `0.071 ms`. Ingen live fjärrserver för SSH, Windows-runtime, Linux runtime, SELinux-distribution eller extern Monaco UI testades lokalt. - Fjärrredigering av text kräver nu Linux och Python 3 med deskriptor-relativ Stöd för filsystem/xatr. En saknad tolk misslyckas explicit. Denna kärna vägrar avsiktligt osäkra metadata, länkar och katalogkonfigurationer. - Låsning är rådgivande: icke-samarbetande processer kan fortfarande ras i det smala intervallet mellan den senaste kontrollen vid baslinjen och atombytet. Linux levererar inget allmänt atominnehåll-hash jämföra-och-replace drift. Kontroller detekterar förändringar innan det intervallet; behållna arbetskopior stöder återhämtning efteråt. - Återhämtningsdata finns kvar på fjärrkontot tills en bekräftad sanering. Ofullständigt, Konfliktfyllda och oinspekterbara tidskrifter förkastas aldrig tyst. Det finns ingen automatisk återställningsfils utgång och inget påtvingat överskrivningsalternativ. - `npm ci` rapporterade resultaten av granskningen av beroendet av 17 (9 måttlig, 8 hög). Denna förändring ändrar inte beroenden eller programmets uppdaterade förtroendemodell. Användaren begärde att behålla ändringar i det befintliga arbetsträdet, för närvarande `feature/hash-checksum-plugin`; ingen grenbyte eller orelaterad rensning utfördes. ## Filer ändrade för aktiviteten - `src/main/files/remoteFileService.js` - `src/main/files/remoteEditor.py` (nytt) - `src/main/sessions/sessionManager.js` - `src/main/sessions/latencyMonitor.js` (nytt) - `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` (nytt) - `test/remoteEditorProtocol.test.js` (nytt) - `test/remoteEditorLinux.test.js` (nytt) - `test/fixtures/remoteEditorLinux.py` (nytt) - `test/latencyMonitor.test.js` (nytt) - `README.md` - `docs/remote-editor-latency.md` (den här filen) - `../.github/workflows/remote-editor-tests.yml` (nytt)