build(deps-dev): bump eslint from 9.39.4 to 10.5.0 in /functions#6
Closed
dependabot[bot] wants to merge 1 commit into
Closed
build(deps-dev): bump eslint from 9.39.4 to 10.5.0 in /functions#6dependabot[bot] wants to merge 1 commit into
dependabot[bot] wants to merge 1 commit into
Conversation
Author
LabelsThe following labels could not be found: Please fix the above issues or remove invalid values from |
dependabot
Bot
force-pushed
the
dependabot/npm_and_yarn/functions/eslint-10.5.0
branch
2 times, most recently
from
June 14, 2026 05:47
0609ed7 to
737eb7f
Compare
dependabot
Bot
force-pushed
the
dependabot/npm_and_yarn/functions/eslint-10.5.0
branch
2 times, most recently
from
June 14, 2026 17:55
e3b6680 to
66ac4a6
Compare
miningtheblocks
added a commit
that referenced
this pull request
Jun 17, 2026
… bombing, perf Round 2 de auditoría — 6 fixes baratos de alto ROI: - .easignore agrega *.jks, *.pkcs12, service-account*.json, *-adminsdk-*.json para evitar que eas build suba el keystore JKS o SA dedicados a EAS Cloud. (Agente #9 HIGH-09-19, Agente #11 HIGH-11-19) - UpdateModal allowlist agrega github.com con path-check estricto al repo oficial /miningtheblocks/Mining-The-Blocks/releases/download/. El sitio web sirve el APK desde GitHub Releases y la validación previa rechazaba ese host → users que tapeaban "Descargar" caían al fallback miningtheblocks.com y nunca llegaban al APK directo. (Agente #9 CRIT-09-01) - sendVerificationEmail con rate-limit 5/hora/uid via _rateLimitFirestore. Sin esto, un user recién creado podía bombear hasta que Gmail suspendiera el app-password compartido → outage TOTAL de emails (verify + claim + reportProblem + mint alerts). (Agente #6 CRIT, Agente #10 cross-ref) - mintProcessorScheduled + cryptoPaymentProcessorScheduled con self-throttle (early-return si la queue está vacía). El cron corre cada 5min aunque no haya trabajo; saltearlo evita cargar el eth provider, secrets, y RPC calls a publicnode.com (sin SLA). Ahorra ~$5/mes y reduce risk de rate-limit RPC. (Agente #12 P0) - WCAG-AA contrast bump en Login/Config/Profile: #555 (ratio ~3.5:1) → #888 (ratio ~5.4:1) en texto secundario #333 (ratio ~1.5:1) → #666 en primaryTxtDisabled de Login Cierra MED-10-45 y avanza compliance European Accessibility Act. - i18n agrega 2 keys faltantes (profile.walletCooldown + profile.emailNotVerified) en EN+ES. Profile.js las usaba con fallback inline; sin las keys reales el user veía el key literal "profile.walletCooldown" en pantalla. (Agente #10 parte de CRIT-10-04) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
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
…list + deep-link
Cierra Fase 2 del Audit Round 2. 6 items que comparten "infraestructura cross-cutting"
del frontend ↔ backend.
1. requireRegistered con whitelist explícito de providers.
Pre-fix: blacklist ("rechazar 'anonymous'"). Si Firebase habilita un
provider nuevo (Anonymous via Console, OIDC custom, beforeSignIn blocking
function que devuelve un provider desconocido), el flow lo aceptaba por
default. Whitelist = default-deny: solo password / google.com / apple.com
pasan. Provider desconocido → permission-denied:provider_not_allowed:{X}.
(Agente #6 CRIT)
2. notifyAllUsers FCM/Expo ramificación + token cleanup automático.
Pre-fix: TODOS los tokens iban al endpoint Expo Push API (incluyendo los
FCM nativos que el cliente registra desde V1.1.0+). Expo respondía error
sin tirar excepción → audit log decía "sent=N" cuando realmente fueron 0.
La única broadcast feature del producto NO entregaba mensajes y el admin
nunca se enteraba.
Fix: ramificar por pushTokenType. FCM via
getMessaging().sendEachForMulticast (hasta 500 tokens/call, devuelve
success/error por token). Expo legacy sigue por exp.host. Tokens con
responses "registration-token-not-registered" / "invalid-registration-token"
se borran en batch del user doc.
(Agente #10 CRIT-10-01 + CRIT-10-03)
3. sendPushToUser respeta settings.notify* del user + data payload + cleanup.
Pre-fix (Agente #4 + #10 CRIT-10-02): los toggles de Config.js
(notifyAdReady, notifyDaily, notifyRewards, notifyNewLayer) se persistían
en users/{uid}.settings.* pero el backend nunca los leía — dark pattern
explícito reportable a Play Store / GDPR.
Fix: signature ampliada a sendPushToUser(uid, titles, bodies, opts). Si
opts.notifyKey está y user.settings[notifyKey]===false, skip silencioso.
Default opt-in (undefined → enviar, conserva flow viejo).
3 call sites actualizados: mint complete + payment received + referral
bonus pasan { notifyKey: 'notifyRewards', data: { url: ... } }.
data payload + Object.fromEntries(String(v)) para que FCM acepte (FCM
exige todos los values como strings).
(Agente #10 CRIT-10-02 + CRIT-10-03 + HIGH-10-09)
4. t(key, vars) motor con interpolación + __DEV__ warnings.
Pre-fix: 17 call sites reimplementaban .replace('{x}', y) — riesgo de
reentrancia (si value contenía '{other}' el segundo .replace lo
interpretaba), keys faltantes mostraban el key literal al usuario.
Nuevo motor:
- t('msg', { name, h }) interpola {name} y {h} con String(v).
- En __DEV__ warna si la key no existe o un var declarado no fue provisto.
- Object.prototype.hasOwnProperty.call para evitar prototype pollution.
Profile.js migrado a la nueva API (las 2 sites con walletCooldown +
emailNotVerified). Los otros 15 call sites siguen funcionando con la
nueva t() porque vars es opcional (backwards-compat).
(Agente #10 CRIT-10-04 parcial — full migration de los 15 sites queda P2)
5. addNotificationResponseReceivedListener + DeepLinkHandler ampliado.
Pre-fix: push payload sin data → tap del push solo abre la app en la
última screen. User que recibe "Tu NFT llegó!" no llega a MyGems.
Fix: response listener en App.js dispara Linking.openURL(data.url) si
el push trae data.url con scheme conocido. DeepLinkHandler ampliado de
solo 'peaks' a peaks/gems/profile/buycredits/config/servers — alineado
con los modal keys del OverlayModalsProvider.
Subscription tracked en let-binding + cleanup en outer useEffect return
para evitar leak (paralelo al notifSetupTimer cleanup).
(Agente #10 HIGH-10-09 + HIGH-09-04 cross-ref)
Tests: 24/24 helpers tests pasan sin cambio. functions/index.js parsea OK.
Fase 2 cerrada (4 commits + Tier 1):
Tier 1: 1e1e160 (6 quick wins)
Commit A: d33f627 (schema + reorg + nonce lock)
Commit B: c9b2544 (wallet hot-swap + checkRevoked + password reset)
Commit C: 545c92c (effectiveSeed + payment checkpoint + markGemRedeemed)
Commit D: <hash> (push + i18n + providers + deep-link)
14 CRIT del Audit Round 2 cerrados. Próximo: Fase 3 (compliance + ops).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
miningtheblocks
added a commit
that referenced
this pull request
Jun 17, 2026
…rywhere)
Cierra dos gaps de compliance / takeover response del Audit Round 2.
1. deleteMyAccount — GDPR Art. 17 + Play Store policy compliance.
Pre-fix: el user solo podía pedir borrado por email a soporte
(privacy.html promete <30 días). Bloqueante para Play Store policy
(mayo 2024: self-serve account deletion in-app obligatorio para apps
con login) y para GDPR right to erasure escalable.
Estrategia: soft-delete con anonimización + 5y retention para AML/KYC.
- users/{uid} preservado pero pierde TODO el PII (email, profile, avatar,
pushToken, walletAddress, referralCode/referredBy, settings, language).
Mantiene `deletedAt` timestamp + displayName='[deleted]'.
- notifications/ → batch delete (no retention requirement).
- gems/ → SE PRESERVA (NFT records + 5y AML/KYC retention).
- usernames/{handle} → released para que otros lo puedan reclamar.
- pendingCryptoPayments waiting → cancelled (libera amount slots).
- Auth user → deleteUser (revoca refresh tokens automáticamente).
- Audit log en adminActions.
Protecciones:
- requireRegistered + assertFreshToken (~5min token freshness mínimo).
- Rate-limit 1/hora por uid (anti-accidente).
- Errores parciales no rompen el flujo total (cada paso try/catch).
(Agente #6 MED-15 + #10 HIGH-10-38 + #11 MED-11-43)
2. revokeMySessions — self-serve "logout everywhere" para sospecha takeover.
Pre-fix: si el user sospechaba acceso no autorizado en otro device, la
única vía era contactar admin → admin via Firebase Console llamaba
revokeRefreshTokens manualmente. Latencia operacional alta + dependencia
de canal humano.
Nueva CF: requireRegistered + assertFreshToken + rate-limit 5/h, llama
getAuth().revokeRefreshTokens(uid) + audit log. El user sigue logueado
en este device hasta el próximo refresh (~5min Firebase JWT TTL); la
UI hace signOut local para cierre inmediato del cliente actual.
(Agente #6 MED + #11 MED-11-46)
3. UI: "Danger zone" en Profile.js al final del scroll.
Dos botones agrupados visualmente:
- 🔐 "Cerrar sesión en todos los dispositivos" — borde rojo suave
(#3a2222), confirmación con AppAlert + style:cancel/destructive.
- ⚠️ "Eliminar mi cuenta" — texto rojo (#ff6b6b), borde más oscuro
(#5a1414), warning explicando retention 5y + irreversibilidad.
Ambos botones con accessibilityLabel + accessibilityState.busy durante
ejecución. minHeight:44 para WCAG-AA touch target.
4. i18n: 12 keys nuevas EN+ES bajo profile namespace (dangerZone,
logoutEverywhere*, deleteAccount*, cancel).
5. callDeleteMyAccount + callRevokeMySessions en src/firebase/functions.js.
Tests: functions/index.js parsea OK. helpers tests no afectados.
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>
miningtheblocks
added a commit
that referenced
this pull request
Jun 17, 2026
…, UpdateModal hardening, verifyBeforeUpdateEmail) Cierra 4 hallazgos del bloque auth/identity pendientes post Commit B. 1. mineCube + assertFreshToken (Agente #6 CRIT — deferred en Commit B). Commit B aplicó checkRevoked en claimGemNFT, createCryptoPayment, submitGemClaim pero defirió mineCube por costo (~100 Auth Admin calls por sesión típica de mineo). Re-evaluación: costo real ~$0-10/mes a <10k DAU. Aceptable para garantizar que tokens revocados (post password reset, post admin-suspensión, post deleteMyAccount) no puedan mintear gemas hasta que el JWT TTL natural (~60min) los pesque. 2. Login.js: clear password post-login (Agente #4 ALTO-FE-15). Pre-fix: tras `signInWithEmailAndPassword`, el password seguía en React state hasta unmount o next render. Si la app queda en background, otra app con memory dump capability puede leerlo. Best-effort en JS (no hay SecureString native) — `setPassword('')` después de éxito + después de "email no verificado + signOut". 3. UpdateModal: rechazar userinfo + custom port (Agente #4 ALTO-FE-11). Pre-fix: `new URL("https://attacker.com@miningtheblocks.com/evil.apk")` parsea hostname=miningtheblocks.com (passa el allowlist) pero algunos clientes Android Linking navegan al userinfo en lugar del host. Bypass de la última línea de defensa contra APK malicioso via downloadUrl. Fix: explícitamente reject `u.username`, `u.password`, `u.port !== 443`. 4. Registration.js: verifyBeforeUpdateEmail en lugar de updateEmail (Agente #6 HIGH-12). Pre-fix: `updateEmail(u, newEmail)` cambiaba el email inmediatamente + dejaba emailVerified=false silenciosamente → limbo (user cree email cambió; no puede recuperar password porque nuevo no está verified; viejo ya no funciona). Plus escalation vector en account takeover. Fix: `verifyBeforeUpdateEmail(u, newEmail)`. Manda email de verificación al NUEVO address; el email solo cambia cuando el user clickea el link. Hasta entonces puede seguir con el email viejo. API moderna de Firebase Auth v9+ que reemplaza updateEmail. Tests: parse OK + lint OK + 24/24 helpers tests. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Bumps [eslint](https://github.com/eslint/eslint) from 9.39.4 to 10.5.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Commits](eslint/eslint@v9.39.4...v10.5.0) --- updated-dependencies: - dependency-name: eslint dependency-version: 10.5.0 dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com>
dependabot
Bot
force-pushed
the
dependabot/npm_and_yarn/functions/eslint-10.5.0
branch
from
June 23, 2026 18:15
66ac4a6 to
2198cbc
Compare
miningtheblocks
added a commit
that referenced
this pull request
Jun 23, 2026
- sentry.properties: defaults.org/project/url, auth.token vía env (commented) - .env.example: documenta SENTRY_AUTH_TOKEN con link al settings page Sentry - .easignore: + contracts_build/, audit_*/, RUNBOOK.md, *.sha256 (#6 Cleanup #4 bonus) SENTRY_AUTH_TOKEN ya registrado como sensitive EAS env var en environment production. Próximo `eas build --profile production` va a subir source maps automáticamente vía el plugin @sentry/react-native (configurado en app.json). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Author
|
Superseded by #25. |
dependabot
Bot
deleted the
dependabot/npm_and_yarn/functions/eslint-10.5.0
branch
June 29, 2026 15:15
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 eslint from 9.39.4 to 10.5.0.
Release notes
Sourced from eslint's releases.
... (truncated)
Commits
de3b67210.5.0362a518Build: changelog update for 10.5.05ca8c52feat: correct stack tracking in max-nested-callbacks (#20973)b565783feat: report no-with violations at the with keyword (#20971)2ce032ffeat: report max-lines-per-function violations at function head (#20966)732cb3efeat: report max-nested-callbacks violations at function head (#20967)f9c138afeat: report max-depth violations on keywords (#20943)8ae1b5bdocs: Update READMEca7eb90docs: update Node.js prerequisites to include ICU support (#20962)b18bf58chore: update ecosystem plugins (#20959)