Commit Graph
21 Commits
Author SHA1 Message Date
mytharcher cf4c187613 fix(plugin-workflow-javascript): fix types 2026-06-01 21:46:43 +08:00
mytharcher 8438fea9e3 Revert "fix(plugin-workflow-javascript): fix types"
This reverts commit c4f7461e10.
2026-06-01 21:27:25 +08:00
mytharcher c4f7461e10 fix(plugin-workflow-javascript): fix types 2026-06-01 18:28:35 +08:00
xilesun 9b9e0213d0 Merge branch 'main' into next
# Conflicts:
#	docs/docs/fr/workflow/nodes/javascript.md
#	docs/docs/ja/workflow/nodes/javascript.md
#	docs/docs/ko/workflow/nodes/javascript.md
#	docs/docs/pt/workflow/nodes/javascript.md
#	lerna.json
#	packages/core/acl/package.json
#	packages/core/actions/package.json
#	packages/core/ai/package.json
#	packages/core/app/package.json
#	packages/core/auth/package.json
#	packages/core/build/package.json
#	packages/core/cache/package.json
#	packages/core/cli/package.json
#	packages/core/client-v2/package.json
#	packages/core/client/package.json
#	packages/core/create-nocobase-app/package.json
#	packages/core/data-source-manager/package.json
#	packages/core/database/package.json
#	packages/core/devtools/package.json
#	packages/core/evaluators/package.json
#	packages/core/flow-engine/package.json
#	packages/core/lock-manager/package.json
#	packages/core/logger/package.json
#	packages/core/resourcer/package.json
#	packages/core/sdk/package.json
#	packages/core/server/package.json
#	packages/core/shared/package.json
#	packages/core/snowflake-id/package.json
#	packages/core/telemetry/package.json
#	packages/core/test/package.json
#	packages/core/utils/package.json
#	packages/plugins/@nocobase-example/plugin-acl-allow/package.json
#	packages/plugins/@nocobase-example/plugin-acl-middleware/package.json
#	packages/plugins/@nocobase-example/plugin-action-group/package.json
#	packages/plugins/@nocobase-example/plugin-block-custom-resource/package.json
#	packages/plugins/@nocobase-example/plugin-block-filter-collection/package.json
#	packages/plugins/@nocobase-example/plugin-block-timeline/package.json
#	packages/plugins/@nocobase-example/plugin-collection-block/package.json
#	packages/plugins/@nocobase-example/plugin-custom-details-block/package.json
#	packages/plugins/@nocobase-example/plugin-custom-form-block/package.json
#	packages/plugins/@nocobase-example/plugin-custom-table-block-action-group/package.json
#	packages/plugins/@nocobase-example/plugin-custom-table-block-field/package.json
#	packages/plugins/@nocobase-example/plugin-custom-table-block-resource/package.json
#	packages/plugins/@nocobase-example/plugin-custom-table-block/package.json
#	packages/plugins/@nocobase-example/plugin-data-block/package.json
#	packages/plugins/@nocobase-example/plugin-field-simple/package.json
#	packages/plugins/@nocobase-example/plugin-nested-action/package.json
#	packages/plugins/@nocobase-example/plugin-nested-block/package.json
#	packages/plugins/@nocobase-example/plugin-simple-action/package.json
#	packages/plugins/@nocobase-example/plugin-simple-block/package.json
#	packages/plugins/@nocobase-example/plugin-simple-popup-action/package.json
#	packages/plugins/@nocobase/plugin-acl/package.json
#	packages/plugins/@nocobase/plugin-action-bulk-edit/package.json
#	packages/plugins/@nocobase/plugin-action-bulk-update/package.json
#	packages/plugins/@nocobase/plugin-action-custom-request/package.json
#	packages/plugins/@nocobase/plugin-action-duplicate/package.json
#	packages/plugins/@nocobase/plugin-action-export/package.json
#	packages/plugins/@nocobase/plugin-action-import/package.json
#	packages/plugins/@nocobase/plugin-action-print/package.json
#	packages/plugins/@nocobase/plugin-ai-gigachat/package.json
#	packages/plugins/@nocobase/plugin-ai/package.json
#	packages/plugins/@nocobase/plugin-api-doc/package.json
#	packages/plugins/@nocobase/plugin-api-keys/package.json
#	packages/plugins/@nocobase/plugin-async-task-manager/package.json
#	packages/plugins/@nocobase/plugin-audit-logs/package.json
#	packages/plugins/@nocobase/plugin-auth-sms/package.json
#	packages/plugins/@nocobase/plugin-auth/package.json
#	packages/plugins/@nocobase/plugin-backup-restore/package.json
#	packages/plugins/@nocobase/plugin-backups/package.json
#	packages/plugins/@nocobase/plugin-block-grid-card/package.json
#	packages/plugins/@nocobase/plugin-block-iframe/package.json
#	packages/plugins/@nocobase/plugin-block-list/package.json
#	packages/plugins/@nocobase/plugin-block-markdown/package.json
#	packages/plugins/@nocobase/plugin-block-multi-step-form/package.json
#	packages/plugins/@nocobase/plugin-block-template/package.json
#	packages/plugins/@nocobase/plugin-block-tree/package.json
#	packages/plugins/@nocobase/plugin-block-workbench/package.json
#	packages/plugins/@nocobase/plugin-calendar/package.json
#	packages/plugins/@nocobase/plugin-charts/package.json
#	packages/plugins/@nocobase/plugin-client/package.json
#	packages/plugins/@nocobase/plugin-collection-fdw/package.json
#	packages/plugins/@nocobase/plugin-collection-sql/package.json
#	packages/plugins/@nocobase/plugin-collection-tree/package.json
#	packages/plugins/@nocobase/plugin-comments/package.json
#	packages/plugins/@nocobase/plugin-custom-variables/package.json
#	packages/plugins/@nocobase/plugin-data-source-main/package.json
#	packages/plugins/@nocobase/plugin-data-source-manager/package.json
#	packages/plugins/@nocobase/plugin-data-visualization-echarts/package.json
#	packages/plugins/@nocobase/plugin-data-visualization/package.json
#	packages/plugins/@nocobase/plugin-departments/package.json
#	packages/plugins/@nocobase/plugin-disable-pm-add/package.json
#	packages/plugins/@nocobase/plugin-embed/package.json
#	packages/plugins/@nocobase/plugin-environment-variables/package.json
#	packages/plugins/@nocobase/plugin-error-handler/package.json
#	packages/plugins/@nocobase/plugin-field-attachment-url/package.json
#	packages/plugins/@nocobase/plugin-field-china-region/package.json
#	packages/plugins/@nocobase/plugin-field-code/package.json
#	packages/plugins/@nocobase/plugin-field-formula/package.json
#	packages/plugins/@nocobase/plugin-field-m2m-array/package.json
#	packages/plugins/@nocobase/plugin-field-markdown-vditor/package.json
#	packages/plugins/@nocobase/plugin-field-sequence/package.json
#	packages/plugins/@nocobase/plugin-field-sort/package.json
#	packages/plugins/@nocobase/plugin-file-manager/package.json
#	packages/plugins/@nocobase/plugin-file-previewer-office/package.json
#	packages/plugins/@nocobase/plugin-flow-engine/package.json
#	packages/plugins/@nocobase/plugin-form-drafts/package.json
#	packages/plugins/@nocobase/plugin-gantt/package.json
#	packages/plugins/@nocobase/plugin-graph-collection-manager/package.json
#	packages/plugins/@nocobase/plugin-hello/package.json
#	packages/plugins/@nocobase/plugin-kanban/package.json
#	packages/plugins/@nocobase/plugin-license/package.json
#	packages/plugins/@nocobase/plugin-locale-tester/package.json
#	packages/plugins/@nocobase/plugin-localization/package.json
#	packages/plugins/@nocobase/plugin-logger/package.json
#	packages/plugins/@nocobase/plugin-map/package.json
#	packages/plugins/@nocobase/plugin-mobile-client/package.json
#	packages/plugins/@nocobase/plugin-mobile/package.json
#	packages/plugins/@nocobase/plugin-mock-collections/package.json
#	packages/plugins/@nocobase/plugin-multi-app-manager/package.json
#	packages/plugins/@nocobase/plugin-multi-app-share-collection/package.json
#	packages/plugins/@nocobase/plugin-multi-keyword-filter/package.json
#	packages/plugins/@nocobase/plugin-notification-email/package.json
#	packages/plugins/@nocobase/plugin-notification-in-app-message/package.json
#	packages/plugins/@nocobase/plugin-notification-manager/package.json
#	packages/plugins/@nocobase/plugin-notifications/package.json
#	packages/plugins/@nocobase/plugin-public-forms/package.json
#	packages/plugins/@nocobase/plugin-snapshot-field/package.json
#	packages/plugins/@nocobase/plugin-system-settings/package.json
#	packages/plugins/@nocobase/plugin-text-copy/package.json
#	packages/plugins/@nocobase/plugin-theme-editor/package.json
#	packages/plugins/@nocobase/plugin-ui-schema-storage/package.json
#	packages/plugins/@nocobase/plugin-ui-templates/package.json
#	packages/plugins/@nocobase/plugin-user-data-sync/package.json
#	packages/plugins/@nocobase/plugin-users/package.json
#	packages/plugins/@nocobase/plugin-verification/package.json
#	packages/plugins/@nocobase/plugin-workflow-action-trigger/package.json
#	packages/plugins/@nocobase/plugin-workflow-aggregate/package.json
#	packages/plugins/@nocobase/plugin-workflow-cc/package.json
#	packages/plugins/@nocobase/plugin-workflow-custom-action-trigger/package.json
#	packages/plugins/@nocobase/plugin-workflow-date-calculation/package.json
#	packages/plugins/@nocobase/plugin-workflow-delay/package.json
#	packages/plugins/@nocobase/plugin-workflow-dynamic-calculation/package.json
#	packages/plugins/@nocobase/plugin-workflow-javascript/package.json
#	packages/plugins/@nocobase/plugin-workflow-javascript/src/server/ScriptInstruction.ts
#	packages/plugins/@nocobase/plugin-workflow-json-query/package.json
#	packages/plugins/@nocobase/plugin-workflow-json-variable-mapping/package.json
#	packages/plugins/@nocobase/plugin-workflow-loop/package.json
#	packages/plugins/@nocobase/plugin-workflow-mailer/package.json
#	packages/plugins/@nocobase/plugin-workflow-manual/package.json
#	packages/plugins/@nocobase/plugin-workflow-notification/package.json
#	packages/plugins/@nocobase/plugin-workflow-parallel/package.json
#	packages/plugins/@nocobase/plugin-workflow-request-interceptor/package.json
#	packages/plugins/@nocobase/plugin-workflow-request/package.json
#	packages/plugins/@nocobase/plugin-workflow-response-message/package.json
#	packages/plugins/@nocobase/plugin-workflow-sql/package.json
#	packages/plugins/@nocobase/plugin-workflow-test/package.json
#	packages/plugins/@nocobase/plugin-workflow-variable/package.json
#	packages/plugins/@nocobase/plugin-workflow/package.json
#	packages/presets/nocobase/package.json
2026-06-01 11:57:23 +08:00
Junyi 113acf62d3 docs(plugin-workflow-javascript): clarify unsafe module mode (#9629) 2026-05-30 11:11:20 +08:00
Junyi 3cc5c196ab feat(plugin-workflow): add timeout option for workflows (#9363)
* feat(plugin-workflow): add timeout option for workflows

* fix(plugin-workflow): fix types

* fix(plugin-workflow): fix types

* fix(plugin-workflow): fix test cases

* refactor(plugin-workflow): use app time instead of db time

* fix(plugin-workflow): add options label

* refactor(plugin-workflow): remove millisecond unit for timeout

* refactor(plugin-workflow): not to use scan executions

* refactor(plugin-workflow): adapt manual type nodes

* fix(plugin-workflow): fix test case

* fix(plugin-workflow-manual): fix types

* test(plugin-workflow): add test case

* refactor(plugin-workflow): change dispatcher APIs for single duty principle and better understanding

* refactor(plugin-workflow): add lock for query from db queue

* fix(plugin-workflow): fix transaction

* feat(plugin-workflow): add unit of days for timeout setting

* fix(plugin-workflow): fix timeout component

* fix(plugin-workflow): abort all pending nodes when execution aborted

* fix(plugin-workflow-request): fix request instruction failure status

* fix(plugin-workflow-manual): add fault-tolerant for no field in custom form submitted

* feat(plugin-ai): add timeout for ai nodes

* fix(plugin-workflow): fix types

* refactor(plugin-workflow): simplify code of rerun logic

* refactor(plugin-workflow): change loaded to immediate

* fix(plugin-workflow): change 409 to 400
2026-05-29 09:51:59 +08:00
Junyi 7050e1754c fix(plugin-workflow-javascript): bundle quickjs runtime package (#9503) 2026-05-17 17:44:07 +08:00
7b505bc7d8 refactor(plugin-workflow-javascript): change to quickjs to avoid compatible issues in isolated-vm (#9250)
* refactor(plugin-workflow-javascript): change to quickjs to avoid compatible issues in isolated-vm

* fix(plugin-workflow-javascript): add missed engine file

* docs(workflow-javascript): update QuickJS default engine docs

Agent-Logs-Url: https://github.com/nocobase/nocobase/sessions/d490091a-3d75-4d30-beaf-994201cf2a4c

Co-authored-by: mytharcher <525658+mytharcher@users.noreply.github.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: mytharcher <525658+mytharcher@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-05-08 17:57:29 +08:00
mytharcher 23270f3c16 fix(plugin-workflow-javascript): use mock url for axios test 2026-04-29 21:14:02 +08:00
mytharcher b2639988e3 fix(plugin-workflow-javascript): use mock url for axios test 2026-04-28 20:19:52 +08:00
nocobase[bot] afe3409b03 Merge branch 'next' into develop 2026-04-21 01:57:55 +00:00
Junyi 46fd9be1d3 Revert "fix(plugin-workflow-javascript): fix security issue (#9084)" (#9176)
This reverts commit f73f0d76cd.
2026-04-21 09:56:52 +08:00
Junyi 9c76d8bbad fix(plugin-workflow-javascript): fix error thrown from editor (#9169) 2026-04-20 21:34:40 +08:00
nocobase[bot] 0e810ddcb2 Merge branch 'next' into develop 2026-04-18 11:57:00 +00:00
JunyiandClaude Sonnet 4.6 f73f0d76cd fix(plugin-workflow-javascript): fix security issue (#9084)
* fix(plugin-workflow-javascript): fix security issue

* fix(plugin-workflow-javascript): fix path assertion under windows in test case

* fix(plugin-workflow-javascript): sanitize module function return values to close return-value bypass

Extend the sandbox hardening to also sanitize objects returned by wrapped
module functions (including Promise resolutions), so that prototype-chain
traversal via return values (e.g. crypto.createHash().update.constructor)
cannot reach the host Function constructor.

- Add sanitizeReturnValue() that sanitizes sync return values and
  thenable resolutions before they re-enter the sandbox
- Wire sanitizeReturnValue() into the function wrapper inside
  sanitizeForSandbox() so every module function call goes through it
- Walk the prototype chain up to MAX_PROTO_DEPTH=3 in the object branch
  so methods defined on the object's own prototype (e.g.
  Hash.prototype.update, Stats.prototype.isFile) are also exposed as
  hardened null-proto wrappers rather than raw host-realm functions
- Add resolveProperty() helper that reads accessor-descriptor properties
  (getters) by invoking desc.get — required for lazy-getter module
  exports such as mathjs.evaluate

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(plugin-workflow-javascript): sanitize exceptions and Promises from module calls

Address two P1 bypasses reported in PR review:

P1.1 — Module function exceptions: the function wrapper now wraps fn(...args)
in try/catch and calls sanitizeError() before re-throwing, so a host-realm
Error caught inside the sandbox (e.g. from path.join(null)) no longer exposes
e.constructor.constructor → host Function.

P1.2 — Host Promise exposed to sandbox: sanitizeReturnValue() no longer returns
the raw host Promise (whose .constructor chain reaches host Function). It now
builds a null-prototype clean thenable that intercepts onFulfilled/onRejected
callbacks, sanitizing resolved values via sanitizeForSandbox() and errors via
sanitizeError() before they reach sandbox code.

Also adds sanitizeError() helper shared by both fixes, and extends the test
suite with:
- P1.1 security test: path.join(null) throw chain is blocked
- P1.2 security test: fs.promises.readdir Promise constructor chain is blocked
- Functional regression: fs.promises.readdir still returns usable data after
  sanitization (note: result is a null-proto object; Array.isArray returns false
  but indexed access and .length work — raw Arrays cannot be returned safely as
  their __proto__.constructor chain leads back to host Function)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(plugin-workflow-javascript): restore array iteration for sanitized module return values

Arrays returned by module functions were converted to null-prototype plain
objects, which broke for...of, spread ([...arr]), and destructuring — the
three most common ways to consume arrays in modern JavaScript.

Add a special-case Array branch in sanitizeForSandbox() that:
- copies indexed elements and length to a null-proto object (preserving
  security: no Array.prototype.constructor chain exposure)
- attaches a safe Symbol.iterator backed by a null-proto iterator whose
  .next() results are also null-proto objects — no host-realm chain at any
  level, so the iterator cannot be used to reach the host Function constructor

After this change:
  const entries = await fs.promises.readdir('.')
  for (const e of entries) { ... }   // works
  const arr = [...entries]           // works; arr is a real sandbox Array
  const [first] = entries            // works
  entries.length / entries[0]        // works (unchanged)
  Array.isArray(entries)             // still false (by design, host Array is unsafe)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(plugin-workflow-javascript): json round-trip script return value before postMessage

The script node result is always stored in the database as JSON and re-parsed
by subsequent workflow nodes, so JavaScript-specific semantics (null prototypes,
Symbols, functions) carry no meaning at the postMessage boundary.

Add toJsonResult() that applies JSON.parse(JSON.stringify(value)) to the final
script return value before postMessage, ensuring:
- null-prototype objects produced by sanitizeForSandbox are converted to proper
  plain objects / Arrays (Array.isArray works correctly in downstream nodes)
- function-valued properties are silently dropped (expected for serialized data)
- the result is always structured-clone compatible

Note: sanitizeForSandbox + Symbol.iterator are still required for values used
within the script during execution (e.g. iterating a module-returned array
before returning the result). toJsonResult() only normalises the boundary value.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(plugin-workflow-javascript): fix security issues

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-18 19:55:54 +08:00
mytharcher 2653c9332f Merge branch 'next' into develop 2026-03-31 22:00:42 +08:00
Junyi d7c5a6868d refactor(plugin-workflow-javascript): change default engine to isolated-vm (#8973)
* refactor(plugin-workflow-javascript): change default engine to isolated-vm

* refactor(plugin-workflow-javascript): simplify env

* docs(plugin-workflow-javascript): add docs due to engine refactored
2026-03-30 22:01:36 +08:00
Junyi d9aafbb1b7 feat(plugin-workflow): add validation (#8971)
* feat(plugin-workflow): add validation

* feat(plugin-workflow): add validation rules
2026-03-27 09:01:55 +08:00
Junyi 24203d7a01 fix(plugin-workflow-javascript): fix security issue (#8967) 2026-03-26 20:58:15 +08:00
Junyi 897d62e619 fix(plugin-javascript): fix test cases fail on windows (#8722) 2026-02-26 23:21:39 +08:00
b263a83a12 chore: open source commercial plugins and update license from AGPL-3.0 to Apache-2.0 (#8682)
* feat: open-source plugin source code

* fix: fdw

* feat: update readme.md

* fix: gitignore

* fix: peerDependencies

* fix: remove zh-cn.md

* feat: update license

* fix: peerDependencies

* fix: peerDependencies

* test(ai): fix breaking test case of tools loader

* fix(verification): dep

* fix: deps

* fix: version

* feat: plugin-comments

* fix: deps

---------

Co-authored-by: Drol <cgyrock@gmail.com>
Co-authored-by: xilesun <2013xile@gmail.com>
2026-02-24 20:34:06 +08:00