diff --git a/Tools/password_bar.5m.php b/Tools/password_bar.5m.php
index fdd754c4f..d2c6dfecb 100755
--- a/Tools/password_bar.5m.php
+++ b/Tools/password_bar.5m.php
@@ -2,21 +2,30 @@
Password Generator
-# v0.1
+# v1.0
# Adi
# gomedia-adi
# Generates human-friendly strong passwords.
# http://www.greatoceanmedia.com.au/images/63.png
# php
-# http://www.greatoceanmedia.com.au/bitbar
+# http://www.greatoceanmedia.com.au/bitbar/password-bar
/*
BitBar plugin help: https:github.com/matryer/bitbar
- Plugin updated 23/3/20
+ Plugin updated 22/6/20
Version history
- 1.0 - initial release
+ 1.0 - also now generates a single obscure password (i.e. one that doesn't contain words)
+ - length of obscure password user definable
+ - changed format element "p" to "s" (coz they're symbols more than punctuation)
+ - option to select subset of symbols
+ - Dark Mode compatible menubar icon
+ 0.1 - initial release
+
+ Credits
+ - plugin inspired by a Mac app called Arcana by Tekuris
+ - thanks to Christian S for v1.0 improvement suggestions
*/
/* TODO
@@ -24,32 +33,43 @@
*/
define('CONFIG_FILE', "/var/tmp/bitbar.password_bar.config.php");
-define('DEFAULT_FORMAT', "3,n,5,p,4");
-define('PWD_PUNC', "!\"#$%&'()*+,-./:;<=>?@[\]^_`{|}~");
+define('DEFAULT_FORMAT', "3,n,5,s,4");
+define('FULL_SYM', "!\"#$%&'()*+,-./:;<=>?@[\]^_`{|}~");
+define('PARTIAL_SYM', "!#$%&*+,-.:;=?@^_|~"); // without the quotes, brackets, slashes
+define('LIMITED_SYM', "!#$%*+-=@^_"); // the supposed eBay subset
+define('ALPHA_NUM', "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
+define('DEFAULT_LENGTH', 14);
-function update_config($format) {
+function update_config($format, $symbols, $length) {
// rewrite config file with given values
+
file_put_contents(CONFIG_FILE, "\n", FILE_APPEND);
}
-function generate_pwd($format) {
+function generate_pwd($format, $symbols) {
// generate password using format
global $words1, $words2, $words3, $words4, $words5, $words6, $words7, $words8, $words9; // make word lists available between function calls
$password = '';
+
+ $symbol = FULL_SYM;
+ if ($symbols == 'partial') $symbol = PARTIAL_SYM;
+ if ($symbols == 'limited') $symbol = LIMITED_SYM;
+
$parts = explode(',', $format);
foreach ($parts as $part) {
// random single digit
if ($part == 'n')
$password .= rand(1,9);
- // random punctuation character (from predefined list)
- if ($part == 'p') {
- $punc = PWD_PUNC;
- $random_punc = $punc[rand(0, strlen($punc)-1)];
- $password .= $random_punc;
+ // random symbol character (from predefined list)
+ if (($part == 'p') || ($part == 's')) {
+ $random_symbol = $symbol[rand(0, strlen($symbol)-1)];
+ $password .= $random_symbol;
}
// random word of n letters
if (strpos('123456789', $part) !== FALSE) {
@@ -65,9 +85,31 @@ function generate_pwd($format) {
$password .= ucfirst($words[$rand_key]); // get random Word
}
}
+
return $password;
}
+function generate_obscure_pwd($length, $symbols) {
+// generate an obscure password
+
+ $password = array();
+
+ $string = ALPHA_NUM.FULL_SYM;
+ if ($symbols == 'partial') $string = ALPHA_NUM.PARTIAL_SYM;
+ if ($symbols == 'limited') $string = ALPHA_NUM.LIMITED_SYM;
+
+ $chars = str_split($string); // convert string to array
+ shuffle($chars); // randomise chars
+ $rand_keys = array_rand($chars, $length); // randomly pick array keys
+ foreach ($rand_keys as $key) // create password from alpha/num/symbols array using random keys
+ $password[] = $chars[$key];
+ // rotate password chars until begins with alpha
+ while (!ctype_alpha($password[0]))
+ array_push($password, array_shift($password));
+
+ return implode('', $password); // return string
+}
+
//-------------------------------------------------------------------------------------------------
//??? CONFIG FILE
@@ -79,42 +121,67 @@ function generate_pwd($format) {
// read config file
include(CONFIG_FILE);
-// provide default
-if (!isset($format) || !$format) $format = DEFAULT_FORMAT;
+// provide defaults
+if (!isset($format) || $format == '') $format = DEFAULT_FORMAT;
+if (!isset($symbols) || $symbols == '' || !in_array($symbols, array('full', 'partial', 'limited'))) $symbols = 'partial';
+if (!isset($length) || !$length) $length = '14';
//??? MENU ACTIONS
// menu option selected
if (isset($argv[1])) {
- // prompt for password format
+ // prompt for readable password format & save
if ($argv[1] == "set_format") {
- $cmd = "osascript -e 'set theString to text returned of (display dialog \"Password format \" default answer \"".$format."\" buttons {\"Cancel\", \"Save\"} default button 2)'";
+ $cmd = "osascript -e 'set theString to text returned of (display dialog \"Readable Password Format \" default answer \"".$format."\" buttons {\"Cancel\", \"Save\"} default button 2)'";
exec($cmd, $out, $err);
- $new_format = implode('', $out); // text entered by user
if (!$err) { // something entered
- $format = ($new_format ? $new_format : DEFAULT_FORMAT); // reset to default if blank format entered
- update_config($format);
+ $str = implode('', $out); // text entered by user
+ $format = ($str ? $str : DEFAULT_FORMAT); // reset to default if blank or zero
+ update_config($format, $symbols, $length);
}
}
+ // prompt for obscure password length & save
+ if ($argv[1] == "set_length") {
+ $cmd = "osascript -e 'set theString to text returned of (display dialog \"Obscure Password Length \" default answer \"".$length."\" buttons {\"Cancel\", \"Save\"} default button 2)'";
+ exec($cmd, $out, $err);
+ if (!$err) { // something entered
+ $str = implode('', $out); // text entered by user
+ $length = (int)$str; // convert str to int (will become zero if not int)
+ $length = ($length ? $length : DEFAULT_LENGTH); // reset to default if blank or zero
+ update_config($format, $symbols, $length);
+ }
+ }
+ // save symbol subset
+ if ($argv[1] == "set_symbols")
+ update_config($format, $argv[2], $length);
// copy password to clipboard
if ($argv[1] == "copy_pwd") {
$cmd = "echo '".$argv[2]."' | base64 --decode | pbcopy"; // decode & copy to clipboard
exec($cmd, $out, $err);
- exit;
}
// help dialog - some special chars used below to avoid CLI interpretation: backslash=⧵ (U+29F5); apostrophe='(U+FF07), double quote=″ (U+2033)
if ($argv[1] == "help") {
- $cmd = "osascript -e 'display dialog \"Password format is a comma-separated set of components:
-
+ $cmd = "osascript -e 'display dialog \"Readable Passwords Format
1-9 - random word with the specified number of letters
(e.g. 3 becomes a three letter Capitalised word)
n - random single digit number
- p - random punctuation character
- (taken from !″#$%&'()*+,-./:;<=>?@[⧵]^_`{|}~)
+ s - random symbol character (see below)
+
+ Default format: 3,n,5,s,4
+ - generates a password containing a 3 letter word,
+ a digit, a 5 letter word, a symbol character,
+ and finally a 4 letter word (e.g. Tig5Pesky?Muff)
-Default format: 3,n,5,p,4
-- this generates a password containing a 3 letter word, a digit, a 5 letter word, a punctuation character, and a 4 letter word
-(e.g. Tig5Pesky?Muff)\" buttons {\"OK\"} default button 1'";
+Obscure Password
+ This is a completely randomised string of letters,
+ digits and symbols. Set the length from the menu
+ (default = 14).
+
+Symbol Sets
+ Full: !″#$%&'()*+,-./:;<=>?@[⧵]^_`{|}~
+ Partial: !#$%&*+,-.:;=?@^_|~
+ Limited: !#$%*+-=@^_
+\" buttons {\"OK\"} default button 1'";
exec($cmd, $out, $err);
exit;
}
@@ -122,22 +189,28 @@ function generate_pwd($format) {
//??? MENUBAR
-// display icon - 32x32 png, 144 DPI, base64 encoded using "openssl base64 -A -in icon.png" (recommended 36px dimension too big) & prepend "|image="
-echo
-"|image=iVBORw0KGgoAAAANSUhEUgAAAB4AAAAgCAYAAAAFQMh/AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAB3RJTUUH4wUBBy0oPIjPCQAAAcRJREFUSMe9l79LXEEQx7+fd4WSw1JTKgbLgEECuRM1MRwYwc7eIqL5C/IPxB9NGkEUSZHOWkhxfWJIHUhhIcTCKiIGgnDccW9t3oXj2PXdzb5kYHmwOzufnf0xM0+KEKDzfQi8AerAJXADnAEfgWUVKV3QTcDltDYw1T0vFlrvA9rd1qK8TZJEwPGA0E6bB4TR4wlJP43rvnLOjZWM4K+SRj1Dt5LeSzqQ9EDSpKSkR6cMfLNAxwJbeOHRfRzQPbeAZzyGUmAyoL/rgyeGnS57+tqSrn2XUNKJ94IawC2fY5KGMtBfSdNUksaLChyPAuf2LvDW/3h0m1Z46I0eAiOZzjTwPaC3YwVvG4NHx1tT/HgaAXXAkQX6MhJat0BrWZaxQveBZNDsVLnHYAvYyvKvb+wz8MKSEp/lePK82yDwBFgEot5vLQdavW9yqWTKQVrKOdOK/oHM5pQxC/8b6oCFqLopkCReAad5N9w5V6iny1le7edNvi0KOmcICK9joZWIaFQ1nzHwIWLRTfNMoGH0djW2ougtzBvApxzoehGlzBDwIytRfgPTWf+XAHSj6J+wYSDp6TspdHsHXNAe8AtYKdLuHajxM/2P7HLwAAAAAElFTkSuQmCC\n";
+// display icon: 36x36 png (32x32max image + 2px transparent border), 144 dpi, colour mode grey, encoded using "base64 icon.png" ... prepend "|templateImage=" & append "\n"
+echo "|templateImage=iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAQAAABLCVATAAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAAFiUAABYlAUlSJPAAAAAHdElNRQfkBhUWCih+dz6LAAABaUlEQVRIx9XWv0oDQRAG8PnSRBBbLRXFUoiI4EX8TyQG7CzsLBT1CXwBjdaCIGJhZx0QuV7zAoJCihQWVgFRiEW4eFmL6GWyenuzi01um+Tj9pfN7jB3RD17YQj78PGCN1RwhYIrsweljRDj9oz/i2mPLTvmOoZRUJiXMyMGRqEmh57YtA8UsYlbfLJsVcYMsinPUTrB0qoMmoomtDDK8pMO1U5SCVJ/9CmkV5aX9BuToGZnEZRm+bBtBY2x3ThkeT1KAynFD/scA0TI4IFlx1KoaKyjgCBzpo2MwoWMWUlgfBmTQ2hkzpCSMF7XpCaOUGHf7rAkW82M9uuL31s/iWVY1FBOY7Ju7TCv7Y3nxsxqDXXhPxglZ7oPcA1l/excVlNA649qObBl5mILb9uG8Yw1nBXvES6NdwXyBtYwrGfD5SHYwI3G7Ni11DQeUcc7MkS4Z8yuy4tC309bQMnhT8Wgp6hhnXr6+gJZx0AEmEK/dgAAAABJRU5ErkJggg==\n";
//??? TOP-LEVEL MENU
-// generate a number of passwords
+// display readable human-friendly passwords
echo "---\n";
echo "Click to Copy:\n";
foreach (range(1, 10) as $i) {
- $pwd = generate_pwd($format); // generate password
+ $pwd = generate_pwd($format, $symbols); // generate password
$pwd_nobar = str_replace('|', '|', $pwd); // "|" interpreted by bitbar, so substitute with a vertical line (U+FF5C)
$pwd_enc = base64_encode($pwd); // encode password to hide unix special characters from CLI
echo $pwd_nobar." | terminal=false bash=\"".$argv[0]."\" param1=copy_pwd param2=".$pwd_enc." refresh=false terminal=false"."\n";
}
+// display an obscure password
+echo "…\n";
+$pwd = generate_obscure_pwd($length, $symbols);
+$pwd_nobar = str_replace('|', '|', $pwd); // "|" interpreted by bitbar, so substitute with a vertical line (U+FF5C)
+$pwd_enc = base64_encode($pwd); // encode password to hide unix special characters from CLI
+echo $pwd_nobar." | terminal=false bash=\"".$argv[0]."\" param1=copy_pwd param2=".$pwd_enc." refresh=false terminal=false"."\n";
+
// regenerate passwords (i.e. refresh)
echo "---\n";
echo
@@ -146,19 +219,37 @@ function generate_pwd($format) {
."\n"
;
-// display current format
+// display current settings
echo "---\n";
+echo "Readable Format: $format\n";
+echo "Obscure Length: $length\n";
+echo "---\n";
+
+// set readable password format
echo
- "Format: $format\n"
+ 'Set Readable Format…'
+ ." | bash=\"".$argv[0]."\" param1=set_format refresh=true terminal=false"
+ ."\n"
;
-// set new password format
+// set obscure password length
echo
- 'Set Format...'
- ." | bash=\"".$argv[0]."\" param1=set_format refresh=true terminal=false"
+ 'Set Obscure Length…'
+ ." | bash=\"".$argv[0]."\" param1=set_length refresh=true terminal=false"
."\n"
;
+// symbols subset options
+echo "Symbol Sets\n";
+foreach (array('full', 'partial', 'limited') as $this_symbol_set)
+ echo
+ '--'
+ .ucfirst($this_symbol_set)
+ .($this_symbol_set == $symbols ? ' ✓' : '')
+ ." | terminal=false bash=\"".$argv[0]."\" param1=set_symbols param2=\"$this_symbol_set\" refresh=true"
+ ."\n"
+ ;
+
// display help dialog
echo
'Help'