From 3181ce273ddf2d64670c4caf269d0d14dbc428e2 Mon Sep 17 00:00:00 2001 From: MachinePainting Date: Thu, 29 Jan 2026 03:23:26 -0800 Subject: [PATCH] Add files via upload --- scripts/decrypt_folder.py | 237 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 237 insertions(+) create mode 100644 scripts/decrypt_folder.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()