mirror of
https://github.com/openclaw/openclaw.git
synced 2026-06-23 13:58:10 +00:00
63 lines
1.8 KiB
JavaScript
63 lines
1.8 KiB
JavaScript
// Shared auth profile store assertions for install/onboard E2E proof.
|
|
function isRecord(value) {
|
|
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
}
|
|
|
|
function hasExpectedOpenAiEnvRef(profile) {
|
|
if (!isRecord(profile)) {
|
|
return false;
|
|
}
|
|
const keyRef = profile.keyRef;
|
|
return (
|
|
profile.type === "api_key" &&
|
|
profile.provider === "openai" &&
|
|
!Object.hasOwn(profile, "key") &&
|
|
isRecord(keyRef) &&
|
|
keyRef.source === "env" &&
|
|
keyRef.provider === "default" &&
|
|
keyRef.id === "OPENAI_API_KEY"
|
|
);
|
|
}
|
|
|
|
function hasInlineOpenAiKey(profile) {
|
|
return (
|
|
isRecord(profile) &&
|
|
profile.type === "api_key" &&
|
|
profile.provider === "openai" &&
|
|
Object.hasOwn(profile, "key")
|
|
);
|
|
}
|
|
|
|
export function assertOpenAiEnvAuthProfileStore(storeJson, options = {}) {
|
|
const missingMessage = options.missingMessage ?? "auth profile store was not persisted";
|
|
const envRefMessage =
|
|
options.envRefMessage ?? "auth profile did not persist OPENAI_API_KEY env ref";
|
|
const rawKeyMessage = options.rawKeyMessage ?? "auth profile persisted an inline OpenAI key";
|
|
const rawKeyNeedle = options.rawKeyNeedle;
|
|
|
|
if (!storeJson) {
|
|
throw new Error(missingMessage);
|
|
}
|
|
if (rawKeyNeedle && storeJson.includes(rawKeyNeedle)) {
|
|
throw new Error(rawKeyMessage);
|
|
}
|
|
|
|
let store;
|
|
try {
|
|
store = JSON.parse(storeJson);
|
|
} catch {
|
|
throw new Error(envRefMessage);
|
|
}
|
|
const profiles = isRecord(store) && isRecord(store.profiles) ? store.profiles : null;
|
|
if (!profiles) {
|
|
throw new Error(envRefMessage);
|
|
}
|
|
const profileValues = Object.values(profiles);
|
|
if (profileValues.some(hasInlineOpenAiKey)) {
|
|
throw new Error(rawKeyMessage);
|
|
}
|
|
if (!profileValues.some(hasExpectedOpenAiEnvRef)) {
|
|
throw new Error(envRefMessage);
|
|
}
|
|
}
|