Compare commits

...

127 Commits
master ... 20.1

Author SHA1 Message Date
Asterisk Development Team 61d8fc4c6c Update for 20.1.0 2023-01-12 06:46:01 -05:00
Asterisk Development Team 4a9f5e7ae6 Update for 20.1.0-rc2 2023-01-05 14:15:42 -05:00
George Joseph ff9ab38573 res_pjsip_transport_websocket: Add remote port to transport
When Asterisk receives a new websocket conenction, it creates a new
pjsip transport for it and copies connection data into it.  The
transport manager then uses the remote IP address and port on the
transport to create a monitor for each connection.  However, the
remote port wasn't being copied, only the IP address which meant
that the transport manager was creating only 1 monitoring entry for
all websocket connections from the same IP address. Therefore, if
one of those connections failed, it deleted the transport taking
all the the connections from that same IP address with it.

* We now copy the remote port into the created transport and the
  transport manager behaves correctly.

ASTERISK-30369

Change-Id: Ib506d40897ea6286455ac0be4dfbb0ed43b727e1
(cherry picked from commit 24102ba236)
2023-01-04 06:51:29 -06:00
Asterisk Development Team aecc5448f1 Update for 20.1.0-rc1 2022-12-15 07:55:24 -05:00
Asterisk Development Team fefc236e7c Update CHANGES and UPGRADE.txt for 20.1.0 2022-12-15 07:40:01 -05:00
Alexandre Fournier 01b3962201 res_geoloc: fix NULL pointer dereference bug
The `ast_geoloc_datastore_add_eprofile` function does not return 0 on
success, it returns the size of the underlying datastore. This means
that the datastore will be freed and its pointer set to NULL when no
error occured at all.

ASTERISK-30346

Change-Id: Iea9b209bd1244cc57b903b9496cb680c356e4bb9
2022-12-13 10:55:50 -06:00
Joshua C. Colp b6855755ce res_pjsip_aoc: Don't assume a body exists on responses.
When adding AOC to an outgoing response the code
assumed that a body would exist for comparing the
Content-Type. This isn't always true.

The code now checks to make sure the response has
a body before checking the Content-Type.

ASTERISK-21502

Change-Id: Iaead371434fc3bc693dad487228106a7d7a5ac76
2022-12-13 10:52:58 -06:00
Naveen Albert 2f9cdfbc50 app_if: Fix format truncation errors.
Fixes format truncation warnings in gcc 12.2.1.

ASTERISK-30349 #close

Change-Id: I42be4edf0284358b906e765d1966b6b9d66e1d3c
2022-12-13 08:18:08 -05:00
Michael Kuron 5c114dcb4a manager: AOC-S support for AOCMessage
ASTERISK-21502

Change-Id: I051b778f8c862d3b4794d28f2f3d782316707b08
2022-12-09 07:59:21 -06:00
Michael Kuron fee9012fe1 res_pjsip_aoc: New module for sending advice-of-charge with chan_pjsip
chan_sip supported sending AOC-D and AOC-E information in SIP INFO
messages in an "AOC" header in a format that was originally defined by
Snom. In the meantime, ETSI TS 124 647 introduced an XML-based AOC
format that is supported by devices from multiple vendors, including
Snom phones with firmware >= 8.4.2 (released in 2010).

This commit adds a new res_pjsip_aoc module that inserts AOC information
into outgoing messages or sends SIP INFO messages as described below.
It also fixes a small issue in res_pjsip_session which didn't always
call session supplements on outgoing_response.

* AOC-S in the 180/183/200 responses to an INVITE request
* AOC-S in SIP INFO (if a 200 response has already been sent or if the
  INVITE was sent by Asterisk)
* AOC-D in SIP INFO
* AOC-D in the 200 response to a BYE request (if the client hangs up)
* AOC-D in a BYE request (if Asterisk hangs up)
* AOC-E in the 200 response to a BYE request (if the client hangs up)
* AOC-E in a BYE request (if Asterisk hangs up)

The specification defines one more, AOC-S in an INVITE request, which
is not implemented here because it is not currently possible in
Asterisk to have AOC data ready at this point in call setup. Once
specifying AOC-S via the dialplan or passing it through from another
SIP channel's INVITE is possible, that might be added.

The SIP INFO requests are sent out immediately when the AOC indication
is received. The others are inserted into an appropriate outgoing
message whenever that is ready to be sent. In the latter case, the XML
is stored in a channel variable at the time the AOC indication is
received. Depending on where the AOC indications are coming from (e.g.
PRI or AMI), it may not always be possible to guarantee that the AOC-E
is available in time for the BYE.

Successfully tested AOC-D and both variants of AOC-E with a Snom D735
running firmware 10.1.127.10. It does not appear to properly support
AOC-S however, so that could only be tested by inspecting SIP traces.

ASTERISK-21502 #close
Reported-by: Matt Jordan <mjordan@digium.com>

Change-Id: Iebb7ad0d5f88526bc6629d3a1f9f11665434d333
2022-12-09 07:57:21 -06:00
Joshua C. Colp 564349ff5d ari: Destroy body variables in channel create.
When passing a JSON body to the 'create' channel route
it would be converted into Asterisk variables, but never
freed resulting in a memory leak.

This change makes it so that the variables are freed in
all cases.

ASTERISK-30344

Change-Id: I924dbd866a01c6073e2d6fb846ccaa27ef72d49d
2022-12-09 06:48:54 -06:00
Naveen Albert b9c031c1f8 app_voicemail: Fix missing email in msg_create_from_file.
msg_create_from_file currently does not dispatch emails,
which means that applications using this function, such
as MixMonitor, will not trigger notifications to users
(only AMI events are sent our currently). This is inconsistent
with other ways users can receive voicemail.

This is fixed by adding an option that attempts to send
an email and falling back to just the notifications as
done now if that fails. The existing behavior remains
the default.

ASTERISK-30283 #close

Change-Id: I597cbb9cf971a18d8776172b26ab187dc096a5c7
2022-12-09 06:45:16 -06:00
Marcel Wagner 58534b309f res_pjsip: Fix typo in from_domain documentation
This fixes a small typo in the from_domain documentation on the endpoint documentation

ASTERISK-30328 #close

Change-Id: Ia6f0897c3f5cab899ef2cde6b3ac07265b8beb21
2022-12-09 06:44:07 -06:00
Naveen Albert 531eacd6c9 res_hep: Add support for named capture agents.
Adds support for the capture agent name field
of the Homer protocol to Asterisk by allowing
users to specify a name that will be sent to
the HEP server.

ASTERISK-30322 #close

Change-Id: I6136583017f9dd08daeb8be02f60fb8df4639a2b
2022-12-08 21:31:42 -06:00
Naveen Albert b365ea8601 app_if: Adds conditional branch applications
Adds the If, ElseIf, Else, ExitIf, and EndIf
applications for conditional execution
of a block of dialplan, similar to the While,
EndWhile, and ExitWhile applications. The
appropriate branch is executed at most once
if available and may be broken out of while
inside.

ASTERISK-29497

Change-Id: I3aa3bd35a5add82465c6ee9bd86b64601f0e1f49
2022-12-08 13:57:57 -06:00
Naveen Albert 0d6003fa9a res_pjsip_session.c: Map empty extensions in INVITEs to s.
Some SIP devices use an empty extension for PLAR functionality.

Rather than rejecting these empty extensions, we now use the s
extension for such calls to mirror the existing PLAR functionality
in Asterisk (e.g. chan_dahdi).

ASTERISK-30265 #close

Change-Id: I0861a405cd49bbbf532b52f7b47f0e2810832590
2022-12-08 13:56:38 -06:00
Marcel Wagner b83af13f65 res_pjsip: Update contact_user to point out default
Updates the documentation for the 'contact_user' field to point out the
default outbound contact if no contact_user is specified 's'

ASTERISK-30316 #close

Change-Id: I61f24fb9164e4d07e05908a2511805281874c876
2022-12-08 12:39:46 -06:00
Naveen Albert 80e6205bb0 res_adsi: Fix major regression caused by media format rearchitecture.
The commit that rearchitected media formats,
a2c912e997 (ASTERISK_23114)
introduced a regression by improperly translating code in res_adsi.c.
In particular, the pointer to the frame buffer was initialized
at the top of adsi_careful_send, rather than dynamically updating it
for each frame, as is required.

This resulted in the first frame being repeatedly sent,
rather than advancing through the frames.
This corrupted the transmission of the CAS to the CPE,
which meant that CPE would never respond with the DTMF acknowledgment,
effectively completely breaking ADSI functionality.

This issue is now fixed, and ADSI now works properly again.

ASTERISK-29793 #close

Change-Id: Icdeddf733eda2981c98712d1ac9cddc0db507dbe
2022-12-08 12:37:12 -06:00
Naveen Albert 406143ae61 res_pjsip_header_funcs: Add custom parameter support.
Adds support for custom URI and header parameters
in the From header in PJSIP. Parameters can be
both set and read using this function.

ASTERISK-30150 #close

Change-Id: Ifb1bc3c512ad5f6faeaebd7817f004a2ecbd6428
2022-12-08 12:25:26 -06:00
Naveen Albert 83eb113e0f func_presencestate: Fix invalid memory access.
When parsing information from AstDB while loading,
it is possible that certain pointers are never
set, which leads to invalid memory access and
then, fatally, invalid free attempts on this memory.
We now initialize to NULL to prevent this.

ASTERISK-30311 #close

Change-Id: I6120681d04fd2c12a9473f35ce95a1f8e74e3929
2022-12-08 10:21:26 -06:00
Naveen Albert b90e57758b sig_analog: Fix no timeout duration.
ASTERISK_28702 previously attempted to fix an
issue with flash hook hold timing out after
just under 17 minutes, when it should have never
been timing out. It fixed this by changing 999999
to INT_MAX, but it did so in chan_dahdi, which
is the wrong place since ss_thread is now in
sig_analog and the one in chan_dahdi is mostly
dead code.

This fixes this by porting the fix to sig_analog.

ASTERISK-30336 #close

Change-Id: I05eb69cc0b5319d357842a70bd26ef64d145cb15
2022-12-08 10:13:47 -06:00
Naveen Albert 52c7d3ed07 xmldoc: Allow XML docs to be reloaded.
The XML docs are currently only loaded on
startup with no way to update them during runtime.
This makes it impossible to load modules that
use ACO/Sorcery (which require documentation)
if they are added to the source tree and built while
Asterisk is running (e.g. external modules).

This adds a CLI command to reload the XML docs
during runtime so that documentation can be updated
without a full restart of Asterisk.

ASTERISK-30289 #close

Change-Id: I4f265b0e5517e757c5453a0f241201a5788d3a07
2022-12-08 09:17:26 -06:00
Naveen Albert a4bcdce1db rtp_engine.h: Update examples using ast_format_set.
This file includes some doxygen comments referencing
ast_format_set. This is an obsolete API that was
removed years back, but documentation was not fully
updated to reflect that. These examples are
updated to the current way of doing things
(using the format cache).

ASTERISK-30327 #close

Change-Id: I570f3b8007fa17ba470cc7117f44bfe7c555d2f7
2022-12-08 09:17:18 -06:00
Naveen Albert 691178c48e app_mixmonitor: Add option to use real Caller ID for voicemail.
MixMonitor currently uses the Connected Line as the Caller ID
for voicemails. This is due to the implementation being written
this way for use with Digium phones. However, in general this
is not correct for generic usage in the dialplan, and people
may need the real Caller ID instead. This adds an option to do that.

ASTERISK-30286 #close

Change-Id: I3d0ce76dfe75e2a614e0f709ab27acbd2478267c
2022-12-08 08:04:35 -06:00
Ben Ford d476994768 pjproject: 2.13 security fixes
Backports two security fixes (c4d3498 and 450baca) from pjproject 2.13.

ASTERISK-30338

Change-Id: I86fdc003d5d22cb66e7cc6dc3313a8194f27eb69
2022-12-03 10:26:40 -06:00
George Joseph 7684c9e907 pjsip_transport_events: Fix possible use after free on transport
It was possible for a module that registered for transport monitor
events to pass in a pjsip_transport that had already been freed.
This caused pjsip_transport_events to crash when looking up the
monitor for the transport.  The fix is a two pronged approach.

1. We now increment the reference count on pjsip_transports when we
create monitors for them, then decrement the count when the
transport is going to be destroyed.

2. There are now APIs to register and unregister monitor callbacks
by "transport key" which is a string concatenation of the remote ip
address and port.  This way the module needing to monitor the
transport doesn't have to hold on to the transport object itself to
unregister.  It just has to save the transport_key.

* Added the pjsip_transport reference increment and decrement.

* Changed the internal transport monitor container key from the
  transport->obj_name (which may not be unique anyway) to the
  transport_key.

* Added a helper macro AST_SIP_MAKE_REMOTE_IPADDR_PORT_STR() that
  fills a buffer with the transport_key using a passed-in
  pjsip_transport.

* Added the following functions:
  ast_sip_transport_monitor_register_key
  ast_sip_transport_monitor_register_replace_key
  ast_sip_transport_monitor_unregister_key
  and marked their non-key counterparts as deprecated.

* Updated res_pjsip_pubsub and res_pjsip_outbound_register to use
  the new "key" monitor functions.

NOTE: res_pjsip_registrar also uses the transport monitor
functionality but doesn't have a persistent object other than
contact to store a transport key.  At this time, it continues to
use the non-key monitor functions.

ASTERISK-30244

Change-Id: I1a20baf2a8643c272dcf819871d6c395f148f00b
2022-12-03 10:24:36 -06:00
Mike Bradeen 81f10e847e manager: prevent file access outside of config dir
Add live_dangerously flag to manager and use this flag to
determine if a configuation file outside of AST_CONFIG_DIR
should be read.

ASTERISK-30176

Change-Id: I46b26af4047433b49ae5c8a85cb8cda806a07404
2022-12-03 10:22:18 -06:00
Mike Bradeen eb1d7ab53c ooh323c: not checking for IE minimum length
When decoding q.931 encoded calling/called number
now checking for length being less than minimum required.

ASTERISK-30103

Change-Id: I3dcfce0f35eca258dc450f87c92d4d7af402c2e7
2022-12-01 11:11:42 -06:00
Naveen Albert c7df5ee7c1 pbx_builtins: Allow Answer to return immediately.
The Answer application currently waits for up to 500ms
for media, even if users specify a different timeout.

This adds an option to not wait for media on the channel
by doing a raw answer instead. The default 500ms threshold
is also documented.

ASTERISK-30308 #close

Change-Id: Id59cd340c44b8b8b2384c479e17e5123e917cba4
2022-11-29 09:23:49 -06:00
Naveen Albert 5ede4e217a chan_dahdi: Allow FXO channels to start immediately.
Currently, chan_dahdi will wait for at least one
ring before an incoming call can enter the dialplan.
This is generally necessary in order to receive
the Caller ID spill and/or distinctive ringing
detection.

However, if neither of these is required, then there
is nothing gained by waiting for one ring and this
unnecessarily delays call setup. Users can now
use immediate=yes to make FXO channels (FXS signaled)
begin processing dialplan as soon as Asterisk receives
the call.

ASTERISK-30305 #close

Change-Id: I20818b370b2e4892c7f40c8a8753fa06a81750b5
2022-11-29 08:29:21 -06:00
Maximilian Fridrich 60b81eabe0 core & res_pjsip: Improve topology change handling.
This PR contains two relatively separate changes in channel.c and
res_pjsip_session.c which ensure that topology changes are not ignored
in cases where they should be handled.

For channel.c:

The function ast_channel_request_stream_topology_change only triggers a
stream topology request change indication, if the channel's topology
does not equal the requested topology. However, a channel could be in a
state where it is currently "negotiating" a new topology but hasn't
updated it yet, so the topology request change would be lost. Channels
need to be able to handle such situations internally and stream
topology requests should therefore always be passed on.

In the case of chan_pjsip for example, it queues a session refresh
(re-INVITE) if it is currently in the middle of a transaction or has
pending requests (among other reasons).

Now, ast_channel_request_stream_topology_change always indicates a
stream topology request change even if the requested topology equals the
channel's topology.

For res_pjsip_session.c:

The function resolve_refresh_media_states does not process stream state
changes if the delayed active state differs from the current active
state. I.e. if the currently active stream state has changed between the
time the sip session refresh request was queued and the time it is being
processed, the session refresh is ignored. However, res_pjsip_session
contains logic that ensures that session refreshes are queued and
re-queued correctly if a session refresh is currently not possible. So
this check is not necessary and led to some session refreshes being
lost.

Now, a session refresh is done even if the delayed active state differs
from the current active state and it is checked whether the delayed
pending state differs from the current active - because that means a
refresh is necessary.

Further, the unit test of resolve_refresh_media_states was adapted to
reflect the new behavior. I.e. the changes to delayed pending are
prioritized over the changes to current active because we want to
preserve the original intention of the pending state.

ASTERISK-30184

Change-Id: Icd0703295271089057717006730b555b9a1d4e5a
2022-11-29 08:23:49 -06:00
Naveen Albert 2efa290d3c sla: Prevent deadlock and crash due to autoservicing.
SLAStation currently autoservices the station channel before
creating a thread to actually dial the trunk. This leads
to duplicate servicing of the channel which causes assertions,
deadlocks, crashes, and moreover not the correct behavior.

Removing the autoservice prevents the crash, but if the station
hangs up before the trunk answers, the call hangs since the hangup
was never serviced on the channel.

This is fixed by not autoservicing the channel, but instead
servicing it in the thread dialing the trunk, since it is doing
so synchronously to begin with. Instead of sleeping for 100ms
in a loop, we simply use the channel for timing, and abort
if it disappears.

The same issue also occurs with SLATrunk when a call is answered,
because ast_answer invokes ast_waitfor_nandfds. Thus, we use
ast_raw_answer instead which does not cause any conflict and allows
the call to be answered normally without thread blocking issues.

ASTERISK-29998 #close

Change-Id: Icc237d50354b5910000d2305901e86d2c87bb9d8
2022-11-28 08:54:30 -06:00
Jaco Kroon ce2153fc5a Build system: Avoid executable stack.
Found in res_geolocation, but I believe others may have similar issues,
thus not linking to a specific issue.

Essentially gcc doesn't mark the stack for being non-executable unless
it's compiling the source, this informs ld via gcc to mark the object as
not requiring an executable stack (which a binary blob obviously
doesn't).

ASTERISK-30321

Change-Id: I71bcc2fd1fe0c82a28b3257405d6f2b566fd9bfc
Signed-off-by: Jaco Kroon <jaco@uls.co.za>
2022-11-21 08:52:49 -06:00
Naveen Albert 002afc3f2a func_json: Fix memory leak.
A memory leak was present in func_json due to
using ast_json_free, which just calls ast_free,
as opposed to recursively freeing the JSON
object as needed. This is now fixed to use the
right free functions.

ASTERISK-30293 #close

Change-Id: I982324dde841dc9147c8d8ad35c8719daf418b49
2022-11-21 08:29:40 -06:00
Naveen Albert 1e77b8c473 test_json: Remove duplicated static function.
Removes the function mkstemp_file and uses
ast_file_mkftemp from file.h instead.

ASTERISK-30295 #close

Change-Id: I7412ec06f88c39ee353bcdb8c976c2fcac546609
2022-11-21 07:43:38 -06:00
Joshua C. Colp 61922d2934 res_agi: Respect "transmit_silence" option for "RECORD FILE".
The "RECORD FILE" command in res_agi has its own
implementation for actually doing the recording. This
has resulted in it not actually obeying the option
"transmit_silence" when recording.

This change causes it to now send silence if the
option is enabled.

ASTERISK-30314

Change-Id: Ib3a85601ff35d1b904f836691bad8a4b7e957174
2022-11-16 06:43:41 -05:00
Naveen Albert 6e59b01e1a app_mixmonitor: Add option to delete files on exit.
Adds an option that allows MixMonitor to delete
its copy of any recording files before exiting.

This can be handy in conjunction with options
like m, which copy the file elsewhere, and the
original files may no longer be needed.

ASTERISK-30284 #close

Change-Id: Ida093679c67e300efc154a97b6d8ec0f104e581e
2022-11-08 13:46:50 -06:00
Naveen Albert 49cfdbbdff manager: Update ModuleCheck documentation.
The ModuleCheck XML documentation falsely
claims that the module's version number is returned.
This has not been the case since 14, since the version
number is not available anymore, but the documentation
was not changed at the time. It is now updated to
reflect this.

ASTERISK-30285 #close

Change-Id: Idde2d1205a11f2623fa1ddab192faa3dc4081e91
2022-11-08 08:16:53 -06:00
Naveen Albert 8142b313c3 file.c: Don't emit warnings on winks.
Adds an ignore case for wink since it should
pass through with no warning.

ASTERISK-30290 #close

Change-Id: Ieb7e34daa717357ac5c93efb0059f6c2321f16ad
2022-11-06 11:51:02 -05:00
George Joseph 0c1c623dee runUnittests.sh: Save coredumps to proper directory
Fixed the specification of "outputdir" when calling ast_coredumper
so the txt files are saved in the correct place.

ASTERISK-30282

Change-Id: Ic631cb90c1e4c29d970c982dff45fda5e0eb15b6
2022-11-02 12:02:55 -05:00
Naveen Albert dfe2f38642 app_stack: Print proper exit location for PBXless channels.
When gosub is executed on channels without a PBX, the context,
extension, and priority are initialized to the channel driver's
default location for that endpoint. As a result, the last Return
will restore this location and the Gosub logs will print out bogus
information about our exit point.

To fix this, on channels that don't have a PBX, the execution
location is left intact on the last return if there are no
further stack frames left. This allows the correct location
to be printed out to the user, rather than the bogus default
context.

ASTERISK-30076 #close

Change-Id: I1d42a99c9aa9e3708d32718863175158a894e414
2022-11-02 10:50:27 -05:00
George Joseph f723b465e5 chan_rtp: Make usage of ast_rtp_instance_get_local_address clearer
unicast_rtp_request() was setting the channel variables like this:

pbx_builtin_setvar_helper(chan, "UNICASTRTP_LOCAL_ADDRESS",
    ast_sockaddr_stringify_addr(&local_address));
ast_rtp_instance_get_local_address(instance, &local_address);
pbx_builtin_setvar_helper(chan, "UNICASTRTP_LOCAL_PORT",
    ast_sockaddr_stringify_port(&local_address));

...which made it appear that UNICASTRTP_LOCAL_ADDRESS was being
set before local_address was set.  In fact, the address part of
local_address was set earlier in the function, just not the port.
This was confusing however so ast_rtp_instance_get_local_address()
is now being called before setting UNICASTRTP_LOCAL_ADDRESS.

ASTERISK-30281

Change-Id: I872ac49477100f4eb33891d46efc6ca21ec81aa4
2022-11-02 08:55:51 -05:00
Mike Bradeen 50e2921a48 res_pjsip: prevent crash on websocket disconnect
When a websocket (or potentially any stateful connection) is quickly
created then destroyed, it is possible that the qualify thread will
destroy the transaction before the initialzing thread is finished
with it.

Depending on the timing, this can cause an assertion within pjsip.

To prevent this, ast_send_stateful_response will now create the group
lock and add a reference to it before creating the transaction.

While this should resolve the crash, there is still the potential that
the contact will not be cleaned up properly, see:ASTERISK~29286. As a
result, the contact has to 'time out' before it will be removed.

ASTERISK-28689

Change-Id: Id050fded2247a04d8f0fc5b8a2cf3e5482cb8cee
2022-10-31 10:09:39 -05:00
Naveen Albert afd86b47c1 tcptls: Prevent crash when freeing OpenSSL errors.
write_openssl_error_to_log has been erroneously
using ast_free instead of free, which will
cause a crash when MALLOC_DEBUG is enabled since
the memory was not allocated by Asterisk's memory
manager. This changes it to use the actual free
function directly to avoid this.

ASTERISK-30278 #close

Change-Id: Iac8b6468b718075809c45d8ad16b101af21a474d
2022-10-31 09:41:52 -05:00
Igor Goncharovsky 096529d33f res_pjsip_outbound_registration: Allow to use multiple proxies for registration
Current registration code use pjsip_parse_uri to verify outbound_proxy
that is different from the reading this option for the endpoint. This
made value with multiple proxies invalid for registration pjsip settings.
Removing URI validation helps to use registration through multiple proxies.

ASTERISK-30217 #close

Change-Id: I064558e66f04b9f3260c46181812a01349761357
2022-10-28 11:38:41 -05:00
Naveen Albert ca8900b0f6 tests: Fix compilation errors on 32-bit.
Fix compilation errors caused by using size_t
instead of uintmax_t and non-portable format
specifiers.

ASTERISK-30273 #close

Change-Id: I363e6057ef84d54b88af80d23ad6147eef9216ee
2022-10-27 14:29:45 -05:00
Henning Westerholt 12445040d3 res_pjsip: return all codecs on a re-INVITE without SDP
Currently chan_pjsip on receiving a re-INVITE without SDP will only
return the codecs that are previously negotiated and not offering
all enabled codecs.

This causes interoperability issues with different equipment (e.g.
from Cisco) for some of our customers and probably also in other
scenarios involving 3PCC infrastructure.

According to RFC 3261, section 14.2 we SHOULD return all codecs
on a re-INVITE without SDP

The PR proposes a new parameter to configure this behaviour:
all_codecs_on_empty_reinvite. It includes the code, documentation,
alembic migrations, CHANGES file and example configuration additions.

ASTERISK-30193 #close

Change-Id: I69763708d5039d512f391e296ee8a4d43a1e2148
2022-10-27 11:22:20 -05:00
Naveen Albert 40b52322e5 res_pjsip_notify: Add option support for AMI.
The PJSIP notify CLI commands allow for using
"options" configured in pjsip_notify.conf.

This allows these same options to be used in
AMI actions as well.

Additionally, as part of this improvement,
some repetitive common code is refactored.

ASTERISK-30263 #close

Change-Id: Ie4496b322b63b61eaf9672183a959ab99a04b6b5
2022-10-27 10:07:20 -05:00
Naveen Albert c32b39d123 res_pjsip_logger: Add method-based logging option.
Expands the pjsip logger to support the ability to filter
by SIP message method. This can make certain types of SIP debugging
easier by only logging messages of particular method(s).

ASTERISK-30146 #close

Co-authored-by: Sean Bright <sean@seanbright.com>
Change-Id: I9c8cbb6fc8686ef21190eb42e08bc9a9b147707f
2022-10-27 09:00:29 -05:00
Frederic LE FOLL 50a4495799 Dialing API: Cancel a running async thread, may not cancel all calls
race condition: ast_dial_join() may not cancel outgoing call, if
function is called just after called party answer and before
application execution (bit is_running_app not yet set).

This fix adds ast_softhangup() calls in addition to existing
pthread_kill() when is_running_app is not set.

ASTERISK-30258

Change-Id: Idbdd5c15122159661aa8e996a42d5800083131e4
2022-10-27 07:52:12 -05:00
Naveen Albert 180ca32565 chan_dahdi: Fix unavailable channels returning busy.
This fixes dahdi_request to properly set the cause
code to CONGESTION instead of BUSY if no channels
were actually available.

Currently, the cause is erroneously set to busy
if the channel itself is found, regardless of its
current state. However, if the channel is not available
(e.g. T1 down, card not operable, etc.), then the
channel itself may not be in a functional state,
in which case CHANUNAVAIL is the correct cause to use.

This adds a simple check to ensure that busy tone
is only returned if a channel is encountered that
has an owner, since that is the only possible way
that a channel could actually be busy.

ASTERISK-30274 #close

Change-Id: Iad5870223c081240c925b19df8d6af136953b994
2022-10-26 11:14:25 -05:00
Naveen Albert 9258d8212a res_pjsip_pubsub: Prevent removing subscriptions.
pjproject does not provide any mechanism of removing
event packages, which means that once a subscription
handler is registered, it is effectively permanent.

pjproject will assert if the same event package is
ever registered again, so currently unloading and
loading any Asterisk modules that use subscriptions
will cause a crash that is beyond our control.

For that reason, we now prevent users from being
able to unload these modules, to prevent them
from ever being loaded twice.

ASTERISK-30264 #close

Change-Id: I7fdcb1a5e44d38b7ba10c44259fe98f0ae9bc12c
2022-10-26 09:08:17 -05:00
Naveen Albert 407216a0a5 say: Don't prepend ampersand erroneously.
Some logic in say.c for determining if we need
to also add an ampersand for file seperation was faulty,
as non-successful files would increment the count, causing
a leading ampersand to be added improperly.

This is fixed, and a unit test that captures this regression
is also added.

ASTERISK-30248 #close

Change-Id: I02c1d3a11d82fe4ea8b462070cbd1effb5834d2b
2022-10-26 07:48:17 -05:00
Philip Prindeville d0bea5a725 res_crypto: handle unsafe private key files
ASTERISK-30213 #close

Change-Id: I4a77143d41615b7c4fc25bb1251c0a9cb87b417a
2022-10-14 10:01:06 -05:00
Mike Bradeen 907d7e7d7d audiohook: add directional awareness
Add enum to allow setting optional direction. If set to only one
direction, only feed matching-direction frames to the associated
slin factory.

This prevents mangling the transcoder on non-mixed frames when the
READ and WRITE frames would have otherwise required it.  Also
removes the need to mute or discard the un-wanted frames as they
are no longer added in the first place.

res_stasis_snoop is changed to use this addition to set direction
on audiohook based on spy direction.

If no direction is set, the ast_audiohook_init will init this enum
to BOTH which maintains existing functionality.

ASTERISK-30252

Change-Id: If8716bad334562a5d812be4eeb2a92e4f3be28eb
2022-10-11 08:13:18 -05:00
Naveen Albert b331caca30 cdr: Allow bridging and dial state changes to be ignored.
Allows bridging, parking, and dial messages to be globally
ignored for all CDRs such that only a single CDR record
is generated per channel.

This is useful when CDRs should endure for the lifetime of
an entire channel and bridging and dial updates in the
dialplan should not result in multiple CDR records being
created for the call. With the ignore bridging option,
bridging changes have no impact on the channel's CDRs.
With the ignore dial state option, multiple Dials and their
outcomes have no impact on the channel's CDRs. The
last disposition on the channel is preserved in the CDR,
so the actual disposition of the call remains available.

These two options can reduce the amount of "CDR hacks" that
have hitherto been necessary to ensure that CDR was not
"spoiled" by these messages if that was undesired, such as
putting a dummy optimization-disabled local channel between
the caller and the actual call and putting the CDR on the channel
in the middle to ensure that CDR would persist for the entire
call and properly record start, answer, and end times.
Enabling these options is desirable when calls correspond
to the entire lifetime of channels and the CDR should
reflect that.

Current default behavior remains unchanged.

ASTERISK-30091 #close

Change-Id: I393981af42732ec5ac3ff9266444abb453b7c832
2022-10-10 12:06:36 -05:00
Naveen Albert e0e7f35730 res_tonedetect: Add ringback support to TONE_DETECT.
Adds support for detecting audible ringback tone
to the TONE_DETECT function using the p option.

ASTERISK-30254 #close

Change-Id: Ie2329ff245248768367d26749c285fbe823f6414
2022-10-10 12:04:33 -05:00
Naveen Albert 98fc05f13b chan_dahdi: Resolve format truncation warning.
Fixes a format truncation warning in notify_message.

ASTERISK-30256 #close

Change-Id: I983a423c0214641ca4f8c9dfe0b19c47448fdee1
2022-10-10 10:31:13 -05:00
Philip Prindeville ef74ecacc7 res_crypto: don't modify fname in try_load_key()
"fname" is passed in as a const char *, but strstr() mangles that
into a char *, and we were attempting to modify the string in place.
This is an unwanted (and undocumented) side-effect.

ASTERISK-30213

Change-Id: Ifa36d352aafeb7f9beec3f746332865c7d21e629
2022-10-10 10:13:41 -05:00
Philip Prindeville 5e2485b5c0 res_crypto: use ast_file_read_dirs() to iterate
ASTERISK-30213

Change-Id: I115f5f8942ffcfb23cd2559a55bac8a2eba081e0
2022-10-10 10:11:15 -05:00
George Joseph 2a500b325a res_geolocation: Update wiki documentation
Also added a note to the geolocation.conf.sample file
and added a README to the res/res_geolocation/wiki
directory.

Change-Id: I89c3c5db8c0701b33127993622d5e4f904bddfbc
2022-10-10 07:31:43 -05:00
Maximilian Fridrich 0d2e140123 res_pjsip: Add mediasec capabilities.
This patch adds support for mediasec SIP headers and SDP attributes.
These are defined in RFC 3329, 3GPP TS 24.229 and
draft-dawes-sipcore-mediasec-parameter. The new features are
implemented so that a backbone for RFC 3329 is present to streamline
future work on RFC 3329.

With this patch, Asterisk can communicate with Deutsche Telekom trunks
which require these fields.

ASTERISK-30032

Change-Id: Ia7f5b5ba42db18074fdd5428c4e1838728586be2
2022-09-29 04:10:48 -05:00
Asterisk Development Team 7f80830ced Update CHANGES and UPGRADE.txt for 20.0.0 2022-09-28 07:44:57 -05:00
Holger Hans Peter Freyther 62881c668b res_prometheus: Do not crash on invisible bridges
Avoid crashing by skipping invisible bridges and checking the
snapshot for a null pointer. In effect this is how the bridges
are enumerated in res/ari/resource_bridges.c already.

ASTERISK-30239
ASTERISK-30237

Change-Id: I58ef9f44036feded5966b5fc70ae754f8182883d
2022-09-26 19:27:58 -05:00
Naveen Albert 8afb313a43 res_pjsip_geolocation: Change some notices to debugs.
If geolocation is not in use for an endpoint, the NOTICE
log level is currently spammed with messages about this,
even though nothing is wrong and these messages provide
no real value. These log messages are therefore changed
to debugs.

ASTERISK-30241 #close

Change-Id: I656b355d812f67cc0f0fdf09b00b0e1458598bb4
2022-09-26 15:03:32 -05:00
Naveen Albert 7335b0cffe db: Fix incorrect DB tree count for AMI.
The DBGetTree AMI action's ListItem previously
always reported 1, regardless of the count. This
is corrected to report the actual count.

ASTERISK-30245 #close
patches:
  gettreecount.diff submitted by Birger Harzenetter (license 5870)

Change-Id: I46d8992710f1b8524426b1255f57d1ef4a4934d4
2022-09-26 14:11:17 -05:00
Naveen Albert 407167cc28 func_logic: Don't emit warning if both IF branches are empty.
The IF function currently emits warnings if both IF branches
are empty. However, there is no actual necessity that either
branch be non-empty as, unlike other conditional applications/
functions, nothing is inherently done with IF, and both
sides could legitimately be empty. The warning is thus turned
into a debug message.

ASTERISK-30243 #close

Change-Id: I5250625dd720f95e1859b5dfb933905d7e7a730e
2022-09-26 12:20:21 -05:00
Naveen Albert a5ec60e6c6 features: Add no answer option to Bridge.
Adds the n "no answer" option to the Bridge application
so that answer supervision can not automatically
be provided when Bridge is executed.

Additionally, a mechanism (dialplan variable)
is added to prevent bridge targets (typically the
target of a masquerade) from answering the channel
when they enter the bridge.

ASTERISK-30223 #close

Change-Id: I76f73fcd8e403bcd18f2abb40c658f537ac1ba6d
2022-09-26 11:44:20 -05:00
Naveen Albert 1e29607b5c app_bridgewait: Add option to not answer channel.
Adds the n option to not answer the channel when calling
BridgeWait, so the application can be used without
forcing answer supervision.

ASTERISK-30216 #close

Change-Id: I6b85ef300b1f7b5170f8537e2b10889cc2e6605a
2022-09-26 10:41:46 -05:00
Naveen Albert 8c791f9a65 app_amd: Add option to play audio during AMD.
Adds an option that will play an audio file
to the party while AMD is running on the
channel, so the called party does not just
hear silence.

ASTERISK-30179 #close

Change-Id: I4af306274552b61b3d9f0883c33f698abd4699b6
2022-09-26 09:43:14 -05:00
Philip Prindeville 3e7ce90f9c test: initialize capture structure before freeing
ASTERISK-30232 #close

Change-Id: I2603e2cef8f93f6b0a6ef39f7eac744251bb3902
2022-09-26 09:40:26 -05:00
Naveen Albert 1ed4518328 func_export: Add EXPORT function
Adds the EXPORT function, which allows write
access to variables and functions on other
channels.

ASTERISK-29432 #close

Change-Id: I7492645ae4307553d0f586d78e13a4f586231fdf
2022-09-26 07:53:20 -05:00
Maximilian Fridrich 5bbad0d27c res_pjsip: Add 100rel option "peer_supported".
This patch adds a new option to the 100rel parameter for pjsip
endpoints called "peer_supported". When an endpoint with this option
receives an incoming request and the request indicated support for the
100rel extension, then Asterisk will send 1xx responses reliably. If
the request did not indicate 100rel support, Asterisk sends 1xx
responses normally.

ASTERISK-30158

Change-Id: Id6d95ffa8f00dab118e0b386146e99f254f287ad
2022-09-22 18:39:50 -05:00
Naveen Albert 8aae0b9f08 func_scramble: Fix null pointer dereference.
Fix segfault due to null pointer dereference
inside the audiohook callback.

ASTERISK-30220 #close

Change-Id: Ideb80f606974366e89d619d908744230b5a5a259
2022-09-22 11:26:09 -05:00
Jaco Kroon 278c5726ca manager: be more aggressive about purging http sessions.
If we find that n_max (currently hard wired to 1) sessions were purged,
schedule the next purge for 1ms into the future rather than 5000ms (as
per current).  This way we will purge up to 1000 sessions per second
rather than 1 every 5 seconds.

This mitigates a build-up of sessions should http sessions gets
established faster than 1 per 5 seconds.

Change-Id: I9820d39aa080109df44fe98c1325cafae48d54f5
Signed-off-by: Jaco Kroon <jaco@uls.co.za>
2022-09-22 11:11:40 -05:00
Naveen Albert ab1dbfef75 func_strings: Add trim functions.
Adds TRIM, LTRIM, and RTRIM, which can be used
for trimming leading and trailing whitespace
from strings.

ASTERISK-30222 #close

Change-Id: I50fb0c40726d044a7a41939fa9026f3da4872554
2022-09-22 05:49:00 -05:00
George Joseph e25b690d10 res_crypto: Memory issues and uninitialized variable errors
ASTERISK-30235

Change-Id: Ia1e326e7b52cd06fd5e6c9009e3e63193c92f6cd
2022-09-19 05:32:32 -06:00
George Joseph e33f2dcc0f res_geolocation: Fix issues exposed by compiling with -O2
Fixed "may be used uninitialized" errors in geoloc_config.c.

ASTERISK-30234

Change-Id: I1ea336bf7abbc16fa59b75720f0db8f1d960b3d4
2022-09-16 08:42:26 -06:00
Philip Prindeville 026dc08529 res_crypto: don't complain about directories
ASTERISK-30226 #close

Change-Id: I5695fb0c9521f112f754b8362cff2a8f3eff05c5
2022-09-14 23:16:37 -06:00
Asterisk Development Team f01ed3eea4 Update CHANGES and UPGRADE.txt for 20.0.0 2022-09-14 09:25:44 -05:00
Mike Bradeen 7a44296ca9 res_pjsip: Add user=phone on From and PAID for usereqphone=yes
Adding user=phone to local-side uri's when user_eq_phone=yes is set for
an endpoint. Previously this would only add the header to the To and R-URI.

ASTERISK-30178

Change-Id: Id3bfb5d225d762e7d2668c023fe09e4541ae8600
2022-09-14 07:20:22 -05:00
George Joseph 8cbea1c7ef res_geolocation: Fix segfault when there's an empty element
Fixed a segfault caused by var_list_from_loc_info() encountering
an empty location info element.

Fixed an issue in ast_strsep() where a value with only whitespace
wasn't being preserved.

Fixed an issue in ast_variable_list_from_quoted_string() where
an empty value was considered a failure.

ASTERISK-30215
Reported by: Dan Cropp

Change-Id: Ieca64e061a6d9298f0196c694b60d986ef82613a
2022-09-13 09:51:25 -05:00
sungtae kim 80bc844fd6 res_musiconhold: Add option to not play music on hold on unanswered channels
This change adds an option, answeredonly, that will prevent music on
hold on channels that are not answered.

ASTERISK-30135

Change-Id: I1ab0defa43a29a26ae39f94c623596cf90fddc08
2022-09-13 05:46:48 -05:00
Ben Ford 881a3f2306 res_pjsip: Add TEL URI support for basic calls.
This change allows TEL URI requests to come through for basic calls. The
allowed requests are INVITE, ACK, BYE, and CANCEL. The From and To
headers will now allow TEL URIs, as well as the request URI.

Support is only for TEL URIs present in traffic from a remote party.
Asterisk does not generate any TEL URIs on its own.

ASTERISK-26894

Change-Id: If5729e6cd583be7acf666373bf9f1b9d653ec29a
2022-09-13 04:51:00 -05:00
Philip Prindeville 3e054c9ebc res_crypto: Use EVP API's instead of legacy API's
ASTERISK-30046 #close

Change-Id: I5c738756de75fd27ebad54be144c0ac6193f21b2
2022-09-12 16:19:37 -05:00
Philip Prindeville 736cdf84f4 test: Add coverage for res_crypto
We're validating the following functionality:

encrypting a block of data with RSA
decrypting a block of data with RSA
signing a block of data with RSA
verifying a signature with RSA
encrypting a block of data with AES-ECB
encrypting a block of data with AES-ECB

as well as accessing test keys from the keystore.

ASTERISK-30045 #close

Change-Id: I0d10e7b41009c5290a4356c6480e636712d5c96d
2022-09-12 16:18:19 -05:00
Philip Prindeville 2d7656cb50 res_crypto: make keys reloadable on demand for testing
ASTERISK-30045

Change-Id: If59bbb50c1771084bfe2fef307a6077c90d35ce8
2022-09-12 13:08:49 -05:00
Philip Prindeville 5809d879b0 test: Add test coverage for capture child process output
ASTERISK-30037 #close

Change-Id: I0273e85eeeb6b8e46703f24cd74d84f3daf0a69a
2022-09-12 11:23:04 -05:00
Philip Prindeville 2c4c44ca64 main/utils: allow checking for command in $PATH
ASTERISK-30037

Change-Id: I4b6f7264c8c737c476c798d2352f3232b263bbdf
2022-09-12 09:49:21 -05:00
Philip Prindeville b9df2c481b test: Add ability to capture child process output
ASTERISK-30037

Change-Id: Icbf84ce05addb197a458361c35d784e460d8d6c2
2022-09-12 08:15:27 -05:00
Philip Prindeville d13afaf302 res_crypto: Don't load non-regular files in keys directory
ASTERISK-30046

Change-Id: Ie77e0648f8b0b1c2159fb24662d1989cfd4cc36d
2022-09-12 07:55:33 -05:00
Naveen Albert 2dac2bf8dc func_frame_trace: Remove bogus assertion.
The FRAME_TRACE function currently asserts if it sees
a MASQUERADE_NOTIFY. However, this is a legitimate thing
that can happen so asserting is inappropriate, as there
are no clear negative ramifications of such a thing. This
is adjusted to be like the other frames to print out
the subclass.

ASTERISK-30210 #close

Change-Id: I8ecbdcf17e35f64bdeab42868471f581ad1d1a56
2022-09-11 18:04:59 -05:00
Naveen Albert c487425620 lock.c: Add AMI event for deadlocks.
Adds an AMI event to indicate that a deadlock
has likely started, when Asterisk is compiled
with DETECT_DEADLOCKS enabled. This can make
it easier to perform automated deadlock detection
and take appropriate action (such as doing a core
dump). Unlike the deadlock warnings, the AMI event
is emitted only once per deadlock.

ASTERISK-30161 #close

Change-Id: Ifc6ed3e390f8b4cff7f8077a50e4d7a5b54e42fb
2022-09-11 18:02:24 -05:00
Naveen Albert 205c7c8d21 app_confbridge: Add end_marked_any option.
Adds the end_marked_any option, which can be used
to kick a user from a conference if any marked user
leaves.

ASTERISK-30211 #close

Change-Id: I9e8da7ccb892e522546c0f2b5476d172e022c2f5
2022-09-11 16:22:18 -05:00
Naveen Albert 2de016b181 pbx_variables: Use const char if possible.
Use const char for char arguments to
pbx_substitute_variables_helper_full_location
that can do so (context and exten).

ASTERISK-30209 #close

Change-Id: I001357177e9c3dca2b2b4eebc5650c1095b3da6f
2022-09-11 08:33:06 -05:00
George Joseph 05f42806cc res_geolocation: Add two new options to GEOLOC_PROFILE
Added an 'a' option to the GEOLOC_PROFILE function to allow
variable lists like location_info_refinement to be appended
to instead of replacing the entire list.

Added an 'r' option to the GEOLOC_PROFILE function to resolve all
variables before a read operation and after a Set operation.

Added a few missing parameters to the ones allowed for writing
with GEOLOC_PROFILE.

Fixed a bug where calling GEOLOC_PROFILE to read a parameter
might actually update the profile object.

Cleaned up XML documentation a bit.

ASTERISK-30190

Change-Id: I75f541db43345509a2e86225bfa4cf8e242e5b6c
2022-09-10 12:54:24 -05:00
George Joseph c799db6a21 res_geolocation: Allow location parameters on the profile object
You can now specify the location object's format, location_info,
method, location_source and confidence parameters directly on
a profile object for simple scenarios where the location
information isn't common with any other profiles.  This is
mutually exclusive with setting location_reference on the
profile.

Updated appdocsxml.dtd to allow xi:include in a configObject
element.  This makes it easier to link to complete configOptions
in another object.  This is used to add the above fields to the
profile object without having to maintain the option descriptions
in two places.

ASTERISK-30185

Change-Id: Ifd5f05be0a76f0a6ad49fa28d17c394027677569
2022-09-10 12:51:02 -05:00
George Joseph 4ffc5561c4 res_geolocation: Add profile parameter suppress_empty_ca_elements
Added profile parameter "suppress_empty_ca_elements" that
will cause Civic Address elements that are empty to be
suppressed from the outgoing PIDF-LO document.

Fixed a possible SEGV if a sub-parameter value didn't have a
value.

ASTERISK-30177

Change-Id: I924ccc5aa2f45110a3155b22e53dfaf3ef2092dd
2022-09-10 11:07:51 -05:00
George Joseph 2d5a6498dd res_geolocation: Add built-in profiles
The trigger to perform outgoing geolocation processing is the
presence of a geoloc_outgoing_call_profile on an endpoint. This
is intentional so as to not leak location information to
destinations that shouldn't receive it.   In a totally dynamic
configuration scenario however, there may not be any profiles
defined in geolocation.conf.  This makes it impossible to do
outgoing processing without defining a "dummy" profile in the
config file.

This commit adds 4 built-in profiles:
  "<prefer_config>"
  "<discard_config>"
  "<prefer_incoming>"
  "<discard_incoming>"
The profiles are empty except for having their precedence
set and can be set on an endpoint to allow processing without
entries in geolocation.conf.  "<discard_config>" is actually the
best one to use in this situation.

ASTERISK-30182

Change-Id: I1819ccfa404ce59802a3a07ad1cabed60fb9480a
2022-09-10 11:04:46 -05:00
Joshua C. Colp f3de933b16 res_pjsip_sdp_rtp: Skip formats without SDP details.
When producing an outgoing SDP we iterate through the configured
formats and produce SDP information. It is possible for some
configured formats to not have SDP information available. If this
is the case we skip over them to allow the SDP to still be
produced.

ASTERISK-29185

Change-Id: I3e37569aa4ca341260e6ca5904dc2f75e46a1749
2022-09-10 11:00:38 -05:00
Naveen Albert c7612521be cli: Prevent assertions on startup from bad ao2 refs.
If "core show channels" is run before startup has completed, it
is possible for bad ao2 refs to occur because the system is not
yet fully initialized. This will lead to an assertion failing.

To prevent this, initialization of CLI builtins is moved to be
later along in the main load sequence. Core CLI commands are
loaded at the same time, but channel-related commands are loaded
later on.

ASTERISK-29846 #close

Change-Id: If6b3cde802876bd738c1b4cf2683bea6ddc615b6
2022-09-09 20:41:46 -05:00
Joshua C. Colp a0713a9f70 pjsip: Add TLS transport reload support for certificate and key.
This change adds support using the pjsip_tls_transport_restart
function for reloading the TLS certificate and key, if the filenames
remain unchanged. This is useful for Let's Encrypt and other
situations. Note that no restart of the transport will occur if
the certificate and key remain unchanged.

ASTERISK-30186

Change-Id: I9bc95a6bf791830a9491ad9fa43c17d4010028d0
2022-09-09 18:41:12 -05:00
Naveen Albert 754346a4a9 res_tonedetect: Fix typos referring to wrong variables.
Fixes two typos that cause fax detection to not work.
One refers to the wrong frame variable, and the other
refers to the subclass.integer instead of the frametype
as it should.

ASTERISK-30192 #close

Change-Id: I7b35fdb7bcf25a29a212eee37c20812c64ab3ef1
2022-09-09 13:31:39 -05:00
Mike Bradeen 46776c77c4 alembic: add missing ps_endpoints columns
The following required columns were missing,
now added to the ps_endpoints table:

incoming_call_offer_pref
outgoing_call_offer_pref
stir_shaken_profile

ASTERISK-29453

Change-Id: I5cf565edf30195844d6acbc1e1de8c5f0d837568
2022-09-09 11:35:04 -05:00
Sean Bright 583e017f34 chan_dahdi.c: Resolve a format-truncation build warning.
With gcc (Ubuntu 11.2.0-19ubuntu1) 11.2.0:

> chan_dahdi.c:4129:18: error: ‘%s’ directive output may be truncated
>   writing up to 255 bytes into a region of size between 242 and 252
>   [-Werror=format-truncation=]

This removes the error-prone sizeof(...) calculations in favor of just
doubling the size of the base buffer.

Change-Id: I2d276785286730d3d5d0a921bcea2e065dbf27c5
2022-09-09 09:39:21 -05:00
Alexei Gradinari 12c4c1bf5f res_pjsip_pubsub: Postpone destruction of old subscriptions on RLS update
Set termination state to old subscriptions to prevent queueing and sending
NOTIFY messages on exten/device state changes.

Postpone destruction of old subscriptions until all already queued tasks
that may be using old subscriptions have completed.

ASTERISK-29906

Change-Id: I96582aad3a26515ca73a8460ee6756f56f6ba23b
2022-09-09 08:35:53 -05:00
Sean Bright 155c796203 channel.h: Remove redundant declaration.
The DECLARE_STRINGFIELD_SETTERS_FOR() declares ast_channel_name_set()
for us, so no need to declare it separately.

Change-Id: I4813a884ada475ddc62bca480bceb4a53b3ec59a
2022-09-09 05:59:45 -05:00
Naveen Albert 3fa66c92b5 features: Add transfer initiation options.
Adds additional control options over the transfer
feature functionality to give users more control
in how the transfer feature sounds and works.

First, the "transfer" sound that plays when a transfer is
initiated can now be customized by the user in
features.conf, just as with the other transfer sounds.

Secondly, the user can now specify the transfer extension
in advance by using the TRANSFER_EXTEN variable. If
a valid extension is contained in this variable, the call
will automatically be transferred to this destination.
Otherwise, it will fall back to collecting the extension
from the user as is always done now.

ASTERISK-29899 #close

Change-Id: Ibff309caa459a2b958706f2ed0ca393b1ef502e3
2022-09-08 13:47:25 -05:00
Mike Bradeen adffb975dc CI: Fixing path issue on venv check
ASTERISK-26826

Change-Id: I07388d16f74452cebc9c981f99044eb6b77df792
2022-08-31 15:56:52 -05:00
Mike Bradeen 4fc9e06db1 CI: use Python3 virtual environment
Requires Python3 testsuite changes

ASTERISK-26826

Change-Id: I92ec7dec751ad455503a584d6e860db88c56d6bc
2022-08-30 11:41:54 -05:00
Naveen Albert e2e049e473 general: Very minor coding guideline fixes.
Fixes a few coding guideline violations:
* Use of C99 comments
* Opening brace on same line as function prototype

ASTERISK-30163 #close

Change-Id: I07771c4c89facd41ce8d323859f022ddbddf6ca7
2022-08-17 11:05:08 -05:00
George Joseph 8a8416e365 res_geolocation: Address user issues, remove complexity, plug leaks
* Added processing for the 'confidence' element.
* Added documentation to some APIs.
* removed a lot of complex code related to the very-off-nominal
  case of needing to process multiple location info sources.
* Create a new 'ast_geoloc_eprofile_to_pidf' API that just takes
  one eprofile instead of a datastore of multiples.
* Plugged a huge leak in XML processing that arose from
  insufficient documentation by the libxml/libxslt authors.
* Refactored stylesheets to be more efficient.
* Renamed 'profile_action' to 'profile_precedence' to better
  reflect it's purpose.
* Added the config option for 'allow_routing_use' which
  sets the value of the 'Geolocation-Routing' header.
* Removed the GeolocProfileCreate and GeolocProfileDelete
  dialplan apps.
* Changed the GEOLOC_PROFILE dialplan function as follows:
  * Removed the 'profile' argument.
  * Automatically create a profile if it doesn't exist.
  * Delete a profile if 'inheritable' is set to no.
* Fixed various bugs and leaks
* Updated Asterisk WiKi documentation.

ASTERISK-30167

Change-Id: If38c23f26228e96165be161c2f5e849cb8e16fa0
2022-08-10 12:50:01 -05:00
Naveen Albert ff044c222b chan_iax2: Add missing options documentation.
Adds missing dial resource option documentation.

ASTERISK-30164 #close

Change-Id: I674e1fc9b1e5d67a20599bd4b418ce294d48fc83
2022-08-10 08:36:21 -05:00
Naveen Albert dc7ec11c26 app_confbridge: Fix memory leak on updated menu options.
If the CONFBRIDGE function is used to dynamically set
menu options, a memory leak occurs when a menu option
that has been set is overridden, since the menu entry
is not destroyed before being freed. This ensures that
it is.

Additionally, logic that duplicates the destroy function
is removed in lieu of the destroy function itself.

ASTERISK-28422 #close

Change-Id: I71cfb5c24e636984d41086d1333a416dc12ff995
2022-08-08 05:19:40 -05:00
George Joseph 30d7a212b0 Geolocation: Wiki Documentation
Change-Id: I68ba22db0a69d9e2eabcc2141b48a2395f7f1a23
2022-08-05 10:02:30 -05:00
Naveen Albert f4a020a45b manager: Remove documentation for nonexistent action.
The manager XML documentation documents a "FilterList"
action, but there is no such action. Therefore, this can
lead to confusion when people try to use a documented
action that does not, in fact, exist. This is removed
as the action never did exist in the past, nor would it
be trivial to add since we only store the regex_t
objects, so the filter list can't actually be provided
without storing that separately. Most likely, the
documentation was originally added (around version 10)
in anticipation of something that never happened.

ASTERISK-29917 #close

Change-Id: I846b16fd6f80a91d4ddc5d8a861b522d7c6f8f97
2022-08-02 09:09:43 -05:00
Naveen Albert c654486547 general: Improve logging levels of some log messages.
Adjusts some logging levels to be more or less important,
that is more prominent when actual problems occur and less
prominent for less noteworthy things.

ASTERISK-30153 #close

Change-Id: Ifc8f7df427aa018627db462125ae744986d3261b
2022-08-01 11:03:46 -05:00
Naveen Albert 5feebc0857 cdr.conf: Remove obsolete app_mysql reference.
The CDR sample config still mentions that app_mysql
is available in the addons directory, but this is
incorrect as it was removed as of 19. This removes
that to avoid confusion.

ASTERISK-30160 #close

Change-Id: Ie5293ccb4f2b365896981811b480544e67bb9cd7
2022-08-01 10:09:53 -05:00
Naveen Albert 165368bf0b general: Remove obsolete SVN references.
There are a handful of files in the tree that
reference an SVN link for the coding guidelines.

This removes these because the links are dead
and the vast majority of source files do not
contain these links, so this is more consistent.

app_skel still maintains an (up to date) link
to the coding guidelines.

ASTERISK-30159 #close

Change-Id: I35bbb20f66982e98099cff3029ede20091ffdac7
2022-08-01 09:58:58 -05:00
Naveen Albert 2d8f2696b2 app_confbridge: Add missing AMI documentation.
Documents the ConfbridgeListRooms AMI response,
which is currently not documented.

ASTERISK-30020 #close

Change-Id: Id6fff7a936244bae7b52686301eb740c1169cdea
2022-08-01 08:58:50 -05:00
Naveen Albert 4af881506e app_meetme: Add missing AMI documentation.
The MeetmeList and MeetmeListRooms AMI
responses are currently completely undocumented.
This adds documentation for these responses.

ASTERISK-30018 #close

Change-Id: Id93135b7edf01de6f8fba266e2122989dc8996b8
2022-08-01 07:57:21 -05:00
Naveen Albert 83912496ab func_srv: Document field parameter.
Adds missing documentation for the field parameter
for the SRVRESULT function.

ASTERISK-30151
Reported by: Chris Young

Change-Id: I4385a2e0892a07e30dea1a8a0588e2c1bea2b1f1
2022-07-27 12:10:25 -05:00
Naveen Albert c771e2dd7a pbx_functions.c: Manually update ast_str strlen.
When ast_func_read2 is used to read a function using
its read function (as opposed to a native ast_str read2
function), the result is copied directly by the function
into the ast_str buffer. As a result, the ast_str length
remains initialized to 0, which is a bug because this is
not the real string length.

This can cascade and have issues elsewhere, such as when
reading substrings of functions that only register read
as opposed to read2 callbacks. In this case, since reading
ast_str_strlen returns 0, the returned substring is empty
as opposed to the actual substring. This has caused
the ast_str family of functions to behave inconsistently
and erroneously, in contrast to the pbx_variables substitution
functions which work correctly.

This fixes this issue by manually updating the ast_str length
when the result is copied directly into the ast_str buffer.

Additionally, an assertion and a unit test that previously
exposed these issues are added, now that the issue is fixed.

ASTERISK-29966 #close

Change-Id: I4e2dba41410f9d4dff61c995d2ca27718248e07f
2022-07-26 10:48:19 -05:00
Sergey V. Lobanov f645157a4b build: fix bininstall launchd issue on cross-platform build
configure script detects /sbin/launchd, but the result of this
check is not used in Makefile (bininstall). Makefile also detects
/sbin/launchd file to decide if it is required to install
safe_asterisk.

configure script correctly detects cross compile build and sets
PBX_LAUNCHD=0

In case of building asterisk on MacOS host for Linux target using
external toolchain (e.g. OpenWrt toolchain), bininstall does not
install safe_asterisk (due to /sbin/launchd detection in Makefile),
but it is required on target (Linux).

This patch adds HAVE_SBIN_LAUNCHD=@PBX_LAUNCHD@ to makeopts.in to
use the result of /sbin/launchd detection from configure script in
Makefile.
Also this patch uses HAVE_SBIN_LAUNCHD in Makefile (bininstall) to
decide if it is required to install safe_asterisk.

ASTERISK-29905 #close

Change-Id: Iff61217276cd188f43f51ef4cdbffe39d9f07f65
2022-07-24 11:52:30 -05:00
Naveen Albert a9223f210e db: Add AMI action to retrieve DB keys at prefix.
Adds the DBGetTree action, which can be used to
retrieve all of the DB keys beginning with a
particular prefix, similar to the capability
provided by the database show CLI command.

ASTERISK-30136 #close

Change-Id: I3be9425e53be71f24303fdd4d2923c14e84337e6
2022-07-20 13:02:12 -05:00
Naveen Albert ce18196280 manager: Fix incomplete filtering of AMI events.
The global event filtering code was only in one
possible execution path, so not all events were
being properly filtered out if requested. This moves
that into the universal AMI handling code so all
events are properly handled.

Additionally, the CLI listing of disabled events can
also get truncated, so we now print out everything.

ASTERISK-30137 #close

Change-Id: If8c42edcb2abc5158552da7eba2a8ff6b20e1959
2022-07-20 09:46:11 -05:00
George Joseph f8000daff5 Update defaultbranch to 20
Change-Id: Ib91db9223a78188667e15053bcc73931b878414e
2022-07-20 04:59:53 -06:00
192 changed files with 120411 additions and 2248 deletions

View File

@ -1,6 +1,5 @@
[gerrit]
defaultbranch=master
basebranch=master
defaultbranch=20
#
# Intentional padding to ensure it is possible to point a commit
# to an alternative gerrit server/repository without breaking

1
.lastclean Normal file
View File

@ -0,0 +1 @@
40

1
.version Normal file
View File

@ -0,0 +1 @@
20.1.0

240
CHANGES
View File

@ -12,10 +12,250 @@
===
==============================================================================
------------------------------------------------------------------------------
--- Functionality changes from Asterisk 20.0.0 to Asterisk 20.1.0 ------------
------------------------------------------------------------------------------
AMI
------------------
* The AOCMessage action can now be used to generate AOC-S messages.
Add support for named capture agent.
------------------
* A name for the capture agent can now be specified
using the capture_name option which, if specified,
will be sent to the HEP server.
app_if
------------------
* Adds the If, ElseIf, Else, EndIf, and ExitIf applications
for conditional execution of a block of code.
app_mixmonitor
------------------
* The d option for MixMonitor now allows deleting
the original recording when MixMonitor exits,
which can be useful when MixMonitor copies it
somewhere else before exiting.
* Adds the c option to use the real Caller ID on
the channel in voicemail recordings as opposed
to the Connected Line.
app_voicemail
------------------
* The voicemail user option attachextrecs can
now be set to control whether external recordings
trigger voicemail email notifications.
cdr
------------------
* Two new options have been added which allow
bridging and dial state changes to be ignored
in CDRs, which can be useful if a single CDR
is desired for a channel.
chan_dahdi
------------------
* FXO channels (FXS signaled) that don't use callerid or
distinctive ring detection can now be configured
to enter the dialplan immediately using immediate=yes,
instead of waiting for at least one ring.
pbx_builtins
------------------
* It is now possible to not wait for media on
a channel when answering it using Answer,
by specifying the i option.
res_pjsip
------------------
* Added options "security_negotiation" and "security_mechanisms" to pjsip
endpoints and registrations. "security_negotiation" can be set to "no" (default)
or "mediasec", and "security_mechanisms" can be a list of comma-separated
security_mechanisms in the form defined by RFC 3329 section 2.2.
* A new option named "all_codecs_on_empty_reinvite" has been added to the
global section. When this option is enabled, on reception of a re-INVITE
without SDP, Asterisk will send an SDP offer in the 200 OK response containing
all configured codecs on the endpoint, instead of simply those that have
already been negotiated. RFC 3261 specifies this as a SHOULD requirement.
The default value is "off".
res_pjsip_aoc
------------------
* Added res_pjsip_aoc which gives chan_pjsip the ability to send Advice-of-Charge messages.
A new endpoint option, send_aoc, controls this.
res_pjsip_header_funcs
------------------
* The new PJSIP_HEADER_PARAM function now fully supports both
URI and header parameters. Both reading and writing
parameters are supported.
res_pjsip_logger
------------------
* SIP messages can now be filtered by SIP request method
(INVITE, CANCEL, ACK, BYE, REGISTER, OPTION,
SUBSCRIBE, NOTIFY, PUBLISH, INFO, and MESSAGE),
allowing for more granular debugging to be done
in the CLI. This applies to requests but not responses.
res_pjsip_notify
------------------
* Allows using the config options in pjsip_notify.conf
from AMI actions as with the existing CLI commands.
res_tonedetect
------------------
* The TONE_DETECT function now supports
detection of audible ringback tone
using the p option.
xmldocs
------------------
* The XML documentation can now be reloaded without restarting
Asterisk, which makes it possible to load new modules that
enforce documentation without restarting Asterisk.
------------------------------------------------------------------------------
--- Functionality changes from Asterisk 19.0.0 to Asterisk 20.0.0 ------------
------------------------------------------------------------------------------
New EXPORT function
------------------
* A new function, EXPORT, allows writing variables
and functions on other channels, the complement
of the IMPORT function.
app_amd
------------------
* An audio file to play during AMD processing can
now be specified to the AMD application or configured
in the amd.conf configuration file.
app_bridgewait
------------------
* Adds the n option to not answer the channel when
the BridgeWait application is called.
features
------------------
* The Bridge application now has the n "no answer" option
that can be used to prevent the channel from being
automatically answered prior to bridging.
func_strings
------------------
* Three new functions, TRIM, LTRIM, and RTRIM, are
now available for trimming leading and trailing
whitespace.
res_pjsip
------------------
* A new option named "peer_supported" has been added to the endpoint option
100rel. When set to this option, Asterisk sends provisional responses
reliably if the peer supports it. If the peer does not support reliable
provisional responses, Asterisk sends them normally.
------------------------------------------------------------------------------
--- Functionality changes from Asterisk 19.0.0 to Asterisk 20.0.0 ------------
------------------------------------------------------------------------------
Transfer feature
------------------
* The following capabilities have been added to the
transfer feature:
- The transfer initiation announcement prompt can
now be customized in features.conf.
- The TRANSFER_EXTEN variable now can be set on the
transferer's channel in order to allow the transfer
function to automatically attempt to go to the extension
contained in this variable, if it exists. The transfer
context behavior is not changed (TRANSFER_CONTEXT is used
if it exists; otherwise the default context is used).
app_confbridge
------------------
* Adds the end_marked_any option which can be used
to kick users from a conference after any
marked user leaves (including marked users).
db
------------------
* The DBPrefixGet AMI action now allows retrieving
all of the DB keys beginning with a particular
prefix.
locks
------------------
* A new AMI event, DeadlockStart, is now available
when Asterisk is compiled with DETECT_DEADLOCKS,
and can indicate that a deadlock has occured.
res_geolocation
------------------
* * Added processing for the 'confidence' element.
* Added documentation to some APIs.
* removed a lot of complex code related to the very-off-nominal
case of needing to process multiple location info sources.
* Create a new 'ast_geoloc_eprofile_to_pidf' API that just takes
one eprofile instead of a datastore of multiples.
* Plugged a huge leak in XML processing that arose from
insufficient documentation by the libxml/libxslt authors.
* Refactored stylesheets to be more efficient.
* Renamed 'profile_action' to 'profile_precedence' to better
reflect it's purpose.
* Added the config option for 'allow_routing_use' which
sets the value of the 'Geolocation-Routing' header.
* Removed the GeolocProfileCreate and GeolocProfileDelete
dialplan apps.
* Changed the GEOLOC_PROFILE dialplan function as follows:
* Removed the 'profile' argument.
* Automatically create a profile if it doesn't exist.
* Delete a profile if 'inheritable' is set to no.
* Fixed various bugs and leaks
* Updated Asterisk WiKi documentation.
Added 4 built-in profiles:
"<prefer_config>"
"<discard_config>"
"<prefer_incoming>"
"<discard_incoming>"
The profiles are empty except for having their precedence
set.
Added profile parameter "suppress_empty_ca_elements" that
will cause Civic Address elements that are empty to be
suppressed from the outgoing PIDF-LO document.
You can now specify the location object's format, location_info,
method, location_source and confidence parameters directly on
a profile object for simple scenarios where the location
information isn't common with any other profiles. This is
mutually exclusive with setting location_reference on the
profile.
Added an 'a' option to the GEOLOC_PROFILE function to allow
variable lists like location_info_refinement to be appended
to instead of replacing the entire list.
Added an 'r' option to the GEOLOC_PROFILE function to resolve all
variables before a read operation and after a Set operation.
res_musiconhold_answeredonly
------------------
* This change adds an option, answeredonly, that will prevent music
on hold on channels that are not answered.
res_pjsip
------------------
* TLS transports in res_pjsip can now reload their TLS certificate
and private key files, provided the filename of them has not
changed.
Applications
------------------
* added support for Danish syntax, playing the correct plural sound file

105422
ChangeLog Normal file

File diff suppressed because it is too large Load Diff

View File

@ -561,9 +561,9 @@ bininstall: _all installdirs $(SUBDIRS_INSTALL) main-bininstall
$(INSTALL) -m 755 contrib/scripts/astversion "$(DESTDIR)$(ASTSBINDIR)/"
$(INSTALL) -m 755 contrib/scripts/astgenkey "$(DESTDIR)$(ASTSBINDIR)/"
$(INSTALL) -m 755 contrib/scripts/autosupport "$(DESTDIR)$(ASTSBINDIR)/"
if [ ! -f /sbin/launchd ]; then \
./build_tools/install_subst contrib/scripts/safe_asterisk "$(DESTDIR)$(ASTSBINDIR)/safe_asterisk"; \
fi
ifneq ($(HAVE_SBIN_LAUNCHD),1)
./build_tools/install_subst contrib/scripts/safe_asterisk "$(DESTDIR)$(ASTSBINDIR)/safe_asterisk";
endif
ifneq ($(DISABLE_XMLDOC),yes)
$(INSTALL) -m 644 doc/core-*.xml "$(DESTDIR)$(ASTDATADIR)/documentation"

View File

@ -213,10 +213,10 @@ endif
# extern const size_t _binary_abc_def_xml_size;
%.o: %.xml
$(ECHO_PREFIX) echo " [LD] $^ -> $@"
$(CMD_PREFIX) $(CC) -g -nostartfiles -nodefaultlibs -nostdlib -r -Wl,-b,binary -o $@ $^
$(CMD_PREFIX) $(CC) -g -Wl,-znoexecstack -nostartfiles -nodefaultlibs -nostdlib -r -Wl,-b,binary -o $@ $^
%.o: %.xslt
$(ECHO_PREFIX) echo " [LD] $^ -> $@"
$(CMD_PREFIX) $(CC) -g -nostartfiles -nodefaultlibs -nostdlib -r -Wl,-b,binary -o $@ $^
$(CMD_PREFIX) $(CC) -g -Wl,-znoexecstack -nostartfiles -nodefaultlibs -nostdlib -r -Wl,-b,binary -o $@ $^
dist-clean:: clean

View File

@ -18,6 +18,29 @@
===
===========================================================
------------------------------------------------------------------------------
--- Functionality changes from Asterisk 20.0.0 to Asterisk 20.1.0 ------------
------------------------------------------------------------------------------
AMI (Asterisk Manager Interface)
------------------
* Previously, GetConfig and UpdateConfig were able to access files outside of
the Asterisk configuration directory. Now this access is put behind the
live_dangerously configuration option in asterisk.conf, which is disabled by
default. If access to configuration files outside of the Asterisk configuation
directory is required via AMI, then the live_dangerously configuration option
must be set to yes.
------------------------------------------------------------------------------
--- Functionality changes from Asterisk 19.0.0 to Asterisk 20.0.0 ------------
------------------------------------------------------------------------------
res_crypto
------------------
* In addition to only paying attention to files ending with .key or .pub
in the keys directory, we now also ignore any files which aren't regular
files.
------------------------------------------------------------------------------
--- New functionality introduced in Asterisk 20.0.0 --------------------------
------------------------------------------------------------------------------

View File

@ -192,11 +192,13 @@ EXTERN int ooQ931Decode
screening indicators ;-) */
if(ie->discriminator == Q931CallingPartyNumberIE)
{
int numoffset=1;
OOTRACEDBGB1(" CallingPartyNumber IE = {\n");
if(ie->length < OO_MAX_NUMBER_LENGTH)
if(!(0x80 & ie->data[0])) numoffset = 2;
if( (ie->length >= numoffset) &&
(ie->length < OO_MAX_NUMBER_LENGTH) )
{
int numoffset=1;
if(!(0x80 & ie->data[0])) numoffset = 2;
memcpy(number, ie->data+numoffset,ie->length-numoffset);
number[ie->length-numoffset]='\0';
OOTRACEDBGB2(" %s\n", number);
@ -204,7 +206,7 @@ EXTERN int ooQ931Decode
ooCallSetCallingPartyNumber(call, number);
}
else{
OOTRACEERR3("Error:Calling party number too long. (%s, %s)\n",
OOTRACEERR3("Error:Calling party number outside range. (%s, %s)\n",
call->callType, call->callToken);
}
OOTRACEDBGB1(" }\n");
@ -214,7 +216,8 @@ EXTERN int ooQ931Decode
if(ie->discriminator == Q931CalledPartyNumberIE)
{
OOTRACEDBGB1(" CalledPartyNumber IE = {\n");
if(ie->length < OO_MAX_NUMBER_LENGTH)
if( (ie->length >= 1) &&
(ie->length < OO_MAX_NUMBER_LENGTH) )
{
memcpy(number, ie->data+1,ie->length-1);
number[ie->length-1]='\0';
@ -223,7 +226,7 @@ EXTERN int ooQ931Decode
ooCallSetCalledPartyNumber(call, number);
}
else{
OOTRACEERR3("Error:Calling party number too long. (%s, %s)\n",
OOTRACEERR3("Error:Calling party number outside range. (%s, %s)\n",
call->callType, call->callToken);
}
OOTRACEDBGB1(" }\n");

View File

@ -92,6 +92,12 @@
<para>Is the maximum duration of a word to accept.</para>
<para>If exceeded, then the result is detection as a MACHINE</para>
</parameter>
<parameter name="audioFile" required="false">
<para>Is an audio file to play to the caller while AMD is in progress.</para>
<para>By default, no audio file is played.</para>
<para>If an audio file is configured in amd.conf, then that file will be used
if one is not specified here. That file may be overridden by this argument.</para>
</parameter>
</syntax>
<description>
<para>This application attempts to detect answering machines at the beginning
@ -155,6 +161,9 @@ static int dfltBetweenWordsSilence = 50;
static int dfltMaximumNumberOfWords = 2;
static int dfltSilenceThreshold = 256;
static int dfltMaximumWordLength = 5000; /* Setting this to a large default so it is not used unless specify it in the configs or command line */
static char *dfltAudioFile = NULL;
static ast_mutex_t config_lock;
/* Set to the lowest ms value provided in amd.conf or application parameters */
static int dfltMaxWaitTimeForFrame = 50;
@ -179,7 +188,7 @@ static void isAnsweringMachine(struct ast_channel *chan, const char *data)
char amdCause[256] = "", amdStatus[256] = "";
char *parse = ast_strdupa(data);
/* Lets set the initial values of the variables that will control the algorithm.
/* Let's set the initial values of the variables that will control the algorithm.
The initial values are the default ones. If they are passed as arguments
when invoking the application, then the default values will be overwritten
by the ones passed as parameters. */
@ -193,6 +202,7 @@ static void isAnsweringMachine(struct ast_channel *chan, const char *data)
int silenceThreshold = dfltSilenceThreshold;
int maximumWordLength = dfltMaximumWordLength;
int maxWaitTimeForFrame = dfltMaxWaitTimeForFrame;
const char *audioFile = NULL;
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(argInitialSilence);
@ -204,8 +214,15 @@ static void isAnsweringMachine(struct ast_channel *chan, const char *data)
AST_APP_ARG(argMaximumNumberOfWords);
AST_APP_ARG(argSilenceThreshold);
AST_APP_ARG(argMaximumWordLength);
AST_APP_ARG(audioFile);
);
ast_mutex_lock(&config_lock);
if (!ast_strlen_zero(dfltAudioFile)) {
audioFile = ast_strdupa(dfltAudioFile);
}
ast_mutex_unlock(&config_lock);
ast_verb(3, "AMD: %s %s %s (Fmt: %s)\n", ast_channel_name(chan),
S_COR(ast_channel_caller(chan)->ani.number.valid, ast_channel_caller(chan)->ani.number.str, "(N/A)"),
S_COR(ast_channel_redirecting(chan)->from.number.valid, ast_channel_redirecting(chan)->from.number.str, "(N/A)"),
@ -233,6 +250,9 @@ static void isAnsweringMachine(struct ast_channel *chan, const char *data)
silenceThreshold = atoi(args.argSilenceThreshold);
if (!ast_strlen_zero(args.argMaximumWordLength))
maximumWordLength = atoi(args.argMaximumWordLength);
if (!ast_strlen_zero(args.audioFile)) {
audioFile = args.audioFile;
}
} else {
ast_debug(1, "AMD using the default parameters.\n");
}
@ -280,6 +300,11 @@ static void isAnsweringMachine(struct ast_channel *chan, const char *data)
/* Set our start time so we can tie the loop to real world time and not RTP updates */
amd_tvstart = ast_tvnow();
/* Optional audio file to play to caller while AMD is doing its thing. */
if (!ast_strlen_zero(audioFile)) {
ast_streamfile(chan, audioFile, ast_channel_language(chan));
}
/* Now we go into a loop waiting for frames from the channel */
while ((res = ast_waitfor(chan, 2 * maxWaitTimeForFrame)) > -1) {
int ms = 0;
@ -462,10 +487,14 @@ static void isAnsweringMachine(struct ast_channel *chan, const char *data)
/* Free the DSP used to detect silence */
ast_dsp_free(silenceDetector);
/* If we were playing something to pass the time, stop it now. */
if (!ast_strlen_zero(audioFile)) {
ast_stopstream(chan);
}
return;
}
static int amd_exec(struct ast_channel *chan, const char *data)
{
isAnsweringMachine(chan, data);
@ -516,7 +545,16 @@ static int load_config(int reload)
dfltMaximumNumberOfWords = atoi(var->value);
} else if (!strcasecmp(var->name, "maximum_word_length")) {
dfltMaximumWordLength = atoi(var->value);
} else if (!strcasecmp(var->name, "playback_file")) {
ast_mutex_lock(&config_lock);
if (dfltAudioFile) {
ast_free(dfltAudioFile);
dfltAudioFile = NULL;
}
if (!ast_strlen_zero(var->value)) {
dfltAudioFile = ast_strdup(var->value);
}
ast_mutex_unlock(&config_lock);
} else {
ast_log(LOG_WARNING, "%s: Cat:%s. Unknown keyword %s at line %d of amd.conf\n",
app, cat, var->name, var->lineno);
@ -539,6 +577,12 @@ static int load_config(int reload)
static int unload_module(void)
{
ast_mutex_lock(&config_lock);
if (dfltAudioFile) {
ast_free(dfltAudioFile);
}
ast_mutex_unlock(&config_lock);
ast_mutex_destroy(&config_lock);
return ast_unregister_application(app);
}
@ -554,6 +598,7 @@ static int unload_module(void)
*/
static int load_module(void)
{
ast_mutex_init(&config_lock);
if (load_config(0) || ast_register_application_xml(app, amd_exec)) {
return AST_MODULE_LOAD_DECLINE;
}

View File

@ -100,6 +100,9 @@
<para>Automatically exit the bridge and return to the PBX after
<emphasis>duration</emphasis> seconds.</para>
</option>
<option name="n">
<para>Do not automatically answer the channel.</para>
</option>
</optionlist>
</parameter>
</syntax>
@ -108,7 +111,7 @@
The channel will then wait in the holding bridge until some event occurs
which removes it from the holding bridge.</para>
<note><para>This application will answer calls which haven't already
been answered.</para></note>
been answered, unless the n option is provided.</para></note>
</description>
</application>
***/
@ -186,6 +189,7 @@ enum bridgewait_flags {
MUXFLAG_MOHCLASS = (1 << 0),
MUXFLAG_ENTERTAINMENT = (1 << 1),
MUXFLAG_TIMEOUT = (1 << 2),
MUXFLAG_NOANSWER = (1 << 3),
};
enum bridgewait_args {
@ -199,6 +203,7 @@ AST_APP_OPTIONS(bridgewait_opts, {
AST_APP_OPTION_ARG('e', MUXFLAG_ENTERTAINMENT, OPT_ARG_ENTERTAINMENT),
AST_APP_OPTION_ARG('m', MUXFLAG_MOHCLASS, OPT_ARG_MOHCLASS),
AST_APP_OPTION_ARG('S', MUXFLAG_TIMEOUT, OPT_ARG_TIMEOUT),
AST_APP_OPTION('n', MUXFLAG_NOANSWER),
});
static int bridgewait_timeout_callback(struct ast_bridge_channel *bridge_channel, void *hook_pvt)
@ -458,7 +463,7 @@ static int bridgewait_exec(struct ast_channel *chan, const char *data)
}
/* Answer the channel if needed */
if (ast_channel_state(chan) != AST_STATE_UP) {
if (ast_channel_state(chan) != AST_STATE_UP && !ast_test_flag(&flags, MUXFLAG_NOANSWER)) {
ast_answer(chan);
}

View File

@ -393,6 +393,37 @@
ConfbridgeListRoomsComplete.</para>
</description>
</manager>
<managerEvent language="en_US" name="ConfbridgeListRooms">
<managerEventInstance class="EVENT_FLAG_REPORTING">
<synopsis>Raised as part of the ConfbridgeListRooms action response list.</synopsis>
<syntax>
<parameter name="Conference">
<para>The name of the Confbridge conference.</para>
</parameter>
<parameter name="Parties">
<para>Number of users in the conference.</para>
<para>This includes both active and waiting users.</para>
</parameter>
<parameter name="Marked">
<para>Number of marked users in the conference.</para>
</parameter>
<parameter name="Locked">
<para>Is the conference locked?</para>
<enumlist>
<enum name="Yes"/>
<enum name="No"/>
</enumlist>
</parameter>
<parameter name="Muted">
<para>Is the conference muted?</para>
<enumlist>
<enum name="Yes"/>
<enum name="No"/>
</enumlist>
</parameter>
</syntax>
</managerEventInstance>
</managerEvent>
<manager name="ConfbridgeMute" language="en_US">
<synopsis>
Mute a Confbridge user.
@ -3991,6 +4022,7 @@ static int action_confbridgelist_item(struct mansession *s, const char *id_text,
"MarkedUser: %s\r\n"
"WaitMarked: %s\r\n"
"EndMarked: %s\r\n"
"EndMarkedAny: %s\r\n"
"Waiting: %s\r\n"
"Muted: %s\r\n"
"Talking: %s\r\n"
@ -4003,6 +4035,7 @@ static int action_confbridgelist_item(struct mansession *s, const char *id_text,
AST_YESNO(ast_test_flag(&user->u_profile, USER_OPT_MARKEDUSER)),
AST_YESNO(ast_test_flag(&user->u_profile, USER_OPT_WAITMARKED)),
AST_YESNO(ast_test_flag(&user->u_profile, USER_OPT_ENDMARKED)),
AST_YESNO(ast_test_flag(&user->u_profile, USER_OPT_ENDMARKEDANY)),
AST_YESNO(waiting),
AST_YESNO(user->muted),
AST_YESNO(user->talking),

383
apps/app_if.c Normal file
View File

@ -0,0 +1,383 @@
/*
* Asterisk -- An open source telephony toolkit.
*
* Copyright 2022, Naveen Albert <asterisk@phreaknet.org>
*
* Naveen Albert <asterisk@phreaknet.org>
*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
* any of the maintainers of this project for assistance;
* the project provides a web site, mailing lists and IRC
* channels for your use.
*
* This program is free software, distributed under the terms of
* the GNU General Public License Version 2. See the LICENSE file
* at the top of the source tree.
*/
/*! \file
*
* \brief If Branch Implementation
*
* \author Naveen Albert <asterisk@phreaknet.org>
*
* \ingroup applications
*/
/*** MODULEINFO
<support_level>extended</support_level>
***/
#include "asterisk.h"
#include "asterisk/pbx.h"
#include "asterisk/module.h"
#include "asterisk/channel.h"
/*** DOCUMENTATION
<application name="If" language="en_US">
<synopsis>
Start an if branch.
</synopsis>
<syntax>
<parameter name="expr" required="true" />
</syntax>
<description>
<para>Start an If branch. Execution will continue inside the branch
if expr is true.</para>
<note><para>This application (and related applications) set variables
internally during execution.</para></note>
</description>
<see-also>
<ref type="application">ElseIf</ref>
<ref type="application">Else</ref>
<ref type="application">EndIf</ref>
<ref type="application">ExitIf</ref>
</see-also>
</application>
<application name="ElseIf" language="en_US">
<synopsis>
Start an else if branch.
</synopsis>
<syntax>
<parameter name="expr" required="true" />
</syntax>
<description>
<para>Start an optional ElseIf branch. Execution will continue inside the branch
if expr is true and if previous If and ElseIf branches evaluated to false.</para>
<para>Please note that execution inside a true If branch will fallthrough into
ElseIf unless the If segment is terminated with an ExitIf call. This is only
necessary with ElseIf but not with Else.</para>
</description>
<see-also>
<ref type="application">If</ref>
<ref type="application">Else</ref>
<ref type="application">EndIf</ref>
<ref type="application">ExitIf</ref>
</see-also>
</application>
<application name="Else" language="en_US">
<synopsis>
Define an optional else branch.
</synopsis>
<syntax>
<parameter name="expr" required="true" />
</syntax>
<description>
<para>Start an Else branch. Execution will jump here if all previous
If and ElseIf branches evaluated to false.</para>
</description>
<see-also>
<ref type="application">If</ref>
<ref type="application">ElseIf</ref>
<ref type="application">EndIf</ref>
<ref type="application">ExitIf</ref>
</see-also>
</application>
<application name="EndIf" language="en_US">
<synopsis>
End an if branch.
</synopsis>
<syntax />
<description>
<para>Ends the branch begun by the preceding <literal>If()</literal> application.</para>
</description>
<see-also>
<ref type="application">If</ref>
<ref type="application">ElseIf</ref>
<ref type="application">Else</ref>
<ref type="application">ExitIf</ref>
</see-also>
</application>
<application name="ExitIf" language="en_US">
<synopsis>
End an If branch.
</synopsis>
<syntax />
<description>
<para>Exits an <literal>If()</literal> branch, whether or not it has completed.</para>
</description>
<see-also>
<ref type="application">If</ref>
<ref type="application">ElseIf</ref>
<ref type="application">Else</ref>
<ref type="application">EndIf</ref>
</see-also>
</application>
***/
static char *if_app = "If";
static char *elseif_app = "ElseIf";
static char *else_app = "Else";
static char *stop_app = "EndIf";
static char *exit_app = "ExitIf";
#define VAR_SIZE 64
static const char *get_index(struct ast_channel *chan, const char *prefix, int idx)
{
char varname[VAR_SIZE];
snprintf(varname, VAR_SIZE, "%s_%d", prefix, idx);
return pbx_builtin_getvar_helper(chan, varname);
}
static struct ast_exten *find_matching_priority(struct ast_context *c, const char *exten, int priority, const char *callerid)
{
struct ast_exten *e;
struct ast_context *c2;
int idx;
for (e = ast_walk_context_extensions(c, NULL); e; e = ast_walk_context_extensions(c, e)) {
if (ast_extension_match(ast_get_extension_name(e), exten)) {
int needmatch = ast_get_extension_matchcid(e);
if ((needmatch && ast_extension_match(ast_get_extension_cidmatch(e), callerid)) ||
(!needmatch)) {
/* This is the matching extension we want */
struct ast_exten *p;
for (p = ast_walk_extension_priorities(e, NULL); p; p = ast_walk_extension_priorities(e, p)) {
if (priority != ast_get_extension_priority(p))
continue;
return p;
}
}
}
}
/* No match; run through includes */
for (idx = 0; idx < ast_context_includes_count(c); idx++) {
const struct ast_include *i = ast_context_includes_get(c, idx);
for (c2 = ast_walk_contexts(NULL); c2; c2 = ast_walk_contexts(c2)) {
if (!strcmp(ast_get_context_name(c2), ast_get_include_name(i))) {
e = find_matching_priority(c2, exten, priority, callerid);
if (e)
return e;
}
}
}
return NULL;
}
static int find_matching_endif(struct ast_channel *chan, const char *otherapp)
{
struct ast_context *c;
int res = -1;
if (ast_rdlock_contexts()) {
ast_log(LOG_ERROR, "Failed to lock contexts list\n");
return -1;
}
for (c = ast_walk_contexts(NULL); c; c = ast_walk_contexts(c)) {
struct ast_exten *e;
if (!ast_rdlock_context(c)) {
if (!strcmp(ast_get_context_name(c), ast_channel_context(chan))) {
/* This is the matching context we want */
int cur_priority = ast_channel_priority(chan) + 1, level = 1;
for (e = find_matching_priority(c, ast_channel_exten(chan), cur_priority,
S_COR(ast_channel_caller(chan)->id.number.valid, ast_channel_caller(chan)->id.number.str, NULL));
e;
e = find_matching_priority(c, ast_channel_exten(chan), ++cur_priority,
S_COR(ast_channel_caller(chan)->id.number.valid, ast_channel_caller(chan)->id.number.str, NULL))) {
if (!strcasecmp(ast_get_extension_app(e), "IF")) {
level++;
} else if (!strcasecmp(ast_get_extension_app(e), "ENDIF")) {
level--;
}
if (!otherapp && level == 0) {
res = cur_priority;
break;
} else if (otherapp && level == 1 && !strcasecmp(ast_get_extension_app(e), otherapp)) {
res = cur_priority;
break;
}
}
}
ast_unlock_context(c);
if (res > 0) {
break;
}
}
}
ast_unlock_contexts();
return res;
}
static int if_helper(struct ast_channel *chan, const char *data, int end)
{
int res = 0;
const char *if_pri = NULL;
char *my_name = NULL;
const char *label = NULL;
char varname[VAR_SIZE + 3]; /* + IF_ */
char end_varname[sizeof(varname) + 4]; /* + END_ + sizeof(varname) */
const char *prefix = "IF";
size_t size = 0;
int used_index_i = -1, x = 0;
char used_index[VAR_SIZE] = "0", new_index[VAR_SIZE] = "0";
if (!chan) {
return -1;
}
for (x = 0 ;; x++) {
if (get_index(chan, prefix, x)) {
used_index_i = x;
} else {
break;
}
}
snprintf(used_index, sizeof(used_index), "%d", used_index_i);
snprintf(new_index, sizeof(new_index), "%d", used_index_i + 1);
size = strlen(ast_channel_context(chan)) + strlen(ast_channel_exten(chan)) + 32;
my_name = ast_alloca(size);
memset(my_name, 0, size);
snprintf(my_name, size, "%s_%s_%d", ast_channel_context(chan), ast_channel_exten(chan), ast_channel_priority(chan));
ast_channel_lock(chan);
if (end > 1) {
label = used_index;
} else if (!(label = pbx_builtin_getvar_helper(chan, my_name))) {
label = new_index;
pbx_builtin_setvar_helper(chan, my_name, label);
}
snprintf(varname, sizeof(varname), "%s_%s", prefix, label);
if ((if_pri = pbx_builtin_getvar_helper(chan, varname)) && !end) {
if_pri = ast_strdupa(if_pri);
snprintf(end_varname,sizeof(end_varname),"END_%s",varname);
}
ast_channel_unlock(chan);
if ((end <= 1 && !pbx_checkcondition(ast_strdupa(data))) || (end > 1)) {
/* Condition Met (clean up helper vars) */
const char *goto_str;
int pri, endifpri;
pbx_builtin_setvar_helper(chan, varname, NULL);
pbx_builtin_setvar_helper(chan, my_name, NULL);
snprintf(end_varname,sizeof(end_varname),"END_%s",varname);
ast_channel_lock(chan);
endifpri = find_matching_endif(chan, NULL);
if ((goto_str = pbx_builtin_getvar_helper(chan, end_varname))) {
ast_parseable_goto(chan, goto_str);
pbx_builtin_setvar_helper(chan, end_varname, NULL);
} else if (end <= 1 && (pri = find_matching_endif(chan, "ElseIf")) > 0 && pri < endifpri) {
pri--; /* back up a priority, since it returned the priority after the ElseIf */
/* If is false, and ElseIf exists, so jump to ElseIf */
ast_verb(3, "Taking conditional false branch, jumping to priority %d\n", pri);
ast_channel_priority_set(chan, pri);
} else if (end <= 1 && (pri = find_matching_endif(chan, "Else")) > 0 && pri < endifpri) {
/* don't need to back up a priority, because we don't actually need to execute Else, just jump to the priority after. Directly executing Else will exit the conditional. */
/* If is false, and Else exists, so jump to Else */
ast_verb(3, "Taking absolute false branch, jumping to priority %d\n", pri);
ast_channel_priority_set(chan, pri);
} else {
pri = endifpri;
if (pri > 0) {
ast_verb(3, "Exiting conditional, jumping to priority %d\n", pri);
ast_channel_priority_set(chan, pri);
} else if (end == 4) { /* Condition added because of end > 0 instead of end == 4 */
ast_log(LOG_WARNING, "Couldn't find matching EndIf? (If at %s@%s priority %d)\n", ast_channel_context(chan), ast_channel_exten(chan), ast_channel_priority(chan));
}
}
ast_channel_unlock(chan);
return res;
}
if (end <= 1 && !if_pri) {
char *goto_str;
size = strlen(ast_channel_context(chan)) + strlen(ast_channel_exten(chan)) + 32;
goto_str = ast_alloca(size);
memset(goto_str, 0, size);
snprintf(goto_str, size, "%s,%s,%d", ast_channel_context(chan), ast_channel_exten(chan), ast_channel_priority(chan));
pbx_builtin_setvar_helper(chan, varname, goto_str);
} else if (end > 1 && if_pri) {
/* END of branch */
snprintf(end_varname, sizeof(end_varname), "END_%s", varname);
if (!pbx_builtin_getvar_helper(chan, end_varname)) {
char *goto_str;
size = strlen(ast_channel_context(chan)) + strlen(ast_channel_exten(chan)) + 32;
goto_str = ast_alloca(size);
memset(goto_str, 0, size);
snprintf(goto_str, size, "%s,%s,%d", ast_channel_context(chan), ast_channel_exten(chan), ast_channel_priority(chan)+1);
pbx_builtin_setvar_helper(chan, end_varname, goto_str);
}
ast_parseable_goto(chan, if_pri);
}
return res;
}
static int if_exec(struct ast_channel *chan, const char *data) {
return if_helper(chan, data, 0);
}
static int elseif_exec(struct ast_channel *chan, const char *data) {
return if_helper(chan, data, 1);
}
static int end_exec(struct ast_channel *chan, const char *data) {
return if_helper(chan, data, 2);
}
static int else_exec(struct ast_channel *chan, const char *data) {
return if_helper(chan, data, 3);
}
static int exit_exec(struct ast_channel *chan, const char *data) {
return if_helper(chan, data, 4);
}
static int unload_module(void)
{
int res;
res = ast_unregister_application(if_app);
res |= ast_unregister_application(elseif_app);
res |= ast_unregister_application(stop_app);
res |= ast_unregister_application(else_app);
res |= ast_unregister_application(exit_app);
return res;
}
static int load_module(void)
{
int res;
res = ast_register_application_xml(if_app, if_exec);
res |= ast_register_application_xml(elseif_app, elseif_exec);
res |= ast_register_application_xml(stop_app, end_exec);
res |= ast_register_application_xml(else_app, else_exec);
res |= ast_register_application_xml(exit_app, exit_exec);
return res;
}
AST_MODULE_INFO_STANDARD_EXTENDED(ASTERISK_GPL_KEY, "If Branch and Conditional Execution");

View File

@ -639,6 +639,82 @@
</syntax>
</managerEventInstance>
</managerEvent>
<managerEvent language="en_US" name="MeetmeList">
<managerEventInstance class="EVENT_FLAG_CALL">
<synopsis>Raised in response to a MeetmeList command.</synopsis>
<syntax>
<parameter name="Conference">
<para>Conference ID.</para>
</parameter>
<parameter name="UserNumber">
<para>User ID.</para>
</parameter>
<parameter name="CallerIDNum">
<para>Caller ID number.</para>
</parameter>
<parameter name="CallerIDName">
<para>Caller ID name.</para>
</parameter>
<parameter name="ConnectedLineNum">
<para>Connected Line number.</para>
</parameter>
<parameter name="ConnectedLineName">
<para>Connected Line name.</para>
</parameter>
<parameter name="Channel">
<para>Channel name</para>
</parameter>
<parameter name="Admin">
<para>Whether or not the user is an admin.</para>
</parameter>
<parameter name="Role">
<para>User role. Can be "Listen only", "Talk only", or "Talk and listen".</para>
</parameter>
<parameter name="MarkedUser">
<para>Whether or not the user is a marked user.</para>
</parameter>
<parameter name="Muted">
<para>Whether or not the user is currently muted.</para>
</parameter>
<parameter name="Talking">
<para>Whether or not the user is currently talking.</para>
</parameter>
</syntax>
<see-also>
<ref type="manager">MeetmeList</ref>
<ref type="application">MeetMe</ref>
</see-also>
</managerEventInstance>
</managerEvent>
<managerEvent language="en_US" name="MeetmeListRooms">
<managerEventInstance class="EVENT_FLAG_CALL">
<synopsis>Raised in response to a MeetmeListRooms command.</synopsis>
<syntax>
<parameter name="Conference">
<para>Conference ID.</para>
</parameter>
<parameter name="Parties">
<para>Number of parties in the conference.</para>
</parameter>
<parameter name="Marked">
<para>Number of marked users in the conference.</para>
</parameter>
<parameter name="Activity">
<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>
</parameter>
<parameter name="Locked">
<para>Whether or not the conference is locked.</para>
</parameter>
</syntax>
<see-also>
<ref type="manager">MeetmeListRooms</ref>
<ref type="application">MeetMe</ref>
</see-also>
</managerEventInstance>
</managerEvent>
***/
#define CONFIG_FILE_NAME "meetme.conf"
@ -6073,7 +6149,7 @@ struct run_station_args {
static void answer_trunk_chan(struct ast_channel *chan)
{
ast_answer(chan);
ast_raw_answer(chan);
ast_indicate(chan, -1);
}
@ -6918,8 +6994,18 @@ static void *dial_trunk(void *data)
return NULL;
}
for (;;) {
/* Wait for dial to end, while servicing the channel */
while (ast_waitfor(trunk_ref->chan, 100)) {
unsigned int done = 0;
struct ast_frame *fr = ast_read(trunk_ref->chan);
if (!fr) {
ast_debug(1, "Channel %s did not return a frame, must have hung up\n", ast_channel_name(trunk_ref->chan));
done = 1;
break;
}
ast_frfree(fr); /* Ignore while dialing */
switch ((dial_res = ast_dial_state(dial))) {
case AST_DIAL_RESULT_ANSWERED:
trunk_ref->trunk->chan = ast_dial_answered(dial);
@ -6956,8 +7042,6 @@ static void *dial_trunk(void *data)
last_state = current_state;
}
/* avoid tight loop... sleep for 1/10th second */
ast_safe_sleep(trunk_ref->chan, 100);
}
if (!trunk_ref->trunk->chan) {
@ -7116,8 +7200,10 @@ static int sla_station_exec(struct ast_channel *chan, const char *data)
sla_change_trunk_state(trunk_ref->trunk, SLA_TRUNK_STATE_UP, ALL_TRUNK_REFS, NULL);
/* Create a thread to dial the trunk and dump it into the conference.
* However, we want to wait until the trunk has been dialed and the
* conference is created before continuing on here. */
ast_autoservice_start(chan);
* conference is created before continuing on here.
* Don't autoservice the channel or we'll have multiple threads
* handling it. dial_trunk services the channel.
*/
ast_mutex_init(&cond_lock);
ast_cond_init(&cond, NULL);
ast_mutex_lock(&cond_lock);
@ -7126,7 +7212,7 @@ static int sla_station_exec(struct ast_channel *chan, const char *data)
ast_mutex_unlock(&cond_lock);
ast_mutex_destroy(&cond_lock);
ast_cond_destroy(&cond);
ast_autoservice_stop(chan);
if (!trunk_ref->trunk->chan) {
ast_debug(1, "Trunk didn't get created. chan: %lx\n", (unsigned long) trunk_ref->trunk->chan);
pbx_builtin_setvar_helper(chan, "SLASTATION_STATUS", "CONGESTION");

View File

@ -90,6 +90,16 @@
<para>Play a periodic beep while this call is being recorded.</para>
<argument name="interval"><para>Interval, in seconds. Default is 15.</para></argument>
</option>
<option name="c">
<para>Use the real Caller ID from the channel for the voicemail Caller ID.</para>
<para>By default, the Connected Line is used. If you want the channel caller's
real number, you may need to specify this option.</para>
</option>
<option name="d">
<para>Delete the recording file as soon as MixMonitor is done with it.</para>
<para>For example, if you use the m option to dispatch the recording to a voicemail box,
you can specify this option to delete the original copy of it afterwards.</para>
</option>
<option name="v">
<para>Adjust the <emphasis>heard</emphasis> volume by a factor of <replaceable>x</replaceable>
(range <literal>-4</literal> to <literal>4</literal>)</para>
@ -407,6 +417,8 @@ enum mixmonitor_flags {
MUXFLAG_BEEP_STOP = (1 << 13),
MUXFLAG_DEPRECATED_RWSYNC = (1 << 14),
MUXFLAG_NO_RWSYNC = (1 << 15),
MUXFLAG_AUTO_DELETE = (1 << 16),
MUXFLAG_REAL_CALLERID = (1 << 17),
};
enum mixmonitor_args {
@ -427,6 +439,8 @@ AST_APP_OPTIONS(mixmonitor_opts, {
AST_APP_OPTION('a', MUXFLAG_APPEND),
AST_APP_OPTION('b', MUXFLAG_BRIDGED),
AST_APP_OPTION_ARG('B', MUXFLAG_BEEP, OPT_ARG_BEEP_INTERVAL),
AST_APP_OPTION('c', MUXFLAG_REAL_CALLERID),
AST_APP_OPTION('d', MUXFLAG_AUTO_DELETE),
AST_APP_OPTION('p', MUXFLAG_BEEP_START),
AST_APP_OPTION('P', MUXFLAG_BEEP_STOP),
AST_APP_OPTION_ARG('v', MUXFLAG_READVOLUME, OPT_ARG_READVOLUME),
@ -860,6 +874,19 @@ static void *mixmonitor_thread(void *obj)
ast_debug(3, "No recipients to forward monitor to, moving on.\n");
}
if (ast_test_flag(mixmonitor, MUXFLAG_AUTO_DELETE)) {
ast_debug(3, "Deleting our copies of recording files\n");
if (!ast_strlen_zero(fs_ext)) {
ast_filedelete(mixmonitor->filename, fs_ext);
}
if (!ast_strlen_zero(fs_read_ext)) {
ast_filedelete(mixmonitor->filename_read, fs_ext);
}
if (!ast_strlen_zero(fs_write_ext)) {
ast_filedelete(mixmonitor->filename_write, fs_ext);
}
}
mixmonitor_free(mixmonitor);
ast_module_unref(ast_module_info->self);
@ -1015,20 +1042,37 @@ static int launch_monitor_thread(struct ast_channel *chan, const char *filename,
if (!ast_strlen_zero(recipients)) {
char callerid[256];
struct ast_party_connected_line *connected;
ast_channel_lock(chan);
/* We use the connected line of the invoking channel for caller ID. */
/* We use the connected line of the invoking channel for caller ID,
* unless we've been told to use the Caller ID.
* The initial use for this relied on Connected Line to get the
* actual number for recording with Digium phones,
* but in generic use the Caller ID is likely what people want.
*/
connected = ast_channel_connected(chan);
ast_debug(3, "Connected Line CID = %d - %s : %d - %s\n", connected->id.name.valid,
connected->id.name.str, connected->id.number.valid,
connected->id.number.str);
ast_callerid_merge(callerid, sizeof(callerid),
S_COR(connected->id.name.valid, connected->id.name.str, NULL),
S_COR(connected->id.number.valid, connected->id.number.str, NULL),
"Unknown");
if (ast_test_flag(mixmonitor, MUXFLAG_REAL_CALLERID)) {
struct ast_party_caller *caller;
caller = ast_channel_caller(chan);
ast_debug(3, "Caller ID = %d - %s : %d - %s\n", caller->id.name.valid,
caller->id.name.str, caller->id.number.valid,
caller->id.number.str);
ast_callerid_merge(callerid, sizeof(callerid),
S_COR(caller->id.name.valid, caller->id.name.str, NULL),
S_COR(caller->id.number.valid, caller->id.number.str, NULL),
"Unknown");
} else {
struct ast_party_connected_line *connected;
connected = ast_channel_connected(chan);
ast_debug(3, "Connected Line CID = %d - %s : %d - %s\n", connected->id.name.valid,
connected->id.name.str, connected->id.number.valid,
connected->id.number.str);
ast_callerid_merge(callerid, sizeof(callerid),
S_COR(connected->id.name.valid, connected->id.name.str, NULL),
S_COR(connected->id.number.valid, connected->id.number.str, NULL),
"Unknown");
}
ast_string_field_set(mixmonitor, call_context, ast_channel_context(chan));
ast_string_field_set(mixmonitor, call_macrocontext, ast_channel_macrocontext(chan));

View File

@ -101,7 +101,7 @@ static int mp3play(const char *filename, unsigned int sampling_rate, int fd)
/* Execute mpg123, but buffer if it's a net connection */
if (!strncasecmp(filename, "http://", 7) && strstr(filename, ".m3u")) {
char buffer_size_str[8];
snprintf(buffer_size_str, 8, "%u", (int) 0.5*2*sampling_rate/1000); // 0.5 seconds for a live stream
snprintf(buffer_size_str, 8, "%u", (int) 0.5*2*sampling_rate/1000); /* 0.5 seconds for a live stream */
/* Most commonly installed in /usr/local/bin */
execl(LOCAL_MPG_123, "mpg123", "-e", "s16", "-q", "-s", "-b", buffer_size_str, "-f", "8192", "--mono", "-r", sampling_rate_str, "-@", filename, (char *)NULL);
/* But many places has it in /usr/bin */
@ -111,7 +111,7 @@ static int mp3play(const char *filename, unsigned int sampling_rate, int fd)
}
else if (!strncasecmp(filename, "http://", 7)) {
char buffer_size_str[8];
snprintf(buffer_size_str, 8, "%u", 6*2*sampling_rate/1000); // 6 seconds for a remote MP3 file
snprintf(buffer_size_str, 8, "%u", 6*2*sampling_rate/1000); /* 6 seconds for a remote MP3 file */
/* Most commonly installed in /usr/local/bin */
execl(LOCAL_MPG_123, "mpg123", "-e", "s16", "-q", "-s", "-b", buffer_size_str, "-f", "8192", "--mono", "-r", sampling_rate_str, filename, (char *)NULL);
/* But many places has it in /usr/bin */

View File

@ -377,6 +377,26 @@ static int pop_exec(struct ast_channel *chan, const char *data)
return res;
}
static int frames_left(struct ast_channel *chan)
{
struct ast_datastore *stack_store;
struct gosub_stack_list *oldlist;
int exists;
ast_channel_lock(chan);
stack_store = ast_channel_datastore_find(chan, &stack_info, NULL);
if (!stack_store) {
ast_channel_unlock(chan);
return -1;
}
oldlist = stack_store->data;
AST_LIST_LOCK(oldlist);
exists = oldlist->first ? 1 : 0;
AST_LIST_UNLOCK(oldlist);
ast_channel_unlock(chan);
return exists;
}
static int return_exec(struct ast_channel *chan, const char *data)
{
struct ast_datastore *stack_store;
@ -384,6 +404,7 @@ static int return_exec(struct ast_channel *chan, const char *data)
struct gosub_stack_list *oldlist;
const char *retval = data;
int res = 0;
int lastframe;
ast_channel_lock(chan);
if (!(stack_store = ast_channel_datastore_find(chan, &stack_info, NULL))) {
@ -395,6 +416,7 @@ static int return_exec(struct ast_channel *chan, const char *data)
oldlist = stack_store->data;
AST_LIST_LOCK(oldlist);
oldframe = AST_LIST_REMOVE_HEAD(oldlist, entries);
lastframe = oldlist->first ? 0 : 1;
AST_LIST_UNLOCK(oldlist);
if (!oldframe) {
@ -412,12 +434,19 @@ static int return_exec(struct ast_channel *chan, const char *data)
* what was there before. Channels that do not have a PBX may
* not have the context or exten set.
*/
ast_channel_context_set(chan, oldframe->context);
ast_channel_exten_set(chan, oldframe->extension);
if (ast_test_flag(ast_channel_flags(chan), AST_FLAG_IN_AUTOLOOP)) {
--oldframe->priority;
if (ast_channel_pbx(chan) || !lastframe) {
/* If there's no PBX, the "old location" is simply
* the configured context for the device, such as
* for pre-dial handlers, and restoring this location
* is nonsensical. So if no PBX and there are no further
* frames, leave the location as it is. */
ast_channel_context_set(chan, oldframe->context);
ast_channel_exten_set(chan, oldframe->extension);
if (ast_test_flag(ast_channel_flags(chan), AST_FLAG_IN_AUTOLOOP)) {
--oldframe->priority;
}
ast_channel_priority_set(chan, oldframe->priority);
}
ast_channel_priority_set(chan, oldframe->priority);
ast_set2_flag(ast_channel_flags(chan), oldframe->in_subroutine, AST_FLAG_SUBROUTINE_EXEC);
gosub_release_frame(chan, oldframe);
@ -1068,15 +1097,18 @@ static int gosub_run(struct ast_channel *chan, const char *sub_args, int ignore_
ast_channel_priority(chan), ast_channel_name(chan));
}
/* Did the routine return? */
if (ast_channel_priority(chan) == saved_priority
/* Did the routine return?
* For things like predial where there's no PBX on the channel yet,
* the last return leaves the location alone so we can print it out correctly here.
* So to ensure we finished properly, make sure there are no frames left in that case. */
if ((!ast_channel_pbx(chan) && !frames_left(chan)) || (ast_channel_priority(chan) == saved_priority
&& !strcmp(ast_channel_context(chan), saved_context)
&& !strcmp(ast_channel_exten(chan), saved_exten)) {
&& !strcmp(ast_channel_exten(chan), saved_exten))) {
ast_verb(3, "%s Internal %s(%s) complete GOSUB_RETVAL=%s\n",
ast_channel_name(chan), app_gosub, sub_args,
S_OR(pbx_builtin_getvar_helper(chan, "GOSUB_RETVAL"), ""));
} else {
ast_log(LOG_NOTICE, "%s Abnormal '%s(%s)' exit. Popping routine return locations.\n",
ast_log(LOG_WARNING, "%s Abnormal '%s(%s)' exit. Popping routine return locations.\n",
ast_channel_name(chan), app_gosub, sub_args);
balance_stack(chan);
pbx_builtin_setvar_helper(chan, "GOSUB_RETVAL", "");

View File

@ -570,6 +570,7 @@ static AST_LIST_HEAD_STATIC(vmstates, vmstate);
#define VM_MOVEHEARD (1 << 16) /*!< Move a "heard" message to Old after listening to it */
#define VM_MESSAGEWRAP (1 << 17) /*!< Wrap around from the last message to the first, and vice-versa */
#define VM_FWDURGAUTO (1 << 18) /*!< Autoset of Urgent flag on forwarded Urgent messages set globally */
#define VM_EMAIL_EXT_RECS (1 << 19) /*!< Send voicemail emails when an external recording is added to a mailbox */
#define ERROR_LOCK_PATH -100
#define ERROR_MAX_MSGS -101
#define OPERATOR_EXIT 300
@ -1258,6 +1259,8 @@ static void apply_option(struct ast_vm_user *vmu, const char *var, const char *v
ast_set2_flag(vmu, ast_true(value), VM_ATTACH);
} else if (!strcasecmp(var, "attachfmt")) {
ast_copy_string(vmu->attachfmt, value, sizeof(vmu->attachfmt));
} else if (!strcasecmp(var, "attachextrecs")) {
ast_set2_flag(vmu, ast_true(value), VM_EMAIL_EXT_RECS);
} else if (!strcasecmp(var, "serveremail")) {
ast_copy_string(vmu->serveremail, value, sizeof(vmu->serveremail));
} else if (!strcasecmp(var, "fromstring")) {
@ -6418,6 +6421,12 @@ static int msg_create_from_file(struct ast_vm_recording_data *recdata)
* to do both with one line and is also safe to use with file storage mode. Also, if we are using ODBC, now is a good
* time to create the voicemail database entry. */
if (ast_fileexists(destination, NULL, NULL) > 0) {
struct ast_channel *chan = NULL;
char fmt[80];
char clid[80];
char cidnum[80], cidname[80];
int send_email;
if (ast_check_realtime("voicemail_data")) {
get_date(date, sizeof(date));
ast_store_realtime("voicemail_data",
@ -6437,7 +6446,27 @@ static int msg_create_from_file(struct ast_vm_recording_data *recdata)
}
STORE(dir, recipient->mailbox, recipient->context, msgnum, NULL, recipient, fmt, 0, vms, "", msg_id);
notify_new_state(recipient);
send_email = ast_test_flag(recipient, VM_EMAIL_EXT_RECS);
if (send_email) {
/* Send an email if possible, fall back to just notifications if not. */
ast_copy_string(fmt, recdata->recording_ext, sizeof(fmt));
ast_copy_string(clid, recdata->call_callerid, sizeof(clid));
ast_callerid_split(clid, cidname, sizeof(cidname), cidnum, sizeof(cidnum));
/* recdata->call_callerchan itself no longer exists, so we can't use the real channel. Use a dummy one. */
chan = ast_dummy_channel_alloc();
}
if (chan) {
notify_new_message(chan, recipient, NULL, msgnum, duration, fmt, cidnum, cidname, "");
ast_channel_unref(chan);
} else {
if (send_email) { /* We tried and failed. */
ast_log(LOG_WARNING, "Failed to allocate dummy channel, email will not be sent\n");
}
notify_new_state(recipient);
}
}
free_user(recipient);
@ -11197,12 +11226,14 @@ static int vm_authenticate(struct ast_channel *chan, char *mailbox, int mailbox_
password[0] = '\0';
} else {
if (ast_streamfile(chan, vm_password, ast_channel_language(chan))) {
ast_log(AST_LOG_WARNING, "Unable to stream password file\n");
if (!ast_check_hangup(chan)) {
ast_log(AST_LOG_WARNING, "Unable to stream password file\n");
}
free_user(vmu);
return -1;
}
if (ast_readstring(chan, password, sizeof(password) - 1, 2000, 10000, "#") < 0) {
ast_log(AST_LOG_WARNING, "Unable to read password\n");
ast_log(AST_LOG_NOTICE, "Unable to read password\n");
free_user(vmu);
return -1;
} else if (password[0] == '*') {

View File

@ -120,6 +120,9 @@
<configOption name="end_marked">
<synopsis>Kick the user from the conference when the last marked user leaves</synopsis>
</configOption>
<configOption name="end_marked_any">
<synopsis>Kick the user from the conference when any marked user leaves</synopsis>
</configOption>
<configOption name="talk_detection_events">
<synopsis>Set whether or not notifications of when a user begins and ends talking should be sent out as events over AMI</synopsis>
</configOption>
@ -1440,10 +1443,7 @@ static int add_menu_entry(struct conf_menu *menu, const char *dtmf, const char *
/* if adding any of the actions failed, bail */
if (res) {
struct conf_menu_action *menu_action;
while ((menu_action = AST_LIST_REMOVE_HEAD(&menu_entry->actions, action))) {
ast_free(menu_action);
}
conf_menu_entry_destroy(menu_entry);
ast_free(menu_entry);
return -1;
}
@ -1452,6 +1452,7 @@ static int add_menu_entry(struct conf_menu *menu, const char *dtmf, const char *
AST_LIST_TRAVERSE_SAFE_BEGIN(&menu->entries, cur, entry) {
if (!strcasecmp(cur->dtmf, menu_entry->dtmf)) {
AST_LIST_REMOVE_CURRENT(entry);
conf_menu_entry_destroy(cur);
ast_free(cur);
break;
}
@ -1583,9 +1584,12 @@ static char *handle_cli_confbridge_show_user_profile(struct ast_cli_entry *e, in
ast_cli(a->fd,"Wait Marked: %s\n",
u_profile.flags & USER_OPT_WAITMARKED ?
"enabled" : "disabled");
ast_cli(a->fd,"END Marked: %s\n",
ast_cli(a->fd,"END Marked (All): %s\n",
u_profile.flags & USER_OPT_ENDMARKED ?
"enabled" : "disabled");
ast_cli(a->fd,"END Marked (Any): %s\n",
u_profile.flags & USER_OPT_ENDMARKEDANY ?
"enabled" : "disabled");
ast_cli(a->fd,"Drop_silence: %s\n",
u_profile.flags & USER_OPT_DROP_SILENCE ?
"enabled" : "disabled");
@ -2409,6 +2413,7 @@ int conf_load_config(void)
aco_option_register(&cfg_info, "announce_only_user", ACO_EXACT, user_types, "yes", OPT_BOOLFLAG_T, 0, FLDSET(struct user_profile, flags), USER_OPT_NOONLYPERSON);
aco_option_register(&cfg_info, "wait_marked", ACO_EXACT, user_types, "no", OPT_BOOLFLAG_T, 1, FLDSET(struct user_profile, flags), USER_OPT_WAITMARKED);
aco_option_register(&cfg_info, "end_marked", ACO_EXACT, user_types, "no", OPT_BOOLFLAG_T, 1, FLDSET(struct user_profile, flags), USER_OPT_ENDMARKED);
aco_option_register(&cfg_info, "end_marked_any", ACO_EXACT, user_types, "no", OPT_BOOLFLAG_T, 1, FLDSET(struct user_profile, flags), USER_OPT_ENDMARKEDANY);
aco_option_register(&cfg_info, "talk_detection_events", ACO_EXACT, user_types, "no", OPT_BOOLFLAG_T, 1, FLDSET(struct user_profile, flags), USER_OPT_TALKER_DETECT);
aco_option_register(&cfg_info, "dtmf_passthrough", ACO_EXACT, user_types, "no", OPT_BOOLFLAG_T, 1, FLDSET(struct user_profile, flags), USER_OPT_DTMF_PASS);
aco_option_register(&cfg_info, "announce_join_leave", ACO_EXACT, user_types, "no", OPT_BOOLFLAG_T, 1, FLDSET(struct user_profile, flags), USER_OPT_ANNOUNCE_JOIN_LEAVE);

View File

@ -14,9 +14,6 @@
* This program is free software, distributed under the terms of
* the GNU General Public License Version 2. See the LICENSE file
* at the top of the source tree.
*
* Please follow coding guidelines
* http://svn.digium.com/view/asterisk/trunk/doc/CODING-GUIDELINES
*/
/*! \file

View File

@ -14,9 +14,6 @@
* This program is free software, distributed under the terms of
* the GNU General Public License Version 2. See the LICENSE file
* at the top of the source tree.
*
* Please follow coding guidelines
* http://svn.digium.com/view/asterisk/trunk/doc/CODING-GUIDELINES
*/
/*! \file

View File

@ -14,9 +14,6 @@
* This program is free software, distributed under the terms of
* the GNU General Public License Version 2. See the LICENSE file
* at the top of the source tree.
*
* Please follow coding guidelines
* http://svn.digium.com/view/asterisk/trunk/doc/CODING-GUIDELINES
*/
/*! \file

View File

@ -14,9 +14,6 @@
* This program is free software, distributed under the terms of
* the GNU General Public License Version 2. See the LICENSE file
* at the top of the source tree.
*
* Please follow coding guidelines
* http://svn.digium.com/view/asterisk/trunk/doc/CODING-GUIDELINES
*/
/*! \file

View File

@ -14,9 +14,6 @@
* This program is free software, distributed under the terms of
* the GNU General Public License Version 2. See the LICENSE file
* at the top of the source tree.
*
* Please follow coding guidelines
* http://svn.digium.com/view/asterisk/trunk/doc/CODING-GUIDELINES
*/
/*! \file
@ -85,37 +82,39 @@ static void leave_marked(struct confbridge_user *user)
conf_remove_user_marked(user->conference, user);
if (user->conference->markedusers == 0) {
AST_LIST_TRAVERSE_SAFE_BEGIN(&user->conference->active_list, user_iter, list) {
/* Kick ENDMARKED cbu_iters */
if (ast_test_flag(&user_iter->u_profile, USER_OPT_ENDMARKED) && !user_iter->kicked) {
if (ast_test_flag(&user_iter->u_profile, USER_OPT_WAITMARKED)
&& !ast_test_flag(&user_iter->u_profile, USER_OPT_MARKEDUSER)) {
AST_LIST_REMOVE_CURRENT(list);
user_iter->conference->activeusers--;
AST_LIST_INSERT_TAIL(&user_iter->conference->waiting_list, user_iter, list);
user_iter->conference->waitingusers++;
}
user_iter->kicked = 1;
pbx_builtin_setvar_helper(user_iter->chan, "CONFBRIDGE_RESULT", "ENDMARKED");
ast_bridge_remove(user_iter->conference->bridge, user_iter->chan);
} else if (ast_test_flag(&user_iter->u_profile, USER_OPT_WAITMARKED)
&& !ast_test_flag(&user_iter->u_profile, USER_OPT_MARKEDUSER)) {
need_prompt = 1;
/* If all marked users have left, or we're set to kick if any marked user leaves, then boot everyone */
AST_LIST_TRAVERSE_SAFE_BEGIN(&user->conference->active_list, user_iter, list) {
if (user->conference->markedusers > 0 && !ast_test_flag(&user_iter->u_profile, USER_OPT_ENDMARKEDANY)) {
continue;
}
/* Kick ENDMARKED cbu_iters */
if ((ast_test_flag(&user_iter->u_profile, USER_OPT_ENDMARKED) || ast_test_flag(&user_iter->u_profile, USER_OPT_ENDMARKEDANY)) && !user_iter->kicked) {
if (ast_test_flag(&user_iter->u_profile, USER_OPT_WAITMARKED)
&& (!ast_test_flag(&user_iter->u_profile, USER_OPT_MARKEDUSER) || ast_test_flag(&user_iter->u_profile, USER_OPT_ENDMARKEDANY))) {
AST_LIST_REMOVE_CURRENT(list);
user_iter->conference->activeusers--;
AST_LIST_INSERT_TAIL(&user_iter->conference->waiting_list, user_iter, list);
user_iter->conference->waitingusers++;
} else {
/* User is neither wait_marked nor end_marked; however, they
* should still hear the prompt.
*/
need_prompt = 1;
}
user_iter->kicked = 1;
pbx_builtin_setvar_helper(user_iter->chan, "CONFBRIDGE_RESULT", "ENDMARKED");
ast_bridge_remove(user_iter->conference->bridge, user_iter->chan);
} else if (ast_test_flag(&user_iter->u_profile, USER_OPT_WAITMARKED)
&& !ast_test_flag(&user_iter->u_profile, USER_OPT_MARKEDUSER)) {
need_prompt = 1;
AST_LIST_REMOVE_CURRENT(list);
user_iter->conference->activeusers--;
AST_LIST_INSERT_TAIL(&user_iter->conference->waiting_list, user_iter, list);
user_iter->conference->waitingusers++;
} else {
/* User is neither wait_marked nor end_marked nor end_marked_any; however, they
* should still hear the prompt.
*/
need_prompt = 1;
}
AST_LIST_TRAVERSE_SAFE_END;
}
AST_LIST_TRAVERSE_SAFE_END;
switch (user->conference->activeusers) {
case 0:

View File

@ -14,9 +14,6 @@
* This program is free software, distributed under the terms of
* the GNU General Public License Version 2. See the LICENSE file
* at the top of the source tree.
*
* Please follow coding guidelines
* http://svn.digium.com/view/asterisk/trunk/doc/CODING-GUIDELINES
*/
/*! \file

View File

@ -14,9 +14,6 @@
* This program is free software, distributed under the terms of
* the GNU General Public License Version 2. See the LICENSE file
* at the top of the source tree.
*
* Please follow coding guidelines
* http://svn.digium.com/view/asterisk/trunk/doc/CODING-GUIDELINES
*/
/*! \file

View File

@ -14,9 +14,6 @@
* This program is free software, distributed under the terms of
* the GNU General Public License Version 2. See the LICENSE file
* at the top of the source tree.
*
* Please follow coding guidelines
* http://svn.digium.com/view/asterisk/trunk/doc/CODING-GUIDELINES
*/
/*! \file

View File

@ -71,6 +71,7 @@ enum user_profile_flags {
USER_OPT_TEXT_MESSAGING = (1 << 19), /*!< Send text messages to the user */
USER_OPT_ANSWER_CHANNEL = (1 << 20), /*!< Sets if the channel should be answered if currently unanswered */
USER_OPT_HEAR_OWN_JOIN_SOUND = (1 << 21), /*!< Set if the caller should hear the join sound */
USER_OPT_ENDMARKEDANY = (1 << 22), /*!< Set if the user should be kicked after any marked user exits */
};
enum bridge_profile_flags {

View File

@ -0,0 +1,279 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><title>Release Summary - asterisk-20.1.0</title><h1 align="center"><a name="top">Release Summary</a></h1><h3 align="center">asterisk-20.1.0</h3><h3 align="center">Date: 2023-01-12</h3><h3 align="center">&lt;asteriskteam@digium.com&gt;</h3><hr><h2 align="center">Table of Contents</h2><ol>
<li><a href="#summary">Summary</a></li>
<li><a href="#contributors">Contributors</a></li>
<li><a href="#closed_issues">Closed Issues</a></li>
<li><a href="#open_issues">Open Issues</a></li>
<li><a href="#commits">Other Changes</a></li>
<li><a href="#diffstat">Diffstat</a></li>
</ol><hr><a name="summary"><h2 align="center">Summary</h2></a><center><a href="#top">[Back to Top]</a></center><p>This release is a point release of an existing major version. The changes included were made to address problems that have been identified in this release series, or are minor, backwards compatible new features or improvements. Users should be able to safely upgrade to this version if this release series is already in use. Users considering upgrading from a previous version are strongly encouraged to review the UPGRADE.txt document as well as the CHANGES document for information about upgrading to this release series.</p><p>The data in this summary reflects changes that have been made since the previous release, asterisk-20.0.0.</p><hr><a name="contributors"><h2 align="center">Contributors</h2></a><center><a href="#top">[Back to Top]</a></center><p>This table lists the people who have submitted code, those that have tested patches, as well as those that reported issues on the issue tracker that were resolved in this release. For coders, the number is how many of their patches (of any size) were committed into this release. For testers, the number is the number of times their name was listed as assisting with testing a patch. Finally, for reporters, the number is the number of issues that they reported that were affected by commits that went into this release.</p><table width="100%" border="0">
<tr><th width="33%">Coders</th><th width="33%">Testers</th><th width="33%">Reporters</th></tr>
<tr valign="top"><td width="33%">39 Naveen Albert <asterisk@phreaknet.org><br/>7 George Joseph <gjoseph@digium.com><br/>5 Philip Prindeville <philipp@redfish-solutions.com><br/>4 Asterisk Development Team <asteriskteam@digium.com><br/>4 Mike Bradeen <mbradeen@sangoma.com><br/>3 Maximilian Fridrich <m.fridrich@commend.com><br/>3 Joshua C. Colp <jcolp@sangoma.com><br/>2 Jaco Kroon <jaco@uls.co.za><br/>2 Michael Kuron <m.kuron@gmx.de><br/>2 Marcel Wagner <mwagner@sipgate.de><br/>1 Birger Harzenetter (license 5870)<br/>1 Holger Hans Peter Freyther <holger@moiji-mobile.com><br/>1 Igor Goncharovsky <igor.goncharovsky@gmail.com><br/>1 Frederic LE FOLL <frederic.lefoll@c-s.fr><br/>1 Alexandre Fournier <afournier@wazo.io><br/>1 Ben Ford <bford@digium.com><br/>1 Henning Westerholt <hw@gilawa.com><br/></td><td width="33%">1 inspecting SIP traces.<br/></td><td width="33%">37 N A <asterisk@phreaknet.org><br/>7 George Joseph <gjoseph@digium.com><br/>4 Philip Prindeville <philipp@redfish-solutions.com><br/>3 Matt Jordan <mjordan@digium.com><br/>3 Maximilian Fridrich <m.fridrich@commend.com><br/>2 Michael Bradeen <mbradeen@sangoma.com><br/>2 Marcel Wagner <mwagner@sipgate.de><br/>2 Joshua C. Colp <jcolp@digium.com><br/>1 Igor Yeroshev <igor.yeroshev@kaspi.kz><br/>1 David Uczen <duczen@fluentstream.com><br/>1 Alexandre Fournier <afournier@wazo.io><br/>1 Igor Goncharovsky <igor.goncharovsky@gmail.com><br/>1 Frederic LE FOLL <frederic.lefoll@c-s.fr><br/>1 shawty <shawty.d.ds@googlemail.com><br/>1 David Woolley <forums@david-woolley.me.uk><br/>1 nappsoft <infos@nappsoft.ch><br/>1 Jesse Ross <jesseross92@gmail.com><br/>1 Joeran Vinzens <vinzens@sipgate.de><br/>1 Henning Westerholt <hw@gilawa.com><br/>1 Benjamin Keith Ford <bford@digium.com><br/>1 Saken <saken.tastemirov@kaspi.kz><br/></td></tr>
</table><hr><a name="closed_issues"><h2 align="center">Closed Issues</h2></a><center><a href="#top">[Back to Top]</a></center><p>This is a list of all issues from the issue tracker that were closed by changes that went into this release.</p><h3>Security</h3><h4>Category: Addons/chan_ooh323</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30103">ASTERISK-30103</a>: chan_ooh323 Vulnerability in calling/called party IE<br/>Reported by: Michael Bradeen<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=eb1d7ab53cf8ba8c42432cdedd5943102efe5101">[eb1d7ab53c]</a> Mike Bradeen -- ooh323c: not checking for IE minimum length</li>
</ul><br><h4>Category: Core/ManagerInterface</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30176">ASTERISK-30176</a>: manager: GetConfig can read files outside of Asterisk<br/>Reported by: shawty<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=81f10e847efdbe8ec264062ee234e1098c29b3f6">[81f10e847e]</a> Mike Bradeen -- manager: prevent file access outside of config dir</li>
</ul><br><h4>Category: pjproject/pjsip</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30338">ASTERISK-30338</a>: pjproject: Backport security fixes from 2.13<br/>Reported by: Benjamin Keith Ford<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=d4769947688a54ac926240ed4a68d16a3d1807ba">[d476994768]</a> Ben Ford -- pjproject: 2.13 security fixes</li>
</ul><br><h3>Improvement</h3><h4>Category: Applications/app_mixmonitor</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30286">ASTERISK-30286</a>: app_mixmonitor: Add option to use real Caller ID for Caller ID<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=691178c48e58923b7c3b122f90a663a83d9695e1">[691178c48e]</a> Naveen Albert -- app_mixmonitor: Add option to use real Caller ID for voicemail.</li>
</ul><br><h4>Category: Core/Bridging</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30223">ASTERISK-30223</a>: features: add no-answer option to Bridge application<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=a5ec60e6c61fd5addb8a2381e944d4a4a42e985e">[a5ec60e6c6]</a> Naveen Albert -- features: Add no answer option to Bridge.</li>
</ul><br><h4>Category: Core/General</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30290">ASTERISK-30290</a>: file.c: Don't emit warnings on winks.<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=8142b313c36e96f46c29938ded8fca5494064a80">[8142b313c3]</a> Naveen Albert -- file.c: Don't emit warnings on winks.</li>
</ul><br><h4>Category: Core/RTP</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30327">ASTERISK-30327</a>: rtp_engine.h: Remove obsolete example usage<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=a4bcdce1db1aa411b6895456dc939800837437d3">[a4bcdce1db]</a> Naveen Albert -- rtp_engine.h: Update examples using ast_format_set.</li>
</ul><br><h4>Category: Documentation</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30328">ASTERISK-30328</a>: Typo in from_domain description on res_pjsip configuration documentation<br/>Reported by: Marcel Wagner<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=58534b309fe0aa212c32c85f1c0497b0738a624b">[58534b309f]</a> Marcel Wagner -- res_pjsip: Fix typo in from_domain documentation</li>
</ul><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30316">ASTERISK-30316</a>: res_pjsip: Documentation should point out default if contact_user is not being set for outbound registrations<br/>Reported by: Marcel Wagner<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=b83af13f65ba271c041e18fd344bb0b057aa00bc">[b83af13f65]</a> Marcel Wagner -- res_pjsip: Update contact_user to point out default</li>
</ul><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30289">ASTERISK-30289</a>: xmldoc: Allow XML docs to be reloaded<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=52c7d3ed07a744a2f2a199ba58e3a9896b63af19">[52c7d3ed07]</a> Naveen Albert -- xmldoc: Allow XML docs to be reloaded.</li>
</ul><br><h4>Category: PBX/General</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30308">ASTERISK-30308</a>: pbx_builtins: Allow Answer to return immediately<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=c7df5ee7c134606e1dd9b255f4d67012c09b0f8c">[c7df5ee7c1]</a> Naveen Albert -- pbx_builtins: Allow Answer to return immediately.</li>
</ul><br><h4>Category: Resources/res_pjsip</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30158">ASTERISK-30158</a>: PJSIP: Add new 100rel option "peer_supported"<br/>Reported by: Maximilian Fridrich<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=5bbad0d27c967a28a5824ae10fdca714e064c46d">[5bbad0d27c]</a> Maximilian Fridrich -- res_pjsip: Add 100rel option "peer_supported".</li>
</ul><br><h4>Category: Resources/res_pjsip_geolocation</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30241">ASTERISK-30241</a>: res_pjsip_gelocation: Downgrade some NOTICE scope trace debugs to DEBUG level<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=8afb313a4307dbff8849b036703775d8770d21a9">[8afb313a43]</a> Naveen Albert -- res_pjsip_geolocation: Change some notices to debugs.</li>
</ul><br><h4>Category: Tests/General</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30295">ASTERISK-30295</a>: test_json: Remove duplicated static function<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=1e77b8c473c624e0d8c1a1c1ea8ab455d89c7e34">[1e77b8c473]</a> Naveen Albert -- test_json: Remove duplicated static function.</li>
</ul><br><h3>Bug</h3><h4>Category: Applications/app_if</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30349">ASTERISK-30349</a>: app_if: Format truncation error<br/>Reported by: George Joseph<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=2f9cdfbc508fe0c1defd2743cee234c424571388">[2f9cdfbc50]</a> Naveen Albert -- app_if: Fix format truncation errors.</li>
</ul><br><h4>Category: Applications/app_meetme</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-29998">ASTERISK-29998</a>: sla: deadlock when calling SLAStation application<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=2efa290d3c96cbcfa6095b1361863f7bc19b14a6">[2efa290d3c]</a> Naveen Albert -- sla: Prevent deadlock and crash due to autoservicing.</li>
</ul><br><h4>Category: Applications/app_saynumber</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30248">ASTERISK-30248</a>: ast_get_digit_str adds bogus initial delimiter if first character not to be spoken<br/>Reported by: David Woolley<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=407216a0a56afdd692be4f7253ce710eb10d02d2">[407216a0a5]</a> Naveen Albert -- say: Don't prepend ampersand erroneously.</li>
</ul><br><h4>Category: Applications/app_stack</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30076">ASTERISK-30076</a>: app_stack: Incorrect exit location in predial handlers logged<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=dfe2f38642099a8797037964c7dff7e15abdff56">[dfe2f38642]</a> Naveen Albert -- app_stack: Print proper exit location for PBXless channels.</li>
</ul><br><h4>Category: Applications/app_voicemail</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30283">ASTERISK-30283</a>: app_voicemail: Fix msg_create_from_file not sending email to user<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=b9c031c1f82244e00fddfc9f5e8f0d83e5548b34">[b9c031c1f8]</a> Naveen Albert -- app_voicemail: Fix missing email in msg_create_from_file.</li>
</ul><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30248">ASTERISK-30248</a>: ast_get_digit_str adds bogus initial delimiter if first character not to be spoken<br/>Reported by: David Woolley<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=407216a0a56afdd692be4f7253ce710eb10d02d2">[407216a0a5]</a> Naveen Albert -- say: Don't prepend ampersand erroneously.</li>
</ul><br><h4>Category: Channels/chan_dahdi</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30336">ASTERISK-30336</a>: sig_analog: Fix no timeout duration<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=b90e57758befa4048f3a56493e9ee23afec7eb6b">[b90e57758b]</a> Naveen Albert -- sig_analog: Fix no timeout duration.</li>
</ul><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30274">ASTERISK-30274</a>: chan_dahdi: Unavailable channels are BUSY<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=180ca32565efbed902463e06d9ee200d4dc25a06">[180ca32565]</a> Naveen Albert -- chan_dahdi: Fix unavailable channels returning busy.</li>
</ul><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30256">ASTERISK-30256</a>: chan_dahdi: Fix format truncation warnings<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=98fc05f13b0b245d7a5a077153da47229d142323">[98fc05f13b]</a> Naveen Albert -- chan_dahdi: Resolve format truncation warning.</li>
</ul><br><h4>Category: Channels/chan_local</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30239">ASTERISK-30239</a>: Prometheus plugin crashes Asterisk when using local channel<br/>Reported by: Joeran Vinzens<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=62881c668b0e7cb097e2c36f0e88d18dcd1aa38d">[62881c668b]</a> Holger Hans Peter Freyther -- res_prometheus: Do not crash on invisible bridges</li>
</ul><br><h4>Category: Channels/chan_pjsip</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30184">ASTERISK-30184</a>: res_pjsip_session: re-INVITE after answering results in wrong stream direction of first call leg<br/>Reported by: Maximilian Fridrich<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=60b81eabe080af842d81b9d84d1dcedb24b87398">[60b81eabe0]</a> Maximilian Fridrich -- core & res_pjsip: Improve topology change handling.</li>
</ul><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30193">ASTERISK-30193</a>: chan_pjsip should return all codecs on a re-INVITE without SDP<br/>Reported by: Henning Westerholt<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=12445040d346805b6b63a171e07855f7662881af">[12445040d3]</a> Henning Westerholt -- res_pjsip: return all codecs on a re-INVITE without SDP</li>
</ul><br><h4>Category: Channels/chan_rtp</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30281">ASTERISK-30281</a>: chan_rtp: Local address being used before being set<br/>Reported by: George Joseph<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=f723b465e5baf4c625a986ae7b6513585d15c44a">[f723b465e5]</a> George Joseph -- chan_rtp: Make usage of ast_rtp_instance_get_local_address clearer</li>
</ul><br><h4>Category: Core/AstDB</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30245">ASTERISK-30245</a>: db: ListItems is incorrect<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=7335b0cffe6c997eb66de249fd90c7463abd5828">[7335b0cffe]</a> Birger Harzenetter -- db: Fix incorrect DB tree count for AMI.</li>
</ul><br><h4>Category: Core/BuildSystem</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30321">ASTERISK-30321</a>: Build: Embedded blobs have executable stacks<br/>Reported by: George Joseph<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=ce2153fc5aa4e1b252d4d9d608748b6615460f30">[ce2153fc5a]</a> Jaco Kroon -- Build system: Avoid executable stack.</li>
</ul><br><h4>Category: Core/Dial</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30258">ASTERISK-30258</a>: Dialing API: Cancel a running async thread, does not always cancel all calls<br/>Reported by: Frederic LE FOLL<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=50a4495799fd4e5f15da5695a034b05943858f02">[50a4495799]</a> Frederic LE FOLL -- Dialing API: Cancel a running async thread, may not cancel all calls</li>
</ul><br><h4>Category: Core/General</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30278">ASTERISK-30278</a>: tcptls: Abort occurs if SSL error is logged if MALLOC_DEBUG is enabled<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=afd86b47c1e886638454abf041ffa50d914b5c67">[afd86b47c1]</a> Naveen Albert -- tcptls: Prevent crash when freeing OpenSSL errors.</li>
</ul><br><h4>Category: Core/HTTP</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30278">ASTERISK-30278</a>: tcptls: Abort occurs if SSL error is logged if MALLOC_DEBUG is enabled<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=afd86b47c1e886638454abf041ffa50d914b5c67">[afd86b47c1]</a> Naveen Albert -- tcptls: Prevent crash when freeing OpenSSL errors.</li>
</ul><br><h4>Category: Core/ManagerInterface</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30285">ASTERISK-30285</a>: manager.c: Remove outdated documentation<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=49cfdbbdff315e5a6bb665bb44a09d881f71b52c">[49cfdbbdff]</a> Naveen Albert -- manager: Update ModuleCheck documentation.</li>
</ul><br><h4>Category: Functions/General</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30293">ASTERISK-30293</a>: Memory leak in JSON_DECODE<br/>Reported by: David Uczen<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=002afc3f2a4139fae0049c1d9e2fb591ca8ef040">[002afc3f2a]</a> Naveen Albert -- func_json: Fix memory leak.</li>
</ul><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30220">ASTERISK-30220</a>: func_scramble: Fix segfault due to null pointer deref<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=8aae0b9f083af6de2ad2dfc87d2f1eaf4e20f4a0">[8aae0b9f08]</a> Naveen Albert -- func_scramble: Fix null pointer dereference.</li>
</ul><br><h4>Category: Functions/func_logic</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30243">ASTERISK-30243</a>: func_logic: IF function complains if both branches are empty<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=407167cc283ee5cf53ccabe2699f9610b3b768ea">[407167cc28]</a> Naveen Albert -- func_logic: Don't emit warning if both IF branches are empty.</li>
</ul><br><h4>Category: Functions/func_presencestate</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30311">ASTERISK-30311</a>: func_presencestate: Fix invalid memory access.<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=83eb113e0f31fa328a85233283854c985c42b064">[83eb113e0f]</a> Naveen Albert -- func_presencestate: Fix invalid memory access.</li>
</ul><br><h4>Category: Resources/General</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30239">ASTERISK-30239</a>: Prometheus plugin crashes Asterisk when using local channel<br/>Reported by: Joeran Vinzens<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=62881c668b0e7cb097e2c36f0e88d18dcd1aa38d">[62881c668b]</a> Holger Hans Peter Freyther -- res_prometheus: Do not crash on invisible bridges</li>
</ul><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30237">ASTERISK-30237</a>: res_prometheus: Crash when scraping bridges<br/>Reported by: Igor Yeroshev<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=62881c668b0e7cb097e2c36f0e88d18dcd1aa38d">[62881c668b]</a> Holger Hans Peter Freyther -- res_prometheus: Do not crash on invisible bridges</li>
</ul><br><h4>Category: Resources/res_adsi</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-29793">ASTERISK-29793</a>: adsi: CAS is malformed<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=80e6205bb05f920022b959685155c3b3ce1668ec">[80e6205bb0]</a> Naveen Albert -- res_adsi: Fix major regression caused by media format rearchitecture.</li>
</ul><br><h4>Category: Resources/res_agi</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30314">ASTERISK-30314</a>: res_agi: RECORD FILE doesn't respect "transmit_silence" asterisk.conf option<br/>Reported by: Joshua C. Colp<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=61922d293435dc8b5724d1fddb02f47e75d1608a">[61922d2934]</a> Joshua C. Colp -- res_agi: Respect "transmit_silence" option for "RECORD FILE".</li>
</ul><br><h4>Category: Resources/res_ari</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30344">ASTERISK-30344</a>: ari: Memory leak in create when specifying JSON<br/>Reported by: Saken<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=564349ff5d4f39ee51b69655babea377e3edb065">[564349ff5d]</a> Joshua C. Colp -- ari: Destroy body variables in channel create.</li>
</ul><br><h4>Category: Resources/res_ari_channels</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30237">ASTERISK-30237</a>: res_prometheus: Crash when scraping bridges<br/>Reported by: Igor Yeroshev<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=62881c668b0e7cb097e2c36f0e88d18dcd1aa38d">[62881c668b]</a> Holger Hans Peter Freyther -- res_prometheus: Do not crash on invisible bridges</li>
</ul><br><h4>Category: Resources/res_crypto</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30213">ASTERISK-30213</a>: Make crypto_load() reentrant and handle symlinks correctly<br/>Reported by: Philip Prindeville<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=d0bea5a725ecdef00536da8380a805f11b8cefc4">[d0bea5a725]</a> Philip Prindeville -- res_crypto: handle unsafe private key files</li>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=ef74ecacc7ffd81a505154f4590df12b913eed55">[ef74ecacc7]</a> Philip Prindeville -- res_crypto: don't modify fname in try_load_key()</li>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=5e2485b5c0d4a80015ba6f6107f28e3d2bd6480b">[5e2485b5c0]</a> Philip Prindeville -- res_crypto: use ast_file_read_dirs() to iterate</li>
</ul><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30235">ASTERISK-30235</a>: res_crypto and tests: Memory issues and and uninitialized variable error<br/>Reported by: George Joseph<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=e25b690d1023927f092030d9b743338c5a0e2223">[e25b690d10]</a> George Joseph -- res_crypto: Memory issues and uninitialized variable errors</li>
</ul><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30226">ASTERISK-30226</a>: REGRESSION: res_crypto complains about the stir_shaken directory in /var/lib/asterisk/keys<br/>Reported by: George Joseph<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=026dc08529254f7088aa77df3f417d6d6304b6b6">[026dc08529]</a> Philip Prindeville -- res_crypto: don't complain about directories</li>
</ul><br><h4>Category: Resources/res_geolocation</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30234">ASTERISK-30234</a>: res_geolocation: ...may be used uninitialized error in geoloc_config.c<br/>Reported by: George Joseph<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=e33f2dcc0f37ab7ed294dcd4473ba4735955edcf">[e33f2dcc0f]</a> George Joseph -- res_geolocation: Fix issues exposed by compiling with -O2</li>
</ul><br><h4>Category: Resources/res_pjsip</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30369">ASTERISK-30369</a>: res_pjsip: Websockets from same IP shut down when they shouldn't be<br/>Reported by: Joshua C. Colp<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=ff9ab3857392ea58624e2f40b8a5c35e4224ced6">[ff9ab38573]</a> George Joseph -- res_pjsip_transport_websocket: Add remote port to transport</li>
</ul><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30184">ASTERISK-30184</a>: res_pjsip_session: re-INVITE after answering results in wrong stream direction of first call leg<br/>Reported by: Maximilian Fridrich<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=60b81eabe080af842d81b9d84d1dcedb24b87398">[60b81eabe0]</a> Maximilian Fridrich -- core & res_pjsip: Improve topology change handling.</li>
</ul><br><h4>Category: Resources/res_pjsip_exten_state</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30264">ASTERISK-30264</a>: res_pjsip: Subscription handlers do not get cleanly unregistered, causing crash<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=9258d8212a1fd15bd53ab998a7dda709000f1f93">[9258d8212a]</a> Naveen Albert -- res_pjsip_pubsub: Prevent removing subscriptions.</li>
</ul><br><h4>Category: Resources/res_pjsip_mwi</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30264">ASTERISK-30264</a>: res_pjsip: Subscription handlers do not get cleanly unregistered, causing crash<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=9258d8212a1fd15bd53ab998a7dda709000f1f93">[9258d8212a]</a> Naveen Albert -- res_pjsip_pubsub: Prevent removing subscriptions.</li>
</ul><br><h4>Category: Resources/res_pjsip_outbound_registration</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30217">ASTERISK-30217</a>: Registration do not allow multiple proxies<br/>Reported by: Igor Goncharovsky<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=096529d33fe65a893f6abb420fd4291c36c59be6">[096529d33f]</a> Igor Goncharovsky -- res_pjsip_outbound_registration: Allow to use multiple proxies for registration</li>
</ul><br><h4>Category: Resources/res_pjsip_pubsub</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30244">ASTERISK-30244</a>: res_pjsip_pubsub: Occasional crash when TCP/TLS connection terminated and subscription persistence is removed<br/>Reported by: nappsoft<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=7684c9e907fb85f5c58b025d9e385ad2600f12a2">[7684c9e907]</a> George Joseph -- pjsip_transport_events: Fix possible use after free on transport</li>
</ul><br><h4>Category: Resources/res_pjsip_session</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30265">ASTERISK-30265</a>: res_pjsip_session: Fix missing PLAR support on INVITEs<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=0d6003fa9a2afb21c8953d5ac7238ea83412086d">[0d6003fa9a]</a> Naveen Albert -- res_pjsip_session.c: Map empty extensions in INVITEs to s.</li>
</ul><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30184">ASTERISK-30184</a>: res_pjsip_session: re-INVITE after answering results in wrong stream direction of first call leg<br/>Reported by: Maximilian Fridrich<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=60b81eabe080af842d81b9d84d1dcedb24b87398">[60b81eabe0]</a> Maximilian Fridrich -- core & res_pjsip: Improve topology change handling.</li>
</ul><br><h4>Category: Tests/General</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30282">ASTERISK-30282</a>: CI: Coredump output isn't saved when running unittests<br/>Reported by: George Joseph<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=0c1c623deed2d8318d3bbd55af810d4243272899">[0c1c623dee]</a> George Joseph -- runUnittests.sh: Save coredumps to proper directory</li>
</ul><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30232">ASTERISK-30232</a>: Initialize stack-based ast_test_capture structures correctly<br/>Reported by: Philip Prindeville<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=3e7ce90f9c44e1fbd7bdfdb83424c0149eb555d9">[3e7ce90f9c]</a> Philip Prindeville -- test: initialize capture structure before freeing</li>
</ul><br><h4>Category: Tests/Portability</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30273">ASTERISK-30273</a>: test_mwi: compilation fails on 32-bit Debian<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=ca8900b0f62edf83b39810c58f7b2445a85b776a">[ca8900b0f6]</a> Naveen Albert -- tests: Fix compilation errors on 32-bit.</li>
</ul><br><h4>Category: pjproject/pjsip</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-28689">ASTERISK-28689</a>: res_pjsip: Crash when locking group lock when sending stateful response<br/>Reported by: Jesse Ross<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=50e2921a48c8c3b4bd008aab7d9dc996bcdcced6">[50e2921a48]</a> Mike Bradeen -- res_pjsip: prevent crash on websocket disconnect</li>
</ul><br><h3>New Feature</h3><h4>Category: Applications/NewFeature</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-29497">ASTERISK-29497</a>: Add conditional branch applications<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=b365ea86013231c87b7c9b2c0868068e0f68c23b">[b365ea8601]</a> Naveen Albert -- app_if: Adds conditional branch applications</li>
</ul><br><h4>Category: Applications/app_amd</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30179">ASTERISK-30179</a>: app_amd: Allow audio to be played while AMD is running<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=8c791f9a656434386136669fb8ae19ea746cf938">[8c791f9a65]</a> Naveen Albert -- app_amd: Add option to play audio during AMD.</li>
</ul><br><h4>Category: Applications/app_bridgewait</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30216">ASTERISK-30216</a>: app_bridgewait: Add option for BridgeWait to not answer<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=1e29607b5c66ad45f586069867f649cd2232fd63">[1e29607b5c]</a> Naveen Albert -- app_bridgewait: Add option to not answer channel.</li>
</ul><br><h4>Category: Applications/app_mixmonitor</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30284">ASTERISK-30284</a>: app_mixmonitor: Add option to delete recording file when done<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=6e59b01e1a1e4b059df6131b56079ca7a2abf7ca">[6e59b01e1a]</a> Naveen Albert -- app_mixmonitor: Add option to delete files on exit.</li>
</ul><br><h4>Category: CDR/General</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30091">ASTERISK-30091</a>: cdr: Allow CDRs to ignore call state changes<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=b331caca30ca8f97011c8045afa2419e1f9243e5">[b331caca30]</a> Naveen Albert -- cdr: Allow bridging and dial state changes to be ignored.</li>
</ul><br><h4>Category: Channels/chan_dahdi</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30305">ASTERISK-30305</a>: chan_dahdi: Allow FXO channels to start immediately<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=5ede4e217a8afc179412db2d067ee552d175b97a">[5ede4e217a]</a> Naveen Albert -- chan_dahdi: Allow FXO channels to start immediately.</li>
</ul><br><h4>Category: Channels/chan_pjsip</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-21502">ASTERISK-21502</a>: New SIP Channel Driver - add Advice of Charge support<br/>Reported by: Matt Jordan<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=b6855755ce2ca249dc87159ca92aa7be6152712f">[b6855755ce]</a> Joshua C. Colp -- res_pjsip_aoc: Don't assume a body exists on responses.</li>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=5c114dcb4abce26925fa99904969d01935e9a68d">[5c114dcb4a]</a> Michael Kuron -- manager: AOC-S support for AOCMessage</li>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=fee9012fe16cb87ccdf23ea0abdc1885e811ae4b">[fee9012fe1]</a> Michael Kuron -- res_pjsip_aoc: New module for sending advice-of-charge with chan_pjsip</li>
</ul><br><h4>Category: Functions/NewFeature</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-29432">ASTERISK-29432</a>: New function to allow access to any channel<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=1ed4518328d1cf3f7903233495eeae4c76fd6a46">[1ed4518328]</a> Naveen Albert -- func_export: Add EXPORT function</li>
</ul><br><h4>Category: Functions/func_strings</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30222">ASTERISK-30222</a>: func_strings: Add trim functions<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=ab1dbfef754a321f7ead2163bd8f07e7eec4d30b">[ab1dbfef75]</a> Naveen Albert -- func_strings: Add trim functions.</li>
</ul><br><h4>Category: Resources/General</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30254">ASTERISK-30254</a>: res_tonedetect: Add audible ringback detection to TONE_DETECT<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=e0e7f3573012507c535a3728a94e36c022077313">[e0e7f35730]</a> Naveen Albert -- res_tonedetect: Add ringback support to TONE_DETECT.</li>
</ul><br><h4>Category: Resources/res_hep</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30322">ASTERISK-30322</a>: res_hep: Add capture agent name support<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=531eacd6c97c2c44e88b0e26c9d5c2acc4d7f463">[531eacd6c9]</a> Naveen Albert -- res_hep: Add support for named capture agents.</li>
</ul><br><h4>Category: Resources/res_pjsip</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30032">ASTERISK-30032</a>: Support of mediasec SIP headers and SDP attributes<br/>Reported by: Maximilian Fridrich<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=0d2e1401235da1bfca36a3b8febd0f4198737dc7">[0d2e140123]</a> Maximilian Fridrich -- res_pjsip: Add mediasec capabilities.</li>
</ul><br><h4>Category: Resources/res_pjsip_logger</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30146">ASTERISK-30146</a>: res_pjsip_logger: Add method-based log filtering<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=c32b39d123e0c372ae9bd33fc3684baaa54bba80">[c32b39d123]</a> Naveen Albert -- res_pjsip_logger: Add method-based logging option.</li>
</ul><br><h4>Category: Resources/res_pjsip_notify</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30263">ASTERISK-30263</a>: res_pjsip_notify: Allow using pjsip_notify.conf from AMI<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=40b52322e554fbf3cfa06dbe92732ffaaa188081">[40b52322e5]</a> Naveen Albert -- res_pjsip_notify: Add option support for AMI.</li>
</ul><br><h4>Category: Resources/res_pjsip_session</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30150">ASTERISK-30150</a>: res_pjsip_session: Add support for custom parameters<br/>Reported by: N A<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=406143ae61f7d10c5bef3891e698d9cfb43d4d0a">[406143ae61]</a> Naveen Albert -- res_pjsip_header_funcs: Add custom parameter support.</li>
</ul><br><hr><a name="open_issues"><h2 align="center">Open Issues</h2></a><center><a href="#top">[Back to Top]</a></center><p>This is a list of all open issues from the issue tracker that were referenced by changes that went into this release.</p><h3>Bug</h3><h4>Category: Resources/res_geolocation</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30346">ASTERISK-30346</a>: Fix NULL dereferencing issue in Geolocation<br/>Reported by: Alexandre Fournier<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=01b3962201edaa437cc67ff9fe0d80d06e958258">[01b3962201]</a> Alexandre Fournier -- res_geoloc: fix NULL pointer dereference bug</li>
</ul><br><h4>Category: Resources/res_stasis_snoop</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-30252">ASTERISK-30252</a>: Unidirectional snoop on resampled channel causes garbled audio<br/>Reported by: Michael Bradeen<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=907d7e7d7d2625a065a718f313d9c523e2a0ca55">[907d7e7d7d]</a> Mike Bradeen -- audiohook: add directional awareness</li>
</ul><br><hr><a name="commits"><h2 align="center">Commits Not Associated with an Issue</h2></a><center><a href="#top">[Back to Top]</a></center><p>This is a list of all changes that went into this release that did not reference a JIRA issue.</p><table width="100%" border="1">
<tr><th>Revision</th><th>Author</th><th>Summary</th></tr>
<tr><td><a href="https://code.asterisk.org/code/changelog/asterisk?cs=4a9f5e7ae6c4ac1e9de171c8a7fa54cd5f58a45b">4a9f5e7ae6</a></td><td>Asterisk Development Team</td><td>Update for 20.1.0-rc2</td></tr>
<tr><td><a href="https://code.asterisk.org/code/changelog/asterisk?cs=aecc5448f14e6f89fb87f4b46c4808a68ec0b2ff">aecc5448f1</a></td><td>Asterisk Development Team</td><td>Update for 20.1.0-rc1</td></tr>
<tr><td><a href="https://code.asterisk.org/code/changelog/asterisk?cs=fefc236e7c606fd61f662a142cc3c9d5e5133494">fefc236e7c</a></td><td>Asterisk Development Team</td><td>Update CHANGES and UPGRADE.txt for 20.1.0</td></tr>
<tr><td><a href="https://code.asterisk.org/code/changelog/asterisk?cs=2a500b325a368d063f23dabd957b46633f0d2ade">2a500b325a</a></td><td>George Joseph</td><td>res_geolocation: Update wiki documentation</td></tr>
<tr><td><a href="https://code.asterisk.org/code/changelog/asterisk?cs=7f80830ced975337a2cfcf384acfbcead72d94a2">7f80830ced</a></td><td>Asterisk Development Team</td><td>Update CHANGES and UPGRADE.txt for 20.0.0</td></tr>
<tr><td><a href="https://code.asterisk.org/code/changelog/asterisk?cs=278c5726ca9d3f3df5b2c6c22e2fbcddcd95f854">278c5726ca</a></td><td>Jaco Kroon</td><td>manager: be more aggressive about purging http sessions.</td></tr>
</table><hr><a name="diffstat"><h2 align="center">Diffstat Results</h2></a><center><a href="#top">[Back to Top]</a></center><p>This is a summary of the changes to the source code that went into this release that was generated using the diffstat utility.</p><pre>asterisk-20.0.0-summary.html | 1836 ----
asterisk-20.0.0-summary.txt | 3804 ----------
b/.version | 2
b/CHANGES | 146
b/ChangeLog | 1188 +++
b/Makefile.rules | 4
b/UPGRADE.txt | 13
b/addons/ooh323c/src/ooq931.c | 15
b/apps/app_amd.c | 51
b/apps/app_bridgewait.c | 9
b/apps/app_if.c | 383 +
b/apps/app_meetme.c | 24
b/apps/app_mixmonitor.c | 66
b/apps/app_stack.c | 48
b/apps/app_voicemail.c | 31
b/asterisk-20.1.0-rc2-summary.html | 11
b/asterisk-20.1.0-rc2-summary.txt | 82
b/channels/chan_dahdi.c | 9
b/channels/chan_rtp.c | 2
b/channels/sig_analog.c | 28
b/configs/samples/amd.conf.sample | 7
b/configs/samples/asterisk.conf.sample | 11
b/configs/samples/cdr.conf.sample | 11
b/configs/samples/chan_dahdi.conf.sample | 9
b/configs/samples/geolocation.conf.sample | 2
b/configs/samples/hep.conf.sample | 3
b/configs/samples/pjsip.conf.sample | 12
b/configs/samples/voicemail.conf.sample | 2
b/contrib/ast-db-manage/config/versions/417c0247fd7e_add_security_negotiation_and_security_.py | 49
b/contrib/ast-db-manage/config/versions/539f68bede2c_add_peer_supported_to_100rel.py | 57
b/contrib/ast-db-manage/config/versions/5a2247c957d2_add_aoc_option.py | 38
b/contrib/ast-db-manage/config/versions/ccf795ee535f_all_codecs_on_empty_reinvite.py | 37
b/contrib/realtime/mysql/mysql_config.sql | 30
b/contrib/realtime/postgresql/postgresql_config.sql | 36
b/funcs/func_export.c | 107
b/funcs/func_json.c | 4
b/funcs/func_logic.c | 3
b/funcs/func_presencestate.c | 4
b/funcs/func_sayfiles.c | 9
b/funcs/func_scramble.c | 1
b/funcs/func_strings.c | 186
b/include/asterisk/audiohook.h | 9
b/include/asterisk/cdr.h | 2
b/include/asterisk/manager.h | 12
b/include/asterisk/res_pjsip.h | 239
b/include/asterisk/res_pjsip_session.h | 2
b/include/asterisk/rtp_engine.h | 12
b/include/asterisk/test.h | 10
b/main/audiohook.c | 22
b/main/cdr.c | 86
b/main/channel.c | 9
b/main/config_options.c | 4
b/main/db.c | 4
b/main/dial.c | 9
b/main/features.c | 28
b/main/file.c | 1
b/main/manager.c | 521 +
b/main/options.c | 1
b/main/pbx_builtins.c | 17
b/main/say.c | 6
b/main/tcptls.c | 2
b/main/test.c | 9
b/main/xmldoc.c | 124
b/res/ari/resource_channels.c | 2
b/res/prometheus/bridges.c | 12
b/res/res_adsi.c | 8
b/res/res_agi.c | 15
b/res/res_crypto.c | 75
b/res/res_geolocation/geoloc_datastore.c | 4
b/res/res_geolocation/wiki/AsteriskImplementation.md | 251
b/res/res_geolocation/wiki/GML.md | 38
b/res/res_geolocation/wiki/Geolocation.md | 2
b/res/res_geolocation/wiki/README.txt | 31
b/res/res_geolocation/wiki/URI.md | 5
b/res/res_hep.c | 22
b/res/res_pjsip.c | 47
b/res/res_pjsip/config_global.c | 21
b/res/res_pjsip/pjsip_config.xml | 60
b/res/res_pjsip/pjsip_configuration.c | 45
b/res/res_pjsip/pjsip_options.c | 5
b/res/res_pjsip/pjsip_transport_events.c | 214
b/res/res_pjsip/security_agreements.c | 340
b/res/res_pjsip_aoc.c | 698 +
b/res/res_pjsip_exten_state.c | 13
b/res/res_pjsip_header_funcs.c | 268
b/res/res_pjsip_logger.c | 165
b/res/res_pjsip_mwi.c | 13
b/res/res_pjsip_notify.c | 165
b/res/res_pjsip_outbound_authenticator_digest.c | 4
b/res/res_pjsip_outbound_registration.c | 253
b/res/res_pjsip_pubsub.c | 25
b/res/res_pjsip_rfc3329.c | 150
b/res/res_pjsip_sdp_rtp.c | 6
b/res/res_pjsip_session.c | 118
b/res/res_pjsip_transport_websocket.c | 1
b/res/res_stasis_snoop.c | 22
b/res/res_tonedetect.c | 25
b/tests/CI/runUnittests.sh | 8
b/tests/test_crypto.c | 19
b/tests/test_json.c | 28
b/tests/test_mwi.c | 4
b/tests/test_stasis.c | 2
b/tests/test_stasis_state.c | 8
b/third-party/pjproject/patches/0200-potential-buffer-overflow-in-pjlib-scanner-and-pjmedia.patch | 300
104 files changed, 6855 insertions(+), 6136 deletions(-)</pre><br></html>

768
asterisk-20.1.0-summary.txt Normal file
View File

@ -0,0 +1,768 @@
Release Summary
asterisk-20.1.0
Date: 2023-01-12
<asteriskteam@digium.com>
----------------------------------------------------------------------
Table of Contents
1. Summary
2. Contributors
3. Closed Issues
4. Open Issues
5. Other Changes
6. Diffstat
----------------------------------------------------------------------
Summary
[Back to Top]
This release is a point release of an existing major version. The changes
included were made to address problems that have been identified in this
release series, or are minor, backwards compatible new features or
improvements. Users should be able to safely upgrade to this version if
this release series is already in use. Users considering upgrading from a
previous version are strongly encouraged to review the UPGRADE.txt
document as well as the CHANGES document for information about upgrading
to this release series.
The data in this summary reflects changes that have been made since the
previous release, asterisk-20.0.0.
----------------------------------------------------------------------
Contributors
[Back to Top]
This table lists the people who have submitted code, those that have
tested patches, as well as those that reported issues on the issue tracker
that were resolved in this release. For coders, the number is how many of
their patches (of any size) were committed into this release. For testers,
the number is the number of times their name was listed as assisting with
testing a patch. Finally, for reporters, the number is the number of
issues that they reported that were affected by commits that went into
this release.
Coders Testers Reporters
39 Naveen Albert 1 inspecting SIP traces. 37 N A
7 George Joseph 7 George Joseph
5 Philip Prindeville 4 Philip Prindeville
4 Asterisk Development Team 3 Matt Jordan
4 Mike Bradeen 3 Maximilian Fridrich
3 Maximilian Fridrich 2 Michael Bradeen
3 Joshua C. Colp 2 Marcel Wagner
2 Jaco Kroon 2 Joshua C. Colp
2 Michael Kuron 1 Igor Yeroshev
2 Marcel Wagner 1 David Uczen
1 Birger Harzenetter 1 Alexandre Fournier
(license 5870) 1 Igor Goncharovsky
1 Holger Hans Peter 1 Frederic LE FOLL
Freyther 1 shawty
1 Igor Goncharovsky 1 David Woolley
1 Frederic LE FOLL 1 nappsoft
1 Alexandre Fournier 1 Jesse Ross
1 Ben Ford 1 Joeran Vinzens
1 Henning Westerholt 1 Henning Westerholt
1 Benjamin Keith Ford
1 Saken
----------------------------------------------------------------------
Closed Issues
[Back to Top]
This is a list of all issues from the issue tracker that were closed by
changes that went into this release.
Security
Category: Addons/chan_ooh323
ASTERISK-30103: chan_ooh323 Vulnerability in calling/called party IE
Reported by: Michael Bradeen
* [eb1d7ab53c] Mike Bradeen -- ooh323c: not checking for IE minimum
length
Category: Core/ManagerInterface
ASTERISK-30176: manager: GetConfig can read files outside of Asterisk
Reported by: shawty
* [81f10e847e] Mike Bradeen -- manager: prevent file access outside of
config dir
Category: pjproject/pjsip
ASTERISK-30338: pjproject: Backport security fixes from 2.13
Reported by: Benjamin Keith Ford
* [d476994768] Ben Ford -- pjproject: 2.13 security fixes
Improvement
Category: Applications/app_mixmonitor
ASTERISK-30286: app_mixmonitor: Add option to use real Caller ID for
Caller ID
Reported by: N A
* [691178c48e] Naveen Albert -- app_mixmonitor: Add option to use real
Caller ID for voicemail.
Category: Core/Bridging
ASTERISK-30223: features: add no-answer option to Bridge application
Reported by: N A
* [a5ec60e6c6] Naveen Albert -- features: Add no answer option to
Bridge.
Category: Core/General
ASTERISK-30290: file.c: Don't emit warnings on winks.
Reported by: N A
* [8142b313c3] Naveen Albert -- file.c: Don't emit warnings on winks.
Category: Core/RTP
ASTERISK-30327: rtp_engine.h: Remove obsolete example usage
Reported by: N A
* [a4bcdce1db] Naveen Albert -- rtp_engine.h: Update examples using
ast_format_set.
Category: Documentation
ASTERISK-30328: Typo in from_domain description on res_pjsip configuration
documentation
Reported by: Marcel Wagner
* [58534b309f] Marcel Wagner -- res_pjsip: Fix typo in from_domain
documentation
ASTERISK-30316: res_pjsip: Documentation should point out default if
contact_user is not being set for outbound registrations
Reported by: Marcel Wagner
* [b83af13f65] Marcel Wagner -- res_pjsip: Update contact_user to point
out default
ASTERISK-30289: xmldoc: Allow XML docs to be reloaded
Reported by: N A
* [52c7d3ed07] Naveen Albert -- xmldoc: Allow XML docs to be reloaded.
Category: PBX/General
ASTERISK-30308: pbx_builtins: Allow Answer to return immediately
Reported by: N A
* [c7df5ee7c1] Naveen Albert -- pbx_builtins: Allow Answer to return
immediately.
Category: Resources/res_pjsip
ASTERISK-30158: PJSIP: Add new 100rel option "peer_supported"
Reported by: Maximilian Fridrich
* [5bbad0d27c] Maximilian Fridrich -- res_pjsip: Add 100rel option
"peer_supported".
Category: Resources/res_pjsip_geolocation
ASTERISK-30241: res_pjsip_gelocation: Downgrade some NOTICE scope trace
debugs to DEBUG level
Reported by: N A
* [8afb313a43] Naveen Albert -- res_pjsip_geolocation: Change some
notices to debugs.
Category: Tests/General
ASTERISK-30295: test_json: Remove duplicated static function
Reported by: N A
* [1e77b8c473] Naveen Albert -- test_json: Remove duplicated static
function.
Bug
Category: Applications/app_if
ASTERISK-30349: app_if: Format truncation error
Reported by: George Joseph
* [2f9cdfbc50] Naveen Albert -- app_if: Fix format truncation errors.
Category: Applications/app_meetme
ASTERISK-29998: sla: deadlock when calling SLAStation application
Reported by: N A
* [2efa290d3c] Naveen Albert -- sla: Prevent deadlock and crash due to
autoservicing.
Category: Applications/app_saynumber
ASTERISK-30248: ast_get_digit_str adds bogus initial delimiter if first
character not to be spoken
Reported by: David Woolley
* [407216a0a5] Naveen Albert -- say: Don't prepend ampersand
erroneously.
Category: Applications/app_stack
ASTERISK-30076: app_stack: Incorrect exit location in predial handlers
logged
Reported by: N A
* [dfe2f38642] Naveen Albert -- app_stack: Print proper exit location
for PBXless channels.
Category: Applications/app_voicemail
ASTERISK-30283: app_voicemail: Fix msg_create_from_file not sending email
to user
Reported by: N A
* [b9c031c1f8] Naveen Albert -- app_voicemail: Fix missing email in
msg_create_from_file.
ASTERISK-30248: ast_get_digit_str adds bogus initial delimiter if first
character not to be spoken
Reported by: David Woolley
* [407216a0a5] Naveen Albert -- say: Don't prepend ampersand
erroneously.
Category: Channels/chan_dahdi
ASTERISK-30336: sig_analog: Fix no timeout duration
Reported by: N A
* [b90e57758b] Naveen Albert -- sig_analog: Fix no timeout duration.
ASTERISK-30274: chan_dahdi: Unavailable channels are BUSY
Reported by: N A
* [180ca32565] Naveen Albert -- chan_dahdi: Fix unavailable channels
returning busy.
ASTERISK-30256: chan_dahdi: Fix format truncation warnings
Reported by: N A
* [98fc05f13b] Naveen Albert -- chan_dahdi: Resolve format truncation
warning.
Category: Channels/chan_local
ASTERISK-30239: Prometheus plugin crashes Asterisk when using local
channel
Reported by: Joeran Vinzens
* [62881c668b] Holger Hans Peter Freyther -- res_prometheus: Do not
crash on invisible bridges
Category: Channels/chan_pjsip
ASTERISK-30184: res_pjsip_session: re-INVITE after answering results in
wrong stream direction of first call leg
Reported by: Maximilian Fridrich
* [60b81eabe0] Maximilian Fridrich -- core & res_pjsip: Improve topology
change handling.
ASTERISK-30193: chan_pjsip should return all codecs on a re-INVITE without
SDP
Reported by: Henning Westerholt
* [12445040d3] Henning Westerholt -- res_pjsip: return all codecs on a
re-INVITE without SDP
Category: Channels/chan_rtp
ASTERISK-30281: chan_rtp: Local address being used before being set
Reported by: George Joseph
* [f723b465e5] George Joseph -- chan_rtp: Make usage of
ast_rtp_instance_get_local_address clearer
Category: Core/AstDB
ASTERISK-30245: db: ListItems is incorrect
Reported by: N A
* [7335b0cffe] Birger Harzenetter -- db: Fix incorrect DB tree count for
AMI.
Category: Core/BuildSystem
ASTERISK-30321: Build: Embedded blobs have executable stacks
Reported by: George Joseph
* [ce2153fc5a] Jaco Kroon -- Build system: Avoid executable stack.
Category: Core/Dial
ASTERISK-30258: Dialing API: Cancel a running async thread, does not
always cancel all calls
Reported by: Frederic LE FOLL
* [50a4495799] Frederic LE FOLL -- Dialing API: Cancel a running async
thread, may not cancel all calls
Category: Core/General
ASTERISK-30278: tcptls: Abort occurs if SSL error is logged if
MALLOC_DEBUG is enabled
Reported by: N A
* [afd86b47c1] Naveen Albert -- tcptls: Prevent crash when freeing
OpenSSL errors.
Category: Core/HTTP
ASTERISK-30278: tcptls: Abort occurs if SSL error is logged if
MALLOC_DEBUG is enabled
Reported by: N A
* [afd86b47c1] Naveen Albert -- tcptls: Prevent crash when freeing
OpenSSL errors.
Category: Core/ManagerInterface
ASTERISK-30285: manager.c: Remove outdated documentation
Reported by: N A
* [49cfdbbdff] Naveen Albert -- manager: Update ModuleCheck
documentation.
Category: Functions/General
ASTERISK-30293: Memory leak in JSON_DECODE
Reported by: David Uczen
* [002afc3f2a] Naveen Albert -- func_json: Fix memory leak.
ASTERISK-30220: func_scramble: Fix segfault due to null pointer deref
Reported by: N A
* [8aae0b9f08] Naveen Albert -- func_scramble: Fix null pointer
dereference.
Category: Functions/func_logic
ASTERISK-30243: func_logic: IF function complains if both branches are
empty
Reported by: N A
* [407167cc28] Naveen Albert -- func_logic: Don't emit warning if both
IF branches are empty.
Category: Functions/func_presencestate
ASTERISK-30311: func_presencestate: Fix invalid memory access.
Reported by: N A
* [83eb113e0f] Naveen Albert -- func_presencestate: Fix invalid memory
access.
Category: Resources/General
ASTERISK-30239: Prometheus plugin crashes Asterisk when using local
channel
Reported by: Joeran Vinzens
* [62881c668b] Holger Hans Peter Freyther -- res_prometheus: Do not
crash on invisible bridges
ASTERISK-30237: res_prometheus: Crash when scraping bridges
Reported by: Igor Yeroshev
* [62881c668b] Holger Hans Peter Freyther -- res_prometheus: Do not
crash on invisible bridges
Category: Resources/res_adsi
ASTERISK-29793: adsi: CAS is malformed
Reported by: N A
* [80e6205bb0] Naveen Albert -- res_adsi: Fix major regression caused by
media format rearchitecture.
Category: Resources/res_agi
ASTERISK-30314: res_agi: RECORD FILE doesn't respect "transmit_silence"
asterisk.conf option
Reported by: Joshua C. Colp
* [61922d2934] Joshua C. Colp -- res_agi: Respect "transmit_silence"
option for "RECORD FILE".
Category: Resources/res_ari
ASTERISK-30344: ari: Memory leak in create when specifying JSON
Reported by: Saken
* [564349ff5d] Joshua C. Colp -- ari: Destroy body variables in channel
create.
Category: Resources/res_ari_channels
ASTERISK-30237: res_prometheus: Crash when scraping bridges
Reported by: Igor Yeroshev
* [62881c668b] Holger Hans Peter Freyther -- res_prometheus: Do not
crash on invisible bridges
Category: Resources/res_crypto
ASTERISK-30213: Make crypto_load() reentrant and handle symlinks correctly
Reported by: Philip Prindeville
* [d0bea5a725] Philip Prindeville -- res_crypto: handle unsafe private
key files
* [ef74ecacc7] Philip Prindeville -- res_crypto: don't modify fname in
try_load_key()
* [5e2485b5c0] Philip Prindeville -- res_crypto: use
ast_file_read_dirs() to iterate
ASTERISK-30235: res_crypto and tests: Memory issues and and uninitialized
variable error
Reported by: George Joseph
* [e25b690d10] George Joseph -- res_crypto: Memory issues and
uninitialized variable errors
ASTERISK-30226: REGRESSION: res_crypto complains about the stir_shaken
directory in /var/lib/asterisk/keys
Reported by: George Joseph
* [026dc08529] Philip Prindeville -- res_crypto: don't complain about
directories
Category: Resources/res_geolocation
ASTERISK-30234: res_geolocation: ...may be used uninitialized error in
geoloc_config.c
Reported by: George Joseph
* [e33f2dcc0f] George Joseph -- res_geolocation: Fix issues exposed by
compiling with -O2
Category: Resources/res_pjsip
ASTERISK-30369: res_pjsip: Websockets from same IP shut down when they
shouldn't be
Reported by: Joshua C. Colp
* [ff9ab38573] George Joseph -- res_pjsip_transport_websocket: Add
remote port to transport
ASTERISK-30184: res_pjsip_session: re-INVITE after answering results in
wrong stream direction of first call leg
Reported by: Maximilian Fridrich
* [60b81eabe0] Maximilian Fridrich -- core & res_pjsip: Improve topology
change handling.
Category: Resources/res_pjsip_exten_state
ASTERISK-30264: res_pjsip: Subscription handlers do not get cleanly
unregistered, causing crash
Reported by: N A
* [9258d8212a] Naveen Albert -- res_pjsip_pubsub: Prevent removing
subscriptions.
Category: Resources/res_pjsip_mwi
ASTERISK-30264: res_pjsip: Subscription handlers do not get cleanly
unregistered, causing crash
Reported by: N A
* [9258d8212a] Naveen Albert -- res_pjsip_pubsub: Prevent removing
subscriptions.
Category: Resources/res_pjsip_outbound_registration
ASTERISK-30217: Registration do not allow multiple proxies
Reported by: Igor Goncharovsky
* [096529d33f] Igor Goncharovsky -- res_pjsip_outbound_registration:
Allow to use multiple proxies for registration
Category: Resources/res_pjsip_pubsub
ASTERISK-30244: res_pjsip_pubsub: Occasional crash when TCP/TLS connection
terminated and subscription persistence is removed
Reported by: nappsoft
* [7684c9e907] George Joseph -- pjsip_transport_events: Fix possible use
after free on transport
Category: Resources/res_pjsip_session
ASTERISK-30265: res_pjsip_session: Fix missing PLAR support on INVITEs
Reported by: N A
* [0d6003fa9a] Naveen Albert -- res_pjsip_session.c: Map empty
extensions in INVITEs to s.
ASTERISK-30184: res_pjsip_session: re-INVITE after answering results in
wrong stream direction of first call leg
Reported by: Maximilian Fridrich
* [60b81eabe0] Maximilian Fridrich -- core & res_pjsip: Improve topology
change handling.
Category: Tests/General
ASTERISK-30282: CI: Coredump output isn't saved when running unittests
Reported by: George Joseph
* [0c1c623dee] George Joseph -- runUnittests.sh: Save coredumps to
proper directory
ASTERISK-30232: Initialize stack-based ast_test_capture structures
correctly
Reported by: Philip Prindeville
* [3e7ce90f9c] Philip Prindeville -- test: initialize capture structure
before freeing
Category: Tests/Portability
ASTERISK-30273: test_mwi: compilation fails on 32-bit Debian
Reported by: N A
* [ca8900b0f6] Naveen Albert -- tests: Fix compilation errors on 32-bit.
Category: pjproject/pjsip
ASTERISK-28689: res_pjsip: Crash when locking group lock when sending
stateful response
Reported by: Jesse Ross
* [50e2921a48] Mike Bradeen -- res_pjsip: prevent crash on websocket
disconnect
New Feature
Category: Applications/NewFeature
ASTERISK-29497: Add conditional branch applications
Reported by: N A
* [b365ea8601] Naveen Albert -- app_if: Adds conditional branch
applications
Category: Applications/app_amd
ASTERISK-30179: app_amd: Allow audio to be played while AMD is running
Reported by: N A
* [8c791f9a65] Naveen Albert -- app_amd: Add option to play audio during
AMD.
Category: Applications/app_bridgewait
ASTERISK-30216: app_bridgewait: Add option for BridgeWait to not answer
Reported by: N A
* [1e29607b5c] Naveen Albert -- app_bridgewait: Add option to not answer
channel.
Category: Applications/app_mixmonitor
ASTERISK-30284: app_mixmonitor: Add option to delete recording file when
done
Reported by: N A
* [6e59b01e1a] Naveen Albert -- app_mixmonitor: Add option to delete
files on exit.
Category: CDR/General
ASTERISK-30091: cdr: Allow CDRs to ignore call state changes
Reported by: N A
* [b331caca30] Naveen Albert -- cdr: Allow bridging and dial state
changes to be ignored.
Category: Channels/chan_dahdi
ASTERISK-30305: chan_dahdi: Allow FXO channels to start immediately
Reported by: N A
* [5ede4e217a] Naveen Albert -- chan_dahdi: Allow FXO channels to start
immediately.
Category: Channels/chan_pjsip
ASTERISK-21502: New SIP Channel Driver - add Advice of Charge support
Reported by: Matt Jordan
* [b6855755ce] Joshua C. Colp -- res_pjsip_aoc: Don't assume a body
exists on responses.
* [5c114dcb4a] Michael Kuron -- manager: AOC-S support for AOCMessage
* [fee9012fe1] Michael Kuron -- res_pjsip_aoc: New module for sending
advice-of-charge with chan_pjsip
Category: Functions/NewFeature
ASTERISK-29432: New function to allow access to any channel
Reported by: N A
* [1ed4518328] Naveen Albert -- func_export: Add EXPORT function
Category: Functions/func_strings
ASTERISK-30222: func_strings: Add trim functions
Reported by: N A
* [ab1dbfef75] Naveen Albert -- func_strings: Add trim functions.
Category: Resources/General
ASTERISK-30254: res_tonedetect: Add audible ringback detection to
TONE_DETECT
Reported by: N A
* [e0e7f35730] Naveen Albert -- res_tonedetect: Add ringback support to
TONE_DETECT.
Category: Resources/res_hep
ASTERISK-30322: res_hep: Add capture agent name support
Reported by: N A
* [531eacd6c9] Naveen Albert -- res_hep: Add support for named capture
agents.
Category: Resources/res_pjsip
ASTERISK-30032: Support of mediasec SIP headers and SDP attributes
Reported by: Maximilian Fridrich
* [0d2e140123] Maximilian Fridrich -- res_pjsip: Add mediasec
capabilities.
Category: Resources/res_pjsip_logger
ASTERISK-30146: res_pjsip_logger: Add method-based log filtering
Reported by: N A
* [c32b39d123] Naveen Albert -- res_pjsip_logger: Add method-based
logging option.
Category: Resources/res_pjsip_notify
ASTERISK-30263: res_pjsip_notify: Allow using pjsip_notify.conf from AMI
Reported by: N A
* [40b52322e5] Naveen Albert -- res_pjsip_notify: Add option support for
AMI.
Category: Resources/res_pjsip_session
ASTERISK-30150: res_pjsip_session: Add support for custom parameters
Reported by: N A
* [406143ae61] Naveen Albert -- res_pjsip_header_funcs: Add custom
parameter support.
----------------------------------------------------------------------
Open Issues
[Back to Top]
This is a list of all open issues from the issue tracker that were
referenced by changes that went into this release.
Bug
Category: Resources/res_geolocation
ASTERISK-30346: Fix NULL dereferencing issue in Geolocation
Reported by: Alexandre Fournier
* [01b3962201] Alexandre Fournier -- res_geoloc: fix NULL pointer
dereference bug
Category: Resources/res_stasis_snoop
ASTERISK-30252: Unidirectional snoop on resampled channel causes garbled
audio
Reported by: Michael Bradeen
* [907d7e7d7d] Mike Bradeen -- audiohook: add directional awareness
----------------------------------------------------------------------
Commits Not Associated with an Issue
[Back to Top]
This is a list of all changes that went into this release that did not
reference a JIRA issue.
+------------------------------------------------------------------------+
| Revision | Author | Summary |
|------------+----------------------+------------------------------------|
| 4a9f5e7ae6 | Asterisk Development | Update for 20.1.0-rc2 |
| | Team | |
|------------+----------------------+------------------------------------|
| aecc5448f1 | Asterisk Development | Update for 20.1.0-rc1 |
| | Team | |
|------------+----------------------+------------------------------------|
| fefc236e7c | Asterisk Development | Update CHANGES and UPGRADE.txt for |
| | Team | 20.1.0 |
|------------+----------------------+------------------------------------|
| 2a500b325a | George Joseph | res_geolocation: Update wiki |
| | | documentation |
|------------+----------------------+------------------------------------|
| 7f80830ced | Asterisk Development | Update CHANGES and UPGRADE.txt for |
| | Team | 20.0.0 |
|------------+----------------------+------------------------------------|
| 278c5726ca | Jaco Kroon | manager: be more aggressive about |
| | | purging http sessions. |
+------------------------------------------------------------------------+
----------------------------------------------------------------------
Diffstat Results
[Back to Top]
This is a summary of the changes to the source code that went into this
release that was generated using the diffstat utility.
asterisk-20.0.0-summary.html | 1836 ----
asterisk-20.0.0-summary.txt | 3804 ----------
b/.version | 2
b/CHANGES | 146
b/ChangeLog | 1188 +++
b/Makefile.rules | 4
b/UPGRADE.txt | 13
b/addons/ooh323c/src/ooq931.c | 15
b/apps/app_amd.c | 51
b/apps/app_bridgewait.c | 9
b/apps/app_if.c | 383 +
b/apps/app_meetme.c | 24
b/apps/app_mixmonitor.c | 66
b/apps/app_stack.c | 48
b/apps/app_voicemail.c | 31
b/asterisk-20.1.0-rc2-summary.html | 11
b/asterisk-20.1.0-rc2-summary.txt | 82
b/channels/chan_dahdi.c | 9
b/channels/chan_rtp.c | 2
b/channels/sig_analog.c | 28
b/configs/samples/amd.conf.sample | 7
b/configs/samples/asterisk.conf.sample | 11
b/configs/samples/cdr.conf.sample | 11
b/configs/samples/chan_dahdi.conf.sample | 9
b/configs/samples/geolocation.conf.sample | 2
b/configs/samples/hep.conf.sample | 3
b/configs/samples/pjsip.conf.sample | 12
b/configs/samples/voicemail.conf.sample | 2
b/contrib/ast-db-manage/config/versions/417c0247fd7e_add_security_negotiation_and_security_.py | 49
b/contrib/ast-db-manage/config/versions/539f68bede2c_add_peer_supported_to_100rel.py | 57
b/contrib/ast-db-manage/config/versions/5a2247c957d2_add_aoc_option.py | 38
b/contrib/ast-db-manage/config/versions/ccf795ee535f_all_codecs_on_empty_reinvite.py | 37
b/contrib/realtime/mysql/mysql_config.sql | 30
b/contrib/realtime/postgresql/postgresql_config.sql | 36
b/funcs/func_export.c | 107
b/funcs/func_json.c | 4
b/funcs/func_logic.c | 3
b/funcs/func_presencestate.c | 4
b/funcs/func_sayfiles.c | 9
b/funcs/func_scramble.c | 1
b/funcs/func_strings.c | 186
b/include/asterisk/audiohook.h | 9
b/include/asterisk/cdr.h | 2
b/include/asterisk/manager.h | 12
b/include/asterisk/res_pjsip.h | 239
b/include/asterisk/res_pjsip_session.h | 2
b/include/asterisk/rtp_engine.h | 12
b/include/asterisk/test.h | 10
b/main/audiohook.c | 22
b/main/cdr.c | 86
b/main/channel.c | 9
b/main/config_options.c | 4
b/main/db.c | 4
b/main/dial.c | 9
b/main/features.c | 28
b/main/file.c | 1
b/main/manager.c | 521 +
b/main/options.c | 1
b/main/pbx_builtins.c | 17
b/main/say.c | 6
b/main/tcptls.c | 2
b/main/test.c | 9
b/main/xmldoc.c | 124
b/res/ari/resource_channels.c | 2
b/res/prometheus/bridges.c | 12
b/res/res_adsi.c | 8
b/res/res_agi.c | 15
b/res/res_crypto.c | 75
b/res/res_geolocation/geoloc_datastore.c | 4
b/res/res_geolocation/wiki/AsteriskImplementation.md | 251
b/res/res_geolocation/wiki/GML.md | 38
b/res/res_geolocation/wiki/Geolocation.md | 2
b/res/res_geolocation/wiki/README.txt | 31
b/res/res_geolocation/wiki/URI.md | 5
b/res/res_hep.c | 22
b/res/res_pjsip.c | 47
b/res/res_pjsip/config_global.c | 21
b/res/res_pjsip/pjsip_config.xml | 60
b/res/res_pjsip/pjsip_configuration.c | 45
b/res/res_pjsip/pjsip_options.c | 5
b/res/res_pjsip/pjsip_transport_events.c | 214
b/res/res_pjsip/security_agreements.c | 340
b/res/res_pjsip_aoc.c | 698 +
b/res/res_pjsip_exten_state.c | 13
b/res/res_pjsip_header_funcs.c | 268
b/res/res_pjsip_logger.c | 165
b/res/res_pjsip_mwi.c | 13
b/res/res_pjsip_notify.c | 165
b/res/res_pjsip_outbound_authenticator_digest.c | 4
b/res/res_pjsip_outbound_registration.c | 253
b/res/res_pjsip_pubsub.c | 25
b/res/res_pjsip_rfc3329.c | 150
b/res/res_pjsip_sdp_rtp.c | 6
b/res/res_pjsip_session.c | 118
b/res/res_pjsip_transport_websocket.c | 1
b/res/res_stasis_snoop.c | 22
b/res/res_tonedetect.c | 25
b/tests/CI/runUnittests.sh | 8
b/tests/test_crypto.c | 19
b/tests/test_json.c | 28
b/tests/test_mwi.c | 4
b/tests/test_stasis.c | 2
b/tests/test_stasis_state.c | 8
b/third-party/pjproject/patches/0200-potential-buffer-overflow-in-pjlib-scanner-and-pjmedia.patch | 300
104 files changed, 6855 insertions(+), 6136 deletions(-)

View File

@ -3447,7 +3447,7 @@ struct sig_ss7_callback sig_ss7_callbacks =
*/
static void notify_message(char *mailbox, int thereornot)
{
char s[sizeof(mwimonitornotify) + 80];
char s[sizeof(mwimonitornotify) + 164];
if (ast_strlen_zero(mailbox)) {
return;
@ -4115,7 +4115,7 @@ static void dahdi_r2_on_context_log(openr2_context_t *r2context, openr2_log_leve
{
#define CONTEXT_TAG "Context - "
char logmsg[256];
char completemsg[sizeof(logmsg) + sizeof(CONTEXT_TAG) - 1];
char completemsg[sizeof(logmsg) * 2];
vsnprintf(logmsg, sizeof(logmsg), fmt, ap);
snprintf(completemsg, sizeof(completemsg), CONTEXT_TAG "%s", logmsg);
dahdi_r2_write_log(level, completemsg);
@ -4128,10 +4128,11 @@ static void dahdi_r2_on_chan_log(openr2_chan_t *r2chan, openr2_log_level_t level
{
#define CHAN_TAG "Chan "
char logmsg[256];
char completemsg[sizeof(logmsg) + sizeof(CHAN_TAG) - 1];
char completemsg[sizeof(logmsg) * 2];
vsnprintf(logmsg, sizeof(logmsg), fmt, ap);
snprintf(completemsg, sizeof(completemsg), CHAN_TAG "%d - %s", openr2_chan_get_number(r2chan), logmsg);
dahdi_r2_write_log(level, completemsg);
#undef CHAN_TAG
}
static int dahdi_r2_on_dnis_digit_received(openr2_chan_t *r2chan, char digit)
@ -13651,6 +13652,7 @@ static struct ast_channel *dahdi_request(const char *type, struct ast_format_cap
struct ast_channel *tmp = NULL;
struct dahdi_pvt *exitpvt;
int channelmatched = 0;
int foundowner = 0;
int groupmatched = 0;
#if defined(HAVE_PRI) || defined(HAVE_SS7)
int transcapdigital = 0;
@ -13674,6 +13676,10 @@ static struct ast_channel *dahdi_request(const char *type, struct ast_format_cap
if (start.roundrobin)
round_robin[start.rr_starting_point] = p;
if (p->owner) {
foundowner++;
}
if (is_group_or_channel_match(p, start.span, start.groupmatch, &groupmatched, start.channelmatch, &channelmatched)
&& available(&p, channelmatched)) {
ast_debug(1, "Using channel %d\n", p->channel);
@ -13792,7 +13798,7 @@ next:
ast_mutex_unlock(&iflock);
restart_monitor();
if (cause && !tmp) {
if (callwait || channelmatched) {
if (callwait || (channelmatched && foundowner)) {
*cause = AST_CAUSE_BUSY;
} else if (groupmatched) {
*cause = AST_CAUSE_CONGESTION;
@ -19411,7 +19417,7 @@ static int process_dahdi(struct dahdi_chan_conf *confp, const char *cat, struct
report_alarms = REPORT_SPAN_ALARMS;
}
} else if (!(options & PROC_DAHDI_OPT_NOWARN) )
ast_log(LOG_WARNING, "Ignoring any changes to '%s' (on reload) at line %d.\n", v->name, v->lineno);
ast_log(LOG_NOTICE, "Ignoring any changes to '%s' (on reload) at line %d.\n", v->name, v->lineno);
}
if (dahdichan) {

View File

@ -226,6 +226,16 @@
</enum>
</enumlist>
</info>
<info name="Dial_Resource" language="en_US" tech="IAX2">
<para>The general syntax is:</para>
<para><literal>Dial(IAX2/[username[:password]@]peer[:port][/exten[@context]][/options]</literal></para>
<para>IAX2 optionally allows modifiers to be specified after the extension.</para>
<enumlist>
<enum name="a">
<para>Request auto answer (supporting equipment/configuration required)</para>
</enum>
</enumlist>
</info>
<manager name="IAXpeers" language="en_US">
<synopsis>
List IAX peers.
@ -3407,7 +3417,7 @@ static int send_packet(struct iax_frame *f)
/* Called with iaxsl held */
if (iaxdebug) {
ast_debug(3, "Sending %u on %d/%d to %s\n", f->ts, callno, iaxs[callno]->peercallno, ast_sockaddr_stringify(&iaxs[callno]->addr));
ast_debug(8, "Sending %u on %d/%d to %s\n", f->ts, callno, iaxs[callno]->peercallno, ast_sockaddr_stringify(&iaxs[callno]->addr));
}
if (f->transfer) {
iax_outputframe(f, NULL, 0, &iaxs[callno]->transfer, f->datalen - sizeof(struct ast_iax2_full_hdr));
@ -6384,7 +6394,7 @@ static int invalid_key(ast_aes_decrypt_key *ecx)
#ifdef HAVE_OPENSSL
int i;
for (i = 0; i < 60; i++) {
if (ecx->rd_key[i]) {
if (ecx->raw[i]) {
return 0; /* stop if we encounter anything non-zero */
}
}
@ -10363,7 +10373,7 @@ static int socket_process_helper(struct iax2_thread *thread)
}
if (ast_test_flag64(iaxs[fr->callno], IAX_ENCRYPTED) && !decrypted) {
if (decrypt_frame(fr->callno, fh, &f, &res)) {
ast_log(LOG_NOTICE, "Packet Decrypt Failed!\n");
ast_log(LOG_WARNING, "Packet Decrypt Failed!\n");
ast_variables_destroy(ies.vars);
ast_mutex_unlock(&iaxsl[fr->callno]);
return 1;
@ -12033,7 +12043,7 @@ immediatedial:
iaxs[fr->callno]->last = fr->ts;
#if 1
if (iaxdebug)
ast_debug(3, "For call=%d, set last=%u\n", fr->callno, fr->ts);
ast_debug(8, "For call=%d, set last=%u\n", fr->callno, fr->ts);
#endif
}

View File

@ -3009,11 +3009,11 @@ static void chan_pjsip_session_end(struct ast_sip_session *session)
static void set_sipdomain_variable(struct ast_sip_session *session)
{
pjsip_sip_uri *sip_ruri = pjsip_uri_get_uri(session->request_uri);
size_t size = pj_strlen(&sip_ruri->host) + 1;
const pj_str_t *host = ast_sip_pjsip_uri_get_hostname(session->request_uri);
size_t size = pj_strlen(host) + 1;
char *domain = ast_alloca(size);
ast_copy_pj_str(domain, &sip_ruri->host, size);
ast_copy_pj_str(domain, host, size);
pbx_builtin_setvar_helper(session->channel, "SIPDOMAIN", domain);
return;

View File

@ -381,9 +381,9 @@ static struct ast_channel *unicast_rtp_request(const char *type, struct ast_form
ast_channel_tech_pvt_set(chan, instance);
ast_rtp_instance_get_local_address(instance, &local_address);
pbx_builtin_setvar_helper(chan, "UNICASTRTP_LOCAL_ADDRESS",
ast_sockaddr_stringify_addr(&local_address));
ast_rtp_instance_get_local_address(instance, &local_address);
pbx_builtin_setvar_helper(chan, "UNICASTRTP_LOCAL_PORT",
ast_sockaddr_stringify_port(&local_address));

View File

@ -2138,7 +2138,7 @@ static void *__analog_ss_thread(void *data)
/* If starting a threeway call, never timeout on the first digit so someone
can use flash-hook as a "hold" feature */
if (p->subs[ANALOG_SUB_THREEWAY].owner) {
timeout = 999999;
timeout = INT_MAX;
}
while (len < AST_MAX_EXTENSION-1) {
int is_exten_parking = 0;
@ -3731,6 +3731,32 @@ void *analog_handle_init_event(struct analog_pvt *i, int event)
/* Handle an event on a given channel for the monitor thread. */
switch (event) {
case ANALOG_EVENT_WINKFLASH:
case ANALOG_EVENT_RINGBEGIN:
switch (i->sig) {
case ANALOG_SIG_FXSLS:
case ANALOG_SIG_FXSGS:
case ANALOG_SIG_FXSKS:
if (i->immediate) {
if (i->use_callerid || i->usedistinctiveringdetection) {
ast_log(LOG_WARNING, "Can't start PBX immediately, must wait for Caller ID / distinctive ring\n");
} else {
/* If we don't care about Caller ID or Distinctive Ring, then there's
* no need to wait for anything before accepting the call, as
* waiting will buy us nothing.
* So if the channel is configured for immediate, actually start immediately
* and get the show on the road as soon as possible. */
ast_debug(1, "Disabling ring timeout (previously %d) to begin handling immediately\n", i->ringt_base);
analog_set_ringtimeout(i, 0);
}
}
break;
default:
break;
}
/* Fall through */
if (!(ISTRUNK(i) && i->immediate && !i->use_callerid && !i->usedistinctiveringdetection)) {
break;
}
case ANALOG_EVENT_RINGOFFHOOK:
if (i->inalarm) {
break;

View File

@ -8,6 +8,11 @@ total_analysis_time = 5000 ; Maximum time allowed for the algorithm to decide
silence_threshold = 256 ; If the average level of noise in a sample does not reach
; this value, from a scale of 0 to 32767, then we will consider
; it to be silence.
;playback_file = ; Audio file to play while AMD is running, so the caller
; does not just hear silence. Note that specifying this here
; will apply to ALL AMD runs, so you may wish to set it
; in the dialplan as an argument to AMD() instead.
; Default is no audio file (not to play anything).
; Greeting ;
initial_silence = 2500 ; Maximum silence duration before the greeting.
@ -19,7 +24,7 @@ greeting = 1500 ; Maximum length of a greeting. If exceeded, then the
; Word detection ;
min_word_length = 100 ; Minimum duration of Voice to considered as a word
maximum_word_length = 5000 ; Maximum duration of a single Voice utterance allowed.
maximum_word_length = 5000 ; Maximum duration of a single Voice utterance allowed.
between_words_silence = 50 ; Minimum duration of silence after a word to consider
; the audio what follows as a new word

View File

@ -95,10 +95,13 @@ documentation_language = en_US ; Set the language you want documentation
; documented in extensions.conf.sample.
; Default gosub.
;live_dangerously = no ; Enable the execution of 'dangerous' dialplan
; functions from external sources (AMI,
; etc.) These functions (such as SHELL) are
; considered dangerous because they can allow
; privilege escalation.
; functions and configuration file access from
; external sources (AMI, etc.) These functions
; (such as SHELL) are considered dangerous
; because they can allow privilege escalation.
; Configuration files are considered dangerous
; if they exist outside of the Asterisk
; configuration directory.
; Default no
;entityid=00:11:22:33:44:55 ; Entity ID.
; This is in the form of a MAC address.

View File

@ -32,6 +32,17 @@
; is "no".
;congestion = no
; Define whether or not to ignore bridging changes in CDRs. This prevents
; bridging changes from resulting in multiple CDRs for different parts of
; a call. Default is "no". This setting cannot be changed on a reload.
;ignorestatechanges = no
; Define whether or not to ignore dial updates in CDRs. This prevents
; dial updates from resulting in multiple CDRs for different parts of
; a call. The last disposition on the channel will be used for the CDR.
; Use with caution. Default is "no".
;ignoredialchanges = no
; Normally, CDR's are not closed out until after all extensions are finished
; executing. By enabling this option, the CDR will be ended before executing
; the "h" extension and hangup handlers so that CDR values such as "end" and
@ -102,8 +113,6 @@
; Here are all the possible back ends:
;
; csv, custom, manager, odbc, pgsql, radius, sqlite, tds
; (also, mysql is available via the asterisk-addons, due to licensing
; requirements)
; (please note, also, that other backends can be created, by creating
; a new backend module in the source cdr/ directory!)
;

View File

@ -936,8 +936,13 @@ pickupgroup=1
; target of the transfer.
;
; Specify whether the channel should be answered immediately or if the simple
; switch should provide dialtone, read digits, etc.
; On FXS channels (FXO signaled), specifies whether the channel should enter the dialplan
; immediately or if the simple switch should provide dialtone, read digits, etc.
; On FXO channels (FXS signaled), specifies whether the call should enter the dialplan
; immediately or if we should wait for at least one ring. This is required if
; Caller ID or distinctive ringing is enabled. If you do not need either, you can
; skip waiting for the first ring to begin call processing sooner.
;
; Note: If immediate=yes the dialplan execution will always start at extension
; 's' priority 1 regardless of the dialed number!
;

View File

@ -58,8 +58,11 @@ type=user
; when a channel enters a empty conference. On by default.
;wait_marked=yes ; Sets if the user must wait for a marked user to enter before
; joining the conference. Off by default.
;end_marked=yes ; This option will kick every user with this option set in their
; user profile after the last Marked user exists the conference.
;end_marked=yes ; This option will kick every non-marked user with this option set in their
; user profile after the last marked user exits the conference.
;end_marked_any=no ; This option will kick every user with this option set in
; their user profile after any marked user exits the conference.
; Additionally, note that unlike end_marked, this includes marked users.
;dsp_drop_silence=yes ; This option drops what Asterisk detects as silence from
; entering into the bridge. Enabling this option will drastically

View File

@ -6,7 +6,11 @@
[general]
;transferdigittimeout => 3 ; Number of seconds to wait between digits when transferring a call
; (default is 3 seconds)
; (default is 3 seconds). If the TRANSFER_EXTEN dialplan variable has been set
; on the channel of the user that is invoking the transfer feature, then
; this option is not used as the user is transferred directly to the extension
; specified by TRANSFER_EXTEN (the transfer context remains the context specified
; by TRANSFER_CONTEXT, if set, and otherwise the default context).
;xfersound = beep ; to indicate an attended transfer is complete
;xferfailsound = beeperr ; to indicate a failed transfer
;pickupexten = *8 ; Configure the pickup extension. (default is *8)
@ -26,12 +30,13 @@
; By default, this is 2.
;transferdialattempts = 3 ; Number of times that a transferer may attempt to dial an extension before
; being kicked back to the original call.
;transferannouncesound = beep ; Sound to play to a transferer to indicate transfer process has begun. If empty, no sound will be played.
;transferretrysound = beep ; Sound to play when a transferer fails to dial a valid extension.
;transferinvalidsound = beeperr ; Sound to play when a transferer fails to dial a valid extension and is out of retries.
;atxferabort = *1 ; cancel the attended transfer
;atxfercomplete = *2 ; complete the attended transfer, dropping out of the call
;atxferthreeway = *3 ; complete the attended transfer, but stay in the call. This will turn the call into a multi-party bridge
;atxferswap = *4 ; swap to the other party. Once an attended transfer has begun, this options may be used multiple times
;atxferswap = *4 ; swap to the other party. Once an attended transfer has begun, this option may be used multiple times
; Note that the DTMF features listed below only work when two channels have answered and are bridged together.
; They can not be used while the remote party is ringing or in progress. If you require this feature you can use

View File

@ -1,6 +1,8 @@
;--
Geolocation Profile Sample Configuration
Please see https://wiki.asterisk.org/wiki/display/AST/Geolocation
for the most current information.
--;
;--
@ -134,14 +136,24 @@ allowed. See RFC8787.
Example:
location_source = sip1.myserver.net
-- confidence (optional) -----------------------------------------
The confidence in the location specified.
confidence = pdf=[ unknown | normal | rectangular ], value=<percent_confident>
Please see RFC7459 for the exact description of this parameter.
Example:
confidence = pdf=normal, value=75
-- Location Example ---------------------------------------------------
[mylocation]
type = location
format = civicAddress
location_info = country=US
location_info = A1="New York", A3="New York", A4=Manhattan
location_info = HNO=1633, PRD=W, RD=46th, STS=Street
location_info = A1="New York", A3="New York", A4=Manhattan
location_info = HNO=1633, PRD=W, RD=46th, STS=Street
location_info = PC=10222
method = Manual
location_source = sip1.myserver.net
@ -160,9 +172,10 @@ location_source = sip1.myserver.net
Defines the object type.
type = profile
-- profile_action (optional) ------------------------------------------
-- profile_precedence (optional) --------------------------------------
Sets how to reconcile incoming and configured profiles.
profile_action = < prefer_incoming | prefer_config | discard_incoming
profile_precedence = < prefer_incoming | prefer_config | discard_incoming
| discard_config >
On an incoming call leg, "incoming" is the location description
@ -188,11 +201,13 @@ discard_config: Discard any configured location description. If
discard_incoming is the default.
Example:
profile_action = prefer_config
profile_precedence = prefer_config
-- pidf_element (optional) --------------------------------------------
PIDF-LO element in which to place the location description.
pidf_element = < tuple | device | person >
Default: device
If the format is civicAddress or GML, this sets the PIDF element into
which the location information will be placed.
@ -207,10 +222,12 @@ Per [RFC5491], "device" is preferred and therefore the default.
Example:
pidf_element = tuple
-- geolocation_routing (optional) -------------------------------------
-- allow_routing_use (optional) ---------------------------------------
Sets whether the "Geolocation-Routing" header is added to outgoing
requests.
geolocation_routing = < yes | no >
allow_routing_use = < yes | no >
Default: no
Set to "yes" to indicate that servers later in the path
can use the location information for routing purposes. Set to "no"
@ -218,7 +235,7 @@ if they should not. If this value isn't specified, no
"Geolocation-Routing" header will be added.
Example:
geolocation_routing = yes
allow_routing_use = yes
-- location_reference (optional) --------------------------------------
The name of an existing Location object.
@ -243,7 +260,7 @@ floor and room just for this profile
Example:
location_info_refinement = floor=20, room=20a2
-- location_variables -------------------------------------------------
-- location_variables (optional) --------------------------------------
If the referenced Location object uses any replacement variables, they
can be assigned here. There is no need to define variables that come
@ -251,6 +268,33 @@ from the channel using this profile. They get assigned automatically.
location_variables = myfloor=20, myroom=222
-- suppress_empty_ca_elements (optional) ------------------------------
Sets whether empty values for Civic Address elements should be
suppressed from the outgoing PIDF-LO document.
suppress_empty_ca_elements = < yes | no >
Default: no
Setting to "yes" allows you to define a location info template
with channel variables that may or may not exist.
For example, with:
location_info_refinement = FLR=${MyFlr}
suppress_empty_ca_elements = no ; the default
If the MyFlr channel variable weren't set, the outgoing PIDF-LO document
would have an empty <FLR/> element in it. If suppress_empty_ca_elements
were set to "yes", the FLR element would be dropped from the PIDF-LO
document altogether.
-- format, location_info, location_source, method, confidence ---------
You can specify the location object's format, location_info,
method, location_source and confidence parameters directly on
a profile object for simple scenarios where the location
information isn't common with any other profiles. This is
mutually exclusive with setting location_reference on the
profile.
-- Profile Example ----------------------------------------------------
[myprofile]
@ -262,3 +306,13 @@ profile_action = discard_incoming
=======================================================================
--;
-- NOTE ---------------------------------------------------------------
There are 4 built-in profiles that can be assigned to endpoints:
"<prefer_config>"
"<discard_config>"
"<prefer_incoming>"
"<discard_incoming>"
The profiles are empty except for having their precedence
set.

View File

@ -22,6 +22,9 @@ capture_password = foo ; If specified, the authorization password
capture_id = 1234 ; A unique integer identifier for this
; server. This ID will be embedded sent
; with each packet from this server.
;capture_name = asterisk ; A unique string identifier for this
; server. This ID will be embedded sent
; with each packet from this server.
uuid_type = call-id ; Specify the preferred source for the Homer
; correlation UUID. Valid options are:
; - 'call-id' for the PJSIP or chan_sip SIP

View File

@ -82,6 +82,9 @@ directory=moh
; ; in alphabetical order. If 'randstart', the files are sorted
; ; in alphabetical order as well, but the first file is chosen
; ; at random. If unspecified, the sort order is undefined.
;answeredonly=yes ; Only allow answered channels to have music on hold.
; Enabling this will prevent MOH on unanswered channels.
; (default: "no")
;[native-alphabetical]
;mode=files

View File

@ -964,6 +964,11 @@
; by the channel driver from the dialplan before they're forwarded
; the remote endpoint.
;
; send_aoc =
; This options turns on and off support for sending AOC to endpoints.
; AOC updates can be sent using the AOCMessage AMI action or come
; from PRI channels.
; (default: no)
;==========================AUTH SECTION OPTIONS=========================
@ -1054,11 +1059,16 @@
; and/or "asterisk_ecc.pem" are loaded (certificate, inter-
; mediates, private key), to support multiple algorithms for
; server authentication (RSA, DSA, ECDSA). If the chains are
; different, at least OpenSSL 1.0.2 is required.
; different, at least OpenSSL 1.0.2 is required. This option
; can be reloaded resulting in an updated certificate if the
; filename remains unchanged.
; (default: "")
;cipher= ; Preferred cryptography cipher names TLS ONLY (default: "")
;method= ; Method of SSL transport TLS ONLY (default: "")
;priv_key_file= ; Private key file TLS ONLY (default: "")
;priv_key_file= ; Private key file TLS ONLY. This option can be reloaded
; resulting in an updated private key if the filename remains
; unchanged.
; (default: "")
;verify_client= ; Require verification of client certificate TLS ONLY (default:
; "")
;verify_server= ; Require verification of server certificate TLS ONLY (default:
@ -1331,6 +1341,13 @@
; creating an implicit subscription (see RFC 4488).
; (default: "yes")
;all_codecs_on_empty_reinvite=yes
; On reception of a re-INVITE without SDP Asterisk will send an SDP
; offer in the 200 OK response containing all configured codecs on the
; endpoint, instead of simply those that have already been negotiated.
; RFC 3261 specifies this as a SHOULD requirement.
; (default: "no")
;allow_sending_180_after_183=yes ; Allow Asterisk to send 180 Ringing to an endpoint
; after 183 Session Progress has been send.
; If disabled Asterisk will instead send only a
@ -1582,3 +1599,16 @@
;mailbox_state_filter= ; Optional regular expression used to filter what
; mailboxes we accept events for.
;================================TEL URIs=====================================
;
; Asterisk has TEL URI support, but with limited scope. Support is only for
; TEL URIs present in traffic from a remote party. Asterisk does not generate
; any TEL URIs of its own.
;
; Currently, the allowed request types are INVITE, ACK, BYE, and CANCEL. Any
; other request type that contains a TEL URI will behave as it did before.
; TEL URIs are allowed in the request, From, and To headers.
;
; You can match a TEL URI From header by IP, header, or auth_username.

View File

@ -262,6 +262,8 @@ pagerdateformat=%A, %B %d, %Y at %r
; option lets you customize the format sent to particular mailboxes.
; Useful if Windows users want wav49, but Linux users want gsm.
; [per-mailbox only]
; attachextrecs=no ; Whether to attach recordings that are externally added to mailboxes,
; such as through MixMonitor. Default is no.
; saycid=yes ; Say the caller id information before the message. If not described,
; or set to no, it will be in the envelope. When enabled, if a recorded file
; with the same name as the caller id exists in

257
configure vendored
View File

@ -711,6 +711,7 @@ AST_RPATH
AST_NATIVE_ARCH
AST_SHADOW_WARNINGS
AST_NO_STRINGOP_TRUNCATION
AST_NO_FORMAT_Y2K
AST_NO_FORMAT_TRUNCATION
AST_NO_STRICT_OVERFLOW
AST_FORTIFY_SOURCE
@ -940,6 +941,10 @@ PBX_POPT
POPT_DIR
POPT_INCLUDE
POPT_LIB
PBX_PJSIP_TLS_TRANSPORT_RESTART
PJSIP_TLS_TRANSPORT_RESTART_DIR
PJSIP_TLS_TRANSPORT_RESTART_INCLUDE
PJSIP_TLS_TRANSPORT_RESTART_LIB
PBX_PJSIP_OAUTH_AUTHENTICATION
PJSIP_OAUTH_AUTHENTICATION_DIR
PJSIP_OAUTH_AUTHENTICATION_INCLUDE
@ -10213,8 +10218,8 @@ printf "%s\n" "$as_me: checking whether system openssl > 1.1.0" >&6;}
if test "x${PBX_OPENSSL}" != "x1" -a "${USE_OPENSSL}" != "no"; then
pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for openssl >= 1.1.0" >&5
printf %s "checking for openssl >= 1.1.0... " >&6; }
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for OPENSSL" >&5
printf %s "checking for OPENSSL... " >&6; }
if test -n "$OPENSSL_CFLAGS"; then
pkg_cv_OPENSSL_CFLAGS="$OPENSSL_CFLAGS"
@ -10254,7 +10259,7 @@ fi
if test $pkg_failed = yes; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
@ -10275,7 +10280,7 @@ fi
elif test $pkg_failed = untried; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
PBX_OPENSSL=0
@ -10304,8 +10309,8 @@ printf "%s\n" "$as_me: checking whether alternate openssl11 is installed" >&6;}
if test "x${PBX_OPENSSL}" != "x1" -a "${USE_OPENSSL}" != "no"; then
pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for openssl11" >&5
printf %s "checking for openssl11... " >&6; }
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for OPENSSL" >&5
printf %s "checking for OPENSSL... " >&6; }
if test -n "$OPENSSL_CFLAGS"; then
pkg_cv_OPENSSL_CFLAGS="$OPENSSL_CFLAGS"
@ -10345,7 +10350,7 @@ fi
if test $pkg_failed = yes; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
@ -10366,7 +10371,7 @@ fi
elif test $pkg_failed = untried; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
PBX_OPENSSL=0
@ -10400,8 +10405,8 @@ printf "%s\n" "$as_me: checking fallback system openssl" >&6;}
if test "x${PBX_OPENSSL}" != "x1" -a "${USE_OPENSSL}" != "no"; then
pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for openssl" >&5
printf %s "checking for openssl... " >&6; }
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for OPENSSL" >&5
printf %s "checking for OPENSSL... " >&6; }
if test -n "$OPENSSL_CFLAGS"; then
pkg_cv_OPENSSL_CFLAGS="$OPENSSL_CFLAGS"
@ -10441,7 +10446,7 @@ fi
if test $pkg_failed = yes; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
@ -10462,7 +10467,7 @@ fi
elif test $pkg_failed = untried; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
PBX_OPENSSL=0
@ -11087,6 +11092,9 @@ printf "%s\n" "#define HAVE_PJSIP_OAUTH_AUTHENTICATION 1" >>confdefs.h
printf "%s\n" "#define HAVE_PJPROJECT_ON_VALID_ICE_PAIR_CALLBACK 1" >>confdefs.h
printf "%s\n" "#define HAVE_PJSIP_TLS_TRANSPORT_RESTART 1" >>confdefs.h
@ -13162,6 +13170,18 @@ PBX_PJSIP_OAUTH_AUTHENTICATION=0
PJSIP_TLS_TRANSPORT_RESTART_DESCRIP="PJSIP TLS Transport Restart Support"
PJSIP_TLS_TRANSPORT_RESTART_OPTION=pjsip
PJSIP_TLS_TRANSPORT_RESTART_DIR=${PJPROJECT_DIR}
PBX_PJSIP_TLS_TRANSPORT_RESTART=0
fi
@ -14835,8 +14855,8 @@ fi
if test "x${PBX_LIBEDIT}" != "x1" -a "${USE_LIBEDIT}" != "no"; then
pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libedit" >&5
printf %s "checking for libedit... " >&6; }
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for LIBEDIT" >&5
printf %s "checking for LIBEDIT... " >&6; }
if test -n "$LIBEDIT_CFLAGS"; then
pkg_cv_LIBEDIT_CFLAGS="$LIBEDIT_CFLAGS"
@ -14876,7 +14896,7 @@ fi
if test $pkg_failed = yes; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
@ -14897,7 +14917,7 @@ fi
elif test $pkg_failed = untried; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
PBX_LIBEDIT=0
@ -15296,8 +15316,8 @@ if test "$JANSSON_BUNDLED" = "no" ; then
if test "x${PBX_JANSSON}" != "x1" -a "${USE_JANSSON}" != "no"; then
pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for jansson >= 2.11" >&5
printf %s "checking for jansson >= 2.11... " >&6; }
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for JANSSON" >&5
printf %s "checking for JANSSON... " >&6; }
if test -n "$JANSSON_CFLAGS"; then
pkg_cv_JANSSON_CFLAGS="$JANSSON_CFLAGS"
@ -15337,7 +15357,7 @@ fi
if test $pkg_failed = yes; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
@ -15358,7 +15378,7 @@ fi
elif test $pkg_failed = untried; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
PBX_JANSSON=0
@ -15614,8 +15634,8 @@ fi
if test "x${PBX_LIBXML2}" != "x1" -a "${USE_LIBXML2}" != "no"; then
pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libxml-2.0" >&5
printf %s "checking for libxml-2.0... " >&6; }
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for LIBXML2" >&5
printf %s "checking for LIBXML2... " >&6; }
if test -n "$LIBXML2_CFLAGS"; then
pkg_cv_LIBXML2_CFLAGS="$LIBXML2_CFLAGS"
@ -15655,7 +15675,7 @@ fi
if test $pkg_failed = yes; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
@ -15676,7 +15696,7 @@ fi
elif test $pkg_failed = untried; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
PBX_LIBXML2=0
@ -20930,6 +20950,19 @@ printf "%s\n" "no" >&6; }
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -Wno-format-y2k" >&5
printf %s "checking for -Wno-format-y2k... " >&6; }
if $(${CC} -Wno-format-y2k -Werror -S -o /dev/null -xc /dev/null > /dev/null 2>&1); then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
AST_NO_FORMAT_Y2K=-Wno-format-y2k
else
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
AST_NO_FORMAT_Y2K=
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -Wno-stringop-truncation" >&5
printf %s "checking for -Wno-stringop-truncation... " >&6; }
if $(${CC} -Wno-stringop-truncation -Werror -S -o /dev/null -xc /dev/null > /dev/null 2>&1); then
@ -22889,8 +22922,8 @@ if test "${USE_ILBC}" != "no"; then
if test "x${PBX_ILBC}" != "x1" -a "${USE_ILBC}" != "no"; then
pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libilbc" >&5
printf %s "checking for libilbc... " >&6; }
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ILBC" >&5
printf %s "checking for ILBC... " >&6; }
if test -n "$ILBC_CFLAGS"; then
pkg_cv_ILBC_CFLAGS="$ILBC_CFLAGS"
@ -22930,7 +22963,7 @@ fi
if test $pkg_failed = yes; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
@ -22951,7 +22984,7 @@ fi
elif test $pkg_failed = untried; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
PBX_ILBC=0
@ -25148,8 +25181,8 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam \
if test "x${PBX_NETSNMP}" != "x1" -a "${USE_NETSNMP}" != "no"; then
pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for netsnmp-agent" >&5
printf %s "checking for netsnmp-agent... " >&6; }
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for NETSNMP" >&5
printf %s "checking for NETSNMP... " >&6; }
if test -n "$NETSNMP_CFLAGS"; then
pkg_cv_NETSNMP_CFLAGS="$NETSNMP_CFLAGS"
@ -25189,7 +25222,7 @@ fi
if test $pkg_failed = yes; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
@ -25210,7 +25243,7 @@ fi
elif test $pkg_failed = untried; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
PBX_NETSNMP=0
@ -26575,8 +26608,8 @@ if test "$USE_PJPROJECT" != "no" ; then
if test "x${PBX_PJPROJECT}" != "x1" -a "${USE_PJPROJECT}" != "no"; then
pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libpjproject" >&5
printf %s "checking for libpjproject... " >&6; }
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PJPROJECT" >&5
printf %s "checking for PJPROJECT... " >&6; }
if test -n "$PJPROJECT_CFLAGS"; then
pkg_cv_PJPROJECT_CFLAGS="$PJPROJECT_CFLAGS"
@ -26616,7 +26649,7 @@ fi
if test $pkg_failed = yes; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
@ -26637,7 +26670,7 @@ fi
elif test $pkg_failed = untried; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
PBX_PJPROJECT=0
@ -27824,6 +27857,102 @@ _ACEOF
fi
if test "x${PBX_PJSIP_TLS_TRANSPORT_RESTART}" != "x1" -a "${USE_PJSIP_TLS_TRANSPORT_RESTART}" != "no"; then
pbxlibdir=""
# if --with-PJSIP_TLS_TRANSPORT_RESTART=DIR has been specified, use it.
if test "x${PJSIP_TLS_TRANSPORT_RESTART_DIR}" != "x"; then
if test -d ${PJSIP_TLS_TRANSPORT_RESTART_DIR}/lib; then
pbxlibdir="-L${PJSIP_TLS_TRANSPORT_RESTART_DIR}/lib"
else
pbxlibdir="-L${PJSIP_TLS_TRANSPORT_RESTART_DIR}"
fi
fi
ast_ext_lib_check_save_CFLAGS="${CFLAGS}"
CFLAGS="${CFLAGS} $PJPROJECT_CFLAGS"
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pjsip_tls_transport_restart in -lpjsip" >&5
printf %s "checking for pjsip_tls_transport_restart in -lpjsip... " >&6; }
if test ${ac_cv_lib_pjsip_pjsip_tls_transport_restart+y}
then :
printf %s "(cached) " >&6
else $as_nop
ac_check_lib_save_LIBS=$LIBS
LIBS="-lpjsip ${pbxlibdir} $PJPROJECT_LIB $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
char pjsip_tls_transport_restart ();
int
main (void)
{
return pjsip_tls_transport_restart ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
ac_cv_lib_pjsip_pjsip_tls_transport_restart=yes
else $as_nop
ac_cv_lib_pjsip_pjsip_tls_transport_restart=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pjsip_pjsip_tls_transport_restart" >&5
printf "%s\n" "$ac_cv_lib_pjsip_pjsip_tls_transport_restart" >&6; }
if test "x$ac_cv_lib_pjsip_pjsip_tls_transport_restart" = xyes
then :
AST_PJSIP_TLS_TRANSPORT_RESTART_FOUND=yes
else $as_nop
AST_PJSIP_TLS_TRANSPORT_RESTART_FOUND=no
fi
CFLAGS="${ast_ext_lib_check_save_CFLAGS}"
# now check for the header.
if test "${AST_PJSIP_TLS_TRANSPORT_RESTART_FOUND}" = "yes"; then
PJSIP_TLS_TRANSPORT_RESTART_LIB="${pbxlibdir} -lpjsip $PJPROJECT_LIB"
# if --with-PJSIP_TLS_TRANSPORT_RESTART=DIR has been specified, use it.
if test "x${PJSIP_TLS_TRANSPORT_RESTART_DIR}" != "x"; then
PJSIP_TLS_TRANSPORT_RESTART_INCLUDE="-I${PJSIP_TLS_TRANSPORT_RESTART_DIR}/include"
fi
PJSIP_TLS_TRANSPORT_RESTART_INCLUDE="${PJSIP_TLS_TRANSPORT_RESTART_INCLUDE} $PJPROJECT_CFLAGS"
# check for the header
ast_ext_lib_check_saved_CPPFLAGS="${CPPFLAGS}"
CPPFLAGS="${CPPFLAGS} ${PJSIP_TLS_TRANSPORT_RESTART_INCLUDE}"
ac_fn_c_check_header_compile "$LINENO" "pjsip.h" "ac_cv_header_pjsip_h" "$ac_includes_default"
if test "x$ac_cv_header_pjsip_h" = xyes
then :
PJSIP_TLS_TRANSPORT_RESTART_HEADER_FOUND=1
else $as_nop
PJSIP_TLS_TRANSPORT_RESTART_HEADER_FOUND=0
fi
CPPFLAGS="${ast_ext_lib_check_saved_CPPFLAGS}"
if test "x${PJSIP_TLS_TRANSPORT_RESTART_HEADER_FOUND}" = "x0" ; then
PJSIP_TLS_TRANSPORT_RESTART_LIB=""
PJSIP_TLS_TRANSPORT_RESTART_INCLUDE=""
else
PBX_PJSIP_TLS_TRANSPORT_RESTART=1
cat >>confdefs.h <<_ACEOF
#define HAVE_PJSIP_TLS_TRANSPORT_RESTART 1
_ACEOF
fi
fi
fi
fi
fi
@ -27835,8 +27964,8 @@ fi
if test "x${PBX_PYTHONDEV}" != "x1" -a "${USE_PYTHONDEV}" != "no"; then
pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for python-2.7" >&5
printf %s "checking for python-2.7... " >&6; }
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PYTHONDEV" >&5
printf %s "checking for PYTHONDEV... " >&6; }
if test -n "$PYTHONDEV_CFLAGS"; then
pkg_cv_PYTHONDEV_CFLAGS="$PYTHONDEV_CFLAGS"
@ -27876,7 +28005,7 @@ fi
if test $pkg_failed = yes; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
@ -27897,7 +28026,7 @@ fi
elif test $pkg_failed = untried; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
PBX_PYTHONDEV=0
@ -27923,8 +28052,8 @@ fi
if test "x${PBX_PYTHONDEV}" != "x1" -a "${USE_PYTHONDEV}" != "no"; then
pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for python2" >&5
printf %s "checking for python2... " >&6; }
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PYTHONDEV" >&5
printf %s "checking for PYTHONDEV... " >&6; }
if test -n "$PYTHONDEV_CFLAGS"; then
pkg_cv_PYTHONDEV_CFLAGS="$PYTHONDEV_CFLAGS"
@ -27964,7 +28093,7 @@ fi
if test $pkg_failed = yes; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
@ -27985,7 +28114,7 @@ fi
elif test $pkg_failed = untried; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
PBX_PYTHONDEV=0
@ -28011,8 +28140,8 @@ fi
if test "x${PBX_PYTHONDEV}" != "x1" -a "${USE_PYTHONDEV}" != "no"; then
pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for python" >&5
printf %s "checking for python... " >&6; }
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PYTHONDEV" >&5
printf %s "checking for PYTHONDEV... " >&6; }
if test -n "$PYTHONDEV_CFLAGS"; then
pkg_cv_PYTHONDEV_CFLAGS="$PYTHONDEV_CFLAGS"
@ -28052,7 +28181,7 @@ fi
if test $pkg_failed = yes; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
@ -28073,7 +28202,7 @@ fi
elif test $pkg_failed = untried; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
PBX_PYTHONDEV=0
@ -28207,8 +28336,8 @@ fi
if test "x${PBX_PORTAUDIO}" != "x1" -a "${USE_PORTAUDIO}" != "no"; then
pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for portaudio-2.0" >&5
printf %s "checking for portaudio-2.0... " >&6; }
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PORTAUDIO" >&5
printf %s "checking for PORTAUDIO... " >&6; }
if test -n "$PORTAUDIO_CFLAGS"; then
pkg_cv_PORTAUDIO_CFLAGS="$PORTAUDIO_CFLAGS"
@ -28248,7 +28377,7 @@ fi
if test $pkg_failed = yes; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
@ -28269,7 +28398,7 @@ fi
elif test $pkg_failed = untried; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
PBX_PORTAUDIO=0
@ -34125,8 +34254,8 @@ for ver in 3.0 2.6 2.4 2.2 2.0; do
if test "x${PBX_GMIME}" != "x1" -a "${USE_GMIME}" != "no"; then
pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gmime-$ver" >&5
printf %s "checking for gmime-$ver... " >&6; }
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GMIME" >&5
printf %s "checking for GMIME... " >&6; }
if test -n "$GMIME_CFLAGS"; then
pkg_cv_GMIME_CFLAGS="$GMIME_CFLAGS"
@ -34166,7 +34295,7 @@ fi
if test $pkg_failed = yes; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
@ -34187,7 +34316,7 @@ fi
elif test $pkg_failed = untried; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
PBX_GMIME=0
@ -35485,8 +35614,8 @@ fi
if test "x${PBX_GTK2}" != "x1" -a "${USE_GTK2}" != "no"; then
pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gtk+-2.0" >&5
printf %s "checking for gtk+-2.0... " >&6; }
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GTK2" >&5
printf %s "checking for GTK2... " >&6; }
if test -n "$GTK2_CFLAGS"; then
pkg_cv_GTK2_CFLAGS="$GTK2_CFLAGS"
@ -35526,7 +35655,7 @@ fi
if test $pkg_failed = yes; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
@ -35547,7 +35676,7 @@ fi
elif test $pkg_failed = untried; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
PBX_GTK2=0
@ -35596,8 +35725,8 @@ fi
if test "x${PBX_SYSTEMD}" != "x1" -a "${USE_SYSTEMD}" != "no"; then
pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libsystemd" >&5
printf %s "checking for libsystemd... " >&6; }
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for SYSTEMD" >&5
printf %s "checking for SYSTEMD... " >&6; }
if test -n "$SYSTEMD_CFLAGS"; then
pkg_cv_SYSTEMD_CFLAGS="$SYSTEMD_CFLAGS"
@ -35637,7 +35766,7 @@ fi
if test $pkg_failed = yes; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
@ -35658,7 +35787,7 @@ fi
elif test $pkg_failed = untried; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
PBX_SYSTEMD=0

View File

@ -589,6 +589,7 @@ AST_EXT_LIB_SETUP_OPTIONAL([PJSIP_INV_ACCEPT_MULTIPLE_SDP_ANSWERS], [PJSIP INVIT
AST_EXT_LIB_SETUP_OPTIONAL([PJSIP_ENDPOINT_COMPACT_FORM], [PJSIP Compact Form Support on Endpoint], [PJPROJECT], [pjsip])
AST_EXT_LIB_SETUP_OPTIONAL([PJSIP_TRANSPORT_DISABLE_CONNECTION_REUSE], [PJSIP Transport Connection Reuse Disabling], [PJPROJECT], [pjsip])
AST_EXT_LIB_SETUP_OPTIONAL([PJSIP_OAUTH_AUTHENTICATION], [PJSIP OAuth Authentication Support], [PJPROJECT], [pjsip])
AST_EXT_LIB_SETUP_OPTIONAL([PJSIP_TLS_TRANSPORT_RESTART], [PJSIP TLS Transport Restart Support], [PJPROJECT], [pjsip])
fi
AST_EXT_LIB_SETUP([POPT], [popt], [popt])
@ -1397,6 +1398,16 @@ else
fi
AC_SUBST(AST_NO_FORMAT_TRUNCATION)
AC_MSG_CHECKING(for -Wno-format-y2k)
if $(${CC} -Wno-format-y2k -Werror -S -o /dev/null -xc /dev/null > /dev/null 2>&1); then
AC_MSG_RESULT(yes)
AST_NO_FORMAT_Y2K=-Wno-format-y2k
else
AC_MSG_RESULT(no)
AST_NO_FORMAT_Y2K=
fi
AC_SUBST(AST_NO_FORMAT_Y2K)
AC_MSG_CHECKING(for -Wno-stringop-truncation)
if $(${CC} -Wno-stringop-truncation -Werror -S -o /dev/null -xc /dev/null > /dev/null 2>&1); then
AC_MSG_RESULT(yes)
@ -2495,6 +2506,7 @@ if test "$USE_PJPROJECT" != "no" ; then
AST_EXT_LIB_CHECK([PJSIP_INV_SESSION_REF], [pjsip], [pjsip_inv_add_ref], [pjsip.h], [$PJPROJECT_LIB], [$PJPROJECT_CFLAGS])
AST_EXT_LIB_CHECK([PJSIP_AUTH_CLT_DEINIT], [pjsip], [pjsip_auth_clt_deinit], [pjsip.h], [$PJPROJECT_LIB], [$PJPROJECT_CFLAGS])
AST_EXT_LIB_CHECK([PJSIP_TSX_LAYER_FIND_TSX2], [pjsip], [pjsip_tsx_layer_find_tsx2], [pjsip.h], [$PJPROJECT_LIB], [$PJPROJECT_CFLAGS])
AST_EXT_LIB_CHECK([PJSIP_TLS_TRANSPORT_RESTART], [pjsip], [pjsip_tls_transport_restart], [pjsip.h], [$PJPROJECT_LIB], [$PJPROJECT_CFLAGS])
fi
fi

View File

@ -0,0 +1,49 @@
"""add security_negotiation and security_mechanisms to endpoint
Revision ID: 417c0247fd7e
Revises: 539f68bede2c
Create Date: 2022-08-08 15:35:31.416964
"""
# revision identifiers, used by Alembic.
revision = '417c0247fd7e'
down_revision = '539f68bede2c'
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects.postgresql import ENUM
SECURITY_NEGOTIATION_NAME = 'security_negotiation_values'
SECURITY_NEGOTIATION_VALUES = ['no', 'mediasec']
def upgrade():
context = op.get_context()
if context.bind.dialect.name == 'postgresql':
security_negotiation_values = ENUM(*SECURITY_NEGOTIATION_VALUES, name=SECURITY_NEGOTIATION_NAME)
security_negotiation_values.create(op.get_bind(), checkfirst=False)
op.add_column('ps_endpoints', sa.Column('security_negotiation',
ENUM(*SECURITY_NEGOTIATION_VALUES, name=SECURITY_NEGOTIATION_NAME, create_type=False)))
op.add_column('ps_endpoints', sa.Column('security_mechanisms', sa.String(512)))
op.add_column('ps_registrations', sa.Column('security_negotiation',
ENUM(*SECURITY_NEGOTIATION_VALUES, name=SECURITY_NEGOTIATION_NAME, create_type=False)))
op.add_column('ps_registrations', sa.Column('security_mechanisms', sa.String(512)))
def downgrade():
context = op.get_context()
if context.bind.dialect.name == 'mssql':
op.drop_constraint('ck_ps_endpoints_security_negotiation_security_negotiation_values', 'ps_endpoints')
op.drop_constraint('ck_ps_registrations_security_negotiation_security_negotiation_values', 'ps_registrations')
op.drop_column('ps_endpoints', 'security_negotiation')
op.drop_column('ps_endpoints', 'security_mechanisms')
op.drop_column('ps_registrations', 'security_negotiation')
op.drop_column('ps_registrations', 'security_mechanisms')
if context.bind.dialect.name == 'postgresql':
enum = ENUM(*SECURITY_NEGOTIATION_VALUES, name=SECURITY_NEGOTIATION_NAME)
enum.drop(op.get_bind(), checkfirst=False)

View File

@ -0,0 +1,57 @@
"""Add peer_supported to 100rel
Revision ID: 539f68bede2c
Revises: 9f3692b1654b
Create Date: 2022-08-10 09:36:16.576049
"""
# revision identifiers, used by Alembic.
revision = '539f68bede2c'
down_revision = '9f3692b1654b'
from alembic import op
from sqlalchemy.dialects.postgresql import ENUM
import sqlalchemy as sa
OLD_ENUM = ['no', 'required', 'yes']
NEW_ENUM = ['no', 'required', 'peer_supported', 'yes']
old_type = sa.Enum(*OLD_ENUM, name='pjsip_100rel_values')
new_type = sa.Enum(*NEW_ENUM, name='pjsip_100rel_values_v2')
def upgrade():
context = op.get_context()
# Upgrading to this revision WILL clear your directmedia values.
if context.bind.dialect.name != 'postgresql':
op.alter_column('ps_endpoints', '100rel',
type_=new_type,
existing_type=old_type)
else:
enum = ENUM(*NEW_ENUM, name='pjsip_100rel_values_v2')
enum.create(op.get_bind(), checkfirst=False)
op.execute('ALTER TABLE ps_endpoints ALTER COLUMN 100rel TYPE'
' pjsip_100rel_values_v2 USING'
' 100rel::text::pjsip_100rel_values_v2')
ENUM(name="pjsip_100rel_values").drop(op.get_bind(), checkfirst=False)
def downgrade():
context = op.get_context()
if context.bind.dialect.name != 'postgresql':
op.alter_column('ps_endpoints', '100rel',
type_=old_type,
existing_type=new_type)
else:
enum = ENUM(*OLD_ENUM, name='pjsip_100rel_values')
enum.create(op.get_bind(), checkfirst=False)
op.execute('ALTER TABLE ps_endpoints ALTER COLUMN 100rel TYPE'
' pjsip_100rel_values USING'
' 100rel::text::pjsip_100rel_values')
ENUM(name="pjsip_100rel_values_v2").drop(op.get_bind(), checkfirst=False)

View File

@ -0,0 +1,38 @@
"""add aoc option
Revision ID: 5a2247c957d2
Revises: ccf795ee535f
Create Date: 2022-10-30 12:47:56.173511
"""
# revision identifiers, used by Alembic.
revision = '5a2247c957d2'
down_revision = 'ccf795ee535f'
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects.postgresql import ENUM
AST_BOOL_NAME = 'ast_bool_values'
# We'll just ignore the n/y and f/t abbreviations as Asterisk does not write
# those aliases.
AST_BOOL_VALUES = [ '0', '1',
'off', 'on',
'false', 'true',
'no', 'yes' ]
def upgrade():
############################# Enums ##############################
# ast_bool_values has already been created, so use postgres enum object
# type to get around "already created" issue - works okay with mysql
ast_bool_values = ENUM(*AST_BOOL_VALUES, name=AST_BOOL_NAME, create_type=False)
op.add_column('ps_endpoints', sa.Column('send_aoc', ast_bool_values))
def downgrade():
if op.get_context().bind.dialect.name == 'mssql':
op.drop_constraint('ck_ps_endpoints_send_aoc_ast_bool_values', 'ps_endpoints')
op.drop_column('ps_endpoints', 'send_aoc')
pass

View File

@ -0,0 +1,58 @@
"""Add Stir Shaken Profile and Codec Preference to ps endpoint
Revision ID: 9f3692b1654b
Revises: 7197536bb68d
Create Date: 2022-08-17 11:20:56.433088
"""
# revision identifiers, used by Alembic.
revision = '9f3692b1654b'
down_revision = '7197536bb68d'
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects.postgresql import ENUM
PJSIP_INCOMING_CALL_OFFER_PREF_NAME ='pjsip_incoming_call_offer_pref_values'
PJSIP_INCOMING_CALL_OFFER_PREF_VALUES = ['local', 'local_first',
'remote', 'remote_first']
PJSIP_OUTGOING_CALL_OFFER_PREF_NAME = 'pjsip_outgoing_call_offer_pref_values'
PJSIP_OUTGOING_CALL_OFFER_PREF_VALUES = ['local', 'local_merge', 'local_first',
'remote', 'remote_merge', 'remote_first']
def upgrade():
context = op.get_context()
if context.bind.dialect.name == 'postgresql':
enum_in = ENUM(*PJSIP_INCOMING_CALL_OFFER_PREF_VALUES, name=PJSIP_INCOMING_CALL_OFFER_PREF_NAME)
enum_out = ENUM(*PJSIP_OUTGOING_CALL_OFFER_PREF_VALUES, name=PJSIP_OUTGOING_CALL_OFFER_PREF_NAME)
enum_in.create(op.get_bind(), checkfirst=False)
enum_out.create(op.get_bind(), checkfirst=False)
op.add_column('ps_endpoints', sa.Column('incoming_call_offer_pref',
sa.Enum(*PJSIP_INCOMING_CALL_OFFER_PREF_VALUES, name=PJSIP_INCOMING_CALL_OFFER_PREF_NAME)))
op.add_column('ps_endpoints', sa.Column('outgoing_call_offer_pref',
sa.Enum(*PJSIP_OUTGOING_CALL_OFFER_PREF_VALUES, name=PJSIP_OUTGOING_CALL_OFFER_PREF_NAME)))
op.add_column('ps_endpoints', sa.Column('stir_shaken_profile', sa.String(80)))
def downgrade():
context = op.get_context()
if context.bind.dialect.name == 'mssql':
op.drop_constraint('ck_ps_endpoints_incoming_call_offer_pref_pjsip_incoming_call_offer_pref_values', 'ps_endpoints')
op.drop_constraint('ck_ps_endpoints_outgoing_call_offer_pref_pjsip_outgoing_call_offer_pref_values', 'ps_endpoints')
op.drop_column('ps_endpoints', 'outgoing_call_offer_pref')
op.drop_column('ps_endpoints', 'incoming_call_offer_pref')
op.drop_column('ps_endpoints', 'stir_shaken_profile')
enums = [PJSIP_INCOMING_CALL_OFFER_PREF_NAME, PJSIP_OUTGOING_CALL_OFFER_PREF_NAME]
if context.bind.dialect.name == 'postgresql':
for e in enums:
ENUM(name=e).drop(op.get_bind(), checkfirst=False)

View File

@ -0,0 +1,37 @@
"""all_codecs_on_empty_reinvite
Revision ID: ccf795ee535f
Revises: 539f68bede2c
Create Date: 2022-09-28 09:14:36.709781
"""
# revision identifiers, used by Alembic.
revision = 'ccf795ee535f'
down_revision = '417c0247fd7e'
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects.postgresql import ENUM
AST_BOOL_NAME = 'ast_bool_values'
# We'll just ignore the n/y and f/t abbreviations as Asterisk does not write
# those aliases.
AST_BOOL_VALUES = [ '0', '1',
'off', 'on',
'false', 'true',
'no', 'yes' ]
def upgrade():
############################# Enums ##############################
# ast_bool_values has already been created, so use postgres enum object
# type to get around "already created" issue - works okay with mysql
ast_bool_values = ENUM(*AST_BOOL_VALUES, name=AST_BOOL_NAME, create_type=False)
op.add_column('ps_globals', sa.Column('all_codecs_on_empty_reinvite', ast_bool_values))
def downgrade():
if op.get_context().bind.dialect.name == 'mssql':
op.drop_constraint('ck_ps_globals_all_codecs_on_empty_reinvite_ast_bool_values', 'ps_globals')
op.drop_column('ps_globals', 'all_codecs_on_empty_reinvite')

View File

@ -0,0 +1,41 @@
CREATE TABLE alembic_version (
version_num VARCHAR(32) NOT NULL,
CONSTRAINT alembic_version_pkc PRIMARY KEY (version_num)
);
-- Running upgrade -> 210693f3123d
CREATE TABLE cdr (
accountcode VARCHAR(20),
src VARCHAR(80),
dst VARCHAR(80),
dcontext VARCHAR(80),
clid VARCHAR(80),
channel VARCHAR(80),
dstchannel VARCHAR(80),
lastapp VARCHAR(80),
lastdata VARCHAR(80),
start DATETIME,
answer DATETIME,
end DATETIME,
duration INTEGER,
billsec INTEGER,
disposition VARCHAR(45),
amaflags VARCHAR(45),
userfield VARCHAR(256),
uniqueid VARCHAR(150),
linkedid VARCHAR(150),
peeraccount VARCHAR(20),
sequence INTEGER
);
INSERT INTO alembic_version (version_num) VALUES ('210693f3123d');
-- Running upgrade 210693f3123d -> 54cde9847798
ALTER TABLE cdr MODIFY accountcode VARCHAR(80) NULL;
ALTER TABLE cdr MODIFY peeraccount VARCHAR(80) NULL;
UPDATE alembic_version SET version_num='54cde9847798' WHERE alembic_version.version_num = '210693f3123d';

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,35 @@
CREATE TABLE alembic_version (
version_num VARCHAR(32) NOT NULL,
CONSTRAINT alembic_version_pkc PRIMARY KEY (version_num)
);
-- Running upgrade -> a2e9769475e
CREATE TABLE voicemail_messages (
dir VARCHAR(255) NOT NULL,
msgnum INTEGER NOT NULL,
context VARCHAR(80),
macrocontext VARCHAR(80),
callerid VARCHAR(80),
origtime INTEGER,
duration INTEGER,
recording BLOB,
flag VARCHAR(30),
category VARCHAR(30),
mailboxuser VARCHAR(30),
mailboxcontext VARCHAR(30),
msg_id VARCHAR(40)
);
ALTER TABLE voicemail_messages ADD CONSTRAINT voicemail_messages_dir_msgnum PRIMARY KEY (dir, msgnum);
CREATE INDEX voicemail_messages_dir ON voicemail_messages (dir);
INSERT INTO alembic_version (version_num) VALUES ('a2e9769475e');
-- Running upgrade a2e9769475e -> 39428242f7f5
ALTER TABLE voicemail_messages MODIFY recording BLOB(4294967295) NULL;
UPDATE alembic_version SET version_num='39428242f7f5' WHERE alembic_version.version_num = 'a2e9769475e';

View File

@ -0,0 +1,45 @@
BEGIN;
CREATE TABLE alembic_version (
version_num VARCHAR(32) NOT NULL,
CONSTRAINT alembic_version_pkc PRIMARY KEY (version_num)
);
-- Running upgrade -> 210693f3123d
CREATE TABLE cdr (
accountcode VARCHAR(20),
src VARCHAR(80),
dst VARCHAR(80),
dcontext VARCHAR(80),
clid VARCHAR(80),
channel VARCHAR(80),
dstchannel VARCHAR(80),
lastapp VARCHAR(80),
lastdata VARCHAR(80),
start TIMESTAMP WITHOUT TIME ZONE,
answer TIMESTAMP WITHOUT TIME ZONE,
"end" TIMESTAMP WITHOUT TIME ZONE,
duration INTEGER,
billsec INTEGER,
disposition VARCHAR(45),
amaflags VARCHAR(45),
userfield VARCHAR(256),
uniqueid VARCHAR(150),
linkedid VARCHAR(150),
peeraccount VARCHAR(20),
sequence INTEGER
);
INSERT INTO alembic_version (version_num) VALUES ('210693f3123d');
-- Running upgrade 210693f3123d -> 54cde9847798
ALTER TABLE cdr ALTER COLUMN accountcode TYPE VARCHAR(80);
ALTER TABLE cdr ALTER COLUMN peeraccount TYPE VARCHAR(80);
UPDATE alembic_version SET version_num='54cde9847798' WHERE alembic_version.version_num = '210693f3123d';
COMMIT;

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,39 @@
BEGIN;
CREATE TABLE alembic_version (
version_num VARCHAR(32) NOT NULL,
CONSTRAINT alembic_version_pkc PRIMARY KEY (version_num)
);
-- Running upgrade -> a2e9769475e
CREATE TABLE voicemail_messages (
dir VARCHAR(255) NOT NULL,
msgnum INTEGER NOT NULL,
context VARCHAR(80),
macrocontext VARCHAR(80),
callerid VARCHAR(80),
origtime INTEGER,
duration INTEGER,
recording BYTEA,
flag VARCHAR(30),
category VARCHAR(30),
mailboxuser VARCHAR(30),
mailboxcontext VARCHAR(30),
msg_id VARCHAR(40)
);
ALTER TABLE voicemail_messages ADD CONSTRAINT voicemail_messages_dir_msgnum PRIMARY KEY (dir, msgnum);
CREATE INDEX voicemail_messages_dir ON voicemail_messages (dir);
INSERT INTO alembic_version (version_num) VALUES ('a2e9769475e');
-- Running upgrade a2e9769475e -> 39428242f7f5
ALTER TABLE voicemail_messages ALTER COLUMN recording TYPE BYTEA;
UPDATE alembic_version SET version_num='39428242f7f5' WHERE alembic_version.version_num = 'a2e9769475e';
COMMIT;

View File

@ -69,10 +69,10 @@
<!ATTLIST configInfo name CDATA #REQUIRED>
<!ATTLIST configInfo language CDATA #REQUIRED>
<!ELEMENT configFile (configObject+)>
<!ELEMENT configFile (configObject|xi:include)+>
<!ATTLIST configFile name CDATA #REQUIRED>
<!ELEMENT configObject (synopsis?|description?|syntax?|see-also?|configOption)*>
<!ELEMENT configObject (synopsis?|description?|syntax?|see-also?|(configOption|xi:include))*>
<!ATTLIST configObject name CDATA #REQUIRED>
<!ELEMENT configOption (synopsis,description?,syntax?,see-also?)*>

107
funcs/func_export.c Normal file
View File

@ -0,0 +1,107 @@
/*
* Asterisk -- An open source telephony toolkit.
*
* Copyright (C) 2021-2022, Naveen Albert
*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
* any of the maintainers of this project for assistance;
* the project provides a web site, mailing lists and IRC
* channels for your use.
*
* This program is free software, distributed under the terms of
* the GNU General Public License Version 2. See the LICENSE file
* at the top of the source tree.
*/
/*! \file
*
* \brief Set variables and functions on other channels
*
* \author Naveen Albert <asterisk@phreaknet.org>
*
* \ingroup functions
*/
/*** MODULEINFO
<support_level>extended</support_level>
***/
#include "asterisk.h"
#include "asterisk/module.h"
#include "asterisk/channel.h"
#include "asterisk/pbx.h"
#include "asterisk/utils.h"
#include "asterisk/app.h"
#include "asterisk/stringfields.h"
/*** DOCUMENTATION
<function name="EXPORT" language="en_US">
<synopsis>
Set variables or dialplan functions on any arbitrary channel that exists.
</synopsis>
<syntax>
<parameter name="channel" required="true">
<para>The complete channel name: <literal>SIP/12-abcd1234</literal>.</para>
</parameter>
<parameter name="var" required="true">
<para>Variable name</para>
</parameter>
</syntax>
<description>
<para>Allows setting variables or functions on any existing channel if it exists.</para>
</description>
<see-also>
<ref type="function">IMPORT</ref>
<ref type="function">MASTER_CHANNEL</ref>
<ref type="function">SHARED</ref>
</see-also>
</function>
***/
static int func_export_write(struct ast_channel *chan, const char *function, char *data, const char *value)
{
struct ast_channel *ochan;
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(channel);
AST_APP_ARG(var);
);
AST_STANDARD_APP_ARGS(args, data);
if (!args.channel) {
ast_log(LOG_WARNING, "No channel was provided to %s function.\n", function);
return -1;
}
if (!args.var) {
ast_log(LOG_WARNING, "No variable name was provided to %s function.\n", function);
return -1;
}
ochan = ast_channel_get_by_name(args.channel);
if (!ochan) {
ast_log(LOG_WARNING, "Channel '%s' not found! '%s' not set.\n", args.channel, args.var);
return -1;
}
pbx_builtin_setvar_helper(ochan, data, value);
ast_channel_unref(ochan);
return 0;
}
static struct ast_custom_function export_function = {
.name = "EXPORT",
.write = func_export_write,
};
static int unload_module(void)
{
return ast_custom_function_unregister(&export_function);
}
static int load_module(void)
{
return ast_custom_function_register(&export_function);
}
AST_MODULE_INFO_STANDARD_EXTENDED(ASTERISK_GPL_KEY, "Set variables and functions on other channels");

View File

@ -341,8 +341,7 @@ static void print_frame(struct ast_frame *frame)
ast_verbose("SubClass: PVT_CAUSE_CODE\n");
break;
case AST_CONTROL_MASQUERADE_NOTIFY:
/* Should never happen. */
ast_assert(0);
ast_verbose("SubClass: MASQUERADE_NOTIFY\n");
break;
case AST_CONTROL_STREAM_TOPOLOGY_REQUEST_CHANGE:
ast_verbose("SubClass: STREAM_TOPOLOGY_REQUEST_CHANGE\n");

View File

@ -115,7 +115,7 @@ static int json_decode_read(struct ast_channel *chan, const char *cmd, char *dat
jsonval = ast_json_object_get(json, args.key);
if (!jsonval) { /* no error or warning should be thrown */
ast_debug(1, "Could not find key '%s' in parsed JSON\n", args.key);
ast_json_free(json);
ast_json_unref(json);
return -1;
}
switch(ast_json_typeof(jsonval)) {
@ -134,7 +134,7 @@ static int json_decode_read(struct ast_channel *chan, const char *cmd, char *dat
ast_json_free(result2);
break;
}
ast_json_free(json);
ast_json_unref(json);
return 0;
}

View File

@ -187,8 +187,7 @@ static int acf_if(struct ast_channel *chan, const char *cmd, char *data, char *b
AST_NONSTANDARD_APP_ARGS(args2, args1.remainder, ':');
if (ast_strlen_zero(args1.expr) || !(args2.iftrue || args2.iffalse)) {
ast_log(LOG_WARNING, "Syntax IF(<expr>?[<true>][:<false>]) (expr must be non-null, and either <true> or <false> must be non-null)\n");
ast_log(LOG_WARNING, " In this case, <expr>='%s', <true>='%s', and <false>='%s'\n", args1.expr, args2.iftrue, args2.iffalse);
ast_debug(1, "<expr>='%s', <true>='%s', and <false>='%s'\n", args1.expr, args2.iftrue, args2.iffalse);
return -1;
}

View File

@ -850,8 +850,8 @@ static int load_module(void)
for (; db_entry; db_entry = db_entry->next) {
const char *dev_name = strrchr(db_entry->key, '/') + 1;
enum ast_presence_state state;
char *message;
char *subtype;
char *message = NULL;
char *subtype = NULL;
if (dev_name <= (const char *) 1) {
continue;
}

View File

@ -211,6 +211,15 @@ AST_TEST_DEFINE(test_SAYFILES_function)
res = AST_TEST_FAIL;
}
/* + should be ignored and there should not be a leading & */
ast_str_set(&expr, 0, "${SAYFILES(+18005551212,digits)}");
ast_str_substitute_variables(&result, 0, NULL, ast_str_buffer(expr));
if (strcmp(ast_str_buffer(result), "digits/1&digits/8&digits/0&digits/0&digits/5&digits/5&digits/5&digits/1&digits/2&digits/1&digits/2") != 0) {
ast_test_status_update(test, "SAYFILES(+18005551212,digits) test failed ('%s')\n",
ast_str_buffer(result));
res = AST_TEST_FAIL;
}
ast_str_set(&expr, 0, "${SAYFILES(35,number)}");
ast_str_substitute_variables(&result, 0, NULL, ast_str_buffer(expr));
if (strcmp(ast_str_buffer(result), "digits/30&digits/5") != 0) {

View File

@ -125,6 +125,7 @@ static int scramble_callback(struct ast_audiohook *audiohook, struct ast_channel
}
if (frame->frametype == AST_FRAME_VOICE) { /* only invert voice frequencies */
ni = datastore->data;
/* Based on direction of frame, and confirm it is applicable */
if (!(direction == AST_AUDIOHOOK_DIRECTION_READ ? ni->rx : ni->tx)) {
return 0;

View File

@ -65,6 +65,16 @@
as <literal>getnum</literal>, then it will return the total number of results
that are available.</para>
</parameter>
<parameter name="field" required="false">
<para>The field of the result to retrieve.</para>
<para>The fields that can be retrieved are:</para>
<enumlist>
<enum name="host"/>
<enum name="port"/>
<enum name="priority"/>
<enum name="weight"/>
</enumlist>
</parameter>
</syntax>
<description>
<para>This function will retrieve results from a previous use

View File

@ -4,7 +4,7 @@
* Copyright (C) 2005-2006, Digium, Inc.
* Portions Copyright (C) 2005, Tilghman Lesher. All rights reserved.
* Portions Copyright (C) 2005, Anthony Minessale II
* Portions Copyright (C) 2021, Naveen Albert
* Portions Copyright (C) 2021, 2022, Naveen Albert
*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
@ -183,6 +183,51 @@ AST_THREADSTORAGE(tmp_buf);
</example>
</description>
</function>
<function name="TRIM" language="en_US">
<synopsis>
Trim leading and trailing whitespace in a string
</synopsis>
<syntax>
<parameter name="string" required="true" />
</syntax>
<description>
<para>Replaces all leading and trailing whitespace in the provided string.</para>
</description>
<see-also>
<ref type="function">LTRIM</ref>
<ref type="function">RTRIM</ref>
</see-also>
</function>
<function name="LTRIM" language="en_US">
<synopsis>
Trim leading whitespace in a string
</synopsis>
<syntax>
<parameter name="string" required="true" />
</syntax>
<description>
<para>Replaces all leading whitespace in the provided string.</para>
</description>
<see-also>
<ref type="function">TRIM</ref>
<ref type="function">RTRIM</ref>
</see-also>
</function>
<function name="RTRIM" language="en_US">
<synopsis>
Trim trailing whitespace in a string
</synopsis>
<syntax>
<parameter name="string" required="true" />
</syntax>
<description>
<para>Replaces all trailing whitespace in the provided string.</para>
</description>
<see-also>
<ref type="function">TRIM</ref>
<ref type="function">LTRIM</ref>
</see-also>
</function>
<function name="PASSTHRU" language="en_US">
<synopsis>
Pass the given argument back as a value.
@ -1045,6 +1090,84 @@ static struct ast_custom_function strbetween_function = {
.read2 = strbetween,
};
#define ltrim(s) while (isspace(*s)) s++;
#define rtrim(s) { \
if (s) { \
char *back = s + strlen(s); \
while (back != s && isspace(*--back)); \
if (*s) { \
*(back + 1) = '\0'; \
} \
} \
}
static int function_trim(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
{
char *c;
if (ast_strlen_zero(data)) {
return -1;
}
c = ast_strdupa(data);
ltrim(c);
rtrim(c);
ast_copy_string(buf, c, len);
return 0;
}
static int function_ltrim(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
{
char *c;
if (ast_strlen_zero(data)) {
return -1;
}
c = data;
ltrim(c);
ast_copy_string(buf, c, len);
return 0;
}
static int function_rtrim(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
{
char *c;
if (ast_strlen_zero(data)) {
return -1;
}
c = ast_strdupa(data);
rtrim(c);
ast_copy_string(buf, c, len);
return 0;
}
#undef ltrim
#undef rtrim
static struct ast_custom_function trim_function = {
.name = "TRIM",
.read = function_trim,
};
static struct ast_custom_function ltrim_function = {
.name = "LTRIM",
.read = function_ltrim,
};
static struct ast_custom_function rtrim_function = {
.name = "RTRIM",
.read = function_rtrim,
};
static int regex(struct ast_channel *chan, const char *cmd, char *parse, char *buf,
size_t len)
{
@ -2126,6 +2249,59 @@ AST_TEST_DEFINE(test_STRBETWEEN)
return res;
}
AST_TEST_DEFINE(test_TRIM)
{
int i, res = AST_TEST_PASS;
struct ast_channel *chan; /* dummy channel */
struct ast_str *str; /* fancy string for holding comparing value */
const char *test_strings[][5] = {
{"TRIM", " abcd ", "abcd"},
{"LTRIM", " abcd ", "abcd "},
{"RTRIM", " abcd ", " abcd"},
{"TRIM", "abcd", "abcd"},
{"TRIM", " a b c d ", "a b c d"},
};
switch (cmd) {
case TEST_INIT:
info->name = "func_TRIM";
info->category = "/funcs/func_strings/";
info->summary = "Test TRIM functions";
info->description = "Verify TRIM behavior";
return AST_TEST_NOT_RUN;
case TEST_EXECUTE:
break;
}
if (!(chan = ast_dummy_channel_alloc())) {
ast_test_status_update(test, "Unable to allocate dummy channel\n");
return AST_TEST_FAIL;
}
if (!(str = ast_str_create(64))) {
ast_test_status_update(test, "Unable to allocate dynamic string buffer\n");
ast_channel_release(chan);
return AST_TEST_FAIL;
}
for (i = 0; i < ARRAY_LEN(test_strings); i++) {
char tmp[512], tmp2[512] = "";
snprintf(tmp, sizeof(tmp), "${%s(%s)}", test_strings[i][0], test_strings[i][1]);
ast_str_substitute_variables(&str, 0, chan, tmp);
if (strcmp(test_strings[i][2], ast_str_buffer(str))) {
ast_test_status_update(test, "Format string '%s' substituted to '%s'. Expected '%s'.\n", test_strings[i][0], tmp2, test_strings[i][2]);
res = AST_TEST_FAIL;
}
}
ast_free(str);
ast_channel_release(chan);
return res;
}
#endif
static int unload_module(void)
@ -2137,6 +2313,7 @@ static int unload_module(void)
AST_TEST_UNREGISTER(test_FILTER);
AST_TEST_UNREGISTER(test_STRREPLACE);
AST_TEST_UNREGISTER(test_STRBETWEEN);
AST_TEST_UNREGISTER(test_TRIM);
res |= ast_custom_function_unregister(&fieldqty_function);
res |= ast_custom_function_unregister(&fieldnum_function);
res |= ast_custom_function_unregister(&filter_function);
@ -2163,6 +2340,9 @@ static int unload_module(void)
res |= ast_custom_function_unregister(&push_function);
res |= ast_custom_function_unregister(&unshift_function);
res |= ast_custom_function_unregister(&passthru_function);
res |= ast_custom_function_unregister(&trim_function);
res |= ast_custom_function_unregister(&ltrim_function);
res |= ast_custom_function_unregister(&rtrim_function);
return res;
}
@ -2176,6 +2356,7 @@ static int load_module(void)
AST_TEST_REGISTER(test_FILTER);
AST_TEST_REGISTER(test_STRREPLACE);
AST_TEST_REGISTER(test_STRBETWEEN);
AST_TEST_REGISTER(test_TRIM);
res |= ast_custom_function_register(&fieldqty_function);
res |= ast_custom_function_register(&fieldnum_function);
res |= ast_custom_function_register(&filter_function);
@ -2202,6 +2383,9 @@ static int load_module(void)
res |= ast_custom_function_register(&push_function);
res |= ast_custom_function_register(&unshift_function);
res |= ast_custom_function_register(&passthru_function);
res |= ast_custom_function_register(&trim_function);
res |= ast_custom_function_register(&ltrim_function);
res |= ast_custom_function_register(&rtrim_function);
return res;
}

View File

@ -37,6 +37,7 @@ int ast_term_init(void); /*!< Provided by term.c */
int astdb_init(void); /*!< Provided by db.c */
int ast_channels_init(void); /*!< Provided by channel.c */
void ast_builtins_init(void); /*!< Provided by cli.c */
void ast_cli_channels_init(void); /*!< Provided by cli.c */
int ast_cli_perms_init(int reload); /*!< Provided by cli.c */
void dnsmgr_start_refresh(void); /*!< Provided by dnsmgr.c */
int ast_dns_system_resolver_init(void); /*!< Provided by dns_system_resolver.c */

View File

@ -118,6 +118,7 @@ struct ast_audiohook {
ast_audiohook_manipulate_callback manipulate_callback; /*!< Manipulation callback */
struct ast_audiohook_options options; /*!< Applicable options */
unsigned int hook_internal_samp_rate; /*!< internal read/write sample rate on the audiohook.*/
enum ast_audiohook_direction direction; /*!< Intended audiohook direction, BOTH by default on init */
AST_LIST_ENTRY(ast_audiohook) list; /*!< Linked list information */
};
@ -140,6 +141,14 @@ int ast_audiohook_init(struct ast_audiohook *audiohook, enum ast_audiohook_type
*/
int ast_audiohook_destroy(struct ast_audiohook *audiohook);
/*! \brief Sets direction on audiohook
* \param audiohook
* \param direction In which direction should the audiohook feed frames, ie if we are snooping 'in', set direction to READ so that only the 'in' frames are fed to the slin factory
* \retval 0 on success
* \retval -1 on failure due to audiohook already in use or in shutdown. Can only set direction on NEW audiohooks
*/
int ast_audiohook_set_frame_feed_direction(struct ast_audiohook *audiohook, enum ast_audiohook_direction direction);
/*! \brief Writes a frame into the audiohook structure
* \param audiohook
* \param direction Direction the audio frame came from

View File

@ -19,19 +19,14 @@
of a mutex to its initializer. */
#undef CAN_COMPARE_MUTEX_TO_INIT_VALUE
/* Define to 1 if the `closedir' function returns void instead of `int'. */
/* Define to 1 if the `closedir' function returns void instead of int. */
#undef CLOSEDIR_VOID
/* Some configure tests will unexpectedly fail if configure is run by a
non-root user. These may be able to be tested at runtime. */
#undef CONFIGURE_RAN_AS_ROOT
/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP
systems. This function is required for `alloca.c' support on those systems.
*/
#undef CRAY_STACKSEG_END
/* Define to 1 if using `alloca.c'. */
/* Define to 1 if using 'alloca.c'. */
#undef C_ALLOCA
/* Define to 1 if anonymous semaphores work. */
@ -43,11 +38,10 @@
/* Define to 1 if you have the `acosl' function. */
#undef HAVE_ACOSL
/* Define to 1 if you have `alloca', as a function or macro. */
/* Define to 1 if you have 'alloca', as a function or macro. */
#undef HAVE_ALLOCA
/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
*/
/* Define to 1 if <alloca.h> works. */
#undef HAVE_ALLOCA_H
/* Define to 1 if you have the Advanced Linux Sound Architecture library. */
@ -505,12 +499,12 @@
/* Define to 1 if you have the `memmove' function. */
#undef HAVE_MEMMOVE
/* Define to 1 if you have the <memory.h> header file. */
#undef HAVE_MEMORY_H
/* Define to 1 if you have the `memset' function. */
#undef HAVE_MEMSET
/* Define to 1 if you have the <minix/config.h> header file. */
#undef HAVE_MINIX_CONFIG_H
/* Define to 1 if you have the `mkdir' function. */
#undef HAVE_MKDIR
@ -656,6 +650,10 @@
/* Define if your system has the PJSIP_TLS_TRANSPORT_PROTO headers. */
#undef HAVE_PJSIP_TLS_TRANSPORT_PROTO
/* Define to 1 if PJPROJECT has the PJSIP TLS Transport Restart Support
feature. */
#undef HAVE_PJSIP_TLS_TRANSPORT_RESTART
/* Define if your system has the PJSIP_TRANSPORT_DISABLE_CONNECTION_REUSE
headers. */
#undef HAVE_PJSIP_TRANSPORT_DISABLE_CONNECTION_REUSE
@ -1246,6 +1244,9 @@
/* Define to 1 if you have the `vprintf' function. */
#undef HAVE_VPRINTF
/* Define to 1 if you have the <wchar.h> header file. */
#undef HAVE_WCHAR_H
/* Define to 1 if you have the <winsock2.h> header file. */
#undef HAVE_WINSOCK2_H
@ -1400,10 +1401,13 @@
STACK_DIRECTION = 0 => direction of growth unknown */
#undef STACK_DIRECTION
/* Define to 1 if you have the ANSI C header files. */
/* Define to 1 if all of the C90 standard headers exist (not just the ones
required in a freestanding environment). This macro is provided for
backward compatibility; new code need not use it. */
#undef STDC_HEADERS
/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. This
macro is obsolete. */
#undef TIME_WITH_SYS_TIME
/* Define to 1 if your <sys/time.h> declares `struct tm'. */
@ -1416,32 +1420,93 @@
#ifndef _ALL_SOURCE
# undef _ALL_SOURCE
#endif
/* Enable GNU extensions on systems that have them. */
#ifndef _GNU_SOURCE
# undef _GNU_SOURCE
#endif
/* Enable threading extensions on Solaris. */
#ifndef _POSIX_PTHREAD_SEMANTICS
# undef _POSIX_PTHREAD_SEMANTICS
#endif
/* Enable extensions on HP NonStop. */
#ifndef _TANDEM_SOURCE
# undef _TANDEM_SOURCE
/* Enable general extensions on macOS. */
#ifndef _DARWIN_C_SOURCE
# undef _DARWIN_C_SOURCE
#endif
/* Enable general extensions on Solaris. */
#ifndef __EXTENSIONS__
# undef __EXTENSIONS__
#endif
/* Enable GNU extensions on systems that have them. */
#ifndef _GNU_SOURCE
# undef _GNU_SOURCE
#endif
/* Enable X/Open compliant socket functions that do not require linking
with -lxnet on HP-UX 11.11. */
#ifndef _HPUX_ALT_XOPEN_SOCKET_API
# undef _HPUX_ALT_XOPEN_SOCKET_API
#endif
/* Identify the host operating system as Minix.
This macro does not affect the system headers' behavior.
A future release of Autoconf may stop defining this macro. */
#ifndef _MINIX
# undef _MINIX
#endif
/* Enable general extensions on NetBSD.
Enable NetBSD compatibility extensions on Minix. */
#ifndef _NETBSD_SOURCE
# undef _NETBSD_SOURCE
#endif
/* Enable OpenBSD compatibility extensions on NetBSD.
Oddly enough, this does nothing on OpenBSD. */
#ifndef _OPENBSD_SOURCE
# undef _OPENBSD_SOURCE
#endif
/* Define to 1 if needed for POSIX-compatible behavior. */
#ifndef _POSIX_SOURCE
# undef _POSIX_SOURCE
#endif
/* Define to 2 if needed for POSIX-compatible behavior. */
#ifndef _POSIX_1_SOURCE
# undef _POSIX_1_SOURCE
#endif
/* Enable POSIX-compatible threading on Solaris. */
#ifndef _POSIX_PTHREAD_SEMANTICS
# undef _POSIX_PTHREAD_SEMANTICS
#endif
/* Enable extensions specified by ISO/IEC TS 18661-5:2014. */
#ifndef __STDC_WANT_IEC_60559_ATTRIBS_EXT__
# undef __STDC_WANT_IEC_60559_ATTRIBS_EXT__
#endif
/* Enable extensions specified by ISO/IEC TS 18661-1:2014. */
#ifndef __STDC_WANT_IEC_60559_BFP_EXT__
# undef __STDC_WANT_IEC_60559_BFP_EXT__
#endif
/* Enable extensions specified by ISO/IEC TS 18661-2:2015. */
#ifndef __STDC_WANT_IEC_60559_DFP_EXT__
# undef __STDC_WANT_IEC_60559_DFP_EXT__
#endif
/* Enable extensions specified by ISO/IEC TS 18661-4:2015. */
#ifndef __STDC_WANT_IEC_60559_FUNCS_EXT__
# undef __STDC_WANT_IEC_60559_FUNCS_EXT__
#endif
/* Enable extensions specified by ISO/IEC TS 18661-3:2015. */
#ifndef __STDC_WANT_IEC_60559_TYPES_EXT__
# undef __STDC_WANT_IEC_60559_TYPES_EXT__
#endif
/* Enable extensions specified by ISO/IEC TR 24731-2:2010. */
#ifndef __STDC_WANT_LIB_EXT2__
# undef __STDC_WANT_LIB_EXT2__
#endif
/* Enable extensions specified by ISO/IEC 24747:2009. */
#ifndef __STDC_WANT_MATH_SPEC_FUNCS__
# undef __STDC_WANT_MATH_SPEC_FUNCS__
#endif
/* Enable extensions on HP NonStop. */
#ifndef _TANDEM_SOURCE
# undef _TANDEM_SOURCE
#endif
/* Enable X/Open extensions. Define to 500 only if necessary
to make mbstate_t available. */
#ifndef _XOPEN_SOURCE
# undef _XOPEN_SOURCE
#endif
/* Define to 1 if running on Darwin. */
#undef _DARWIN_UNLIMITED_SELECT
/* Enable large inode numbers on Mac OS X 10.5. */
#ifndef _DARWIN_USE_64_BIT_INODE
# define _DARWIN_USE_64_BIT_INODE 1
#endif
/* Number of bits in a file offset, on hosts where this is settable. */
#undef _FILE_OFFSET_BITS
@ -1459,16 +1524,6 @@
/* Define for large files, on AIX-style hosts. */
#undef _LARGE_FILES
/* Define to 1 if on MINIX. */
#undef _MINIX
/* Define to 2 if the system does not provide POSIX.1 features except with
this defined. */
#undef _POSIX_1_SOURCE
/* Define to 1 if you need to in order for `stat' and other things to work. */
#undef _POSIX_SOURCE
/* Define to empty if `const' does not conform to ANSI C. */
#undef const
@ -1490,7 +1545,7 @@
/* Define to `long int' if <sys/types.h> does not define. */
#undef off_t
/* Define to `int' if <sys/types.h> does not define. */
/* Define as a signed integer type capable of holding a process identifier. */
#undef pid_t
/* Define to `unsigned int' if <sys/types.h> does not define. */

View File

@ -225,6 +225,8 @@ enum ast_cdr_settings {
CDR_INITIATED_SECONDS = 1 << 5, /*!< Include microseconds into the billing time */
CDR_DEBUG = 1 << 6, /*!< Enables extra debug statements */
CDR_CHANNEL_DEFAULT_ENABLED = 1 << 7, /*!< Whether CDR is enabled for each channel by default */
CDR_IGNORE_STATE_CHANGES = 1 << 8, /*!< Whether to ignore bridge and other call state change events */
CDR_IGNORE_DIAL_CHANGES = 1 << 9, /*!< Whether to ignore dial state changes */
};
/*! \brief CDR Batch Mode settings */

View File

@ -4112,8 +4112,6 @@ struct ast_channel_monitor {
};
/* ACCESSOR FUNCTIONS */
/*! \brief Set the channel name */
void ast_channel_name_set(struct ast_channel *chan, const char *name);
#define DECLARE_STRINGFIELD_SETTERS_FOR(field) \
void ast_channel_##field##_set(struct ast_channel *chan, const char *field); \

View File

@ -30,20 +30,22 @@ extern "C" {
#include "asterisk/optional_api.h"
#include "asterisk/logger.h"
#ifdef HAVE_CRYPTO
#include "openssl/aes.h"
typedef AES_KEY ast_aes_encrypt_key;
typedef AES_KEY ast_aes_decrypt_key;
#else /* !HAVE_CRYPTO */
typedef char ast_aes_encrypt_key;
typedef char ast_aes_decrypt_key;
#endif /* HAVE_CRYPTO */
/* We previously used the key length explicitly; replace with constant.
* For now, Asterisk is limited to 1024 bit (128 byte) RSA keys.
*/
#define AST_CRYPTO_RSA_KEY_BITS 1024
#define AST_CRYPTO_AES_BLOCKSIZE 128
struct aes_key {
unsigned char raw[AST_CRYPTO_AES_BLOCKSIZE / 8];
};
typedef struct aes_key ast_aes_encrypt_key;
typedef struct aes_key ast_aes_decrypt_key;
#define AST_KEY_PUBLIC (1 << 0)
#define AST_KEY_PRIVATE (1 << 1)
struct ast_key;
/*!
* \brief Retrieve a key
* \param kname Name of the key we are retrieving
@ -163,23 +165,29 @@ AST_OPTIONAL_API(int, ast_aes_set_decrypt_key,
* \param in data to be encrypted
* \param out pointer to a buffer to hold the encrypted output
* \param ctx address of an aes encryption context filled in with ast_aes_set_encrypt_key
* \retval <= 0 failure
* \retval otherwise number of bytes in output buffer
*/
AST_OPTIONAL_API(void, ast_aes_encrypt,
(const unsigned char *in, unsigned char *out, const ast_aes_encrypt_key *ctx),
{ ast_log(LOG_WARNING, "AES encryption disabled. Install OpenSSL.\n");return; });
AST_OPTIONAL_API(int, ast_aes_encrypt,
(const unsigned char *in, unsigned char *out, const ast_aes_encrypt_key *key),
{ ast_log(LOG_WARNING, "AES encryption disabled. Install OpenSSL.\n");return -1; });
/*!
* \brief AES decrypt data
* \param in encrypted data
* \param out pointer to a buffer to hold the decrypted output
* \param ctx address of an aes encryption context filled in with ast_aes_set_decrypt_key
* \retval <= 0 failure
* \retval otherwise number of bytes in output buffer
*/
AST_OPTIONAL_API(void, ast_aes_decrypt,
(const unsigned char *in, unsigned char *out, const ast_aes_decrypt_key *ctx),
{ ast_log(LOG_WARNING, "AES encryption disabled. Install OpenSSL.\n");return; });
AST_OPTIONAL_API(int, ast_aes_decrypt,
(const unsigned char *in, unsigned char *out, const ast_aes_decrypt_key *key),
{ ast_log(LOG_WARNING, "AES encryption disabled. Install OpenSSL.\n");return -1; });
AST_OPTIONAL_API(int, ast_crypto_loaded, (void), { return 0; });
AST_OPTIONAL_API(int, ast_crypto_reload, (void), { return 0; });
#if defined(__cplusplus) || defined(c_plusplus)
}
#endif

View File

@ -72,6 +72,8 @@ struct ast_features_xfer_config {
AST_STRING_FIELD(transferretrysound);
/*! Sound played when an invalid extension is dialed, and the transferer is being returned to the call. */
AST_STRING_FIELD(transferinvalidsound);
/*! Sound to play to announce the transfer process has started. */
AST_STRING_FIELD_EXTENDED(transferannouncesound);
);
/*! Seconds allowed between digit presses when dialing transfer destination */
unsigned int transferdigittimeout;

View File

@ -350,6 +350,18 @@ void astman_send_list_complete_start(struct mansession *s, const struct message
*/
void astman_send_list_complete_end(struct mansession *s);
/*!
* \brief Enable/disable the inclusion of 'dangerous' configurations outside
* of the ast_config_AST_CONFIG_DIR
*
* This function can globally enable/disable the loading of configuration files
* outside of ast_config_AST_CONFIG_DIR.
*
* \param new_live_dangerously If true, enable the access of files outside
* ast_config_AST_CONFIG_DIR from astman.
*/
void astman_live_dangerously(int new_live_dangerously);
void __attribute__((format(printf, 2, 3))) astman_append(struct mansession *s, const char *fmt, ...);
/*! \brief Determine if a manager session ident is authenticated */

View File

@ -1432,7 +1432,7 @@ void pbx_substitute_variables_helper_full(struct ast_channel *c, struct varshead
/*!
* \brief Substitutes variables, similar to pbx_substitute_variables_helper_full, but allows passing the context, extension, and priority in.
*/
void pbx_substitute_variables_helper_full_location(struct ast_channel *c, struct varshead *headp, const char *cp1, char *cp2, int cp2_size, size_t *used, char *context, char *exten, int pri);
void pbx_substitute_variables_helper_full_location(struct ast_channel *c, struct varshead *headp, const char *cp1, char *cp2, int cp2_size, size_t *used, const char *context, const char *exten, int pri);
/*! @} */
/*! @name Substitution routines, using dynamic string buffers

View File

@ -29,8 +29,8 @@
enum ast_geoloc_pidf_element {
AST_PIDF_ELEMENT_NONE = 0,
AST_PIDF_ELEMENT_TUPLE,
AST_PIDF_ELEMENT_DEVICE,
AST_PIDF_ELEMENT_TUPLE,
AST_PIDF_ELEMENT_PERSON,
AST_PIDF_ELEMENT_LAST,
};
@ -43,13 +43,22 @@ enum ast_geoloc_format {
AST_GEOLOC_FORMAT_LAST,
};
enum ast_geoloc_action {
AST_GEOLOC_ACT_PREFER_INCOMING = 0,
AST_GEOLOC_ACT_PREFER_CONFIG,
AST_GEOLOC_ACT_DISCARD_INCOMING,
AST_GEOLOC_ACT_DISCARD_CONFIG,
enum ast_geoloc_precedence {
AST_GEOLOC_PRECED_PREFER_INCOMING = 0,
AST_GEOLOC_PRECED_PREFER_CONFIG,
AST_GEOLOC_PRECED_DISCARD_INCOMING,
AST_GEOLOC_PRECED_DISCARD_CONFIG,
};
#define CONFIG_STR_TO_ENUM_DECL(_stem) int ast_geoloc_ ## _stem ## _str_to_enum(const char *str);
CONFIG_STR_TO_ENUM_DECL(pidf_element)
CONFIG_STR_TO_ENUM_DECL(format);
CONFIG_STR_TO_ENUM_DECL(precedence);
#define GEOLOC_ENUM_TO_NAME_DECL(_stem) const char * ast_geoloc_ ## _stem ## _to_name(int ix);
GEOLOC_ENUM_TO_NAME_DECL(pidf_element)
GEOLOC_ENUM_TO_NAME_DECL(format);
GEOLOC_ENUM_TO_NAME_DECL(precedence);
struct ast_geoloc_location {
SORCERY_OBJECT(details);
AST_DECLARE_STRING_FIELDS(
@ -58,6 +67,7 @@ struct ast_geoloc_location {
);
enum ast_geoloc_format format;
struct ast_variable *location_info;
struct ast_variable *confidence;
};
struct ast_geoloc_profile {
@ -65,13 +75,19 @@ struct ast_geoloc_profile {
AST_DECLARE_STRING_FIELDS(
AST_STRING_FIELD(location_reference);
AST_STRING_FIELD(notes);
AST_STRING_FIELD(method);
AST_STRING_FIELD(location_source);
);
enum ast_geoloc_pidf_element pidf_element;
enum ast_geoloc_action action;
int geolocation_routing;
enum ast_geoloc_precedence precedence;
int allow_routing_use;
struct ast_variable *location_refinement;
struct ast_variable *location_variables;
struct ast_variable *usage_rules;
int suppress_empty_ca_elements;
enum ast_geoloc_format format;
struct ast_variable *location_info;
struct ast_variable *confidence;
};
struct ast_geoloc_eprofile {
@ -83,14 +99,16 @@ struct ast_geoloc_eprofile {
AST_STRING_FIELD(notes);
);
enum ast_geoloc_pidf_element pidf_element;
enum ast_geoloc_action action;
int geolocation_routing;
enum ast_geoloc_precedence precedence;
int allow_routing_use;
enum ast_geoloc_format format;
struct ast_variable *location_info;
struct ast_variable *location_refinement;
struct ast_variable *location_variables;
struct ast_variable *effective_location;
struct ast_variable *usage_rules;
struct ast_variable *confidence;
int suppress_empty_ca_elements;
};
/*!
@ -299,6 +317,15 @@ struct ast_datastore *ast_geoloc_datastore_find(struct ast_channel *chan);
*/
struct ast_geoloc_eprofile *ast_geoloc_eprofile_alloc(const char *name);
/*!
* \brief Duplicate an effective profile.
*
* \param src The eprofile to duplicate.
*
* \return The duplicated effective profile ao2 object.
*/
struct ast_geoloc_eprofile *ast_geoloc_eprofile_dup(struct ast_geoloc_eprofile *src);
/*!
* \brief Allocate a new effective profile from an existing profile.
*
@ -331,12 +358,45 @@ struct ast_geoloc_eprofile *ast_geoloc_eprofile_create_from_pidf(
struct ast_geoloc_eprofile *ast_geoloc_eprofile_create_from_uri(const char *uri,
const char *reference_string);
/*!
* \brief Convert a URI eprofile to a URI string
*
* \param eprofile Effective profile to convert
* \param chan Channel to use to resolve variables
* \param buf Pointer to ast_str pointer to use for work
* \param ref_string An identifying string to use in error messages.
*
* \return String representation of URI allocated from buf or NULL on failure
*/
const char *ast_geoloc_eprofile_to_uri(struct ast_geoloc_eprofile *eprofile,
struct ast_channel *chan, struct ast_str **buf, const char *ref_string);
/*!
* \brief Convert a datastore containing eprofiles to a PIDF-LO document
*
* \param ds Datastore containing effective profiles to convert
* \param chan Channel to use to resolve variables
* \param buf Pointer to ast_str pointer to use for work
* \param ref_string An identifying string to use in error messages.
*
* \return String representation PIDF-LO allocated from buf or NULL on failure.
*/
const char *ast_geoloc_eprofiles_to_pidf(struct ast_datastore *ds,
struct ast_channel *chan, struct ast_str **buf, const char * ref_string);
/*!
* \brief Convert a single eprofile to a PIDF-LO document
*
* \param eprofile Effective profile to convert
* \param chan Channel to use to resolve variables
* \param buf Pointer to ast_str pointer to use for work
* \param ref_string An identifying string to use in error messages.
*
* \return String representation PIDF-LO allocated from buf or NULL on failure.
*/
const char *ast_geoloc_eprofile_to_pidf(struct ast_geoloc_eprofile *eprofile,
struct ast_channel *chan, struct ast_str **buf, const char * ref_string);
/*!
* \brief Refresh the effective profile with any changed info.
*

View File

@ -51,6 +51,11 @@
#include "asterisk/stasis_endpoints.h"
#include "asterisk/stream.h"
#ifdef HAVE_PJSIP_TLS_TRANSPORT_RESTART
/* Needed for knowing if the cert or priv key files changed */
#include <sys/stat.h>
#endif
#define PJSIP_MINVERSION(m,n,p) (((m << 24) | (n << 16) | (p << 8)) >= PJ_VERSION_NUM)
#ifndef PJSIP_EXPIRES_NOT_SPECIFIED
@ -82,6 +87,26 @@
#define AST_STIR_SHAKEN_RESPONSE_STR_UNSUPPORTED_CREDENTIAL "Unsupported Credential"
#define AST_STIR_SHAKEN_RESPONSE_STR_INVALID_IDENTITY_HEADER "Invalid Identity Header"
/* ":12345" */
#define COLON_PORT_STRLEN 6
/*
* "<ipaddr>:<port>"
* PJ_INET6_ADDRSTRLEN includes the NULL terminator
*/
#define IP6ADDR_COLON_PORT_BUFLEN (PJ_INET6_ADDRSTRLEN + COLON_PORT_STRLEN)
/*!
* \brief Fill a buffer with a pjsip transport's remote ip address and port
*
* \param transport The pjsip_transport to use
* \param dest The destination buffer of at least IP6ADDR_COLON_PORT_BUFLEN bytes
*/
#define AST_SIP_MAKE_REMOTE_IPADDR_PORT_STR(_transport, _dest) \
snprintf(_dest, IP6ADDR_COLON_PORT_BUFLEN, \
PJSTR_PRINTF_SPEC ":%d", \
PJSTR_PRINTF_VAR(_transport->remote_name.host), \
_transport->remote_name.port);
/* Forward declarations of PJSIP stuff */
struct pjsip_rx_data;
struct pjsip_module;
@ -100,6 +125,8 @@ struct pjsip_tpselector;
AST_VECTOR(ast_sip_service_route_vector, char *);
static const pj_str_t AST_PJ_STR_EMPTY = { "", 0 };
/*!
* \brief Structure for SIP transport information
*/
@ -184,6 +211,16 @@ struct ast_sip_transport_state {
* If true, fail if server certificate cannot verify (TLS only)
*/
int verify_server;
#ifdef HAVE_PJSIP_TLS_TRANSPORT_RESTART
/*!
* The stats information for the certificate file, if configured
*/
struct stat cert_file_stat;
/*!
* The stats information for the private key file, if configured
*/
struct stat privkey_file_stat;
#endif
};
#define ast_sip_transport_is_nonlocal(transport_state, addr) \
@ -302,6 +339,45 @@ struct ast_sip_nat_hook {
void (*outgoing_external_message)(struct pjsip_tx_data *tdata, struct ast_sip_transport *transport);
};
/*!
* \brief The kind of security negotiation
*/
enum ast_sip_security_negotiation {
/*! No security mechanism negotiation */
AST_SIP_SECURITY_NEG_NONE = 0,
/*! Use mediasec security mechanism negotiation */
AST_SIP_SECURITY_NEG_MEDIASEC,
/* Add RFC 3329 (sec-agree) mechanism negotiation in the future */
};
/*!
* \brief The security mechanism type
*/
enum ast_sip_security_mechanism_type {
AST_SIP_SECURITY_MECH_NONE = 0,
/* Use msrp-tls as security mechanism */
AST_SIP_SECURITY_MECH_MSRP_TLS,
/* Use sdes-srtp as security mechanism */
AST_SIP_SECURITY_MECH_SDES_SRTP,
/* Use dtls-srtp as security mechanism */
AST_SIP_SECURITY_MECH_DTLS_SRTP,
/* Add RFC 3329 (sec-agree) mechanisms like tle, digest, ipsec-ike in the future */
};
/*!
* \brief Structure representing a security mechanism as defined in RFC 3329
*/
struct ast_sip_security_mechanism {
/* Used to determine which security mechanism to use. */
enum ast_sip_security_mechanism_type type;
/* The preference of this security mechanism. The higher the value, the more preferred. */
float qvalue;
/* Optional mechanism parameters. */
struct ast_vector_string mechanism_parameters;
};
AST_VECTOR(ast_sip_security_mechanism_vector, struct ast_sip_security_mechanism *);
/*!
* \brief Contact associated with an address of record
*/
@ -373,6 +449,13 @@ struct ast_sip_contact_status {
);
/*! The round trip time in microseconds */
int64_t rtt;
/*!
* The security mechanism list of the contact (RFC 3329).
* Stores the values of Security-Server headers in 401/421/494 responses to an
* in-dialog request or successful outbound registration which will be used to
* set the Security-Verify headers of all subsequent requests to the contact.
*/
struct ast_sip_security_mechanism_vector security_mechanisms;
/*! Current status for a contact (default - unavailable) */
enum ast_sip_contact_status_type status;
/*! Last status for a contact (default - unavailable) */
@ -432,6 +515,20 @@ struct ast_sip_contact_wrapper {
struct ast_sip_contact *contact;
};
/*!
* \brief 100rel modes for SIP endpoints
*/
enum ast_sip_100rel_mode {
/*! Do not support 100rel. (no) */
AST_SIP_100REL_UNSUPPORTED = 0,
/*! As UAC, indicate 100rel support in Supported header. (yes) */
AST_SIP_100REL_SUPPORTED,
/*! As UAS, send 1xx responses reliably, if the UAC indicated its support. Otherwise same as AST_SIP_100REL_SUPPORTED. (peer_supported) */
AST_SIP_100REL_PEER_SUPPORTED,
/*! Require the use of 100rel. (required) */
AST_SIP_100REL_REQUIRED,
};
/*!
* \brief DTMF modes for SIP endpoints
*/
@ -956,6 +1053,10 @@ struct ast_sip_endpoint {
unsigned int suppress_q850_reason_headers;
/*! Ignore 183 if no SDP is present */
unsigned int ignore_183_without_sdp;
/*! Type of security negotiation to use (RFC 3329). */
enum ast_sip_security_negotiation security_negotiation;
/*! Client security mechanisms (RFC 3329). */
struct ast_sip_security_mechanism_vector security_mechanisms;
/*! Set which STIR/SHAKEN behaviors we want on this endpoint */
unsigned int stir_shaken;
/*! Should we authenticate OPTIONS requests per RFC 3261? */
@ -964,6 +1065,10 @@ struct ast_sip_endpoint {
AST_STRING_FIELD_EXTENDED(geoloc_incoming_call_profile);
/*! The name of the geoloc profile to apply when Asterisk sends a call to this endpoint */
AST_STRING_FIELD_EXTENDED(geoloc_outgoing_call_profile);
/*! 100rel mode to use with this endpoint */
enum ast_sip_100rel_mode rel100;
/*! Send Advice-of-Charge messages */
unsigned int send_aoc;
};
/*! URI parameter for symmetric transport */
@ -1004,6 +1109,87 @@ int ast_sip_are_media_types_equal(pjsip_media_type *a, pjsip_media_type *b);
*/
int ast_sip_is_media_type_in(pjsip_media_type *a, ...) attribute_sentinel;
/*!
* \brief Add security headers to transmission data
*
* \param security_mechanisms Vector of security mechanisms.
* \param header_name The header name under which to add the security mechanisms.
* One of Security-Client, Security-Server, Security-Verify.
* \param add_qval If zero, don't add the q-value to the header.
* \param tdata The transmission data.
* \retval 0 Success
* \retval non-zero Failure
*/
int ast_sip_add_security_headers(struct ast_sip_security_mechanism_vector *security_mechanisms,
const char *header_name, int add_qval, pjsip_tx_data *tdata);
/*!
* \brief Append to security mechanism vector from SIP header
*
* \param hdr The header of the security mechanisms.
* \param security_mechanisms Vector of security mechanisms to append to.
* Header name must be one of Security-Client, Security-Server, Security-Verify.
*/
void ast_sip_header_to_security_mechanism(const pjsip_generic_string_hdr *hdr,
struct ast_sip_security_mechanism_vector *security_mechanisms);
/*!
* \brief Initialize security mechanism vector from string of security mechanisms.
*
* \param security_mechanisms Pointer to vector of security mechanisms to initialize.
* \param value String of security mechanisms as defined in RFC 3329.
* \retval 0 Success
* \retval non-zero Failure
*/
int ast_sip_security_mechanism_vector_init(struct ast_sip_security_mechanism_vector *security_mechanism, const char *value);
/*!
* \brief Removes all headers of a specific name and value from a pjsip_msg.
*
* \param msg PJSIP message from which to remove headers.
* \param hdr_name Name of the header to remove.
* \param value Optional string value of the header to remove.
* If NULL, remove all headers of given hdr_name.
*/
void ast_sip_remove_headers_by_name_and_value(pjsip_msg *msg, const pj_str_t *hdr_name, const char* value);
/*!
* \brief Duplicate a security mechanism.
*
* \param dst Security mechanism to duplicate to.
* \param src Security mechanism to duplicate.
*/
void ast_sip_security_mechanisms_vector_copy(struct ast_sip_security_mechanism_vector *dst,
const struct ast_sip_security_mechanism_vector *src);
/*!
* \brief Free contents of a security mechanism vector.
*
* \param security_mechanisms Vector whose contents are to be freed
*/
void ast_sip_security_mechanisms_vector_destroy(struct ast_sip_security_mechanism_vector *security_mechanisms);
/*!
* \brief Allocate a security mechanism from a string.
*
* \param security_mechanism Pointer-pointer to the security mechanism to allocate.
* \param value The security mechanism string as defined in RFC 3329 (section 2.2)
* \param ... in the form <mechanism_name>;q=<q_value>;<mechanism_parameters>
* \retval 0 Success
* \retval non-zero Failure
*/
int ast_sip_str_to_security_mechanism(struct ast_sip_security_mechanism **security_mechanism, const char *value);
/*!
* \brief Set the security negotiation based on a given string.
*
* \param security_negotiation Security negotiation enum to set.
* \param val String that represents a security_negotiation value.
* \retval 0 Success
* \retval non-zero Failure
*/
int ast_sip_set_security_negotiation(enum ast_sip_security_negotiation *security_negotiation, const char *val);
/*!
* \brief Initialize an auth vector with the configured values.
*
@ -3581,6 +3767,7 @@ enum ast_transport_monitor_reg {
/*!
* \brief Register a reliable transport shutdown monitor callback.
* \deprecated Replaced with ast_sip_transport_monitor_register_key().
* \since 13.20.0
*
* \param transport Transport to monitor for shutdown.
@ -3598,8 +3785,29 @@ enum ast_transport_monitor_reg {
enum ast_transport_monitor_reg ast_sip_transport_monitor_register(pjsip_transport *transport,
ast_transport_monitor_shutdown_cb cb, void *ao2_data);
/*!
* \brief Register a reliable transport shutdown monitor callback.
*
* \param transport_key Key for the transport to monitor for shutdown.
* Create the key with AST_SIP_MAKE_REMOTE_IPADDR_PORT_STR.
* \param cb Who to call when transport is shutdown.
* \param ao2_data Data to pass with the callback.
*
* \note The data object passed will have its reference count automatically
* incremented by this call and automatically decremented after the callback
* runs or when the callback is unregistered.
*
* There is no checking for duplicate registrations.
*
* \return enum ast_transport_monitor_reg
*/
enum ast_transport_monitor_reg ast_sip_transport_monitor_register_key(
const char *transport_key, ast_transport_monitor_shutdown_cb cb,
void *ao2_data);
/*!
* \brief Register a reliable transport shutdown monitor callback replacing any duplicate.
* \deprecated Replaced with ast_sip_transport_monitor_register_replace_key().
* \since 13.26.0
* \since 16.3.0
*
@ -3621,8 +3829,32 @@ enum ast_transport_monitor_reg ast_sip_transport_monitor_register(pjsip_transpor
enum ast_transport_monitor_reg ast_sip_transport_monitor_register_replace(pjsip_transport *transport,
ast_transport_monitor_shutdown_cb cb, void *ao2_data, ast_transport_monitor_data_matcher matches);
/*!
* \brief Register a reliable transport shutdown monitor callback replacing any duplicate.
*
* \param transport_key Key for the transport to monitor for shutdown.
* Create the key with AST_SIP_MAKE_REMOTE_IPADDR_PORT_STR.
* \param cb Who to call when transport is shutdown.
* \param ao2_data Data to pass with the callback.
* \param matches Matcher function that returns true if data matches a previously
* registered data object
*
* \note The data object passed will have its reference count automatically
* incremented by this call and automatically decremented after the callback
* runs or when the callback is unregistered.
*
* This function checks for duplicates, and overwrites/replaces the old monitor
* with the given one.
*
* \return enum ast_transport_monitor_reg
*/
enum ast_transport_monitor_reg ast_sip_transport_monitor_register_replace_key(
const char *transport_key, ast_transport_monitor_shutdown_cb cb,
void *ao2_data, ast_transport_monitor_data_matcher matches);
/*!
* \brief Unregister a reliable transport shutdown monitor
* \deprecated Replaced with ast_sip_transport_monitor_unregister_key().
* \since 13.20.0
*
* \param transport Transport to monitor for shutdown.
@ -3638,6 +3870,23 @@ enum ast_transport_monitor_reg ast_sip_transport_monitor_register_replace(pjsip_
void ast_sip_transport_monitor_unregister(pjsip_transport *transport,
ast_transport_monitor_shutdown_cb cb, void *data, ast_transport_monitor_data_matcher matches);
/*!
* \brief Unregister a reliable transport shutdown monitor
*
* \param transport_key Key for the transport to monitor for shutdown.
* Create the key with AST_SIP_MAKE_REMOTE_IPADDR_PORT_STR.
* \param cb The callback that was used for the original register.
* \param data Data to pass to the matcher. May be NULL and does NOT need to be an ao2 object.
* If NULL, all monitors with the provided callback are unregistered.
* \param matches Matcher function that returns true if data matches the previously
* registered data object. If NULL, a simple pointer comparison is done.
*
* \note The data object passed into the original register will have its reference count
* automatically decremented.
*/
void ast_sip_transport_monitor_unregister_key(const char *transport_key,
ast_transport_monitor_shutdown_cb cb, void *data, ast_transport_monitor_data_matcher matches);
/*!
* \brief Unregister a transport shutdown monitor from all reliable transports
* \since 13.20.0
@ -3677,4 +3926,72 @@ void ast_sip_transport_state_register(struct ast_sip_tpmgr_state_callback *eleme
*/
void ast_sip_transport_state_unregister(struct ast_sip_tpmgr_state_callback *element);
/*!
* \brief Check whether a pjsip_uri is SIP/SIPS or not
* \since 16.28.0
*
* \param uri The pjsip_uri to check
*
* \retval 1 if true
* \retval 0 if false
*/
int ast_sip_is_uri_sip_sips(pjsip_uri *uri);
/*!
* \brief Check whether a pjsip_uri is allowed or not
* \since 16.28.0
*
* \param uri The pjsip_uri to check
*
* \retva; 1 if allowed
* \retval 0 if not allowed
*/
int ast_sip_is_allowed_uri(pjsip_uri *uri);
/*!
* \brief Get the user portion of the pjsip_uri
* \since 16.28.0
*
* \param uri The pjsip_uri to get the user from
*
* \note This function will check what kind of URI it receives and return
* the user based off of that
*
* \return User string or empty string if not present
*/
const pj_str_t *ast_sip_pjsip_uri_get_username(pjsip_uri *uri);
/*!
* \brief Get the host portion of the pjsip_uri
* \since 16.28.0
*
* \param uri The pjsip_uri to get the host from
*
* \note This function will check what kind of URI it receives and return
* the host based off of that
*
* \return Host string or empty string if not present
*/
const pj_str_t *ast_sip_pjsip_uri_get_hostname(pjsip_uri *uri);
/*!
* \brief Get the other_param portion of the pjsip_uri
* \since 16.28.0
*
* \param uri The pjsip_uri to get hte other_param from
*
* \note This function will check what kind of URI it receives and return
* the other_param based off of that
*
* \return other_param or NULL if not present
*/
struct pjsip_param *ast_sip_pjsip_uri_get_other_param(pjsip_uri *uri, const pj_str_t *param_str);
/*!
* \brief Retrieve the system setting 'all_codecs_on_empty_reinvite'.
*
* \retval non zero if we should return all codecs on empty re-INVITE
*/
unsigned int ast_sip_get_all_codecs_on_empty_reinvite(void);
#endif /* _RES_PJSIP_H */

View File

@ -33,6 +33,8 @@
/* Needed for pjmedia_sdp_session and pjsip_inv_session */
#include <pjsip_ua.h>
/* Needed for ast_sip_security_mechanism_vector */
#include "asterisk/res_pjsip.h"
/* Forward declarations */
struct ast_sip_endpoint;

View File

@ -1719,7 +1719,7 @@ void ast_rtp_codecs_payload_formats(struct ast_rtp_codecs *codecs, struct ast_fo
* Example usage:
*
* \code
* int payload = ast_rtp_codecs_payload_code(&codecs, 1, ast_format_set(&tmp_fmt, AST_FORMAT_ULAW, 0), 0);
* int payload = ast_rtp_codecs_payload_code(&codecs, 1, ast_format_ulaw, 0);
* \endcode
*
* This looks for the numerical payload for ULAW in the codecs structure.
@ -1788,7 +1788,7 @@ int ast_rtp_codecs_find_payload_code(struct ast_rtp_codecs *codecs, int payload)
* Example usage:
*
* \code
* const char *subtype = ast_rtp_lookup_mime_subtype2(1, ast_format_set(&tmp_fmt, AST_FORMAT_ULAW, 0), 0, 0);
* const char *subtype = ast_rtp_lookup_mime_subtype2(1, ast_format_ulaw, 0, 0);
* \endcode
*
* This looks up the mime subtype for the ULAW format.
@ -1816,8 +1816,8 @@ const char *ast_rtp_lookup_mime_subtype2(const int asterisk_format,
* char buf[256] = "";
* struct ast_format tmp_fmt;
* struct ast_format_cap *cap = ast_format_cap_alloc_nolock();
* ast_format_cap_append(cap, ast_format_set(&tmp_fmt, AST_FORMAT_ULAW, 0));
* ast_format_cap_append(cap, ast_format_set(&tmp_fmt, AST_FORMAT_GSM, 0));
* ast_format_cap_append(cap, ast_format_ulaw, 0);
* ast_format_cap_append(cap, ast_format_ulaw, 0);
* char *mime = ast_rtp_lookup_mime_multiple2(&buf, sizeof(buf), cap, 0, 1, 0);
* ast_format_cap_destroy(cap);
* \endcode
@ -2220,7 +2220,7 @@ char *ast_rtp_instance_get_quality(struct ast_rtp_instance *instance, enum ast_r
*
* \code
* struct ast_format tmp_fmt;
* ast_rtp_instance_set_read_format(instance, ast_format_set(&tmp_fmt, AST_FORMAT_ULAW, 0));
* ast_rtp_instance_set_read_format(instance, ast_format_ulaw);
* \endcode
*
* This requests that the RTP engine provide audio frames in the ULAW format.
@ -2242,7 +2242,7 @@ int ast_rtp_instance_set_read_format(struct ast_rtp_instance *instance, struct a
*
* \code
* struct ast_format tmp_fmt;
* ast_rtp_instance_set_write_format(instance, ast_format_set(&tmp_fmt, AST_FORMAT_ULAW, 0));
* ast_rtp_instance_set_write_format(instance, ast_format_ulaw);
* \endcode
*
* This tells the underlying RTP engine that audio frames will be provided to it in ULAW format.

View File

@ -265,6 +265,7 @@ enum ast_strsep_flags {
\param sep A single character delimiter.
\param flags Controls post-processing of the result.
AST_STRSEP_TRIM trims all leading and trailing whitespace from the result.
If the result containes only whitespace, it'll be passed through unchanged.
AST_STRSEP_STRIP does a trim then strips the outermost quotes. You may want
to trim again after the strip. Just OR both the TRIM and STRIP flags.
AST_STRSEP_UNESCAPE unescapes '\' sequences.
@ -1370,7 +1371,6 @@ static force_inline char *ast_str_to_upper(char *str)
* \return AO2 container for strings
* \retval NULL if allocation failed
*/
//struct ao2_container *ast_str_container_alloc_options(enum ao2_container_opts opts, int buckets);
struct ao2_container *ast_str_container_alloc_options(enum ao2_alloc_opts opts, int buckets);
/*!

View File

@ -208,6 +208,27 @@ enum ast_test_command {
*/
struct ast_test;
/*!
* \brief A capture of running an external process.
*
* This contains a buffer holding stdout, another containing stderr,
* the process id of the child, and its exit code.
*/
struct ast_test_capture {
/*! \brief buffer holding stdout */
char *outbuf;
/*! \brief length of buffer holding stdout */
size_t outlen;
/*! \brief buffer holding stderr */
char *errbuf;
/*! \brief length of buffer holding stderr */
size_t errlen;
/*! \brief process id of child */
pid_t pid;
/*! \brief exit code of child */
int exitcode;
};
/*!
* \brief Contains all the initialization information required to store a new test definition
*/
@ -417,5 +438,50 @@ int __ast_test_status_update(const char *file, const char *func, int line, struc
} \
})
/*!
* \brief Initialize the capture structure.
*
* \since 16.30.0, 18.16.0, 19.8.0, 20.1.0
*
* \param capture The structure describing the child process and its
* associated output.
*/
void ast_test_capture_init(struct ast_test_capture *capture);
/*!
* \brief Release the storage (buffers) associated with capturing
* the output of an external child process.
*
* \since 19.4.0
*
* \param capture The structure describing the child process and its
* associated output.
*/
void ast_test_capture_free(struct ast_test_capture *capture);
/*!
* \brief Run a child process and capture its output and exit code.
*
* \!since 19.4.0
*
* \param capture The structure describing the child process and its
* associated output.
*
* \param file The name of the file to execute (uses $PATH to locate).
*
* \param argv The NULL-terminated array of arguments to pass to the
* child process, starting with the command name itself.
*
* \param data The buffer of input to be sent to child process's stdin;
* optional and may be NULL.
*
* \param datalen The length of the buffer, if not NULL, otherwise zero.
*
* \retval 1 for success
* \retval other failure
*/
int ast_test_capture_command(struct ast_test_capture *capture, const char *file, char *const argv[], const char *data, unsigned datalen);
#endif /* TEST_FRAMEWORK */
#endif /* _AST_TEST_H */

View File

@ -1105,4 +1105,14 @@ int ast_thread_user_interface_set(int is_user_interface);
*/
int ast_thread_is_user_interface(void);
/*!
* \brief Test for the presence of an executable command in $PATH
*
* \param cmd Name of command to locate.
*
* \retval True (non-zero) if command is in $PATH.
* \retval False (zero) command not found.
*/
int ast_check_command_in_path(const char *cmd);
#endif /* _ASTERISK_UTILS_H */

View File

@ -163,6 +163,7 @@ void ast_xml_free_text(const char *text);
* \param attrname Attribute name.
* \retval NULL on error
* \return The attribute value on success.
* \note The result must be freed with ast_xml_free_attr().
*/
const char *ast_xml_get_attribute(struct ast_xml_node *node, const char *attrname);

View File

@ -167,6 +167,9 @@ lock.o: _ASTCFLAGS+=$(call get_menuselect_cflags,DETECT_DEADLOCKS)
options.o: _ASTCFLAGS+=$(call get_menuselect_cflags,REF_DEBUG)
sched.o: _ASTCFLAGS+=$(call get_menuselect_cflags,DEBUG_SCHEDULER DUMP_SCHEDULER)
tcptls.o: _ASTCFLAGS+=$(OPENSSL_INCLUDE) -Wno-deprecated-declarations
# since we're using open_memstream(), we need to release the buffer with
# the native free() function or we might get unexpected behavior.
test.o: _ASTCFLAGS+=-DASTMM_LIBC=ASTMM_IGNORE
uuid.o: _ASTCFLAGS+=$(UUID_INCLUDE)
stasis.o: _ASTCFLAGS+=$(call get_menuselect_cflags,AO2_DEBUG)
time.o: _ASTCFLAGS+=-D_XOPEN_SOURCE=700

View File

@ -4269,6 +4269,7 @@ static void asterisk_daemon(int isroot, const char *runuser, const char *rungrou
/* loads the cli_permissions.conf file needed to implement cli restrictions. */
ast_cli_perms_init(0);
ast_cli_channels_init(); /* Not always safe to access CLI commands until startup is complete. */
ast_stun_init();

View File

@ -109,6 +109,9 @@ int ast_audiohook_init(struct ast_audiohook *audiohook, enum ast_audiohook_type
audiohook->init_flags = init_flags;
/* Set direction to BOTH so that we feed frames in both directions */
audiohook->direction = AST_AUDIOHOOK_DIRECTION_BOTH;
/* initialize internal rate at 8khz, this will adjust if necessary */
audiohook_set_internal_rate(audiohook, DEFAULT_INTERNAL_SAMPLE_RATE, 0);
@ -144,6 +147,18 @@ int ast_audiohook_destroy(struct ast_audiohook *audiohook)
return 0;
}
int ast_audiohook_set_frame_feed_direction(struct ast_audiohook *audiohook, enum ast_audiohook_direction direction)
{
/* Only set the direction on new audiohooks */
if (audiohook->status != AST_AUDIOHOOK_STATUS_NEW) {
ast_debug(3, "Can not set direction on attached Audiohook %p\n", audiohook);
return -1;
}
audiohook->direction = direction;
return 0;
}
#define SHOULD_MUTE(hook, dir) \
((ast_test_flag(hook, AST_AUDIOHOOK_MUTE_READ) && (dir == AST_AUDIOHOOK_DIRECTION_READ)) || \
(ast_test_flag(hook, AST_AUDIOHOOK_MUTE_WRITE) && (dir == AST_AUDIOHOOK_DIRECTION_WRITE)) || \
@ -159,6 +174,13 @@ int ast_audiohook_write_frame(struct ast_audiohook *audiohook, enum ast_audiohoo
int other_factory_samples;
int other_factory_ms;
/* Don't feed the frame if we are set to read and this is a write frame or if set to
write and this is a read frame as we don't want it. Plus, it can cause mis-resampling
if the READ and WRITE frames have different bitrates */
if (audiohook->direction != AST_AUDIOHOOK_DIRECTION_BOTH && audiohook->direction != direction) {
return 0;
}
/* Update last feeding time to be current */
*rwtime = ast_tvnow();

View File

@ -1397,6 +1397,27 @@ static const char *get_transfer_context(struct ast_channel *transferer, const ch
return "default";
}
/*!
* \internal
* \brief Determine the transfer extension to use.
*
* \param transferer Channel initiating the transfer.
* \param extension User supplied extension if available. May be NULL.
*
* \return The extension to use for the transfer.
*/
static const char *get_transfer_exten(struct ast_channel *transferer, const char *exten)
{
if (!ast_strlen_zero(exten)) {
return exten;
}
exten = pbx_builtin_getvar_helper(transferer, "TRANSFER_EXTEN");
if (!ast_strlen_zero(exten)) {
return exten;
}
return ""; /* empty default, to get transfer extension from user now */
}
/*!
* \brief Allocate and initialize attended transfer properties
*
@ -3162,10 +3183,25 @@ static int grab_transfer(struct ast_channel *chan, char *exten, size_t exten_len
int attempts = 0;
int max_attempts;
struct ast_features_xfer_config *xfer_cfg;
char *retry_sound;
char *invalid_sound;
char *announce_sound, *retry_sound, *invalid_sound;
const char *extenoverride;
ast_channel_lock(chan);
extenoverride = get_transfer_exten(chan, NULL);
if (!ast_strlen_zero(extenoverride)) {
int extenres = ast_exists_extension(chan, context, extenoverride, 1,
S_COR(ast_channel_caller(chan)->id.number.valid, ast_channel_caller(chan)->id.number.str, NULL)) ? 1 : 0;
if (extenres) {
ast_copy_string(exten, extenoverride, exten_len);
ast_channel_unlock(chan);
ast_verb(3, "Transfering call to '%s@%s'", exten, context);
return 0;
}
ast_log(LOG_WARNING, "Override extension '%s' does not exist in context '%s'\n", extenoverride, context);
/* since we didn't get a valid extension from the channel, fall back and grab it from the user as usual now */
}
xfer_cfg = ast_get_chan_features_xfer_config(chan);
if (!xfer_cfg) {
ast_log(LOG_ERROR, "Channel %s: Unable to get transfer configuration\n",
@ -3175,21 +3211,24 @@ static int grab_transfer(struct ast_channel *chan, char *exten, size_t exten_len
}
digit_timeout = xfer_cfg->transferdigittimeout * 1000;
max_attempts = xfer_cfg->transferdialattempts;
announce_sound = ast_strdupa(xfer_cfg->transferannouncesound);
retry_sound = ast_strdupa(xfer_cfg->transferretrysound);
invalid_sound = ast_strdupa(xfer_cfg->transferinvalidsound);
ao2_ref(xfer_cfg, -1);
ast_channel_unlock(chan);
/* Play the simple "transfer" prompt out and wait */
res = ast_stream_and_wait(chan, "pbx-transfer", AST_DIGIT_ANY);
ast_stopstream(chan);
if (res < 0) {
/* Hangup or error */
return -1;
}
if (res) {
/* Store the DTMF digit that interrupted playback of the file. */
exten[0] = res;
if (!ast_strlen_zero(announce_sound)) {
res = ast_stream_and_wait(chan, announce_sound, AST_DIGIT_ANY);
ast_stopstream(chan);
if (res < 0) {
/* Hangup or error */
return -1;
}
if (res) {
/* Store the DTMF digit that interrupted playback of the file. */
exten[0] = res;
}
}
/* Drop to dialtone so they can enter the extension they want to transfer to */

View File

@ -111,6 +111,29 @@
to undisable (enable) CDR for a call.</para>
</description>
</configOption>
<configOption name="ignorestatechanges" default="no">
<synopsis>Whether CDR is updated or forked by bridging changes.</synopsis>
<description><para>Define whether or not CDR should be updated by bridging changes.
This includes entering and leaving bridges and call parking.</para>
<para>If this is set to "no", bridging changes will be ignored for all CDRs.
This should only be done if these events should not affect CDRs and are undesired,
such as to use a single CDR for the lifetime of the channel.</para>
<para>This setting cannot be changed on a reload.</para>
</description>
</configOption>
<configOption name="ignoredialchanges" default="no">
<synopsis>Whether CDR is updated or forked by dial updates.</synopsis>
<description><para>Define whether or not CDR should be updated by dial updates.</para>
<para>If this is set to "no", a single CDR will be used for the channel, even if
multiple endpoints or destinations are dialed sequentially. Note that you will also
lose detailed nonanswer dial dispositions if this option is enabled, which may not be acceptable,
e.g. instead of detailed no-answer dispositions like BUSY and CONGESTION, the disposition
will always be NO ANSWER if the channel was unanswered (it will still be ANSWERED
if the channel was answered).</para>
<para>This option should be enabled if a single CDR is desired for the lifetime of
the channel.</para>
</description>
</configOption>
<configOption name="unanswered">
<synopsis>Log calls that are never answered and don't set an outgoing party.</synopsis>
<description><para>
@ -208,6 +231,8 @@
#define DEFAULT_END_BEFORE_H_EXTEN "1"
#define DEFAULT_INITIATED_SECONDS "0"
#define DEFAULT_CHANNEL_ENABLED "1"
#define DEFAULT_IGNORE_STATE_CHANGES "0"
#define DEFAULT_IGNORE_DIAL_CHANGES "0"
#define DEFAULT_BATCH_SIZE "100"
#define MAX_BATCH_SIZE 1000
@ -222,6 +247,7 @@
} while (0)
static int cdr_debug_enabled;
static int dial_changes_ignored;
#define CDR_DEBUG(fmt, ...) \
do { \
@ -2170,6 +2196,10 @@ static void handle_dial_message(void *data, struct stasis_subscription *sub, str
if (!it_cdr->fn_table->process_dial_begin) {
continue;
}
if (dial_changes_ignored) {
CDR_DEBUG("%p - Ignoring Dial Begin message\n", it_cdr);
continue;
}
CDR_DEBUG("%p - Processing Dial Begin message for channel %s, peer %s\n",
it_cdr,
caller ? caller->base->name : "(none)",
@ -2181,6 +2211,12 @@ static void handle_dial_message(void *data, struct stasis_subscription *sub, str
if (!it_cdr->fn_table->process_dial_end) {
continue;
}
if (dial_changes_ignored) {
/* Set the disposition, and do nothing else. */
it_cdr->disposition = dial_status_to_disposition(dial_status);
CDR_DEBUG("%p - Setting disposition and that's it (%s)\n", it_cdr, dial_status);
continue;
}
CDR_DEBUG("%p - Processing Dial End message for channel %s, peer %s\n",
it_cdr,
caller ? caller->base->name : "(none)",
@ -2192,15 +2228,19 @@ static void handle_dial_message(void *data, struct stasis_subscription *sub, str
}
}
/* If no CDR handled a dial begin message, make a new one */
if (res && ast_strlen_zero(dial_status)) {
struct cdr_object *new_cdr;
/* If we're ignoring dial changes, don't allow multiple CDRs for this channel. */
if (!dial_changes_ignored) {
/* If no CDR handled a dial begin message, make a new one */
if (res && ast_strlen_zero(dial_status)) {
struct cdr_object *new_cdr;
new_cdr = cdr_object_create_and_append(cdr, stasis_message_timestamp(message));
if (new_cdr) {
new_cdr->fn_table->process_dial_begin(new_cdr, caller, peer);
new_cdr = cdr_object_create_and_append(cdr, stasis_message_timestamp(message));
if (new_cdr) {
new_cdr->fn_table->process_dial_begin(new_cdr, caller, peer);
}
}
}
ao2_unlock(cdr);
ao2_cleanup(cdr);
}
@ -4200,6 +4240,8 @@ static char *handle_cli_status(struct ast_cli_entry *e, int cmd, struct ast_cli_
ast_cli(a->fd, " Log calls by default: %s\n", ast_test_flag(&mod_cfg->general->settings, CDR_CHANNEL_DEFAULT_ENABLED) ? "Yes" : "No");
ast_cli(a->fd, " Log unanswered calls: %s\n", ast_test_flag(&mod_cfg->general->settings, CDR_UNANSWERED) ? "Yes" : "No");
ast_cli(a->fd, " Log congestion: %s\n\n", ast_test_flag(&mod_cfg->general->settings, CDR_CONGESTION) ? "Yes" : "No");
ast_cli(a->fd, " Ignore bridging changes: %s\n\n", ast_test_flag(&mod_cfg->general->settings, CDR_IGNORE_STATE_CHANGES) ? "Yes" : "No");
ast_cli(a->fd, " Ignore dial state changes: %s\n\n", ast_test_flag(&mod_cfg->general->settings, CDR_IGNORE_DIAL_CHANGES) ? "Yes" : "No");
if (ast_test_flag(&mod_cfg->general->settings, CDR_BATCHMODE)) {
ast_cli(a->fd, "* Batch Mode Settings\n");
ast_cli(a->fd, " -------------------\n");
@ -4379,6 +4421,8 @@ static int process_config(int reload)
aco_option_register(&cfg_info, "size", ACO_EXACT, general_options, DEFAULT_BATCH_SIZE, OPT_UINT_T, PARSE_IN_RANGE, FLDSET(struct ast_cdr_config, batch_settings.size), 0, MAX_BATCH_SIZE);
aco_option_register(&cfg_info, "time", ACO_EXACT, general_options, DEFAULT_BATCH_TIME, OPT_UINT_T, PARSE_IN_RANGE, FLDSET(struct ast_cdr_config, batch_settings.time), 1, MAX_BATCH_TIME);
aco_option_register(&cfg_info, "channeldefaultenabled", ACO_EXACT, general_options, DEFAULT_CHANNEL_ENABLED, OPT_BOOLFLAG_T, 1, FLDSET(struct ast_cdr_config, settings), CDR_CHANNEL_DEFAULT_ENABLED);
aco_option_register(&cfg_info, "ignorestatechanges", ACO_EXACT, general_options, DEFAULT_IGNORE_STATE_CHANGES, OPT_BOOLFLAG_T, 1, FLDSET(struct ast_cdr_config, settings), CDR_IGNORE_STATE_CHANGES);
aco_option_register(&cfg_info, "ignoredialchanges", ACO_EXACT, general_options, DEFAULT_IGNORE_DIAL_CHANGES, OPT_BOOLFLAG_T, 1, FLDSET(struct ast_cdr_config, settings), CDR_IGNORE_DIAL_CHANGES);
}
if (aco_process_config(&cfg_info, reload) == ACO_PROCESS_ERROR) {
@ -4541,6 +4585,7 @@ static int unload_module(void)
static int load_module(void)
{
struct module_config *mod_cfg = NULL;
if (process_config(0)) {
return AST_MODULE_LOAD_FAILURE;
}
@ -4561,13 +4606,36 @@ static int load_module(void)
return AST_MODULE_LOAD_FAILURE;
}
mod_cfg = ao2_global_obj_ref(module_configs);
stasis_message_router_add(stasis_router, ast_channel_snapshot_type(), handle_channel_snapshot_update_message, NULL);
/* Always process dial messages, because even if we ignore most of it, we do want the dial status for the disposition. */
stasis_message_router_add(stasis_router, ast_channel_dial_type(), handle_dial_message, NULL);
stasis_message_router_add(stasis_router, ast_channel_entered_bridge_type(), handle_bridge_enter_message, NULL);
stasis_message_router_add(stasis_router, ast_channel_left_bridge_type(), handle_bridge_leave_message, NULL);
stasis_message_router_add(stasis_router, ast_parked_call_type(), handle_parked_call_message, NULL);
if (!mod_cfg || !ast_test_flag(&mod_cfg->general->settings, CDR_IGNORE_DIAL_CHANGES)) {
dial_changes_ignored = 0;
} else {
dial_changes_ignored = 1;
CDR_DEBUG("Dial messages will be mostly ignored\n");
}
/* If explicitly instructed to ignore call state changes, then ignore bridging events, parking, etc. */
if (!mod_cfg || !ast_test_flag(&mod_cfg->general->settings, CDR_IGNORE_STATE_CHANGES)) {
stasis_message_router_add(stasis_router, ast_channel_entered_bridge_type(), handle_bridge_enter_message, NULL);
stasis_message_router_add(stasis_router, ast_channel_left_bridge_type(), handle_bridge_leave_message, NULL);
stasis_message_router_add(stasis_router, ast_parked_call_type(), handle_parked_call_message, NULL);
} else {
CDR_DEBUG("All bridge and parking messages will be ignored\n");
}
stasis_message_router_add(stasis_router, cdr_sync_message_type(), handle_cdr_sync_message, NULL);
if (mod_cfg) {
ao2_cleanup(mod_cfg);
} else {
ast_log(LOG_WARNING, "Unable to obtain CDR configuration during module load?\n");
}
active_cdrs_master = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,
AST_NUM_CHANNEL_BUCKETS, cdr_master_hash_fn, NULL, cdr_master_cmp_fn);
if (!active_cdrs_master) {

View File

@ -11163,15 +11163,6 @@ int ast_channel_request_stream_topology_change(struct ast_channel *chan,
return -1;
}
if (ast_stream_topology_equal(ast_channel_get_stream_topology(chan), topology)) {
ast_debug(2, "%s: Topologies already match. Current: %s Requested: %s\n",
ast_channel_name(chan),
ast_str_tmp(256, ast_stream_topology_to_str(ast_channel_get_stream_topology(chan), &STR_TMP)),
ast_str_tmp(256, ast_stream_topology_to_str(topology, &STR_TMP)));
ast_channel_unlock(chan);
return 0;
}
ast_channel_internal_set_stream_topology_change_source(chan, change_source);
res = ast_channel_tech(chan)->indicate(chan, AST_CONTROL_STREAM_TOPOLOGY_REQUEST_CHANGE, topology, sizeof(topology));

View File

@ -1283,7 +1283,8 @@ struct ast_flags *ast_channel_flags(struct ast_channel *chan)
return &chan->flags;
}
static int collect_names_cb(void *obj, void *arg, int flags) {
static int collect_names_cb(void *obj, void *arg, int flags)
{
struct ast_control_pvt_cause_code *cause_code = obj;
struct ast_str **str = arg;

View File

@ -2016,50 +2016,27 @@ static char *handle_help(struct ast_cli_entry *e, int cmd, struct ast_cli_args *
static struct ast_cli_entry cli_cli[] = {
AST_CLI_DEFINE(handle_commandmatchesarray, "Returns command matches array"),
AST_CLI_DEFINE(handle_nodebugchan_deprecated, "Disable debugging on channel(s)"),
AST_CLI_DEFINE(handle_chanlist, "Display information on channels"),
AST_CLI_DEFINE(handle_showcalls, "Display information on calls"),
AST_CLI_DEFINE(handle_showchan, "Display information on a specific channel"),
AST_CLI_DEFINE(handle_core_set_debug_channel, "Enable/disable debugging on a channel"),
AST_CLI_DEFINE(handle_debug_category, "Enable/disable debugging categories"),
AST_CLI_DEFINE(handle_debug, "Set level of debug chattiness"),
AST_CLI_DEFINE(handle_trace, "Set level of trace chattiness"),
AST_CLI_DEFINE(handle_verbose, "Set level of verbose chattiness"),
AST_CLI_DEFINE(group_show_channels, "Display active channels with group(s)"),
AST_CLI_DEFINE(handle_help, "Display help list, or specific help on a command"),
AST_CLI_DEFINE(handle_logger_mute, "Toggle logging output to a console"),
AST_CLI_DEFINE(handle_modlist, "List modules and info"),
AST_CLI_DEFINE(handle_load, "Load a module by name"),
AST_CLI_DEFINE(handle_reload, "Reload configuration for a module"),
AST_CLI_DEFINE(handle_core_reload, "Global reload"),
AST_CLI_DEFINE(handle_unload, "Unload a module by name"),
AST_CLI_DEFINE(handle_refresh, "Completely unloads and loads a module by name"),
AST_CLI_DEFINE(handle_showuptime, "Show uptime information"),
AST_CLI_DEFINE(handle_softhangup, "Request a hangup on a given channel"),
AST_CLI_DEFINE(handle_cli_reload_permissions, "Reload CLI permissions config"),
AST_CLI_DEFINE(handle_cli_show_permissions, "Show CLI permissions"),
AST_CLI_DEFINE(handle_cli_check_permissions, "Try a permissions config for a user"),
AST_CLI_DEFINE(handle_cli_wait_fullybooted, "Wait for Asterisk to be fully booted"),
#ifdef HAVE_MALLOC_TRIM
@ -2068,6 +2045,16 @@ static struct ast_cli_entry cli_cli[] = {
};
static struct ast_cli_entry cli_channels_cli[] = {
AST_CLI_DEFINE(handle_nodebugchan_deprecated, "Disable debugging on channel(s)"),
AST_CLI_DEFINE(handle_chanlist, "Display information on channels"),
AST_CLI_DEFINE(handle_showcalls, "Display information on calls"),
AST_CLI_DEFINE(handle_showchan, "Display information on a specific channel"),
AST_CLI_DEFINE(handle_core_set_debug_channel, "Enable/disable debugging on a channel"),
AST_CLI_DEFINE(group_show_channels, "Display active channels with group(s)"),
AST_CLI_DEFINE(handle_softhangup, "Request a hangup on a given channel"),
};
/*!
* Some regexp characters in cli arguments are reserved and used as separators.
*/
@ -2239,6 +2226,11 @@ static void cli_shutdown(void)
ast_cli_unregister_multiple(cli_cli, ARRAY_LEN(cli_cli));
}
static void cli_channels_shutdown(void)
{
ast_cli_unregister_multiple(cli_channels_cli, ARRAY_LEN(cli_channels_cli));
}
/*! \brief initialize the _full_cmd string in * each of the builtins. */
void ast_builtins_init(void)
{
@ -2247,6 +2239,12 @@ void ast_builtins_init(void)
ast_register_cleanup(cli_shutdown);
}
void ast_cli_channels_init(void)
{
ast_cli_register_multiple(cli_channels_cli, ARRAY_LEN(cli_channels_cli));
ast_register_cleanup(cli_channels_shutdown);
}
/*!
* match a word in the CLI entry.
* returns -1 on mismatch, 0 on match of an optional word,

View File

@ -646,15 +646,16 @@ struct ast_variable *ast_variable_list_sort(struct ast_variable *start)
struct ast_variable *ast_variable_list_append_hint(struct ast_variable **head, struct ast_variable *search_hint, struct ast_variable *newvar)
{
struct ast_variable *curr;
struct ast_variable *sh = search_hint;
ast_assert(head != NULL);
if (!*head) {
*head = newvar;
} else {
if (search_hint == NULL) {
search_hint = *head;
if (sh == NULL) {
sh = *head;
}
for (curr = search_hint; curr->next; curr = curr->next);
for (curr = sh; curr->next; curr = curr->next);
curr->next = newvar;
}
@ -752,12 +753,8 @@ struct ast_variable *ast_variable_list_from_quoted_string(const char *input, con
}
item_value = ast_strsep_quoted(&item, nv_sep, quote, AST_STRSEP_ALL);
if (!item_value) {
ast_variables_destroy(new_list);
return NULL;
}
new_var = ast_variable_new(item_name, item_value, "");
new_var = ast_variable_new(item_name, item_value ?: "", "");
if (!new_var) {
ast_variables_destroy(new_list);
return NULL;

View File

@ -1099,7 +1099,9 @@ static int xmldoc_update_config_type(const char *module, const char *name, const
}
if (!(results = ast_xmldoc_query("/docs/configInfo[@name='%s']/configFile/configObject[@name='%s']", module, name))) {
ast_log(LOG_WARNING, "Cannot update type '%s' in module '%s' because it has no existing documentation!\n", name, module);
ast_log(LOG_WARNING, "Cannot update type '%s' in module '%s' because it has no existing documentation!"
" If this module was recently built, run 'xmldoc reload' to refresh documentation, then load the module again\n",
name, module);
return XMLDOC_STRICT ? -1 : 0;
}

View File

@ -65,6 +65,18 @@
<description>
</description>
</manager>
<manager name="DBGetTree" language="en_US">
<synopsis>
Get DB entries, optionally at a particular family/key
</synopsis>
<syntax>
<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
<parameter name="Family" required="false" />
<parameter name="Key" required="false" />
</syntax>
<description>
</description>
</manager>
<manager name="DBPut" language="en_US">
<synopsis>
Put DB entry.
@ -979,6 +991,72 @@ static int manager_dbget(struct mansession *s, const struct message *m)
return 0;
}
static int manager_db_tree_get(struct mansession *s, const struct message *m)
{
char prefix[MAX_DB_FIELD];
char idText[256];
const char *id = astman_get_header(m,"ActionID");
const char *family = astman_get_header(m, "Family");
const char *key = astman_get_header(m, "Key");
sqlite3_stmt *stmt = gettree_stmt;
int count = 0;
if (!ast_strlen_zero(family) && !ast_strlen_zero(key)) {
/* Family and key tree */
snprintf(prefix, sizeof(prefix), "/%s/%s", family, key);
} else if (!ast_strlen_zero(family)) {
/* Family only */
snprintf(prefix, sizeof(prefix), "/%s", family);
} else {
/* Neither */
prefix[0] = '\0';
stmt = gettree_all_stmt;
}
idText[0] = '\0';
if (!ast_strlen_zero(id)) {
snprintf(idText, sizeof(idText) ,"ActionID: %s\r\n", id);
}
ast_mutex_lock(&dblock);
if (!ast_strlen_zero(prefix) && (sqlite3_bind_text(stmt, 1, prefix, -1, SQLITE_STATIC) != SQLITE_OK)) {
ast_log(LOG_WARNING, "Couldn't bind %s to stmt: %s\n", prefix, sqlite3_errmsg(astdb));
sqlite3_reset(stmt);
ast_mutex_unlock(&dblock);
astman_send_error(s, m, "Unable to search database");
return 0;
}
astman_send_listack(s, m, "Result will follow", "start");
while (sqlite3_step(stmt) == SQLITE_ROW) {
const char *key_s, *value_s;
if (!(key_s = (const char *) sqlite3_column_text(stmt, 0))) {
ast_log(LOG_WARNING, "Skipping invalid key!\n");
continue;
}
if (!(value_s = (const char *) sqlite3_column_text(stmt, 1))) {
ast_log(LOG_WARNING, "Skipping invalid value!\n");
continue;
}
astman_append(s, "Event: DBGetTreeResponse\r\n"
"Key: %s\r\n"
"Val: %s\r\n"
"%s"
"\r\n",
key_s, value_s, idText);
count++;
}
sqlite3_reset(stmt);
ast_mutex_unlock(&dblock);
astman_send_list_complete_start(s, m, "DBGetTreeComplete", count);
astman_send_list_complete_end(s);
return 0;
}
static int manager_dbdel(struct mansession *s, const struct message *m)
{
const char *family = astman_get_header(m, "Family");
@ -1091,6 +1169,7 @@ static void astdb_atexit(void)
{
ast_cli_unregister_multiple(cli_database, ARRAY_LEN(cli_database));
ast_manager_unregister("DBGet");
ast_manager_unregister("DBGetTree");
ast_manager_unregister("DBPut");
ast_manager_unregister("DBDel");
ast_manager_unregister("DBDelTree");
@ -1126,6 +1205,7 @@ int astdb_init(void)
ast_register_atexit(astdb_atexit);
ast_cli_register_multiple(cli_database, ARRAY_LEN(cli_database));
ast_manager_register_xml_core("DBGet", EVENT_FLAG_SYSTEM | EVENT_FLAG_REPORTING, manager_dbget);
ast_manager_register_xml_core("DBGetTree", EVENT_FLAG_SYSTEM | EVENT_FLAG_REPORTING, manager_db_tree_get);
ast_manager_register_xml_core("DBPut", EVENT_FLAG_SYSTEM, manager_dbput);
ast_manager_register_xml_core("DBDel", EVENT_FLAG_SYSTEM, manager_dbdel);
ast_manager_register_xml_core("DBDelTree", EVENT_FLAG_SYSTEM, manager_dbdeltree);

View File

@ -1043,8 +1043,17 @@ enum ast_dial_result ast_dial_join(struct ast_dial *dial)
ast_channel_unlock(chan);
}
} else {
struct ast_dial_channel *channel = NULL;
/* Now we signal it with SIGURG so it will break out of it's waitfor */
pthread_kill(thread, SIGURG);
/* pthread_kill may not be enough, if outgoing channel has already got an answer (no more in waitfor) but is not yet running an application. Force soft hangup. */
AST_LIST_TRAVERSE(&dial->channels, channel, list) {
if (channel->owner) {
ast_softhangup(channel->owner, AST_SOFTHANGUP_EXPLICIT);
}
}
}
AST_LIST_UNLOCK(&dial->channels);

View File

@ -164,6 +164,12 @@
</variable>
</variablelist>
</option>
<option name="n">
<para>Do not answer the channel automatically before bridging.</para>
<para>Additionally, to prevent a bridged channel (the target of the Bridge application)
from answering, the <literal>BRIDGE_NOANSWER</literal> variable can be set to inhibit
answering.</para>
</option>
<option name="S(x)">
<para>Hang up the call after <replaceable>x</replaceable> seconds *after* the called party has answered the call.</para>
</option>
@ -525,7 +531,7 @@ static void bridge_failed_peer_goto(struct ast_channel *chan, struct ast_channel
}
static int pre_bridge_setup(struct ast_channel *chan, struct ast_channel *peer, struct ast_bridge_config *config,
struct ast_bridge_features *chan_features, struct ast_bridge_features *peer_features)
struct ast_bridge_features *chan_features, struct ast_bridge_features *peer_features, int noanswer)
{
int res;
SCOPE_TRACE(1, "%s Peer: %s\n", ast_channel_name(chan), ast_channel_name(peer));
@ -553,7 +559,10 @@ static int pre_bridge_setup(struct ast_channel *chan, struct ast_channel *peer,
res = 0;
if (ast_channel_state(chan) != AST_STATE_UP) {
if (noanswer) {
ast_debug(1, "Skipping answer on %s due to no answer directive\n", ast_channel_name(chan));
} else if (ast_channel_state(chan) != AST_STATE_UP) {
ast_debug(1, "Answering channel for bridge: %s\n", ast_channel_name(chan));
res = ast_raw_answer_with_stream_topology(chan, config->answer_topology);
if (res != 0) {
return -1;
@ -627,6 +636,8 @@ int ast_bridge_call_with_flags(struct ast_channel *chan, struct ast_channel *pee
struct ast_bridge *bridge;
struct ast_bridge_features chan_features;
struct ast_bridge_features *peer_features;
const char *value;
int noanswer;
SCOPE_TRACE(1, "%s Peer: %s\n", ast_channel_name(chan), ast_channel_name(peer));
/* Setup features. */
@ -639,7 +650,12 @@ int ast_bridge_call_with_flags(struct ast_channel *chan, struct ast_channel *pee
return -1;
}
if (pre_bridge_setup(chan, peer, config, &chan_features, peer_features)) {
ast_channel_lock(chan);
value = pbx_builtin_getvar_helper(chan, "BRIDGE_NOANSWER");
noanswer = !ast_strlen_zero(value) ? 1 : 0;
ast_channel_unlock(chan);
if (pre_bridge_setup(chan, peer, config, &chan_features, peer_features, noanswer)) {
ast_bridge_features_destroy(peer_features);
ast_bridge_features_cleanup(&chan_features);
bridge_failed_peer_goto(chan, peer);
@ -848,6 +864,7 @@ enum {
OPT_CALLER_PARK = (1 << 10),
OPT_CALLEE_KILL = (1 << 11),
OPT_CALLEE_GO_ON = (1 << 12),
OPT_NOANSWER = (1 << 13),
};
enum {
@ -866,6 +883,7 @@ AST_APP_OPTIONS(bridge_exec_options, BEGIN_OPTIONS
AST_APP_OPTION('k', OPT_CALLEE_PARK),
AST_APP_OPTION('K', OPT_CALLER_PARK),
AST_APP_OPTION_ARG('L', OPT_DURATION_LIMIT, OPT_ARG_DURATION_LIMIT),
AST_APP_OPTION('n', OPT_NOANSWER),
AST_APP_OPTION_ARG('S', OPT_DURATION_STOP, OPT_ARG_DURATION_STOP),
AST_APP_OPTION('t', OPT_CALLEE_TRANSFER),
AST_APP_OPTION('T', OPT_CALLER_TRANSFER),
@ -1012,6 +1030,7 @@ static int bridge_exec(struct ast_channel *chan, const char *data)
struct ast_bridge_features *peer_features;
struct ast_bridge *bridge;
struct ast_features_xfer_config *xfer_cfg;
int noanswer;
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(dest_chan);
@ -1066,6 +1085,7 @@ static int bridge_exec(struct ast_channel *chan, const char *data)
ast_set_flag(&(bconfig.features_callee), AST_FEATURE_PARKCALL);
if (ast_test_flag(&opts, OPT_CALLER_PARK))
ast_set_flag(&(bconfig.features_caller), AST_FEATURE_PARKCALL);
noanswer = ast_test_flag(&opts, OPT_NOANSWER);
/* Setup after bridge goto location. */
if (ast_test_flag(&opts, OPT_CALLEE_GO_ON)) {
@ -1096,7 +1116,7 @@ static int bridge_exec(struct ast_channel *chan, const char *data)
goto done;
}
if (pre_bridge_setup(chan, current_dest_chan, &bconfig, &chan_features, peer_features)) {
if (pre_bridge_setup(chan, current_dest_chan, &bconfig, &chan_features, peer_features, noanswer)) {
ast_bridge_features_destroy(peer_features);
ast_bridge_features_cleanup(&chan_features);
goto done;

View File

@ -143,6 +143,9 @@
<configOption name="transferinvalidsound" default="privacy-incorrect">
<synopsis>Sound that is played when an incorrect extension is dialed and the transferer has no attempts remaining.</synopsis>
</configOption>
<configOption name="transferannouncesound" default="pbx-transfer">
<synopsis>Sound that is played to the transferer when a transfer is initiated. If empty, no sound will be played.</synopsis>
</configOption>
</configObject>
<configObject name="featuremap">
<synopsis>DTMF options that can be triggered during bridged calls</synopsis>
@ -324,6 +327,7 @@
<enum name="transferdialattempts"><para><xi:include xpointer="xpointer(/docs/configInfo[@name='features']/configFile[@name='features.conf']/configObject[@name='globals']/configOption[@name='transferdialattempts']/synopsis/text())" /></para></enum>
<enum name="transferretrysound"><para><xi:include xpointer="xpointer(/docs/configInfo[@name='features']/configFile[@name='features.conf']/configObject[@name='globals']/configOption[@name='transferretrysound']/synopsis/text())" /></para></enum>
<enum name="transferinvalidsound"><para><xi:include xpointer="xpointer(/docs/configInfo[@name='features']/configFile[@name='features.conf']/configObject[@name='globals']/configOption[@name='transferinvalidsound']/synopsis/text())" /></para></enum>
<enum name="transferannouncesound"><para><xi:include xpointer="xpointer(/docs/configInfo[@name='features']/configFile[@name='features.conf']/configObject[@name='globals']/configOption[@name='transferannouncesound']/synopsis/text())" /></para></enum>
</enumlist>
</parameter>
</syntax>
@ -387,6 +391,7 @@
#define DEFAULT_TRANSFER_DIAL_ATTEMPTS 3
#define DEFAULT_TRANSFER_RETRY_SOUND "pbx-invalid"
#define DEFAULT_TRANSFER_INVALID_SOUND "privacy-incorrect"
#define DEFAULT_TRANSFER_ANNOUNCE_SOUND "pbx-transfer"
/*! Default pickup options */
#define DEFAULT_PICKUPEXTEN "*8"
@ -910,6 +915,8 @@ static int xfer_set(struct ast_features_xfer_config *xfer, const char *name,
ast_string_field_set(xfer, transferretrysound, value);
} else if (!strcasecmp(name, "transferinvalidsound")) {
ast_string_field_set(xfer, transferinvalidsound, value);
} else if (!strcasecmp(name, "transferannouncesound")) {
ast_string_field_set(xfer, transferannouncesound, value);
} else {
/* Unrecognized option */
res = -1;
@ -1801,6 +1808,8 @@ static int load_config(void)
DEFAULT_TRANSFER_RETRY_SOUND, xfer_handler, 0);
aco_option_register_custom(&cfg_info, "transferinvalidsound", ACO_EXACT, global_options,
DEFAULT_TRANSFER_INVALID_SOUND, xfer_handler, 0);
aco_option_register_custom(&cfg_info, "transferannouncesound", ACO_EXACT, global_options,
DEFAULT_TRANSFER_ANNOUNCE_SOUND, xfer_handler, 0);
aco_option_register_custom(&cfg_info, "pickupexten", ACO_EXACT, global_options,
DEFAULT_PICKUPEXTEN, pickup_handler, 0);

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