曾与蒿藜同雨露,한때 잡초와 쑥과 함께 비와 이슬을 나누던 곳이 이제는 소나무와 삼나무와 함께 서리와 눈을 견뎌내고 있다.终随松柏到冰霜.かつては雑草やヨモギと共に雨や露を分かち合っていたが、今では松やヒノキと共に霜や雪に耐えている。曾与蒿藜同雨露,Once sharing rain and dew with weeds and wormwood, now enduring frost and snow with pines and cypresses.终随松柏到冰霜.曾与蒿藜同雨露한때 잡초와 쑥과 함께 비와 이슬을 나누던 곳이 이제는 소나무와 삼나무와 함께 서리와 눈을 견뎌내고 있다.,终随松柏到冰霜.譖セ荳手珍阯懷酔髮ィ髴イ�檎サ磯囂譚セ譟丞芦蜀ー髴�曾与蒿藜同雨露,鏇句笌钂胯棞鍚岄洦闇诧紝缁堥殢鏉炬煆鍒板啺闇�终随松柏到冰霜.曾与蒿藜同雨露,한때 잡초와 쑥과 함께 비와 이슬을 나누던 곳이 이제는 소나무와 삼나무와 함께 서리와 눈을 견뎌내고 있다.终随松柏到冰霜.曾与蒿藜同雨露,终随松柏到冰霜.
4.91v
1. Notable changes since 4.90v
- Chat widget CAPTCHA providers: added Google reCAPTCHA v3 and Cloudflare Turnstile support for verifying chat widget visitors through provider-based CAPTCHA validation; CAPTCHA settings gained a chat-specific enable flag and a configurable reCAPTCHA v3 score threshold; a dedicated widget CAPTCHA helper loads the provider script and resolves the token, which is now sent and verified as part of the widget online chat submission; the CAPTCHA settings screen gained a provider toggle and CAPTCHA settings are exposed through the widget online settings endpoint.
- Canned message replaceable variables: added a `configuration` field to `lh_canned_msg_replace` storing per-variable JSON options to hide the variable value from the replaceable variables list ("Hide value in list") and to restrict management of the variable to operators holding the new `use_replace_sensitive` permission of the `lhcannedmsg` module ("Restricted access"); restricted variables show a "Restricted" badge, their value and clone/edit/delete actions are hidden from operators without the permission, and access control is enforced in the clone, edit and delete handlers.
- Exact counts for chat and mail searches: the chat and mail conversation search panels gained an "Exact count" toggle; by default the result total is capped by counting only the first 1,000 matching rows through new `limit_count` support in `getCount()`, avoiding slow full-table scans on large result sets, and the paginator shows an approximate total ("~") whenever the count was capped; enabling "Exact count" performs a precise count of every matching row.
- Bot REST API actions: authentication credentials used for NTLM, Bearer token and API key (header and query parameter) requests now resolve through replaceable variables; authorization headers are masked in debug logs by shortening them from both sides so secrets are not exposed; new user language dynamic variables (`{{user_locale}}`, `{{user_site_access}}`, `{{user_content_language}}`, `{{user_content_language_name}}`) were added for REST API bot actions, backed by a new `user_language` magic property on the chat model; streaming requests gained a configurable row start pattern so response streams that do not use the SSE `data: {` prefix are parsed correctly.
- Bot trigger arguments: invisible message arguments (`{message_invisible_N}`) passed from the widget are now consistently forwarded to every trigger execution path, including theme-based bot trigger execution and the default trigger, by centralizing trigger argument processing early in the widget online submission flow.
- Offline reasons for operators: the offline reasons feature now supports operator access control through a new `offlinereasons_operator` permission that can be granted with limitations restricting operators to specific reasons; the status (online/offline) modal shows a reason selector when an operator goes offline and stores the selection as `offline_reason_id`, and only the reasons an operator is allowed to use are exposed in the dashboard and status modal; the permission editor and "who grants" summary show the offline-reason limitation, specific function limitations are now respected over wildcard grants, and offline reasons can be deleted.
- Statistics averages: agent statistics averages now include the full result set instead of trimming the highest and lowest ten percent, and preserve fractional values when computing the averages.
- Security hardening: file downloads in incoming webhooks and online-user avatar fetching were hardened against SSRF - only HTTP/HTTPS URLs are accepted, `localhost` and private/reserved IP addresses are rejected, the resolved hostname is pinned to a validated IP to prevent DNS rebinding, and redirect following is disabled; message validation and the message preview modal were fixed.
- Reliability: the bot "Close chat" command now runs inside a database transaction with row locking to prevent race conditions and partial state updates during chat closure; the mail conversation fetch API returns an error instead of failing fatally when the conversation cannot be found; mailbox syncing now limits SQL statement execution and lock-wait time and sets IMAP open/read/write/close timeouts so a slow mail server cannot stall the sync process.
- Message masking test tool: added a chat-context simulation mode where a chat and a test message are supplied and the tool reproduces the real widget masking flow with step-by-step diagnostics (chat found, guardrails enabled, chat assigned to operator, matching masking rule, operator permission, masking result) using the chat's department, assigned operator and permissions, along with clearer explanations.
- Miscellaneous: added RAR and other MIME type detection for downloaded webhook attachments; added Latvian (`lv_LV`) and Estonian (`et_EE`) translations and updated the translation update script; widened the widget theme custom CSS fields from `text` to `mediumtext` to prevent CSS truncation; updated install scripts and database structure definitions; bumped version to 4.91v.
2. Summary
- This release focuses on safeguarding sensitive data, richer chat widget CAPTCHA options, and performance tuning for large searches.
- Chat widget visitors can now be verified with Google reCAPTCHA v3 or Cloudflare Turnstile, controlled by a chat-specific CAPTCHA switch and a configurable score threshold.
- Canned message replaceable variables can hide their values from lists and be locked down to operators with a dedicated permission.
- Chat and mail searches gain an "Exact count" option while default counts are capped and marked approximate for large result sets.
- Bot REST API actions support variable-based authentication with masked secrets, user language variables, and flexible streaming row parsing, and invisible message arguments now reach all trigger workflows.
- Offline reasons become permission-controlled, file downloads are hardened against SSRF, and mail fetching, chat closing, statistics averaging and translation coverage were improved.
execute doc/update_db/update_357.sql for update
4.90v
1. Notable changes since 4.88v
- Track who set a user online: added `online_by_user_id` column to `lh_users_online_session` recording which operator set a user online; online-hours statistics gained a "Set online by" column showing that operator.
execute doc/update_db/update_356.sql for update
4.89v
1. Notable changes since 4.88v
- Online operators widget customization: added a new "Online operators widget settings" screen under Statistics (`statistic/onlineopsettings`) with a new `onlineop_settings` permission, letting operators choose which columns appear in the online operators dashboard widget (Name, Status, Last assignment, Live chats/free slots, Department, Reason for offline, Session duration) and their position; the widget now renders the configured columns, shows "offline since" in the name column when a dedicated column is hidden, restores expand/collapse actions, preserves passed column widths and allows controlling widget columns from the embed code.
- Track who set a user offline: added `updated_by_user_id` column to `lh_users_online_session` recording which operator set a user offline or online; online-hours statistics gained a "Set offline by" column showing that operator, with the offline action attributed only to the operator who explicitly set the user offline; last visit is now updated when toggling the hide-online status in user edit.
- Autoclose enhancements: all autoclose settings now accept fractional timeout values; the activity timeout supports sender-based modes by appending `,1` (close only when the visitor sent the last message) or `,2` (close only when the operator sent the last message) to the configured value; settings descriptions in the chat list configuration were clarified.
- Chat cleanup on close: `cleanupOnClose()` is now executed when chats are closed via the cronjob or by changing their status (previously it only ran on manual close), removing orphaned records such as auto-responder chat links, bot repeat restrictions, bot chat events, pending bot events, voice/video sessions, transfers, group chats and temporary files; a new utility cron `cron/util/cleanup_orphan_chats_data` cleans orphaned chat data for chats that were closed before this fix, iterating chats from newest to oldest with an optional start chat id parameter.
- Blocked users search: added a block type (`btype`) filter to the blocked users search covering all block types (IP, Nick, Nick and Department, IP + Nick, IP + Nick and Department, E-mail, Country, Online user, Sender E-mail).
- Transfer department window: improved the transfer department window using the searchable multi-dropdown with radio selection and added `on_change` handler support to the multi-dropdown renderer.
- Mail conversations: added "Expand all"/"Collapse all" actions to the mail conversation screen for quickly expanding or collapsing all message bodies.
- Message edit history: added a new "Preview message" modal (`chat/previewmsg`) and an "Edited" link on edited admin messages opening the preview with the edit history.
- Widget filters reset: "Reset widget filters" now clears widget local storage client-side instead of performing a server-side action; fixed a related typo.
- Miscellaneous: added the Isle of Man flag icon; updated install scripts and database structure definition for the new column; bumped version to 4.89v.
2. Summary
- This release focuses on dashboard customization and data hygiene.
- The online operators widget becomes fully configurable with selectable and reorderable columns, backed by a new settings screen and permission.
- Online-hours statistics now show which operator set a user offline, recorded in a new `updated_by_user_id` field.
- Autoclose rules gain finer control with fractional timeouts and sender-based activity modes, while close-time cleanup is fixed for cron/status-driven closures, with a dedicated script to purge previously orphaned data.
- Search, transfer, mail, and message-preview UX are improved across blocked users, department transfer, mail conversations, and edited-message history.
execute doc/update_db/update_355.sql for update
4.88v
1. Notable changes since 4.87v
- Offline reasons: introduced configurable offline reasons with the new `lh_abstract_offline_reason` model and CRUD interface; operators can select a reason (e.g. "Lunch", "Meeting") with an icon when setting themselves offline, persisted on `lh_users` and `lh_users_online_session`; offline reasons are displayed in online-hours statistics and user-box menus with a redesigned status control layout; a new `offlinereasons` permission controls access to this feature.
- Forms module overhaul: added comprehensive search and filtering for collected forms, including department filter, chat operator filter, date range, creator filter, and chat-time search; introduced field change tracking for internal forms — when an operator edits a previously submitted form, field history (old/new values and modifier) is logged; added translation support and improved template variable management for forms; refactored module navigation with proper permission checks and removed deprecated index page; enhanced embed code generation with access control; clearing chat attributes when deleting collected form data now properly reverts associated chat variables and additional data entries.
- Bot enhancements: added secondary translations group support for bots, allowing an optional second translations group in bot configuration with proper validation and item retrieval from both groups; added "Trigger on bot skip" option to proactive invitations, executing triggers when a visitor skips the bot; fixed missing `last_msg_id` update after sending invitation messages.
- Security hardening: refactored CAPTCHA to use browser fingerprinting (combining multiple HTTP headers) and SHA-256 hashing for improved security across chat validation, FAQ, voting, and widget modules; added more detailed CAPTCHA error messages; added `ignoreactivityglobal` permission allowing individual users to opt out of activity tracking; replaced redirect with proper permission-denied page for abstract list views; added `from_address` emptiness check to prevent mailbox sync failures on null sender addresses.
- Performance and stability: improved MySQL reconnect logic by removing stale connection caching and properly resetting reconnect counters; guarded compiled config caching behind database connection checks to prevent warmup/CLI failures; wrapped `setinactive.php` in a transaction with row locking and added `syncAndLock()` to `setoffline.php` to prevent race conditions on online status updates; added `resetSession()` methods across persistent session helpers for clearing cached ezcPersistentSession instances; added server info panel showing address, name, port, software, and uptime in audit configuration.
- Admin custom fields: refactored processing to prevent duplicate field values by moving admin fields after JS variable processing and tracking processed identifiers; admin custom fields with `uempty` show condition are now hidden from returning visitors who already have a non-default nickname set; added support for original author re-modifying fields.
- UI and UX: updated Bootstrap badge classes from v4 to v5 (`badge-*` to `bg-*`) across GroupChat, operators template, and mailing import templates; improved assignment configuration UX; translated theme before survey rendering in `fill` and `fillwidget` modules; adjusted naming for less confusion; added server and user timestamps to audit config and login pages.
- Miscellaneous: fixed #2400; added support for BOM UTF format files; added avatar caching; added search attribute support for extensions; fixed installer config validation with clearer error messages; refactored `addmsgadmin.php` input validation to handle missing input gracefully; handled edge database reconnect cases; fixed CAPTCHA time drift validation; ensured dynamic property support.
2. Summary
- This release introduces a major new feature — configurable offline reasons — allowing operators to specify why they are offline with visual indicators across the UI and statistics.
- The forms module receives a comprehensive upgrade with advanced search/filtering, field change tracking, translation support, and improved permission handling.
- Bot capabilities expand with secondary translations groups and trigger-on-skip functionality.
- Security is strengthened through CAPTCHA fingerprinting, SHA-256 hashing, and multiple permission/validation improvements.
- Performance and stability are enhanced with improved MySQL reconnect handling, race condition fixes, and guarded config caching.
execute doc/update_db/update_354.sql for update
4.87v
1. Notable changes since 4.86v
- Performance and caching: improved dashboard online-operator retrieval with better user-data fetching and caching; prefill departments cache for faster lookups; ensure static cache version is respected across the application even without extensions; optimized chat archive range fetching with cached range checks before database queries, plus methods for matching ranges and verifying chat existence in archives with proper overlap handling.
- Performance statistics: added total offline time tracking to agent statistics widgets with new help modal explaining offline time; updated translations, tooltip descriptions, and column spans in the agent statistics table for improved clarity; enhanced operator performance access checks to include write permissions.
- Webhooks and events: added support for unread-message flow in webhook conditions with checkboxes enabling unread-message handling for admin messages; updated backend logic across message types and enhanced chat update logic to reflect unread-message states for operators; dropped redundant `chat_id` dependency.
- Mail conversation: enhanced Mail Conversation API and search functionality; added proper API error handling.
- Bot: refactored bot condition evaluation to streamline logic in action buttons and text triggers; updated type casting for threshold values in bot action commands.
- ChatML export: significantly improved ChatML export logic and configuration; fixed properties in exported ChatML; resolved edge cases and format inconsistencies; export script improvements.
- REST API: added support for REST file captions with configurable skip extensions (#2394).
- Template and variable system: added support for `{item:path}` syntax enabling nested attribute extraction in output formatting; host values now support replaceable variables; fixed item replacement logic for proper handling of non-string values in templates.
- Debug and diagnostics: improved debug invitation logic with detailed checks for message-seen status, timeout handling, and reshown conditions; enhanced debug message view UX, API scroll behavior, spacing, and col-span variables; logs now include exception URLs; added logging for changed user groups.
- Widget and online visitors: dedicated online visitors page now always shows visitors even when the widget is minimized.
- Bug fixes: fixed #2391 and #2395; updated checkbox labels for clarity; trimmed whitespace from messages before saving for data consistency; updated message retrieval limits across components for better performance and consistency; avoided throwing SQL errors in edge cases.
2. Summary
- This release strengthens performance through improved caching strategies (departments, archive ranges, static cache, operator data) and extends performance statistics with offline-time tracking.
- Webhook conditions gain unread-message-flow support, bot condition evaluation is streamlined, and the ChatML export pipeline receives a comprehensive overhaul.
- Template variables now support nested `{item:path}` extraction, debug/invitation diagnostics are enhanced, and several stability issues are resolved.
execute doc/update_db/update_353.sql for update
4.86v
1. Notable changes since 4.85v
- Performance statistics dashboard widgets: added new `dep_performance` and `op_performance` dashboard widgets that display real-time aggregated statistics for departments and operators respectively; widgets support configurable columns (chats received, chats answered, wait time, first/average response time, thumbs up/down, online/offline time) with configurable position and update intervals; new settings UI under Statistics for both department and operator performance configuration.
- Performance stats cron aggregator: new cron job (`cron/stats/performance`) aggregates department and operator performance data into the new `lh_abstract_performance` table; supports forced regeneration via `-p force`; configurable update interval and day range; cron respects sql_mode and local timezone settings.
- New `Performance` and `PerformanceWidgets` models: `Performance` model stores/retrieves serialized performance snapshots; `PerformanceWidgets` provides formatted data for dashboard sync, including per-department and per-operator stats with access-control filtering.
- Security and authentication hardening: improved password verification logic in REST API validator; added constant-time response delay in forgot-password flow to mitigate timing attacks; updated hashing methods for login and password update flows; implemented expired hash cleanup (deleteExpiredHashes) called from setRemindHash, remindpassword, and forgotpassword modules; removed LDAP authentication components; updated autologin with nonce support and improved hash validation; masked error messages for users without access to unhidden emails in send and reply APIs.
- Bot and event system: enhanced chat variable update handling and event dispatching; ignored default trigger message when a trigger is started manually; added support for invisible arguments in bot triggers; added event dispatch for transfer-to-human action; added event argument for custom is-online status checks.
- Editor and operator UI: added switch-editor option in active chat tab and a new permission for operators to toggle between new and old editors; added icons and colors to the transfer window; increased subject modal window width; fixed form loading scroll event; avoided null being displayed before a chat starts.
- Export and reports: enhanced export functionality with ChatML support and UI improvements; fixed compatibility with non-strict sql_mode for certain reports.
- Bug fixes: fixed matching rule search; minor fixes including string conversion and typo corrections.
2. Summary
- This release introduces a new real-time performance dashboard with configurable department and operator widgets backed by a cron aggregator and a dedicated `lh_abstract_performance` table.
- Security is hardened across authentication flows: stronger hashing, timing-safe responses, expired hash cleanup, autologin nonce support, and LDAP removal.
- Operator productivity is improved with a switchable editor, richer transfer UI, and expanded bot/event capabilities. Export and report compatibility are also addressed.
execute doc/update_db/update_352.sql for update