iachat/.github/workflows
Sojan Jose 38f16ba677
feat: Secure external credentials with database encryption (#12648)
## Changelog

- Added conditional Active Record encryption to every external
credential we store (SMTP/IMAP passwords, Twilio tokens,
Slack/OpenAI hook tokens, Facebook/Instagram tokens, LINE/Telegram keys,
Twitter secrets) so new writes are encrypted
whenever Chatwoot.encryption_configured? is true; legacy installs still
receive plaintext until their secrets are
    updated.
- Tuned encryption settings in config/application.rb to allow legacy
reads (support_unencrypted_data) and to extend
deterministic queries so lookups continue to match plaintext rows during
the rollout; added TODOs to retire the
    fallback once encryption becomes mandatory.
- Introduced an MFA-pipeline test suite
(spec/models/external_credentials_encryption_spec.rb) plus shared
examples to
verify each attribute encrypts at rest and that plaintext records
re-encrypt on update, with a dedicated Telegram case.
The existing MFA GitHub workflow now runs these tests using the
preconfigured encryption keys.

fixes:
https://linear.app/chatwoot/issue/CW-5453/encrypt-sensitive-credentials-stored-in-plain-text-in-database

## Testing Instructions

 1. Instance without encryption keys
- Unset ACTIVE_RECORD_ENCRYPTION_* vars (or run in an environment where
they’re absent).
      - Create at least one credentialed channel (e.g., Email SMTP).
- Confirm workflows still function (send/receive mail or a similar
sanity check).
- In the DB you should still see plaintext values—this confirms the
guard prevents encryption when keys are missing.
  2. Instance with encryption keys
      - Configure the three encryption env vars and restart.
- Pick a couple of representative integrations (e.g., Email SMTP +
Twilio SMS).
      - Legacy channel check:
- Use existing records created before enabling keys. Trigger their
workflow (send an email / SMS, or hit the
            webhook) to ensure they still authenticate.
- Inspect the raw column—value remains plaintext until changed.
      - Update legacy channel:
- Edit one legacy channel’s credential (e.g., change SMTP password).
- Verify the operation still works and the stored value is now encrypted
(raw column differs, accessor returns
            original).
      - New channel creation:
- Create a new channel of the same type; confirm functionality and that
the stored credential is encrypted from
            the start.

---------

Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com>
2025-10-13 18:05:12 +05:30
..
auto-assign-pr.yml chore: Auto assign PR to author when PR opened (#11890) 2025-07-10 11:36:37 +05:30
deploy_check.yml chore: Cancel redundant ci runs on consecutive pushes on the same PR (#11851) 2025-07-02 15:25:30 +05:30
frontend-fe.yml fix: Updating the Ubuntu version to run the tests (#11260) 2025-04-08 16:36:06 -07:00
lint_pr.yml chore(ci): Ensure PR titles are in semantic format (#7346) 2023-06-19 16:48:45 +05:30
lock.yml chore: Remove closing comment on issues/PRs (#9964) 2024-08-20 14:27:15 +05:30
logging_percentage_check.yml chore: Cancel redundant ci runs on consecutive pushes on the same PR (#11851) 2025-07-02 15:25:30 +05:30
nightly_installer.yml fix: Updating the Ubuntu version to run the tests (#11260) 2025-04-08 16:36:06 -07:00
publish_codespace_image.yml chore: Update Codespaces (#11621) 2025-05-29 01:45:00 -06:00
publish_ee_docker.yml feat: docker arm64 builds for ee edition (#10891) 2025-02-12 16:28:53 +05:30
publish_foss_docker.yml fix: docker github action for ce images (#10800) 2025-01-30 15:52:01 +05:30
run_foss_spec.yml fix: Updating the Ubuntu version to run the tests (#11260) 2025-04-08 16:36:06 -07:00
run_mfa_spec.yml feat: Secure external credentials with database encryption (#12648) 2025-10-13 18:05:12 +05:30
size-limit.yml chore: Cancel redundant ci runs on consecutive pushes on the same PR (#11851) 2025-07-02 15:25:30 +05:30
stale.yml chore: add stale PR bot (#6289) 2023-01-19 18:53:21 +05:30
test_docker_build.yml chore: add gh action to test docker builds against PRs (#10892) 2025-02-12 17:16:33 +05:30