89 Commits
Author SHA1 Message Date
MachinePainting 09362f42c7 v1.1.0: refactor Setup Node, security hardening, auto-curl auth flow
Setup Node refactor (the secret-bearing fields no longer exist on the
node at all):
  • Removed app_key / app_secret / auth_code from INPUT_TYPES. The
    Setup Node now exposes only storage_method, encryption_key_method,
    and reconnect — none of which are credentials.
  • Added a "Set credentials..." button on the node (LiteGraph button
    widget installed via beforeRegisterNodeDef + onNodeCreated
    prototype hook so it survives reload, drag-and-drop workflow
    JSON, and PNG metadata restore).
  • Click opens a browser-only modal with three <input type=password>
    fields. Browser-native dot masking the whole time the user types
    or pastes — no canvas-rendered plaintext, no shoulder-surf.
  • Modal Save POSTs values to a new same-origin route
    /dropsend/setup/stash and closes. setup() consumes the stash
    entry on the next Queue (one-shot, keyed by client_id, 60-second
    TTL, 32-entry cap with oldest-eviction).
  • Architectural consequence: secrets never become widget values, so
    they cannot enter saved workflow JSON, ComfyUI's localStorage
    auto-save, PNG metadata, copy-pasted nodes, or PromptServer.history
    (and therefore the unauthenticated /history HTTP endpoint).

Auto-curl auth flow (one-click second paste):
  • After Run 1 prints the OAuth URL banner, setup() sends a
    sid-targeted dropsend_credentials_needed WebSocket event.
  • JS handler auto-opens the entry modal in the originating browser
    so the user can paste auth_code as soon as Dropbox shows it,
    without clicking the button between runs.
  • Defense in depth: client_id is echoed in the WS payload and the
    JS handler verifies it matches api.clientId before opening.

Security hardening on /dropsend/setup/stash:
  • Same-origin enforcement: Origin header must match request.host.
    Closes cross-origin CSRF from another browser tab even when an
    attacker has sniffed a victim's client_id.
  • Content-Type lockdown: rejects anything other than
    application/json with HTTP 415. Closes the confused-deputy class
    where form-encoded bodies could be parsed as JSON.
  • Live-session check: client_id must correspond to an active
    PromptServer.instance.sockets entry. Returns 403 otherwise.
    Closes the stash-poisoning vector where an attacker who guesses
    a victim's client_id could pre-populate credentials.
  • Per-IP rate limit: 30 POSTs / 10-second sliding window, returns
    429 over budget. Defense against stash-spam DoS attempting to
    evict a legitimate user's entry.
  • Body cap (32 KB), client_id regex validation, JSON parse errors
    return 400, empty payloads dropped.
  • Both rate-limit and live-session checks empirically verified via
    curl smoke tests.

Reconnect now revokes the Dropbox refresh token at the source:
  • reconnect=True populates DropboxAuthManager from os.environ and
    calls reset(revoke_token=True).
  • POST /2/auth/token/revoke with an 8-second timeout so a Dropbox
    outage cannot hang the operator mid-reconnect. Local cleanup
    proceeds regardless of revocation outcome.
  • Revocation outcome is now logged at logger.error level (not just
    print) and the failure message tells the operator to manually
    disconnect at https://www.dropbox.com/account/connected_apps so
    a silent revocation failure cannot leave a still-valid token at
    Dropbox.

Logging:
  • Single FileHandler attached to the root logger from __init__.py,
    pointed at a plugin-relative dropsend.log. Replaces the four
    duplicated logging.basicConfig() blocks in monitor_output.py /
    encrypt_file.py / dropbox_upload.py / dropsend_uploader_node.py
    that were dead code (basicConfig is a no-op once ComfyUI has
    already configured root). Log records from every DropSend module
    now actually persist to disk.
  • Race-free creation: pre-create with os.open(O_CREAT | O_WRONLY |
    O_APPEND, 0o600) before FileHandler attaches, follow-up chmod as
    belt-and-suspenders. Closes the brief default-umask window
    between FileHandler creating the file and post-hoc chmod.
  • Rotation via RotatingFileHandler (5 MB per file, 3 backups, ~20
    MB max). Bounds disk use on long-lived hosts.
  • dropbox_auth_manager.py now has its own logger so revocation
    successes/failures land in dropsend.log alongside stdout.

Tests (tests/ directory, unittest, no extra deps):
  • test_safe_paths.py — 23 tests covering symlink rejection, path-
    traversal rejection, allowlist behaviour, dropbox_dest validation
    (NUL bytes, missing leading slash, parent-traversal segments),
    and resolve_safe_watch_folder edge cases. safe_paths is the only
    barrier between remote workflow inputs and arbitrary-file-read
    on the host; this is regression coverage for that barrier.
  • test_setup_node_security.py — static AST analysis of
    dropsend_setup_node.py asserting that every send_sync call for a
    credential event passes a non-None sid AND sits inside an
    "if sid:" guard. Catches future regressions of the original
    WebSocket-broadcast vulnerability deterministically. Also asserts
    INPUT_TYPES never re-introduces app_key/app_secret/auth_code.

WebSocket-broadcast guard maintained on all three event sites
(dropsend_credentials_ready, dropbox_reconnect_complete,
dropsend_credentials_needed) — refuse to send when client_id is None
to prevent send_sync(..., None) from broadcasting credentials to
every connected browser tab.

README:
  • New Changelog section documenting the v1.1.0 security advisory
    (workflow-persistence + WS-broadcast leaks in earlier versions)
    and the fixes shipped in this release.
  • New "Bind ComfyUI to localhost or front it with auth" Best
    Practice item (item 4) explicitly calling out that ComfyUI's
    /prompt endpoint is unauthenticated.
  • New "Encryption key rotation" subsection covering symmetric-key
    implications, leaked-key recovery, and how to generate a new key.
  • New "Uninstalling / disconnecting" subsection with step-by-step
    instructions for revoking Dropbox app, resetting app secret,
    removing platform secrets, and handling existing .enc files.
  • Threat model reflects same-origin/Content-Type checks, log
    rotation, plugin-directory metadata-leak note for multi-tenant
    hosts, reconnect-revocation silent-failure note, and Dropbox
    SDK error-message log review.

.gitignore:
  • Expanded to cover *.bak, *.enc, *.key/.pem/.p12/.pfx, .idea/,
    .pytest_cache/, build artifacts, Thumbs.db/Desktop.ini.

Bundled in this minor release:
  • Single-Observer fix for the macOS _fsevents conflict that
    previously prevented .enc files from being picked up by the
    upload watcher.
  • folder_format dropdown for AutoUploader (project_name default
    plus five worldwide date formats), with two-base persistence so
    switching between project-name and dated modes preserves both
    patterns.
  • RUNNING banner with per-setting plain-English explanations.
  • Branded watching/encrypted/sent log emojis.
  • Per-shell copy-paste commands and echo verification for the
    COMFYUI_DROPSEND_ALLOW_SETUP gate.
v1.1.0
2026-05-09 05:44:47 -07:00
MachinePainting 6bc38a99d5 Bump version to 1.0.3 v1.0.3 2026-02-22 21:36:37 -08:00
MachinePainting c4ed0bccc2 Fix encryption to preserve original file extension 2026-02-22 21:23:44 -08:00
MachinePainting e010853747 Default enable_encryption to True 2026-02-12 19:38:58 -08:00
MachinePainting d98cdc3ec9 Update README: fix decryption scripts flow, add platform subfolders, RunPod template guidance, add manual encryption note 2026-02-12 19:26:26 -08:00
MachinePainting f107319c6a Update README: clarify decryption scripts, RunPod template setup, and secret naming 2026-02-12 19:09:21 -08:00
MachinePainting 38ff1b37d7 Revise project title in README
Updated project title to include 'ComfyUI >> DropBox'.
2026-02-01 07:18:14 -08:00
MachinePainting 91d3249ac7 v1.0.2: Standardize node naming conventions
- Rename class to DropSendSetupNode
- Rename class to DropSendAutoUploaderNode
- Update NODE_CLASS_MAPPINGS keys for consistency
- Update print statement prefixes to [DropSend Setup]
- Use get_encryption_key() for consistent key lookup

BREAKING: Existing workflows using old node names will need to re-add nodes
2026-02-01 06:12:05 -08:00
MachinePainting ff6ef125ec v1.0.2: Standardize node naming conventions 2026-02-01 06:09:17 -08:00
MachinePainting 08ddaee846 v1.0.2: Standardize node naming conventions 2026-02-01 06:05:34 -08:00
MachinePainting 32a3e37ba2 v1.0.2: Standardize node naming conventions
- Rename class to DropSendSetupNode
- Rename class to DropSendAutoUploaderNode
- Update NODE_CLASS_MAPPINGS keys for consistency
- Update print statement prefixes to [DropSend Setup]
- Use get_encryption_key() for consistent key lookup

BREAKING: Existing workflows using old node names will need to re-add nodes
v1.0.2
2026-02-01 05:58:02 -08:00
MachinePainting b35166453d Update README and encrypt_file for v1.0.1 2026-02-01 04:33:34 -08:00
MachinePainting 9f95322d36 v1.0.1: Standardize encryption key, simplify README
- Encryption key now COMFYUI_ENCRYPTION_KEY (uppercase)
- encrypt_file.py checks both uppercase and lowercase for compatibility
- Simplified README with cleaner instructions
- Added link to DriveSend at top
v1.0.1
2026-02-01 04:23:41 -08:00
MachinePainting 49684e1fd8 Fix formatting and emphasize feature sections in README 2026-01-31 22:43:17 -08:00
MachinePainting 3f0dfb2424 Fix numbering and update DropSend Setup Node description
Corrected numbering and clarified the description of the DropSend Setup Node.
2026-01-31 22:41:08 -08:00
MachinePainting 41f5a6d1f0 Enhance README with detailed node descriptions
Expanded the README to include detailed descriptions of the DropSend AutoUploader Node and DropSend Setup Node, along with installation instructions.
2026-01-31 22:40:44 -08:00
MachinePainting 5b580a65e5 Add overview image to README
Added an overview image for the DropSend Node.
2026-01-31 22:27:39 -08:00
MachinePainting b68b3cce0f Display Image for Node Added for README.md 2026-01-31 22:22:41 -08:00
MachinePainting 17220c3163 Revise README for environment variable setup and clarity
Updated instructions for adding environment variables and improved clarity in several sections.
2026-01-30 04:52:15 -08:00
MachinePainting 9f4ffff355 Initialize pyproject.toml with project details
Add project metadata for comfyui-dropsend-node.
2026-01-29 04:09:53 -08:00
MachinePainting 507b076028 Add GitHub Actions workflow for publishing to registry 2026-01-29 04:08:30 -08:00
MachinePainting 44db5a3b12 updated to universal drop/drive node 2026-01-29 03:35:34 -08:00
MachinePainting 03c37b8d65 updated to universal drop/drive node 2026-01-29 03:35:12 -08:00
MachinePainting 34baf87dd9 updated to universal drop/drive node 2026-01-29 03:34:46 -08:00
MachinePainting a75c712ee1 Add files via upload 2026-01-29 03:32:58 -08:00
MachinePainting 844cf8a809 Update README for ComfyUI encryption key usage
Updated encryption key references from 'DropSend' to 'ComfyUI' throughout the README, added important notes on universal .sh using both DropSend and DriveSend, and improved clarity on environment variable setup.
2026-01-29 03:30:29 -08:00
MachinePainting 3181ce273d Add files via upload 2026-01-29 03:23:26 -08:00
MachinePainting 0d5fa98f6f Fix typo in README.md 2026-01-29 02:54:22 -08:00
MachinePainting eff3c25087 Revise README for DropSend Node description and usage
Updated README to enhance clarity and add details about the DropSend Node's functionality and usage.
2026-01-29 02:46:00 -08:00
MachinePainting 1480a29a2e Fix formatting in README for clarity 2026-01-29 02:19:01 -08:00
MachinePainting 1aa934408b Revise README for clarity and feature details
Enhanced README to clarify features, installation, and encryption key management for the ComfyUI DropSend Node.
2026-01-29 02:18:18 -08:00
MachinePainting fb9d50eed2 Add standalone encryption/decryption scripts with cross-platform support
- Add decrypt/encrypt scripts for macOS, Windows, and Linux
- Add cross-platform Python script (decrypt_folder.py)
- Update README with setup instructions for all platforms
- Scripts support all file types: png, jpg, jpeg, webp, gif, mp4, avi, mov
2026-01-29 02:14:16 -08:00
MachinePainting 111829c26e Merge pull request #4 from machinepainting/feature/dropsend-updates
Updated version to support encryption and other updates.
2025-09-28 04:09:16 -07:00
machinepainting 9ff332fe9b Updated version to support encryption and other updates. 2025-09-28 10:19:29 +00:00
MachinePainting 20e8169e9a Update README.md 2025-08-21 02:06:33 -07:00
MachinePainting 927505faf0 Update README.md
updated readme to new version and detailed instructions for runpod, other cloud users, and local users.
2025-08-21 02:02:14 -07:00
MachinePainting 3e4845ecb7 Merge pull request #1 from machinepainting/runpod-oauth
OAuth implementation for DropSendNode
2025-08-20 23:01:06 -07:00
adamhaley f098a7131d Resolved merge conflict: deleted get_refresh_token.py 2025-08-20 18:51:53 -07:00
adamhaley c7665e8d6b cleanup 2025-08-20 18:33:56 -07:00
adamhaley 66d4104f6d serup auto -refresh for reconnect path ONLY. removed log messages
pertaining to auto-refresh
2025-08-20 15:39:51 -07:00
adamhaley e0fcc56aff cleaned up references to older functionality 2025-08-20 15:30:23 -07:00
adamhaley 5cfb0fd606 removing hidden fields functionality , simplifying 2025-08-20 14:59:13 -07:00
adamhaley 4622d8bb1e removing auto-refresh functionality 2025-08-20 14:39:35 -07:00
adamhaley a76934b093 added manual step using return_type=code to give the user the auth code
and having them put in
2025-08-20 14:34:53 -07:00
adamhaley 21aed02ef2 removing emojis and references to keyring 2025-08-20 14:10:39 -07:00
adamhaley de49b47418 comfyUI reloading without delay 2025-08-19 20:02:59 -07:00
adamhaley 6db833cb08 fixing auto-close delay on oauth success 2025-08-19 19:56:24 -07:00
adamhaley bf69903792 adding close button to oauth window for situations where it doesnt
auto-close
2025-08-19 19:49:36 -07:00
adamhaley 8127641d39 upping that time limit 2025-08-19 19:44:32 -07:00
adamhaley 532e3ab77d upping delay before closing oauth window 2025-08-19 19:38:51 -07:00