#!/bin/bash # $HeadURL$ $LastChangedRevision$ # Modules . $(miniade) || { echo "${0##*/}: ERROR: miniade failed (hint: run 'miniade' to see error)" >&2; exit 1; } # Configurable stuff # Other globals main() { local MY_ARGS # Defaults for options ENCODE_OR_DECODE=encode ENCODING_MODE=percent # Process options special_opts_handler() { case $1 in --md5) ENCODING_MODE=md5 ;; --decode) ENCODE_OR_DECODE=decode ;; *) return 1 ;; esac } miniade_process_options --help-handler=help --special-opts-handler=special_opts_handler MY_ARGS "$@" && set -- "${MY_ARGS[@]}" # Process arguments # (delegated) # Sanity checks and derivations # Guts # (delegated) $ENCODE_OR_DECODE "$@" } encode() { # Process arguments [ $# -ge 1 ] || miniade_bad_usage # Guts HAD_ONE_FLAG=false COLLECTED_ENCODED_TEXT= for DECODED_ARG in "$@"; do ! $HAD_ONE_FLAG || COLLECTED_ENCODED_TEXT+=@ PARTIALLY_ENCODED_ARG="${DECODED_ARG//Z/%5a}" PARTIALLY_ENCODED_ARG="${PARTIALLY_ENCODED_ARG//\//Z2f}" PARTIALLY_ENCODED_ARG="${PARTIALLY_ENCODED_ARG// /Z20}" PARTIALLY_ENCODED_ARG="${PARTIALLY_ENCODED_ARG//\'/Z27}" PARTIALLY_ENCODED_ARG="${PARTIALLY_ENCODED_ARG//\"/Z22}" PARTIALLY_ENCODED_ARG="${PARTIALLY_ENCODED_ARG//:/Z3a}" PARTIALLY_ENCODED_ARG="${PARTIALLY_ENCODED_ARG//+/Z2b}" PARTIALLY_ENCODED_ARG="${PARTIALLY_ENCODED_ARG//@/Z40}" PARTIALLY_ENCODED_ARG="${PARTIALLY_ENCODED_ARG//=/Z3d}" PARTIALLY_ENCODED_ARG="${PARTIALLY_ENCODED_ARG//\(/Z28}" PARTIALLY_ENCODED_ARG="${PARTIALLY_ENCODED_ARG//\)/Z29}" PARTIALLY_ENCODED_ARG="${PARTIALLY_ENCODED_ARG//\\/Z5c}" ENCODED_ARG="${PARTIALLY_ENCODED_ARG//%/Z25}" COLLECTED_ENCODED_TEXT+=$ENCODED_ARG HAD_ONE_FLAG=true done HAD_ONE_FLAG=false CHUNKED_COLLECTED_ENCODED_TEXT= # 245 comes from max filename length 255, but allowing 10 letters for # the .sshkey (or whatever the extension is) that gets appended. for ((I=0; I<${#COLLECTED_ENCODED_TEXT}; I=I+245)); do ! $HAD_ONE_FLAG || CHUNKED_COLLECTED_ENCODED_TEXT+=/ CHUNKED_COLLECTED_ENCODED_TEXT+=${COLLECTED_ENCODED_TEXT:$I:245} HAD_ONE_FLAG=true done echo "$CHUNKED_COLLECTED_ENCODED_TEXT" } decode() { # Process arguments [ $# = 1 ] || miniade_bad_usage ENCODED_TEXT="$1" # Guts # Dechunk PARTIALLY_DECODED_TEXT="${ENCODED_TEXT//\/}" # Decode HAD_ONE_FLAG=false COLLECTED_DECODED_WORDS= for PARTIALLY_DECODED_WORD in ${PARTIALLY_DECODED_TEXT//@/ }; do ! $HAD_ONE_FLAG || COLLECTED_DECODED_WORDS+=" " PARTIALLY_DECODED_WORD="${PARTIALLY_DECODED_WORD//Z5c/\\}" PARTIALLY_DECODED_WORD="${PARTIALLY_DECODED_WORD//Z28/\(}" PARTIALLY_DECODED_WORD="${PARTIALLY_DECODED_WORD//Z29/\)}" PARTIALLY_DECODED_WORD="${PARTIALLY_DECODED_WORD//Z25/%}" PARTIALLY_DECODED_WORD="${PARTIALLY_DECODED_WORD//Z3d/=}" PARTIALLY_DECODED_WORD="${PARTIALLY_DECODED_WORD//Z40/@}" PARTIALLY_DECODED_WORD="${PARTIALLY_DECODED_WORD//Z2b/+}" PARTIALLY_DECODED_WORD="${PARTIALLY_DECODED_WORD//Z3a/:}" PARTIALLY_DECODED_WORD="${PARTIALLY_DECODED_WORD//Z22/\"}" PARTIALLY_DECODED_WORD="${PARTIALLY_DECODED_WORD//Z27/\'}" PARTIALLY_DECODED_WORD="${PARTIALLY_DECODED_WORD//Z20/ }" PARTIALLY_DECODED_WORD="${PARTIALLY_DECODED_WORD//Z2f/\/}" DECODED_WORD="${PARTIALLY_DECODED_WORD//%5a/Z}" # Shellify PARTIALLY_SHELLIFIED_DECODED_WORD="${DECODED_WORD//\\/\\\\}" PARTIALLY_SHELLIFIED_DECODED_WORD="${PARTIALLY_SHELLIFIED_DECODED_WORD//\"/\\\"}" SHELLIFIED_DECODED_WORD="\"$PARTIALLY_SHELLIFIED_DECODED_WORD\"" COLLECTED_DECODED_WORDS+="$SHELLIFIED_DECODED_WORD" HAD_ONE_FLAG=true done echo "$COLLECTED_DECODED_WORDS" } help() { local PROGNAME miniade_get_progname PROGNAME echo "Usage: $PROGNAME [ ] [ --decode ] [ --md5 ] " exit 0 } main "$@"