|  | @@ -48,6 +48,7 @@ REMOVE_USERNAME=
 | 
	
		
			
			| 48 | 48 |  CURR_APP=
 | 
	
		
			
			| 49 | 49 |  REMOVE_APP=
 | 
	
		
			
			| 50 | 50 |  CURR_PASSWORD=""
 | 
	
		
			
			|  | 51 | +TESTS=
 | 
	
		
			
			| 51 | 52 |  
 | 
	
		
			
			| 52 | 53 |  function get_backup_key_id {
 | 
	
		
			
			| 53 | 54 |      MY_BACKUP_KEY_ID=$(gpg --list-keys "(backup key)" | \
 | 
	
	
		
			
			|  | @@ -90,7 +91,35 @@ function pass_show_help {
 | 
	
		
			
			| 90 | 91 |  }
 | 
	
		
			
			| 91 | 92 |  
 | 
	
		
			
			| 92 | 93 |  function pad_string {
 | 
	
		
			
			| 93 |  | -    echo -n -e "$1" | sed -e :a -e 's/^.\{1,128\}$/& /;ta'
 | 
	
		
			
			|  | 94 | +    pass_string="$1"
 | 
	
		
			
			|  | 95 | +    str_length=${#pass_string}
 | 
	
		
			
			|  | 96 | +    total_padding=$((128 - str_length))
 | 
	
		
			
			|  | 97 | +    leading_padding=$((1 + RANDOM % $total_padding))
 | 
	
		
			
			|  | 98 | +    trailing_padding=$((total_padding - leading_padding))
 | 
	
		
			
			|  | 99 | +    leading=printf "%-${leading_padding}s"
 | 
	
		
			
			|  | 100 | +    trailing=printf "%-${trailing_padding}s"
 | 
	
		
			
			|  | 101 | +    echo "${leading}${pass_string}${trailing}"
 | 
	
		
			
			|  | 102 | +}
 | 
	
		
			
			|  | 103 | +
 | 
	
		
			
			|  | 104 | +function remove_padding {
 | 
	
		
			
			|  | 105 | +    padded_string="$1"
 | 
	
		
			
			|  | 106 | +    echo -e "${padded_string}" | tr -d '[:space:]'
 | 
	
		
			
			|  | 107 | +}
 | 
	
		
			
			|  | 108 | +
 | 
	
		
			
			|  | 109 | +function run_tests {
 | 
	
		
			
			|  | 110 | +    pass="SuperSecretPassword"
 | 
	
		
			
			|  | 111 | +    padded=$(pad_string "$pass")
 | 
	
		
			
			|  | 112 | +    echo "|${padded}|"
 | 
	
		
			
			|  | 113 | +    ${PROJECT_NAME}-pass -u root -a tests -p "$pass"
 | 
	
		
			
			|  | 114 | +    returned_pass=$(${PROJECT_NAME}-pass -u root -a tests)
 | 
	
		
			
			|  | 115 | +    if [[ "$pass" != "$returned_pass" ]]; then
 | 
	
		
			
			|  | 116 | +        echo "pass     :${pass}:"
 | 
	
		
			
			|  | 117 | +        echo "padded   :${padded}:"
 | 
	
		
			
			|  | 118 | +        echo "returned :${pass}:"
 | 
	
		
			
			|  | 119 | +        exit 73825
 | 
	
		
			
			|  | 120 | +    fi
 | 
	
		
			
			|  | 121 | +    ${PROJECT_NAME}-pass -u root --rmapp tests
 | 
	
		
			
			|  | 122 | +    echo "Tests passed"
 | 
	
		
			
			| 94 | 123 |  }
 | 
	
		
			
			| 95 | 124 |  
 | 
	
		
			
			| 96 | 125 |  while [[ $# > 1 ]]
 | 
	
	
		
			
			|  | @@ -101,6 +130,9 @@ do
 | 
	
		
			
			| 101 | 130 |          -h|--help)
 | 
	
		
			
			| 102 | 131 |              pass_show_help
 | 
	
		
			
			| 103 | 132 |              ;;
 | 
	
		
			
			|  | 133 | +        -t|--test)
 | 
	
		
			
			|  | 134 | +            TESTS=1
 | 
	
		
			
			|  | 135 | +            ;;
 | 
	
		
			
			| 104 | 136 |          -u|--user|--username)
 | 
	
		
			
			| 105 | 137 |              shift
 | 
	
		
			
			| 106 | 138 |              CURR_USERNAME="${1}"
 | 
	
	
		
			
			|  | @@ -140,6 +172,11 @@ get_backup_key_id
 | 
	
		
			
			| 140 | 172 |  # Use the backups private key as a symmetric passphrase
 | 
	
		
			
			| 141 | 173 |  MASTER_PASSWORD=$(gpg -q --armor --export-secret-key $MY_BACKUP_KEY_ID | sed '/---/d' | sed '/Version/d' | sed '/^$/d')
 | 
	
		
			
			| 142 | 174 |  
 | 
	
		
			
			|  | 175 | +if [ $TESTS ]; then
 | 
	
		
			
			|  | 176 | +    run_tests
 | 
	
		
			
			|  | 177 | +    exit 0
 | 
	
		
			
			|  | 178 | +fi
 | 
	
		
			
			|  | 179 | +
 | 
	
		
			
			| 143 | 180 |  if [ ! $CURR_USERNAME ]; then
 | 
	
		
			
			| 144 | 181 |      echo $'Error: No username given'
 | 
	
		
			
			| 145 | 182 |      exit 1
 | 
	
	
		
			
			|  | @@ -171,7 +208,7 @@ if [ ${#CURR_PASSWORD} -eq 0 ]; then
 | 
	
		
			
			| 171 | 208 |          exit 4
 | 
	
		
			
			| 172 | 209 |      else
 | 
	
		
			
			| 173 | 210 |          pass=$(gpg -dq --passphrase "$MASTER_PASSWORD" ~/.passwords/$CURR_USERNAME/$CURR_APP)
 | 
	
		
			
			| 174 |  | -        echo "${pass}" | xargs
 | 
	
		
			
			|  | 211 | +        remove_padding "${pass}"
 | 
	
		
			
			| 175 | 212 |      fi
 | 
	
		
			
			| 176 | 213 |  else
 | 
	
		
			
			| 177 | 214 |      # store password
 |