refactor(auth): share api key masking utility

This commit is contained in:
Peter Steinberger
2026-02-18 17:13:35 +00:00
parent 3138dbaf75
commit 288015a9fc
4 changed files with 30 additions and 22 deletions

View File

@@ -12,20 +12,10 @@ import {
import { findNormalizedProviderValue, normalizeProviderId } from "../../agents/model-selection.js";
import type { OpenClawConfig } from "../../config/config.js";
import { shortenHomePath } from "../../utils.js";
import { maskApiKey } from "../../utils/mask-api-key.js";
export type ModelAuthDetailMode = "compact" | "verbose";
const maskApiKey = (value: string): string => {
const trimmed = value.trim();
if (!trimmed) {
return "missing";
}
if (trimmed.length <= 16) {
return trimmed;
}
return `${trimmed.slice(0, 8)}...${trimmed.slice(-8)}`;
};
export const resolveAuthLabel = async (
provider: string,
cfg: OpenClawConfig,

View File

@@ -1,4 +1,5 @@
import { colorize, isRich as isRichTerminal, theme } from "../../terminal/theme.js";
export { maskApiKey } from "../../utils/mask-api-key.js";
export const isRich = (opts?: { json?: boolean; plain?: boolean }) =>
Boolean(isRichTerminal() && !opts?.json && !opts?.plain);
@@ -55,14 +56,3 @@ export const truncate = (value: string, max: number) => {
}
return `${value.slice(0, max - 3)}...`;
};
export const maskApiKey = (value: string): string => {
const trimmed = value.trim();
if (!trimmed) {
return "missing";
}
if (trimmed.length <= 16) {
return trimmed;
}
return `${trimmed.slice(0, 8)}...${trimmed.slice(-8)}`;
};

View File

@@ -0,0 +1,18 @@
import { describe, expect, it } from "vitest";
import { maskApiKey } from "./mask-api-key.js";
describe("maskApiKey", () => {
it("returns missing for empty values", () => {
expect(maskApiKey("")).toBe("missing");
expect(maskApiKey(" ")).toBe("missing");
});
it("returns trimmed value when length is 16 chars or less", () => {
expect(maskApiKey(" abcdefghijklmnop ")).toBe("abcdefghijklmnop");
expect(maskApiKey(" short ")).toBe("short");
});
it("masks long values with first and last 8 chars", () => {
expect(maskApiKey("1234567890abcdefghijklmnop")).toBe("12345678...ijklmnop");
});
});

10
src/utils/mask-api-key.ts Normal file
View File

@@ -0,0 +1,10 @@
export const maskApiKey = (value: string): string => {
const trimmed = value.trim();
if (!trimmed) {
return "missing";
}
if (trimmed.length <= 16) {
return trimmed;
}
return `${trimmed.slice(0, 8)}...${trimmed.slice(-8)}`;
};