#!/usr/bin/env node "use strict"; const Database = require("better-sqlite3"); const path = require("path"); const crypto = require("crypto"); function callDb(fn) { const db = new Database(path.resolve(__dirname, "../data/auth.db"), { fileMustExist: true, }); try { fn(db); } finally { db.close(); } } function gen(bytes) { return crypto.randomBytes(bytes).toString("hex"); } function addUser(args) { const [username, email, status, displayName] = args; callDb((db) => { const res = db .prepare( ` INSERT INTO users (username, email, status, display_name) VALUES (?, ?, ?, ?) `, ) .run(username, email, status, displayName); console.log("user_id:", res.lastInsertRowid); }); } function disUser(args) { const [username] = args; callDb((db) => { db.prepare( ` UPDATE users SET status = 'disabled' WHERE username = ? `, ).run(username); console.log("user disabled:", username); }); } function listUser(args) { const [username] = args; callDb((db) => { const user = db .prepare( ` SELECT user_id, username, email, status, display_name, created_at FROM users WHERE username = ? `, ) .get(username); if (!user) { console.log("user not found"); return; } console.log("USER"); console.log(user); const keys = db .prepare( ` SELECT api_key, status, created_at, last_used_at FROM api_keys WHERE user_id = ? `, ) .all(user.user_id); if (keys.length) { console.log("\nAPI_KEYS"); keys.forEach((k) => console.log(k)); } }); } function addKey(args) { const [username] = args; callDb((db) => { const user = db .prepare( ` SELECT user_id FROM users WHERE username = ? `, ) .get(username); const apiKey = gen(24); const apiSecret = gen(48); db.prepare( ` INSERT INTO api_keys (user_id, api_key, api_secret, status) VALUES (?, ?, ?, 'active') `, ).run(user.user_id, apiKey, apiSecret); console.log("api_key:", apiKey); console.log("api_secret:", apiSecret); }); } function disKey(args) { const [apiKey] = args; callDb((db) => { db.prepare( ` UPDATE api_keys SET status = 'revoked' WHERE api_key = ? `, ).run(apiKey); console.log("api_key revoked"); }); } const argv = process.argv.slice(2); const cmd = argv[0]; const args = argv.slice(1); switch (cmd) { case "adduser": addUser(args); break; case "disuser": disUser(args); break; case "listuser": listUser(args); break; case "addkey": addKey(args); break; case "diskey": disKey(args); break; default: console.error("Unknown command"); process.exit(1); }