|
- #!/usr/bin/env node
- 'use strict';
- const clipboardy = require('clipboardy');
- const meow = require('meow');
- const LessPass = require('lesspass');
- const read = require('read');
- const chalk = require('chalk');
-
- const helpMessage = `
- Usage
- $ lesspass <site> <login> [masterPassword] [options]
-
- Options
- -l add lowercase in password
- -u add uppercase in password
- -d add digits in password
- -s add symbols in password
-
- --no-lowercase remove lowercase from password
- --no-uppercase remove uppercase from password
- --no-digits remove digits from password
- --no-symbols remove symbols from password
-
- --length, -L int (default 16)
- --counter, -c int (default 1)
-
- --clipboard, -C copy generated password to clipboard rather than displaying it.
- Need pbcopy (OSX), xsel (Linux) or clip (Windows).
-
- Examples
- # no symbols
- $ lesspass lesspass.com contact@lesspass.com password --no-symbols
- OlfK63bmUhqrGODR
-
- # no symbols shortcut
- $ lesspass lesspass.com contact@lesspass.com password -lud
- OlfK63bmUhqrGODR
-
- # only digits and length of 8
- $ lesspass lesspass.com contact@lesspass.com -d -L8
- master password:
- 75837019`;
-
- const cli = meow(helpMessage, {
- alias: {L: 'length', c: 'counter', C: 'clipboard'},
- boolean: ['l', 'u', 'd', 's', 'C', 'clipboard']
- });
-
-
- function calcPassword(site, login, masterPassword, passwordProfile) {
- LessPass.generatePassword(site, login, masterPassword, passwordProfile)
- .then(function(generatedPassword) {
- if (passwordProfile.clipboard) {
- clipboardy.write(generatedPassword)
- .then(() => {
- console.log('Copied to clipboard');
- process.exit();
- }).catch(err => {
- console.error(chalk.red('Copy failed.'));
- console.error(err.message);
- process.exit(1);
- });
- } else {
- console.log(generatedPassword);
- process.exit();
- }
- });
- }
-
-
- function hasNoShortOption(options) {
- return !(['l', 'u', 'd', 's'].some(function(shortOption) {
- return typeof options[shortOption] !== 'undefined' && options[shortOption];
- }));
- }
-
- function getOptionBoolean(options, optionString) {
- let shortOption = optionString.substring(0, 1);
- if (options[shortOption]) {
- return true;
- }
- if (typeof options[optionString] === 'undefined') {
- return hasNoShortOption(options);
- }
- return options[optionString]
- }
-
- const lowercase = getOptionBoolean(cli.flags, 'lowercase');
- const uppercase = getOptionBoolean(cli.flags, 'uppercase');
- const symbols = getOptionBoolean(cli.flags, 'symbols');
- const digits = getOptionBoolean(cli.flags, 'digits');
-
- const passwordProfile = {
- lowercase: lowercase,
- uppercase: uppercase,
- symbols: symbols,
- numbers: digits,
- clipboard: cli.flags.clipboard || false,
- length: cli.flags.length || 16,
- counter: cli.flags.counter || 1
- };
-
- const site = cli.input[0];
- let login = cli.input[1];
-
- if (typeof login === 'undefined') {
- login = ''
- }
-
- if (typeof site === 'undefined') {
- console.log(chalk.red('site cannot be empty'));
- console.log('type lesspass --help');
- process.exit(-1);
- }
-
-
- if (cli.input.length === 3) {
- const masterPassword = cli.input[2];
- calcPassword(site, login, masterPassword, passwordProfile)
- } else {
- read({prompt: 'master password: ', silent: true}, function(er, password) {
- if (er && er.message === 'canceled') {
- process.exit();
- }
- calcPassword(site, login, password, passwordProfile)
- });
- }
|