Skip to content

Commit ffb1fbb

Browse files
waleedlatif1claude
andcommitted
feat(confluence): wire triggers into block and webhook processor
Add trigger subBlocks and triggers config to ConfluenceV2Block so triggers appear in the UI. Add Confluence signature verification and event filtering to the webhook processor. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 2645e5c commit ffb1fbb

File tree

2 files changed

+93
-0
lines changed

2 files changed

+93
-0
lines changed

apps/sim/blocks/blocks/confluence.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import type { BlockConfig } from '@/blocks/types'
33
import { AuthMode } from '@/blocks/types'
44
import { normalizeFileInput } from '@/blocks/utils'
55
import type { ConfluenceResponse } from '@/tools/confluence/types'
6+
import { getTrigger } from '@/triggers'
67

78
export const ConfluenceBlock: BlockConfig<ConfluenceResponse> = {
89
type: 'confluence',
@@ -838,7 +839,46 @@ export const ConfluenceV2Block: BlockConfig<ConfluenceResponse> = {
838839
],
839840
},
840841
},
842+
843+
// Trigger subBlocks
844+
...getTrigger('confluence_page_created').subBlocks,
845+
...getTrigger('confluence_page_updated').subBlocks,
846+
...getTrigger('confluence_page_removed').subBlocks,
847+
...getTrigger('confluence_page_moved').subBlocks,
848+
...getTrigger('confluence_comment_created').subBlocks,
849+
...getTrigger('confluence_comment_removed').subBlocks,
850+
...getTrigger('confluence_blog_created').subBlocks,
851+
...getTrigger('confluence_blog_updated').subBlocks,
852+
...getTrigger('confluence_blog_removed').subBlocks,
853+
...getTrigger('confluence_attachment_created').subBlocks,
854+
...getTrigger('confluence_attachment_removed').subBlocks,
855+
...getTrigger('confluence_space_created').subBlocks,
856+
...getTrigger('confluence_space_updated').subBlocks,
857+
...getTrigger('confluence_label_added').subBlocks,
858+
...getTrigger('confluence_label_removed').subBlocks,
859+
...getTrigger('confluence_webhook').subBlocks,
841860
],
861+
triggers: {
862+
enabled: true,
863+
available: [
864+
'confluence_page_created',
865+
'confluence_page_updated',
866+
'confluence_page_removed',
867+
'confluence_page_moved',
868+
'confluence_comment_created',
869+
'confluence_comment_removed',
870+
'confluence_blog_created',
871+
'confluence_blog_updated',
872+
'confluence_blog_removed',
873+
'confluence_attachment_created',
874+
'confluence_attachment_removed',
875+
'confluence_space_created',
876+
'confluence_space_updated',
877+
'confluence_label_added',
878+
'confluence_label_removed',
879+
'confluence_webhook',
880+
],
881+
},
842882
tools: {
843883
access: [
844884
// Page Tools

apps/sim/lib/webhooks/processor.ts

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import { getWorkspaceBilledAccountUserId } from '@/lib/workspaces/utils'
2828
import { resolveOAuthAccountId } from '@/app/api/auth/oauth/utils'
2929
import { executeWebhookJob } from '@/background/webhook-execution'
3030
import { resolveEnvVarReferences } from '@/executor/utils/reference-validation'
31+
import { isConfluenceEventMatch } from '@/triggers/confluence/utils'
3132
import { isGitHubEventMatch } from '@/triggers/github/utils'
3233
import { isHubSpotContactEventMatch } from '@/triggers/hubspot/utils'
3334
import { isJiraEventMatch } from '@/triggers/jira/utils'
@@ -707,6 +708,31 @@ export async function verifyProviderAuth(
707708
}
708709
}
709710

711+
if (foundWebhook.provider === 'confluence') {
712+
const secret = providerConfig.secret as string | undefined
713+
714+
if (secret) {
715+
const signature = request.headers.get('X-Hub-Signature')
716+
717+
if (!signature) {
718+
logger.warn(`[${requestId}] Confluence webhook missing signature header`)
719+
return new NextResponse('Unauthorized - Missing Confluence signature', { status: 401 })
720+
}
721+
722+
const isValidSignature = validateJiraSignature(secret, signature, rawBody)
723+
724+
if (!isValidSignature) {
725+
logger.warn(`[${requestId}] Confluence signature verification failed`, {
726+
signatureLength: signature.length,
727+
secretLength: secret.length,
728+
})
729+
return new NextResponse('Unauthorized - Invalid Confluence signature', { status: 401 })
730+
}
731+
732+
logger.debug(`[${requestId}] Confluence signature verified successfully`)
733+
}
734+
}
735+
710736
if (foundWebhook.provider === 'github') {
711737
const secret = providerConfig.secret as string | undefined
712738

@@ -930,6 +956,33 @@ export async function queueWebhookExecution(
930956
}
931957
}
932958

959+
// Confluence event filtering for event-specific triggers
960+
if (foundWebhook.provider === 'confluence') {
961+
const providerConfig = (foundWebhook.providerConfig as Record<string, any>) || {}
962+
const triggerId = providerConfig.triggerId as string | undefined
963+
964+
if (triggerId && triggerId !== 'confluence_webhook') {
965+
const event = body.event as string | undefined
966+
967+
if (!isConfluenceEventMatch(triggerId, event || '')) {
968+
logger.debug(
969+
`[${options.requestId}] Confluence event mismatch for trigger ${triggerId}. Event: ${event}. Skipping execution.`,
970+
{
971+
webhookId: foundWebhook.id,
972+
workflowId: foundWorkflow.id,
973+
triggerId,
974+
receivedEvent: event,
975+
}
976+
)
977+
978+
// Return 200 OK to prevent Confluence from retrying
979+
return NextResponse.json({
980+
message: 'Event type does not match trigger configuration. Ignoring.',
981+
})
982+
}
983+
}
984+
}
985+
933986
if (foundWebhook.provider === 'hubspot') {
934987
const providerConfig = (foundWebhook.providerConfig as Record<string, any>) || {}
935988
const triggerId = providerConfig.triggerId as string | undefined

0 commit comments

Comments
 (0)