Found while implementing #8082 (session session_01Euoy6wyfzgiWtgCg4s6JK2). #8082 closes the user:password@host userinfo door on authored driver URLs. libSQL has a second URL syntax for the same secret: libsql://x.turso.io?authToken=eyJ... — the @libsql/client accepts an auth token as a URL query parameter, and the turso driver hands the authored url (and syncUrl) to createClient as-is (packages/drivers/driver-turso/src/turso-driver.ts).
So an author refused on config.authToken (#8078) and on URL userinfo (#8082) still has a one-syntax-over spelling that (a) persists the JWT cleartext into sys_metadata — certain, independent of the client — and (b) plausibly authenticates at connect. That is the same workaround-shape #8082's ruling template exists to close ("close the forward door"), one query-parameter over.
Not measured end-to-end: I verified the driver passes the URL through untouched, but did not stand up a libSQL server to confirm the client honors ?authToken= from an authored URL in our composition. The at-rest cleartext half does not depend on that; the connect half should be measured before choosing the fix.
Suggested shape (for triage)
Extend the #8082 shared value-level parse (urlUserinfoPassword / credentialFreeUrl, packages/spec/src/data/driver/common.zod.ts) with a per-driver list of credential-bearing query parameter names (turso: authToken), refused with the same binder/credentialsRef guidance. Deliberately NOT done inside #8082: the ruling's accept-set change named URL userinfo; widening a published authoring surface's refusal to query parameters is its own small decision.
Also relevant: the read-path redaction (#8126, redactUrlPassword) strips only the userinfo password component — a stored ?authToken= would be served back cleartext by getDatasource(), so the read half needs the same extension if the write half is ruled in.
Refs: #8082 (userinfo ruling + shared parse), #8078 (authToken key refusal), #8126 (read-path redaction), #8152 (bound-secret route for turso).
Generated by Claude Code
Found while implementing #8082 (session
session_01Euoy6wyfzgiWtgCg4s6JK2). #8082 closes theuser:password@hostuserinfo door on authored driver URLs. libSQL has a second URL syntax for the same secret:libsql://x.turso.io?authToken=eyJ...— the@libsql/clientaccepts an auth token as a URL query parameter, and the turso driver hands the authoredurl(andsyncUrl) tocreateClientas-is (packages/drivers/driver-turso/src/turso-driver.ts).So an author refused on
config.authToken(#8078) and on URL userinfo (#8082) still has a one-syntax-over spelling that (a) persists the JWT cleartext intosys_metadata— certain, independent of the client — and (b) plausibly authenticates at connect. That is the same workaround-shape #8082's ruling template exists to close ("close the forward door"), one query-parameter over.Not measured end-to-end: I verified the driver passes the URL through untouched, but did not stand up a libSQL server to confirm the client honors
?authToken=from an authored URL in our composition. The at-rest cleartext half does not depend on that; the connect half should be measured before choosing the fix.Suggested shape (for triage)
Extend the #8082 shared value-level parse (
urlUserinfoPassword/credentialFreeUrl,packages/spec/src/data/driver/common.zod.ts) with a per-driver list of credential-bearing query parameter names (turso:authToken), refused with the same binder/credentialsRefguidance. Deliberately NOT done inside #8082: the ruling's accept-set change named URL userinfo; widening a published authoring surface's refusal to query parameters is its own small decision.Also relevant: the read-path redaction (#8126,
redactUrlPassword) strips only the userinfo password component — a stored?authToken=would be served back cleartext bygetDatasource(), so the read half needs the same extension if the write half is ruled in.Refs: #8082 (userinfo ruling + shared parse), #8078 (
authTokenkey refusal), #8126 (read-path redaction), #8152 (bound-secret route for turso).Generated by Claude Code