# Content Editor – strukturális helyreállítás ## Cél és hatókör Ez a dokumentum a `MITHOME-30` feltárását és a kezdeti adathelyreállítást rögzíti. A Content Editor a `proto/src/content/**/*.json` fájlokat írja, ezért a hiba a megjelenő weboldal-tartalmat közvetlenül érinti. ## Talált hiba A böngészős mentési kód minden mező értékét szövegként írta vissza. Mentés előtt kiürítette az összes tömböt, majd a `a.b[0].c` útvonalat törékeny reguláris kifejezéssel dolgozta fel. Emiatt: - a tömbök `[]` értékre ürültek, az elemek pedig hibás, például `items[0]` nevű objektumkulcsokba kerültek; - az objektumokat és beágyazott tömböket a felület `"[object Object]"` szöveggé alakíthatta; - a számok és logikai értékek szöveggé alakultak; - egyes kulcsok sérültek (`id` helyett `i.$1`, `description` helyett `0.$1escription`). ## Helyreállítás – 2026-08-17 Az alábbi fájlok strukturálisan helyreálltak: - `pages/home.json` – a Git-történet utolsó ép változatából, a későbbi `https://mail.mozdit.hu` webmail-címet megtartva; - `pages/about.json` – a helyes tömbök és objektumok visszaállításával; - `pages/services.json` – a részletes szolgáltatás-specifikációk beágyazott objektumaival együtt; - `pages/adatvedelem.json` és `pages/hasznalati-feltetelek.json` – a későbbi, üzletileg releváns `Szigetszentmiklós` szöveg megtartásával. Minden `src/content/pages/*.json` fájl JSON-szintaktikája és a korábbi sérülési mintákra végzett ellenőrzése rendben van. A teljes unit tesztcsomag 55 sikeres teszttel lefutott. ## A hiba megelőzése a kliensben A `content-editor.js` mentési logikája most karakterenként elemzi az útvonalakat, ezért a HTML-sablon escape-elése nem módosíthatja a parser működését. A felület rekurzívan rendereli az objektumokat és a beágyazott tömböket; a boolean checkboxként, a szám number-inputként szerkeszthető. A mentés ezek típusát megőrzi. A ténylegesen generált böngésző-kódot ellenőrző regressziós teszt: ```sh node scripts/test-content-editor-serializer.js ``` A teszt egy beágyazott tömböket és objektumokat, valamint string-, boolean- és numerikus mezőket tartalmazó mintán ellenőrzi a mentési körutazást. ## Szerveroldali védelmi réteg A `MITHOME-41` részeként a `proto/src/content/schema.js` az összes szerkeszthető content-fájl kötelező mezőit, típusait és megengedett kulcsait írja le. A Next.js loader és a Content Editor ezt az egy közös validátort használja. A mentés csak sikeres validáció után történik. Az Editor legfeljebb 256 KiB-os request body-t fogad; hibás JSON vagy sémahiba `422` választ ad, és az eredeti fájlt érintetlenül hagyja. Érvényes mentéskor: 1. az eredeti JSON időbélyeges példánya a `.content-backups/` könyvtárba kerül; 2. az új tartalom egy célfájllal azonos könyvtárban létrehozott ideiglenes fájlba íródik; 3. az ideiglenes fájl atomikus átnevezéssel váltja fel a célfájlt. A backup-könyvtár szándékosan nincs Gitben. A séma- és atomikus mentési tesztek: ```sh node scripts/test-content-schema.js node scripts/test-content-editor-save.js ``` ## Hozzáférésvédelem A Content Editor csak akkor indul el, ha a környezetben mindkét változó meg van adva: ```sh CMS_USER= CMS_PASS= ``` Nincs beégetett alapértelmezett belépési adat. A szerver kizárólag a `127.0.0.1` címen figyel, ezért távoli használathoz Nginx/VPN vagy SSH tunnel szükséges. A böngésző minden módosító kéréshez szerver által kiadott CSRF-tokent küld. Az ismételt hibás bejelentkezést és a publikálási kéréseket IP-alapú, 15 perces csúszóablakos limit védi. A mentések és publikálások minimális auditbejegyzést írnak a `.content-editor-audit.jsonl` fájlba (időpont, esemény, felhasználó, célfájl, eredmény); secretet és teljes contentet nem naplóz. Ez a fájl, valamint a backupok nincs Gitben. A védelmi alapteszt: ```sh node scripts/test-content-editor-security.js ``` ## Következő védelmi lépések 1. A szerveroldali mentésnek sémaellenőrzést, atomikus írást és visszaállítható mentést kell használnia (`MITHOME-41`). 2. A publikálási folyamatot a natív, systemd-alapú kiadási eljáráshoz kell igazítani (`MITHOME-42`). 3. A Content Editor alapértelmezett hitelesítő adatait és a hiányzó CSRF-, audit- és rate-limit védelmet meg kell szüntetni (`MITHOME-43`).