BentoPDF v2.8.8 built from source at its pinned commit with BentoPDF's own air-gapped build options, every module it would load from a CDN vendored and checked against vendor.lock, a Content-Security-Policy without a single host, digital-sign-pdf and timestamp-pdf disabled because both need a third party, and the hand-off glue on every page: the AGPL source link, the hand-in of a file from bau-pm through a one-minute cookie into sessionStorage, confirmed by the tool's reaction, the hand-back of a result from every window, and the signing tool's flatten switch locked on. The zero-host gate drives all 117 enabled tool pages in Chromium and fails on any request to another origin, any CSP violation, a CSP that names a host, and a disabled id that names no page. Green on this image (3 min 52 s on a private network), red on the stock upstream image (115 findings) and on a misspelled id. CI runs it on every push, the release workflow before it pushes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
14 lines
629 B
Docker
14 lines
629 B
Docker
# The gate's own image (test/zero-hosts.mjs): Chromium and playwright-core,
|
|
# with the test files and the glue baked in, because the CI runner passes the
|
|
# host's Docker socket through and a mounted workspace would be empty.
|
|
FROM public.ecr.aws/docker/library/node:20-alpine
|
|
RUN apk add --no-cache chromium
|
|
WORKDIR /gate
|
|
RUN npm init -y >/dev/null && npm install --no-audit --no-fund --silent playwright-core@1.63.0
|
|
COPY test/ ./test/
|
|
COPY glue/ ./glue/
|
|
RUN node --check glue/handoff.js
|
|
ENV PLAYWRIGHT_CORE=/gate/node_modules/playwright-core/index.mjs \
|
|
CHROMIUM=/usr/bin/chromium-browser
|
|
CMD ["node", "test/zero-hosts.mjs"]
|