Compare commits

...
Author SHA1 Message Date
Sonarly Claude Code 0ed0afab57 handleAliases.map() crashes when field is string not array
https://sonarly.com/issue/22112?type=bug

Contact auto-creation crashes with TypeError because connectedAccount.handleAliases can be a plain string after migration from workspace TEXT column to core varchar[] column, but the code assumes it is always an array.

Fix: Replaced `connectedAccount.handleAliases || []` with `Array.isArray(connectedAccount.handleAliases) ? connectedAccount.handleAliases : []` at both usage sites where handleAliases is consumed as an array.

The `|| []` fallback only activates for falsy values (null, undefined, empty string), but a non-empty string like "alias1@example.com,alias2@example.com" is truthy, so it passes through and then fails on .map() or .includes() with array semantics. Array.isArray() correctly rejects strings and all non-array types, ensuring we always operate on a real array.

Two files changed:
1. filter-out-contacts-that-belong-to-self-or-workspace-members.util.ts (line 23) — the crash site from the Sentry error
2. messaging-save-messages-and-enqueue-contact-creation.service.ts (line 52) — same pattern, would cause incorrect substring matching (not a crash, but wrong behavior) if handleAliases were a string
2026-04-06 10:29:12 +00:00
2 changed files with 8 additions and 4 deletions
@@ -18,11 +18,13 @@ export function filterOutContactsThatBelongToSelfOrWorkspaceMembers(
connectedAccount.handle,
).toLowerCase();
const handleAliases = Array.isArray(connectedAccount.handleAliases)
? connectedAccount.handleAliases
: [];
const allHandles = [
connectedAccount.handle.toLowerCase(),
...(connectedAccount.handleAliases || []).map((handle) =>
handle.toLowerCase(),
),
...handleAliases.map((handle) => handle.toLowerCase()),
];
const workspaceMembersMap = workspaceMembers.reduce(
@@ -49,7 +49,9 @@ export class MessagingSaveMessagesAndEnqueueContactCreationService {
connectedAccount: ConnectedAccountEntity,
workspaceId: string,
) {
const handleAliases = connectedAccount.handleAliases || [];
const handleAliases = Array.isArray(connectedAccount.handleAliases)
? connectedAccount.handleAliases
: [];
const authContext = buildSystemAuthContext(workspaceId);
const participantsWithMessageId =