authcli
Version:
A simple CLI app for managing your two-factor authentication tokens
97 lines (75 loc) • 2.3 kB
JavaScript
;
const authenticator = require("authenticator");
const ncp = require("copy-paste");
const qrcode = require("qrcode-terminal");
const fs = require("fs");
const os = require("os");
const path = require("path");
let config = path.join(os.homedir(), "/.local/share/auth/tokens");
let error = message => {
console.log(`Error: ${message}`);
process.exit(1);
};
fs.readFile(config, "utf8", (err, data) => {
if (err) error(`No token file found at ${config}`);
parseConfig(data);
});
let parseConfig = config => {
try {
var tokens = JSON.parse(config);
} catch (e) {
error(`Could not parse the file at ${config}`);
}
parseArgs(tokens);
};
let parseArgs = tokens => {
let args = process.argv.splice(2, process.argv.length);
let flags = args.filter(arg => arg.substr(0, 2) === "--").map(arg => arg.substr(2));
args = args.filter(arg => arg.substr(0, 2) !== "--");
let query = args.join(" ").toLowerCase();
if (args.length || flags.length) searchTokens(tokens, query, flags);
else printHelp(tokens);
};
let searchTokens = (tokens, query, flags) => {
let token = tokens.find(token => {
let name = token.name.toLowerCase() === query;
let alt = token.alt.find(alt => alt.toLowerCase() === query);
return name || alt;
});
if (!flags.indexOf("qr")) {
if (token) printqr(token);
else tokens.forEach(token => printqr(token));
}
else if (token) generateToken(token.secret);
else error(`Could not find a "${query}" token`);
};
let printqr = token => {
function encodeURL(token) {
const name = token.name.split(" ").join("%20");
const secret = token.secret.split(" ").join("").toUpperCase();
return `otpauth://totp/${name}?secret=${secret}`;
}
const url = encodeURL(token);
qrcode.generate(url);
console.log(`
Generated QR Code for importing into Google Authenticator
Name: ${token.name}
Secret: ${token.secret}
`);
};
let generateToken = secret => {
let output = authenticator.generateToken(secret);
console.log(output);
ncp.copy(output);
};
let printHelp = tokens => {
console.log(`Usage: auth <name|alt> [--qr]
Generate your two factor authentication codes
(Available tokens are shown below)
`);
tokens.forEach(token => {
console.log(` ${token.name} (${token.alt.join(", ")})`);
});
console.log();
};