An unset ADMIN_TOKEN disables the admin surface silently
Maintainer thường phản hồi trong vòng 2 ngày
@dev-RAM11 đang làm issue này rồi.
Từ ngày 19/10/2026.
Đánh giá
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức phù hợp với người mới
- 55/100
- Loại issue
- Tính năng
- Độ rõ ràng
- Đặc tả rõ ràng
- Mức độ hoạt động
- Sôi nổi
- Công nghệ
- typescript
- Lĩnh vực
- api, authentication, documentation
Hướng nghiên cứu
Start with src/api/auth.ts and trace how ADMIN_TOKEN is checked and where startup configuration and /status or /ready are handled. Read src/tests/auth.test.ts and run npx vitest run src/__tests__/auth.test.ts; also check .env.example and the repository's drift guard for src/. Done means unset and wrong-token cases are distinguishable without exposing the expected value, startup and status make the disabled state visible, and the unset case is tested.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Background
function isAdminAuthorized(req: FastifyRequest): boolean {
const adminToken = process.env.ADMIN_TOKEN
if (!adminToken) return false
...
Failing closed is right — an unset token must never mean "allow everyone". But
it fails closed silently: the service starts normally, and every admin route
returns the same 401 as a wrong token. An operator who forgot the variable, or
typoed its name, sees "Provide a valid X-Admin-Token header" and goes looking
for a problem with their token.
What to build
- Log clearly at startup when
ADMIN_TOKENis not configured, saying the admin
surface is disabled. - Distinguish the two cases in the response: a wrong token is not the same as a
server with no token configured. Say "not configured" without revealing
anything about the expected value. - Surface it on
/statusor/readyso it is visible without reading logs. - Document the variable in
.env.examplewith what it gates. The repo's drift
guard coverssrc/, so check it is there. - Consider rejecting a trivially weak token at startup — an empty string after
trimming, or an obvious placeholder.
Acceptance criteria
- Startup logs that admin routes are disabled when the token is unset
- "Not configured" and "wrong token" are distinguishable to an operator
- Neither response reveals anything about the expected value
-
.env.exampledocuments the variable and what it gates - A test covers the unset case
Drips Wave · Complexity: Easy · 100 points
Repo: Divinity-Labs/Lens. Auth is src/api/auth.ts, key minting
src/api/admin.ts, usage reporting src/api/usage.ts, metering
src/x402/metering.ts, the ApiKey model in prisma/schema.prisma.
Run the tests: npm test. The tests are vitest, not jest. A single file
is npx vitest run src/__tests__/auth.test.ts.
Load test (prices) is already failing on main. Not your PR.
Do not weaken what is already right. Three things are correct today and
should survive every change here:
generateApiKey()islens_plusrandomBytes(24)— 192 bits. Do not
shorten it, and do not make it guessable or sequential.hashApiKey()is an unsalted SHA-256. That is correct for a
high-entropy random key: it must stay fast and deterministic so a lookup is
one indexed query. Do not "improve" it into bcrypt or argon2 — those are for
low-entropy human passwords, and here they would only make every request slow.- Only the hash is ever stored. The plaintext is returned once, at creation,
and never again.
Admin routes carry config: { public: true }. That does not mean public —
it means "skip the API-key hook", because they enforce ADMIN_TOKEN instead.
Removing that flag locks the admin surface behind the keys it exists to mint.
Never elide an address, a key or a token in code, comments, tests or
documentation. Write it in full or not at all — and never write a real key
anywhere.
Required: Before submitting, join the contributor Telegram so your work can be tracked and counted toward the Stellar Wave: https://t.me/+fxHXq8f1SwlkZDBk
- Ngôn ngữ chính
- TypeScript
- Star
- 4
- Fork
- 71
- Merge trung bình
- 2 ngày 20 giờ
- Pull request đã merge (30 ngày)
- 127
Chuẩn bị môi trường
- Có Dockerfile hoặc tệp Docker Compose
- Có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của Divinity-Labs/Lens
-
Webhook retries have no jitter, so failures synchroniseCó thể đã có người làm @Richard-tobi đã nhận 8 ngày trước. Đang mởarea:reliability difficulty:easy help wanted points:100 Stellar Wave
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 80/100
Divinity-Labs/Lens#341 · 2 bình luận · 1 người được giao ·
Maintainer thường phản hồi trong vòng 2 ngày
-
GraphQL queries bypass the per-route scope their REST equivalents requireCó thể đã có người làm @sparkysolutions10-pixel đã nhận 1 ngày trước. Đang mở
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 48/100
Divinity-Labs/Lens#618 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 2 ngày
-
Live Service Spec Drift ReportĐang mởarea:tests automated live-spec-report
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 28/100
Divinity-Labs/Lens#606 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 2 ngày
-
The key is accepted only as a bearer token, and nothing says soCó thể đã có người làm @krsnak đã nhận 7 ngày trước. Đang mởarea:docs difficulty:easy help wanted points:100 Stellar Wave
Divinity-Labs/Lens#512 · 4 bình luận · 1 người được giao ·
Maintainer thường phản hồi trong vòng 2 ngày
-
The admin surface has no testsCó thể đã có người làm @krsnak đã nhận 7 ngày trước. Đang mởarea:testing difficulty:intermediate help wanted points:150 Stellar Wave
Divinity-Labs/Lens#510 · 5 bình luận · 1 người được giao ·
Maintainer thường phản hồi trong vòng 2 ngày
Tất cả issue của Divinity-Labs/Lens
Issue tương tự
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
cline/cline#15327 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
LogicLabs-OU/OpenArchiver#509 ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
bigcapitalhq/bigcapital#1545 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
-
bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 83/100
Maintainer thường phản hồi trong vòng 1 ngày