Compare commits

...

341 Commits

Author SHA1 Message Date
Asterisk Development Team
2c73433fb8 Update for 22.7.0-rc1 2025-10-30 16:16:44 +00:00
Roman Pertsev
481d4c0e75 res_audiosocket: fix temporarily unavailable
Operations on non-blocking sockets may return a resource temporarily unavailable error (EAGAIN or EWOULDBLOCK). This is not a fatal error but a normal condition indicating that the operation would block.

This patch corrects the handling of this case. Instead of incorrectly treating it as a reason to terminate the connection, the code now waits for data to arrive on the socket.
2025-10-30 16:09:11 +00:00
Sean Bright
7e5b531828 safe_asterisk: Resolve a POSIX sh problem and restore globbing behavior.
* Using `==` with the POSIX sh `test` utility is UB.
* Switch back to using globs instead of using `$(find … | sort)`.
* Fix a missing redirect when checking for the OS type.

Resolves: #1554
2025-10-30 16:09:11 +00:00
George Joseph
94d04ac311 res_stir_shaken: Add STIR_SHAKEN_ATTESTATION dialplan function.
Also...

* Refactored the verification datastore process so instead of having
a separate channel datastore for each verification result, there's only
one channel datastore with a vector of results.

* Refactored some log messages to include channel name and removed
some that would be redundant if a memory allocation failed.

Resolves: #781

UserNote: The STIR_SHAKEN_ATTESTATION dialplan function has been added
which will allow suppressing attestation on a call-by-call basis
regardless of the profile attached to the outgoing endpoint.
2025-10-30 16:09:11 +00:00
Joshua C. Colp
54da3e1b9e Revert "pjsip: Move from threadpool to taskpool"
This reverts commit bb6b76c2d8.
2025-10-30 16:09:11 +00:00
Tinet-mucw
38f2fd2527 iostream.c: Handle TLS handshake attacks in order to resolve the issue of exceeding the maximum number of HTTPS sessions.
The TCP three-way handshake completes, but if the server is under a TLS handshake attack, asterisk will get stuck at SSL_do_handshake().
In this case, a timeout mechanism should be set for the SSL/TLS handshake process to prevent indefinite waiting during the SSL handshake.

Resolves: #1559
2025-10-30 16:09:11 +00:00
George Joseph
08960ea5a1 chan_pjsip: Disable SSRC change for WebRTC endpoints.
Commit b333ee3b introduced a fix to chan_pjsip that addressed RTP issues with
blind transfers and some SBCs.  Unfortunately, the fix broke some WebRTC
clients that are sensitive to SSRC changes and non-monotonic timestamps so
the fix is now disabled for endpoints with the "bundle" parameter set to true.

Resolves: #1535
2025-10-30 16:09:11 +00:00
gauravs456
b03582c30e chan_websocket: Add channel_id to MEDIA_START, DRIVER_STATUS and DTMF_END events.
Resolves: #1544
2025-10-30 16:09:11 +00:00
Joshua C. Colp
7662c5cb6c pjsip: Move from threadpool to taskpool
This change moves the PJSIP module from the threadpool API
to the taskpool API. PJSIP-specific implementations for
task usage have been removed and replaced with calls to
the optimized taskpool implementations instead. The need
for a pool of serializers has also been removed as
taskpool inherently provides this. The default settings
have also been changed to be more realistic for common
usage.

UpgradeNote: The threadpool_* options in pjsip.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 PJSIP. An alembic
upgrade script has been added to add these options to realtime
as well.
2025-10-30 16:09:11 +00:00
George Joseph
c3b4b923b3 safe_asterisk: Fix logging and sorting issue.
Re-enabled "TTY=9" which was erroneously disabled as part of a recent
security fix and removed another logging "fix" that was added.

Also added a sort to the "find" that enumerates the scripts to be sourced so
they're sourced in the correct order.

Resolves: #1539
2025-10-30 16:09:11 +00:00
Christoph Moench-Tegeder
9bbb566df5 Fix Endianness detection in utils.h for non-Linux
Commit 43bf8a4ded introduced endian
dependend byte-swapping code in include/asterisk/utils.h, where the
endianness was detected using the __BYTE_ORDER macro. This macro
lives in endian.h, which on Linux is included implicitely (by the
network-related headers, I think), but on FreeBSD the headers are
laid out differently and we do not get __BYTE_ORDER the implicit way.

Instead, this makes the usage of endian.h explicit by including it
where we need it, and switches the BYTE_ORDER/*ENDIAN macros to the
POSIX-defined ones (see
https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/endian.h.html
for standard compliance). Additionally, this adds a compile-time check
for the endianness-logic: compilation will fail if neither big nor
little endian can be detected.

Fixes: #1536
2025-10-30 16:09:11 +00:00
Ben Ford
b1a14698a7 app_queue.c: Fix error in Queue parameter documentation.
When macro was removed in Asterisk 21, the parameter documentation in
code was not updated to reflect the correct numerization for gosub. It
still stated that it was the seventh parameter, but got shifted to the
sixth due to the removal of macro. This has been updated to correctly
reflect the parameter order, and a note has been added to the XML that
states this was done after the initial commit.

Fixes: #1534

UpgradeNote: As part of Asterisk 21, macros were removed from Asterisk.
This resulted in argument order changing for the Queue dialplan
application since the macro argument was removed. Upgrade notice was
missed when this was done, so this upgrade note has been added to
provide a record of such and a notice to users who may have not upgraded
yet.
2025-10-30 16:09:11 +00:00
Joshua C. Colp
b6556cc789 devicestate: Don't publish redundant device state messages.
When publishing device state check the local cache for the
existing device state. If the new device state is unchanged
from the prior one, don't bother publishing the update. This
can reduce the work done by consumers of device state, such
as hints and app_queue, by not publishing a message to them.

These messages would most often occur with devices that are
seeing numerous simultaneous channels. The underlying device
state would remain as in use throughout, but an update would
be published as channels are created and hung up.
2025-10-30 16:09:11 +00:00
George Joseph
1b98cd1b25 chan_pjsip: Add technology-specific off-nominal hangup cause to events.
Although the ISDN/Q.850/Q.931 hangup cause code is already part of the ARI
and AMI hangup and channel destroyed events, it can be helpful to know what
the actual channel technology code was if the call was unsuccessful.
For PJSIP, it's the SIP response code.

* A new "tech_hangupcause" field was added to the ast_channel structure along
with ast_channel_tech_hangupcause() and ast_channel_tech_hangupcause_set()
functions.  It should only be set for off-nominal terminations.

* chan_pjsip was modified to set the tech hangup cause in the
chan_pjsip_hangup() and chan_pjsip_session_end() functions.  This is a bit
tricky because these two functions aren't always called in the same order.
The channel that hangs up first will get chan_pjsip_session_end() called
first which will trigger the core to call chan_pjsip_hangup() on itself,
then call chan_pjsip_hangup() on the other channel.  The other channel's
chan_pjsip_session_end() function will get called last.  Unfortunately,
the other channel's HangupRequest events are sent before chan_pjsip has had a
chance to set the tech hangupcause code so the HangupRequest events for that
channel won't have the cause code set.  The ChannelDestroyed and Hangup
events however will have the code set for both channels.

* A new "tech_cause" field was added to the ast_channel_snapshot_hangup
structure. This is a public structure so a bit of refactoring was needed to
preserve ABI compatibility.

* The ARI ChannelHangupRequest and ChannelDestroyed events were modified to
include the "tech_cause" parameter in the JSON for off-nominal terminations.
The parameter is suppressed for nominal termination.

* The AMI SoftHangupRequest, HangupRequest and Hangup events were modified to
include the "TechCause" parameter for off-nominal terminations. Like their ARI
counterparts, the parameter is suppressed for nominal termination.

DeveloperNote: A "tech_cause" parameter has been added to the
ChannelHangupRequest and ChannelDestroyed ARI event messages and a "TechCause"
parameter has been added to the HangupRequest, SoftHangupRequest and Hangup
AMI event messages.  For chan_pjsip, these will be set to the last SIP
response status code for off-nominally terminated calls.  The parameter is
suppressed for nominal termination.
2025-10-30 16:09:11 +00:00
Sven Kube
da10edda02 res_audiosocket: add message types for all slin sample rates
Extend audiosocket messages with types 0x11 - 0x18 to create asterisk
frames in slin12, slin16, slin24, slin32, slin44, slin48, slin96, and
slin192 format, enabling the transmission of audio at a higher sample
rates. For audiosocket messages sent by Asterisk, the message kind is
determined by the format of the originating asterisk frame.

UpgradeNote: New audiosocket message types 0x11 - 0x18 has been added
for slin12, slin16, slin24, slin32, slin44, slin48, slin96, and
slin192 audio. External applications using audiosocket may need to be
updated to support these message types if the audiosocket channel is
created with one of these audio formats.
2025-10-30 16:09:11 +00:00
phoneben
316b4731cb res_fax.c: lower FAXOPT read warning to debug level
Reading ${FAXOPT()} before a fax session is common in dialplans to check fax state.
Currently this logs an error even when no fax datastore exists, creating excessive noise.
Change these messages to ast_debug(3, …) so they appear only with debug enabled.

Resolves: #1509
2025-10-30 16:09:11 +00:00
Joshua C. Colp
5b4aac6ba0 endpoints: Remove need for stasis subscription.
When an endpoint is created in the core of Asterisk a subscription
was previously created alongside it to monitor any channels being
destroyed that were related to it. This was done by receiving all
channel snapshot updates for every channel and only reacting when
it was indicated that the channel was dead.

This change removes this logic and instead provides an API call
for directly removing a channel from an endpoint. This is called
when channels are destroyed. This operation is fast, so blocking
the calling thread for a short period of time doesn't have any
noticeable impact.
2025-10-30 16:09:11 +00:00
Joshua C. Colp
3202f8c16d app_queue: Allow stasis message filtering to work.
The app_queue module subscribes on a per-dialed agent basis to both
the bridge all and channel all topics to keep apprised of things going
on involving them. This subscription has associated state that must
be cleaned up when the subscription ends. This was done by setting
a default router callback that only had logic to handle the case
where the subscription ends. By using the default router callback
all filtering for the subscription was disabled, causing unrelated
messages to get published and handled by it.

This change makes it so that an explicit route is added for the
message type used for the message indicating the subscription has
ended and removes the default router callback. This allows message
filtering to occur on publishing reducing the messages to app_queue
to only those it is interested in.
2025-10-30 16:09:11 +00:00
George Joseph
b3e5ca59a0 taskpool: Fix some references to threadpool that should be taskpool.
Resolves: #1478
2025-10-30 16:09:11 +00:00
Anthony Minessale
76ca632967 Update contact information for anthm 2025-10-30 16:09:11 +00:00
George Joseph
edcd8b4968 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-30 16:09:11 +00:00
Naveen Albert
a58ddff893 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-30 16:09:11 +00:00
Naveen Albert
241d07f6b4 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-30 16:09:11 +00:00
Naveen Albert
9a4f6f4c4a 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-30 16:09:10 +00:00
Igor Goncharovsky
17ae831db5 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-30 16:09:10 +00:00
Naveen Albert
9b96b6bd59 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-30 16:09:10 +00:00
Naveen Albert
ff40d2eb04 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-30 16:09:10 +00:00
Naveen Albert
abf1368525 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-30 16:09:10 +00:00
Naveen Albert
6d889900b2 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-30 16:09:10 +00:00
Naveen Albert
2cf696eef7 res_tonedetect: Fix formatting of XML documentation.
Fix the indentation in the documentation for the variable list.

Resolves: #1507
2025-10-30 16:09:10 +00:00
Naveen Albert
3f3b155eea res_fax: Add XML documentation for channel variables.
Document the channel variables currently set by SendFAX and ReceiveFAX.

Resolves: #1505
2025-10-30 16:09:10 +00:00
George Joseph
ef67f64c42 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-30 16:09:10 +00:00
Naveen Albert
87974ee767 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-30 16:09:10 +00:00
Naveen Albert
41864fbb12 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-30 16:09:10 +00:00
Naveen Albert
269dd62be5 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-30 16:09:10 +00:00
Naveen Albert
ff8e8f3092 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-10-30 16:09:10 +00:00
Naveen Albert
7429bf41c1 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-10-30 16:09:10 +00:00
George Joseph
42f1eb2c9b 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-10-30 16:09:10 +00:00
Max Grobecker
c3080b6be8 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-10-30 16:09:10 +00:00
Joshua C. Colp
e76a58ed8e 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-10-30 16:09:10 +00:00
Sven Kube
57222db726 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-10-30 16:09:10 +00:00
Bastian Triller
bb2b26e8ca Fix some doxygen, typos and whitespace 2025-10-30 16:09:10 +00:00
Sven Kube
33480864f7 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-10-30 16:09:10 +00:00
phoneben
28fb3fc7db 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-10-30 16:09:10 +00:00
Sean Bright
fce342c004 app_externalivr: Prevent out-of-bounds read during argument processing.
Resolves: #1422
2025-10-30 16:09:10 +00:00
Naveen Albert
abaf0c3959 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-10-30 16:09:10 +00:00
Joshua C. Colp
08cc9b0d4f taskpool: Update versions for taskpool stasis options. 2025-10-30 16:09:10 +00:00
Joshua C. Colp
f3f005e49e 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-10-30 16:09:10 +00:00
Naveen Albert
86bcfafa11 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-10-30 16:09:10 +00:00
Nathan Monfils
53521b940b manager.c: Fix presencestate object leak
ast_presence_state allocates subtype and message. We straightforwardly
need to clean those up.
2025-10-30 16:09:10 +00:00
Sean Bright
12e04043f6 audiohook.c: Ensure correct AO2 reference is dereffed.
Part of #1440.
2025-10-30 16:09:10 +00:00
Naveen Albert
0d9546589b res_cliexec: Remove unnecessary casts to char*.
Resolves: #1436
2025-10-30 16:09:10 +00:00
Ben Ford
81df40e407 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-10-30 16:09:09 +00:00
Naveen Albert
4019e93a8b 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-10-30 16:09:09 +00:00
Asterisk Development Team
5828a4195b Update for 22.6.0 2025-10-15 16:49:22 +00:00
Asterisk Development Team
64609e0b18 Update for 22.6.0-rc2 2025-09-25 13:49:10 +00:00
George Joseph
533a8b423d 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-25 07:09:21 -06:00
George Joseph
f43e7bbb79 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-25 07:09:21 -06:00
George Joseph
a3c41f77ab 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-25 07:09:21 -06:00
Asterisk Development Team
8c61cb1e8d Update for 22.6.0-rc1 2025-09-17 11:40:38 -06:00
Joe Garlick
27a6a153df 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
(cherry picked from commit 2de6dc5d7a)
2025-09-17 11:40:38 -06:00
Igor Goncharovsky
d8bde99058 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.

(cherry picked from commit 63868245c0)
2025-09-17 11:40:38 -06:00
Igor Goncharovsky
5b5a512b33 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
(cherry picked from commit a8afc93ebe)
2025-09-17 11:40:38 -06:00
Artem Umerov
72f4f415bb Fix missing ast_test_flag64 in extconf.c
Fix missing ast_test_flag64 after 43bf8a4ded

(cherry picked from commit 9bc1fc1f2f)
2025-09-17 11:40:38 -06:00
Naveen Albert
6184dc61b7 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.

(cherry picked from commit fc2294308e)
2025-09-17 11:40:38 -06:00
Naveen Albert
eab8642711 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.

(cherry picked from commit 016a53beba)
2025-09-17 11:40:38 -06:00
Stuart Henderson
2d2151c051 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
(cherry picked from commit ac2948dc89)
2025-09-17 11:40:38 -06:00
Alexei Gradinari
44034cf841 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.

(cherry picked from commit 658b775fd6)
2025-09-17 11:40:38 -06:00
Naveen Albert
60b8f1d4ed 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
(cherry picked from commit cc9d192114)
2025-09-17 11:40:38 -06:00
Naveen Albert
53296e50dc 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
(cherry picked from commit 9b5ffe513d)
2025-09-17 11:40:38 -06:00
George Joseph
c3ec267511 .github: Update Releaser to use SES email
(cherry picked from commit fc6cd43fb9)
2025-09-17 11:40:38 -06:00
George Joseph
7cc840ef77 chan_websocket: Allow additional URI parameters to be added to the outgoing URI.
* Added a new option to the WebSocket dial string to capture the additional
  URI parameters.
* Added a new API ast_uri_verify_encoded() that verifies that a string
  either doesn't need URI encoding or that it has already been encoded.
* Added a new API ast_websocket_client_add_uri_params() to add the params
  to the client websocket session.
* Added XML documentation that will show up with `core show application Dial`
  that shows how to use it.

Resolves: #1352

UserNote: A new WebSocket channel driver option `v` has been added to the
Dial application that allows you to specify additional URI parameters on
outgoing connections. Run `core show application Dial` from the Asterisk CLI
to see how to use it.

(cherry picked from commit 15371efeab)
2025-09-17 11:40:38 -06:00
George Joseph
4bbd94ff15 chan_websocket: Fix buffer overrun when processing TEXT websocket frames.
ast_websocket_read() receives data into a fixed 64K buffer then continually
reallocates a final buffer that, after all continuation frames have been
received, is the exact length of the data received and returns that to the
caller.  process_text_message() in chan_websocket was attempting to set a
NULL terminator on the received payload assuming the payload buffer it
received was the large 64K buffer.  The assumption was incorrect so when it
tried to set a NULL terminator on the payload, it could, depending on the
state of the heap at the time, cause heap corruption.

process_text_message() now allocates its own payload_len + 1 sized buffer,
copies the payload received from ast_websocket_read() into it then NULL
terminates it prevent the possibility of the overrun and corruption.

Resolves: #1384
(cherry picked from commit bbb69b115d)
2025-09-17 11:40:38 -06:00
Naveen Albert
e98244039f sig_analog: Fix SEGV due to calling strcmp on NULL.
Add an additional check to guard against the channel application being
NULL.

Resolves: #1380
(cherry picked from commit bd7e2aa7b8)
2025-09-17 11:40:38 -06:00
Sven Kube
c4103f259a ARI: Add command to indicate progress to a channel
Adds an ARI command to send a progress indication to a channel.

DeveloperNote: A new ARI endpoint is available at `/channels/{channelId}/progress` to indicate progress to a channel.
(cherry picked from commit f9ab56b1d8)
2025-09-17 11:40:38 -06:00
Naveen Albert
ae82182768 dsp.c: Improve debug logging in tone_detect().
The debug logging during DSP processing has always been kind
of overwhelming and annoying to troubleshoot. Simplify and
improve the logging in a few ways to aid DSP debugging:

* If we had a DSP hit, don't also emit the previous debug message that
  was always logged. It is duplicated by the hit message, so this can
  reduce the number of debug messages during detection by 50%.
* Include the hit count and required number of hits in the message so
  on partial detections can be more easily troubleshot.
* Use debug level 9 for hits instead of 10, so we can focus on hits
  without all the noise from the per-frame debug message.
* 1-index the hit count in the debug messages. On the first hit, it
  currently logs '0', just as when we are not detecting anything,
  which can be confusing.

Resolves: #1375
(cherry picked from commit 71a748363d)
2025-09-17 11:40:38 -06:00
Jose Lopes
29dcdde3c0 res_stasis_device_state: Fix delete ARI Devicestates after asterisk restart.
After an asterisk restart, the deletion of ARI Devicestates didn't
return error, but the devicestate was not deleted.
Found a typo on populate_cache function that created wrong cache for
device states.
This bug caused wrong assumption that devicestate didn't exist,
since it was not in cache, so deletion didn't returned error.

Fixes: #1327
(cherry picked from commit 55a4bd6d5b)
2025-09-17 11:40:38 -06:00
Naveen Albert
bda8c98bbd app_chanspy: Add option to not automatically answer channel.
Add an option for ChanSpy and ExtenSpy to not answer the channel
automatically. Most applications that auto-answer by default
already have an option to disable this behavior if unwanted.

Resolves: #1358

UserNote: ChanSpy and ExtenSpy can now be configured to not
automatically answer the channel by using the 'N' option.

(cherry picked from commit 1cdead8a06)
2025-09-17 11:40:38 -06:00
George Joseph
d31750c0f1 xmldoc.c: Fix rendering of CLI output.
If you do a `core show application Dial`, you'll see it's kind of a mess.
Indents are wrong is some places, examples are printed in black which makes
them invisible on most terminals, and the lack of line breaks in some cases
makes it hard to follow.

* Fixed the rendering of examples so they are indented properly and changed
the color so they can be seen.
* There is now a line break before each option.
* Options are now printed on their own line with all option content indented
below them.

Example from Dial before fixes:
```
    Example: Dial 555-1212 on first available channel in group 1, searching
    from highest to lowest

    Example: Ringing FXS channel 4 with ring cadence 2

    Example: Dial 555-1212 on channel 3 and require answer confirmation

...

    O([mode]):
        mode - With <mode> either not specified or set to '1', the originator
        hanging up will cause the phone to ring back immediately.
 - With <mode> set to '2', when the operator flashes the trunk, it will ring
 their phone back.
Enables *operator services* mode.  This option only works when bridging a DAHDI
channel to another DAHDI channel only. If specified on non-DAHDI interfaces, it
will be ignored. When the destination answers (presumably an operator services
station), the originator no longer has control of their line. They may hang up,
but the switch will not release their line until the destination party (the
operator) hangs up.

    p: This option enables screening mode. This is basically Privacy mode
    without memory.
```

After:
```
    Example: Dial 555-1212 on first available channel in group 1, searching
    from highest to lowest

     same => n,Dial(DAHDI/g1/5551212)

    Example: Ringing FXS channel 4 with ring cadence 2

     same => n,Dial(DAHDI/4r2)

    Example: Dial 555-1212 on channel 3 and require answer confirmation

     same => n,Dial(DAHDI/3c/5551212)

...

    O([mode]):
        mode - With <mode> either not specified or set to '1', the originator
        hanging up will cause the phone to ring back immediately.
        With <mode> set to '2', when the operator flashes the trunk, it will
        ring their phone back.
        Enables *operator services* mode.  This option only works when bridging
        a DAHDI channel to another DAHDI channel only. If specified on
        non-DAHDI interfaces, it will be ignored. When the destination answers
        (presumably an operator services station), the originator no longer has
        control of their line. They may hang up, but the switch will not
        release their line until the destination party (the operator) hangs up.

    p:
        This option enables screening mode. This is basically Privacy mode
        without memory.
```

There are still things we can do to make this more readable but this is a
start.

(cherry picked from commit 3135a18a73)
2025-09-17 11:40:38 -06:00
Naveen Albert
bcc3d38e46 func_frame_drop: Add debug messages for dropped frames.
Add debug messages in scenarios where frames that are usually processed
are dropped or skipped.

Resolves: #1371
(cherry picked from commit 95becab186)
2025-09-17 11:40:38 -06:00
Naveen Albert
8d3abb065e test_res_prometheus: Fix compilation failure on Debian 13.
curl_easy_setopt expects long types, so be explicit.

Resolves: #1369
(cherry picked from commit 5a446dd74c)
2025-09-17 11:40:38 -06:00
Naveen Albert
f2c9b84a36 func_frame_drop: Handle allocation failure properly.
Handle allocation failure and simplify the allocation using asprintf.

Resolves: #1366
(cherry picked from commit fad8771123)
2025-09-17 11:40:38 -06:00
Alexey Khabulyak
6b39b10731 pbx_lua.c: segfault when pass null data to term_color function
This can be reproduced under certain curcomstences.
For example: call app.playback from lua with invalid data: app.playback({}).
pbx_lua.c will try to get data for this playback using lua_tostring function.
This function returs NULL for everything but strings and numbers.
Then, it calls term_color with NULL data.
term_color function can call(if we don't use vt100 compat term)
ast_copy_string with NULL inbuf which cause segfault. bt example:
ast_copy_string (size=8192, src=0x0, dst=0x7fe44b4be8b0)
at /usr/src/asterisk/asterisk-20.11.0/include/asterisk/strings.h:412

Resolves: https://github.com/asterisk/asterisk/issues/1363
(cherry picked from commit 1cf49aa91b)
2025-09-17 11:40:38 -06:00
Naveen Albert
37e0ff6f02 bridge.c: Obey BRIDGE_NOANSWER variable to skip answering channel.
If the BRIDGE_NOANSWER variable is set on a channel, it is not supposed
to answer when another channel bridges to it using Bridge(), and this is
checked when ast_bridge_call* is called. However, another path exists
(bridge_exec -> ast_bridge_add_channel) where this variable was not
checked and channels would be answered. We now check the variable there.

Resolves: #401
Resolves: #1364
(cherry picked from commit 545f35838c)
2025-09-17 11:40:38 -06:00
Ben Ford
88092081dd res_rtp_asterisk: Don't send RTP before DTLS has negotiated.
There was no check in __rtp_sendto that prevented Asterisk from sending
RTP before DTLS had finished negotiating. This patch adds logic to do
so.

Fixes: #1260
(cherry picked from commit 9df2ba4eef)
2025-09-17 11:40:38 -06:00
Alexey Khabulyak
206ae3a098 app_dial.c: Moved channel lock to prevent deadlock
It's reproducible with pbx_lua, not regular dialplan.

deadlock description:
1. asterisk locks a channel
2. calls function onedigit_goto
3. calls ast_goto_if_exists funciton
4. checks ast_exists_extension -> pbx_extension_helper
5. pbx_extension_helper calls pbx_find_extension
6. Then asterisk starts autoservice in a new thread
7. autoservice run tries to lock the channel again

Because our channel is locked already, autoservice can't lock.
Autoservice can't lock -> autoservice stop is waiting forever.
onedigit_goto waits for autoservice stop.

Resolves: https://github.com/asterisk/asterisk/issues/1335
(cherry picked from commit 09a3c8df70)
2025-09-17 11:40:38 -06:00
Mike Bradeen
671615f2cf res_pjsip_diversion: resolve race condition between Diversion header processing and redirect
Based on the firing order of the PJSIP call-backs on a redirect, it was possible for
the Diversion header to not be included in the outgoing 181 response to the UAC and
the INVITE to the UAS.

This change moves the Diversion header processing to an earlier PJSIP callback while also
preventing the corresponding update that can cause a duplicate 181 response when processing
the header at that time.

Resolves: #1349
(cherry picked from commit 4705601f17)
2025-09-17 11:40:38 -06:00
Allan Nathanson
73b614ebef file.c: with "sounds_search_custom_dir = yes", search "custom" directory
With `sounds_search_custom_dir = yes`, we are supposed to search for sounds
in the `AST_DATA_DIR/sounds/custom` directory before searching the normal
directories.  Unfortunately, a recent change
(https://github.com/asterisk/asterisk/pull/1172) had a typo resulting in
the "custom" directory not being searched.  This change restores this
expected behavior.

Resolves: #1353
(cherry picked from commit 3ea4289a9a)
2025-09-17 11:40:38 -06:00
Sperl Viktor
fcb35f97b9 cel: Add STREAM_BEGIN, STREAM_END and DTMF event types.
Fixes: #1280

UserNote: Enabling the tracking of the
STREAM_BEGIN and the STREAM_END event
types in cel.conf will log media files and
music on hold played to each channel.
The STREAM_BEGIN event's extra field will
contain a JSON with the file details (path,
format and language), or the class name, in
case of music on hold is played. The DTMF
event's extra field will contain a JSON with
the digit and the duration in milliseconds.

(cherry picked from commit f516f07fd2)
2025-09-17 11:40:38 -06:00
George Joseph
eb1ede4612 channelstorage_cpp_map_name_id.cc: Refactor iterators for thread-safety.
The fact that deleting an object from a map invalidates any iterator
that happens to currently point to that object was overlooked in the initial
implementation.  Unfortunately, there's no way to detect that an iterator
has been invalidated so the result was an occasional SEGV triggered by modules
like app_chanspy that opens an iterator and can keep it open for a long period
of time.  The new implementation doesn't keep the underlying C++ iterator
open across calls to ast_channel_iterator_next() and uses a read lock
on the map to ensure that, even for the few microseconds we use the
iterator, another thread can't delete a channel from under it.  Even with
this change, the iterators are still WAY faster than the ao2_legacy
storage driver.

Full details about the new implementation are located in the comments for
iterator_next() in channelstorage_cpp_map_name_id.cc.

Resolves: #1309
(cherry picked from commit 06622f310b)
2025-09-17 11:40:38 -06:00
George Joseph
4b01b0efd9 res_srtp: Add menuselect options to enable AES_192, AES_256 and AES_GCM
UserNote: Options are now available in the menuselect "Resource Modules"
category that allow you to enable the AES_192, AES_256 and AES_GCM
cipher suites in res_srtp. Of course, libsrtp and OpenSSL must support
them but modern versions do.  Previously, the only way to enable them was
to set the CFLAGS environment variable when running ./configure.
The default setting is to disable them preserving existing behavior.

(cherry picked from commit ae078af893)
2025-09-17 11:40:38 -06:00
zhou_jiajian
3cedbab993 cdr: add CANCEL dispostion in CDR
In the original implementation, both CANCEL and NO ANSWER states were
consolidated under the NO ANSWER disposition. This patch introduces a
separate CANCEL disposition, with an optional configuration switch to
enable this new disposition.

Resolves: #1323

UserNote: A new CDR option "canceldispositionenabled" has been added
that when set to true, the NO ANSWER disposition will be split into
two dispositions: CANCEL and NO ANSWER. The default value is 'no'

(cherry picked from commit 01661398a3)
2025-09-17 11:40:38 -06:00
Naveen Albert
b155601f1c func_curl: Allow auth methods to be set.
Currently the CURL function only supports Basic Authentication,
the default auth method in libcurl. Add an option that also
allows enabling digest authentication.

Resolves: #1332

UserNote: The httpauth field in CURLOPT now allows the authentication
methods to be set.

(cherry picked from commit 06e05a41c3)
2025-09-17 11:40:37 -06:00
George Joseph
9eef99f8f3 options: Change ast_options from ast_flags to ast_flags64.
DeveloperNote: The 32-bit ast_options has no room left to accomodate new
options and so has been converted to an ast_flags64 structure. All internal
references to ast_options have been updated to use the 64-bit flag
manipulation macros.  External module references to the 32-bit ast_options
should continue to work on little-endian systems because the
least-significant bytes of a 64 bit integer will be in the same location as a
32-bit integer.  Because that's not the case on big-endian systems, we've
swapped the bytes in the flags manupulation macros on big-endian systems
so external modules should still work however you are encouraged to test.

(cherry picked from commit 709be42bc3)
2025-09-17 11:40:37 -06:00
Alexei Gradinari
5bdc661745 res_config_odbc: Prevent Realtime fallback on record-not-found (SQL_NO_DATA)
This patch fixes an issue in the ODBC Realtime engine where Asterisk incorrectly
falls back to the next configured backend when the current one returns
SQL_NO_DATA (i.e., no record found).
This is a logical error and performance risk in multi-backend configurations.

Solution:
Introduced CONFIG_RT_NOT_FOUND ((void *)-1) as a special return marker.
ODBC Realtime backend now return CONFIG_RT_NOT_FOUND when no data is found.
Core engine stops iterating on this marker, avoiding unnecessary fallback.

Notes:
Other Realtime backends (PostgreSQL, LDAP, etc.) can be updated similarly.
This patch only covers ODBC.

Fixes: #1305
(cherry picked from commit dfe25fbc8a)
2025-09-17 11:40:37 -06:00
Sven Kube
21881d576d resource_channels.c: Don't call ast_channel_get_by_name on empty optional arguments
`ast_ari_channels_create` and `ast_ari_channels_dial` called the
`ast_channel_get_by_name` function with optional arguments. Since
8f1982c4d6, this function logs an error for empty channel names.
This commit adds checks for empty optional arguments that are used
to call `ast_channel_get_by_name` to prevent these error logs.

(cherry picked from commit 280b13a053)
2025-09-17 11:40:37 -06:00
Naveen Albert
9cd1dc0c2f app_agent_pool: Remove documentation for removed option.
The already-deprecated "password" option for the AGENT function was
removed in commit d43b17a872 for
Asterisk 12, but the documentation for it wasn't removed then.

Resolves: #1321
(cherry picked from commit 1e0205fb68)
2025-09-17 11:40:37 -06:00
Tinet-mucw
a40a88af6f pbx.c: When the AST_SOFTHANGUP_ASYNCGOTO flag is set, pbx_extension_helper should return directly.
Under certain circumstances the context/extens/prio are set in the ast_async_goto, for example action Redirect.
In the situation that action Redirect is broken by pbx_extension_helper this info is changed.
This will cause the current dialplan location to be executed twice.
In other words, the Redirect action does not take effect.

Resolves: #1315
(cherry picked from commit 47072a6f03)
2025-09-17 11:40:37 -06:00
Sperl Viktor
efd0605359 res_agi: Increase AGI command buffer size from 2K to 8K
Fixes: #1317
(cherry picked from commit 5441b01193)
2025-09-17 11:40:37 -06:00
Naveen Albert
4453fdc6e2 ast_tls_cert: Make certificate validity configurable.
Currently, the ast_tls_cert script is hardcoded to produce certificates
with a validity of 365 days, which is not generally desirable for self-
signed certificates. Make this parameter configurable.

Resolves: #1307
(cherry picked from commit 393e51495c)
2025-09-17 11:40:37 -06:00
George Joseph
8c4813acca cdr.c: Set tenantid from party_a->base instead of chan->base.
The CDR tenantid was being set in cdr_object_alloc from the channel->base
snapshot.  Since this happens at channel creation before the dialplan is even
reached, calls to `CHANNEL(tenantid)=<something>` in the dialplan were being
ignored.  Instead we now take tenantid from party_a when
cdr_object_create_public_records() is called which is after the call has
ended and all channel snapshots rebuilt.  This is exactly how accountcode
and amaflags, which can also be set in tha dialplpan, are handled.

Resolves: #1259
(cherry picked from commit c8cacfba5e)
2025-09-17 11:40:37 -06:00
George Joseph
a437eabd52 .github: Reduce number of inputs to Releaser to 10.
The max number of inputs supported by GitHub is 10 so
is_security and is_hotfix were factored into a single choice
entry.

(cherry picked from commit f6d2c781a4)
2025-09-17 11:40:37 -06:00
George Joseph
8c9b6662e8 .github: Add skip-cherry-pick and skip-test-builds to Releaser.
(cherry picked from commit 341c9b35e0)
2025-09-17 11:40:37 -06:00
George Joseph
b252093695 app_mixmonitor: Update the documentation concerning the "D" option.
When using the "D" option to output interleaved audio, the file extension
must be ".raw".  That info wasn't being properly rendered in the markdown
and HTML on the documentation site.  The XML was updated to move the
note in the option section to a warning in the description.

Resolves: #1269
(cherry picked from commit a4da66e584)
2025-09-17 11:40:37 -06:00
Naveen Albert
7b0a814b85 sig_analog: Properly handle STP, ST2P, and ST3P for fgccamamf.
Previously, we were only using # (ST) as a terminator, and not handling
A (STP), B (ST2P), or C (ST3P), which erroneously led to it being
treated as part of the dialed number. Parse any of these as the start
digit.

Resolves: #1301
(cherry picked from commit f5d2ea75c3)
2025-09-17 11:40:37 -06:00
kodokaii
05128488ab chan_websocket: Reset frame_queue_length to 0 after FLUSH_MEDIA
In the WebSocket channel driver, the FLUSH_MEDIA command clears all frames from
the queue but does not reset the frame_queue_length counter.

As a result, the driver incorrectly thinks the queue is full after flushing,
which prevents new multimedia frames from being sent, especially after multiple
flush commands.

This fix sets frame_queue_length to 0 after flushing, ensuring the queue state
is consistent with its actual content.

Fixes: #1304
(cherry picked from commit f03421b03b)
2025-09-17 11:40:37 -06:00
Martin Tomec
2a661446c4 chan_pjsip.c: Change SSRC after media source change
When the RTP media source changes, such as after a blind transfer, the new source introduces a discontinuous timestamp. According to RFC 3550, Section 5.1, an RTP stream's timestamp for a given SSRC must increment monotonically and linearly.
To comply with the standard and avoid a large timestamp jump on the existing SSRC, a new SSRC is generated for the new media stream.
This change resolves known interoperability issues with certain SBCs (like Sonus/Ribbon) that stop forwarding media when they detect such a timestamp violation. This code uses the existing implementation from chan_sip.

Resolves: #927
(cherry picked from commit b333ee3be7)
2025-09-17 11:40:37 -06:00
George Joseph
d40d5c999a Media over Websocket Channel Driver
* Created chan_websocket which can exchange media over both inbound and
outbound websockets which the driver will frame and time.
See http://s.asterisk.net/mow for more information.

* res_http_websocket: Made defines for max message size public and converted
a few nuisance verbose messages to debugs.

* main/channel.c: Changed an obsolete nuisance error to a debug.

* ARI channels: Updated externalMedia to include chan_websocket as a supported
transport.

UserNote: A new channel driver "chan_websocket" is now available. It can
exchange media over both inbound and outbound websockets and will both frame
and re-time the media it receives.
See http://s.asterisk.net/mow for more information.

UserNote: The ARI channels/externalMedia API now includes support for the
WebSocket transport provided by chan_websocket.

(cherry picked from commit 733196abf9)
2025-09-17 11:40:37 -06:00
Stanislav Abramenkov
f2f9c25035 bundled_pjproject: Avoid deadlock between transport and transaction
Backport patch from upstream
* Avoid deadlock between transport and transaction
https://github.com/pjsip/pjproject/commit/edde06f261ac

Issue described in
https://github.com/pjsip/pjproject/issues/4442

(cherry picked from commit 63e5b117ff)
2025-09-17 11:40:37 -06:00
mkmer
798fd4eb63 utils.h: Add rounding to float conversion to int.
Quote from an audio engineer NR9V:
There is a minor issue of a small amount of crossover distortion though as a result of `ast_slinear_saturated_multiply_float()` not rounding the float. This could result in some quiet but potentially audible distortion artifacts in lower volume parts of the signal. If you have for example a sign wave function with a max amplitude of just a few samples, all samples between -1 and 1 will be truncated to zero, resulting in the waveform no longer being a sine wave and in harmonic distortion.

Resolves: #1176
(cherry picked from commit 6d06d1765f)
2025-09-17 11:40:37 -06:00
Tinet-mucw
9803156223 pbx.c: when set flag AST_SOFTHANGUP_ASYNCGOTO, ast_explicit_goto should return -1.
Under certain circumstances the context/extens/prio are set in the ast_async_goto, for example action Redirect.
In the situation that action Redirect is broken by GotoIf this info is changed.
that will causes confusion in dialplan execution.

Resolves: #1273
(cherry picked from commit bf9a6d80f8)
2025-09-17 11:40:37 -06:00
Sean Bright
57748784c4 res_musiconhold.c: Ensure we're always locked around music state access.
(cherry picked from commit 65001d26a6)
2025-09-17 11:40:37 -06:00
Sean Bright
e76e572e01 res_musiconhold.c: Annotate when the channel is locked.
(cherry picked from commit a49d96505b)
2025-09-17 11:40:37 -06:00
Jaco Kroon
9d07194acb res_musiconhold: Appropriately lock channel during start.
This relates to #829

This doesn't sully solve the Ops issue, but it solves the specific crash
there.  Further PRs to follow.

In the specific crash the generator was still under construction when
moh was being stopped, which then proceeded to close the stream whilst
it was still in use.

Signed-off-by: Jaco Kroon <jaco@uls.co.za>
(cherry picked from commit 7fa200bba0)
2025-09-17 11:40:37 -06:00
Asterisk Development Team
a4b54349a1 Update for 22.5.2 2025-09-17 11:40:37 -06:00
George Joseph
a6e61f587b 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-09-17 11:40:37 -06:00
Asterisk Development Team
9130399bb9 Update for 22.5.1 2025-09-17 11:40:37 -06:00
ThatTotallyRealMyth
7ba06dc6ee safe_asterisk: Add ownership checks for /etc/asterisk/startup.d and its files.
UpgradeNote: The safe_asterisk script now checks that, if it was run by the
root user, the /etc/asterisk/startup.d directory and all the files it contains
are owned by root.  If the checks fail, safe_asterisk will exit with an error
and Asterisk will not be started.  Additionally, the default logging
destination is now stderr instead of tty "9" which probably won't exist
in modern systems.

Resolves: #GHSA-v9q8-9j8m-5xwp
2025-09-17 11:40:37 -06:00
George Joseph
14e5ca9c6d res_stir_shaken: Test for missing semicolon in Identity header.
ast_stir_shaken_vs_verify() now makes sure there's a semicolon in
the Identity header to prevent a possible segfault.

Resolves: #GHSA-mrq5-74j5-f5cr
2025-09-17 11:40:37 -06:00
Asterisk Development Team
a78768bbdf Update for 22.5.0 2025-09-17 11:40:37 -06:00
Asterisk Development Team
97a5b80422 Update for 22.5.0-rc3 2025-09-17 11:40:37 -06:00
George Joseph
608e48af8d channelstorage: Rename callbacks that conflict with DEBUG_FD_LEAKS.
DEBUG_FD_LEAKS replaces calls to "open" and "close" with functions that keep
track of file descriptors, even when those calls are actually callbacks
defined in structures like ast_channelstorage_instance->open and don't touch
file descriptors.  This causes compilation failures.  Those callbacks
have been renamed to "open_instance" and "close_instance" respectively.

Resolves: #1287
2025-09-17 11:40:37 -06:00
George Joseph
423d0f59d4 channelstorage_cpp_map_name_id: Fix callback returning non-matching channels.
When the callback() API was invoked but no channel passed the test, callback
would return the last channel tested instead of NULL.  It now correctly
returns NULL when no channel matches.

Resolves: #1288
2025-09-17 11:40:37 -06:00
Asterisk Development Team
7f056c4ddb Update for 22.5.0-rc2 2025-09-17 11:40:37 -06:00
Michal Hajek
3dc48fe65c audiohook.c: Improve frame pairing logic to avoid MixMonitor breakage with mixed codecs
This patch adjusts the read/write synchronization logic in audiohook_read_frame_both()
to better handle calls where participants use different codecs or sample sizes
(e.g., alaw vs G.722). The previous hard threshold of 2 * samples caused MixMonitor
recordings to break or stutter when frames were not aligned between both directions.

The new logic uses a more tolerant limit (1.5 * samples), which prevents audio tearing
without causing excessive buffer overruns. This fix specifically addresses issues
with MixMonitor when recording directly on a channel in a bridge using mixed codecs.

Reported-by: Michal Hajek <michal.hajek@daktela.com>

Resolves: #1276
Resolves: #1279
2025-09-17 11:40:37 -06:00
Sean Bright
d0024a68e1 channelstorage_makeopts.xml: Remove errant XML character.
Resolves: #1282
2025-09-17 11:40:37 -06:00
Asterisk Development Team
af380ff6c3 Update for 22.5.0-rc1 2025-09-17 11:40:37 -06:00
George Joseph
a3596583d6 res_stir_shaken.so: Handle X5U certificate chains.
The verification process will now load a full certificate chain retrieved
via the X5U URL instead of loading only the end user cert.

* Renamed crypto_load_cert_from_file() and crypto_load_cert_from_memory()
to crypto_load_cert_chain_from_file() and crypto_load_cert_chain_from_memory()
respectively.

* The two load functions now continue to load certs from the file or memory
PEMs and store them in a separate stack of untrusted certs specific to the
current verification context.

* crypto_is_cert_trusted() now uses the stack of untrusted certs that were
extracted from the PEM in addition to any untrusted certs that were passed
in from the configuration (and any CA certs passed in from the config of
course).

Resolves: #1272

UserNote: The STIR/SHAKEN verification process will now load a full
certificate chain retrieved via the X5U URL instead of loading only
the end user cert.
2025-09-17 11:40:15 -06:00
George Joseph
2a3696517a res_stir_shaken: Add "ignore_sip_date_header" config option.
UserNote: A new STIR/SHAKEN verification option "ignore_sip_date_header" has
been added that when set to true, will cause the verification process to
not consider a missing or invalid SIP "Date" header to be a failure.  This
will make the IAT the sole "truth" for Date in the verification process.
The option can be set in the "verification" and "profile" sections of
stir_shaken.conf.

Also fixed a bug in the port match logic.

Resolves: #1251
Resolves: #1271
2025-09-17 11:40:15 -06:00
Naveen Albert
a792b96b74 app_record: Add RECORDING_INFO function.
Add a function that can be used to retrieve info
about a previous recording, such as its duration.

This is being added as a function to avoid possibly
trampling on dialplan variables, and could be extended
to provide other information in the future.

Resolves: #548

UserNote: The RECORDING_INFO function can now be used
to retrieve the duration of a recording.
2025-09-17 11:40:15 -06:00
Itzanh
8b670ea1be app_sms.c: Fix sending and receiving SMS messages in protocol 2
This fixes bugs in SMS messaging to SMS-capable analog phones that prevented app_sms.c from talking to phones using SMS protocol 2.

- Fix MORX message reception (from phone to Asterisk) in SMS protocol 2
- Fix MTTX message transmission (from Asterisk to phone) in SMS protocol 2

One of the bugs caused messages to have random characters and junk appended at the end up to the character limit. Another bug prevented Asterisk from sending messages from Asterisk to the phone at all. A final bug caused the transmission from Asterisk to the phone to take a long time because app_sms.c did not hang up after correctly sending the message, causing the phone to have to time out and hang up in order to complete the message transmission.

This was tested with a Linksys PAP2T and with a GrandStream HT814, sending and receiving messages with Telefónica DOMO Mensajes phones from Telefónica Spain. I had to play with both the network jitter buffer and the dB gain to get it to work. One of my phones required the gain to be set to +3dB for it to work, while another required it to be set to +6dB.

Only MORX and MTTX were tested, I did not test sending and receiving messages to a TelCo SMSC.
2025-09-17 11:40:15 -06:00
phoneben
61fc7ea667 app_queue: queue rules – Add support for QUEUE_RAISE_PENALTY=rN to raise penalties only for members within min/max range
This update adds support for a new QUEUE_RAISE_PENALTY format: rN

When QUEUE_RAISE_PENALTY is set to rN (e.g., r4), only members whose current penalty
is greater than or equal to the defined min_penalty and less than or equal to max_penalty
will have their penalty raised to N.

Members with penalties outside the min/max range remain unchanged.

Example behaviors:

QUEUE_RAISE_PENALTY=4     → Raise all members with penalty < 4 (existing behavior)
QUEUE_RAISE_PENALTY=r4    → Raise only members with penalty in [min_penalty, max_penalty] to 4

Implementation details:

Adds parsing logic to detect the r prefix and sets the raise_respect_min flag

Modifies the raise logic to skip members outside the defined penalty range when the flag is active

UserNote: This change introduces QUEUE_RAISE_PENALTY=rN, allowing selective penalty raises
only for members whose current penalty is within the [min_penalty, max_penalty] range.
Members with lower or higher penalties are unaffected.
This behavior is backward-compatible with existing queue rule configurations.
2025-09-17 11:40:15 -06:00
George Joseph
bd326919a2 res_websocket_client: Add more info to the XML documentation.
Added "see-also" links to chan_websocket and ARI Outbound WebSocket and
added an example configuration for each.
2025-09-17 11:40:15 -06:00
Jaco Kroon
509ca96490 res_odbc: cache_size option to limit the cached connections.
Signed-off-by: Jaco Kroon <jaco@uls.co.za>

UserNote: New cache_size option for res_odbc to on a per class basis limit the
number of cached connections. Please reference the sample configuration
for details.
2025-09-17 11:40:15 -06:00
Jaco Kroon
fa1a9d2a70 res_odbc: cache_type option for res_odbc.
This enables setting cache_type classes to a round-robin queueing system
rather than the historic stack mechanism.

This should result in lower risk of connection drops due to shorter idle
times (the first connection to go onto the stack could in theory never
be used again, ever, but sit there consuming resources, there could be
multiple of these).

And with a queue rather than a stack, dead connections are guaranteed to
be detected and purged eventually.

This should end up better balancing connection_cnt with actual load
over time, assuming the database doesn't keep connections open
excessively long from it's side.

Signed-off-by: Jaco Kroon <jaco@uls.co.za>

UserNote: When using res_odbc it should be noted that back-end
connections to the underlying database can now be configured to re-use
the cached connections in a round-robin manner rather than repeatedly
re-using the same connection.  This helps to keep connections alive, and
to purge dead connections from the system, thus more dynamically
adjusting to actual load.  The downside is that one could keep too many
connections active for a longer time resulting in resource also begin
consumed on the database side.
2025-09-17 11:40:15 -06:00
Sean Bright
4432fc70e7 res_pjsip: Fix empty ActiveChannels property in AMI responses.
The logic appears to have been reversed since it was introduced in
05cbf8df.

Resolves: #1254
2025-09-17 11:40:15 -06:00
George Joseph
0b29f5c60c ARI Outbound Websockets
Asterisk can now establish websocket sessions _to_ your ARI applications
as well as accepting websocket sessions _from_ them.
Full details: http://s.asterisk.net/ari-outbound-ws

Code change summary:
* Added an ast_vector_string_join() function,
* Added ApplicationRegistered and ApplicationUnregistered ARI events.
* Converted res/ari/config.c to use sorcery to process ari.conf.
* Added the "outbound-websocket" ARI config object.
* Refactored res/ari/ari_websockets.c to handle outbound websockets.
* Refactored res/ari/cli.c for the sorcery changeover.
* Updated res/res_stasis.c for the sorcery changeover.
* Updated apps/app_stasis.c to allow initiating per-call outbound websockets.
* Added CLI commands to manage ARI websockets.
* Added the new "outbound-websocket" object to ari.conf.sample.
* Moved the ARI XML documentation out of res_ari.c into res/ari/ari_doc.xml

UserNote: Asterisk can now establish websocket sessions _to_ your ARI applications
as well as accepting websocket sessions _from_ them.
Full details: http://s.asterisk.net/ari-outbound-ws
2025-09-17 11:40:15 -06:00
George Joseph
b08e093072 res_websocket_client: Create common utilities for websocket clients.
Since multiple Asterisk capabilities now need to create websocket clients
it makes sense to create a common set of utilities rather than making
each of those capabilities implement their own.

* A new configuration file "websocket_client.conf" is used to store common
client parameters in named configuration sections.
* APIs are provided to list and retrieve ast_websocket_client objects created
from the named configurations.
* An API is provided that accepts an ast_websocket_client object, connects
to the remote server with retries and returns an ast_websocket object. TLS is
supported as is basic authentication.
* An observer can be registered to receive notification of loaded or reloaded
client objects.
* An API is provided to compare an existing client object to one just
reloaded and return the fields that were changed. The caller can then decide
what action to take based on which fields changed.

Also as part of thie commit, several sorcery convenience macros were created
to make registering common object fields easier.

UserNote: A new module "res_websocket_client" and config file
"websocket_client.conf" have been added to support several upcoming new
capabilities that need common websocket client configuration.
2025-09-17 11:40:15 -06:00
George Joseph
2939725743 asterisk.c: Add option to restrict shell access from remote consoles.
UserNote: A new asterisk.conf option 'disable_remote_console_shell' has
been added that, when set, will prevent remote consoles from executing
shell commands using the '!' prefix.

Resolves: #GHSA-c7p6-7mvq-8jq2
2025-09-17 11:40:15 -06:00
George Joseph
ed5b222f85 res_pjsip_messaging.c: Mask control characters in received From display name
Incoming SIP MESSAGEs will now have their From header's display name
sanitized by replacing any characters < 32 (space) with a space.

Resolves: #GHSA-2grh-7mhv-fcfw
2025-09-17 11:40:15 -06:00
mkmer
f37424110c frame.c: validate frame data length is less than samples when adjusting volume
Resolves: #1230
2025-09-17 11:40:15 -06:00
Sven Kube
9027f896e5 res_audiosocket.c: Add retry mechanism for reading data from AudioSocket
The added retry mechanism addresses an issue that arises when fragmented TCP
packets are received, each containing only a portion of an AudioSocket packet.
This situation can occur if the external service sending the AudioSocket data
has Nagle's algorithm enabled.
2025-09-17 11:40:15 -06:00
Sven Kube
6da27b0e51 res_audiosocket.c: Set the TCP_NODELAY socket option
Disable Nagle's algorithm by setting the TCP_NODELAY socket option.
This reduces latency by preventing delays caused by packet buffering.
2025-09-17 11:40:15 -06:00
Thomas B. Clark
31be3d99a9 menuselect: Fix GTK menu callbacks for Fedora 42 compatibility
This patch resolves a build failure in `menuselect_gtk.c` when running
`make menuconfig` on Fedora 42. The new version of GTK introduced stricter
type checking for callback signatures.

Changes include:
- Add wrapper functions to match the expected `void (*)(void)` signature.
- Update `menu_items` array to use these wrappers.

Fixes: #1243
2025-09-17 11:40:15 -06:00
Stanislav Abramenkov
5a0728f161 jansson: Upgrade version to jansson 2.14.1
UpgradeNote: jansson has been upgraded to 2.14.1. For more
information visit jansson Github page: https://github.com/akheron/jansson/releases/tag/v2.14.1

Resolves: #1178
2025-09-17 11:40:15 -06:00
Joe Searle
4333a28206 pjproject: Increase maximum SDP formats and attribute limits
Since Chrome 136, using Windows, when initiating a video call the INVITE SDP exceeds the maximum number of allowed attributes, resulting in the INVITE being rejected. This increases the attribute limit and the number of formats allowed when using bundled pjproject.

Fixes: #1240
2025-09-17 11:40:15 -06:00
Nathan Monfils
cdcc82a3ca manager.c: Invalid ref-counting when purging events
We have a use-case where we generate a *lot* of events on the AMI, and
then when doing `manager show eventq` we would see some events which
would linger for hours or days in there. Obviously something was leaking.
Testing allowed us to track down this logic bug in the ref-counting on
the event purge.

Reproducing the bug was not super trivial, we managed to do it in a
production-like load testing environment with multiple AMI consumers.

The race condition itself:

1. something allocates and links `session`
2. `purge_sessions` iterates over that `session` (takes ref)
3. `purge_session` correctly de-referencess that session
4. `purge_session` re-evaluates the while() loop, taking a reference
5. `purge_session` exits (`n_max > 0` is false)
6. whatever allocated the `session` deallocates it, but a reference is
   now lost since we exited the `while` loop before de-referencing.
7. since the destructor is never called, the session->last_ev->usecount
   is never decremented, leading to events lingering in the queue

The impact of this bug does not seem major. The events are small and do
not seem, from our testing, to be causing meaningful additional CPU
usage. Mainly we wanted to fix this issue because we are internally
adding prometheus metrics to the eventq and those leaked events were
causing the metrics to show garbage data.
2025-09-17 11:40:14 -06:00
Mike Bradeen
33e7cfd0f7 res_pjsip_nat.c: Do not overwrite transfer host
When a call is transfered via dialplan behind a NAT, the
host portion of the Contact header in the 302 will no longer
be over-written with the external NAT IP and will retain the
hostname.

Fixes: #1141
2025-09-17 11:40:14 -06:00
Mike Bradeen
2c168d5afe chan_pjsip: Serialize INVITE creation on DTMF attended transfer
When a call is transfered via DTMF feature code, the Transfer Target and
Transferer are bridged immediately.  This opens the possibilty of a race
condition between the creation of an INVITE and the bridge induced colp
update that can result in the set caller ID being over-written with the
transferer's default info.

Fixes: #1234
2025-09-17 11:40:14 -06:00
George Joseph
6f2b99bfa6 Alternate Channel Storage Backends
Full details: http://s.asterisk.net/dc679ec3

The previous proof-of-concept showed that the cpp_map_name_id alternate
storage backed performed better than all the others so this final PR
adds only that option.  You still need to enable it in menuselect under
the "Alternate Channel Storage Backends" category.

To select which one is used at runtime, set the "channel_storage_backend"
option in asterisk.conf to one of the values described in
asterisk.conf.sample.  The default remains "ao2_legacy".

UpgradeNote: With this release, you can now select an alternate channel
storage backend based on C++ Maps.  Using the new backend may increase
performance and reduce the chances of deadlocks on heavily loaded systems.
For more information, see http://s.asterisk.net/dc679ec3
2025-09-17 11:40:14 -06:00
Naveen Albert
6002b6fdcb sig_analog: Add Call Waiting Deluxe support.
Adds support for Call Waiting Deluxe options to enhance
the current call waiting feature.

As part of this change, a mechanism is also added that
allows a channel driver to queue an audio file for Dial()
to play, which is necessary for the announcement function.

ASTERISK-30373 #close

Resolves: #271

UserNote: Call Waiting Deluxe can now be enabled for FXS channels
by enabling its corresponding option.
2025-09-17 11:40:14 -06:00
Naveen Albert
9c58dec9b0 app_sms: Ignore false positive vectorization warning.
Ignore gcc warning about writing 32 bytes into a region of size 6,
since we check that we don't go out of bounds for each byte.
This is due to a vectorization bug in gcc 15, stemming from
gcc commit 68326d5d1a593dc0bf098c03aac25916168bc5a9.

Resolves: #1088
2025-09-17 11:40:14 -06:00
George Joseph
7e8f566b49 lock.h: Add include for string.h when DEBUG_THREADS is defined.
When DEBUG_THREADS is defined, lock.h uses strerror(), which is defined
in the libc string.h file, to print warning messages. If the including
source file doesn't include string.h then strerror() won't be found and
and compile errors will be thrown. Since lock.h depends on this, string.h
is now included from there if DEBUG_THREADS is defined.  This way, including
source files don't have to worry about it.
2025-09-17 11:40:14 -06:00
Asterisk Development Team
75106551f1 Update for 22.4.0 2025-05-08 12:36:12 +00:00
Asterisk Development Team
969d2c6f35 Update for 22.4.0-rc1 2025-05-01 12:45:03 +00:00
Naveen Albert
479f276408 res_pjsip_caller_id: Also parse URI parameters for ANI2.
If the isup-oli was sent as a URI parameter, rather than a header
parameter, it was not being parsed. Make sure we parse both if
needed so the ANI2 is set regardless of which type of parameter
the isup-oli is sent as.

Resolves: #1220
(cherry picked from commit a3c65fc5d1)
2025-05-01 12:44:59 +00:00
Naveen Albert
bfc98788d6 app_meetme: Remove inaccurate removal version from xmldocs.
app_meetme is deprecated but wasn't removed as planned in 21,
so remove the inaccurate removal version.

Resolves: #1224
(cherry picked from commit 73c3fb1391)
2025-05-01 12:44:59 +00:00
Luz Paz
ce144276ee docs: Fix typos in apps/
Found via codespell

(cherry picked from commit af49027ccc)
2025-05-01 12:44:59 +00:00
Mike Bradeen
f5d8181eea stasis/control.c: Set Hangup Cause to No Answer on Dial timeout
Other Dial operations (dial, app_dial) use Q.850 cause 19 when a dial timeout occurs,
but the Dial command via ARI did not set an explicit reason. This resulted in a
CANCEL with Normal Call Clearing and corresponding ChannelDestroyed.

This change sets the hangup cause to AST_CAUSE_NO_ANSWER to be consistent with the
other operations.

Fixes: #963

UserNote:  A Dial timeout on POST /channels/{channelId}/dial will now result in a
CANCEL and ChannelDestroyed with cause 19 / User alerting, no answer.  Previously
no explicit cause was set, resulting in a cause of 16 / Normal Call Clearing.

(cherry picked from commit c9532225f8)
2025-05-01 12:44:58 +00:00
Naveen Albert
d6a46d7082 chan_iax2: Minor improvements to documentation and warning messages.
* Update Dial() documentation for IAX2 to include syntax for RSA
  public key names.
* Add additional details to a couple warnings to provide more context
  when an undecodable frame is received.

Resolves: #1206
(cherry picked from commit b3e3a0962e)
2025-05-01 12:44:58 +00:00
Andreas Wehrmann
9d2447afc7 pbx_ael: unregister AELSub application and CLI commands on module load failure
This fixes crashes/hangs I noticed with Asterisk 20.3.0 and 20.13.0 and quickly found out,
that the AEL module doesn't do proper cleanup when it fails to load.
This happens for example when there are syntax errors and AEL fails to compile in which case pbx_load_module()
returns an error but load_module() doesn't then unregister CLI cmds and the application.

(cherry picked from commit 54004e3c44)
2025-05-01 12:44:58 +00:00
Albrecht Oster
d7b8f1a3a1 res_pjproject: Fix DTLS client check failing on some platforms
Certain platforms (mainly BSD derivatives) have an additional length
field in `sockaddr_in6` and `sockaddr_in`.
`ast_sockaddr_from_pj_sockaddr()` does not take this field into account
when copying over values from the `pj_sockaddr` into the `ast_sockaddr`.
The resulting `ast_sockaddr` will have an uninitialized value for
`sin6_len`/`sin_len` while the other `ast_sockaddr` (not converted from
a `pj_sockaddr`) to check against in `ast_sockaddr_pj_sockaddr_cmp()`
has the correct length value set.

This has the effect that `ast_sockaddr_cmp()` will always indicate
an address mismatch, because it does a bitwise comparison, and all DTLS
packets are dropped even if addresses and ports match.

`ast_sockaddr_from_pj_sockaddr()` now checks whether the length fields
are available on the current platform and sets the values accordingly.

Resolves: #505
(cherry picked from commit 315289b87a)
2025-05-01 12:44:58 +00:00
George Joseph
b4378ff25e Prequisites for ARI Outbound Websockets
stasis:
* Added stasis_app_is_registered().
* Added stasis_app_control_mark_failed().
* Added stasis_app_control_is_failed().
* Fixed res_stasis_device_state so unsubscribe all works properly.
* Modified stasis_app_unregister() to unsubscribe from all event sources.
* Modified stasis_app_exec to return -1 if stasis_app_control_is_failed()
  returns true.

http:
* Added ast_http_create_basic_auth_header().

md5:
* Added define for MD5_DIGEST_LENGTH.

tcptls:
* Added flag to ast_tcptls_session_args to suppress connection log messages
  to give callers more control over logging.

http_websocket:
* Add flag to ast_websocket_client_options to suppress connection log messages
  to give callers more control over logging.
* Added username and password to ast_websocket_client_options to support
  outbound basic authentication.
* Added ast_websocket_result_to_str().

(cherry picked from commit 9d75b0447f)
2025-05-01 12:44:58 +00:00
Ben Ford
fc429a56ac contrib: Add systemd service and timer files for malloc trim.
Adds two files to the contrib/systemd/ directory that can be installed
to periodically run "malloc trim" on Asterisk. These files do nothing
unless they are explicitly moved to the correct location on the system.
Users who are experiencing Asterisk memory issues can use this service
to potentially help combat the problem. These files can also be
configured to change the start time and interval. See systemd.timer(5)
and systemd.time(7) for more information.

UserNote: Service and timer files for systemd have been added to the
contrib/systemd/ directory. If you are experiencing memory issues,
install these files to have "malloc trim" periodically run on the
system.

(cherry picked from commit 956e0a9b56)
2025-05-01 12:44:58 +00:00
Peter Jannesen
a3fbcc817b action_redirect: remove after_bridge_goto_info
Under certain circumstances the context/extens/prio are stored in the
after_bridge_goto_info. This info is used when the bridge is broken by
for hangup of the other party. In the situation that the bridge is
broken by an AMI Redirect this info is not used but also not removed.
With the result that when the channel is put back in a bridge and the
bridge is broken the execution continues at the wrong
context/extens/prio.

Resolves: #1144
(cherry picked from commit 177b8b6909)
2025-05-01 12:44:58 +00:00
Joshua C. Colp
725580e79e channel: Always provide cause code in ChannelHangupRequest.
When queueing a channel to be hung up a cause code can be
specified in one of two ways:

1. ast_queue_hangup_with_cause
This function takes in a cause code and queues it as part
of the hangup request, which ultimately results in it being
set on the channel.

2. ast_channel_hangupcause_set + ast_queue_hangup
This combination sets the hangup cause on the channel before
queueing the hangup instead of as part of that process.

In the #2 case the ChannelHangupRequest event would not contain
the cause code. For consistency if a cause code has been set
on the channel it will now be added to the event.

Resolves: #1197
(cherry picked from commit 8c5c1dcedd)
2025-05-01 12:44:58 +00:00
phoneben
43db0baf38 Add log-caller-id-name option to log Caller ID Name in queue log
Add log-caller-id-name option to log Caller ID Name in queue log

This patch introduces a new global configuration option, log-caller-id-name,
to queues.conf to control whether the Caller ID name is logged when a call enters a queue.

When log-caller-id-name=yes, the Caller ID name is logged
as parameter 4 in the queue log, provided it’s allowed by the
existing log_restricted_caller_id rules. If log-caller-id-name=no (the default),
the Caller ID name is omitted from the logs.

Fixes: #1091

UserNote: This patch adds a global configuration option, log-caller-id-name, to queues.conf
to control whether the Caller ID name is logged as parameter 4 when a call enters a queue.
When log-caller-id-name=yes, the Caller ID name is included in the queue log,
Any '|' characters in the caller ID name will be replaced with '_'.
(provided it’s allowed by the existing log_restricted_caller_id rules).
When log-caller-id-name=no (the default), the Caller ID name is omitted.

(cherry picked from commit 487584987f)
2025-05-01 12:44:58 +00:00
George Joseph
7b22d2ef88 asterisk.c: Add "pre-init" and "pre-module" capability to cli.conf.
Commands in the "[startup_commands]" section of cli.conf have historically run
after all core and module initialization has been completed and just before
"Asterisk Ready" is printed on the console. This meant that if you
wanted to debug initialization of a specific module, your only option
was to turn on debug for everything by setting "debug" in asterisk.conf.

This commit introduces options to allow you to run CLI commands earlier in
the asterisk startup process.

A command with a value of "pre-init" will run just after logger initialization
but before most core, and all module, initialization.

A command with a value of "pre-module" will run just after all core
initialization but before all module initialization.

A command with a value of "fully-booted" (or "yes" for backwards
compatibility) will run as they always have been...after all
initialization and just before "Asterisk Ready" is printed on the console.

This means you could do this...

```
[startup_commands]
core set debug 3 res_pjsip.so = pre-module
core set debug 0 res_pjsip.so = fully-booted
```

This would turn debugging on for res_pjsip.so to catch any module
initialization debug messages then turn it off again after the module is
loaded.

UserNote: In cli.conf, you can now define startup commands that run before
core initialization and before module initialization.

(cherry picked from commit abd96ac9c1)
2025-05-01 12:44:58 +00:00
Sean Bright
73e46882f2 app_confbridge: Prevent crash when publishing channel-less event.
Resolves: #1190
(cherry picked from commit c11d28b13e)
2025-05-01 12:44:58 +00:00
George Joseph
ea344ecc14 ari_websockets: Fix frack if ARI config fails to load.
ari_ws_session_registry_dtor() wasn't checking that the container was valid
before running ao2_callback on it to shutdown registered sessions.

(cherry picked from commit abf8986068)
2025-05-01 12:44:58 +00:00
George Joseph
2a55f064f3 ARI: REST over Websocket
This commit adds the ability to make ARI REST requests over the same
websocket used to receive events.

For full details on how to use the new capability, visit...

https://docs.asterisk.org/Configuration/Interfaces/Asterisk-REST-Interface-ARI/ARI-REST-over-WebSocket/

Changes:

* Added utilities to http.c:
  * ast_get_http_method_from_string().
  * ast_http_parse_post_form().
* Added utilities to json.c:
  * ast_json_nvp_array_to_ast_variables().
  * ast_variables_to_json_nvp_array().
* Added definitions for new events to carry REST responses.
* Created res/ari/ari_websocket_requests.c to house the new request handlers.
* Moved non-event specific code out of res/ari/resource_events.c into
  res/ari/ari_websockets.c
* Refactored res/res_ari.c to move non-http code out of ast_ari_callback()
  (which is http specific) and into ast_ari_invoke() so it can be shared
  between both the http and websocket transports.

UpgradeNote: This commit adds the ability to make ARI REST requests over the same
websocket used to receive events.
See https://docs.asterisk.org/Configuration/Interfaces/Asterisk-REST-Interface-ARI/ARI-REST-over-WebSocket/

(cherry picked from commit 1442c17141)
2025-05-01 12:44:58 +00:00
mkmer
68d9a69be3 audiohook.c: Add ability to adjust volume with float
Add the capability to audiohook for float type volume adjustments.  This allows for adjustments to volume smaller than 6dB.  With INT adjustments, the first step is 2 which converts to ~6dB (or 1/2 volume / double volume depending on adjustment sign). 3dB is a typical adjustment level which can now be accommodated with an adjustment value of 1.41.

This is accomplished by the following:
  Convert internal variables to type float.
  Always use ast_frame_adjust_volume_float() for adjustments.
  Cast int to float in original functions ast_audiohook_volume_set(), and ast_volume_adjust().
  Cast float to int in ast_audiohook_volume_get()
  Add functions ast_audiohook_volume_get_float, ast_audiohook_volume_set_float, and ast_audiohook_volume_adjust_float.

This update maintains 100% backward compatibility.

Resolves: #1171
(cherry picked from commit ecd1a727e8)
2025-05-01 12:44:58 +00:00
Florent CHAUVEAU
a15e4043ce audiosocket: added support for DTMF frames
Updated the AudioSocket protocol to allow sending DTMF frames.
AST_FRAME_DTMF frames are now forwarded to the server, in addition to
AST_FRAME_AUDIO frames. A new payload type AST_AUDIOSOCKET_KIND_DTMF
with value 0x03 was added to the protocol. The payload is a 1-byte
ascii representing the DTMF digit (0-9,*,#...).

UserNote: The AudioSocket protocol now forwards DTMF frames with
payload type 0x03. The payload is a 1-byte ascii representing the DTMF
digit (0-9,*,#...).

(cherry picked from commit c2444b188a)
2025-05-01 12:44:58 +00:00
Norm Harrison
352a72c9b5 asterisk/channel.h: fix documentation for 'ast_waitfor_nandfds()'
Co-authored-by: Florent CHAUVEAU <florentch@pm.me>
(cherry picked from commit 6c6195ce4d)
2025-05-01 12:44:58 +00:00
Norm Harrison
d045f290b7 audiosocket: fix timeout, fix dialplan app exit, server address in logs
- Correct wait timeout logic in the dialplan application.
- Include server address in log messages for better traceability.
- Allow dialplan app to exit gracefully on hangup messages and socket closure.
- Optimize I/O by reducing redundant read()/write() operations.

Co-authored-by: Florent CHAUVEAU <florentch@pm.me>
(cherry picked from commit a6ef41e4ca)
2025-05-01 12:44:58 +00:00
Mark Murawski
d18b6bb9b3 chan_pjsip: Add the same details as PJSIPShowContacts to the CLI via 'pjsip show contact'
CLI 'pjsip show contact' does not show enough information.
One must telnet to AMI or write a script to ask Asterisk for example what the User-Agent is on a Contact
This feature adds the same details as PJSIPShowContacts to the CLI

Resolves: #643
(cherry picked from commit fa69682c28)
2025-05-01 12:44:58 +00:00
Zhai Liangliang
419423f68c Update config.guess and config.sub
(cherry picked from commit ea37d6a6e1)
2025-05-01 12:44:58 +00:00
Alexei Gradinari
04ed031b62 chan_pjsip: set correct Endpoint Device State on multiple channels
1. When one channel is placed on hold, the device state is set to ONHOLD
without checking other channels states.
In case of AST_CONTROL_HOLD set the device state as AST_DEVICE_UNKNOWN
to calculate aggregate device state of all active channels.

2. The current implementation incorrectly classifies channels in use.
The only channels that has the states: UP, RING and BUSY are considered as "in use".
A channel should be considered "in use" if its state is anything other than
DOWN or RESERVED.

3. Currently, if the number of channels "in use" is greater than device_state_busy_at,
the system does not set the state to BUSY. Instead, it incorrectly assigns an aggregate
device state.
The endpoint device state should be BUSY if the number of channels "in use" is greater
than or equal to device_state_busy_at.

Fixes: #1181
(cherry picked from commit b82d9b0d5b)
2025-05-01 12:44:58 +00:00
Allan Nathanson
bdc925c8cc file.c: missing "custom" sound files should not generate warning logs
With `sounds_search_custom_dir = yes` we first look to see if a sound file
is present in the "custom" sound directory before looking in the standard
sound directories.  We should not be issuing a WARNING log message if a
sound cannot be found in the "custom" directory.

Resolves: https://github.com/asterisk/asterisk/issues/1170
(cherry picked from commit e2e36748f5)
2025-05-01 12:44:58 +00:00
Asterisk Development Team
b7f7d66fca Update for 22.3.0 2025-03-27 12:54:43 +00:00
Asterisk Development Team
6fed735157 Update for 22.3.0-rc1 2025-03-20 18:34:12 +00:00
Ben Ford
10ef135e5a documentation: Update Gosub, Goto, and add new documentationtype.
Gosub and Goto were not displaying their syntax correctly on the docs
site. This change adds a new way to specify an optional context, an
optional extension, and a required priority that the xml stylesheet can
parse without having to know which optional parameters come in which
order. In Asterisk, it looks like this:

  parameter name="context" documentationtype="dialplan_context"
  parameter name="extension" documentationtype="dialplan_extension"
  parameter name="priority" documentationtype="dialplan_priority" required="true"

The stylesheet will ignore the context and extension parameters, but for
priority, it will automatically inject the following:

  [[context,]extension,]priority

This is the correct oder for applications such as Gosub and Goto.

(cherry picked from commit 091171c0eb)
2025-03-20 18:34:08 +00:00
Sean Bright
d9f1b1598f res_config_curl.c: Remove unnecessary warnings.
Resolves: #1164
(cherry picked from commit 0900f83820)
2025-03-20 18:34:08 +00:00
George Joseph
dce0ae89a4 README.md: Updates and Fixes
* Outdated information has been removed.
* New links added.
* Placeholder added for link to change logs.

Going forward, the release process will create HTML versions of the README
and change log and will update the link in the README to the current
change log for the branch...

* In the development branches, the link will always point to the current
  release on GitHub.
* In the "releases/*" branches and the tarballs, the link will point to the
  ChangeLogs/ChangeLog-<version>.html file in the source directory.
* On the downloads website, the link will point to the
  ChangeLog-<version>.html file in the same directory.

Resolves: #1131
(cherry picked from commit dc5c545175)
2025-03-20 18:34:08 +00:00
Sean Bright
ff8ec30efb res_rtp_asterisk.c: Don't truncate spec-compliant ice-ufrag or ice-pwd.
RFC 8839[1] indicates that the `ice-ufrag` and `ice-pwd` attributes
can be up to 256 bytes long. While we don't generate values of that
size, we should be able to accomodate them without truncating.

1. https://www.rfc-editor.org/rfc/rfc8839#name-ice-ufrag-and-ice-pwd-attri

(cherry picked from commit 25aff1a887)
2025-03-20 18:34:08 +00:00
Joshua Elson
4a1129b893 fix: Correct default flag for tcp_keepalive_enable option
Resolves an issue where the tcp_keepalive_enable option was not properly enabled in the sample configuration due to an incorrect default flag setting.

Fixes: #1149
(cherry picked from commit c4232f2940)
2025-03-20 18:34:08 +00:00
Sean Bright
8e900950b6 docs: AMI documentation fixes.
Most of this patch is adding missing PJSIP-related event
documentation, but the one functional change was adding a sorcery
to-string handler for endpoint's `redirect_method` which was not
showing up in the AMI event details or `pjsip show endpoint
<endpoint>` output.

The rest of the changes are summarized below:

* app_agent_pool.c: Typo fix Epoche -> Epoch.
* stasis_bridges.c: Add missing AttendedTransfer properties.
* stasis_channels.c: Add missing AgentLogoff properties.
* pjsip_manager.xml:
  - Add missing AorList properties.
  - Add missing AorDetail properties.
  - Add missing ContactList properties.
  - Add missing ContactStatusDetail properties.
  - Add missing EventDetail properties.
  - Add missing AuthList properties.
  - Add missing AuthDetail properties.
  - Add missing TransportDetail properties.
  - Add missing EndpointList properties.
  - Add missing IdentifyDetail properties.
* res_pjsip_registrar.c: Add missing InboundRegistrationDetail documentation.
* res_pjsip_pubsub.c:
  - Add missing ResourceListDetail documentation.
  - Add missing InboundSubscriptionDetail documentation.
  - Add missing OutboundSubscriptionDetail documentation.
* res_pjsip_outbound_registration.c: Add missing OutboundRegistrationDetail documentation.

(cherry picked from commit f042fb2153)
2025-03-20 18:34:08 +00:00
Allan Nathanson
2d75ac2c0e config.c: #include of non-existent file should not crash
Corrects a segmentation fault when a configuration file has a #include
statement that referenced a file that does not exist.

Resolves: https://github.com/asterisk/asterisk/issues/1139
(cherry picked from commit ffb0969a98)
2025-03-20 18:34:08 +00:00
George Joseph
d184ae428d manager.c: Check for restricted file in action_createconfig.
The `CreateConfig` manager action now ensures that a config file can
only be created in the AST_CONFIG_DIR unless `live_dangerously` is set.

Resolves: #1122
(cherry picked from commit d4ece751c5)
2025-03-20 18:34:08 +00:00
George Joseph
77c6bf844f swagger_model.py: Fix invalid escape sequence in get_list_parameter_type().
Recent python versions complain when backslashes in strings create invalid
escape sequences.  This causes issues for strings used as regex patterns like
`'^List\[(.*)\]$'` where you want the regex parser to treat `[` and `]`
as literals.  Double-backslashing is one way to fix it but simply converting
the string to a raw string `re.match(r'^List\[(.*)\]$', text)` is easier
and less error prone.

(cherry picked from commit c30ffc08a7)
2025-03-20 18:34:08 +00:00
Maximilian Fridrich
99ef285fff Revert "res_rtp_asterisk.c: Set Mark on rtp when timestamp skew is too big"
This reverts commit f30ad96b3f.

The original change was not RFC compliant and caused issues because it
set the RTP marker bit in cases when it shouldn't be set. See the
linked issue #1135 for a detailed explanation.

Fixes: #1135.
(cherry picked from commit 44ca269adb)
2025-03-20 18:34:08 +00:00
Sean Bright
f5e87a6da3 res_rtp_asterisk.c: Use correct timeout value for T.140 RED timer.
Found while reviewing #1128

(cherry picked from commit 47e2e59230)
2025-03-20 18:34:08 +00:00
Luz Paz
540e28ea8d docs: Fix typos in cdr/
Found via codespell

(cherry picked from commit f221ef9777)
2025-03-20 18:34:08 +00:00
Luz Paz
350a80a2aa docs: Fix various typos in channels/
Found via `codespell -q 3 -S "./CREDITS,*.po" -L abd,asent,atleast,cachable,childrens,contentn,crypted,dne,durationm,enew,exten,inout,leapyear,mye,nd,oclock,offsetp,ot,parm,parms,preceeding,pris,ptd,requestor,re-use,re-used,re-uses,ser,siz,slanguage,slin,thirdparty,varn,varns,ues`

(cherry picked from commit 32cdce18c2)
2025-03-20 18:34:08 +00:00
Luz Paz
3692e33898 docs: Fix various typos in main/
Found via `codespell -q 3 -S "./CREDITS" -L abd,asent,atleast,childrens,contentn,crypted,dne,durationm,exten,inout,leapyear,nd,oclock,offsetp,ot,parm,parms,requestor,ser,slanguage,slin,thirdparty,varn,varns,ues`

(cherry picked from commit b96640916d)
2025-03-20 18:34:08 +00:00
George Joseph
de3d6c03e3 bridging: Fix multiple bridging issues causing SEGVs and FRACKs.
Issues:

* The bridging core allowed multiple bridges to be created with the same
  unique bridgeId at the same time.  Only the last bridge created with the
  duplicate name was actually saved to the core bridges container.

* The bridging core was creating a stasis topic for the bridge and saving it
  in the bridge->topic field but not increasing its reference count.  In the
  case where two bridges were created with the same uniqueid (which is also
  the topic name), the second bridge would get the _existing_ topic the first
  bridge created.  When the first bridge was destroyed, it would take the
  topic with it so when the second bridge attempted to publish a message to
  it it either FRACKed or SEGVd.

* The bridge destructor, which also destroys the bridge topic, is run from the
  bridge manager thread not the caller's thread.  This makes it possible for
  an ARI developer to create a new one with the same uniqueid believing the
  old one was destroyed when, in fact, the old one's destructor hadn't
  completed. This could cause the new bridge to get the old one's topic just
  before the topic was destroyed.  When the new bridge attempted to publish
  a message on that topic, asterisk could either FRACK or SEGV.

* The ARI bridges resource also allowed multiple bridges to be created with
  the same uniqueid but it kept the duplicate bridges in its app_bridges
  container.  This created a situation where if you added two bridges with
  the same "bridge1" uniqueid, all operations on "bridge1" were performed on
  the first bridge created and the second was basically orphaned.  If you
  attempted to delete what you thought was the second bridge, you actually
  deleted the first one created.

Changes:

* A new API `ast_bridge_topic_exists(uniqueid)` was created to determine if
  a topic already exists for a bridge.

* `bridge_base_init()` in bridge.c and `ast_ari_bridges_create()` in
  resource_bridges.c now call `ast_bridge_topic_exists(uniqueid)` to check
  if a bridge with the requested uniqueid already exists and will fail if it
  does.

* `bridge_register()` in bridges.c now checks the core bridges container to
  make sure a bridge doesn't already exist with the requested uniqueid.
  Although most callers of `bridge_register()` will have already called
  `bridge_base_init()`, which will now fail on duplicate bridges, there
  is no guarantee of this so we must check again.

* The core bridges container allocation was changed to reject duplicate
  uniqueids instead of silently replacing an existing one. This is a "belt
  and suspenders" check.

* A global mutex was added to bridge.c to prevent concurrent calls to
  `bridge_base_init()` and `bridge_register()`.

* Even though you can no longer create multiple bridges with the same uniqueid
  at the same time, it's still possible that the bridge topic might be
  destroyed while a second bridge with the same uniqueid was trying to use
  it. To address this, the bridging core now increments the reference count
  on bridge->topic when a bridge is created and decrements it when the
  bridge is destroyed.

* `bridge_create_common()` in res_stasis.c now checks the stasis app_bridges
  container to make sure a bridge with the requested uniqueid doesn't already
  exist.  This may seem like overkill but there are so many entrypoints to
  bridge creation that we need to be safe and catch issues as soon in the
  process as possible.

* The stasis app_bridges container allocation was changed to reject duplicate
  uniqueids instead of adding them. This is a "belt and suspenders" check.

* The `bridge show all` CLI command now shows the bridge name as well as the
  bridge id.

* Response code 409 "Conflict" was added as a possible response from the ARI
  bridge create resources to signal that a bridge with the requested uniqueid
  already exists.

* Additional debugging was added to multiple bridging and stasis files.

Resolves: #211
(cherry picked from commit 169b9b9a4f)
2025-03-20 18:34:08 +00:00
George Joseph
fc1de1f290 .github: Change concurrency group ids so they're unique.
GitHub strikes again.  Apparently the github.ref context variable only
contains the PR number if the workflow is triggered by "pull_request" so
since we just changed the trigger to "pull_request_target" the variable
no longer contains the PR number and is therefore not unique and can't be
used as a concurrency group id.  We now use
`github.triggering_actor-github.head_ref`.

(cherry picked from commit 313608837e)
2025-03-20 18:34:08 +00:00
Mike Bradeen
ee09b289ab bridge_channel: don't set cause code on channel during bridge delete if already set
Due to a potential race condition via ARI when hanging up a channel hangup with cause
while also deleting a bridge containing that channel, the bridge delete can over-write
the hangup cause code resulting in Normal Call Clearing instead of the set value.

With this change, bridge deletion will only set the hangup code if it hasn't been
previously set.

Resolves: #1124
(cherry picked from commit 7e694417ad)
2025-03-20 18:34:08 +00:00
George Joseph
5ddfbd5eab .github: Refactor Releaser to use reusable workflow
(cherry picked from commit aa9d6fb9e3)
2025-03-20 18:34:07 +00:00
George Joseph
d6ce7bb395 .github: Change branch of reusable workflows to main.
(cherry picked from commit 07f37f51fe)
2025-03-20 18:34:07 +00:00
George Joseph
02bdc2dc37 .github: Refactor to use pull_request_target trigger.
After careful review, we believe we can now use the "pull_request_target"
workflow trigger instead of "pull_request" which required a separate
privliged workflow to add labels and comments to PRs when they are submitted
or updated.  This allows us to greatly streamline our workflows and remove
unneeded ones.

* The OnPRChanged workflow was...
  * Renamed to OnPRCheck
  * Changed to trigger on pull_request_target and the "recheckpr" label.
  * Changed to simply call reusable workflows in asterisk-ci-actions.
  * Changed to use better concurrency groups.
* The OnPRCPCheck and OnPRMergeApproved workflows were also...
  * Changed to simply call reusable workflows in asterisk-ci-actions.
  * Changed to use better concurrency groups.
* The NightlyTest and CreateDocs were also tweaked

(cherry picked from commit ebb33475bc)
2025-03-20 18:34:07 +00:00
George Joseph
26ea320f3c res_config_pgsql: Fix regression that removed dbname config.
A recent commit accidentally removed the code that sets dbname.
This commit adds it back in.

Resolves: #1119
(cherry picked from commit aef37c2a65)
2025-03-20 18:34:07 +00:00
George Joseph
3ec2a680f2 res_stir_shaken: Allow missing or anonymous CID to continue to the dialplan.
The verification check for missing or anonymous callerid was happening before
the endpoint's profile was retrieved which meant that the failure_action
parameter wasn't available.  Therefore, if verification was enabled and there
was no callerid or it was "anonymous", the call was immediately terminated
instead of giving the dialplan the ability to decide what to do with the call.

* The callerid check now happens after the verification context is created and
  the endpoint's stir_shaken_profile is available.

* The check now processes the callerid failure just as it does for other
  verification failures and respects the failure_action parameter.  If set
  to "continue" or "continue_return_reason", `STIR_SHAKEN(0,verify_result)`
  in the dialplan will return "invalid_or_no_callerid".

* If the endpoint's failure_action is "reject_request", the call will be
  rejected with `433 "Anonymity Disallowed"`.

* If the endpoint's failure_action is "continue_return_reason", the call will
  continue but a `Reason: STIR; cause=433; text="Anonymity Disallowed"`
  header will be added to the next provisional or final response.

Resolves: #1112
(cherry picked from commit 85fa81ad45)
2025-03-20 18:34:07 +00:00
George Joseph
619cb75688 resource_channels.c: Fix memory leak in ast_ari_channels_external_media.
Between ast_ari_channels_external_media(), external_media_rtp_udp(),
and external_media_audiosocket_tcp(), the `variables` structure being passed
around wasn't being cleaned up properly when there was a failure.

* In ast_ari_channels_external_media(), the `variables` structure is now
  defined with RAII_VAR to ensure it always gets cleaned up.

* The ast_variables_destroy() call was removed from external_media_rtp_udp().

* The ast_variables_destroy() call was removed from
  external_media_audiosocket_tcp(), its `endpoint` allocation was changed to
  to use ast_asprintf() as external_media_rtp_udp() does, and it now
  returns an error on failure.

* ast_ari_channels_external_media() now checks the new return code from
  external_media_audiosocket_tcp() and sets the appropriate error response.

Resolves: #1109
(cherry picked from commit 1a1eb88211)
2025-03-20 18:34:07 +00:00
Holger Hans Peter Freyther
fe5ff3021e ari/pjsip: Make it possible to control transfers through ARI
Introduce a ChannelTransfer event and the ability to notify progress to
ARI. Implement emitting this event from the PJSIP channel instead of
handling the transfer in Asterisk when configured.

Introduce a dialplan function to the PJSIP channel to switch between the
"core" and "ari-only" behavior.

UserNote: Call transfers on the PJSIP channel can now be controlled by
ARI. This can be enabled by using the PJSIP_TRANSFER_HANDLING(ari-only)
dialplan function.

(cherry picked from commit a0d0c47d06)
2025-03-20 18:34:07 +00:00
George Joseph
ba1626df89 .github: Remove concurrency check in on-labelled workflows.
Apparently you can't use `${{ github.event.number }}` in a concurrency
block in a job that calls a reusable workflow. :(

(cherry picked from commit d53f96b6af)
2025-03-20 18:34:07 +00:00
Sean Bright
8f97da052d channel.c: Remove dead AST_GENERATOR_FD code.
Nothing ever sets the `AST_GENERATOR_FD`, so this block of code will
never execute. It also is the only place where the `generate` callback
is called with the channel lock held which made it difficult to reason
about the thread safety of `ast_generator`s.

In passing, also note that `AST_AGENT_FD` isn't used either.

(cherry picked from commit 46017ea15b)
2025-03-20 18:34:07 +00:00
George Joseph
86ff4b8a5b .github: Move PRChanged,PRChangedPriv,PRCPCheck,PRReCheck,PRMerge logic.
Moved to asterisk-ci-actions reusable workflows.

(cherry picked from commit 595739a21c)
2025-03-20 18:34:07 +00:00
George Joseph
2524043b61 .github: OnPRCherryPickTest,OnPRStateChanged,OnPRRecheck: Add job summaries.
...and refactor environment variables.

(cherry picked from commit 9b1616e501)
2025-03-20 18:34:07 +00:00
George Joseph
26ad51c2ff .github: Clean up CreateDocs
(cherry picked from commit ad0f268c5b)
2025-03-20 18:34:07 +00:00
George Joseph
ecb3c3d8e5 func_strings.c: Prevent SEGV in HASH single-argument mode.
When in single-argument mode (very rarely used), a malformation of a column
name (also very rare) could cause a NULL to be returned when retrieving the
channel variable for that column.  Passing that to strncat causes a SEGV.  We
now check for the NULL and print a warning message.

Resolves: #1101
(cherry picked from commit 6574f6532d)
2025-03-20 18:34:07 +00:00
George Joseph
7863ff70bd docs: Add version information to AGI command XML elements.
This process was a bit different than the others because everything
is in the same file, there's an array that contains the command
names and their handler functions, and the last command was created
over 15 years ago.

* Dump a `git blame` of res/res_agi.c from BEFORE the handle_* prototypes
  were changed.
* Create a command <> handler function xref by parsing the the agi_command
  array.
* For each entry, grep the function definition line "static int handle_*"
  from the git blame output and capture the commit.  This will be the
  commit the command was created in.
* Do a `git tag --contains <commit> | sort -V | head -1` to get the
  tag the function was created in.
* Add a single since/version element to the command XML.  Multiple versions
  aren't supported here because the branching and tagging scheme changed
  several times in the 2000's.

(cherry picked from commit 8dd5c23494)
2025-03-20 18:34:07 +00:00
Jeremy Lainé
47d3cca627 docs: Fix minor typo in MixMonitor AMI action
The `Options` argument was erroneously documented as lowercase
`options`.

(cherry picked from commit 85538b6d71)
2025-03-20 18:34:07 +00:00
Naveen Albert
c0ed22368a utils: Disable old style definition warnings for libdb.
Newer versions of gcc now warn about old style definitions, such
as those in libdb, which causes compilation failure with DEVMODE
enabled. Ignore these warnings for libdb.

Resolves: #1085
(cherry picked from commit 5b2f36ffae)
2025-03-20 18:34:07 +00:00
fabriziopicconi
b31d457d0a rtp.conf.sample: Correct stunaddr example.
(cherry picked from commit 4d9a73af71)
2025-03-20 18:34:07 +00:00
George Joseph
8d386d7c8b docs: Add version information to ARI resources and methods.
* Dump a git blame of each file in rest-api/api-docs.

* Get the commit for each "resourcePath" and "httpMethod" entry.

* Find the tags for each commit (same as other processes).

* Insert a "since" array after each "resourcePath" and "httpMethod" entry.

(cherry picked from commit bbc0a609fc)
2025-03-20 18:34:07 +00:00
Sean Bright
8a3a2958c1 docs: Indent <since> tags.
Also updates the 'since' of applications/functions that existed before
XML documentation was introduced (1.6.2.0).

(cherry picked from commit 67e89b3e77)
2025-03-20 18:34:07 +00:00
Asterisk Development Team
a0db68c190 Update for 22.2.0 2025-02-06 17:18:25 +00:00
Asterisk Development Team
eb782ec341 Update for 22.2.0-rc2 2025-01-30 16:28:53 +00:00
George Joseph
5ac0874240 res_pjsip_authenticator_digest: Make correct error messages appear again.
When an incoming request can't be matched to an endpoint, the "artificial"
auth object is used to create a challenge to return in a 401 response and we
emit a "No matching endpoint found" log message. If the client then responds
with an Authorization header but the request still can't be matched to an
endpoint, the verification will fail and, as before, we'll create a challenge
to return in a 401 response and we emit a "No matching endpoint found" log
message.  HOWEVER, because there WAS an Authorization header and it failed
verification, we should have also been emitting a "Failed to authenticate"
log message but weren't because there was a check that short-circuited that
it if the artificial auth was used.  Since many admins use the "Failed to
authenticate" message with log parsers like fail2ban, those attempts were not
being recognized as suspicious.

Changes:

* digest_check_auth() now always emits the "Failed to authenticate" log
  message if verification of an Authorization header failed even if the
  artificial auth was used.

* The verification logic was refactored to be clearer about the handling
  of the return codes from verify().

* Comments were added clarify what return codes digest_check_auth() should
  return to the distributor and the implications of changing them.

Resolves: #1095
2025-01-29 10:01:13 -07:00
George Joseph
c3cf4bd223 alembic: Database updates required.
This commit doesn't actually change anything.  It just adds the following
upgrade notes that were omitted from the original commits.

Resolves: #1097

UpgradeNote: Two commits in this release...
'Add SHA-256 and SHA-512-256 as authentication digest algorithms'
'res_pjsip: Add new AOR option "qualify_2xx_only"'
...have modified alembic scripts for the following database tables: ps_aors,
ps_contacts, ps_auths, ps_globals. If you don't use the scripts to update
your database, reads from those tables will succeeed but inserts into the
ps_contacts table by res_pjsip_registrar will fail.
2025-01-29 10:00:58 -07:00
George Joseph
00de10c0d1 res_pjsip: Fix startup/reload memory leak in config_auth.
An issue in config_auth.c:ast_sip_auth_digest_algorithms_vector_init() was
causing double allocations for the two supported_algorithms vectors to the
tune of 915 bytes.  The leak only happens on startup and when a reload is done
and doesn't get bigger with the number of auth objects defined.

* Pre-initialized the two vectors in config_auth:auth_alloc().
* Removed the allocations in ast_sip_auth_digest_algorithms_vector_init().
* Added a note to the doc for ast_sip_auth_digest_algorithms_vector_init()
  noting that the vector passed in should be initialized and empty.
* Simplified the create_artificial_auth() function in pjsip_distributor.
* Set the vector initialization count to 0 in config_global:global_apply().
2025-01-29 10:00:47 -07:00
Asterisk Development Team
04f4bd73cd Update for 22.2.0-rc1 2025-01-23 18:42:32 +00:00
George Joseph
ce550fc1b0 docs: Add version information to application and function XML elements
* Do a git blame on the embedded XML application or function element.

* From the commit hash, grab the summary line.

* Do a git log --grep <summary> to find the cherry-pick commits in all
  branches that match.

* Do a git patch-id to ensure the commits are all related and didn't get
  a false match on the summary.

* Do a git tag --contains <commit> to find the tags that contain each
  commit.

* Weed out all tags not ..0.

* Sort and discard any .0.0 and following tags where the commit
  appeared in an earlier branch.

* The result is a single tag for each branch where the application or function
  was defined.

The applications and functions defined in the following files were done by
hand because the XML was extracted from the C source file relatively recently.
* channels/pjsip/dialplan_functions_doc.xml
* main/logger_doc.xml
* main/manager_doc.xml
* res/res_geolocation/geoloc_doc.xml
* res/res_stir_shaken/stir_shaken_doc.xml

(cherry picked from commit f6a193e87e)
2025-01-23 18:42:29 +00:00
George Joseph
b794dda76e docs: Add version information to manager event instance XML elements
* Do a git blame on the embedded XML managerEvent elements.

* From the commit hash, grab the summary line.

* Do a git log --grep <summary> to find the cherry-pick commits in all
  branches that match.

* Do a git patch-id to ensure the commits are all related and didn't get
  a false match on the summary.

* Do a git tag --contains <commit> to find the tags that contain each
  commit.

* Weed out all tags not ..0.

* Sort and discard any .0.0 and following tags where the commit
  appeared in an earlier branch.

* The result is a single tag for each branch where the application or function
  was defined.

The events defined in res/res_pjsip/pjsip_manager.xml were done by hand
because the XML was extracted from the C source file relatively recently.

Two bugs were fixed along the way...

* The get_documentation awk script was exiting after it processed the first
  DOCUMENTATION block it found in a file.  We have at least 1 source file
  with multiple DOCUMENTATION blocks so only the first one in them was being
  processed.  The awk script was changed to continue searching rather
  than exiting after the first block.

* Fixing the awk script revealed an issue in logger.c where the third
  DOCUMENTATION block contained a XML fragment that consisted only of
  a managerEventInstance element that wasn't wrapped in a managerEvent
  element.  Since logger_doc.xml already existed, the remaining fragments
  in logger.c were moved to it and properly organized.

(cherry picked from commit 936e88512e)
2025-01-23 18:42:29 +00:00
Joshua C. Colp
4667c33073 LICENSE: Update company name, email, and address.
(cherry picked from commit cf18bd6fd1)
2025-01-23 18:42:29 +00:00
Sean Bright
38fb02351c res_prometheus.c: Set Content-Type header on /metrics response.
This should resolve the Prometheus error:

> Error scraping target: non-compliant scrape target
  sending blank Content-Type and no
  fallback_scrape_protocol specified for target.

Resolves: #1075
(cherry picked from commit 2d958812ad)
2025-01-23 18:42:29 +00:00
George Joseph
7a9d014644 README.md, asterisk.c: Update Copyright Dates
(cherry picked from commit d52cd705d3)
2025-01-23 18:42:29 +00:00
George Joseph
3df8b857ea docs: Add version information to configObject and configOption XML elements
Most of the configObjects and configOptions that are implemented with
ACO or Sorcery now have `<since>/<version>` elements added.  There are
probably some that the script I used didn't catch.  The version tags were
determined by the following...
 * Do a git blame on the API call that created the object or option.
 * From the commit hash, grab the summary line.
 * Do a `git log --grep <summary>` to find the cherry-pick commits in all
   branches that match.
 * Do a `git patch-id` to ensure the commits are all related and didn't get
   a false match on the summary.
 * Do a `git tag --contains <commit>` to find the tags that contain each
   commit.
 * Weed out all tags not <major>.<minor>.0.
 * Sort and discard any <major>.0.0 and following tags where the commit
   appeared in an earlier branch.
 * The result is a single tag for each branch where the API was last touched.

configObjects and configOptions elements implemented with the base
ast_config APIs were just not possible to find due to the non-deterministic
way they are accessed.

Also note that if the API call was on modified after it was added, the
version will be the one it was last modified in.

Final note:  The configObject and configOption elements were introduced in
12.0.0 so options created before then may not have any XML documentation.

(cherry picked from commit 772221c82a)
2025-01-23 18:42:29 +00:00
George Joseph
791d8fbbc0 res_pjsip_authenticator_digest: Fix issue with missing auth and DONT_OPTIMIZE
The return code fom digest_check_auth wasn't explicitly being initialized.
The return code also wasn't explicitly set to CHALLENGE when challenges
were sent.  When optimization was turned off (DONT_OPTIMIZE), the compiler
was setting it to "0"(CHALLENGE) which worked fine.  However, with
optimization turned on, it was setting it to "1" (SUCCESS) so if there was
no incoming Authorization header, the function was returning SUCCESS to the
distributor allowing the request to incorrectly succeed.

The return code is now initialized correctly and is now explicitly set
to CHALLENGE when we send challenges.

(cherry picked from commit fb533fcc73)
2025-01-23 18:42:29 +00:00
Naveen Albert
9ffdda5936 ast_tls_cert: Add option to skip passphrase for CA private key.
Currently, the ast_tls_cert file is hardcoded to use the -des3 option
for 3DES encryption, and the script needs to be manually modified
to not require a passphrase. Add an option (-e) that disables
encryption of the CA private key so no passphrase is required.

Resolves: #1064
(cherry picked from commit eca4ec6b5e)
2025-01-23 18:42:29 +00:00
Naveen Albert
e352383dd8 chan_iax2: Avoid unnecessarily backlogging non-voice frames.
Currently, when receiving an unauthenticated call, we keep track
of the negotiated format in the chosenformat, which allows us
to later create the channel using the right format. However,
this was not done for authenticated calls. This meant that in
certain circumstances, if we had not yet received a voice frame
from the peer, only certain other types of frames (e.g. text),
there were no variables containing the appropriate frame.
This led to problems in the jitterbuffer callback where we
unnecessarily bailed out of retrieving a frame from the jitterbuffer.
This was logic intentionally added in commit 73103bdcd5
in response to an earlier regression, and while this prevents
crashes, it also backlogs legitimate frames unnecessarily.

The abort logic was initially added because at this point in the
code, we did not have the negotiated format available to us.
However, it should always be available to us as a last resort
in chosenformat, so we now pull it from there if needed. This
allows us to process frames the jitterbuffer even if voicefmt
and peerfmt aren't set and still avoid the crash. The failsafe
logic is retained, but now it shouldn't be triggered anymore.

Resolves: #1054
(cherry picked from commit 1b0cd8b10d)
2025-01-23 18:42:28 +00:00
Allan Nathanson
0fabaa5af4 config.c: fix #tryinclude being converted to #include on rewrite
Correct an issue in ast_config_text_file_save2() when updating configuration
files with "#tryinclude" statements. The API currently replaces "#tryinclude"
with "#include". The API also creates empty template files if the referenced
files do not exist. This change resolves these problems.

Resolves: https://github.com/asterisk/asterisk/issues/920
(cherry picked from commit 7e58e8d4f6)
2025-01-23 18:42:28 +00:00
Naveen Albert
bef2dd5ce6 sig_analog: Add Last Number Redial feature.
This adds the Last Number Redial feature to
simple switch.

UserNote: Users can now redial the last number
called if the lastnumredial setting is set to yes.

Resolves: #437
(cherry picked from commit abfa8206f3)
2025-01-23 18:42:28 +00:00
George Joseph
3a45e487cd docs: Various XML fixes
* channels/pjsip/dialplan_functions_doc.xml: Added xmlns:xi to docs element.

* main/bucket.c: Removed XML completely since the "bucket" and "file" objects
  are internal only with no config file.

* main/named_acl.c: Fixed the configFile element name. It was "named_acl.conf"
  and should have been "acl.conf"

* res/res_geolocation/geoloc_doc.xml: Added xmlns:xi to docs element.

* res/res_http_media_cache.c: Fixed the configFile element name. It was
  "http_media_cache.conf" and should have been "res_http_media_cache.conf".

(cherry picked from commit 15ed357747)
2025-01-23 18:42:28 +00:00
Sean Bright
8b736f2047 strings.c: Improve numeric detection in ast_strings_match().
Essentially, we were treating 1234x1234 and 1234x5678 as 'equal'
because we were able to convert the prefix of each of these strings to
the same number.

Resolves: #1028
(cherry picked from commit dafac1f6f4)
2025-01-23 18:42:28 +00:00
George Joseph
2b428734fd docs: Enable since/version handling for XML, CLI and ARI documentation
* Added the "since" element to the XML configObject and configOption elements
  in appdocsxml.dtd.

* Added the "Since" section to the following CLI output:
  ```
  config show help <module> <object>
  config show help <module> <object> <option>
  core show application <app>
  core show function <func>
  manager show command <command>
  manager show event <event>
  agi show commands topic <topic>
  ```

* Refactored the commands above to output their sections in the same order:
  Synopsis, Since, Description, Syntax, Arguments, SeeAlso

* Refactored the commands above so they all use the same pattern for writing
  the output to the CLI.

* Fixed several memory leaks caused by failure to free temporary output
  buffers.

* Added a "since" array to the mustache template for the top-level resources
  (Channel, Endpoint, etc.) and to the paths/methods underneath them. These
  will be added to the generated markdown if present.
  Example:
  ```
    "resourcePath": "/api-docs/channels.{format}",
    "requiresModules": [
        "res_stasis_answer",
        "res_stasis_playback",
        "res_stasis_recording",
        "res_stasis_snoop"
    ],
    "since": [
        "18.0.0",
        "21.0.0"
    ],
    "apis": [
        {
            "path": "/channels",
            "description": "Active channels",
            "operations": [
                {
                    "httpMethod": "GET",
                    "since": [
                        "18.6.0",
                        "21.8.0"
                    ],
                    "summary": "List all active channels in Asterisk.",
                    "nickname": "list",
                    "responseClass": "List[Channel]"
                },

  ```

NOTE:  No versioning information is actually added in this commit.
Those will be added separately and instructions for adding and maintaining
them will be published on the documentation site at a later date.

(cherry picked from commit 3c867e6e6c)
2025-01-23 18:42:28 +00:00
Artem Umerov
e35d341cd7 logger.h: Fix build when AST_DEVMODE is not defined.
Resolves: #1058
(cherry picked from commit 92d69897b7)
2025-01-23 18:42:28 +00:00
Sean Bright
2dd6a4aa66 dialplan_functions_doc.xml: Document PJSIP_MEDIA_OFFER's media argument.
Resolves: #1023
(cherry picked from commit 032235bd29)
2025-01-23 18:42:28 +00:00
Abdelkader Boudih
635f6fa564 samples: Use "asterisk" instead of "postgres" for username
(cherry picked from commit 4b6d40bd66)
2025-01-23 18:42:28 +00:00
Sean Bright
45f51341db manager: Add <since> tags for all AMI actions.
(cherry picked from commit 131682c2c5)
2025-01-23 18:42:28 +00:00
Steffen Arntz
63c86adbf5 logger.c fix: malformed JSON template
this typo was mentioned before, but never got fixed.
https://community.asterisk.org/t/logger-cannot-log-long-json-lines-properly/87618/6

(cherry picked from commit d31b79b2f8)
2025-01-23 18:42:28 +00:00
Sean Bright
076ec99c23 manager.c: Rename restrictedFile to is_restricted_file.
Also correct the spelling of 'privileges.'

(cherry picked from commit e4635e817f)
2025-01-23 18:42:28 +00:00
Abdelkader Boudih
1524cb6238 res_config_pgsql: normalize database connection option with cel and cdr by supporting new options name
(cherry picked from commit 7c40d82f02)
2025-01-23 18:42:28 +00:00
Stanislav Abramenkov
2df35736b0 res_pjproject: Fix typo (OpenmSSL->OpenSSL)
Fix typo (OpenmSSL->OpenSSL) mentioned by bkford in #972

(cherry picked from commit e95f97ad38)
2025-01-23 18:42:28 +00:00
George Joseph
d8f6ef063c Add SHA-256 and SHA-512-256 as authentication digest algorithms
* Refactored pjproject code to support the new algorithms and
added a patch file to third-party/pjproject/patches

* Added new parameters to the pjsip auth object:
  * password_digest = <algorithm>:<digest>
  * supported_algorithms_uac = List of algorithms to support
    when acting as a UAC.
  * supported_algorithms_uas = List of algorithms to support
    when acting as a UAS.
  See the auth object in pjsip.conf.sample for detailed info.

* Updated both res_pjsip_authenticator_digest.c (for UAS) and
res_pjsip_outbound_authentocator_digest.c (UAC) to suport the
new algorithms.

The new algorithms are only available with the bundled version
of pjproject, or an external version > 2.14.1.  OpenSSL version
1.1.1 or greater is required to support SHA-512-256.

Resolves: #948

UserNote: The SHA-256 and SHA-512-256 algorithms are now available
for authentication as both a UAS and a UAC.

(cherry picked from commit 7dc9d85f2b)
2025-01-23 18:42:28 +00:00
Allan Nathanson
139bdb25e4 config.c: retain leading whitespace before comments
Configurations loaded with the ast_config_load2() API and later written
out with ast_config_text_file_save2() will have any leading whitespace
stripped away.  The APIs should make reasonable efforts to maintain the
content and formatting of the configuration files.

This change retains any leading whitespace from comment lines that start
with a ";".

Resolves: https://github.com/asterisk/asterisk/issues/970
(cherry picked from commit 1cb741df4a)
2025-01-23 18:42:28 +00:00
Sean Bright
f680ce9d7b config.c: Fix off-nominal reference leak.
This was identified and fixed by @Allan-N in #918 but it is an
important fix in its own right.

The fix here is slightly different than Allan's in that we just move
the initialization of the problematic AO2 container to where it is
first used.

Fixes #1046

(cherry picked from commit 6b3dadfbe2)
2025-01-23 18:42:28 +00:00
Abdelkader Boudih
ce9c5415a8 normalize contrib/ast-db-manage/queue_log.ini.sample
(cherry picked from commit cc2b5ec88b)
2025-01-23 18:42:28 +00:00
George Joseph
4eae3395a7 Add C++ Standard detection to configure and fix a new C++20 compile issue
* The autoconf-archive package contains macros useful for detecting C++
  standard and testing other C++ capabilities but that package was never
  included in the install_prereq script so many existing build environments
  won't have it.  Even if it is installed, older versions won't newer C++
  standards and will actually cause an error if you try to test for that
  version. To make it available for those environments, the
  ax_cxx_compile_stdcxx.m4 macro has copied from the latest release of
  autoconf-archive into the autoconf directory.

* A convenience wrapper(ast_cxx_check_std) around ax_cxx_compile_stdcxx was
  also added so checking the standard version and setting the
  asterisk-specific PBX_ variables becomes a one-liner:
  `AST_CXX_CHECK_STD([std], [force_latest_std])`.
  Calling that with a version of `17` for instance, will set PBX_CXX17
  to 0 or 1 depending on whether the current c++ compiler supports stdc++17.
  HAVE_CXX17 will also be 'defined" or not depending on the result.

* C++ compilers hardly ever default to the latest standard they support.  g++
  version 14 for instance supports up to C++23 but only uses C++17 by default.
  If you want to use C++23, you have to add `-std=gnu++=23` to the g++
  command line.  If you set the second argument of AST_CXX_CHECK_STD to "yes",
  the macro will automatically keep the highest `-std=gnu++` value that
  worked and pass that to the Makefiles.

* The autoconf-archive package was added to install_prereq for future use.

* Updated configure.ac to use AST_CXX_CHECK_STD() to check for C++
  versions 11, 14, 17, 20 and 23.

* Updated configure.ac to accept the `--enable-latest-cxx-std` option which
  will set the second option to AST_CXX_CHECK_STD() to "yes".  The default
  is "no".

* ast_copy_string() in strings.h declares the 'sz' variable as volatile and
  does an `sz--` on it later.  C++20 no longer allows the `++` and `--`
  increment and decrement operators to be used on variables declared as
  volatile however so that was changed to `sz -= 1`.

(cherry picked from commit 79427c1ac1)
2025-01-23 18:42:28 +00:00
Naveen Albert
3fe5aafd03 chan_dahdi: Fix wrong channel state when RINGING recieved.
Previously, when AST_CONTROL_RINGING was received by
a DAHDI device, it would set its channel state to
AST_STATE_RINGING. However, an analysis of the codebase
and other channel drivers reveals RINGING corresponds to
physical power ringing, whereas AST_STATE_RING should be
used for audible ringback on the channel. This also ensures
the correct device state is returned by the channel state
to device state conversion.

Since there seems to be confusion in various places regarding
AST_STATE_RING vs. AST_STATE_RINGING, some documentation has
been added or corrected to clarify the actual purposes of these
two channel states, and the associated device state mapping.

An edge case that prompted this fix, but isn't explicitly
addressed here, is that of an incoming call to an FXO port.
The channel state will be "Ring", which maps to a device state
of "In Use", not "Ringing" as would be more intuitive. However,
this is semantic, since technically, Asterisk is treating this
the same as any other incoming call, and so "Ring" is the
semantic state (put another way, Asterisk isn't ringing anything,
like in the cases where channels are in the "Ringing" state).

Since FXO ports don't currently support Call Waiting, a suitable
workaround for the above would be to ignore the device state and
instead check the channel state (e.g. IMPORT(DAHDI/1-1,CHANNEL(state)))
since it will be Ring if the FXO port is idle (but a call is ringing
on it) and Up if the FXO port is actually in use. (In both cases,
the device state would misleadingly be "In Use".)

Resolves: #1029
(cherry picked from commit afd15274e7)
2025-01-23 18:42:28 +00:00
Stanislav Abramenkov
af0661ffb3 Upgrade bundled pjproject to 2.15.1
Resolves: asterisk#1016

UserNote: Bundled pjproject has been upgraded to 2.15.1. For more
information visit pjproject Github page: https://github.com/pjsip/pjproject/releases/tag/2.15.1

(cherry picked from commit 2e8d8c4a08)
2025-01-23 18:42:28 +00:00
George Joseph
82d498b5c3 .github: Set exit 0 in CherryPick and Recheck workflow Cleanup steps
(cherry picked from commit 5beb61317a)
2025-01-23 18:42:28 +00:00
George Joseph
463d4b8d04 gcc14: Fix issues caught by gcc 14
* test_message.c: Fix segfaults caused by passing NULL as an sprintf fmt.

(cherry picked from commit 6fa7c40b57)
2025-01-23 18:42:28 +00:00
George Joseph
36628ff34f Header fixes for compiling C++ source files
A few tweaks needed to be done to some existing header files to allow them to
be compiled when included from C++ source files.

logger.h had declarations for ast_register_verbose() and
ast_unregister_verbose() which caused C++ issues but those functions were
actually removed from logger.c many years ago so the declarations were just
removed from logger.h.

(cherry picked from commit e677ec8473)
2025-01-23 18:42:28 +00:00
George Joseph
bf0a6aaf3b Add ability to pass arguments to unit tests from the CLI
Unit tests can now be passed custom arguments from the command
line.  For example, the following command would run the "mytest" test
in the "/main/mycat" category with the option "myoption=54"

`CLI> test execute category /main/mycat name mytest options myoption=54`

You can also pass options to an entire category...

`CLI> test execute category /main/mycat options myoption=54`

Basically, everything after the "options" keyword is passed verbatim to
the test which must decide what to do with it.

* A new API ast_test_get_cli_args() was created to give the tests access to
the cli_args->argc and cli_args->argv elements.

* Although not needed for the option processing, a new macro
ast_test_validate_cleanup_custom() was added to test.h that allows you
to specify a custom error message instead of just "Condition failed".

* The test_skel.c was updated to demonstrate parsing options and the use
of the ast_test_validate_cleanup_custom() macro.

(cherry picked from commit 2fa9dcd51c)
2025-01-23 18:42:28 +00:00
Kent
0fbb6de6f4 res_pjsip: Add new AOR option "qualify_2xx_only"
Added a new option "qualify_2xx_only" to the res_pjsip AOR qualify
feature to mark a contact as available only if an OPTIONS request
returns a 2XX response. If the option is not specified or is false,
any response to the OPTIONS request marks the contact as available.

UserNote: The pjsip.conf AOR section now has a "qualify_2xx_only"
option that can be set so that only 2XX responses to OPTIONS requests
used to qualify a contact will mark the contact as available.

(cherry picked from commit 21dba60ff2)
2025-01-23 18:42:28 +00:00
George Joseph
68359a3f96 .github: Change the run name for OnPRStateChangedPriv
(cherry picked from commit 865c8b8232)
2025-01-23 18:42:28 +00:00
Jaco Kroon
20cf8b3a07 res_odbc: release threads from potential starvation.
Whenever a slot is freed up due to a failed connection, wake up a waiter
before failing.

In the case of a dead connection there could be waiters, for example,
let's say two threads tries to acquire objects at the same time, with
one in the cached connections, one will acquire the dead connection, and
the other will enter into the wait state.  The thread with the dead
connection will clear up the dead connection, and then attempt a
re-acquire (at this point there cannot be cached connections else the
other thread would have received that and tried to clean up), as such,
at this point we're guaranteed that either there are no waiting threads,
or that the maxconnections - connection_cnt threads will attempt to
re-acquire connections, and then either succeed, using those
connections, or failing, and then signalling to release more waiters.

Also fix the pointer log for ODBC handle %p dead which would always
reflect NULL.

Signed-off-by: Jaco Kroon <jaco@uls.co.za>
(cherry picked from commit 9b45103bc8)
2025-01-23 18:42:28 +00:00
Sperl Viktor
02bba40fca app_queue: indicate the paused state of a dynamically added member in queue_log.
Fixes: #1021
(cherry picked from commit d832aae1d7)
2025-01-23 18:42:28 +00:00
George Joseph
0a5a6995af Allow C++ source files (as extension .cc) in the main directory
Although C++ files (as extension .cc) have been handled in the module
directories for many years, the main directory was missing one line in its
Makefile that prevented C++ files from being recognised there.

(cherry picked from commit 9a1180c6af)
2025-01-23 18:42:28 +00:00
Alexey Khabulyak
b26b73790f format_gsm.c: Added mime type
Sometimes it's impossible to get a file extension from URL
(eg. http://example.com/gsm/your) so we have to rely on content-type header.
Currenly, asterisk does not support content-type for gsm format(unlike wav).
Added audio/gsm according to https://www.rfc-editor.org/rfc/rfc4856.html

(cherry picked from commit ced3b41327)
2025-01-23 18:42:28 +00:00
Maksim Nesterov
186e9b5bb8 func_uuid: Add a new dialplan function to generate UUIDs
This function is useful for uniquely identifying calls, recordings, and other entities in distributed environments, as well as for generating an argument for the AudioSocket application.

(cherry picked from commit c50dea93a5)
2025-01-23 18:42:28 +00:00
Sperl Viktor
94a32885e7 app_queue: allow dynamically adding a queue member in paused state.
Fixes: #1007

UserNote: use the p option of AddQueueMember() for paused member state.
Optionally, use the r(reason) option to specify a custom reason for the pause.

(cherry picked from commit 7b7df5d30e)
2025-01-23 18:42:28 +00:00
Naveen Albert
6f592e7163 chan_iax2: Add log message for rejected calls.
Add a log message for a path that currently silently drops IAX2
frames without indicating that anything is wrong.

(cherry picked from commit be2bea854e)
2025-01-23 18:42:28 +00:00
Maximilian Fridrich
0bd4d3320a chan_pjsip: Send VIDUPDATE RTP frame for all H.264 streams
Currently, when a chan_pjsip channel receives a VIDUPDATE indication,
an RTP VIDUPDATE frame is only queued on a H.264 stream if WebRTC is
enabled on that endpoint. This restriction does not really make sense.

Now, a VIDUPDATE RTP frame is written even if WebRTC is not enabled (as
is the case with VP8, VP9, and H.265 streams).

Resolves: #1013
(cherry picked from commit 45c5d39c58)
2025-01-23 18:42:28 +00:00
Tinet-mucw
1a71ea7456 audiohook.c: resolving the issue with audiohook both reading when packet loss on one side of the call
When there is 0% packet loss on one side of the call and 15% packet loss on the other side, reading frame is often failed when reading direction_both audiohook. when read_factory available = 0, write_factory available = 320; i think write factory is usable read; because after reading one frame, there is still another frame that can be read together with the next read factory frame.

Resolves: #851
(cherry picked from commit 3ac5f82d49)
2025-01-23 18:42:28 +00:00
Mike Pultz
a8d81692dd res_curl.conf.sample: clean up sample configuration and add new SSL options
This update properly documents all the current configuration options supported
by the curl implementation, including the new ssl_* options.

(cherry picked from commit 424e4ee761)
2025-01-23 18:42:28 +00:00
Viktor Litvinov
ada5a706b7 res_rtp_asterisk.c: Set Mark on rtp when timestamp skew is too big
Set Mark bit in rtp stream when timestamp skew is bigger than MAX_TIMESTAMP_SKEW.

Fixes: #927
(cherry picked from commit 2599aa3be0)
2025-01-23 18:42:28 +00:00
Alexey Vasilyev
7d681cbd90 res_rtp_asterisk.c: Fix bridged_payload matching with sample rate for DTMF
Fixes #1004

(cherry picked from commit e96d1cf2ae)
2025-01-23 18:42:28 +00:00
Mike Pultz
2d4460ad4d manager.c: Add Processed Call Count to CoreStatus output
This update adds the processed call count to the CoreStatus AMI Action responsie. This output is
similar to the values returned by "core show channels" or "core show calls" in the CLI.

UserNote: The current processed call count is now returned as CoreProcessedCalls from the
CoreStatus AMI Action.

(cherry picked from commit 0c193b725b)
2025-01-23 18:42:28 +00:00
Mike Pultz
6b194cbbe3 func_curl.c: Add additional CURL options for SSL requests
This patch adds additional CURL TLS options / options to support mTLS authenticated requests:

* ssl_verifyhost - perform a host verification on the peer certificate (CURLOPT_SSL_VERIFYHOST)
* ssl_cainfo - define a CA certificate file (CURLOPT_CAINFO)
* ssl_capath - define a CA certificate directory (CURLOPT_CAPATH)
* ssl_cert - define a client certificate for the request (CURLOPT_SSLCERT)
* ssl_certtype - specify the client certificate type (CURLOPT_SSLCERTTYPE)
* ssl_key - define a client private key for the request (CURLOPT_SSLKEY)
* ssl_keytype - specify the client private key type (CURLOPT_SSLKEYTYPE)
* ssl_keypasswd - set a password for the private key, if required (CURLOPT_KEYPASSWD)

UserNote: The following new configuration options are now available
in the res_curl.conf file, and the CURL() function: 'ssl_verifyhost'
(CURLOPT_SSL_VERIFYHOST), 'ssl_cainfo' (CURLOPT_CAINFO), 'ssl_capath'
(CURLOPT_CAPATH), 'ssl_cert' (CURLOPT_SSLCERT), 'ssl_certtype'
(CURLOPT_SSLCERTTYPE), 'ssl_key' (CURLOPT_SSLKEY), 'ssl_keytype',
(CURLOPT_SSLKEYTYPE) and 'ssl_keypasswd' (CURLOPT_KEYPASSWD). See the
libcurl documentation for more details.

(cherry picked from commit 8e289af9de)
2025-01-23 18:42:28 +00:00
Naveen Albert
42629c695d sig_analog: Fix regression with FGD and E911 signaling.
Commit 466eb4a52b introduced a regression
which completely broke Feature Group D and E911 signaling, by removing
the call to analog_my_getsigstr, which affected multiple switch cases.
Restore the original behavior for all protocols except Feature Group C
CAMA (MF), which is all that patch was attempting to target.

Resolves: #993
(cherry picked from commit 4f0a506c67)
2025-01-23 18:42:28 +00:00
James Terhune
fc390cf785 main/stasis_channels.c: Fix crash when setting a global variable with invalid UTF8 characters
Add check for null value of chan before referencing it with ast_channel_name()

Resolves: #999
(cherry picked from commit d6b7554012)
2025-01-23 18:42:28 +00:00
George Joseph
7a640ca8a8 res_stir_shaken: Allow sending Identity headers for unknown TNs
Added a new option "unknown_tn_attest_level" to allow Identity
headers to be sent when a callerid TN isn't explicitly configured
in stir_shaken.conf.  Since there's no TN object, a private_key_file
and public_cert_url must be configured in the attestation or profile
objects.

Since "unknown_tn_attest_level" uses the same enum as attest_level,
some of the sorcery macros had to be refactored to allow sharing
the enum and to/from string conversion functions.

Also fixed a memory leak in crypto_utils:pem_file_cb().

Resolves: #921

UserNote: You can now set the "unknown_tn_attest_level" option
in the attestation and/or profile objects in stir_shaken.conf to
enable sending Identity headers for callerid TNs not explicitly
configured.

(cherry picked from commit e9f336b47b)
2025-01-23 18:42:28 +00:00
Asterisk Development Team
8d1be28001 Update for 22.1.1 2025-01-09 19:39:23 +00:00
Ben Ford
4d80d7ab22 manager.c: Restrict ListCategories to the configuration directory.
When using the ListCategories AMI action, it was possible to traverse
upwards through the directories to files outside of the configured
configuration directory. This action is now restricted to the configured
directory and an error will now be returned if the specified file is
outside of this limitation.

Resolves: #GHSA-33x6-fj46-6rfh

UserNote: The ListCategories AMI action now restricts files to the
configured configuration directory.
2025-01-09 13:14:11 -06:00
Asterisk Development Team
a66c9decfe Update for 22.1.0 2024-11-21 17:18:07 +00:00
George Joseph
95e3e202cc res_pjsip: Change suppress_moh_on_sendonly to OPT_BOOL_T
The suppress_moh_on_sendonly endpoint option should have been
defined as OPT_BOOL_T in pjsip_configuration.c and AST_BOOL_VALUES
in the alembic script instead of OPT_YESNO_T and YESNO_VALUES.

Also updated contrib/ast-db-manage/README.md to indicate that
AST_BOOL_VALUES should always be used and provided an example.

Resolves: #995
2024-11-19 12:56:16 -07:00
Asterisk Development Team
65d531c8e9 Update for 22.1.0-rc1 2024-11-14 20:02:07 +00:00
George Joseph
badaf0e383 res_pjsip: Add new endpoint option "suppress_moh_on_sendonly"
Normally, when one party in a call sends Asterisk an SDP with
a "sendonly" or "inactive" attribute it means "hold" and causes
Asterisk to start playing MOH back to the other party. This can be
problematic if it happens at certain times, such as in a 183
Progress message, because the MOH will replace any early media you
may be playing to the calling party. If you set this option
to "yes" on an endpoint and the endpoint receives an SDP
with "sendonly" or "inactive", Asterisk will NOT play MOH back to
the other party.

Resolves: #979

UserNote: The new "suppress_moh_on_sendonly" endpoint option
can be used to prevent playing MOH back to a caller if the remote
end sends "sendonly" or "inactive" (hold) to Asterisk in an SDP.

(cherry picked from commit 03ab004e26)
2024-11-14 20:02:03 +00:00
Sean Bright
94fcb3174b res_pjsip.c: Fix Contact header rendering for IPv6 addresses.
Fix suggested by @nvsystems.

Fixes #985

(cherry picked from commit 1c0fcd583d)
2024-11-14 20:02:03 +00:00
chrsmj
6d98127a75 samples: remove and/or change some wiki mentions
Cleaned some dead links. Replaced word wiki with
either docs or link to https://docs.asterisk.org/

Resolves: #974
(cherry picked from commit c037fc7fae)
2024-11-14 20:02:03 +00:00
George Joseph
057de6ab66 func_pjsip_aor/contact: Fix documentation for contact ID
Clarified the use of the contact ID returned from PJSIP_AOR.

Resolves: #990
(cherry picked from commit aa736dac12)
2024-11-14 20:02:03 +00:00
George Joseph
2a48183169 res_pjsip: Move tenantid to end of ast_sip_endpoint
The tenantid field was originally added to the ast_sip_endpoint
structure at the end of the AST_DECLARE_STRING_FIELDS block.  This
caused everything after it in the structure to move down in memory
and break ABI compatibility.  It's now at the end of the structure
as an AST_STRING_FIELD_EXTENDED.  Given the number of string fields
in the structure now, the initial string field allocation was
also increased from 64 to 128 bytes.

Resolves: #982
(cherry picked from commit 144033db31)
2024-11-14 20:02:03 +00:00
Thomas Guebels
6795ded3f4 pjsip_transport_events: handle multiple addresses for a domain
The key used for transport monitors was the remote host name for the
transport and not the remote address resolved for this domain.

This was problematic for domains returning multiple addresses as several
transport monitors were created with the same key.

Whenever a subsystem wanted to register a callback it would always end
up attached to the first transport monitor with a matching key.

The key used for transport monitors is now the remote address and port
the transport actually connected to.

Fixes: #932
(cherry picked from commit 184a30efac)
2024-11-14 20:02:03 +00:00
Naveen Albert
07166788fd func_evalexten: Add EVAL_SUB function.
This adds an EVAL_SUB function, which is similar to the existing
EVAL_EXTEN function but significantly more powerful, as it allows
executing arbitrary dialplan and capturing its return value as
the function's output. While EVAL_EXTEN should be preferred if it
is possible to use it, EVAL_SUB can be used in a wider variety
of cases and allows arbitrary computation to be performed in
a dialplan function call, leveraging the dialplan.

Resolves: #951
(cherry picked from commit 34662cf0ea)
2024-11-14 20:02:03 +00:00
George Joseph
0e5c832703 res_srtp: Change Unsupported crypto suite msg from verbose to debug
There's really no point in spamming logs with a verbose message
for every unsupported crypto suite an older client may send
in an SDP.  If none are supported, there will be an error or
warning.

(cherry picked from commit 2717068e1b)
2024-11-14 20:02:03 +00:00
Ben Ford
e6822d7647 Add res_pjsip_config_sangoma external module.
Adds res_pjsip_config_sangoma as an external module that can be
downloaded via menuselect. It lives under the Resource Modules section.

(cherry picked from commit 9f1f3703c9)
2024-11-14 20:02:03 +00:00
Ben Ford
f9278c1790 app_mixmonitor: Add 'D' option for dual-channel audio.
Adds the 'D' option to app_mixmonitor that interleaves the input and
output frames of the channel being recorded in the monitor output frame.
This allows for two streams in the recording: the transmitted audio and
the received audio. The 't' and 'r' options are compatible with this.

Fixes: #945

UserNote: The MixMonitor application now has a new 'D' option which
interleaves the recorded audio in the output frames. This allows for
stereo recording output with one channel being the transmitted audio and
the other being the received audio. The 't' and 't' options are
compatible with this.

(cherry picked from commit 4616408b09)
2024-11-14 20:02:03 +00:00
Thomas Guebels
db312ab0ef pjsip_transport_events: Avoid monitor destruction
When a transport is disconnected, several events can arrive following
each other. The first event will be PJSIP_TP_STATE_DISCONNECT and it
will trigger the destruction of the transport monitor object. The lookup
for the transport monitor to destroy is done using the transport key,
that contains the transport destination host:port.

A reconnect attempt by pjsip will be triggered as soon something needs to
send a packet using that transport. This can happen directly after a
disconnect since ca

Subsequent events can arrive later like PJSIP_TP_STATE_DESTROY and will
also try to trigger the destruction of the transport monitor if not
already done. Since the lookup for the transport monitor to destroy is
done using the transport key, it can match newly created transports
towards the same destination and destroy their monitor object.

Because of this, it was sometimes not possible to monitor a transport
after one or more disconnections.

This fix adds an additional check on the transport pointer to ensure
only a monitor for that specific transport is removed.

Fixes: #923
(cherry picked from commit 008ad8098a)
2024-11-14 20:02:03 +00:00
George Joseph
f93b97ac79 .github: Redirect NightlyAdmin to AsteriskNightlyAdmin
(cherry picked from commit 32193addcc)
2024-11-14 20:02:03 +00:00
Naveen Albert
33e8398e2b app_dial: Fix progress timeout calculation with no answer timeout.
If to_answer is -1, simply comparing to see if the progress timeout
is smaller than the answer timeout to prefer it will fail. Add
an additional check that chooses the progress timeout if there is
no answer timeout (or as before, if the progress timeout is smaller).

Resolves: #821
(cherry picked from commit 4dd6074f9f)
2024-11-14 20:02:03 +00:00
George Joseph
0f3d8f21c8 pjproject_bundled: Tweaks to support out-of-tree development
* pjproject is now configured with --disable-libsrtp so it will
  build correctly when doing "out-of-tree" development.  Asterisk
  doesn't use pjproject for handling media so pjproject doesn't
  need libsrtp itself.

* The pjsua app (which we used to use for the testsuite) no longer
  builds in pjproject's master branch so we just skip it.  The
  testsuite no longer needs it anyway.

See third-party/pjproject/README-hacking.md for more info on building
pjproject "out-of-tree".

(cherry picked from commit 142bdeff5b)
2024-11-14 20:02:03 +00:00
Sean Bright
76d1ef4d2f Revert "res_rtp_asterisk: Count a roll-over of the sequence number even on lost packets."
This reverts commit cb5e3445be.

The original change from 16 to 15 bit sequence numbers was predicated
on the following from the now-defunct libSRTP FAQ on sourceforge.net:

> *Q6. The use of implicit synchronization via ROC seems
> dangerous. Can senders and receivers lose ROC synchronization?*
>
> **A.** It is possible to lose ROC synchronization between sender and
> receiver(s), though it is not likely in practice, and practical
> steps can be taken to avoid it. A burst loss of 2^16 packets or more
> will always break synchronization. For example, a conversational
> voice codec that sends 50 packets per second will have its ROC
> increment about every 22 minutes. A network with a burst of packet
> loss that long has problems other than ROC synchronization.
>
> There is a higher sensitivity to loss at the very outset of an SRTP
> stream. If the sender's initial sequence number is close to the
> maximum value of 2^16-1, and all packets are lost from the initial
> packet until the sequence number cycles back to zero, the sender
> will increment its ROC, but the receiver will not. The receiver
> cannot determine that the initial packets were lost and that
> sequence-number rollover has occurred. In this case, the receiver's
> ROC would be zero whereas the sender's ROC would be one, while their
> sequence numbers would be so close that the ROC-guessing algorithm
> could not detect this fact.
>
> There is a simple solution to this problem: the SRTP sender should
> randomly select an initial sequence number that is always less than
> 2^15. This ensures correct SRTP operation so long as fewer than 2^15
> initial packets are lost in succession, which is within the maximum
> tolerance of SRTP packet-index determination (see Appendix A and
> page 14, first paragraph of RFC 3711). An SRTP receiver should
> carefully implement the index-guessing algorithm. A naive
> implementation can unintentionally guess the value of
> 0xffffffffffffLL whenever the SEQ in the packet is greater than 2^15
> and the locally stored SEQ and ROC are zero. (This can happen when
> the implementation fails to treat those zero values as a special
> case.)
>
> When ROC synchronization is lost, the receiver will not be able to
> properly process the packets. If anti-replay protection is turned
> on, then the desynchronization will appear as a burst of replay
> check failures. Otherwise, if authentication is being checked, then
> it will appear as a burst of authentication failures. Otherwise, if
> encryption is being used, the desynchronization may not be detected
> by the SRTP layer, and the packets may be improperly decrypted.

However, modern libSRTP (as of 1.0.1[1]) now mentions the following in
their README.md[2]:

> The sequence number in the rtp packet is used as the low 16 bits of
> the sender's local packet index. Note that RTP will start its
> sequence number in a random place, and the SRTP layer just jumps
> forward to that number at its first invocation. An earlier version
> of this library used initial sequence numbers that are less than
> 32,768; this trick is no longer required as the
> rdbx_estimate_index(...) function has been made smarter.

So truncating our initial sequence number to 15 bit is no longer
necessary.

1. 0eb007f0dc/CHANGES (L271-L289)
2. 2de20dd9e9/README.md (implementation-notes)

(cherry picked from commit a39384721d)
2024-11-14 20:02:03 +00:00
George Joseph
2f8d008103 core_unreal.c: Fix memory leak in ast_unreal_new_channels()
When the channel tech is multistream capable, the reference to
chan_topology was passed to the new channel.  When the channel tech
isn't multistream capable, the reference to chan_topology was never
released.  "Local" channels are multistream capable so it didn't
affect them but the confbridge "CBAnn" and the bridge_media
"Recorder" channels are not so they caused a leak every time one
of them was created.

Also added tracing to ast_stream_topology_alloc() and
stream_topology_destroy() to assist with debugging.

Resolves: #938
(cherry picked from commit 41162f963b)
2024-11-14 20:02:03 +00:00
Allan Nathanson
039baa0317 dnsmgr.c: dnsmgr_refresh() incorrectly flags change with DNS round-robin
The dnsmgr_refresh() function checks to see if the IP address associated
with a name/service has changed. The gotcha is that the ast_get_ip_or_srv()
function only returns the first IP address returned by the DNS query. If
there are multiple IPs associated with the name and the returned order is
not consistent (e.g. with DNS round-robin) then the other IP addresses are
not included in the comparison and the entry is flagged as changed even
though the IP is still valid.

Updated the code to check all IP addresses and flag a change only if the
original IP is no longer valid.

Resolves: #924
(cherry picked from commit 338e191539)
2024-11-14 20:02:03 +00:00
George Joseph
2425d2218c geolocation.sample.conf: Fix comment marker at end of file
Resolves: #937
(cherry picked from commit d92af8acaf)
2024-11-14 20:02:03 +00:00
Sean Bright
166a309549 func_base64.c: Ensure we set aside enough room for base64 encoded data.
Reported by SingularTricycle on IRC.

Fixes #940

(cherry picked from commit 349db1de3d)
2024-11-14 20:02:03 +00:00
Naveen Albert
556b974d1b app_dial: Fix progress timeout.
Under some circumstances, the progress timeout feature added in commit
320c98eec8 does not work as expected,
such as if there is no media flowing. Adjust the waitfor call to
explicitly use the progress timeout if it would be reached sooner than
the answer timeout to ensure we handle the timers properly.

Resolves: #821
(cherry picked from commit 54f45c6b86)
2024-11-14 20:02:03 +00:00
Naveen Albert
43166eb85b chan_dahdi: Never send MWI while off-hook.
In some circumstances, it is possible for the do_monitor thread to
erroneously think that a line is on-hook and send an MWI FSK spill
to it when the line is really off-hook and no MWI should be sent.
Commit 0a8b3d3467 previously fixed this
issue in a more readily encountered scenario, but it has still been
possible for MWI to be sent when it shouldn't be. To robustly fix
this issue, query DAHDI for the hook status to ensure we don't send
MWI on a line that is actually still off hook.

Resolves: #928
(cherry picked from commit 4635a5ff4d)
2024-11-14 20:02:03 +00:00
George Joseph
04b882397f manager.c: Add unit test for Originate app and appdata permissions
This unit test checks that dialplan apps and app data specified
as parameters for the Originate action are allowed with the
permissions the user has.

(cherry picked from commit 9ecccb21ed)
2024-11-14 20:02:03 +00:00
Sean Bright
0bba91a49d alembic: Drop redundant voicemail_messages index.
The `voicemail_messages_dir` index is a left prefix of the table's
primary key and therefore unnecessary.

(cherry picked from commit 0bdfebd1b7)
2024-11-14 20:02:03 +00:00
Sean Bright
682ad186fb res_agi.c: Ensure SIGCHLD handler functions are properly balanced.
Calls to `ast_replace_sigchld()` and `ast_unreplace_sigchld()` must be
balanced to ensure that we can capture the exit status of child
processes when we need to. This extends to functions that call
`ast_replace_sigchld()` and `ast_unreplace_sigchld()` such as
`ast_safe_fork()` and `ast_safe_fork_cleanup()`.

The primary change here is ensuring that we do not call
`ast_safe_fork_cleanup()` in `res_agi.c` if we have not previously
called `ast_safe_fork()`.

Additionally we reinforce some of the documentation and add an
assertion to, ideally, catch this sooner were this to happen again.

Fixes #922

(cherry picked from commit e1f2866bb6)
2024-11-14 20:02:03 +00:00
Naveen Albert
ab79321a29 main, res, tests: Fix compilation errors on FreeBSD.
asterisk.c, manager.c: Increase buffer sizes to avoid truncation warnings.
config.c: Include header file for WIFEXITED/WEXITSTATUS macros.
res_timing_kqueue: Use more portable format specifier.
test_crypto: Use non-linux limits.h header file.

Resolves: #916
(cherry picked from commit b939d840db)
2024-11-14 20:02:03 +00:00
George Joseph
cbbd2a6b47 res_rtp_asterisk: Fix dtls timer issues causing FRACKs and SEGVs
In dtls_srtp_handle_timeout(), when DTLSv1_get_timeout() returned
success but with a timeout of 0, we were stopping the timer and
decrementing the refcount on instance but not resetting the
timeout_timer to -1.  When dtls_srtp_stop_timeout_timer()
was later called, it was atempting to stop a stale timer and could
decrement the refcount on instance again which would then cause
the instance destructor to run early.  This would result in either
a FRACK or a SEGV when ast_rtp_stop(0 was called.

According to the OpenSSL docs, we shouldn't have been stopping the
timer when DTLSv1_get_timeout() returned success and the new timeout
was 0 anyway.  We should have been calling DTLSv1_handle_timeout()
again immediately so we now reschedule the timer callback for
1ms (almost immediately).

Additionally, instead of scheduling the timer callback at a fixed
interval returned by the initial call to DTLSv1_get_timeout()
(usually 999 ms), we now reschedule the next callback based on
the last call to DTLSv1_get_timeout().

Resolves: #487
(cherry picked from commit fe5bea34ab)
2024-11-14 20:02:03 +00:00
Ben Ford
c7beb10006 manager.c: Restrict ModuleLoad to the configured modules directory.
When using the ModuleLoad AMI action, it was possible to traverse
upwards through the directories to files outside of the configured
modules directory. We decided it would be best to restrict access to
modules exclusively in the configured directory. You will now get an
error when the specified module is outside of this limitation.

Fixes: #897

UserNote: The ModuleLoad AMI action now restricts modules to the
configured modules directory.

(cherry picked from commit ee9a0f056e)
2024-11-14 20:02:03 +00:00
jiangxc
af05288825 res_agi.c: Prevent possible double free during SPEECH RECOGNIZE
When using the speech recognition module, crashes can occur
sporadically due to a "double free or corruption (out)" error. Now, in
the section where the audio stream is being captured in a loop, each
time after releasing fr, it is set to NULL to prevent repeated
deallocation.

Fixes #772

(cherry picked from commit f6d1dfd999)
2024-11-14 20:02:03 +00:00
Sean Bright
65fadcbc09 cdr_custom: Allow absolute filenames.
A follow up to #893 that brings the same functionality to
cdr_custom. Also update the sample configuration files to note support
for absolute paths.

(cherry picked from commit 2618a4f1e5)
2024-11-14 20:02:03 +00:00
Naveen Albert
1372eeba51 astfd.c: Avoid calling fclose with NULL argument.
Don't pass through a NULL argument to fclose, which is undefined
behavior, and instead return -1 and set errno appropriately. This
also avoids a compiler warning with glibc 2.38 and newer, as glibc
commit 71d9e0fe766a3c22a730995b9d024960970670af
added the nonnull attribute to this argument.

Resolves: #900
(cherry picked from commit 2c583be963)
2024-11-14 20:02:03 +00:00
Peter Jannesen
2f44ac22b2 channel: Preserve CHANNEL(userfield) on masquerade.
In certain circumstances a channel may undergo an operation
referred to as a masquerade. If this occurs the CHANNEL(userfield)
value was not preserved causing it to get lost. This change makes
it so that this field is now preserved.

Fixes: #882
(cherry picked from commit fd196e9113)
2024-11-14 20:02:03 +00:00
Peter Jannesen
d9e01cf0a1 cel_custom: Allow absolute filenames.
If a filename starts with a '/' in cel_custom [mappings] assume it is
a absolute file path and not relative filename/path to
AST_LOG_DIR/cel_custom/

(cherry picked from commit b7c4be9d5b)
2024-11-14 20:02:03 +00:00
Naveen Albert
e0edea0383 app_voicemail: Fix ill-formatted pager emails with custom subject.
Add missing end-of-headers newline to pager emails with custom
subjects, since this was missing from this code path.

Resolves: #902
(cherry picked from commit e63da10a17)
2024-11-14 20:02:03 +00:00
Sean Bright
4ade5a21b7 res_pjsip_pubsub: Persist subscription 'generator_data' in sorcery
Fixes #895

(cherry picked from commit dad84444fc)
2024-11-14 20:02:03 +00:00
George Joseph
6dc00f642a Fix application references to Background
The app is actually named "BackGround" but several references
in XML documentation were spelled "Background" with the lower
case "g".  This was causing documentation links to return
"not found" messages.

(cherry picked from commit f71668f0b9)
2024-11-14 20:02:03 +00:00
George Joseph
82a229166a manager.conf.sample: Fix mathcing typo
(cherry picked from commit adaacc281d)
2024-11-14 20:02:03 +00:00
George Joseph
56d3070939 manager: Enhance event filtering for performance
UserNote: You can now perform more granular filtering on events
in manager.conf using expressions like
`eventfilter(name(Newchannel),header(Channel),method(starts_with)) = PJSIP/`
This is much more efficient than
`eventfilter = Event: Newchannel.*Channel: PJSIP/`
Full syntax guide is in configs/samples/manager.conf.sample.

(cherry picked from commit b8d16fd800)
2024-11-14 20:02:03 +00:00
George Joseph
2ca93f0cdc manager.c: Split XML documentation to manager_doc.xml
(cherry picked from commit dd643bf827)
2024-11-14 20:02:03 +00:00
George Joseph
03883ccb8e .github: Fix realtime param on Weekly and Nightly tests and...
Rename the "Cleanup" job in the cherry-pick and recheck jobs
to "Summary".

(cherry picked from commit 0c5a114b9f)
2024-11-14 20:02:03 +00:00
George Joseph
5e9ea95517 .github: Add WeeklyTests and make Nightlies Monday-Saturday
...and add "realtime" option.

(cherry picked from commit d17bf1af1a)
2024-11-14 20:02:03 +00:00
George Joseph
6297462fd2 db.c: Remove limit on family/key length
Consumers like media_cache have been running into issues with
the previous astdb "/family/key" limit of 253 bytes when needing
to store things like long URIs.  An Amazon S3 URI is a good example
of this.  Now, instead of using a static 256 byte buffer for
"/family/key", we use ast_asprintf() to dynamically create it.

Both test_db.c and test_media_cache.c were also updated to use
keys/URIs over the old 253 character limit.

Resolves: #881

UserNote: The `ast_db_*()` APIs have had the 253 byte limit on
"/family/key" removed and will now accept families and keys with a
total length of up to SQLITE_MAX_LENGTH (currently 1e9!).  This
affects the `DB*` dialplan applications, dialplan functions,
manager actions and `databse` CLI commands.  Since the
media_cache also uses the `ast_db_*()` APIs, you can now store
resources with URIs longer than 253 bytes.

(cherry picked from commit ff7d094803)
2024-11-14 20:02:03 +00:00
George Joseph
7788fac511 .github: Changes required to use cached builds and shorten names
(cherry picked from commit 6c0fa2274b)
2024-11-14 20:02:03 +00:00
Asterisk Development Team
8e4a09f711 Update for 22.0.0 2024-10-17 15:52:14 +00:00
Asterisk Development Team
4473ed5256 Update for 22.0.0-rc2 2024-09-26 16:22:15 +00:00
George Joseph
fd8d28cb60 stir_shaken: Fix propagation of attest_level and a few other values
attest_level, send_mky and check_tn_cert_public_url weren't
propagating correctly from the attestation object to the profile
and tn.

* In the case of attest_level, the enum needed to be changed
so the "0" value (the default) was "NOT_SET" instead of "A".  This
now allows the merging of the attestation object, profile and tn
to detect when a value isn't set and use the higher level value.

* For send_mky and check_tn_cert_public_url, the tn default was
forced to "NO" which always overrode the profile and attestation
objects.  Their defaults are now "NOT_SET" so the propagation
happens correctly.

* Just to remove some redundant code in tn_config.c, a bunch of calls to
generate_sorcery_enum_from_str() and generate_sorcery_enum_to_str() were
replaced with a single call to generate_acfg_common_sorcery_handlers().

Resolves: #904
2024-09-26 11:05:15 -05:00
George Joseph
dc8f83662b res_stir_shaken: Remove stale include for jansson.h in verification.c
verification.c had an include for jansson.h left over from previous
versions of the module.  Since res_stir_shaken no longer has a
dependency on jansson, the bundled version wasn't added to GCC's
include path so if you didn't also have a jansson development package
installed, the compile would fail.  Removing the stale include
was the only thing needed.

Resolves: #889
2024-09-26 11:05:12 -05:00
George Joseph
4411f22d67 res_stir_shaken.c: Fix crash when stir_shaken.conf is invalid
* If the call to ast_config_load() returns CONFIG_STATUS_FILEINVALID,
check_for_old_config() now returns LOAD_DECLINE instead of continuing
on with a bad pointer.

* If CONFIG_STATUS_FILEMISSING is returned, check_for_old_config()
assumes the config is being loaded from realtime and now returns
LOAD_SUCCESS.  If it's actually not being loaded from realtime,
sorcery will catch that later on.

* Also refactored the error handling in load_module() a bit.

Resolves: #884
2024-09-26 11:05:10 -05:00
Asterisk Development Team
7c1687ba12 Update for 22.0.0-rc1 2024-09-12 18:46:53 +00:00
George Joseph
3fb205f3af res_stir_shaken: Check for disabled before param validation
For both attestation and verification, we now check whether they've
been disabled either globally or by the profile before validating
things like callerid, orig_tn, dest_tn, etc.  This prevents useless
error messages.

Resolves: #879
(cherry picked from commit ef7d177ee3)
2024-09-12 18:46:48 +00:00
Tinet-mucw
ef2bae8464 app_chanspy.c: resolving the issue writing frame to whisper audiohook.
ChanSpy(${channel}, qEoSw): because flags set o, ast_audiohook_set_frame_feed_direction(audiohook, AST_AUDIOHOOK_DIRECTION_READ); this will effect whisper audiohook and spy audiohook, this makes writing frame to whisper audiohook impossible. So add function start_whispering to starting whisper audiohook.

Resolves: #876
(cherry picked from commit ffb1dca485)
2024-09-12 18:46:48 +00:00
Alexei Gradinari
a06c18e8bd autoservice: Do not sleep if autoservice_stop is called within autoservice thread
It's possible that ast_autoservice_stop is called within the autoservice thread.
In this case the autoservice thread is stuck in an endless sleep.

To avoid endless sleep ast_autoservice_stop must check that it's not called
within the autoservice thread.

Fixes: #763
(cherry picked from commit 6c5c1e5426)
2024-09-12 18:46:48 +00:00
George Joseph
b506faaa2d res_resolver_unbound: Test for NULL ub_result in unbound_resolver_callback
The ub_result pointer passed to unbound_resolver_callback by
libunbound can be NULL if the query was for something malformed
like `.1` or `[.1]`.  If it is, we now set a 'ns_r_formerr' result
and return instead of crashing with a SEGV.  This causes pjproject
to simply cancel the transaction with a "No answer record in the DNS
response" error.  The existing "off nominal" unit test was also
updated to check this condition.

Although not necessary for this fix, we also made
ast_dns_resolver_completed() tolerant of a NULL result.

Resolves: GHSA-v428-g3cw-7hv9
(cherry picked from commit d2d0c507ff)
2024-09-12 18:46:48 +00:00
George Joseph
78f8b00267 app_voicemail: Use ast_asprintf to create mailbox SQL query
...instead of trying to calculate the length of the buffer needed
manually.

(cherry picked from commit dc97763979)
2024-09-12 18:46:48 +00:00
Mike Bradeen
add94582ba res_pjsip_sdp_rtp: Use negotiated DTMF Payload types on bitrate mismatch
When Asterisk sends an offer to Bob that includes 48K and 8K codecs with
matching 4733 offers, Bob may want to use the 48K audio codec but can not
accept 48K digits and so negotiates for a mixed set.

Asterisk will now check Bob's offer to make sure Bob has indicated this is
acceptible and if not, will use Bob's preference.

Fixes: #847
(cherry picked from commit 4972cc8668)
2024-09-12 18:46:48 +00:00
Tinet-mucw
b42d4f8a3c app_chanspy.c: resolving the issue with audiohook direction read
ChanSpy(${channel}, qEoS): When chanspy spy the direction read, reading frame is often failed when reading direction read audiohook. because chanspy only read audiohook direction read; write_factory_ms will greater than 100ms soon, then ast_slinfactory_flush will being called, then direction read will fail.

Resolves: #861
(cherry picked from commit f646727423)
2024-09-12 18:46:48 +00:00
George Joseph
cd8ffa1225 security_agreements.c: Refactor the to_str functions and fix a few other bugs
* A static array of security mechanism type names was created.

* ast_sip_str_to_security_mechanism_type() was refactored to do
  a lookup in the new array instead of using fixed "if/else if"
  statments.

* security_mechanism_to_str() and ast_sip_security_mechanisms_to_str()
  were refactored to use ast_str instead of a fixed length buffer
  to store the result.

* ast_sip_security_mechanism_type_to_str was removed in favor of
  just referencing the new type name array.  Despite starting with
  "ast_sip_", it was a static function so removing it doesn't affect
  ABI.

* Speaking of "ast_sip_", several other static functions that
  started with "ast_sip_" were renamed to avoid confusion about
  their public availability.

* A few VECTOR free loops were replaced with AST_VECTOR_RESET().

* Fixed a meomry leak in pjsip_configuration.c endpoint_destructor
  caused by not calling ast_sip_security_mechanisms_vector_destroy().

* Fixed a memory leak in res_pjsip_outbound_registration.c
  add_security_headers() caused by not specifying OBJ_NODATA in
  an ao2_callback.

* Fixed a few ao2_callback return code misuses.

Resolves: #845
(cherry picked from commit efe34dc6e5)
2024-09-12 18:46:48 +00:00
Alexei Gradinari
045d6c5fc1 res_pjsip_sdp_rtp fix leaking astobj2 ast_format
PR #700 added a preferred_format for the struct ast_rtp_codecs,
but when set the preferred_format it leaks an astobj2 ast_format.
In the next code
ast_rtp_codecs_set_preferred_format(&codecs, ast_format_cap_get_format(joint, 0));
both functions ast_rtp_codecs_set_preferred_format
and ast_format_cap_get_format increases the ao2 reference count.

Fixes: #856
(cherry picked from commit 6ef4548223)
2024-09-12 18:46:48 +00:00
George Joseph
89bdcf0112 stir_shaken.conf.sample: Fix bad references to private_key_path
They should be private_key_file.

Resolves: #854
(cherry picked from commit ca15a2c034)
2024-09-12 18:46:48 +00:00
Sean Bright
6b7b5c98df res_pjsip_logger.c: Fix 'OPTIONS' tab completion.
Fixes #843

(cherry picked from commit b0e1f6a6ce)
2024-09-12 18:46:48 +00:00
Sean Bright
5a1e6995d6 alembic: Make 'revises' header comment match reality.
(cherry picked from commit 53f2c426cc)
2024-09-12 18:46:48 +00:00
Mike Bradeen
31b8dc0923 Update version for Asterisk 22 2024-08-14 18:59:28 +00:00
587 changed files with 68717 additions and 14412 deletions

View File

@@ -3,121 +3,22 @@ on:
workflow_dispatch:
inputs:
branches:
description: "JSON array of branches: ['18','20'] (no spaces)"
description: "JSON array of branches: ['18','20'] (no spaces) or leave blank for all current branches."
required: false
type: string
schedule:
# Times are UTC
- cron: '0 04 * * *'
env:
ASTERISK_REPO: ${{ github.repository }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
DEFAULT_BRANCHES: ${{ vars.WIKIDOC_BRANCHES }}
INPUT_BRANCHES: ${{ inputs.branches }}
jobs:
CreateDocsDebug:
runs-on: ubuntu-latest
outputs:
manual_branches: ${{ steps.setup.outputs.manual_branches }}
steps:
- name: setup
run: |
MANUAL_BRANCHES="$INPUT_BRANCHES"
[ -z "$MANUAL_BRANCHES" ] && MANUAL_BRANCHES="$DEFAULT_BRANCHES" || :
echo "manual_branches=${MANUAL_BRANCHES}"
echo "manual_branches=${MANUAL_BRANCHES}" >>${GITHUB_OUTPUT}
exit 0
- name: DumpEnvironment
uses: asterisk/asterisk-ci-actions/DumpEnvironmentAction@main
with:
action-inputs: ${{toJSON(inputs)}}
action-vars: ${{ toJSON(steps.setup.outputs) }}
CreateDocsScheduledMatrix:
needs: [ CreateDocsDebug ]
if: ${{github.event_name == 'schedule' && fromJSON(vars.WIKIDOCS_ENABLE) == true }}
continue-on-error: false
CreateDocs:
if: ${{ ( github.event_name == 'schedule' && fromJSON(vars.WIKIDOCS_ENABLE) ) || github.event_name == 'workflow_dispatch' }}
strategy:
fail-fast: false
matrix:
branch: ${{ fromJSON(vars.WIKIDOC_BRANCHES) }}
runs-on: ubuntu-latest
steps:
- name: CreateDocs for ${{matrix.branch}}
uses: asterisk/asterisk-ci-actions/CreateAsteriskDocsComposite@main
with:
asterisk_repo: ${{env.ASTERISK_REPO}}
base_branch: ${{matrix.branch}}
docs_dir: docs_dir/${{matrix.branch}}
github_token: ${{secrets.GITHUB_TOKEN}}
branch: ${{ fromJSON(inputs.branches || vars.WIKIDOC_BRANCHES) }}
uses: asterisk/asterisk-ci-actions/.github/workflows/AsteriskCreateDocs.yml@main
with:
asterisk_repo: ${{ github.repository }}
base_branch: ${{ matrix.branch }}
CreateDocsScheduled:
needs: [ CreateDocsScheduledMatrix ]
if: ${{ success() || failure() }}
runs-on: ubuntu-latest
steps:
- name: Check CreateDocsScheduledMatrix status
env:
RESULT: ${{needs.CreateDocsScheduledMatrix.result}}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
case $RESULT in
success)
echo "::notice::Docs created"
exit 0
;;
skipped)
echo "::notice::Skipped"
exit 1
;;
*)
echo "::error::One or CreateDocs failed ($RESULT)"
exit 1
esac
CreateDocsManualMatrix:
needs: [ CreateDocsDebug ]
if: ${{github.event_name == 'workflow_dispatch'}}
continue-on-error: false
strategy:
fail-fast: false
matrix:
branch: ${{ fromJSON(vars.WIKIDOC_MANUAL_BRANCHES) }}
runs-on: ubuntu-latest
steps:
- name: CreateDocs for ${{matrix.branch}}
uses: asterisk/asterisk-ci-actions/CreateAsteriskDocsComposite@main
with:
asterisk_repo: ${{env.ASTERISK_REPO}}
base_branch: ${{matrix.branch}}
docs_dir: docs_dir/${{matrix.branch}}
github_token: ${{secrets.GITHUB_TOKEN}}
CreateDocsManual:
needs: [ CreateDocsManualMatrix ]
if: ${{ success() || failure() }}
runs-on: ubuntu-latest
steps:
- name: Check CreateDocsManualMatrix status
env:
RESULT: ${{needs.CreateDocsManualMatrix.result}}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
case $RESULT in
success)
echo "::notice::Docs created"
exit 0
;;
skipped)
echo "::notice::Skipped"
exit 1
;;
*)
echo "::error::One or CreateDocs failed ($RESULT)"
exit 1
esac

View File

@@ -4,16 +4,8 @@ on:
- cron: '30 1 * * *'
workflow_dispatch:
env:
ASTERISK_REPO: ${{ github.repository }}
PR_NUMBER: 0
PR_COMMIT: ''
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
MODULES_BLACKLIST: ${{ vars.GATETEST_MODULES_BLACKLIST }} ${{ vars.UNITTEST_MODULES_BLACKLIST }}
jobs:
CloseStaleIssues:
uses: asterisk/asterisk-ci-actions/.github/workflows/CloseStaleIssuesAndPRs.yml@main
NightlyAdmin:
uses: asterisk/asterisk-ci-actions/.github/workflows/AsteriskNightlyAdmin.yml@main
secrets:
ASTERISKTEAM_PAT: ${{ secrets.ASTERISKTEAM_PAT }}
ASTERISKTEAM_PAT: ${{ secrets.ASTERISKTEAM_PAT }}

View File

@@ -12,7 +12,8 @@ on:
description: "Array of test groups to run: ['ari1','channels']. Defaults to NIGHTLYTEST_LIST"
schedule:
- cron: '0 2 * * *'
# Monday-Saturday 2am
- cron: '0 2 * * 1-6'
jobs:
NightlyTests:
@@ -21,5 +22,4 @@ jobs:
with:
branches: ${{ inputs.branches || vars.NIGHTLYTEST_BRANCHES }}
group_list: ${{ inputs.group_list || vars.NIGHTLYTEST_LIST }}
secrets:
TOKEN: ${{ secrets.GITHUB_TOKEN }}
realtime: false

14
.github/workflows/OnPRCPCheck.yml vendored Normal file
View File

@@ -0,0 +1,14 @@
name: PRCPCheck
run-name: "PR ${{ github.event.number }} CPCheck by ${{ github.actor }}"
on:
pull_request_target:
types: [ labeled ]
jobs:
PRCPCheck:
name: "run-cpcheck"
if: ${{ github.event.label.name == vars.CHERRY_PICK_TEST_LABEL }}
concurrency:
group: cpcheck-${{ github.triggering_actor }}-${{ github.head_ref }}
cancel-in-progress: true
uses: asterisk/asterisk-ci-actions/.github/workflows/AsteriskPRCPCheck.yml@main

14
.github/workflows/OnPRCheck.yml vendored Normal file
View File

@@ -0,0 +1,14 @@
name: PRCheck
run-name: "PR ${{ github.event.number }} Check(${{github.event.action}}) by ${{ github.actor }}"
on:
pull_request_target:
types: [ opened, reopened, synchronize, labeled ]
jobs:
PRCheck:
name: "run-check"
if: ${{ (github.event.action != 'labeled') || (github.event.action == 'labeled' && github.event.label.name == vars.RECHECKPR_LABEL) }}
concurrency:
group: check-${{ github.triggering_actor }}-${{ github.head_ref }}
cancel-in-progress: true
uses: asterisk/asterisk-ci-actions/.github/workflows/AsteriskPRCheck.yml@main

View File

@@ -1,17 +0,0 @@
name: PRCherryPickTest
run-name: "PR ${{github.event.number}} CherryPickTest"
on:
pull_request_target:
types: [ labeled ]
concurrency:
group: ${{github.workflow}}-${{github.event.label.name}}-${{github.event.number}}
cancel-in-progress: true
jobs:
CherryPickTest:
name: CherryPickTest
if: ${{ github.event.label.name == vars.CHERRY_PICK_TEST_LABEL }}
uses: asterisk/asterisk-ci-actions/.github/workflows/AsteriskCherryPickTest.yml@main
secrets:
TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -1,19 +1,14 @@
name: PRMergeApproved
run-name: "PR ${{github.event.number}} MergeApproved"
name: PRMerge
run-name: "PR ${{ github.event.number }} Merge by ${{ github.actor }}"
on:
pull_request_target:
types: [labeled]
concurrency:
group: ${{github.workflow}}-${{github.event.label.name}}-${{github.event.number}}
cancel-in-progress: true
types: [ labeled ]
jobs:
MergePR:
name: MergePR
PRMerge:
name: "run-merge"
if: contains(fromJSON(vars.MERGE_APPROVED_LABELS), github.event.label.name)
uses: asterisk/asterisk-ci-actions/.github/workflows/AsteriskMergePR.yml@main
secrets:
TOKEN: ${{ secrets.GITHUB_TOKEN }}
application_id: ${{secrets.ASTERISK_ORG_ACCESS_APP_ID}}
application_private_key: ${{secrets.ASTERISK_ORG_ACCESS_APP_PRIV_KEY}}
concurrency:
group: merge-${{ github.triggering_actor }}-${{ github.head_ref }}
cancel-in-progress: true
uses: asterisk/asterisk-ci-actions/.github/workflows/AsteriskPRMerge.yml@main

View File

@@ -1,18 +0,0 @@
name: PRRecheck
run-name: "PR ${{github.event.number}} Recheck"
on:
pull_request_target:
types: [ labeled ]
concurrency:
group: ${{github.workflow}}-${{github.event.label.name}}-${{github.event.number}}
cancel-in-progress: true
jobs:
PRCheck:
name: PRCheck
if: ${{ github.event.label.name == vars.RECHECKPR_LABEL }}
uses: asterisk/asterisk-ci-actions/.github/workflows/AsteriskRecheckPR.yml@main
secrets:
TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -1,79 +0,0 @@
#
# Workflows, like this one, that are triggered by PRs submitted
# from forked repositories are severly limited in what they can do
# for security reasons. For instance, they can't add or remove
# labels or comments even on the PR that triggered them. Since
# we need to both of those things, GitHub recommends creating a
# separate workflow that does those tasks that's triggered when
# this PR workflow starts or finishes. Since that workflow isn't
# being run in the context of a forked repo, it has all the
# privileges needed to add and remove labels and comments. The
# accompanying OnPRStateChangedPriv workflow does just that.
name: PRStateChanged
run-name: "PR ${{github.event.number}} ${{github.event.action}} by ${{ github.actor }}"
on:
pull_request:
types: [opened, reopened, synchronize]
concurrency:
group: ${{github.workflow}}-${{github.event.number}}
cancel-in-progress: true
jobs:
#
# Pull requests created from forked respositories don't have access
# to the "Action Variables" ('vars' context) so we need to retrieve
# control data from an action that's located in asterisk-ci-actions.
#
Setup:
runs-on: ubuntu-latest
outputs:
vars: ${{ steps.setvars.outputs.control_data }}
testsuite_test_pr: ${{ steps.testsuitepr.outputs.testsuite_test_pr }}
steps:
- id: wait
run: |
echo "::notice::Waiting for 2 minutes to give user a chance to add PR comments"
sleep 120
exit 0
- id: setvars
uses: asterisk/asterisk-ci-actions/GetRepoControlData@main
with:
repo: ${{ github.event.repository.name}}
- name: GetTestsuitePR
id: testsuitepr
uses: asterisk/asterisk-ci-actions/GetTestsuitePRFromAsteriskPR@main
with:
repo: ${{github.repository}}
pr_number: ${{github.event.number}}
testsuite_test_pr_regex: ${{ fromJSON(steps.setvars.outputs.control_data).TESTSUITE_TEST_PR_REGEX }}
testsuite_test_auto_merge_regex: ${{ fromJSON(steps.setvars.outputs.control_data).TESTSUITE_TEST_AUTO_MERGE_REGEX }}
github_token: ${{ secrets.GITHUB_TOKEN }}
- name: DumpEnvironment
uses: asterisk/asterisk-ci-actions/DumpEnvironmentAction@main
with:
action-vars: ${{ toJSON(steps.setvars.outputs) }}
action-inputs: ${{ toJSON(steps.testsuitepr.outputs) }}
PRCheck:
name: PRCheck
needs: Setup
uses: asterisk/asterisk-ci-actions/.github/workflows/AsteriskUnitGateTest.yml@main
with:
test_type: prstatechange
asterisk_repo: ${{github.repository}}
pr_number: ${{github.event.number}}
base_branch: ${{github.event.pull_request.base.ref}}
build_options: ${{ fromJSON(needs.Setup.outputs.vars).BUILD_OPTIONS }}
unittest_command: ${{ fromJSON(needs.Setup.outputs.vars).UNITTEST_COMMAND }}
testsuite_repo: ${{ fromJSON(needs.Setup.outputs.vars).TESTSUITE_REPO }}
testsuite_test_pr: ${{ needs.Setup.outputs.testsuite_test_pr }}
gatetest_list: ${{ fromJSON(needs.Setup.outputs.vars).GATETEST_LIST }}
gatetest_commands: ${{ fromJSON(needs.Setup.outputs.vars).GATETEST_COMMANDS }}
secrets:
TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -1,27 +0,0 @@
#
# Workflows triggered by PRs submitted from forked repositories
# (all of ours) are severly limited in what they can do.
# For instance, they can't add or remove labels or comments even
# on the PR that triggered them. Since we need to both of those,
# GitHub recommends creating a separate workflow (this one) that
# does those tasks that's triggered when the PR submit workflow
# starts or finishes. Since this workflow isn't being run in the
# context of a forked repo, it has all the privileges needed to
# add and remove labels and comments. Hence the "Priv" at the end
# of this workflow name.
#
name: PRStateChangedPriv
run-name: "PRStateChangedPriv ${{github.event.workflow.name}} ${{github.event.action}}"
on:
workflow_run:
workflows: [PRStateChanged]
types:
- requested
- completed
jobs:
PRStateChangedPriv:
name: PRStateChangedPriv
uses: asterisk/asterisk-ci-actions/.github/workflows/AsteriskPRStateChangedPriv.yml@main
secrets:
TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -3,6 +3,16 @@ run-name: ${{ github.actor }} is creating ${{vars.PRODUCT_NAME}} release ${{inpu
on:
workflow_dispatch:
inputs:
release_type:
description: |
Release Type:
required: true
type: choice
options:
- STANDARD
- SECURITY
- HOTFIX
default: STANDARD
new_version:
description: |
New Version:
@@ -11,24 +21,16 @@ on:
certified-20.4-cert1-rc1, certified-20.4-cert1
required: true
type: string
is_security:
description: |
Security?
(No prev RCs)
required: true
type: boolean
default: false
advisories:
description: |
Comma separated list of advisories.
Comma separated list of advisories for SECURITY releases.
NO SPACES
Example: GHSA-4xjp-22g4-9fxm,GHSA-4xjp-22g4-zzzz
required: false
type: string
is_hotfix:
skip_cherry_pick:
description: |
Hotfix?
(A patch release but not security. No prev RCs)
Skip automatic cherry-pick for regular RC1 releases? USE WITH CAUTION!
required: true
type: boolean
default: false
@@ -38,6 +40,12 @@ on:
required: true
type: boolean
default: false
skip_test_builds:
description: |
Skip test builds? USE WITH CAUTION!
required: true
type: boolean
default: false
push_release_branches:
description: |
Push release branches live?
@@ -64,38 +72,23 @@ on:
default: false
jobs:
ReleaseAsterisk:
runs-on: ubuntu-latest
steps:
- name: Run Releaser
uses: asterisk/asterisk-ci-actions/ReleaserComposite@main
with:
product: ${{vars.PRODUCT_NAME}}
is_security: ${{inputs.is_security}}
advisories: ${{inputs.advisories}}
is_hotfix: ${{inputs.is_hotfix}}
new_version: ${{inputs.new_version}}
force_cherry_pick: ${{inputs.force_cherry_pick}}
push_release_branches: ${{inputs.push_release_branches}}
create_github_release: ${{inputs.create_github_release}}
push_tarballs: ${{inputs.push_tarballs}}
send_email: ${{inputs.send_email}}
repo: ${{github.repository}}
mail_list_ga: ${{vars.MAIL_LIST_GA}}
mail_list_rc: ${{vars.MAIL_LIST_RC}}
mail_list_cert_ga: ${{vars.MAIL_LIST_CERT_GA}}
mail_list_cert_rc: ${{vars.MAIL_LIST_CERT_RC}}
mail_list_sec: ${{vars.MAIL_LIST_SEC_ADV}}
sec_adv_url_base: ${{vars.SEC_ADV_URL_BASE}}
gpg_private_key: ${{secrets.ASTDEV_GPG_PRIV_KEY}}
github_token: ${{secrets.GITHUB_TOKEN}}
asteriskteam_gh_token: ${{secrets.ASTERISKTEAM_PAT}}
application_id: ${{secrets.ASTERISK_ORG_ACCESS_APP_ID}}
application_private_key: ${{secrets.ASTERISK_ORG_ACCESS_APP_PRIV_KEY}}
asteriskteamsa_username: ${{secrets.ASTERISKTEAMSA_GMAIL_ACCT}}
asteriskteamsa_token: ${{secrets.ASTERISKTEAMSA_GMAIL_TOKEN}}
deploy_ssh_priv_key: ${{secrets.DOWNLOADS_DEPLOY_SSH_PRIV_KEY}}
deploy_ssh_username: ${{secrets.DOWNLOADS_DEPLOY_SSH_USERNAME}}
deploy_host: ${{vars.DEPLOY_HOST}}
deploy_dir: ${{vars.DEPLOY_DIR}}
fpbx_issue_repo: ${{vars.FPBX_ISSUE_REPO}}
Releaser:
uses: asterisk/asterisk-ci-actions/.github/workflows/AsteriskRelease.yml@main
with:
release_type: ${{inputs.release_type}}
new_version: ${{inputs.new_version}}
advisories: ${{inputs.advisories}}
skip_cherry_pick: ${{inputs.skip_cherry_pick}}
force_cherry_pick: ${{inputs.force_cherry_pick}}
skip_test_builds: ${{inputs.skip_test_builds}}
push_release_branches: ${{inputs.push_release_branches}}
create_github_release: ${{inputs.create_github_release}}
push_tarballs: ${{inputs.push_tarballs}}
send_email: ${{inputs.send_email}}
secrets:
gpg_private_key: ${{secrets.ASTDEV_GPG_PRIV_KEY}}
asteriskteam_gh_token: ${{secrets.ASTERISKTEAM_PAT}}
asteriskteam_email_username: ${{secrets.ASTERISKTEAM_SES_KEY_ID}}
asteriskteam_email_secret: ${{secrets.ASTERISKTEAM_SES_KEY_SECRET}}
deploy_ssh_priv_key: ${{secrets.DOWNLOADS_DEPLOY_SSH_PRIV_KEY}}
deploy_ssh_username: ${{secrets.DOWNLOADS_DEPLOY_SSH_USERNAME}}

25
.github/workflows/WeeklyTests.yml vendored Normal file
View File

@@ -0,0 +1,25 @@
name: WeeklyTests
on:
workflow_dispatch:
inputs:
branches:
required: false
type: string
description: "Array of branches to run: ['21','master']. Defaults to NIGHTLYTEST_BRANCHES"
group_list:
required: false
type: string
description: "Array of test groups to run: ['ari1','channels']. Defaults to NIGHTLYTEST_LIST"
schedule:
# Sunday 2am
- cron: '0 2 * * 0'
jobs:
WeeklyTests:
name: WeeklyTests
uses: asterisk/asterisk-ci-actions/.github/workflows/AsteriskNightlyTest.yml@main
with:
branches: ${{ inputs.branches || vars.NIGHTLYTEST_BRANCHES }}
group_list: ${{ inputs.group_list || vars.NIGHTLYTEST_LIST }}
realtime: true

1
.version Normal file
View File

@@ -0,0 +1 @@
22.7.0-rc1

1
CHANGES.html Symbolic link
View File

@@ -0,0 +1 @@
ChangeLogs/ChangeLog-22.7.0-rc1.html

1
CHANGES.md Symbolic link
View File

@@ -0,0 +1 @@
ChangeLogs/ChangeLog-22.7.0-rc1.md

View File

@@ -87,7 +87,7 @@
manager eventmask; command line '-t' flag to allow
recording/voicemail on nfs shares; #exec command and multiline
comments in config files; setvar in iax and sip configs.
anthmct(AT)yahoo.com http://www.asterlink.com
anthm(AT)signalwire.com http://www.signalwire.com
* James Golovich - Innumerable contributions, including SIP TCP and TLS
support. You can find him and asterisk-perl at

View File

@@ -0,0 +1,370 @@
## Change Log for Release asterisk-22.0.0
### Links:
- [Full ChangeLog](https://downloads.asterisk.org/pub/telephony/asterisk/releases/ChangeLog-22.0.0.md)
- [GitHub Diff](https://github.com/asterisk/asterisk/compare/22.0.0-pre1...22.0.0)
- [Tarball](https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22.0.0.tar.gz)
- [Downloads](https://downloads.asterisk.org/pub/telephony/asterisk)
### Summary:
- Commits: 22
- Commit Authors: 8
- Issues Resolved: 13
- Security Advisories Resolved: 1
- [GHSA-v428-g3cw-7hv9](https://github.com/asterisk/asterisk/security/advisories/GHSA-v428-g3cw-7hv9): A malformed Contact or Record-Route URI in an incoming SIP request can cause Asterisk to crash when res_resolver_unbound is used
### User Notes:
- #### feat: ARI "ChannelToneDetected" event
Setting the TONE_DETECT dialplan function on a channel
in ARI will now cause a ChannelToneDetected ARI event to be raised
when the specified tone is detected.
### Upgrade Notes:
- #### app_record: Add RECORD_TIME output variable.
The RECORD_TIME variable now contains
the duration of Record() recordings in milliseconds.
### Commit Authors:
- Alexei Gradinari: (2)
- George Joseph: (10)
- Gibbz00: (1)
- Joshua C. Colp: (2)
- Mike Bradeen: (2)
- Naveen Albert: (1)
- Sean Bright: (2)
- Tinet-Mucw: (2)
## Issue and Commit Detail:
### Closed Issues:
- !GHSA-v428-g3cw-7hv9: A malformed Contact or Record-Route URI in an incoming SIP request can cause Asterisk to crash when res_resolver_unbound is used
- 548: [improvement]: Get Record() audio duration/length
- 763: [bug]: autoservice thread stuck in an endless sleep
- 811: [new-feature]: ARI channel tone detect events.
- 845: [bug]: Buffer overflow in handling of security mechanisms in res_pjsip
- 847: [bug]: Asterisk not using negotiated fall-back 8K digits
- 854: [bug]: wrong properties in stir_shaken.conf.sample
- 856: [bug]: res_pjsip_sdp_rtp leaks astobj2 ast_format
- 861: [bug]: ChanSpy unable to read audiohook read direction frame when no packet lost on both side of the call
- 876: [bug]: ChanSpy unable to write whisper_audiohook when set flag OPTION_READONLY
- 879: [bug]: res_stir_shaken/verification.c: Getting verification errors when global_disable=yes
- 884: [bug]: A ':' at the top of in stir_shaken.conf make Asterisk producing a core file when starting
- 889: [bug]: res_stir_shaken/verification.c has a stale include for jansson.h that can cause compilation to fail
- 904: [bug]: stir_shaken: attest_level isn't being propagated correctly from attestation to profile to tn
### Commits By Author:
- #### Alexei Gradinari (2):
- res_pjsip_sdp_rtp fix leaking astobj2 ast_format
- autoservice: Do not sleep if autoservice_stop is called within autoservice thr..
- #### George Joseph (8):
- stir_shaken.conf.sample: Fix bad references to private_key_path
- security_agreements.c: Refactor the to_str functions and fix a few other bugs
- app_voicemail: Use ast_asprintf to create mailbox SQL query
- res_resolver_unbound: Test for NULL ub_result in unbound_resolver_callback
- res_stir_shaken: Check for disabled before param validation
- res_stir_shaken.c: Fix crash when stir_shaken.conf is invalid
- res_stir_shaken: Remove stale include for jansson.h in verification.c
- stir_shaken: Fix propagation of attest_level and a few other values
- #### Mike Bradeen (1):
- res_pjsip_sdp_rtp: Use negotiated DTMF Payload types on bitrate mismatch
- #### Sean Bright (2):
- alembic: Make 'revises' header comment match reality.
- res_pjsip_logger.c: Fix 'OPTIONS' tab completion.
- #### Tinet-mucw (2):
- app_chanspy.c: resolving the issue with audiohook direction read
- app_chanspy.c: resolving the issue writing frame to whisper audiohook.
### Commit List:
- Prepare master for Asterisk 22
- Update issue guidelines link for bug reports.
- .github: NightlyAdmin now calls external CloseStaleIssuesAndPRs
- app_record: Add RECORD_TIME output variable.
- Revert "app_record: Add RECORD_TIME output variable."
- feat: ARI "ChannelToneDetected" event
- Update version for Asterisk 22
- stir_shaken: Fix propagation of attest_level and a few other values
- res_stir_shaken: Remove stale include for jansson.h in verification.c
- res_stir_shaken.c: Fix crash when stir_shaken.conf is invalid
- res_stir_shaken: Check for disabled before param validation
- app_chanspy.c: resolving the issue writing frame to whisper audiohook.
- res_resolver_unbound: Test for NULL ub_result in unbound_resolver_callback
- app_voicemail: Use ast_asprintf to create mailbox SQL query
- res_pjsip_sdp_rtp: Use negotiated DTMF Payload types on bitrate mismatch
- app_chanspy.c: resolving the issue with audiohook direction read
- security_agreements.c: Refactor the to_str functions and fix a few other bugs
- res_pjsip_sdp_rtp fix leaking astobj2 ast_format
- stir_shaken.conf.sample: Fix bad references to private_key_path
- res_pjsip_logger.c: Fix 'OPTIONS' tab completion.
- alembic: Make 'revises' header comment match reality.
### Commit Details:
#### Prepare master for Asterisk 22
Author: George Joseph
Date: 2023-08-09
#### Update issue guidelines link for bug reports.
Author: Joshua C. Colp
Date: 2023-10-27
#### .github: NightlyAdmin now calls external CloseStaleIssuesAndPRs
Author: George Joseph
Date: 2024-03-20
#### app_record: Add RECORD_TIME output variable.
Author: Naveen Albert
Date: 2024-01-22
This adds the RECORD_TIME variable to Record(),
which is set to the recording duration before
the application returns.
Resolves: #548
UpgradeNote: The RECORD_TIME variable now contains
the duration of Record() recordings in milliseconds.
#### Revert "app_record: Add RECORD_TIME output variable."
Author: Joshua C. Colp
Date: 2024-04-30
This reverts commit 6e8dccdbbf896bcc99046ae249db360698ede0b2.
#### feat: ARI "ChannelToneDetected" event
Author: gibbz00
Date: 2024-07-18
A stasis event is now produced when using the TONE_DETECT dialplan
function. This event is published over ARI using the ChannelToneDetected
event. This change does not make it available over AMI.
Fixes: #811
UserNote: Setting the TONE_DETECT dialplan function on a channel
in ARI will now cause a ChannelToneDetected ARI event to be raised
when the specified tone is detected.
#### Update version for Asterisk 22
Author: Mike Bradeen
Date: 2024-08-14
#### stir_shaken: Fix propagation of attest_level and a few other values
Author: George Joseph
Date: 2024-09-24
attest_level, send_mky and check_tn_cert_public_url weren't
propagating correctly from the attestation object to the profile
and tn.
* In the case of attest_level, the enum needed to be changed
so the "0" value (the default) was "NOT_SET" instead of "A". This
now allows the merging of the attestation object, profile and tn
to detect when a value isn't set and use the higher level value.
* For send_mky and check_tn_cert_public_url, the tn default was
forced to "NO" which always overrode the profile and attestation
objects. Their defaults are now "NOT_SET" so the propagation
happens correctly.
* Just to remove some redundant code in tn_config.c, a bunch of calls to
generate_sorcery_enum_from_str() and generate_sorcery_enum_to_str() were
replaced with a single call to generate_acfg_common_sorcery_handlers().
Resolves: #904
#### res_stir_shaken: Remove stale include for jansson.h in verification.c
Author: George Joseph
Date: 2024-09-17
verification.c had an include for jansson.h left over from previous
versions of the module. Since res_stir_shaken no longer has a
dependency on jansson, the bundled version wasn't added to GCC's
include path so if you didn't also have a jansson development package
installed, the compile would fail. Removing the stale include
was the only thing needed.
Resolves: #889
#### res_stir_shaken.c: Fix crash when stir_shaken.conf is invalid
Author: George Joseph
Date: 2024-09-13
* If the call to ast_config_load() returns CONFIG_STATUS_FILEINVALID,
check_for_old_config() now returns LOAD_DECLINE instead of continuing
on with a bad pointer.
* If CONFIG_STATUS_FILEMISSING is returned, check_for_old_config()
assumes the config is being loaded from realtime and now returns
LOAD_SUCCESS. If it's actually not being loaded from realtime,
sorcery will catch that later on.
* Also refactored the error handling in load_module() a bit.
Resolves: #884
#### res_stir_shaken: Check for disabled before param validation
Author: George Joseph
Date: 2024-09-11
For both attestation and verification, we now check whether they've
been disabled either globally or by the profile before validating
things like callerid, orig_tn, dest_tn, etc. This prevents useless
error messages.
Resolves: #879
#### app_chanspy.c: resolving the issue writing frame to whisper audiohook.
Author: Tinet-mucw
Date: 2024-09-10
ChanSpy(${channel}, qEoSw): because flags set o, ast_audiohook_set_frame_feed_direction(audiohook, AST_AUDIOHOOK_DIRECTION_READ); this will effect whisper audiohook and spy audiohook, this makes writing frame to whisper audiohook impossible. So add function start_whispering to starting whisper audiohook.
Resolves: #876
#### autoservice: Do not sleep if autoservice_stop is called within autoservice thr..
Author: Alexei Gradinari
Date: 2024-09-04
It's possible that ast_autoservice_stop is called within the autoservice thread.
In this case the autoservice thread is stuck in an endless sleep.
To avoid endless sleep ast_autoservice_stop must check that it's not called
within the autoservice thread.
Fixes: #763
#### res_resolver_unbound: Test for NULL ub_result in unbound_resolver_callback
Author: George Joseph
Date: 2024-08-12
The ub_result pointer passed to unbound_resolver_callback by
libunbound can be NULL if the query was for something malformed
like `.1` or `[.1]`. If it is, we now set a 'ns_r_formerr' result
and return instead of crashing with a SEGV. This causes pjproject
to simply cancel the transaction with a "No answer record in the DNS
response" error. The existing "off nominal" unit test was also
updated to check this condition.
Although not necessary for this fix, we also made
ast_dns_resolver_completed() tolerant of a NULL result.
Resolves: GHSA-v428-g3cw-7hv9
#### app_voicemail: Use ast_asprintf to create mailbox SQL query
Author: George Joseph
Date: 2024-09-03
...instead of trying to calculate the length of the buffer needed
manually.
#### res_pjsip_sdp_rtp: Use negotiated DTMF Payload types on bitrate mismatch
Author: Mike Bradeen
Date: 2024-08-21
When Asterisk sends an offer to Bob that includes 48K and 8K codecs with
matching 4733 offers, Bob may want to use the 48K audio codec but can not
accept 48K digits and so negotiates for a mixed set.
Asterisk will now check Bob's offer to make sure Bob has indicated this is
acceptible and if not, will use Bob's preference.
Fixes: #847
#### app_chanspy.c: resolving the issue with audiohook direction read
Author: Tinet-mucw
Date: 2024-08-30
ChanSpy(${channel}, qEoS): When chanspy spy the direction read, reading frame is often failed when reading direction read audiohook. because chanspy only read audiohook direction read; write_factory_ms will greater than 100ms soon, then ast_slinfactory_flush will being called, then direction read will fail.
Resolves: #861
#### security_agreements.c: Refactor the to_str functions and fix a few other bugs
Author: George Joseph
Date: 2024-08-17
* A static array of security mechanism type names was created.
* ast_sip_str_to_security_mechanism_type() was refactored to do
a lookup in the new array instead of using fixed "if/else if"
statments.
* security_mechanism_to_str() and ast_sip_security_mechanisms_to_str()
were refactored to use ast_str instead of a fixed length buffer
to store the result.
* ast_sip_security_mechanism_type_to_str was removed in favor of
just referencing the new type name array. Despite starting with
"ast_sip_", it was a static function so removing it doesn't affect
ABI.
* Speaking of "ast_sip_", several other static functions that
started with "ast_sip_" were renamed to avoid confusion about
their public availability.
* A few VECTOR free loops were replaced with AST_VECTOR_RESET().
* Fixed a meomry leak in pjsip_configuration.c endpoint_destructor
caused by not calling ast_sip_security_mechanisms_vector_destroy().
* Fixed a memory leak in res_pjsip_outbound_registration.c
add_security_headers() caused by not specifying OBJ_NODATA in
an ao2_callback.
* Fixed a few ao2_callback return code misuses.
Resolves: #845
#### res_pjsip_sdp_rtp fix leaking astobj2 ast_format
Author: Alexei Gradinari
Date: 2024-08-23
PR #700 added a preferred_format for the struct ast_rtp_codecs,
but when set the preferred_format it leaks an astobj2 ast_format.
In the next code
ast_rtp_codecs_set_preferred_format(&codecs, ast_format_cap_get_format(joint, 0));
both functions ast_rtp_codecs_set_preferred_format
and ast_format_cap_get_format increases the ao2 reference count.
Fixes: #856
#### stir_shaken.conf.sample: Fix bad references to private_key_path
Author: George Joseph
Date: 2024-08-22
They should be private_key_file.
Resolves: #854
#### res_pjsip_logger.c: Fix 'OPTIONS' tab completion.
Author: Sean Bright
Date: 2024-08-19
Fixes #843
#### alembic: Make 'revises' header comment match reality.
Author: Sean Bright
Date: 2024-08-17

View File

@@ -0,0 +1,757 @@
## Change Log for Release asterisk-22.1.0
### Links:
- [Full ChangeLog](https://downloads.asterisk.org/pub/telephony/asterisk/releases/ChangeLog-22.1.0.md)
- [GitHub Diff](https://github.com/asterisk/asterisk/compare/22.0.0...22.1.0)
- [Tarball](https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22.1.0.tar.gz)
- [Downloads](https://downloads.asterisk.org/pub/telephony/asterisk)
### Summary:
- Commits: 39
- Commit Authors: 9
- Issues Resolved: 22
- Security Advisories Resolved: 0
### User Notes:
- #### res_pjsip: Add new endpoint option "suppress_moh_on_sendonly"
The new "suppress_moh_on_sendonly" endpoint option
can be used to prevent playing MOH back to a caller if the remote
end sends "sendonly" or "inactive" (hold) to Asterisk in an SDP.
- #### app_mixmonitor: Add 'D' option for dual-channel audio.
The MixMonitor application now has a new 'D' option which
interleaves the recorded audio in the output frames. This allows for
stereo recording output with one channel being the transmitted audio and
the other being the received audio. The 't' and 't' options are
compatible with this.
- #### manager.c: Restrict ModuleLoad to the configured modules directory.
The ModuleLoad AMI action now restricts modules to the
configured modules directory.
- #### manager: Enhance event filtering for performance
You can now perform more granular filtering on events
in manager.conf using expressions like
`eventfilter(name(Newchannel),header(Channel),method(starts_with)) = PJSIP/`
This is much more efficient than
`eventfilter = Event: Newchannel.*Channel: PJSIP/`
Full syntax guide is in configs/samples/manager.conf.sample.
- #### db.c: Remove limit on family/key length
The `ast_db_*()` APIs have had the 253 byte limit on
"/family/key" removed and will now accept families and keys with a
total length of up to SQLITE_MAX_LENGTH (currently 1e9!). This
affects the `DB*` dialplan applications, dialplan functions,
manager actions and `databse` CLI commands. Since the
media_cache also uses the `ast_db_*()` APIs, you can now store
resources with URIs longer than 253 bytes.
### Upgrade Notes:
### Commit Authors:
- Allan Nathanson: (1)
- Ben Ford: (3)
- Chrsmj: (1)
- George Joseph: (15)
- Jiangxc: (1)
- Naveen Albert: (7)
- Peter Jannesen: (2)
- Sean Bright: (7)
- Thomas Guebels: (2)
## Issue and Commit Detail:
### Closed Issues:
- 487: [bug]: Segfault possibly in ast_rtp_stop
- 821: [bug]: app_dial: The progress timeout doesn't cause Dial to exit
- 881: [bug]: Long URLs are being rejected by the media cache because of an astdb key length limit
- 882: [bug]: Value CHANNEL(userfield) is lost by BRIDGE_ENTER
- 897: [improvement]: Restrict ModuleLoad AMI action to the modules directory
- 900: [bug]: astfd.c: NULL pointer passed to fclose with nonnull attribute causes compilation failure
- 902: [bug]: app_voicemail: Pager emails are ill-formatted when custom subject is used
- 916: [bug]: Compilation errors on FreeBSD
- 923: [bug]: Transport monitor shutdown callback only works on the first disconnection
- 924: [bug]: dnsmgr.c: dnsmgr_refresh() should not flag change if IP address order changes
- 928: [bug]: chan_dahdi: MWI while off-hook when hung up on after recall ring
- 932: [bug]: When connected to multiple IP addresses the transport monitor is only set on the first one
- 937: [bug]: Wrong format for sample config file 'geolocation.conf.sample'
- 938: [bug]: memory leak - CBAnn leaks a small amount format_cap related memory for every confbridge
- 945: [improvement]: Add stereo recording support for app_mixmonitor
- 951: [new-feature]: func_evalexten: Add `EVAL_SUB` function
- 974: [improvement]: change and/or remove some wiki mentions to docs mentions in the sample configs
- 979: [improvement]: Add ability to suppress MOH when a remote endpoint sends "sendonly" or "inactive"
- 982: [bug]: The addition of tenantid to the ast_sip_endpoint structure broke ABI compatibility
- 990: [improvement]: The help for PJSIP_AOR should indicate that you need to call PJSIP_CONTACT to get contact details
- 995: [bug]: suppress_moh_on_sendonly should use AST_BOOL_VALUES instead of YESNO_VALUES in alembic script
### Commits By Author:
- #### Allan Nathanson (1):
- dnsmgr.c: dnsmgr_refresh() incorrectly flags change with DNS round-robin
- #### Ben Ford (3):
- manager.c: Restrict ModuleLoad to the configured modules directory.
- app_mixmonitor: Add 'D' option for dual-channel audio.
- Add res_pjsip_config_sangoma external module.
- #### George Joseph (15):
- db.c: Remove limit on family/key length
- manager.c: Split XML documentation to manager_doc.xml
- manager: Enhance event filtering for performance
- manager.conf.sample: Fix mathcing typo
- Fix application references to Background
- res_rtp_asterisk: Fix dtls timer issues causing FRACKs and SEGVs
- manager.c: Add unit test for Originate app and appdata permissions
- geolocation.sample.conf: Fix comment marker at end of file
- core_unreal.c: Fix memory leak in ast_unreal_new_channels()
- pjproject_bundled: Tweaks to support out-of-tree development
- res_srtp: Change Unsupported crypto suite msg from verbose to debug
- res_pjsip: Move tenantid to end of ast_sip_endpoint
- func_pjsip_aor/contact: Fix documentation for contact ID
- res_pjsip: Add new endpoint option "suppress_moh_on_sendonly"
- res_pjsip: Change suppress_moh_on_sendonly to OPT_BOOL_T
- #### Naveen Albert (7):
- app_voicemail: Fix ill-formatted pager emails with custom subject.
- astfd.c: Avoid calling fclose with NULL argument.
- main, res, tests: Fix compilation errors on FreeBSD.
- chan_dahdi: Never send MWI while off-hook.
- app_dial: Fix progress timeout.
- app_dial: Fix progress timeout calculation with no answer timeout.
- func_evalexten: Add EVAL_SUB function.
- #### Peter Jannesen (2):
- cel_custom: Allow absolute filenames.
- channel: Preserve CHANNEL(userfield) on masquerade.
- #### Sean Bright (7):
- res_pjsip_pubsub: Persist subscription 'generator_data' in sorcery
- cdr_custom: Allow absolute filenames.
- res_agi.c: Ensure SIGCHLD handler functions are properly balanced.
- alembic: Drop redundant voicemail_messages index.
- func_base64.c: Ensure we set aside enough room for base64 encoded data.
- Revert "res_rtp_asterisk: Count a roll-over of the sequence number even on los..
- res_pjsip.c: Fix Contact header rendering for IPv6 addresses.
- #### Thomas Guebels (2):
- pjsip_transport_events: Avoid monitor destruction
- pjsip_transport_events: handle multiple addresses for a domain
- #### chrsmj (1):
- samples: remove and/or change some wiki mentions
- #### jiangxc (1):
- res_agi.c: Prevent possible double free during `SPEECH RECOGNIZE`
### Commit List:
- res_pjsip: Change suppress_moh_on_sendonly to OPT_BOOL_T
- res_pjsip: Add new endpoint option "suppress_moh_on_sendonly"
- res_pjsip.c: Fix Contact header rendering for IPv6 addresses.
- samples: remove and/or change some wiki mentions
- func_pjsip_aor/contact: Fix documentation for contact ID
- res_pjsip: Move tenantid to end of ast_sip_endpoint
- pjsip_transport_events: handle multiple addresses for a domain
- func_evalexten: Add EVAL_SUB function.
- res_srtp: Change Unsupported crypto suite msg from verbose to debug
- Add res_pjsip_config_sangoma external module.
- app_mixmonitor: Add 'D' option for dual-channel audio.
- pjsip_transport_events: Avoid monitor destruction
- app_dial: Fix progress timeout calculation with no answer timeout.
- pjproject_bundled: Tweaks to support out-of-tree development
- core_unreal.c: Fix memory leak in ast_unreal_new_channels()
- dnsmgr.c: dnsmgr_refresh() incorrectly flags change with DNS round-robin
- geolocation.sample.conf: Fix comment marker at end of file
- func_base64.c: Ensure we set aside enough room for base64 encoded data.
- app_dial: Fix progress timeout.
- chan_dahdi: Never send MWI while off-hook.
- manager.c: Add unit test for Originate app and appdata permissions
- alembic: Drop redundant voicemail_messages index.
- res_agi.c: Ensure SIGCHLD handler functions are properly balanced.
- main, res, tests: Fix compilation errors on FreeBSD.
- res_rtp_asterisk: Fix dtls timer issues causing FRACKs and SEGVs
- manager.c: Restrict ModuleLoad to the configured modules directory.
- res_agi.c: Prevent possible double free during `SPEECH RECOGNIZE`
- cdr_custom: Allow absolute filenames.
- astfd.c: Avoid calling fclose with NULL argument.
- channel: Preserve CHANNEL(userfield) on masquerade.
- cel_custom: Allow absolute filenames.
- app_voicemail: Fix ill-formatted pager emails with custom subject.
- res_pjsip_pubsub: Persist subscription 'generator_data' in sorcery
- Fix application references to Background
- manager.conf.sample: Fix mathcing typo
- manager: Enhance event filtering for performance
- manager.c: Split XML documentation to manager_doc.xml
- db.c: Remove limit on family/key length
### Commit Details:
#### res_pjsip: Change suppress_moh_on_sendonly to OPT_BOOL_T
Author: George Joseph
Date: 2024-11-15
The suppress_moh_on_sendonly endpoint option should have been
defined as OPT_BOOL_T in pjsip_configuration.c and AST_BOOL_VALUES
in the alembic script instead of OPT_YESNO_T and YESNO_VALUES.
Also updated contrib/ast-db-manage/README.md to indicate that
AST_BOOL_VALUES should always be used and provided an example.
Resolves: #995
#### res_pjsip: Add new endpoint option "suppress_moh_on_sendonly"
Author: George Joseph
Date: 2024-11-05
Normally, when one party in a call sends Asterisk an SDP with
a "sendonly" or "inactive" attribute it means "hold" and causes
Asterisk to start playing MOH back to the other party. This can be
problematic if it happens at certain times, such as in a 183
Progress message, because the MOH will replace any early media you
may be playing to the calling party. If you set this option
to "yes" on an endpoint and the endpoint receives an SDP
with "sendonly" or "inactive", Asterisk will NOT play MOH back to
the other party.
Resolves: #979
UserNote: The new "suppress_moh_on_sendonly" endpoint option
can be used to prevent playing MOH back to a caller if the remote
end sends "sendonly" or "inactive" (hold) to Asterisk in an SDP.
#### res_pjsip.c: Fix Contact header rendering for IPv6 addresses.
Author: Sean Bright
Date: 2024-11-08
Fix suggested by @nvsystems.
Fixes #985
#### samples: remove and/or change some wiki mentions
Author: chrsmj
Date: 2024-11-01
Cleaned some dead links. Replaced word wiki with
either docs or link to https://docs.asterisk.org/
Resolves: #974
#### func_pjsip_aor/contact: Fix documentation for contact ID
Author: George Joseph
Date: 2024-11-09
Clarified the use of the contact ID returned from PJSIP_AOR.
Resolves: #990
#### res_pjsip: Move tenantid to end of ast_sip_endpoint
Author: George Joseph
Date: 2024-11-06
The tenantid field was originally added to the ast_sip_endpoint
structure at the end of the AST_DECLARE_STRING_FIELDS block. This
caused everything after it in the structure to move down in memory
and break ABI compatibility. It's now at the end of the structure
as an AST_STRING_FIELD_EXTENDED. Given the number of string fields
in the structure now, the initial string field allocation was
also increased from 64 to 128 bytes.
Resolves: #982
#### pjsip_transport_events: handle multiple addresses for a domain
Author: Thomas Guebels
Date: 2024-10-29
The key used for transport monitors was the remote host name for the
transport and not the remote address resolved for this domain.
This was problematic for domains returning multiple addresses as several
transport monitors were created with the same key.
Whenever a subsystem wanted to register a callback it would always end
up attached to the first transport monitor with a matching key.
The key used for transport monitors is now the remote address and port
the transport actually connected to.
Fixes: #932
#### func_evalexten: Add EVAL_SUB function.
Author: Naveen Albert
Date: 2024-10-17
This adds an EVAL_SUB function, which is similar to the existing
EVAL_EXTEN function but significantly more powerful, as it allows
executing arbitrary dialplan and capturing its return value as
the function's output. While EVAL_EXTEN should be preferred if it
is possible to use it, EVAL_SUB can be used in a wider variety
of cases and allows arbitrary computation to be performed in
a dialplan function call, leveraging the dialplan.
Resolves: #951
#### res_srtp: Change Unsupported crypto suite msg from verbose to debug
Author: George Joseph
Date: 2024-11-01
There's really no point in spamming logs with a verbose message
for every unsupported crypto suite an older client may send
in an SDP. If none are supported, there will be an error or
warning.
#### Add res_pjsip_config_sangoma external module.
Author: Ben Ford
Date: 2024-11-01
Adds res_pjsip_config_sangoma as an external module that can be
downloaded via menuselect. It lives under the Resource Modules section.
#### app_mixmonitor: Add 'D' option for dual-channel audio.
Author: Ben Ford
Date: 2024-10-28
Adds the 'D' option to app_mixmonitor that interleaves the input and
output frames of the channel being recorded in the monitor output frame.
This allows for two streams in the recording: the transmitted audio and
the received audio. The 't' and 'r' options are compatible with this.
Fixes: #945
UserNote: The MixMonitor application now has a new 'D' option which
interleaves the recorded audio in the output frames. This allows for
stereo recording output with one channel being the transmitted audio and
the other being the received audio. The 't' and 't' options are
compatible with this.
#### pjsip_transport_events: Avoid monitor destruction
Author: Thomas Guebels
Date: 2024-10-28
When a transport is disconnected, several events can arrive following
each other. The first event will be PJSIP_TP_STATE_DISCONNECT and it
will trigger the destruction of the transport monitor object. The lookup
for the transport monitor to destroy is done using the transport key,
that contains the transport destination host:port.
A reconnect attempt by pjsip will be triggered as soon something needs to
send a packet using that transport. This can happen directly after a
disconnect since ca
Subsequent events can arrive later like PJSIP_TP_STATE_DESTROY and will
also try to trigger the destruction of the transport monitor if not
already done. Since the lookup for the transport monitor to destroy is
done using the transport key, it can match newly created transports
towards the same destination and destroy their monitor object.
Because of this, it was sometimes not possible to monitor a transport
after one or more disconnections.
This fix adds an additional check on the transport pointer to ensure
only a monitor for that specific transport is removed.
Fixes: #923
#### app_dial: Fix progress timeout calculation with no answer timeout.
Author: Naveen Albert
Date: 2024-10-16
If to_answer is -1, simply comparing to see if the progress timeout
is smaller than the answer timeout to prefer it will fail. Add
an additional check that chooses the progress timeout if there is
no answer timeout (or as before, if the progress timeout is smaller).
Resolves: #821
#### pjproject_bundled: Tweaks to support out-of-tree development
Author: George Joseph
Date: 2024-10-17
* pjproject is now configured with --disable-libsrtp so it will
build correctly when doing "out-of-tree" development. Asterisk
doesn't use pjproject for handling media so pjproject doesn't
need libsrtp itself.
* The pjsua app (which we used to use for the testsuite) no longer
builds in pjproject's master branch so we just skip it. The
testsuite no longer needs it anyway.
See third-party/pjproject/README-hacking.md for more info on building
pjproject "out-of-tree".
#### Revert "res_rtp_asterisk: Count a roll-over of the sequence number even on los..
Author: Sean Bright
Date: 2024-10-07
This reverts commit cb5e3445be6c55517c8d05aca601b648341f8ae9.
The original change from 16 to 15 bit sequence numbers was predicated
on the following from the now-defunct libSRTP FAQ on sourceforge.net:
> *Q6. The use of implicit synchronization via ROC seems
> dangerous. Can senders and receivers lose ROC synchronization?*
>
> **A.** It is possible to lose ROC synchronization between sender and
> receiver(s), though it is not likely in practice, and practical
> steps can be taken to avoid it. A burst loss of 2^16 packets or more
> will always break synchronization. For example, a conversational
> voice codec that sends 50 packets per second will have its ROC
> increment about every 22 minutes. A network with a burst of packet
> loss that long has problems other than ROC synchronization.
>
> There is a higher sensitivity to loss at the very outset of an SRTP
> stream. If the sender's initial sequence number is close to the
> maximum value of 2^16-1, and all packets are lost from the initial
> packet until the sequence number cycles back to zero, the sender
> will increment its ROC, but the receiver will not. The receiver
> cannot determine that the initial packets were lost and that
> sequence-number rollover has occurred. In this case, the receiver's
> ROC would be zero whereas the sender's ROC would be one, while their
> sequence numbers would be so close that the ROC-guessing algorithm
> could not detect this fact.
>
> There is a simple solution to this problem: the SRTP sender should
> randomly select an initial sequence number that is always less than
> 2^15. This ensures correct SRTP operation so long as fewer than 2^15
> initial packets are lost in succession, which is within the maximum
> tolerance of SRTP packet-index determination (see Appendix A and
> page 14, first paragraph of RFC 3711). An SRTP receiver should
> carefully implement the index-guessing algorithm. A naive
> implementation can unintentionally guess the value of
> 0xffffffffffffLL whenever the SEQ in the packet is greater than 2^15
> and the locally stored SEQ and ROC are zero. (This can happen when
> the implementation fails to treat those zero values as a special
> case.)
>
> When ROC synchronization is lost, the receiver will not be able to
> properly process the packets. If anti-replay protection is turned
> on, then the desynchronization will appear as a burst of replay
> check failures. Otherwise, if authentication is being checked, then
> it will appear as a burst of authentication failures. Otherwise, if
> encryption is being used, the desynchronization may not be detected
> by the SRTP layer, and the packets may be improperly decrypted.
However, modern libSRTP (as of 1.0.1[1]) now mentions the following in
their README.md[2]:
> The sequence number in the rtp packet is used as the low 16 bits of
> the sender's local packet index. Note that RTP will start its
> sequence number in a random place, and the SRTP layer just jumps
> forward to that number at its first invocation. An earlier version
> of this library used initial sequence numbers that are less than
> 32,768; this trick is no longer required as the
> rdbx_estimate_index(...) function has been made smarter.
So truncating our initial sequence number to 15 bit is no longer
necessary.
1. https://github.com/cisco/libsrtp/blob/0eb007f0dc611f27cbfe0bf9855ed85182496cec/CHANGES#L271-L289
2. https://github.com/cisco/libsrtp/blob/2de20dd9e9c8afbaf02fcf5d4048ce1ec9ddc0ae/README.md#implementation-notes
#### core_unreal.c: Fix memory leak in ast_unreal_new_channels()
Author: George Joseph
Date: 2024-10-15
When the channel tech is multistream capable, the reference to
chan_topology was passed to the new channel. When the channel tech
isn't multistream capable, the reference to chan_topology was never
released. "Local" channels are multistream capable so it didn't
affect them but the confbridge "CBAnn" and the bridge_media
"Recorder" channels are not so they caused a leak every time one
of them was created.
Also added tracing to ast_stream_topology_alloc() and
stream_topology_destroy() to assist with debugging.
Resolves: #938
#### dnsmgr.c: dnsmgr_refresh() incorrectly flags change with DNS round-robin
Author: Allan Nathanson
Date: 2024-09-29
The dnsmgr_refresh() function checks to see if the IP address associated
with a name/service has changed. The gotcha is that the ast_get_ip_or_srv()
function only returns the first IP address returned by the DNS query. If
there are multiple IPs associated with the name and the returned order is
not consistent (e.g. with DNS round-robin) then the other IP addresses are
not included in the comparison and the entry is flagged as changed even
though the IP is still valid.
Updated the code to check all IP addresses and flag a change only if the
original IP is no longer valid.
Resolves: #924
#### geolocation.sample.conf: Fix comment marker at end of file
Author: George Joseph
Date: 2024-10-08
Resolves: #937
#### func_base64.c: Ensure we set aside enough room for base64 encoded data.
Author: Sean Bright
Date: 2024-10-08
Reported by SingularTricycle on IRC.
Fixes #940
#### app_dial: Fix progress timeout.
Author: Naveen Albert
Date: 2024-10-03
Under some circumstances, the progress timeout feature added in commit
320c98eec87c473bfa814f76188a37603ea65ddd does not work as expected,
such as if there is no media flowing. Adjust the waitfor call to
explicitly use the progress timeout if it would be reached sooner than
the answer timeout to ensure we handle the timers properly.
Resolves: #821
#### chan_dahdi: Never send MWI while off-hook.
Author: Naveen Albert
Date: 2024-10-01
In some circumstances, it is possible for the do_monitor thread to
erroneously think that a line is on-hook and send an MWI FSK spill
to it when the line is really off-hook and no MWI should be sent.
Commit 0a8b3d34673277b70be6b0e8ac50191b1f3c72c6 previously fixed this
issue in a more readily encountered scenario, but it has still been
possible for MWI to be sent when it shouldn't be. To robustly fix
this issue, query DAHDI for the hook status to ensure we don't send
MWI on a line that is actually still off hook.
Resolves: #928
#### manager.c: Add unit test for Originate app and appdata permissions
Author: George Joseph
Date: 2024-10-03
This unit test checks that dialplan apps and app data specified
as parameters for the Originate action are allowed with the
permissions the user has.
#### alembic: Drop redundant voicemail_messages index.
Author: Sean Bright
Date: 2024-09-26
The `voicemail_messages_dir` index is a left prefix of the table's
primary key and therefore unnecessary.
#### res_agi.c: Ensure SIGCHLD handler functions are properly balanced.
Author: Sean Bright
Date: 2024-09-30
Calls to `ast_replace_sigchld()` and `ast_unreplace_sigchld()` must be
balanced to ensure that we can capture the exit status of child
processes when we need to. This extends to functions that call
`ast_replace_sigchld()` and `ast_unreplace_sigchld()` such as
`ast_safe_fork()` and `ast_safe_fork_cleanup()`.
The primary change here is ensuring that we do not call
`ast_safe_fork_cleanup()` in `res_agi.c` if we have not previously
called `ast_safe_fork()`.
Additionally we reinforce some of the documentation and add an
assertion to, ideally, catch this sooner were this to happen again.
Fixes #922
#### main, res, tests: Fix compilation errors on FreeBSD.
Author: Naveen Albert
Date: 2024-09-29
asterisk.c, manager.c: Increase buffer sizes to avoid truncation warnings.
config.c: Include header file for WIFEXITED/WEXITSTATUS macros.
res_timing_kqueue: Use more portable format specifier.
test_crypto: Use non-linux limits.h header file.
Resolves: #916
#### res_rtp_asterisk: Fix dtls timer issues causing FRACKs and SEGVs
Author: George Joseph
Date: 2024-09-16
In dtls_srtp_handle_timeout(), when DTLSv1_get_timeout() returned
success but with a timeout of 0, we were stopping the timer and
decrementing the refcount on instance but not resetting the
timeout_timer to -1. When dtls_srtp_stop_timeout_timer()
was later called, it was atempting to stop a stale timer and could
decrement the refcount on instance again which would then cause
the instance destructor to run early. This would result in either
a FRACK or a SEGV when ast_rtp_stop(0 was called.
According to the OpenSSL docs, we shouldn't have been stopping the
timer when DTLSv1_get_timeout() returned success and the new timeout
was 0 anyway. We should have been calling DTLSv1_handle_timeout()
again immediately so we now reschedule the timer callback for
1ms (almost immediately).
Additionally, instead of scheduling the timer callback at a fixed
interval returned by the initial call to DTLSv1_get_timeout()
(usually 999 ms), we now reschedule the next callback based on
the last call to DTLSv1_get_timeout().
Resolves: #487
#### manager.c: Restrict ModuleLoad to the configured modules directory.
Author: Ben Ford
Date: 2024-09-25
When using the ModuleLoad AMI action, it was possible to traverse
upwards through the directories to files outside of the configured
modules directory. We decided it would be best to restrict access to
modules exclusively in the configured directory. You will now get an
error when the specified module is outside of this limitation.
Fixes: #897
UserNote: The ModuleLoad AMI action now restricts modules to the
configured modules directory.
#### res_agi.c: Prevent possible double free during `SPEECH RECOGNIZE`
Author: jiangxc
Date: 2024-07-17
When using the speech recognition module, crashes can occur
sporadically due to a "double free or corruption (out)" error. Now, in
the section where the audio stream is being captured in a loop, each
time after releasing fr, it is set to NULL to prevent repeated
deallocation.
Fixes #772
#### cdr_custom: Allow absolute filenames.
Author: Sean Bright
Date: 2024-09-26
A follow up to #893 that brings the same functionality to
cdr_custom. Also update the sample configuration files to note support
for absolute paths.
#### astfd.c: Avoid calling fclose with NULL argument.
Author: Naveen Albert
Date: 2024-09-24
Don't pass through a NULL argument to fclose, which is undefined
behavior, and instead return -1 and set errno appropriately. This
also avoids a compiler warning with glibc 2.38 and newer, as glibc
commit 71d9e0fe766a3c22a730995b9d024960970670af
added the nonnull attribute to this argument.
Resolves: #900
#### channel: Preserve CHANNEL(userfield) on masquerade.
Author: Peter Jannesen
Date: 2024-09-20
In certain circumstances a channel may undergo an operation
referred to as a masquerade. If this occurs the CHANNEL(userfield)
value was not preserved causing it to get lost. This change makes
it so that this field is now preserved.
Fixes: #882
#### cel_custom: Allow absolute filenames.
Author: Peter Jannesen
Date: 2024-09-20
If a filename starts with a '/' in cel_custom [mappings] assume it is
a absolute file path and not relative filename/path to
AST_LOG_DIR/cel_custom/
#### app_voicemail: Fix ill-formatted pager emails with custom subject.
Author: Naveen Albert
Date: 2024-09-24
Add missing end-of-headers newline to pager emails with custom
subjects, since this was missing from this code path.
Resolves: #902
#### res_pjsip_pubsub: Persist subscription 'generator_data' in sorcery
Author: Sean Bright
Date: 2024-09-23
Fixes #895
#### Fix application references to Background
Author: George Joseph
Date: 2024-09-20
The app is actually named "BackGround" but several references
in XML documentation were spelled "Background" with the lower
case "g". This was causing documentation links to return
"not found" messages.
#### manager.conf.sample: Fix mathcing typo
Author: George Joseph
Date: 2024-09-24
#### manager: Enhance event filtering for performance
Author: George Joseph
Date: 2024-07-31
UserNote: You can now perform more granular filtering on events
in manager.conf using expressions like
`eventfilter(name(Newchannel),header(Channel),method(starts_with)) = PJSIP/`
This is much more efficient than
`eventfilter = Event: Newchannel.*Channel: PJSIP/`
Full syntax guide is in configs/samples/manager.conf.sample.
#### manager.c: Split XML documentation to manager_doc.xml
Author: George Joseph
Date: 2024-08-01
#### db.c: Remove limit on family/key length
Author: George Joseph
Date: 2024-09-11
Consumers like media_cache have been running into issues with
the previous astdb "/family/key" limit of 253 bytes when needing
to store things like long URIs. An Amazon S3 URI is a good example
of this. Now, instead of using a static 256 byte buffer for
"/family/key", we use ast_asprintf() to dynamically create it.
Both test_db.c and test_media_cache.c were also updated to use
keys/URIs over the old 253 character limit.
Resolves: #881
UserNote: The `ast_db_*()` APIs have had the 253 byte limit on
"/family/key" removed and will now accept families and keys with a
total length of up to SQLITE_MAX_LENGTH (currently 1e9!). This
affects the `DB*` dialplan applications, dialplan functions,
manager actions and `databse` CLI commands. Since the
media_cache also uses the `ast_db_*()` APIs, you can now store
resources with URIs longer than 253 bytes.

View File

@@ -0,0 +1,65 @@
## Change Log for Release asterisk-22.1.1
### Links:
- [Full ChangeLog](https://downloads.asterisk.org/pub/telephony/asterisk/releases/ChangeLog-22.1.1.md)
- [GitHub Diff](https://github.com/asterisk/asterisk/compare/22.1.0...22.1.1)
- [Tarball](https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22.1.1.tar.gz)
- [Downloads](https://downloads.asterisk.org/pub/telephony/asterisk)
### Summary:
- Commits: 1
- Commit Authors: 1
- Issues Resolved: 0
- Security Advisories Resolved: 1
- [GHSA-33x6-fj46-6rfh](https://github.com/asterisk/asterisk/security/advisories/GHSA-33x6-fj46-6rfh): Path traversal via AMI ListCategories allows access to outside files
### User Notes:
- #### manager.c: Restrict ListCategories to the configuration directory.
The ListCategories AMI action now restricts files to the
configured configuration directory.
### Upgrade Notes:
### Commit Authors:
- Ben Ford: (1)
## Issue and Commit Detail:
### Closed Issues:
- !GHSA-33x6-fj46-6rfh: Path traversal via AMI ListCategories allows access to outside files
### Commits By Author:
- #### Ben Ford (1):
- manager.c: Restrict ListCategories to the configuration directory.
### Commit List:
- manager.c: Restrict ListCategories to the configuration directory.
### Commit Details:
#### manager.c: Restrict ListCategories to the configuration directory.
Author: Ben Ford
Date: 2024-12-17
When using the ListCategories AMI action, it was possible to traverse
upwards through the directories to files outside of the configured
configuration directory. This action is now restricted to the configured
directory and an error will now be returned if the specified file is
outside of this limitation.
Resolves: #GHSA-33x6-fj46-6rfh
UserNote: The ListCategories AMI action now restricts files to the
configured configuration directory.

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,562 @@
<html><head><title>ChangeLog for asterisk-22.3.0</title></head><body>
<h2>Change Log for Release asterisk-22.3.0</h2>
<h3>Links:</h3>
<ul>
<li><a href="https://downloads.asterisk.org/pub/telephony/asterisk/releases/ChangeLog-22.3.0.html">Full ChangeLog</a> </li>
<li><a href="https://github.com/asterisk/asterisk/compare/22.2.0...22.3.0">GitHub Diff</a> </li>
<li><a href="https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22.3.0.tar.gz">Tarball</a> </li>
<li><a href="https://downloads.asterisk.org/pub/telephony/asterisk">Downloads</a> </li>
</ul>
<h3>Summary:</h3>
<ul>
<li>Commits: 28</li>
<li>Commit Authors: 12</li>
<li>Issues Resolved: 12</li>
<li>Security Advisories Resolved: 0</li>
</ul>
<h3>User Notes:</h3>
<ul>
<li>
<h4>ari/pjsip: Make it possible to control transfers through ARI</h4>
Call transfers on the PJSIP channel can now be controlled by
ARI. This can be enabled by using the PJSIP_TRANSFER_HANDLING(ari-only)
dialplan function.</li>
</ul>
<h3>Upgrade Notes:</h3>
<h3>Commit Authors:</h3>
<ul>
<li>Allan Nathanson: (1)</li>
<li>Ben Ford: (1)</li>
<li>Fabriziopicconi: (1)</li>
<li>George Joseph: (10)</li>
<li>Holger Hans Peter Freyther: (1)</li>
<li>Jeremy Lainé: (1)</li>
<li>Joshua Elson: (1)</li>
<li>Luz Paz: (3)</li>
<li>Maximilian Fridrich: (1)</li>
<li>Mike Bradeen: (1)</li>
<li>Naveen Albert: (1)</li>
<li>Sean Bright: (6)</li>
</ul>
<h2>Issue and Commit Detail:</h2>
<h3>Closed Issues:</h3>
<ul>
<li>211: [bug]: stasis: Off-nominal channel leave causes bridge to be destroyed</li>
<li>1085: [bug]: utils: Compilation failure with DEVMODE due to old-style definitions</li>
<li>1101: [bug]: when setting a var with a double quotes and using Set(HASH)</li>
<li>1109: [bug]: Off nominal memory leak in res/ari/resource_channels.c</li>
<li>1112: [bug]: STIR/SHAKEN verification doesn't allow anonymous callerid to be passed to the dialplan.</li>
<li>1119: [bug]: Realtime database not working after upgrade from 22.0.0 to 22.2.0</li>
<li>1122: Need status on CVE-2024-57520 claim.</li>
<li>1124: [bug]: Race condition between bridge and channel delete can over-write cause code set in hangup.</li>
<li>1131: [bug]: CHANGES link broken in README.md</li>
<li>1135: [bug]: Problems with video decoding due to RTP marker bit set</li>
<li>1149: [bug]: res_pjsip: Mismatch in tcp_keepalive_enable causes not to enable</li>
<li>1164: [bug]: WARNING Message in messages.log for res_curl.conf [globals]</li>
</ul>
<h3>Commits By Author:</h3>
<ul>
<li>
<h4>Allan Nathanson (1):</h4>
</li>
<li>
<p>config.c: #include of non-existent file should not crash</p>
</li>
<li>
<h4>Ben Ford (1):</h4>
</li>
<li>
<p>documentation: Update Gosub, Goto, and add new documentationtype.</p>
</li>
<li>
<h4>George Joseph (10):</h4>
</li>
<li>docs: Add version information to ARI resources and methods.</li>
<li>docs: Add version information to AGI command XML elements.</li>
<li>func_strings.c: Prevent SEGV in HASH single-argument mode.</li>
<li>resource_channels.c: Fix memory leak in ast_ari_channels_external_media.</li>
<li>res_stir_shaken: Allow missing or anonymous CID to continue to the dialplan.</li>
<li>res_config_pgsql: Fix regression that removed dbname config.</li>
<li>bridging: Fix multiple bridging issues causing SEGVs and FRACKs.</li>
<li>swagger_model.py: Fix invalid escape sequence in get_list_parameter_type().</li>
<li>manager.c: Check for restricted file in action_createconfig.</li>
<li>
<p>README.md: Updates and Fixes</p>
</li>
<li>
<h4>Holger Hans Peter Freyther (1):</h4>
</li>
<li>
<p>ari/pjsip: Make it possible to control transfers through ARI</p>
</li>
<li>
<h4>Jeremy Lainé (1):</h4>
</li>
<li>
<p>docs: Fix minor typo in MixMonitor AMI action</p>
</li>
<li>
<h4>Joshua Elson (1):</h4>
</li>
<li>
<p>fix: Correct default flag for tcp_keepalive_enable option</p>
</li>
<li>
<h4>Luz Paz (3):</h4>
</li>
<li>docs: Fix various typos in main/ Found via `codespell -q 3 -S "./CREDITS" -L a..</li>
<li>docs: Fix various typos in channels/ Found via `codespell -q 3 -S "./CREDITS,*..</li>
<li>
<p>docs: Fix typos in cdr/ Found via codespell</p>
</li>
<li>
<h4>Maximilian Fridrich (1):</h4>
</li>
<li>
<p>Revert "res_rtp_asterisk.c: Set Mark on rtp when timestamp skew is too big"</p>
</li>
<li>
<h4>Mike Bradeen (1):</h4>
</li>
<li>
<p>bridge_channel: don't set cause code on channel during bridge delete if alread..</p>
</li>
<li>
<h4>Naveen Albert (1):</h4>
</li>
<li>
<p>utils: Disable old style definition warnings for libdb.</p>
</li>
<li>
<h4>Sean Bright (6):</h4>
</li>
<li>docs: Indent <since> tags.</li>
<li>channel.c: Remove dead AST_GENERATOR_FD code.</li>
<li>res_rtp_asterisk.c: Use correct timeout value for T.140 RED timer.</li>
<li>docs: AMI documentation fixes.</li>
<li>res_rtp_asterisk.c: Don't truncate spec-compliant <code>ice-ufrag</code> or <code>ice-pwd</code>.</li>
<li>
<p>res_config_curl.c: Remove unnecessary warnings.</p>
</li>
<li>
<h4>fabriziopicconi (1):</h4>
</li>
<li>rtp.conf.sample: Correct stunaddr example.</li>
</ul>
<h3>Commit List:</h3>
<ul>
<li>documentation: Update Gosub, Goto, and add new documentationtype.</li>
<li>res_config_curl.c: Remove unnecessary warnings.</li>
<li>README.md: Updates and Fixes</li>
<li>res_rtp_asterisk.c: Don't truncate spec-compliant <code>ice-ufrag</code> or <code>ice-pwd</code>.</li>
<li>fix: Correct default flag for tcp_keepalive_enable option</li>
<li>docs: AMI documentation fixes.</li>
<li>config.c: #include of non-existent file should not crash</li>
<li>manager.c: Check for restricted file in action_createconfig.</li>
<li>swagger_model.py: Fix invalid escape sequence in get_list_parameter_type().</li>
<li>Revert "res_rtp_asterisk.c: Set Mark on rtp when timestamp skew is too big"</li>
<li>res_rtp_asterisk.c: Use correct timeout value for T.140 RED timer.</li>
<li>docs: Fix typos in cdr/ Found via codespell</li>
<li>bridging: Fix multiple bridging issues causing SEGVs and FRACKs.</li>
<li>res_config_pgsql: Fix regression that removed dbname config.</li>
<li>res_stir_shaken: Allow missing or anonymous CID to continue to the dialplan.</li>
<li>resource_channels.c: Fix memory leak in ast_ari_channels_external_media.</li>
<li>ari/pjsip: Make it possible to control transfers through ARI</li>
<li>channel.c: Remove dead AST_GENERATOR_FD code.</li>
<li>func_strings.c: Prevent SEGV in HASH single-argument mode.</li>
<li>docs: Add version information to AGI command XML elements.</li>
<li>docs: Fix minor typo in MixMonitor AMI action</li>
<li>utils: Disable old style definition warnings for libdb.</li>
<li>rtp.conf.sample: Correct stunaddr example.</li>
<li>docs: Add version information to ARI resources and methods.</li>
<li>docs: Indent <since> tags.</li>
</ul>
<h3>Commit Details:</h3>
<h4>documentation: Update Gosub, Goto, and add new documentationtype.</h4>
<p>Author: Ben Ford
Date: 2025-03-14</p>
<p>Gosub and Goto were not displaying their syntax correctly on the docs
site. This change adds a new way to specify an optional context, an
optional extension, and a required priority that the xml stylesheet can
parse without having to know which optional parameters come in which
order. In Asterisk, it looks like this:</p>
<pre><code>parameter name="context" documentationtype="dialplan_context"
parameter name="extension" documentationtype="dialplan_extension"
parameter name="priority" documentationtype="dialplan_priority" required="true"
</code></pre>
<p>The stylesheet will ignore the context and extension parameters, but for
priority, it will automatically inject the following:</p>
<pre><code>[[context,]extension,]priority
</code></pre>
<p>This is the correct oder for applications such as Gosub and Goto.</p>
<h4>res_config_curl.c: Remove unnecessary warnings.</h4>
<p>Author: Sean Bright
Date: 2025-03-17</p>
<p>Resolves: #1164</p>
<h4>README.md: Updates and Fixes</h4>
<p>Author: George Joseph
Date: 2025-03-05</p>
<ul>
<li>Outdated information has been removed.</li>
<li>New links added.</li>
<li>Placeholder added for link to change logs.</li>
</ul>
<p>Going forward, the release process will create HTML versions of the README
and change log and will update the link in the README to the current
change log for the branch...</p>
<ul>
<li>In the development branches, the link will always point to the current
release on GitHub.</li>
<li>In the "releases/*" branches and the tarballs, the link will point to the
ChangeLogs/ChangeLog-<version>.html file in the source directory.</li>
<li>On the downloads website, the link will point to the
ChangeLog-<version>.html file in the same directory.</li>
</ul>
<p>Resolves: #1131</p>
<h4>res_rtp_asterisk.c: Don't truncate spec-compliant <code>ice-ufrag</code> or <code>ice-pwd</code>.</h4>
<p>Author: Sean Bright
Date: 2025-03-07</p>
<p>RFC 8839[1] indicates that the <code>ice-ufrag</code> and <code>ice-pwd</code> attributes
can be up to 256 bytes long. While we don't generate values of that
size, we should be able to accomodate them without truncating.</p>
<ol>
<li>https://www.rfc-editor.org/rfc/rfc8839#name-ice-ufrag-and-ice-pwd-attri</li>
</ol>
<h4>fix: Correct default flag for tcp_keepalive_enable option</h4>
<p>Author: Joshua Elson
Date: 2025-03-06</p>
<p>Resolves an issue where the tcp_keepalive_enable option was not properly enabled in the sample configuration due to an incorrect default flag setting.</p>
<p>Fixes: #1149</p>
<h4>docs: AMI documentation fixes.</h4>
<p>Author: Sean Bright
Date: 2025-02-18</p>
<p>Most of this patch is adding missing PJSIP-related event
documentation, but the one functional change was adding a sorcery
to-string handler for endpoint's <code>redirect_method</code> which was not
showing up in the AMI event details or <code>pjsip show endpoint
&lt;endpoint&gt;</code> output.</p>
<p>The rest of the changes are summarized below:</p>
<ul>
<li>app_agent_pool.c: Typo fix Epoche -&gt; Epoch.</li>
<li>stasis_bridges.c: Add missing AttendedTransfer properties.</li>
<li>stasis_channels.c: Add missing AgentLogoff properties.</li>
<li>pjsip_manager.xml:<ul>
<li>Add missing AorList properties.</li>
<li>Add missing AorDetail properties.</li>
<li>Add missing ContactList properties.</li>
<li>Add missing ContactStatusDetail properties.</li>
<li>Add missing EventDetail properties.</li>
<li>Add missing AuthList properties.</li>
<li>Add missing AuthDetail properties.</li>
<li>Add missing TransportDetail properties.</li>
<li>Add missing EndpointList properties.</li>
<li>Add missing IdentifyDetail properties.</li>
</ul>
</li>
<li>res_pjsip_registrar.c: Add missing InboundRegistrationDetail documentation.</li>
<li>res_pjsip_pubsub.c:<ul>
<li>Add missing ResourceListDetail documentation.</li>
<li>Add missing InboundSubscriptionDetail documentation.</li>
<li>Add missing OutboundSubscriptionDetail documentation.</li>
</ul>
</li>
<li>res_pjsip_outbound_registration.c: Add missing OutboundRegistrationDetail documentation.</li>
</ul>
<h4>config.c: #include of non-existent file should not crash</h4>
<p>Author: Allan Nathanson
Date: 2025-03-03</p>
<p>Corrects a segmentation fault when a configuration file has a #include
statement that referenced a file that does not exist.</p>
<p>Resolves: https://github.com/asterisk/asterisk/issues/1139</p>
<h4>manager.c: Check for restricted file in action_createconfig.</h4>
<p>Author: George Joseph
Date: 2025-03-03</p>
<p>The <code>CreateConfig</code> manager action now ensures that a config file can
only be created in the AST_CONFIG_DIR unless <code>live_dangerously</code> is set.</p>
<p>Resolves: #1122</p>
<h4>swagger_model.py: Fix invalid escape sequence in get_list_parameter_type().</h4>
<p>Author: George Joseph
Date: 2025-03-04</p>
<p>Recent python versions complain when backslashes in strings create invalid
escape sequences. This causes issues for strings used as regex patterns like
<code>'^List\[(.*)\]$'</code> where you want the regex parser to treat <code>[</code> and <code>]</code>
as literals. Double-backslashing is one way to fix it but simply converting
the string to a raw string <code>re.match(r'^List\[(.*)\]$', text)</code> is easier
and less error prone.</p>
<h4>Revert "res_rtp_asterisk.c: Set Mark on rtp when timestamp skew is too big"</h4>
<p>Author: Maximilian Fridrich
Date: 2025-02-28</p>
<p>This reverts commit f30ad96b3f467739c38ff415e80bffc4afff1da7.</p>
<p>The original change was not RFC compliant and caused issues because it
set the RTP marker bit in cases when it shouldn't be set. See the
linked issue #1135 for a detailed explanation.</p>
<p>Fixes: #1135.</p>
<h4>res_rtp_asterisk.c: Use correct timeout value for T.140 RED timer.</h4>
<p>Author: Sean Bright
Date: 2025-02-24</p>
<p>Found while reviewing #1128</p>
<h4>docs: Fix typos in cdr/ Found via codespell</h4>
<p>Author: Luz Paz
Date: 2025-02-12</p>
<h4>docs: Fix various typos in channels/ Found via `codespell -q 3 -S "./CREDITS,*..</h4>
<p>Author: Luz Paz
Date: 2025-02-04</p>
<h4>docs: Fix various typos in main/ Found via `codespell -q 3 -S "./CREDITS" -L a..</h4>
<p>Author: Luz Paz
Date: 2025-02-04</p>
<h4>bridging: Fix multiple bridging issues causing SEGVs and FRACKs.</h4>
<p>Author: George Joseph
Date: 2025-01-22</p>
<p>Issues:</p>
<ul>
<li>
<p>The bridging core allowed multiple bridges to be created with the same
unique bridgeId at the same time. Only the last bridge created with the
duplicate name was actually saved to the core bridges container.</p>
</li>
<li>
<p>The bridging core was creating a stasis topic for the bridge and saving it
in the bridge-&gt;topic field but not increasing its reference count. In the
case where two bridges were created with the same uniqueid (which is also
the topic name), the second bridge would get the <em>existing</em> topic the first
bridge created. When the first bridge was destroyed, it would take the
topic with it so when the second bridge attempted to publish a message to
it it either FRACKed or SEGVd.</p>
</li>
<li>
<p>The bridge destructor, which also destroys the bridge topic, is run from the
bridge manager thread not the caller's thread. This makes it possible for
an ARI developer to create a new one with the same uniqueid believing the
old one was destroyed when, in fact, the old one's destructor hadn't
completed. This could cause the new bridge to get the old one's topic just
before the topic was destroyed. When the new bridge attempted to publish
a message on that topic, asterisk could either FRACK or SEGV.</p>
</li>
<li>
<p>The ARI bridges resource also allowed multiple bridges to be created with
the same uniqueid but it kept the duplicate bridges in its app_bridges
container. This created a situation where if you added two bridges with
the same "bridge1" uniqueid, all operations on "bridge1" were performed on
the first bridge created and the second was basically orphaned. If you
attempted to delete what you thought was the second bridge, you actually
deleted the first one created.</p>
</li>
</ul>
<p>Changes:</p>
<ul>
<li>
<p>A new API <code>ast_bridge_topic_exists(uniqueid)</code> was created to determine if
a topic already exists for a bridge.</p>
</li>
<li>
<p><code>bridge_base_init()</code> in bridge.c and <code>ast_ari_bridges_create()</code> in
resource_bridges.c now call <code>ast_bridge_topic_exists(uniqueid)</code> to check
if a bridge with the requested uniqueid already exists and will fail if it
does.</p>
</li>
<li>
<p><code>bridge_register()</code> in bridges.c now checks the core bridges container to
make sure a bridge doesn't already exist with the requested uniqueid.
Although most callers of <code>bridge_register()</code> will have already called
<code>bridge_base_init()</code>, which will now fail on duplicate bridges, there
is no guarantee of this so we must check again.</p>
</li>
<li>
<p>The core bridges container allocation was changed to reject duplicate
uniqueids instead of silently replacing an existing one. This is a "belt
and suspenders" check.</p>
</li>
<li>
<p>A global mutex was added to bridge.c to prevent concurrent calls to
<code>bridge_base_init()</code> and <code>bridge_register()</code>.</p>
</li>
<li>
<p>Even though you can no longer create multiple bridges with the same uniqueid
at the same time, it's still possible that the bridge topic might be
destroyed while a second bridge with the same uniqueid was trying to use
it. To address this, the bridging core now increments the reference count
on bridge-&gt;topic when a bridge is created and decrements it when the
bridge is destroyed.</p>
</li>
<li>
<p><code>bridge_create_common()</code> in res_stasis.c now checks the stasis app_bridges
container to make sure a bridge with the requested uniqueid doesn't already
exist. This may seem like overkill but there are so many entrypoints to
bridge creation that we need to be safe and catch issues as soon in the
process as possible.</p>
</li>
<li>
<p>The stasis app_bridges container allocation was changed to reject duplicate
uniqueids instead of adding them. This is a "belt and suspenders" check.</p>
</li>
<li>
<p>The <code>bridge show all</code> CLI command now shows the bridge name as well as the
bridge id.</p>
</li>
<li>
<p>Response code 409 "Conflict" was added as a possible response from the ARI
bridge create resources to signal that a bridge with the requested uniqueid
already exists.</p>
</li>
<li>
<p>Additional debugging was added to multiple bridging and stasis files.</p>
</li>
</ul>
<p>Resolves: #211</p>
<h4>bridge_channel: don't set cause code on channel during bridge delete if alread..</h4>
<p>Author: Mike Bradeen
Date: 2025-02-18</p>
<p>Due to a potential race condition via ARI when hanging up a channel hangup with cause
while also deleting a bridge containing that channel, the bridge delete can over-write
the hangup cause code resulting in Normal Call Clearing instead of the set value.</p>
<p>With this change, bridge deletion will only set the hangup code if it hasn't been
previously set.</p>
<p>Resolves: #1124</p>
<h4>res_config_pgsql: Fix regression that removed dbname config.</h4>
<p>Author: George Joseph
Date: 2025-02-11</p>
<p>A recent commit accidentally removed the code that sets dbname.
This commit adds it back in.</p>
<p>Resolves: #1119</p>
<h4>res_stir_shaken: Allow missing or anonymous CID to continue to the dialplan.</h4>
<p>Author: George Joseph
Date: 2025-02-05</p>
<p>The verification check for missing or anonymous callerid was happening before
the endpoint's profile was retrieved which meant that the failure_action
parameter wasn't available. Therefore, if verification was enabled and there
was no callerid or it was "anonymous", the call was immediately terminated
instead of giving the dialplan the ability to decide what to do with the call.</p>
<ul>
<li>
<p>The callerid check now happens after the verification context is created and
the endpoint's stir_shaken_profile is available.</p>
</li>
<li>
<p>The check now processes the callerid failure just as it does for other
verification failures and respects the failure_action parameter. If set
to "continue" or "continue_return_reason", <code>STIR_SHAKEN(0,verify_result)</code>
in the dialplan will return "invalid_or_no_callerid".</p>
</li>
<li>
<p>If the endpoint's failure_action is "reject_request", the call will be
rejected with <code>433 "Anonymity Disallowed"</code>.</p>
</li>
<li>
<p>If the endpoint's failure_action is "continue_return_reason", the call will
continue but a <code>Reason: STIR; cause=433; text="Anonymity Disallowed"</code>
header will be added to the next provisional or final response.</p>
</li>
</ul>
<p>Resolves: #1112</p>
<h4>resource_channels.c: Fix memory leak in ast_ari_channels_external_media.</h4>
<p>Author: George Joseph
Date: 2025-02-04</p>
<p>Between ast_ari_channels_external_media(), external_media_rtp_udp(),
and external_media_audiosocket_tcp(), the <code>variables</code> structure being passed
around wasn't being cleaned up properly when there was a failure.</p>
<ul>
<li>
<p>In ast_ari_channels_external_media(), the <code>variables</code> structure is now
defined with RAII_VAR to ensure it always gets cleaned up.</p>
</li>
<li>
<p>The ast_variables_destroy() call was removed from external_media_rtp_udp().</p>
</li>
<li>
<p>The ast_variables_destroy() call was removed from
external_media_audiosocket_tcp(), its <code>endpoint</code> allocation was changed to
to use ast_asprintf() as external_media_rtp_udp() does, and it now
returns an error on failure.</p>
</li>
<li>
<p>ast_ari_channels_external_media() now checks the new return code from
external_media_audiosocket_tcp() and sets the appropriate error response.</p>
</li>
</ul>
<p>Resolves: #1109</p>
<h4>ari/pjsip: Make it possible to control transfers through ARI</h4>
<p>Author: Holger Hans Peter Freyther
Date: 2024-06-15</p>
<p>Introduce a ChannelTransfer event and the ability to notify progress to
ARI. Implement emitting this event from the PJSIP channel instead of
handling the transfer in Asterisk when configured.</p>
<p>Introduce a dialplan function to the PJSIP channel to switch between the
"core" and "ari-only" behavior.</p>
<p>UserNote: Call transfers on the PJSIP channel can now be controlled by
ARI. This can be enabled by using the PJSIP_TRANSFER_HANDLING(ari-only)
dialplan function.</p>
<h4>channel.c: Remove dead AST_GENERATOR_FD code.</h4>
<p>Author: Sean Bright
Date: 2025-02-06</p>
<p>Nothing ever sets the <code>AST_GENERATOR_FD</code>, so this block of code will
never execute. It also is the only place where the <code>generate</code> callback
is called with the channel lock held which made it difficult to reason
about the thread safety of <code>ast_generator</code>s.</p>
<p>In passing, also note that <code>AST_AGENT_FD</code> isn't used either.</p>
<h4>func_strings.c: Prevent SEGV in HASH single-argument mode.</h4>
<p>Author: George Joseph
Date: 2025-01-30</p>
<p>When in single-argument mode (very rarely used), a malformation of a column
name (also very rare) could cause a NULL to be returned when retrieving the
channel variable for that column. Passing that to strncat causes a SEGV. We
now check for the NULL and print a warning message.</p>
<p>Resolves: #1101</p>
<h4>docs: Add version information to AGI command XML elements.</h4>
<p>Author: George Joseph
Date: 2025-01-24</p>
<p>This process was a bit different than the others because everything
is in the same file, there's an array that contains the command
names and their handler functions, and the last command was created
over 15 years ago.</p>
<ul>
<li>Dump a <code>git blame</code> of res/res_agi.c from BEFORE the handle_* prototypes
were changed.</li>
<li>Create a command &lt;&gt; handler function xref by parsing the the agi_command
array.</li>
<li>For each entry, grep the function definition line "static int handle_*"
from the git blame output and capture the commit. This will be the
commit the command was created in.</li>
<li>Do a <code>git tag --contains &lt;commit&gt; | sort -V | head -1</code> to get the
tag the function was created in.</li>
<li>Add a single since/version element to the command XML. Multiple versions
aren't supported here because the branching and tagging scheme changed
several times in the 2000's.</li>
</ul>
<h4>docs: Fix minor typo in MixMonitor AMI action</h4>
<p>Author: Jeremy Lainé
Date: 2025-01-28</p>
<p>The <code>Options</code> argument was erroneously documented as lowercase
<code>options</code>.</p>
<h4>utils: Disable old style definition warnings for libdb.</h4>
<p>Author: Naveen Albert
Date: 2025-01-23</p>
<p>Newer versions of gcc now warn about old style definitions, such
as those in libdb, which causes compilation failure with DEVMODE
enabled. Ignore these warnings for libdb.</p>
<p>Resolves: #1085</p>
<h4>rtp.conf.sample: Correct stunaddr example.</h4>
<p>Author: fabriziopicconi
Date: 2024-09-25</p>
<h4>docs: Add version information to ARI resources and methods.</h4>
<p>Author: George Joseph
Date: 2025-01-27</p>
<ul>
<li>
<p>Dump a git blame of each file in rest-api/api-docs.</p>
</li>
<li>
<p>Get the commit for each "resourcePath" and "httpMethod" entry.</p>
</li>
<li>
<p>Find the tags for each commit (same as other processes).</p>
</li>
<li>
<p>Insert a "since" array after each "resourcePath" and "httpMethod" entry.</p>
</li>
</ul>
<h4>docs: Indent <since> tags.</h4>
<p>Author: Sean Bright
Date: 2025-01-23</p>
<p>Also updates the 'since' of applications/functions that existed before
XML documentation was introduced (1.6.2.0).</p>
</body></html>

View File

@@ -0,0 +1,573 @@
## Change Log for Release asterisk-22.3.0
### Links:
- [Full ChangeLog](https://downloads.asterisk.org/pub/telephony/asterisk/releases/ChangeLog-22.3.0.html)
- [GitHub Diff](https://github.com/asterisk/asterisk/compare/22.2.0...22.3.0)
- [Tarball](https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22.3.0.tar.gz)
- [Downloads](https://downloads.asterisk.org/pub/telephony/asterisk)
### Summary:
- Commits: 28
- Commit Authors: 12
- Issues Resolved: 12
- Security Advisories Resolved: 0
### User Notes:
- #### ari/pjsip: Make it possible to control transfers through ARI
Call transfers on the PJSIP channel can now be controlled by
ARI. This can be enabled by using the PJSIP_TRANSFER_HANDLING(ari-only)
dialplan function.
### Upgrade Notes:
### Commit Authors:
- Allan Nathanson: (1)
- Ben Ford: (1)
- Fabriziopicconi: (1)
- George Joseph: (10)
- Holger Hans Peter Freyther: (1)
- Jeremy Lainé: (1)
- Joshua Elson: (1)
- Luz Paz: (3)
- Maximilian Fridrich: (1)
- Mike Bradeen: (1)
- Naveen Albert: (1)
- Sean Bright: (6)
## Issue and Commit Detail:
### Closed Issues:
- 211: [bug]: stasis: Off-nominal channel leave causes bridge to be destroyed
- 1085: [bug]: utils: Compilation failure with DEVMODE due to old-style definitions
- 1101: [bug]: when setting a var with a double quotes and using Set(HASH)
- 1109: [bug]: Off nominal memory leak in res/ari/resource_channels.c
- 1112: [bug]: STIR/SHAKEN verification doesn't allow anonymous callerid to be passed to the dialplan.
- 1119: [bug]: Realtime database not working after upgrade from 22.0.0 to 22.2.0
- 1122: Need status on CVE-2024-57520 claim.
- 1124: [bug]: Race condition between bridge and channel delete can over-write cause code set in hangup.
- 1131: [bug]: CHANGES link broken in README.md
- 1135: [bug]: Problems with video decoding due to RTP marker bit set
- 1149: [bug]: res_pjsip: Mismatch in tcp_keepalive_enable causes not to enable
- 1164: [bug]: WARNING Message in messages.log for res_curl.conf [globals]
### Commits By Author:
- #### Allan Nathanson (1):
- config.c: #include of non-existent file should not crash
- #### Ben Ford (1):
- documentation: Update Gosub, Goto, and add new documentationtype.
- #### George Joseph (10):
- docs: Add version information to ARI resources and methods.
- docs: Add version information to AGI command XML elements.
- func_strings.c: Prevent SEGV in HASH single-argument mode.
- resource_channels.c: Fix memory leak in ast_ari_channels_external_media.
- res_stir_shaken: Allow missing or anonymous CID to continue to the dialplan.
- res_config_pgsql: Fix regression that removed dbname config.
- bridging: Fix multiple bridging issues causing SEGVs and FRACKs.
- swagger_model.py: Fix invalid escape sequence in get_list_parameter_type().
- manager.c: Check for restricted file in action_createconfig.
- README.md: Updates and Fixes
- #### Holger Hans Peter Freyther (1):
- ari/pjsip: Make it possible to control transfers through ARI
- #### Jeremy Lainé (1):
- docs: Fix minor typo in MixMonitor AMI action
- #### Joshua Elson (1):
- fix: Correct default flag for tcp_keepalive_enable option
- #### Luz Paz (3):
- docs: Fix various typos in main/ Found via `codespell -q 3 -S "./CREDITS" -L a..
- docs: Fix various typos in channels/ Found via `codespell -q 3 -S "./CREDITS,*..
- docs: Fix typos in cdr/ Found via codespell
- #### Maximilian Fridrich (1):
- Revert "res_rtp_asterisk.c: Set Mark on rtp when timestamp skew is too big"
- #### Mike Bradeen (1):
- bridge_channel: don't set cause code on channel during bridge delete if alread..
- #### Naveen Albert (1):
- utils: Disable old style definition warnings for libdb.
- #### Sean Bright (6):
- docs: Indent <since> tags.
- channel.c: Remove dead AST_GENERATOR_FD code.
- res_rtp_asterisk.c: Use correct timeout value for T.140 RED timer.
- docs: AMI documentation fixes.
- res_rtp_asterisk.c: Don't truncate spec-compliant `ice-ufrag` or `ice-pwd`.
- res_config_curl.c: Remove unnecessary warnings.
- #### fabriziopicconi (1):
- rtp.conf.sample: Correct stunaddr example.
### Commit List:
- documentation: Update Gosub, Goto, and add new documentationtype.
- res_config_curl.c: Remove unnecessary warnings.
- README.md: Updates and Fixes
- res_rtp_asterisk.c: Don't truncate spec-compliant `ice-ufrag` or `ice-pwd`.
- fix: Correct default flag for tcp_keepalive_enable option
- docs: AMI documentation fixes.
- config.c: #include of non-existent file should not crash
- manager.c: Check for restricted file in action_createconfig.
- swagger_model.py: Fix invalid escape sequence in get_list_parameter_type().
- Revert "res_rtp_asterisk.c: Set Mark on rtp when timestamp skew is too big"
- res_rtp_asterisk.c: Use correct timeout value for T.140 RED timer.
- docs: Fix typos in cdr/ Found via codespell
- bridging: Fix multiple bridging issues causing SEGVs and FRACKs.
- res_config_pgsql: Fix regression that removed dbname config.
- res_stir_shaken: Allow missing or anonymous CID to continue to the dialplan.
- resource_channels.c: Fix memory leak in ast_ari_channels_external_media.
- ari/pjsip: Make it possible to control transfers through ARI
- channel.c: Remove dead AST_GENERATOR_FD code.
- func_strings.c: Prevent SEGV in HASH single-argument mode.
- docs: Add version information to AGI command XML elements.
- docs: Fix minor typo in MixMonitor AMI action
- utils: Disable old style definition warnings for libdb.
- rtp.conf.sample: Correct stunaddr example.
- docs: Add version information to ARI resources and methods.
- docs: Indent <since> tags.
### Commit Details:
#### documentation: Update Gosub, Goto, and add new documentationtype.
Author: Ben Ford
Date: 2025-03-14
Gosub and Goto were not displaying their syntax correctly on the docs
site. This change adds a new way to specify an optional context, an
optional extension, and a required priority that the xml stylesheet can
parse without having to know which optional parameters come in which
order. In Asterisk, it looks like this:
parameter name="context" documentationtype="dialplan_context"
parameter name="extension" documentationtype="dialplan_extension"
parameter name="priority" documentationtype="dialplan_priority" required="true"
The stylesheet will ignore the context and extension parameters, but for
priority, it will automatically inject the following:
[[context,]extension,]priority
This is the correct oder for applications such as Gosub and Goto.
#### res_config_curl.c: Remove unnecessary warnings.
Author: Sean Bright
Date: 2025-03-17
Resolves: #1164
#### README.md: Updates and Fixes
Author: George Joseph
Date: 2025-03-05
* Outdated information has been removed.
* New links added.
* Placeholder added for link to change logs.
Going forward, the release process will create HTML versions of the README
and change log and will update the link in the README to the current
change log for the branch...
* In the development branches, the link will always point to the current
release on GitHub.
* In the "releases/*" branches and the tarballs, the link will point to the
ChangeLogs/ChangeLog-<version>.html file in the source directory.
* On the downloads website, the link will point to the
ChangeLog-<version>.html file in the same directory.
Resolves: #1131
#### res_rtp_asterisk.c: Don't truncate spec-compliant `ice-ufrag` or `ice-pwd`.
Author: Sean Bright
Date: 2025-03-07
RFC 8839[1] indicates that the `ice-ufrag` and `ice-pwd` attributes
can be up to 256 bytes long. While we don't generate values of that
size, we should be able to accomodate them without truncating.
1. https://www.rfc-editor.org/rfc/rfc8839#name-ice-ufrag-and-ice-pwd-attri
#### fix: Correct default flag for tcp_keepalive_enable option
Author: Joshua Elson
Date: 2025-03-06
Resolves an issue where the tcp_keepalive_enable option was not properly enabled in the sample configuration due to an incorrect default flag setting.
Fixes: #1149
#### docs: AMI documentation fixes.
Author: Sean Bright
Date: 2025-02-18
Most of this patch is adding missing PJSIP-related event
documentation, but the one functional change was adding a sorcery
to-string handler for endpoint's `redirect_method` which was not
showing up in the AMI event details or `pjsip show endpoint
<endpoint>` output.
The rest of the changes are summarized below:
* app_agent_pool.c: Typo fix Epoche -> Epoch.
* stasis_bridges.c: Add missing AttendedTransfer properties.
* stasis_channels.c: Add missing AgentLogoff properties.
* pjsip_manager.xml:
- Add missing AorList properties.
- Add missing AorDetail properties.
- Add missing ContactList properties.
- Add missing ContactStatusDetail properties.
- Add missing EventDetail properties.
- Add missing AuthList properties.
- Add missing AuthDetail properties.
- Add missing TransportDetail properties.
- Add missing EndpointList properties.
- Add missing IdentifyDetail properties.
* res_pjsip_registrar.c: Add missing InboundRegistrationDetail documentation.
* res_pjsip_pubsub.c:
- Add missing ResourceListDetail documentation.
- Add missing InboundSubscriptionDetail documentation.
- Add missing OutboundSubscriptionDetail documentation.
* res_pjsip_outbound_registration.c: Add missing OutboundRegistrationDetail documentation.
#### config.c: #include of non-existent file should not crash
Author: Allan Nathanson
Date: 2025-03-03
Corrects a segmentation fault when a configuration file has a #include
statement that referenced a file that does not exist.
Resolves: https://github.com/asterisk/asterisk/issues/1139
#### manager.c: Check for restricted file in action_createconfig.
Author: George Joseph
Date: 2025-03-03
The `CreateConfig` manager action now ensures that a config file can
only be created in the AST_CONFIG_DIR unless `live_dangerously` is set.
Resolves: #1122
#### swagger_model.py: Fix invalid escape sequence in get_list_parameter_type().
Author: George Joseph
Date: 2025-03-04
Recent python versions complain when backslashes in strings create invalid
escape sequences. This causes issues for strings used as regex patterns like
`'^List\[(.*)\]$'` where you want the regex parser to treat `[` and `]`
as literals. Double-backslashing is one way to fix it but simply converting
the string to a raw string `re.match(r'^List\[(.*)\]$', text)` is easier
and less error prone.
#### Revert "res_rtp_asterisk.c: Set Mark on rtp when timestamp skew is too big"
Author: Maximilian Fridrich
Date: 2025-02-28
This reverts commit f30ad96b3f467739c38ff415e80bffc4afff1da7.
The original change was not RFC compliant and caused issues because it
set the RTP marker bit in cases when it shouldn't be set. See the
linked issue #1135 for a detailed explanation.
Fixes: #1135.
#### res_rtp_asterisk.c: Use correct timeout value for T.140 RED timer.
Author: Sean Bright
Date: 2025-02-24
Found while reviewing #1128
#### docs: Fix typos in cdr/ Found via codespell
Author: Luz Paz
Date: 2025-02-12
#### docs: Fix various typos in channels/ Found via `codespell -q 3 -S "./CREDITS,*..
Author: Luz Paz
Date: 2025-02-04
#### docs: Fix various typos in main/ Found via `codespell -q 3 -S "./CREDITS" -L a..
Author: Luz Paz
Date: 2025-02-04
#### bridging: Fix multiple bridging issues causing SEGVs and FRACKs.
Author: George Joseph
Date: 2025-01-22
Issues:
* The bridging core allowed multiple bridges to be created with the same
unique bridgeId at the same time. Only the last bridge created with the
duplicate name was actually saved to the core bridges container.
* The bridging core was creating a stasis topic for the bridge and saving it
in the bridge->topic field but not increasing its reference count. In the
case where two bridges were created with the same uniqueid (which is also
the topic name), the second bridge would get the _existing_ topic the first
bridge created. When the first bridge was destroyed, it would take the
topic with it so when the second bridge attempted to publish a message to
it it either FRACKed or SEGVd.
* The bridge destructor, which also destroys the bridge topic, is run from the
bridge manager thread not the caller's thread. This makes it possible for
an ARI developer to create a new one with the same uniqueid believing the
old one was destroyed when, in fact, the old one's destructor hadn't
completed. This could cause the new bridge to get the old one's topic just
before the topic was destroyed. When the new bridge attempted to publish
a message on that topic, asterisk could either FRACK or SEGV.
* The ARI bridges resource also allowed multiple bridges to be created with
the same uniqueid but it kept the duplicate bridges in its app_bridges
container. This created a situation where if you added two bridges with
the same "bridge1" uniqueid, all operations on "bridge1" were performed on
the first bridge created and the second was basically orphaned. If you
attempted to delete what you thought was the second bridge, you actually
deleted the first one created.
Changes:
* A new API `ast_bridge_topic_exists(uniqueid)` was created to determine if
a topic already exists for a bridge.
* `bridge_base_init()` in bridge.c and `ast_ari_bridges_create()` in
resource_bridges.c now call `ast_bridge_topic_exists(uniqueid)` to check
if a bridge with the requested uniqueid already exists and will fail if it
does.
* `bridge_register()` in bridges.c now checks the core bridges container to
make sure a bridge doesn't already exist with the requested uniqueid.
Although most callers of `bridge_register()` will have already called
`bridge_base_init()`, which will now fail on duplicate bridges, there
is no guarantee of this so we must check again.
* The core bridges container allocation was changed to reject duplicate
uniqueids instead of silently replacing an existing one. This is a "belt
and suspenders" check.
* A global mutex was added to bridge.c to prevent concurrent calls to
`bridge_base_init()` and `bridge_register()`.
* Even though you can no longer create multiple bridges with the same uniqueid
at the same time, it's still possible that the bridge topic might be
destroyed while a second bridge with the same uniqueid was trying to use
it. To address this, the bridging core now increments the reference count
on bridge->topic when a bridge is created and decrements it when the
bridge is destroyed.
* `bridge_create_common()` in res_stasis.c now checks the stasis app_bridges
container to make sure a bridge with the requested uniqueid doesn't already
exist. This may seem like overkill but there are so many entrypoints to
bridge creation that we need to be safe and catch issues as soon in the
process as possible.
* The stasis app_bridges container allocation was changed to reject duplicate
uniqueids instead of adding them. This is a "belt and suspenders" check.
* The `bridge show all` CLI command now shows the bridge name as well as the
bridge id.
* Response code 409 "Conflict" was added as a possible response from the ARI
bridge create resources to signal that a bridge with the requested uniqueid
already exists.
* Additional debugging was added to multiple bridging and stasis files.
Resolves: #211
#### bridge_channel: don't set cause code on channel during bridge delete if alread..
Author: Mike Bradeen
Date: 2025-02-18
Due to a potential race condition via ARI when hanging up a channel hangup with cause
while also deleting a bridge containing that channel, the bridge delete can over-write
the hangup cause code resulting in Normal Call Clearing instead of the set value.
With this change, bridge deletion will only set the hangup code if it hasn't been
previously set.
Resolves: #1124
#### res_config_pgsql: Fix regression that removed dbname config.
Author: George Joseph
Date: 2025-02-11
A recent commit accidentally removed the code that sets dbname.
This commit adds it back in.
Resolves: #1119
#### res_stir_shaken: Allow missing or anonymous CID to continue to the dialplan.
Author: George Joseph
Date: 2025-02-05
The verification check for missing or anonymous callerid was happening before
the endpoint's profile was retrieved which meant that the failure_action
parameter wasn't available. Therefore, if verification was enabled and there
was no callerid or it was "anonymous", the call was immediately terminated
instead of giving the dialplan the ability to decide what to do with the call.
* The callerid check now happens after the verification context is created and
the endpoint's stir_shaken_profile is available.
* The check now processes the callerid failure just as it does for other
verification failures and respects the failure_action parameter. If set
to "continue" or "continue_return_reason", `STIR_SHAKEN(0,verify_result)`
in the dialplan will return "invalid_or_no_callerid".
* If the endpoint's failure_action is "reject_request", the call will be
rejected with `433 "Anonymity Disallowed"`.
* If the endpoint's failure_action is "continue_return_reason", the call will
continue but a `Reason: STIR; cause=433; text="Anonymity Disallowed"`
header will be added to the next provisional or final response.
Resolves: #1112
#### resource_channels.c: Fix memory leak in ast_ari_channels_external_media.
Author: George Joseph
Date: 2025-02-04
Between ast_ari_channels_external_media(), external_media_rtp_udp(),
and external_media_audiosocket_tcp(), the `variables` structure being passed
around wasn't being cleaned up properly when there was a failure.
* In ast_ari_channels_external_media(), the `variables` structure is now
defined with RAII_VAR to ensure it always gets cleaned up.
* The ast_variables_destroy() call was removed from external_media_rtp_udp().
* The ast_variables_destroy() call was removed from
external_media_audiosocket_tcp(), its `endpoint` allocation was changed to
to use ast_asprintf() as external_media_rtp_udp() does, and it now
returns an error on failure.
* ast_ari_channels_external_media() now checks the new return code from
external_media_audiosocket_tcp() and sets the appropriate error response.
Resolves: #1109
#### ari/pjsip: Make it possible to control transfers through ARI
Author: Holger Hans Peter Freyther
Date: 2024-06-15
Introduce a ChannelTransfer event and the ability to notify progress to
ARI. Implement emitting this event from the PJSIP channel instead of
handling the transfer in Asterisk when configured.
Introduce a dialplan function to the PJSIP channel to switch between the
"core" and "ari-only" behavior.
UserNote: Call transfers on the PJSIP channel can now be controlled by
ARI. This can be enabled by using the PJSIP_TRANSFER_HANDLING(ari-only)
dialplan function.
#### channel.c: Remove dead AST_GENERATOR_FD code.
Author: Sean Bright
Date: 2025-02-06
Nothing ever sets the `AST_GENERATOR_FD`, so this block of code will
never execute. It also is the only place where the `generate` callback
is called with the channel lock held which made it difficult to reason
about the thread safety of `ast_generator`s.
In passing, also note that `AST_AGENT_FD` isn't used either.
#### func_strings.c: Prevent SEGV in HASH single-argument mode.
Author: George Joseph
Date: 2025-01-30
When in single-argument mode (very rarely used), a malformation of a column
name (also very rare) could cause a NULL to be returned when retrieving the
channel variable for that column. Passing that to strncat causes a SEGV. We
now check for the NULL and print a warning message.
Resolves: #1101
#### docs: Add version information to AGI command XML elements.
Author: George Joseph
Date: 2025-01-24
This process was a bit different than the others because everything
is in the same file, there's an array that contains the command
names and their handler functions, and the last command was created
over 15 years ago.
* Dump a `git blame` of res/res_agi.c from BEFORE the handle_* prototypes
were changed.
* Create a command <> handler function xref by parsing the the agi_command
array.
* For each entry, grep the function definition line "static int handle_*"
from the git blame output and capture the commit. This will be the
commit the command was created in.
* Do a `git tag --contains <commit> | sort -V | head -1` to get the
tag the function was created in.
* Add a single since/version element to the command XML. Multiple versions
aren't supported here because the branching and tagging scheme changed
several times in the 2000's.
#### docs: Fix minor typo in MixMonitor AMI action
Author: Jeremy Lainé
Date: 2025-01-28
The `Options` argument was erroneously documented as lowercase
`options`.
#### utils: Disable old style definition warnings for libdb.
Author: Naveen Albert
Date: 2025-01-23
Newer versions of gcc now warn about old style definitions, such
as those in libdb, which causes compilation failure with DEVMODE
enabled. Ignore these warnings for libdb.
Resolves: #1085
#### rtp.conf.sample: Correct stunaddr example.
Author: fabriziopicconi
Date: 2024-09-25
#### docs: Add version information to ARI resources and methods.
Author: George Joseph
Date: 2025-01-27
* Dump a git blame of each file in rest-api/api-docs.
* Get the commit for each "resourcePath" and "httpMethod" entry.
* Find the tags for each commit (same as other processes).
* Insert a "since" array after each "resourcePath" and "httpMethod" entry.
#### docs: Indent <since> tags.
Author: Sean Bright
Date: 2025-01-23
Also updates the 'since' of applications/functions that existed before
XML documentation was introduced (1.6.2.0).

View File

@@ -0,0 +1,537 @@
<html><head><title>ChangeLog for asterisk-22.4.0</title></head><body>
<h2>Change Log for Release asterisk-22.4.0</h2>
<h3>Links:</h3>
<ul>
<li><a href="https://downloads.asterisk.org/pub/telephony/asterisk/releases/ChangeLog-22.4.0.html">Full ChangeLog</a> </li>
<li><a href="https://github.com/asterisk/asterisk/compare/22.3.0...22.4.0">GitHub Diff</a> </li>
<li><a href="https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22.4.0.tar.gz">Tarball</a> </li>
<li><a href="https://downloads.asterisk.org/pub/telephony/asterisk">Downloads</a> </li>
</ul>
<h3>Summary:</h3>
<ul>
<li>Commits: 24</li>
<li>Commit Authors: 18</li>
<li>Issues Resolved: 12</li>
<li>Security Advisories Resolved: 0</li>
</ul>
<h3>User Notes:</h3>
<ul>
<li>
<h4>stasis/control.c: Set Hangup Cause to No Answer on Dial timeout</h4>
<p>A Dial timeout on POST /channels/{channelId}/dial will now result in a
CANCEL and ChannelDestroyed with cause 19 / User alerting, no answer. Previously
no explicit cause was set, resulting in a cause of 16 / Normal Call Clearing.</p>
</li>
<li>
<h4>contrib: Add systemd service and timer files for malloc trim.</h4>
<p>Service and timer files for systemd have been added to the
contrib/systemd/ directory. If you are experiencing memory issues,
install these files to have "malloc trim" periodically run on the
system.</p>
</li>
<li>
<h4>Add log-caller-id-name option to log Caller ID Name in queue log</h4>
<p>This patch adds a global configuration option, log-caller-id-name, to queues.conf
to control whether the Caller ID name is logged as parameter 4 when a call enters a queue.
When log-caller-id-name=yes, the Caller ID name is included in the queue log,
Any '|' characters in the caller ID name will be replaced with '_'.
(provided its allowed by the existing log_restricted_caller_id rules).
When log-caller-id-name=no (the default), the Caller ID name is omitted.</p>
</li>
<li>
<h4>asterisk.c: Add "pre-init" and "pre-module" capability to cli.conf.</h4>
<p>In cli.conf, you can now define startup commands that run before
core initialization and before module initialization.</p>
</li>
<li>
<h4>audiosocket: added support for DTMF frames</h4>
<p>The AudioSocket protocol now forwards DTMF frames with
payload type 0x03. The payload is a 1-byte ascii representing the DTMF
digit (0-9,*,#...).</p>
</li>
</ul>
<h3>Upgrade Notes:</h3>
<ul>
<li>
<h4>ARI: REST over Websocket</h4>
This commit adds the ability to make ARI REST requests over the same
websocket used to receive events.
See https://docs.asterisk.org/Configuration/Interfaces/Asterisk-REST-Interface-ARI/ARI-REST-over-WebSocket/</li>
</ul>
<h3>Commit Authors:</h3>
<ul>
<li>Albrecht Oster: (1)</li>
<li>Alexei Gradinari: (1)</li>
<li>Allan Nathanson: (1)</li>
<li>Andreas Wehrmann: (1)</li>
<li>Ben Ford: (1)</li>
<li>Florent CHAUVEAU: (1)</li>
<li>George Joseph: (4)</li>
<li>Joshua C. Colp: (1)</li>
<li>Luz Paz: (1)</li>
<li>Mark Murawski: (1)</li>
<li>Mike Bradeen: (1)</li>
<li>Mkmer: (1)</li>
<li>Naveen Albert: (3)</li>
<li>Norm Harrison: (2)</li>
<li>Peter Jannesen: (1)</li>
<li>Phoneben: (1)</li>
<li>Sean Bright: (1)</li>
<li>Zhai Liangliang: (1)</li>
</ul>
<h2>Issue and Commit Detail:</h2>
<h3>Closed Issues:</h3>
<ul>
<li>505: [bug]: res_pjproject: ast_sockaddr_cmp() always fails on sockaddrs created by ast_sockaddr_from_pj_sockaddr()</li>
<li>643: [new-feature]: pjsip show contact -- show all details same as AMI PJSIPShowContacts</li>
<li>963: [bug]: missing hangup cause for ARI ChannelDestroyed when Dial times out</li>
<li>1091: [improvement]: app queue :add to queue log callerid name</li>
<li>1144: [bug]: action_redirect don't remove bridge_after_goto data</li>
<li>1171: [improvement]: Need the capability in audiohook.c for fractional (float) type volume adjustments.</li>
<li>1181: [bug]: Incorrect PJSIP Endpoint Device States on Multiple Channels</li>
<li>1190: [bug]: Crash when starting ConfBridge recording over CLI and AMI</li>
<li>1197: [bug]: ChannelHangupRequest does not show cause code in all cases</li>
<li>1206: [improvement]: chan_iax2: Minor improvements to documentation and warning messages.</li>
<li>1220: [bug]: res_pjsip_caller_id: OLI is not parsed if contained in a URI parameter</li>
<li>1224: [improvement]: app_meetme: Removal version is incorrect</li>
</ul>
<h3>Commits By Author:</h3>
<ul>
<li>
<h4>Albrecht Oster (1):</h4>
</li>
<li>
<p>res_pjproject: Fix DTLS client check failing on some platforms</p>
</li>
<li>
<h4>Alexei Gradinari (1):</h4>
</li>
<li>
<p>chan_pjsip: set correct Endpoint Device State on multiple channels</p>
</li>
<li>
<h4>Allan Nathanson (1):</h4>
</li>
<li>
<p>file.c: missing "custom" sound files should not generate warning logs</p>
</li>
<li>
<h4>Andreas Wehrmann (1):</h4>
</li>
<li>
<p>pbx_ael: unregister AELSub application and CLI commands on module load failure</p>
</li>
<li>
<h4>Ben Ford (1):</h4>
</li>
<li>
<p>contrib: Add systemd service and timer files for malloc trim.</p>
</li>
<li>
<h4>Florent CHAUVEAU (1):</h4>
</li>
<li>
<p>audiosocket: added support for DTMF frames</p>
</li>
<li>
<h4>George Joseph (4):</h4>
</li>
<li>ARI: REST over Websocket</li>
<li>ari_websockets: Fix frack if ARI config fails to load.</li>
<li>asterisk.c: Add "pre-init" and "pre-module" capability to cli.conf.</li>
<li>
<p>Prequisites for ARI Outbound Websockets</p>
</li>
<li>
<h4>Joshua C. Colp (1):</h4>
</li>
<li>
<p>channel: Always provide cause code in ChannelHangupRequest.</p>
</li>
<li>
<h4>Luz Paz (1):</h4>
</li>
<li>
<p>docs: Fix typos in apps/</p>
</li>
<li>
<h4>Mark Murawski (1):</h4>
</li>
<li>
<p>chan_pjsip: Add the same details as PJSIPShowContacts to the CLI via 'pjsip s..</p>
</li>
<li>
<h4>Mike Bradeen (1):</h4>
</li>
<li>
<p>stasis/control.c: Set Hangup Cause to No Answer on Dial timeout</p>
</li>
<li>
<h4>Naveen Albert (3):</h4>
</li>
<li>chan_iax2: Minor improvements to documentation and warning messages.</li>
<li>app_meetme: Remove inaccurate removal version from xmldocs.</li>
<li>
<p>res_pjsip_caller_id: Also parse URI parameters for ANI2.</p>
</li>
<li>
<h4>Norm Harrison (2):</h4>
</li>
<li>audiosocket: fix timeout, fix dialplan app exit, server address in logs</li>
<li>
<p>asterisk/channel.h: fix documentation for 'ast_waitfor_nandfds()'</p>
</li>
<li>
<h4>Peter Jannesen (1):</h4>
</li>
<li>
<p>action_redirect: remove after_bridge_goto_info</p>
</li>
<li>
<h4>Sean Bright (1):</h4>
</li>
<li>
<p>app_confbridge: Prevent crash when publishing channel-less event.</p>
</li>
<li>
<h4>Zhai Liangliang (1):</h4>
</li>
<li>
<p>Update config.guess and config.sub</p>
</li>
<li>
<h4>mkmer (1):</h4>
</li>
<li>
<p>audiohook.c: Add ability to adjust volume with float</p>
</li>
<li>
<h4>phoneben (1):</h4>
</li>
<li>Add log-caller-id-name option to log Caller ID Name in queue log</li>
</ul>
<h3>Commit List:</h3>
<ul>
<li>res_pjsip_caller_id: Also parse URI parameters for ANI2.</li>
<li>app_meetme: Remove inaccurate removal version from xmldocs.</li>
<li>docs: Fix typos in apps/</li>
<li>stasis/control.c: Set Hangup Cause to No Answer on Dial timeout</li>
<li>chan_iax2: Minor improvements to documentation and warning messages.</li>
<li>pbx_ael: unregister AELSub application and CLI commands on module load failure</li>
<li>res_pjproject: Fix DTLS client check failing on some platforms</li>
<li>Prequisites for ARI Outbound Websockets</li>
<li>contrib: Add systemd service and timer files for malloc trim.</li>
<li>action_redirect: remove after_bridge_goto_info</li>
<li>channel: Always provide cause code in ChannelHangupRequest.</li>
<li>Add log-caller-id-name option to log Caller ID Name in queue log</li>
<li>asterisk.c: Add "pre-init" and "pre-module" capability to cli.conf.</li>
<li>app_confbridge: Prevent crash when publishing channel-less event.</li>
<li>ari_websockets: Fix frack if ARI config fails to load.</li>
<li>ARI: REST over Websocket</li>
<li>audiohook.c: Add ability to adjust volume with float</li>
<li>audiosocket: added support for DTMF frames</li>
<li>asterisk/channel.h: fix documentation for 'ast_waitfor_nandfds()'</li>
<li>audiosocket: fix timeout, fix dialplan app exit, server address in logs</li>
<li>Update config.guess and config.sub</li>
<li>chan_pjsip: set correct Endpoint Device State on multiple channels</li>
<li>file.c: missing "custom" sound files should not generate warning logs</li>
</ul>
<h3>Commit Details:</h3>
<h4>res_pjsip_caller_id: Also parse URI parameters for ANI2.</h4>
<p>Author: Naveen Albert
Date: 2025-04-26</p>
<p>If the isup-oli was sent as a URI parameter, rather than a header
parameter, it was not being parsed. Make sure we parse both if
needed so the ANI2 is set regardless of which type of parameter
the isup-oli is sent as.</p>
<p>Resolves: #1220</p>
<h4>app_meetme: Remove inaccurate removal version from xmldocs.</h4>
<p>Author: Naveen Albert
Date: 2025-04-26</p>
<p>app_meetme is deprecated but wasn't removed as planned in 21,
so remove the inaccurate removal version.</p>
<p>Resolves: #1224</p>
<h4>docs: Fix typos in apps/</h4>
<p>Author: Luz Paz
Date: 2025-04-09</p>
<p>Found via codespell</p>
<h4>stasis/control.c: Set Hangup Cause to No Answer on Dial timeout</h4>
<p>Author: Mike Bradeen
Date: 2025-04-17</p>
<p>Other Dial operations (dial, app_dial) use Q.850 cause 19 when a dial timeout occurs,
but the Dial command via ARI did not set an explicit reason. This resulted in a
CANCEL with Normal Call Clearing and corresponding ChannelDestroyed.</p>
<p>This change sets the hangup cause to AST_CAUSE_NO_ANSWER to be consistent with the
other operations.</p>
<p>Fixes: #963</p>
<p>UserNote: A Dial timeout on POST /channels/{channelId}/dial will now result in a
CANCEL and ChannelDestroyed with cause 19 / User alerting, no answer. Previously
no explicit cause was set, resulting in a cause of 16 / Normal Call Clearing.</p>
<h4>chan_iax2: Minor improvements to documentation and warning messages.</h4>
<p>Author: Naveen Albert
Date: 2025-04-18</p>
<ul>
<li>Update Dial() documentation for IAX2 to include syntax for RSA
public key names.</li>
<li>Add additional details to a couple warnings to provide more context
when an undecodable frame is received.</li>
</ul>
<p>Resolves: #1206</p>
<h4>pbx_ael: unregister AELSub application and CLI commands on module load failure</h4>
<p>Author: Andreas Wehrmann
Date: 2025-04-18</p>
<p>This fixes crashes/hangs I noticed with Asterisk 20.3.0 and 20.13.0 and quickly found out,
that the AEL module doesn't do proper cleanup when it fails to load.
This happens for example when there are syntax errors and AEL fails to compile in which case pbx_load_module()
returns an error but load_module() doesn't then unregister CLI cmds and the application.</p>
<h4>res_pjproject: Fix DTLS client check failing on some platforms</h4>
<p>Author: Albrecht Oster
Date: 2025-04-10</p>
<p>Certain platforms (mainly BSD derivatives) have an additional length
field in <code>sockaddr_in6</code> and <code>sockaddr_in</code>.
<code>ast_sockaddr_from_pj_sockaddr()</code> does not take this field into account
when copying over values from the <code>pj_sockaddr</code> into the <code>ast_sockaddr</code>.
The resulting <code>ast_sockaddr</code> will have an uninitialized value for
<code>sin6_len</code>/<code>sin_len</code> while the other <code>ast_sockaddr</code> (not converted from
a <code>pj_sockaddr</code>) to check against in <code>ast_sockaddr_pj_sockaddr_cmp()</code>
has the correct length value set.</p>
<p>This has the effect that <code>ast_sockaddr_cmp()</code> will always indicate
an address mismatch, because it does a bitwise comparison, and all DTLS
packets are dropped even if addresses and ports match.</p>
<p><code>ast_sockaddr_from_pj_sockaddr()</code> now checks whether the length fields
are available on the current platform and sets the values accordingly.</p>
<p>Resolves: #505</p>
<h4>Prequisites for ARI Outbound Websockets</h4>
<p>Author: George Joseph
Date: 2025-04-16</p>
<p>stasis:
* Added stasis_app_is_registered().
* Added stasis_app_control_mark_failed().
* Added stasis_app_control_is_failed().
* Fixed res_stasis_device_state so unsubscribe all works properly.
* Modified stasis_app_unregister() to unsubscribe from all event sources.
* Modified stasis_app_exec to return -1 if stasis_app_control_is_failed()
returns true.</p>
<p>http:
* Added ast_http_create_basic_auth_header().</p>
<p>md5:
* Added define for MD5_DIGEST_LENGTH.</p>
<p>tcptls:
* Added flag to ast_tcptls_session_args to suppress connection log messages
to give callers more control over logging.</p>
<p>http_websocket:
* Add flag to ast_websocket_client_options to suppress connection log messages
to give callers more control over logging.
* Added username and password to ast_websocket_client_options to support
outbound basic authentication.
* Added ast_websocket_result_to_str().</p>
<h4>contrib: Add systemd service and timer files for malloc trim.</h4>
<p>Author: Ben Ford
Date: 2025-04-16</p>
<p>Adds two files to the contrib/systemd/ directory that can be installed
to periodically run "malloc trim" on Asterisk. These files do nothing
unless they are explicitly moved to the correct location on the system.
Users who are experiencing Asterisk memory issues can use this service
to potentially help combat the problem. These files can also be
configured to change the start time and interval. See systemd.timer(5)
and systemd.time(7) for more information.</p>
<p>UserNote: Service and timer files for systemd have been added to the
contrib/systemd/ directory. If you are experiencing memory issues,
install these files to have "malloc trim" periodically run on the
system.</p>
<h4>action_redirect: remove after_bridge_goto_info</h4>
<p>Author: Peter Jannesen
Date: 2025-03-13</p>
<p>Under certain circumstances the context/extens/prio are stored in the
after_bridge_goto_info. This info is used when the bridge is broken by
for hangup of the other party. In the situation that the bridge is
broken by an AMI Redirect this info is not used but also not removed.
With the result that when the channel is put back in a bridge and the
bridge is broken the execution continues at the wrong
context/extens/prio.</p>
<p>Resolves: #1144</p>
<h4>channel: Always provide cause code in ChannelHangupRequest.</h4>
<p>Author: Joshua C. Colp
Date: 2025-04-16</p>
<p>When queueing a channel to be hung up a cause code can be
specified in one of two ways:</p>
<ol>
<li>
<p>ast_queue_hangup_with_cause
This function takes in a cause code and queues it as part
of the hangup request, which ultimately results in it being
set on the channel.</p>
</li>
<li>
<p>ast_channel_hangupcause_set + ast_queue_hangup
This combination sets the hangup cause on the channel before
queueing the hangup instead of as part of that process.</p>
</li>
</ol>
<p>In the #2 case the ChannelHangupRequest event would not contain
the cause code. For consistency if a cause code has been set
on the channel it will now be added to the event.</p>
<p>Resolves: #1197</p>
<h4>Add log-caller-id-name option to log Caller ID Name in queue log</h4>
<p>Author: phoneben
Date: 2025-02-28</p>
<p>Add log-caller-id-name option to log Caller ID Name in queue log</p>
<p>This patch introduces a new global configuration option, log-caller-id-name,
to queues.conf to control whether the Caller ID name is logged when a call enters a queue.</p>
<p>When log-caller-id-name=yes, the Caller ID name is logged
as parameter 4 in the queue log, provided its allowed by the
existing log_restricted_caller_id rules. If log-caller-id-name=no (the default),
the Caller ID name is omitted from the logs.</p>
<p>Fixes: #1091</p>
<p>UserNote: This patch adds a global configuration option, log-caller-id-name, to queues.conf
to control whether the Caller ID name is logged as parameter 4 when a call enters a queue.
When log-caller-id-name=yes, the Caller ID name is included in the queue log,
Any '|' characters in the caller ID name will be replaced with '_'.
(provided its allowed by the existing log_restricted_caller_id rules).
When log-caller-id-name=no (the default), the Caller ID name is omitted.</p>
<h4>asterisk.c: Add "pre-init" and "pre-module" capability to cli.conf.</h4>
<p>Author: George Joseph
Date: 2025-04-10</p>
<p>Commands in the "[startup_commands]" section of cli.conf have historically run
after all core and module initialization has been completed and just before
"Asterisk Ready" is printed on the console. This meant that if you
wanted to debug initialization of a specific module, your only option
was to turn on debug for everything by setting "debug" in asterisk.conf.</p>
<p>This commit introduces options to allow you to run CLI commands earlier in
the asterisk startup process.</p>
<p>A command with a value of "pre-init" will run just after logger initialization
but before most core, and all module, initialization.</p>
<p>A command with a value of "pre-module" will run just after all core
initialization but before all module initialization.</p>
<p>A command with a value of "fully-booted" (or "yes" for backwards
compatibility) will run as they always have been...after all
initialization and just before "Asterisk Ready" is printed on the console.</p>
<p>This means you could do this...</p>
<p><code>[startup_commands]
core set debug 3 res_pjsip.so = pre-module
core set debug 0 res_pjsip.so = fully-booted</code></p>
<p>This would turn debugging on for res_pjsip.so to catch any module
initialization debug messages then turn it off again after the module is
loaded.</p>
<p>UserNote: In cli.conf, you can now define startup commands that run before
core initialization and before module initialization.</p>
<h4>app_confbridge: Prevent crash when publishing channel-less event.</h4>
<p>Author: Sean Bright
Date: 2025-04-07</p>
<p>Resolves: #1190</p>
<h4>ari_websockets: Fix frack if ARI config fails to load.</h4>
<p>Author: George Joseph
Date: 2025-04-02</p>
<p>ari_ws_session_registry_dtor() wasn't checking that the container was valid
before running ao2_callback on it to shutdown registered sessions.</p>
<h4>ARI: REST over Websocket</h4>
<p>Author: George Joseph
Date: 2025-03-12</p>
<p>This commit adds the ability to make ARI REST requests over the same
websocket used to receive events.</p>
<p>For full details on how to use the new capability, visit...</p>
<p>https://docs.asterisk.org/Configuration/Interfaces/Asterisk-REST-Interface-ARI/ARI-REST-over-WebSocket/</p>
<p>Changes:</p>
<ul>
<li>Added utilities to http.c:<ul>
<li>ast_get_http_method_from_string().</li>
<li>ast_http_parse_post_form().</li>
</ul>
</li>
<li>Added utilities to json.c:<ul>
<li>ast_json_nvp_array_to_ast_variables().</li>
<li>ast_variables_to_json_nvp_array().</li>
</ul>
</li>
<li>Added definitions for new events to carry REST responses.</li>
<li>Created res/ari/ari_websocket_requests.c to house the new request handlers.</li>
<li>Moved non-event specific code out of res/ari/resource_events.c into
res/ari/ari_websockets.c</li>
<li>Refactored res/res_ari.c to move non-http code out of ast_ari_callback()
(which is http specific) and into ast_ari_invoke() so it can be shared
between both the http and websocket transports.</li>
</ul>
<p>UpgradeNote: This commit adds the ability to make ARI REST requests over the same
websocket used to receive events.
See https://docs.asterisk.org/Configuration/Interfaces/Asterisk-REST-Interface-ARI/ARI-REST-over-WebSocket/</p>
<h4>audiohook.c: Add ability to adjust volume with float</h4>
<p>Author: mkmer
Date: 2025-03-18</p>
<p>Add the capability to audiohook for float type volume adjustments. This allows for adjustments to volume smaller than 6dB. With INT adjustments, the first step is 2 which converts to ~6dB (or 1/2 volume / double volume depending on adjustment sign). 3dB is a typical adjustment level which can now be accommodated with an adjustment value of 1.41.</p>
<p>This is accomplished by the following:
Convert internal variables to type float.
Always use ast_frame_adjust_volume_float() for adjustments.
Cast int to float in original functions ast_audiohook_volume_set(), and ast_volume_adjust().
Cast float to int in ast_audiohook_volume_get()
Add functions ast_audiohook_volume_get_float, ast_audiohook_volume_set_float, and ast_audiohook_volume_adjust_float.</p>
<p>This update maintains 100% backward compatibility.</p>
<p>Resolves: #1171</p>
<h4>audiosocket: added support for DTMF frames</h4>
<p>Author: Florent CHAUVEAU
Date: 2025-02-28</p>
<p>Updated the AudioSocket protocol to allow sending DTMF frames.
AST_FRAME_DTMF frames are now forwarded to the server, in addition to
AST_FRAME_AUDIO frames. A new payload type AST_AUDIOSOCKET_KIND_DTMF
with value 0x03 was added to the protocol. The payload is a 1-byte
ascii representing the DTMF digit (0-9,*,#...).</p>
<p>UserNote: The AudioSocket protocol now forwards DTMF frames with
payload type 0x03. The payload is a 1-byte ascii representing the DTMF
digit (0-9,*,#...).</p>
<h4>asterisk/channel.h: fix documentation for 'ast_waitfor_nandfds()'</h4>
<p>Author: Norm Harrison
Date: 2023-04-03</p>
<p>Co-authored-by: Florent CHAUVEAU <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#102;&#108;&#111;&#114;&#101;&#110;&#116;&#99;&#104;&#64;&#112;&#109;&#46;&#109;&#101;">&#102;&#108;&#111;&#114;&#101;&#110;&#116;&#99;&#104;&#64;&#112;&#109;&#46;&#109;&#101;</a></p>
<h4>audiosocket: fix timeout, fix dialplan app exit, server address in logs</h4>
<p>Author: Norm Harrison
Date: 2023-04-03</p>
<ul>
<li>Correct wait timeout logic in the dialplan application.</li>
<li>Include server address in log messages for better traceability.</li>
<li>Allow dialplan app to exit gracefully on hangup messages and socket closure.</li>
<li>Optimize I/O by reducing redundant read()/write() operations.</li>
</ul>
<p>Co-authored-by: Florent CHAUVEAU <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#102;&#108;&#111;&#114;&#101;&#110;&#116;&#99;&#104;&#64;&#112;&#109;&#46;&#109;&#101;">&#102;&#108;&#111;&#114;&#101;&#110;&#116;&#99;&#104;&#64;&#112;&#109;&#46;&#109;&#101;</a></p>
<h4>chan_pjsip: Add the same details as PJSIPShowContacts to the CLI via 'pjsip s..</h4>
<p>Author: Mark Murawski
Date: 2025-03-23</p>
<p>CLI 'pjsip show contact' does not show enough information.
One must telnet to AMI or write a script to ask Asterisk for example what the User-Agent is on a Contact
This feature adds the same details as PJSIPShowContacts to the CLI</p>
<p>Resolves: #643</p>
<h4>Update config.guess and config.sub</h4>
<p>Author: Zhai Liangliang
Date: 2025-03-26</p>
<h4>chan_pjsip: set correct Endpoint Device State on multiple channels</h4>
<p>Author: Alexei Gradinari
Date: 2025-03-25</p>
<ol>
<li>
<p>When one channel is placed on hold, the device state is set to ONHOLD
without checking other channels states.
In case of AST_CONTROL_HOLD set the device state as AST_DEVICE_UNKNOWN
to calculate aggregate device state of all active channels.</p>
</li>
<li>
<p>The current implementation incorrectly classifies channels in use.
The only channels that has the states: UP, RING and BUSY are considered as "in use".
A channel should be considered "in use" if its state is anything other than
DOWN or RESERVED.</p>
</li>
<li>
<p>Currently, if the number of channels "in use" is greater than device_state_busy_at,
the system does not set the state to BUSY. Instead, it incorrectly assigns an aggregate
device state.
The endpoint device state should be BUSY if the number of channels "in use" is greater
than or equal to device_state_busy_at.</p>
</li>
</ol>
<p>Fixes: #1181</p>
<h4>file.c: missing "custom" sound files should not generate warning logs</h4>
<p>Author: Allan Nathanson
Date: 2025-03-18</p>
<p>With <code>sounds_search_custom_dir = yes</code> we first look to see if a sound file
is present in the "custom" sound directory before looking in the standard
sound directories. We should not be issuing a WARNING log message if a
sound cannot be found in the "custom" directory.</p>
<p>Resolves: https://github.com/asterisk/asterisk/issues/1170</p>
</body></html>

View File

@@ -0,0 +1,564 @@
## Change Log for Release asterisk-22.4.0
### Links:
- [Full ChangeLog](https://downloads.asterisk.org/pub/telephony/asterisk/releases/ChangeLog-22.4.0.html)
- [GitHub Diff](https://github.com/asterisk/asterisk/compare/22.3.0...22.4.0)
- [Tarball](https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22.4.0.tar.gz)
- [Downloads](https://downloads.asterisk.org/pub/telephony/asterisk)
### Summary:
- Commits: 24
- Commit Authors: 18
- Issues Resolved: 12
- Security Advisories Resolved: 0
### User Notes:
- #### stasis/control.c: Set Hangup Cause to No Answer on Dial timeout
A Dial timeout on POST /channels/{channelId}/dial will now result in a
CANCEL and ChannelDestroyed with cause 19 / User alerting, no answer. Previously
no explicit cause was set, resulting in a cause of 16 / Normal Call Clearing.
- #### contrib: Add systemd service and timer files for malloc trim.
Service and timer files for systemd have been added to the
contrib/systemd/ directory. If you are experiencing memory issues,
install these files to have "malloc trim" periodically run on the
system.
- #### Add log-caller-id-name option to log Caller ID Name in queue log
This patch adds a global configuration option, log-caller-id-name, to queues.conf
to control whether the Caller ID name is logged as parameter 4 when a call enters a queue.
When log-caller-id-name=yes, the Caller ID name is included in the queue log,
Any '|' characters in the caller ID name will be replaced with '_'.
(provided its allowed by the existing log_restricted_caller_id rules).
When log-caller-id-name=no (the default), the Caller ID name is omitted.
- #### asterisk.c: Add "pre-init" and "pre-module" capability to cli.conf.
In cli.conf, you can now define startup commands that run before
core initialization and before module initialization.
- #### audiosocket: added support for DTMF frames
The AudioSocket protocol now forwards DTMF frames with
payload type 0x03. The payload is a 1-byte ascii representing the DTMF
digit (0-9,*,#...).
### Upgrade Notes:
- #### ARI: REST over Websocket
This commit adds the ability to make ARI REST requests over the same
websocket used to receive events.
See https://docs.asterisk.org/Configuration/Interfaces/Asterisk-REST-Interface-ARI/ARI-REST-over-WebSocket/
### Commit Authors:
- Albrecht Oster: (1)
- Alexei Gradinari: (1)
- Allan Nathanson: (1)
- Andreas Wehrmann: (1)
- Ben Ford: (1)
- Florent CHAUVEAU: (1)
- George Joseph: (4)
- Joshua C. Colp: (1)
- Luz Paz: (1)
- Mark Murawski: (1)
- Mike Bradeen: (1)
- Mkmer: (1)
- Naveen Albert: (3)
- Norm Harrison: (2)
- Peter Jannesen: (1)
- Phoneben: (1)
- Sean Bright: (1)
- Zhai Liangliang: (1)
## Issue and Commit Detail:
### Closed Issues:
- 505: [bug]: res_pjproject: ast_sockaddr_cmp() always fails on sockaddrs created by ast_sockaddr_from_pj_sockaddr()
- 643: [new-feature]: pjsip show contact -- show all details same as AMI PJSIPShowContacts
- 963: [bug]: missing hangup cause for ARI ChannelDestroyed when Dial times out
- 1091: [improvement]: app queue :add to queue log callerid name
- 1144: [bug]: action_redirect don't remove bridge_after_goto data
- 1171: [improvement]: Need the capability in audiohook.c for fractional (float) type volume adjustments.
- 1181: [bug]: Incorrect PJSIP Endpoint Device States on Multiple Channels
- 1190: [bug]: Crash when starting ConfBridge recording over CLI and AMI
- 1197: [bug]: ChannelHangupRequest does not show cause code in all cases
- 1206: [improvement]: chan_iax2: Minor improvements to documentation and warning messages.
- 1220: [bug]: res_pjsip_caller_id: OLI is not parsed if contained in a URI parameter
- 1224: [improvement]: app_meetme: Removal version is incorrect
### Commits By Author:
- #### Albrecht Oster (1):
- res_pjproject: Fix DTLS client check failing on some platforms
- #### Alexei Gradinari (1):
- chan_pjsip: set correct Endpoint Device State on multiple channels
- #### Allan Nathanson (1):
- file.c: missing "custom" sound files should not generate warning logs
- #### Andreas Wehrmann (1):
- pbx_ael: unregister AELSub application and CLI commands on module load failure
- #### Ben Ford (1):
- contrib: Add systemd service and timer files for malloc trim.
- #### Florent CHAUVEAU (1):
- audiosocket: added support for DTMF frames
- #### George Joseph (4):
- ARI: REST over Websocket
- ari_websockets: Fix frack if ARI config fails to load.
- asterisk.c: Add "pre-init" and "pre-module" capability to cli.conf.
- Prequisites for ARI Outbound Websockets
- #### Joshua C. Colp (1):
- channel: Always provide cause code in ChannelHangupRequest.
- #### Luz Paz (1):
- docs: Fix typos in apps/
- #### Mark Murawski (1):
- chan_pjsip: Add the same details as PJSIPShowContacts to the CLI via 'pjsip s..
- #### Mike Bradeen (1):
- stasis/control.c: Set Hangup Cause to No Answer on Dial timeout
- #### Naveen Albert (3):
- chan_iax2: Minor improvements to documentation and warning messages.
- app_meetme: Remove inaccurate removal version from xmldocs.
- res_pjsip_caller_id: Also parse URI parameters for ANI2.
- #### Norm Harrison (2):
- audiosocket: fix timeout, fix dialplan app exit, server address in logs
- asterisk/channel.h: fix documentation for 'ast_waitfor_nandfds()'
- #### Peter Jannesen (1):
- action_redirect: remove after_bridge_goto_info
- #### Sean Bright (1):
- app_confbridge: Prevent crash when publishing channel-less event.
- #### Zhai Liangliang (1):
- Update config.guess and config.sub
- #### mkmer (1):
- audiohook.c: Add ability to adjust volume with float
- #### phoneben (1):
- Add log-caller-id-name option to log Caller ID Name in queue log
### Commit List:
- res_pjsip_caller_id: Also parse URI parameters for ANI2.
- app_meetme: Remove inaccurate removal version from xmldocs.
- docs: Fix typos in apps/
- stasis/control.c: Set Hangup Cause to No Answer on Dial timeout
- chan_iax2: Minor improvements to documentation and warning messages.
- pbx_ael: unregister AELSub application and CLI commands on module load failure
- res_pjproject: Fix DTLS client check failing on some platforms
- Prequisites for ARI Outbound Websockets
- contrib: Add systemd service and timer files for malloc trim.
- action_redirect: remove after_bridge_goto_info
- channel: Always provide cause code in ChannelHangupRequest.
- Add log-caller-id-name option to log Caller ID Name in queue log
- asterisk.c: Add "pre-init" and "pre-module" capability to cli.conf.
- app_confbridge: Prevent crash when publishing channel-less event.
- ari_websockets: Fix frack if ARI config fails to load.
- ARI: REST over Websocket
- audiohook.c: Add ability to adjust volume with float
- audiosocket: added support for DTMF frames
- asterisk/channel.h: fix documentation for 'ast_waitfor_nandfds()'
- audiosocket: fix timeout, fix dialplan app exit, server address in logs
- Update config.guess and config.sub
- chan_pjsip: set correct Endpoint Device State on multiple channels
- file.c: missing "custom" sound files should not generate warning logs
### Commit Details:
#### res_pjsip_caller_id: Also parse URI parameters for ANI2.
Author: Naveen Albert
Date: 2025-04-26
If the isup-oli was sent as a URI parameter, rather than a header
parameter, it was not being parsed. Make sure we parse both if
needed so the ANI2 is set regardless of which type of parameter
the isup-oli is sent as.
Resolves: #1220
#### app_meetme: Remove inaccurate removal version from xmldocs.
Author: Naveen Albert
Date: 2025-04-26
app_meetme is deprecated but wasn't removed as planned in 21,
so remove the inaccurate removal version.
Resolves: #1224
#### docs: Fix typos in apps/
Author: Luz Paz
Date: 2025-04-09
Found via codespell
#### stasis/control.c: Set Hangup Cause to No Answer on Dial timeout
Author: Mike Bradeen
Date: 2025-04-17
Other Dial operations (dial, app_dial) use Q.850 cause 19 when a dial timeout occurs,
but the Dial command via ARI did not set an explicit reason. This resulted in a
CANCEL with Normal Call Clearing and corresponding ChannelDestroyed.
This change sets the hangup cause to AST_CAUSE_NO_ANSWER to be consistent with the
other operations.
Fixes: #963
UserNote: A Dial timeout on POST /channels/{channelId}/dial will now result in a
CANCEL and ChannelDestroyed with cause 19 / User alerting, no answer. Previously
no explicit cause was set, resulting in a cause of 16 / Normal Call Clearing.
#### chan_iax2: Minor improvements to documentation and warning messages.
Author: Naveen Albert
Date: 2025-04-18
* Update Dial() documentation for IAX2 to include syntax for RSA
public key names.
* Add additional details to a couple warnings to provide more context
when an undecodable frame is received.
Resolves: #1206
#### pbx_ael: unregister AELSub application and CLI commands on module load failure
Author: Andreas Wehrmann
Date: 2025-04-18
This fixes crashes/hangs I noticed with Asterisk 20.3.0 and 20.13.0 and quickly found out,
that the AEL module doesn't do proper cleanup when it fails to load.
This happens for example when there are syntax errors and AEL fails to compile in which case pbx_load_module()
returns an error but load_module() doesn't then unregister CLI cmds and the application.
#### res_pjproject: Fix DTLS client check failing on some platforms
Author: Albrecht Oster
Date: 2025-04-10
Certain platforms (mainly BSD derivatives) have an additional length
field in `sockaddr_in6` and `sockaddr_in`.
`ast_sockaddr_from_pj_sockaddr()` does not take this field into account
when copying over values from the `pj_sockaddr` into the `ast_sockaddr`.
The resulting `ast_sockaddr` will have an uninitialized value for
`sin6_len`/`sin_len` while the other `ast_sockaddr` (not converted from
a `pj_sockaddr`) to check against in `ast_sockaddr_pj_sockaddr_cmp()`
has the correct length value set.
This has the effect that `ast_sockaddr_cmp()` will always indicate
an address mismatch, because it does a bitwise comparison, and all DTLS
packets are dropped even if addresses and ports match.
`ast_sockaddr_from_pj_sockaddr()` now checks whether the length fields
are available on the current platform and sets the values accordingly.
Resolves: #505
#### Prequisites for ARI Outbound Websockets
Author: George Joseph
Date: 2025-04-16
stasis:
* Added stasis_app_is_registered().
* Added stasis_app_control_mark_failed().
* Added stasis_app_control_is_failed().
* Fixed res_stasis_device_state so unsubscribe all works properly.
* Modified stasis_app_unregister() to unsubscribe from all event sources.
* Modified stasis_app_exec to return -1 if stasis_app_control_is_failed()
returns true.
http:
* Added ast_http_create_basic_auth_header().
md5:
* Added define for MD5_DIGEST_LENGTH.
tcptls:
* Added flag to ast_tcptls_session_args to suppress connection log messages
to give callers more control over logging.
http_websocket:
* Add flag to ast_websocket_client_options to suppress connection log messages
to give callers more control over logging.
* Added username and password to ast_websocket_client_options to support
outbound basic authentication.
* Added ast_websocket_result_to_str().
#### contrib: Add systemd service and timer files for malloc trim.
Author: Ben Ford
Date: 2025-04-16
Adds two files to the contrib/systemd/ directory that can be installed
to periodically run "malloc trim" on Asterisk. These files do nothing
unless they are explicitly moved to the correct location on the system.
Users who are experiencing Asterisk memory issues can use this service
to potentially help combat the problem. These files can also be
configured to change the start time and interval. See systemd.timer(5)
and systemd.time(7) for more information.
UserNote: Service and timer files for systemd have been added to the
contrib/systemd/ directory. If you are experiencing memory issues,
install these files to have "malloc trim" periodically run on the
system.
#### action_redirect: remove after_bridge_goto_info
Author: Peter Jannesen
Date: 2025-03-13
Under certain circumstances the context/extens/prio are stored in the
after_bridge_goto_info. This info is used when the bridge is broken by
for hangup of the other party. In the situation that the bridge is
broken by an AMI Redirect this info is not used but also not removed.
With the result that when the channel is put back in a bridge and the
bridge is broken the execution continues at the wrong
context/extens/prio.
Resolves: #1144
#### channel: Always provide cause code in ChannelHangupRequest.
Author: Joshua C. Colp
Date: 2025-04-16
When queueing a channel to be hung up a cause code can be
specified in one of two ways:
1. ast_queue_hangup_with_cause
This function takes in a cause code and queues it as part
of the hangup request, which ultimately results in it being
set on the channel.
2. ast_channel_hangupcause_set + ast_queue_hangup
This combination sets the hangup cause on the channel before
queueing the hangup instead of as part of that process.
In the #2 case the ChannelHangupRequest event would not contain
the cause code. For consistency if a cause code has been set
on the channel it will now be added to the event.
Resolves: #1197
#### Add log-caller-id-name option to log Caller ID Name in queue log
Author: phoneben
Date: 2025-02-28
Add log-caller-id-name option to log Caller ID Name in queue log
This patch introduces a new global configuration option, log-caller-id-name,
to queues.conf to control whether the Caller ID name is logged when a call enters a queue.
When log-caller-id-name=yes, the Caller ID name is logged
as parameter 4 in the queue log, provided its allowed by the
existing log_restricted_caller_id rules. If log-caller-id-name=no (the default),
the Caller ID name is omitted from the logs.
Fixes: #1091
UserNote: This patch adds a global configuration option, log-caller-id-name, to queues.conf
to control whether the Caller ID name is logged as parameter 4 when a call enters a queue.
When log-caller-id-name=yes, the Caller ID name is included in the queue log,
Any '|' characters in the caller ID name will be replaced with '_'.
(provided its allowed by the existing log_restricted_caller_id rules).
When log-caller-id-name=no (the default), the Caller ID name is omitted.
#### asterisk.c: Add "pre-init" and "pre-module" capability to cli.conf.
Author: George Joseph
Date: 2025-04-10
Commands in the "[startup_commands]" section of cli.conf have historically run
after all core and module initialization has been completed and just before
"Asterisk Ready" is printed on the console. This meant that if you
wanted to debug initialization of a specific module, your only option
was to turn on debug for everything by setting "debug" in asterisk.conf.
This commit introduces options to allow you to run CLI commands earlier in
the asterisk startup process.
A command with a value of "pre-init" will run just after logger initialization
but before most core, and all module, initialization.
A command with a value of "pre-module" will run just after all core
initialization but before all module initialization.
A command with a value of "fully-booted" (or "yes" for backwards
compatibility) will run as they always have been...after all
initialization and just before "Asterisk Ready" is printed on the console.
This means you could do this...
```
[startup_commands]
core set debug 3 res_pjsip.so = pre-module
core set debug 0 res_pjsip.so = fully-booted
```
This would turn debugging on for res_pjsip.so to catch any module
initialization debug messages then turn it off again after the module is
loaded.
UserNote: In cli.conf, you can now define startup commands that run before
core initialization and before module initialization.
#### app_confbridge: Prevent crash when publishing channel-less event.
Author: Sean Bright
Date: 2025-04-07
Resolves: #1190
#### ari_websockets: Fix frack if ARI config fails to load.
Author: George Joseph
Date: 2025-04-02
ari_ws_session_registry_dtor() wasn't checking that the container was valid
before running ao2_callback on it to shutdown registered sessions.
#### ARI: REST over Websocket
Author: George Joseph
Date: 2025-03-12
This commit adds the ability to make ARI REST requests over the same
websocket used to receive events.
For full details on how to use the new capability, visit...
https://docs.asterisk.org/Configuration/Interfaces/Asterisk-REST-Interface-ARI/ARI-REST-over-WebSocket/
Changes:
* Added utilities to http.c:
* ast_get_http_method_from_string().
* ast_http_parse_post_form().
* Added utilities to json.c:
* ast_json_nvp_array_to_ast_variables().
* ast_variables_to_json_nvp_array().
* Added definitions for new events to carry REST responses.
* Created res/ari/ari_websocket_requests.c to house the new request handlers.
* Moved non-event specific code out of res/ari/resource_events.c into
res/ari/ari_websockets.c
* Refactored res/res_ari.c to move non-http code out of ast_ari_callback()
(which is http specific) and into ast_ari_invoke() so it can be shared
between both the http and websocket transports.
UpgradeNote: This commit adds the ability to make ARI REST requests over the same
websocket used to receive events.
See https://docs.asterisk.org/Configuration/Interfaces/Asterisk-REST-Interface-ARI/ARI-REST-over-WebSocket/
#### audiohook.c: Add ability to adjust volume with float
Author: mkmer
Date: 2025-03-18
Add the capability to audiohook for float type volume adjustments. This allows for adjustments to volume smaller than 6dB. With INT adjustments, the first step is 2 which converts to ~6dB (or 1/2 volume / double volume depending on adjustment sign). 3dB is a typical adjustment level which can now be accommodated with an adjustment value of 1.41.
This is accomplished by the following:
Convert internal variables to type float.
Always use ast_frame_adjust_volume_float() for adjustments.
Cast int to float in original functions ast_audiohook_volume_set(), and ast_volume_adjust().
Cast float to int in ast_audiohook_volume_get()
Add functions ast_audiohook_volume_get_float, ast_audiohook_volume_set_float, and ast_audiohook_volume_adjust_float.
This update maintains 100% backward compatibility.
Resolves: #1171
#### audiosocket: added support for DTMF frames
Author: Florent CHAUVEAU
Date: 2025-02-28
Updated the AudioSocket protocol to allow sending DTMF frames.
AST_FRAME_DTMF frames are now forwarded to the server, in addition to
AST_FRAME_AUDIO frames. A new payload type AST_AUDIOSOCKET_KIND_DTMF
with value 0x03 was added to the protocol. The payload is a 1-byte
ascii representing the DTMF digit (0-9,*,#...).
UserNote: The AudioSocket protocol now forwards DTMF frames with
payload type 0x03. The payload is a 1-byte ascii representing the DTMF
digit (0-9,*,#...).
#### asterisk/channel.h: fix documentation for 'ast_waitfor_nandfds()'
Author: Norm Harrison
Date: 2023-04-03
Co-authored-by: Florent CHAUVEAU <florentch@pm.me>
#### audiosocket: fix timeout, fix dialplan app exit, server address in logs
Author: Norm Harrison
Date: 2023-04-03
- Correct wait timeout logic in the dialplan application.
- Include server address in log messages for better traceability.
- Allow dialplan app to exit gracefully on hangup messages and socket closure.
- Optimize I/O by reducing redundant read()/write() operations.
Co-authored-by: Florent CHAUVEAU <florentch@pm.me>
#### chan_pjsip: Add the same details as PJSIPShowContacts to the CLI via 'pjsip s..
Author: Mark Murawski
Date: 2025-03-23
CLI 'pjsip show contact' does not show enough information.
One must telnet to AMI or write a script to ask Asterisk for example what the User-Agent is on a Contact
This feature adds the same details as PJSIPShowContacts to the CLI
Resolves: #643
#### Update config.guess and config.sub
Author: Zhai Liangliang
Date: 2025-03-26
#### chan_pjsip: set correct Endpoint Device State on multiple channels
Author: Alexei Gradinari
Date: 2025-03-25
1. When one channel is placed on hold, the device state is set to ONHOLD
without checking other channels states.
In case of AST_CONTROL_HOLD set the device state as AST_DEVICE_UNKNOWN
to calculate aggregate device state of all active channels.
2. The current implementation incorrectly classifies channels in use.
The only channels that has the states: UP, RING and BUSY are considered as "in use".
A channel should be considered "in use" if its state is anything other than
DOWN or RESERVED.
3. Currently, if the number of channels "in use" is greater than device_state_busy_at,
the system does not set the state to BUSY. Instead, it incorrectly assigns an aggregate
device state.
The endpoint device state should be BUSY if the number of channels "in use" is greater
than or equal to device_state_busy_at.
Fixes: #1181
#### file.c: missing "custom" sound files should not generate warning logs
Author: Allan Nathanson
Date: 2025-03-18
With `sounds_search_custom_dir = yes` we first look to see if a sound file
is present in the "custom" sound directory before looking in the standard
sound directories. We should not be issuing a WARNING log message if a
sound cannot be found in the "custom" directory.
Resolves: https://github.com/asterisk/asterisk/issues/1170

View File

@@ -0,0 +1,611 @@
<html><head><title>ChangeLog for asterisk-22.5.0</title></head><body>
<h2>Change Log for Release asterisk-22.5.0</h2>
<h3>Links:</h3>
<ul>
<li><a href="https://downloads.asterisk.org/pub/telephony/asterisk/releases/ChangeLog-22.5.0.html">Full ChangeLog</a> </li>
<li><a href="https://github.com/asterisk/asterisk/compare/22.4.1...22.5.0">GitHub Diff</a> </li>
<li><a href="https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22.5.0.tar.gz">Tarball</a> </li>
<li><a href="https://downloads.asterisk.org/pub/telephony/asterisk">Downloads</a> </li>
</ul>
<h3>Summary:</h3>
<ul>
<li>Commits: 29</li>
<li>Commit Authors: 14</li>
<li>Issues Resolved: 19</li>
<li>Security Advisories Resolved: 1</li>
<li><a href="https://github.com/asterisk/asterisk/security/advisories/GHSA-c7p6-7mvq-8jq2">GHSA-c7p6-7mvq-8jq2</a>: cli_permissions.conf: deny option does not work for disallowing shell commands</li>
</ul>
<h3>User Notes:</h3>
<ul>
<li>
<h4>res_stir_shaken.so: Handle X5U certificate chains.</h4>
<p>The STIR/SHAKEN verification process will now load a full
certificate chain retrieved via the X5U URL instead of loading only
the end user cert.</p>
</li>
<li>
<h4>res_stir_shaken: Add "ignore_sip_date_header" config option.</h4>
<p>A new STIR/SHAKEN verification option "ignore_sip_date_header" has
been added that when set to true, will cause the verification process to
not consider a missing or invalid SIP "Date" header to be a failure. This
will make the IAT the sole "truth" for Date in the verification process.
The option can be set in the "verification" and "profile" sections of
stir_shaken.conf.
Also fixed a bug in the port match logic.
Resolves: #1251
Resolves: #1271</p>
</li>
<li>
<h4>app_record: Add RECORDING_INFO function.</h4>
<p>The RECORDING_INFO function can now be used
to retrieve the duration of a recording.</p>
</li>
<li>
<h4>app_queue: queue rules Add support for QUEUE_RAISE_PENALTY=rN to raise penal..</h4>
<p>This change introduces QUEUE_RAISE_PENALTY=rN, allowing selective penalty raises
only for members whose current penalty is within the [min_penalty, max_penalty] range.
Members with lower or higher penalties are unaffected.
This behavior is backward-compatible with existing queue rule configurations.</p>
</li>
<li>
<h4>res_odbc: cache_size option to limit the cached connections.</h4>
<p>New cache_size option for res_odbc to on a per class basis limit the
number of cached connections. Please reference the sample configuration
for details.</p>
</li>
<li>
<h4>res_odbc: cache_type option for res_odbc.</h4>
<p>When using res_odbc it should be noted that back-end
connections to the underlying database can now be configured to re-use
the cached connections in a round-robin manner rather than repeatedly
re-using the same connection. This helps to keep connections alive, and
to purge dead connections from the system, thus more dynamically
adjusting to actual load. The downside is that one could keep too many
connections active for a longer time resulting in resource also begin
consumed on the database side.</p>
</li>
<li>
<h4>ARI Outbound Websockets</h4>
<p>Asterisk can now establish websocket sessions <em>to</em> your ARI applications
as well as accepting websocket sessions <em>from</em> them.
Full details: http://s.asterisk.net/ari-outbound-ws</p>
</li>
<li>
<h4>res_websocket_client: Create common utilities for websocket clients.</h4>
<p>A new module "res_websocket_client" and config file
"websocket_client.conf" have been added to support several upcoming new
capabilities that need common websocket client configuration.</p>
</li>
<li>
<h4>asterisk.c: Add option to restrict shell access from remote consoles.</h4>
<p>A new asterisk.conf option 'disable_remote_console_shell' has
been added that, when set, will prevent remote consoles from executing
shell commands using the '!' prefix.
Resolves: #GHSA-c7p6-7mvq-8jq2</p>
</li>
<li>
<h4>sig_analog: Add Call Waiting Deluxe support.</h4>
<p>Call Waiting Deluxe can now be enabled for FXS channels
by enabling its corresponding option.</p>
</li>
</ul>
<h3>Upgrade Notes:</h3>
<ul>
<li>
<h4>jansson: Upgrade version to jansson 2.14.1</h4>
<p>jansson has been upgraded to 2.14.1. For more
information visit jansson Github page: https://github.com/akheron/jansson/releases/tag/v2.14.1
Resolves: #1178</p>
</li>
<li>
<h4>Alternate Channel Storage Backends</h4>
<p>With this release, you can now select an alternate channel
storage backend based on C++ Maps. Using the new backend may increase
performance and reduce the chances of deadlocks on heavily loaded systems.
For more information, see http://s.asterisk.net/dc679ec3</p>
</li>
</ul>
<h3>Commit Authors:</h3>
<ul>
<li>George Joseph: (10)</li>
<li>Itzanh: (1)</li>
<li>Jaco Kroon: (2)</li>
<li>Joe Searle: (1)</li>
<li>Michal Hajek: (1)</li>
<li>Mike Bradeen: (2)</li>
<li>Mkmer: (1)</li>
<li>Nathan Monfils: (1)</li>
<li>Naveen Albert: (3)</li>
<li>Phoneben: (1)</li>
<li>Sean Bright: (2)</li>
<li>Stanislav Abramenkov: (1)</li>
<li>Sven Kube: (2)</li>
<li>Thomas B. Clark: (1)</li>
</ul>
<h2>Issue and Commit Detail:</h2>
<h3>Closed Issues:</h3>
<ul>
<li>!GHSA-c7p6-7mvq-8jq2: cli_permissions.conf: deny option does not work for disallowing shell commands</li>
<li>271: [new-feature]: sig_analog: Add Call Waiting Deluxe support.</li>
<li>548: [improvement]: Get Record() audio duration/length</li>
<li>1088: [bug]: app_sms: Compilation failure in DEVMODE due to stringop-overflow error in GCC 15 pre-release</li>
<li>1141: [bug]: res_pjsip: Contact header set incorrectly for call redirect (302 Moved temp.) when external_* set</li>
<li>1178: [improvement]: jansson: Upgrade version to jansson 2.14.1</li>
<li>1230: [bug]: ast_frame_adjust_volume and ast_frame_adjust_volume_float crash on interpolated frames</li>
<li>1234: [bug]: Set CalllerID lost on DTMF attended transfer</li>
<li>1240: [bug]: WebRTC invites failing on Chrome 136</li>
<li>1243: [bug]: make menuconfig fails due to changes in GTK callbacks</li>
<li>1251: [improvement]: PJSIP shouldn't require SIP Date header to process full shaken passport which includes iat</li>
<li>1254: [bug]: ActiveChannels not reported when using AMI command PJSIPShowEndpoint</li>
<li>1271: [bug]: STIR/SHAKEN not accepting port 8443 in certificate URLs</li>
<li>1272: [improvement]: STIR/SHAKEN handle X5U certificate chains</li>
<li>1276: MixMonitor produces broken recordings in bridged calls with asymmetric codecs (e.g., alaw vs G.722)</li>
<li>1279: [bug]: regression: 20.12.0 downgrades quality of wav16 recordings</li>
<li>1282: [bug]: Alternate Channel Storage Backends menuselect not enabling it</li>
<li>1287: [bug]: channelstorage.c: Compilation failure with DEBUG_FD_LEAKS</li>
<li>1288: [bug]: Crash when destroying channel with C++ alternative storage backend enabled</li>
<li>ASTERISK-30373: sig_analog: Add Call Waiting Deluxe options</li>
</ul>
<h3>Commits By Author:</h3>
<ul>
<li>
<h4>George Joseph (10):</h4>
</li>
<li>Alternate Channel Storage Backends</li>
<li>lock.h: Add include for string.h when DEBUG_THREADS is defined.</li>
<li>asterisk.c: Add option to restrict shell access from remote consoles.</li>
<li>res_websocket_client: Create common utilities for websocket clients.</li>
<li>ARI Outbound Websockets</li>
<li>res_websocket_client: Add more info to the XML documentation.</li>
<li>res_stir_shaken: Add "ignore_sip_date_header" config option.</li>
<li>res_stir_shaken.so: Handle X5U certificate chains.</li>
<li>channelstorage_cpp_map_name_id: Fix callback returning non-matching channels.</li>
<li>
<p>channelstorage: Rename callbacks that conflict with DEBUG_FD_LEAKS.</p>
</li>
<li>
<h4>Itzanh (1):</h4>
</li>
<li>
<p>app_sms.c: Fix sending and receiving SMS messages in protocol 2</p>
</li>
<li>
<h4>Jaco Kroon (2):</h4>
</li>
<li>res_odbc: cache_type option for res_odbc.</li>
<li>
<p>res_odbc: cache_size option to limit the cached connections.</p>
</li>
<li>
<h4>Joe Searle (1):</h4>
</li>
<li>
<p>pjproject: Increase maximum SDP formats and attribute limits</p>
</li>
<li>
<h4>Michal Hajek (1):</h4>
</li>
<li>
<p>audiohook.c: Improve frame pairing logic to avoid MixMonitor breakage with mix..</p>
</li>
<li>
<h4>Mike Bradeen (2):</h4>
</li>
<li>chan_pjsip: Serialize INVITE creation on DTMF attended transfer</li>
<li>
<p>res_pjsip_nat.c: Do not overwrite transfer host</p>
</li>
<li>
<h4>Nathan Monfils (1):</h4>
</li>
<li>
<p>manager.c: Invalid ref-counting when purging events</p>
</li>
<li>
<h4>Naveen Albert (3):</h4>
</li>
<li>app_sms: Ignore false positive vectorization warning.</li>
<li>sig_analog: Add Call Waiting Deluxe support.</li>
<li>
<p>app_record: Add RECORDING_INFO function.</p>
</li>
<li>
<h4>Sean Bright (2):</h4>
</li>
<li>res_pjsip: Fix empty <code>ActiveChannels</code> property in AMI responses.</li>
<li>
<p>channelstorage_makeopts.xml: Remove errant XML character.</p>
</li>
<li>
<h4>Stanislav Abramenkov (1):</h4>
</li>
<li>
<p>jansson: Upgrade version to jansson 2.14.1</p>
</li>
<li>
<h4>Sven Kube (2):</h4>
</li>
<li>res_audiosocket.c: Set the TCP_NODELAY socket option</li>
<li>
<p>res_audiosocket.c: Add retry mechanism for reading data from AudioSocket</p>
</li>
<li>
<h4>Thomas B. Clark (1):</h4>
</li>
<li>
<p>menuselect: Fix GTK menu callbacks for Fedora 42 compatibility</p>
</li>
<li>
<h4>mkmer (1):</h4>
</li>
<li>
<p>frame.c: validate frame data length is less than samples when adjusting volume</p>
</li>
<li>
<h4>phoneben (1):</h4>
</li>
<li>app_queue: queue rules Add support for QUEUE_RAISE_PENALTY=rN to raise penal..</li>
</ul>
<h3>Commit List:</h3>
<ul>
<li>channelstorage: Rename callbacks that conflict with DEBUG_FD_LEAKS.</li>
<li>channelstorage_cpp_map_name_id: Fix callback returning non-matching channels.</li>
<li>channelstorage_makeopts.xml: Remove errant XML character.</li>
<li>res_stir_shaken.so: Handle X5U certificate chains.</li>
<li>res_stir_shaken: Add "ignore_sip_date_header" config option.</li>
<li>app_record: Add RECORDING_INFO function.</li>
<li>app_sms.c: Fix sending and receiving SMS messages in protocol 2</li>
<li>res_websocket_client: Add more info to the XML documentation.</li>
<li>res_odbc: cache_size option to limit the cached connections.</li>
<li>res_odbc: cache_type option for res_odbc.</li>
<li>res_pjsip: Fix empty <code>ActiveChannels</code> property in AMI responses.</li>
<li>ARI Outbound Websockets</li>
<li>res_websocket_client: Create common utilities for websocket clients.</li>
<li>asterisk.c: Add option to restrict shell access from remote consoles.</li>
<li>frame.c: validate frame data length is less than samples when adjusting volume</li>
<li>res_audiosocket.c: Add retry mechanism for reading data from AudioSocket</li>
<li>res_audiosocket.c: Set the TCP_NODELAY socket option</li>
<li>menuselect: Fix GTK menu callbacks for Fedora 42 compatibility</li>
<li>jansson: Upgrade version to jansson 2.14.1</li>
<li>pjproject: Increase maximum SDP formats and attribute limits</li>
<li>manager.c: Invalid ref-counting when purging events</li>
<li>res_pjsip_nat.c: Do not overwrite transfer host</li>
<li>chan_pjsip: Serialize INVITE creation on DTMF attended transfer</li>
<li>sig_analog: Add Call Waiting Deluxe support.</li>
<li>app_sms: Ignore false positive vectorization warning.</li>
<li>lock.h: Add include for string.h when DEBUG_THREADS is defined.</li>
<li>Alternate Channel Storage Backends</li>
</ul>
<h3>Commit Details:</h3>
<h4>channelstorage: Rename callbacks that conflict with DEBUG_FD_LEAKS.</h4>
<p>Author: George Joseph
Date: 2025-07-08</p>
<p>DEBUG_FD_LEAKS replaces calls to "open" and "close" with functions that keep
track of file descriptors, even when those calls are actually callbacks
defined in structures like ast_channelstorage_instance-&gt;open and don't touch
file descriptors. This causes compilation failures. Those callbacks
have been renamed to "open_instance" and "close_instance" respectively.</p>
<p>Resolves: #1287</p>
<h4>channelstorage_cpp_map_name_id: Fix callback returning non-matching channels.</h4>
<p>Author: George Joseph
Date: 2025-07-09</p>
<p>When the callback() API was invoked but no channel passed the test, callback
would return the last channel tested instead of NULL. It now correctly
returns NULL when no channel matches.</p>
<p>Resolves: #1288</p>
<h4>audiohook.c: Improve frame pairing logic to avoid MixMonitor breakage with mix..</h4>
<p>Author: Michal Hajek
Date: 2025-05-21</p>
<p>This patch adjusts the read/write synchronization logic in audiohook_read_frame_both()
to better handle calls where participants use different codecs or sample sizes
(e.g., alaw vs G.722). The previous hard threshold of 2 * samples caused MixMonitor
recordings to break or stutter when frames were not aligned between both directions.</p>
<p>The new logic uses a more tolerant limit (1.5 * samples), which prevents audio tearing
without causing excessive buffer overruns. This fix specifically addresses issues
with MixMonitor when recording directly on a channel in a bridge using mixed codecs.</p>
<p>Reported-by: Michal Hajek <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#109;&#105;&#99;&#104;&#97;&#108;&#46;&#104;&#97;&#106;&#101;&#107;&#64;&#100;&#97;&#107;&#116;&#101;&#108;&#97;&#46;&#99;&#111;&#109;">&#109;&#105;&#99;&#104;&#97;&#108;&#46;&#104;&#97;&#106;&#101;&#107;&#64;&#100;&#97;&#107;&#116;&#101;&#108;&#97;&#46;&#99;&#111;&#109;</a></p>
<p>Resolves: #1276
Resolves: #1279</p>
<h4>channelstorage_makeopts.xml: Remove errant XML character.</h4>
<p>Author: Sean Bright
Date: 2025-06-30</p>
<p>Resolves: #1282</p>
<h4>res_stir_shaken.so: Handle X5U certificate chains.</h4>
<p>Author: George Joseph
Date: 2025-06-18</p>
<p>The verification process will now load a full certificate chain retrieved
via the X5U URL instead of loading only the end user cert.</p>
<ul>
<li>
<p>Renamed crypto_load_cert_from_file() and crypto_load_cert_from_memory()
to crypto_load_cert_chain_from_file() and crypto_load_cert_chain_from_memory()
respectively.</p>
</li>
<li>
<p>The two load functions now continue to load certs from the file or memory
PEMs and store them in a separate stack of untrusted certs specific to the
current verification context.</p>
</li>
<li>
<p>crypto_is_cert_trusted() now uses the stack of untrusted certs that were
extracted from the PEM in addition to any untrusted certs that were passed
in from the configuration (and any CA certs passed in from the config of
course).</p>
</li>
</ul>
<p>Resolves: #1272</p>
<p>UserNote: The STIR/SHAKEN verification process will now load a full
certificate chain retrieved via the X5U URL instead of loading only
the end user cert.</p>
<h4>res_stir_shaken: Add "ignore_sip_date_header" config option.</h4>
<p>Author: George Joseph
Date: 2025-06-15</p>
<p>UserNote: A new STIR/SHAKEN verification option "ignore_sip_date_header" has
been added that when set to true, will cause the verification process to
not consider a missing or invalid SIP "Date" header to be a failure. This
will make the IAT the sole "truth" for Date in the verification process.
The option can be set in the "verification" and "profile" sections of
stir_shaken.conf.</p>
<p>Also fixed a bug in the port match logic.</p>
<p>Resolves: #1251
Resolves: #1271</p>
<h4>app_record: Add RECORDING_INFO function.</h4>
<p>Author: Naveen Albert
Date: 2024-01-22</p>
<p>Add a function that can be used to retrieve info
about a previous recording, such as its duration.</p>
<p>This is being added as a function to avoid possibly
trampling on dialplan variables, and could be extended
to provide other information in the future.</p>
<p>Resolves: #548</p>
<p>UserNote: The RECORDING_INFO function can now be used
to retrieve the duration of a recording.</p>
<h4>app_sms.c: Fix sending and receiving SMS messages in protocol 2</h4>
<p>Author: Itzanh
Date: 2025-04-06</p>
<p>This fixes bugs in SMS messaging to SMS-capable analog phones that prevented app_sms.c from talking to phones using SMS protocol 2.</p>
<ul>
<li>Fix MORX message reception (from phone to Asterisk) in SMS protocol 2</li>
<li>Fix MTTX message transmission (from Asterisk to phone) in SMS protocol 2</li>
</ul>
<p>One of the bugs caused messages to have random characters and junk appended at the end up to the character limit. Another bug prevented Asterisk from sending messages from Asterisk to the phone at all. A final bug caused the transmission from Asterisk to the phone to take a long time because app_sms.c did not hang up after correctly sending the message, causing the phone to have to time out and hang up in order to complete the message transmission.</p>
<p>This was tested with a Linksys PAP2T and with a GrandStream HT814, sending and receiving messages with Telefónica DOMO Mensajes phones from Telefónica Spain. I had to play with both the network jitter buffer and the dB gain to get it to work. One of my phones required the gain to be set to +3dB for it to work, while another required it to be set to +6dB.</p>
<p>Only MORX and MTTX were tested, I did not test sending and receiving messages to a TelCo SMSC.</p>
<h4>app_queue: queue rules Add support for QUEUE_RAISE_PENALTY=rN to raise penal..</h4>
<p>Author: phoneben
Date: 2025-05-26</p>
<p>This update adds support for a new QUEUE_RAISE_PENALTY format: rN</p>
<p>When QUEUE_RAISE_PENALTY is set to rN (e.g., r4), only members whose current penalty
is greater than or equal to the defined min_penalty and less than or equal to max_penalty
will have their penalty raised to N.</p>
<p>Members with penalties outside the min/max range remain unchanged.</p>
<p>Example behaviors:</p>
<p>QUEUE_RAISE_PENALTY=4 → Raise all members with penalty &lt; 4 (existing behavior)
QUEUE_RAISE_PENALTY=r4 → Raise only members with penalty in [min_penalty, max_penalty] to 4</p>
<p>Implementation details:</p>
<p>Adds parsing logic to detect the r prefix and sets the raise_respect_min flag</p>
<p>Modifies the raise logic to skip members outside the defined penalty range when the flag is active</p>
<p>UserNote: This change introduces QUEUE_RAISE_PENALTY=rN, allowing selective penalty raises
only for members whose current penalty is within the [min_penalty, max_penalty] range.
Members with lower or higher penalties are unaffected.
This behavior is backward-compatible with existing queue rule configurations.</p>
<h4>res_websocket_client: Add more info to the XML documentation.</h4>
<p>Author: George Joseph
Date: 2025-06-05</p>
<p>Added "see-also" links to chan_websocket and ARI Outbound WebSocket and
added an example configuration for each.</p>
<h4>res_odbc: cache_size option to limit the cached connections.</h4>
<p>Author: Jaco Kroon
Date: 2024-12-13</p>
<p>Signed-off-by: Jaco Kroon <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#106;&#97;&#99;&#111;&#64;&#117;&#108;&#115;&#46;&#99;&#111;&#46;&#122;&#97;">&#106;&#97;&#99;&#111;&#64;&#117;&#108;&#115;&#46;&#99;&#111;&#46;&#122;&#97;</a></p>
<p>UserNote: New cache_size option for res_odbc to on a per class basis limit the
number of cached connections. Please reference the sample configuration
for details.</p>
<h4>res_odbc: cache_type option for res_odbc.</h4>
<p>Author: Jaco Kroon
Date: 2024-12-10</p>
<p>This enables setting cache_type classes to a round-robin queueing system
rather than the historic stack mechanism.</p>
<p>This should result in lower risk of connection drops due to shorter idle
times (the first connection to go onto the stack could in theory never
be used again, ever, but sit there consuming resources, there could be
multiple of these).</p>
<p>And with a queue rather than a stack, dead connections are guaranteed to
be detected and purged eventually.</p>
<p>This should end up better balancing connection_cnt with actual load
over time, assuming the database doesn't keep connections open
excessively long from it's side.</p>
<p>Signed-off-by: Jaco Kroon <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#106;&#97;&#99;&#111;&#64;&#117;&#108;&#115;&#46;&#99;&#111;&#46;&#122;&#97;">&#106;&#97;&#99;&#111;&#64;&#117;&#108;&#115;&#46;&#99;&#111;&#46;&#122;&#97;</a></p>
<p>UserNote: When using res_odbc it should be noted that back-end
connections to the underlying database can now be configured to re-use
the cached connections in a round-robin manner rather than repeatedly
re-using the same connection. This helps to keep connections alive, and
to purge dead connections from the system, thus more dynamically
adjusting to actual load. The downside is that one could keep too many
connections active for a longer time resulting in resource also begin
consumed on the database side.</p>
<h4>res_pjsip: Fix empty <code>ActiveChannels</code> property in AMI responses.</h4>
<p>Author: Sean Bright
Date: 2025-05-27</p>
<p>The logic appears to have been reversed since it was introduced in
05cbf8df.</p>
<p>Resolves: #1254</p>
<h4>ARI Outbound Websockets</h4>
<p>Author: George Joseph
Date: 2025-03-28</p>
<p>Asterisk can now establish websocket sessions <em>to</em> your ARI applications
as well as accepting websocket sessions <em>from</em> them.
Full details: http://s.asterisk.net/ari-outbound-ws</p>
<p>Code change summary:
* Added an ast_vector_string_join() function,
* Added ApplicationRegistered and ApplicationUnregistered ARI events.
* Converted res/ari/config.c to use sorcery to process ari.conf.
* Added the "outbound-websocket" ARI config object.
* Refactored res/ari/ari_websockets.c to handle outbound websockets.
* Refactored res/ari/cli.c for the sorcery changeover.
* Updated res/res_stasis.c for the sorcery changeover.
* Updated apps/app_stasis.c to allow initiating per-call outbound websockets.
* Added CLI commands to manage ARI websockets.
* Added the new "outbound-websocket" object to ari.conf.sample.
* Moved the ARI XML documentation out of res_ari.c into res/ari/ari_doc.xml</p>
<p>UserNote: Asterisk can now establish websocket sessions <em>to</em> your ARI applications
as well as accepting websocket sessions <em>from</em> them.
Full details: http://s.asterisk.net/ari-outbound-ws</p>
<h4>res_websocket_client: Create common utilities for websocket clients.</h4>
<p>Author: George Joseph
Date: 2025-05-02</p>
<p>Since multiple Asterisk capabilities now need to create websocket clients
it makes sense to create a common set of utilities rather than making
each of those capabilities implement their own.</p>
<ul>
<li>A new configuration file "websocket_client.conf" is used to store common
client parameters in named configuration sections.</li>
<li>APIs are provided to list and retrieve ast_websocket_client objects created
from the named configurations.</li>
<li>An API is provided that accepts an ast_websocket_client object, connects
to the remote server with retries and returns an ast_websocket object. TLS is
supported as is basic authentication.</li>
<li>An observer can be registered to receive notification of loaded or reloaded
client objects.</li>
<li>An API is provided to compare an existing client object to one just
reloaded and return the fields that were changed. The caller can then decide
what action to take based on which fields changed.</li>
</ul>
<p>Also as part of thie commit, several sorcery convenience macros were created
to make registering common object fields easier.</p>
<p>UserNote: A new module "res_websocket_client" and config file
"websocket_client.conf" have been added to support several upcoming new
capabilities that need common websocket client configuration.</p>
<h4>asterisk.c: Add option to restrict shell access from remote consoles.</h4>
<p>Author: George Joseph
Date: 2025-05-19</p>
<p>UserNote: A new asterisk.conf option 'disable_remote_console_shell' has
been added that, when set, will prevent remote consoles from executing
shell commands using the '!' prefix.</p>
<p>Resolves: #GHSA-c7p6-7mvq-8jq2</p>
<h4>frame.c: validate frame data length is less than samples when adjusting volume</h4>
<p>Author: mkmer
Date: 2025-05-12</p>
<p>Resolves: #1230</p>
<h4>res_audiosocket.c: Add retry mechanism for reading data from AudioSocket</h4>
<p>Author: Sven Kube
Date: 2025-05-13</p>
<p>The added retry mechanism addresses an issue that arises when fragmented TCP
packets are received, each containing only a portion of an AudioSocket packet.
This situation can occur if the external service sending the AudioSocket data
has Nagle's algorithm enabled.</p>
<h4>res_audiosocket.c: Set the TCP_NODELAY socket option</h4>
<p>Author: Sven Kube
Date: 2025-05-13</p>
<p>Disable Nagle's algorithm by setting the TCP_NODELAY socket option.
This reduces latency by preventing delays caused by packet buffering.</p>
<h4>menuselect: Fix GTK menu callbacks for Fedora 42 compatibility</h4>
<p>Author: Thomas B. Clark
Date: 2025-05-12</p>
<p>This patch resolves a build failure in <code>menuselect_gtk.c</code> when running
<code>make menuconfig</code> on Fedora 42. The new version of GTK introduced stricter
type checking for callback signatures.</p>
<p>Changes include:
- Add wrapper functions to match the expected <code>void (*)(void)</code> signature.
- Update <code>menu_items</code> array to use these wrappers.</p>
<p>Fixes: #1243</p>
<h4>jansson: Upgrade version to jansson 2.14.1</h4>
<p>Author: Stanislav Abramenkov
Date: 2025-03-24</p>
<p>UpgradeNote: jansson has been upgraded to 2.14.1. For more
information visit jansson Github page: https://github.com/akheron/jansson/releases/tag/v2.14.1</p>
<p>Resolves: #1178</p>
<h4>pjproject: Increase maximum SDP formats and attribute limits</h4>
<p>Author: Joe Searle
Date: 2025-05-15</p>
<p>Since Chrome 136, using Windows, when initiating a video call the INVITE SDP exceeds the maximum number of allowed attributes, resulting in the INVITE being rejected. This increases the attribute limit and the number of formats allowed when using bundled pjproject.</p>
<p>Fixes: #1240</p>
<h4>manager.c: Invalid ref-counting when purging events</h4>
<p>Author: Nathan Monfils
Date: 2025-05-05</p>
<p>We have a use-case where we generate a <em>lot</em> of events on the AMI, and
then when doing <code>manager show eventq</code> we would see some events which
would linger for hours or days in there. Obviously something was leaking.
Testing allowed us to track down this logic bug in the ref-counting on
the event purge.</p>
<p>Reproducing the bug was not super trivial, we managed to do it in a
production-like load testing environment with multiple AMI consumers.</p>
<p>The race condition itself:</p>
<ol>
<li>something allocates and links <code>session</code></li>
<li><code>purge_sessions</code> iterates over that <code>session</code> (takes ref)</li>
<li><code>purge_session</code> correctly de-referencess that session</li>
<li><code>purge_session</code> re-evaluates the while() loop, taking a reference</li>
<li><code>purge_session</code> exits (<code>n_max &gt; 0</code> is false)</li>
<li>whatever allocated the <code>session</code> deallocates it, but a reference is
now lost since we exited the <code>while</code> loop before de-referencing.</li>
<li>since the destructor is never called, the session-&gt;last_ev-&gt;usecount
is never decremented, leading to events lingering in the queue</li>
</ol>
<p>The impact of this bug does not seem major. The events are small and do
not seem, from our testing, to be causing meaningful additional CPU
usage. Mainly we wanted to fix this issue because we are internally
adding prometheus metrics to the eventq and those leaked events were
causing the metrics to show garbage data.</p>
<h4>res_pjsip_nat.c: Do not overwrite transfer host</h4>
<p>Author: Mike Bradeen
Date: 2025-05-08</p>
<p>When a call is transfered via dialplan behind a NAT, the
host portion of the Contact header in the 302 will no longer
be over-written with the external NAT IP and will retain the
hostname.</p>
<p>Fixes: #1141</p>
<h4>chan_pjsip: Serialize INVITE creation on DTMF attended transfer</h4>
<p>Author: Mike Bradeen
Date: 2025-05-05</p>
<p>When a call is transfered via DTMF feature code, the Transfer Target and
Transferer are bridged immediately. This opens the possibilty of a race
condition between the creation of an INVITE and the bridge induced colp
update that can result in the set caller ID being over-written with the
transferer's default info.</p>
<p>Fixes: #1234</p>
<h4>sig_analog: Add Call Waiting Deluxe support.</h4>
<p>Author: Naveen Albert
Date: 2023-08-24</p>
<p>Adds support for Call Waiting Deluxe options to enhance
the current call waiting feature.</p>
<p>As part of this change, a mechanism is also added that
allows a channel driver to queue an audio file for Dial()
to play, which is necessary for the announcement function.</p>
<p>ASTERISK-30373 #close</p>
<p>Resolves: #271</p>
<p>UserNote: Call Waiting Deluxe can now be enabled for FXS channels
by enabling its corresponding option.</p>
<h4>app_sms: Ignore false positive vectorization warning.</h4>
<p>Author: Naveen Albert
Date: 2025-01-24</p>
<p>Ignore gcc warning about writing 32 bytes into a region of size 6,
since we check that we don't go out of bounds for each byte.
This is due to a vectorization bug in gcc 15, stemming from
gcc commit 68326d5d1a593dc0bf098c03aac25916168bc5a9.</p>
<p>Resolves: #1088</p>
<h4>lock.h: Add include for string.h when DEBUG_THREADS is defined.</h4>
<p>Author: George Joseph
Date: 2025-05-02</p>
<p>When DEBUG_THREADS is defined, lock.h uses strerror(), which is defined
in the libc string.h file, to print warning messages. If the including
source file doesn't include string.h then strerror() won't be found and
and compile errors will be thrown. Since lock.h depends on this, string.h
is now included from there if DEBUG_THREADS is defined. This way, including
source files don't have to worry about it.</p>
<h4>Alternate Channel Storage Backends</h4>
<p>Author: George Joseph
Date: 2024-12-31</p>
<p>Full details: http://s.asterisk.net/dc679ec3</p>
<p>The previous proof-of-concept showed that the cpp_map_name_id alternate
storage backed performed better than all the others so this final PR
adds only that option. You still need to enable it in menuselect under
the "Alternate Channel Storage Backends" category.</p>
<p>To select which one is used at runtime, set the "channel_storage_backend"
option in asterisk.conf to one of the values described in
asterisk.conf.sample. The default remains "ao2_legacy".</p>
<p>UpgradeNote: With this release, you can now select an alternate channel
storage backend based on C++ Maps. Using the new backend may increase
performance and reduce the chances of deadlocks on heavily loaded systems.
For more information, see http://s.asterisk.net/dc679ec3</p>
</body></html>

View File

@@ -0,0 +1,677 @@
## Change Log for Release asterisk-22.5.0
### Links:
- [Full ChangeLog](https://downloads.asterisk.org/pub/telephony/asterisk/releases/ChangeLog-22.5.0.html)
- [GitHub Diff](https://github.com/asterisk/asterisk/compare/22.4.1...22.5.0)
- [Tarball](https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22.5.0.tar.gz)
- [Downloads](https://downloads.asterisk.org/pub/telephony/asterisk)
### Summary:
- Commits: 29
- Commit Authors: 14
- Issues Resolved: 19
- Security Advisories Resolved: 1
- [GHSA-c7p6-7mvq-8jq2](https://github.com/asterisk/asterisk/security/advisories/GHSA-c7p6-7mvq-8jq2): cli_permissions.conf: deny option does not work for disallowing shell commands
### User Notes:
- #### res_stir_shaken.so: Handle X5U certificate chains.
The STIR/SHAKEN verification process will now load a full
certificate chain retrieved via the X5U URL instead of loading only
the end user cert.
- #### res_stir_shaken: Add "ignore_sip_date_header" config option.
A new STIR/SHAKEN verification option "ignore_sip_date_header" has
been added that when set to true, will cause the verification process to
not consider a missing or invalid SIP "Date" header to be a failure. This
will make the IAT the sole "truth" for Date in the verification process.
The option can be set in the "verification" and "profile" sections of
stir_shaken.conf.
Also fixed a bug in the port match logic.
Resolves: #1251
Resolves: #1271
- #### app_record: Add RECORDING_INFO function.
The RECORDING_INFO function can now be used
to retrieve the duration of a recording.
- #### app_queue: queue rules Add support for QUEUE_RAISE_PENALTY=rN to raise penal..
This change introduces QUEUE_RAISE_PENALTY=rN, allowing selective penalty raises
only for members whose current penalty is within the [min_penalty, max_penalty] range.
Members with lower or higher penalties are unaffected.
This behavior is backward-compatible with existing queue rule configurations.
- #### res_odbc: cache_size option to limit the cached connections.
New cache_size option for res_odbc to on a per class basis limit the
number of cached connections. Please reference the sample configuration
for details.
- #### res_odbc: cache_type option for res_odbc.
When using res_odbc it should be noted that back-end
connections to the underlying database can now be configured to re-use
the cached connections in a round-robin manner rather than repeatedly
re-using the same connection. This helps to keep connections alive, and
to purge dead connections from the system, thus more dynamically
adjusting to actual load. The downside is that one could keep too many
connections active for a longer time resulting in resource also begin
consumed on the database side.
- #### ARI Outbound Websockets
Asterisk can now establish websocket sessions _to_ your ARI applications
as well as accepting websocket sessions _from_ them.
Full details: http://s.asterisk.net/ari-outbound-ws
- #### res_websocket_client: Create common utilities for websocket clients.
A new module "res_websocket_client" and config file
"websocket_client.conf" have been added to support several upcoming new
capabilities that need common websocket client configuration.
- #### asterisk.c: Add option to restrict shell access from remote consoles.
A new asterisk.conf option 'disable_remote_console_shell' has
been added that, when set, will prevent remote consoles from executing
shell commands using the '!' prefix.
Resolves: #GHSA-c7p6-7mvq-8jq2
- #### sig_analog: Add Call Waiting Deluxe support.
Call Waiting Deluxe can now be enabled for FXS channels
by enabling its corresponding option.
### Upgrade Notes:
- #### jansson: Upgrade version to jansson 2.14.1
jansson has been upgraded to 2.14.1. For more
information visit jansson Github page: https://github.com/akheron/jansson/releases/tag/v2.14.1
Resolves: #1178
- #### Alternate Channel Storage Backends
With this release, you can now select an alternate channel
storage backend based on C++ Maps. Using the new backend may increase
performance and reduce the chances of deadlocks on heavily loaded systems.
For more information, see http://s.asterisk.net/dc679ec3
### Commit Authors:
- George Joseph: (10)
- Itzanh: (1)
- Jaco Kroon: (2)
- Joe Searle: (1)
- Michal Hajek: (1)
- Mike Bradeen: (2)
- Mkmer: (1)
- Nathan Monfils: (1)
- Naveen Albert: (3)
- Phoneben: (1)
- Sean Bright: (2)
- Stanislav Abramenkov: (1)
- Sven Kube: (2)
- Thomas B. Clark: (1)
## Issue and Commit Detail:
### Closed Issues:
- !GHSA-c7p6-7mvq-8jq2: cli_permissions.conf: deny option does not work for disallowing shell commands
- 271: [new-feature]: sig_analog: Add Call Waiting Deluxe support.
- 548: [improvement]: Get Record() audio duration/length
- 1088: [bug]: app_sms: Compilation failure in DEVMODE due to stringop-overflow error in GCC 15 pre-release
- 1141: [bug]: res_pjsip: Contact header set incorrectly for call redirect (302 Moved temp.) when external_* set
- 1178: [improvement]: jansson: Upgrade version to jansson 2.14.1
- 1230: [bug]: ast_frame_adjust_volume and ast_frame_adjust_volume_float crash on interpolated frames
- 1234: [bug]: Set CalllerID lost on DTMF attended transfer
- 1240: [bug]: WebRTC invites failing on Chrome 136
- 1243: [bug]: make menuconfig fails due to changes in GTK callbacks
- 1251: [improvement]: PJSIP shouldn't require SIP Date header to process full shaken passport which includes iat
- 1254: [bug]: ActiveChannels not reported when using AMI command PJSIPShowEndpoint
- 1271: [bug]: STIR/SHAKEN not accepting port 8443 in certificate URLs
- 1272: [improvement]: STIR/SHAKEN handle X5U certificate chains
- 1276: MixMonitor produces broken recordings in bridged calls with asymmetric codecs (e.g., alaw vs G.722)
- 1279: [bug]: regression: 20.12.0 downgrades quality of wav16 recordings
- 1282: [bug]: Alternate Channel Storage Backends menuselect not enabling it
- 1287: [bug]: channelstorage.c: Compilation failure with DEBUG_FD_LEAKS
- 1288: [bug]: Crash when destroying channel with C++ alternative storage backend enabled
- ASTERISK-30373: sig_analog: Add Call Waiting Deluxe options
### Commits By Author:
- #### George Joseph (10):
- Alternate Channel Storage Backends
- lock.h: Add include for string.h when DEBUG_THREADS is defined.
- asterisk.c: Add option to restrict shell access from remote consoles.
- res_websocket_client: Create common utilities for websocket clients.
- ARI Outbound Websockets
- res_websocket_client: Add more info to the XML documentation.
- res_stir_shaken: Add "ignore_sip_date_header" config option.
- res_stir_shaken.so: Handle X5U certificate chains.
- channelstorage_cpp_map_name_id: Fix callback returning non-matching channels.
- channelstorage: Rename callbacks that conflict with DEBUG_FD_LEAKS.
- #### Itzanh (1):
- app_sms.c: Fix sending and receiving SMS messages in protocol 2
- #### Jaco Kroon (2):
- res_odbc: cache_type option for res_odbc.
- res_odbc: cache_size option to limit the cached connections.
- #### Joe Searle (1):
- pjproject: Increase maximum SDP formats and attribute limits
- #### Michal Hajek (1):
- audiohook.c: Improve frame pairing logic to avoid MixMonitor breakage with mix..
- #### Mike Bradeen (2):
- chan_pjsip: Serialize INVITE creation on DTMF attended transfer
- res_pjsip_nat.c: Do not overwrite transfer host
- #### Nathan Monfils (1):
- manager.c: Invalid ref-counting when purging events
- #### Naveen Albert (3):
- app_sms: Ignore false positive vectorization warning.
- sig_analog: Add Call Waiting Deluxe support.
- app_record: Add RECORDING_INFO function.
- #### Sean Bright (2):
- res_pjsip: Fix empty `ActiveChannels` property in AMI responses.
- channelstorage_makeopts.xml: Remove errant XML character.
- #### Stanislav Abramenkov (1):
- jansson: Upgrade version to jansson 2.14.1
- #### Sven Kube (2):
- res_audiosocket.c: Set the TCP_NODELAY socket option
- res_audiosocket.c: Add retry mechanism for reading data from AudioSocket
- #### Thomas B. Clark (1):
- menuselect: Fix GTK menu callbacks for Fedora 42 compatibility
- #### mkmer (1):
- frame.c: validate frame data length is less than samples when adjusting volume
- #### phoneben (1):
- app_queue: queue rules Add support for QUEUE_RAISE_PENALTY=rN to raise penal..
### Commit List:
- channelstorage: Rename callbacks that conflict with DEBUG_FD_LEAKS.
- channelstorage_cpp_map_name_id: Fix callback returning non-matching channels.
- channelstorage_makeopts.xml: Remove errant XML character.
- res_stir_shaken.so: Handle X5U certificate chains.
- res_stir_shaken: Add "ignore_sip_date_header" config option.
- app_record: Add RECORDING_INFO function.
- app_sms.c: Fix sending and receiving SMS messages in protocol 2
- res_websocket_client: Add more info to the XML documentation.
- res_odbc: cache_size option to limit the cached connections.
- res_odbc: cache_type option for res_odbc.
- res_pjsip: Fix empty `ActiveChannels` property in AMI responses.
- ARI Outbound Websockets
- res_websocket_client: Create common utilities for websocket clients.
- asterisk.c: Add option to restrict shell access from remote consoles.
- frame.c: validate frame data length is less than samples when adjusting volume
- res_audiosocket.c: Add retry mechanism for reading data from AudioSocket
- res_audiosocket.c: Set the TCP_NODELAY socket option
- menuselect: Fix GTK menu callbacks for Fedora 42 compatibility
- jansson: Upgrade version to jansson 2.14.1
- pjproject: Increase maximum SDP formats and attribute limits
- manager.c: Invalid ref-counting when purging events
- res_pjsip_nat.c: Do not overwrite transfer host
- chan_pjsip: Serialize INVITE creation on DTMF attended transfer
- sig_analog: Add Call Waiting Deluxe support.
- app_sms: Ignore false positive vectorization warning.
- lock.h: Add include for string.h when DEBUG_THREADS is defined.
- Alternate Channel Storage Backends
### Commit Details:
#### channelstorage: Rename callbacks that conflict with DEBUG_FD_LEAKS.
Author: George Joseph
Date: 2025-07-08
DEBUG_FD_LEAKS replaces calls to "open" and "close" with functions that keep
track of file descriptors, even when those calls are actually callbacks
defined in structures like ast_channelstorage_instance->open and don't touch
file descriptors. This causes compilation failures. Those callbacks
have been renamed to "open_instance" and "close_instance" respectively.
Resolves: #1287
#### channelstorage_cpp_map_name_id: Fix callback returning non-matching channels.
Author: George Joseph
Date: 2025-07-09
When the callback() API was invoked but no channel passed the test, callback
would return the last channel tested instead of NULL. It now correctly
returns NULL when no channel matches.
Resolves: #1288
#### audiohook.c: Improve frame pairing logic to avoid MixMonitor breakage with mix..
Author: Michal Hajek
Date: 2025-05-21
This patch adjusts the read/write synchronization logic in audiohook_read_frame_both()
to better handle calls where participants use different codecs or sample sizes
(e.g., alaw vs G.722). The previous hard threshold of 2 * samples caused MixMonitor
recordings to break or stutter when frames were not aligned between both directions.
The new logic uses a more tolerant limit (1.5 * samples), which prevents audio tearing
without causing excessive buffer overruns. This fix specifically addresses issues
with MixMonitor when recording directly on a channel in a bridge using mixed codecs.
Reported-by: Michal Hajek <michal.hajek@daktela.com>
Resolves: #1276
Resolves: #1279
#### channelstorage_makeopts.xml: Remove errant XML character.
Author: Sean Bright
Date: 2025-06-30
Resolves: #1282
#### res_stir_shaken.so: Handle X5U certificate chains.
Author: George Joseph
Date: 2025-06-18
The verification process will now load a full certificate chain retrieved
via the X5U URL instead of loading only the end user cert.
* Renamed crypto_load_cert_from_file() and crypto_load_cert_from_memory()
to crypto_load_cert_chain_from_file() and crypto_load_cert_chain_from_memory()
respectively.
* The two load functions now continue to load certs from the file or memory
PEMs and store them in a separate stack of untrusted certs specific to the
current verification context.
* crypto_is_cert_trusted() now uses the stack of untrusted certs that were
extracted from the PEM in addition to any untrusted certs that were passed
in from the configuration (and any CA certs passed in from the config of
course).
Resolves: #1272
UserNote: The STIR/SHAKEN verification process will now load a full
certificate chain retrieved via the X5U URL instead of loading only
the end user cert.
#### res_stir_shaken: Add "ignore_sip_date_header" config option.
Author: George Joseph
Date: 2025-06-15
UserNote: A new STIR/SHAKEN verification option "ignore_sip_date_header" has
been added that when set to true, will cause the verification process to
not consider a missing or invalid SIP "Date" header to be a failure. This
will make the IAT the sole "truth" for Date in the verification process.
The option can be set in the "verification" and "profile" sections of
stir_shaken.conf.
Also fixed a bug in the port match logic.
Resolves: #1251
Resolves: #1271
#### app_record: Add RECORDING_INFO function.
Author: Naveen Albert
Date: 2024-01-22
Add a function that can be used to retrieve info
about a previous recording, such as its duration.
This is being added as a function to avoid possibly
trampling on dialplan variables, and could be extended
to provide other information in the future.
Resolves: #548
UserNote: The RECORDING_INFO function can now be used
to retrieve the duration of a recording.
#### app_sms.c: Fix sending and receiving SMS messages in protocol 2
Author: Itzanh
Date: 2025-04-06
This fixes bugs in SMS messaging to SMS-capable analog phones that prevented app_sms.c from talking to phones using SMS protocol 2.
- Fix MORX message reception (from phone to Asterisk) in SMS protocol 2
- Fix MTTX message transmission (from Asterisk to phone) in SMS protocol 2
One of the bugs caused messages to have random characters and junk appended at the end up to the character limit. Another bug prevented Asterisk from sending messages from Asterisk to the phone at all. A final bug caused the transmission from Asterisk to the phone to take a long time because app_sms.c did not hang up after correctly sending the message, causing the phone to have to time out and hang up in order to complete the message transmission.
This was tested with a Linksys PAP2T and with a GrandStream HT814, sending and receiving messages with Telefónica DOMO Mensajes phones from Telefónica Spain. I had to play with both the network jitter buffer and the dB gain to get it to work. One of my phones required the gain to be set to +3dB for it to work, while another required it to be set to +6dB.
Only MORX and MTTX were tested, I did not test sending and receiving messages to a TelCo SMSC.
#### app_queue: queue rules Add support for QUEUE_RAISE_PENALTY=rN to raise penal..
Author: phoneben
Date: 2025-05-26
This update adds support for a new QUEUE_RAISE_PENALTY format: rN
When QUEUE_RAISE_PENALTY is set to rN (e.g., r4), only members whose current penalty
is greater than or equal to the defined min_penalty and less than or equal to max_penalty
will have their penalty raised to N.
Members with penalties outside the min/max range remain unchanged.
Example behaviors:
QUEUE_RAISE_PENALTY=4 → Raise all members with penalty < 4 (existing behavior)
QUEUE_RAISE_PENALTY=r4 Raise only members with penalty in [min_penalty, max_penalty] to 4
Implementation details:
Adds parsing logic to detect the r prefix and sets the raise_respect_min flag
Modifies the raise logic to skip members outside the defined penalty range when the flag is active
UserNote: This change introduces QUEUE_RAISE_PENALTY=rN, allowing selective penalty raises
only for members whose current penalty is within the [min_penalty, max_penalty] range.
Members with lower or higher penalties are unaffected.
This behavior is backward-compatible with existing queue rule configurations.
#### res_websocket_client: Add more info to the XML documentation.
Author: George Joseph
Date: 2025-06-05
Added "see-also" links to chan_websocket and ARI Outbound WebSocket and
added an example configuration for each.
#### res_odbc: cache_size option to limit the cached connections.
Author: Jaco Kroon
Date: 2024-12-13
Signed-off-by: Jaco Kroon <jaco@uls.co.za>
UserNote: New cache_size option for res_odbc to on a per class basis limit the
number of cached connections. Please reference the sample configuration
for details.
#### res_odbc: cache_type option for res_odbc.
Author: Jaco Kroon
Date: 2024-12-10
This enables setting cache_type classes to a round-robin queueing system
rather than the historic stack mechanism.
This should result in lower risk of connection drops due to shorter idle
times (the first connection to go onto the stack could in theory never
be used again, ever, but sit there consuming resources, there could be
multiple of these).
And with a queue rather than a stack, dead connections are guaranteed to
be detected and purged eventually.
This should end up better balancing connection_cnt with actual load
over time, assuming the database doesn't keep connections open
excessively long from it's side.
Signed-off-by: Jaco Kroon <jaco@uls.co.za>
UserNote: When using res_odbc it should be noted that back-end
connections to the underlying database can now be configured to re-use
the cached connections in a round-robin manner rather than repeatedly
re-using the same connection. This helps to keep connections alive, and
to purge dead connections from the system, thus more dynamically
adjusting to actual load. The downside is that one could keep too many
connections active for a longer time resulting in resource also begin
consumed on the database side.
#### res_pjsip: Fix empty `ActiveChannels` property in AMI responses.
Author: Sean Bright
Date: 2025-05-27
The logic appears to have been reversed since it was introduced in
05cbf8df.
Resolves: #1254
#### ARI Outbound Websockets
Author: George Joseph
Date: 2025-03-28
Asterisk can now establish websocket sessions _to_ your ARI applications
as well as accepting websocket sessions _from_ them.
Full details: http://s.asterisk.net/ari-outbound-ws
Code change summary:
* Added an ast_vector_string_join() function,
* Added ApplicationRegistered and ApplicationUnregistered ARI events.
* Converted res/ari/config.c to use sorcery to process ari.conf.
* Added the "outbound-websocket" ARI config object.
* Refactored res/ari/ari_websockets.c to handle outbound websockets.
* Refactored res/ari/cli.c for the sorcery changeover.
* Updated res/res_stasis.c for the sorcery changeover.
* Updated apps/app_stasis.c to allow initiating per-call outbound websockets.
* Added CLI commands to manage ARI websockets.
* Added the new "outbound-websocket" object to ari.conf.sample.
* Moved the ARI XML documentation out of res_ari.c into res/ari/ari_doc.xml
UserNote: Asterisk can now establish websocket sessions _to_ your ARI applications
as well as accepting websocket sessions _from_ them.
Full details: http://s.asterisk.net/ari-outbound-ws
#### res_websocket_client: Create common utilities for websocket clients.
Author: George Joseph
Date: 2025-05-02
Since multiple Asterisk capabilities now need to create websocket clients
it makes sense to create a common set of utilities rather than making
each of those capabilities implement their own.
* A new configuration file "websocket_client.conf" is used to store common
client parameters in named configuration sections.
* APIs are provided to list and retrieve ast_websocket_client objects created
from the named configurations.
* An API is provided that accepts an ast_websocket_client object, connects
to the remote server with retries and returns an ast_websocket object. TLS is
supported as is basic authentication.
* An observer can be registered to receive notification of loaded or reloaded
client objects.
* An API is provided to compare an existing client object to one just
reloaded and return the fields that were changed. The caller can then decide
what action to take based on which fields changed.
Also as part of thie commit, several sorcery convenience macros were created
to make registering common object fields easier.
UserNote: A new module "res_websocket_client" and config file
"websocket_client.conf" have been added to support several upcoming new
capabilities that need common websocket client configuration.
#### asterisk.c: Add option to restrict shell access from remote consoles.
Author: George Joseph
Date: 2025-05-19
UserNote: A new asterisk.conf option 'disable_remote_console_shell' has
been added that, when set, will prevent remote consoles from executing
shell commands using the '!' prefix.
Resolves: #GHSA-c7p6-7mvq-8jq2
#### frame.c: validate frame data length is less than samples when adjusting volume
Author: mkmer
Date: 2025-05-12
Resolves: #1230
#### res_audiosocket.c: Add retry mechanism for reading data from AudioSocket
Author: Sven Kube
Date: 2025-05-13
The added retry mechanism addresses an issue that arises when fragmented TCP
packets are received, each containing only a portion of an AudioSocket packet.
This situation can occur if the external service sending the AudioSocket data
has Nagle's algorithm enabled.
#### res_audiosocket.c: Set the TCP_NODELAY socket option
Author: Sven Kube
Date: 2025-05-13
Disable Nagle's algorithm by setting the TCP_NODELAY socket option.
This reduces latency by preventing delays caused by packet buffering.
#### menuselect: Fix GTK menu callbacks for Fedora 42 compatibility
Author: Thomas B. Clark
Date: 2025-05-12
This patch resolves a build failure in `menuselect_gtk.c` when running
`make menuconfig` on Fedora 42. The new version of GTK introduced stricter
type checking for callback signatures.
Changes include:
- Add wrapper functions to match the expected `void (*)(void)` signature.
- Update `menu_items` array to use these wrappers.
Fixes: #1243
#### jansson: Upgrade version to jansson 2.14.1
Author: Stanislav Abramenkov
Date: 2025-03-24
UpgradeNote: jansson has been upgraded to 2.14.1. For more
information visit jansson Github page: https://github.com/akheron/jansson/releases/tag/v2.14.1
Resolves: #1178
#### pjproject: Increase maximum SDP formats and attribute limits
Author: Joe Searle
Date: 2025-05-15
Since Chrome 136, using Windows, when initiating a video call the INVITE SDP exceeds the maximum number of allowed attributes, resulting in the INVITE being rejected. This increases the attribute limit and the number of formats allowed when using bundled pjproject.
Fixes: #1240
#### manager.c: Invalid ref-counting when purging events
Author: Nathan Monfils
Date: 2025-05-05
We have a use-case where we generate a *lot* of events on the AMI, and
then when doing `manager show eventq` we would see some events which
would linger for hours or days in there. Obviously something was leaking.
Testing allowed us to track down this logic bug in the ref-counting on
the event purge.
Reproducing the bug was not super trivial, we managed to do it in a
production-like load testing environment with multiple AMI consumers.
The race condition itself:
1. something allocates and links `session`
2. `purge_sessions` iterates over that `session` (takes ref)
3. `purge_session` correctly de-referencess that session
4. `purge_session` re-evaluates the while() loop, taking a reference
5. `purge_session` exits (`n_max > 0` is false)
6. whatever allocated the `session` deallocates it, but a reference is
now lost since we exited the `while` loop before de-referencing.
7. since the destructor is never called, the session->last_ev->usecount
is never decremented, leading to events lingering in the queue
The impact of this bug does not seem major. The events are small and do
not seem, from our testing, to be causing meaningful additional CPU
usage. Mainly we wanted to fix this issue because we are internally
adding prometheus metrics to the eventq and those leaked events were
causing the metrics to show garbage data.
#### res_pjsip_nat.c: Do not overwrite transfer host
Author: Mike Bradeen
Date: 2025-05-08
When a call is transfered via dialplan behind a NAT, the
host portion of the Contact header in the 302 will no longer
be over-written with the external NAT IP and will retain the
hostname.
Fixes: #1141
#### chan_pjsip: Serialize INVITE creation on DTMF attended transfer
Author: Mike Bradeen
Date: 2025-05-05
When a call is transfered via DTMF feature code, the Transfer Target and
Transferer are bridged immediately. This opens the possibilty of a race
condition between the creation of an INVITE and the bridge induced colp
update that can result in the set caller ID being over-written with the
transferer's default info.
Fixes: #1234
#### sig_analog: Add Call Waiting Deluxe support.
Author: Naveen Albert
Date: 2023-08-24
Adds support for Call Waiting Deluxe options to enhance
the current call waiting feature.
As part of this change, a mechanism is also added that
allows a channel driver to queue an audio file for Dial()
to play, which is necessary for the announcement function.
ASTERISK-30373 #close
Resolves: #271
UserNote: Call Waiting Deluxe can now be enabled for FXS channels
by enabling its corresponding option.
#### app_sms: Ignore false positive vectorization warning.
Author: Naveen Albert
Date: 2025-01-24
Ignore gcc warning about writing 32 bytes into a region of size 6,
since we check that we don't go out of bounds for each byte.
This is due to a vectorization bug in gcc 15, stemming from
gcc commit 68326d5d1a593dc0bf098c03aac25916168bc5a9.
Resolves: #1088
#### lock.h: Add include for string.h when DEBUG_THREADS is defined.
Author: George Joseph
Date: 2025-05-02
When DEBUG_THREADS is defined, lock.h uses strerror(), which is defined
in the libc string.h file, to print warning messages. If the including
source file doesn't include string.h then strerror() won't be found and
and compile errors will be thrown. Since lock.h depends on this, string.h
is now included from there if DEBUG_THREADS is defined. This way, including
source files don't have to worry about it.
#### Alternate Channel Storage Backends
Author: George Joseph
Date: 2024-12-31
Full details: http://s.asterisk.net/dc679ec3
The previous proof-of-concept showed that the cpp_map_name_id alternate
storage backed performed better than all the others so this final PR
adds only that option. You still need to enable it in menuselect under
the "Alternate Channel Storage Backends" category.
To select which one is used at runtime, set the "channel_storage_backend"
option in asterisk.conf to one of the values described in
asterisk.conf.sample. The default remains "ao2_legacy".
UpgradeNote: With this release, you can now select an alternate channel
storage backend based on C++ Maps. Using the new backend may increase
performance and reduce the chances of deadlocks on heavily loaded systems.
For more information, see http://s.asterisk.net/dc679ec3

View File

@@ -0,0 +1,78 @@
<html><head><title>ChangeLog for asterisk-22.5.1</title></head><body>
<h2>Change Log for Release asterisk-22.5.1</h2>
<h3>Links:</h3>
<ul>
<li><a href="https://downloads.asterisk.org/pub/telephony/asterisk/releases/ChangeLog-22.5.1.html">Full ChangeLog</a> </li>
<li><a href="https://github.com/asterisk/asterisk/compare/22.5.0...22.5.1">GitHub Diff</a> </li>
<li><a href="https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22.5.1.tar.gz">Tarball</a> </li>
<li><a href="https://downloads.asterisk.org/pub/telephony/asterisk">Downloads</a> </li>
</ul>
<h3>Summary:</h3>
<ul>
<li>Commits: 2</li>
<li>Commit Authors: 2</li>
<li>Issues Resolved: 0</li>
<li>Security Advisories Resolved: 2</li>
<li><a href="https://github.com/asterisk/asterisk/security/advisories/GHSA-mrq5-74j5-f5cr">GHSA-mrq5-74j5-f5cr</a>: Remote DoS and possible RCE in asterisk/res/res_stir_shaken/verification.c</li>
<li><a href="https://github.com/asterisk/asterisk/security/advisories/GHSA-v9q8-9j8m-5xwp">GHSA-v9q8-9j8m-5xwp</a>: Uncontrolled Search-Path Element in safe_asterisk script may allow local privilege escalation.</li>
</ul>
<h3>User Notes:</h3>
<h3>Upgrade Notes:</h3>
<ul>
<li>
<h4>safe_asterisk: Add ownership checks for /etc/asterisk/startup.d and its files.</h4>
The safe_asterisk script now checks that, if it was run by the
root user, the /etc/asterisk/startup.d directory and all the files it contains
are owned by root. If the checks fail, safe_asterisk will exit with an error
and Asterisk will not be started. Additionally, the default logging
destination is now stderr instead of tty "9" which probably won't exist
in modern systems.</li>
</ul>
<h3>Developer Notes:</h3>
<h3>Commit Authors:</h3>
<ul>
<li>George Joseph: (1)</li>
<li>ThatTotallyRealMyth: (1)</li>
</ul>
<h2>Issue and Commit Detail:</h2>
<h3>Closed Issues:</h3>
<ul>
<li>!GHSA-mrq5-74j5-f5cr: Remote DoS and possible RCE in asterisk/res/res_stir_shaken/verification.c</li>
<li>!GHSA-v9q8-9j8m-5xwp: Uncontrolled Search-Path Element in safe_asterisk script may allow local privilege escalation.</li>
</ul>
<h3>Commits By Author:</h3>
<ul>
<li>
<h4>George Joseph (1):</h4>
</li>
<li>
<p>res_stir_shaken: Test for missing semicolon in Identity header.</p>
</li>
<li>
<h4>ThatTotallyRealMyth (1):</h4>
</li>
<li>safe_asterisk: Add ownership checks for /etc/asterisk/startup.d and its files.</li>
</ul>
<h3>Commit List:</h3>
<ul>
<li>safe_asterisk: Add ownership checks for /etc/asterisk/startup.d and its files.</li>
<li>res_stir_shaken: Test for missing semicolon in Identity header.</li>
</ul>
<h3>Commit Details:</h3>
<h4>safe_asterisk: Add ownership checks for /etc/asterisk/startup.d and its files.</h4>
<p>Author: ThatTotallyRealMyth
Date: 2025-06-10</p>
<p>UpgradeNote: The safe_asterisk script now checks that, if it was run by the
root user, the /etc/asterisk/startup.d directory and all the files it contains
are owned by root. If the checks fail, safe_asterisk will exit with an error
and Asterisk will not be started. Additionally, the default logging
destination is now stderr instead of tty "9" which probably won't exist
in modern systems.</p>
<p>Resolves: #GHSA-v9q8-9j8m-5xwp</p>
<h4>res_stir_shaken: Test for missing semicolon in Identity header.</h4>
<p>Author: George Joseph
Date: 2025-07-31</p>
<p>ast_stir_shaken_vs_verify() now makes sure there's a semicolon in
the Identity header to prevent a possible segfault.</p>
<p>Resolves: #GHSA-mrq5-74j5-f5cr</p>
</body></html>

View File

@@ -0,0 +1,86 @@
## Change Log for Release asterisk-22.5.1
### Links:
- [Full ChangeLog](https://downloads.asterisk.org/pub/telephony/asterisk/releases/ChangeLog-22.5.1.html)
- [GitHub Diff](https://github.com/asterisk/asterisk/compare/22.5.0...22.5.1)
- [Tarball](https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22.5.1.tar.gz)
- [Downloads](https://downloads.asterisk.org/pub/telephony/asterisk)
### Summary:
- Commits: 2
- Commit Authors: 2
- Issues Resolved: 0
- Security Advisories Resolved: 2
- [GHSA-mrq5-74j5-f5cr](https://github.com/asterisk/asterisk/security/advisories/GHSA-mrq5-74j5-f5cr): Remote DoS and possible RCE in asterisk/res/res_stir_shaken/verification.c
- [GHSA-v9q8-9j8m-5xwp](https://github.com/asterisk/asterisk/security/advisories/GHSA-v9q8-9j8m-5xwp): Uncontrolled Search-Path Element in safe_asterisk script may allow local privilege escalation.
### User Notes:
### Upgrade Notes:
- #### safe_asterisk: Add ownership checks for /etc/asterisk/startup.d and its files.
The safe_asterisk script now checks that, if it was run by the
root user, the /etc/asterisk/startup.d directory and all the files it contains
are owned by root. If the checks fail, safe_asterisk will exit with an error
and Asterisk will not be started. Additionally, the default logging
destination is now stderr instead of tty "9" which probably won't exist
in modern systems.
### Developer Notes:
### Commit Authors:
- George Joseph: (1)
- ThatTotallyRealMyth: (1)
## Issue and Commit Detail:
### Closed Issues:
- !GHSA-mrq5-74j5-f5cr: Remote DoS and possible RCE in asterisk/res/res_stir_shaken/verification.c
- !GHSA-v9q8-9j8m-5xwp: Uncontrolled Search-Path Element in safe_asterisk script may allow local privilege escalation.
### Commits By Author:
- #### George Joseph (1):
- res_stir_shaken: Test for missing semicolon in Identity header.
- #### ThatTotallyRealMyth (1):
- safe_asterisk: Add ownership checks for /etc/asterisk/startup.d and its files.
### Commit List:
- safe_asterisk: Add ownership checks for /etc/asterisk/startup.d and its files.
- res_stir_shaken: Test for missing semicolon in Identity header.
### Commit Details:
#### safe_asterisk: Add ownership checks for /etc/asterisk/startup.d and its files.
Author: ThatTotallyRealMyth
Date: 2025-06-10
UpgradeNote: The safe_asterisk script now checks that, if it was run by the
root user, the /etc/asterisk/startup.d directory and all the files it contains
are owned by root. If the checks fail, safe_asterisk will exit with an error
and Asterisk will not be started. Additionally, the default logging
destination is now stderr instead of tty "9" which probably won't exist
in modern systems.
Resolves: #GHSA-v9q8-9j8m-5xwp
#### res_stir_shaken: Test for missing semicolon in Identity header.
Author: George Joseph
Date: 2025-07-31
ast_stir_shaken_vs_verify() now makes sure there's a semicolon in
the Identity header to prevent a possible segfault.
Resolves: #GHSA-mrq5-74j5-f5cr

View File

@@ -0,0 +1,50 @@
<html><head><title>ChangeLog for asterisk-22.5.2</title></head><body>
<h2>Change Log for Release asterisk-22.5.2</h2>
<h3>Links:</h3>
<ul>
<li><a href="https://downloads.asterisk.org/pub/telephony/asterisk/releases/ChangeLog-22.5.2.html">Full ChangeLog</a> </li>
<li><a href="https://github.com/asterisk/asterisk/compare/22.5.1...22.5.2">GitHub Diff</a> </li>
<li><a href="https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22.5.2.tar.gz">Tarball</a> </li>
<li><a href="https://downloads.asterisk.org/pub/telephony/asterisk">Downloads</a> </li>
</ul>
<h3>Summary:</h3>
<ul>
<li>Commits: 1</li>
<li>Commit Authors: 1</li>
<li>Issues Resolved: 0</li>
<li>Security Advisories Resolved: 1</li>
<li><a href="https://github.com/asterisk/asterisk/security/advisories/GHSA-64qc-9x89-rx5j">GHSA-64qc-9x89-rx5j</a>: A specifically malformed Authorization header in an incoming SIP request can cause Asterisk to crash</li>
</ul>
<h3>User Notes:</h3>
<h3>Upgrade Notes:</h3>
<h3>Developer Notes:</h3>
<h3>Commit Authors:</h3>
<ul>
<li>George Joseph: (1)</li>
</ul>
<h2>Issue and Commit Detail:</h2>
<h3>Closed Issues:</h3>
<ul>
<li>!GHSA-64qc-9x89-rx5j: A specifically malformed Authorization header in an incoming SIP request can cause Asterisk to crash</li>
</ul>
<h3>Commits By Author:</h3>
<ul>
<li>
<h4>George Joseph (1):</h4>
</li>
<li>res_pjsip_authenticator_digest: Fix SEGV if get_authorization_hdr returns NULL.</li>
</ul>
<h3>Commit List:</h3>
<ul>
<li>res_pjsip_authenticator_digest: Fix SEGV if get_authorization_hdr returns NULL.</li>
</ul>
<h3>Commit Details:</h3>
<h4>res_pjsip_authenticator_digest: Fix SEGV if get_authorization_hdr returns NULL.</h4>
<p>Author: George Joseph
Date: 2025-08-28</p>
<p>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.</p>
<p>Resolves: #GHSA-64qc-9x89-rx5j</p>
</body></html>

View File

@@ -0,0 +1,60 @@
## Change Log for Release asterisk-22.5.2
### Links:
- [Full ChangeLog](https://downloads.asterisk.org/pub/telephony/asterisk/releases/ChangeLog-22.5.2.html)
- [GitHub Diff](https://github.com/asterisk/asterisk/compare/22.5.1...22.5.2)
- [Tarball](https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22.5.2.tar.gz)
- [Downloads](https://downloads.asterisk.org/pub/telephony/asterisk)
### Summary:
- Commits: 1
- Commit Authors: 1
- Issues Resolved: 0
- Security Advisories Resolved: 1
- [GHSA-64qc-9x89-rx5j](https://github.com/asterisk/asterisk/security/advisories/GHSA-64qc-9x89-rx5j): A specifically malformed Authorization header in an incoming SIP request can cause Asterisk to crash
### User Notes:
### Upgrade Notes:
### Developer Notes:
### Commit Authors:
- George Joseph: (1)
## Issue and Commit Detail:
### Closed Issues:
- !GHSA-64qc-9x89-rx5j: A specifically malformed Authorization header in an incoming SIP request can cause Asterisk to crash
### Commits By Author:
- #### George Joseph (1):
- res_pjsip_authenticator_digest: Fix SEGV if get_authorization_hdr returns NULL.
### Commit List:
- res_pjsip_authenticator_digest: Fix SEGV if get_authorization_hdr returns NULL.
### Commit Details:
#### res_pjsip_authenticator_digest: Fix SEGV if get_authorization_hdr returns NULL.
Author: George Joseph
Date: 2025-08-28
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

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,902 @@
<html><head><title>ChangeLog for asterisk-22.7.0-rc1</title></head><body>
<h2>Change Log for Release asterisk-22.7.0-rc1</h2>
<h3>Links:</h3>
<ul>
<li><a href="https://downloads.asterisk.org/pub/telephony/asterisk/releases/ChangeLog-22.7.0-rc1.html">Full ChangeLog</a> </li>
<li><a href="https://github.com/asterisk/asterisk/compare/22.6.0...22.7.0-rc1">GitHub Diff</a> </li>
<li><a href="https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22.7.0-rc1.tar.gz">Tarball</a> </li>
<li><a href="https://downloads.asterisk.org/pub/telephony/asterisk">Downloads</a> </li>
</ul>
<h3>Summary:</h3>
<ul>
<li>Commits: 53</li>
<li>Commit Authors: 16</li>
<li>Issues Resolved: 35</li>
<li>Security Advisories Resolved: 0</li>
</ul>
<h3>User Notes:</h3>
<ul>
<li>
<h4>res_stir_shaken: Add STIR_SHAKEN_ATTESTATION dialplan function.</h4>
<p>The STIR_SHAKEN_ATTESTATION dialplan function has been added
which will allow suppressing attestation on a call-by-call basis
regardless of the profile attached to the outgoing endpoint.</p>
</li>
<li>
<h4>func_channel: Allow R/W of ADSI CPE capability setting.</h4>
<p>CHANNEL(adsicpe) can now be read or written to change
the channels' ADSI CPE capability setting.</p>
</li>
<li>
<h4>func_hangupcause.c: Add access to Reason headers via HANGUPCAUSE()</h4>
<p>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.</p>
</li>
<li>
<h4>func_math: Add DIGIT_SUM function.</h4>
<p>The DIGIT_SUM function can be used to return the digit sum of
a number.</p>
</li>
<li>
<h4>app_sf: Add post-digit timer option to ReceiveSF.</h4>
<p>The 't' option for ReceiveSF now allows for a timer since
the last digit received, in addition to the number-wide timeout.</p>
</li>
<li>
<h4>app_dial: Allow fractional seconds for dial timeouts.</h4>
<p>The answer and progress dial timeouts now have millisecond
precision, instead of having to be whole numbers.</p>
</li>
<li>
<h4>chan_dahdi: Add DAHDI_CHANNEL function.</h4>
<p>The DAHDI_CHANNEL function allows for getting/setting
certain properties about DAHDI channels from the dialplan.</p>
</li>
</ul>
<h3>Upgrade Notes:</h3>
<ul>
<li>
<h4>pjsip: Move from threadpool to taskpool</h4>
<p>The threadpool_* options in pjsip.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 PJSIP. An alembic
upgrade script has been added to add these options to realtime
as well.</p>
</li>
<li>
<h4>app_queue.c: Fix error in Queue parameter documentation.</h4>
<p>As part of Asterisk 21, macros were removed from Asterisk.
This resulted in argument order changing for the Queue dialplan
application since the macro argument was removed. Upgrade notice was
missed when this was done, so this upgrade note has been added to
provide a record of such and a notice to users who may have not upgraded
yet.</p>
</li>
<li>
<h4>res_audiosocket: add message types for all slin sample rates</h4>
<p>New audiosocket message types 0x11 - 0x18 has been added
for slin12, slin16, slin24, slin32, slin44, slin48, slin96, and
slin192 audio. External applications using audiosocket may need to be
updated to support these message types if the audiosocket channel is
created with one of these audio formats.</p>
</li>
<li>
<h4>taskpool: Add taskpool API, switch Stasis to using it.</h4>
<p>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.</p>
</li>
</ul>
<h3>Developer Notes:</h3>
<ul>
<li>
<h4>chan_pjsip: Add technology-specific off-nominal hangup cause to events.</h4>
<p>A "tech_cause" parameter has been added to the
ChannelHangupRequest and ChannelDestroyed ARI event messages and a "TechCause"
parameter has been added to the HangupRequest, SoftHangupRequest and Hangup
AMI event messages. For chan_pjsip, these will be set to the last SIP
response status code for off-nominally terminated calls. The parameter is
suppressed for nominal termination.</p>
</li>
<li>
<h4>ARI: The bridges play and record APIs now handle sample rates &gt; 8K correctly.</h4>
<p>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.</p>
</li>
<li>
<h4>taskpool: Add taskpool API, switch Stasis to using it.</h4>
<p>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.</p>
</li>
</ul>
<h3>Commit Authors:</h3>
<ul>
<li>Anthony Minessale: (1)</li>
<li>Bastian Triller: (1)</li>
<li>Ben Ford: (2)</li>
<li>Christoph Moench-Tegeder: (1)</li>
<li>Gauravs456: (1)</li>
<li>George Joseph: (8)</li>
<li>Igor Goncharovsky: (1)</li>
<li>Joshua C. Colp: (8)</li>
<li>Max Grobecker: (1)</li>
<li>Nathan Monfils: (1)</li>
<li>Naveen Albert: (18)</li>
<li>Phoneben: (2)</li>
<li>Roman Pertsev: (1)</li>
<li>Sean Bright: (3)</li>
<li>Sven Kube: (3)</li>
<li>Tinet-Mucw: (1)</li>
</ul>
<h2>Issue and Commit Detail:</h2>
<h3>Closed Issues:</h3>
<ul>
<li>781: [improvement]: Allow call by call disabling Stir/Shaken header inclusion </li>
<li>1340: [bug]: comfort noise packet corrupted</li>
<li>1419: [bug]: static code analysis issues in app_adsiprog.c</li>
<li>1422: [bug]: static code analysis issues in apps/app_externalivr.c</li>
<li>1425: [bug]: static code analysis issues in apps/app_queue.c</li>
<li>1434: [improvement]: pbx_variables: Create real channel for dialplan eval CLI command</li>
<li>1436: [improvement]: res_cliexec: Avoid unnecessary cast to char*</li>
<li>1455: [new-feature]: chan_dahdi: Add DAHDI_CHANNEL function</li>
<li>1467: [bug]: Crash in res_pjsip_refer during REFER progress teardown with PJSIP_TRANSFER_HANDLING(ari-only)</li>
<li>1478: [improvement]: Stasis threadpool -&gt; taskpool</li>
<li>1479: [bug]: The ARI bridge play and record APIs limit audio bandwidth by forcing the slin8 format.</li>
<li>1483: [improvement]: sig_analog: Eliminate possible timeout for Last Number Redial</li>
<li>1485: [improvement]: func_scramble: Add example to XML documentation.</li>
<li>1487: [improvement]: app_dial: Allow partial seconds to be used for dial timeouts</li>
<li>1489: [improvement]: config_options.c: Improve misleading error message</li>
<li>1491: [bug]: Segfault: <code>channelstorage_cpp</code> fast lookup without lock (<code>get_by_name_exact</code>/<code>get_by_uniqueid</code>) leads to UAF during hangup</li>
<li>1493: [new-feature]: app_sf: Add post-digit timer option</li>
<li>1496: [improvement]: dsp.c: Minor fixes to debug log messages</li>
<li>1499: [new-feature]: func_math: Add function to return the digit sum</li>
<li>1501: [improvement]: codec_builtin: Fix some inaccurate quality weights.</li>
<li>1505: [improvement]: res_fax: Add XML documentation for channel variables</li>
<li>1507: [improvement]: res_tonedetect: Minor formatting issue in documentation</li>
<li>1509: [improvement]: res_fax.c — log debug error as debug, not regular log</li>
<li>1510: [new-feature]: sig_analog: Allow '#' to end the inter-digit timeout when dialing.</li>
<li>1514: [improvement]: func_channel: Allow R/W of ADSI CPE capability setting.</li>
<li>1517: [improvement]: core_unreal: Preserve ADSI capability when dialing Local channels</li>
<li>1519: [improvement]: app_dial / func_callerid: DNIS information is not propagated by Dial</li>
<li>1525: [bug]: chan_websocket: fix use of raw payload variable for string comparison in process_text_message</li>
<li>1534: [bug]: app_queue when using gosub breaks dialplan when going from 20 to 21, What's new in 21 doesn't mention it's a breaking change,</li>
<li>1535: [bug]: chan_pjsip changes SSRC on WebRTC channels, which is unsupported by some browsers</li>
<li>1536: [bug]: asterisk -rx connects to console instead of executing a command</li>
<li>1539: [bug]: safe_asterisk without TTY doesn't log to file</li>
<li>1544: [improvement]: While Receiving the MediaConnect Message Using External Media Over websocket ChannelID is Details are missing</li>
<li>1554: [bug]: safe_asterisk recurses into subdirectories of startup.d after f97361</li>
<li>1559: [improvement]: Handle TLS handshake attacks in order to resolve the issue of exceeding the maximum number of HTTPS sessions.</li>
</ul>
<h3>Commits By Author:</h3>
<ul>
<li>
<h4>Anthony Minessale (1):</h4>
</li>
<li>
<p>Update contact information for anthm</p>
</li>
<li>
<h4>Bastian Triller (1):</h4>
</li>
<li>
<p>Fix some doxygen, typos and whitespace</p>
</li>
<li>
<h4>Ben Ford (2):</h4>
</li>
<li>rtp_engine.c: Add exception for comfort noise payload.</li>
<li>
<p>app_queue.c: Fix error in Queue parameter documentation.</p>
</li>
<li>
<h4>Christoph Moench-Tegeder (1):</h4>
</li>
<li>
<p>Fix Endianness detection in utils.h for non-Linux</p>
</li>
<li>
<h4>George Joseph (8):</h4>
</li>
<li>ARI: The bridges play and record APIs now handle sample rates &gt; 8K correctly.</li>
<li>channelstorage_cpp_map_name_id: Add read locking around retrievals.</li>
<li>chan_websocket.c: Change payload references to command instead.</li>
<li>taskpool: Fix some references to threadpool that should be taskpool.</li>
<li>chan_pjsip: Add technology-specific off-nominal hangup cause to events.</li>
<li>safe_asterisk: Fix logging and sorting issue.</li>
<li>chan_pjsip: Disable SSRC change for WebRTC endpoints.</li>
<li>
<p>res_stir_shaken: Add STIR_SHAKEN_ATTESTATION dialplan function.</p>
</li>
<li>
<h4>Igor Goncharovsky (1):</h4>
</li>
<li>
<p>func_hangupcause.c: Add access to Reason headers via HANGUPCAUSE()</p>
</li>
<li>
<h4>Joshua C. Colp (8):</h4>
</li>
<li>taskpool: Add taskpool API, switch Stasis to using it.</li>
<li>taskpool: Update versions for taskpool stasis options.</li>
<li>sorcery: Move from threadpool to taskpool.</li>
<li>app_queue: Allow stasis message filtering to work.</li>
<li>endpoints: Remove need for stasis subscription.</li>
<li>devicestate: Don't publish redundant device state messages.</li>
<li>pjsip: Move from threadpool to taskpool</li>
<li>
<p>Revert "pjsip: Move from threadpool to taskpool"</p>
</li>
<li>
<h4>Max Grobecker (1):</h4>
</li>
<li>
<p>res_pjsip_geolocation: Add support for Geolocation loc-src parameter</p>
</li>
<li>
<h4>Nathan Monfils (1):</h4>
</li>
<li>
<p>manager.c: Fix presencestate object leak</p>
</li>
<li>
<h4>Naveen Albert (18):</h4>
</li>
<li>pbx_variables.c: Create real channel for "dialplan eval function".</li>
<li>res_cliexec: Remove unnecessary casts to char*.</li>
<li>app_adsiprog: Fix possible NULL dereference.</li>
<li>chan_dahdi: Add DAHDI_CHANNEL function.</li>
<li>sig_analog: Eliminate potential timeout with Last Number Redial.</li>
<li>func_scramble: Add example to XML documentation.</li>
<li>config_options.c: Improve misleading warning.</li>
<li>dsp.c: Make minor fixes to debug log messages.</li>
<li>app_dial: Allow fractional seconds for dial timeouts.</li>
<li>res_fax: Add XML documentation for channel variables.</li>
<li>res_tonedetect: Fix formatting of XML documentation.</li>
<li>codec_builtin.c: Adjust some of the quality scores to reflect reality.</li>
<li>app_sf: Add post-digit timer option to ReceiveSF.</li>
<li>func_math: Add DIGIT_SUM function.</li>
<li>sig_analog: Allow '#' to end the inter-digit timeout when dialing.</li>
<li>core_unreal: Preserve ADSI capability when dialing Local channels.</li>
<li>func_channel: Allow R/W of ADSI CPE capability setting.</li>
<li>
<p>func_callerid: Document limitation of DNID fields.</p>
</li>
<li>
<h4>Roman Pertsev (1):</h4>
</li>
<li>
<p>res_audiosocket: fix temporarily unavailable</p>
</li>
<li>
<h4>Sean Bright (3):</h4>
</li>
<li>audiohook.c: Ensure correct AO2 reference is dereffed.</li>
<li>app_externalivr: Prevent out-of-bounds read during argument processing.</li>
<li>
<p>safe_asterisk: Resolve a POSIX sh problem and restore globbing behavior.</p>
</li>
<li>
<h4>Sven Kube (3):</h4>
</li>
<li>stasis_channels.c: Add null check for referred_by in ast_ari_transfer_message_..</li>
<li>stasis_channels.c: Make protocol_id optional to enable blind transfer via ari</li>
<li>
<p>res_audiosocket: add message types for all slin sample rates</p>
</li>
<li>
<h4>Tinet-mucw (1):</h4>
</li>
<li>
<p>iostream.c: Handle TLS handshake attacks in order to resolve the issue of exce..</p>
</li>
<li>
<h4>gauravs456 (1):</h4>
</li>
<li>
<p>chan_websocket: Add channel_id to MEDIA_START, DRIVER_STATUS and DTMF_END even..</p>
</li>
<li>
<h4>phoneben (2):</h4>
</li>
<li>app_queue: Add NULL pointer checks in app_queue</li>
<li>res_fax.c: lower FAXOPT read warning to debug level</li>
</ul>
<h3>Commit List:</h3>
<ul>
<li>res_audiosocket: fix temporarily unavailable</li>
<li>safe_asterisk: Resolve a POSIX sh problem and restore globbing behavior.</li>
<li>res_stir_shaken: Add STIR_SHAKEN_ATTESTATION dialplan function.</li>
<li>Revert "pjsip: Move from threadpool to taskpool"</li>
<li>chan_pjsip: Disable SSRC change for WebRTC endpoints.</li>
<li>pjsip: Move from threadpool to taskpool</li>
<li>safe_asterisk: Fix logging and sorting issue.</li>
<li>Fix Endianness detection in utils.h for non-Linux</li>
<li>app_queue.c: Fix error in Queue parameter documentation.</li>
<li>devicestate: Don't publish redundant device state messages.</li>
<li>chan_pjsip: Add technology-specific off-nominal hangup cause to events.</li>
<li>res_audiosocket: add message types for all slin sample rates</li>
<li>res_fax.c: lower FAXOPT read warning to debug level</li>
<li>endpoints: Remove need for stasis subscription.</li>
<li>app_queue: Allow stasis message filtering to work.</li>
<li>taskpool: Fix some references to threadpool that should be taskpool.</li>
<li>Update contact information for anthm</li>
<li>chan_websocket.c: Change payload references to command instead.</li>
<li>func_callerid: Document limitation of DNID fields.</li>
<li>func_channel: Allow R/W of ADSI CPE capability setting.</li>
<li>core_unreal: Preserve ADSI capability when dialing Local channels.</li>
<li>func_hangupcause.c: Add access to Reason headers via HANGUPCAUSE()</li>
<li>sig_analog: Allow '#' to end the inter-digit timeout when dialing.</li>
<li>func_math: Add DIGIT_SUM function.</li>
<li>app_sf: Add post-digit timer option to ReceiveSF.</li>
<li>codec_builtin.c: Adjust some of the quality scores to reflect reality.</li>
<li>res_tonedetect: Fix formatting of XML documentation.</li>
<li>res_fax: Add XML documentation for channel variables.</li>
<li>channelstorage_cpp_map_name_id: Add read locking around retrievals.</li>
<li>app_dial: Allow fractional seconds for dial timeouts.</li>
<li>dsp.c: Make minor fixes to debug log messages.</li>
<li>config_options.c: Improve misleading warning.</li>
<li>func_scramble: Add example to XML documentation.</li>
<li>sig_analog: Eliminate potential timeout with Last Number Redial.</li>
<li>ARI: The bridges play and record APIs now handle sample rates &gt; 8K correctly.</li>
<li>res_pjsip_geolocation: Add support for Geolocation loc-src parameter</li>
<li>sorcery: Move from threadpool to taskpool.</li>
<li>stasis_channels.c: Make protocol_id optional to enable blind transfer via ari</li>
<li>Fix some doxygen, typos and whitespace</li>
<li>app_queue: Add NULL pointer checks in app_queue</li>
<li>app_externalivr: Prevent out-of-bounds read during argument processing.</li>
<li>chan_dahdi: Add DAHDI_CHANNEL function.</li>
<li>taskpool: Update versions for taskpool stasis options.</li>
<li>taskpool: Add taskpool API, switch Stasis to using it.</li>
<li>app_adsiprog: Fix possible NULL dereference.</li>
<li>manager.c: Fix presencestate object leak</li>
<li>audiohook.c: Ensure correct AO2 reference is dereffed.</li>
<li>res_cliexec: Remove unnecessary casts to char*.</li>
<li>rtp_engine.c: Add exception for comfort noise payload.</li>
<li>pbx_variables.c: Create real channel for "dialplan eval function".</li>
</ul>
<h3>Commit Details:</h3>
<h4>res_audiosocket: fix temporarily unavailable</h4>
<p>Author: Roman Pertsev
Date: 2025-10-07</p>
<p>Operations on non-blocking sockets may return a resource temporarily unavailable error (EAGAIN or EWOULDBLOCK). This is not a fatal error but a normal condition indicating that the operation would block.</p>
<p>This patch corrects the handling of this case. Instead of incorrectly treating it as a reason to terminate the connection, the code now waits for data to arrive on the socket.</p>
<h4>safe_asterisk: Resolve a POSIX sh problem and restore globbing behavior.</h4>
<p>Author: Sean Bright
Date: 2025-10-22</p>
<ul>
<li>Using <code>==</code> with the POSIX sh <code>test</code> utility is UB.</li>
<li>Switch back to using globs instead of using <code>$(find … | sort)</code>.</li>
<li>Fix a missing redirect when checking for the OS type.</li>
</ul>
<p>Resolves: #1554</p>
<h4>res_stir_shaken: Add STIR_SHAKEN_ATTESTATION dialplan function.</h4>
<p>Author: George Joseph
Date: 2025-10-24</p>
<p>Also...</p>
<ul>
<li>
<p>Refactored the verification datastore process so instead of having
a separate channel datastore for each verification result, there's only
one channel datastore with a vector of results.</p>
</li>
<li>
<p>Refactored some log messages to include channel name and removed
some that would be redundant if a memory allocation failed.</p>
</li>
</ul>
<p>Resolves: #781</p>
<p>UserNote: The STIR_SHAKEN_ATTESTATION dialplan function has been added
which will allow suppressing attestation on a call-by-call basis
regardless of the profile attached to the outgoing endpoint.</p>
<h4>Revert "pjsip: Move from threadpool to taskpool"</h4>
<p>Author: Joshua C. Colp
Date: 2025-10-27</p>
<p>This reverts commit bb6b76c2d8239b2665223dcbf6d507aa9aa4534e.</p>
<h4>iostream.c: Handle TLS handshake attacks in order to resolve the issue of exce..</h4>
<p>Author: Tinet-mucw
Date: 2025-10-26</p>
<p>The TCP three-way handshake completes, but if the server is under a TLS handshake attack, asterisk will get stuck at SSL_do_handshake().
In this case, a timeout mechanism should be set for the SSL/TLS handshake process to prevent indefinite waiting during the SSL handshake.</p>
<p>Resolves: #1559</p>
<h4>chan_pjsip: Disable SSRC change for WebRTC endpoints.</h4>
<p>Author: George Joseph
Date: 2025-10-21</p>
<p>Commit b333ee3b introduced a fix to chan_pjsip that addressed RTP issues with
blind transfers and some SBCs. Unfortunately, the fix broke some WebRTC
clients that are sensitive to SSRC changes and non-monotonic timestamps so
the fix is now disabled for endpoints with the "bundle" parameter set to true.</p>
<p>Resolves: #1535</p>
<h4>chan_websocket: Add channel_id to MEDIA_START, DRIVER_STATUS and DTMF_END even..</h4>
<p>Author: gauravs456
Date: 2025-10-21</p>
<p>Resolves: #1544</p>
<h4>pjsip: Move from threadpool to taskpool</h4>
<p>Author: Joshua C. Colp
Date: 2025-09-23</p>
<p>This change moves the PJSIP module from the threadpool API
to the taskpool API. PJSIP-specific implementations for
task usage have been removed and replaced with calls to
the optimized taskpool implementations instead. The need
for a pool of serializers has also been removed as
taskpool inherently provides this. The default settings
have also been changed to be more realistic for common
usage.</p>
<p>UpgradeNote: The threadpool_* options in pjsip.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 PJSIP. An alembic
upgrade script has been added to add these options to realtime
as well.</p>
<h4>safe_asterisk: Fix logging and sorting issue.</h4>
<p>Author: George Joseph
Date: 2025-10-17</p>
<p>Re-enabled "TTY=9" which was erroneously disabled as part of a recent
security fix and removed another logging "fix" that was added.</p>
<p>Also added a sort to the "find" that enumerates the scripts to be sourced so
they're sourced in the correct order.</p>
<p>Resolves: #1539</p>
<h4>Fix Endianness detection in utils.h for non-Linux</h4>
<p>Author: Christoph Moench-Tegeder
Date: 2025-10-19</p>
<p>Commit 43bf8a4ded7a65203b766b91eaf8331a600e9d8d introduced endian
dependend byte-swapping code in include/asterisk/utils.h, where the
endianness was detected using the __BYTE_ORDER macro. This macro
lives in endian.h, which on Linux is included implicitely (by the
network-related headers, I think), but on FreeBSD the headers are
laid out differently and we do not get __BYTE_ORDER the implicit way.</p>
<p>Instead, this makes the usage of endian.h explicit by including it
where we need it, and switches the BYTE_ORDER/*ENDIAN macros to the
POSIX-defined ones (see
https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/endian.h.html
for standard compliance). Additionally, this adds a compile-time check
for the endianness-logic: compilation will fail if neither big nor
little endian can be detected.</p>
<p>Fixes: #1536</p>
<h4>app_queue.c: Fix error in Queue parameter documentation.</h4>
<p>Author: Ben Ford
Date: 2025-10-20</p>
<p>When macro was removed in Asterisk 21, the parameter documentation in
code was not updated to reflect the correct numerization for gosub. It
still stated that it was the seventh parameter, but got shifted to the
sixth due to the removal of macro. This has been updated to correctly
reflect the parameter order, and a note has been added to the XML that
states this was done after the initial commit.</p>
<p>Fixes: #1534</p>
<p>UpgradeNote: As part of Asterisk 21, macros were removed from Asterisk.
This resulted in argument order changing for the Queue dialplan
application since the macro argument was removed. Upgrade notice was
missed when this was done, so this upgrade note has been added to
provide a record of such and a notice to users who may have not upgraded
yet.</p>
<h4>devicestate: Don't publish redundant device state messages.</h4>
<p>Author: Joshua C. Colp
Date: 2025-10-17</p>
<p>When publishing device state check the local cache for the
existing device state. If the new device state is unchanged
from the prior one, don't bother publishing the update. This
can reduce the work done by consumers of device state, such
as hints and app_queue, by not publishing a message to them.</p>
<p>These messages would most often occur with devices that are
seeing numerous simultaneous channels. The underlying device
state would remain as in use throughout, but an update would
be published as channels are created and hung up.</p>
<h4>chan_pjsip: Add technology-specific off-nominal hangup cause to events.</h4>
<p>Author: George Joseph
Date: 2025-10-14</p>
<p>Although the ISDN/Q.850/Q.931 hangup cause code is already part of the ARI
and AMI hangup and channel destroyed events, it can be helpful to know what
the actual channel technology code was if the call was unsuccessful.
For PJSIP, it's the SIP response code.</p>
<ul>
<li>
<p>A new "tech_hangupcause" field was added to the ast_channel structure along
with ast_channel_tech_hangupcause() and ast_channel_tech_hangupcause_set()
functions. It should only be set for off-nominal terminations.</p>
</li>
<li>
<p>chan_pjsip was modified to set the tech hangup cause in the
chan_pjsip_hangup() and chan_pjsip_session_end() functions. This is a bit
tricky because these two functions aren't always called in the same order.
The channel that hangs up first will get chan_pjsip_session_end() called
first which will trigger the core to call chan_pjsip_hangup() on itself,
then call chan_pjsip_hangup() on the other channel. The other channel's
chan_pjsip_session_end() function will get called last. Unfortunately,
the other channel's HangupRequest events are sent before chan_pjsip has had a
chance to set the tech hangupcause code so the HangupRequest events for that
channel won't have the cause code set. The ChannelDestroyed and Hangup
events however will have the code set for both channels.</p>
</li>
<li>
<p>A new "tech_cause" field was added to the ast_channel_snapshot_hangup
structure. This is a public structure so a bit of refactoring was needed to
preserve ABI compatibility.</p>
</li>
<li>
<p>The ARI ChannelHangupRequest and ChannelDestroyed events were modified to
include the "tech_cause" parameter in the JSON for off-nominal terminations.
The parameter is suppressed for nominal termination.</p>
</li>
<li>
<p>The AMI SoftHangupRequest, HangupRequest and Hangup events were modified to
include the "TechCause" parameter for off-nominal terminations. Like their ARI
counterparts, the parameter is suppressed for nominal termination.</p>
</li>
</ul>
<p>DeveloperNote: A "tech_cause" parameter has been added to the
ChannelHangupRequest and ChannelDestroyed ARI event messages and a "TechCause"
parameter has been added to the HangupRequest, SoftHangupRequest and Hangup
AMI event messages. For chan_pjsip, these will be set to the last SIP
response status code for off-nominally terminated calls. The parameter is
suppressed for nominal termination.</p>
<h4>res_audiosocket: add message types for all slin sample rates</h4>
<p>Author: Sven Kube
Date: 2025-10-10</p>
<p>Extend audiosocket messages with types 0x11 - 0x18 to create asterisk
frames in slin12, slin16, slin24, slin32, slin44, slin48, slin96, and
slin192 format, enabling the transmission of audio at a higher sample
rates. For audiosocket messages sent by Asterisk, the message kind is
determined by the format of the originating asterisk frame.</p>
<p>UpgradeNote: New audiosocket message types 0x11 - 0x18 has been added
for slin12, slin16, slin24, slin32, slin44, slin48, slin96, and
slin192 audio. External applications using audiosocket may need to be
updated to support these message types if the audiosocket channel is
created with one of these audio formats.</p>
<h4>res_fax.c: lower FAXOPT read warning to debug level</h4>
<p>Author: phoneben
Date: 2025-10-03</p>
<p>Reading ${FAXOPT()} before a fax session is common in dialplans to check fax state.
Currently this logs an error even when no fax datastore exists, creating excessive noise.
Change these messages to ast_debug(3, …) so they appear only with debug enabled.</p>
<p>Resolves: #1509</p>
<h4>endpoints: Remove need for stasis subscription.</h4>
<p>Author: Joshua C. Colp
Date: 2025-10-10</p>
<p>When an endpoint is created in the core of Asterisk a subscription
was previously created alongside it to monitor any channels being
destroyed that were related to it. This was done by receiving all
channel snapshot updates for every channel and only reacting when
it was indicated that the channel was dead.</p>
<p>This change removes this logic and instead provides an API call
for directly removing a channel from an endpoint. This is called
when channels are destroyed. This operation is fast, so blocking
the calling thread for a short period of time doesn't have any
noticeable impact.</p>
<h4>app_queue: Allow stasis message filtering to work.</h4>
<p>Author: Joshua C. Colp
Date: 2025-10-10</p>
<p>The app_queue module subscribes on a per-dialed agent basis to both
the bridge all and channel all topics to keep apprised of things going
on involving them. This subscription has associated state that must
be cleaned up when the subscription ends. This was done by setting
a default router callback that only had logic to handle the case
where the subscription ends. By using the default router callback
all filtering for the subscription was disabled, causing unrelated
messages to get published and handled by it.</p>
<p>This change makes it so that an explicit route is added for the
message type used for the message indicating the subscription has
ended and removes the default router callback. This allows message
filtering to occur on publishing reducing the messages to app_queue
to only those it is interested in.</p>
<h4>taskpool: Fix some references to threadpool that should be taskpool.</h4>
<p>Author: George Joseph
Date: 2025-10-10</p>
<p>Resolves: #1478</p>
<h4>Update contact information for anthm</h4>
<p>Author: Anthony Minessale
Date: 2025-10-10</p>
<h4>chan_websocket.c: Change payload references to command instead.</h4>
<p>Author: George Joseph
Date: 2025-10-08</p>
<p>Some of the tests in process_text_message() were still comparing to the
websocket message payload instead of the "command" string.</p>
<p>Resolves: #1525</p>
<h4>func_callerid: Document limitation of DNID fields.</h4>
<p>Author: Naveen Albert
Date: 2025-10-06</p>
<p>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.</p>
<p>Resolves: #1519</p>
<h4>func_channel: Allow R/W of ADSI CPE capability setting.</h4>
<p>Author: Naveen Albert
Date: 2025-10-06</p>
<p>Allow retrieving and setting the channel's ADSI capability from the
dialplan.</p>
<p>Resolves: #1514</p>
<p>UserNote: CHANNEL(adsicpe) can now be read or written to change
the channels' ADSI CPE capability setting.</p>
<h4>core_unreal: Preserve ADSI capability when dialing Local channels.</h4>
<p>Author: Naveen Albert
Date: 2025-10-06</p>
<p>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.</p>
<p>Resolves: #1517</p>
<h4>func_hangupcause.c: Add access to Reason headers via HANGUPCAUSE()</h4>
<p>Author: Igor Goncharovsky
Date: 2025-09-04</p>
<p>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.</p>
<p>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.</p>
<h4>sig_analog: Allow '#' to end the inter-digit timeout when dialing.</h4>
<p>Author: Naveen Albert
Date: 2025-10-03</p>
<p>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 #.</p>
<p>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.</p>
<p>Resolves: #1510</p>
<h4>func_math: Add DIGIT_SUM function.</h4>
<p>Author: Naveen Albert
Date: 2025-10-01</p>
<p>Add a function (DIGIT_SUM) which returns the digit sum of a number.</p>
<p>Resolves: #1499</p>
<p>UserNote: The DIGIT_SUM function can be used to return the digit sum of
a number.</p>
<h4>app_sf: Add post-digit timer option to ReceiveSF.</h4>
<p>Author: Naveen Albert
Date: 2025-10-01</p>
<p>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.</p>
<p>Resolves: #1493</p>
<p>UserNote: The 't' option for ReceiveSF now allows for a timer since
the last digit received, in addition to the number-wide timeout.</p>
<h4>codec_builtin.c: Adjust some of the quality scores to reflect reality.</h4>
<p>Author: Naveen Albert
Date: 2025-10-02</p>
<p>Among the lower-quality voice codecs, some of the quality scores did
not make sense relative to each other.</p>
<p>For instance, quality-wise, G.729 &gt; G.723 &gt; PLC10.
However, current scores do not uphold these relationships.</p>
<p>Tweak the scores slightly to reflect more accurate relationships.</p>
<p>Resolves: #1501</p>
<h4>res_tonedetect: Fix formatting of XML documentation.</h4>
<p>Author: Naveen Albert
Date: 2025-10-02</p>
<p>Fix the indentation in the documentation for the variable list.</p>
<p>Resolves: #1507</p>
<h4>res_fax: Add XML documentation for channel variables.</h4>
<p>Author: Naveen Albert
Date: 2025-10-02</p>
<p>Document the channel variables currently set by SendFAX and ReceiveFAX.</p>
<p>Resolves: #1505</p>
<h4>channelstorage_cpp_map_name_id: Add read locking around retrievals.</h4>
<p>Author: George Joseph
Date: 2025-10-01</p>
<p>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.</p>
<p>Resolves: #1491</p>
<h4>app_dial: Allow fractional seconds for dial timeouts.</h4>
<p>Author: Naveen Albert
Date: 2025-09-30</p>
<p>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.</p>
<p>Parse it as a decimal instead so that timeouts can now truly have
millisecond precision.</p>
<p>Resolves: #1487</p>
<p>UserNote: The answer and progress dial timeouts now have millisecond
precision, instead of having to be whole numbers.</p>
<h4>dsp.c: Make minor fixes to debug log messages.</h4>
<p>Author: Naveen Albert
Date: 2025-10-01</p>
<p>Commit dc8e3eeaaf094a3d16991289934093d5e7127680 improved the debug log
messages in dsp.c. This makes two minor corrections to it:</p>
<ul>
<li>Properly guard an added log statement in a conditional.</li>
<li>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).</li>
</ul>
<p>Resolves: #1496</p>
<h4>config_options.c: Improve misleading warning.</h4>
<p>Author: Naveen Albert
Date: 2025-09-30</p>
<p>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.</p>
<p>Resolves: #1489</p>
<h4>func_scramble: Add example to XML documentation.</h4>
<p>Author: Naveen Albert
Date: 2025-09-29</p>
<p>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.</p>
<p>Resolves: #1485</p>
<h4>sig_analog: Eliminate potential timeout with Last Number Redial.</h4>
<p>Author: Naveen Albert
Date: 2025-09-29</p>
<p>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.</p>
<p>Resolves: #1483</p>
<h4>ARI: The bridges play and record APIs now handle sample rates &gt; 8K correctly.</h4>
<p>Author: George Joseph
Date: 2025-09-25</p>
<p>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 &gt; 8K, it was downsampled to 8K limiting the bandwidth.</p>
<ul>
<li>
<p>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.</p>
</li>
<li>
<p>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.</p>
</li>
</ul>
<p>Resolves: #1479</p>
<p>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.</p>
<h4>res_pjsip_geolocation: Add support for Geolocation loc-src parameter</h4>
<p>Author: Max Grobecker
Date: 2025-09-21</p>
<p>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.</p>
<p>If the <code>location_source</code> configuration option is not set or invalid, that parameter will not be added (this is already checked by res_geolocation).</p>
<p>This commits adds already documented functionality.</p>
<h4>sorcery: Move from threadpool to taskpool.</h4>
<p>Author: Joshua C. Colp
Date: 2025-09-23</p>
<p>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.</p>
<h4>stasis_channels.c: Make protocol_id optional to enable blind transfer via ari</h4>
<p>Author: Sven Kube
Date: 2025-09-22</p>
<p>When handling SIP transfers via ARI, there is no protocol_id in case of
a blind transfer.</p>
<p>Resolves: #1467</p>
<h4>Fix some doxygen, typos and whitespace</h4>
<p>Author: Bastian Triller
Date: 2025-09-21</p>
<h4>stasis_channels.c: Add null check for referred_by in ast_ari_transfer_message_..</h4>
<p>Author: Sven Kube
Date: 2025-09-18</p>
<p>When handling SIP transfers via ARI, the <code>referred_by</code> field in
<code>transfer_ari_state</code> may be null, since SIP REFER requests are not
required to include a <code>Referred-By</code> header. Without this check, a null
value caused the transfer to fail and triggered a NOTIFY with a 500
Internal Server Error.</p>
<h4>app_queue: Add NULL pointer checks in app_queue</h4>
<p>Author: phoneben
Date: 2025-09-11</p>
<p>Add NULL check for word_list before calling word_in_list()
Add NULL checks for channel snapshots from ast_multi_channel_blob_get_channel()</p>
<p>Resolves: #1425</p>
<h4>app_externalivr: Prevent out-of-bounds read during argument processing.</h4>
<p>Author: Sean Bright
Date: 2025-09-17</p>
<p>Resolves: #1422</p>
<h4>chan_dahdi: Add DAHDI_CHANNEL function.</h4>
<p>Author: Naveen Albert
Date: 2025-09-11</p>
<p>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.</p>
<p>Resolves: #1455</p>
<p>UserNote: The DAHDI_CHANNEL function allows for getting/setting
certain properties about DAHDI channels from the dialplan.</p>
<h4>taskpool: Update versions for taskpool stasis options.</h4>
<p>Author: Joshua C. Colp
Date: 2025-09-16</p>
<h4>taskpool: Add taskpool API, switch Stasis to using it.</h4>
<p>Author: Joshua C. Colp
Date: 2025-08-06</p>
<p>This change introduces a new API called taskpool. This is a pool
of taskprocessors. It provides the following functionality:</p>
<ol>
<li>Task pushing to a pool of taskprocessors</li>
<li>Synchronous tasks</li>
<li>Serializers for execution ordering of tasks</li>
<li>Growing/shrinking of number of taskprocessors in pool</li>
</ol>
<p>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.</p>
<p>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.</p>
<p>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.</p>
<p>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.</p>
<p>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.</p>
<p>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.</p>
<h4>app_adsiprog: Fix possible NULL dereference.</h4>
<p>Author: Naveen Albert
Date: 2025-09-10</p>
<p>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.</p>
<p>Resolves: #1419</p>
<h4>manager.c: Fix presencestate object leak</h4>
<p>Author: Nathan Monfils
Date: 2025-09-08</p>
<p>ast_presence_state allocates subtype and message. We straightforwardly
need to clean those up.</p>
<h4>audiohook.c: Ensure correct AO2 reference is dereffed.</h4>
<p>Author: Sean Bright
Date: 2025-09-10</p>
<p>Part of #1440.</p>
<h4>res_cliexec: Remove unnecessary casts to char*.</h4>
<p>Author: Naveen Albert
Date: 2025-09-09</p>
<p>Resolves: #1436</p>
<h4>rtp_engine.c: Add exception for comfort noise payload.</h4>
<p>Author: Ben Ford
Date: 2025-09-09</p>
<p>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.</p>
<p>Fixes: #1340</p>
<h4>pbx_variables.c: Create real channel for "dialplan eval function".</h4>
<p>Author: Naveen Albert
Date: 2025-09-09</p>
<p>"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)-&gt;type consequently results in a NULL dereference.
Normally, functions do not worry about this since channels executing
dialplan aren't dummy channels.</p>
<p>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.</p>
<p>Resolves: #1434</p>
</body></html>

View File

@@ -0,0 +1,993 @@
## Change Log for Release asterisk-22.7.0-rc1
### Links:
- [Full ChangeLog](https://downloads.asterisk.org/pub/telephony/asterisk/releases/ChangeLog-22.7.0-rc1.html)
- [GitHub Diff](https://github.com/asterisk/asterisk/compare/22.6.0...22.7.0-rc1)
- [Tarball](https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22.7.0-rc1.tar.gz)
- [Downloads](https://downloads.asterisk.org/pub/telephony/asterisk)
### Summary:
- Commits: 53
- Commit Authors: 16
- Issues Resolved: 35
- Security Advisories Resolved: 0
### User Notes:
- #### res_stir_shaken: Add STIR_SHAKEN_ATTESTATION dialplan function.
The STIR_SHAKEN_ATTESTATION dialplan function has been added
which will allow suppressing attestation on a call-by-call basis
regardless of the profile attached to the outgoing endpoint.
- #### func_channel: Allow R/W of ADSI CPE capability setting.
CHANNEL(adsicpe) can now be read or written to change
the channels' ADSI CPE capability setting.
- #### func_hangupcause.c: Add access to Reason headers via HANGUPCAUSE()
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.
- #### func_math: Add DIGIT_SUM function.
The DIGIT_SUM function can be used to return the digit sum of
a number.
- #### app_sf: Add post-digit timer option to ReceiveSF.
The 't' option for ReceiveSF now allows for a timer since
the last digit received, in addition to the number-wide timeout.
- #### app_dial: Allow fractional seconds for dial timeouts.
The answer and progress dial timeouts now have millisecond
precision, instead of having to be whole numbers.
- #### chan_dahdi: Add DAHDI_CHANNEL function.
The DAHDI_CHANNEL function allows for getting/setting
certain properties about DAHDI channels from the dialplan.
### Upgrade Notes:
- #### pjsip: Move from threadpool to taskpool
The threadpool_* options in pjsip.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 PJSIP. An alembic
upgrade script has been added to add these options to realtime
as well.
- #### app_queue.c: Fix error in Queue parameter documentation.
As part of Asterisk 21, macros were removed from Asterisk.
This resulted in argument order changing for the Queue dialplan
application since the macro argument was removed. Upgrade notice was
missed when this was done, so this upgrade note has been added to
provide a record of such and a notice to users who may have not upgraded
yet.
- #### res_audiosocket: add message types for all slin sample rates
New audiosocket message types 0x11 - 0x18 has been added
for slin12, slin16, slin24, slin32, slin44, slin48, slin96, and
slin192 audio. External applications using audiosocket may need to be
updated to support these message types if the audiosocket channel is
created with one of these audio formats.
- #### taskpool: Add taskpool API, switch Stasis to using it.
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.
### Developer Notes:
- #### chan_pjsip: Add technology-specific off-nominal hangup cause to events.
A "tech_cause" parameter has been added to the
ChannelHangupRequest and ChannelDestroyed ARI event messages and a "TechCause"
parameter has been added to the HangupRequest, SoftHangupRequest and Hangup
AMI event messages. For chan_pjsip, these will be set to the last SIP
response status code for off-nominally terminated calls. The parameter is
suppressed for nominal termination.
- #### ARI: The bridges play and record APIs now handle sample rates > 8K correctly.
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.
- #### taskpool: Add taskpool API, switch Stasis to using it.
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.
### Commit Authors:
- Anthony Minessale: (1)
- Bastian Triller: (1)
- Ben Ford: (2)
- Christoph Moench-Tegeder: (1)
- Gauravs456: (1)
- George Joseph: (8)
- Igor Goncharovsky: (1)
- Joshua C. Colp: (8)
- Max Grobecker: (1)
- Nathan Monfils: (1)
- Naveen Albert: (18)
- Phoneben: (2)
- Roman Pertsev: (1)
- Sean Bright: (3)
- Sven Kube: (3)
- Tinet-Mucw: (1)
## Issue and Commit Detail:
### Closed Issues:
- 781: [improvement]: Allow call by call disabling Stir/Shaken header inclusion
- 1340: [bug]: comfort noise packet corrupted
- 1419: [bug]: static code analysis issues in app_adsiprog.c
- 1422: [bug]: static code analysis issues in apps/app_externalivr.c
- 1425: [bug]: static code analysis issues in apps/app_queue.c
- 1434: [improvement]: pbx_variables: Create real channel for dialplan eval CLI command
- 1436: [improvement]: res_cliexec: Avoid unnecessary cast to char*
- 1455: [new-feature]: chan_dahdi: Add DAHDI_CHANNEL function
- 1467: [bug]: Crash in res_pjsip_refer during REFER progress teardown with PJSIP_TRANSFER_HANDLING(ari-only)
- 1478: [improvement]: Stasis threadpool -> taskpool
- 1479: [bug]: The ARI bridge play and record APIs limit audio bandwidth by forcing the slin8 format.
- 1483: [improvement]: sig_analog: Eliminate possible timeout for Last Number Redial
- 1485: [improvement]: func_scramble: Add example to XML documentation.
- 1487: [improvement]: app_dial: Allow partial seconds to be used for dial timeouts
- 1489: [improvement]: config_options.c: Improve misleading error message
- 1491: [bug]: Segfault: `channelstorage_cpp` fast lookup without lock (`get_by_name_exact`/`get_by_uniqueid`) leads to UAF during hangup
- 1493: [new-feature]: app_sf: Add post-digit timer option
- 1496: [improvement]: dsp.c: Minor fixes to debug log messages
- 1499: [new-feature]: func_math: Add function to return the digit sum
- 1501: [improvement]: codec_builtin: Fix some inaccurate quality weights.
- 1505: [improvement]: res_fax: Add XML documentation for channel variables
- 1507: [improvement]: res_tonedetect: Minor formatting issue in documentation
- 1509: [improvement]: res_fax.c — log debug error as debug, not regular log
- 1510: [new-feature]: sig_analog: Allow '#' to end the inter-digit timeout when dialing.
- 1514: [improvement]: func_channel: Allow R/W of ADSI CPE capability setting.
- 1517: [improvement]: core_unreal: Preserve ADSI capability when dialing Local channels
- 1519: [improvement]: app_dial / func_callerid: DNIS information is not propagated by Dial
- 1525: [bug]: chan_websocket: fix use of raw payload variable for string comparison in process_text_message
- 1534: [bug]: app_queue when using gosub breaks dialplan when going from 20 to 21, What's new in 21 doesn't mention it's a breaking change,
- 1535: [bug]: chan_pjsip changes SSRC on WebRTC channels, which is unsupported by some browsers
- 1536: [bug]: asterisk -rx connects to console instead of executing a command
- 1539: [bug]: safe_asterisk without TTY doesn't log to file
- 1544: [improvement]: While Receiving the MediaConnect Message Using External Media Over websocket ChannelID is Details are missing
- 1554: [bug]: safe_asterisk recurses into subdirectories of startup.d after f97361
- 1559: [improvement]: Handle TLS handshake attacks in order to resolve the issue of exceeding the maximum number of HTTPS sessions.
### Commits By Author:
- #### Anthony Minessale (1):
- Update contact information for anthm
- #### Bastian Triller (1):
- Fix some doxygen, typos and whitespace
- #### Ben Ford (2):
- rtp_engine.c: Add exception for comfort noise payload.
- app_queue.c: Fix error in Queue parameter documentation.
- #### Christoph Moench-Tegeder (1):
- Fix Endianness detection in utils.h for non-Linux
- #### George Joseph (8):
- ARI: The bridges play and record APIs now handle sample rates > 8K correctly.
- channelstorage_cpp_map_name_id: Add read locking around retrievals.
- chan_websocket.c: Change payload references to command instead.
- taskpool: Fix some references to threadpool that should be taskpool.
- chan_pjsip: Add technology-specific off-nominal hangup cause to events.
- safe_asterisk: Fix logging and sorting issue.
- chan_pjsip: Disable SSRC change for WebRTC endpoints.
- res_stir_shaken: Add STIR_SHAKEN_ATTESTATION dialplan function.
- #### Igor Goncharovsky (1):
- func_hangupcause.c: Add access to Reason headers via HANGUPCAUSE()
- #### Joshua C. Colp (8):
- taskpool: Add taskpool API, switch Stasis to using it.
- taskpool: Update versions for taskpool stasis options.
- sorcery: Move from threadpool to taskpool.
- app_queue: Allow stasis message filtering to work.
- endpoints: Remove need for stasis subscription.
- devicestate: Don't publish redundant device state messages.
- pjsip: Move from threadpool to taskpool
- Revert "pjsip: Move from threadpool to taskpool"
- #### Max Grobecker (1):
- res_pjsip_geolocation: Add support for Geolocation loc-src parameter
- #### Nathan Monfils (1):
- manager.c: Fix presencestate object leak
- #### Naveen Albert (18):
- pbx_variables.c: Create real channel for "dialplan eval function".
- res_cliexec: Remove unnecessary casts to char*.
- app_adsiprog: Fix possible NULL dereference.
- chan_dahdi: Add DAHDI_CHANNEL function.
- sig_analog: Eliminate potential timeout with Last Number Redial.
- func_scramble: Add example to XML documentation.
- config_options.c: Improve misleading warning.
- dsp.c: Make minor fixes to debug log messages.
- app_dial: Allow fractional seconds for dial timeouts.
- res_fax: Add XML documentation for channel variables.
- res_tonedetect: Fix formatting of XML documentation.
- codec_builtin.c: Adjust some of the quality scores to reflect reality.
- app_sf: Add post-digit timer option to ReceiveSF.
- func_math: Add DIGIT_SUM function.
- sig_analog: Allow '#' to end the inter-digit timeout when dialing.
- core_unreal: Preserve ADSI capability when dialing Local channels.
- func_channel: Allow R/W of ADSI CPE capability setting.
- func_callerid: Document limitation of DNID fields.
- #### Roman Pertsev (1):
- res_audiosocket: fix temporarily unavailable
- #### Sean Bright (3):
- audiohook.c: Ensure correct AO2 reference is dereffed.
- app_externalivr: Prevent out-of-bounds read during argument processing.
- safe_asterisk: Resolve a POSIX sh problem and restore globbing behavior.
- #### Sven Kube (3):
- stasis_channels.c: Add null check for referred_by in ast_ari_transfer_message_..
- stasis_channels.c: Make protocol_id optional to enable blind transfer via ari
- res_audiosocket: add message types for all slin sample rates
- #### Tinet-mucw (1):
- iostream.c: Handle TLS handshake attacks in order to resolve the issue of exce..
- #### gauravs456 (1):
- chan_websocket: Add channel_id to MEDIA_START, DRIVER_STATUS and DTMF_END even..
- #### phoneben (2):
- app_queue: Add NULL pointer checks in app_queue
- res_fax.c: lower FAXOPT read warning to debug level
### Commit List:
- res_audiosocket: fix temporarily unavailable
- safe_asterisk: Resolve a POSIX sh problem and restore globbing behavior.
- res_stir_shaken: Add STIR_SHAKEN_ATTESTATION dialplan function.
- Revert "pjsip: Move from threadpool to taskpool"
- chan_pjsip: Disable SSRC change for WebRTC endpoints.
- pjsip: Move from threadpool to taskpool
- safe_asterisk: Fix logging and sorting issue.
- Fix Endianness detection in utils.h for non-Linux
- app_queue.c: Fix error in Queue parameter documentation.
- devicestate: Don't publish redundant device state messages.
- chan_pjsip: Add technology-specific off-nominal hangup cause to events.
- res_audiosocket: add message types for all slin sample rates
- res_fax.c: lower FAXOPT read warning to debug level
- endpoints: Remove need for stasis subscription.
- app_queue: Allow stasis message filtering to work.
- taskpool: Fix some references to threadpool that should be taskpool.
- Update contact information for anthm
- chan_websocket.c: Change payload references to command instead.
- func_callerid: Document limitation of DNID fields.
- func_channel: Allow R/W of ADSI CPE capability setting.
- core_unreal: Preserve ADSI capability when dialing Local channels.
- func_hangupcause.c: Add access to Reason headers via HANGUPCAUSE()
- sig_analog: Allow '#' to end the inter-digit timeout when dialing.
- func_math: Add DIGIT_SUM function.
- app_sf: Add post-digit timer option to ReceiveSF.
- codec_builtin.c: Adjust some of the quality scores to reflect reality.
- res_tonedetect: Fix formatting of XML documentation.
- res_fax: Add XML documentation for channel variables.
- channelstorage_cpp_map_name_id: Add read locking around retrievals.
- app_dial: Allow fractional seconds for dial timeouts.
- dsp.c: Make minor fixes to debug log messages.
- config_options.c: Improve misleading warning.
- func_scramble: Add example to XML documentation.
- sig_analog: Eliminate potential timeout with Last Number Redial.
- ARI: The bridges play and record APIs now handle sample rates > 8K correctly.
- res_pjsip_geolocation: Add support for Geolocation loc-src parameter
- sorcery: Move from threadpool to taskpool.
- stasis_channels.c: Make protocol_id optional to enable blind transfer via ari
- Fix some doxygen, typos and whitespace
- app_queue: Add NULL pointer checks in app_queue
- app_externalivr: Prevent out-of-bounds read during argument processing.
- chan_dahdi: Add DAHDI_CHANNEL function.
- taskpool: Update versions for taskpool stasis options.
- taskpool: Add taskpool API, switch Stasis to using it.
- app_adsiprog: Fix possible NULL dereference.
- manager.c: Fix presencestate object leak
- audiohook.c: Ensure correct AO2 reference is dereffed.
- res_cliexec: Remove unnecessary casts to char*.
- rtp_engine.c: Add exception for comfort noise payload.
- pbx_variables.c: Create real channel for "dialplan eval function".
### Commit Details:
#### res_audiosocket: fix temporarily unavailable
Author: Roman Pertsev
Date: 2025-10-07
Operations on non-blocking sockets may return a resource temporarily unavailable error (EAGAIN or EWOULDBLOCK). This is not a fatal error but a normal condition indicating that the operation would block.
This patch corrects the handling of this case. Instead of incorrectly treating it as a reason to terminate the connection, the code now waits for data to arrive on the socket.
#### safe_asterisk: Resolve a POSIX sh problem and restore globbing behavior.
Author: Sean Bright
Date: 2025-10-22
* Using `==` with the POSIX sh `test` utility is UB.
* Switch back to using globs instead of using `$(find … | sort)`.
* Fix a missing redirect when checking for the OS type.
Resolves: #1554
#### res_stir_shaken: Add STIR_SHAKEN_ATTESTATION dialplan function.
Author: George Joseph
Date: 2025-10-24
Also...
* Refactored the verification datastore process so instead of having
a separate channel datastore for each verification result, there's only
one channel datastore with a vector of results.
* Refactored some log messages to include channel name and removed
some that would be redundant if a memory allocation failed.
Resolves: #781
UserNote: The STIR_SHAKEN_ATTESTATION dialplan function has been added
which will allow suppressing attestation on a call-by-call basis
regardless of the profile attached to the outgoing endpoint.
#### Revert "pjsip: Move from threadpool to taskpool"
Author: Joshua C. Colp
Date: 2025-10-27
This reverts commit bb6b76c2d8239b2665223dcbf6d507aa9aa4534e.
#### iostream.c: Handle TLS handshake attacks in order to resolve the issue of exce..
Author: Tinet-mucw
Date: 2025-10-26
The TCP three-way handshake completes, but if the server is under a TLS handshake attack, asterisk will get stuck at SSL_do_handshake().
In this case, a timeout mechanism should be set for the SSL/TLS handshake process to prevent indefinite waiting during the SSL handshake.
Resolves: #1559
#### chan_pjsip: Disable SSRC change for WebRTC endpoints.
Author: George Joseph
Date: 2025-10-21
Commit b333ee3b introduced a fix to chan_pjsip that addressed RTP issues with
blind transfers and some SBCs. Unfortunately, the fix broke some WebRTC
clients that are sensitive to SSRC changes and non-monotonic timestamps so
the fix is now disabled for endpoints with the "bundle" parameter set to true.
Resolves: #1535
#### chan_websocket: Add channel_id to MEDIA_START, DRIVER_STATUS and DTMF_END even..
Author: gauravs456
Date: 2025-10-21
Resolves: #1544
#### pjsip: Move from threadpool to taskpool
Author: Joshua C. Colp
Date: 2025-09-23
This change moves the PJSIP module from the threadpool API
to the taskpool API. PJSIP-specific implementations for
task usage have been removed and replaced with calls to
the optimized taskpool implementations instead. The need
for a pool of serializers has also been removed as
taskpool inherently provides this. The default settings
have also been changed to be more realistic for common
usage.
UpgradeNote: The threadpool_* options in pjsip.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 PJSIP. An alembic
upgrade script has been added to add these options to realtime
as well.
#### safe_asterisk: Fix logging and sorting issue.
Author: George Joseph
Date: 2025-10-17
Re-enabled "TTY=9" which was erroneously disabled as part of a recent
security fix and removed another logging "fix" that was added.
Also added a sort to the "find" that enumerates the scripts to be sourced so
they're sourced in the correct order.
Resolves: #1539
#### Fix Endianness detection in utils.h for non-Linux
Author: Christoph Moench-Tegeder
Date: 2025-10-19
Commit 43bf8a4ded7a65203b766b91eaf8331a600e9d8d introduced endian
dependend byte-swapping code in include/asterisk/utils.h, where the
endianness was detected using the __BYTE_ORDER macro. This macro
lives in endian.h, which on Linux is included implicitely (by the
network-related headers, I think), but on FreeBSD the headers are
laid out differently and we do not get __BYTE_ORDER the implicit way.
Instead, this makes the usage of endian.h explicit by including it
where we need it, and switches the BYTE_ORDER/*ENDIAN macros to the
POSIX-defined ones (see
https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/endian.h.html
for standard compliance). Additionally, this adds a compile-time check
for the endianness-logic: compilation will fail if neither big nor
little endian can be detected.
Fixes: #1536
#### app_queue.c: Fix error in Queue parameter documentation.
Author: Ben Ford
Date: 2025-10-20
When macro was removed in Asterisk 21, the parameter documentation in
code was not updated to reflect the correct numerization for gosub. It
still stated that it was the seventh parameter, but got shifted to the
sixth due to the removal of macro. This has been updated to correctly
reflect the parameter order, and a note has been added to the XML that
states this was done after the initial commit.
Fixes: #1534
UpgradeNote: As part of Asterisk 21, macros were removed from Asterisk.
This resulted in argument order changing for the Queue dialplan
application since the macro argument was removed. Upgrade notice was
missed when this was done, so this upgrade note has been added to
provide a record of such and a notice to users who may have not upgraded
yet.
#### devicestate: Don't publish redundant device state messages.
Author: Joshua C. Colp
Date: 2025-10-17
When publishing device state check the local cache for the
existing device state. If the new device state is unchanged
from the prior one, don't bother publishing the update. This
can reduce the work done by consumers of device state, such
as hints and app_queue, by not publishing a message to them.
These messages would most often occur with devices that are
seeing numerous simultaneous channels. The underlying device
state would remain as in use throughout, but an update would
be published as channels are created and hung up.
#### chan_pjsip: Add technology-specific off-nominal hangup cause to events.
Author: George Joseph
Date: 2025-10-14
Although the ISDN/Q.850/Q.931 hangup cause code is already part of the ARI
and AMI hangup and channel destroyed events, it can be helpful to know what
the actual channel technology code was if the call was unsuccessful.
For PJSIP, it's the SIP response code.
* A new "tech_hangupcause" field was added to the ast_channel structure along
with ast_channel_tech_hangupcause() and ast_channel_tech_hangupcause_set()
functions. It should only be set for off-nominal terminations.
* chan_pjsip was modified to set the tech hangup cause in the
chan_pjsip_hangup() and chan_pjsip_session_end() functions. This is a bit
tricky because these two functions aren't always called in the same order.
The channel that hangs up first will get chan_pjsip_session_end() called
first which will trigger the core to call chan_pjsip_hangup() on itself,
then call chan_pjsip_hangup() on the other channel. The other channel's
chan_pjsip_session_end() function will get called last. Unfortunately,
the other channel's HangupRequest events are sent before chan_pjsip has had a
chance to set the tech hangupcause code so the HangupRequest events for that
channel won't have the cause code set. The ChannelDestroyed and Hangup
events however will have the code set for both channels.
* A new "tech_cause" field was added to the ast_channel_snapshot_hangup
structure. This is a public structure so a bit of refactoring was needed to
preserve ABI compatibility.
* The ARI ChannelHangupRequest and ChannelDestroyed events were modified to
include the "tech_cause" parameter in the JSON for off-nominal terminations.
The parameter is suppressed for nominal termination.
* The AMI SoftHangupRequest, HangupRequest and Hangup events were modified to
include the "TechCause" parameter for off-nominal terminations. Like their ARI
counterparts, the parameter is suppressed for nominal termination.
DeveloperNote: A "tech_cause" parameter has been added to the
ChannelHangupRequest and ChannelDestroyed ARI event messages and a "TechCause"
parameter has been added to the HangupRequest, SoftHangupRequest and Hangup
AMI event messages. For chan_pjsip, these will be set to the last SIP
response status code for off-nominally terminated calls. The parameter is
suppressed for nominal termination.
#### res_audiosocket: add message types for all slin sample rates
Author: Sven Kube
Date: 2025-10-10
Extend audiosocket messages with types 0x11 - 0x18 to create asterisk
frames in slin12, slin16, slin24, slin32, slin44, slin48, slin96, and
slin192 format, enabling the transmission of audio at a higher sample
rates. For audiosocket messages sent by Asterisk, the message kind is
determined by the format of the originating asterisk frame.
UpgradeNote: New audiosocket message types 0x11 - 0x18 has been added
for slin12, slin16, slin24, slin32, slin44, slin48, slin96, and
slin192 audio. External applications using audiosocket may need to be
updated to support these message types if the audiosocket channel is
created with one of these audio formats.
#### res_fax.c: lower FAXOPT read warning to debug level
Author: phoneben
Date: 2025-10-03
Reading ${FAXOPT()} before a fax session is common in dialplans to check fax state.
Currently this logs an error even when no fax datastore exists, creating excessive noise.
Change these messages to ast_debug(3, …) so they appear only with debug enabled.
Resolves: #1509
#### endpoints: Remove need for stasis subscription.
Author: Joshua C. Colp
Date: 2025-10-10
When an endpoint is created in the core of Asterisk a subscription
was previously created alongside it to monitor any channels being
destroyed that were related to it. This was done by receiving all
channel snapshot updates for every channel and only reacting when
it was indicated that the channel was dead.
This change removes this logic and instead provides an API call
for directly removing a channel from an endpoint. This is called
when channels are destroyed. This operation is fast, so blocking
the calling thread for a short period of time doesn't have any
noticeable impact.
#### app_queue: Allow stasis message filtering to work.
Author: Joshua C. Colp
Date: 2025-10-10
The app_queue module subscribes on a per-dialed agent basis to both
the bridge all and channel all topics to keep apprised of things going
on involving them. This subscription has associated state that must
be cleaned up when the subscription ends. This was done by setting
a default router callback that only had logic to handle the case
where the subscription ends. By using the default router callback
all filtering for the subscription was disabled, causing unrelated
messages to get published and handled by it.
This change makes it so that an explicit route is added for the
message type used for the message indicating the subscription has
ended and removes the default router callback. This allows message
filtering to occur on publishing reducing the messages to app_queue
to only those it is interested in.
#### taskpool: Fix some references to threadpool that should be taskpool.
Author: George Joseph
Date: 2025-10-10
Resolves: #1478
#### Update contact information for anthm
Author: Anthony Minessale
Date: 2025-10-10
#### chan_websocket.c: Change payload references to command instead.
Author: George Joseph
Date: 2025-10-08
Some of the tests in process_text_message() were still comparing to the
websocket message payload instead of the "command" string.
Resolves: #1525
#### func_callerid: Document limitation of DNID fields.
Author: Naveen Albert
Date: 2025-10-06
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
#### func_channel: Allow R/W of ADSI CPE capability setting.
Author: Naveen Albert
Date: 2025-10-06
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.
#### core_unreal: Preserve ADSI capability when dialing Local channels.
Author: Naveen Albert
Date: 2025-10-06
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
#### func_hangupcause.c: Add access to Reason headers via HANGUPCAUSE()
Author: Igor Goncharovsky
Date: 2025-09-04
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.
#### sig_analog: Allow '#' to end the inter-digit timeout when dialing.
Author: Naveen Albert
Date: 2025-10-03
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
#### func_math: Add DIGIT_SUM function.
Author: Naveen Albert
Date: 2025-10-01
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.
#### app_sf: Add post-digit timer option to ReceiveSF.
Author: Naveen Albert
Date: 2025-10-01
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.
#### codec_builtin.c: Adjust some of the quality scores to reflect reality.
Author: Naveen Albert
Date: 2025-10-02
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
#### res_tonedetect: Fix formatting of XML documentation.
Author: Naveen Albert
Date: 2025-10-02
Fix the indentation in the documentation for the variable list.
Resolves: #1507
#### res_fax: Add XML documentation for channel variables.
Author: Naveen Albert
Date: 2025-10-02
Document the channel variables currently set by SendFAX and ReceiveFAX.
Resolves: #1505
#### channelstorage_cpp_map_name_id: Add read locking around retrievals.
Author: George Joseph
Date: 2025-10-01
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
#### app_dial: Allow fractional seconds for dial timeouts.
Author: Naveen Albert
Date: 2025-09-30
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.
#### dsp.c: Make minor fixes to debug log messages.
Author: Naveen Albert
Date: 2025-10-01
Commit dc8e3eeaaf094a3d16991289934093d5e7127680 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
#### config_options.c: Improve misleading warning.
Author: Naveen Albert
Date: 2025-09-30
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
#### func_scramble: Add example to XML documentation.
Author: Naveen Albert
Date: 2025-09-29
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
#### sig_analog: Eliminate potential timeout with Last Number Redial.
Author: Naveen Albert
Date: 2025-09-29
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
#### ARI: The bridges play and record APIs now handle sample rates > 8K correctly.
Author: George Joseph
Date: 2025-09-25
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.
#### res_pjsip_geolocation: Add support for Geolocation loc-src parameter
Author: Max Grobecker
Date: 2025-09-21
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.
#### sorcery: Move from threadpool to taskpool.
Author: Joshua C. Colp
Date: 2025-09-23
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.
#### stasis_channels.c: Make protocol_id optional to enable blind transfer via ari
Author: Sven Kube
Date: 2025-09-22
When handling SIP transfers via ARI, there is no protocol_id in case of
a blind transfer.
Resolves: #1467
#### Fix some doxygen, typos and whitespace
Author: Bastian Triller
Date: 2025-09-21
#### stasis_channels.c: Add null check for referred_by in ast_ari_transfer_message_..
Author: Sven Kube
Date: 2025-09-18
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.
#### app_queue: Add NULL pointer checks in app_queue
Author: phoneben
Date: 2025-09-11
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
#### app_externalivr: Prevent out-of-bounds read during argument processing.
Author: Sean Bright
Date: 2025-09-17
Resolves: #1422
#### chan_dahdi: Add DAHDI_CHANNEL function.
Author: Naveen Albert
Date: 2025-09-11
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.
#### taskpool: Update versions for taskpool stasis options.
Author: Joshua C. Colp
Date: 2025-09-16
#### taskpool: Add taskpool API, switch Stasis to using it.
Author: Joshua C. Colp
Date: 2025-08-06
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.
#### app_adsiprog: Fix possible NULL dereference.
Author: Naveen Albert
Date: 2025-09-10
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
#### manager.c: Fix presencestate object leak
Author: Nathan Monfils
Date: 2025-09-08
ast_presence_state allocates subtype and message. We straightforwardly
need to clean those up.
#### audiohook.c: Ensure correct AO2 reference is dereffed.
Author: Sean Bright
Date: 2025-09-10
Part of #1440.
#### res_cliexec: Remove unnecessary casts to char*.
Author: Naveen Albert
Date: 2025-09-09
Resolves: #1436
#### rtp_engine.c: Add exception for comfort noise payload.
Author: Ben Ford
Date: 2025-09-09
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
#### pbx_variables.c: Create real channel for "dialplan eval function".
Author: Naveen Albert
Date: 2025-09-09
"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

29
LICENSE
View File

@@ -1,6 +1,6 @@
Asterisk is distributed under the GNU General Public License version 2
and is also available under alternative licenses negotiated directly
with Digium, Inc. If you obtained Asterisk under the GPL, then the GPL
with Sangoma US Inc. If you obtained Asterisk under the GPL, then the GPL
applies to all loadable Asterisk modules used on your system as well,
except as defined below. The GPL (version 2) is included in this
source tree in the file COPYING.
@@ -10,14 +10,13 @@ Asterisk itself; these components are in the 'contrib' directory
and its subdirectories. These components are also distributed under the
GPL version 2 as well.
Digium, Inc. (formerly Linux Support Services) holds copyright
and/or sufficient licenses to all components of the Asterisk
package, and therefore can grant, at its sole discretion, the ability
for companies, individuals, or organizations to create proprietary or
Open Source (even if not GPL) modules which may be dynamically linked at
runtime with the portions of Asterisk which fall under our
copyright/license umbrella, or are distributed under more flexible
licenses than GPL.
Sangoma US Inc. holds copyright and/or sufficient licenses to all
components of the Asterisk package, and therefore can grant, at its
sole discretion, the ability for companies, individuals, or
organizations to create proprietary or Open Source (even if not GPL)
modules which may be dynamically linked at runtime with the portions
of Asterisk which fall under our copyright/license umbrella, or are
distributed under more flexible licenses than GPL.
If you wish to use our code in other GPL programs, don't worry --
there is no requirement that you provide the same exception in your
@@ -38,10 +37,10 @@ these protocols do fall under the terms of the GPL, then we hereby grant you a
license to use these protocols in combination with Asterisk in external
applications licensed under any license you wish.
The 'Asterisk' name and logos are trademarks owned by Digium, Inc.,
The 'Asterisk' name and logos are trademarks owned by Sangoma US Inc,
and use of them is subject to our trademark licensing policies. If you
wish to use these trademarks for purposes other than simple
redistribution of Asterisk source code obtained from Digium, you
redistribution of Asterisk source code obtained from Sangoma, you
should contact our licensing department to determine the necessary
steps you must take. For more information on this policy, please read:
@@ -53,9 +52,9 @@ contact us:
+1.877.344.4861 (via telephone in the USA)
+1.256.428.6000 (via telephone outside the USA)
+1.256.864.0464 (via FAX inside or outside the USA)
licensing@digium.com (via email)
legal@sangoma.com (via email)
Digium, Inc.
445 Jan Davis Drive
Huntsville, AL 35806
Sangoma US Inc.
301 N. Cattlemen Road, Suite 300
Sarasota, FL 34232
USA

View File

@@ -1092,12 +1092,13 @@ menuselect/nmenuselect: menuselect/makeopts .lastclean
menuselect/makeopts: makeopts .lastclean
+$(MAKE_MENUSELECT) makeopts
menuselect-tree: $(foreach dir,$(filter-out main,$(MOD_SUBDIRS)),$(wildcard $(dir)/*.c) $(wildcard $(dir)/*.cc) $(wildcard $(dir)/*.xml)) build_tools/cflags.xml build_tools/cflags-devmode.xml sounds/sounds.xml utils/utils.xml agi/agi.xml configure makeopts
menuselect-tree: $(foreach dir,$(filter-out main,$(MOD_SUBDIRS)),$(wildcard $(dir)/*.c) $(wildcard $(dir)/*.cc) $(wildcard $(dir)/*.xml)) main/channelstorage_makeopts.xml build_tools/cflags.xml build_tools/cflags-devmode.xml sounds/sounds.xml utils/utils.xml agi/agi.xml configure makeopts
@echo "Generating input for menuselect ..."
@echo "<?xml version=\"1.0\"?>" > $@
@echo >> $@
@echo "<menu name=\"Asterisk Module and Build Option Selection\">" >> $@
+@for dir in $(sort $(filter-out main,$(MOD_SUBDIRS))); do $(SILENTMAKE) -C $${dir} SUBDIR=$${dir} moduleinfo >> $@; done
@cat main/channelstorage_makeopts.xml >> $@
@cat build_tools/cflags.xml >> $@
+@for dir in $(sort $(filter-out main,$(MOD_SUBDIRS))); do $(SILENTMAKE) -C $${dir} SUBDIR=$${dir} makeopts >> $@; done
@if [ "${AST_DEVMODE}" = "yes" ]; then \

174
README.html Normal file
View File

@@ -0,0 +1,174 @@
<html><head><title>Readme for asterisk-22.7.0-rc1</title></head><body>
<h1>The Asterisk(R) Open Source PBX</h1>
<pre><code>By Mark Spencer &lt;markster@digium.com&gt; and the Asterisk.org developer community.
Copyright (C) 2001-2025 Sangoma Technologies Corporation and other copyright holders.
</code></pre>
<h2>SECURITY</h2>
<p>It is imperative that you read and fully understand the contents of
the security information document before you attempt to configure and run
an Asterisk server.</p>
<p>See <a href="https://docs.asterisk.org/Deployment/Important-Security-Considerations">Important Security Considerations</a> for more information.</p>
<h2>WHAT IS ASTERISK ?</h2>
<p>Asterisk is an Open Source PBX and telephony toolkit. It is, in a
sense, middleware between Internet and telephony channels on the bottom,
and Internet and telephony applications at the top. However, Asterisk supports
more telephony interfaces than just Internet telephony. Asterisk also has a
vast amount of support for traditional PSTN telephony, as well.</p>
<p>For more information on the project itself, please visit the <a href="https://www.asterisk.org">Asterisk
Home Page</a> and the official
<a href="https://docs.asterisk.org">Asterisk Documentation</a>.</p>
<h2>SUPPORTED OPERATING SYSTEMS</h2>
<h3>Linux</h3>
<p>The Asterisk Open Source PBX is developed and tested primarily on the
GNU/Linux operating system, and is supported on every major GNU/Linux
distribution.</p>
<h3>Others</h3>
<p>Asterisk has also been 'ported' and reportedly runs properly on other
operating systems as well, Apple's Mac OS X, and the BSD variants.</p>
<h2>GETTING STARTED</h2>
<p>Most users are using VoIP/SIP exclusively these days but if you need to
interface to TDM or analog services or devices, be sure you've got supported
hardware.</p>
<p>Supported telephony hardware includes:
* All Analog and Digital Interface cards from Sangoma
* Any full duplex sound card supported by PortAudio
* The Xorcom Astribank channel bank</p>
<h3>UPGRADING FROM AN EARLIER VERSION</h3>
<p>If you are updating from a previous version of Asterisk, make sure you
read the Change Logs.</p>
<!-- CHANGELOGS (the URL will change based on the location of this README) -->
<p><a href="ChangeLogs/ChangeLog-22.7.0-rc1.html">Change Logs</a></p>
<!-- END-CHANGELOGS -->
<h3>NEW INSTALLATIONS</h3>
<p>Ensure that your system contains a compatible compiler and development
libraries. Asterisk requires either the GNU Compiler Collection (GCC) version
4.1 or higher, or a compiler that supports the C99 specification and some of
the gcc language extensions. In addition, your system needs to have the C
library headers available, and the headers and libraries for ncurses.</p>
<p>There are many modules that have additional dependencies. To see what
libraries are being looked for, see <code>./configure --help</code>, or run
<code>make menuselect</code> to view the dependencies for specific modules.</p>
<p>On many distributions, these dependencies are installed by packages with names
like 'glibc-devel', 'ncurses-devel', 'openssl-devel' and 'zlib-devel'
or similar. The <code>contrib/scripts/install_prereq</code> script can be used to install
the dependencies for most Debian and Redhat based Linux distributions.
The script also handles SUSE, Arch, Gentoo, FreeBSD, NetBSD and OpenBSD but
those distributions mightnoit have complete support or they might be out of date.</p>
<p>So, let's proceed:</p>
<ol>
<li>
<p>Read the documentation.<br>
The <a href="https://docs.asterisk.org">Asterisk Documentation</a> website has full
information for building, installing, configuring and running Asterisk.</p>
</li>
<li>
<p>Run <code>./configure</code><br>
Execute the configure script to guess values for system-dependent
variables used during compilation. If the script indicates that some required
components are missing, you can run <code>./contrib/scripts/install_prereq install</code>
to install the necessary components. Note that this will install all dependencies
for every functionality of Asterisk. After running the script, you will need
to rerun <code>./configure</code>.</p>
</li>
<li>
<p>Run <code>make menuselect</code><br>
This is needed if you want to select the modules that will be compiled and to
check dependencies for various optional modules.</p>
</li>
<li>
<p>Run <code>make</code><br>
Assuming the build completes successfully:</p>
</li>
<li>
<p>Run <code>make install</code><br>
If this is your first time working with Asterisk, you may wish to install
the sample PBX, with demonstration extensions, etc. If so, run:</p>
</li>
<li>
<p>Run <code>make samples</code><br>
Doing so will overwrite any existing configuration files you have installed.</p>
</li>
<li>
<p>Finally, you can launch Asterisk in the foreground mode (not a daemon) with
<code>asterisk -vvvc</code><br>
You'll see a bunch of verbose messages fly by your screen as Asterisk
initializes (that's the "very very verbose" mode). When it's ready, if
you specified the "c" then you'll get a command line console, that looks
like this:<br>
<code>*CLI&gt;</code><br>
You can type <code>core show help</code> at any time to get help with the system. For help
with a specific command, type <code>core show help &lt;command&gt;</code>.</p>
</li>
</ol>
<p><code>man asterisk</code> at the Unix/Linux command prompt will give you detailed
information on how to start and stop Asterisk, as well as all the command
line options for starting Asterisk.</p>
<h3>ABOUT CONFIGURATION FILES</h3>
<p>All Asterisk configuration files share a common format. Comments are
delimited by <code>;</code> (since <code>#</code> of course, being a DTMF digit, may occur in
many places). A configuration file is divided into sections whose names
appear in <code>[]</code>'s. Each section typically contains statements in the form
<code>variable = value</code> although you may see <code>variable =&gt; value</code> in older samples.</p>
<h3>SPECIAL NOTE ON TIME</h3>
<p>Those using SIP phones should be aware that Asterisk is sensitive to
large jumps in time. Manually changing the system time using date(1)
(or other similar commands) may cause SIP registrations and other
internal processes to fail. For this reason, you should always use
a time synchronization package to keep your system time accurate.
All OS/distributions make one or more of the following packages
available:</p>
<ul>
<li>ntpd/ntpsec</li>
<li>chronyd</li>
<li>systemd-timesyncd</li>
</ul>
<p>Be sure to install and configure one (and only one) of them.</p>
<h3>FILE DESCRIPTORS</h3>
<p>Depending on the size of your system and your configuration,
Asterisk can consume a large number of file descriptors. In UNIX,
file descriptors are used for more than just files on disk. File
descriptors are also used for handling network communication
(e.g. SIP, IAX2, or H.323 calls) and hardware access (e.g. analog and
digital trunk hardware). Asterisk accesses many on-disk files for
everything from configuration information to voicemail storage.</p>
<p>Most systems limit the number of file descriptors that Asterisk can
have open at one time. This can limit the number of simultaneous
calls that your system can handle. For example, if the limit is set
at 1024 (a common default value) Asterisk can handle approximately 150
SIP calls simultaneously. To change the number of file descriptors
follow the instructions for your system below:</p>
<h4>PAM-BASED LINUX SYSTEM</h4>
<p>If your system uses PAM (Pluggable Authentication Modules) edit
<code>/etc/security/limits.conf</code>. Add these lines to the bottom of the file:</p>
<pre><code class="language-text">root soft nofile 4096
root hard nofile 8196
asterisk soft nofile 4096
asterisk hard nofile 8196
</code></pre>
<p>(adjust the numbers to taste). You may need to reboot the system for
these changes to take effect.</p>
<h4>GENERIC UNIX SYSTEM</h4>
<p>If there are no instructions specifically adapted to your system
above you can try adding the command <code>ulimit -n 8192</code> to the script
that starts Asterisk.</p>
<h2>MORE INFORMATION</h2>
<p>Visit the <a href="https://docs.asterisk.org">Asterisk Documentation</a> website
for more documentation on various features and please read all the
configuration samples that include documentation on the configuration options.</p>
<p>Finally, you may wish to join the
<a href="https://community.asterisk.org">Asterisk Community Forums</a></p>
<p>Welcome to the growing worldwide community of Asterisk users!</p>
<pre><code> Mark Spencer, and the Asterisk.org development community
</code></pre>
<hr>
<p>Asterisk is a trademark of Sangoma Technologies Corporation</p>
<p>[<a href="https://www.sangoma.com/">Sangoma</a>]
[<a href="https://www.asterisk.org">Home Page</a>]
[<a href="https://www.asterisk.org/support">Support</a>]
[<a href="https://docs.asterisk.org">Documentation</a>]
[<a href="https://community.asterisk.org">Community Forums</a>]
[<a href="https://github.com/asterisk/asterisk/releases">Release Notes</a>]
[<a href="https://docs.asterisk.org/Deployment/Important-Security-Considerations/">Security</a>]
[<a href="https://lists.digium.com">Mailing List Archive</a>] </p>
</body></html>

236
README.md
View File

@@ -1,209 +1,151 @@
# The Asterisk(R) Open Source PBX
```text
By Mark Spencer <markster@digium.com> and the Asterisk.org developer community.
Copyright (C) 2001-2021 Sangoma Technologies Corporation and other copyright holders.
```
By Mark Spencer <markster@digium.com> and the Asterisk.org developer community.
Copyright (C) 2001-2025 Sangoma Technologies Corporation and other copyright holders.
```
## SECURITY
It is imperative that you read and fully understand the contents of
It is imperative that you read and fully understand the contents of
the security information document before you attempt to configure and run
an Asterisk server.
See [Important Security Considerations] for more information.
See [Important Security Considerations](https://docs.asterisk.org/Deployment/Important-Security-Considerations) for more information.
## WHAT IS ASTERISK ?
Asterisk is an Open Source PBX and telephony toolkit. It is, in a
Asterisk is an Open Source PBX and telephony toolkit. It is, in a
sense, middleware between Internet and telephony channels on the bottom,
and Internet and telephony applications at the top. However, Asterisk supports
more telephony interfaces than just Internet telephony. Asterisk also has a
vast amount of support for traditional PSTN telephony, as well.
For more information on the project itself, please visit the Asterisk
[home page] and the official [documentation]. In addition you'll find lots
of information compiled by the Asterisk community at [voip-info.org].
There is a book on Asterisk published by O'Reilly under the Creative Commons
License. It is available in book stores as well as in a downloadable version on
the [asteriskdocs.org] web site.
For more information on the project itself, please visit the [Asterisk
Home Page](https://www.asterisk.org) and the official
[Asterisk Documentation](https://docs.asterisk.org).
## SUPPORTED OPERATING SYSTEMS
### Linux
The Asterisk Open Source PBX is developed and tested primarily on the
The Asterisk Open Source PBX is developed and tested primarily on the
GNU/Linux operating system, and is supported on every major GNU/Linux
distribution.
### Others
Asterisk has also been 'ported' and reportedly runs properly on other
operating systems as well, including Sun Solaris, Apple's Mac OS X, Cygwin,
and the BSD variants.
Asterisk has also been 'ported' and reportedly runs properly on other
operating systems as well, Apple's Mac OS X, and the BSD variants.
## GETTING STARTED
First, be sure you've got supported hardware (but note that you don't need
ANY special hardware, not even a sound card) to install and run Asterisk.
Most users are using VoIP/SIP exclusively these days but if you need to
interface to TDM or analog services or devices, be sure you've got supported
hardware.
Supported telephony hardware includes:
* All Analog and Digital Interface cards from [Sangoma]
* QuickNet Internet PhoneJack and LineJack
* any full duplex sound card supported by ALSA, OSS, or PortAudio
* any ISDN card supported by mISDN on Linux
* All Analog and Digital Interface cards from Sangoma
* Any full duplex sound card supported by PortAudio
* The Xorcom Astribank channel bank
* VoiceTronix OpenLine products
### UPGRADING FROM AN EARLIER VERSION
If you are updating from a previous version of Asterisk, make sure you
read the [UPGRADE.txt] file in the source directory. There are some files
and configuration options that you will have to change, even though we
made every effort possible to maintain backwards compatibility.
If you are updating from a previous version of Asterisk, make sure you
read the Change Logs.
In order to discover new features to use, please check the configuration
examples in the [configs] directory of the source code distribution. For a
list of new features in this version of Asterisk, see the [CHANGES] file.
<!-- CHANGELOGS (the URL will change based on the location of this README) -->
[Change Logs](ChangeLogs/ChangeLog-22.7.0-rc1.html)
<!-- END-CHANGELOGS -->
### NEW INSTALLATIONS
Ensure that your system contains a compatible compiler and development
Ensure that your system contains a compatible compiler and development
libraries. Asterisk requires either the GNU Compiler Collection (GCC) version
4.1 or higher, or a compiler that supports the C99 specification and some of
the gcc language extensions. In addition, your system needs to have the C
library headers available, and the headers and libraries for ncurses.
There are many modules that have additional dependencies. To see what
There are many modules that have additional dependencies. To see what
libraries are being looked for, see `./configure --help`, or run
`make menuselect` to view the dependencies for specific modules.
On many distributions, these dependencies are installed by packages with names
On many distributions, these dependencies are installed by packages with names
like 'glibc-devel', 'ncurses-devel', 'openssl-devel' and 'zlib-devel'
or similar.
or similar. The `contrib/scripts/install_prereq` script can be used to install
the dependencies for most Debian and Redhat based Linux distributions.
The script also handles SUSE, Arch, Gentoo, FreeBSD, NetBSD and OpenBSD but
those distributions mightnoit have complete support or they might be out of date.
So, let's proceed:
1. Read this file.
There are more documents than this one in the [doc] directory. You may also
want to check the configuration files that contain examples and reference
guides in the [configs] directory.
1. Read the documentation.<br>
The [Asterisk Documentation](https://docs.asterisk.org) website has full
information for building, installing, configuring and running Asterisk.
2. Run `./configure`
Execute the configure script to guess values for system-dependent
variables used during compilation. If the script indicates that some required
2. Run `./configure`<br>
Execute the configure script to guess values for system-dependent
variables used during compilation. If the script indicates that some required
components are missing, you can run `./contrib/scripts/install_prereq install`
to install the necessary components. Note that this will install all dependencies for every functionality of Asterisk. After running the script, you will need
to install the necessary components. Note that this will install all dependencies
for every functionality of Asterisk. After running the script, you will need
to rerun `./configure`.
3. Run `make menuselect` _\[optional]_
This is needed if you want to select the modules that will be compiled and to
3. Run `make menuselect`<br>
This is needed if you want to select the modules that will be compiled and to
check dependencies for various optional modules.
4. Run `make`
4. Run `make`<br>
Assuming the build completes successfully:
5. Run `make install`
If this is your first time working with Asterisk, you may wish to install
5. Run `make install`<br>
If this is your first time working with Asterisk, you may wish to install
the sample PBX, with demonstration extensions, etc. If so, run:
6. Run `make samples`
6. Run `make samples`<br>
Doing so will overwrite any existing configuration files you have installed.
Doing so will overwrite any existing configuration files you have installed.
7. Finally, you can launch Asterisk in the foreground mode (not a daemon) with:
```
# asterisk -vvvc
```
You'll see a bunch of verbose messages fly by your screen as Asterisk
7. Finally, you can launch Asterisk in the foreground mode (not a daemon) with
`asterisk -vvvc`<br>
You'll see a bunch of verbose messages fly by your screen as Asterisk
initializes (that's the "very very verbose" mode). When it's ready, if
you specified the "c" then you'll get a command line console, that looks
like this:
```
*CLI>
```
You can type "core show help" at any time to get help with the system. For help
with a specific command, type "core show help <command>". To start the PBX using
your sound card, you can type "console dial" to dial the PBX. Then you can use
"console answer", "console hangup", and "console dial" to simulate the actions
of a telephone. Remember that if you don't have a full duplex sound card
(and Asterisk will tell you somewhere in its verbose messages if you do/don't)
then it won't work right (not yet).
like this:<br>
`*CLI>`<br>
You can type `core show help` at any time to get help with the system. For help
with a specific command, type `core show help <command>`.
"man asterisk" at the Unix/Linux command prompt will give you detailed
`man asterisk` at the Unix/Linux command prompt will give you detailed
information on how to start and stop Asterisk, as well as all the command
line options for starting Asterisk.
Feel free to look over the configuration files in `/etc/asterisk`, where you
will find a lot of information about what you can do with Asterisk.
### ABOUT CONFIGURATION FILES
All Asterisk configuration files share a common format. Comments are
delimited by ';' (since '#' of course, being a DTMF digit, may occur in
All Asterisk configuration files share a common format. Comments are
delimited by `;` (since `#` of course, being a DTMF digit, may occur in
many places). A configuration file is divided into sections whose names
appear in []'s. Each section typically contains two types of statements,
those of the form 'variable = value', and those of the form 'object =>
parameters'. Internally the use of '=' and '=>' is exactly the same, so
they're used only to help make the configuration file easier to
understand, and do not affect how it is actually parsed.
Entries of the form 'variable=value' set the value of some parameter in
asterisk. For example, in [chan_dahdi.conf], one might specify:
```
switchtype=national
```
In order to indicate to Asterisk that the switch they are connecting to is
of the type "national". In general, the parameter will apply to
instantiations which occur below its specification. For example, if the
configuration file read:
```
switchtype = national
channel => 1-4
channel => 10-12
switchtype = dms100
channel => 25-47
```
The "national" switchtype would be applied to channels one through
four and channels 10 through 12, whereas the "dms100" switchtype would
apply to channels 25 through 47.
The "object => parameters" instantiates an object with the given
parameters. For example, the line "channel => 25-47" creates objects for
the channels 25 through 47 of the card, obtaining the settings
from the variables specified above.
appear in `[]`'s. Each section typically contains statements in the form
`variable = value` although you may see `variable => value` in older samples.
### SPECIAL NOTE ON TIME
Those using SIP phones should be aware that Asterisk is sensitive to
Those using SIP phones should be aware that Asterisk is sensitive to
large jumps in time. Manually changing the system time using date(1)
(or other similar commands) may cause SIP registrations and other
internal processes to fail. If your system cannot keep accurate time
by itself use [NTP] to keep the system clock
synchronized to "real time". NTP is designed to keep the system clock
synchronized by speeding up or slowing down the system clock until it
is synchronized to "real time" rather than by jumping the time and
causing discontinuities. Most Linux distributions include precompiled
versions of NTP. Beware of some time synchronization methods that get
the correct real time periodically and then manually set the system
clock.
internal processes to fail. For this reason, you should always use
a time synchronization package to keep your system time accurate.
All OS/distributions make one or more of the following packages
available:
Apparent time changes due to daylight savings time are just that,
apparent. The use of daylight savings time in a Linux system is
purely a user interface issue and does not affect the operation of the
Linux kernel or Asterisk. The system clock on Linux kernels operates
on UTC. UTC does not use daylight savings time.
* ntpd/ntpsec
* chronyd
* systemd-timesyncd
Also note that this issue is separate from the clocking of TDM
channels, and is known to at least affect SIP registrations.
Be sure to install and configure one (and only one) of them.
### FILE DESCRIPTORS
Depending on the size of your system and your configuration,
Depending on the size of your system and your configuration,
Asterisk can consume a large number of file descriptors. In UNIX,
file descriptors are used for more than just files on disk. File
descriptors are also used for handling network communication
@@ -211,7 +153,7 @@ descriptors are also used for handling network communication
digital trunk hardware). Asterisk accesses many on-disk files for
everything from configuration information to voicemail storage.
Most systems limit the number of file descriptors that Asterisk can
Most systems limit the number of file descriptors that Asterisk can
have open at one time. This can limit the number of simultaneous
calls that your system can handle. For example, if the limit is set
at 1024 (a common default value) Asterisk can handle approximately 150
@@ -220,8 +162,9 @@ follow the instructions for your system below:
#### PAM-BASED LINUX SYSTEM
If your system uses PAM (Pluggable Authentication Modules) edit
If your system uses PAM (Pluggable Authentication Modules) edit
`/etc/security/limits.conf`. Add these lines to the bottom of the file:
```text
root soft nofile 4096
root hard nofile 8196
@@ -234,20 +177,22 @@ these changes to take effect.
#### GENERIC UNIX SYSTEM
If there are no instructions specifically adapted to your system
If there are no instructions specifically adapted to your system
above you can try adding the command `ulimit -n 8192` to the script
that starts Asterisk.
## MORE INFORMATION
See the [doc] directory for more documentation on various features.
Again, please read all the configuration samples that include documentation
on the configuration options.
Visit the [Asterisk Documentation](https://docs.asterisk.org) website
for more documentation on various features and please read all the
configuration samples that include documentation on the configuration options.
Finally, you may wish to join the
[Asterisk Community Forums](https://community.asterisk.org)
Finally, you may wish to visit the [support] site and join the [mailing
list] if you're interested in getting more information.
Welcome to the growing worldwide community of Asterisk users!
```
Mark Spencer, and the Asterisk.org development community
```
@@ -256,17 +201,12 @@ Welcome to the growing worldwide community of Asterisk users!
Asterisk is a trademark of Sangoma Technologies Corporation
[home page]: https://www.asterisk.org
[support]: https://www.asterisk.org/support
[documentation]: https://docs.asterisk.org/
[mailing list]: http://lists.digium.com/mailman/listinfo/asterisk-users
[chan_dahdi.conf]: configs/samples/chan_dahdi.conf.sample
[voip-info.org]: http://www.voip-info.org/wiki-Asterisk
[asteriskdocs.org]: http://www.asteriskdocs.org
[NTP]: http://www.ntp.org/
[Sangoma]: https://www.sangoma.com/
[UPGRADE.txt]: UPGRADE.txt
[CHANGES]: CHANGES
[configs]: configs
[doc]: doc
[Important Security Considerations]: https://docs.asterisk.org/Deployment/Important-Security-Considerations/
\[[Sangoma](https://www.sangoma.com/)\]
\[[Home Page](https://www.asterisk.org)\]
\[[Support](https://www.asterisk.org/support)\]
\[[Documentation](https://docs.asterisk.org)\]
\[[Community Forums](https://community.asterisk.org)\]
\[[Release Notes](https://github.com/asterisk/asterisk/releases)\]
\[[Security](https://docs.asterisk.org/Deployment/Important-Security-Considerations/)\]
\[[Mailing List Archive](https://lists.digium.com)\]

View File

@@ -12,7 +12,7 @@
* This code is released into public domain
* without any warranty of any kind.
*
* \ingroup agi
* \ingroup agi
*/
#include <stdio.h>

View File

@@ -52,6 +52,8 @@ $(call MOD_ADD_C,app_confbridge,$(wildcard confbridge/*.c))
app_confbridge.o: _ASTCFLAGS+=$(AST_NO_FORMAT_TRUNCATION)
app_meetme.o: _ASTCFLAGS+=$(AST_NO_FORMAT_TRUNCATION)
app_minivm.o: _ASTCFLAGS+=$(AST_NO_FORMAT_TRUNCATION)
# Needed to work around gcc 15 bug: https://github.com/asterisk/asterisk/issues/1088
app_sms.o: _ASTCFLAGS+=-fno-tree-vectorize
app_voicemail.o: _ASTCFLAGS+=$(AST_NO_FORMAT_TRUNCATION) -DFILE_STORAGE
app_voicemail_odbc.o: _ASTCFLAGS+=$(AST_NO_FORMAT_TRUNCATION) -DODBC_STORAGE
app_voicemail_imap.o: _ASTCFLAGS+=$(AST_NO_FORMAT_TRUNCATION) -DIMAP_STORAGE

View File

@@ -57,6 +57,9 @@ static const char app[] = "ADSIProg";
/*** DOCUMENTATION
<application name="ADSIProg" language="en_US">
<since>
<version>0.1.12</version>
</since>
<synopsis>
Load Asterisk ADSI Scripts into phone
</synopsis>
@@ -845,7 +848,10 @@ static int onevent(char *buf, char *name, int id, char *args, struct adsi_script
return 0;
}
/* Process 'in' things */
tok = get_token(&args, script, lineno);
if (!(tok = get_token(&args, script, lineno))) {
ast_log(LOG_WARNING, "Missing state name at line %d of %s\n", lineno, script);
return 0;
}
if (process_token(sname, tok, sizeof(sname), ARG_STRING)) {
ast_log(LOG_WARNING, "'%s' is not a valid state name at line %d of %s\n", tok, lineno, script);
return 0;

View File

@@ -57,6 +57,9 @@
/*** DOCUMENTATION
<application name="AgentLogin" language="en_US">
<since>
<version>12.0.0</version>
</since>
<synopsis>
Login an agent.
</synopsis>
@@ -105,6 +108,9 @@
</see-also>
</application>
<application name="AgentRequest" language="en_US">
<since>
<version>12.0.0</version>
</since>
<synopsis>
Request an agent to connect with the channel.
</synopsis>
@@ -130,6 +136,9 @@
</see-also>
</application>
<function name="AGENT" language="en_US">
<since>
<version>12.0.0</version>
</since>
<synopsis>
Gets information about an Agent
</synopsis>
@@ -141,9 +150,6 @@
<enum name="status">
<para>(default) The status of the agent (LOGGEDIN | LOGGEDOUT)</para>
</enum>
<enum name="password">
<para>Deprecated. The dialplan handles any agent authentication.</para>
</enum>
<enum name="name">
<para>The name of the agent</para>
</enum>
@@ -162,6 +168,9 @@
<description></description>
</function>
<manager name="Agents" language="en_US">
<since>
<version>1.2.0</version>
</since>
<synopsis>
Lists agents and their status.
</synopsis>
@@ -178,6 +187,9 @@
</manager>
<managerEvent language="en_US" name="Agents">
<managerEventInstance class="EVENT_FLAG_AGENT">
<since>
<version>12.0.0</version>
</since>
<synopsis>
Response event in a series to the Agents AMI action containing
information about a defined agent.
@@ -203,11 +215,11 @@
<para>Present if Status value is <literal>AGENT_ONCALL</literal>.</para>
</parameter>
<parameter name="CallStarted">
<para>Epoche time when the agent started talking with the caller.</para>
<para>Epoch time when the agent started talking with the caller.</para>
<para>Present if Status value is <literal>AGENT_ONCALL</literal>.</para>
</parameter>
<parameter name="LoggedInTime">
<para>Epoche time when the agent logged in.</para>
<para>Epoch time when the agent logged in.</para>
<para>Present if Status value is <literal>AGENT_IDLE</literal> or <literal>AGENT_ONCALL</literal>.</para>
</parameter>
<channel_snapshot/>
@@ -223,6 +235,9 @@
</managerEvent>
<managerEvent language="en_US" name="AgentsComplete">
<managerEventInstance class="EVENT_FLAG_AGENT">
<since>
<version>12.0.0</version>
</since>
<synopsis>
Final response event in a series of events to the Agents AMI action.
</synopsis>
@@ -235,6 +250,9 @@
</managerEventInstance>
</managerEvent>
<manager name="AgentLogoff" language="en_US">
<since>
<version>1.2.0</version>
</since>
<synopsis>
Sets an agent as no longer logged in.
</synopsis>
@@ -262,11 +280,17 @@
<synopsis>Unused, but reserved.</synopsis>
</configObject>
<configObject name="agent-id">
<since>
<version>12.0.0</version>
</since>
<synopsis>Configure an agent for the pool.</synopsis>
<description>
<xi:include xpointer="xpointer(/docs/configInfo[@name='app_agent_pool']/description/note)" />
</description>
<configOption name="ackcall">
<since>
<version>12.0.0</version>
</since>
<synopsis>Enable to require the agent to acknowledge a call.</synopsis>
<description>
<para>Enable to require the agent to give a DTMF acknowledgement
@@ -276,6 +300,9 @@
</description>
</configOption>
<configOption name="acceptdtmf">
<since>
<version>12.0.0</version>
</since>
<synopsis>DTMF key sequence the agent uses to acknowledge a call.</synopsis>
<description>
<note><para>The option is overridden by <variable>AGENTACCEPTDTMF</variable> on agent login.</para></note>
@@ -284,6 +311,9 @@
</description>
</configOption>
<configOption name="autologoff">
<since>
<version>12.0.0</version>
</since>
<synopsis>Time the agent has to acknowledge a call before being logged off.</synopsis>
<description>
<para>Set how many seconds a call for the agent has to wait for the
@@ -296,6 +326,9 @@
</description>
</configOption>
<configOption name="wrapuptime">
<since>
<version>12.0.0</version>
</since>
<synopsis>Minimum time the agent has between calls.</synopsis>
<description>
<para>Set the minimum amount of time in milliseconds after
@@ -305,12 +338,18 @@
</description>
</configOption>
<configOption name="musiconhold">
<since>
<version>12.0.0</version>
</since>
<synopsis>Music on hold class the agent listens to between calls.</synopsis>
<description>
<xi:include xpointer="xpointer(/docs/configInfo[@name='app_agent_pool']/description/note)" />
</description>
</configOption>
<configOption name="recordagentcalls">
<since>
<version>12.0.0</version>
</since>
<synopsis>Enable to automatically record calls the agent takes.</synopsis>
<description>
<para>Enable recording calls the agent takes automatically by
@@ -321,12 +360,18 @@
</description>
</configOption>
<configOption name="custom_beep">
<since>
<version>12.4.0</version>
</since>
<synopsis>Sound file played to alert the agent when a call is present.</synopsis>
<description>
<xi:include xpointer="xpointer(/docs/configInfo[@name='app_agent_pool']/description/note)" />
</description>
</configOption>
<configOption name="fullname">
<since>
<version>12.0.0</version>
</since>
<synopsis>A friendly name for the agent used in log messages.</synopsis>
<description>
<xi:include xpointer="xpointer(/docs/configInfo[@name='app_agent_pool']/description/note)" />

View File

@@ -146,6 +146,9 @@ struct timeval call_start_time;
static const char app[] = "AlarmReceiver";
/*** DOCUMENTATION
<application name="AlarmReceiver" language="en_US">
<since>
<version>1.0.0</version>
</since>
<synopsis>
Provide support for receiving alarm reports from a burglar or fire alarm panel.
</synopsis>

View File

@@ -54,6 +54,9 @@
/*** DOCUMENTATION
<application name="AMD" language="en_US">
<since>
<version>1.4.0</version>
</since>
<synopsis>
Attempt to detect answering machines.
</synopsis>

View File

@@ -40,6 +40,10 @@
/*** DOCUMENTATION
<application name="AttendedTransfer" language="en_US">
<since>
<version>13.28.0</version>
<version>16.5.0</version>
</since>
<synopsis>
Attended transfer to the extension provided and TRANSFER_CONTEXT
</synopsis>

View File

@@ -38,38 +38,42 @@
#include "asterisk/module.h"
#include "asterisk/channel.h"
#include "asterisk/app.h"
#include "asterisk/pbx.h"
#include "asterisk/res_audiosocket.h"
#include "asterisk/utils.h"
#include "asterisk/format_cache.h"
#define AST_MODULE "app_audiosocket"
#define AUDIOSOCKET_CONFIG "audiosocket.conf"
#define MAX_CONNECT_TIMEOUT_MSEC 2000
#define MAX_WAIT_TIMEOUT_MSEC 2000
/*** DOCUMENTATION
<application name="AudioSocket" language="en_US">
<since>
<version>18.0.0</version>
</since>
<synopsis>
Transmit and receive audio between channel and TCP socket
Transmit and receive PCM audio between a channel and a TCP socket server.
</synopsis>
<syntax>
<parameter name="uuid" required="true">
<para>UUID is the universally-unique identifier of the call for the audio socket service. This ID must conform to the string form of a standard UUID.</para>
</parameter>
<parameter name="service" required="true">
<para>Service is the name or IP address and port number of the audio socket service to which this call should be connected. This should be in the form host:port, such as myserver:9019 </para>
<para>Service is the name or IP address and port number of the audio socket service to which this call should be connected. This should be in the form host:port, such as myserver:9019. IPv6 addresses can be specified in square brackets, like [::1]:9019</para>
</parameter>
</syntax>
<description>
<para>Connects to the given TCP service, then transmits channel audio over that socket. In turn, audio is received from the socket and sent to the channel. Only audio frames will be transmitted.</para>
<para>Connects to the given TCP server, then transmits channel audio as 16-bit, 8KHz mono PCM over that socket (other codecs available via the channel driver interface). In turn, PCM audio is received from the socket and sent to the channel. Only audio frames and DTMF frames will be transmitted.</para>
<para>Protocol is specified at https://docs.asterisk.org/Configuration/Channel-Drivers/AudioSocket/</para>
<para>This application does not automatically answer and should generally be preceeded by an application such as Answer() or Progress().</para>
<para>This application does not automatically answer and should generally be preceded by an application such as Answer() or Progress().</para>
</description>
</application>
***/
static const char app[] = "AudioSocket";
static int audiosocket_run(struct ast_channel *chan, const char *id, const int svc);
static int audiosocket_run(struct ast_channel *chan, const char *id, const int svc, const char *server);
static int audiosocket_exec(struct ast_channel *chan, const char *data)
{
@@ -105,67 +109,53 @@ static int audiosocket_exec(struct ast_channel *chan, const char *data)
return -1;
}
/* Save current channel audio format and force to linear PCM. */
writeFormat = ao2_bump(ast_channel_writeformat(chan));
readFormat = ao2_bump(ast_channel_readformat(chan));
if (ast_set_write_format(chan, ast_format_slin)) {
ast_log(LOG_ERROR, "Failed to set write format to SLINEAR for channel %s\n", chanName);
ao2_ref(writeFormat, -1);
ao2_ref(readFormat, -1);
close(s);
return -1;
ast_log(LOG_ERROR, "Failed to set write format to SLINEAR for channel '%s'\n", chanName);
res = -1;
goto end;
}
if (ast_set_read_format(chan, ast_format_slin)) {
ast_log(LOG_ERROR, "Failed to set read format to SLINEAR for channel %s\n", chanName);
/* Attempt to restore previous write format even though it is likely to
* fail, since setting the read format did.
*/
if (ast_set_write_format(chan, writeFormat)) {
ast_log(LOG_ERROR, "Failed to restore write format for channel %s\n", chanName);
}
ao2_ref(writeFormat, -1);
ao2_ref(readFormat, -1);
close(s);
return -1;
ast_log(LOG_ERROR, "Failed to set read format to SLINEAR for channel '%s'\n", chanName);
res = -1;
goto end;
}
res = audiosocket_run(chan, args.idStr, s);
/* On non-zero return, report failure */
if (res) {
/* Restore previous formats and close the connection */
if (ast_set_write_format(chan, writeFormat)) {
ast_log(LOG_ERROR, "Failed to restore write format for channel %s\n", chanName);
}
if (ast_set_read_format(chan, readFormat)) {
ast_log(LOG_ERROR, "Failed to restore read format for channel %s\n", chanName);
}
ao2_ref(writeFormat, -1);
ao2_ref(readFormat, -1);
close(s);
return res;
}
close(s);
/* Only a requested hangup or socket closure from the remote end will
return a 0 value (normal exit). All other events that disrupt an
active connection are treated as errors for now (non-zero). */
res = audiosocket_run(chan, args.idStr, s, args.server);
end:
/* Restore previous formats and close the connection */
if (ast_set_write_format(chan, writeFormat)) {
ast_log(LOG_ERROR, "Failed to restore write format for channel %s\n", chanName);
ast_log(LOG_ERROR, "Failed to restore write format for channel '%s'\n", chanName);
}
if (ast_set_read_format(chan, readFormat)) {
ast_log(LOG_ERROR, "Failed to restore read format for channel %s\n", chanName);
ast_log(LOG_ERROR, "Failed to restore read format for channel '%s'\n", chanName);
}
ao2_ref(writeFormat, -1);
ao2_ref(readFormat, -1);
close(s);
return 0;
return res;
}
static int audiosocket_run(struct ast_channel *chan, const char *id, int svc)
static int audiosocket_run(struct ast_channel *chan, const char *id, int svc, const char *server)
{
const char *chanName;
struct ast_channel *targetChan;
int ms = 0;
int ms = MAX_WAIT_TIMEOUT_MSEC;
int outfd = -1;
struct ast_frame *f;
int hangup;
if (!chan || ast_channel_state(chan) != AST_STATE_UP) {
ast_log(LOG_ERROR, "Channel is %s\n", chan ? "not answered" : "missing");
@@ -173,46 +163,63 @@ static int audiosocket_run(struct ast_channel *chan, const char *id, int svc)
}
if (ast_audiosocket_init(svc, id)) {
ast_log(LOG_ERROR, "Failed to intialize AudioSocket\n");
ast_log(LOG_ERROR, "Failed to initialize AudioSocket\n");
return -1;
}
chanName = ast_channel_name(chan);
while (1) {
ms = -1;
/* Timeout is hard-coded currently, could be made into an
argument if needed, but 2 seconds seems like a realistic
time range to give. */
targetChan = ast_waitfor_nandfds(&chan, 1, &svc, 1, NULL, &outfd, &ms);
ms = MAX_WAIT_TIMEOUT_MSEC;
if (targetChan) {
/* Receive frame from connected channel. */
f = ast_read(chan);
if (!f) {
ast_log(LOG_WARNING, "Failed to receive frame from channel '%s' connected to AudioSocket server '%s'", chanName, server);
return -1;
}
if (f->frametype == AST_FRAME_VOICE) {
/* Send audio frame to audiosocket */
if (f->frametype == AST_FRAME_VOICE || f->frametype == AST_FRAME_DTMF) {
/* Send audio frame or DTMF frame to audiosocket */
if (ast_audiosocket_send_frame(svc, f)) {
ast_log(LOG_ERROR, "Failed to forward channel frame from %s to AudioSocket\n",
chanName);
ast_log(LOG_WARNING, "Failed to forward frame from channel '%s' to AudioSocket server '%s'\n",
chanName, server);
ast_frfree(f);
return -1;
}
}
ast_frfree(f);
}
if (outfd >= 0) {
f = ast_audiosocket_receive_frame(svc);
} else if (outfd >= 0) {
/* Receive audio frame from audiosocket. */
f = ast_audiosocket_receive_frame_with_hangup(svc, &hangup);
if (hangup) {
/* Graceful termination, no frame to free. */
return 0;
}
if (!f) {
ast_log(LOG_ERROR, "Failed to receive frame from AudioSocket message for"
"channel %s\n", chanName);
ast_log(LOG_WARNING, "Failed to receive frame from AudioSocket server '%s'"
" connected to channel '%s'\n", server, chanName);
return -1;
}
/* Send audio frame to connected channel. */
if (ast_write(chan, f)) {
ast_log(LOG_WARNING, "Failed to forward frame to channel %s\n", chanName);
ast_log(LOG_WARNING, "Failed to forward frame from AudioSocket server '%s' to channel '%s'\n", server, chanName);
ast_frfree(f);
return -1;
}
ast_frfree(f);
} else {
/* Neither the channel nor audio socket had activity
before timeout. Assume connection was lost. */
ast_log(LOG_ERROR, "Reached timeout after %d ms of no activity on AudioSocket connection between '%s' and '%s'\n", MAX_WAIT_TIMEOUT_MSEC, chanName, server);
return -1;
}
}
return 0;

View File

@@ -58,6 +58,9 @@ AST_APP_OPTIONS(auth_app_options, {
static const char app[] = "Authenticate";
/*** DOCUMENTATION
<application name="Authenticate" language="en_US">
<since>
<version>0.4.0</version>
</since>
<synopsis>
Authenticate a user
</synopsis>

View File

@@ -39,6 +39,10 @@
/*** DOCUMENTATION
<application name="BlindTransfer" language="en_US">
<since>
<version>13.28.0</version>
<version>16.5.0</version>
</since>
<synopsis>
Blind transfer channel(s) to the extension and context provided
</synopsis>

View File

@@ -39,6 +39,9 @@
/*** DOCUMENTATION
<application name="BridgeAdd" language="en_US">
<since>
<version>14.0.0</version>
</since>
<synopsis>
Join a bridge that contains the specified channel.
</synopsis>

View File

@@ -50,6 +50,9 @@
/*** DOCUMENTATION
<application name="BridgeWait" language="en_US">
<since>
<version>12.0.0</version>
</since>
<synopsis>
Put a call into the holding bridge.
</synopsis>

View File

@@ -46,6 +46,10 @@
/*** DOCUMENTATION
<application name="Broadcast" language="en_US">
<since>
<version>18.17.0</version>
<version>20.2.0</version>
</since>
<synopsis>
Transmit or receive audio to or from multiple channels simultaneously
</synopsis>
@@ -249,6 +253,7 @@ static int start_spying(struct ast_autochan *autochan, const char *spychan_name,
ast_debug(1, "Attaching spy channel %s to %s\n", spychan_name, ast_channel_name(autochan->chan));
if (ast_test_flag(flags, OPTION_READONLY)) {
ast_audiohook_set_frame_feed_direction(audiohook, AST_AUDIOHOOK_DIRECTION_READ);
ast_set_flag(audiohook, AST_AUDIOHOOK_MUTE_WRITE);
} else {
ast_set_flag(audiohook, AST_AUDIOHOOK_TRIGGER_SYNC);
@@ -263,6 +268,25 @@ static int start_spying(struct ast_autochan *autochan, const char *spychan_name,
return res;
}
static int start_whispering(struct ast_autochan *autochan, const char *spychan_name, struct ast_audiohook *audiohook, struct ast_flags *flags)
{
int res;
ast_autochan_channel_lock(autochan);
ast_verb(3, "Attaching spy channel %s to %s\n",
spychan_name, ast_channel_name(autochan->chan));
ast_set_flag(audiohook, AST_AUDIOHOOK_TRIGGER_SYNC);
if (ast_test_flag(flags, OPTION_LONG_QUEUE)) {
ast_debug(9, "Using a long queue to store audio frames in whisper audiohook\n");
} else {
ast_set_flag(audiohook, AST_AUDIOHOOK_SMALL_QUEUE);
}
res = ast_audiohook_attach(autochan->chan, audiohook);
ast_autochan_channel_unlock(autochan);
return res;
}
static int attach_barge(struct ast_autochan *spyee_autochan, struct ast_autochan **spyee_bridge_autochan,
struct ast_audiohook *bridge_whisper_audiohook, const char *spyer_name, const char *name, struct ast_flags *flags)
{
@@ -294,7 +318,7 @@ static int attach_barge(struct ast_autochan *spyee_autochan, struct ast_autochan
return -1;
}
if (start_spying(internal_bridge_autochan, spyer_name, bridge_whisper_audiohook, flags)) {
if (start_whispering(internal_bridge_autochan, spyer_name, bridge_whisper_audiohook, flags)) {
ast_log(LOG_WARNING, "Unable to attach barge audiohook on spyee '%s'. Barge mode disabled.\n", name);
retval = -1;
}
@@ -395,7 +419,7 @@ static int do_broadcast(struct ast_channel *chan, struct ast_flags *flags, const
mac->connected = 1;
ast_audiohook_init(&mac->whisper_audiohook, AST_AUDIOHOOK_TYPE_WHISPER, "Broadcast", 0);
/* Inject audio from our channel to this target. */
if (start_spying(mac->autochan, next, &mac->whisper_audiohook, flags)) {
if (start_whispering(mac->autochan, next, &mac->whisper_audiohook, flags)) {
ast_log(LOG_WARNING, "Unable to attach whisper audiohook to %s\n", next);
multi_autochan_free(mac);
continue;

View File

@@ -39,6 +39,9 @@
/*** DOCUMENTATION
<application name="ResetCDR" language="en_US">
<since>
<version>12.0.0</version>
</since>
<synopsis>
Resets the Call Data Record.
</synopsis>
@@ -88,7 +91,7 @@ struct app_cdr_message_payload {
const char *channel_name;
/*! Reset the CDR */
unsigned int reset:1;
/*! If reseting the CDR, keep the variables */
/*! If resetting the CDR, keep the variables */
unsigned int keep_variables:1;
};

View File

@@ -36,6 +36,9 @@
/*** DOCUMENTATION
<application name="CELGenUserEvent" language="en_US">
<since>
<version>1.8.0</version>
</since>
<synopsis>
Generates a CEL User Defined Event.
</synopsis>

View File

@@ -47,6 +47,9 @@ static const char app[] = "ChanIsAvail";
/*** DOCUMENTATION
<application name="ChanIsAvail" language="en_US">
<since>
<version>0.4.0</version>
</since>
<synopsis>
Check channel availability
</synopsis>

View File

@@ -39,6 +39,9 @@
/*** DOCUMENTATION
<application name="ChannelRedirect" language="en_US">
<since>
<version>1.4.0</version>
</since>
<synopsis>
Redirects given channel to a dialplan target
</synopsis>

View File

@@ -62,6 +62,9 @@
/*** DOCUMENTATION
<application name="ChanSpy" language="en_US">
<since>
<version>1.2.0</version>
</since>
<synopsis>
Listen to a channel, and optionally whisper into it.
</synopsis>
@@ -129,6 +132,9 @@
<argument name="mailbox" />
<argument name="context" />
</option>
<option name="N">
<para>Do not answer the channel automatically.</para>
</option>
<option name="o">
<para>Only listen to audio coming from this channel.</para>
</option>
@@ -204,6 +210,9 @@
</see-also>
</application>
<application name="ExtenSpy" language="en_US">
<since>
<version>1.4.0</version>
</since>
<synopsis>
Listen to a channel, and optionally whisper into it.
</synopsis>
@@ -283,6 +292,9 @@
<argument name="mailbox" />
<argument name="context" />
</option>
<option name="N">
<para>Do not answer the channel automatically.</para>
</option>
<option name="o">
<para>Only listen to audio coming from this channel.</para>
</option>
@@ -351,6 +363,9 @@
</see-also>
</application>
<application name="DAHDIScan" language="en_US">
<since>
<version>1.4.22</version>
</since>
<synopsis>
Scan DAHDI channels to monitor calls.
</synopsis>
@@ -399,6 +414,7 @@ enum {
OPTION_UNIQUEID = (1 << 19), /* The chanprefix is a channel uniqueid or fully specified channel name. */
OPTION_LONG_QUEUE = (1 << 20), /* Allow usage of a long queue to store audio frames. */
OPTION_INTERLEAVED = (1 << 21), /* Interleave the Read and Write frames in the output frame. */
OPTION_NOANSWER = (1 << 22), /* Do not automatically answer the channel */
};
enum {
@@ -423,6 +439,7 @@ AST_APP_OPTIONS(spy_opts, {
AST_APP_OPTION_ARG('g', OPTION_GROUP, OPT_ARG_GROUP),
AST_APP_OPTION('l', OPTION_LONG_QUEUE),
AST_APP_OPTION_ARG('n', OPTION_NAME, OPT_ARG_NAME),
AST_APP_OPTION('N', OPTION_NOANSWER),
AST_APP_OPTION('o', OPTION_READONLY),
AST_APP_OPTION('q', OPTION_QUIET),
AST_APP_OPTION_ARG('r', OPTION_RECORD, OPT_ARG_RECORD),
@@ -570,6 +587,7 @@ static int start_spying(struct ast_autochan *autochan, const char *spychan_name,
spychan_name, ast_channel_name(autochan->chan));
if (ast_test_flag(flags, OPTION_READONLY)) {
ast_audiohook_set_frame_feed_direction(audiohook, AST_AUDIOHOOK_DIRECTION_READ);
ast_set_flag(audiohook, AST_AUDIOHOOK_MUTE_WRITE);
} else {
ast_set_flag(audiohook, AST_AUDIOHOOK_TRIGGER_SYNC);
@@ -584,6 +602,25 @@ static int start_spying(struct ast_autochan *autochan, const char *spychan_name,
return res;
}
static int start_whispering(struct ast_autochan *autochan, const char *spychan_name, struct ast_audiohook *audiohook, struct ast_flags *flags)
{
int res;
ast_autochan_channel_lock(autochan);
ast_verb(3, "Attaching spy channel %s to %s\n",
spychan_name, ast_channel_name(autochan->chan));
ast_set_flag(audiohook, AST_AUDIOHOOK_TRIGGER_SYNC);
if (ast_test_flag(flags, OPTION_LONG_QUEUE)) {
ast_debug(9, "Using a long queue to store audio frames in whisper audiohook\n");
} else {
ast_set_flag(audiohook, AST_AUDIOHOOK_SMALL_QUEUE);
}
res = ast_audiohook_attach(autochan->chan, audiohook);
ast_autochan_channel_unlock(autochan);
return res;
}
static void change_spy_mode(const char digit, struct ast_flags *flags)
{
if (digit == '4') {
@@ -684,7 +721,7 @@ static int attach_barge(struct ast_autochan *spyee_autochan,
return -1;
}
if (start_spying(internal_bridge_autochan, spyer_name, bridge_whisper_audiohook, flags)) {
if (start_whispering(internal_bridge_autochan, spyer_name, bridge_whisper_audiohook, flags)) {
ast_log(LOG_WARNING, "Unable to attach barge audiohook on spyee '%s'. Barge mode disabled.\n", name);
retval = -1;
}
@@ -746,7 +783,7 @@ static int channel_spy(struct ast_channel *chan, struct ast_autochan *spyee_auto
*/
ast_audiohook_init(&csth.whisper_audiohook, AST_AUDIOHOOK_TYPE_WHISPER, "ChanSpy", 0);
if (start_spying(spyee_autochan, spyer_name, &csth.whisper_audiohook, flags)) {
if (start_whispering(spyee_autochan, spyer_name, &csth.whisper_audiohook, flags)) {
ast_log(LOG_WARNING, "Unable to attach whisper audiohook to spyee %s. Whisper mode disabled!\n", name);
}
}
@@ -970,8 +1007,9 @@ static int common_exec(struct ast_channel *chan, struct ast_flags *flags,
ast_channel_unlock(chan);
}
if (ast_channel_state(chan) != AST_STATE_UP)
if (!ast_test_flag(flags, OPTION_NOANSWER) && ast_channel_state(chan) != AST_STATE_UP) {
ast_answer(chan);
}
ast_channel_set_flag(chan, AST_FLAG_SPYING);

View File

@@ -76,6 +76,9 @@
/*** DOCUMENTATION
<application name="ConfBridge" language="en_US">
<since>
<version>12.0.0</version>
</since>
<synopsis>
Conference bridge application.
</synopsis>
@@ -135,7 +138,6 @@
<since>
<version>16.19.0</version>
<version>18.5.0</version>
<version>19.0.0</version>
</since>
<synopsis>
Kicks channel(s) from the requested ConfBridge.
@@ -169,6 +171,9 @@
</see-also>
</application>
<function name="CONFBRIDGE" language="en_US">
<since>
<version>10.0.0</version>
</since>
<synopsis>
Set a custom dynamic bridge, user, or menu profile on a channel for the
ConfBridge application using the same options available in confbridge.conf.
@@ -224,6 +229,9 @@
</description>
</function>
<function name="CONFBRIDGE_INFO" language="en_US">
<since>
<version>10.0.0</version>
</since>
<synopsis>
Get information about a ConfBridge conference.
</synopsis>
@@ -262,9 +270,9 @@
</function>
<function name="CONFBRIDGE_CHANNELS" language="en_US">
<since>
<version>16.26.0</version>
<version>18.12.0</version>
<version>19.4.0</version>
<version>16.27.0</version>
<version>18.13.0</version>
<version>19.5.0</version>
</since>
<synopsis>
Get a list of channels in a ConfBridge conference.
@@ -302,6 +310,9 @@
</see-also>
</function>
<manager name="ConfbridgeList" language="en_US">
<since>
<version>10.0.0</version>
</since>
<synopsis>
List participants in a conference.
</synopsis>
@@ -319,6 +330,10 @@
</manager>
<managerEvent language="en_US" name="ConfbridgeList">
<managerEventInstance class="EVENT_FLAG_REPORTING">
<since>
<version>13.20.0</version>
<version>15.3.0</version>
</since>
<synopsis>Raised as part of the ConfbridgeList action response list.</synopsis>
<syntax>
<parameter name="Conference">
@@ -381,6 +396,9 @@
</managerEventInstance>
</managerEvent>
<manager name="ConfbridgeListRooms" language="en_US">
<since>
<version>10.0.0</version>
</since>
<synopsis>
List active conferences.
</synopsis>
@@ -395,6 +413,11 @@
</manager>
<managerEvent language="en_US" name="ConfbridgeListRooms">
<managerEventInstance class="EVENT_FLAG_REPORTING">
<since>
<version>16.29.0</version>
<version>18.15.0</version>
<version>19.7.0</version>
</since>
<synopsis>Raised as part of the ConfbridgeListRooms action response list.</synopsis>
<syntax>
<parameter name="Conference">
@@ -425,6 +448,9 @@
</managerEventInstance>
</managerEvent>
<manager name="ConfbridgeMute" language="en_US">
<since>
<version>10.0.0</version>
</since>
<synopsis>
Mute a Confbridge user.
</synopsis>
@@ -441,6 +467,9 @@
</description>
</manager>
<manager name="ConfbridgeUnmute" language="en_US">
<since>
<version>10.0.0</version>
</since>
<synopsis>
Unmute a Confbridge user.
</synopsis>
@@ -457,6 +486,9 @@
</description>
</manager>
<manager name="ConfbridgeKick" language="en_US">
<since>
<version>10.0.0</version>
</since>
<synopsis>
Kick a Confbridge user.
</synopsis>
@@ -472,6 +504,9 @@
</description>
</manager>
<manager name="ConfbridgeLock" language="en_US">
<since>
<version>10.0.0</version>
</since>
<synopsis>
Lock a Confbridge conference.
</synopsis>
@@ -483,6 +518,9 @@
</description>
</manager>
<manager name="ConfbridgeUnlock" language="en_US">
<since>
<version>10.0.0</version>
</since>
<synopsis>
Unlock a Confbridge conference.
</synopsis>
@@ -494,6 +532,9 @@
</description>
</manager>
<manager name="ConfbridgeStartRecord" language="en_US">
<since>
<version>10.0.0</version>
</since>
<synopsis>
Start recording a Confbridge conference.
</synopsis>
@@ -507,6 +548,9 @@
</description>
</manager>
<manager name="ConfbridgeStopRecord" language="en_US">
<since>
<version>10.0.0</version>
</since>
<synopsis>
Stop recording a Confbridge conference.
</synopsis>
@@ -518,6 +562,9 @@
</description>
</manager>
<manager name="ConfbridgeSetSingleVideoSrc" language="en_US">
<since>
<version>10.0.0</version>
</since>
<synopsis>
Set a conference user as the single video source distributed to all other participants.
</synopsis>
@@ -1069,7 +1116,7 @@ static int sound_file_exists(const char *filename)
* \param user Optional Caller
* \param bridge_channel The bridged channel involved
*
* \note if caller is NULL, the announcment will be sent to all participants in the conference.
* \note if caller is NULL, the announcement will be sent to all participants in the conference.
* \retval 0 on success.
* \retval -1 if the user hung up.
*/

View File

@@ -40,6 +40,9 @@
/*** DOCUMENTATION
<application name="ControlPlayback" language="en_US">
<since>
<version>1.0.0</version>
</since>
<synopsis>
Play a file with fast forward and rewind.
</synopsis>
@@ -98,6 +101,9 @@
</description>
</application>
<manager name="ControlPlayback" language="en_US">
<since>
<version>12.0.0</version>
</since>
<synopsis>
Control the playback of a file being played to a channel.
</synopsis>

View File

@@ -43,6 +43,9 @@
/*** DOCUMENTATION
<application name="DBdeltree" language="en_US">
<since>
<version>0.4.0</version>
</since>
<synopsis>
Delete a family or keytree from the asterisk database.
</synopsis>

View File

@@ -70,6 +70,9 @@
/*** DOCUMENTATION
<application name="Dial" language="en_US">
<since>
<version>0.1.0</version>
</since>
<synopsis>
Attempt to connect to another device or endpoint and bridge the call.
</synopsis>
@@ -94,6 +97,7 @@
<para>If a second argument is specified, this controls the number of seconds we attempt to dial the specified devices
without receiving early media or ringing. If neither progress, ringing, nor voice frames have been received when this
timeout expires, the call will be treated as a CHANUNAVAIL. This can be used to skip destinations that may not be responsive.</para>
<para>The timeouts need not be whole numbers; both arguments accept fractional seconds.</para>
</parameter>
<parameter name="options" required="false">
<optionlist>
@@ -211,7 +215,7 @@
and <emphasis>start</emphasis> execution at that location.</para>
<para>NOTE: Any channel variables you want the called channel to inherit from the caller channel must be
prefixed with one or two underbars ('_').</para>
<para>NOTE: Using this option from a GoSub() might not make sense as there would be no return points.</para>
<para>NOTE: Using this option from a Gosub() might not make sense as there would be no return points.</para>
</option>
<option name="g">
<para>Proceed with dialplan execution at the next priority in the current extension if the
@@ -584,7 +588,7 @@
nonexistent location, e.g. nonexistent DNS hostname.
</value>
<value name="CONGESTION">
Channel or switching congestion occured when routing the call.
Channel or switching congestion occurred when routing the call.
This can occur if there is a slow or no response from the remote end.
</value>
<value name="NOANSWER">
@@ -624,6 +628,9 @@
</see-also>
</application>
<application name="RetryDial" language="en_US">
<since>
<version>1.2.0</version>
</since>
<synopsis>
Place a call, retrying on failure allowing an optional exit extension.
</synopsis>
@@ -1214,7 +1221,6 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in,
struct cause_args num = *num_in;
int prestart = num.busy + num.congestion + num.nochan;
int orig_answer_to = *to_answer;
int progress_to_dup = *to_progress;
int orig_progress_to = *to_progress;
struct ast_channel *peer = NULL;
struct chanlist *outgoing = AST_LIST_FIRST(out_chans);
@@ -1259,7 +1265,7 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in,
is_cc_recall = ast_cc_is_recall(in, &cc_recall_core_id, NULL);
while ((*to_answer = ast_remaining_ms(start, orig_answer_to)) && (*to_progress = ast_remaining_ms(start, progress_to_dup)) && !peer) {
while ((*to_answer = ast_remaining_ms(start, orig_answer_to)) && (*to_progress = ast_remaining_ms(start, orig_progress_to)) && !peer) {
struct chanlist *o;
int pos = 0; /* how many channels do we handle */
int numlines = prestart;
@@ -1291,7 +1297,10 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in,
}
SCOPE_EXIT_RTN_VALUE(NULL, "%s: No outgoing channels available\n", ast_channel_name(in));
}
winner = ast_waitfor_n(watchers, pos, to_answer);
/* If progress timeout is active, use that if it's the shorter of the 2 timeouts. */
winner = ast_waitfor_n(watchers, pos, *to_progress > 0 && (*to_answer < 0 || *to_progress < *to_answer) ? to_progress : to_answer);
AST_LIST_TRAVERSE(out_chans, o, node) {
int res = 0;
struct ast_frame *f;
@@ -1506,7 +1515,7 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in,
*/
++num_ringing;
*to_progress = -1;
progress_to_dup = -1;
orig_progress_to = -1;
if (ignore_cc || cc_frame_received || num_ringing == numlines) {
ast_verb(3, "%s is ringing\n", ast_channel_name(c));
/* Setup early media if appropriate */
@@ -1551,7 +1560,7 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in,
}
}
*to_progress = -1;
progress_to_dup = -1;
orig_progress_to = -1;
if (!sent_progress) {
struct timeval now, then;
int64_t diff;
@@ -1720,6 +1729,15 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in,
case AST_CONTROL_PVT_CAUSE_CODE:
ast_indicate_data(in, AST_CONTROL_PVT_CAUSE_CODE, f->data.ptr, f->datalen);
break;
case AST_CONTROL_PLAYBACK_BEGIN:
if (!f->data.ptr) {
ast_log(LOG_WARNING, "Got playback begin directive without filename on %s\n", ast_channel_name(c));
} else {
const char *filename = f->data.ptr;
ast_verb(3, "Playing audio file %s on %s\n", filename, ast_channel_name(in));
ast_streamfile(in, filename, ast_channel_language(in));
}
break;
case -1:
if (single && !caller_entertained) {
ast_verb(3, "%s stopped sounds\n", ast_channel_name(c));
@@ -1741,7 +1759,7 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in,
break;
}
*to_progress = -1;
progress_to_dup = -1;
orig_progress_to = -1;
/* Fall through */
case AST_FRAME_TEXT:
if (single && ast_write(in, f)) {
@@ -1791,7 +1809,10 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in,
if (ast_test_flag64(peerflags, OPT_DTMF_EXIT)) {
const char *context;
ast_channel_lock(in);
context = pbx_builtin_getvar_helper(in, "EXITCONTEXT");
if ((context = pbx_builtin_getvar_helper(in, "EXITCONTEXT"))) {
context = ast_strdupa(context);
}
ast_channel_unlock(in);
if (onedigit_goto(in, context, (char) f->subclass.integer, 1)) {
ast_verb(3, "User hit %c to disconnect call.\n", f->subclass.integer);
*to_answer = 0;
@@ -1800,14 +1821,12 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in,
pa->canceled = 1;
publish_dial_end_event(in, out_chans, NULL, pa->status);
ast_frfree(f);
ast_channel_unlock(in);
if (is_cc_recall) {
ast_cc_completed(in, "CC completed, but the caller used DTMF to exit");
}
SCOPE_EXIT_RTN_VALUE(NULL, "%s: Caller pressed %c to end call\n",
ast_channel_name(in), f->subclass.integer);
}
ast_channel_unlock(in);
}
if (ast_test_flag64(peerflags, OPT_CALLER_HANGUP) &&
@@ -2916,22 +2935,23 @@ static int dial_exec_full(struct ast_channel *chan, const char *data, struct ast
to_answer = -1;
to_progress = -1;
} else {
double tmp;
char *anstimeout = strsep(&args.timeout, "^");
if (!ast_strlen_zero(anstimeout)) {
to_answer = atoi(anstimeout);
if (to_answer > 0) {
to_answer *= 1000;
if (sscanf(anstimeout, "%30lf", &tmp) == 1 && tmp > 0) {
to_answer = tmp * 1000;
ast_debug(3, "Dial timeout set to %d ms\n", to_answer);
} else {
ast_log(LOG_WARNING, "Invalid answer timeout specified: '%s'. Setting timeout to infinite\n", args.timeout);
ast_log(LOG_WARNING, "Invalid answer timeout specified: '%s'. Setting timeout to infinite\n", anstimeout);
to_answer = -1;
}
} else {
to_answer = -1;
}
if (!ast_strlen_zero(args.timeout)) {
to_progress = atoi(args.timeout);
if (to_progress > 0) {
to_progress *= 1000;
if (sscanf(args.timeout, "%30lf", &tmp) == 1 && tmp > 0) {
to_progress = tmp * 1000;
ast_debug(3, "Dial progress timeout set to %d ms\n", to_progress);
} else {
ast_log(LOG_WARNING, "Invalid progress timeout specified: '%s'. Setting timeout to infinite\n", args.timeout);
to_progress = -1;

View File

@@ -45,6 +45,9 @@
/*** DOCUMENTATION
<application name="Dictate" language="en_US">
<since>
<version>1.2.0</version>
</since>
<synopsis>
Virtual Dictation Machine.
</synopsis>

View File

@@ -49,6 +49,9 @@
/*** DOCUMENTATION
<application name="Pickup" language="en_US">
<since>
<version>1.2.0</version>
</since>
<synopsis>
Directed extension call pickup.
</synopsis>
@@ -91,6 +94,9 @@
</description>
</application>
<application name="PickupChan" language="en_US">
<since>
<version>1.6.0</version>
</since>
<synopsis>
Pickup a ringing channel.
</synopsis>

View File

@@ -43,6 +43,9 @@
/*** DOCUMENTATION
<application name="Directory" language="en_US">
<since>
<version>0.1.0</version>
</since>
<synopsis>
Provide directory of voicemail extensions.
</synopsis>

View File

@@ -50,6 +50,9 @@
/*** DOCUMENTATION
<application name="DISA" language="en_US">
<since>
<version>0.1.9</version>
</since>
<synopsis>
Direct Inward System Access.
</synopsis>

View File

@@ -44,7 +44,6 @@
<since>
<version>16.20.0</version>
<version>18.6.0</version>
<version>19.0.0</version>
</since>
<synopsis>
Stores DTMF digits transmitted or received on a channel.

View File

@@ -43,6 +43,9 @@
/*** DOCUMENTATION
<application name="DumpChan" language="en_US">
<since>
<version>1.2.0</version>
</since>
<synopsis>
Dump Info About The Calling Channel.
</synopsis>

View File

@@ -37,6 +37,9 @@
/*** DOCUMENTATION
<application name="Echo" language="en_US">
<since>
<version>0.1.2</version>
</since>
<synopsis>
Echo media, DTMF back to the calling party
</synopsis>
@@ -46,7 +49,7 @@
channel back to itself. This will not echo CONTROL, MODEM, or NULL
frames. Note: If '#' detected application exits.</para>
<para>This application does not automatically answer and should be
preceeded by an application such as Answer() or Progress().</para>
preceded by an application such as Answer() or Progress().</para>
</description>
</application>
***/

View File

@@ -39,6 +39,9 @@
/*** DOCUMENTATION
<application name="Exec" language="en_US">
<since>
<version>1.0.0</version>
</since>
<synopsis>
Executes dialplan application.
</synopsis>
@@ -58,6 +61,9 @@
</description>
</application>
<application name="TryExec" language="en_US">
<since>
<version>1.4.0</version>
</since>
<synopsis>
Executes dialplan application, always returning.
</synopsis>
@@ -88,6 +94,9 @@
</description>
</application>
<application name="ExecIf" language="en_US">
<since>
<version>1.2.0</version>
</since>
<synopsis>
Executes dialplan application, conditionally.
</synopsis>

View File

@@ -52,6 +52,9 @@
/*** DOCUMENTATION
<application name="ExternalIVR" language="en_US">
<since>
<version>1.2.0</version>
</since>
<synopsis>
Interfaces with an external IVR application.
</synopsis>
@@ -421,8 +424,11 @@ static int app_exec(struct ast_channel *chan, const char *data)
AST_APP_ARG(application);
AST_APP_ARG(options);
);
#define MAX_EIVR_APPLICATION_ARGS 32
AST_DECLARE_APP_ARGS(application_args,
AST_APP_ARG(cmd)[32];
AST_APP_ARG(cmd)[MAX_EIVR_APPLICATION_ARGS];
);
u->abort_current_sound = 0;
@@ -455,7 +461,7 @@ static int app_exec(struct ast_channel *chan, const char *data)
/* Put the application + the arguments in a , delimited list */
ast_str_reset(comma_delim_args);
for (j = 0; application_args.cmd[j] != NULL; j++) {
for (j = 0; j < MAX_EIVR_APPLICATION_ARGS && application_args.cmd[j]; j++) {
ast_str_append(&comma_delim_args, 0, "%s%s", j == 0 ? "" : ",", application_args.cmd[j]);
}
@@ -834,7 +840,7 @@ static int eivr_comm(struct ast_channel *chan, struct ivr_localuser *u,
}
} else if (input[0] == EIVR_CMD_GET) {
char response[2048];
ast_verb(4, "Retriving Variables from channel: %s\n", &input[2]);
ast_verb(4, "Retrieving Variables from channel: %s\n", &input[2]);
ast_eivr_getvariable(chan, &input[2], response, sizeof(response));
send_eivr_event(eivr_events, 'G', response, chan);
} else if (input[0] == EIVR_CMD_SVAR) {
@@ -844,7 +850,7 @@ static int eivr_comm(struct ast_channel *chan, struct ivr_localuser *u,
ast_chan_log(LOG_NOTICE, chan, "Log message from EIVR: %s\n", &input[2]);
} else if (input[0] == EIVR_CMD_XIT) {
ast_chan_log(LOG_NOTICE, chan, "Exiting: %s\n", &input[2]);
ast_chan_log(LOG_WARNING, chan, "e'X'it command is depricated, use 'E'xit instead\n");
ast_chan_log(LOG_WARNING, chan, "e'X'it command is deprecated, use 'E'xit instead\n");
res = 0;
break;
} else if (input[0] == EIVR_CMD_EXIT) {

View File

@@ -69,6 +69,9 @@
/*** DOCUMENTATION
<application name="Festival" language="en_US">
<since>
<version>0.2.0</version>
</since>
<synopsis>
Say text to the user.
</synopsis>

View File

@@ -44,6 +44,9 @@
/*** DOCUMENTATION
<application name="Flash" language="en_US">
<since>
<version>1.6.1.0</version>
</since>
<synopsis>
Flashes a DAHDI Trunk.
</synopsis>

View File

@@ -68,6 +68,9 @@
/*** DOCUMENTATION
<application name="FollowMe" language="en_US">
<since>
<version>1.6.1.0</version>
</since>
<synopsis>
Find-Me/Follow-Me application.
</synopsis>

View File

@@ -43,6 +43,9 @@
/*** DOCUMENTATION
<application name="ForkCDR" language="en_US">
<since>
<version>1.6.1.0</version>
</since>
<synopsis>
Forks the current Call Data Record for this channel.
</synopsis>

View File

@@ -41,6 +41,9 @@
/*** DOCUMENTATION
<application name="GetCPEID" language="en_US">
<since>
<version>0.1.12</version>
</since>
<synopsis>
Get ADSI CPE ID.
</synopsis>

View File

@@ -37,6 +37,10 @@
/*** DOCUMENTATION
<application name="If" language="en_US">
<since>
<version>18.16.0</version>
<version>20.1.0</version>
</since>
<synopsis>
Start an if branch.
</synopsis>
@@ -57,6 +61,10 @@
</see-also>
</application>
<application name="ElseIf" language="en_US">
<since>
<version>18.16.0</version>
<version>20.1.0</version>
</since>
<synopsis>
Start an else if branch.
</synopsis>
@@ -78,6 +86,10 @@
</see-also>
</application>
<application name="Else" language="en_US">
<since>
<version>18.16.0</version>
<version>20.1.0</version>
</since>
<synopsis>
Define an optional else branch.
</synopsis>
@@ -96,6 +108,10 @@
</see-also>
</application>
<application name="EndIf" language="en_US">
<since>
<version>18.16.0</version>
<version>20.1.0</version>
</since>
<synopsis>
End an if branch.
</synopsis>
@@ -111,6 +127,10 @@
</see-also>
</application>
<application name="ExitIf" language="en_US">
<since>
<version>18.16.0</version>
<version>20.1.0</version>
</since>
<synopsis>
End an If branch.
</synopsis>

View File

@@ -41,6 +41,9 @@
/*** DOCUMENTATION
<application name="IVRDemo" language="en_US">
<since>
<version>1.2.0</version>
</since>
<synopsis>
IVR Demo Application.
</synopsis>

View File

@@ -76,6 +76,9 @@
" name. Use this option to specify a custom client name.\n"
/*** DOCUMENTATION
<application name="JACK" language="en_US">
<since>
<version>1.6.0</version>
</since>
<synopsis>
Jack Audio Connection Kit
</synopsis>
@@ -607,7 +610,7 @@ static int queue_voice_frame(struct jack_data *jack_data, struct ast_frame *f)
* \param[in] jack_data This is the jack_data struct that contains the input
* ringbuffer that audio will be read from.
* \param[out] out_frame If this argument is non-NULL, then assuming there is
* enough data avilable in the ringbuffer, the audio in this frame
* enough data available in the ringbuffer, the audio in this frame
* will get replaced with audio from the input buffer. If there is
* not enough data available to read at this time, then the frame
* data gets zeroed out.

View File

@@ -40,7 +40,6 @@
<support_level>deprecated</support_level>
<replacement>app_confbridge</replacement>
<deprecated_in>19</deprecated_in>
<removed_in>21</removed_in>
***/
#include "asterisk.h"
@@ -79,6 +78,9 @@
/*** DOCUMENTATION
<application name="MeetMe" language="en_US">
<since>
<version>0.1.12</version>
</since>
<synopsis>
MeetMe conference bridge.
</synopsis>
@@ -263,6 +265,9 @@
</see-also>
</application>
<application name="MeetMeCount" language="en_US">
<since>
<version>0.1.12</version>
</since>
<synopsis>
MeetMe participant count.
</synopsis>
@@ -284,6 +289,9 @@
</see-also>
</application>
<application name="MeetMeAdmin" language="en_US">
<since>
<version>1.0.0</version>
</since>
<synopsis>
MeetMe conference administration.
</synopsis>
@@ -381,6 +389,9 @@
</see-also>
</application>
<application name="MeetMeChannelAdmin" language="en_US">
<since>
<version>1.6.0</version>
</since>
<synopsis>
MeetMe conference Administration (channel specific).
</synopsis>
@@ -406,6 +417,9 @@
</description>
</application>
<function name="MEETME_INFO" language="en_US">
<since>
<version>1.6.1.0</version>
</since>
<synopsis>
Query a given conference of various properties.
</synopsis>
@@ -440,6 +454,9 @@
</see-also>
</function>
<manager name="MeetmeMute" language="en_US">
<since>
<version>1.4.0</version>
</since>
<synopsis>
Mute a Meetme user.
</synopsis>
@@ -452,6 +469,9 @@
</description>
</manager>
<manager name="MeetmeUnmute" language="en_US">
<since>
<version>1.4.0</version>
</since>
<synopsis>
Unmute a Meetme user.
</synopsis>
@@ -464,6 +484,9 @@
</description>
</manager>
<manager name="MeetmeList" language="en_US">
<since>
<version>1.6.0</version>
</since>
<synopsis>
List participants in a conference.
</synopsis>
@@ -480,6 +503,9 @@
</description>
</manager>
<manager name="MeetmeListRooms" language="en_US">
<since>
<version>10.0.0</version>
</since>
<synopsis>
List active conferences.
</synopsis>
@@ -494,6 +520,9 @@
</manager>
<managerEvent language="en_US" name="MeetmeJoin">
<managerEventInstance class="EVENT_FLAG_CALL">
<since>
<version>12.0.0</version>
</since>
<synopsis>Raised when a user joins a MeetMe conference.</synopsis>
<syntax>
<parameter name="Meetme">
@@ -512,6 +541,9 @@
</managerEvent>
<managerEvent language="en_US" name="MeetmeLeave">
<managerEventInstance class="EVENT_FLAG_CALL">
<since>
<version>12.0.0</version>
</since>
<synopsis>Raised when a user leaves a MeetMe conference.</synopsis>
<syntax>
<xi:include xpointer="xpointer(/docs/managerEvent[@name='MeetmeJoin']/managerEventInstance/syntax/parameter)" />
@@ -527,6 +559,9 @@
</managerEvent>
<managerEvent language="en_US" name="MeetmeEnd">
<managerEventInstance class="EVENT_FLAG_CALL">
<since>
<version>12.0.0</version>
</since>
<synopsis>Raised when a MeetMe conference ends.</synopsis>
<syntax>
<xi:include xpointer="xpointer(/docs/managerEvent[@name='MeetmeJoin']/managerEventInstance/syntax/parameter[@name='Meetme'])" />
@@ -538,6 +573,9 @@
</managerEvent>
<managerEvent language="en_US" name="MeetmeTalkRequest">
<managerEventInstance class="EVENT_FLAG_CALL">
<since>
<version>12.0.0</version>
</since>
<synopsis>Raised when a MeetMe user has started talking.</synopsis>
<syntax>
<xi:include xpointer="xpointer(/docs/managerEvent[@name='MeetmeJoin']/managerEventInstance/syntax/parameter)" />
@@ -556,6 +594,9 @@
</managerEvent>
<managerEvent language="en_US" name="MeetmeTalking">
<managerEventInstance class="EVENT_FLAG_CALL">
<since>
<version>12.0.0</version>
</since>
<synopsis>Raised when a MeetMe user begins or ends talking.</synopsis>
<syntax>
<xi:include xpointer="xpointer(/docs/managerEvent[@name='MeetmeJoin']/managerEventInstance/syntax/parameter)" />
@@ -566,6 +607,9 @@
</managerEvent>
<managerEvent language="en_US" name="MeetmeMute">
<managerEventInstance class="EVENT_FLAG_CALL">
<since>
<version>12.0.0</version>
</since>
<synopsis>Raised when a MeetMe user is muted or unmuted.</synopsis>
<syntax>
<xi:include xpointer="xpointer(/docs/managerEvent[@name='MeetmeJoin']/managerEventInstance/syntax/parameter)" />
@@ -576,6 +620,11 @@
</managerEvent>
<managerEvent language="en_US" name="MeetmeList">
<managerEventInstance class="EVENT_FLAG_CALL">
<since>
<version>16.29.0</version>
<version>18.15.0</version>
<version>19.7.0</version>
</since>
<synopsis>Raised in response to a MeetmeList command.</synopsis>
<syntax>
<parameter name="Conference">
@@ -623,6 +672,11 @@
</managerEvent>
<managerEvent language="en_US" name="MeetmeListRooms">
<managerEventInstance class="EVENT_FLAG_CALL">
<since>
<version>16.29.0</version>
<version>18.15.0</version>
<version>19.7.0</version>
</since>
<synopsis>Raised in response to a MeetmeListRooms command.</synopsis>
<syntax>
<parameter name="Conference">
@@ -638,7 +692,7 @@
<para>Total duration of conference in HH:MM:SS format.</para>
</parameter>
<parameter name="Creation">
<para>How the conference was created: "Dyanmic" or "Static".</para>
<para>How the conference was created: "Dynamic" or "Static".</para>
</parameter>
<parameter name="Locked">
<para>Whether or not the conference is locked.</para>

View File

@@ -43,9 +43,8 @@
/*** DOCUMENTATION
<application name="ReceiveMF" language="en_US">
<since>
<version>16.21.0</version>
<version>18.7.0</version>
<version>19.0.0</version>
<version>16.24.0</version>
<version>18.10.0</version>
</since>
<synopsis>
Detects MF digits on a channel and saves them to a variable.
@@ -121,7 +120,6 @@
<since>
<version>16.21.0</version>
<version>18.7.0</version>
<version>19.0.0</version>
</since>
<synopsis>
Sends arbitrary MF digits on the current or specified channel.

View File

@@ -39,6 +39,9 @@
/*** DOCUMENTATION
<application name="Milliwatt" language="en_US">
<since>
<version>0.1.12</version>
</since>
<synopsis>
Generates a 1004 Hz test tone at 0dbm (mu-law).
</synopsis>

View File

@@ -183,6 +183,9 @@
/*** DOCUMENTATION
<application name="MinivmRecord" language="en_US">
<since>
<version>1.6.1.0</version>
</since>
<synopsis>
Receive Mini-Voicemail and forward via e-mail.
</synopsis>
@@ -233,6 +236,9 @@
</description>
</application>
<application name="MinivmGreet" language="en_US">
<since>
<version>1.6.1.0</version>
</since>
<synopsis>
Play Mini-Voicemail prompts.
</synopsis>
@@ -262,7 +268,7 @@
<description>
<para>This application is part of the Mini-Voicemail system, configured in minivm.conf.</para>
<para>MinivmGreet() plays default prompts or user specific prompts for an account.</para>
<para>Busy and unavailable messages can be choosen, but will be overridden if a temporary
<para>Busy and unavailable messages can be chosen, but will be overridden if a temporary
message exists for the account.</para>
<variablelist>
<variable name="MVM_GREET_STATUS">
@@ -275,6 +281,9 @@
</description>
</application>
<application name="MinivmNotify" language="en_US">
<since>
<version>1.6.1.0</version>
</since>
<synopsis>
Notify voicemail owner about new messages.
</synopsis>
@@ -314,6 +323,9 @@
</description>
</application>
<application name="MinivmDelete" language="en_US">
<since>
<version>1.6.1.0</version>
</since>
<synopsis>
Delete Mini-Voicemail voicemail messages.
</synopsis>
@@ -336,6 +348,9 @@
</application>
<application name="MinivmAccMess" language="en_US">
<since>
<version>1.6.1.0</version>
</since>
<synopsis>
Record account specific messages.
</synopsis>
@@ -381,6 +396,9 @@
</description>
</application>
<application name="MinivmMWI" language="en_US">
<since>
<version>1.6.1.0</version>
</since>
<synopsis>
Send Message Waiting Notification to subscriber(s) of mailbox.
</synopsis>
@@ -410,6 +428,9 @@
</description>
</application>
<function name="MINIVMCOUNTER" language="en_US">
<since>
<version>1.6.0</version>
</since>
<synopsis>
Reads or sets counters for MiniVoicemail message.
</synopsis>
@@ -444,6 +465,9 @@
</see-also>
</function>
<function name="MINIVMACCOUNT" language="en_US">
<since>
<version>1.6.0</version>
</since>
<synopsis>
Gets MiniVoicemail account information.
</synopsis>
@@ -503,6 +527,9 @@
</function>
<managerEvent language="en_US" name="MiniVoiceMail">
<managerEventInstance class="EVENT_FLAG_CALL">
<since>
<version>12.0.0</version>
</since>
<synopsis>Raised when a notification is sent out by a MiniVoiceMail application</synopsis>
<syntax>
<channel_snapshot/>
@@ -1071,7 +1098,7 @@ static const char *ast_str_encode_mime(struct ast_str **end, ssize_t maxlen, con
}
/*!\internal
* \brief Wraps a character sequence in double quotes, escaping occurences of quotes within the string.
* \brief Wraps a character sequence in double quotes, escaping occurrences of quotes within the string.
* \param from The string to work with.
* \param buf The destination buffer to write the modified quoted string.
* \param maxlen Always zero. \see ast_str
@@ -1961,7 +1988,7 @@ static void queue_mwi_event(const char *channel_id, const char *mbx, const char
}
/*!\internal
* \brief Send MWI using interal Asterisk event subsystem */
* \brief Send MWI using internal Asterisk event subsystem */
static int minivm_mwi_exec(struct ast_channel *chan, const char *data)
{
int argc;
@@ -3398,7 +3425,7 @@ static int reload(void)
return(load_config(1));
}
/*! \brief Reload cofiguration */
/*! \brief Reload configuration */
static char *handle_minivm_reload(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{

View File

@@ -63,6 +63,9 @@
/*** DOCUMENTATION
<application name="MixMonitor" language="en_US">
<since>
<version>1.2.0</version>
</since>
<synopsis>
Record a call and mix the audio during the recording. Use of StopMixMonitor is required
to guarantee the audio file is available for processing during dialplan execution.
@@ -127,6 +130,13 @@
Like with the basic filename argument, if an absolute path isn't given, it will create
the file in the configured monitoring directory.</para>
</option>
<option name="D">
<para>Interleave the audio coming from the channel and the audio
going to the channel and output it as a 2 channel (stereo)
raw stream rather than mixing it. You must use the
<literal>.raw</literal> file extension. Any other extension
will produce a corrupted file.</para>
</option>
<option name="n">
<para>When the <replaceable>r</replaceable> or <replaceable>t</replaceable> option is
used, MixMonitor will insert silence into the specified files to maintain
@@ -163,7 +173,7 @@
</syntax>
<description>
<para>Records the audio on the current channel to the specified file.</para>
<para>This application does not automatically answer and should be preceeded by
<para>This application does not automatically answer and should be preceded by
an application such as Answer or Progress().</para>
<note><para>MixMonitor runs as an audiohook.</para></note>
<note><para>If a filename passed to MixMonitor ends with
@@ -181,12 +191,18 @@
parameters. You risk a command injection attack executing arbitrary commands
if the untrusted strings aren't filtered to remove dangerous characters. See
function <variable>FILTER()</variable>.</para></warning>
<warning><para>When using the <literal>D</literal> option to save
interleaved audio, you MUST use <literal>.raw</literal> as the
file extension. Any other extension will produce a corrupted file.</para></warning>
</description>
<see-also>
<ref type="application">StopMixMonitor</ref>
</see-also>
</application>
<application name="StopMixMonitor" language="en_US">
<since>
<version>1.4.0</version>
</since>
<synopsis>
Stop recording a call through MixMonitor, and free the recording's file handle.
</synopsis>
@@ -205,6 +221,9 @@
</see-also>
</application>
<manager name="MixMonitorMute" language="en_US">
<since>
<version>1.8.0</version>
</since>
<synopsis>
Mute / unMute a Mixmonitor recording.
</synopsis>
@@ -225,6 +244,9 @@
</description>
</manager>
<manager name="MixMonitor" language="en_US">
<since>
<version>11.0.0</version>
</since>
<synopsis>
Record a call and mix the audio during the recording. Use of StopMixMonitor is required
to guarantee the audio file is available for processing during dialplan execution.
@@ -242,7 +264,7 @@
neither MIXMONITOR_FILENAME or this parameter is set, the mixed stream won't
be recorded.</para>
</parameter>
<parameter name="options">
<parameter name="Options">
<para>Options that apply to the MixMonitor in the same way as they
would apply if invoked from the MixMonitor application. For a list of
available options, see the documentation for the mixmonitor application. </para>
@@ -268,6 +290,9 @@
</description>
</manager>
<manager name="StopMixMonitor" language="en_US">
<since>
<version>11.0.0</version>
</since>
<synopsis>
Stop recording a call through MixMonitor, and free the recording's file handle.
</synopsis>
@@ -287,6 +312,9 @@
</description>
</manager>
<function name="MIXMONITOR" language="en_US">
<since>
<version>13.0.0</version>
</since>
<synopsis>
Retrieve data pertaining to specific instances of MixMonitor on a channel.
</synopsis>
@@ -305,6 +333,10 @@
</function>
<managerEvent language="en_US" name="MixMonitorStart">
<managerEventInstance class="EVENT_FLAG_CALL">
<since>
<version>16.17.0</version>
<version>18.3.0</version>
</since>
<synopsis>Raised when monitoring has started on a channel.</synopsis>
<syntax>
<channel_snapshot/>
@@ -318,6 +350,10 @@
</managerEvent>
<managerEvent language="en_US" name="MixMonitorStop">
<managerEventInstance class="EVENT_FLAG_CALL">
<since>
<version>16.17.0</version>
<version>18.3.0</version>
</since>
<synopsis>Raised when monitoring has stopped on a channel.</synopsis>
<syntax>
<channel_snapshot/>
@@ -331,6 +367,10 @@
</managerEvent>
<managerEvent language="en_US" name="MixMonitorMute">
<managerEventInstance class="EVENT_FLAG_CALL">
<since>
<version>16.17.0</version>
<version>18.3.0</version>
</since>
<synopsis>Raised when monitoring is muted or unmuted on a channel.</synopsis>
<syntax>
<channel_snapshot/>
@@ -414,6 +454,7 @@ enum mixmonitor_flags {
MUXFLAG_NO_RWSYNC = (1 << 15),
MUXFLAG_AUTO_DELETE = (1 << 16),
MUXFLAG_REAL_CALLERID = (1 << 17),
MUXFLAG_INTERLEAVED = (1 << 18),
};
enum mixmonitor_args {
@@ -443,6 +484,7 @@ AST_APP_OPTIONS(mixmonitor_opts, {
AST_APP_OPTION_ARG('W', MUXFLAG_VOLUME, OPT_ARG_VOLUME),
AST_APP_OPTION_ARG('r', MUXFLAG_READ, OPT_ARG_READNAME),
AST_APP_OPTION_ARG('t', MUXFLAG_WRITE, OPT_ARG_WRITENAME),
AST_APP_OPTION('D', MUXFLAG_INTERLEAVED),
AST_APP_OPTION_ARG('i', MUXFLAG_UID, OPT_ARG_UID),
AST_APP_OPTION_ARG('m', MUXFLAG_VMRECIPIENTS, OPT_ARG_VMRECIPIENTS),
AST_APP_OPTION_ARG('S', MUXFLAG_DEPRECATED_RWSYNC, OPT_ARG_DEPRECATED_RWSYNC),
@@ -792,6 +834,46 @@ static void *mixmonitor_thread(void *obj)
}
}
if (ast_test_flag(mixmonitor, MUXFLAG_INTERLEAVED)) {
/* The 'D' option is set, so mix the frame as an interleaved dual channel frame */
int i;
short read_buf[SAMPLES_PER_FRAME];
short write_buf[SAMPLES_PER_FRAME];
short stereo_buf[SAMPLES_PER_FRAME * 2];
struct ast_frame stereo_frame = {
.frametype = AST_FRAME_VOICE,
.datalen = sizeof(stereo_buf),
.samples = SAMPLES_PER_FRAME,
};
if (fr) {
ast_frame_free(fr, 0);
fr = NULL;
}
if (fr_read) {
memcpy(read_buf, fr_read->data.ptr, sizeof(read_buf));
} else {
memset(read_buf, 0, sizeof(read_buf));
}
if (fr_write) {
memcpy(write_buf, fr_write->data.ptr, sizeof(write_buf));
} else {
memset(write_buf, 0, sizeof(write_buf));
}
for (i = 0; i < SAMPLES_PER_FRAME; i++) {
stereo_buf[i * 2] = read_buf[i];
stereo_buf[i * 2 + 1] = write_buf[i];
}
stereo_frame.data.ptr = stereo_buf;
stereo_frame.subclass.format = ast_format_cache_get_slin_by_rate(SAMPLES_PER_FRAME);
fr = ast_frdup(&stereo_frame);
}
if ((*fs) && (fr)) {
struct ast_frame *cur;

View File

@@ -41,6 +41,9 @@
/*** DOCUMENTATION
<application name="Morsecode" language="en_US">
<since>
<version>1.4.0</version>
</since>
<synopsis>
Plays morse code.
</synopsis>
@@ -51,7 +54,7 @@
</syntax>
<description>
<para>Plays the Morse code equivalent of the passed string.</para>
<para>This application does not automatically answer and should be preceeded by
<para>This application does not automatically answer and should be preceded by
an application such as Answer() or Progress().</para>
<para>This application uses the following variables:</para>
<variablelist>

View File

@@ -53,6 +53,9 @@
/*** DOCUMENTATION
<application name="MP3Player" language="en_US">
<since>
<version>0.1.0</version>
</since>
<synopsis>
Play an MP3 file or M3U playlist file or stream.
</synopsis>
@@ -71,7 +74,7 @@
<example title="Play an MP3 playlist">
exten => 1234,1,MP3Player(/var/lib/asterisk/playlist.m3u)
</example>
<para>This application does not automatically answer and should be preceeded by an
<para>This application does not automatically answer and should be preceded by an
application such as Answer() or Progress().</para>
</description>
</application>

View File

@@ -46,6 +46,9 @@ static const char app_originate[] = "Originate";
/*** DOCUMENTATION
<application name="Originate" language="en_US">
<since>
<version>1.6.1.0</version>
</since>
<synopsis>
Originate a call.
</synopsis>

View File

@@ -44,6 +44,9 @@
/*** DOCUMENTATION
<application name="Page" language="en_US">
<since>
<version>1.2.0</version>
</since>
<synopsis>
Page series of phones
</synopsis>

View File

@@ -43,6 +43,9 @@
/*** DOCUMENTATION
<application name="Playback" language="en_US">
<since>
<version>0.1.0</version>
</since>
<synopsis>
Play a file.
</synopsis>
@@ -94,7 +97,7 @@
<para>WaitExten (application) -- wait for digits from caller, optionally play music on hold</para>
</description>
<see-also>
<ref type="application">Background</ref>
<ref type="application">BackGround</ref>
<ref type="application">WaitExten</ref>
<ref type="application">ControlPlayback</ref>
<ref type="agi">stream file</ref>

View File

@@ -41,6 +41,9 @@ static const char stopplaytones_app[] = "StopPlayTones";
/*** DOCUMENTATION
<application name="PlayTones" language="en_US">
<since>
<version>1.6.1.0</version>
</since>
<synopsis>
Play a tone list.
</synopsis>
@@ -61,6 +64,9 @@ static const char stopplaytones_app[] = "StopPlayTones";
</see-also>
</application>
<application name="StopPlayTones" language="en_US">
<since>
<version>1.6.1.0</version>
</since>
<synopsis>
Stop playing a tone list.
</synopsis>

View File

@@ -44,6 +44,9 @@
/*** DOCUMENTATION
<application name="PrivacyManager" language="en_US">
<since>
<version>0.4.0</version>
</since>
<synopsis>
Require phone number to be entered, if no CallerID sent
</synopsis>

View File

@@ -123,6 +123,9 @@
/*** DOCUMENTATION
<application name="Queue" language="en_US">
<since>
<version>0.2.0</version>
</since>
<synopsis>
Queue a call for a call queue.
</synopsis>
@@ -171,7 +174,7 @@
to the specified destination and <emphasis>start</emphasis> execution at that location.</para>
<para>NOTE: Any channel variables you want the called channel to inherit from the caller channel must be
prefixed with one or two underbars ('_').</para>
<para>NOTE: Using this option from a GoSub() might not make sense as there would be no return points.</para>
<para>NOTE: Using this option from a Gosub() might not make sense as there would be no return points.</para>
</option>
<option name="h">
<para>Allow <emphasis>callee</emphasis> to hang up by pressing <literal>*</literal>.</para>
@@ -256,6 +259,10 @@
<para>Will run a gosub on the called party's channel (the queue member)
once the parties are connected. The subroutine execution starts in the
named context at the s exten and priority 1.</para>
<note><para>Macro was removed in Asterisk 21 which resulted in an
argument ordering change. The upgrade notice was missed for this,
so a note is being made here to provide a record of the change
for users who have not upgraded yet.</para></note>
</parameter>
<parameter name="rule">
<para>Will cause the queue's defaultrule to be overridden by the rule specified.</para>
@@ -271,7 +278,7 @@
up by another user.</para>
<para>This application will return to the dialplan if the queue does not exist, or
any of the join options cause the caller to not enter the queue.</para>
<para>This application does not automatically answer and should be preceeded
<para>This application does not automatically answer and should be preceded
by an application such as Answer(), Progress(), or Ringing().</para>
<para>This application sets the following channel variables upon completion:</para>
<variablelist>
@@ -316,6 +323,9 @@
</see-also>
</application>
<application name="AddQueueMember" language="en_US">
<since>
<version>0.5.0</version>
</since>
<synopsis>
Dynamically adds queue members.
</synopsis>
@@ -323,7 +333,17 @@
<parameter name="queuename" required="true" />
<parameter name="interface" />
<parameter name="penalty" />
<parameter name="options" />
<parameter name="options">
<optionlist>
<option name="p">
<para>Add queue member in paused state.</para>
</option>
<option name="r">
<argument name="reason" required="true" />
<para>Specify a reason why the member is in paused state.</para>
</option>
</optionlist>
</parameter>
<parameter name="membername" />
<parameter name="stateinterface" />
<parameter name="wrapuptime" />
@@ -359,6 +379,9 @@
</see-also>
</application>
<application name="RemoveQueueMember" language="en_US">
<since>
<version>0.5.0</version>
</since>
<synopsis>
Dynamically removes queue members.
</synopsis>
@@ -399,6 +422,9 @@
</see-also>
</application>
<application name="PauseQueueMember" language="en_US">
<since>
<version>1.2.0</version>
</since>
<synopsis>
Pauses a queue member.
</synopsis>
@@ -446,6 +472,9 @@
</see-also>
</application>
<application name="UnpauseQueueMember" language="en_US">
<since>
<version>1.2.0</version>
</since>
<synopsis>
Unpauses a queue member.
</synopsis>
@@ -490,6 +519,9 @@
</see-also>
</application>
<application name="QueueLog" language="en_US">
<since>
<version>1.4.0</version>
</since>
<synopsis>
Writes to the queue_log file.
</synopsis>
@@ -524,6 +556,9 @@
</see-also>
</application>
<application name="QueueUpdate" language="en_US">
<since>
<version>15.0.0</version>
</since>
<synopsis>
Writes to the queue_log file for outbound calls and updates Realtime Data.
Is used at h extension to be able to have all the parameters.
@@ -544,6 +579,9 @@
</description>
</application>
<function name="QUEUE_VARIABLES" language="en_US">
<since>
<version>1.6.0</version>
</since>
<synopsis>
Return Queue information in variables.
</synopsis>
@@ -551,7 +589,7 @@
<parameter name="queuename" required="true">
<enumlist>
<enum name="QUEUEMAX">
<para>Maxmimum number of calls allowed.</para>
<para>Maximum number of calls allowed.</para>
</enum>
<enum name="QUEUESTRATEGY">
<para>The strategy of the queue.</para>
@@ -599,6 +637,9 @@
</see-also>
</function>
<function name="QUEUE_MEMBER" language="en_US">
<since>
<version>1.6.0</version>
</since>
<synopsis>
Provides a count of queue members based on the provided criteria, or updates a
queue member's settings.
@@ -664,6 +705,9 @@
</see-also>
</function>
<function name="QUEUE_MEMBER_COUNT" language="en_US">
<since>
<version>1.4.0</version>
</since>
<synopsis>
Count number of members answering a queue.
</synopsis>
@@ -692,6 +736,9 @@
</see-also>
</function>
<function name="QUEUE_EXISTS" language="en_US">
<since>
<version>1.8.0</version>
</since>
<synopsis>
Check if a named queue exists on this server
</synopsis>
@@ -719,6 +766,9 @@
</see-also>
</function>
<function name="QUEUE_GET_CHANNEL" language="en_US">
<since>
<version>14.0.0</version>
</since>
<synopsis>
Return caller at the specified position in a queue.
</synopsis>
@@ -747,6 +797,9 @@
</see-also>
</function>
<function name="QUEUE_WAITING_COUNT" language="en_US">
<since>
<version>1.4.0</version>
</since>
<synopsis>
Count number of calls currently waiting in a queue.
</synopsis>
@@ -774,6 +827,9 @@
</see-also>
</function>
<function name="QUEUE_MEMBER_LIST" language="en_US">
<since>
<version>1.4.0</version>
</since>
<synopsis>
Returns a list of interfaces on a queue.
</synopsis>
@@ -801,6 +857,9 @@
</see-also>
</function>
<function name="QUEUE_MEMBER_PENALTY" language="en_US">
<since>
<version>1.6.0</version>
</since>
<synopsis>
Gets or sets queue members penalty.
</synopsis>
@@ -830,6 +889,9 @@
</see-also>
</function>
<manager name="QueueStatus" language="en_US">
<since>
<version>0.5.0</version>
</since>
<synopsis>
Show queue status.
</synopsis>
@@ -847,6 +909,9 @@
</description>
</manager>
<manager name="QueueSummary" language="en_US">
<since>
<version>1.6.0</version>
</since>
<synopsis>
Show queue summary.
</synopsis>
@@ -861,6 +926,9 @@
</description>
</manager>
<manager name="QueueAdd" language="en_US">
<since>
<version>1.0.0</version>
</since>
<synopsis>
Add interface to queue.
</synopsis>
@@ -878,6 +946,9 @@
<parameter name="Paused">
<para>To pause or not the member initially (true/false or 1/0).</para>
</parameter>
<parameter name="Reason" required="false">
<para>Text description why the member is paused.</para>
</parameter>
<parameter name="MemberName">
<para>Text alias for the interface.</para>
</parameter>
@@ -887,6 +958,9 @@
</description>
</manager>
<manager name="QueueRemove" language="en_US">
<since>
<version>1.0.0</version>
</since>
<synopsis>
Remove interface from queue.
</synopsis>
@@ -903,6 +977,9 @@
</description>
</manager>
<manager name="QueuePause" language="en_US">
<since>
<version>1.2.0</version>
</since>
<synopsis>
Makes a queue member temporarily unavailable.
</synopsis>
@@ -914,10 +991,10 @@
<parameter name="Paused" required="true">
<para>Pause or unpause the interface. Set to 'true' to pause the member or 'false' to unpause.</para>
</parameter>
<parameter name="Queue">
<parameter name="Queue" required="false">
<para>The name of the queue in which to pause or unpause this member. If not specified, the member will be paused or unpaused in all the queues it is a member of.</para>
</parameter>
<parameter name="Reason">
<parameter name="Reason" required="false">
<para>Text description, returned in the event QueueMemberPaused.</para>
</parameter>
</syntax>
@@ -926,6 +1003,9 @@
</description>
</manager>
<manager name="QueueLog" language="en_US">
<since>
<version>1.6.0</version>
</since>
<synopsis>
Adds custom entry in queue_log.
</synopsis>
@@ -941,6 +1021,9 @@
</description>
</manager>
<manager name="QueuePenalty" language="en_US">
<since>
<version>1.6.0</version>
</since>
<synopsis>
Set the penalty for a queue member.
</synopsis>
@@ -961,6 +1044,9 @@
</description>
</manager>
<manager name="QueueMemberRingInUse" language="en_US">
<since>
<version>11.0.0</version>
</since>
<synopsis>
Set the ringinuse value for a queue member.
</synopsis>
@@ -974,6 +1060,9 @@
</description>
</manager>
<manager name="QueueRule" language="en_US">
<since>
<version>1.6.0</version>
</since>
<synopsis>
Queue Rules.
</synopsis>
@@ -988,6 +1077,9 @@
</description>
</manager>
<manager name="QueueReload" language="en_US">
<since>
<version>1.6.2.0</version>
</since>
<synopsis>
Reload a queue, queues, or any sub-section of a queue or queues.
</synopsis>
@@ -1022,6 +1114,9 @@
</description>
</manager>
<manager name="QueueReset" language="en_US">
<since>
<version>1.6.2.0</version>
</since>
<synopsis>
Reset queue statistics.
</synopsis>
@@ -1036,6 +1131,9 @@
</description>
</manager>
<manager name="QueueChangePriorityCaller" language="en_US">
<since>
<version>15.0.0</version>
</since>
<synopsis>
Change priority of a caller on queue.
</synopsis>
@@ -1059,6 +1157,11 @@
</description>
</manager>
<manager name="QueueWithdrawCaller" language="en_US">
<since>
<version>19.3.0</version>
<version>18.11.0</version>
<version>16.25.0</version>
</since>
<synopsis>
Request to withdraw a caller from the queue back to the dialplan.
</synopsis>
@@ -1080,6 +1183,11 @@
<managerEvent language="en_US" name="QueueParams">
<managerEventInstance class="EVENT_FLAG_AGENT">
<since>
<version>16.24.0</version>
<version>18.10.0</version>
<version>19.2.0</version>
</since>
<synopsis>Raised in response to the QueueStatus action.</synopsis>
<syntax>
<parameter name="Max">
@@ -1118,6 +1226,11 @@
</managerEvent>
<managerEvent language="en_US" name="QueueEntry">
<managerEventInstance class="EVENT_FLAG_AGENT">
<since>
<version>16.24.0</version>
<version>18.10.0</version>
<version>19.2.0</version>
</since>
<synopsis>Raised in response to the QueueStatus action.</synopsis>
<syntax>
<parameter name="Queue">
@@ -1159,6 +1272,9 @@
</managerEvent>
<managerEvent language="en_US" name="QueueMemberStatus">
<managerEventInstance class="EVENT_FLAG_AGENT">
<since>
<version>12.0.0</version>
</since>
<synopsis>Raised when a Queue member's status has changed.</synopsis>
<syntax>
<parameter name="Queue">
@@ -1239,6 +1355,9 @@
</managerEvent>
<managerEvent language="en_US" name="QueueMemberAdded">
<managerEventInstance class="EVENT_FLAG_AGENT">
<since>
<version>12.0.0</version>
</since>
<synopsis>Raised when a member is added to the queue.</synopsis>
<syntax>
<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueMemberStatus']/managerEventInstance/syntax/parameter)" />
@@ -1251,6 +1370,9 @@
</managerEvent>
<managerEvent language="en_US" name="QueueMemberRemoved">
<managerEventInstance class="EVENT_FLAG_AGENT">
<since>
<version>12.0.0</version>
</since>
<synopsis>Raised when a member is removed from the queue.</synopsis>
<syntax>
<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueMemberStatus']/managerEventInstance/syntax/parameter)" />
@@ -1263,6 +1385,9 @@
</managerEvent>
<managerEvent language="en_US" name="QueueMemberPause">
<managerEventInstance class="EVENT_FLAG_AGENT">
<since>
<version>12.2.0</version>
</since>
<synopsis>Raised when a member is paused/unpaused in the queue.</synopsis>
<syntax>
<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueMemberStatus']/managerEventInstance/syntax/parameter)" />
@@ -1275,6 +1400,9 @@
</managerEvent>
<managerEvent language="en_US" name="QueueMemberPenalty">
<managerEventInstance class="EVENT_FLAG_AGENT">
<since>
<version>12.0.0</version>
</since>
<synopsis>Raised when a member's penalty is changed.</synopsis>
<syntax>
<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueMemberStatus']/managerEventInstance/syntax/parameter)" />
@@ -1286,6 +1414,9 @@
</managerEvent>
<managerEvent language="en_US" name="QueueMemberRinginuse">
<managerEventInstance class="EVENT_FLAG_AGENT">
<since>
<version>12.0.0</version>
</since>
<synopsis>Raised when a member's ringinuse setting is changed.</synopsis>
<syntax>
<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueMemberStatus']/managerEventInstance/syntax/parameter)" />
@@ -1297,6 +1428,9 @@
</managerEvent>
<managerEvent language="en_US" name="QueueCallerJoin">
<managerEventInstance class="EVENT_FLAG_AGENT">
<since>
<version>12.0.0</version>
</since>
<synopsis>Raised when a caller joins a Queue.</synopsis>
<syntax>
<channel_snapshot/>
@@ -1316,6 +1450,9 @@
</managerEvent>
<managerEvent language="en_US" name="QueueCallerLeave">
<managerEventInstance class="EVENT_FLAG_AGENT">
<since>
<version>12.0.0</version>
</since>
<synopsis>Raised when a caller leaves a Queue.</synopsis>
<syntax>
<channel_snapshot/>
@@ -1330,6 +1467,9 @@
</managerEvent>
<managerEvent language="en_US" name="QueueCallerAbandon">
<managerEventInstance class="EVENT_FLAG_AGENT">
<since>
<version>12.0.0</version>
</since>
<synopsis>Raised when a caller abandons the queue.</synopsis>
<syntax>
<channel_snapshot/>
@@ -1346,6 +1486,9 @@
</managerEvent>
<managerEvent language="en_US" name="AgentCalled">
<managerEventInstance class="EVENT_FLAG_AGENT">
<since>
<version>12.0.0</version>
</since>
<synopsis>Raised when an queue member is notified of a caller in the queue.</synopsis>
<syntax>
<channel_snapshot/>
@@ -1363,6 +1506,9 @@
</managerEvent>
<managerEvent language="en_US" name="AgentRingNoAnswer">
<managerEventInstance class="EVENT_FLAG_AGENT">
<since>
<version>12.0.0</version>
</since>
<synopsis>Raised when a queue member is notified of a caller in the queue and fails to answer.</synopsis>
<syntax>
<channel_snapshot/>
@@ -1381,6 +1527,9 @@
</managerEvent>
<managerEvent language="en_US" name="AgentComplete">
<managerEventInstance class="EVENT_FLAG_AGENT">
<since>
<version>12.0.0</version>
</since>
<synopsis>Raised when a queue member has finished servicing a caller in the queue.</synopsis>
<syntax>
<channel_snapshot/>
@@ -1408,6 +1557,9 @@
</managerEvent>
<managerEvent language="en_US" name="AgentDump">
<managerEventInstance class="EVENT_FLAG_AGENT">
<since>
<version>12.0.0</version>
</since>
<synopsis>Raised when a queue member hangs up on a caller in the queue.</synopsis>
<syntax>
<channel_snapshot/>
@@ -1424,6 +1576,9 @@
</managerEvent>
<managerEvent language="en_US" name="AgentConnect">
<managerEventInstance class="EVENT_FLAG_AGENT">
<since>
<version>12.0.0</version>
</since>
<synopsis>Raised when a queue member answers and is bridged to a caller in the queue.</synopsis>
<syntax>
<channel_snapshot/>
@@ -1502,6 +1657,22 @@ AST_APP_OPTIONS(queue_exec_options, BEGIN_OPTIONS
AST_APP_OPTION('W', OPT_CALLER_AUTOMON),
END_OPTIONS);
enum aqm_flags {
AQMFLAG_PAUSED = (1 << 1),
AQMFLAG_REASON = (1 << 2),
};
enum aqm_args {
AQM_OPT_ARG_PAUSE_REASON = 0,
AQM_OPT_ARG_ARRAY_SIZE, /* Always last element of the enum */
};
AST_APP_OPTIONS(aqm_opts, {
AST_APP_OPTION('p', AQMFLAG_PAUSED),
AST_APP_OPTION_ARG('r', AQMFLAG_REASON, AQM_OPT_ARG_PAUSE_REASON),
});
enum {
QUEUE_STRATEGY_RINGALL = 0,
QUEUE_STRATEGY_LEASTRECENT,
@@ -1616,6 +1787,12 @@ static int log_membername_as_agent;
/*! \brief queues.conf [general] option */
static int force_longest_waiting_caller;
/*! \brief queues.conf [general] option */
static int log_caller_id_name;
/*! \brief queues.conf [general] option */
static int log_unpause_on_reason_change;
/*! \brief name of the ringinuse field in the realtime database */
static char *realtime_ringinuse_field;
@@ -1710,6 +1887,7 @@ struct queue_ent {
int max_penalty; /*!< Limit the members that can take this call to this penalty or lower */
int min_penalty; /*!< Limit the members that can take this call to this penalty or higher */
int raise_penalty; /*!< Float lower penalty members to a minimum penalty */
int raise_respect_min; /*!< A switch raise_penalty should respect min_penalty not just max_penalty */
int linpos; /*!< If using linear strategy, what position are we at? */
int linwrapped; /*!< Is the linpos wrapped? */
time_t start; /*!< When we started holding */
@@ -1780,6 +1958,7 @@ struct penalty_rule {
int max_relative; /*!< Is the max adjustment relative? 1 for relative, 0 for absolute */
int min_relative; /*!< Is the min adjustment relative? 1 for relative, 0 for absolute */
int raise_relative; /*!< Is the min adjustment relative? 1 for relative, 0 for absolute */
int raise_respect_min; /*!< A switch raise_penalty should respect min_penalty not just max_penalty */
AST_LIST_ENTRY(penalty_rule) list; /*!< Next penalty_rule */
};
@@ -1855,7 +2034,7 @@ struct call_queue {
int periodicannouncestartdelay; /*!< How long into the queue should the periodic accouncement start */
int periodicannouncefrequency; /*!< How often to play periodic announcement */
int numperiodicannounce; /*!< The number of periodic announcements configured */
int randomperiodicannounce; /*!< Are periodic announcments randomly chosen */
int randomperiodicannounce; /*!< Are periodic announcements randomly chosen */
int roundingseconds; /*!< How many seconds do we round to? */
int holdtime; /*!< Current avg holdtime, based on an exponential average */
int talktime; /*!< Current avg talktime, based on the same exponential average */
@@ -2419,7 +2598,7 @@ static struct ast_json *queue_member_blob_create(struct call_queue *q, struct me
* is available, the function immediately returns 0. If no members are available,
* then -1 is returned.
*/
static int get_member_status(struct call_queue *q, int max_penalty, int min_penalty, int raise_penalty, enum empty_conditions conditions, int devstate)
static int get_member_status(struct call_queue *q, int max_penalty, int min_penalty, int raise_penalty, enum empty_conditions conditions, int devstate, int raise_respect_min)
{
struct member *member;
struct ao2_iterator mem_iter;
@@ -2429,8 +2608,13 @@ static int get_member_status(struct call_queue *q, int max_penalty, int min_pena
for (; (member = ao2_iterator_next(&mem_iter)); ao2_ref(member, -1)) {
int penalty = member->penalty;
if (raise_penalty != INT_MAX && penalty < raise_penalty) {
ast_debug(4, "%s is having his penalty raised up from %d to %d\n", member->membername, penalty, raise_penalty);
penalty = raise_penalty;
/* Check if we should respect minimum penalty threshold */
if (raise_respect_min && penalty < min_penalty) {
ast_debug(4, "%s penalty %d not raised (below min %d)\n", member->membername, penalty, min_penalty);
} else {
ast_debug(4, "%s is having his penalty raised up from %d to %d\n", member->membername, penalty, raise_penalty);
penalty = raise_penalty;
}
}
if ((max_penalty != INT_MAX && penalty > max_penalty) || (min_penalty != INT_MAX && penalty < min_penalty)) {
if (conditions & QUEUE_EMPTY_PENALTY) {
@@ -2497,7 +2681,7 @@ static int get_member_status(struct call_queue *q, int max_penalty, int min_pena
if (!devstate && (conditions & QUEUE_EMPTY_RINGING)) {
/* member state still may be RINGING due to lag in event message - check again with device state */
return get_member_status(q, max_penalty, min_penalty, raise_penalty, conditions, 1);
return get_member_status(q, max_penalty, min_penalty, raise_penalty, conditions, 1, raise_respect_min);
}
return -1;
}
@@ -3136,6 +3320,11 @@ static int insert_penaltychange(const char *list_name, const char *content, cons
}
if (!ast_strlen_zero(raisestr)) {
rule->raise_respect_min = 0; /* Initialize to 0 */
if (*raisestr == 'r') {
rule->raise_respect_min = 1; /* Set the flag */
raisestr++;
}
if (*raisestr == '+' || *raisestr == '-') {
rule->raise_relative = 1;
}
@@ -3255,12 +3444,22 @@ static int load_realtime_rules(void)
}
}
if (!(raisestr = ast_variable_retrieve(cfg, rulecat, "raise_penalty")) ||
ast_strlen_zero(raisestr) || sscanf(raisestr, "%30d", &raise_penalty) != 1) {
ast_strlen_zero(raisestr) ) {
raise_penalty = 0;
raise_relative = 1;
} else {
if (*raisestr == 'r') {
new_penalty_rule->raise_respect_min = 1;
raisestr++;
} else {
new_penalty_rule->raise_respect_min = 0;
}
if (*raisestr == '+' || *raisestr == '-') {
raise_relative = 1;
}
if (sscanf(raisestr, "%30d", &raise_penalty) != 1) {
raise_penalty = 0;
raise_relative = 1;
}
}
new_penalty_rule->time = penaltychangetime;
@@ -4072,7 +4271,7 @@ static int join_queue(char *queuename, struct queue_ent *qe, enum queue_result *
/* This is our one */
if (q->joinempty) {
int status = 0;
if ((status = get_member_status(q, qe->max_penalty, qe->min_penalty, qe->raise_penalty, q->joinempty, 0))) {
if ((status = get_member_status(q, qe->max_penalty, qe->min_penalty, qe->raise_penalty, q->joinempty, 0, qe->raise_respect_min))) {
*reason = QUEUE_JOINEMPTY;
ao2_unlock(q);
queue_t_unref(q, "Done with realtime queue");
@@ -4222,7 +4421,7 @@ static int say_position(struct queue_ent *qe, int ringing)
}
/* Only announce if the caller's queue position has improved since last time */
if (qe->parent->announceposition_only_up && qe->last_pos_said <= qe->pos) {
if (qe->parent->announceposition_only_up && qe->last_pos_said > 0 && qe->last_pos_said <= qe->pos) {
return 0;
}
@@ -5908,7 +6107,7 @@ static int wait_our_turn(struct queue_ent *qe, int ringing, enum queue_result *r
if (qe->parent->leavewhenempty) {
int status = 0;
if ((status = get_member_status(qe->parent, qe->max_penalty, qe->min_penalty, qe->raise_penalty, qe->parent->leavewhenempty, 0))) {
if ((status = get_member_status(qe->parent, qe->max_penalty, qe->min_penalty, qe->raise_penalty, qe->parent->leavewhenempty, 0, qe->raise_respect_min))) {
record_abandoned(qe);
*reason = QUEUE_LEAVEEMPTY;
ast_queue_log(qe->parent->name, ast_channel_uniqueid(qe->chan), "NONE", "EXITEMPTY", "%d|%d|%ld", qe->pos, qe->opos, (long) (time(NULL) - qe->start));
@@ -6550,7 +6749,15 @@ static void handle_local_optimization_begin(void *userdata, struct stasis_subscr
struct local_optimization *optimization;
unsigned int id;
SCOPED_AO2LOCK(lock, queue_data);
if (!local_one || !local_two || !source) {
ast_debug(1, "Local optimization begin missing channel snapshots:%s%s%s\n",
!local_one ? " local_one," : "",
!local_two ? " local_two," : "",
!source ? " source," : "");
return;
}
if (queue_data->dying) {
return;
}
@@ -6791,7 +6998,7 @@ static int setup_stasis_subs(struct queue_ent *qe, struct ast_channel *peer, str
handle_blind_transfer, queue_data);
stasis_message_router_add(queue_data->bridge_router, ast_attended_transfer_type(),
handle_attended_transfer, queue_data);
stasis_message_router_set_default(queue_data->bridge_router,
stasis_message_router_add(queue_data->bridge_router, stasis_subscription_change_type(),
queue_bridge_cb, queue_data);
queue_data->channel_router = stasis_message_router_create_pool(ast_channel_topic_all());
@@ -6813,7 +7020,7 @@ static int setup_stasis_subs(struct queue_ent *qe, struct ast_channel *peer, str
handle_hangup, queue_data);
stasis_message_router_add(queue_data->channel_router, ast_channel_masquerade_type(),
handle_masquerade, queue_data);
stasis_message_router_set_default(queue_data->channel_router,
stasis_message_router_add(queue_data->channel_router, stasis_subscription_change_type(),
queue_channel_cb, queue_data);
return 0;
@@ -6972,7 +7179,7 @@ static void setup_mixmonitor(struct queue_ent *qe, const char *filename)
* \param[in,out] tries the number of times we have tried calling queue members
* \param[out] noption set if the call to Queue() has the 'n' option set.
* \param[in] agi the agi passed as the fifth parameter to the Queue() application
* \param[in] gosub the gosub passed as the seventh parameter to the Queue() application
* \param[in] gosub the gosub passed as the sixth parameter to the Queue() application
* \param[in] ringing 1 if the 'r' option is set, otherwise 0
*/
static int try_calling(struct queue_ent *qe, struct ast_flags opts, char **opt_args, char *announceoverride, const char *url, int *tries, int *noption, const char *agi, const char *gosub, int ringing)
@@ -7787,6 +7994,11 @@ static void set_queue_member_pause(struct call_queue *q, struct member *mem, con
if (mem->paused == paused) {
ast_debug(1, "%spausing already-%spaused queue member %s:%s\n",
(paused ? "" : "un"), (paused ? "" : "un"), q->name, mem->interface);
if (log_unpause_on_reason_change && paused) {
if (!ast_strings_equal(mem->reason_paused, reason)) {
ast_queue_log(q->name, "NONE", mem->membername, "UNPAUSE", "%s", "Auto-Unpause");
}
}
}
if (mem->realtime && !ast_strlen_zero(mem->rt_uniqueid)) {
@@ -8354,7 +8566,7 @@ static int rqm_exec(struct ast_channel *chan, const char *data)
static int aqm_exec(struct ast_channel *chan, const char *data)
{
int res=-1;
char *parse, *tmp, *temppos = NULL;
char *parse, *tmp, *temppos = NULL, *reason = NULL;
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(queuename);
AST_APP_ARG(interface);
@@ -8365,7 +8577,9 @@ static int aqm_exec(struct ast_channel *chan, const char *data)
AST_APP_ARG(wrapuptime);
);
int penalty = 0;
int paused = 0;
int wrapuptime;
struct ast_flags flags = { 0 };
if (ast_strlen_zero(data)) {
ast_log(LOG_WARNING, "AddQueueMember requires an argument (queuename[,interface[,penalty[,options[,membername[,stateinterface][,wrapuptime]]]]])\n");
@@ -8376,6 +8590,17 @@ static int aqm_exec(struct ast_channel *chan, const char *data)
AST_STANDARD_APP_ARGS(args, parse);
if (args.options) {
char *opts[AQM_OPT_ARG_ARRAY_SIZE] = { NULL, };
ast_app_parse_options(aqm_opts, &flags, opts, args.options);
if (ast_test_flag(&flags, AQMFLAG_PAUSED)) {
paused = 1;
if (ast_test_flag(&flags, AQMFLAG_REASON) && !ast_strlen_zero(opts[AQM_OPT_ARG_PAUSE_REASON])) {
reason = ast_strdupa(opts[AQM_OPT_ARG_PAUSE_REASON]);
}
}
}
if (ast_strlen_zero(args.interface)) {
args.interface = ast_strdupa(ast_channel_name(chan));
temppos = strrchr(args.interface, '-');
@@ -8402,12 +8627,12 @@ static int aqm_exec(struct ast_channel *chan, const char *data)
wrapuptime = 0;
}
switch (add_to_queue(args.queuename, args.interface, args.membername, penalty, 0, queue_persistent_members, args.state_interface, NULL, wrapuptime)) {
switch (add_to_queue(args.queuename, args.interface, args.membername, penalty, paused, queue_persistent_members, args.state_interface, reason, wrapuptime)) {
case RES_OKAY:
if (ast_strlen_zero(args.membername) || !log_membername_as_agent) {
ast_queue_log(args.queuename, ast_channel_uniqueid(chan), args.interface, "ADDMEMBER", "%s", "");
ast_queue_log(args.queuename, ast_channel_uniqueid(chan), args.interface, "ADDMEMBER", "%s", paused ? "PAUSED" : "");
} else {
ast_queue_log(args.queuename, ast_channel_uniqueid(chan), args.membername, "ADDMEMBER", "%s", "");
ast_queue_log(args.queuename, ast_channel_uniqueid(chan), args.membername, "ADDMEMBER", "%s", paused ? "PAUSED" : "");
}
ast_log(LOG_NOTICE, "Added interface '%s' to queue '%s'\n", args.interface, args.queuename);
pbx_builtin_setvar_helper(chan, "AQMSTATUS", "ADDED");
@@ -8632,8 +8857,14 @@ static int queue_exec(struct ast_channel *chan, const char *data)
}
if ((raise_penalty_str = pbx_builtin_getvar_helper(chan, "QUEUE_RAISE_PENALTY"))) {
if (*raise_penalty_str == 'r') {
qe.raise_respect_min = 1;
raise_penalty_str++;
} else {
qe.raise_respect_min = 0;
}
if (sscanf(raise_penalty_str, "%30d", &raise_penalty) == 1) {
ast_debug(1, "%s: Got raise penalty %d from ${QUEUE_RAISE_PENALTY}.\n", ast_channel_name(chan), raise_penalty);
ast_debug(1, "%s: Got raise penalty %s%d from ${QUEUE_RAISE_PENALTY}.\n", ast_channel_name(chan), qe.raise_respect_min ? "r" : "", raise_penalty);
} else {
ast_log(LOG_WARNING, "${QUEUE_RAISE_PENALTY}: Invalid value (%s), channel %s.\n",
raise_penalty_str, ast_channel_name(chan));
@@ -8691,11 +8922,33 @@ static int queue_exec(struct ast_channel *chan, const char *data)
cid_allow = qe.parent->log_restricted_caller_id || ((ast_party_id_presentation(&ast_channel_caller(chan)->id) & AST_PRES_RESTRICTION) == AST_PRES_ALLOWED);
ast_queue_log(args.queuename, ast_channel_uniqueid(chan), "NONE", "ENTERQUEUE", "%s|%s|%d",
S_OR(args.url, ""),
S_COR(cid_allow && ast_channel_caller(chan)->id.number.valid, ast_channel_caller(chan)->id.number.str, ""),
qe.opos);
if (log_caller_id_name) {
char *escaped_cidname = NULL;
/* Ensure caller ID name is valid and not NULL before processing */
if (cid_allow && ast_channel_caller(chan)->id.name.valid && ast_channel_caller(chan)->id.name.str) {
escaped_cidname = ast_strdupa(ast_channel_caller(chan)->id.name.str);
/* Only iterate if '|' is found */
if (strchr(escaped_cidname, '|')) {
for (char *p = escaped_cidname; *p; p++) {
if (*p == '|') {
*p = '_';
}
}
}
}
ast_queue_log(args.queuename, ast_channel_uniqueid(chan), "NONE", "ENTERQUEUE", "%s|%s|%d|%s",
S_OR(args.url, ""),
S_COR(cid_allow && ast_channel_caller(chan)->id.number.valid, ast_channel_caller(chan)->id.number.str, ""),
qe.opos,
S_OR(escaped_cidname, ""));
} else {
ast_queue_log(args.queuename, ast_channel_uniqueid(chan), "NONE", "ENTERQUEUE", "%s|%s|%d",
S_OR(args.url, ""),
S_COR(cid_allow && ast_channel_caller(chan)->id.number.valid, ast_channel_caller(chan)->id.number.str, ""),
qe.opos);
}
/* PREDIAL: Preprocess any callee gosub arguments. */
if (ast_test_flag(&opts, OPT_PREDIAL_CALLEE)
&& !ast_strlen_zero(opt_args[OPT_ARG_PREDIAL_CALLEE])) {
@@ -8803,7 +9056,7 @@ check_turns:
if (qe.parent->leavewhenempty) {
int status = 0;
if ((status = get_member_status(qe.parent, qe.max_penalty, qe.min_penalty, qe.raise_penalty, qe.parent->leavewhenempty, 0))) {
if ((status = get_member_status(qe.parent, qe.max_penalty, qe.min_penalty, qe.raise_penalty, qe.parent->leavewhenempty, 0, qe.raise_respect_min))) {
record_abandoned(&qe);
reason = QUEUE_LEAVEEMPTY;
ast_queue_log(args.queuename, ast_channel_uniqueid(chan), "NONE", "EXITEMPTY", "%d|%d|%ld", qe.pos, qe.opos, (long)(time(NULL) - qe.start));
@@ -9576,6 +9829,7 @@ static void queue_reset_global_params(void)
negative_penalty_invalid = 0;
log_membername_as_agent = 0;
force_longest_waiting_caller = 0;
log_unpause_on_reason_change = 0;
}
/*! Set the global queue parameters as defined in the "general" section of queues.conf */
@@ -9604,6 +9858,13 @@ static void queue_set_global_params(struct ast_config *cfg)
if ((general_val = ast_variable_retrieve(cfg, "general", "force_longest_waiting_caller"))) {
force_longest_waiting_caller = ast_true(general_val);
}
if ((general_val = ast_variable_retrieve(cfg, "general", "log_unpause_on_reason_change"))) {
log_unpause_on_reason_change = ast_true(general_val);
}
/* Apply log-caller-id-name in the same place as other global settings */
if ((general_val = ast_variable_retrieve(cfg, "general", "log-caller-id-name"))) {
log_caller_id_name = ast_true(general_val);
}
}
/*! \brief reload information pertaining to a single member
@@ -9623,6 +9884,7 @@ static void reload_single_member(const char *memberdata, struct call_queue *q)
int penalty;
int ringinuse;
int wrapuptime;
int paused;
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(interface);
AST_APP_ARG(penalty);
@@ -9630,6 +9892,7 @@ static void reload_single_member(const char *memberdata, struct call_queue *q)
AST_APP_ARG(state_interface);
AST_APP_ARG(ringinuse);
AST_APP_ARG(wrapuptime);
AST_APP_ARG(paused);
);
if (ast_strlen_zero(memberdata)) {
@@ -9695,11 +9958,30 @@ static void reload_single_member(const char *memberdata, struct call_queue *q)
wrapuptime = 0;
}
if (!ast_strlen_zero(args.paused)) {
tmp = args.paused;
ast_strip(tmp);
if (ast_true(tmp)) {
paused = 1;
} else if (ast_false(tmp)) {
paused = 0;
} else {
ast_log(LOG_ERROR, "Member %s has an invalid paused value.\n", membername);
paused = 0;
}
} else {
paused = 0;
}
/* Find the old position in the list */
ast_copy_string(tmpmem.interface, interface, sizeof(tmpmem.interface));
cur = ao2_find(q->members, &tmpmem, OBJ_POINTER);
if ((newm = create_queue_member(interface, membername, penalty, cur ? cur->paused : 0, state_interface, ringinuse, wrapuptime))) {
if (cur) {
paused = cur->paused;
}
if ((newm = create_queue_member(interface, membername, penalty, paused, state_interface, ringinuse, wrapuptime))) {
newm->wrapuptime = wrapuptime;
if (cur) {
ao2_lock(q->members);
@@ -10324,7 +10606,7 @@ static char *complete_queue(const char *line, const char *word, int pos, int sta
queue_iter = ao2_iterator_init(queues, 0);
while ((q = ao2_t_iterator_next(&queue_iter, "Iterate through queues"))) {
if (!strncasecmp(word, q->name, wordlen) && ++which > state
&& (!word_list_offset || !word_in_list(word_list, q->name))) {
&& (!word_list_offset || !word_list || !word_in_list(word_list, q->name))) {
ret = ast_strdup(q->name);
queue_t_unref(q, "Done with iterator");
break;
@@ -10610,13 +10892,14 @@ static int manager_queues_status(struct mansession *s, const struct message *m)
static int manager_add_queue_member(struct mansession *s, const struct message *m)
{
const char *queuename, *interface, *penalty_s, *paused_s, *membername, *state_interface, *wrapuptime_s;
const char *queuename, *interface, *penalty_s, *paused_s, *reason, *membername, *state_interface, *wrapuptime_s;
int paused, penalty, wrapuptime = 0;
queuename = astman_get_header(m, "Queue");
interface = astman_get_header(m, "Interface");
penalty_s = astman_get_header(m, "Penalty");
paused_s = astman_get_header(m, "Paused");
reason = astman_get_header(m, "Reason"); /* Optional */
membername = astman_get_header(m, "MemberName");
state_interface = astman_get_header(m, "StateInterface");
wrapuptime_s = astman_get_header(m, "Wrapuptime");
@@ -10649,7 +10932,7 @@ static int manager_add_queue_member(struct mansession *s, const struct message *
paused = abs(ast_true(paused_s));
}
switch (add_to_queue(queuename, interface, membername, penalty, paused, queue_persistent_members, state_interface, NULL, wrapuptime)) {
switch (add_to_queue(queuename, interface, membername, penalty, paused, queue_persistent_members, state_interface, reason, wrapuptime)) {
case RES_OKAY:
if (ast_strlen_zero(membername) || !log_membername_as_agent) {
ast_queue_log(queuename, "MANAGER", interface, "ADDMEMBER", "%s", paused ? "PAUSED" : "");
@@ -10989,21 +11272,21 @@ static int manager_request_withdraw_caller_from_queue(struct mansession *s, cons
static char *handle_queue_add_member(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
const char *queuename, *interface, *membername = NULL, *state_interface = NULL;
int penalty;
const char *queuename, *interface, *membername = NULL, *state_interface = NULL, *reason = NULL;
int penalty, paused = 0;
switch ( cmd ) {
case CLI_INIT:
e->command = "queue add member";
e->usage =
"Usage: queue add member <dial string> to <queue> [penalty <penalty> [as <membername> [state_interface <interface>]]]\n"
"Usage: queue add member <dial string> to <queue> [penalty <penalty> [as <membername> [state_interface <interface> [paused <reason>]]]]\n"
" Add a dial string (Such as a channel,e.g. SIP/6001) to a queue with optionally: a penalty, membername and a state_interface\n";
return NULL;
case CLI_GENERATE:
return complete_queue_add_member(a->line, a->word, a->pos, a->n);
}
if ((a->argc != 6) && (a->argc != 8) && (a->argc != 10) && (a->argc != 12)) {
if ((a->argc != 6) && (a->argc != 8) && (a->argc != 10) && (a->argc != 12) && (a->argc != 14)) {
return CLI_SHOWUSAGE;
} else if (strcmp(a->argv[4], "to")) {
return CLI_SHOWUSAGE;
@@ -11013,6 +11296,8 @@ static char *handle_queue_add_member(struct ast_cli_entry *e, int cmd, struct as
return CLI_SHOWUSAGE;
} else if ((a->argc == 12) && strcmp(a->argv[10], "state_interface")) {
return CLI_SHOWUSAGE;
} else if ((a->argc == 14) && strcmp(a->argv[12], "paused")) {
return CLI_SHOWUSAGE;
}
queuename = a->argv[5];
@@ -11039,12 +11324,17 @@ static char *handle_queue_add_member(struct ast_cli_entry *e, int cmd, struct as
state_interface = a->argv[11];
}
switch (add_to_queue(queuename, interface, membername, penalty, 0, queue_persistent_members, state_interface, NULL, 0)) {
if (a->argc >= 14) {
paused = 1;
reason = a->argv[13];
}
switch (add_to_queue(queuename, interface, membername, penalty, paused, queue_persistent_members, state_interface, reason, 0)) {
case RES_OKAY:
if (ast_strlen_zero(membername) || !log_membername_as_agent) {
ast_queue_log(queuename, "CLI", interface, "ADDMEMBER", "%s", "");
ast_queue_log(queuename, "CLI", interface, "ADDMEMBER", "%s", paused ? "PAUSED" : "");
} else {
ast_queue_log(queuename, "CLI", membername, "ADDMEMBER", "%s", "");
ast_queue_log(queuename, "CLI", membername, "ADDMEMBER", "%s", paused ? "PAUSED" : "");
}
ast_cli(a->fd, "Added interface '%s' to queue '%s'\n", interface, queuename);
return CLI_SUCCESS;

View File

@@ -40,6 +40,9 @@
/*** DOCUMENTATION
<application name="Read" language="en_US">
<since>
<version>1.6.1.0</version>
</since>
<synopsis>
Read a variable.
</synopsis>

View File

@@ -39,6 +39,9 @@
/*** DOCUMENTATION
<application name="ReadExten" language="en_US">
<since>
<version>1.6.0</version>
</since>
<synopsis>
Read an extension into a variable.
</synopsis>

View File

@@ -42,6 +42,9 @@
/*** DOCUMENTATION
<application name="Record" language="en_US">
<since>
<version>0.1.8</version>
</since>
<synopsis>
Record to a file.
</synopsis>
@@ -116,8 +119,32 @@
</variable>
</variablelist>
</description>
<see-also>
<ref type="function">RECORDING_INFO</ref>
</see-also>
</application>
<function name="RECORDING_INFO" language="en_US">
<synopsis>
Retrieve information about a recording previously created using the Record application
</synopsis>
<syntax>
<parameter name="property" required="true">
<para>The property about the recording to retrieve.</para>
<enumlist>
<enum name="duration">
<para>The duration, in milliseconds, of the recording.</para>
</enum>
</enumlist>
</parameter>
</syntax>
<description>
<para>Returns information about the previous recording created by <literal>Record</literal>.
This function cannot be used if no recordings have yet been completed.</para>
</description>
<see-also>
<ref type="application">Record</ref>
</see-also>
</function>
***/
#define OPERATOR_KEY '0'
@@ -218,13 +245,65 @@ static int create_destination_directory(const char *path)
return ast_mkdir(directory, 0777);
}
struct recording_data {
unsigned long duration; /* Duration, in ms */
};
static void recording_data_free(void *data)
{
ast_free(data);
}
static const struct ast_datastore_info recording_data_info = {
.type = "RECORDING_INFO",
.destroy = recording_data_free,
};
static int recording_info_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
{
struct ast_datastore *ds;
struct recording_data *recdata;
*buf = '\0';
if (!chan) {
ast_log(LOG_ERROR, "%s() can only be executed on a channel\n", cmd);
return -1;
} else if (ast_strlen_zero(data)) {
ast_log(LOG_ERROR, "%s() requires an argument\n", cmd);
return -1;
}
ast_channel_lock(chan);
ds = ast_channel_datastore_find(chan, &recording_data_info, NULL);
ast_channel_unlock(chan);
if (!ds) {
ast_log(LOG_ERROR, "No recordings have completed on channel %s\n", ast_channel_name(chan));
return -1;
}
recdata = ds->data;
if (!strcasecmp(data, "duration")) {
snprintf(buf, len, "%ld", recdata->duration);
} else {
ast_log(LOG_ERROR, "Invalid property type: %s\n", data);
return -1;
}
return 0;
}
static int record_exec(struct ast_channel *chan, const char *data)
{
struct ast_datastore *ds;
int res = 0;
char *ext = NULL, *opts[0];
char *parse;
int i = 0;
char tmp[PATH_MAX];
struct recording_data *recdata;
struct ast_filestream *s = NULL;
struct ast_frame *f = NULL;
@@ -252,6 +331,31 @@ static int record_exec(struct ast_channel *chan, const char *data)
struct timeval start;
const char *status_response = "ERROR";
/* Retrieve or create the datastore */
ast_channel_lock(chan);
if (!(ds = ast_channel_datastore_find(chan, &recording_data_info, NULL))) {
if (!(ds = ast_datastore_alloc(&recording_data_info, NULL))) {
ast_log(LOG_ERROR, "Unable to allocate new datastore.\n");
ast_channel_unlock(chan);
return -1;
}
if (!(recdata = ast_calloc(1, sizeof(*recdata)))) {
ast_datastore_free(ds);
ast_channel_unlock(chan);
return -1;
}
ds->data = recdata;
ast_channel_datastore_add(chan, ds);
} else {
recdata = ds->data;
}
ast_channel_unlock(chan);
/* Reset, in case already set */
recdata->duration = 0;
/* The next few lines of code parse out the filename and header from the input string */
if (ast_strlen_zero(data)) { /* no data implies no filename or anything is present */
ast_log(LOG_WARNING, "Record requires an argument (filename)\n");
@@ -514,6 +618,8 @@ static int record_exec(struct ast_channel *chan, const char *data)
ast_channel_stop_silence_generator(chan, silgen);
out:
recdata->duration = ast_tvdiff_ms(ast_tvnow(), start);
if ((silence > 0) && rfmt) {
res = ast_set_read_format(chan, rfmt);
if (res) {
@@ -530,14 +636,25 @@ out:
return res;
}
static struct ast_custom_function acf_recording_info = {
.name = "RECORDING_INFO",
.read = recording_info_read,
};
static int unload_module(void)
{
return ast_unregister_application(app);
int res;
res = ast_custom_function_unregister(&acf_recording_info);
res |= ast_unregister_application(app);
return res;
}
static int load_module(void)
{
return ast_register_application_xml(app, record_exec);
int res;
res = ast_register_application_xml(app, record_exec);
res |= ast_custom_function_register(&acf_recording_info);
return res;
}
AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Trivial Record Application");

View File

@@ -42,7 +42,6 @@
<since>
<version>16.20.0</version>
<version>18.6.0</version>
<version>19.0.0</version>
</since>
<synopsis>
Reloads an Asterisk module, blocking the channel until the reload has completed.

View File

@@ -31,6 +31,9 @@
/*** DOCUMENTATION
<application name="SayCountedNoun" language="en_US">
<since>
<version>1.8.0</version>
</since>
<synopsis>
Say a noun in declined form in order to count things
</synopsis>
@@ -63,7 +66,7 @@
implement complicated spelling rules. We simply record the word
"men" in the sound file named "mans".</para>
<para>This application does not automatically answer and should be
preceeded by an application such as Answer() or Progress.</para>
preceded by an application such as Answer() or Progress.</para>
</description>
<see-also>
<ref type="application">SayCountedAdj</ref>
@@ -71,6 +74,9 @@
</see-also>
</application>
<application name="SayCountedAdj" language="en_US">
<since>
<version>1.8.0</version>
</since>
<synopsis>
Say a adjective in declined form in order to count things
</synopsis>
@@ -102,7 +108,7 @@
SayCountedAdj(5,new,f) will play sound file "newx" (containing the
word "novikh").</para>
<para>This application does not automatically answer and should be
preceeded by an application such as Answer(), Progress(), or
preceded by an application such as Answer(), Progress(), or
Proceeding().</para>
</description>
<see-also>

View File

@@ -40,6 +40,9 @@
/*** DOCUMENTATION
<application name="SayUnixTime" language="en_US">
<since>
<version>0.7.0</version>
</since>
<synopsis>
Says a specified time in a custom format.
</synopsis>
@@ -76,6 +79,9 @@
</see-also>
</application>
<application name="DateTime" language="en_US">
<since>
<version>0.2.0</version>
</since>
<synopsis>
Says a specified time in a custom format.
</synopsis>

View File

@@ -39,6 +39,9 @@
/*** DOCUMENTATION
<application name="SendDTMF" language="en_US">
<since>
<version>0.3.0</version>
</since>
<synopsis>
Sends arbitrary DTMF digits
</synopsis>
@@ -75,6 +78,9 @@
</see-also>
</application>
<manager name="PlayDTMF" language="en_US">
<since>
<version>1.4.0</version>
</since>
<synopsis>
Play DTMF signal on a specific channel.
</synopsis>
@@ -98,6 +104,10 @@
</description>
</manager>
<manager name="SendFlash" language="en_US">
<since>
<version>20.3.0</version>
<version>18.18.0</version>
</since>
<synopsis>
Send a hook flash on a specific channel.
</synopsis>

View File

@@ -43,6 +43,9 @@
/*** DOCUMENTATION
<application name="SendText" language="en_US">
<since>
<version>1.0.0</version>
</since>
<synopsis>
Send a Text Message on a channel.
</synopsis>

View File

@@ -78,6 +78,20 @@
<option name="m">
<para>Mute conference.</para>
</option>
<option name="t">
<para>Post-digit timeout, in seconds. If more than this amount of time
elapses after a digit, the number will be deemed finalized and
the application will return This is useful when reading a variable
number of digits that is unknown in advance.</para>
<para>This can be almost any positive decimal number of seconds, but must
be no less than 0.6 seconds, since this is the SF inter-digit timeout.
The default is 0.8, which should be compatible with <literal>SendSF</literal>.
Values lower than 0.75 will generally produce unreliable results.</para>
<para>Note this timer only kicks in after at least one digit has been received,
to account for sender/receiver synchronization.</para>
<para>Note that <literal>RECEIVESFSTATUS</literal> will still be
set to <literal>TIMEOUT</literal> if the post-digit timer expires.</para>
</option>
<option name="q">
<para>Quelch SF from in-band.</para>
</option>
@@ -146,18 +160,35 @@
</application>
***/
/* Default post-digit timer */
#define DEFAULT_POST_DIGIT_TIMER 0.8
/* Bell System Technical Journal 39 (Nov. 1960) */
#define SF_MIN_OFF 25
#define SF_ON 67
#define SF_BETWEEN 600
#define SF_MIN_DETECT 50
enum read_option_flags {
OPT_DELAY = (1 << 0),
OPT_MUTE = (1 << 1),
OPT_QUELCH = (1 << 2),
OPT_RELAXED = (1 << 3),
OPT_EXTRAPULSES = (1 << 4),
OPT_DIGIT_TIMEOUT = (1 << 5),
};
enum {
OPT_ARG_DIGIT_TIMEOUT,
/* note: this entry _MUST_ be the last one in the enum */
OPT_ARG_ARRAY_SIZE,
};
AST_APP_OPTIONS(read_app_options, {
AST_APP_OPTION('d', OPT_DELAY),
AST_APP_OPTION('e', OPT_EXTRAPULSES),
AST_APP_OPTION('m', OPT_MUTE),
AST_APP_OPTION_ARG('t', OPT_DIGIT_TIMEOUT, OPT_ARG_DIGIT_TIMEOUT),
AST_APP_OPTION('q', OPT_QUELCH),
AST_APP_OPTION('r', OPT_RELAXED),
});
@@ -172,6 +203,7 @@ static const char sendsf_name[] = "SendSF";
* \param buf Buffer in which to store digits
* \param buflen Size of buffer
* \param timeout ms to wait for all digits before giving up
* \param digit_timeout ms to wait for the next digit before giving up
* \param maxdigits Maximum number of digits
* \param freq Frequency to use
* \param features DSP features
@@ -180,13 +212,8 @@ static const char sendsf_name[] = "SendSF";
* \retval 0 if successful
* \retval -1 if unsuccessful (including hangup).
*/
static int read_sf_digits(struct ast_channel *chan, char *buf, int buflen, int timeout, int maxdigits, int freq, int features, int extrapulses) {
/* Bell System Technical Journal 39 (Nov. 1960) */
#define SF_MIN_OFF 25
#define SF_ON 67
#define SF_BETWEEN 600
#define SF_MIN_DETECT 50
static int read_sf_digits(struct ast_channel *chan, char *buf, int buflen, int timeout, int digit_timeout, int maxdigits, int freq, int features, int extrapulses)
{
struct ast_dsp *dsp = NULL;
struct ast_frame *frame = NULL;
struct timeval start, pulsetimer, digittimer;
@@ -212,6 +239,23 @@ static int read_sf_digits(struct ast_channel *chan, char *buf, int buflen, int t
if (timeout > 0) {
remaining_time = ast_remaining_ms(start, timeout);
if (remaining_time <= 0) {
ast_debug(1, "SF all-digit timer expired\n");
pbx_builtin_setvar_helper(chan, "RECEIVESFSTATUS", "TIMEOUT");
break;
}
}
/* If we haven't received a digit yet, don't apply the post-digit timer just yet,
* since the sender may not have started sending any digits.
*
* Note that we use the digit timer, which is reset for each SF pulse,
* as opposed to simply an entire digit being received.
* This is done because we only want to expire the timer if there has been no activity
* since the last digit. If we're in the middle of receiving a digit (e.g. 0)
* we may not have a full digit yet but that should not cause an expiration. */
if (digits_read > 0 && digit_timeout > 0) {
int remaining_time_for_next_digit = ast_remaining_ms(digittimer, digit_timeout);
if (remaining_time_for_next_digit <= 0) {
ast_debug(1, "SF post-digit timer expired (>= %d ms since last SF pulse)\n", digit_timeout);
pbx_builtin_setvar_helper(chan, "RECEIVESFSTATUS", "TIMEOUT");
break;
}
@@ -261,7 +305,7 @@ static int read_sf_digits(struct ast_channel *chan, char *buf, int buflen, int t
}
} else if (hits > 0 && ast_remaining_ms(digittimer, SF_BETWEEN) <= 0) {
/* has the digit finished? */
ast_debug(2, "Received SF digit: %d\n", hits);
ast_debug(2, "Received SF digit: %d\n", hits == 10 ? 0 : hits); /* Edge case for 10, since this is the digit '0' */
digits_read++;
if (hits > 10) {
if (extrapulses) {
@@ -321,10 +365,11 @@ static int read_sf_exec(struct ast_channel *chan, const char *data)
{
#define BUFFER_SIZE 256
char tmp[BUFFER_SIZE] = "";
double tosec;
double tosec, digitsec;
struct ast_flags flags = {0};
char *opt_args[OPT_ARG_ARRAY_SIZE];
char *argcopy = NULL;
int res, features = 0, digits = 0, to = 0, freq = 2600;
int res, features = 0, digits = 0, to = 0, digit_timeout = 0, freq = 2600;
AST_DECLARE_APP_ARGS(arglist,
AST_APP_ARG(variable);
@@ -344,7 +389,7 @@ static int read_sf_exec(struct ast_channel *chan, const char *data)
AST_STANDARD_APP_ARGS(arglist, argcopy);
if (!ast_strlen_zero(arglist.options)) {
ast_app_parse_options(read_app_options, &flags, NULL, arglist.options);
ast_app_parse_options(read_app_options, &flags, opt_args, arglist.options);
}
if (!ast_strlen_zero(arglist.timeout)) {
@@ -355,6 +400,18 @@ static int read_sf_exec(struct ast_channel *chan, const char *data)
to = tosec * 1000.0;
}
}
if (ast_test_flag(&flags, OPT_DIGIT_TIMEOUT)) {
digitsec = (!ast_strlen_zero(opt_args[OPT_ARG_DIGIT_TIMEOUT]) ? atof(opt_args[OPT_ARG_DIGIT_TIMEOUT]) : DEFAULT_POST_DIGIT_TIMER);
if (digitsec <= 0) {
digit_timeout = 0;
} else {
digit_timeout = digitsec * 1000.0;
if (digit_timeout < SF_BETWEEN) {
ast_log(LOG_WARNING, "SF post-digit timer (%d) cannot be less than the SF inter-digit timeout (%d ms)\n", digit_timeout, SF_BETWEEN);
digit_timeout = SF_BETWEEN; /* If we have a shorter timeout, it won't work at all */
}
}
}
if (!ast_strlen_zero(arglist.digits) && (ast_str_to_int(arglist.digits, &digits) || digits <= 0)) {
ast_log(LOG_WARNING, "Invalid number of digits: %s\n", arglist.digits);
@@ -387,7 +444,7 @@ static int read_sf_exec(struct ast_channel *chan, const char *data)
features |= DSP_DIGITMODE_RELAXDTMF;
}
res = read_sf_digits(chan, tmp, BUFFER_SIZE, to, digits, freq, features, ast_test_flag(&flags, OPT_EXTRAPULSES));
res = read_sf_digits(chan, tmp, BUFFER_SIZE, to, digit_timeout, digits, freq, features, ast_test_flag(&flags, OPT_EXTRAPULSES));
pbx_builtin_setvar_helper(chan, arglist.variable, tmp);
if (!ast_strlen_zero(tmp)) {
ast_verb(3, "SF digits received: '%s'\n", tmp);

View File

@@ -40,6 +40,10 @@
/*** DOCUMENTATION
<application name="Signal" language="en_US">
<since>
<version>18.17.0</version>
<version>20.2.0</version>
</since>
<synopsis>
Sends a signal to any waiting channels.
</synopsis>
@@ -76,6 +80,10 @@
</see-also>
</application>
<application name="WaitForSignal" language="en_US">
<since>
<version>18.17.0</version>
<version>20.2.0</version>
</since>
<synopsis>
Waits for a named signal on a channel.
</synopsis>

Some files were not shown because too many files have changed in this diff Show More