mirror of
https://github.com/openclaw/openclaw.git
synced 2026-04-18 06:37:29 +00:00
refactor(auth): share api key masking utility
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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)}`;
|
||||
};
|
||||
|
||||
18
src/utils/mask-api-key.test.ts
Normal file
18
src/utils/mask-api-key.test.ts
Normal 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
10
src/utils/mask-api-key.ts
Normal 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)}`;
|
||||
};
|
||||
Reference in New Issue
Block a user