34239 Commits

Author SHA1 Message Date
George Joseph
a63eec2fbb chan_websocket.c: Change payload references to command instead.
Some of the tests in process_text_message() were still comparing to the
websocket message payload instead of the "command" string.

Resolves: #1525
2025-10-08 15:54:57 +00:00
Naveen Albert
6a82f4c390 func_callerid: Document limitation of DNID fields.
The Dial() application does not propagate DNID fields, which is counter
to the behavior of the other Caller ID fields. This behavior is likely
intentional since the use of Dial theoretically suggests a new dialed
number, but document this caveat to inform users of it.

Resolves: #1519
2025-10-07 18:23:21 +00:00
Naveen Albert
2041a4645f func_channel: Allow R/W of ADSI CPE capability setting.
Allow retrieving and setting the channel's ADSI capability from the
dialplan.

Resolves: #1514

UserNote: CHANNEL(adsicpe) can now be read or written to change
the channels' ADSI CPE capability setting.
2025-10-07 18:22:29 +00:00
Naveen Albert
88680c3e7e core_unreal: Preserve ADSI capability when dialing Local channels.
Dial() already preserves the ADSI capability by copying it to the new
channel, but since Local channel pairs consist of two channels, we
also need to copy the capability to the second channel.

Resolves: #1517
2025-10-07 18:19:08 +00:00
Igor Goncharovsky
5177662990 func_hangupcause.c: Add access to Reason headers via HANGUPCAUSE()
As soon as SIP call may end with several Reason headers, we
want to make all of them available through the HAGUPCAUSE() function.
This implementation uses the same ao2 hash for cause codes storage
and adds a flag to make difference between last processed sip
message and content of reason headers.

UserNote: Added a new option to HANGUPCAUSE to access additional
information about hangup reason. Reason headers from pjsip
could be read using 'tech_extended' cause type.
2025-10-07 15:27:04 +00:00
Naveen Albert
cf9c107e4d sig_analog: Allow '#' to end the inter-digit timeout when dialing.
It is customary to allow # to terminate digit collection immediately
when there would normally be a timeout. However, currently, users are
forced to wait for the timeout to expire when dialing numbers that
are prefixes of other valid matches, and there is no way to end the
timeout early. Customarily, # terminates the timeout, but at the moment,
this is just rejected unless there happens to be a matching extension
ending in #.

Allow # to terminate the timeout in cases where there is no dialplan
match. This ensures that the dialplan is always respected, but if a
valid extension has been dialed that happens to prefix other valid
matches, # can be used to dial it immediately.

Resolves: #1510
2025-10-07 15:16:27 +00:00
Naveen Albert
9a2a853fee func_math: Add DIGIT_SUM function.
Add a function (DIGIT_SUM) which returns the digit sum of a number.

Resolves: #1499

UserNote: The DIGIT_SUM function can be used to return the digit sum of
a number.
2025-10-06 19:26:17 +00:00
Naveen Albert
341cb16378 app_sf: Add post-digit timer option to ReceiveSF.
Add a sorely needed option to set a timeout between digits, rather than
for receiving the entire number. This is needed if the number of digits
being sent is unknown by the receiver in advance. Previously, we had
to wait for the entire timer to expire.

Resolves: #1493

UserNote: The 't' option for ReceiveSF now allows for a timer since
the last digit received, in addition to the number-wide timeout.
2025-10-06 19:24:57 +00:00
Naveen Albert
b8c9440e19 codec_builtin.c: Adjust some of the quality scores to reflect reality.
Among the lower-quality voice codecs, some of the quality scores did
not make sense relative to each other.

For instance, quality-wise, G.729 > G.723 > PLC10.
However, current scores do not uphold these relationships.

Tweak the scores slightly to reflect more accurate relationships.

Resolves: #1501
2025-10-06 15:46:30 +00:00
Naveen Albert
de46164a73 res_tonedetect: Fix formatting of XML documentation.
Fix the indentation in the documentation for the variable list.

Resolves: #1507
2025-10-06 15:41:22 +00:00
Naveen Albert
3c21fbf69c res_fax: Add XML documentation for channel variables.
Document the channel variables currently set by SendFAX and ReceiveFAX.

Resolves: #1505
2025-10-06 15:39:00 +00:00
George Joseph
c597c8b5c0 channelstorage_cpp_map_name_id: Add read locking around retrievals.
When we retrieve a channel from a C++ map, we actually get back a wrapper
object that points to the channel then right after we retrieve it, we bump its
reference count.  There's a tiny chance however that between those two
statements a delete and/or unref might happen which would cause the wrapper
object or the channel itself to become invalid resulting in a SEGV.  To avoid
this we now perform a read lock on the driver around those statements.

Resolves: #1491
2025-10-06 13:50:31 +00:00
Naveen Albert
a6b15bfb68 app_dial: Allow fractional seconds for dial timeouts.
Even though Dial() internally uses milliseconds for its dial timeouts,
this capability has been mostly obscured from users as the argument is
only parsed as an integer, thus forcing the use of whole seconds for
timeouts.

Parse it as a decimal instead so that timeouts can now truly have
millisecond precision.

Resolves: #1487

UserNote: The answer and progress dial timeouts now have millisecond
precision, instead of having to be whole numbers.
2025-10-02 16:02:48 +00:00
Naveen Albert
e57f10bbe5 dsp.c: Make minor fixes to debug log messages.
Commit dc8e3eeaaf improved the debug log
messages in dsp.c. This makes two minor corrections to it:

* Properly guard an added log statement in a conditional.
* Don't add one to the hit count if there was no hit (however, we do
  still want to do this for the case where this is one).

Resolves: #1496
2025-10-02 14:44:45 +00:00
Naveen Albert
037bf58c78 config_options.c: Improve misleading warning.
When running "config show help <module>", if no XML documentation exists
for the specified module, "Module <module> not found." is returned,
which is misleading if the module is loaded but simply has no XML
documentation for its config. Improve the message to clarify that the
module may simply have no config documentation.

Resolves: #1489
2025-10-02 14:43:06 +00:00
Naveen Albert
45646be97a func_scramble: Add example to XML documentation.
The previous lack of an example made it ambiguous if the arguments went
inside the function arguments or were part of the right-hand value.

Resolves: #1485
2025-09-30 15:09:43 +00:00
Naveen Albert
a96d7fcfaf sig_analog: Eliminate potential timeout with Last Number Redial.
If Last Number Redial is used to redial, ensure that we do not wait
for further digits. This was possible if the number that was last
dialed is a prefix of another possible dialplan match. Since all we
did is copy the number into the extension buffer, if other matches
are now possible, there would thus be a timeout before the call went
through. We now complete redialed calls immediaetly in all cases.

Resolves: #1483
2025-09-30 15:09:14 +00:00
George Joseph
559ea45ddd ARI: The bridges play and record APIs now handle sample rates > 8K correctly.
The bridge play and record APIs were forcing the Announcer/Recorder channel
to slin8 which meant that if you played or recorded audio with a sample
rate > 8K, it was downsampled to 8K limiting the bandwidth.

* The /bridges/play REST APIs have a new "announcer_format" parameter that
  allows the caller to explicitly set the format on the "Announcer" channel
  through which the audio is played into the bridge.  If not specified, the
  default depends on how many channels are currently in the bridge.  If
  a single channel is in the bridge, then the Announcer channel's format
  will be set to the same as that channel's.  If multiple channels are in the
  bridge, the channels will be scanned to find the one with the highest
  sample rate and the Announcer channel's format will be set to the slin
  format that has an equal to or greater than sample rate.

* The /bridges/record REST API has a new "recorder_format" parameter that
  allows the caller to explicitly set the format on the "Recorder" channel
  from which audio is retrieved to write to the file.  If not specified,
  the Recorder channel's format will be set to the format that was requested
  to save the audio in.

Resolves: #1479

DeveloperNote: The ARI /bridges/play and /bridges/record REST APIs have new
parameters that allow the caller to specify the format to be used on the
"Announcer" and "Recorder" channels respecitvely.
2025-09-30 13:59:34 +00:00
Max Grobecker
2c97fd3ea4 res_pjsip_geolocation: Add support for Geolocation loc-src parameter
This adds support for the Geolocation 'loc-src' parameter to res_pjsip_geolocation.
The already existing config option 'location_source` in res_geolocation is documented to add a 'loc-src' parameter containing a user-defined FQDN to the 'Geolocation:' header,
but that option had no effect as it was not implemented by res_pjsip_geolocation.

If the `location_source` configuration option is not set or invalid, that parameter will not be added (this is already checked by res_geolocation).

This commits adds already documented functionality.
2025-09-30 13:53:45 +00:00
Joshua C. Colp
ece6ed9459 sorcery: Move from threadpool to taskpool.
This change moves observer invocation from the use of
a threadpool to a taskpool. The taskpool options have also
been adjusted to ensure that at least one taskprocessor
remains available at all times.
2025-09-30 13:50:37 +00:00
Sven Kube
ff80666aac stasis_channels.c: Make protocol_id optional to enable blind transfer via ari
When handling SIP transfers via ARI, there is no protocol_id in case of
a blind transfer.

Resolves: #1467
2025-09-23 19:50:04 +00:00
Allan Nathanson
7bd30279de config.c: fix saving of deep/wide template configurations
Follow-on to #244 and #960 regarding how the ast_config_XXX APIs
handle template inheritance.

ast_config_text_file_save2() incorrectly suppressed variables if they
matched any ancestor template.  This broke deep chains (dropping values
based on distant parents) and wide inheritance (ignoring last-wins order
across multiple parents).

The function now inspects the full template hierarchy to find the nearest
effective parent (last occurrence wins).  Earlier inherited duplicates are
collapsed, explicit overrides are kept unless they exactly match the parent,
and PreserveEffectiveContext avoids writing redundant lines.

Resolves: #1451
2025-09-23 19:48:25 +00:00
George Joseph
32c41efa04 res_rtp_asterisk.c: Use rtp->dtls in __rtp_sendto when rtcp mux is used.
In __rtp_sendto(), the check for DTLS negotiation completion for rtcp packets
needs to use the rtp->dtls structure instead of rtp->rtcp->dtls when
AST_RTP_INSTANCE_RTCP_MUX is set.

Resolves: #1474
2025-09-23 15:41:51 +00:00
Bastian Triller
a0f1e460fe Fix some doxygen, typos and whitespace 2025-09-22 17:39:24 +00:00
Sven Kube
9e50fb3880 stasis_channels.c: Add null check for referred_by in ast_ari_transfer_message_create
When handling SIP transfers via ARI, the `referred_by` field in
`transfer_ari_state` may be null, since SIP REFER requests are not
required to include a `Referred-By` header. Without this check, a null
value caused the transfer to fail and triggered a NOTIFY with a 500
Internal Server Error.
2025-09-22 17:26:50 +00:00
George Joseph
896850ca35 chan_websocket: Fix codec validation and add passthrough option.
* Fixed an issue in webchan_write() where we weren't detecting equivalent
  codecs properly.
* Added the "p" dialstring option that puts the channel driver in
  "passthrough" mode where it will not attempt to re-frame or re-time
  media coming in over the websocket from the remote app.  This can be used
  for any codec but MUST be used for codecs that use packet headers or whose
  data stream can't be broken up on arbitrary byte boundaries. In this case,
  the remote app is fully responsible for correctly framing and timing media
  sent to Asterisk and the MEDIA text commands that could be sent over the
  websocket are disabled.  Currently, passthrough mode is automatically set
  for the opus, speex and g729 codecs.
* Now calling ast_set_read_format() after ast_channel_set_rawreadformat() to
  ensure proper translation paths are set up when switching between native
  frames and slin silence frames.  This fixes an issue with codec errors
  when transcode_via_sln=yes.

Resolves: #1462
2025-09-22 17:21:43 +00:00
phoneben
af67321134 app_queue: Add NULL pointer checks in app_queue
Add NULL check for word_list before calling word_in_list()
Add NULL checks for channel snapshots from ast_multi_channel_blob_get_channel()

Resolves: #1425
2025-09-22 17:19:22 +00:00
Sean Bright
7b96fff129 app_externalivr: Prevent out-of-bounds read during argument processing.
Resolves: #1422
2025-09-22 16:55:52 +00:00
Naveen Albert
3a7d622c63 chan_dahdi: Add DAHDI_CHANNEL function.
Add a dialplan function that can be used to get/set properties of
DAHDI channels (as opposed to Asterisk channels). This exposes
properties that were not previously available, allowing for certain
operations to now be performed in the dialplan.

Resolves: #1455

UserNote: The DAHDI_CHANNEL function allows for getting/setting
certain properties about DAHDI channels from the dialplan.
2025-09-22 16:52:34 +00:00
Joshua C. Colp
77d630f57a taskpool: Update versions for taskpool stasis options. 2025-09-17 01:25:04 +00:00
Joshua C. Colp
e9ee9d7d98 taskpool: Add taskpool API, switch Stasis to using it.
This change introduces a new API called taskpool. This is a pool
of taskprocessors. It provides the following functionality:

1. Task pushing to a pool of taskprocessors
2. Synchronous tasks
3. Serializers for execution ordering of tasks
4. Growing/shrinking of number of taskprocessors in pool

This functionality already exists through the combination of
threadpool+taskprocessors but through investigating I determined
that this carries substantial overhead for short to medium duration
tasks. The threadpool uses a single queue of work, and for management
of threads it involves additional tasks.

I wrote taskpool to eliminate the extra overhead and management
as much as possible. Instead of a single queue of work each
taskprocessor has its own queue and at push time a selector chooses
the taskprocessor to queue the task to. Each taskprocessor also
has its own thread like normal. This spreads out the tasks immediately
and reduces contention on shared resources.

Using the included efficiency tests the number of tasks that can be
executed per second in a taskpool is 6-12 times more than an equivalent
threadpool+taskprocessor setup.

Stasis has been moved over to using this new API as it is a heavy consumer
of threadpool+taskprocessors and produces a lot of tasks.

UpgradeNote: The threadpool_* options in stasis.conf have now been deprecated
though they continue to be read and used. They have been replaced with taskpool
options that give greater control over the underlying taskpool used for stasis.

DeveloperNote: The taskpool API has been added for common usage of a
pool of taskprocessors. It is suggested to use this API instead of the
threadpool+taskprocessor approach.
2025-09-16 17:21:30 +00:00
George Joseph
390d8f98c2 res_ari: Ensure outbound websocket config has a websocket_client_id.
Added a check to outbound_websocket_apply() that makes sure an outbound
websocket config object in ari.conf has a websocket_client_id parameter.

Resolves: #1457
2025-09-15 13:28:20 +00:00
Naveen Albert
4aad564b93 app_adsiprog: Fix possible NULL dereference.
get_token can return NULL, but process_token uses this result without
checking for NULL; as elsewhere, check for a NULL result to avoid
possible NULL dereference.

Resolves: #1419
2025-09-11 15:25:41 +00:00
Nathan Monfils
170048a41e manager.c: Fix presencestate object leak
ast_presence_state allocates subtype and message. We straightforwardly
need to clean those up.
2025-09-11 15:24:08 +00:00
Sean Bright
1b42eda449 audiohook.c: Ensure correct AO2 reference is dereffed.
Part of #1440.
2025-09-11 14:47:39 +00:00
Naveen Albert
7ffde57474 res_cliexec: Remove unnecessary casts to char*.
Resolves: #1436
2025-09-11 14:19:46 +00:00
Ben Ford
8add74c462 rtp_engine.c: Add exception for comfort noise payload.
In a previous commit, a change was made to
ast_rtp_codecs_payload_code_tx_sample_rate to check for differing sample
rates. This ended up returning an invalid payload int for comfort noise.
A check has been added that returns early if the payload is in fact
supposed to be comfort noise.

Fixes: #1340
2025-09-11 14:08:08 +00:00
Naveen Albert
971beef41c pbx_variables.c: Create real channel for "dialplan eval function".
"dialplan eval function" has been using a dummy channel for function
evaluation, much like many of the unit tests. However, sometimes, this
can cause issues for functions that are not expecting dummy channels.
As an example, ast_channel_tech(chan) is NULL on such channels, and
ast_channel_tech(chan)->type consequently results in a NULL dereference.
Normally, functions do not worry about this since channels executing
dialplan aren't dummy channels.

While some functions are better about checking for these sorts of edge
cases, use a real channel with a dummy technology to make this CLI
command inherently safe for any dialplan function that could be evaluated
from the CLI.

Resolves: #1434
2025-09-11 12:31:43 +00:00
Joe Garlick
0deac782db chan_websocket.c: Add DTMF messages
Added DTMF messages to the chan_websocket feature.

When a user presses DTMF during a call over chan_websocket it will send a message like:
"DTMF_END digit:1"

Resolves: https://github.com/asterisk/asterisk-feature-requests/issues/70
2025-09-08 14:34:03 +00:00
Igor Goncharovsky
f77e76bab1 app_queue.c: Add new global 'log_unpause_on_reason_change'
In many asterisk-based systems, the pause reason is used to separate
pauses by type,and logically, changing the reason defines two intervals
that should be accounted for separately. The introduction of a new
option allows me to separate the intervals of operator inactivity in
the log by the event of unpausing.

UserNote: Add new global option 'log_unpause_on_reason_change' that
is default disabled. When enabled cause addition of UNPAUSE event on
every re-PAUSE with reason changed.
2025-09-08 14:28:52 +00:00
Igor Goncharovsky
39c677e0df app_waitforsilence.c: Use milliseconds to calculate timeout time
The functions WaitForNoise() and WaitForSilence() use the time()
functions to calculate elapsed time, which causes the timer to fire on
a whole second boundary, and the actual function execution time to fire
the timer may be 1 second less than expected. This fix replaces time()
with ast_tvnow().

Fixes: #1401
2025-09-08 14:27:32 +00:00
Artem Umerov
96e8535e84 Fix missing ast_test_flag64 in extconf.c
Fix missing ast_test_flag64 after 43bf8a4ded
2025-09-04 15:10:28 +00:00
Naveen Albert
6fb811a590 pbx_builtins: Allow custom tone for WaitExten.
Currently, the 'd' option will play dial tone while waiting
for digits. Allow it to accept an argument for any tone from
indications.conf.

Resolves: #1396

UserNote: The tone used while waiting for digits in WaitExten
can now be overridden by specifying an argument for the 'd'
option.
2025-09-04 15:03:45 +00:00
Naveen Albert
0a46be95cb res_tonedetect: Add option for TONE_DETECT detection to auto stop.
One of the problems with TONE_DETECT as it was originally written
is that if a tone is detected multiple times, it can trigger
the redirect logic multiple times as well. For example, if we
do an async goto in the dialplan after detecting a tone, because
the detector is still active until explicitly disabled, if we
detect the tone again, we will branch again and start executing
that dialplan a second time. This is rarely ever desired behavior,
and can happen if the detector is not removed quickly enough.

Add a new option, 'e', which automatically disables the detector
once the desired number of matches have been heard. This eliminates
the potential race condition where previously the detector would
need to be disabled immediately, but doing so quickly enough
was not guaranteed. This also allows match criteria to be retained
longer if needed, so the detector does not need to be destroyed
prematurely.

Resolves: #1390

UserNote: The 'e' option for TONE_DETECT now allows detection to
be disabled automatically once the desired number of matches have
been fulfilled, which can help prevent race conditions in the
dialplan, since TONE_DETECT does not need to be disabled after
a hit.
2025-09-03 14:23:45 +00:00
Stuart Henderson
11e3567200 app_queue: fix comparison for announce-position-only-up
Numerically comparing that the current queue position is less than
last_pos_said can only be done after at least one announcement has been
made, otherwise last_pos_said is at the default (0).

Fixes: #1386
2025-09-03 13:15:55 +00:00
George Joseph
02993717b0 res_pjsip_authenticator_digest: Fix SEGV if get_authorization_hdr returns NULL.
In the highly-unlikely event that get_authorization_hdr() couldn't find an
Authorization header in a request, trying to get the digest algorithm
would cauase a SEGV.  We now check that we have an auth header that matches
the realm before trying to get the algorithm from it.

Resolves: #GHSA-64qc-9x89-rx5j
2025-08-28 14:19:49 +00:00
Alexei Gradinari
336f6bd627 sorcery: Prevent duplicate objects and ensure missing objects are created on update
This patch resolves two issues in Sorcery objectset handling with multiple
backends:

1. Prevent duplicate objects:
   When an object exists in more than one backend (e.g., a contact in both
   'astdb' and 'realtime'), the objectset previously returned multiple instances
   of the same logical object. This caused logic failures in components like the
   PJSIP registrar, where duplicate contact entries led to overcounting and
   incorrect deletions, when max_contacts=1 and remove_existing=yes.

   This patch ensures only one instance of an object with a given key is added
   to the objectset, avoiding these duplicate-related side effects.

2. Ensure missing objects are created:
   When using multiple writable backends, a temporary backend failure can lead
   to objects missing permanently from that backend.
   Currently, .update() silently fails if the object is not present,
   and no .create() is attempted.
   This results in inconsistent state across backends (e.g. astdb vs. realtime).

   This patch introduces a new global option in sorcery.conf:
     [general]
     update_or_create_on_update_miss = yes|no

   Default: no (preserves existing behavior).

   When enabled: if .update() fails with no data found, .create() is attempted
   in that backend. This ensures that objects missing due to temporary backend
   outages are re-synchronized once the backend is available again.

   Added a new CLI command:
     sorcery show settings
   Displays global Sorcery settings, including the current value of
   update_or_create_on_update_miss.

   Updated tests to validate both flag enabled/disabled behavior.

Fixes: #1289

UserNote: Users relying on Sorcery multiple writable backends configurations
(e.g., astdb + realtime) may now enable update_or_create_on_update_miss = yes
in sorcery.conf to ensure missing objects are recreated after temporary backend
failures. Default behavior remains unchanged unless explicitly enabled.
2025-08-27 16:56:19 +00:00
Naveen Albert
c77247001b sig_analog: Skip Caller ID spill if usecallerid=no.
If Caller ID is disabled for an FXS port, then we should not send any
Caller ID spill on the line, as we have no Caller ID information that
we can/should be sending.

Resolves: #1394
2025-08-27 15:10:54 +00:00
Naveen Albert
fe7be89a3c chan_dahdi: Fix erroneously persistent dialmode.
It is possible to modify the dialmode setting in the chan_dahdi/sig_analog
private using the CHANNEL function, to modify it during calls. However,
it was not being reset between calls, meaning that if, for example, tone
dialing was disabled, it would never work again unless explicitly enabled.

This fixes the setting by pairing it with a "perm" version of the setting,
as a few other features have, so that it can be reset to the permanent
setting between calls. The documentation is also clarified to explain
the interaction of this setting and the digitdetect setting more clearly.

Resolves: #1378
2025-08-27 14:14:27 +00:00
George Joseph
38cab43227 .github: Update Releaser to use SES email 2025-08-20 12:02:26 -06:00