hub v0.152.0: operator access tokens with scopes (09 §3 decision 251, operator 2026-10-15 11:38)
gates / gates (push) Successful in 6m44s
gates / gates (push) Successful in 6m44s
- Configuration → Access tokens: named, scoped (group read/write), expiring (≤365 d), shown once, stored SHA-256 only, every use logged by name. Bearer fhp_… on the web surface only; /api/v1 refuses it. - Route table = the code's single source (web/routes.go), pinned to ServeHTTP's switch; session-only: secrets shown/minted, deletes/resets, password, tokens. - R-952 closed: /api/v1 route table names each caller, pinned to the switch; no-credential refusal test. - Fail-open fixed: an empty operator password served the UI open (main skipped RequireAuth). Live hub never open. - 05 §17, 04 §6.2, 13, 09 §3 251; register 155→157 (+R-1054, R-1055, R-1056, −R-952); STATUS. - website: prowlarr-logo.svg (byte copy from felhom.eu-media) — the site gate refused every push. Not deployed — waits for the operator's yes. Claude-Session: https://claude.ai/code/session_012qRErfCoiTkvDK9N5XHbzb
This commit is contained in:
@@ -0,0 +1,6 @@
|
||||
=== RUN TestRouteTable_MatchesServeHTTPSwitch
|
||||
tokens_test.go:193: route 21: switch has {Exact: Prefix:/hosts/ Suffix:/operator-action Contains: BindFn:false Get:{Group: Write:false SessionOnly:false AnyToken:false Exempt:false} Post:{Group: Write:false SessionOnly:false AnyToken:false Exempt:false}}, table has {Exact: Prefix:/hosts/ Suffix:/request-logs Contains: BindFn:false Get:{Group: Write:false SessionOnly:false AnyToken:false Exempt
|
||||
--- FAIL: TestRouteTable_MatchesServeHTTPSwitch (0.00s)
|
||||
FAIL
|
||||
FAIL gitea.dooplex.hu/admin/felhom-hub/internal/web 0.027s
|
||||
FAIL
|
||||
@@ -0,0 +1,7 @@
|
||||
=== RUN TestAPIRoutes_NoCredential
|
||||
routes_test.go:156: GET /customers (global) with no credential: 200 "[]", want 401/403
|
||||
routes_test.go:156: GET /customers/c1 (global) with no credential: 404 "404 page not found", want 401/403
|
||||
--- FAIL: TestAPIRoutes_NoCredential (0.04s)
|
||||
FAIL
|
||||
FAIL gitea.dooplex.hu/admin/felhom-hub/internal/api 0.061s
|
||||
FAIL
|
||||
@@ -0,0 +1,57 @@
|
||||
=== RUN TestAPI_AccessTokenIsRefusedEverywhere
|
||||
routes_test.go:174: POST /report with an access token: 401 "Unauthorized"
|
||||
routes_test.go:174: GET /wait with an access token: 401 "Unauthorized"
|
||||
routes_test.go:174: POST /appliance/register with an access token: 400 "uuid and at least one MAC are required"
|
||||
routes_test.go:174: GET /appliance/poll with an access token: 404 "not found"
|
||||
routes_test.go:174: POST /host-report with an access token: 401 "Unauthorized"
|
||||
routes_test.go:174: POST /host-enroll with an access token: 400 "Invalid payload: customer_id required"
|
||||
routes_test.go:174: POST /admin/hosts with an access token: 403 "Forbidden: global key required"
|
||||
routes_test.go:174: PUT /hosts/h1/escrow with an access token: 401 "Unauthorized"
|
||||
routes_test.go:174: GET /hosts/h1/escrow with an access token: 401 "Unauthorized"
|
||||
routes_test.go:174: GET /hosts/h1/escrow/retained with an access token: 401 "Unauthorized"
|
||||
routes_test.go:174: PUT /hosts/h1/recovery-credential with an access token: 401 "Unauthorized"
|
||||
routes_test.go:174: GET /admin/hosts/h1/recovery-credential with an access token: 401 "Unauthorized"
|
||||
routes_test.go:174: PUT /admin/hosts/h1/recovery-mode with an access token: 403 "Forbidden: global key required"
|
||||
routes_test.go:174: DELETE /admin/hosts/h1/recovery-mode with an access token: 403 "Forbidden: global key required"
|
||||
routes_test.go:174: POST /hosts/h1/re-enroll with an access token: 403 "Forbidden: host not in recovery mode (operator must arm it)"
|
||||
routes_test.go:174: GET /hosts/h1/restore-directive with an access token: 401 "Unauthorized"
|
||||
routes_test.go:174: POST /hosts/h1/wg with an access token: 401 "Unauthorized"
|
||||
routes_test.go:174: POST /hosts/h1/pbs/consume-token with an access token: 401 "Unauthorized"
|
||||
routes_test.go:174: POST /hosts/h1/os-report with an access token: 401 "Unauthorized"
|
||||
routes_test.go:174: GET /hosts/h1/desired-state with an access token: 401 "Unauthorized"
|
||||
routes_test.go:174: GET /hosts/h1/jobs with an access token: 401 "Unauthorized"
|
||||
routes_test.go:174: DELETE /hosts/h1/jobs/j1 with an access token: 401 "Unauthorized"
|
||||
routes_test.go:174: PUT /admin/hosts/h1/desired-state with an access token: 403 "Forbidden: global key required"
|
||||
routes_test.go:174: POST /admin/hosts/h1/jobs with an access token: 403 "Forbidden: global key required"
|
||||
routes_test.go:174: PUT /admin/wg/endpoint with an access token: 403 "Forbidden: global key required"
|
||||
routes_test.go:174: GET /admin/wg/endpoint with an access token: 403 "Forbidden: global key required"
|
||||
routes_test.go:174: POST /admin/wg/peers with an access token: 403 "Forbidden: global key required"
|
||||
routes_test.go:174: DELETE /admin/wg/peers with an access token: 403 "Forbidden: global key required"
|
||||
routes_test.go:174: GET /admin/wg/peers with an access token: 403 "Forbidden: global key required"
|
||||
routes_test.go:174: PUT /admin/wg/operator-peer with an access token: 403 "Forbidden: global key required"
|
||||
routes_test.go:174: GET /admin/wg/operator-peer with an access token: 403 "Forbidden: global key required"
|
||||
routes_test.go:174: POST /claim/reset-request with an access token: 401 "Unauthorized"
|
||||
routes_test.go:174: POST /event with an access token: 401 "Unauthorized"
|
||||
routes_test.go:174: POST /mail with an access token: 401 "Unauthorized"
|
||||
routes_test.go:174: POST /notify with an access token: 401 "Unauthorized"
|
||||
routes_test.go:174: POST /preferences with an access token: 401 "Unauthorized"
|
||||
routes_test.go:174: GET /customers with an access token: 403 "Forbidden: global key required"
|
||||
routes_test.go:174: GET /customers/c1 with an access token: 403 "Forbidden: global key required"
|
||||
routes_test.go:174: GET /recovery/c1 with an access token: 401 "Unauthorized: X-Retrieval-Password header required"
|
||||
routes_test.go:174: GET /config/c1 with an access token: 401 "Unauthorized: X-Retrieval-Password header required"
|
||||
routes_test.go:174: POST /offsite/consume-password/c1 with an access token: 401 "unauthorized"
|
||||
routes_test.go:174: POST /offsite/register-key/c1 with an access token: 401 "unauthorized"
|
||||
routes_test.go:174: POST /offsite/confirm-key/c1 with an access token: 401 "unauthorized"
|
||||
routes_test.go:174: POST /offsite/move-aside/c1 with an access token: 401 "unauthorized"
|
||||
routes_test.go:174: POST /offsite/window-open/c1 with an access token: 401 "unauthorized"
|
||||
routes_test.go:174: POST /offsite/window-close/c1 with an access token: 401 "unauthorized"
|
||||
routes_test.go:174: POST /offsite/abandon-request/c1 with an access token: 401 "unauthorized"
|
||||
routes_test.go:174: POST /offsite/abandon-cancel/c1 with an access token: 401 "unauthorized"
|
||||
routes_test.go:174: POST /offsite/abandon-status/c1 with an access token: 401 "unauthorized"
|
||||
routes_test.go:174: GET /artifacts/c1 with an access token: 401 "Unauthorized: X-Retrieval-Password header required"
|
||||
routes_test.go:174: GET /assets/manifest with an access token: 401 "Unauthorized"
|
||||
routes_test.go:174: GET /assets/file/c1 with an access token: 401 "Unauthorized"
|
||||
--- FAIL: TestAPI_AccessTokenIsRefusedEverywhere (0.04s)
|
||||
FAIL
|
||||
FAIL gitea.dooplex.hu/admin/felhom-hub/internal/api 0.064s
|
||||
FAIL
|
||||
@@ -0,0 +1,6 @@
|
||||
=== RUN TestWebMountAlwaysAuthenticated
|
||||
token_wiring_test.go:43: mux.Handle("/", …): 0 via webServer.Handler(), 1 other — want exactly 1 and 0
|
||||
--- FAIL: TestWebMountAlwaysAuthenticated (0.00s)
|
||||
FAIL
|
||||
FAIL gitea.dooplex.hu/admin/felhom-hub/cmd/hub 0.025s
|
||||
FAIL
|
||||
@@ -0,0 +1,79 @@
|
||||
=== RUN TestToken_SessionOnlyRoutesRefuseEveryToken
|
||||
tokens_test.go:292: POST / with an all-scope token: 200 "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Felhom Hub — Customer Overview</title>\n <link rel=\"stylesheet\" href=\"/style.css?v=test\">\n <meta http-equiv=\"refresh\" content=\"60\">\n</head>\n<body>\n <s
|
||||
tokens_test.go:292: POST /style.css with an all-scope token: 200 "/* Felhom Hub — Dark theme */\n/* Felhom Hub — design system v2 (TASK-D4). Canonical tokens:\n documentation/design/design-system.md */\n\n@font-face {\n font-family: 'Plus Jakarta Sans';\n font-style: normal;\n font-weight: 400 800;\n font-display: swap;\n src: url('/static/fonts/pjs-latin.woff2') format('w
|
||||
tokens_test.go:292: POST /static/chart.min.js with an all-scope token: 200 "/**\n * Skipped minification because the original files appears to be already minified.\n * Original file: /npm/chart.js@4.4.7/dist/chart.umd.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n/*!\n * Chart.js v4.4.7\n * https://www.
|
||||
tokens_test.go:292: POST /static/fonts/x1 with an all-scope token: 404 "404 page not found\n", want 403 session only
|
||||
tokens_test.go:292: POST /configuration with an all-scope token: 303 "", want 403 session only
|
||||
tokens_test.go:292: POST /apps with an all-scope token: 200 "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Apps — Felhom Hub</title>\n <link rel=\"stylesheet\" href=\"/style.css?v=test\">\n</head>\n<body>\n <svg xmlns=\"http://www.w3.org/2000/svg\" style=\"display:non
|
||||
tokens_test.go:292: POST /apps/ with an all-scope token: 200 "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Apps — Felhom Hub</title>\n <link rel=\"stylesheet\" href=\"/style.css?v=test\">\n</head>\n<body>\n <svg xmlns=\"http://www.w3.org/2000/svg\" style=\"display:no
|
||||
tokens_test.go:292: GET /apps/x1/reset-telemetry with an all-scope token: 405 "Method not allowed\n", want 403 session only
|
||||
tokens_test.go:292: POST /apps/x1/reset-telemetry with an all-scope token: 303 "", want 403 session only
|
||||
tokens_test.go:292: GET /apps/x1/dismiss-issues with an all-scope token: 405 "Method not allowed\n", want 403 session only
|
||||
tokens_test.go:292: POST /apps/x1/dismiss-issues with an all-scope token: 400 "Invalid action\n", want 403 session only
|
||||
tokens_test.go:292: POST /apps/x1 with an all-scope token: 200 "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>x1 — Felhom Hub</title>\n <link rel=\"stylesheet\" href=\"/style.css?v=test\">\n <script src=\"/static/chart.min.js\"></script>\n \n<script>\n\n\nfunction
|
||||
tokens_test.go:292: POST /offsite with an all-scope token: 200 "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Offsite — Felhom Hub</title>\n <link rel=\"stylesheet\" href=\"/style.css?v=test\">\n</head>\n<body>\n <svg xmlns=\"http://www.w3.org/2000/svg\" style=\"displ
|
||||
tokens_test.go:292: GET /offsite/endpoints with an all-scope token: 405 "Method not allowed\n", want 403 session only
|
||||
tokens_test.go:292: POST /offsite/endpoints with an all-scope token: 400 "Invalid endpoint id (use lowercase letters, digits, hyphens) — nothing stored.\n", want 403 session only
|
||||
tokens_test.go:292: GET /offsite/endpoints/x1/delete with an all-scope token: 405 "Method not allowed\n", want 403 session only
|
||||
tokens_test.go:292: POST /offsite/endpoints/x1/delete with an all-scope token: 404 "404 page not found\n", want 403 session only
|
||||
tokens_test.go:292: POST /hosts with an all-scope token: 200 "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Hosts — Felhom Hub</title>\n <link rel=\"stylesheet\" href=\"/style.css?v=test\">\n</head>\n<body>\n <svg xmlns=\"http://www.w3.org/2000/svg\" style=\"display:n
|
||||
tokens_test.go:292: POST /hosts/ with an all-scope token: 200 "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Hosts — Felhom Hub</title>\n <link rel=\"stylesheet\" href=\"/style.css?v=test\">\n</head>\n<body>\n <svg xmlns=\"http://www.w3.org/2000/svg\" style=\"display:
|
||||
tokens_test.go:292: POST /system with an all-scope token: 503 "os updates not configured\n", want 403 session only
|
||||
tokens_test.go:292: GET /appliances/x1/bind with an all-scope token: 405 "Method not allowed\n", want 403 session only
|
||||
tokens_test.go:292: POST /appliances/x1/bind with an all-scope token: 405 "Method not allowed\n", want 403 session only
|
||||
tokens_test.go:292: GET /appliances/x1/discard with an all-scope token: 405 "Method not allowed\n", want 403 session only
|
||||
tokens_test.go:292: POST /appliances/x1/discard with an all-scope token: 405 "Method not allowed\n", want 403 session only
|
||||
tokens_test.go:292: GET /hosts/x1/delete-impact with an all-scope token: 404 "404 page not found\n", want 403 session only
|
||||
tokens_test.go:292: POST /hosts/x1/delete-impact with an all-scope token: 405 "Method not allowed\n", want 403 session only
|
||||
tokens_test.go:292: GET /hosts/x1/delete with an all-scope token: 405 "Method not allowed\n", want 403 session only
|
||||
tokens_test.go:292: POST /hosts/x1/delete with an all-scope token: 404 "404 page not found\n", want 403 session only
|
||||
tokens_test.go:292: GET /hosts/x1/reveal-recovery-credential with an all-scope token: 405 "Method not allowed\n", want 403 session only
|
||||
tokens_test.go:292: POST /hosts/x1/reveal-recovery-credential with an all-scope token: 404 "404 page not found\n", want 403 session only
|
||||
tokens_test.go:292: GET /hosts/x1/operator-action with an all-scope token: 405 "Method not allowed\n", want 403 session only
|
||||
tokens_test.go:292: GET /hosts/x1/request-logs with an all-scope token: 405 "Method not allowed\n", want 403 session only
|
||||
tokens_test.go:292: POST /hosts/x1/log-bundles/y1 with an all-scope token: 404 "404 page not found\n", want 403 session only
|
||||
tokens_test.go:292: POST /hosts/x1 with an all-scope token: 404 "404 page not found\n", want 403 session only
|
||||
tokens_test.go:292: GET /customers/x1/block with an all-scope token: 405 "Method not allowed\n", want 403 session only
|
||||
tokens_test.go:292: GET /customers/x1/selfbind-link with an all-scope token: 405 "Method not allowed\n", want 403 session only
|
||||
tokens_test.go:292: POST /customers/x1/selfbind-link with an all-scope token: 502 "Self-bind mailer is not configured on this hub\n", want 403 session only
|
||||
tokens_test.go:292: GET /customers/x1/unblock with an all-scope token: 405 "Method not allowed\n", want 403 session only
|
||||
tokens_test.go:292: GET /customers/x1/geo/disable with an all-scope token: 405 "Method not allowed\n", want 403 session only
|
||||
tokens_test.go:292: GET /customers/x1/floor with an all-scope token: 405 "Method not allowed\n", want 403 session only
|
||||
tokens_test.go:292: GET /customers/x1/create-config with an all-scope token: 405 "Method not allowed\n", want 403 session only
|
||||
tokens_test.go:292: POST /customers/x1/dr-recipe.json with an all-scope token: 405 "Method not allowed\n", want 403 session only
|
||||
tokens_test.go:292: GET /customers/x1/request-log-tail with an all-scope token: 405 "Method not allowed\n", want 403 session only
|
||||
tokens_test.go:292: POST /customers/x1/log-tail/y1 with an all-scope token: 404 "404 page not found\n", want 403 session only
|
||||
tokens_test.go:292: GET /customers/x1 with an all-scope token: 404 "404 page not found\n", want 403 session only
|
||||
tokens_test.go:292: POST /customers/x1 with an all-scope token: 404 "404 page not found\n", want 403 session only
|
||||
tokens_test.go:292: POST /configs with an all-scope token: 200 "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Felhom Hub — Customers</title>\n <link rel=\"stylesheet\" href=\"/style.css?v=test\">\n</head>\n<body>\n <svg xmlns=\"http://www.w3.org/2000/svg\" style=\"dis
|
||||
tokens_test.go:292: POST /configuration/global-floor/impact with an all-scope token: 405 "Method not allowed\n", want 403 session only
|
||||
tokens_test.go:292: GET /configuration/global-floor with an all-scope token: 405 "Method not allowed\n", want 403 session only
|
||||
tokens_test.go:292: GET /configuration/artifacts with an all-scope token: 405 "Method not allowed\n", want 403 session only
|
||||
tokens_test.go:292: GET /configuration/mail-hold/release with an all-scope token: 405 "Method not allowed\n", want 403 session only
|
||||
tokens_test.go:292: GET /configuration/password with an all-scope token: 405 "Method not allowed\n", want 403 session only
|
||||
tokens_test.go:292: POST /configuration/password with an all-scope token: 303 "", want 403 session only
|
||||
tokens_test.go:292: GET /configuration/tokens with an all-scope token: 405 "Method not allowed\n", want 403 session only
|
||||
tokens_test.go:292: GET /configuration/tokens/x1/revoke with an all-scope token: 405 "Method not allowed\n", want 403 session only
|
||||
tokens_test.go:292: GET /configs/x1/delete with an all-scope token: 404 "404 page not found\n", want 403 session only
|
||||
tokens_test.go:292: POST /configs/x1/delete with an all-scope token: 404 "404 page not found\n", want 403 session only
|
||||
tokens_test.go:292: GET /offsite/remove-unpinned/x1 with an all-scope token: 503 "unavailable\n", want 403 session only
|
||||
tokens_test.go:292: POST /offsite/remove-unpinned/x1 with an all-scope token: 503 "unavailable\n", want 403 session only
|
||||
tokens_test.go:292: GET /offsite/abandon-cancel/x1 with an all-scope token: 503 "unavailable\n", want 403 session only
|
||||
tokens_test.go:292: POST /offsite/abandon-cancel/x1 with an all-scope token: 503 "unavailable\n", want 403 session only
|
||||
tokens_test.go:292: GET /offsite/window-grant/x1 with an all-scope token: 503 "unavailable\n", want 403 session only
|
||||
tokens_test.go:292: GET /offsite/windows-enabled with an all-scope token: 503 "unavailable\n", want 403 session only
|
||||
tokens_test.go:292: GET /offsite/key-audit with an all-scope token: 405 "Method not allowed\n", want 403 session only
|
||||
tokens_test.go:292: GET /configs/x1/offsite-reissue with an all-scope token: 405 "Method not allowed\n", want 403 session only
|
||||
tokens_test.go:292: GET /configs/x1/claim-resend with an all-scope token: 405 "Method not allowed\n", want 403 session only
|
||||
tokens_test.go:292: GET /configs/x1/pbsdr-reissue with an all-scope token: 405 "Method not allowed\n", want 403 session only
|
||||
tokens_test.go:292: GET /configs/x1/offsite-freeze with an all-scope token: 405 "Method not allowed\n", want 403 session only
|
||||
tokens_test.go:292: GET /configs/x1/preview with an all-scope token: 404 "404 page not found\n", want 403 session only
|
||||
tokens_test.go:292: POST /configs/x1/preview with an all-scope token: 404 "404 page not found\n", want 403 session only
|
||||
tokens_test.go:292: GET /configs/x1/regen-password with an all-scope token: 405 "Method not allowed\n", want 403 session only
|
||||
tokens_test.go:292: POST /configs/x1/regen-password with an all-scope token: 303 "", want 403 session only
|
||||
tokens_test.go:292: GET /configs/x1/reset with an all-scope token: 404 "404 page not found\n", want 403 session only
|
||||
tokens_test.go:292: POST /configs/x1/reset with an all-scope token: 404 "404 page not found\n", want 403 session only
|
||||
--- FAIL: TestToken_SessionOnlyRoutesRefuseEveryToken (0.09s)
|
||||
FAIL
|
||||
FAIL gitea.dooplex.hu/admin/felhom-hub/internal/web 0.107s
|
||||
FAIL
|
||||
@@ -0,0 +1,6 @@
|
||||
=== RUN TestToken_NoTokenUnknownExpiredRevoked401
|
||||
tokens_test.go:326: expired token: 200, want 401
|
||||
--- FAIL: TestToken_NoTokenUnknownExpiredRevoked401 (0.05s)
|
||||
FAIL
|
||||
FAIL gitea.dooplex.hu/admin/felhom-hub/internal/web 0.073s
|
||||
FAIL
|
||||
@@ -0,0 +1,7 @@
|
||||
=== RUN TestToken_ScopeDecides
|
||||
tokens_test.go:353: floor:read token on floor save: 303, want 403
|
||||
tokens_test.go:356: a refused token changed the floor
|
||||
--- FAIL: TestToken_ScopeDecides (0.05s)
|
||||
FAIL
|
||||
FAIL gitea.dooplex.hu/admin/felhom-hub/internal/web 0.069s
|
||||
FAIL
|
||||
@@ -0,0 +1,6 @@
|
||||
=== RUN TestAPIToken_StoredRowHasNoPlainToken
|
||||
tokens_test.go:414: t.db holds the plain token
|
||||
--- FAIL: TestAPIToken_StoredRowHasNoPlainToken (0.04s)
|
||||
FAIL
|
||||
FAIL gitea.dooplex.hu/admin/felhom-hub/internal/web 0.063s
|
||||
FAIL
|
||||
@@ -0,0 +1,112 @@
|
||||
=== RUN TestRequireAuth_NoPasswordRefusesEveryOperatorRoute
|
||||
tokens_test.go:546: no password: GET / → 200, want 503
|
||||
tokens_test.go:546: no password: POST / → 200, want 503
|
||||
tokens_test.go:546: no password: GET /style.css → 200, want 503
|
||||
tokens_test.go:546: no password: POST /style.css → 200, want 503
|
||||
tokens_test.go:546: no password: GET /static/chart.min.js → 200, want 503
|
||||
tokens_test.go:546: no password: POST /static/chart.min.js → 200, want 503
|
||||
tokens_test.go:546: no password: GET /static/fonts/x1 → 404, want 503
|
||||
tokens_test.go:546: no password: POST /static/fonts/x1 → 404, want 503
|
||||
tokens_test.go:546: no password: GET /configuration → 200, want 503
|
||||
tokens_test.go:546: no password: POST /configuration → 303, want 503
|
||||
tokens_test.go:546: no password: GET /apps → 200, want 503
|
||||
tokens_test.go:546: no password: POST /apps → 200, want 503
|
||||
tokens_test.go:546: no password: GET /apps/ → 200, want 503
|
||||
tokens_test.go:546: no password: POST /apps/ → 200, want 503
|
||||
tokens_test.go:546: no password: GET /apps/x1/reset-telemetry → 405, want 503
|
||||
tokens_test.go:546: no password: POST /apps/x1/reset-telemetry → 303, want 503
|
||||
tokens_test.go:546: no password: GET /apps/x1/dismiss-issues → 405, want 503
|
||||
tokens_test.go:546: no password: POST /apps/x1/dismiss-issues → 400, want 503
|
||||
tokens_test.go:546: no password: GET /apps/x1 → 200, want 503
|
||||
tokens_test.go:546: no password: POST /apps/x1 → 200, want 503
|
||||
tokens_test.go:546: no password: GET /offsite → 200, want 503
|
||||
tokens_test.go:546: no password: POST /offsite → 200, want 503
|
||||
tokens_test.go:546: no password: GET /offsite/endpoints → 405, want 503
|
||||
tokens_test.go:546: no password: POST /offsite/endpoints → 400, want 503
|
||||
tokens_test.go:546: no password: GET /offsite/endpoints/x1/delete → 405, want 503
|
||||
tokens_test.go:546: no password: POST /offsite/endpoints/x1/delete → 404, want 503
|
||||
tokens_test.go:546: no password: GET /hosts → 200, want 503
|
||||
tokens_test.go:546: no password: POST /hosts → 200, want 503
|
||||
tokens_test.go:546: no password: GET /hosts/ → 200, want 503
|
||||
tokens_test.go:546: no password: POST /hosts/ → 200, want 503
|
||||
tokens_test.go:546: no password: GET /appliances/x1/bind → 405, want 503
|
||||
tokens_test.go:546: no password: POST /appliances/x1/bind → 405, want 503
|
||||
tokens_test.go:546: no password: GET /appliances/x1/discard → 405, want 503
|
||||
tokens_test.go:546: no password: POST /appliances/x1/discard → 405, want 503
|
||||
tokens_test.go:546: no password: GET /hosts/x1/delete-impact → 404, want 503
|
||||
tokens_test.go:546: no password: POST /hosts/x1/delete-impact → 405, want 503
|
||||
tokens_test.go:546: no password: GET /hosts/x1/delete → 405, want 503
|
||||
tokens_test.go:546: no password: POST /hosts/x1/delete → 404, want 503
|
||||
tokens_test.go:546: no password: GET /hosts/x1/reveal-recovery-credential → 405, want 503
|
||||
tokens_test.go:546: no password: POST /hosts/x1/reveal-recovery-credential → 404, want 503
|
||||
tokens_test.go:546: no password: GET /hosts/x1/operator-action → 405, want 503
|
||||
tokens_test.go:546: no password: POST /hosts/x1/operator-action → 403, want 503
|
||||
tokens_test.go:546: no password: GET /hosts/x1/request-logs → 405, want 503
|
||||
tokens_test.go:546: no password: POST /hosts/x1/request-logs → 403, want 503
|
||||
tokens_test.go:546: no password: GET /hosts/x1/log-bundles/y1 → 404, want 503
|
||||
tokens_test.go:546: no password: POST /hosts/x1/log-bundles/y1 → 404, want 503
|
||||
tokens_test.go:546: no password: GET /hosts/x1 → 404, want 503
|
||||
tokens_test.go:546: no password: POST /hosts/x1 → 404, want 503
|
||||
tokens_test.go:546: no password: GET /customers/x1/block → 405, want 503
|
||||
tokens_test.go:546: no password: POST /customers/x1/block → 404, want 503
|
||||
tokens_test.go:546: no password: GET /customers/x1/selfbind-link → 405, want 503
|
||||
tokens_test.go:546: no password: POST /customers/x1/selfbind-link → 502, want 503
|
||||
tokens_test.go:546: no password: GET /customers/x1/unblock → 405, want 503
|
||||
tokens_test.go:546: no password: POST /customers/x1/unblock → 404, want 503
|
||||
tokens_test.go:546: no password: GET /customers/x1/geo/disable → 405, want 503
|
||||
tokens_test.go:546: no password: POST /customers/x1/geo/disable → 404, want 503
|
||||
tokens_test.go:546: no password: GET /customers/x1/floor → 405, want 503
|
||||
tokens_test.go:546: no password: POST /customers/x1/floor → 404, want 503
|
||||
tokens_test.go:546: no password: GET /customers/x1/create-config → 405, want 503
|
||||
tokens_test.go:546: no password: POST /customers/x1/create-config → 303, want 503
|
||||
tokens_test.go:546: no password: GET /customers/x1/dr-recipe.json → 404, want 503
|
||||
tokens_test.go:546: no password: POST /customers/x1/dr-recipe.json → 405, want 503
|
||||
tokens_test.go:546: no password: GET /customers/x1/request-log-tail → 405, want 503
|
||||
tokens_test.go:546: no password: POST /customers/x1/request-log-tail → 400, want 503
|
||||
tokens_test.go:546: no password: GET /customers/x1/log-tail/y1 → 404, want 503
|
||||
tokens_test.go:546: no password: POST /customers/x1/log-tail/y1 → 404, want 503
|
||||
tokens_test.go:546: no password: GET /customers/x1 → 200, want 503
|
||||
tokens_test.go:546: no password: POST /customers/x1 → 200, want 503
|
||||
tokens_test.go:546: no password: GET /configs → 200, want 503
|
||||
tokens_test.go:546: no password: POST /configs → 200, want 503
|
||||
tokens_test.go:546: no password: GET /configs/new → 200, want 503
|
||||
tokens_test.go:546: no password: POST /configs/new → 200, want 503
|
||||
tokens_test.go:546: no password: GET /configuration/global-floor/impact → 200, want 503
|
||||
tokens_test.go:546: no password: POST /configuration/global-floor/impact → 405, want 503
|
||||
tokens_test.go:546: no password: GET /configuration/global-floor → 405, want 503
|
||||
tokens_test.go:546: no password: POST /configuration/global-floor → 303, want 503
|
||||
tokens_test.go:546: no password: GET /configuration/artifacts → 405, want 503
|
||||
tokens_test.go:546: no password: POST /configuration/artifacts → 303, want 503
|
||||
tokens_test.go:546: no password: GET /configuration/mail-hold/release → 405, want 503
|
||||
tokens_test.go:546: no password: POST /configuration/mail-hold/release → 303, want 503
|
||||
tokens_test.go:546: no password: GET /configuration/password → 405, want 503
|
||||
tokens_test.go:546: no password: POST /configuration/password → 303, want 503
|
||||
tokens_test.go:546: no password: GET /configuration/tokens → 405, want 503
|
||||
tokens_test.go:546: no password: POST /configuration/tokens → 303, want 503
|
||||
tokens_test.go:546: no password: GET /configuration/tokens/x1/revoke → 405, want 503
|
||||
tokens_test.go:546: no password: POST /configuration/tokens/x1/revoke → 404, want 503
|
||||
tokens_test.go:546: no password: GET /configs/x1/delete → 200, want 503
|
||||
tokens_test.go:546: no password: POST /configs/x1/delete → 400, want 503
|
||||
tokens_test.go:546: no password: GET /configs/x1/edit → 302, want 503
|
||||
tokens_test.go:546: no password: POST /configs/x1/edit → 200, want 503
|
||||
tokens_test.go:546: no password: GET /offsite/key-audit → 405, want 503
|
||||
tokens_test.go:546: no password: GET /configs/x1/offsite-reissue → 405, want 503
|
||||
tokens_test.go:546: no password: POST /configs/x1/offsite-reissue → 502, want 503
|
||||
tokens_test.go:546: no password: GET /configs/x1/claim-resend → 405, want 503
|
||||
tokens_test.go:546: no password: POST /configs/x1/claim-resend → 502, want 503
|
||||
tokens_test.go:546: no password: GET /configs/x1/pbsdr-reissue → 405, want 503
|
||||
tokens_test.go:546: no password: POST /configs/x1/pbsdr-reissue → 502, want 503
|
||||
tokens_test.go:546: no password: GET /configs/x1/offsite-freeze → 405, want 503
|
||||
tokens_test.go:546: no password: POST /configs/x1/offsite-freeze → 502, want 503
|
||||
tokens_test.go:546: no password: GET /configs/x1/preview → 200, want 503
|
||||
tokens_test.go:546: no password: POST /configs/x1/preview → 200, want 503
|
||||
tokens_test.go:546: no password: GET /configs/x1/regen-password → 405, want 503
|
||||
tokens_test.go:546: no password: POST /configs/x1/regen-password → 303, want 503
|
||||
tokens_test.go:546: no password: GET /configs/x1/reset → 200, want 503
|
||||
tokens_test.go:546: no password: POST /configs/x1/reset → 400, want 503
|
||||
tokens_test.go:546: no password: GET /configs/x1 → 303, want 503
|
||||
tokens_test.go:546: no password: POST /configs/x1 → 303, want 503
|
||||
--- FAIL: TestRequireAuth_NoPasswordRefusesEveryOperatorRoute (0.11s)
|
||||
FAIL
|
||||
FAIL gitea.dooplex.hu/admin/felhom-hub/internal/web 0.128s
|
||||
FAIL
|
||||
@@ -0,0 +1,6 @@
|
||||
=== RUN TestToken_CSRFRuleUnchangedForBasic
|
||||
tokens_test.go:437: Basic without X-Felhom-Operator: 303, want 403
|
||||
--- FAIL: TestToken_CSRFRuleUnchangedForBasic (0.06s)
|
||||
FAIL
|
||||
FAIL gitea.dooplex.hu/admin/felhom-hub/internal/web 0.080s
|
||||
FAIL
|
||||
@@ -0,0 +1,7 @@
|
||||
=== RUN TestToken_CannotManageTokens
|
||||
tokens_test.go:462: handleTokenCreate under a token: 200
|
||||
tokens_test.go:466: a token was created by a token: 2 rows
|
||||
--- FAIL: TestToken_CannotManageTokens (0.05s)
|
||||
FAIL
|
||||
FAIL gitea.dooplex.hu/admin/felhom-hub/internal/web 0.071s
|
||||
FAIL
|
||||
@@ -0,0 +1,6 @@
|
||||
=== RUN TestAPIRouteTable_MatchesSwitch
|
||||
routes_test.go:119: route 36: switch has {Method:GET Exact:/customers Prefix: Suffix: Contains: Auth: Why:}, table has {Method:GET Exact: Prefix:/customers/ Suffix: Contains: Auth: Why:} — classify it in routes.go in the switch's order
|
||||
--- FAIL: TestAPIRouteTable_MatchesSwitch (0.01s)
|
||||
FAIL
|
||||
FAIL gitea.dooplex.hu/admin/felhom-hub/internal/api 0.030s
|
||||
FAIL
|
||||
Reference in New Issue
Block a user