119 lines
4.9 KiB
Python
119 lines
4.9 KiB
Python
# ComfyUI_DropSendNode/setup_dropbox_node.py
|
|
|
|
import os
|
|
import requests
|
|
from dotenv import load_dotenv, dotenv_values
|
|
import urllib.parse
|
|
from .dropbox_auth_manager import DropboxAuthManager
|
|
|
|
|
|
class DropboxSetupNode:
|
|
@classmethod
|
|
def INPUT_TYPES(cls):
|
|
# Check if credentials are already stored
|
|
try:
|
|
auth_manager = DropboxAuthManager()
|
|
is_connected = auth_manager.is_connected()
|
|
except:
|
|
is_connected = False
|
|
|
|
# Base inputs that are always shown
|
|
inputs = {
|
|
"required": {
|
|
"dropbox_dest_folder": ("STRING", {"default": "/Apps/ComfyUI_Output_Files"}),
|
|
},
|
|
"optional": {}
|
|
}
|
|
|
|
if is_connected:
|
|
# If connected, only show reconnect option
|
|
inputs["optional"]["reconnect"] = ("BOOLEAN", {
|
|
"label": "Reconnect Dropbox (clear saved credentials)",
|
|
"default": False
|
|
})
|
|
else:
|
|
# If not connected, show setup fields
|
|
inputs["required"].update({
|
|
"app_key": ("STRING", {"default": ""}),
|
|
"app_secret": ("STRING", {"default": ""}),
|
|
"auth_code": ("STRING", {"default": ""}),
|
|
})
|
|
inputs["optional"]["reconnect"] = ("BOOLEAN", {
|
|
"label": "Reset stored credentials",
|
|
"default": False
|
|
})
|
|
|
|
return inputs
|
|
|
|
RETURN_TYPES = ("STRING",)
|
|
OUTPUT_NODE = True
|
|
FUNCTION = "setup"
|
|
|
|
def setup(self, dropbox_dest_folder, app_key=None, app_secret=None, auth_code=None, reconnect=False):
|
|
try:
|
|
# Initialize auth manager
|
|
auth_manager = DropboxAuthManager()
|
|
|
|
# Handle reconnect/reset request
|
|
if reconnect:
|
|
auth_manager.reset()
|
|
return ("🔄 Dropbox credentials cleared. Please provide new auth code to reconnect.",)
|
|
|
|
# Check if already connected (keyring has credentials)
|
|
if auth_manager.is_connected():
|
|
# Test the stored credentials by getting an access token
|
|
try:
|
|
access_token = auth_manager.get_access_token()
|
|
return ("✅ Dropbox already connected using stored credentials. Ready to upload files.",)
|
|
except Exception as e:
|
|
return (f"⚠️ Stored credentials found but invalid: {e}. Use 'reconnect' to reset.",)
|
|
|
|
# Check for legacy environment variables (keep existing fallback logic)
|
|
general_env_set = all([
|
|
os.getenv("DROPBOX_APP_KEY"),
|
|
os.getenv("DROPBOX_APP_SECRET"),
|
|
os.getenv("DROPBOX_REFRESH_TOKEN")
|
|
])
|
|
if general_env_set:
|
|
return ("⚠️ Dropbox credentials found in system environment variables. Using those instead of keyring.",)
|
|
|
|
# Check for RunPod secrets
|
|
runpod_env_set = all([
|
|
os.getenv("RUNPOD_SECRET_DROPBOX_ACCESS_TOKEN"),
|
|
os.getenv("RUNPOD_SECRET_DROPBOX_REFRESH_TOKEN")
|
|
])
|
|
if runpod_env_set:
|
|
return ("⚠️ Detected RunPod secrets. Using those instead of keyring.",)
|
|
|
|
# New setup flow using DropboxAuthManager
|
|
if not app_key or not app_secret or not auth_code:
|
|
return ("❌ Missing App Key, Secret, or Authorization Code. Please provide all credentials.",)
|
|
|
|
if not all([app_key.strip(), app_secret.strip(), auth_code.strip()]):
|
|
# Generate OAuth URL if no auth code provided
|
|
if app_key.strip():
|
|
auth_temp = DropboxAuthManager(app_key=app_key.strip())
|
|
oauth_url = auth_temp.get_oauth_url()
|
|
return (f"❌ Missing credentials. Visit this URL to get auth code:\n{oauth_url}",)
|
|
else:
|
|
return ("❌ Missing App Key, Secret, or Authorization Code.",)
|
|
|
|
# Exchange auth code for refresh token using DropboxAuthManager
|
|
auth_manager_setup = DropboxAuthManager(app_key.strip(), app_secret.strip())
|
|
auth_manager_setup.exchange_auth_code(auth_code.strip())
|
|
|
|
# Store destination folder in .env as fallback for other nodes
|
|
node_dir = os.path.dirname(__file__)
|
|
env_path = os.path.join(node_dir, ".env")
|
|
with open(env_path, "w") as f:
|
|
f.write(f"DROPBOX_FOLDER={dropbox_dest_folder}\n")
|
|
|
|
return ("✅ Dropbox connected successfully! Credentials stored securely in system keyring.",)
|
|
|
|
except Exception as e:
|
|
return (f"❌ Setup failed: {e}",)
|
|
|
|
# Required mappings for ComfyUI
|
|
NODE_CLASS_MAPPINGS = {"DropboxSetupNode": DropboxSetupNode}
|
|
NODE_DISPLAY_NAME_MAPPINGS = {"DropboxSetupNode": "📦⚙️ Dropbox AutoUploader Setup"}
|