build(deps): bump actions/checkout from 4 to 7#1
Closed
dependabot[bot] wants to merge 1 commit into
Closed
Conversation
Author
LabelsThe following labels could not be found: Please fix the above issues or remove invalid values from |
miningtheblocks
added a commit
that referenced
this pull request
Jun 17, 2026
…heckRevoked, password reset)
Cierra los 3 CRIT del bloque "identity" del Audit Round 2 — todos comparten
la ventana de 60min de account takeover que existía post-revocación.
1. Wallet hot-swap fix en claimGemNFT + submitGemClaim.
Antes ambas funciones leían walletAddress del body del request → bypaseaban
el cooldown de 24h de setUserWallet. Durante un takeover (atacante con
token válido), podía claimear NFTs / submit gem claims a SU wallet aunque
setUserWallet siguiera bloqueado por cooldown.
Ahora ambas leen walletAddress server-side desde users/{uid}.walletAddress.
La única vía para setear/cambiar wallet pasa por setUserWallet (cooldown
+ validación de formato). request.data.walletAddress se ignora silenciosamente
por backwards-compat con clientes pre-Commit-B; el web claim form sigue
mostrando el campo pero queda como TODO sacarlo (debe leer userSnap).
(Agente #1 HIGH-4 + Agente #6 + Agente #8)
2. assertFreshToken helper + aplicación en 3 operaciones financieras.
El runtime de Firebase Functions decodea el JWT pero NO chequea
tokensValidAfterTime. Sin esto, un token robado o post-revoke sigue
válido hasta el TTL JWT (~60min). El helper compara auth_time del token
contra user.tokensValidAfterTime via Admin SDK (mismo patrón que
requireAdminFresh). Bonus: chequea user.disabled (ban via Console).
Aplicado en: claimGemNFT, createCryptoPayment, submitGemClaim.
submitGemClaim usa la forma onRequest equivalente: verifyIdToken(token, true).
NO aplicado a mineCube (hot path, ~100 calls/sesión); daño con token
revocado acotado a picks remanentes.
(Agente #6 CRIT)
3. requestPasswordReset Cloud Function reemplaza sendPasswordResetEmail directo.
Antes el cliente llamaba Firebase Auth SDK Web → email genérico de Firebase,
sin revoke de tokens (account takeover playbook clásico) y sin notify al
user real durante un reset iniciado por atacante con email comprometido.
Nueva función:
- Anti-enumeration: rate-limit 3/hora por email + retorno OK siempre.
- revokeRefreshTokens(uid) ANTES de mandar el link → todas las sesiones
existentes invalidadas. User real re-loguea con la new password OK
(token nuevo con auth_time > tokensValidAfterTime). Atacante con
sesiones activas las pierde.
- Email branded con texto explícito "tus sesiones fueron cerradas; si no
fuiste vos ignorá este email — tu password actual sigue OK".
Login.js actualizado para usar callRequestPasswordReset en lugar del Web
SDK directo. sendPasswordResetEmail removido de imports.
(Agente #6 CRIT)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
miningtheblocks
added a commit
that referenced
this pull request
Jun 17, 2026
…rkGemRedeemed, payment checkpoint) Cierra los 3 CRIT del bloque crypto/economy del Audit Round 2 — todos relacionados con pérdida monetaria silenciosa. 1. effectiveSeed = HMAC(SERVER_SEED, "mtb-seed-v1|serverId|ep:N") en helpers. Antes el SERVER_SEED era global: si se filtra (vía malware en máquina dev + firebase-tools.json + gcloud secrets versions access), un atacante podía pre-calcular TODAS las posiciones de gemas tier-1 ($100k) en TODOS los servers presentes Y futuros — leak retroactivo + futuro permanente. Con effectiveSeed derivado per (serverId, episodeNumber): un leak del SERVER_SEED actual solo compromete las posiciones de los servers activos en ese momento. Plan de rotación futura: bumpear el prefix "mtb-seed-v1|" a "v2|" + introducir SERVER_SEED_v2 → nuevos servers usan v2, los in-flight terminan con v1 (preservando determinismo). Backwards-compat: si episodeNumber es null/undefined, se devuelve el rootSeed sin derivar — tests existentes (24 passing) pasan sin cambio. mineCube siempre pasa episodeNumber explícito. (Agente #1 HIGH-12 + Agente #11 CRIT-11-05) 2. runCryptoPaymentProcessing usa checkpoint persistido. Antes: ventana fija de 200 bloques hacia atrás (~6.6 min Polygon). Si el scheduler se atrasaba (publicnode.com outage, GCF cold start lento, function timeout retry), pagos USDC legítimos quedaban fuera de la ventana → user paga $15 USDC, doc pendingCryptoPayments expira a los 30min sin acreditar, soporte humano para reconciliar. Ahora: runtime/cryptoPaymentCheckpoint persiste lastBlockProcessed. Cada run lee desde checkpoint+1 hasta safeBlock. Si una query RPC falla en cualquiera de los 2 contratos USDC, NO se avanza el checkpoint — próximo run reintenta el rango (processedTxs/{txHash} previene doble-crédito). Cap defensivo de 5000 bloques (~3h) para evitar queries gigantes tras un outage largo (los pagos fuera del cap quedan en logs para investigación). (Agente #8 CRIT) 3. markGemRedeemed Cloud Function para evitar double-pay. Antes: el admin pagaba en cash (Stripe/wire/crypto a wallet del user) y marcaba la gema como redeemed a mano via Firebase Console. Si el admin se olvidaba — o si el user re-submitGemClaim antes de la marca — el admin podía pagar 2× la misma gema (hasta $100k tier-1). Ahora: callable admin-only que (1) busca la gema por code via collectionGroup, (2) TX atómica idempotente que rechaza si ya redeemed/minted, (3) registra paymentRef + adminNote + redeemedBy, (4) marca el gemClaim asociado (si vino del web claim form), (5) audit log en adminActions con código + ownerUid + paymentRef. Requiere requireAdminFresh (claim admin verificado fresh via Admin SDK, no del token cacheado). No expuesto en src/firebase/functions.js — admins lo invocan via script o admin UI futura. (Agente #8 CRIT-5) Tests: 24/24 helpers tests pasan sin cambio. assertFreshToken de Commit B + checkRevoked de submitGemClaim ya cubren auth de las funciones tocadas. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
miningtheblocks
added a commit
that referenced
this pull request
Jun 17, 2026
Cierra 6 hallazgos críticos pendientes pre-launch. Cambios localizados, sin refactor estructural. 1. activityFeed TTL `expiresAt` (Agente #12 + #11 HIGH-11-40). writeActivity ahora agrega expiresAt = now + 7d. Firestore TTL Console borrará docs viejos automáticamente (después de activar la policy — pendiente operacional en RUNBOOK). Pre-fix: feed crecía infinito → cost amplification + PII histórica. 2. mineCube docId `${K}_${cubeNumber}` (Agente #1 CRIT-1). Pre-fix: `mined/${cubeNumber}` colisionaba entre layers. K=100 mina N=5; cuando K decrementa a 99 y otro user mina N=5 en K=99, el docId "5" colisiona → data mixing. Pre-launch: 0 mines reales en producción → forward-only safe. 3. processPendingMints audit log en adminActions (Agente #6 HIGH). La invocación manual del cron de mints no quedaba en adminActions, solo en Cloud Logging (retención 30d). Para forensic post-incidente esencial. 4. Override global de console.log REMOVIDO (Agente #4 CRIT-FE-06). Pre-fix: console.log = wrapper que filtraba un warning de expo-gl. Anti-pattern: HMR re-importa el módulo → wrappea otra vez → cadena infinita de wrappers. Plus dead code en prod (babel strippea console.log). 5. miningAnimations dead state REMOVIDO (Agente #5). const [miningAnimations, setMiningAnimations] = useState(new Map()) declarado pero setMiningAnimations nunca se llamaba. 3 sites referenciaban este state muerto: useEffect cleanup forEach (no-op, removido), render loop check hasActiveAnimations (siempre false), comments documentan migración a useRef si vuelve la necesidad. 6. getFaceRange() lee del cache faceRangesRef (Agente #5 CRIT-4). Pre-fix: iteraba 240k cubeNumbers por call. JSX lo llamaba en cada re-render = 15-60×/seg × 240k = 14M iter/seg = stutter Android low-end. Fix: cache hit primero (faceRangesRef ya populated por recomputeFaceRanges en buildLayer). Loop solo en cache miss. Bonus: setCorsHeaders unused import removido (post Commit K). Tests: helpers OK, lint clean, parse OK. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
c875f40 to
4a87720
Compare
miningtheblocks
added a commit
that referenced
this pull request
Jun 23, 2026
Doc en RUNBOOK de las copias offline del keystore release v2 hechas el 2026-06-23: - Copia #1: Hitachi sda /run/media/code/datos/keystore-backup-2026-06-23/ - Copia #2: USB Kingston DT 101 G2 (DataTraveler, extraído físicamente) - Copia #3: off-site (pendiente) Test recovery EXITOSO 2026-06-23: descifrado con password de Bitwarden, SHA-256 raw matches 36785fb2...af9f6f64. Próximo test recovery 2027-Q1. Pre-fix: 1 keystore + 1 .gpg, ambos en el MISMO disco sdb (PNY SSD). Disk failure = bricked release line forever (mismo modo del v1 perdido). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 7. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](actions/checkout@v4...v7) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com>
4a87720 to
3813227
Compare
miningtheblocks
added a commit
that referenced
this pull request
Jun 25, 2026
Causa raíz (regresión vieja, nunca detectada): El fix de seguridad CRIT-1 (Round 2 Agente #1) cambió el docId del backend de `${cubeNumber}` a `${K}_${cubeNumber}` para evitar colisiones de mined entre capas. functions/index.js:896. El frontend nunca se adaptó — `cubeNumberToFaceGrid(id)` hace `Number("99_12345") = NaN` → retorna null → el listener skipea TODOS los docs previos. Resultado: en cold start `minedCubes` quedaba en `new Set()`. Por eso: - Long-press abría el modal en cubos ya minados (findClosestVisibleNumber no skipeaba porque minedCubes.has(apiId) era false). - La API rebotaba con "already mined" (backend SÍ sabía). - Tras "already mined", el flujo manual hacía setMinedCubes(prev=>s.add(apiId)) con apiId NUMÉRICO, eso disparaba el useEffect retry y pintaba el patch "espontáneamente" del cubo recién intentado. - Los minados de días atrás nunca aparecían porque nunca pasaban por el flujo manual; solo viven en Firestore con docId "K_N" que el listener ignoraba. Fix (DynamicCube201.js:1935): - Parsear `ch.doc.id`: si contiene "_" usar split y tomar la N; si no, fallback al formato viejo (sólo N) para backward-compat. - `idsToAdd.push(n)` con número puro en lugar del docId completo, para que `minedCubes` sea consistente con el formato del flujo manual. No tocamos backend ni rules — el formato K_N es correcto y necesario por CRIT-1. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Author
|
Superseded by #32. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Bumps actions/checkout from 4 to 7.
Release notes
Sourced from actions/checkout's releases.
... (truncated)
Changelog
Sourced from actions/checkout's changelog.
... (truncated)
Commits
9c091bbupdate error wording (#2467)1044a6dgetting ready for checkout v7 release (#2464)f028218Bump the minor-npm-dependencies group across 1 directory with 3 updates (#2462)d914b26upgrade module to esm and update dependencies (#2463)537c7efBump@actions/coreand@actions/tool-cacheand Remove uuid (#2459)130a169Bump js-yaml from 4.1.0 to 4.2.0 (#2461)7d09575Bump flatted from 3.3.1 to 3.4.2 (#2460)0f9f3aaBump actions/publish-immutable-action (#2458)f9e715ablock checking out fork pr for pull_request_target and workflow_run (#2454)df4cb1cUpdate changelog for v6.0.3 (#2446)