From 6a21731082bcd716236e477f06a5d192fbdf98ac Mon Sep 17 00:00:00 2001 From: Jon-William Lewis Date: Mon, 25 Jan 2016 17:20:05 -0600 Subject: [PATCH 1/7] Variable name reworking; laid foundation for GPG encryption (instead of OpenSSL) --- build.sh | 39 +++--- header.sh | 9 +- sns.sh | 127 ++++++++++++------ sns.xcodeproj/project.pbxproj | 4 +- src/includes/create.sns.sh | 2 +- .../{w_conf.sns.sh => create_sns_root.sns.sh} | 15 ++- src/includes/libencryption.sh | 16 ++- src/includes/list.sns.sh | 10 +- src/includes/pause.sns.sh | 2 +- src/main/stage1.sns.sh | 35 ++--- src/main/stage2.sns.sh | 6 +- src/main/stage3.sns.sh | 17 ++- 12 files changed, 180 insertions(+), 102 deletions(-) rename src/includes/{w_conf.sns.sh => create_sns_root.sns.sh} (68%) diff --git a/build.sh b/build.sh index a1f65a8..aad3dcc 100755 --- a/build.sh +++ b/build.sh @@ -1,20 +1,29 @@ S=sns.sh bash header.sh > "$S" -echo -e "\n# Section: Functions" >> "$S" -cat ./src/includes/w_conf.sns.sh >> "$S" -cat ./src/includes/pause.sns.sh >> "$S" -cat ./src/includes/help.sns.sh >> "$S" -cat ./src/includes/p_header.sh >> "$S" -cat ./src/includes/libencryption.sh >> "$S" -cat ./src/includes/create.sns.sh >> "$S" -cat ./src/includes/delete.sns.sh >> "$S" -cat ./src/includes/edit.sns.sh >> "$S" -cat ./src/includes/print.sns.sh >> "$S" -cat ./src/includes/list.sns.sh >> "$S" -echo -e "# End Section: Functions\n" >> "$S" -cat ./src/main/stage1.sns.sh >> "$S" -cat ./src/main/stage2.sns.sh >> "$S" -cat ./src/main/stage3.sns.sh >> "$S" +echo -e "\n# Section: Functions" >> "$S" +cat ./src/includes/create_sns_root.sns.sh >> "$S" +cat ./src/includes/pause.sns.sh >> "$S" +cat ./src/includes/help.sns.sh >> "$S" +cat ./src/includes/p_header.sh >> "$S" +cat ./src/includes/libencryption.sh >> "$S" +cat ./src/includes/create.sns.sh >> "$S" +cat ./src/includes/delete.sns.sh >> "$S" +cat ./src/includes/edit.sns.sh >> "$S" +cat ./src/includes/print.sns.sh >> "$S" +cat ./src/includes/list.sns.sh >> "$S" +printf "%s\n\n\n\n" "# End Section: Functions" >> "$S" + +printf "\n" >> "$S" +printf "%s\n" "###############################################################################" >> "$S" +printf "%s\n" "#==============================================================================" >> "$S" +printf "%s\n" "# Begin Main Program" >> "$S" +printf "%s\n" "#==============================================================================" >> "$S" +printf "%s\n" "###############################################################################" >> "$S" +printf "\n" >> "$S" + +cat ./src/main/stage1.sns.sh >> "$S" +cat ./src/main/stage2.sns.sh >> "$S" +cat ./src/main/stage3.sns.sh >> "$S" exit diff --git a/header.sh b/header.sh index 850669c..5a9d6da 100644 --- a/header.sh +++ b/header.sh @@ -13,9 +13,10 @@ cat << EOF if [ -z "\$HOME" ]; then HOME=/home/"\$(whoami)"; fi PROD_STR="$PROD_STR" -VER_STR="$VER_STR" -ROOTDIR="\$HOME"/.config/sns -BASEDIR="\$ROOTDIR"/notes -CONFIGURATION="\$ROOTDIR/sns.conf" +readonly VER_STR="$VER_STR" +readonly ROOT_DIR="\$HOME"/.config/xenlabs/sns +readonly BASE_DIR="\$ROOT_DIR"/notes +readonly TMP_DIR="\$ROOT_DIR"/tmp +readonly CONFIG_FILE="\$ROOT_DIR/sns.conf" EOF diff --git a/sns.sh b/sns.sh index 4bc5972..b4dac20 100755 --- a/sns.sh +++ b/sns.sh @@ -4,19 +4,24 @@ # Copyright 2014, Xenese Labs/Sicron-Perion XNF #========================================================== -if [ -z "/Users/xilmwa" ]; then HOME=/home/"$(whoami)"; fi +if [ -z "$HOME" ]; then HOME=/home/"$(whoami)"; fi PROD_STR="Simple Note System" -VER_STR="v2.0a5" -ROOTDIR="$HOME"/.config/sns -BASEDIR="$ROOTDIR"/notes -CONFIGURATION="$ROOTDIR/sns.conf" +readonly VER_STR="v2.0a5" +readonly ROOT_DIR="$HOME"/.config/xenlabs/sns +readonly BASE_DIR="$ROOT_DIR"/notes +readonly TMP_DIR="$ROOT_DIR"/tmp +readonly CONFIG_FILE="$ROOT_DIR/sns.conf" # Section: Functions function w_conf { -if [ ! -r "$ROOTDIR" ]; then mkdir -p "$ROOTDIR"; fi -cat > "$CONFIGURATION" << EOF + +if [ ! -r "$ROOT_DIR" ]; then mkdir -p "$ROOT_DIR"; fi +if [ ! -d "$TMP_DIR" ]; then mkdir -p "$TMP_DIR" ; fi + + +cat > "$CONFIG_FILE" << EOF #========================================================== # Simple Note System Config, v2.0a5 # Copyright 2014, Xenese Labs/Sicron-Perion XNF @@ -27,19 +32,22 @@ EXT=note #Preferred Editor if [ -z "$EDITOR" ]; then - EDITOR=vim + echo EDITOR=vim fi #Encryption #WARNING: ANY PREVIOUSLY UNENCRYPTED NOTES WILL BE LOST + +#ENCRYPTION="TRUE" ENCRYPTION="FALSE" -ENC_KEY="" + +PUBKEY="" EOF -chmod 600 "$CONFIGURATION" +chmod 600 "$CONFIG_FILE" } function pause { - read -p " Press [Enter] to continue." + read -rp " Press [Enter] to continue." echo "" } function help { @@ -64,19 +72,29 @@ function p_header(){ printf "TITLE: %s\nDATE: %s\n" "$NAME" "$(date)" } function encrypt(){ - openssl enc -aes-256-cbc -salt -in "$TARGET" -out "$NOTE" -pass pass:"$ENC_KEY" +# This function, given a recipient, $PUBKEY; a file to encrypt, $TARGET; and an +# output file, "$NOTE", will encrypt $TARGET to $NOTE against $PUBKEY's private +# GPG key. + +gpg -r "$PUBKEY" --encrypt-files "$TARGET" --output "$NOTE" + } function decrypt(){ - TARGET="$ROOTDIR"/tmp/"$RANDOM" - openssl enc -d -aes-256-cbc -in "$NOTE" -pass pass:"$ENC_KEY" > "$TARGET" +# This function, given a recipient, $PUBKEY; a file to decrypt, $TARGET; and an +# output file, "$NOTE", will decrpyt $TARGET to $NOTE against $PUBKEY's private +# GPG key. + + if [ ! -d "$ROOT_DIR"/tmp ]; then mkdir "$ROOT_DIR"/tmp; fi + TARGET="$TMP_DIR/$RANDOM" + gpg -d "$NOTE" > "$TARGET" } function create(){ if [ -e "$NOTE" ]; then printf "\nERROR: Note already exists\nHint: use -e to edit the note.\n" exit else - mkdir -p "$NOTEDIR" + mkdir -p "$NOTE_DIR" fi if [ -z "$ENCRYPTION" ]; then @@ -119,7 +137,7 @@ else TARGET="$NOTE"; fi if [ -z "$CREATE" ]; then printf "\nEDIT %s" "$(date)" >> "$TARGET"; fi -"$EDITOR" "$TARGET" +echo "$EDITOR" "$TARGET" if [ "$ENCRYPTION" == "TRUE" ]; then encrypt; fi @@ -146,13 +164,17 @@ function print(){ fi } function list(){ - if [ -d "$BASEDIR"/"$NOTEBOOK" ]; then + if [ -d "$BASE_DIR"/"$NOTEBOOK" ]; then printf "\nNotes in %s:\n" "$(basename "$NOTEBOOK")" - NOTES=( $(find "$BASEDIR"/"$NOTEBOOK" -name "*.$EXT" -print0 | sed s:"$BASEDIR"/"$NOTEBOOK"/: " " :g | sed -e s:".$EXT"::g | tr "/" " ") ) + NOTES=( + $(find "$BASE_DIR"/"$NOTEBOOK" -name "*.$EXT" -print0 |\ + sed s:"$BASE_DIR"/"$NOTEBOOK"/: " " :g |\ + sed -e s:".$EXT"::g | tr "/" " ") + ) let i=0 for NOTE in "${NOTES[@]}"; do - if [ -d "$BASEDIR"/"$NOTEBOOK"/"$NOTE" ]; then + if [ -d "$BASE_DIR"/"$NOTEBOOK"/"$NOTE" ]; then if [ "$LAST_SECTION" != "$NOTE" ]; then printf " Section: %s\n" "$NOTE" fi @@ -174,33 +196,45 @@ function list(){ } # End Section: Functions + + + +############################################################################### #============================================================================== -# Section: Configuration +# Begin Main Program #============================================================================== -if [ -r "$CONFIGURATION" ]; then - source "$CONFIGURATION" +############################################################################### + +#============================================================================== +# Section: Configuration / Stage 1 +#============================================================================== +if [ -r "$CONFIG_FILE" ]; then + source "$CONFIG_FILE" else - w_conf - source "$CONFIGURATION" + create_sns_root + source "$CONFIG_FILE" fi if [ "$ENCRYPTION" == "TRUE" ]; then -if [ -z "$ENC_KEY" ]; then -ERR_NO_KEY="TRUE" -ENCRYPTION="FALSE" -fi -command -v openssl >/dev/null 2>&1 || { ERR_NO_SSL="TRUE"; ENCRYPTION="FALSE"; } + if [ -z "$PUBKEY" ]; then + ERR_NO_KEY="TRUE" + ENCRYPTION="FALSE" + fi + + command -v openssl >/dev/null 2>&1 ||\ + { ERR_NO_SSL="TRUE"; ENCRYPTION="FALSE"; } fi if [ "$ENCRYPTION" == "TRUE" ]; then -PROD_STR="Simple Note System (Encryption Enabled)" -EXT="$EXT" -if [ ! -d "$BASEDIR"/tmp ]; then -mkdir -p "$BASEDIR"/tmp -fi + PROD_STR="Simple Note System (Encryption Enabled)" + EXT="$EXT".gpg + if [ ! -d "$BASE_DIR"/tmp ]; then + mkdir -p "$BASE_DIR"/tmp + fi fi echo "$PROD_STR, $VER_STR" + if [ -n "$ERR_NO_SSL" ]; then echo >&2 " Warning: OpenSSL not installed. Encryption disabled." fi @@ -213,10 +247,10 @@ pause fi #============================================================================== -# End Section: Configuration +# End Section: Configuration / Stage 1 #============================================================================== #============================================================================== -# Section: Argument Parsing +# Section: Argument Parsing / Stage 2 #============================================================================== NAME="" @@ -233,7 +267,7 @@ else elif [ "$ARG" = "-p" ] || [ "$ARG" = "--print" ]; then PRINT="TRUE" elif [ "$ARG" = "-l" ] || [ "$ARG" = "--list" ]; then LIST="TRUE" elif [ "$ARG" = "-h" ] || [ "$ARG" == "--help" ]; then help; exit 0 - elif [ "$ARG" = "-w" ] || [ "$ARG" == "--wconf" ]; then w_conf; exit 0 + elif [ "$ARG" = "-w" ] || [ "$ARG" == "--wconf" ]; then create_sns_root; exit 0 else if [ -z "$NAME" ] && [ -n "$ARG" ]; then NAME="$ARG" elif [ -z "$NOTEBOOK" ] && [ -n "$ARG" ]; then NOTEBOOK="$ARG" @@ -254,11 +288,11 @@ fi # that can work without any arguments. #============================================================================== -# End Section: Argument Parsing +# End Section: Argument Parsing / Stage 2 +#============================================================================== +#============================================================================== +# Section: Actions / Stage 3 #============================================================================== -# Help requires no arguments, and is exclusive. -if [ -n "$HELP" ]; then help; exit 0; fi - # List only requires a notebook, and is exclusive. if [ -z "$NOTEBOOK" ]; then echo " ERROR: Insufficient arguments:" @@ -279,11 +313,16 @@ if [ -z "$NAME" ]; then exit 30 fi -NOTEDIR="$BASEDIR"/"$NOTEBOOK"/"$SECTION"/ -NOTE="$NOTEDIR""$NAME"."$EXT" +SESSION_ID="$RANDOM" +NOTE_DIR="$BASE_DIR"/"$NOTEBOOK"/"$SECTION"/ +NOTE="$NOTE_DIR""$NAME"."$EXT" if [ "$ENCRYPTION" == "TRUE" ]; then NOTE="$NOTE".enc; fi if [ "$PRINT" == "TRUE" ]; then print; exit 0; fi if [ "$DELETE" == "TRUE" ]; then delete; exit 0; fi if [ "$CREATE" == "TRUE" ]; then create; fi -if [ "$EDIT" == "TRUE" ]; then edit; fi \ No newline at end of file +if [ "$EDIT" == "TRUE" ]; then edit; fi + +#============================================================================== +# End Section: Actions / Stage 3 +#============================================================================== \ No newline at end of file diff --git a/sns.xcodeproj/project.pbxproj b/sns.xcodeproj/project.pbxproj index c70fecd..5eb29b4 100644 --- a/sns.xcodeproj/project.pbxproj +++ b/sns.xcodeproj/project.pbxproj @@ -15,7 +15,7 @@ 5D22D6A81AFC4F5A0036DC52 /* p_header.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = p_header.sh; sourceTree = ""; }; 5D22D6A91AFC4F5A0036DC52 /* pause.sns.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = pause.sns.sh; sourceTree = ""; }; 5D22D6AA1AFC4F5A0036DC52 /* print.sns.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = print.sns.sh; sourceTree = ""; }; - 5D22D6AB1AFC4F5A0036DC52 /* w_conf.sns.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = w_conf.sns.sh; sourceTree = ""; }; + 5D22D6AB1AFC4F5A0036DC52 /* create_sns_root.sns.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = create_sns_root.sns.sh; sourceTree = ""; }; 5D22D6AD1AFC4F5A0036DC52 /* stage1.sns.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = stage1.sns.sh; sourceTree = ""; }; 5D22D6AE1AFC4F5A0036DC52 /* stage2.sns.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = stage2.sns.sh; sourceTree = ""; }; 5D22D6AF1AFC4F5A0036DC52 /* stage3.sns.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = stage3.sns.sh; sourceTree = ""; }; @@ -47,7 +47,7 @@ 5D22D6A81AFC4F5A0036DC52 /* p_header.sh */, 5D22D6A91AFC4F5A0036DC52 /* pause.sns.sh */, 5D22D6AA1AFC4F5A0036DC52 /* print.sns.sh */, - 5D22D6AB1AFC4F5A0036DC52 /* w_conf.sns.sh */, + 5D22D6AB1AFC4F5A0036DC52 /* create_sns_root.sns.sh */, 5D22D6B01AFC5B100036DC52 /* libencryption.sh */, ); path = includes; diff --git a/src/includes/create.sns.sh b/src/includes/create.sns.sh index e4a9fbc..29fddc0 100644 --- a/src/includes/create.sns.sh +++ b/src/includes/create.sns.sh @@ -3,7 +3,7 @@ function create(){ printf "\nERROR: Note already exists\nHint: use -e to edit the note.\n" exit else - mkdir -p "$NOTEDIR" + mkdir -p "$NOTE_DIR" fi if [ -z "$ENCRYPTION" ]; then diff --git a/src/includes/w_conf.sns.sh b/src/includes/create_sns_root.sns.sh similarity index 68% rename from src/includes/w_conf.sns.sh rename to src/includes/create_sns_root.sns.sh index 5aadbb6..5e1b5ad 100644 --- a/src/includes/w_conf.sns.sh +++ b/src/includes/create_sns_root.sns.sh @@ -1,6 +1,10 @@ function w_conf { -if [ ! -r "$ROOTDIR" ]; then mkdir -p "$ROOTDIR"; fi -cat > "$CONFIGURATION" << EOF + +if [ ! -r "$ROOT_DIR" ]; then mkdir -p "$ROOT_DIR"; fi +if [ ! -d "$TMP_DIR" ]; then mkdir -p "$TMP_DIR" ; fi + + +cat > "$CONFIG_FILE" << EOF #========================================================== # Simple Note System Config, v2.0a5 # Copyright 2014, Xenese Labs/Sicron-Perion XNF @@ -16,9 +20,12 @@ fi #Encryption #WARNING: ANY PREVIOUSLY UNENCRYPTED NOTES WILL BE LOST + +#ENCRYPTION="TRUE" ENCRYPTION="FALSE" -ENC_KEY="" + +PUBKEY="" EOF -chmod 600 "$CONFIGURATION" +chmod 600 "$CONFIG_FILE" } diff --git a/src/includes/libencryption.sh b/src/includes/libencryption.sh index 392bf8d..ed2215f 100644 --- a/src/includes/libencryption.sh +++ b/src/includes/libencryption.sh @@ -1,8 +1,18 @@ function encrypt(){ - openssl enc -aes-256-cbc -salt -in "$TARGET" -out "$NOTE" -pass pass:"$ENC_KEY" +# This function, given a recipient, $PUBKEY; a file to encrypt, $TARGET; and an +# output file, "$NOTE", will encrypt $TARGET to $NOTE against $PUBKEY's private +# GPG key. + +gpg -r "$PUBKEY" --encrypt-files "$TARGET" --output "$NOTE" + } function decrypt(){ - TARGET="$ROOTDIR"/tmp/"$RANDOM" - openssl enc -d -aes-256-cbc -in "$NOTE" -pass pass:"$ENC_KEY" > "$TARGET" +# This function, given a recipient, $PUBKEY; a file to decrypt, $TARGET; and an +# output file, "$NOTE", will decrpyt $TARGET to $NOTE against $PUBKEY's private +# GPG key. + + if [ ! -d "$ROOT_DIR"/tmp ]; then mkdir "$ROOT_DIR"/tmp; fi + TARGET="$TMP_DIR/$RANDOM" + gpg -d "$NOTE" > "$TARGET" } diff --git a/src/includes/list.sns.sh b/src/includes/list.sns.sh index 7bc95b9..3224a0c 100644 --- a/src/includes/list.sns.sh +++ b/src/includes/list.sns.sh @@ -1,11 +1,15 @@ function list(){ - if [ -d "$BASEDIR"/"$NOTEBOOK" ]; then + if [ -d "$BASE_DIR"/"$NOTEBOOK" ]; then printf "\nNotes in %s:\n" "$(basename "$NOTEBOOK")" - NOTES=( $(find "$BASEDIR"/"$NOTEBOOK" -name "*.$EXT" -print0 | sed s:"$BASEDIR"/"$NOTEBOOK"/: " " :g | sed -e s:".$EXT"::g | tr "/" " ") ) + NOTES=( + $(find "$BASE_DIR"/"$NOTEBOOK" -name "*.$EXT" -print0 |\ + sed s:"$BASE_DIR"/"$NOTEBOOK"/: " " :g |\ + sed -e s:".$EXT"::g | tr "/" " ") + ) let i=0 for NOTE in "${NOTES[@]}"; do - if [ -d "$BASEDIR"/"$NOTEBOOK"/"$NOTE" ]; then + if [ -d "$BASE_DIR"/"$NOTEBOOK"/"$NOTE" ]; then if [ "$LAST_SECTION" != "$NOTE" ]; then printf " Section: %s\n" "$NOTE" fi diff --git a/src/includes/pause.sns.sh b/src/includes/pause.sns.sh index 5884408..ace9b99 100644 --- a/src/includes/pause.sns.sh +++ b/src/includes/pause.sns.sh @@ -1,4 +1,4 @@ function pause { - read -p " Press [Enter] to continue." + read -rp " Press [Enter] to continue." echo "" } diff --git a/src/main/stage1.sns.sh b/src/main/stage1.sns.sh index 45ea735..06d1b2f 100644 --- a/src/main/stage1.sns.sh +++ b/src/main/stage1.sns.sh @@ -1,30 +1,33 @@ #============================================================================== -# Section: Configuration +# Section: Configuration / Stage 1 #============================================================================== -if [ -r "$CONFIGURATION" ]; then - source "$CONFIGURATION" +if [ -r "$CONFIG_FILE" ]; then + source "$CONFIG_FILE" else - w_conf - source "$CONFIGURATION" + create_sns_root + source "$CONFIG_FILE" fi if [ "$ENCRYPTION" == "TRUE" ]; then -if [ -z "$ENC_KEY" ]; then -ERR_NO_KEY="TRUE" -ENCRYPTION="FALSE" -fi -command -v openssl >/dev/null 2>&1 || { ERR_NO_SSL="TRUE"; ENCRYPTION="FALSE"; } + if [ -z "$PUBKEY" ]; then + ERR_NO_KEY="TRUE" + ENCRYPTION="FALSE" + fi + + command -v openssl >/dev/null 2>&1 ||\ + { ERR_NO_SSL="TRUE"; ENCRYPTION="FALSE"; } fi if [ "$ENCRYPTION" == "TRUE" ]; then -PROD_STR="Simple Note System (Encryption Enabled)" -EXT="$EXT" -if [ ! -d "$BASEDIR"/tmp ]; then -mkdir -p "$BASEDIR"/tmp -fi + PROD_STR="Simple Note System (Encryption Enabled)" + EXT="$EXT".gpg + if [ ! -d "$BASE_DIR"/tmp ]; then + mkdir -p "$BASE_DIR"/tmp + fi fi echo "$PROD_STR, $VER_STR" + if [ -n "$ERR_NO_SSL" ]; then echo >&2 " Warning: OpenSSL not installed. Encryption disabled." fi @@ -37,5 +40,5 @@ pause fi #============================================================================== -# End Section: Configuration +# End Section: Configuration / Stage 1 #============================================================================== diff --git a/src/main/stage2.sns.sh b/src/main/stage2.sns.sh index debc0fa..97c0392 100644 --- a/src/main/stage2.sns.sh +++ b/src/main/stage2.sns.sh @@ -1,5 +1,5 @@ #============================================================================== -# Section: Argument Parsing +# Section: Argument Parsing / Stage 2 #============================================================================== NAME="" @@ -16,7 +16,7 @@ else elif [ "$ARG" = "-p" ] || [ "$ARG" = "--print" ]; then PRINT="TRUE" elif [ "$ARG" = "-l" ] || [ "$ARG" = "--list" ]; then LIST="TRUE" elif [ "$ARG" = "-h" ] || [ "$ARG" == "--help" ]; then help; exit 0 - elif [ "$ARG" = "-w" ] || [ "$ARG" == "--wconf" ]; then w_conf; exit 0 + elif [ "$ARG" = "-w" ] || [ "$ARG" == "--wconf" ]; then create_sns_root; exit 0 else if [ -z "$NAME" ] && [ -n "$ARG" ]; then NAME="$ARG" elif [ -z "$NOTEBOOK" ] && [ -n "$ARG" ]; then NOTEBOOK="$ARG" @@ -37,5 +37,5 @@ fi # that can work without any arguments. #============================================================================== -# End Section: Argument Parsing +# End Section: Argument Parsing / Stage 2 #============================================================================== diff --git a/src/main/stage3.sns.sh b/src/main/stage3.sns.sh index 955713f..6c640ff 100644 --- a/src/main/stage3.sns.sh +++ b/src/main/stage3.sns.sh @@ -1,6 +1,6 @@ -# Help requires no arguments, and is exclusive. -if [ -n "$HELP" ]; then help; exit 0; fi - +#============================================================================== +# Section: Actions / Stage 3 +#============================================================================== # List only requires a notebook, and is exclusive. if [ -z "$NOTEBOOK" ]; then echo " ERROR: Insufficient arguments:" @@ -21,11 +21,16 @@ if [ -z "$NAME" ]; then exit 30 fi -NOTEDIR="$BASEDIR"/"$NOTEBOOK"/"$SECTION"/ -NOTE="$NOTEDIR""$NAME"."$EXT" +SESSION_ID="$RANDOM" +NOTE_DIR="$BASE_DIR"/"$NOTEBOOK"/"$SECTION"/ +NOTE="$NOTE_DIR""$NAME"."$EXT" if [ "$ENCRYPTION" == "TRUE" ]; then NOTE="$NOTE".enc; fi if [ "$PRINT" == "TRUE" ]; then print; exit 0; fi if [ "$DELETE" == "TRUE" ]; then delete; exit 0; fi if [ "$CREATE" == "TRUE" ]; then create; fi -if [ "$EDIT" == "TRUE" ]; then edit; fi \ No newline at end of file +if [ "$EDIT" == "TRUE" ]; then edit; fi + +#============================================================================== +# End Section: Actions / Stage 3 +#============================================================================== \ No newline at end of file From 8fc731aaa0f2f3f561b1b453184b0ce9fa4dda0c Mon Sep 17 00:00:00 2001 From: Jon-William Lewis Date: Mon, 25 Jan 2016 19:33:48 -0600 Subject: [PATCH 2/7] Progress. I can now create and edit notes reliably. --- errors.ref | 4 +-- header.sh | 2 +- sns.sh | 50 ++++++++++++++++++++--------------- src/includes/create.sns.sh | 6 ++--- src/includes/edit.sns.sh | 10 +++++-- src/includes/libencryption.sh | 2 +- src/main/stage1.sns.sh | 22 +++++++-------- src/main/stage3.sns.sh | 2 +- 8 files changed, 55 insertions(+), 43 deletions(-) diff --git a/errors.ref b/errors.ref index ce7c5f3..508077d 100644 --- a/errors.ref +++ b/errors.ref @@ -8,5 +8,5 @@ ERR_INSUFFICIENT_ARGS 30 A required argument was not provided Encryption---------------------------------------------------------------------- -ERR_NO_SSL 100 Cannot execute openssl -ERR_NO_KEY 110 No encryption key in sns.conf \ No newline at end of file +ERR_NO_GPG 100 GPG is not installed +ERR_NO_KEY 110 No recipient specified \ No newline at end of file diff --git a/header.sh b/header.sh index 5a9d6da..5d4a8c4 100644 --- a/header.sh +++ b/header.sh @@ -1,7 +1,7 @@ #!/bin/bash PROD_STR="Simple Note System" -VER_STR="v2.0a5" +VER_STR="v2.0a6" cat << EOF #!/bin/bash diff --git a/sns.sh b/sns.sh index b4dac20..e7f57bc 100755 --- a/sns.sh +++ b/sns.sh @@ -1,13 +1,13 @@ #!/bin/bash #========================================================== -# Simple Note System, v2.0a5 +# Simple Note System, v2.0a6 # Copyright 2014, Xenese Labs/Sicron-Perion XNF #========================================================== if [ -z "$HOME" ]; then HOME=/home/"$(whoami)"; fi PROD_STR="Simple Note System" -readonly VER_STR="v2.0a5" +readonly VER_STR="v2.0a6" readonly ROOT_DIR="$HOME"/.config/xenlabs/sns readonly BASE_DIR="$ROOT_DIR"/notes readonly TMP_DIR="$ROOT_DIR"/tmp @@ -32,7 +32,7 @@ EXT=note #Preferred Editor if [ -z "$EDITOR" ]; then - echo EDITOR=vim + EDITOR=vim fi #Encryption @@ -76,7 +76,7 @@ function encrypt(){ # output file, "$NOTE", will encrypt $TARGET to $NOTE against $PUBKEY's private # GPG key. -gpg -r "$PUBKEY" --encrypt-files "$TARGET" --output "$NOTE" +gpg -r "$PUBKEY" -o "$NOTE" -e "$TARGET" } @@ -101,9 +101,9 @@ function create(){ echo "TITLE: $NAME" > "$NOTE" echo "DATE: $(date)" >> "$NOTE" elif [ "$ENCRYPTION" == "TRUE" ]; then - touch "$NOTE" - p_header | openssl enc -aes-256-cbc -salt -out "$NOTE"\ - -pass pass:"$ENC_KEY" + TARGET="$TMP_DIR"/"$SESSION_ID" + p_header > "$TARGET" + encrypt fi if [ -e "$NOTE" ]; then @@ -131,15 +131,21 @@ if [ ! -r "$NOTE" ]; then exit 40; fi -if [ "$ENCRYPTION" == "TRUE" ]; then decrypt +if [ "$ENCRYPTION" == "TRUE" ]; then + cp "$NOTE" "$NOTE".bk + decrypt else TARGET="$NOTE"; fi if [ -z "$CREATE" ]; then printf "\nEDIT %s" "$(date)" >> "$TARGET"; fi -echo "$EDITOR" "$TARGET" +"$EDITOR" "$TARGET" -if [ "$ENCRYPTION" == "TRUE" ]; then encrypt; fi +if [ "$ENCRYPTION" == "TRUE" ]; then + rm "$NOTE" + encrypt; + if [ -r "$NOTE" ]; then rm "$NOTE".bk; fi +fi @@ -221,13 +227,12 @@ if [ "$ENCRYPTION" == "TRUE" ]; then ENCRYPTION="FALSE" fi - command -v openssl >/dev/null 2>&1 ||\ - { ERR_NO_SSL="TRUE"; ENCRYPTION="FALSE"; } + command -v gpg >/dev/null 2>&1 ||\ + { ERR_NO_GPG="TRUE"; ENCRYPTION="FALSE"; } fi if [ "$ENCRYPTION" == "TRUE" ]; then PROD_STR="Simple Note System (Encryption Enabled)" - EXT="$EXT".gpg if [ ! -d "$BASE_DIR"/tmp ]; then mkdir -p "$BASE_DIR"/tmp fi @@ -235,16 +240,17 @@ fi echo "$PROD_STR, $VER_STR" -if [ -n "$ERR_NO_SSL" ]; then -echo >&2 " Warning: OpenSSL not installed. Encryption disabled." -fi -if [ -n "$ERR_NO_KEY" ]; then -echo " Warning: No encryption key was provided. Encryption disabled." +if [ -z "$EDITOR" ]; then + >&2 echo "Error no editor specified in environment." + +elif [ -n "$ERR_NO_GPG" ]; then + >&2 echo " Error: Encryption was specified, but GPG is not installed." + exit 100 +elif [ -n "$ERR_NO_KEY" ]; then + >&2 echo " Error: No GPG recipient was provided in $CONFIG_FILE. " + exit 110 fi -if [ -n "$ERR_NO_SSL" ] || [ -n "$ERR_NO_KEY" ]; then -pause -fi #============================================================================== # End Section: Configuration / Stage 1 @@ -317,7 +323,7 @@ SESSION_ID="$RANDOM" NOTE_DIR="$BASE_DIR"/"$NOTEBOOK"/"$SECTION"/ NOTE="$NOTE_DIR""$NAME"."$EXT" -if [ "$ENCRYPTION" == "TRUE" ]; then NOTE="$NOTE".enc; fi +if [ "$ENCRYPTION" == "TRUE" ]; then NOTE="$NOTE".gpg; fi if [ "$PRINT" == "TRUE" ]; then print; exit 0; fi if [ "$DELETE" == "TRUE" ]; then delete; exit 0; fi if [ "$CREATE" == "TRUE" ]; then create; fi diff --git a/src/includes/create.sns.sh b/src/includes/create.sns.sh index 29fddc0..403eae1 100644 --- a/src/includes/create.sns.sh +++ b/src/includes/create.sns.sh @@ -10,9 +10,9 @@ function create(){ echo "TITLE: $NAME" > "$NOTE" echo "DATE: $(date)" >> "$NOTE" elif [ "$ENCRYPTION" == "TRUE" ]; then - touch "$NOTE" - p_header | openssl enc -aes-256-cbc -salt -out "$NOTE"\ - -pass pass:"$ENC_KEY" + TARGET="$TMP_DIR"/"$SESSION_ID" + p_header > "$TARGET" + encrypt fi if [ -e "$NOTE" ]; then diff --git a/src/includes/edit.sns.sh b/src/includes/edit.sns.sh index e67afe4..64014d6 100644 --- a/src/includes/edit.sns.sh +++ b/src/includes/edit.sns.sh @@ -4,7 +4,9 @@ if [ ! -r "$NOTE" ]; then exit 40; fi -if [ "$ENCRYPTION" == "TRUE" ]; then decrypt +if [ "$ENCRYPTION" == "TRUE" ]; then + cp "$NOTE" "$NOTE".bk + decrypt else TARGET="$NOTE"; fi @@ -12,7 +14,11 @@ if [ -z "$CREATE" ]; then printf "\nEDIT %s" "$(date)" >> "$TARGET"; fi "$EDITOR" "$TARGET" -if [ "$ENCRYPTION" == "TRUE" ]; then encrypt; fi +if [ "$ENCRYPTION" == "TRUE" ]; then + rm "$NOTE" + encrypt; + if [ -r "$NOTE" ]; then rm "$NOTE".bk; fi +fi diff --git a/src/includes/libencryption.sh b/src/includes/libencryption.sh index ed2215f..a6fcec7 100644 --- a/src/includes/libencryption.sh +++ b/src/includes/libencryption.sh @@ -3,7 +3,7 @@ function encrypt(){ # output file, "$NOTE", will encrypt $TARGET to $NOTE against $PUBKEY's private # GPG key. -gpg -r "$PUBKEY" --encrypt-files "$TARGET" --output "$NOTE" +gpg -r "$PUBKEY" -o "$NOTE" -e "$TARGET" } diff --git a/src/main/stage1.sns.sh b/src/main/stage1.sns.sh index 06d1b2f..4cb45f7 100644 --- a/src/main/stage1.sns.sh +++ b/src/main/stage1.sns.sh @@ -14,13 +14,12 @@ if [ "$ENCRYPTION" == "TRUE" ]; then ENCRYPTION="FALSE" fi - command -v openssl >/dev/null 2>&1 ||\ - { ERR_NO_SSL="TRUE"; ENCRYPTION="FALSE"; } + command -v gpg >/dev/null 2>&1 ||\ + { ERR_NO_GPG="TRUE"; ENCRYPTION="FALSE"; } fi if [ "$ENCRYPTION" == "TRUE" ]; then PROD_STR="Simple Note System (Encryption Enabled)" - EXT="$EXT".gpg if [ ! -d "$BASE_DIR"/tmp ]; then mkdir -p "$BASE_DIR"/tmp fi @@ -28,16 +27,17 @@ fi echo "$PROD_STR, $VER_STR" -if [ -n "$ERR_NO_SSL" ]; then -echo >&2 " Warning: OpenSSL not installed. Encryption disabled." -fi -if [ -n "$ERR_NO_KEY" ]; then -echo " Warning: No encryption key was provided. Encryption disabled." +if [ -z "$EDITOR" ]; then + >&2 echo "Error no editor specified in environment." + +elif [ -n "$ERR_NO_GPG" ]; then + >&2 echo " Error: Encryption was specified, but GPG is not installed." + exit 100 +elif [ -n "$ERR_NO_KEY" ]; then + >&2 echo " Error: No GPG recipient was provided in $CONFIG_FILE. " + exit 110 fi -if [ -n "$ERR_NO_SSL" ] || [ -n "$ERR_NO_KEY" ]; then -pause -fi #============================================================================== # End Section: Configuration / Stage 1 diff --git a/src/main/stage3.sns.sh b/src/main/stage3.sns.sh index 6c640ff..1686c7b 100644 --- a/src/main/stage3.sns.sh +++ b/src/main/stage3.sns.sh @@ -25,7 +25,7 @@ SESSION_ID="$RANDOM" NOTE_DIR="$BASE_DIR"/"$NOTEBOOK"/"$SECTION"/ NOTE="$NOTE_DIR""$NAME"."$EXT" -if [ "$ENCRYPTION" == "TRUE" ]; then NOTE="$NOTE".enc; fi +if [ "$ENCRYPTION" == "TRUE" ]; then NOTE="$NOTE".gpg; fi if [ "$PRINT" == "TRUE" ]; then print; exit 0; fi if [ "$DELETE" == "TRUE" ]; then delete; exit 0; fi if [ "$CREATE" == "TRUE" ]; then create; fi From 2d8db83c3c9ca44e072c457b7d006c3147658978 Mon Sep 17 00:00:00 2001 From: Jon-William Lewis Date: Mon, 25 Jan 2016 21:00:43 -0600 Subject: [PATCH 3/7] Reworked print function --- header.sh | 2 +- sns.sh | 61 ++++++++--------------------------- src/includes/edit.sns.sh | 6 ++-- src/includes/libencryption.sh | 6 ++-- src/includes/list.sns.sh | 29 ++--------------- src/includes/print.sns.sh | 20 ++++-------- 6 files changed, 29 insertions(+), 95 deletions(-) diff --git a/header.sh b/header.sh index 5d4a8c4..7f582a6 100644 --- a/header.sh +++ b/header.sh @@ -1,7 +1,7 @@ #!/bin/bash PROD_STR="Simple Note System" -VER_STR="v2.0a6" +VER_STR="v2.0a7" cat << EOF #!/bin/bash diff --git a/sns.sh b/sns.sh index e7f57bc..7f07f64 100755 --- a/sns.sh +++ b/sns.sh @@ -76,7 +76,7 @@ function encrypt(){ # output file, "$NOTE", will encrypt $TARGET to $NOTE against $PUBKEY's private # GPG key. -gpg -r "$PUBKEY" -o "$NOTE" -e "$TARGET" + gpg -r "$PUBKEY" -o "$NOTE" -e "$TARGET" } @@ -85,9 +85,7 @@ function decrypt(){ # output file, "$NOTE", will decrpyt $TARGET to $NOTE against $PUBKEY's private # GPG key. - if [ ! -d "$ROOT_DIR"/tmp ]; then mkdir "$ROOT_DIR"/tmp; fi - TARGET="$TMP_DIR/$RANDOM" - gpg -d "$NOTE" > "$TARGET" + gpg -d "$NOTE" } function create(){ if [ -e "$NOTE" ]; then @@ -133,7 +131,8 @@ fi if [ "$ENCRYPTION" == "TRUE" ]; then cp "$NOTE" "$NOTE".bk - decrypt + if [ ! -d "$ROOT_DIR"/tmp ]; then mkdir "$ROOT_DIR"/tmp; fi + decrypt > "$TMP_DIR/$RANDOM" else TARGET="$NOTE"; fi @@ -146,58 +145,26 @@ if [ "$ENCRYPTION" == "TRUE" ]; then encrypt; if [ -r "$NOTE" ]; then rm "$NOTE".bk; fi fi - - - } function print(){ - if [ "$PRINT" == "TRUE" ]; then - if [ -r "$NOTE" ] || [ -r "${NOTE%.*}" ]; then - if [ -z "$CREATE" ]; then - if [ "$ENCRYPTION" == "TRUE" ]; then - openssl enc -d -aes-256-cbc -in "${NOTE%.*}" -pass pass:"$ENC_KEY" - else - cat "$NOTE" - echo "" >> "$NOTE" - fi + if [ -r "$NOTE" ]; then + if [ -z "$CREATE" ]; then + if [ "$ENCRYPTION" == "TRUE" ]; then + decrypt else - echo "" - echo "ERROR: Note cannot be found." - echo "" - + cat "$NOTE" fi + else + printf "\nERROR: Note cannot be found.\n" fi fi } function list(){ if [ -d "$BASE_DIR"/"$NOTEBOOK" ]; then - printf "\nNotes in %s:\n" "$(basename "$NOTEBOOK")" - - NOTES=( - $(find "$BASE_DIR"/"$NOTEBOOK" -name "*.$EXT" -print0 |\ - sed s:"$BASE_DIR"/"$NOTEBOOK"/: " " :g |\ - sed -e s:".$EXT"::g | tr "/" " ") - ) - let i=0 - for NOTE in "${NOTES[@]}"; do - if [ -d "$BASE_DIR"/"$NOTEBOOK"/"$NOTE" ]; then - if [ "$LAST_SECTION" != "$NOTE" ]; then - printf " Section: %s\n" "$NOTE" - fi - LAST_SECTION="$NOTE" - else - #if [ $(($i % 1)) -eq 0 ]; then - # printf "\n " - #fi - printf " %s\n" "$NOTE" - fi - let i++ + printf "+%s\n" "$NOTEBOOK" + find "$BASE_DIR"/"$NOTEBOOK" -type f | while read NOTE; do + printf " -%s\n" "$(basename $NOTE | cut -d . -f 1)" done - printf "\n" - else - echo "" - echo "ERROR: Notebook $NOTEBOOK does not exist." - echo "" fi } # End Section: Functions diff --git a/src/includes/edit.sns.sh b/src/includes/edit.sns.sh index 64014d6..c260f8d 100644 --- a/src/includes/edit.sns.sh +++ b/src/includes/edit.sns.sh @@ -6,7 +6,8 @@ fi if [ "$ENCRYPTION" == "TRUE" ]; then cp "$NOTE" "$NOTE".bk - decrypt + if [ ! -d "$ROOT_DIR"/tmp ]; then mkdir "$ROOT_DIR"/tmp; fi + decrypt > "$TMP_DIR/$RANDOM" else TARGET="$NOTE"; fi @@ -19,7 +20,4 @@ if [ "$ENCRYPTION" == "TRUE" ]; then encrypt; if [ -r "$NOTE" ]; then rm "$NOTE".bk; fi fi - - - } diff --git a/src/includes/libencryption.sh b/src/includes/libencryption.sh index a6fcec7..265c331 100644 --- a/src/includes/libencryption.sh +++ b/src/includes/libencryption.sh @@ -3,7 +3,7 @@ function encrypt(){ # output file, "$NOTE", will encrypt $TARGET to $NOTE against $PUBKEY's private # GPG key. -gpg -r "$PUBKEY" -o "$NOTE" -e "$TARGET" + gpg -r "$PUBKEY" -o "$NOTE" -e "$TARGET" } @@ -12,7 +12,5 @@ function decrypt(){ # output file, "$NOTE", will decrpyt $TARGET to $NOTE against $PUBKEY's private # GPG key. - if [ ! -d "$ROOT_DIR"/tmp ]; then mkdir "$ROOT_DIR"/tmp; fi - TARGET="$TMP_DIR/$RANDOM" - gpg -d "$NOTE" > "$TARGET" + gpg -d "$NOTE" } diff --git a/src/includes/list.sns.sh b/src/includes/list.sns.sh index 3224a0c..429203c 100644 --- a/src/includes/list.sns.sh +++ b/src/includes/list.sns.sh @@ -1,31 +1,8 @@ function list(){ if [ -d "$BASE_DIR"/"$NOTEBOOK" ]; then - printf "\nNotes in %s:\n" "$(basename "$NOTEBOOK")" - - NOTES=( - $(find "$BASE_DIR"/"$NOTEBOOK" -name "*.$EXT" -print0 |\ - sed s:"$BASE_DIR"/"$NOTEBOOK"/: " " :g |\ - sed -e s:".$EXT"::g | tr "/" " ") - ) - let i=0 - for NOTE in "${NOTES[@]}"; do - if [ -d "$BASE_DIR"/"$NOTEBOOK"/"$NOTE" ]; then - if [ "$LAST_SECTION" != "$NOTE" ]; then - printf " Section: %s\n" "$NOTE" - fi - LAST_SECTION="$NOTE" - else - #if [ $(($i % 1)) -eq 0 ]; then - # printf "\n " - #fi - printf " %s\n" "$NOTE" - fi - let i++ + printf "+%s\n" "$NOTEBOOK" + find "$BASE_DIR"/"$NOTEBOOK" -type f | while read NOTE; do + printf " -%s\n" "$(basename $NOTE | cut -d . -f 1)" done - printf "\n" - else - echo "" - echo "ERROR: Notebook $NOTEBOOK does not exist." - echo "" fi } diff --git a/src/includes/print.sns.sh b/src/includes/print.sns.sh index 6058435..a24cd2b 100644 --- a/src/includes/print.sns.sh +++ b/src/includes/print.sns.sh @@ -1,19 +1,13 @@ function print(){ - if [ "$PRINT" == "TRUE" ]; then - if [ -r "$NOTE" ] || [ -r "${NOTE%.*}" ]; then - if [ -z "$CREATE" ]; then - if [ "$ENCRYPTION" == "TRUE" ]; then - openssl enc -d -aes-256-cbc -in "${NOTE%.*}" -pass pass:"$ENC_KEY" - else - cat "$NOTE" - echo "" >> "$NOTE" - fi + if [ -r "$NOTE" ]; then + if [ -z "$CREATE" ]; then + if [ "$ENCRYPTION" == "TRUE" ]; then + decrypt else - echo "" - echo "ERROR: Note cannot be found." - echo "" - + cat "$NOTE" fi + else + printf "\nERROR: Note cannot be found.\n" fi fi } From 25e5d399d1e9c096deabca98d0c21cda5fd69ce4 Mon Sep 17 00:00:00 2001 From: Jon-William Lewis Date: Mon, 25 Jan 2016 21:20:20 -0600 Subject: [PATCH 4/7] fixed print function and made appropriate changes to other parts of the program; changed version to alpha 8 --- header.sh | 2 +- sns.sh | 20 ++++++++++++-------- src/includes/edit.sns.sh | 3 ++- src/includes/libencryption.sh | 2 +- src/includes/list.sns.sh | 4 ++-- src/main/stage3.sns.sh | 7 +++++-- 6 files changed, 23 insertions(+), 15 deletions(-) diff --git a/header.sh b/header.sh index 7f582a6..7a591c0 100644 --- a/header.sh +++ b/header.sh @@ -1,7 +1,7 @@ #!/bin/bash PROD_STR="Simple Note System" -VER_STR="v2.0a7" +VER_STR="v2.0a8" cat << EOF #!/bin/bash diff --git a/sns.sh b/sns.sh index 7f07f64..33cf6b0 100755 --- a/sns.sh +++ b/sns.sh @@ -1,13 +1,13 @@ #!/bin/bash #========================================================== -# Simple Note System, v2.0a6 +# Simple Note System, v2.0a7 # Copyright 2014, Xenese Labs/Sicron-Perion XNF #========================================================== if [ -z "$HOME" ]; then HOME=/home/"$(whoami)"; fi PROD_STR="Simple Note System" -readonly VER_STR="v2.0a6" +readonly VER_STR="v2.0a7" readonly ROOT_DIR="$HOME"/.config/xenlabs/sns readonly BASE_DIR="$ROOT_DIR"/notes readonly TMP_DIR="$ROOT_DIR"/tmp @@ -84,7 +84,7 @@ function decrypt(){ # This function, given a recipient, $PUBKEY; a file to decrypt, $TARGET; and an # output file, "$NOTE", will decrpyt $TARGET to $NOTE against $PUBKEY's private # GPG key. - + echo "$NOTE"; pause gpg -d "$NOTE" } function create(){ @@ -132,7 +132,8 @@ fi if [ "$ENCRYPTION" == "TRUE" ]; then cp "$NOTE" "$NOTE".bk if [ ! -d "$ROOT_DIR"/tmp ]; then mkdir "$ROOT_DIR"/tmp; fi - decrypt > "$TMP_DIR/$RANDOM" + TARGET="$TMP_DIR/$SESSION_ID" + decrypt > "$TARGET" else TARGET="$NOTE"; fi @@ -162,8 +163,8 @@ function print(){ function list(){ if [ -d "$BASE_DIR"/"$NOTEBOOK" ]; then printf "+%s\n" "$NOTEBOOK" - find "$BASE_DIR"/"$NOTEBOOK" -type f | while read NOTE; do - printf " -%s\n" "$(basename $NOTE | cut -d . -f 1)" + find "$BASE_DIR"/"$NOTEBOOK" -type f | while read -r NOTE; do + printf " -%s\n" "$(basename \"$NOTE\" | cut -d . -f 1 )" done fi } @@ -288,9 +289,12 @@ fi SESSION_ID="$RANDOM" NOTE_DIR="$BASE_DIR"/"$NOTEBOOK"/"$SECTION"/ -NOTE="$NOTE_DIR""$NAME"."$EXT" -if [ "$ENCRYPTION" == "TRUE" ]; then NOTE="$NOTE".gpg; fi + +if [ "$ENCRYPTION" == "TRUE" ]; then readonly NOTE="$NOTE_DIR""$NAME"."$EXT".gpg +else readonly NOTE="$NOTE_DIR""$NAME"."$EXT" +fi + if [ "$PRINT" == "TRUE" ]; then print; exit 0; fi if [ "$DELETE" == "TRUE" ]; then delete; exit 0; fi if [ "$CREATE" == "TRUE" ]; then create; fi diff --git a/src/includes/edit.sns.sh b/src/includes/edit.sns.sh index c260f8d..cc5e15f 100644 --- a/src/includes/edit.sns.sh +++ b/src/includes/edit.sns.sh @@ -7,7 +7,8 @@ fi if [ "$ENCRYPTION" == "TRUE" ]; then cp "$NOTE" "$NOTE".bk if [ ! -d "$ROOT_DIR"/tmp ]; then mkdir "$ROOT_DIR"/tmp; fi - decrypt > "$TMP_DIR/$RANDOM" + TARGET="$TMP_DIR/$SESSION_ID" + decrypt > "$TARGET" else TARGET="$NOTE"; fi diff --git a/src/includes/libencryption.sh b/src/includes/libencryption.sh index 265c331..d87fb52 100644 --- a/src/includes/libencryption.sh +++ b/src/includes/libencryption.sh @@ -11,6 +11,6 @@ function decrypt(){ # This function, given a recipient, $PUBKEY; a file to decrypt, $TARGET; and an # output file, "$NOTE", will decrpyt $TARGET to $NOTE against $PUBKEY's private # GPG key. - + echo "$NOTE"; pause gpg -d "$NOTE" } diff --git a/src/includes/list.sns.sh b/src/includes/list.sns.sh index 429203c..e4c75da 100644 --- a/src/includes/list.sns.sh +++ b/src/includes/list.sns.sh @@ -1,8 +1,8 @@ function list(){ if [ -d "$BASE_DIR"/"$NOTEBOOK" ]; then printf "+%s\n" "$NOTEBOOK" - find "$BASE_DIR"/"$NOTEBOOK" -type f | while read NOTE; do - printf " -%s\n" "$(basename $NOTE | cut -d . -f 1)" + find "$BASE_DIR"/"$NOTEBOOK" -type f | while read -r NOTE; do + printf " -%s\n" "$(basename \"$NOTE\" | cut -d . -f 1 )" done fi } diff --git a/src/main/stage3.sns.sh b/src/main/stage3.sns.sh index 1686c7b..d9a046b 100644 --- a/src/main/stage3.sns.sh +++ b/src/main/stage3.sns.sh @@ -23,9 +23,12 @@ fi SESSION_ID="$RANDOM" NOTE_DIR="$BASE_DIR"/"$NOTEBOOK"/"$SECTION"/ -NOTE="$NOTE_DIR""$NAME"."$EXT" -if [ "$ENCRYPTION" == "TRUE" ]; then NOTE="$NOTE".gpg; fi + +if [ "$ENCRYPTION" == "TRUE" ]; then readonly NOTE="$NOTE_DIR""$NAME"."$EXT".gpg +else readonly NOTE="$NOTE_DIR""$NAME"."$EXT" +fi + if [ "$PRINT" == "TRUE" ]; then print; exit 0; fi if [ "$DELETE" == "TRUE" ]; then delete; exit 0; fi if [ "$CREATE" == "TRUE" ]; then create; fi From 238934c979cf571921266ae91d8cc9399acb275f Mon Sep 17 00:00:00 2001 From: Jon-William Lewis Date: Mon, 25 Jan 2016 21:21:49 -0600 Subject: [PATCH 5/7] fixed init function to reflect version change --- src/includes/create_sns_root.sns.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/includes/create_sns_root.sns.sh b/src/includes/create_sns_root.sns.sh index 5e1b5ad..81cfb01 100644 --- a/src/includes/create_sns_root.sns.sh +++ b/src/includes/create_sns_root.sns.sh @@ -6,7 +6,7 @@ if [ ! -d "$TMP_DIR" ]; then mkdir -p "$TMP_DIR" ; fi cat > "$CONFIG_FILE" << EOF #========================================================== -# Simple Note System Config, v2.0a5 +# Simple Note System Config, v2.0a8 # Copyright 2014, Xenese Labs/Sicron-Perion XNF #========================================================== From 77c3398c5f64024608c5eaef8a78bb629af6d3d2 Mon Sep 17 00:00:00 2001 From: Jon-William Lewis Date: Mon, 25 Jan 2016 23:41:41 -0600 Subject: [PATCH 6/7] Corrected issues arising from "$BASE_DIR" vs "$ROOT_DIR" --- header.sh | 2 +- sns.sh | 43 +++++++++++++++++------------------ src/includes/create.sns.sh | 4 ++-- src/includes/edit.sns.sh | 10 ++++---- src/includes/libencryption.sh | 11 ++++----- src/includes/list.sns.sh | 4 ++-- src/main/stage1.sns.sh | 4 ++-- src/main/stage3.sns.sh | 2 +- 8 files changed, 39 insertions(+), 41 deletions(-) diff --git a/header.sh b/header.sh index 7a591c0..6ba4564 100644 --- a/header.sh +++ b/header.sh @@ -15,7 +15,7 @@ if [ -z "\$HOME" ]; then HOME=/home/"\$(whoami)"; fi PROD_STR="$PROD_STR" readonly VER_STR="$VER_STR" readonly ROOT_DIR="\$HOME"/.config/xenlabs/sns -readonly BASE_DIR="\$ROOT_DIR"/notes +readonly NOTES_DIR="\$ROOT_DIR"/notes readonly TMP_DIR="\$ROOT_DIR"/tmp readonly CONFIG_FILE="\$ROOT_DIR/sns.conf" diff --git a/sns.sh b/sns.sh index 33cf6b0..4bbfa8c 100755 --- a/sns.sh +++ b/sns.sh @@ -1,15 +1,15 @@ #!/bin/bash #========================================================== -# Simple Note System, v2.0a7 +# Simple Note System, v2.0a8 # Copyright 2014, Xenese Labs/Sicron-Perion XNF #========================================================== if [ -z "$HOME" ]; then HOME=/home/"$(whoami)"; fi PROD_STR="Simple Note System" -readonly VER_STR="v2.0a7" +readonly VER_STR="v2.0a8" readonly ROOT_DIR="$HOME"/.config/xenlabs/sns -readonly BASE_DIR="$ROOT_DIR"/notes +readonly NOTES_DIR="$ROOT_DIR"/notes readonly TMP_DIR="$ROOT_DIR"/tmp readonly CONFIG_FILE="$ROOT_DIR/sns.conf" @@ -23,7 +23,7 @@ if [ ! -d "$TMP_DIR" ]; then mkdir -p "$TMP_DIR" ; fi cat > "$CONFIG_FILE" << EOF #========================================================== -# Simple Note System Config, v2.0a5 +# Simple Note System Config, v2.0a8 # Copyright 2014, Xenese Labs/Sicron-Perion XNF #========================================================== @@ -72,19 +72,18 @@ function p_header(){ printf "TITLE: %s\nDATE: %s\n" "$NAME" "$(date)" } function encrypt(){ -# This function, given a recipient, $PUBKEY; a file to encrypt, $TARGET; and an -# output file, "$NOTE", will encrypt $TARGET to $NOTE against $PUBKEY's private +# This function, given a recipient, $PUBKEY; a file to encrypt, $TMP_NOTE; and an +# output file, "$NOTE", will encrypt $TMP_NOTE to $NOTE against $PUBKEY's private # GPG key. - gpg -r "$PUBKEY" -o "$NOTE" -e "$TARGET" + gpg -r "$PUBKEY" -o "$NOTE" -e "$TMP_NOTE" } function decrypt(){ -# This function, given a recipient, $PUBKEY; a file to decrypt, $TARGET; and an -# output file, "$NOTE", will decrpyt $TARGET to $NOTE against $PUBKEY's private +# This function, given a recipient, $PUBKEY; a file to decrypt, $TMP_NOTE; and an +# output file, "$NOTE", will decrpyt $TMP_NOTE to $NOTE against $PUBKEY's private # GPG key. - echo "$NOTE"; pause gpg -d "$NOTE" } function create(){ @@ -99,8 +98,8 @@ function create(){ echo "TITLE: $NAME" > "$NOTE" echo "DATE: $(date)" >> "$NOTE" elif [ "$ENCRYPTION" == "TRUE" ]; then - TARGET="$TMP_DIR"/"$SESSION_ID" - p_header > "$TARGET" + TMP_NOTE="$TMP_DIR"/"$SESSION_ID" + p_header > "$TMP_NOTE" encrypt fi @@ -132,14 +131,14 @@ fi if [ "$ENCRYPTION" == "TRUE" ]; then cp "$NOTE" "$NOTE".bk if [ ! -d "$ROOT_DIR"/tmp ]; then mkdir "$ROOT_DIR"/tmp; fi - TARGET="$TMP_DIR/$SESSION_ID" - decrypt > "$TARGET" -else TARGET="$NOTE"; fi + TMP_NOTE="$TMP_DIR/$SESSION_ID" + decrypt > "$TMP_NOTE" +else TMP_NOTE="$NOTE"; fi -if [ -z "$CREATE" ]; then printf "\nEDIT %s" "$(date)" >> "$TARGET"; fi +if [ -z "$CREATE" ]; then printf "\nEDIT %s" "$(date)" >> "$TMP_NOTE"; fi -"$EDITOR" "$TARGET" +"$EDITOR" "$TMP_NOTE" if [ "$ENCRYPTION" == "TRUE" ]; then rm "$NOTE" @@ -161,9 +160,9 @@ function print(){ fi } function list(){ - if [ -d "$BASE_DIR"/"$NOTEBOOK" ]; then + if [ -d "$NOTES_DIR"/"$NOTEBOOK" ]; then printf "+%s\n" "$NOTEBOOK" - find "$BASE_DIR"/"$NOTEBOOK" -type f | while read -r NOTE; do + find "$NOTES_DIR"/"$NOTEBOOK" -type f | while read -r NOTE; do printf " -%s\n" "$(basename \"$NOTE\" | cut -d . -f 1 )" done fi @@ -201,8 +200,8 @@ fi if [ "$ENCRYPTION" == "TRUE" ]; then PROD_STR="Simple Note System (Encryption Enabled)" - if [ ! -d "$BASE_DIR"/tmp ]; then - mkdir -p "$BASE_DIR"/tmp + if [ ! -d "$ROOT_DIR"/tmp ]; then + mkdir -p "$ROOT_DIR"/tmp fi fi @@ -288,7 +287,7 @@ if [ -z "$NAME" ]; then fi SESSION_ID="$RANDOM" -NOTE_DIR="$BASE_DIR"/"$NOTEBOOK"/"$SECTION"/ +NOTE_DIR="$NOTES_DIR"/"$NOTEBOOK"/"$SECTION"/ if [ "$ENCRYPTION" == "TRUE" ]; then readonly NOTE="$NOTE_DIR""$NAME"."$EXT".gpg diff --git a/src/includes/create.sns.sh b/src/includes/create.sns.sh index 403eae1..54de245 100644 --- a/src/includes/create.sns.sh +++ b/src/includes/create.sns.sh @@ -10,8 +10,8 @@ function create(){ echo "TITLE: $NAME" > "$NOTE" echo "DATE: $(date)" >> "$NOTE" elif [ "$ENCRYPTION" == "TRUE" ]; then - TARGET="$TMP_DIR"/"$SESSION_ID" - p_header > "$TARGET" + TMP_NOTE="$TMP_DIR"/"$SESSION_ID" + p_header > "$TMP_NOTE" encrypt fi diff --git a/src/includes/edit.sns.sh b/src/includes/edit.sns.sh index cc5e15f..e63c412 100644 --- a/src/includes/edit.sns.sh +++ b/src/includes/edit.sns.sh @@ -7,14 +7,14 @@ fi if [ "$ENCRYPTION" == "TRUE" ]; then cp "$NOTE" "$NOTE".bk if [ ! -d "$ROOT_DIR"/tmp ]; then mkdir "$ROOT_DIR"/tmp; fi - TARGET="$TMP_DIR/$SESSION_ID" - decrypt > "$TARGET" -else TARGET="$NOTE"; fi + TMP_NOTE="$TMP_DIR/$SESSION_ID" + decrypt > "$TMP_NOTE" +else TMP_NOTE="$NOTE"; fi -if [ -z "$CREATE" ]; then printf "\nEDIT %s" "$(date)" >> "$TARGET"; fi +if [ -z "$CREATE" ]; then printf "\nEDIT %s" "$(date)" >> "$TMP_NOTE"; fi -"$EDITOR" "$TARGET" +"$EDITOR" "$TMP_NOTE" if [ "$ENCRYPTION" == "TRUE" ]; then rm "$NOTE" diff --git a/src/includes/libencryption.sh b/src/includes/libencryption.sh index d87fb52..71b1181 100644 --- a/src/includes/libencryption.sh +++ b/src/includes/libencryption.sh @@ -1,16 +1,15 @@ function encrypt(){ -# This function, given a recipient, $PUBKEY; a file to encrypt, $TARGET; and an -# output file, "$NOTE", will encrypt $TARGET to $NOTE against $PUBKEY's private +# This function, given a recipient, $PUBKEY; a file to encrypt, $TMP_NOTE; and an +# output file, "$NOTE", will encrypt $TMP_NOTE to $NOTE against $PUBKEY's private # GPG key. - gpg -r "$PUBKEY" -o "$NOTE" -e "$TARGET" + gpg -r "$PUBKEY" -o "$NOTE" -e "$TMP_NOTE" } function decrypt(){ -# This function, given a recipient, $PUBKEY; a file to decrypt, $TARGET; and an -# output file, "$NOTE", will decrpyt $TARGET to $NOTE against $PUBKEY's private +# This function, given a recipient, $PUBKEY; a file to decrypt, $TMP_NOTE; and an +# output file, "$NOTE", will decrpyt $TMP_NOTE to $NOTE against $PUBKEY's private # GPG key. - echo "$NOTE"; pause gpg -d "$NOTE" } diff --git a/src/includes/list.sns.sh b/src/includes/list.sns.sh index e4c75da..d65d4f7 100644 --- a/src/includes/list.sns.sh +++ b/src/includes/list.sns.sh @@ -1,7 +1,7 @@ function list(){ - if [ -d "$BASE_DIR"/"$NOTEBOOK" ]; then + if [ -d "$NOTES_DIR"/"$NOTEBOOK" ]; then printf "+%s\n" "$NOTEBOOK" - find "$BASE_DIR"/"$NOTEBOOK" -type f | while read -r NOTE; do + find "$NOTES_DIR"/"$NOTEBOOK" -type f | while read -r NOTE; do printf " -%s\n" "$(basename \"$NOTE\" | cut -d . -f 1 )" done fi diff --git a/src/main/stage1.sns.sh b/src/main/stage1.sns.sh index 4cb45f7..af57da1 100644 --- a/src/main/stage1.sns.sh +++ b/src/main/stage1.sns.sh @@ -20,8 +20,8 @@ fi if [ "$ENCRYPTION" == "TRUE" ]; then PROD_STR="Simple Note System (Encryption Enabled)" - if [ ! -d "$BASE_DIR"/tmp ]; then - mkdir -p "$BASE_DIR"/tmp + if [ ! -d "$ROOT_DIR"/tmp ]; then + mkdir -p "$ROOT_DIR"/tmp fi fi diff --git a/src/main/stage3.sns.sh b/src/main/stage3.sns.sh index d9a046b..da7f738 100644 --- a/src/main/stage3.sns.sh +++ b/src/main/stage3.sns.sh @@ -22,7 +22,7 @@ if [ -z "$NAME" ]; then fi SESSION_ID="$RANDOM" -NOTE_DIR="$BASE_DIR"/"$NOTEBOOK"/"$SECTION"/ +NOTE_DIR="$NOTES_DIR"/"$NOTEBOOK"/"$SECTION"/ if [ "$ENCRYPTION" == "TRUE" ]; then readonly NOTE="$NOTE_DIR""$NAME"."$EXT".gpg From e50e9464af083cd150d3e8fa0319f676586c5d80 Mon Sep 17 00:00:00 2001 From: Jon-William Lewis Date: Tue, 9 Feb 2016 20:36:44 -0600 Subject: [PATCH 7/7] Making sure all progress was committed --- .DS_Store | Bin 0 -> 6148 bytes nul | 0 null | 0 .../UserInterfaceState.xcuserstate | Bin 0 -> 14273 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 .DS_Store create mode 100644 nul create mode 100644 null create mode 100644 sns.xcodeproj/project.xcworkspace/xcuserdata/xilmwa.xcuserdatad/UserInterfaceState.xcuserstate diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..c9e58434546dd724b3fb2231c5e8379282892f4c GIT binary patch literal 6148 zcmeHK%}&BV5dNkR1&s+uk3D)K;SDM&CLX-t-6%za1g(LPcwzsO zw_GJ#hKw7GF-EvViW_1dFPPTbkgpxa5qtCMdKA{+w)W_5C-9W}{0>^m;$E2!4%-0t=2j9Xweif z1x$fb0sTJ2bj2iK;n96M7~Bzn*k-Xa-s>-;a^iqVz``Tn(8N=To+{ypA)e0iIOHV( z3y+=-35O2}ElW6|h-;no$1WX`c(iB=m;!YLTK=)8`~T?o^M9RWPo{t=@UIk*c6yr* zIi#?+HU_7AZA`zXt7%^0v83?EZN<#ht@xbojODT35R-s~N0!j+N5IKo!4x>C0zV#> BamN4v literal 0 HcmV?d00001 diff --git a/nul b/nul new file mode 100644 index 0000000..e69de29 diff --git a/null b/null new file mode 100644 index 0000000..e69de29 diff --git a/sns.xcodeproj/project.xcworkspace/xcuserdata/xilmwa.xcuserdatad/UserInterfaceState.xcuserstate b/sns.xcodeproj/project.xcworkspace/xcuserdata/xilmwa.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..5bc316e6f5cc09a715182b63729e258a30610a44 GIT binary patch literal 14273 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 C%|BiM literal 0 HcmV?d00001