#!/bin/bash # $HeadURL$ $LastChangedRevision$ set -e PROGNAME=$(basename $0) # Load support functions . $(pcms-config PCMS_SHARE_PREFIX)/scripts/support.sh main() { # Defaults for options VERBOSELEVEL=2 ENCODE_OR_DECODE=encode ENCODING_MODE=percent while [ $# -ge 1 ]; do case $1 in --md5) ENCODING_MODE=md5 ;; --decode) ENCODE_OR_DECODE=decode ;; -d) VERBOSELEVEL=$2; shift ;; --debug=*) VERBOSELEVEL=${1#*=} ;; -v|--verbose) VERBOSELEVEL=3 ;; --) shift; break ;; -*) error "$1: unknown option" ;; *) break ;; esac shift done # Sanity checks and derivations # Delegate $ENCODE_OR_DECODE "$@" } encode() { # Process arguments [ $# -ge 1 ] || error "encode: $#: bad argument count" # 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 [ $# -eq 1 ] || 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" } main "$@"