From 2d993e2ad6000db81a08a60fbe3e7e7215a5f8d3 Mon Sep 17 00:00:00 2001 From: MachinePainting Date: Thu, 29 Jan 2026 03:37:37 -0800 Subject: [PATCH] updated to universal drop/drive node --- scripts/decrypt_folder.py | 237 ++++++++++++++++++++++++++ scripts/linux/decrypt_folder_linux.sh | 162 ++++++++++++++++++ scripts/linux/encrypt_folder_linux.sh | 147 ++++++++++++++++ scripts/mac/decrypt_folder_mac.sh | 163 ++++++++++++++++++ scripts/mac/encrypt_folder_mac.sh | 152 +++++++++++++++++ scripts/win/decrypt_folder_win.py | 156 +++++++++++++++++ scripts/win/encrypt_folder_win.py | 132 ++++++++++++++ 7 files changed, 1149 insertions(+) create mode 100644 scripts/decrypt_folder.py create mode 100644 scripts/linux/decrypt_folder_linux.sh create mode 100644 scripts/linux/encrypt_folder_linux.sh create mode 100644 scripts/mac/decrypt_folder_mac.sh create mode 100644 scripts/mac/encrypt_folder_mac.sh create mode 100644 scripts/win/decrypt_folder_win.py create mode 100644 scripts/win/encrypt_folder_win.py diff --git a/scripts/decrypt_folder.py b/scripts/decrypt_folder.py new file mode 100644 index 0000000..78c495d --- /dev/null +++ b/scripts/decrypt_folder.py @@ -0,0 +1,237 @@ +#!/usr/bin/env python3 +""" +ComfyUI Encryption Scripts - Cross-Platform Decryption +Works with both DropSend and DriveSend nodes +Compatible with macOS, Windows, and Linux + +============================================================ +LOCAL USE ONLY - Run this on your local machine to decrypt +.enc files downloaded/synced from Dropbox or Google Drive. +Do not run on cloud instances (RunPod, etc.) +============================================================ + +Key retrieval methods (checked in order): + - COMFYUI_ENCRYPTION_KEY environment variable + - comfyui_encryption_key environment variable + - DROPSEND_ENCRYPTION_KEY environment variable + - DRIVESEND_ENCRYPTION_KEY environment variable + - macOS Keychain (ComfyUI_Encryption_Key, DropSend_Encryption_Key, or DriveSend_Encryption_Key) + - Linux Secret Service (ComfyUI, DropSend, or DriveSend) + - Manual input +""" + +import os +import sys +import platform +import shutil + +try: + from cryptography.fernet import Fernet +except ImportError: + print("Error: cryptography library not installed.") + print("Run: pip install cryptography") + sys.exit(1) + + +def get_key_from_macos_keychain(): + """Try to retrieve the key from macOS Keychain.""" + try: + import subprocess + # Try multiple keychain item names for compatibility + for service, account in [ + ('ComfyUI_Encryption_Key', 'ComfyUI'), + ('DropSend_Encryption_Key', 'DropSend'), + ('DriveSend_Encryption_Key', 'DriveSend') + ]: + result = subprocess.run( + ['security', 'find-generic-password', '-s', service, '-a', account, '-w'], + capture_output=True, text=True + ) + if result.returncode == 0 and result.stdout.strip(): + return result.stdout.strip() + except Exception: + pass + return None + + +def get_key_from_linux_secret_service(): + """Try to retrieve the key from Linux Secret Service.""" + try: + import subprocess + # Try multiple service names for compatibility + for service, username in [ + ('ComfyUI', 'ComfyUI'), + ('DropSend', 'DropSend'), + ('DriveSend', 'DriveSend') + ]: + result = subprocess.run( + ['secret-tool', 'lookup', 'service', service, 'username', username], + capture_output=True, text=True + ) + if result.returncode == 0 and result.stdout.strip(): + return result.stdout.strip() + except Exception: + pass + return None + + +def get_encryption_key(): + """Get encryption key from environment, platform credential store, or user input.""" + system = platform.system() + + # Try multiple environment variable names for compatibility + key = (os.environ.get('COMFYUI_ENCRYPTION_KEY') or + os.environ.get('comfyui_encryption_key') or + os.environ.get('DROPSEND_ENCRYPTION_KEY') or + os.environ.get('DRIVESEND_ENCRYPTION_KEY')) + + if key: + print("Using key from environment variable.") + return key + + # Try platform-specific credential storage + if system == 'Darwin': # macOS + key = get_key_from_macos_keychain() + if key: + print("Using key from macOS Keychain.") + return key + elif system == 'Linux': + key = get_key_from_linux_secret_service() + if key: + print("Using key from Secret Service.") + return key + + # Prompt user + print("") + print("Encryption key not found automatically.") + print("") + print("To set up automatic key retrieval:") + if system == 'Darwin': + print(" - Store in Keychain: Keychain Access > File > New Password Item") + print(" Item Name: ComfyUI_Encryption_Key, Account: ComfyUI") + elif system == 'Windows': + print(" - Set environment variable COMFYUI_ENCRYPTION_KEY") + print(" (Win+R > sysdm.cpl > Advanced > Environment Variables)") + elif system == 'Linux': + print(" - Set environment variable: export COMFYUI_ENCRYPTION_KEY=\"your_key\"") + print(" - Or use secret-tool: echo -n \"key\" | secret-tool store --label=\"ComfyUI\" service ComfyUI username ComfyUI") + print("") + + key = input("Enter your encryption key: ").strip() + + if not key: + print("Error: No key provided.") + sys.exit(1) + + return key + + +def decrypt_file(encrypted_path, output_path, fernet): + """Decrypt a single file.""" + try: + with open(encrypted_path, 'rb') as enc_file: + encrypted_data = enc_file.read() + decrypted_data = fernet.decrypt(encrypted_data) + with open(output_path, 'wb') as dec_file: + dec_file.write(decrypted_data) + return True + except Exception as e: + print(f" X Error decrypting {os.path.basename(encrypted_path)}: {e}") + return False + + +def main(): + system = platform.system() + print(f"=== ComfyUI File Decryption ({system}) ===") + print("") + print("Decrypts .enc files to restore original images/videos.") + print("Works with both DropSend and DriveSend nodes.") + print("") + + # Get folder path + folder = input("Enter the folder path containing .enc files: ").strip() + folder = folder.strip('"\'') + folder = folder.replace('\\ ', ' ') + + if not folder or not os.path.isdir(folder): + print(f"Error: '{folder}' is not a valid directory.") + sys.exit(1) + + print(f"Processing folder: {folder}") + print("") + + # Recursive option + recursive_input = input("Decrypt files recursively (including subfolders)? (Y/N): ").strip().upper() + recursive = recursive_input == 'Y' + + # Get encryption key + print("") + key = get_encryption_key() + + try: + fernet = Fernet(key.encode()) + except Exception as e: + print(f"Error: Invalid encryption key format: {e}") + sys.exit(1) + + print("") + print("Scanning for .enc files...") + + # Find all .enc files + enc_files = [] + if recursive: + for root, _, files in os.walk(folder): + for file in files: + if file.endswith('.enc'): + enc_files.append(os.path.join(root, file)) + else: + for file in os.listdir(folder): + if file.endswith('.enc'): + enc_files.append(os.path.join(folder, file)) + + if not enc_files: + print("No .enc files found in the specified location.") + sys.exit(0) + + print(f"Found {len(enc_files)} .enc file(s) to decrypt.") + print("") + + success_count = 0 + error_count = 0 + + for enc_path in enc_files: + out_path = enc_path[:-4] # Remove .enc + + if decrypt_file(enc_path, out_path, fernet): + print(f" + Decrypted: {os.path.basename(out_path)}") + success_count += 1 + else: + error_count += 1 + + print("") + print(f"Decryption complete: {success_count} successful, {error_count} failed") + print("") + + # Offer to move .enc files + move_input = input("Move all .enc files to a separate folder? (Y/N): ").strip().upper() + if move_input == 'Y': + enc_folder = os.path.join(folder, "_encrypted_originals") + os.makedirs(enc_folder, exist_ok=True) + moved_count = 0 + + for enc_path in enc_files: + if os.path.exists(enc_path): + dest = os.path.join(enc_folder, os.path.basename(enc_path)) + shutil.move(enc_path, dest) + moved_count += 1 + + print(f"Moved {moved_count} .enc file(s) to: {enc_folder}") + else: + print("Leaving .enc files in place.") + + print("") + print("Done!") + + +if __name__ == "__main__": + main() diff --git a/scripts/linux/decrypt_folder_linux.sh b/scripts/linux/decrypt_folder_linux.sh new file mode 100644 index 0000000..16f66a4 --- /dev/null +++ b/scripts/linux/decrypt_folder_linux.sh @@ -0,0 +1,162 @@ +#!/bin/bash + +# ComfyUI Encryption Scripts - Decryption (Linux) +# Works with both DropSend and DriveSend nodes +# Decrypts .enc files using a key from environment variable or Secret Service + +echo "=== ComfyUI File Decryption (Linux) ===" +echo "" +echo "Enter the folder path containing .enc files:" + +read -r FOLDER +FOLDER=$(echo "$FOLDER" | sed "s/^['\"]//;s/['\"]$//") + +if [ -z "$FOLDER" ] || [ ! -d "$FOLDER" ]; then + echo "Error: '$FOLDER' is not a valid directory." + exit 1 +fi + +echo "Processing folder: $FOLDER" +echo "" + +echo "Would you like to decrypt files recursively (including subfolders)? (Y/N)" +read -r RECURSIVE_RESPONSE +if [[ "$RECURSIVE_RESPONSE" == "Y" || "$RECURSIVE_RESPONSE" == "y" ]]; then + RECURSIVE="true" +else + RECURSIVE="false" +fi + +echo "" +echo "Retrieving encryption key..." + +# Try multiple environment variable names for compatibility +KEY="${COMFYUI_ENCRYPTION_KEY:-}" +[ -z "$KEY" ] && KEY="${comfyui_encryption_key:-}" +[ -z "$KEY" ] && KEY="${DROPSEND_ENCRYPTION_KEY:-}" +[ -z "$KEY" ] && KEY="${DRIVESEND_ENCRYPTION_KEY:-}" + +# Try Secret Service with multiple names +if [ -z "$KEY" ] && command -v secret-tool &> /dev/null; then + KEY=$(secret-tool lookup service ComfyUI username ComfyUI 2>/dev/null) + [ -z "$KEY" ] && KEY=$(secret-tool lookup service DropSend username DropSend 2>/dev/null) + [ -z "$KEY" ] && KEY=$(secret-tool lookup service DriveSend username DriveSend 2>/dev/null) + if [ -n "$KEY" ]; then + echo "Using key from Secret Service." + fi +fi + +if [ -z "$KEY" ]; then + echo "" + echo "Encryption key not found in environment or Secret Service." + echo "" + echo "To set up automatic key retrieval, either:" + echo " 1. Set environment variable: export COMFYUI_ENCRYPTION_KEY=\"your_key\"" + echo " 2. Store with secret-tool: echo -n \"your_key\" | secret-tool store --label=\"ComfyUI\" service ComfyUI username ComfyUI" + echo "" + echo -n "Enter your encryption key: " + read -r KEY + + if [ -z "$KEY" ]; then + echo "Error: No key provided." + exit 1 + fi +else + echo "Key retrieved successfully." +fi + +echo "" + +python3 - < /dev/null; then + KEY=$(secret-tool lookup service ComfyUI username ComfyUI 2>/dev/null) + [ -z "$KEY" ] && KEY=$(secret-tool lookup service DropSend username DropSend 2>/dev/null) + [ -z "$KEY" ] && KEY=$(secret-tool lookup service DriveSend username DriveSend 2>/dev/null) + if [ -n "$KEY" ]; then + echo "Using key from Secret Service." + fi +fi + +if [ -z "$KEY" ]; then + echo "" + echo "Encryption key not found." + echo -n "Enter your encryption key: " + read -r KEY + + if [ -z "$KEY" ]; then + echo "Error: No key provided." + exit 1 + fi +else + echo "Key retrieved successfully." +fi + +echo "" + +python3 - </dev/null) +if [ -z "$KEY" ]; then + # Fallback to legacy DropSend naming + KEY=$(security find-generic-password -s "DropSend_Encryption_Key" -a "DropSend" -w 2>/dev/null) +fi +if [ -z "$KEY" ]; then + # Fallback to legacy DriveSend naming + KEY=$(security find-generic-password -s "DriveSend_Encryption_Key" -a "DriveSend" -w 2>/dev/null) +fi + +if [ -z "$KEY" ]; then + echo "" + echo "Error: Failed to retrieve key from Keychain." + echo "" + echo "To store your encryption key in Keychain:" + echo " 1. Open Keychain Access (search in Spotlight)" + echo " 2. Click File > New Password Item" + echo " 3. Set Keychain Item Name: ComfyUI_Encryption_Key" + echo " 4. Set Account Name: ComfyUI" + echo " 5. Set Password: [your encryption key]" + echo " 6. Click Add" + echo "" + exit 1 +fi +echo "Key retrieved successfully." +echo "" + +# Python script to decrypt all .enc files +python3 - </dev/null) +if [ -z "$KEY" ]; then + KEY=$(security find-generic-password -s "DropSend_Encryption_Key" -a "DropSend" -w 2>/dev/null) +fi +if [ -z "$KEY" ]; then + KEY=$(security find-generic-password -s "DriveSend_Encryption_Key" -a "DriveSend" -w 2>/dev/null) +fi + +if [ -z "$KEY" ]; then + echo "" + echo "Error: Failed to retrieve key from Keychain." + echo "" + echo "To store your encryption key in Keychain:" + echo " 1. Open Keychain Access (search in Spotlight)" + echo " 2. Click File > New Password Item" + echo " 3. Set Keychain Item Name: ComfyUI_Encryption_Key" + echo " 4. Set Account Name: ComfyUI" + echo " 5. Set Password: [your encryption key]" + echo " 6. Click Add" + echo "" + exit 1 +fi +echo "Key retrieved successfully." +echo "" + +# Python script to encrypt supported files +python3 - < Environment Variables") + print(" 3. Under User variables, click New") + print(" 4. Variable name: COMFYUI_ENCRYPTION_KEY") + print(" 5. Variable value: [your encryption key]") + print(" 6. Click OK and restart any open terminals") + print("") + key = input("Enter your encryption key: ").strip() + + if not key: + print("Error: No key provided.") + sys.exit(1) + + return key + + +def decrypt_file(encrypted_path, output_path, fernet): + """Decrypt a single file.""" + try: + with open(encrypted_path, 'rb') as enc_file: + encrypted_data = enc_file.read() + decrypted_data = fernet.decrypt(encrypted_data) + with open(output_path, 'wb') as dec_file: + dec_file.write(decrypted_data) + return True + except Exception as e: + print(f" X Error decrypting {os.path.basename(encrypted_path)}: {e}") + return False + + +def main(): + print("=== ComfyUI File Decryption (Windows) ===") + print("") + + # Get folder path + folder = input("Enter the folder path containing .enc files: ").strip() + folder = folder.strip('"\'') + + if not folder or not os.path.isdir(folder): + print(f"Error: '{folder}' is not a valid directory.") + sys.exit(1) + + print(f"Processing folder: {folder}") + print("") + + # Recursive option + recursive_input = input("Decrypt files recursively (including subfolders)? (Y/N): ").strip().upper() + recursive = recursive_input == 'Y' + + # Get encryption key + print("") + key = get_encryption_key() + + try: + fernet = Fernet(key.encode()) + except Exception as e: + print(f"Error: Invalid encryption key format: {e}") + sys.exit(1) + + print("") + print("Scanning for .enc files...") + + # Find all .enc files + enc_files = [] + if recursive: + for root, _, files in os.walk(folder): + for file in files: + if file.endswith('.enc'): + enc_files.append(os.path.join(root, file)) + else: + for file in os.listdir(folder): + if file.endswith('.enc'): + enc_files.append(os.path.join(folder, file)) + + if not enc_files: + print("No .enc files found in the specified location.") + sys.exit(0) + + print(f"Found {len(enc_files)} .enc file(s) to decrypt.") + print("") + + success_count = 0 + error_count = 0 + + for enc_path in enc_files: + out_path = enc_path[:-4] # Remove .enc + + if decrypt_file(enc_path, out_path, fernet): + print(f" + Decrypted: {os.path.basename(out_path)}") + success_count += 1 + else: + error_count += 1 + + print("") + print(f"Decryption complete: {success_count} successful, {error_count} failed") + print("") + + # Offer to move .enc files + move_input = input("Move all .enc files to a separate folder? (Y/N): ").strip().upper() + if move_input == 'Y': + enc_folder = os.path.join(folder, "_encrypted_originals") + os.makedirs(enc_folder, exist_ok=True) + moved_count = 0 + + for enc_path in enc_files: + if os.path.exists(enc_path): + dest = os.path.join(enc_folder, os.path.basename(enc_path)) + shutil.move(enc_path, dest) + moved_count += 1 + + print(f"Moved {moved_count} .enc file(s) to: {enc_folder}") + else: + print("Leaving .enc files in place.") + + print("") + print("Done!") + + +if __name__ == "__main__": + main() diff --git a/scripts/win/encrypt_folder_win.py b/scripts/win/encrypt_folder_win.py new file mode 100644 index 0000000..0fd5b5d --- /dev/null +++ b/scripts/win/encrypt_folder_win.py @@ -0,0 +1,132 @@ +#!/usr/bin/env python3 +""" +ComfyUI Encryption Scripts - Encryption (Windows) +Works with both DropSend and DriveSend nodes +Encrypts image/video files using a key from environment variable or manual input + +NOTE: This script is for LOCAL USE ONLY - for encrypting files on your local machine +outside of ComfyUI. The nodes handle encryption automatically during upload. +""" + +import os +import sys + +try: + from cryptography.fernet import Fernet +except ImportError: + print("Error: cryptography library not installed.") + print("Run: pip install cryptography") + sys.exit(1) + + +SUPPORTED_EXTENSIONS = ('.png', '.jpg', '.jpeg', '.webp', '.gif', '.mp4', '.avi', '.mov') + + +def get_encryption_key(): + """Get encryption key from environment variable or user input.""" + key = (os.environ.get('COMFYUI_ENCRYPTION_KEY') or + os.environ.get('comfyui_encryption_key') or + os.environ.get('DROPSEND_ENCRYPTION_KEY') or + os.environ.get('DRIVESEND_ENCRYPTION_KEY')) + + if key: + print("Using key from environment variable.") + return key + + print("") + print("Encryption key not found in environment.") + print("") + key = input("Enter your encryption key: ").strip() + + if not key: + print("Error: No key provided.") + sys.exit(1) + + return key + + +def encrypt_file(input_path, output_path, fernet): + """Encrypt a single file.""" + try: + with open(input_path, 'rb') as in_file: + data = in_file.read() + encrypted_data = fernet.encrypt(data) + with open(output_path, 'wb') as out_file: + out_file.write(encrypted_data) + return True + except Exception as e: + print(f" X Error encrypting {os.path.basename(input_path)}: {e}") + return False + + +def main(): + print("=== ComfyUI File Encryption (Windows) ===") + print("") + print("NOTE: This script is for LOCAL USE ONLY.") + print("The ComfyUI nodes handle encryption automatically during upload.") + print("") + + folder = input("Enter the folder path containing files to encrypt: ").strip().strip('"\'') + + if not folder or not os.path.isdir(folder): + print(f"Error: '{folder}' is not a valid directory.") + sys.exit(1) + + recursive_input = input("Encrypt files recursively? (Y/N): ").strip().upper() + recursive = recursive_input == 'Y' + + key = get_encryption_key() + + try: + fernet = Fernet(key.encode()) + except Exception as e: + print(f"Error: Invalid encryption key format: {e}") + sys.exit(1) + + print("") + print(f"Supported formats: {', '.join(SUPPORTED_EXTENSIONS)}") + + files_to_encrypt = [] + if recursive: + for root, _, files in os.walk(folder): + for file in files: + if file.lower().endswith(SUPPORTED_EXTENSIONS): + files_to_encrypt.append(os.path.join(root, file)) + else: + for file in os.listdir(folder): + if file.lower().endswith(SUPPORTED_EXTENSIONS): + files_to_encrypt.append(os.path.join(folder, file)) + + if not files_to_encrypt: + print("No supported files found.") + sys.exit(0) + + print(f"Found {len(files_to_encrypt)} file(s) to encrypt.") + print("") + + success_count = 0 + error_count = 0 + + for file_path in files_to_encrypt: + temp_enc_path = file_path + '.tmp.enc' + final_enc_path = file_path + '.enc' + + try: + if encrypt_file(file_path, temp_enc_path, fernet): + os.remove(file_path) + os.rename(temp_enc_path, final_enc_path) + print(f" + Encrypted: {os.path.basename(file_path)}") + success_count += 1 + else: + error_count += 1 + if os.path.exists(temp_enc_path): + os.remove(temp_enc_path) + except Exception as e: + print(f" X Error: {e}") + error_count += 1 + + print(f"\nEncryption complete: {success_count} successful, {error_count} failed") + + +if __name__ == "__main__": + main()