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
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
|
|
|