link-stack/packages/zammad-addon-link
Claude 33375c9221
Add media verification addon with C2PA/ProofMode support
Introduces a new zammad-addon-media-verify package that uses the proofmode
Ruby gem (built from proofmode-rust) to verify media attachments on tickets
for C2PA content credentials and ProofMode cryptographic proofs.

The addon runs as a Zammad scheduled job that:
- Scans incoming ticket articles for media attachments (images, video, audio, PDFs, ZIPs)
- Calls proofmode check_files() to verify C2PA manifests, PGP signatures,
  OpenTimestamps, and EXIF metadata
- Posts a human-readable verification report as an internal note on the ticket
- Tracks checked articles via preferences to avoid duplicate processing

Also restores the zammad-addon-common package (previously removed in repo cleanup)
to share build tooling (ZPM builder and migration generator) between addon packages,
keeping things DRY. The link addon now imports from common instead of inlining these.

Docker integration:
- Dockerfile updated to install proofmode gem from docker/zammad/gems/
- setup.rb updated to handle MediaVerify package lifecycle

https://claude.ai/code/session_01GJYbRCFFJCJDAEcEVbD36N
2026-02-15 13:56:57 +00:00
..
scripts Add media verification addon with C2PA/ProofMode support 2026-02-15 13:56:57 +00:00
src Make APIs more similar 2026-02-15 10:29:52 +01:00
package.json Add media verification addon with C2PA/ProofMode support 2026-02-15 13:56:57 +00:00
README.md Repo cleanup 2026-02-10 08:36:04 +01:00

CDR Link Zammad Addon

Overview

The CDR Link addon integrates external communication channels (Signal, WhatsApp, Voice) into Zammad, supporting both the classic UI and the new Vue-based desktop/mobile interfaces.

Features

Signal Channel Integration

  • Reply button on customer Signal messages
  • "Add Signal message" button in ticket reply area
  • 10,000 character limit with warning at 5,000
  • Plain text format with attachment support
  • Full integration with both classic and new Vue-based UI

WhatsApp Channel Integration

  • Reply button on customer WhatsApp messages
  • "Add WhatsApp message" button in ticket reply area
  • 4,096 character limit with warning at 3,000
  • Plain text format with attachment support
  • Full integration with both classic and new Vue-based UI

Voice Channel Support

  • Classic UI implementation maintained
  • New UI support ready for future implementation

Channel Restriction Settings (NEW)

  • Control which reply channels appear in the UI
  • Configurable via cdr_link_allowed_channels setting
  • Acts as a whitelist while preserving contextual logic
  • Empty setting falls back to default Zammad behavior

Installation

Prerequisites

  • Zammad 6.0+ (for new UI support)
  • CDR Bridge backend services configured
  • Signal/WhatsApp/Voice services running

Installation Steps

  1. Build the addon package:
cd packages/zammad-addon-link
pnpm run build
  1. Install in Zammad:
# Copy the generated .zpm file to your Zammad installation
cp dist/bridge-vX.X.X.zpm /opt/zammad/

# Install using Zammad package manager
zammad run rails r "Package.install(file: '/opt/zammad/bridge-vX.X.X.zpm')"

# Restart Zammad
systemctl restart zammad

Configuration

Channel Restriction Settings

Control which reply channels are available in the ticket interface:

# Rails console
Setting.set('cdr_link_allowed_channels', 'note,signal message')  # Signal only
Setting.set('cdr_link_allowed_channels', 'note,whatsapp message') # WhatsApp only
Setting.set('cdr_link_allowed_channels', 'note,signal message,whatsapp message') # Both
Setting.set('cdr_link_allowed_channels', '') # Default behavior (all channels)

How it works:

  • The setting acts as a whitelist of allowed channels
  • Channels must be both in the whitelist AND contextually appropriate
  • For example, Signal replies only appear for tickets that originated from Signal
  • Empty or unset falls back to default Zammad behavior
  • Changes take effect immediately (browser refresh required)

Development

Adding New Channels

  1. Create TypeScript plugin in app/frontend/shared/entities/ticket-article/action/plugins/
  2. Add desktop UI plugin in app/frontend/apps/desktop/pages/ticket/components/TicketDetailView/article-type/plugins/
  3. Add corresponding backend implementation
  4. Create database migrations in src/db/addon/link/

Building the Package

# Update version and changelog in bridge-skeleton.szpm
# Build the package
make
# Output: dist/bridge-vX.X.X.szpm

Create a New Migration

Helper script to create new migrations (requires python inflection library):

# Install dependency
apt install python3-inflection  # Debian/Ubuntu
# Or: pip install --user inflection

# Create migration
make new-migration

Compatibility

  • Zammad 6.0+: Both Classic and New UI
  • Browser Support: All modern browsers

API Endpoints

Voice Channel

POST to submission endpoint with Authorization: SUBMISSION_TOKEN header:

{
  "startTime": "ISO date string",
  "endTime": "ISO date string",
  "to": "fully qualified phone number",
  "from": "fully qualified phone number",
  "duration": "recording duration string",
  "callSid": "unique call identifier",
  "recording": "base64 encoded binary",
  "mimeType": "binary mime-type string"
}

Signal/WhatsApp Channels

Handled via CDR Bridge backend services - see bridge documentation for API details.

License

License GNU AGPL v3.0

This is a free software project licensed under the GNU Affero General Public License v3.0 (GNU AGPLv3) by The Center for Digital Resilience and Guardian Project.