43 lines
1.2 KiB
TypeScript
43 lines
1.2 KiB
TypeScript
import { hash } from '@/lib/crypto';
|
|
import { getRandomChars } from '@/lib/generate';
|
|
|
|
export const API_KEY_PREFIX = 'umami_';
|
|
export const API_KEY_LENGTH = 32;
|
|
export const API_KEY_DISPLAY_LENGTH = API_KEY_PREFIX.length + 8;
|
|
export const API_KEY_LAST_USED_INTERVAL = 5 * 60 * 1000;
|
|
|
|
// Routes that manage account credentials or admin state must not be
|
|
// reachable with an API key. Matched as path prefixes.
|
|
export const API_KEY_BLOCKED_PATHS = [
|
|
'/api/me/password',
|
|
'/api/me/api-keys',
|
|
'/api/2fa',
|
|
'/api/auth',
|
|
'/api/users',
|
|
'/api/admin',
|
|
];
|
|
|
|
export function generateApiKey() {
|
|
return `${API_KEY_PREFIX}${getRandomChars(API_KEY_LENGTH)}`;
|
|
}
|
|
|
|
export function hashApiKey(key: string) {
|
|
return hash(key);
|
|
}
|
|
|
|
export function getApiKeyPrefix(key: string) {
|
|
return key.slice(0, API_KEY_DISPLAY_LENGTH);
|
|
}
|
|
|
|
export function isApiKey(token?: string | null): token is string {
|
|
return typeof token === 'string' && token.startsWith(API_KEY_PREFIX);
|
|
}
|
|
|
|
export function isApiKeyBlockedPath(pathname: string) {
|
|
return API_KEY_BLOCKED_PATHS.some(path => pathname === path || pathname.startsWith(`${path}/`));
|
|
}
|
|
|
|
export function isApiKeyEnabled() {
|
|
return !process.env.CLOUD_MODE;
|
|
}
|