## Change Log for Release asterisk-20.9.0-rc1 ### Links: - [Full ChangeLog](https://downloads.asterisk.org/pub/telephony/asterisk/releases/ChangeLog-20.9.0-rc1.md) - [GitHub Diff](https://github.com/asterisk/asterisk/compare/20.8.1...20.9.0-rc1) - [Tarball](https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-20.9.0-rc1.tar.gz) - [Downloads](https://downloads.asterisk.org/pub/telephony/asterisk) ### Summary: - Commits: 20 - Commit Authors: 9 - Issues Resolved: 8 - Security Advisories Resolved: 0 ### User Notes: - #### app_voicemail_odbc: Allow audio to be kept on disk This commit adds a new voicemail.conf option 'odbc_audio_on_disk' which when set causes the ODBC variant of app_voicemail_odbc to leave the message and greeting audio files on disk and only store the message metadata in the database. Much more information can be found in the voicemail.conf.sample file. - #### app_queue: Add option to not log Restricted Caller ID to queue_log Add a Queue option log-restricted-caller-id to control whether the Restricted Caller ID will be stored in the queue log. If log-restricted-caller-id=no then the Caller ID will be stripped if the Caller ID is restricted. - #### pbx.c: expand fields width of "core show hints" The fields width of "core show hints" were increased. The width of "extension" field to 30 characters and the width of the "device state id" field to 60 characters. - #### rtp_engine: add support for multirate RFC2833 digits No change in configuration is required in order to enable this feature. Endpoints configured to use RFC2833 will automatically have this enabled. If the endpoint does not support this, it should not include it in the SDP offer/response. Resolves: #699 ### Upgrade Notes: - #### app_queue: Add option to not log Restricted Caller ID to queue_log Add a new column to the queues table: queue_log_option_log_restricted ENUM('0','1','off','on','false','true','no','yes') to control whether the Restricted Caller ID will be stored in the queue log. ### Commit Authors: - Alexei Gradinari: (2) - Bastian Triller: (1) - Chrsmj: (1) - George Joseph: (4) - Igor Goncharovsky: (1) - Mike Bradeen: (2) - Sean Bright: (7) - Tinet-Mucw: (1) - Walter Doekes: (1) ## Issue and Commit Detail: ### Closed Issues: - 699: [improvement]: Add support for multi-rate DTMF - 736: [bug]: Seg fault on CLI after PostgreSQL CDR module fails to load for a second time - 765: [improvement]: Add option to not log Restricted Caller ID to queue_log - 770: [improvement]: pbx.c: expand fields width of "core show hints" - 776: [bug] DTMF broken after rtp_engine: add support for multirate RFC2833 digits commit - 783: [bug]: Under certain circumstances a channel snapshot can get orphaned in the cache - 789: [bug]: Mediasec headers aren't sent on outgoing INVITEs - 797: [bug]: ### Commits By Author: - ### Alexei Gradinari (2): - pbx.c: expand fields width of "core show hints" - app_queue: Add option to not log Restricted Caller ID to queue_log - ### Bastian Triller (1): - cli: Show configured cache dir - ### George Joseph (4): - app_voicemail_odbc: Allow audio to be kept on disk - stasis_channels: Use uniqueid and name to delete old snapshots - security_agreement.c: Always add the Require and Proxy-Require headers - ast-db-manage: Remove duplicate enum creation - ### Igor Goncharovsky (1): - res_pjsip_path.c: Fix path when dialing using PJSIP_DIAL_CONTACTS() - ### Mike Bradeen (2): - rtp_engine: add support for multirate RFC2833 digits - res_pjsip_sdp_rtp: Add support for default/mismatched 8K RFC 4733/2833 digits - ### Sean Bright (7): - file.h: Rename function argument to avoid C++ keyword clash. - bundled_pjproject: Disable UPnP support. - asterisk.c: Don't log an error if .asterisk_history does not exist. - xml.c: Update deprecated libxml2 API usage. - manager.c: Properly terminate `CoreShowChannelMap` event. - pjsip: Add PJSIP_PARSE_URI_FROM dialplan function. - logger.h: Include SCOPE_CALL_WITH_INT_RESULT() in non-dev-mode builds. - ### Tinet-mucw (1): - bridge_basic.c: Make sure that ast_bridge_channel is not destroyed while itera.. - ### Walter Doekes (1): - chan_ooh323: Fix R/0 typo in docs - ### chrsmj (1): - cdr_pgsql: Fix crash when the module fails to load multiple times. ### Commit List: - res_pjsip_path.c: Fix path when dialing using PJSIP_DIAL_CONTACTS() - res_pjsip_sdp_rtp: Add support for default/mismatched 8K RFC 4733/2833 digits - ast-db-manage: Remove duplicate enum creation - security_agreement.c: Always add the Require and Proxy-Require headers - logger.h: Include SCOPE_CALL_WITH_INT_RESULT() in non-dev-mode builds. - stasis_channels: Use uniqueid and name to delete old snapshots - app_voicemail_odbc: Allow audio to be kept on disk - app_queue: Add option to not log Restricted Caller ID to queue_log - pbx.c: expand fields width of "core show hints" - pjsip: Add PJSIP_PARSE_URI_FROM dialplan function. - manager.c: Properly terminate `CoreShowChannelMap` event. - cli: Show configured cache dir - xml.c: Update deprecated libxml2 API usage. - cdr_pgsql: Fix crash when the module fails to load multiple times. - asterisk.c: Don't log an error if .asterisk_history does not exist. - chan_ooh323: Fix R/0 typo in docs - bundled_pjproject: Disable UPnP support. - file.h: Rename function argument to avoid C++ keyword clash. - rtp_engine: add support for multirate RFC2833 digits ### Commit Details: #### res_pjsip_path.c: Fix path when dialing using PJSIP_DIAL_CONTACTS() Author: Igor Goncharovsky Date: 2024-05-12 When using the PJSIP_DIAL_CONTACTS() function for use in the Dial() command, the contacts are returned in text form, so the input to the path_outgoing_request() function is a contact value of NULL. The issue was reported in ASTERISK-28211, but was not actually fixed in ASTERISK-30100. This fix brings back the code that was previously removed and adds code to search for a contact to extract the path value from it. #### res_pjsip_sdp_rtp: Add support for default/mismatched 8K RFC 4733/2833 digits Author: Mike Bradeen Date: 2024-06-21 After change made in 624f509 to add support for non 8K RFC 4733/2833 digits, Asterisk would only accept RFC 4733/2833 offers that matched the sample rate of the negotiated codec(s). This change allows Asterisk to accept 8K RFC 4733/2833 offers if the UAC offfers 8K RFC 4733/2833 but negotiates for a non 8K bitrate codec. A number of corresponding tests in tests/channels/pjsip/dtmf_sdp also needed to be re-written to allow for these scenarios. Fixes: #776 #### ast-db-manage: Remove duplicate enum creation Author: George Joseph Date: 2024-07-08 Remove duplicate creation of ast_bool_values from 2b7c507d7d12_add_queue_log_option_log_restricted_.py. This was causing alembic upgrades to fail since the enum was already created in fe6592859b85_fix_mwi_subscribe_replaces_.py back in 2018. Resolves: #797 #### security_agreement.c: Always add the Require and Proxy-Require headers Author: George Joseph Date: 2024-07-03 The `Require: mediasec` and `Proxy-Require: mediasec` headers need to be sent whenever we send `Security-Client` or `Security-Verify` headers but the logic to do that was only in add_security_headers() in res_pjsip_outbound_register. So while we were sending them on REGISTER requests, we weren't sending them on INVITE requests. This commit moves the logic to send the two headers out of res_pjsip_outbound_register:add_security_headers() and into security_agreement:ast_sip_add_security_headers(). This way they're always sent when we send `Security-Client` or `Security-Verify`. Resolves: #789 #### logger.h: Include SCOPE_CALL_WITH_INT_RESULT() in non-dev-mode builds. Author: Sean Bright Date: 2024-06-29 Fixes #785 #### stasis_channels: Use uniqueid and name to delete old snapshots Author: George Joseph Date: 2024-05-08 Whenver a new channel snapshot is created or when a channel is destroyed, we need to delete any existing channel snapshot from the snapshot cache. Historically, we used the channel->snapshot pointer to delete any existing snapshots but this has two issues. First, if something (possibly ast_channel_internal_swap_snapshots) sets channel->snapshot to NULL while there's still a snapshot in the cache, we wouldn't be able to delete it and it would be orphaned when the channel is destroyed. Since we use the cache to list channels from the CLI, AMI and ARI, it would appear as though the channel was still there when it wasn't. Second, since there are actually two caches, one indexed by the channel's uniqueid, and another indexed by the channel's name, deleting from the caches by pointer requires a sequential search of all of the hash table buckets in BOTH caches to find the matching snapshots. Not very efficient. So, we now delete from the caches using the channel's uniqueid and name. This solves both issues. This doesn't address how channel->snapshot might have been set to NULL in the first place because although we have concrete evidence that it's happening, we haven't been able to reproduce it. Resolves: #783 #### app_voicemail_odbc: Allow audio to be kept on disk Author: George Joseph Date: 2024-04-09 This commit adds a new voicemail.conf option 'odbc_audio_on_disk' which when set causes the ODBC variant of app_voicemail to leave the message and greeting audio files on disk and only store the message metadata in the database. This option came from a concern that the database could grow to large and cause remote access and/or replication to become slow. In a clustering situation with this option, all asterisk instances would share the same database for the metadata and either use a shared filesystem or other filesystem replication service much more suitable for synchronizing files. The changes to app_voicemail to implement this feature were actually quite small but due to the complexity of the module, the actual source code changes were greater. They fall into the following categories: * Tracing. The module is so complex that it was impossible to figure out the path taken for various scenarios without the addition of many SCOPE_ENTER, SCOPE_EXIT and ast_trace statements, even in code that's not related to the functional change. Making this worse was the fact that many "if" statements in this module didn't use braces. Since the tracing macros add multiple statements, many "if" statements had to be converted to use braces. * Excessive use of PATH_MAX. Previous maintainers of this module used PATH_MAX to allocate character arrays for filesystem paths and SQL statements as though they cost nothing. In fact, PATH_MAX is defined as 4096 bytes! Some functions had (and still have) multiples of these. One function has 7. Given that the vast majority of installations use the default spool directory path `/var/spool/asterisk/voicemail`, the actual path length is usually less than 80 bytes. That's over 4000 bytes wasted. It was the same for SQL statement buffers. A 4K buffer for statement that only needed 60 bytes. All of these PATH_MAX allocations in the ODBC related code were changed to dynamically allocated buffers. The rest will have to be addressed separately. * Bug fixes. During the development of this feature, several pre-existing ODBC related bugs were discovered and fixed. They had to do with leaving orphaned files on disk, not preserving original message ids when moving messages between folders, not honoring the "formats" config parameter in certain circumstances, etc. UserNote: This commit adds a new voicemail.conf option 'odbc_audio_on_disk' which when set causes the ODBC variant of app_voicemail_odbc to leave the message and greeting audio files on disk and only store the message metadata in the database. Much more information can be found in the voicemail.conf.sample file. #### bridge_basic.c: Make sure that ast_bridge_channel is not destroyed while itera.. Author: Tinet-mucw Date: 2024-06-13 Resolves: https://github.com/asterisk/asterisk/issues/768 #### app_queue: Add option to not log Restricted Caller ID to queue_log Author: Alexei Gradinari Date: 2024-06-12 Add a queue option log-restricted-caller-id to strip the Caller ID when storing the ENTERQUEUE event in the queue log if the Caller ID is restricted. Resolves: #765 UpgradeNote: Add a new column to the queues table: queue_log_option_log_restricted ENUM('0','1','off','on','false','true','no','yes') to control whether the Restricted Caller ID will be stored in the queue log. UserNote: Add a Queue option log-restricted-caller-id to control whether the Restricted Caller ID will be stored in the queue log. If log-restricted-caller-id=no then the Caller ID will be stripped if the Caller ID is restricted. #### pbx.c: expand fields width of "core show hints" Author: Alexei Gradinari Date: 2024-06-13 The current width for "extension" is 20 and "device state id" is 20, which is too small. The "extension" field contains "ext"@"context", so 20 characters is not enough. The "device state id" field, for example for Queue pause state contains Queue:"queue_name"_pause_PSJIP/"endpoint", so the 20 characters is not enough. Increase the width of "extension" field to 30 characters and the width of the "device state id" field to 60 characters. Resolves: #770 UserNote: The fields width of "core show hints" were increased. The width of "extension" field to 30 characters and the width of the "device state id" field to 60 characters. #### pjsip: Add PJSIP_PARSE_URI_FROM dialplan function. Author: Sean Bright Date: 2024-06-02 Various SIP headers permit a URI to be prefaced with a `display-name` production that can include characters (like commas and parentheses) that are problematic for Asterisk's dialplan parser and, specifically in the case of this patch, the PJSIP_PARSE_URI function. This patch introduces a new function - `PJSIP_PARSE_URI_FROM` - that behaves identically to `PJSIP_PARSE_URI` except that the first argument is now a variable name and not a literal URI. Fixes #756 #### manager.c: Properly terminate `CoreShowChannelMap` event. Author: Sean Bright Date: 2024-06-10 Fixes #761 #### cli: Show configured cache dir Author: Bastian Triller Date: 2024-06-07 Since Asterisk 19 it is possible to cache recorded files into another directory [1] [2]. Show configured location of cache dir in CLI's core show settings. [1] ASTERISK-29143 [2] b08427134fd51bb549f198e9f60685f2680c68d7 #### xml.c: Update deprecated libxml2 API usage. Author: Sean Bright Date: 2024-05-23 Two functions are deprecated as of libxml2 2.12: * xmlSubstituteEntitiesDefault * xmlParseMemory So we update those with supported API. Additionally, `res_calendar_caldav` has been updated to use libxml2's xmlreader API instead of the SAX2 API which has always felt a little hacky (see deleted comment block in `res_calendar_caldav.c`). The xmlreader API has been around since libxml2 2.5.0 which was released in 2003. Fixes #725 #### cdr_pgsql: Fix crash when the module fails to load multiple times. Author: chrsmj Date: 2024-05-16 Missing or corrupt cdr_pgsql.conf configuration file can cause the second attempt to load the PostgreSQL CDR module to crash Asterisk via the Command Line Interface because a null CLI command is registered on the first failed attempt to load the module. Resolves: #736 #### asterisk.c: Don't log an error if .asterisk_history does not exist. Author: Sean Bright Date: 2024-05-27 Fixes #751 #### chan_ooh323: Fix R/0 typo in docs Author: Walter Doekes Date: 2024-05-27 #### bundled_pjproject: Disable UPnP support. Author: Sean Bright Date: 2024-05-24 Fixes #747 #### file.h: Rename function argument to avoid C++ keyword clash. Author: Sean Bright Date: 2024-05-24 Fixes #744 #### rtp_engine: add support for multirate RFC2833 digits Author: Mike Bradeen Date: 2024-04-08 Add RFC2833 DTMF support for 16K, 24K, and 32K bitrate codecs. Asterisk currently treats RFC2833 Digits as a single rtp payload type with a fixed bitrate of 8K. This change would expand that to 8, 16, 24 and 32K. This requires checking the offered rtp types for any of these bitrates and then adding an offer for each (if configured for RFC2833.) DTMF generation must also be changed in order to look at the current outbound codec in order to generate appropriately timed rtp. For cases where no outgoing audio has yet been sent prior to digit generation, Asterisk now has a concept of a 'preferred' codec based on offer order. On inbound calls Asterisk will mimic the payload types of the RFC2833 digits. On outbound calls Asterisk will choose the next free payload types starting with 101. UserNote: No change in configuration is required in order to enable this feature. Endpoints configured to use RFC2833 will automatically have this enabled. If the endpoint does not support this, it should not include it in the SDP offer/response. Resolves: #699