Commit graph

169 commits

Author SHA1 Message Date
le king fu
085b8e7d75 state: sync after #133, #134, #135 (PR #138)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 19:13:13 -04:00
le king fu
8b27054be9 fix(security): raise shell-quote, add compression and source-map-js floors
- react-devtools-core > shell-quote ^1.8.4 -> ^1.11.0 (GHSA-pqg4-j6r4-53mv,
  critical, quote() command injection; resolves 1.12.0). Raises the #95 floor.
- @expo/cli > compression ^1.8.2 (GHSA-vc2v-76pw-4v95, high, dev server DoS).
- source-map-js@^1.0.0 -> ^1.2.2 (GHSA-68fv-2mgg-jv7q, high, postcss pipeline).

Lock: only the three package entries change, package key set identical.
Smoke test: floor guard plus a call to the consumed API for each package.
Export bundle byte-identical before/after (44 files). npm audit 43 -> 40,
critical 0. Build and dev tooling only, nothing ships in the APK.

Fixes #133
Fixes #134
Fixes #135

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 19:07:48 -04:00
le king fu
aa41642a87 state: sync after #128, #129 (PR #131), #126 and #130
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 19:35:17 -04:00
le king fu
cb53a43422 fix(security): scope http-cache-semantics floor to major 4
Review follow-up on #131: a blanket override would force any future 5.x
consumer down to 4.x. The version-scoped key keeps the floor within the
current major, like postcss-selector-parser. No lockfile change.

Refs #128

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 19:34:25 -04:00
le king fu
62efdba22e fix(security): add http-cache-semantics and postcss-selector-parser floors
- http-cache-semantics ^4.3.0 (GHSA-ch52-4w7c-c8xp, high): 4.3.0 is out of
  the <=4.2.0 range although the advisory lists no patched version. Single
  copy via @expo/ngrok > got > cacheable-request (^4.0.0), dev tunnel only.
- postcss-selector-parser@^6.0.0 -> ^6.1.3 (GHSA-w9m9-85wc-3x92, low),
  version-scoped to the tailwindcss@3 major. Resolves to 6.1.4.

Lockfile: two stanzas, package count unchanged (2084). npm audit 33 -> 31.
Android JS bundle (expo export --no-bytecode, cache cleared) is byte-identical
before and after. Smoke test guards both floors.

Resolves #128
Resolves #129

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 19:27:33 -04:00
le king fu
84048e976c state: sync after #124 and #125
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 14:14:44 -04:00
35ab0f64ae Merge pull request 'fix(security): raise brace-expansion and undici override floors' (#127) from issue-124-125-brace-expansion-undici-floors into master 2026-10-02 18:14:26 +00:00
le king fu
84d04184ae fix(security): raise brace-expansion and undici override floors
brace-expansion: nine new DoS advisories outdate the floors set in #103.
Raise the three version-scoped overrides to the patched head of each
major (1.1.21, 2.1.7, 5.0.12). undici: raise the @expo/cli scoped
override to ^6.28.1 (resolves to 6.29.0).

Add smoke checks locking the floors and the minimatch brace/glob
behaviour for every installed minimatch major, so a return to a blanket
override fails the suite.

npm audit: 12 -> 10 entries. The rest is tracked in #123 and #126.

Fixes #124
Fixes #125

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 14:11:34 -04:00
le king fu
99ecb73615 chore: ignore .next/ and reports/
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 15:52:56 -04:00
le king fu
dacd1c285e state: sync after #120 analysis (accepted risk, unreachable)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 15:41:29 -04:00
le king fu
f9bed16554 state: sync after #121
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 20:28:08 -04:00
4c2fe06f68 Merge pull request 'fix(security): raise @xmldom/xmldom and js-yaml override floors' (#122) from issue-121-xmldom-js-yaml-floors into master 2026-09-26 00:27:54 +00:00
le king fu
100078e1e2 fix(security): raise @xmldom/xmldom and js-yaml override floors
Advisories published on 2026-09-08 land above the current floors:
- @xmldom/xmldom <= 0.8.14 (GHSA-c7q8-3ch8-vqpv, GHSA-x4fp-j954-r2f4,
  GHSA-93r5-fhx6-vmg9 and 7 more), patched in 0.8.15 (lts line)
- js-yaml < 3.15.2 / < 4.3.2 (GHSA-2883-xcg3-v3hh)

Raise the three overrides. Lock diff is limited to the three entries.
All consumers are build-time tooling (@expo/plist, plist via xcode,
@expo/xcpretty, @istanbuljs/load-nyc-config); the Android bundle hash
is unchanged.

Fixes #121

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 20:10:07 -04:00
le king fu
967929ee04 state: sync after #117
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 20:04:32 -04:00
53c33e73a4 Merge pull request 'fix(security): bump @react-navigation/core to 7.22.1 via override' (#119) from issue-117-react-navigation-core-7.22.1 into master 2026-09-26 00:04:06 +00:00
le king fu
2117cc5016 test: clarify deep link round trip scope (expo-router fork not covered)
Refs #117

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 19:59:17 -04:00
le king fu
f7b2b51da9 fix(security): bump @react-navigation/core to 7.22.1 via override
@react-navigation/core <= 7.22.0 depends on query-string, which pulls
decode-uri-component <= 0.4.2 (GHSA-vcc3-ghjq-m6fr, DoS on malformed
percent-encoded input). 7.22.1 parses queries itself and drops the
dependency. A scoped override bumps it without touching anything else:
the lock diff is limited to @react-navigation/core and /routers.

Add smoke-test guards for the failure mode of the superseded PR #118
(blanket npm audit fix): babel-preset-expo and @expo/metro-config must
resolve from the root node_modules, only one Expo SDK major may be
installed, every metro copy must stay on 0.83.x. Replayed against the
PR #118 lock, all four checks fail. Also add a deep link round trip
through getStateFromPath/getPathFromState with query params.

Fixes #117

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 20:40:36 -04:00
813b9de2ea Merge pull request 'fix(security): raise browserslist floor to 4.28.7 via override' (#116) from issue-115-browserslist-4.28.7 into master 2026-09-04 20:27:38 +00:00
le king fu
dfd4004cdc state: sync after #108 and #115
Version was still recorded as 1.6.4/16 while master is at 1.6.6/18.
Records the security remediation outcome (19 vulns / 9 HIGH -> 10 / 0
HIGH), the override inventory, and the three @expo/metro shims that no
longer resolve under metro 0.83.8 -- inert today, but worth re-checking
at the next Expo SDK bump.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016Y4GzEsmDryrwtQcmBNw9P
2026-09-04 16:25:04 -04:00
le king fu
5e7a566155 fix(security): raise browserslist floor to 4.28.7 via override
browserslist <= 4.28.6 carries two HIGH advisories published 2026-09-01:
GHSA-c83g-rgw3-j3cx (unbounded memory growth, no cache eviction, leading
to OOM) and GHSA-73wf-gq98-2v4g (uncaught crash / prototype write via an
untrusted browserslist-stats.json in normalizeStats). Both report
first_patched_version = 4.28.7.

Unlike the image-size root fixed in #114, this one has a published fix,
so a plain version floor is enough. Every requester already uses a caret
range compatible with 4.28.7 (@babel/helper-compilation-targets ^4.24.0,
@expo/metro-config ^4.25.0, core-js-compat ^4.28.1, update-browserslist-db
peer >= 4.21.0) -- the lock was simply pinned at 4.28.1. The override
records the security floor the same way as the existing esbuild,
@xmldom/xmldom, postcss, brace-expansion and @babel/core entries.

Resolves to 4.28.9. npm audit: 11 -> 10 total, 1 HIGH -> 0 HIGH. No high
or critical finding remains in the tree.

Verified: the lock stays unchanged under re-resolution against
package.json, npm ci accepts the pair (what EAS runs), npm test 11/11,
and expo export --platform android emits a byte-identical Hermes bundle
(index-3d9ab1a7942c6dfccc79d9b280b8ce80.hbc, 8.17 MB) -- the compilation
targets browserslist resolves are unchanged.

Refs #115

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016Y4GzEsmDryrwtQcmBNw9P
2026-09-04 16:23:46 -04:00
eff15ca9b8 Merge pull request 'fix(security): drop image-size via metro 0.83.8 overrides' (#114) from issue-108-metro-0.83.8 into master 2026-09-04 20:16:40 +00:00
le king fu
290c4e5e2f fix(security): drop image-size via metro 0.83.8 overrides
metro@0.83.8 (published 2026-08-19) removed the image-size dependency and
vendored a reduced dimension parser (src/lib/imageSize.js) that supports
only bmp/gif/jpeg/ktx/png/psd/svg/tiff/webp. The ICNS, JXL and HEIF
parsers named by GHSA-w3rx-r6r6-pgpr and GHSA-5p2g-fcmc-qvqq are absent
from it, so the DoS is eliminated by construction rather than by an
upstream patch: image-size still publishes no fixed version (latest is
2.0.2, and both advisories report first_patched_version = None).

metro@0.83.3 was the only requester of image-size in the whole tree, so
every transitive HIGH finding collapses with it.

@expo/metro@54.2.0 pins the 14 metro packages to exact 0.83.3, so npm
update cannot move them and an override is required. All 14 are moved
together to avoid a mixed metro tree; the existing nested ws override is
preserved through the "." key.

npm audit: 19 -> 11 total, 9 HIGH -> 1 HIGH. The remaining HIGH
(browserslist) is unrelated and pre-existing on master.

Verified: image-size absent from both the lock file and node_modules,
14 metro packages resolved to 0.83.8 with no duplicates, patch-package
postinstall still applies, npm test 11/11, and expo export --platform
android produces a Hermes bundle with PNG dimension variations resolved
through the vendored parser.

Refs #108

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016Y4GzEsmDryrwtQcmBNw9P
2026-09-04 15:57:51 -04:00
le king fu
b9f45be8df chore: bump version to 1.6.6 (versionCode 18) 2026-08-12 14:20:59 -04:00
96adf00495 Merge pull request 'fix(security): resolve brace-expansion + @babel/core via version-scoped overrides' (#111) from issue-103-babel-brace-overrides into master 2026-08-12 18:14:17 +00:00
le king fu
98cd423a50 fix(security): resolve brace-expansion + @babel/core via version-scoped overrides
- brace-expansion -> ^1.1.18 / ^2.1.4 / ^5.0.9 (version-scoped per major):
  DoS advisories (exponential-time expansion + unbounded OOM). Version-scoping
  bumps each major within its own major, preserving the CJS export contract
  (default export for 1.x/2.x, named for 5.x) that a blanket override would have
  broken. This is #103's original blocker, now resolved. Verified: minimatch@3
  glob resolution works (the exact call that TypeError'd under a blanket).
- @babel/core -> ^7.29.6 (resolves 7.29.7): GHSA-4x5r-pxfx-6jf8 arbitrary file
  read via sourceMappingURL (vulnerable <=7.29.0, ~87 deduped instances).

Both build/dev-time only, not bundled in the shipped APK. npm audit 14 -> 12;
the remaining 12 high are entirely the image-size upstream-locked cascade
(no published fix, tracked in #108). Smoke test 11/11, lock diff is 1:1 version
replacements (large count driven by @babel/core's deduped instances).

Fixes #103
Fixes #110

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-12 14:06:49 -04:00
5aec3b5271 Merge pull request 'fix(security): bump undici + js-yaml overrides to patched versions' (#109) from issue-106-107-deps-overrides into master 2026-08-12 01:41:30 +00:00
le king fu
0e4c5cdb4e fix(security): bump undici + js-yaml overrides to patched versions
- @expo/cli > undici ^6.27.0 -> ^6.28.0: GHSA-8xcm-r25x-g524 / m8rv-5g2x-5cg5
  / v3r7-h72x-cjcm (response desync, CRLF & cookie injection; vulnerable <6.28.0)
- js-yaml -> ^3.15.1 (3.x) + ^4.3.1 (4.x): CVE-2026-59870 / GHSA-5p4m-2wfm-xmqj
  (quadratic CPU in !!omap resolution; vulnerable 3.x<3.15.1, 4.x<4.3.1)

js-yaml moved from parent-scoped overrides (@expo/xcpretty,
@istanbuljs/load-nyc-config) to version-scoped ones (js-yaml@^3 / js-yaml@^4):
the 4.x instance is reached via @expo/cli, which is itself overridden, and a
nested override does not propagate through an overridden parent (npm left
js-yaml@4.3.0 "invalid"). Version-scoped targeting resolves it regardless of
the parent path.

Both build/dev-time only, not bundled in the shipped APK. npm audit drops
undici + js-yaml (16 -> 14). Remaining 13 high = image-size + its metro/RN
cascade (upstream-locked, tracked in #108) + @babel/core low. Smoke test green,
widget patch reapplied, lock diff limited to the 3 bumped packages.

Fixes #106
Fixes #107

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-11 20:47:23 -04:00
2da7c0d67d Merge pull request 'fix(security): bump postcss + @expo/cli tar overrides to patched versions' (#105) from issue-102-104-deps-overrides into master 2026-08-11 13:26:30 +00:00
le king fu
9eaa103a87 fix(security): bump postcss + @expo/cli tar overrides to patched versions
- postcss ^8.5.10 -> ^8.5.18 (resolves to 8.5.26): GHSA-r28c-9q8g-f849,
  path traversal in source-map auto-loading (vulnerable <=8.5.17)
- @expo/cli > tar ^7.5.19 -> ^7.5.21 (resolves to 7.5.22): GHSA-r292-9mhp-454m,
  uncontrolled recursion stack-overflow DoS (vulnerable <=7.5.20)
- nanoid 3.3.11 -> 3.3.18 pulled in by postcss re-resolution (bonus)

Both are build/dev-time only, not bundled in the shipped APK. npm audit no
longer lists postcss (nor its transitive inflation expo/@expo/cli/
@expo/metro-config) nor tar. Smoke test green (11/11), widget patch-package
reapplied, diff limited to package.json + package-lock.json.

Fixes #102
Fixes #104

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-10 08:28:47 -04:00
le king fu
d4c77e640c state: sync after #68 2026-07-27 20:56:16 -04:00
a45860e5fd Merge pull request 'feat(feedback): integrate Feedback Hub widget in Settings' (#101) from issue-68-feedback-widget into master 2026-07-28 00:54:15 +00:00
le king fu
9e0adaf5c9 feat(feedback): integrate Feedback Hub widget in Settings (#68)
Add an in-app feedback form that POSTs to the centralized Feedback Hub
(feedback.lacompagniemaximus.com/api/feedback) with app_id "simpl-liste".

- src/services/feedback.ts: dependency-free client (pure helpers + fetch),
  strict context whitelist, 2000-char cap, stable error codes
- src/hooks/useFeedback.ts: idle/sending/success/error state machine
- src/components/FeedbackModal.tsx: RN bottom-sheet with char counter,
  opt-in navigation context and opt-in identity (Loi 25: both unchecked)
- Settings > About: new "Send feedback" button above the kept mailto entry
- i18n fr/en feedback block
- tests/feedback.test.mjs: node:test execution coverage of the client;
  smoke.test.cjs static guards (app_id, endpoint, cap, import-free)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-27 19:43:12 -04:00
le king fu
fccd7faf95 perf(widget): cut expand/collapse tap latency (native patches + light headless path)
- Upgrade react-native-android-widget 0.20.1 -> 0.21.0 (expedited
  WorkManager upstream, clickable-area ripple corner fix)
- patch-package on the lib:
  1. WIDGET_CLICK bypasses WorkManager and runs the headless JS task
     directly on the ReactHost (goAsync + WorkManager fallback), removing
     two Room writes + worker dispatch from every tap and WorkManager
     init from the cold path
  2. WEBP_LOSSLESS (effort 0) encoding instead of PNG q100 on API 30+,
     several times faster for widget-sized bitmaps
  3. Copy identical light/dark collection item files instead of
     compressing every row bitmap twice when the config is single-mode
- Extract dependency-light src/services/widgetState.ts so the headless
  click handler no longer pulls DB/drizzle/date-fns at cold start
- Smoke tests: lock the light import graph + patch/postinstall wiring
- Bump v1.6.5 (versionCode 17) for the preview build

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 16:41:47 -04:00
9ccc9f4a9d Merge pull request 'fix(security): override 5 transitive dep vulnerabilities from npm audit' (#100) from issue-95-99-deps-overrides into master 2026-07-01 00:33:13 +00:00
le king fu
68abfb17f8 fix(security): override 5 transitive dep vulnerabilities from npm audit
Adds scoped overrides for shell-quote (GHSA-w7jw-789q-3m8p, critical),
undici (4 CVEs, high), ws (GHSA-96hv-2xvq-fx4p, high — distinct from the
CVE already fixed in #92/#94), js-yaml (GHSA-h67p-54hq-rp68, moderate,
two incompatible majors need separate scopes), and tar
(GHSA-vmf3-w455-68vh, moderate). All 5 are dev-tooling-only (Expo CLI,
Metro, react-devtools-core) with no runtime app code path.

Verified: npm audit clean on all 5 packages, smoke test passes, Metro
Bundler boots and serves /status normally after the ws bump (the only
scope touching Fast Refresh/dev-middleware runtime).

Fixes #95, Fixes #96, Fixes #97, Fixes #98, Fixes #99

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-06-30 20:20:46 -04:00
158204b938 Merge pull request 'fix(security): override @expo/cli ws to ^8.20.1 (GHSA-58qx-3vcg-4xpx) (#92)' (#94) from issue-92-ws-override into master 2026-05-31 19:21:22 +00:00
le king fu
483030081c state: sync after #90 + web deploy
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-30 15:46:07 -04:00
51429045e6 Merge pull request 'chore(web): document set-state-in-effect on ThemeToggle localStorage read (#90)' (#93) from issue-90-themetoggle-lint-disable into master 2026-05-30 19:25:20 +00:00
le king fu
9ee5372404 fix(security): override @expo/cli ws to ^8.20.1 (GHSA-58qx-3vcg-4xpx) (#92)
npm audit flagged ws 8.0.0-8.20.0 (moderate, uninitialized memory
disclosure) pulled in via expo > @expo/cli > ws@8.20.0. Scope the
override to @expo/cli so only the vulnerable 8.x instance is bumped
(resolved to 8.21.0); metro's ws@7.5.10 and react-native's ws@6.2.3
stay on their majors to avoid breaking the Metro dev server.

All ws here is dev/build tooling (Expo CLI, Metro, react-devtools),
absent from the shipped APK, so this was not exploitable in production
- but the override clears npm audit and stops the Defenseur re-flagging.

npm audit: 0 vulnerabilities. Root smoke green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-30 15:05:10 -04:00
le king fu
e9ddf27eab chore(web): document set-state-in-effect on ThemeToggle localStorage read (#90)
ThemeToggle's mount effect reads localStorage then setTheme, a pattern
react-hooks/set-state-in-effect flags. It is safe here: localStorage is
SSR-unavailable so the read must happen post-mount, and ThemeScript
already applies the dark class before hydration (no page FOUC). Add a
targeted eslint-disable-next-line with justification.

web/ lint is now green (0 errors).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-30 14:57:44 -04:00
le king fu
7750214c64 state: sync after #70
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-30 14:53:57 -04:00
97cf9ce0f7 Merge pull request 'chore(web): fix prefer-const and remove unused import' (#91) from chore/web-lint-cleanup into master 2026-05-30 18:52:34 +00:00
7343f993ee Merge pull request 'fix(web): resolve display name from userInfo, not just claims (#70)' (#89) from issue-70-harmonize-display-name into master 2026-05-30 18:52:22 +00:00
le king fu
4086aac50c chore(web): fix prefer-const and remove unused import
Three pre-existing lint issues surfaced during #70's lint check:
- lists/[id]/page.tsx: subtasksMap was `let`, never reassigned -> const
- api/lists/[id]/tasks/route.ts: query was `let`, never reassigned -> const
- Header.tsx: drop unused `Link` import from next/link

Leaves web/ lint at a single remaining error (ThemeToggle
set-state-in-effect), tracked in #90 (needs a design decision:
useSyncExternalStore vs documented eslint-disable).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-30 14:22:44 -04:00
le king fu
3637879f90 fix(web): resolve display name from userInfo, not just claims (#70)
getAuthenticatedUser only read ID token claims, where `name` is often
absent, so the web app showed the user's email instead of their name
after SSO. Fetch the userInfo endpoint and resolve the display name with
the same fallback order as the vitrine (la-compagnie-maximus#80):
userInfo.name -> userInfo.username -> claims.name -> claims.username,
with the email fallback applied in the layout. Email now also prefers
userInfo over claims.

Single source of truth in auth.ts (only producer of `name`, consumed
solely by layout.tsx -> Header). layout.tsx and Header.tsx verified,
left unchanged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-30 14:10:14 -04:00
le king fu
d38ddab0f0 chore: bump version to 1.6.4 (versionCode 16)
Includes Expo SDK 54 patch alignment from #87.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 14:48:46 -04:00
le king fu
8ee9f9918e state: sync after #87 2026-05-10 13:42:25 -04:00
2eed0415b9 Merge pull request 'chore(deps): align Expo SDK 54 patches' (#88) from issue-87-align-expo-sdk-patches into master 2026-05-10 17:41:42 +00:00
le king fu
ea4a516174 chore(deps): align Expo SDK 54 patches via expo install --fix
Bumps 6 patch versions inside SDK 54 lockstep:
- expo 54.0.33 -> 54.0.34
- expo-auth-session 7.0.10 -> 7.0.11
- expo-crypto 15.0.8 -> 15.0.9
- expo-linking 8.0.11 -> 8.0.12
- expo-notifications 0.32.16 -> 0.32.17
- expo-web-browser 15.0.10 -> 15.0.11

expo-doctor: 17/17 checks pass.
Smoke test (tests/smoke.test.cjs): 6/6 OK.

Closes #87

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-09 08:28:06 -04:00
le king fu
297acac768 state: sync after #81 2026-05-07 21:36:50 -04:00