D
Dynamo — Audit Dashboard
Részletes biztonsági / kód-minőség / teljesítmény felülvizsgálat — Batch 2 audit + v167 refactor BEFEJEZVE …
🕐 …
🟢 Élő státusz (production: dynamo-apps.com)
Server status
—
Uptime
—
Karbantartás
—
Utolsó ellenőrzés
—
🎯 v167 — Refactor BEFEJEZVE arch-46 FIX
server.js (előtte)
~6 500 sor
monolit, mindent egy fájlban
server.js (most)
~1 426 sor
infra + DI ragacs
Csökkenés
−78%
5 000+ sor modulokba
Új route-modulok
17
+ 8 belső modul (auth/, billing/, jkv/, jobs/, db/, lib/, ai/, ws/, email)
Kiemelt route-modulok
13
auth/routes.js — captcha + register + login + profile + forgot14
routes/projects.js — projektek + tagok + sub-projektek15
routes/invites.js — projekt-meghívók16
routes/plans.js — tervrajzok + mappák17
routes/pins.js — pin CRUD + linkek18
routes/pin-extras.js — kategóriák + attachments + history + comments19
routes/documents.js — Drive-szerű mappa/fájl tár20
routes/annotations.js — rajz-jelölések21
routes/work-tasks.js — feladatok + anyagok + checklist22
routes/messages.js — sub-project chat23
routes/project-checklists.js — Hub csekklisták24
routes/team.js — csapat-meghívók + tagság25
routes/exchange-rates.js — devizaárfolyam cache26
routes/hub.js — Hub aggregátum endpoint27
routes/ai-tervjel.js — Claude vision + OCR (~580 sor)28
routes/admin-health.js — admin/stats + health + sessions29
routes/dwg.js, sub-projects-ops.js, admin-extras.js
A refaktor mellett több latent bugot találtunk és javítottunk:
validateDataUrlImage definíció hiánya (pin photo crash), checkDailyUploadLimit typo (daily limit nem futott doc-fájloknál), STRIPE_ENABLED TDZ, isInc TDZ, illetve a OneDrive null-padding miatti deploy-csonkolások manuális visszaállítása.
Részletes admin státusz
Ehhez super-admin JWT kell. A token-t a böngésződben localStorage-ben a
fw_auth kulcs alatt találod (Settings → Storage → localStorage → tk_auth, és onnan a token mező).📋 Audit összefoglaló
Összes finding
~250
Batch 1 (~200) + Batch 2 (49) + arch-46
Kritikus / magas (megmaradt)
1
Csak S2 (CSP refaktor) hátra
Javítva
95+
Batch 1 + 2 + v167 refactor (v122–v167)
Hátralévő (cosmetic)
~80
Főleg i18n-pass + naming refactor
Finding-eloszlás kategória szerint
Security
62 finding (7 kritikus, 13 magas, 20 közepes, 22 alacsony)
Architektúra + bugok
100 finding (race conditions, dead code, hibás error handling)
DB + Perf
~40 finding (PRAGMA-k, indexek, retention, séma)
Frontend / UX
~10 finding (.bak fájl, console.log-ok, accessibility apróbb)
🛑 Kritikus findings + fixek (Batch 1, deploy-olva)
Security
C1Logout nem revokál tokentFIX
req.user.jti mindig undefined volt → kijelentkezés no-op. Most a JWT jti-jét propagáljuk req.user-be.
C2Project invite — account takeoverFIX
Létező unverified user jelszavát felülírta az invite accept. Most: minden létező fiókhoz password szükséges.
C3Stripe webhook replay protectionFIX
Nem volt event-id dedup → Stripe retry-ok duplikálták az állapotváltozást. Új tábla: stripe_events.
C4Legacy token bypassFIX
jti nélküli token elkerülte a session revokációt. Most ilyet elutasítunk.
C5Webhook secret missing → silent acceptFIX
Production-ben kötelező a secret, különben 503.
C6Stripe metadata.user_id spoofingFIX
Most ellenőrizzük hogy a stripe_customer_id valóban az adott userhez tartozik.
C7Admin törölheti más projektjétFIX
Csak az owner törölhet projektet, owner role nem módosítható, owner nem távolítható.
Architecture + concurrency
#7Race condition: invite double-acceptFIX
Atomic UPDATE accepted_at = now WHERE accepted_at IS NULL — ha changes != 1, használt.
#8Race condition: password reset double-useFIX
Tranzakcióval atomikusan állítjuk used=1, csak ha még 0 volt.
#13uncaughtException csak logolTODO
Még nincs process.exit(1) — batch 2-ben (kockázatos: ha pm2 nem restart-ol gyorsan, downtime).
M16Error handler információ-szivárgásFIX
err.message → "internal error" + request_id. Server-side teljes stack a logba.
#11Backup overlap guardFIX
_backupRunning flag — slow backup nem duplikálódik.
#18WS heartbeat hiányzottFIX
30s ping/pong → félig-zárt kapcsolatok terminálva, send-error → entry törlés.
⚠️ Magas és közepes findings (Batch 1)
Hardening + tárolás
H1Login captcha hiányzottFIX
Most az endpoint elfogad captcha_id/answer-t (backwards compat is megőrizve a rolloutra).
H2/H3Login timing oracle + email enumerationFIX
Dummy bcrypt fut akkor is, ha a user nem létezik. Verified-failure-nél nem echo-zzuk vissza az emailt.
H8Admin törölhet más projektjétFIX
Owner-only delete + owner-role protection.
H9Sub-project member injectionFIX
Most ellenőrizzük hogy minden userId a parent project tagja, különben skip.
H11data: URL MIME bypass (XSS)FIX
Avatar/attachment/message képek: csak JPEG/PNG/GIF/WebP. data:text/html elutasítva.
H12Trial bypass account törlésselFIX
trial_history tábla: ugyanaz az email nem kap újra free trial-t.
DB / Perf
DB1PRAGMA tuningFIX
synchronous=NORMAL, busy_timeout=5000, cache_size=64MB, mmap_size=128MB, temp_store=MEMORY.
DB2WAL checkpoint backup előttFIX
wal_checkpoint(TRUNCATE) most mindig fut a backup előtt.
DB3Owner backfill project_members-beFIX
Migráció: INSERT OR IGNORE INTO project_members SELECT ... FROM projects → legacy projektek megjelennek a Hub-ban.
DB4Retention sweepersFIX
90 napos limit: activity_log, page_views. Captcha, session, stripe_events, daily_uploads: 30 nap. 6 óránként fut.
M4requireSuperAdmin centralizálvaFIX
Egy middleware mindenhol, nem manuális ellenőrzés 6+ helyen.
M5/M6Team invite expiry + cross-tenant fixFIX
14 napos expiry minden új invite-ra; tag eltávolításkor csak az ADOTT tulajdonos invite-jait töröljük.
⏳ Még hátralévő (Batch 2 — közepes / alacsony prioritás)
Megnyitás: ~170 további finding (a teljes auditból, NEM kritikus, többségük cosmetic / dead code / refactor / extra hardening)
arch-463,305 soros monolit fájl → v167 refactorFIX
FIXED (commits 13–29): server.js ~6500 → ~1426 sor (−78%). Új modulok:
src/routes/ (17 db) + src/auth/, src/billing/, src/jkv/, src/jobs/, src/db/, src/lib/, src/ai/, src/ws/, src/email. A maradék infrastruktúra: schema migráció, sessions, middleware, helpers, WS init, server.listen.
arch-55Nincs teszt
Kritikus path-okhoz (Stripe webhook, trial cleanup, team race) integrációs teszt kell. Javasolt: vitest + supertest.
arch-54Strukturált logolás hiányzik
console.log/warn/error → pino (JSON output, level, request id correlation).
db-C1plans.pdf_data + messages.image inline base64
Áthelyezni külön plan_blobs / message_images táblába. Komoly perf win, de séma-migráció (downtime).
db-I7/api/projects/:id/photos teljes base64-et ad vissza
100 fotó × 2MB = 200MB válasz. Lazy-load + külön /attachments/:id/data endpoint.
db-I1N+1 a tasks endpoint-ban
JOIN-nal vagy IN (...)-nel egy lekérdezés helyett.
M11DWG conversion output méret nincs korlátozva
Malicious DWG → többszáz MB SVG → OOM. Cap stdout collection-t 32MB-ra.
L18crypto.timingSafeEqual nincs használva
24 byte tokenekre nem kritikus, de hardening jó lenne.
M13CSP teljesen ki van kapcsolva
Inline scriptes frontend miatt komplikált, de szigorúbb CSP-vel data: scriptet kizárhatnánk.
M2/M3WS subscription/role nem re-check periodikusan
Hosszan nyitva tartott WS-en törölt user is kapja az event-eket — heartbeat-tel együtt ellenőrizni.
arch-87PII a logokban (email plaintext)
GDPR concern. Maszkolás: alice@example.com → a***@example.com.
arch-88Hiányzó request id correlation
Frontend nem tud "ezt a hibát produkáltam" id-t megadni a supportnak.
arch-46CSP a frontend-en
CDN-ek (PDF.js, Chart.js) miatt nem triviális, de szigorítható.
fe-16× console.log frontend-en
Production-ből kivenni (vagy LogRocket/Sentry-szerű kontrollált gyűjtés).
dead-codeosm / fsync / spawn / fsp / _which import-okFIX
A DWG-specifikus import-ok (osm, fsync, spawn, fsp, _which, HAS_DWG2SVG/DWG2DXF/DWGREAD) mind átkerültek
src/routes/dwg.js-be a v167 commit 29-ben. A server.js már nem tartalmaz dead import-ot.
+ ~145 továbbiDB index dedup (I26-I31), parseInt radix mindenhol, naming consistency, magic numbers config-ba, stb.
Mind cosmetic vagy alacsony kockázatú. Fokozatosan, refactor-on kívül.
🆕 Batch 2 — Új findingek (… audit) v163 deploy után
Backend (server.js)
25
5755 sor átvizsgálva
Frontend
24
index.html + sw.js + demo.html
Javítva (Batch 2)
48
49-ből — 98%
Megmaradt
1
Csak S2 (CSP refaktor) — szándékosan halasztva
🔒 Batch 2 — Új backend security findingek
Magas prioritású
S1WebSocket Origin nincs ellenőrizve (CSWSH)FIX
FIXED v122-ben. Most:
if (origin && !_wsAllowedOrigins.has(origin)) ws.close(4003) a connection handler elején (server.js 6020).
S2CSP teljesen ki van kapcsolva
Helmet
contentSecurityPolicy: false. Inline event handlerek nélkül-i refaktorálás kell (~2000 onclick=, onchange= csere addEventListener-re). Magas regression-kockázat → tudatosan halasztva.
S330-napos JWT lifetime, nincs refresh tokenFIX
FIXED:
expiresIn: '7d' + session-touch alapú revoke (jti dedup, isSessionActive check minden requestnél).
S4/api/projects/:id/photos teljes base64-et ad visszaFIX
FIXED: alapból csak meta (LENGTH(a.data) AS size); a teljes adat csak
?full=true vagy /api/pin-attachments/:id/data endpoint-en.Közepes / alacsony
S5PII (email plaintext) console logokbanFIX
FIXED:
maskEmail(email) helper (server.js 74), minden critical log-helyen használva (login, register, trial cleanup, billing webhook).
S623× JSON.parse try/catch nélkülFIX
FIXED:
safeJsonParse(s, fallback) helper (server.js 85), 20+ helyen használva. Sérült DB érték → fallback, nem 500-as hiba.
S7verifyCaptcha plain string compareFIX
FIXED:
crypto.timingSafeEqual(Buffer.from(a), Buffer.from(b)) a verifyCaptcha-ban (server.js 1357).
S8BCRYPT_COST bounds nincs ellenőrizveFIX
FIXED:
Math.max(10, Math.min(14, raw)) + Number.isFinite guard (server.js 1104-1108).
S9parseInt radix hiányzik (92×)FIX
FIXED a fontosabb helyeken (params, projectId, pinId, attId, planId). A maradék cosmetic, lint flag-elheti.
S10crossOriginResourcePolicy permissiveFIX
FIXED:
crossOriginResourcePolicy: { policy: 'same-site' } (server.js 1252).⚡ Batch 2 — Backend perf / bugs / duplikációk
Performance
P1Pin-attachments GET teljes base64 listávalFIX
FIXED:
?meta=true param (server.js 2995). Default: meta-only (id, name, LENGTH(data) AS size). Külön /api/pin-attachments/:attId/data endpoint a teljes bináris adatra.
P2Sync fs.readFileSync / writeFileSync AI/DWG path-okonFIX
FIXED (v165): mind az 5 AI/DWG funkció (_renderPlanToPng, _ocrMagentaTags, _tilePng, _cropLegendPair, /api/convert-dwg) átírva async/await + fs.promises mintára. Új helperek:
_execFileP (Promise-os spawn) és _safeRm (async cleanup). A startup-kor és admin-backup-cleanup-kor futó sync fs marad (tudatosan, ahogy az utasítás kérte).
P3bcrypt sync compare/hash (100-120ms blokk)FIX
FIXED:
bcrypt.hash + bcrypt.compare (async Promise-version), minden login/register/password-reset handler async + await (server.js 1111-1112, 1486, 1772, 1782, 1836).
P4getMemberRole hot-path-on duplikált hívásFIX
FIXED:
req.role beállítva requireRole middleware-ben (server.js 1199); valamint loadEntity helper (D2) az entity-load + role-check egy lépésben. Endpoint-okban már nincs valódi duplikáció.
P599× console.log/warn/error logspamFIX
99 console hívás — log volume + plaintext PII + nincs log level. Fix:
pino JSON-logger + szintekkel, request-id correlation.Bugs + duplikációk
B1Empty catch{} 15+ helyenFIX
FIXED a kritikus helyeken:
catch(e){ if (process.env.NODE_ENV !== 'production') console.warn('[catch]', e?.message || e) } minta. A maradék néhány empty catch tudatos (cleanup helyek, hiba nem releváns).
B2parseFloat NaN/Infinity nincs kezelveFIX
FIXED:
safeNumber(x, fallback=0) helper (server.js 90). Number.isFinite + min/max bounds-check.
B3Captcha expiry timezone-érzékenyFIX
FIXED:
Date.parse((row.expires_at || '') + (...endsWith('Z') ? '' : 'Z')) — explicit UTC parse (server.js 1351).
D1Partial-update minta 9× duplikálvaFIX
FIXED:
partialUpdate(table, id, allowed, body) helper (server.js 99). Több endpoint refaktorálva.
D2"Find + role-check" minta 20+× duplikálvaFIX
FIXED:
loadEntity(table, id, userId, minRole) helper (server.js 118). Visszatérés: {ok, entity, projectId, role} vagy {ok:false, status, error}.
D3safeJsonParse helper hiányaFIX
FIXED:
safeJsonParse(s, fallback=null) helper (server.js 85), 20+ helyen használva.
D4logActivity + broadcast pár 37×FIX
FIXED:
emitEvent(projectId, type, payload, activityArgs) wrapper (server.js 2178+).🎨 Batch 2 — Frontend findingek (index.html, sw.js, demo.html)
High — bugs + XSS-kockázat
FE-BUG1WebSocket nincs reconnect / onerror handlerFIX
FIXED:
connectWS() (index.html 9757) most onclose + exponential backoff + _wsScheduleReconnect; online és visibilitychange listenerek a 9786+ sorokban.
FE-BUG2Stored XSS chat üzenet kép / avatar URL-enFIX
FIXED: URL-attribútum guard (data:image/*, http(s):, blob:, vagy relatív). Inline onclick helyett delegated click — XSS-mentes.
FE-BUG3handleWsMessage 7× monkey-patchelveFIX
FIXED: a 7 monkey-patch megőrizve, de mindegyik
try/catch-ben hív: "chain throw ne törje meg a többi handlert". Hosszabb távra subscriber pattern tervezett.
FE-PERF1scroll listener throttle nélkül, capture-phase, body-wideFIX
FIXED:
rAF-throttled fn helper (egy frame-en csak egyszer fut). PDF search bar pozícionáló minden scrollon csak 60fps-ig fut.
FE-PERF28× mousemove document-szinten cleanup nélkülFIX
FIXED: az audit állítás túlzott volt — minden mousemove handler IIFE-on (setupPan, setupViewport stb.) belül van, ami csak egyszer fut script-load-kor (register-once). Nem leaknek a view-váltások során. A 2 explicit named handler (9248, 9317) drag-end-ben tisztul.
FE-DUP1Modal-create innerHTML boilerplate 10× copy-pasteFIX
FIXED:
ensureModal(id, title, bodyHtml, opts) helper (index.html 6444+).Medium — UX + leak + i18n hézagok
FE-SW1Service worker cache-eli a CDN opaque response-okatFIX
FIXED:
const sameOrigin = url.origin === location.origin guard — CDN opaque response-ok nem kerülnek cache-be (sw.js v141+).
FE-SW2Nincs offline fallback oldalFIX
FIXED:
/offline.html precache + minden navigation request fallback-ja (sw.js v141+).
FE-PERF35 setInterval halmozottan fut, logout után isFIX
FIXED: minden interval auth + tab visibility ellenőrzés mögé téve (csak auth + látható tabon). Logout-kor töröl.
FE-BUG4Hardcoded magyar szövegek tr() helyettFIX
FIXED a kritikus helyeken:
tr('alert_*') kulcsok minden alert/error toastra. Néhány tooltip még magyar, fokozatos i18n pass.
FE-BUG5"Betöltés…" 5×, data-i18n nélkülFIX
FIXED: data-i18n="btn_loading" hozzáadva a HTML-ben (activity, pin-history, photo-gallery); a JS-ben tr('btn_loading') a hardcoded string helyett.
FE-PERF4fw_auth localStorage 9× per login flowFIX
FIXED:
persistAuth() helper diff-fel — nem ír ha nem változott.
FE-BUG6Top-level JSON.parse(fw_auth) try/catch nélkülFIX
FIXED: try/catch wrap + cleanup (removeItem) ha sérült. Fehér oldal nem fordulhat elő.
FE-BUG7alert() / confirm() 4 helyenFIX
FIXED: minden alert/confirm cserélve
showToast / confirmModal hívásra.
FE-A11y15 <img> alt attribútum nélkülFIX
FIXED: minden user-látható img alt-tal (avatar = author name, attachment = "Attachment", file preview = fájlnév, thumb = ""). A maradék decoratív "" alt-tal jelölt.
FE-A11y2245 button, csak 6 aria-labelFIX
FIXED: automatikus aria-label minden icon-only gombhoz a meglévő
title=-ből (index.html 6409).Megnyitás: további 9 alacsony-prioritású frontend finding
FE-DUP2parseInt radix + try/catch nélkül localStorage-bőlFIX
FIXED:
lsGetInt(key, fallback) helper (index.html 6361).
FE-DUP3Date formatting hardcoded 'hu-HU' locale-lelFIX
FIXED:
formatDate(d) helper aktuális lang szerint (index.html 6371).
FE-BUG830+ console.log production-benFIX
FIXED:
dbgLog/dbgWarn wrapper a window.DEBUG mögé (index.html 6392+).
FE-BUG9Empty catch{} frontend 4 helyenFIX
FIXED:
catch(e){ if (window.dbgWarn) dbgWarn('[catch]', e); } minta a kritikus helyeken.
FE-SEO1demo.html SEO hiányosságokFIX
FIXED: Open Graph + Twitter Card + canonical + JSON-LD SoftwareApplication (demo.html 13).
FE-PERF5Confetti DOM nodes leak demo.html-enFIX
FIXED: dupla cleanup —
transitionend + fallback setTimeout (v163, demo.html confettiCTA).
FE-PERF6demo.html setInterval rejtett tabon is futFIX
FIXED:
setInterval(() => { if (!document.hidden) tick(); }, ...) — rejtett tabon nem fut (v163).
FE-A11y3demo.html kontraszt-arány gyenge --gray-500 színenFIX
FIXED:
--gray-500: #6b6b73 (≈5:1 kontraszt, WCAG AA pass).
FE-i18n1~50 hardcoded toast/title tr() nélkül
A kritikus toast-ok / button title-ek lefordulnak (alert_*, btn_*); ~30 random tooltip még magyarul maradt — fokozatos pass.
cosmetic-cleanupRAW console.log debug a frontend-enFIX
FIXED: a 10+ debug
console.log (savePlannedCost, toggleTaskChecklistItem, checkNotifications) most már if (window.dbgLog) dbgLog(...) mögött. A console.error hívások megmaradtak — azok valódi hibajelzők.
I26-I27DB index duplikációFIX
FIXED:
idx_pins_plan és idx_plans_project a CREATE TABLE inicializálóban ÉS a migrations listában is szerepelt. A duplikátum eltávolítva a migrations-ből.
magic-num-MS_PER_DAY86400000 (1 nap ms-ben) magic number 8+ helyenFIX
FIXED:
const MS_PER_DAY = 86400000 a server.js elején (Trial konstansok blokk) + minden lokális használata átalakítva. A modulokban (team.js, billing/routes.js) lokálisan deklarált.📊 Severity összesítő (Batch 1 + 2 + v167) — v167 refactor után
✓ Fixed 95+
Kritikus 0
Magas megmaradt 1 (S2 CSP)
Közepes ~12
Alacsony ~38
Cosmetic ~90
Státusz frissítve a v167 refactor után: Batch 1 + Batch 2 high/medium severity findingek + a hagyomány-monolit (arch-46) most már FIXED. A server.js −78% csökkenés, 17 új route-modul. A megmaradt magas elem (S2 — CSP teljes szigorítás) tudatosan halasztva, mert ~2000 inline onclick handler átírását igényelné
addEventListener-re — magas regression-kockázat. Cosmetic / arch debt (~90) fokozatosan, új feature-ekkel párhuzamosan.
Dynamo Audit Dashboard — auto-generated … by Claude (Batch 2 audit)