Skip to content

Promote develop → main: #99, #100 - #101

Merged
LESdylan merged 6 commits into
mainfrom
develop
Oct 20, 2026
Merged

LESdylan merged 6 commits into
mainfrom
develop

Conversation

@vjan-nie

Copy link
Copy Markdown
Contributor

Promote develop → main: #99 and #100. (#95, 3d0c065, is already on main.)

Commits (origin/main..origin/develop)

SHA author subject
9f08525 Vadim J N Merge PR #100 fix/drawnosaurus-edge-cors
157197f vjan-nie fix(tls): the :3007 front door answers CORS for osionos and hides drawnosaurus's
9ef3abb vjan-nie test(drawnosaurus-edge): the :3007 front door answers CORS for osionos only
8dd39c9 Vadim J N Merge PR #99 fix/osionos-whiteboard-build-arg
2989cc2 vjan-nie fix(osionos): app.Dockerfile hands VITE_WHITEBOARD_APP_URL to the vite build
5ed2112 vjan-nie test(build-args): every compose build arg reaches the build of its Dockerfile

9 files, +457 / −10. main is an ancestor of develop.

Pins (unchanged: identical on main and develop; each reachable from its repo's origin/main and origin/develop)

path SHA
.claude b6b87312
apps/calendar ddba418a
apps/drawnosaurus ab6ccb98
apps/graph_render 48c865cf
apps/grobase a855f86b
apps/mail d19ca268
apps/opposite-osiris 47ca59e7
apps/osionos/app 001ec2da
vendor/QA df852a6a
vendor/born2root 5c8f810f
vendor/monkey-bot 4100e874
vendor/scripts c619e5d1

ADR 0025

None of these commits touches session cutoffs or revocation: no models/*.sql, migrations, bridge.Dockerfile or OSIONOS_SESSION_CUTOFFS. osionos stays pinned at 001ec2da on purpose; there's no bump before O2–O4 have run on prod (docs/adr/0025-app-sessions-end-at-a-polled-per-user-cutoff.md:3, :92-94).

CI note

Fresh-machine's full make all job doesn't run on PRs (fresh-machine.yml:102), so the push to main will be the first full bring-up of #99 + #100. The GR2 red on main (run 39255595261) was a flake and passed on re-run.

Heads-up @LESdylan.

…ckerfile

compose passes VITE_WHITEBOARD_APP_URL to osionos-app (docker-compose.yml:277), but
app.Dockerfile declares no ARG for it, so Docker drops it with a warning. Since osionos
2e24e1e8 an empty URL hides the whiteboard in production builds. The check reads the base
and public compose files and, per service, requires that a stage declares each arg and
then uses it (a $NAME reference, or a later RUN). Red on develop: osionos-app drops
VITE_WHITEBOARD_APP_URL; opposite-osiris, drawnosaurus, mail and calendar drop none.

Rung 5 (a small helper): no YAML parser in the bats image (CI apk-adds coreutils, jq), and
`docker compose config` would print every resolved build arg, secrets included.
…e build

compose passed it (docker-compose.yml:277) but the Dockerfile declared no ARG, so Docker
dropped it. Since osionos 2e24e1e8 (appUrls.ts:49) the whiteboard URL falls back to
localhost only in dev builds, so every image built through compose came out with an empty
URL and isWhiteboardReady() false: no View items, no rail app, no /whiteboard, and no
import button on retired draw blocks. groot main and develop pin osionos 001ec2da, which
contains 2e24e1e8.

The default is the URL compose passes (https://localhost:3007); the public overlay still
passes "" and keeps the whiteboard hidden. The compose comment said the flag defaults
OFF and that an empty URL does not gate the tab; both have been false since 2e24e1e8.
fix(osionos): app.Dockerfile hands VITE_WHITEBOARD_APP_URL to the vite build
…s only

Runs the real infrastructure/tls/nginx.conf in nginx:1.27-alpine in front of a stub
drawnosaurus-gateway that answers like drawnosaurus's fastify-cors: Allow-Origin
https://localhost:3001 for ANY origin, DELETE advertised. Red on develop: the edge forwards
the preflight, so upstream advertises DELETE and no If-Match, and evil.example and
https://127.0.0.1:3001 get an Allow-Origin. Expose-Headers and upstream's Allow-Origin also
leak on /v1/boards and /healthz. DELETE, /v1/share and the framing CSP already hold and are
kept as regression checks.
…wnosaurus's

The inline whiteboard block's POST /v1/boards from https://localhost:3001 needs a preflight.
The front door forwarded it to drawnosaurus's fastify-cors, which names its CORS_ORIGIN for
any Origin, advertises DELETE and sends no Vary: Origin. The preflight is now answered at
the edge, for $osionos_origin only:
- Allow-Methods GET, HEAD, POST, PUT, PATCH; Allow-Headers Content-Type, If-Match (what
  whiteboardClient.ts sends); no credentials (it sends none); Vary: Origin always.
- Upstream's Access-Control-* headers are hidden on every route, so this block is the one
  place CORS is decided.
- DELETE and /v1/share stay 403.
- One literal origin now feeds the CSP lines too.

OPTIONS stays in limit_except: nginx applies limit_except when it picks the location,
before the location's `if` runs, so dropping OPTIONS from the list turned every preflight
into 403 (measured by the new test). Known weakness §7 records that the rule fences reads,
not writes.

Devil verdict PROCEED-WITH-CONDITIONS; each condition is a test in
tests/drawnosaurus-edge/cors.bats or a line in this message.
fix(tls): the :3007 front door answers CORS for osionos and hides drawnosaurus's
@sonarqubecloud

Copy link
Copy Markdown

@LESdylan
LESdylan merged commit 9626d12 into main Oct 20, 2026
27 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants