You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

147 lines
4.3 KiB
Bash

#!/bin/sh
# Tempage is a script to simplify the use of AGE with tempfiles.
# The purpose is to be able to work with files that you don't want to have touch a disk in unencrypted format
#
# The basic workflow is:
# - create a temp dir
# - extract an tar.gz.age file to that dir OR mark that you are working with a new dir.
# - Work on the files, add files, etc.
# - Save the files and close any editors.
# - Setup recipients
# - create tar.gz.age file in original directory
# - remove temp file
#### STARTUP
# Setup temp dir and configure cleanup and trap to exit securely
TMP_DIR="$(mktemp -d)"
cleanup_tmp() {
rm -rf "$TMP_DIR"
}
cleanup_on_trap() {
echo "Removing all Temp Files"
cleanup_tmp
echo "Done. Temp Files removed."
exit 1
}
trap cleanup_on_trap INT TERM
help() {
cat << eof
Help for $0
Options
-h|--help #This help doc
-f|--file [path/to/file.tar.gz.age] # provides the tar'd, compressed, and encrypted file of interest.
--file=[path/to/file.tar.gz.age] # Alternate version of -h [file]
-n|--new # Create a new archive for encryption.
-o|--output [path/to/output/file.tar.gz.age] # Where to write the archive when you save it.
--output=[path/to/output/file.tar.gz.age] # Alternate version of -o [file]
-i|--identies [path/to/age/key] # Which identity to use to decrypt the file.
--identities=[path/to/age/key] # alternate form of -i [file]
eof
}
### Interpret command line parameters
ARCHIVE_FILEPATH=""
OUTPUT_FILEPATH=""
NEW_ARCHIVE=""
PRIVATE_KEYS="~/.age/private_keys"
while [ "$#" -gt 0 ]; do
case $1 in
-h|--help)
help
cleanup_tmp
exit 0
;;
-f|--file) # Handle -f or --file argument with a separate value
ARCHIVE_FILEPATH="$2"
shift
;;
--file=*) # Handle --file=[path/to/file] argument
ARCHIVE_FILEPATH="${1#*=}"
;;
-n|--new) # Handle -n or --new argument
NEW_ARCHIVE=true
;;
-o|--output)
OUTPUT_FILEPATH="$2"
shift
;;
--output=*) # Handle --file=[path/to/file] argument
OUTPUT_FILEPATH="${1#*=}"
;;
-i|--identies) # Handle -f or --file argument with a separate value
PRIVATE_KEYS="$2"
shift
;;
--identities=*) # Handle --file=[path/to/file] argument
PRIVATE_KEYS="${1#*=}"
;;
*)
echo "Unknown parameter passed: $1"
cleanup_on_trap
exit 1
;;
esac
shift
done
# Get names for config and temp files
RECIPIENTS="$TMP_DIR/recipients.txt"
if [ -n "$NEW_ARCHIVE" ] ; then #if creating a new archive, create the config file.
echo "#Creators Key\nage18jmnun5mrmjzf5gq60w8zjhl80nwhpw0d3qdgw6gjehf4u5agvvsu5kd0j\n" >> "$RECIPIENTS"
echo "Please edit the recipeints file found at: $RECIPIENTS. It currently only has the program creator's key. UNTIL YOU FIX IT, THIS WILL NOT SECURLY ENCRYPT ANY THING. Don't forget to include your own public key or you will not be able to read it either."
elif [ -s $ARCHIVE_FILEPATH ] && [ -s "$PRIVATE_KEYS" ]; then
# decrypt and extract into temp dir
age -d -i "$PRIVATE_KEYS" -o - "$ARCHIVE_FILEPATH" | tar -xzf - -C "$TMP_DIR"
else
echo "No valid operation specified. Try $0 --help"
exit 2
fi
# Continue working with file
while true; do
echo "Enter command: \n\thelp|h, \n\tptd (print temp directory), \n\topen|o (open temp directory in GUI), \n\tencrypt|save|s (encrypt files), \n\texit|e|q (exit without saving/encrypting files)]:"
read CMD
case $CMD in
h|help)
help
;;
ptd|p)
echo "current temp directory is $TMP_DIR"
;;
open|o)
echo "Opening temp dir"
xdg-open $TMP_DIR
;;
s|save|encrypt)
echo "Saving and encrypting files as they exist in temp directory"
if [ -z "$OUTPUT_FILEPATH" ]; then
echo "Please provide a path to save to:"
read OUTPUT_FILEPATH
fi
tar -czf - -C "$TMP_DIR" . | age -R "$RECIPIENTS" -o "$OUTPUT_FILEPATH" -
;;
e|q|exit)
cleanup_tmp
exit 0
;;
*)
echo "Invalid command."
;;
esac
done