163 lines
2.8 KiB
JavaScript
Executable File
163 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");
|
|
|
|
const DB_PATH = path.resolve(__dirname, "../data/data.db");
|
|
|
|
function callDb(fn) {
|
|
const db = new Database(DB_PATH, { fileMustExist: true });
|
|
try {
|
|
fn(db);
|
|
} finally {
|
|
db.close();
|
|
}
|
|
}
|
|
|
|
function gen(bytes) {
|
|
return crypto.randomBytes(bytes).toString("hex");
|
|
}
|
|
|
|
/**
|
|
* adduser <user_name> <source>
|
|
*/
|
|
function addUser(args) {
|
|
const [userName, source] = args;
|
|
|
|
if (!userName || !source) {
|
|
console.error("usage: adduser <user_name> <source>");
|
|
process.exit(1);
|
|
}
|
|
|
|
callDb((db) => {
|
|
const res = db
|
|
.prepare(
|
|
`
|
|
INSERT INTO users (
|
|
user_name,
|
|
user_source,
|
|
user_status,
|
|
user_created_at
|
|
)
|
|
VALUES (?, ?, 1, ?)
|
|
`,
|
|
)
|
|
.run(userName, source, Date.now());
|
|
|
|
console.log("user_id:", res.lastInsertRowid);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* genkey <user_name>
|
|
*/
|
|
function genKey(args) {
|
|
const [userName] = args;
|
|
|
|
callDb((db) => {
|
|
const user = db
|
|
.prepare(`SELECT user_id FROM users WHERE user_name = ?`)
|
|
.get(userName);
|
|
|
|
if (!user) {
|
|
console.error("user not found");
|
|
process.exit(1);
|
|
}
|
|
|
|
const apiKey = gen(24); // 48 hex chars
|
|
const apiSecret = gen(48); // 96 hex chars
|
|
|
|
db.prepare(
|
|
`
|
|
UPDATE users
|
|
SET user_api_key = ?, user_api_secret = ?
|
|
WHERE user_id = ?
|
|
`,
|
|
).run(apiKey, apiSecret, user.user_id);
|
|
|
|
console.log("api_key:", apiKey);
|
|
console.log("api_secret:", apiSecret);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* disable <user_name>
|
|
*/
|
|
function disableUser(args) {
|
|
const [userName] = args;
|
|
|
|
callDb((db) => {
|
|
db.prepare(
|
|
`
|
|
UPDATE users SET user_status = 0
|
|
WHERE user_name = ?
|
|
`,
|
|
).run(userName);
|
|
|
|
console.log("user disabled:", userName);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* list <user_name>
|
|
*/
|
|
function listUser(args) {
|
|
const [userName] = args;
|
|
|
|
callDb((db) => {
|
|
const user = db
|
|
.prepare(
|
|
`
|
|
SELECT
|
|
user_id,
|
|
user_name,
|
|
user_source,
|
|
user_status,
|
|
user_api_key,
|
|
user_created_at
|
|
FROM users
|
|
WHERE user_name = ?
|
|
`,
|
|
)
|
|
.get(userName);
|
|
|
|
if (!user) {
|
|
console.log("user not found");
|
|
return;
|
|
}
|
|
|
|
console.log(user);
|
|
});
|
|
}
|
|
|
|
/* ======================== */
|
|
|
|
const argv = process.argv.slice(2);
|
|
const cmd = argv[0];
|
|
const args = argv.slice(1);
|
|
|
|
switch (cmd) {
|
|
case "adduser":
|
|
addUser(args);
|
|
break;
|
|
|
|
case "genkey":
|
|
genKey(args);
|
|
break;
|
|
|
|
case "disable":
|
|
disableUser(args);
|
|
break;
|
|
|
|
case "list":
|
|
listUser(args);
|
|
break;
|
|
|
|
default:
|
|
console.error("Unknown command");
|
|
console.error("Commands: adduser | genkey | disable | list");
|
|
process.exit(1);
|
|
}
|