Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ jobs:
run: yarn eslint .

- name: Run TypeScript checks
run: yarn tsc --noEmit
run: yarn next typegen && yarn tsc --noEmit

- name: Test career applications
run: yarn test:career
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ jobs:
run: yarn eslint .

- name: Run TypeScript checks
run: yarn tsc --noEmit
run: yarn next typegen && yarn tsc --noEmit

- name: Test career applications
run: yarn test:career
Expand Down
56 changes: 56 additions & 0 deletions docs/security-updates.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
# Biztonsági frissítés – 2026. szeptember 6.

Ág: `feat/security-updates`, a karrierfejlesztésre építve. Az ellenőrzések helyi környezetben történtek; éles rendszert és Google-táblázatot nem módosítottunk.

## Függőségek

- Next.js 15.5.9 → 16.3.4; React és React DOM 19.2.1 → 19.2.8.
- Payload és minden közvetlen `@payloadcms/*` csomag egységesen 3.88.0. A csomagok verzióját rögzítettük. Az új `@payloadcms/next` peer dependency tartománya nem támogatja a Next.js 15.5 ágat, ezért szükséges a 16-os főverzió.
- A közvetlenül importált `sharp` most explicit, 0.35.4-es függőség. A nem használt közvetlen `image-size` függőséget eltávolítottuk; az új csomaggráfban a sérülékeny `image-size`, `fast-xml-parser` és `tar` csomag sem szerepel.
- A lockfile többi csomagját a megadott verziótartományokon belül frissítettük, köztük a Drizzle ORM-et 0.45.2-re.
- A Drizzle Kit régi `@esbuild-kit/core-utils` függősége esbuild 0.18-at kér. Egy szűk, erre az útvonalra vonatkozó Yarn resolution 0.25.12-re emeli. Ez szándékos kompatibilitási figyelmeztetést okoz telepítéskor; a szinkron/aszinkron TypeScript-fordítást és a Payload migrációgenerálást külön ellenőriztük. Más esbuild-verziót nem ír felül.

## Megmaradó auditjelzés és helyi védelem

Ugyanazzal a `yarn audit --json` ellenőrzéssel, advisory-azonosító szerint összevonva:

| Súlyosság | Frissítés előtt | Frissítés után |
| --- | ---: | ---: |
| Kritikus | 2 | 0 |
| Magas | 71 | 0 |
| Közepes | 46 | 1 |
| Alacsony | 11 | 0 |

Az egyetlen megmaradó jelzés a `GHSA-jg8r-5jh2-v2xj`: a Payload alapértelmezett fiókfeloldási jogosultsága. A 3.88.0-s kiadáshoz sincs publikált javítás. A `Users.access.unlock` ezért minden HTTP-kliens számára tiltja a műveletet. A böngészős integrációs ellenőrzés bejelentkezett és névtelen kérésnél is 403 választ igazolt, miközben a normál adminbejelentkezés továbbra is működött. A csomagszintű audit ettől még közepes hibát jelez, és 4-es kilépési kóddal tér vissza; nem rejtettük el a jelzést. A külön feloldási végpont jelenleg nem használható adminból sem.

A GitHub default branchhez tartozó Dependabot-számláló külön mérés: az csak a módosítások integrálása után változhat.

## Kompatibilitás

- A build továbbra is Webpacket használ (`next build --webpack`), így a Next.js 16 alapértelmezett buildeszköz-váltása nem módosítja a csomagolást.
- A megszűnt `next lint` helyett `eslint .` fut, a Next.js natív flat konfigurációjával. Két új React Compiler-szabály figyelmeztetés marad: a Compiler nincs bekapcsolva, a meglévő komponensek átírása külön feladat. Az összes eddigi lintellenőrzés megmaradt; jelenleg 0 hiba és 9 figyelmeztetés van.
- A Next.js frissítette a TypeScript JSX-beállítását és a generált route-típusok hivatkozásait. A CI és a release típusellenőrzése előtt `next typegen` fut.
- A YouTube-képek engedélyezése a régi `images.domains` helyett HTTPS `remotePatterns` beállítást használ.

## Korábbi eseményséma-hiány javítása

A teljes oldalas böngészőteszt kimutatta, hogy a migrációkból felépített helyi adatbázisból hiányzott az események `slug` és `link_to_picture_from_event_id` oszlopa, és a `location` még kötelező volt. Ezek a mezők/beállítások már a frissítés előtti forráskódban és snapshotokban szerepeltek; nem a Payload-frissítés változtatta meg a sémát.

A `20260906_220000_events_baseline` migráció pótolja az oszlopokat, indexeket és a galériahivatkozást, valamint opcionálissá teszi a helyszínt. A meglévő URL-eket megtartja, a hiányzókat egyedi `esemeny-{id}` értékkel tölti ki, ütközés esetén számozással. Visszavonáskor nem töröl felhasználói adatot. A telepítés során a szokásos migrációs lépés szükséges.

## Ellenőrzés

- Production build, típusellenőrzés, lint és 12/12 automatizált jelentkezési teszt sikeres. A CI típusgenerálása és típusellenőrzése külön, `.env` és korábbi `.next` állományok nélküli könyvtárban is sikeres.
- Látható Chromiumban 13 publikus oldal, adminbejelentkezés és kérdésmentés; pozíció-előtöltés; megváltozott űrlap 409-es kezelése a válaszok és a CV megtartásával; valódi helyi magyar beküldés PDF-fel és angol beküldés PDF nélkül; adminban visszaolvasott válaszok; admin PDF-letöltés és névtelen hozzáférés tiltása. Nem volt JavaScript-oldalhiba. Az ideiglenes kérdést és jelentkezéseket a teszt végén eltávolítottuk.
- Világos/sötét téma, 1440/390 px, HU/EN: 38 kontraszt- és állapotellenőrzés sikeres, vízszintes túlcsordulás nélkül. A vizsgált szövegek legkisebb kontrasztja 5,34:1.
- Mobilmenü, témaváltás, helyszín nélküli tesztesemény létrehozása, naptárbejegyzés és eseményrészletező oldal sikeres; a teszteseményt eltávolítottuk.
- A sikerpipa animációja 440 ms alatt lefut; csökkentett mozgásnál statikusan jelenik meg.
- Az eseménymigrációt a frissítés előtti adatbázis külön másolatán is kétszer lefuttattuk: a meglévő URL és eseményadat megmaradt, az ütköző generált URL egyedi utótagot kapott.
- Az audit- és böngészős bizonyítékok helyileg a Gitből kizárt `.local-verification/` könyvtárban találhatók. A tesztek helyi tesztadatokat használtak; a külső szolgáltatások teljes működése és az éles telepítés nem része ennek az ellenőrzésnek.

## Források

- [Next.js augusztusi biztonsági kiadás](https://nextjs.org/blog/august-2026-security-release)
- [Next.js 16 frissítési útmutató](https://nextjs.org/docs/app/guides/upgrading/version-16)
- [Payload fiókfeloldási jogosultság](https://github.com/advisories/GHSA-jg8r-5jh2-v2xj)
- [esbuild fejlesztői szerver](https://github.com/advisories/GHSA-67mh-4wv8-2f99)
23 changes: 12 additions & 11 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -1,13 +1,5 @@
import { dirname } from "path";
import { fileURLToPath } from "url";
import { FlatCompat } from "@eslint/eslintrc";

const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);

const compat = new FlatCompat({
baseDirectory: __dirname,
});
import nextVitals from "eslint-config-next/core-web-vitals";
import nextTypescript from "eslint-config-next/typescript";

const eslintConfig = [
{
Expand All @@ -22,7 +14,16 @@ const eslintConfig = [
"src/payload-types.ts",
],
},
...compat.extends("next/core-web-vitals", "next/typescript"),
...nextVitals,
...nextTypescript,
{
// New React Compiler diagnostics stay visible without making this security
// upgrade depend on unrelated component rewrites. Compiler is not enabled.
rules: {
"react-hooks/set-state-in-effect": "warn",
"react-hooks/immutability": "warn",
},
},
];

export default eslintConfig;
3 changes: 2 additions & 1 deletion next-env.d.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
/// <reference types="next" />
/// <reference types="next/image-types/global" />
/// <reference types="next/navigation-types/compat/navigation" />
/// <reference path="./.next/types/routes.d.ts" />
import "./.next/types/routes.d.ts";
import "./.next/types/root-params.d.ts";

// NOTE: This file should not be edited
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
5 changes: 4 additions & 1 deletion next.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,11 @@ import type { NextConfig } from "next";
const nextConfig: NextConfig = {
output: "standalone",
images: {
domains: ["i.ytimg.com"],
remotePatterns: [
{
protocol: "https",
hostname: "i.ytimg.com",
},
{
protocol: "https",
hostname: "**.fbcdn.net",
Expand Down
35 changes: 19 additions & 16 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@
"private": true,
"scripts": {
"dev": "next dev --turbopack",
"build": "next build",
"build": "next build --webpack",
"start": "next start",
"lint": "next lint",
"lint": "eslint .",
"payload:migrate": "node --import ./css-loader-register.mjs ./node_modules/.bin/payload migrate",
"payload:migrate-status": "node --import ./css-loader-register.mjs ./node_modules/.bin/payload migrate:status",
"payload:generate-types": "node --import ./css-loader-register.mjs ./node_modules/.bin/payload generate:types",
Expand All @@ -18,24 +18,24 @@
"@fullcalendar/daygrid": "^6.1.19",
"@fullcalendar/interaction": "^6.1.19",
"@fullcalendar/react": "^6.1.19",
"@payloadcms/db-postgres": "^3.80.0",
"@payloadcms/drizzle": "^3.80.0",
"@payloadcms/email-nodemailer": "^3.80.0",
"@payloadcms/next": "^3.80.0",
"@payloadcms/payload-cloud": "^3.80.0",
"@payloadcms/richtext-lexical": "^3.80.0",
"@payloadcms/translations": "^3.80.0",
"@payloadcms/db-postgres": "3.88.0",
"@payloadcms/drizzle": "3.88.0",
"@payloadcms/email-nodemailer": "3.88.0",
"@payloadcms/next": "3.88.0",
"@payloadcms/payload-cloud": "3.88.0",
"@payloadcms/richtext-lexical": "3.88.0",
"@payloadcms/translations": "3.88.0",
"@radix-ui/react-slot": "^1.2.3",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"graphql": "^16.8.1",
"image-size": "^1.2.1",
"lucide-react": "^0.511.0",
"next": "15.5.9",
"payload": "^3.80.0",
"next": "16.3.4",
"payload": "3.88.0",
"pdf-lib": "^1.17.1",
"react": "19.2.1",
"react-dom": "19.2.1",
"react": "19.2.8",
"react-dom": "19.2.8",
"sharp": "0.35.4",
"tailwind-merge": "^3.3.0",
"tsconfig-paths": "^4.2.0"
},
Expand All @@ -49,11 +49,14 @@
"autoprefixer": "^10.4.21",
"esbuild": "^0.25.2",
"eslint": "^9",
"eslint-config-next": "15.2.1",
"eslint-config-next": "16.3.4",
"postcss": "^8.5.3",
"tailwindcss": "^4.1.7",
"tw-animate-css": "^1.3.0",
"typescript": "^5"
},
"packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
"packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e",
"resolutions": {
"**/@esbuild-kit/core-utils/esbuild": "0.25.12"
}
}
4 changes: 4 additions & 0 deletions src/collections/Users.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@ export const Users: CollectionConfig = {
description: 'Felhasználók, akik be tudnak jelentkezni az admin felületre.',
},
auth: true,
access: {
// Disable the default cross-account unlock endpoint (GHSA-jg8r-5jh2-v2xj).
unlock: () => false,
},
fields: [
// Email added by default
// Add more fields as needed
Expand Down
42 changes: 42 additions & 0 deletions src/migrations/20260906_220000_events_baseline.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import { type MigrateUpArgs, sql } from '@payloadcms/db-postgres'

/** These fields existed in snapshots, but were absent from the executable chain. */
export async function up({ db }: MigrateUpArgs): Promise<void> {
await db.execute(sql`
ALTER TABLE events ADD COLUMN IF NOT EXISTS link_to_picture_from_event_id integer;
ALTER TABLE events ADD COLUMN IF NOT EXISTS slug varchar;
ALTER TABLE events ALTER COLUMN location DROP NOT NULL;

-- Keep existing URLs; give legacy events a unique URL based on their ID.
DO $$
DECLARE legacy_event record; candidate varchar; suffix integer;
BEGIN
FOR legacy_event IN SELECT id FROM events WHERE slug IS NULL OR btrim(slug) = '' ORDER BY id LOOP
candidate := 'esemeny-' || legacy_event.id;
suffix := 0;
WHILE EXISTS (SELECT 1 FROM events WHERE slug = candidate) LOOP
suffix := suffix + 1;
candidate := 'esemeny-' || legacy_event.id || '-' || suffix;
END LOOP;
UPDATE events SET slug = candidate WHERE id = legacy_event.id;
END LOOP;
END $$;

ALTER TABLE events ALTER COLUMN slug SET NOT NULL;
CREATE UNIQUE INDEX IF NOT EXISTS events_slug_idx ON events (slug);
CREATE INDEX IF NOT EXISTS events_link_to_picture_from_event_idx ON events (link_to_picture_from_event_id);
DO $$ BEGIN
IF NOT EXISTS (
SELECT 1 FROM pg_constraint
WHERE conname = 'events_link_to_picture_from_event_id_gallery_id_fk'
AND conrelid = 'events'::regclass
) THEN
ALTER TABLE events ADD CONSTRAINT events_link_to_picture_from_event_id_gallery_id_fk
FOREIGN KEY (link_to_picture_from_event_id) REFERENCES gallery(id) ON DELETE SET NULL;
END IF;
END $$;
`)
}

// An existing installation may already contain these fields and user data.
export async function down(): Promise<void> {}
6 changes: 6 additions & 0 deletions src/migrations/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import * as migration_contact_baseline from "./20260906_154658_contact_baseline";
import * as migration_events_baseline from "./20260906_220000_events_baseline";
import * as migration_20250907_085438 from './20250907_085438';
import * as migration_20251108_000000_add_support_us_button_text from './20251108_000000_add_support_us_button_text';
import * as migration_20251108_172023_add_events_facebook_event_link from './20251108_172023_add_events_facebook_event_link';
Expand Down Expand Up @@ -74,4 +75,9 @@ export const migrations = [
down: migration_20260906_154659_career_form_cv_contact.down,
name: '20260906_154659_career_form_cv_contact'
},
{
up: migration_events_baseline.up,
down: migration_events_baseline.down,
name: '20260906_220000_events_baseline',
},
];
2 changes: 1 addition & 1 deletion tests/career.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ test("PDF parser accepts a real document and rejects renamed text and malformed
assert.ok(
(
await validateCV(
new File([bytes], "cv.pdf", { type: "application/pdf" }),
new File([new Uint8Array(bytes)], "cv.pdf", { type: "application/pdf" }),
)
).length,
)
Expand Down
7 changes: 4 additions & 3 deletions tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
"moduleResolution": "bundler",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
"jsx": "react-jsx",
"incremental": true,
"plugins": [
{
Expand All @@ -35,10 +35,11 @@
"next-env.d.ts",
"**/*.ts",
"**/*.tsx",
".next/types/**/*.ts"
".next/types/**/*.ts",
".next/dev/types/**/*.ts"
],
"exclude": [
"node_modules",
".local-verification"
]
}
}
Loading
Loading