Merged via squash. Prepared head SHA: c290c2ab6a3c3309adcbc4dc834f3c10d2ae1039 Co-authored-by: joshavant <830519+joshavant@users.noreply.github.com> Co-authored-by: joshavant <830519+joshavant@users.noreply.github.com> Reviewed-by: @joshavant
75 lines
2.4 KiB
TypeScript
75 lines
2.4 KiB
TypeScript
import { coerceSecretRef, normalizeSecretInputString } from "../../config/types.secrets.js";
|
|
import type { AuthProfileCredential } from "./types.js";
|
|
|
|
export type AuthCredentialReasonCode =
|
|
| "ok"
|
|
| "missing_credential"
|
|
| "invalid_expires"
|
|
| "expired"
|
|
| "unresolved_ref";
|
|
|
|
export type TokenExpiryState = "missing" | "valid" | "expired" | "invalid_expires";
|
|
|
|
export function resolveTokenExpiryState(expires: unknown, now = Date.now()): TokenExpiryState {
|
|
if (expires === undefined) {
|
|
return "missing";
|
|
}
|
|
if (typeof expires !== "number") {
|
|
return "invalid_expires";
|
|
}
|
|
if (!Number.isFinite(expires) || expires <= 0) {
|
|
return "invalid_expires";
|
|
}
|
|
return now >= expires ? "expired" : "valid";
|
|
}
|
|
|
|
function hasConfiguredSecretRef(value: unknown): boolean {
|
|
return coerceSecretRef(value) !== null;
|
|
}
|
|
|
|
function hasConfiguredSecretString(value: unknown): boolean {
|
|
return normalizeSecretInputString(value) !== undefined;
|
|
}
|
|
|
|
export function evaluateStoredCredentialEligibility(params: {
|
|
credential: AuthProfileCredential;
|
|
now?: number;
|
|
}): { eligible: boolean; reasonCode: AuthCredentialReasonCode } {
|
|
const now = params.now ?? Date.now();
|
|
const credential = params.credential;
|
|
|
|
if (credential.type === "api_key") {
|
|
const hasKey = hasConfiguredSecretString(credential.key);
|
|
const hasKeyRef = hasConfiguredSecretRef(credential.keyRef);
|
|
if (!hasKey && !hasKeyRef) {
|
|
return { eligible: false, reasonCode: "missing_credential" };
|
|
}
|
|
return { eligible: true, reasonCode: "ok" };
|
|
}
|
|
|
|
if (credential.type === "token") {
|
|
const hasToken = hasConfiguredSecretString(credential.token);
|
|
const hasTokenRef = hasConfiguredSecretRef(credential.tokenRef);
|
|
if (!hasToken && !hasTokenRef) {
|
|
return { eligible: false, reasonCode: "missing_credential" };
|
|
}
|
|
|
|
const expiryState = resolveTokenExpiryState(credential.expires, now);
|
|
if (expiryState === "invalid_expires") {
|
|
return { eligible: false, reasonCode: "invalid_expires" };
|
|
}
|
|
if (expiryState === "expired") {
|
|
return { eligible: false, reasonCode: "expired" };
|
|
}
|
|
return { eligible: true, reasonCode: "ok" };
|
|
}
|
|
|
|
if (
|
|
normalizeSecretInputString(credential.access) === undefined &&
|
|
normalizeSecretInputString(credential.refresh) === undefined
|
|
) {
|
|
return { eligible: false, reasonCode: "missing_credential" };
|
|
}
|
|
return { eligible: true, reasonCode: "ok" };
|
|
}
|