Skip to content

OpenCut v1.9.26 — Install rate limit 429 + structured filepath errors

Choose a tag to compare

@SysAdminDoc SysAdminDoc released this 11 Apr 23:11

v1.9.26 — Two bugs caught by deep behavioral smoke test

Rolling QA caught two more real bugs by exercising the actual running binary — neither were visible to static code review.

1. Install routes returned 200 + job_id on rate-limited retries, then failed async

make_install_route() was checking rate_limit("model_install") inside the @async_job body, so the rate limit violation surfaced only after a job record + worker thread were already created. The client got 200 OK + {"job_id": "..."} and had to poll /status/<id> to discover the failure.

Fix: moved the rate-limit check to the synchronous Flask handler layer — now returns 429 RATE_LIMITED immediately with no job spawned.

first call:  200 {"job_id": "..."}           (install begins in worker)
second call: 429 {"code": "RATE_LIMITED",    ← synchronous
                  "error": "A model_install operation is already running...",
                  "suggestion": "Wait for the current install to finish, then retry."}

2. @async_job filepath errors lacked code + suggestion

When a route rejected a filepath through @async_job, the response was {"error": "No file path provided"} with no structured code field. The CEP/UXP panels' ERROR_CODE_ACTIONS table relies on code to pick the right recovery hint — without it, users saw only the raw message.

Fix: @async_job now classifies filepath failures into INVALID_INPUT (empty, traversal, null byte, UNC prefix) vs FILE_NOT_FOUND (missing, not-a-file) and attaches a suggestion:

{"error": "No file path provided",
 "code": "INVALID_INPUT",
 "suggestion": "Select a clip in Premiere or pass `filepath` in the request body."}

Applies to all 97 async routes that go through the @async_job decorator.

How this was found

A 9-step behavioral smoke test on the v1.9.25 exe that submitted real payloads and inspected the response shapes:

  1. CSRF enforcement (no-token / bad-token → 403) ✓
  2. Empty body → 400 (but code was None — bug!)
  3. Path traversal → 400 (same bug)
  4. Non-existent file → 400 (same bug)
  5. Real silence-detect job submission
  6. Bad JSON body → 400 ✓
  7. 100 MB oversize payload → 413 ✓
  8. Double install call — expected 429 but got 200 twice (bug!)
  9. Shutdown → 200 ✓

Downloads

Windows

  • OpenCut-Server-v1.9.26-Windows.zip — 🆕 ready-to-run bundle, extract + double-click OpenCut-Server.exe
  • OpenCut-Server-Windows.tar.gz — same contents, tarball format

Linux

  • OpenCut-Server-Linux.tar.gz

macOS

  • OpenCut-Server-macOS.tar.gz

Built by GitHub Actions CI and uploaded automatically.