Browse Source

feat(transfer): allow encryption of uploads using GPG (#9983)

Co-authored-by: Marc Cornellà <hello@mcornella.com>
Luiz 2 years ago
parent
commit
3bb23e8e31
2 changed files with 110 additions and 65 deletions
  1. 28 11
      plugins/transfer/README.md
  2. 82 54
      plugins/transfer/transfer.plugin.zsh

+ 28 - 11
plugins/transfer/README.md

@@ -2,23 +2,40 @@
 
 [`transfer.sh`](https://transfer.sh) is an easy to use file sharing service from the command line
 
-## Usage
+To use it, add `transfer` to the plugins array in your zshrc file:
 
-Add `transfer` to your plugins array in your zshrc file:
 ```zsh
 plugins=(... transfer)
 ```
 
-Then you can:
+## Usage
 
-- transfer a file:
+- Transfer a file: `transfer file.txt`.
 
-```zsh
-transfer file.txt
-```
+- Transfer a whole directory (it will be automatically compressed): `transfer dir`.
 
-- transfer a whole directory (it will be automatically compressed):
+### Encryption / Decryption
 
-```zsh
-transfer directory/
-```
+- Encrypt and upload a file with symmetric cipher and create ASCII armored output:
+
+  ```zsh
+  transfer file -ca
+  ```
+
+- Encrypt and upload directory with symmetric cipher and gpg output:
+
+  ```zsh
+  transfer directory -ca
+  ```
+
+- Decrypt file:
+
+  ```zsh
+  gpg -d file -ca
+  ```
+
+- Decrypt directory:
+
+  ```zsh
+  gpg -d your_archive.tgz.gpg | tar xz
+  ```

+ 82 - 54
plugins/transfer/transfer.plugin.zsh

@@ -1,69 +1,97 @@
-# transfer.sh Easy file sharing from the command line
-# transfer Plugin
-# Usage Example :
-# > transfer file.txt
-# > transfer directory/
-
-
-
 # Author:
 #   Remco Verhoef <remco@dutchcoders.io>
 #   https://gist.github.com/nl5887/a511f172d3fb3cd0e42d
 #   Modified to use tar command instead of zip
 #
 
-curl --version 2>&1 > /dev/null
-if [ $? -ne 0 ]; then
-  echo "Could not find curl."
+transfer() {
+  # check arguments
+  if [[ $# -eq 0 ]]; then
+  cat <<EOF
+Error: no arguments specified.
+
+Usage: transfer [file/folder] [options]
+
+Examples:
+  transfer /tmp/test.md
+  transfer /tmp/test.md -ca
+  cat /tmp/test.md | transfer test.md
+  cat /tmp/test.md | transfer test.md -ca
+
+Options:
+  -ca  Encrypt file with symmetric cipher and create ASCII armored output
+EOF
   return 1
-fi
+  fi
 
-transfer() { 
-    # check arguments
-    if [ $# -eq 0 ]; 
-    then 
-        echo "No arguments specified. Usage:\necho transfer /tmp/test.md\ncat /tmp/test.md | transfer test.md"
-        return 1
+  if (( ! $+commands[curl] )); then
+    echo "Error: curl is not installed"
+    return 1
+  fi
+
+  local tmpfile tarfile item basename
+
+  # get temporarily filename, output is written to this file show progress can be showed
+  tmpfile=$(mktemp -t transferXXX)
+
+  # upload stdin or file
+  item="$1"
+
+  # crypt file with symmetric cipher and create ASCII armored output
+  local crypt=0
+  if [[ "$2" = -ca ]]; then
+    crypt=1
+    if (( ! $+commands[gpg] )); then
+      echo "Error: gpg is not installed"
+      return 1
+    fi
+  fi
+
+  if ! tty -s; then
+    # transfer from pipe
+    if (( crypt )); then
+      gpg -aco - | curl -X PUT --progress-bar -T - "https://transfer.sh/$item" >> $tmpfile
+    else
+      curl --progress-bar --upload-file - "https://transfer.sh/$item" >> $tmpfile
     fi
+  else
+    basename=$(basename "$item" | sed -e 's/[^a-zA-Z0-9._-]/-/g')
 
-    # get temporarily filename, output is written to this file show progress can be showed
-    tmpfile=$( mktemp -t transferXXX )
-    
-    # upload stdin or file
-    file=$1
+    if [[ ! -e $item ]]; then
+      echo "File $item doesn't exist."
+      return 1
+    fi
 
-    if tty -s; 
-    then 
-        basefile=$(basename "$file" | sed -e 's/[^a-zA-Z0-9._-]/-/g') 
+    if [[ -d $item ]]; then
+      # tar directory and transfer
+      tarfile=$(mktemp -t transferXXX.tar.gz)
+      cd $(dirname $item) || {
+        echo "Error: Could not change to directory $(dirname $item)"
+        return 1
+      }
 
-        if [ ! -e $file ];
-        then
-            echo "File $file doesn't exists."
-            return 1
-        fi
-        
-        if [ -d $file ];
-        then
-            echo $file
-            # tar directory and transfer
-            tarfile=$( mktemp -t transferXXX.tar.gz )
-            cd $(dirname $file) && tar -czf $tarfile $(basename $file)
-            curl --progress-bar --upload-file "$tarfile" "https://transfer.sh/$basefile.tar.gz" >> $tmpfile
-            rm -f $tarfile
-        else
-            # transfer file
-            curl --progress-bar --upload-file "$file" "https://transfer.sh/$basefile" >> $tmpfile
-        fi
-    else 
-        # transfer pipe
-        curl --progress-bar --upload-file "-" "https://transfer.sh/$file" >> $tmpfile
+      tar -czf $tarfile $(basename $item)
+      if (( crypt )); then
+        gpg -cao - "$tarfile" | curl --progress-bar -T "-" "https://transfer.sh/$basename.tar.gz.gpg" >> $tmpfile
+      else
+        curl --progress-bar --upload-file "$tarfile" "https://transfer.sh/$basename.tar.gz" >> $tmpfile
+      fi
+      rm -f $tarfile
+    else
+      # transfer file
+      if (( crypt )); then
+        gpg -cao - "$item" | curl --progress-bar -T "-" "https://transfer.sh/$basename.gpg" >> $tmpfile
+      else
+        curl --progress-bar --upload-file "$item" "https://transfer.sh/$basename" >> $tmpfile
+      fi
     fi
-   
-    # cat output link
-    cat $tmpfile
-    # add newline
-    echo
+  fi
+
+  # cat output link
+  cat $tmpfile
+  # add newline
+  echo
 
-    # cleanup
-    rm -f $tmpfile
+  # cleanup
+  rm -f $tmpfile
 }