Changelogs

Layout visual: cabecera con nav/sesión/idioma + pie, tema Tailwind

12 de julio de 2026 a las 22:57

adevopg · 4a783d1

- components/Header.tsx (server, lee sesión): marca, nav (Inicio; login/register o account/logout según sesión), LanguageSwitcher y LogoutButton. - components/LanguageSwitcher.tsx (cliente): cambia de idioma conservando la ruta (next-intl usePathname/useRouter). components/LogoutButton.tsx (compartido). - components/Footer.tsx. app/[locale]/layout.tsx envuelve children con Header/Footer (columna min-h-screen). Se unifica el LogoutButton (se borra el de account/). - messages: namespace Nav. Verificado: home ES/EN con cabecera+nav+idioma+pie; enlaces locale-aware (/en/login); textos por idioma. Al leer sesión en el header, todas las rutas pasan a dinámicas.




Registro + activación por email en Next.js (SRP6 + nodemailer)

12 de julio de 2026 a las 22:53

adevopg · f332fc3

- lib/mail.ts: transporte SMTP (nodemailer, mismas creds Gmail que Django). - lib/register.ts: registerAccount (valida, comprueba email existente, crea fila en home_accountactivation reutilizando la tabla de Django, envía email de activación); activateAccount (crea battlenet_accounts con SRP6 v2 + account con SRP6 Grunt, como activate_account_view: expansion=2, battlenet_index=1; borra la activación). - Route handlers /api/auth/register y /api/auth/activate. - Páginas app/[locale]/register (RegisterForm cliente) y app/[locale]/activate-account (ActivateClient auto-POST al abrir el enlace). Textos en messages (Register, Activate). Validado: validaciones (missingFields/passwordMismatch/invalidEmail/passwordTooLong); ciclo completo activación->crea bnet+account->login OK con la cuenta creada (needsSelection=false), password mala->invalidCredentials. Todo en TS, crypto validada.




Cierra el flujo de login: logout, selector de cuenta y /account con guardas

12 de julio de 2026 a las 22:46

adevopg · e00a439

- Route handlers: /api/auth/logout (destroy sesión), /api/auth/select-account (fija la cuenta de juego elegida, valida que pertenece a la bnet en sesión). - app/[locale]/select-account: página SSR (guarda: sin bnetId -> login) + lista de cuentas de juego (SelectAccountForm cliente) -> /account. - app/[locale]/account: página protegida (sin bnetId -> login; sin username -> select-account) con datos de sesión + LogoutButton. - Textos en messages (Account, SelectAccount). Verificado: guardas locale-aware (ES /account -> /login, EN /en/account -> /en/login, 307), logout OK, select-account sin sesión 401. Redirect i18n con next-intl.




Login end-to-end en Next.js: iron-session + auth SRP6 + página i18n

12 de julio de 2026 a las 22:42

adevopg · 60c2e44

- lib/session.ts: sesión cifrada httpOnly con iron-session (SESSION_SECRET en .env.local). SessionData {bnetId, bnetEmail, username, accountId}. - lib/auth.ts: authenticate(email,password) verifica contra battlenet_accounts con bnetVerify (SRP6 v2); getGameAccounts(bnetId). Resiliente si acore no está. - app/api/auth/login/route.ts: POST -> autentica, fija sesión, resuelve cuentas de juego (1 -> auto; 0/varias -> needsSelection). Devuelve JSON. - app/[locale]/login: página SSR + LoginForm (cliente, next-intl, router i18n). Textos en messages/*.json (namespace Login). - tsconfig target ES2020 (literales BigInt de bnet.ts). Validado end-to-end: con una cuenta creada por bnet.py (como haría AzerothCore), el login TS la verifica OK y emite la cookie de sesión; password incorrecta -> invalidCredentials; sin campos -> missingFields. Página en ES y EN.




Port de bnet.py a TypeScript (SRP6 v2 + Grunt), validado equivalente a Python

12 de julio de 2026 a las 22:36

adevopg · 10ba2d3

lib/bnet.ts reimplementa la criptografía Battle.net de home/bnet.py con BigInt nativo + node:crypto: - SRP6 v2 (battlenet_accounts): PBKDF2-HMAC-SHA512, N 2048 bits, g=2, ajuste de bit alto, módulo estilo Python, verifier little-endian (ToByteVector). - SRP6 Grunt/SHA1 (cuenta de juego): g=7, N 256 bits, verifier 32B little-endian. - bnetMakeRegistration/bnetVerify, gameCalculateVerifier/gameMakeRegistration/ gameVerify, bnetSrpUsername, normalizeEmail, makeGameAccountUsername. Validado con vectores cruzados contra la impl. Python (mismos email/pass/salt -> mismo verifier; verificación en ambos sentidos): TODO COINCIDE. Se añade tsx (dev) para ejecutar scripts TS (Node del sistema no trae strip-types).





SÍGUENOS EN