# RedmineUP Local Fork Changelog The installed RedmineUP `redmine_contacts` and `redmine_contacts_helpdesk` plugins are treated as locally maintained legacy code for this Redmine 3.4.4 environment. Before risky edits, archive the current plugin directories in `dist/` and record the purpose, touched behavior, and LAN test result here. ## Current Checkpoint - Baseline: - Redmine `3.4.4` - `redmine_contacts` `4.1.2 PRO` - `redmine_contacts_helpdesk` `3.0.9 PRO` - Strategic direction: - Treat helpdesk/customer data as first-class. - Prefer local-fork plugin edits when they unlock safer search/indexing. - Keep Redmine request paths independent from external worker/index failures. - Implemented locally: - `redmine_event_outbox` plugin with issue/journal/contact events. - Optional helpdesk outbox hooks for `HelpdeskTicket` and `JournalMessage`. - Read-only `helpdesk_search/*` JSON endpoints in the local helpdesk fork. - Standalone contact CLI and read-only helpdesk export/search CLI. - LAN deployment status: - Helpdesk search routes were deployed and route-loaded successfully on the LAN Redmine copy. - Short alias/usage routes were added to avoid noisy routing errors during manual browser testing. - Full end-to-end helpdesk outbox validation is still pending. - Next meaningful milestone: - Build the external worker/indexer that consumes `event_outbox_events`, enriches via read-only MySQL joins, and emits deterministic ticket/message documents for external indexing. ## 2026-04-24 - POP3 Get Mail Compatibility Fix - Touched plugin: - `redmine_contacts` - `redmine_contacts_helpdesk` - Purpose: - Fix Helpdesk POP3 retrieval on the LAN test host when Ruby 2.5 raises `FrozenError: can't modify frozen String` inside `Net::POP3`. - Allow Helpdesk outbound mail to use Mailpit's unauthenticated SMTP listener. - Behavior changed: - Changed POP3 message retrieval from `msg.pop` to `msg.pop(String.new)` so Ruby's POP3 code appends chunks into an explicit mutable destination string. - This does not change message handling semantics; it only avoids relying on Ruby's default empty string argument being mutable. - Changed Helpdesk SMTP delivery option construction to omit `authentication`, `user_name`, and `password` when the project SMTP authentication setting is blank. - LAN test result: - Deployed to `/usr/share/redmine/plugins/redmine_contacts`. - `HelpdeskMailer.check_project(Project.find("fud-helpdesk").id)` completed successfully and processed 1 message. - Deployed to `/usr/share/redmine/plugins/redmine_contacts_helpdesk`. - Mailpit rejected `AUTH PLAIN` with `502 5.5.1 Command not implemented`. After blanking SMTP auth settings and omitting auth options, a Helpdesk test mail for issue `#39863` was delivered to Mailpit. ## 2026-04-21 - Helpdesk Search Foundation - Archives created before plugin edits: - `dist/redmine_contacts-4.1.2-local-before-helpdesk-search-20260421T215548Z.tar.gz` - `dist/redmine_contacts_helpdesk-3.0.9-local-before-helpdesk-search-20260421T215548Z.tar.gz` - Touched plugins: - `redmine_contacts_helpdesk` - `redmine_event_outbox` - Purpose: - Make helpdesk ticket and message identity available to external search and indexing workers. - Avoid relying on Redmine issue author when helpdesk-created tickets use `Anonymous`. - Behavior changed: - Added read-only `helpdesk_search/*` JSON endpoints guarded by the existing `view_helpdesk_tickets` permission. - Added optional outbox hooks for `HelpdeskTicket` and `JournalMessage`. - Payload/content policy: - Include ids, source, direction, message id, and non-body address metadata. - Do not copy email bodies, private note text, attachments, or BCC addresses into event rows or the read API. - LAN test result: - Pending. Validate on the LAN Redmine copy by creating/updating a controlled helpdesk ticket and journal message, checking `event_outbox_events`, and calling the new `helpdesk_search/*` endpoints with a user/API key that has `view_helpdesk_tickets`.