import type { ConfigUiHint } from "../config-ui-hints-types.js" ;
import { normalizeLowercaseStringOrEmpty } from "../string-coerce.js" ;
export const SENSITIVE_URL_HINT_TAG = "url-secret" ;
const SENSITIVE_URL_QUERY_PARAM_NAMES = new Set([
"token" ,
"key" ,
"api_key" ,
"apikey" ,
"secret" ,
"access_token" ,
"auth_token" ,
"password" ,
"pass" ,
"passwd" ,
"auth" ,
"client_secret" ,
"hook_token" ,
"refresh_token" ,
"signature" ,
]);
export function isSensitiveUrlQueryParamName(name: string): boolean {
const normalized = normalizeLowercaseStringOrEmpty(name).replaceAll("-" , "_" );
return SENSITIVE_URL_QUERY_PARAM_NAMES.has(normalized);
}
export function isSensitiveUrlConfigPath(path: string): boolean {
if (path.endsWith(".baseUrl" ) || path.endsWith(".httpUrl" )) {
return true ;
}
if (path.endsWith(".cdpUrl" )) {
return true ;
}
if (path.endsWith(".request.proxy.url" )) {
return true ;
}
return /^mcp\.servers\.(?:\*|[^.]+)\.url$/.test(path);
}
export function hasSensitiveUrlHintTag(hint: Pick<ConfigUiHint, "tags" > | undefined): boolean {
return hint?.tags?.includes(SENSITIVE_URL_HINT_TAG) === true ;
}
export function redactSensitiveUrl(value: string): string {
try {
const parsed = new URL(value);
let mutated = false ;
if (parsed.username || parsed.password) {
parsed.username = parsed.username ? "***" : "" ;
parsed.password = parsed.password ? "***" : "" ;
mutated = true ;
}
for (const key of Array.from(parsed.searchParams.keys())) {
if (isSensitiveUrlQueryParamName(key)) {
parsed.searchParams.set(key, "***" );
mutated = true ;
}
}
return mutated ? parsed.toString() : value;
} catch {
return value;
}
}
export function redactSensitiveUrlLikeString(value: string): string {
const redactedUrl = redactSensitiveUrl(value);
if (redactedUrl !== value) {
return redactedUrl;
}
return value
.replace(/\/\/([^@/?#]+)@/, "//***:***@")
.replace(/([?&])([^=&]+)=([^&]*)/g, (match, prefix: string, key: string) =>
isSensitiveUrlQueryParamName(key) ? `${prefix}${key}=***` : match,
);
}
Messung V0.5 in Prozent C=99 H=96 G=97
¤ Dauer der Verarbeitung: 0.13 Sekunden
(vorverarbeitet am 2026-05-26)
¤
*© Formatika GbR, Deutschland