Merge branch 'cli-improvements-1' with @reviq/utils password hashing
- Use executeBootstrap helper from @reviq/db for CLI bootstrap - Update @reviq/db to use @reviq/utils for PBKDF2-SHA256 password hashing (Cloudflare Workers compatible) - Keep @scure/base for base58 token encoding - Remove redundant password.ts from @reviq/db (import directly from @reviq/utils) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,3 +1,10 @@
|
||||
import { base58 } from "@scure/base";
|
||||
|
||||
/**
|
||||
* Token prefix for all RevIQ API tokens
|
||||
*/
|
||||
export const TOKEN_PREFIX = "reviq_";
|
||||
|
||||
/**
|
||||
* Hash a token with SHA-256 for storage in database
|
||||
* Never store raw tokens - always hash first
|
||||
@@ -13,6 +20,34 @@ export const hashToken = async (token: string): Promise<string> => {
|
||||
.join("");
|
||||
};
|
||||
|
||||
/**
|
||||
* Validate that a token has the correct format
|
||||
* Returns the raw bytes if valid, null if invalid
|
||||
*/
|
||||
export const parseToken = (token: string): Uint8Array | null => {
|
||||
if (!token.startsWith(TOKEN_PREFIX)) {
|
||||
return null;
|
||||
}
|
||||
const encoded = token.slice(TOKEN_PREFIX.length);
|
||||
try {
|
||||
const bytes = base58.decode(encoded);
|
||||
// Expect 32 bytes of entropy
|
||||
if (bytes.length !== 32) {
|
||||
return null;
|
||||
}
|
||||
return bytes;
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Check if a token has the valid reviq_ prefix format
|
||||
*/
|
||||
export const isValidTokenFormat = (token: string): boolean => {
|
||||
return parseToken(token) !== null;
|
||||
};
|
||||
|
||||
/**
|
||||
* Generate a session token (UUID v4)
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user