diff options
author | Dennis Eriksen <d@ennis.no> | 2023-11-10 09:54:17 +0100 |
---|---|---|
committer | Dennis Eriksen <d@ennis.no> | 2023-11-10 09:54:17 +0100 |
commit | cf84fad0955ff07dd6fe3ec30a17dc134e23c356 (patch) | |
tree | 6f85e6017e7a5feacd88270cb942e4e2e007ffcb /rust | |
parent | Adding a python-verion (diff) | |
download | makepass-cf84fad0955ff07dd6fe3ec30a17dc134e23c356.tar.gz |
trying out new project structure
Diffstat (limited to 'rust')
-rw-r--r-- | rust/Cargo.lock | 363 | ||||
-rw-r--r-- | rust/Cargo.toml | 14 | ||||
-rw-r--r-- | rust/src/main.rs | 393 |
3 files changed, 0 insertions, 770 deletions
diff --git a/rust/Cargo.lock b/rust/Cargo.lock deleted file mode 100644 index 50747ce..0000000 --- a/rust/Cargo.lock +++ /dev/null @@ -1,363 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "anstream" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is-terminal", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15c4c2c83f81532e5845a733998b6971faca23490340a418e9b72a3ec9de12ea" - -[[package]] -name = "anstyle-parse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" -dependencies = [ - "windows-sys", -] - -[[package]] -name = "anstyle-wincon" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c677ab05e09154296dd37acecd46420c17b9713e8366facafa8fc0885167cf4c" -dependencies = [ - "anstyle", - "windows-sys", -] - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" - -[[package]] -name = "cc" -version = "1.0.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "libc", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "clap" -version = "4.3.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb690e81c7840c0d7aade59f242ea3b41b9bc27bcd5997890e7702ae4b32e487" -dependencies = [ - "clap_builder", -] - -[[package]] -name = "clap_builder" -version = "4.3.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ed2e96bc16d8d740f6f48d663eddf4b8a0983e79210fd55479b7bcd0a69860e" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "once_cell", - "strsim", -] - -[[package]] -name = "clap_lex" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" - -[[package]] -name = "colorchoice" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" - -[[package]] -name = "errno" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136526188508e25c6fef639d7927dfb3e0e3084488bf202267829cf7fc23dbdd" -dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys", -] - -[[package]] -name = "errno-dragonfly" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "getrandom" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "hermit-abi" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" - -[[package]] -name = "io-lifetimes" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" -dependencies = [ - "hermit-abi", - "libc", - "windows-sys", -] - -[[package]] -name = "is-terminal" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" -dependencies = [ - "hermit-abi", - "rustix 0.38.13", - "windows-sys", -] - -[[package]] -name = "libc" -version = "0.2.147" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" - -[[package]] -name = "linux-raw-sys" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" - -[[package]] -name = "linux-raw-sys" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a9bad9f94746442c783ca431b22403b519cd7fbeed0533fdd6328b2f2212128" - -[[package]] -name = "makepass" -version = "0.1.0" -dependencies = [ - "clap", - "rand", - "terminal_size", -] - -[[package]] -name = "once_cell" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rustix" -version = "0.37.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06" -dependencies = [ - "bitflags 1.3.2", - "errno", - "io-lifetimes", - "libc", - "linux-raw-sys 0.3.8", - "windows-sys", -] - -[[package]] -name = "rustix" -version = "0.38.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7db8590df6dfcd144d22afd1b83b36c21a18d7cbc1dc4bb5295a8712e9eb662" -dependencies = [ - "bitflags 2.4.0", - "errno", - "libc", - "linux-raw-sys 0.4.7", - "windows-sys", -] - -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "terminal_size" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e6bf6f19e9f8ed8d4048dc22981458ebcf406d67e94cd422e5ecd73d63b3237" -dependencies = [ - "rustix 0.37.23", - "windows-sys", -] - -[[package]] -name = "utf8parse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" diff --git a/rust/Cargo.toml b/rust/Cargo.toml deleted file mode 100644 index 181b7a7..0000000 --- a/rust/Cargo.toml +++ /dev/null @@ -1,14 +0,0 @@ -[package] -name = "makepass" -authors = ["Dennis Eriksen <d@ennis.no>"] -version = "0.1.0" -edition = "2021" -rust-version = "1.68" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] - -rand = "0.8.4" -clap = { version = "4.3.24", features = ["cargo"] } -terminal_size = "0.2.6" diff --git a/rust/src/main.rs b/rust/src/main.rs deleted file mode 100644 index 083a99f..0000000 --- a/rust/src/main.rs +++ /dev/null @@ -1,393 +0,0 @@ -// -// Author : Dennis Eriksen <d@ennis.no> -// File : main.rs -// Bin : makepass.rs -// Created : 2023-09-05 -// Licence : BSD-3-Clause -// -// Copyright (c) 2018-2023 Dennis Eriksen <d@ennis.no> - -// -// Imports -// -use clap::{Arg, ArgAction, Command, crate_authors, value_parser}; -use rand::{seq::SliceRandom, Rng}; -use std::env; -use std::fs; -use std::io; -use std::io::prelude::*; -use std::process::exit; -use terminal_size::{terminal_size, Width}; - -// -// Constants -// -const MAX: u8 = 255; -const RANGE_MAX: u8 = 42; -const RANGE_MIN: u8 = 8; -const PASS_WORDS: u8 = 8; - -// Character sets -const LOWER: &str = "abcdefghijklmnopqrstuvwxyz"; -const UPPER: &str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; -const DIGIT: &str = "0123456789"; -const OTHER: &str = "!$%&#/()=?+-_,.;:<>[]{}|@*"; -const EXTRA: &str = "-_"; - -// Defaults -const DEFAULT_LENGTH: u8 = 0; -const DEFAULT_NUMBER: u8 = 10; -const DEFAULT_WORDLIST: &str = "/usr/share/dict/words"; - -// Structure used to pass common data to the print-function -struct CommonPrintData<'a> { - length: u8, - alpha: &'a [char], - alnum: &'a [char], - printbool: bool, - printlen: u8, - col_width: u8, - col_num: u16, -} - -// -// Main function. This is where the magic happens -// -fn main() { - // Construct arrays of the character sets - let lower = LOWER.chars().collect::<Vec<_>>(); - let upper = UPPER.chars().collect::<Vec<_>>(); - let digit = DIGIT.chars().collect::<Vec<_>>(); - let other = OTHER.chars().collect::<Vec<_>>(); - let extra = EXTRA.chars().collect::<Vec<_>>(); - let alpha = [&lower[..], &upper[..]].concat(); - let alnum = [&alpha[..], &digit[..]].concat(); - let every = [&alnum[..], &other[..]].concat(); - - // These are the sets we actually use - let mut normal = [&alnum[..], &extra[..]].concat(); - let mut special = every; - - // Set the defaults - let mut length = DEFAULT_LENGTH; - let mut number = DEFAULT_NUMBER; - let mut wordlist = DEFAULT_WORDLIST.to_string(); - - // - // env - // Deal with env before cli-args, because cli-args take precedence. - // - let env = ( - env::var("MAKEPASS_LENGTH").unwrap_or_default(), - env::var("MAKEPASS_NUMBER").unwrap_or_default(), - env::var("MAKEPASS_WORDLIST").unwrap_or_default(), - env::var("MAKEPASS_NORMAL").unwrap_or_default(), - env::var("MAKEPASS_SPECIAL").unwrap_or_default(), - ); - - // length - if !env.0.is_empty() { - length = env.0.parse().unwrap_or_else(|_| { - // length is a <u8>, which is 0-255, so no need for further error-checking - eprintln!( - "Error: MAKEPASS_LENGTH is not a valid number. Valid numbers are between 0 and 255" - ); - exit(1); - }); - } - // number - if !env.1.is_empty() { - // number is a <u8>, but takes a minimum value of 1 - match env.1.parse::<u8>() { - Ok(n) if n >= 1 => number = n, - _ => { - eprintln!("Error: MAKEPASS_NUMBER is not a valid number. Valid numbers are between 1 and 255"); - exit(1); - } - } - } - if !env.2.is_empty() { // wordlist - wordlist = env.2; - } - if !env.3.is_empty() { // Overwrite normal character array if MAKEPASS_NORMAL is present - normal = env.3.chars().collect::<Vec<_>>(); - } - if !env.4.is_empty() { // Overwrite special character array if MAKEPASS_SPECIAL is present - special = env.4.chars().collect::<Vec<_>>(); - } - - // - // Args - // - let opts = cli().get_matches(); - - // Set to new value if exists, or just set to old value - length = *opts.get_one::<u8>("length_flag").unwrap_or(&length); - number = *opts.get_one::<u8>("number").unwrap_or(&number); - length = *opts.get_one::<u8>("length_arg").unwrap_or(&length); - let printbool = opts.get_flag("printlen"); - - // - // Other logic - // - let printlen: u8 = if printbool && length < 100 { - 2 - } else if printbool { - 3 - } else { - 0 - }; - - // Get the width of the terminal - let size = terminal_size(); - let term_width: u16 = match size { - Some((Width(w), _)) => w, - None => 1, - }; - - // Calculate how wide each column has to be - let col_width: u8 = match length { - 0 => RANGE_MAX + 2, - _ => length + 2, - }; - - // Number of columns to print - // If printbool is true, col_num is term_width / (col_width + printlen + 1) - // Else, col_num is term_width / col_width - // col_num is never 0. Use std::cmp::max to use the largest value of 1 and the above. - let col_num: u16 = std::cmp::max( - 1, - match printbool { - true => term_width / (col_width + printlen + 1) as u16, - false => term_width / col_width as u16, - }, - ); - - // Fill in common print data - let data = CommonPrintData { - length: length, - alpha: &alpha, - alnum: &alnum, - printbool: printbool, - printlen: printlen, - col_width: col_width, - col_num: col_num, - }; - - // - // Do the dirty! - // - - // Normal passwords - print_columns("Normal passwords", number, &normal, &data); - - println!(""); - - // Special passwords - print_columns( - "Passwords with special characters", - number / 3 * 2 + 1, - &special, - &data, - ); - - // Passphrases - if fs::metadata(&wordlist).is_ok() { - // Open the file - let file = fs::File::open(&wordlist).unwrap(); - - // Create a buffered reader to handle file contents - let reader = io::BufReader::new(file); - - // Read words into a Vector - let words = reader.lines().map(|l| l.unwrap()).collect(); - - // Print - println!(""); - println!("Passphrases:"); - - for _ in 0..number / 2 { - println!("{}", passphrase(&words)); - } - } -} - -// -// Print passwords in neat columns -// -fn print_columns(title: &str, num: u8, chars: &Vec<char>, data: &CommonPrintData) { - let mut strings: Vec<String> = Vec::new(); - for _ in 0..num { - strings.push(randstring(data.length, chars, data.alpha, data.alnum)); - } - - println!("{}:", title); - - let mut i: u16 = 0; - for s in &strings { - i += 1; - - if data.printbool { - print!("{1:00$} ", data.printlen as usize, s.len()); - } - print!("{1:<0$}", data.col_width as usize, s); - if i % data.col_num == 0 || (i == num as u16 && i % data.col_num > 0) { - println!(); - } - } -} - -// -// Generate random strings to use as passwords -// -fn randstring(len: u8, chars: &[char], alpha: &[char], alnum: &[char]) -> String { - let mut rng = rand::thread_rng(); - let length = if len == 0 { - rng.gen_range(RANGE_MIN..=RANGE_MAX) - } else { - len - }; - - let mut s = String::with_capacity(length as usize); - for i in 0..length { - let c = if i == 0 { - alpha.choose(&mut rng) - } else if i == length - 1 { - alnum.choose(&mut rng) - } else { - chars.choose(&mut rng) - }; - s.push(*c.unwrap()); - } - s -} - -// -// Generate passphrases -// -fn passphrase(wordlist: &Vec<String>) -> String { - let mut rng = rand::thread_rng(); - let mut passphrase = Vec::new(); - - for _ in 0..PASS_WORDS { - let word = wordlist.choose(&mut rng).unwrap().clone(); - passphrase.push(word); - } - - passphrase.join("-") -} - -// -// Handle command line arguments -// -fn cli() -> Command { - Command::new("makepass") - .about("makepass - create random passwords") - .author(crate_authors!()) - .arg( - Arg::new("length_flag") - .short('l') - .value_name("LENGTH") - .help(format!("Length of passwords (0..={0}). 0 = random.", MAX)) - .value_parser(value_parser!(u8).range(0..)), - ) - .arg( - Arg::new("number") - .short('n') - .value_name("NUM") - .help(format!("Number of passwords (1..={0}). [default: 10]", MAX)) - .value_parser(value_parser!(u8).range(1..)) - .long_help("this is the long help. What is it?"), - ) - .arg( - Arg::new("printlen") - .short('p') - .help("Print length") - .action(ArgAction::SetTrue), - ) - .arg( - Arg::new("length_arg") - .value_name("LENGTH") - .help(format!( - "Length of passwords (0..={MAX}). 0 = random length." - )) - .value_parser(value_parser!(u8).range(0..)), - ) - .override_help("NAME - makepass - create several random passwords - -SYNOPSIS - makepass [OPTIONS] [NUM] - - If a NUM is provided, passwords will be NUM characters long. - - By default `makepass` will output passwords from the three following classes: - - - Normal passwords - random strings with letters (both lower and upper - case), numbers, and dashes and underscores. - - - Passwords with special characters - random strings generated from lower - and upper case letters, numbers, and the following characters: - !#$%&/()=?+-_,.;:<>[]{}|@* - - - Passphrases - if we find a dictionary, a series of eight random words - from the dictionary, separated by dashes. The number of words can not be - changed, but you do not have to use all of them. Use as mane as you want. - - The first character will always be alphabetic, and the last will always be - alphanumeric. - -DESCRIPTION - makepass has the following options: - - -h - output this help-text - -l - length of passwords. See MAKEPASS_LENGTH below - -n - number of passwords. See MAKEPASS_NUMBER below - -p - print length of number - -ENVIRONMENT - makepass examines the following environmental variables. - - MAKEPASS_LENGTH - Specifies the length of passwords. Valid values are 0-255. If 0, a - random value between 8 and 42 will be used for each password. -l - overrides this environmental variable, and the argument NUM overrides - that again. So `MAKEPASS_LENGTH=10 makepass -l 12 14` will give - passwords that are 14 characters long, even though both -l and - MAKEPASS_LENGTH also specifies a length. - - MAKEPASS_NUMBER - The number of passwords to generate. This formula is used to determine - how many passwords from each group should be generated: - - (n) normal passwords - - (n / 3 * 2 + 1) special passwords - - (n / 2) passphrases - Where n is 10 by default. Valid values for n are 1-255. Floating-poing - math is not used, so results may vary. - - MAKEPASS_PRINTLEN - If 1, print length of all passwords. If 0, don't. - - MAKEPASS_NORMAL - String of characters from which to generate \"normal\" passwords. - Defaults to: - abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_ - - MAKEPASS_SPECIAL - String of characters from which to generate passwords with special - characters. Defaults to the same characters as in MAKEPASS_NORMAL, plus - these: - !#$%&/()=?+-_,.;:<>[]{}|@* - - MAKEPASS_WORDLIST - Specifies the dictionary we find words for passphrases in. If this is - unset or empty, we try \"/usr/share/dict/words\". If that file does not - exist, no passphrases will be provided. - -AUTHOR - Dennis Eriksen <https://dnns.no>") -} |