164 lines
2.8 KiB
JavaScript
Executable File
164 lines
2.8 KiB
JavaScript
Executable File
#!/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);
|
|
}
|