Board import no longer asks for member mapping up front. Every imported member is
brought in as a virtual (placeholder) user carrying its avatar, username and full
name (the existing createPlaceholderUsers path), added to the board inactive with
no permissions. The client import flow is now a single step that imports
immediately with an empty mapping -- no map-members screen, nothing to get stuck
on.
Mapping a virtual member to an existing user is a deliberate, later action done by
a board admin from the board sidebar member-avatar popup ("Map to existing user"),
and CANNOT be used to gain privileges: the new board-scoped method
mapImportedBoardMember only maps a virtual member onto an existing ACTIVE, REAL
member of the SAME board and never changes that member's role (so no new
membership is created and nothing is escalated); authorization and this guarantee
live in the pure planBoardMemberMapping helper. The mapping reassigns the virtual
member's cards/comments/activities ON THAT BOARD to the target and removes the
placeholder from the board.
Automatic hang mitigation so an import can never spin forever: a client watchdog
surfaces an import-timeout and clears the spinner if importBoard does not answer in
WEKAN_IMPORT_TIMEOUT_MS (default 2 min), and the server bounds creator.create with
the same deadline via a new generic withDeadline() wrapper.
Covered by tests/boardMemberMapPlan.test.cjs (no-escalation + auth matrix),
tests/withDeadline.test.cjs (deadline wrapper) and tests/importVirtualMembers.test.cjs
(wiring).
Thanks to xet7 !
- models/fileValidation.js: a stray BOM (U+FEFF) inside the looksLikeDangerousMarkup
regex character class broke the server test build with a Babel 'Unexpected token'
syntax error, so Mocha ran 0 tests. JS \s already matches U+FEFF, so the explicit
BOM was redundant; use plain \s*.
- models/import.js: importBoard awaited assertImportEnabled() BEFORE the switch that
check()s the "board" argument. Meteor's audit-argument-checks tracks checks on the
async context, so awaiting first made the later check(board) not count, throwing
'Did not check() all arguments during call to importBoard' -- which broke the WeKan
JSON import (#21) and Excel import (#25) Playwright tests. Check "board" up front
(Match.OneOf(Object, Array)) before the await; the per-source switch still does its
specific check.
- server/publications/activities.js: move the disableActivities gate to AFTER the
check() calls so the argument-checks audit is satisfied when the toggle is on
(latent: it would have thrown 'did not check all arguments' with activities off).
Six new optional toggles (all default off) governing how boards and user data
cross the WeKan boundary, enforced server-side so they cannot be bypassed from
the client:
- Disable all import / Disable all export: master switches that turn off every
import/export feature. importBoard and cloneBoard call assertImportEnabled;
every Exporter build()/buildStream() call assertExportEnabled. The import and
export menu options are hidden in the UI via global importDisabled/exportDisabled
Blaze helpers.
- Disable import avatars / Disable export avatars: never carry avatars into/out of
WeKan. Import is gated at the single localizeAvatarFromBuffer choke point (covers
WeKan JSON import, LDAP, OIDC/OAuth2 login sync and board-open localization) plus
Trello inlineMemberAvatars; export skips the base64 avatar embed + avatarUrl in
both Exporter paths.
- Anonymize import users / Anonymize export users: replace username/fullname/initials
with counter placeholders (user1, user2, ...), drop avatars, and rewrite @username
mentions + requestedBy/assignedBy in card/comment text. The placeholder word "user"
is translated to the current user language. Export covers both build() and the
streaming buildStream() (which does an id-only pre-scan so mentions streamed before
the users array resolve to matching labels); import scrubs the incoming board in
WekanCreator before any placeholder user or card is created.
New shared server helper models/lib/importExportSecurity.js holds the settings
read, guards, anonymization map builder and text rewriter. Adds settings
disableAllImport, disableAllExport, disableImportAvatars, disableExportAvatars,
anonymizeImportUsers, anonymizeExportUsers, published in the public setting.
while running an import from a previously exported board, we encounter
the following error:
Exception while invoking method 'importBoard' Error: Did not check() all arguments during call to 'importBoard'
at ArgumentChecker.throwUnlessAllArgumentsHaveBeenChecked (packages/check.js:483:13)
at Object._failIfArgumentsAreNotAllChecked (packages/check.js:131:16)
at maybeAuditArgumentChecks (packages/ddp-server/livedata_server.js:1765:18)
at DDP._CurrentMethodInvocation.withValue (packages/ddp-server/livedata_server.js:719:19)
at Meteor.EnvironmentVariable.EVp.withValue (packages/meteor.js:1186:15)
at DDPServer._CurrentWriteFence.withValue (packages/ddp-server/livedata_server.js:717:46)
at Meteor.EnvironmentVariable.EVp.withValue (packages/meteor.js:1186:15)
at Promise (packages/ddp-server/livedata_server.js:715:46)
at new Promise (<anonymous>)
at Session.method (packages/ddp-server/livedata_server.js:689:23)
at packages/mdg_meteor-apm-agent.js:2617:38
at Meteor.EnvironmentVariable.EVp.withValue (packages/meteor.js:1186:15)
at Session.sessionProto.protocol_handlers.method (packages/mdg_meteor-apm-agent.js:2616:44)
at packages/ddp-server/livedata_server.js:559:43
Commit 4cf9813449 removed the checks as the original board might
not have all the required fields, but we actually still need to run
a general check on all parameters
- isCommentOnly and isNoComments are now optional
- Turn off import error checking, so something is imported anyway, and import does not stop at error.
- Now most of Sandstorm export do import to Standalone Wekan, but some of imported cards, dates etc are missing.
- Sandstorm Import Wekan board warning messages are now translateable.
Thanks to xet7 !
Closes#1945,
closes#1616,
closes#1903
This commit also removes the “import a single Trello card” as we couldn’t figure
out some reasonable use case.
We also create a new publication on the server to provide the minimal user
profile informations required to display an avatar.
43de3b8 did prevent empty labels with the same color, but we also want
to prevent label with the same non-empty name and same color because
the rationale is identical.