Browse Source

Allow wgpw to prompt for a password through stdin

If the user does not pass the password as a parameter, they are prompted
for it through stdin.
The password is not echoed back, just like any other command-line log-in
prompt (ie. sudo).
pull/1348/head
Hans Geel 8 months ago
parent
commit
6919402b7d
  1. 6
      How_to_generate_an_bcrypt_hash.md
  2. 33
      src/wgpw.mjs

6
How_to_generate_an_bcrypt_hash.md

@ -15,6 +15,12 @@ To generate a bcrypt password hash using docker, run the following command :
docker run ghcr.io/wg-easy/wg-easy wgpw YOUR_PASSWORD docker run ghcr.io/wg-easy/wg-easy wgpw YOUR_PASSWORD
PASSWORD_HASH='$2b$12$coPqCsPtcFO.Ab99xylBNOW4.Iu7OOA2/ZIboHN6/oyxca3MWo7fW' // literally YOUR_PASSWORD PASSWORD_HASH='$2b$12$coPqCsPtcFO.Ab99xylBNOW4.Iu7OOA2/ZIboHN6/oyxca3MWo7fW' // literally YOUR_PASSWORD
``` ```
If a password is not provided, the tool will prompt you for one :
```sh
docker run ghcr.io/wg-easy/wg-easy wgpw
Enter your password: // hidden prompt, type in your password
PASSWORD_HASH='$2b$12$coPqCsPtcFO.Ab99xylBNOW4.Iu7OOA2/ZIboHN6/oyxca3MWo7fW'
```
**Important** : make sure to enclose your password in **single quotes** when you run `docker run` command : **Important** : make sure to enclose your password in **single quotes** when you run `docker run` command :

33
src/wgpw.mjs

@ -2,6 +2,8 @@
// Import needed libraries // Import needed libraries
import bcrypt from 'bcryptjs'; import bcrypt from 'bcryptjs';
import { Writable } from 'stream'
import readline from 'readline'
// Function to generate hash // Function to generate hash
const generateHash = async (password) => { const generateHash = async (password) => {
@ -31,12 +33,38 @@ const comparePassword = async (password, hash) => {
} }
}; };
const readStdinPassword = () => {
return new Promise((resolve) => {
process.stdout.write("Enter your password: ");
const rl = readline.createInterface({
input: process.stdin,
output: new Writable({
write(_chunk, _encoding, callback) {
callback()
}
}),
terminal: true,
});
rl.question('', answer => {
rl.close();
// Print a new line after password prompt
process.stdout.write('\n');
resolve(answer);
})
})
}
(async () => { (async () => {
try { try {
// Retrieve command line arguments // Retrieve command line arguments
const args = process.argv.slice(2); // Ignore the first two arguments const args = process.argv.slice(2); // Ignore the first two arguments
if (args.length > 2) { if (args.length > 2) {
throw new Error('Usage : wgpw YOUR_PASSWORD [HASH]'); throw new Error('Usage : wgpw [YOUR_PASSWORD] [HASH]');
} }
const [password, hash] = args; const [password, hash] = args;
@ -44,6 +72,9 @@ const comparePassword = async (password, hash) => {
await comparePassword(password, hash); await comparePassword(password, hash);
} else if (password) { } else if (password) {
await generateHash(password); await generateHash(password);
} else {
const password = await readStdinPassword();
await generateHash(password)
} }
} catch (error) { } catch (error) {
// eslint-disable-next-line no-console // eslint-disable-next-line no-console

Loading…
Cancel
Save