mirror of
https://github.com/asterisk/asterisk.git
synced 2025-12-05 04:31:42 +00:00
Compare commits
341 Commits
23.0.0-rc1
...
22.7.0-rc1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2c73433fb8 | ||
|
|
481d4c0e75 | ||
|
|
7e5b531828 | ||
|
|
94d04ac311 | ||
|
|
54da3e1b9e | ||
|
|
38f2fd2527 | ||
|
|
08960ea5a1 | ||
|
|
b03582c30e | ||
|
|
7662c5cb6c | ||
|
|
c3b4b923b3 | ||
|
|
9bbb566df5 | ||
|
|
b1a14698a7 | ||
|
|
b6556cc789 | ||
|
|
1b98cd1b25 | ||
|
|
da10edda02 | ||
|
|
316b4731cb | ||
|
|
5b4aac6ba0 | ||
|
|
3202f8c16d | ||
|
|
b3e5ca59a0 | ||
|
|
76ca632967 | ||
|
|
edcd8b4968 | ||
|
|
a58ddff893 | ||
|
|
241d07f6b4 | ||
|
|
9a4f6f4c4a | ||
|
|
17ae831db5 | ||
|
|
9b96b6bd59 | ||
|
|
ff40d2eb04 | ||
|
|
abf1368525 | ||
|
|
6d889900b2 | ||
|
|
2cf696eef7 | ||
|
|
3f3b155eea | ||
|
|
ef67f64c42 | ||
|
|
87974ee767 | ||
|
|
41864fbb12 | ||
|
|
269dd62be5 | ||
|
|
ff8e8f3092 | ||
|
|
7429bf41c1 | ||
|
|
42f1eb2c9b | ||
|
|
c3080b6be8 | ||
|
|
e76a58ed8e | ||
|
|
57222db726 | ||
|
|
bb2b26e8ca | ||
|
|
33480864f7 | ||
|
|
28fb3fc7db | ||
|
|
fce342c004 | ||
|
|
abaf0c3959 | ||
|
|
08cc9b0d4f | ||
|
|
f3f005e49e | ||
|
|
86bcfafa11 | ||
|
|
53521b940b | ||
|
|
12e04043f6 | ||
|
|
0d9546589b | ||
|
|
81df40e407 | ||
|
|
4019e93a8b | ||
|
|
5828a4195b | ||
|
|
64609e0b18 | ||
|
|
533a8b423d | ||
|
|
f43e7bbb79 | ||
|
|
a3c41f77ab | ||
|
|
8c61cb1e8d | ||
|
|
27a6a153df | ||
|
|
d8bde99058 | ||
|
|
5b5a512b33 | ||
|
|
72f4f415bb | ||
|
|
6184dc61b7 | ||
|
|
eab8642711 | ||
|
|
2d2151c051 | ||
|
|
44034cf841 | ||
|
|
60b8f1d4ed | ||
|
|
53296e50dc | ||
|
|
c3ec267511 | ||
|
|
7cc840ef77 | ||
|
|
4bbd94ff15 | ||
|
|
e98244039f | ||
|
|
c4103f259a | ||
|
|
ae82182768 | ||
|
|
29dcdde3c0 | ||
|
|
bda8c98bbd | ||
|
|
d31750c0f1 | ||
|
|
bcc3d38e46 | ||
|
|
8d3abb065e | ||
|
|
f2c9b84a36 | ||
|
|
6b39b10731 | ||
|
|
37e0ff6f02 | ||
|
|
88092081dd | ||
|
|
206ae3a098 | ||
|
|
671615f2cf | ||
|
|
73b614ebef | ||
|
|
fcb35f97b9 | ||
|
|
eb1ede4612 | ||
|
|
4b01b0efd9 | ||
|
|
3cedbab993 | ||
|
|
b155601f1c | ||
|
|
9eef99f8f3 | ||
|
|
5bdc661745 | ||
|
|
21881d576d | ||
|
|
9cd1dc0c2f | ||
|
|
a40a88af6f | ||
|
|
efd0605359 | ||
|
|
4453fdc6e2 | ||
|
|
8c4813acca | ||
|
|
a437eabd52 | ||
|
|
8c9b6662e8 | ||
|
|
b252093695 | ||
|
|
7b0a814b85 | ||
|
|
05128488ab | ||
|
|
2a661446c4 | ||
|
|
d40d5c999a | ||
|
|
f2f9c25035 | ||
|
|
798fd4eb63 | ||
|
|
9803156223 | ||
|
|
57748784c4 | ||
|
|
e76e572e01 | ||
|
|
9d07194acb | ||
|
|
a4b54349a1 | ||
|
|
a6e61f587b | ||
|
|
9130399bb9 | ||
|
|
7ba06dc6ee | ||
|
|
14e5ca9c6d | ||
|
|
a78768bbdf | ||
|
|
97a5b80422 | ||
|
|
608e48af8d | ||
|
|
423d0f59d4 | ||
|
|
7f056c4ddb | ||
|
|
3dc48fe65c | ||
|
|
d0024a68e1 | ||
|
|
af380ff6c3 | ||
|
|
a3596583d6 | ||
|
|
2a3696517a | ||
|
|
a792b96b74 | ||
|
|
8b670ea1be | ||
|
|
61fc7ea667 | ||
|
|
bd326919a2 | ||
|
|
509ca96490 | ||
|
|
fa1a9d2a70 | ||
|
|
4432fc70e7 | ||
|
|
0b29f5c60c | ||
|
|
b08e093072 | ||
|
|
2939725743 | ||
|
|
ed5b222f85 | ||
|
|
f37424110c | ||
|
|
9027f896e5 | ||
|
|
6da27b0e51 | ||
|
|
31be3d99a9 | ||
|
|
5a0728f161 | ||
|
|
4333a28206 | ||
|
|
cdcc82a3ca | ||
|
|
33e7cfd0f7 | ||
|
|
2c168d5afe | ||
|
|
6f2b99bfa6 | ||
|
|
6002b6fdcb | ||
|
|
9c58dec9b0 | ||
|
|
7e8f566b49 | ||
|
|
75106551f1 | ||
|
|
969d2c6f35 | ||
|
|
479f276408 | ||
|
|
bfc98788d6 | ||
|
|
ce144276ee | ||
|
|
f5d8181eea | ||
|
|
d6a46d7082 | ||
|
|
9d2447afc7 | ||
|
|
d7b8f1a3a1 | ||
|
|
b4378ff25e | ||
|
|
fc429a56ac | ||
|
|
a3fbcc817b | ||
|
|
725580e79e | ||
|
|
43db0baf38 | ||
|
|
7b22d2ef88 | ||
|
|
73e46882f2 | ||
|
|
ea344ecc14 | ||
|
|
2a55f064f3 | ||
|
|
68d9a69be3 | ||
|
|
a15e4043ce | ||
|
|
352a72c9b5 | ||
|
|
d045f290b7 | ||
|
|
d18b6bb9b3 | ||
|
|
419423f68c | ||
|
|
04ed031b62 | ||
|
|
bdc925c8cc | ||
|
|
b7f7d66fca | ||
|
|
6fed735157 | ||
|
|
10ef135e5a | ||
|
|
d9f1b1598f | ||
|
|
dce0ae89a4 | ||
|
|
ff8ec30efb | ||
|
|
4a1129b893 | ||
|
|
8e900950b6 | ||
|
|
2d75ac2c0e | ||
|
|
d184ae428d | ||
|
|
77c6bf844f | ||
|
|
99ef285fff | ||
|
|
f5e87a6da3 | ||
|
|
540e28ea8d | ||
|
|
350a80a2aa | ||
|
|
3692e33898 | ||
|
|
de3d6c03e3 | ||
|
|
fc1de1f290 | ||
|
|
ee09b289ab | ||
|
|
5ddfbd5eab | ||
|
|
d6ce7bb395 | ||
|
|
02bdc2dc37 | ||
|
|
26ea320f3c | ||
|
|
3ec2a680f2 | ||
|
|
619cb75688 | ||
|
|
fe5ff3021e | ||
|
|
ba1626df89 | ||
|
|
8f97da052d | ||
|
|
86ff4b8a5b | ||
|
|
2524043b61 | ||
|
|
26ad51c2ff | ||
|
|
ecb3c3d8e5 | ||
|
|
7863ff70bd | ||
|
|
47d3cca627 | ||
|
|
c0ed22368a | ||
|
|
b31d457d0a | ||
|
|
8d386d7c8b | ||
|
|
8a3a2958c1 | ||
|
|
a0db68c190 | ||
|
|
eb782ec341 | ||
|
|
5ac0874240 | ||
|
|
c3cf4bd223 | ||
|
|
00de10c0d1 | ||
|
|
04f4bd73cd | ||
|
|
ce550fc1b0 | ||
|
|
b794dda76e | ||
|
|
4667c33073 | ||
|
|
38fb02351c | ||
|
|
7a9d014644 | ||
|
|
3df8b857ea | ||
|
|
791d8fbbc0 | ||
|
|
9ffdda5936 | ||
|
|
e352383dd8 | ||
|
|
0fabaa5af4 | ||
|
|
bef2dd5ce6 | ||
|
|
3a45e487cd | ||
|
|
8b736f2047 | ||
|
|
2b428734fd | ||
|
|
e35d341cd7 | ||
|
|
2dd6a4aa66 | ||
|
|
635f6fa564 | ||
|
|
45f51341db | ||
|
|
63c86adbf5 | ||
|
|
076ec99c23 | ||
|
|
1524cb6238 | ||
|
|
2df35736b0 | ||
|
|
d8f6ef063c | ||
|
|
139bdb25e4 | ||
|
|
f680ce9d7b | ||
|
|
ce9c5415a8 | ||
|
|
4eae3395a7 | ||
|
|
3fe5aafd03 | ||
|
|
af0661ffb3 | ||
|
|
82d498b5c3 | ||
|
|
463d4b8d04 | ||
|
|
36628ff34f | ||
|
|
bf0a6aaf3b | ||
|
|
0fbb6de6f4 | ||
|
|
68359a3f96 | ||
|
|
20cf8b3a07 | ||
|
|
02bba40fca | ||
|
|
0a5a6995af | ||
|
|
b26b73790f | ||
|
|
186e9b5bb8 | ||
|
|
94a32885e7 | ||
|
|
6f592e7163 | ||
|
|
0bd4d3320a | ||
|
|
1a71ea7456 | ||
|
|
a8d81692dd | ||
|
|
ada5a706b7 | ||
|
|
7d681cbd90 | ||
|
|
2d4460ad4d | ||
|
|
6b194cbbe3 | ||
|
|
42629c695d | ||
|
|
fc390cf785 | ||
|
|
7a640ca8a8 | ||
|
|
8d1be28001 | ||
|
|
4d80d7ab22 | ||
|
|
a66c9decfe | ||
|
|
95e3e202cc | ||
|
|
65d531c8e9 | ||
|
|
badaf0e383 | ||
|
|
94fcb3174b | ||
|
|
6d98127a75 | ||
|
|
057de6ab66 | ||
|
|
2a48183169 | ||
|
|
6795ded3f4 | ||
|
|
07166788fd | ||
|
|
0e5c832703 | ||
|
|
e6822d7647 | ||
|
|
f9278c1790 | ||
|
|
db312ab0ef | ||
|
|
f93b97ac79 | ||
|
|
33e8398e2b | ||
|
|
0f3d8f21c8 | ||
|
|
76d1ef4d2f | ||
|
|
2f8d008103 | ||
|
|
039baa0317 | ||
|
|
2425d2218c | ||
|
|
166a309549 | ||
|
|
556b974d1b | ||
|
|
43166eb85b | ||
|
|
04b882397f | ||
|
|
0bba91a49d | ||
|
|
682ad186fb | ||
|
|
ab79321a29 | ||
|
|
cbbd2a6b47 | ||
|
|
c7beb10006 | ||
|
|
af05288825 | ||
|
|
65fadcbc09 | ||
|
|
1372eeba51 | ||
|
|
2f44ac22b2 | ||
|
|
d9e01cf0a1 | ||
|
|
e0edea0383 | ||
|
|
4ade5a21b7 | ||
|
|
6dc00f642a | ||
|
|
82a229166a | ||
|
|
56d3070939 | ||
|
|
2ca93f0cdc | ||
|
|
03883ccb8e | ||
|
|
5e9ea95517 | ||
|
|
6297462fd2 | ||
|
|
7788fac511 | ||
|
|
8e4a09f711 | ||
|
|
4473ed5256 | ||
|
|
fd8d28cb60 | ||
|
|
dc8f83662b | ||
|
|
4411f22d67 | ||
|
|
7c1687ba12 | ||
|
|
3fb205f3af | ||
|
|
ef2bae8464 | ||
|
|
a06c18e8bd | ||
|
|
b506faaa2d | ||
|
|
78f8b00267 | ||
|
|
add94582ba | ||
|
|
b42d4f8a3c | ||
|
|
cd8ffa1225 | ||
|
|
045d6c5fc1 | ||
|
|
89bdcf0112 | ||
|
|
6b7b5c98df | ||
|
|
5a1e6995d6 | ||
|
|
31b8dc0923 |
115
.github/workflows/CreateDocs.yml
vendored
115
.github/workflows/CreateDocs.yml
vendored
@@ -3,121 +3,22 @@ on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
branches:
|
||||
description: "JSON array of branches: ['18','20'] (no spaces)"
|
||||
description: "JSON array of branches: ['18','20'] (no spaces) or leave blank for all current branches."
|
||||
required: false
|
||||
type: string
|
||||
schedule:
|
||||
# Times are UTC
|
||||
- cron: '0 04 * * *'
|
||||
|
||||
env:
|
||||
ASTERISK_REPO: ${{ github.repository }}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
DEFAULT_BRANCHES: ${{ vars.WIKIDOC_BRANCHES }}
|
||||
INPUT_BRANCHES: ${{ inputs.branches }}
|
||||
|
||||
jobs:
|
||||
|
||||
CreateDocsDebug:
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
manual_branches: ${{ steps.setup.outputs.manual_branches }}
|
||||
steps:
|
||||
- name: setup
|
||||
run: |
|
||||
MANUAL_BRANCHES="$INPUT_BRANCHES"
|
||||
[ -z "$MANUAL_BRANCHES" ] && MANUAL_BRANCHES="$DEFAULT_BRANCHES" || :
|
||||
echo "manual_branches=${MANUAL_BRANCHES}"
|
||||
echo "manual_branches=${MANUAL_BRANCHES}" >>${GITHUB_OUTPUT}
|
||||
exit 0
|
||||
|
||||
- name: DumpEnvironment
|
||||
uses: asterisk/asterisk-ci-actions/DumpEnvironmentAction@main
|
||||
with:
|
||||
action-inputs: ${{toJSON(inputs)}}
|
||||
action-vars: ${{ toJSON(steps.setup.outputs) }}
|
||||
|
||||
CreateDocsScheduledMatrix:
|
||||
needs: [ CreateDocsDebug ]
|
||||
if: ${{github.event_name == 'schedule' && fromJSON(vars.WIKIDOCS_ENABLE) == true }}
|
||||
continue-on-error: false
|
||||
CreateDocs:
|
||||
if: ${{ ( github.event_name == 'schedule' && fromJSON(vars.WIKIDOCS_ENABLE) ) || github.event_name == 'workflow_dispatch' }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
branch: ${{ fromJSON(vars.WIKIDOC_BRANCHES) }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: CreateDocs for ${{matrix.branch}}
|
||||
uses: asterisk/asterisk-ci-actions/CreateAsteriskDocsComposite@main
|
||||
with:
|
||||
asterisk_repo: ${{env.ASTERISK_REPO}}
|
||||
base_branch: ${{matrix.branch}}
|
||||
docs_dir: docs_dir/${{matrix.branch}}
|
||||
github_token: ${{secrets.GITHUB_TOKEN}}
|
||||
branch: ${{ fromJSON(inputs.branches || vars.WIKIDOC_BRANCHES) }}
|
||||
uses: asterisk/asterisk-ci-actions/.github/workflows/AsteriskCreateDocs.yml@main
|
||||
with:
|
||||
asterisk_repo: ${{ github.repository }}
|
||||
base_branch: ${{ matrix.branch }}
|
||||
|
||||
CreateDocsScheduled:
|
||||
needs: [ CreateDocsScheduledMatrix ]
|
||||
if: ${{ success() || failure() }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Check CreateDocsScheduledMatrix status
|
||||
env:
|
||||
RESULT: ${{needs.CreateDocsScheduledMatrix.result}}
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
case $RESULT in
|
||||
success)
|
||||
echo "::notice::Docs created"
|
||||
exit 0
|
||||
;;
|
||||
skipped)
|
||||
echo "::notice::Skipped"
|
||||
exit 1
|
||||
;;
|
||||
*)
|
||||
echo "::error::One or CreateDocs failed ($RESULT)"
|
||||
exit 1
|
||||
esac
|
||||
|
||||
CreateDocsManualMatrix:
|
||||
needs: [ CreateDocsDebug ]
|
||||
if: ${{github.event_name == 'workflow_dispatch'}}
|
||||
continue-on-error: false
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
branch: ${{ fromJSON(vars.WIKIDOC_MANUAL_BRANCHES) }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: CreateDocs for ${{matrix.branch}}
|
||||
uses: asterisk/asterisk-ci-actions/CreateAsteriskDocsComposite@main
|
||||
with:
|
||||
asterisk_repo: ${{env.ASTERISK_REPO}}
|
||||
base_branch: ${{matrix.branch}}
|
||||
docs_dir: docs_dir/${{matrix.branch}}
|
||||
github_token: ${{secrets.GITHUB_TOKEN}}
|
||||
|
||||
CreateDocsManual:
|
||||
needs: [ CreateDocsManualMatrix ]
|
||||
if: ${{ success() || failure() }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Check CreateDocsManualMatrix status
|
||||
env:
|
||||
RESULT: ${{needs.CreateDocsManualMatrix.result}}
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
case $RESULT in
|
||||
success)
|
||||
echo "::notice::Docs created"
|
||||
exit 0
|
||||
;;
|
||||
skipped)
|
||||
echo "::notice::Skipped"
|
||||
exit 1
|
||||
;;
|
||||
*)
|
||||
echo "::error::One or CreateDocs failed ($RESULT)"
|
||||
exit 1
|
||||
esac
|
||||
|
||||
14
.github/workflows/NightlyAdmin.yml
vendored
14
.github/workflows/NightlyAdmin.yml
vendored
@@ -4,16 +4,8 @@ on:
|
||||
- cron: '30 1 * * *'
|
||||
workflow_dispatch:
|
||||
|
||||
env:
|
||||
ASTERISK_REPO: ${{ github.repository }}
|
||||
PR_NUMBER: 0
|
||||
PR_COMMIT: ''
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
MODULES_BLACKLIST: ${{ vars.GATETEST_MODULES_BLACKLIST }} ${{ vars.UNITTEST_MODULES_BLACKLIST }}
|
||||
|
||||
jobs:
|
||||
CloseStaleIssues:
|
||||
uses: asterisk/asterisk-ci-actions/.github/workflows/CloseStaleIssuesAndPRs.yml@main
|
||||
NightlyAdmin:
|
||||
uses: asterisk/asterisk-ci-actions/.github/workflows/AsteriskNightlyAdmin.yml@main
|
||||
secrets:
|
||||
ASTERISKTEAM_PAT: ${{ secrets.ASTERISKTEAM_PAT }}
|
||||
ASTERISKTEAM_PAT: ${{ secrets.ASTERISKTEAM_PAT }}
|
||||
|
||||
6
.github/workflows/NightlyTests.yml
vendored
6
.github/workflows/NightlyTests.yml
vendored
@@ -12,7 +12,8 @@ on:
|
||||
description: "Array of test groups to run: ['ari1','channels']. Defaults to NIGHTLYTEST_LIST"
|
||||
|
||||
schedule:
|
||||
- cron: '0 2 * * *'
|
||||
# Monday-Saturday 2am
|
||||
- cron: '0 2 * * 1-6'
|
||||
|
||||
jobs:
|
||||
NightlyTests:
|
||||
@@ -21,5 +22,4 @@ jobs:
|
||||
with:
|
||||
branches: ${{ inputs.branches || vars.NIGHTLYTEST_BRANCHES }}
|
||||
group_list: ${{ inputs.group_list || vars.NIGHTLYTEST_LIST }}
|
||||
secrets:
|
||||
TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
realtime: false
|
||||
|
||||
14
.github/workflows/OnPRCPCheck.yml
vendored
Normal file
14
.github/workflows/OnPRCPCheck.yml
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
name: PRCPCheck
|
||||
run-name: "PR ${{ github.event.number }} CPCheck by ${{ github.actor }}"
|
||||
on:
|
||||
pull_request_target:
|
||||
types: [ labeled ]
|
||||
|
||||
jobs:
|
||||
PRCPCheck:
|
||||
name: "run-cpcheck"
|
||||
if: ${{ github.event.label.name == vars.CHERRY_PICK_TEST_LABEL }}
|
||||
concurrency:
|
||||
group: cpcheck-${{ github.triggering_actor }}-${{ github.head_ref }}
|
||||
cancel-in-progress: true
|
||||
uses: asterisk/asterisk-ci-actions/.github/workflows/AsteriskPRCPCheck.yml@main
|
||||
14
.github/workflows/OnPRCheck.yml
vendored
Normal file
14
.github/workflows/OnPRCheck.yml
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
name: PRCheck
|
||||
run-name: "PR ${{ github.event.number }} Check(${{github.event.action}}) by ${{ github.actor }}"
|
||||
on:
|
||||
pull_request_target:
|
||||
types: [ opened, reopened, synchronize, labeled ]
|
||||
|
||||
jobs:
|
||||
PRCheck:
|
||||
name: "run-check"
|
||||
if: ${{ (github.event.action != 'labeled') || (github.event.action == 'labeled' && github.event.label.name == vars.RECHECKPR_LABEL) }}
|
||||
concurrency:
|
||||
group: check-${{ github.triggering_actor }}-${{ github.head_ref }}
|
||||
cancel-in-progress: true
|
||||
uses: asterisk/asterisk-ci-actions/.github/workflows/AsteriskPRCheck.yml@main
|
||||
17
.github/workflows/OnPRCherryPickTest.yml
vendored
17
.github/workflows/OnPRCherryPickTest.yml
vendored
@@ -1,17 +0,0 @@
|
||||
name: PRCherryPickTest
|
||||
run-name: "PR ${{github.event.number}} CherryPickTest"
|
||||
on:
|
||||
pull_request_target:
|
||||
types: [ labeled ]
|
||||
|
||||
concurrency:
|
||||
group: ${{github.workflow}}-${{github.event.label.name}}-${{github.event.number}}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
CherryPickTest:
|
||||
name: CherryPickTest
|
||||
if: ${{ github.event.label.name == vars.CHERRY_PICK_TEST_LABEL }}
|
||||
uses: asterisk/asterisk-ci-actions/.github/workflows/AsteriskCherryPickTest.yml@main
|
||||
secrets:
|
||||
TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
23
.github/workflows/OnPRMergeApproved.yml
vendored
23
.github/workflows/OnPRMergeApproved.yml
vendored
@@ -1,19 +1,14 @@
|
||||
name: PRMergeApproved
|
||||
run-name: "PR ${{github.event.number}} MergeApproved"
|
||||
name: PRMerge
|
||||
run-name: "PR ${{ github.event.number }} Merge by ${{ github.actor }}"
|
||||
on:
|
||||
pull_request_target:
|
||||
types: [labeled]
|
||||
|
||||
concurrency:
|
||||
group: ${{github.workflow}}-${{github.event.label.name}}-${{github.event.number}}
|
||||
cancel-in-progress: true
|
||||
types: [ labeled ]
|
||||
|
||||
jobs:
|
||||
MergePR:
|
||||
name: MergePR
|
||||
PRMerge:
|
||||
name: "run-merge"
|
||||
if: contains(fromJSON(vars.MERGE_APPROVED_LABELS), github.event.label.name)
|
||||
uses: asterisk/asterisk-ci-actions/.github/workflows/AsteriskMergePR.yml@main
|
||||
secrets:
|
||||
TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
application_id: ${{secrets.ASTERISK_ORG_ACCESS_APP_ID}}
|
||||
application_private_key: ${{secrets.ASTERISK_ORG_ACCESS_APP_PRIV_KEY}}
|
||||
concurrency:
|
||||
group: merge-${{ github.triggering_actor }}-${{ github.head_ref }}
|
||||
cancel-in-progress: true
|
||||
uses: asterisk/asterisk-ci-actions/.github/workflows/AsteriskPRMerge.yml@main
|
||||
|
||||
18
.github/workflows/OnPRRecheck.yml
vendored
18
.github/workflows/OnPRRecheck.yml
vendored
@@ -1,18 +0,0 @@
|
||||
name: PRRecheck
|
||||
run-name: "PR ${{github.event.number}} Recheck"
|
||||
on:
|
||||
pull_request_target:
|
||||
types: [ labeled ]
|
||||
|
||||
concurrency:
|
||||
group: ${{github.workflow}}-${{github.event.label.name}}-${{github.event.number}}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
PRCheck:
|
||||
name: PRCheck
|
||||
if: ${{ github.event.label.name == vars.RECHECKPR_LABEL }}
|
||||
uses: asterisk/asterisk-ci-actions/.github/workflows/AsteriskRecheckPR.yml@main
|
||||
secrets:
|
||||
TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
79
.github/workflows/OnPRStateChanged.yml
vendored
79
.github/workflows/OnPRStateChanged.yml
vendored
@@ -1,79 +0,0 @@
|
||||
#
|
||||
# Workflows, like this one, that are triggered by PRs submitted
|
||||
# from forked repositories are severly limited in what they can do
|
||||
# for security reasons. For instance, they can't add or remove
|
||||
# labels or comments even on the PR that triggered them. Since
|
||||
# we need to both of those things, GitHub recommends creating a
|
||||
# separate workflow that does those tasks that's triggered when
|
||||
# this PR workflow starts or finishes. Since that workflow isn't
|
||||
# being run in the context of a forked repo, it has all the
|
||||
# privileges needed to add and remove labels and comments. The
|
||||
# accompanying OnPRStateChangedPriv workflow does just that.
|
||||
|
||||
name: PRStateChanged
|
||||
run-name: "PR ${{github.event.number}} ${{github.event.action}} by ${{ github.actor }}"
|
||||
on:
|
||||
pull_request:
|
||||
types: [opened, reopened, synchronize]
|
||||
|
||||
concurrency:
|
||||
group: ${{github.workflow}}-${{github.event.number}}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
#
|
||||
# Pull requests created from forked respositories don't have access
|
||||
# to the "Action Variables" ('vars' context) so we need to retrieve
|
||||
# control data from an action that's located in asterisk-ci-actions.
|
||||
#
|
||||
Setup:
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
vars: ${{ steps.setvars.outputs.control_data }}
|
||||
testsuite_test_pr: ${{ steps.testsuitepr.outputs.testsuite_test_pr }}
|
||||
steps:
|
||||
- id: wait
|
||||
run: |
|
||||
echo "::notice::Waiting for 2 minutes to give user a chance to add PR comments"
|
||||
sleep 120
|
||||
exit 0
|
||||
|
||||
- id: setvars
|
||||
uses: asterisk/asterisk-ci-actions/GetRepoControlData@main
|
||||
with:
|
||||
repo: ${{ github.event.repository.name}}
|
||||
|
||||
- name: GetTestsuitePR
|
||||
id: testsuitepr
|
||||
uses: asterisk/asterisk-ci-actions/GetTestsuitePRFromAsteriskPR@main
|
||||
with:
|
||||
repo: ${{github.repository}}
|
||||
pr_number: ${{github.event.number}}
|
||||
testsuite_test_pr_regex: ${{ fromJSON(steps.setvars.outputs.control_data).TESTSUITE_TEST_PR_REGEX }}
|
||||
testsuite_test_auto_merge_regex: ${{ fromJSON(steps.setvars.outputs.control_data).TESTSUITE_TEST_AUTO_MERGE_REGEX }}
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: DumpEnvironment
|
||||
uses: asterisk/asterisk-ci-actions/DumpEnvironmentAction@main
|
||||
with:
|
||||
action-vars: ${{ toJSON(steps.setvars.outputs) }}
|
||||
action-inputs: ${{ toJSON(steps.testsuitepr.outputs) }}
|
||||
|
||||
PRCheck:
|
||||
name: PRCheck
|
||||
needs: Setup
|
||||
uses: asterisk/asterisk-ci-actions/.github/workflows/AsteriskUnitGateTest.yml@main
|
||||
with:
|
||||
test_type: prstatechange
|
||||
asterisk_repo: ${{github.repository}}
|
||||
pr_number: ${{github.event.number}}
|
||||
base_branch: ${{github.event.pull_request.base.ref}}
|
||||
build_options: ${{ fromJSON(needs.Setup.outputs.vars).BUILD_OPTIONS }}
|
||||
unittest_command: ${{ fromJSON(needs.Setup.outputs.vars).UNITTEST_COMMAND }}
|
||||
testsuite_repo: ${{ fromJSON(needs.Setup.outputs.vars).TESTSUITE_REPO }}
|
||||
testsuite_test_pr: ${{ needs.Setup.outputs.testsuite_test_pr }}
|
||||
gatetest_list: ${{ fromJSON(needs.Setup.outputs.vars).GATETEST_LIST }}
|
||||
gatetest_commands: ${{ fromJSON(needs.Setup.outputs.vars).GATETEST_COMMANDS }}
|
||||
secrets:
|
||||
TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
27
.github/workflows/OnPRStateChangedPriv.yml
vendored
27
.github/workflows/OnPRStateChangedPriv.yml
vendored
@@ -1,27 +0,0 @@
|
||||
#
|
||||
# Workflows triggered by PRs submitted from forked repositories
|
||||
# (all of ours) are severly limited in what they can do.
|
||||
# For instance, they can't add or remove labels or comments even
|
||||
# on the PR that triggered them. Since we need to both of those,
|
||||
# GitHub recommends creating a separate workflow (this one) that
|
||||
# does those tasks that's triggered when the PR submit workflow
|
||||
# starts or finishes. Since this workflow isn't being run in the
|
||||
# context of a forked repo, it has all the privileges needed to
|
||||
# add and remove labels and comments. Hence the "Priv" at the end
|
||||
# of this workflow name.
|
||||
#
|
||||
name: PRStateChangedPriv
|
||||
run-name: "PRStateChangedPriv ${{github.event.workflow.name}} ${{github.event.action}}"
|
||||
on:
|
||||
workflow_run:
|
||||
workflows: [PRStateChanged]
|
||||
types:
|
||||
- requested
|
||||
- completed
|
||||
|
||||
jobs:
|
||||
PRStateChangedPriv:
|
||||
name: PRStateChangedPriv
|
||||
uses: asterisk/asterisk-ci-actions/.github/workflows/AsteriskPRStateChangedPriv.yml@main
|
||||
secrets:
|
||||
TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
85
.github/workflows/Releaser.yml
vendored
85
.github/workflows/Releaser.yml
vendored
@@ -3,6 +3,16 @@ run-name: ${{ github.actor }} is creating ${{vars.PRODUCT_NAME}} release ${{inpu
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
release_type:
|
||||
description: |
|
||||
Release Type:
|
||||
required: true
|
||||
type: choice
|
||||
options:
|
||||
- STANDARD
|
||||
- SECURITY
|
||||
- HOTFIX
|
||||
default: STANDARD
|
||||
new_version:
|
||||
description: |
|
||||
New Version:
|
||||
@@ -11,24 +21,16 @@ on:
|
||||
certified-20.4-cert1-rc1, certified-20.4-cert1
|
||||
required: true
|
||||
type: string
|
||||
is_security:
|
||||
description: |
|
||||
Security?
|
||||
(No prev RCs)
|
||||
required: true
|
||||
type: boolean
|
||||
default: false
|
||||
advisories:
|
||||
description: |
|
||||
Comma separated list of advisories.
|
||||
Comma separated list of advisories for SECURITY releases.
|
||||
NO SPACES
|
||||
Example: GHSA-4xjp-22g4-9fxm,GHSA-4xjp-22g4-zzzz
|
||||
required: false
|
||||
type: string
|
||||
is_hotfix:
|
||||
skip_cherry_pick:
|
||||
description: |
|
||||
Hotfix?
|
||||
(A patch release but not security. No prev RCs)
|
||||
Skip automatic cherry-pick for regular RC1 releases? USE WITH CAUTION!
|
||||
required: true
|
||||
type: boolean
|
||||
default: false
|
||||
@@ -38,6 +40,12 @@ on:
|
||||
required: true
|
||||
type: boolean
|
||||
default: false
|
||||
skip_test_builds:
|
||||
description: |
|
||||
Skip test builds? USE WITH CAUTION!
|
||||
required: true
|
||||
type: boolean
|
||||
default: false
|
||||
push_release_branches:
|
||||
description: |
|
||||
Push release branches live?
|
||||
@@ -64,38 +72,23 @@ on:
|
||||
default: false
|
||||
|
||||
jobs:
|
||||
ReleaseAsterisk:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Run Releaser
|
||||
uses: asterisk/asterisk-ci-actions/ReleaserComposite@main
|
||||
with:
|
||||
product: ${{vars.PRODUCT_NAME}}
|
||||
is_security: ${{inputs.is_security}}
|
||||
advisories: ${{inputs.advisories}}
|
||||
is_hotfix: ${{inputs.is_hotfix}}
|
||||
new_version: ${{inputs.new_version}}
|
||||
force_cherry_pick: ${{inputs.force_cherry_pick}}
|
||||
push_release_branches: ${{inputs.push_release_branches}}
|
||||
create_github_release: ${{inputs.create_github_release}}
|
||||
push_tarballs: ${{inputs.push_tarballs}}
|
||||
send_email: ${{inputs.send_email}}
|
||||
repo: ${{github.repository}}
|
||||
mail_list_ga: ${{vars.MAIL_LIST_GA}}
|
||||
mail_list_rc: ${{vars.MAIL_LIST_RC}}
|
||||
mail_list_cert_ga: ${{vars.MAIL_LIST_CERT_GA}}
|
||||
mail_list_cert_rc: ${{vars.MAIL_LIST_CERT_RC}}
|
||||
mail_list_sec: ${{vars.MAIL_LIST_SEC_ADV}}
|
||||
sec_adv_url_base: ${{vars.SEC_ADV_URL_BASE}}
|
||||
gpg_private_key: ${{secrets.ASTDEV_GPG_PRIV_KEY}}
|
||||
github_token: ${{secrets.GITHUB_TOKEN}}
|
||||
asteriskteam_gh_token: ${{secrets.ASTERISKTEAM_PAT}}
|
||||
application_id: ${{secrets.ASTERISK_ORG_ACCESS_APP_ID}}
|
||||
application_private_key: ${{secrets.ASTERISK_ORG_ACCESS_APP_PRIV_KEY}}
|
||||
asteriskteamsa_username: ${{secrets.ASTERISKTEAMSA_GMAIL_ACCT}}
|
||||
asteriskteamsa_token: ${{secrets.ASTERISKTEAMSA_GMAIL_TOKEN}}
|
||||
deploy_ssh_priv_key: ${{secrets.DOWNLOADS_DEPLOY_SSH_PRIV_KEY}}
|
||||
deploy_ssh_username: ${{secrets.DOWNLOADS_DEPLOY_SSH_USERNAME}}
|
||||
deploy_host: ${{vars.DEPLOY_HOST}}
|
||||
deploy_dir: ${{vars.DEPLOY_DIR}}
|
||||
fpbx_issue_repo: ${{vars.FPBX_ISSUE_REPO}}
|
||||
Releaser:
|
||||
uses: asterisk/asterisk-ci-actions/.github/workflows/AsteriskRelease.yml@main
|
||||
with:
|
||||
release_type: ${{inputs.release_type}}
|
||||
new_version: ${{inputs.new_version}}
|
||||
advisories: ${{inputs.advisories}}
|
||||
skip_cherry_pick: ${{inputs.skip_cherry_pick}}
|
||||
force_cherry_pick: ${{inputs.force_cherry_pick}}
|
||||
skip_test_builds: ${{inputs.skip_test_builds}}
|
||||
push_release_branches: ${{inputs.push_release_branches}}
|
||||
create_github_release: ${{inputs.create_github_release}}
|
||||
push_tarballs: ${{inputs.push_tarballs}}
|
||||
send_email: ${{inputs.send_email}}
|
||||
secrets:
|
||||
gpg_private_key: ${{secrets.ASTDEV_GPG_PRIV_KEY}}
|
||||
asteriskteam_gh_token: ${{secrets.ASTERISKTEAM_PAT}}
|
||||
asteriskteam_email_username: ${{secrets.ASTERISKTEAM_SES_KEY_ID}}
|
||||
asteriskteam_email_secret: ${{secrets.ASTERISKTEAM_SES_KEY_SECRET}}
|
||||
deploy_ssh_priv_key: ${{secrets.DOWNLOADS_DEPLOY_SSH_PRIV_KEY}}
|
||||
deploy_ssh_username: ${{secrets.DOWNLOADS_DEPLOY_SSH_USERNAME}}
|
||||
|
||||
25
.github/workflows/WeeklyTests.yml
vendored
Normal file
25
.github/workflows/WeeklyTests.yml
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
name: WeeklyTests
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
branches:
|
||||
required: false
|
||||
type: string
|
||||
description: "Array of branches to run: ['21','master']. Defaults to NIGHTLYTEST_BRANCHES"
|
||||
group_list:
|
||||
required: false
|
||||
type: string
|
||||
description: "Array of test groups to run: ['ari1','channels']. Defaults to NIGHTLYTEST_LIST"
|
||||
|
||||
schedule:
|
||||
# Sunday 2am
|
||||
- cron: '0 2 * * 0'
|
||||
|
||||
jobs:
|
||||
WeeklyTests:
|
||||
name: WeeklyTests
|
||||
uses: asterisk/asterisk-ci-actions/.github/workflows/AsteriskNightlyTest.yml@main
|
||||
with:
|
||||
branches: ${{ inputs.branches || vars.NIGHTLYTEST_BRANCHES }}
|
||||
group_list: ${{ inputs.group_list || vars.NIGHTLYTEST_LIST }}
|
||||
realtime: true
|
||||
1
CHANGES.html
Symbolic link
1
CHANGES.html
Symbolic link
@@ -0,0 +1 @@
|
||||
ChangeLogs/ChangeLog-22.7.0-rc1.html
|
||||
1
CHANGES.md
Symbolic link
1
CHANGES.md
Symbolic link
@@ -0,0 +1 @@
|
||||
ChangeLogs/ChangeLog-22.7.0-rc1.md
|
||||
2
CREDITS
2
CREDITS
@@ -87,7 +87,7 @@
|
||||
manager eventmask; command line '-t' flag to allow
|
||||
recording/voicemail on nfs shares; #exec command and multiline
|
||||
comments in config files; setvar in iax and sip configs.
|
||||
anthmct(AT)yahoo.com http://www.asterlink.com
|
||||
anthm(AT)signalwire.com http://www.signalwire.com
|
||||
|
||||
* James Golovich - Innumerable contributions, including SIP TCP and TLS
|
||||
support. You can find him and asterisk-perl at
|
||||
|
||||
370
ChangeLogs/ChangeLog-22.0.0.md
Normal file
370
ChangeLogs/ChangeLog-22.0.0.md
Normal file
@@ -0,0 +1,370 @@
|
||||
|
||||
## Change Log for Release asterisk-22.0.0
|
||||
|
||||
### Links:
|
||||
|
||||
- [Full ChangeLog](https://downloads.asterisk.org/pub/telephony/asterisk/releases/ChangeLog-22.0.0.md)
|
||||
- [GitHub Diff](https://github.com/asterisk/asterisk/compare/22.0.0-pre1...22.0.0)
|
||||
- [Tarball](https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22.0.0.tar.gz)
|
||||
- [Downloads](https://downloads.asterisk.org/pub/telephony/asterisk)
|
||||
|
||||
### Summary:
|
||||
|
||||
- Commits: 22
|
||||
- Commit Authors: 8
|
||||
- Issues Resolved: 13
|
||||
- Security Advisories Resolved: 1
|
||||
- [GHSA-v428-g3cw-7hv9](https://github.com/asterisk/asterisk/security/advisories/GHSA-v428-g3cw-7hv9): A malformed Contact or Record-Route URI in an incoming SIP request can cause Asterisk to crash when res_resolver_unbound is used
|
||||
|
||||
### User Notes:
|
||||
|
||||
- #### feat: ARI "ChannelToneDetected" event
|
||||
Setting the TONE_DETECT dialplan function on a channel
|
||||
in ARI will now cause a ChannelToneDetected ARI event to be raised
|
||||
when the specified tone is detected.
|
||||
|
||||
|
||||
### Upgrade Notes:
|
||||
|
||||
- #### app_record: Add RECORD_TIME output variable.
|
||||
The RECORD_TIME variable now contains
|
||||
the duration of Record() recordings in milliseconds.
|
||||
|
||||
|
||||
### Commit Authors:
|
||||
|
||||
- Alexei Gradinari: (2)
|
||||
- George Joseph: (10)
|
||||
- Gibbz00: (1)
|
||||
- Joshua C. Colp: (2)
|
||||
- Mike Bradeen: (2)
|
||||
- Naveen Albert: (1)
|
||||
- Sean Bright: (2)
|
||||
- Tinet-Mucw: (2)
|
||||
|
||||
## Issue and Commit Detail:
|
||||
|
||||
### Closed Issues:
|
||||
|
||||
- !GHSA-v428-g3cw-7hv9: A malformed Contact or Record-Route URI in an incoming SIP request can cause Asterisk to crash when res_resolver_unbound is used
|
||||
- 548: [improvement]: Get Record() audio duration/length
|
||||
- 763: [bug]: autoservice thread stuck in an endless sleep
|
||||
- 811: [new-feature]: ARI channel tone detect events.
|
||||
- 845: [bug]: Buffer overflow in handling of security mechanisms in res_pjsip
|
||||
- 847: [bug]: Asterisk not using negotiated fall-back 8K digits
|
||||
- 854: [bug]: wrong properties in stir_shaken.conf.sample
|
||||
- 856: [bug]: res_pjsip_sdp_rtp leaks astobj2 ast_format
|
||||
- 861: [bug]: ChanSpy unable to read audiohook read direction frame when no packet lost on both side of the call
|
||||
- 876: [bug]: ChanSpy unable to write whisper_audiohook when set flag OPTION_READONLY
|
||||
- 879: [bug]: res_stir_shaken/verification.c: Getting verification errors when global_disable=yes
|
||||
- 884: [bug]: A ':' at the top of in stir_shaken.conf make Asterisk producing a core file when starting
|
||||
- 889: [bug]: res_stir_shaken/verification.c has a stale include for jansson.h that can cause compilation to fail
|
||||
- 904: [bug]: stir_shaken: attest_level isn't being propagated correctly from attestation to profile to tn
|
||||
|
||||
### Commits By Author:
|
||||
|
||||
- #### Alexei Gradinari (2):
|
||||
- res_pjsip_sdp_rtp fix leaking astobj2 ast_format
|
||||
- autoservice: Do not sleep if autoservice_stop is called within autoservice thr..
|
||||
|
||||
- #### George Joseph (8):
|
||||
- stir_shaken.conf.sample: Fix bad references to private_key_path
|
||||
- security_agreements.c: Refactor the to_str functions and fix a few other bugs
|
||||
- app_voicemail: Use ast_asprintf to create mailbox SQL query
|
||||
- res_resolver_unbound: Test for NULL ub_result in unbound_resolver_callback
|
||||
- res_stir_shaken: Check for disabled before param validation
|
||||
- res_stir_shaken.c: Fix crash when stir_shaken.conf is invalid
|
||||
- res_stir_shaken: Remove stale include for jansson.h in verification.c
|
||||
- stir_shaken: Fix propagation of attest_level and a few other values
|
||||
|
||||
- #### Mike Bradeen (1):
|
||||
- res_pjsip_sdp_rtp: Use negotiated DTMF Payload types on bitrate mismatch
|
||||
|
||||
- #### Sean Bright (2):
|
||||
- alembic: Make 'revises' header comment match reality.
|
||||
- res_pjsip_logger.c: Fix 'OPTIONS' tab completion.
|
||||
|
||||
- #### Tinet-mucw (2):
|
||||
- app_chanspy.c: resolving the issue with audiohook direction read
|
||||
- app_chanspy.c: resolving the issue writing frame to whisper audiohook.
|
||||
|
||||
|
||||
### Commit List:
|
||||
|
||||
- Prepare master for Asterisk 22
|
||||
- Update issue guidelines link for bug reports.
|
||||
- .github: NightlyAdmin now calls external CloseStaleIssuesAndPRs
|
||||
- app_record: Add RECORD_TIME output variable.
|
||||
- Revert "app_record: Add RECORD_TIME output variable."
|
||||
- feat: ARI "ChannelToneDetected" event
|
||||
- Update version for Asterisk 22
|
||||
- stir_shaken: Fix propagation of attest_level and a few other values
|
||||
- res_stir_shaken: Remove stale include for jansson.h in verification.c
|
||||
- res_stir_shaken.c: Fix crash when stir_shaken.conf is invalid
|
||||
- res_stir_shaken: Check for disabled before param validation
|
||||
- app_chanspy.c: resolving the issue writing frame to whisper audiohook.
|
||||
- res_resolver_unbound: Test for NULL ub_result in unbound_resolver_callback
|
||||
- app_voicemail: Use ast_asprintf to create mailbox SQL query
|
||||
- res_pjsip_sdp_rtp: Use negotiated DTMF Payload types on bitrate mismatch
|
||||
- app_chanspy.c: resolving the issue with audiohook direction read
|
||||
- security_agreements.c: Refactor the to_str functions and fix a few other bugs
|
||||
- res_pjsip_sdp_rtp fix leaking astobj2 ast_format
|
||||
- stir_shaken.conf.sample: Fix bad references to private_key_path
|
||||
- res_pjsip_logger.c: Fix 'OPTIONS' tab completion.
|
||||
- alembic: Make 'revises' header comment match reality.
|
||||
|
||||
### Commit Details:
|
||||
|
||||
#### Prepare master for Asterisk 22
|
||||
Author: George Joseph
|
||||
Date: 2023-08-09
|
||||
|
||||
|
||||
#### Update issue guidelines link for bug reports.
|
||||
Author: Joshua C. Colp
|
||||
Date: 2023-10-27
|
||||
|
||||
|
||||
#### .github: NightlyAdmin now calls external CloseStaleIssuesAndPRs
|
||||
Author: George Joseph
|
||||
Date: 2024-03-20
|
||||
|
||||
|
||||
#### app_record: Add RECORD_TIME output variable.
|
||||
Author: Naveen Albert
|
||||
Date: 2024-01-22
|
||||
|
||||
This adds the RECORD_TIME variable to Record(),
|
||||
which is set to the recording duration before
|
||||
the application returns.
|
||||
|
||||
Resolves: #548
|
||||
|
||||
UpgradeNote: The RECORD_TIME variable now contains
|
||||
the duration of Record() recordings in milliseconds.
|
||||
|
||||
#### Revert "app_record: Add RECORD_TIME output variable."
|
||||
Author: Joshua C. Colp
|
||||
Date: 2024-04-30
|
||||
|
||||
This reverts commit 6e8dccdbbf896bcc99046ae249db360698ede0b2.
|
||||
|
||||
#### feat: ARI "ChannelToneDetected" event
|
||||
Author: gibbz00
|
||||
Date: 2024-07-18
|
||||
|
||||
A stasis event is now produced when using the TONE_DETECT dialplan
|
||||
function. This event is published over ARI using the ChannelToneDetected
|
||||
event. This change does not make it available over AMI.
|
||||
|
||||
Fixes: #811
|
||||
|
||||
UserNote: Setting the TONE_DETECT dialplan function on a channel
|
||||
in ARI will now cause a ChannelToneDetected ARI event to be raised
|
||||
when the specified tone is detected.
|
||||
|
||||
#### Update version for Asterisk 22
|
||||
Author: Mike Bradeen
|
||||
Date: 2024-08-14
|
||||
|
||||
|
||||
#### stir_shaken: Fix propagation of attest_level and a few other values
|
||||
Author: George Joseph
|
||||
Date: 2024-09-24
|
||||
|
||||
attest_level, send_mky and check_tn_cert_public_url weren't
|
||||
propagating correctly from the attestation object to the profile
|
||||
and tn.
|
||||
|
||||
* In the case of attest_level, the enum needed to be changed
|
||||
so the "0" value (the default) was "NOT_SET" instead of "A". This
|
||||
now allows the merging of the attestation object, profile and tn
|
||||
to detect when a value isn't set and use the higher level value.
|
||||
|
||||
* For send_mky and check_tn_cert_public_url, the tn default was
|
||||
forced to "NO" which always overrode the profile and attestation
|
||||
objects. Their defaults are now "NOT_SET" so the propagation
|
||||
happens correctly.
|
||||
|
||||
* Just to remove some redundant code in tn_config.c, a bunch of calls to
|
||||
generate_sorcery_enum_from_str() and generate_sorcery_enum_to_str() were
|
||||
replaced with a single call to generate_acfg_common_sorcery_handlers().
|
||||
|
||||
Resolves: #904
|
||||
|
||||
#### res_stir_shaken: Remove stale include for jansson.h in verification.c
|
||||
Author: George Joseph
|
||||
Date: 2024-09-17
|
||||
|
||||
verification.c had an include for jansson.h left over from previous
|
||||
versions of the module. Since res_stir_shaken no longer has a
|
||||
dependency on jansson, the bundled version wasn't added to GCC's
|
||||
include path so if you didn't also have a jansson development package
|
||||
installed, the compile would fail. Removing the stale include
|
||||
was the only thing needed.
|
||||
|
||||
Resolves: #889
|
||||
|
||||
#### res_stir_shaken.c: Fix crash when stir_shaken.conf is invalid
|
||||
Author: George Joseph
|
||||
Date: 2024-09-13
|
||||
|
||||
* If the call to ast_config_load() returns CONFIG_STATUS_FILEINVALID,
|
||||
check_for_old_config() now returns LOAD_DECLINE instead of continuing
|
||||
on with a bad pointer.
|
||||
|
||||
* If CONFIG_STATUS_FILEMISSING is returned, check_for_old_config()
|
||||
assumes the config is being loaded from realtime and now returns
|
||||
LOAD_SUCCESS. If it's actually not being loaded from realtime,
|
||||
sorcery will catch that later on.
|
||||
|
||||
* Also refactored the error handling in load_module() a bit.
|
||||
|
||||
Resolves: #884
|
||||
|
||||
#### res_stir_shaken: Check for disabled before param validation
|
||||
Author: George Joseph
|
||||
Date: 2024-09-11
|
||||
|
||||
For both attestation and verification, we now check whether they've
|
||||
been disabled either globally or by the profile before validating
|
||||
things like callerid, orig_tn, dest_tn, etc. This prevents useless
|
||||
error messages.
|
||||
|
||||
Resolves: #879
|
||||
|
||||
#### app_chanspy.c: resolving the issue writing frame to whisper audiohook.
|
||||
Author: Tinet-mucw
|
||||
Date: 2024-09-10
|
||||
|
||||
ChanSpy(${channel}, qEoSw): because flags set o, ast_audiohook_set_frame_feed_direction(audiohook, AST_AUDIOHOOK_DIRECTION_READ); this will effect whisper audiohook and spy audiohook, this makes writing frame to whisper audiohook impossible. So add function start_whispering to starting whisper audiohook.
|
||||
|
||||
Resolves: #876
|
||||
|
||||
#### autoservice: Do not sleep if autoservice_stop is called within autoservice thr..
|
||||
Author: Alexei Gradinari
|
||||
Date: 2024-09-04
|
||||
|
||||
It's possible that ast_autoservice_stop is called within the autoservice thread.
|
||||
In this case the autoservice thread is stuck in an endless sleep.
|
||||
|
||||
To avoid endless sleep ast_autoservice_stop must check that it's not called
|
||||
within the autoservice thread.
|
||||
|
||||
Fixes: #763
|
||||
|
||||
#### res_resolver_unbound: Test for NULL ub_result in unbound_resolver_callback
|
||||
Author: George Joseph
|
||||
Date: 2024-08-12
|
||||
|
||||
The ub_result pointer passed to unbound_resolver_callback by
|
||||
libunbound can be NULL if the query was for something malformed
|
||||
like `.1` or `[.1]`. If it is, we now set a 'ns_r_formerr' result
|
||||
and return instead of crashing with a SEGV. This causes pjproject
|
||||
to simply cancel the transaction with a "No answer record in the DNS
|
||||
response" error. The existing "off nominal" unit test was also
|
||||
updated to check this condition.
|
||||
|
||||
Although not necessary for this fix, we also made
|
||||
ast_dns_resolver_completed() tolerant of a NULL result.
|
||||
|
||||
Resolves: GHSA-v428-g3cw-7hv9
|
||||
|
||||
#### app_voicemail: Use ast_asprintf to create mailbox SQL query
|
||||
Author: George Joseph
|
||||
Date: 2024-09-03
|
||||
|
||||
...instead of trying to calculate the length of the buffer needed
|
||||
manually.
|
||||
|
||||
|
||||
#### res_pjsip_sdp_rtp: Use negotiated DTMF Payload types on bitrate mismatch
|
||||
Author: Mike Bradeen
|
||||
Date: 2024-08-21
|
||||
|
||||
When Asterisk sends an offer to Bob that includes 48K and 8K codecs with
|
||||
matching 4733 offers, Bob may want to use the 48K audio codec but can not
|
||||
accept 48K digits and so negotiates for a mixed set.
|
||||
|
||||
Asterisk will now check Bob's offer to make sure Bob has indicated this is
|
||||
acceptible and if not, will use Bob's preference.
|
||||
|
||||
Fixes: #847
|
||||
|
||||
#### app_chanspy.c: resolving the issue with audiohook direction read
|
||||
Author: Tinet-mucw
|
||||
Date: 2024-08-30
|
||||
|
||||
ChanSpy(${channel}, qEoS): When chanspy spy the direction read, reading frame is often failed when reading direction read audiohook. because chanspy only read audiohook direction read; write_factory_ms will greater than 100ms soon, then ast_slinfactory_flush will being called, then direction read will fail.
|
||||
|
||||
Resolves: #861
|
||||
|
||||
#### security_agreements.c: Refactor the to_str functions and fix a few other bugs
|
||||
Author: George Joseph
|
||||
Date: 2024-08-17
|
||||
|
||||
* A static array of security mechanism type names was created.
|
||||
|
||||
* ast_sip_str_to_security_mechanism_type() was refactored to do
|
||||
a lookup in the new array instead of using fixed "if/else if"
|
||||
statments.
|
||||
|
||||
* security_mechanism_to_str() and ast_sip_security_mechanisms_to_str()
|
||||
were refactored to use ast_str instead of a fixed length buffer
|
||||
to store the result.
|
||||
|
||||
* ast_sip_security_mechanism_type_to_str was removed in favor of
|
||||
just referencing the new type name array. Despite starting with
|
||||
"ast_sip_", it was a static function so removing it doesn't affect
|
||||
ABI.
|
||||
|
||||
* Speaking of "ast_sip_", several other static functions that
|
||||
started with "ast_sip_" were renamed to avoid confusion about
|
||||
their public availability.
|
||||
|
||||
* A few VECTOR free loops were replaced with AST_VECTOR_RESET().
|
||||
|
||||
* Fixed a meomry leak in pjsip_configuration.c endpoint_destructor
|
||||
caused by not calling ast_sip_security_mechanisms_vector_destroy().
|
||||
|
||||
* Fixed a memory leak in res_pjsip_outbound_registration.c
|
||||
add_security_headers() caused by not specifying OBJ_NODATA in
|
||||
an ao2_callback.
|
||||
|
||||
* Fixed a few ao2_callback return code misuses.
|
||||
|
||||
Resolves: #845
|
||||
|
||||
#### res_pjsip_sdp_rtp fix leaking astobj2 ast_format
|
||||
Author: Alexei Gradinari
|
||||
Date: 2024-08-23
|
||||
|
||||
PR #700 added a preferred_format for the struct ast_rtp_codecs,
|
||||
but when set the preferred_format it leaks an astobj2 ast_format.
|
||||
In the next code
|
||||
ast_rtp_codecs_set_preferred_format(&codecs, ast_format_cap_get_format(joint, 0));
|
||||
both functions ast_rtp_codecs_set_preferred_format
|
||||
and ast_format_cap_get_format increases the ao2 reference count.
|
||||
|
||||
Fixes: #856
|
||||
|
||||
#### stir_shaken.conf.sample: Fix bad references to private_key_path
|
||||
Author: George Joseph
|
||||
Date: 2024-08-22
|
||||
|
||||
They should be private_key_file.
|
||||
|
||||
Resolves: #854
|
||||
|
||||
#### res_pjsip_logger.c: Fix 'OPTIONS' tab completion.
|
||||
Author: Sean Bright
|
||||
Date: 2024-08-19
|
||||
|
||||
Fixes #843
|
||||
|
||||
|
||||
#### alembic: Make 'revises' header comment match reality.
|
||||
Author: Sean Bright
|
||||
Date: 2024-08-17
|
||||
|
||||
|
||||
757
ChangeLogs/ChangeLog-22.1.0.md
Normal file
757
ChangeLogs/ChangeLog-22.1.0.md
Normal file
@@ -0,0 +1,757 @@
|
||||
|
||||
## Change Log for Release asterisk-22.1.0
|
||||
|
||||
### Links:
|
||||
|
||||
- [Full ChangeLog](https://downloads.asterisk.org/pub/telephony/asterisk/releases/ChangeLog-22.1.0.md)
|
||||
- [GitHub Diff](https://github.com/asterisk/asterisk/compare/22.0.0...22.1.0)
|
||||
- [Tarball](https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22.1.0.tar.gz)
|
||||
- [Downloads](https://downloads.asterisk.org/pub/telephony/asterisk)
|
||||
|
||||
### Summary:
|
||||
|
||||
- Commits: 39
|
||||
- Commit Authors: 9
|
||||
- Issues Resolved: 22
|
||||
- Security Advisories Resolved: 0
|
||||
|
||||
### User Notes:
|
||||
|
||||
- #### res_pjsip: Add new endpoint option "suppress_moh_on_sendonly"
|
||||
The new "suppress_moh_on_sendonly" endpoint option
|
||||
can be used to prevent playing MOH back to a caller if the remote
|
||||
end sends "sendonly" or "inactive" (hold) to Asterisk in an SDP.
|
||||
|
||||
- #### app_mixmonitor: Add 'D' option for dual-channel audio.
|
||||
The MixMonitor application now has a new 'D' option which
|
||||
interleaves the recorded audio in the output frames. This allows for
|
||||
stereo recording output with one channel being the transmitted audio and
|
||||
the other being the received audio. The 't' and 't' options are
|
||||
compatible with this.
|
||||
|
||||
- #### manager.c: Restrict ModuleLoad to the configured modules directory.
|
||||
The ModuleLoad AMI action now restricts modules to the
|
||||
configured modules directory.
|
||||
|
||||
- #### manager: Enhance event filtering for performance
|
||||
You can now perform more granular filtering on events
|
||||
in manager.conf using expressions like
|
||||
`eventfilter(name(Newchannel),header(Channel),method(starts_with)) = PJSIP/`
|
||||
This is much more efficient than
|
||||
`eventfilter = Event: Newchannel.*Channel: PJSIP/`
|
||||
Full syntax guide is in configs/samples/manager.conf.sample.
|
||||
|
||||
- #### db.c: Remove limit on family/key length
|
||||
The `ast_db_*()` APIs have had the 253 byte limit on
|
||||
"/family/key" removed and will now accept families and keys with a
|
||||
total length of up to SQLITE_MAX_LENGTH (currently 1e9!). This
|
||||
affects the `DB*` dialplan applications, dialplan functions,
|
||||
manager actions and `databse` CLI commands. Since the
|
||||
media_cache also uses the `ast_db_*()` APIs, you can now store
|
||||
resources with URIs longer than 253 bytes.
|
||||
|
||||
|
||||
### Upgrade Notes:
|
||||
|
||||
|
||||
### Commit Authors:
|
||||
|
||||
- Allan Nathanson: (1)
|
||||
- Ben Ford: (3)
|
||||
- Chrsmj: (1)
|
||||
- George Joseph: (15)
|
||||
- Jiangxc: (1)
|
||||
- Naveen Albert: (7)
|
||||
- Peter Jannesen: (2)
|
||||
- Sean Bright: (7)
|
||||
- Thomas Guebels: (2)
|
||||
|
||||
## Issue and Commit Detail:
|
||||
|
||||
### Closed Issues:
|
||||
|
||||
- 487: [bug]: Segfault possibly in ast_rtp_stop
|
||||
- 821: [bug]: app_dial: The progress timeout doesn't cause Dial to exit
|
||||
- 881: [bug]: Long URLs are being rejected by the media cache because of an astdb key length limit
|
||||
- 882: [bug]: Value CHANNEL(userfield) is lost by BRIDGE_ENTER
|
||||
- 897: [improvement]: Restrict ModuleLoad AMI action to the modules directory
|
||||
- 900: [bug]: astfd.c: NULL pointer passed to fclose with nonnull attribute causes compilation failure
|
||||
- 902: [bug]: app_voicemail: Pager emails are ill-formatted when custom subject is used
|
||||
- 916: [bug]: Compilation errors on FreeBSD
|
||||
- 923: [bug]: Transport monitor shutdown callback only works on the first disconnection
|
||||
- 924: [bug]: dnsmgr.c: dnsmgr_refresh() should not flag change if IP address order changes
|
||||
- 928: [bug]: chan_dahdi: MWI while off-hook when hung up on after recall ring
|
||||
- 932: [bug]: When connected to multiple IP addresses the transport monitor is only set on the first one
|
||||
- 937: [bug]: Wrong format for sample config file 'geolocation.conf.sample'
|
||||
- 938: [bug]: memory leak - CBAnn leaks a small amount format_cap related memory for every confbridge
|
||||
- 945: [improvement]: Add stereo recording support for app_mixmonitor
|
||||
- 951: [new-feature]: func_evalexten: Add `EVAL_SUB` function
|
||||
- 974: [improvement]: change and/or remove some wiki mentions to docs mentions in the sample configs
|
||||
- 979: [improvement]: Add ability to suppress MOH when a remote endpoint sends "sendonly" or "inactive"
|
||||
- 982: [bug]: The addition of tenantid to the ast_sip_endpoint structure broke ABI compatibility
|
||||
- 990: [improvement]: The help for PJSIP_AOR should indicate that you need to call PJSIP_CONTACT to get contact details
|
||||
- 995: [bug]: suppress_moh_on_sendonly should use AST_BOOL_VALUES instead of YESNO_VALUES in alembic script
|
||||
|
||||
### Commits By Author:
|
||||
|
||||
- #### Allan Nathanson (1):
|
||||
- dnsmgr.c: dnsmgr_refresh() incorrectly flags change with DNS round-robin
|
||||
|
||||
- #### Ben Ford (3):
|
||||
- manager.c: Restrict ModuleLoad to the configured modules directory.
|
||||
- app_mixmonitor: Add 'D' option for dual-channel audio.
|
||||
- Add res_pjsip_config_sangoma external module.
|
||||
|
||||
- #### George Joseph (15):
|
||||
- db.c: Remove limit on family/key length
|
||||
- manager.c: Split XML documentation to manager_doc.xml
|
||||
- manager: Enhance event filtering for performance
|
||||
- manager.conf.sample: Fix mathcing typo
|
||||
- Fix application references to Background
|
||||
- res_rtp_asterisk: Fix dtls timer issues causing FRACKs and SEGVs
|
||||
- manager.c: Add unit test for Originate app and appdata permissions
|
||||
- geolocation.sample.conf: Fix comment marker at end of file
|
||||
- core_unreal.c: Fix memory leak in ast_unreal_new_channels()
|
||||
- pjproject_bundled: Tweaks to support out-of-tree development
|
||||
- res_srtp: Change Unsupported crypto suite msg from verbose to debug
|
||||
- res_pjsip: Move tenantid to end of ast_sip_endpoint
|
||||
- func_pjsip_aor/contact: Fix documentation for contact ID
|
||||
- res_pjsip: Add new endpoint option "suppress_moh_on_sendonly"
|
||||
- res_pjsip: Change suppress_moh_on_sendonly to OPT_BOOL_T
|
||||
|
||||
- #### Naveen Albert (7):
|
||||
- app_voicemail: Fix ill-formatted pager emails with custom subject.
|
||||
- astfd.c: Avoid calling fclose with NULL argument.
|
||||
- main, res, tests: Fix compilation errors on FreeBSD.
|
||||
- chan_dahdi: Never send MWI while off-hook.
|
||||
- app_dial: Fix progress timeout.
|
||||
- app_dial: Fix progress timeout calculation with no answer timeout.
|
||||
- func_evalexten: Add EVAL_SUB function.
|
||||
|
||||
- #### Peter Jannesen (2):
|
||||
- cel_custom: Allow absolute filenames.
|
||||
- channel: Preserve CHANNEL(userfield) on masquerade.
|
||||
|
||||
- #### Sean Bright (7):
|
||||
- res_pjsip_pubsub: Persist subscription 'generator_data' in sorcery
|
||||
- cdr_custom: Allow absolute filenames.
|
||||
- res_agi.c: Ensure SIGCHLD handler functions are properly balanced.
|
||||
- alembic: Drop redundant voicemail_messages index.
|
||||
- func_base64.c: Ensure we set aside enough room for base64 encoded data.
|
||||
- Revert "res_rtp_asterisk: Count a roll-over of the sequence number even on los..
|
||||
- res_pjsip.c: Fix Contact header rendering for IPv6 addresses.
|
||||
|
||||
- #### Thomas Guebels (2):
|
||||
- pjsip_transport_events: Avoid monitor destruction
|
||||
- pjsip_transport_events: handle multiple addresses for a domain
|
||||
|
||||
- #### chrsmj (1):
|
||||
- samples: remove and/or change some wiki mentions
|
||||
|
||||
- #### jiangxc (1):
|
||||
- res_agi.c: Prevent possible double free during `SPEECH RECOGNIZE`
|
||||
|
||||
|
||||
### Commit List:
|
||||
|
||||
- res_pjsip: Change suppress_moh_on_sendonly to OPT_BOOL_T
|
||||
- res_pjsip: Add new endpoint option "suppress_moh_on_sendonly"
|
||||
- res_pjsip.c: Fix Contact header rendering for IPv6 addresses.
|
||||
- samples: remove and/or change some wiki mentions
|
||||
- func_pjsip_aor/contact: Fix documentation for contact ID
|
||||
- res_pjsip: Move tenantid to end of ast_sip_endpoint
|
||||
- pjsip_transport_events: handle multiple addresses for a domain
|
||||
- func_evalexten: Add EVAL_SUB function.
|
||||
- res_srtp: Change Unsupported crypto suite msg from verbose to debug
|
||||
- Add res_pjsip_config_sangoma external module.
|
||||
- app_mixmonitor: Add 'D' option for dual-channel audio.
|
||||
- pjsip_transport_events: Avoid monitor destruction
|
||||
- app_dial: Fix progress timeout calculation with no answer timeout.
|
||||
- pjproject_bundled: Tweaks to support out-of-tree development
|
||||
- core_unreal.c: Fix memory leak in ast_unreal_new_channels()
|
||||
- dnsmgr.c: dnsmgr_refresh() incorrectly flags change with DNS round-robin
|
||||
- geolocation.sample.conf: Fix comment marker at end of file
|
||||
- func_base64.c: Ensure we set aside enough room for base64 encoded data.
|
||||
- app_dial: Fix progress timeout.
|
||||
- chan_dahdi: Never send MWI while off-hook.
|
||||
- manager.c: Add unit test for Originate app and appdata permissions
|
||||
- alembic: Drop redundant voicemail_messages index.
|
||||
- res_agi.c: Ensure SIGCHLD handler functions are properly balanced.
|
||||
- main, res, tests: Fix compilation errors on FreeBSD.
|
||||
- res_rtp_asterisk: Fix dtls timer issues causing FRACKs and SEGVs
|
||||
- manager.c: Restrict ModuleLoad to the configured modules directory.
|
||||
- res_agi.c: Prevent possible double free during `SPEECH RECOGNIZE`
|
||||
- cdr_custom: Allow absolute filenames.
|
||||
- astfd.c: Avoid calling fclose with NULL argument.
|
||||
- channel: Preserve CHANNEL(userfield) on masquerade.
|
||||
- cel_custom: Allow absolute filenames.
|
||||
- app_voicemail: Fix ill-formatted pager emails with custom subject.
|
||||
- res_pjsip_pubsub: Persist subscription 'generator_data' in sorcery
|
||||
- Fix application references to Background
|
||||
- manager.conf.sample: Fix mathcing typo
|
||||
- manager: Enhance event filtering for performance
|
||||
- manager.c: Split XML documentation to manager_doc.xml
|
||||
- db.c: Remove limit on family/key length
|
||||
|
||||
### Commit Details:
|
||||
|
||||
#### res_pjsip: Change suppress_moh_on_sendonly to OPT_BOOL_T
|
||||
Author: George Joseph
|
||||
Date: 2024-11-15
|
||||
|
||||
The suppress_moh_on_sendonly endpoint option should have been
|
||||
defined as OPT_BOOL_T in pjsip_configuration.c and AST_BOOL_VALUES
|
||||
in the alembic script instead of OPT_YESNO_T and YESNO_VALUES.
|
||||
|
||||
Also updated contrib/ast-db-manage/README.md to indicate that
|
||||
AST_BOOL_VALUES should always be used and provided an example.
|
||||
|
||||
Resolves: #995
|
||||
|
||||
#### res_pjsip: Add new endpoint option "suppress_moh_on_sendonly"
|
||||
Author: George Joseph
|
||||
Date: 2024-11-05
|
||||
|
||||
Normally, when one party in a call sends Asterisk an SDP with
|
||||
a "sendonly" or "inactive" attribute it means "hold" and causes
|
||||
Asterisk to start playing MOH back to the other party. This can be
|
||||
problematic if it happens at certain times, such as in a 183
|
||||
Progress message, because the MOH will replace any early media you
|
||||
may be playing to the calling party. If you set this option
|
||||
to "yes" on an endpoint and the endpoint receives an SDP
|
||||
with "sendonly" or "inactive", Asterisk will NOT play MOH back to
|
||||
the other party.
|
||||
|
||||
Resolves: #979
|
||||
|
||||
UserNote: The new "suppress_moh_on_sendonly" endpoint option
|
||||
can be used to prevent playing MOH back to a caller if the remote
|
||||
end sends "sendonly" or "inactive" (hold) to Asterisk in an SDP.
|
||||
|
||||
|
||||
#### res_pjsip.c: Fix Contact header rendering for IPv6 addresses.
|
||||
Author: Sean Bright
|
||||
Date: 2024-11-08
|
||||
|
||||
Fix suggested by @nvsystems.
|
||||
|
||||
Fixes #985
|
||||
|
||||
|
||||
#### samples: remove and/or change some wiki mentions
|
||||
Author: chrsmj
|
||||
Date: 2024-11-01
|
||||
|
||||
Cleaned some dead links. Replaced word wiki with
|
||||
either docs or link to https://docs.asterisk.org/
|
||||
|
||||
Resolves: #974
|
||||
|
||||
#### func_pjsip_aor/contact: Fix documentation for contact ID
|
||||
Author: George Joseph
|
||||
Date: 2024-11-09
|
||||
|
||||
Clarified the use of the contact ID returned from PJSIP_AOR.
|
||||
|
||||
Resolves: #990
|
||||
|
||||
#### res_pjsip: Move tenantid to end of ast_sip_endpoint
|
||||
Author: George Joseph
|
||||
Date: 2024-11-06
|
||||
|
||||
The tenantid field was originally added to the ast_sip_endpoint
|
||||
structure at the end of the AST_DECLARE_STRING_FIELDS block. This
|
||||
caused everything after it in the structure to move down in memory
|
||||
and break ABI compatibility. It's now at the end of the structure
|
||||
as an AST_STRING_FIELD_EXTENDED. Given the number of string fields
|
||||
in the structure now, the initial string field allocation was
|
||||
also increased from 64 to 128 bytes.
|
||||
|
||||
Resolves: #982
|
||||
|
||||
#### pjsip_transport_events: handle multiple addresses for a domain
|
||||
Author: Thomas Guebels
|
||||
Date: 2024-10-29
|
||||
|
||||
The key used for transport monitors was the remote host name for the
|
||||
transport and not the remote address resolved for this domain.
|
||||
|
||||
This was problematic for domains returning multiple addresses as several
|
||||
transport monitors were created with the same key.
|
||||
|
||||
Whenever a subsystem wanted to register a callback it would always end
|
||||
up attached to the first transport monitor with a matching key.
|
||||
|
||||
The key used for transport monitors is now the remote address and port
|
||||
the transport actually connected to.
|
||||
|
||||
Fixes: #932
|
||||
|
||||
#### func_evalexten: Add EVAL_SUB function.
|
||||
Author: Naveen Albert
|
||||
Date: 2024-10-17
|
||||
|
||||
This adds an EVAL_SUB function, which is similar to the existing
|
||||
EVAL_EXTEN function but significantly more powerful, as it allows
|
||||
executing arbitrary dialplan and capturing its return value as
|
||||
the function's output. While EVAL_EXTEN should be preferred if it
|
||||
is possible to use it, EVAL_SUB can be used in a wider variety
|
||||
of cases and allows arbitrary computation to be performed in
|
||||
a dialplan function call, leveraging the dialplan.
|
||||
|
||||
Resolves: #951
|
||||
|
||||
#### res_srtp: Change Unsupported crypto suite msg from verbose to debug
|
||||
Author: George Joseph
|
||||
Date: 2024-11-01
|
||||
|
||||
There's really no point in spamming logs with a verbose message
|
||||
for every unsupported crypto suite an older client may send
|
||||
in an SDP. If none are supported, there will be an error or
|
||||
warning.
|
||||
|
||||
|
||||
#### Add res_pjsip_config_sangoma external module.
|
||||
Author: Ben Ford
|
||||
Date: 2024-11-01
|
||||
|
||||
Adds res_pjsip_config_sangoma as an external module that can be
|
||||
downloaded via menuselect. It lives under the Resource Modules section.
|
||||
|
||||
|
||||
#### app_mixmonitor: Add 'D' option for dual-channel audio.
|
||||
Author: Ben Ford
|
||||
Date: 2024-10-28
|
||||
|
||||
Adds the 'D' option to app_mixmonitor that interleaves the input and
|
||||
output frames of the channel being recorded in the monitor output frame.
|
||||
This allows for two streams in the recording: the transmitted audio and
|
||||
the received audio. The 't' and 'r' options are compatible with this.
|
||||
|
||||
Fixes: #945
|
||||
|
||||
UserNote: The MixMonitor application now has a new 'D' option which
|
||||
interleaves the recorded audio in the output frames. This allows for
|
||||
stereo recording output with one channel being the transmitted audio and
|
||||
the other being the received audio. The 't' and 't' options are
|
||||
compatible with this.
|
||||
|
||||
|
||||
#### pjsip_transport_events: Avoid monitor destruction
|
||||
Author: Thomas Guebels
|
||||
Date: 2024-10-28
|
||||
|
||||
When a transport is disconnected, several events can arrive following
|
||||
each other. The first event will be PJSIP_TP_STATE_DISCONNECT and it
|
||||
will trigger the destruction of the transport monitor object. The lookup
|
||||
for the transport monitor to destroy is done using the transport key,
|
||||
that contains the transport destination host:port.
|
||||
|
||||
A reconnect attempt by pjsip will be triggered as soon something needs to
|
||||
send a packet using that transport. This can happen directly after a
|
||||
disconnect since ca
|
||||
|
||||
Subsequent events can arrive later like PJSIP_TP_STATE_DESTROY and will
|
||||
also try to trigger the destruction of the transport monitor if not
|
||||
already done. Since the lookup for the transport monitor to destroy is
|
||||
done using the transport key, it can match newly created transports
|
||||
towards the same destination and destroy their monitor object.
|
||||
|
||||
Because of this, it was sometimes not possible to monitor a transport
|
||||
after one or more disconnections.
|
||||
|
||||
This fix adds an additional check on the transport pointer to ensure
|
||||
only a monitor for that specific transport is removed.
|
||||
|
||||
Fixes: #923
|
||||
|
||||
#### app_dial: Fix progress timeout calculation with no answer timeout.
|
||||
Author: Naveen Albert
|
||||
Date: 2024-10-16
|
||||
|
||||
If to_answer is -1, simply comparing to see if the progress timeout
|
||||
is smaller than the answer timeout to prefer it will fail. Add
|
||||
an additional check that chooses the progress timeout if there is
|
||||
no answer timeout (or as before, if the progress timeout is smaller).
|
||||
|
||||
Resolves: #821
|
||||
|
||||
#### pjproject_bundled: Tweaks to support out-of-tree development
|
||||
Author: George Joseph
|
||||
Date: 2024-10-17
|
||||
|
||||
* pjproject is now configured with --disable-libsrtp so it will
|
||||
build correctly when doing "out-of-tree" development. Asterisk
|
||||
doesn't use pjproject for handling media so pjproject doesn't
|
||||
need libsrtp itself.
|
||||
|
||||
* The pjsua app (which we used to use for the testsuite) no longer
|
||||
builds in pjproject's master branch so we just skip it. The
|
||||
testsuite no longer needs it anyway.
|
||||
|
||||
See third-party/pjproject/README-hacking.md for more info on building
|
||||
pjproject "out-of-tree".
|
||||
|
||||
|
||||
#### Revert "res_rtp_asterisk: Count a roll-over of the sequence number even on los..
|
||||
Author: Sean Bright
|
||||
Date: 2024-10-07
|
||||
|
||||
This reverts commit cb5e3445be6c55517c8d05aca601b648341f8ae9.
|
||||
|
||||
The original change from 16 to 15 bit sequence numbers was predicated
|
||||
on the following from the now-defunct libSRTP FAQ on sourceforge.net:
|
||||
|
||||
> *Q6. The use of implicit synchronization via ROC seems
|
||||
> dangerous. Can senders and receivers lose ROC synchronization?*
|
||||
>
|
||||
> **A.** It is possible to lose ROC synchronization between sender and
|
||||
> receiver(s), though it is not likely in practice, and practical
|
||||
> steps can be taken to avoid it. A burst loss of 2^16 packets or more
|
||||
> will always break synchronization. For example, a conversational
|
||||
> voice codec that sends 50 packets per second will have its ROC
|
||||
> increment about every 22 minutes. A network with a burst of packet
|
||||
> loss that long has problems other than ROC synchronization.
|
||||
>
|
||||
> There is a higher sensitivity to loss at the very outset of an SRTP
|
||||
> stream. If the sender's initial sequence number is close to the
|
||||
> maximum value of 2^16-1, and all packets are lost from the initial
|
||||
> packet until the sequence number cycles back to zero, the sender
|
||||
> will increment its ROC, but the receiver will not. The receiver
|
||||
> cannot determine that the initial packets were lost and that
|
||||
> sequence-number rollover has occurred. In this case, the receiver's
|
||||
> ROC would be zero whereas the sender's ROC would be one, while their
|
||||
> sequence numbers would be so close that the ROC-guessing algorithm
|
||||
> could not detect this fact.
|
||||
>
|
||||
> There is a simple solution to this problem: the SRTP sender should
|
||||
> randomly select an initial sequence number that is always less than
|
||||
> 2^15. This ensures correct SRTP operation so long as fewer than 2^15
|
||||
> initial packets are lost in succession, which is within the maximum
|
||||
> tolerance of SRTP packet-index determination (see Appendix A and
|
||||
> page 14, first paragraph of RFC 3711). An SRTP receiver should
|
||||
> carefully implement the index-guessing algorithm. A naive
|
||||
> implementation can unintentionally guess the value of
|
||||
> 0xffffffffffffLL whenever the SEQ in the packet is greater than 2^15
|
||||
> and the locally stored SEQ and ROC are zero. (This can happen when
|
||||
> the implementation fails to treat those zero values as a special
|
||||
> case.)
|
||||
>
|
||||
> When ROC synchronization is lost, the receiver will not be able to
|
||||
> properly process the packets. If anti-replay protection is turned
|
||||
> on, then the desynchronization will appear as a burst of replay
|
||||
> check failures. Otherwise, if authentication is being checked, then
|
||||
> it will appear as a burst of authentication failures. Otherwise, if
|
||||
> encryption is being used, the desynchronization may not be detected
|
||||
> by the SRTP layer, and the packets may be improperly decrypted.
|
||||
|
||||
However, modern libSRTP (as of 1.0.1[1]) now mentions the following in
|
||||
their README.md[2]:
|
||||
|
||||
> The sequence number in the rtp packet is used as the low 16 bits of
|
||||
> the sender's local packet index. Note that RTP will start its
|
||||
> sequence number in a random place, and the SRTP layer just jumps
|
||||
> forward to that number at its first invocation. An earlier version
|
||||
> of this library used initial sequence numbers that are less than
|
||||
> 32,768; this trick is no longer required as the
|
||||
> rdbx_estimate_index(...) function has been made smarter.
|
||||
|
||||
So truncating our initial sequence number to 15 bit is no longer
|
||||
necessary.
|
||||
|
||||
1. https://github.com/cisco/libsrtp/blob/0eb007f0dc611f27cbfe0bf9855ed85182496cec/CHANGES#L271-L289
|
||||
2. https://github.com/cisco/libsrtp/blob/2de20dd9e9c8afbaf02fcf5d4048ce1ec9ddc0ae/README.md#implementation-notes
|
||||
|
||||
|
||||
#### core_unreal.c: Fix memory leak in ast_unreal_new_channels()
|
||||
Author: George Joseph
|
||||
Date: 2024-10-15
|
||||
|
||||
When the channel tech is multistream capable, the reference to
|
||||
chan_topology was passed to the new channel. When the channel tech
|
||||
isn't multistream capable, the reference to chan_topology was never
|
||||
released. "Local" channels are multistream capable so it didn't
|
||||
affect them but the confbridge "CBAnn" and the bridge_media
|
||||
"Recorder" channels are not so they caused a leak every time one
|
||||
of them was created.
|
||||
|
||||
Also added tracing to ast_stream_topology_alloc() and
|
||||
stream_topology_destroy() to assist with debugging.
|
||||
|
||||
Resolves: #938
|
||||
|
||||
#### dnsmgr.c: dnsmgr_refresh() incorrectly flags change with DNS round-robin
|
||||
Author: Allan Nathanson
|
||||
Date: 2024-09-29
|
||||
|
||||
The dnsmgr_refresh() function checks to see if the IP address associated
|
||||
with a name/service has changed. The gotcha is that the ast_get_ip_or_srv()
|
||||
function only returns the first IP address returned by the DNS query. If
|
||||
there are multiple IPs associated with the name and the returned order is
|
||||
not consistent (e.g. with DNS round-robin) then the other IP addresses are
|
||||
not included in the comparison and the entry is flagged as changed even
|
||||
though the IP is still valid.
|
||||
|
||||
Updated the code to check all IP addresses and flag a change only if the
|
||||
original IP is no longer valid.
|
||||
|
||||
Resolves: #924
|
||||
|
||||
#### geolocation.sample.conf: Fix comment marker at end of file
|
||||
Author: George Joseph
|
||||
Date: 2024-10-08
|
||||
|
||||
Resolves: #937
|
||||
|
||||
#### func_base64.c: Ensure we set aside enough room for base64 encoded data.
|
||||
Author: Sean Bright
|
||||
Date: 2024-10-08
|
||||
|
||||
Reported by SingularTricycle on IRC.
|
||||
|
||||
Fixes #940
|
||||
|
||||
|
||||
#### app_dial: Fix progress timeout.
|
||||
Author: Naveen Albert
|
||||
Date: 2024-10-03
|
||||
|
||||
Under some circumstances, the progress timeout feature added in commit
|
||||
320c98eec87c473bfa814f76188a37603ea65ddd does not work as expected,
|
||||
such as if there is no media flowing. Adjust the waitfor call to
|
||||
explicitly use the progress timeout if it would be reached sooner than
|
||||
the answer timeout to ensure we handle the timers properly.
|
||||
|
||||
Resolves: #821
|
||||
|
||||
#### chan_dahdi: Never send MWI while off-hook.
|
||||
Author: Naveen Albert
|
||||
Date: 2024-10-01
|
||||
|
||||
In some circumstances, it is possible for the do_monitor thread to
|
||||
erroneously think that a line is on-hook and send an MWI FSK spill
|
||||
to it when the line is really off-hook and no MWI should be sent.
|
||||
Commit 0a8b3d34673277b70be6b0e8ac50191b1f3c72c6 previously fixed this
|
||||
issue in a more readily encountered scenario, but it has still been
|
||||
possible for MWI to be sent when it shouldn't be. To robustly fix
|
||||
this issue, query DAHDI for the hook status to ensure we don't send
|
||||
MWI on a line that is actually still off hook.
|
||||
|
||||
Resolves: #928
|
||||
|
||||
#### manager.c: Add unit test for Originate app and appdata permissions
|
||||
Author: George Joseph
|
||||
Date: 2024-10-03
|
||||
|
||||
This unit test checks that dialplan apps and app data specified
|
||||
as parameters for the Originate action are allowed with the
|
||||
permissions the user has.
|
||||
|
||||
|
||||
#### alembic: Drop redundant voicemail_messages index.
|
||||
Author: Sean Bright
|
||||
Date: 2024-09-26
|
||||
|
||||
The `voicemail_messages_dir` index is a left prefix of the table's
|
||||
primary key and therefore unnecessary.
|
||||
|
||||
|
||||
#### res_agi.c: Ensure SIGCHLD handler functions are properly balanced.
|
||||
Author: Sean Bright
|
||||
Date: 2024-09-30
|
||||
|
||||
Calls to `ast_replace_sigchld()` and `ast_unreplace_sigchld()` must be
|
||||
balanced to ensure that we can capture the exit status of child
|
||||
processes when we need to. This extends to functions that call
|
||||
`ast_replace_sigchld()` and `ast_unreplace_sigchld()` such as
|
||||
`ast_safe_fork()` and `ast_safe_fork_cleanup()`.
|
||||
|
||||
The primary change here is ensuring that we do not call
|
||||
`ast_safe_fork_cleanup()` in `res_agi.c` if we have not previously
|
||||
called `ast_safe_fork()`.
|
||||
|
||||
Additionally we reinforce some of the documentation and add an
|
||||
assertion to, ideally, catch this sooner were this to happen again.
|
||||
|
||||
Fixes #922
|
||||
|
||||
|
||||
#### main, res, tests: Fix compilation errors on FreeBSD.
|
||||
Author: Naveen Albert
|
||||
Date: 2024-09-29
|
||||
|
||||
asterisk.c, manager.c: Increase buffer sizes to avoid truncation warnings.
|
||||
config.c: Include header file for WIFEXITED/WEXITSTATUS macros.
|
||||
res_timing_kqueue: Use more portable format specifier.
|
||||
test_crypto: Use non-linux limits.h header file.
|
||||
|
||||
Resolves: #916
|
||||
|
||||
#### res_rtp_asterisk: Fix dtls timer issues causing FRACKs and SEGVs
|
||||
Author: George Joseph
|
||||
Date: 2024-09-16
|
||||
|
||||
In dtls_srtp_handle_timeout(), when DTLSv1_get_timeout() returned
|
||||
success but with a timeout of 0, we were stopping the timer and
|
||||
decrementing the refcount on instance but not resetting the
|
||||
timeout_timer to -1. When dtls_srtp_stop_timeout_timer()
|
||||
was later called, it was atempting to stop a stale timer and could
|
||||
decrement the refcount on instance again which would then cause
|
||||
the instance destructor to run early. This would result in either
|
||||
a FRACK or a SEGV when ast_rtp_stop(0 was called.
|
||||
|
||||
According to the OpenSSL docs, we shouldn't have been stopping the
|
||||
timer when DTLSv1_get_timeout() returned success and the new timeout
|
||||
was 0 anyway. We should have been calling DTLSv1_handle_timeout()
|
||||
again immediately so we now reschedule the timer callback for
|
||||
1ms (almost immediately).
|
||||
|
||||
Additionally, instead of scheduling the timer callback at a fixed
|
||||
interval returned by the initial call to DTLSv1_get_timeout()
|
||||
(usually 999 ms), we now reschedule the next callback based on
|
||||
the last call to DTLSv1_get_timeout().
|
||||
|
||||
Resolves: #487
|
||||
|
||||
#### manager.c: Restrict ModuleLoad to the configured modules directory.
|
||||
Author: Ben Ford
|
||||
Date: 2024-09-25
|
||||
|
||||
When using the ModuleLoad AMI action, it was possible to traverse
|
||||
upwards through the directories to files outside of the configured
|
||||
modules directory. We decided it would be best to restrict access to
|
||||
modules exclusively in the configured directory. You will now get an
|
||||
error when the specified module is outside of this limitation.
|
||||
|
||||
Fixes: #897
|
||||
|
||||
UserNote: The ModuleLoad AMI action now restricts modules to the
|
||||
configured modules directory.
|
||||
|
||||
|
||||
#### res_agi.c: Prevent possible double free during `SPEECH RECOGNIZE`
|
||||
Author: jiangxc
|
||||
Date: 2024-07-17
|
||||
|
||||
When using the speech recognition module, crashes can occur
|
||||
sporadically due to a "double free or corruption (out)" error. Now, in
|
||||
the section where the audio stream is being captured in a loop, each
|
||||
time after releasing fr, it is set to NULL to prevent repeated
|
||||
deallocation.
|
||||
|
||||
Fixes #772
|
||||
|
||||
|
||||
#### cdr_custom: Allow absolute filenames.
|
||||
Author: Sean Bright
|
||||
Date: 2024-09-26
|
||||
|
||||
A follow up to #893 that brings the same functionality to
|
||||
cdr_custom. Also update the sample configuration files to note support
|
||||
for absolute paths.
|
||||
|
||||
|
||||
#### astfd.c: Avoid calling fclose with NULL argument.
|
||||
Author: Naveen Albert
|
||||
Date: 2024-09-24
|
||||
|
||||
Don't pass through a NULL argument to fclose, which is undefined
|
||||
behavior, and instead return -1 and set errno appropriately. This
|
||||
also avoids a compiler warning with glibc 2.38 and newer, as glibc
|
||||
commit 71d9e0fe766a3c22a730995b9d024960970670af
|
||||
added the nonnull attribute to this argument.
|
||||
|
||||
Resolves: #900
|
||||
|
||||
#### channel: Preserve CHANNEL(userfield) on masquerade.
|
||||
Author: Peter Jannesen
|
||||
Date: 2024-09-20
|
||||
|
||||
In certain circumstances a channel may undergo an operation
|
||||
referred to as a masquerade. If this occurs the CHANNEL(userfield)
|
||||
value was not preserved causing it to get lost. This change makes
|
||||
it so that this field is now preserved.
|
||||
|
||||
Fixes: #882
|
||||
|
||||
#### cel_custom: Allow absolute filenames.
|
||||
Author: Peter Jannesen
|
||||
Date: 2024-09-20
|
||||
|
||||
If a filename starts with a '/' in cel_custom [mappings] assume it is
|
||||
a absolute file path and not relative filename/path to
|
||||
AST_LOG_DIR/cel_custom/
|
||||
|
||||
|
||||
#### app_voicemail: Fix ill-formatted pager emails with custom subject.
|
||||
Author: Naveen Albert
|
||||
Date: 2024-09-24
|
||||
|
||||
Add missing end-of-headers newline to pager emails with custom
|
||||
subjects, since this was missing from this code path.
|
||||
|
||||
Resolves: #902
|
||||
|
||||
#### res_pjsip_pubsub: Persist subscription 'generator_data' in sorcery
|
||||
Author: Sean Bright
|
||||
Date: 2024-09-23
|
||||
|
||||
Fixes #895
|
||||
|
||||
|
||||
#### Fix application references to Background
|
||||
Author: George Joseph
|
||||
Date: 2024-09-20
|
||||
|
||||
The app is actually named "BackGround" but several references
|
||||
in XML documentation were spelled "Background" with the lower
|
||||
case "g". This was causing documentation links to return
|
||||
"not found" messages.
|
||||
|
||||
|
||||
#### manager.conf.sample: Fix mathcing typo
|
||||
Author: George Joseph
|
||||
Date: 2024-09-24
|
||||
|
||||
|
||||
#### manager: Enhance event filtering for performance
|
||||
Author: George Joseph
|
||||
Date: 2024-07-31
|
||||
|
||||
UserNote: You can now perform more granular filtering on events
|
||||
in manager.conf using expressions like
|
||||
`eventfilter(name(Newchannel),header(Channel),method(starts_with)) = PJSIP/`
|
||||
This is much more efficient than
|
||||
`eventfilter = Event: Newchannel.*Channel: PJSIP/`
|
||||
Full syntax guide is in configs/samples/manager.conf.sample.
|
||||
|
||||
|
||||
#### manager.c: Split XML documentation to manager_doc.xml
|
||||
Author: George Joseph
|
||||
Date: 2024-08-01
|
||||
|
||||
|
||||
#### db.c: Remove limit on family/key length
|
||||
Author: George Joseph
|
||||
Date: 2024-09-11
|
||||
|
||||
Consumers like media_cache have been running into issues with
|
||||
the previous astdb "/family/key" limit of 253 bytes when needing
|
||||
to store things like long URIs. An Amazon S3 URI is a good example
|
||||
of this. Now, instead of using a static 256 byte buffer for
|
||||
"/family/key", we use ast_asprintf() to dynamically create it.
|
||||
|
||||
Both test_db.c and test_media_cache.c were also updated to use
|
||||
keys/URIs over the old 253 character limit.
|
||||
|
||||
Resolves: #881
|
||||
|
||||
UserNote: The `ast_db_*()` APIs have had the 253 byte limit on
|
||||
"/family/key" removed and will now accept families and keys with a
|
||||
total length of up to SQLITE_MAX_LENGTH (currently 1e9!). This
|
||||
affects the `DB*` dialplan applications, dialplan functions,
|
||||
manager actions and `databse` CLI commands. Since the
|
||||
media_cache also uses the `ast_db_*()` APIs, you can now store
|
||||
resources with URIs longer than 253 bytes.
|
||||
|
||||
|
||||
65
ChangeLogs/ChangeLog-22.1.1.md
Normal file
65
ChangeLogs/ChangeLog-22.1.1.md
Normal file
@@ -0,0 +1,65 @@
|
||||
|
||||
## Change Log for Release asterisk-22.1.1
|
||||
|
||||
### Links:
|
||||
|
||||
- [Full ChangeLog](https://downloads.asterisk.org/pub/telephony/asterisk/releases/ChangeLog-22.1.1.md)
|
||||
- [GitHub Diff](https://github.com/asterisk/asterisk/compare/22.1.0...22.1.1)
|
||||
- [Tarball](https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22.1.1.tar.gz)
|
||||
- [Downloads](https://downloads.asterisk.org/pub/telephony/asterisk)
|
||||
|
||||
### Summary:
|
||||
|
||||
- Commits: 1
|
||||
- Commit Authors: 1
|
||||
- Issues Resolved: 0
|
||||
- Security Advisories Resolved: 1
|
||||
- [GHSA-33x6-fj46-6rfh](https://github.com/asterisk/asterisk/security/advisories/GHSA-33x6-fj46-6rfh): Path traversal via AMI ListCategories allows access to outside files
|
||||
|
||||
### User Notes:
|
||||
|
||||
- #### manager.c: Restrict ListCategories to the configuration directory.
|
||||
The ListCategories AMI action now restricts files to the
|
||||
configured configuration directory.
|
||||
|
||||
|
||||
### Upgrade Notes:
|
||||
|
||||
|
||||
### Commit Authors:
|
||||
|
||||
- Ben Ford: (1)
|
||||
|
||||
## Issue and Commit Detail:
|
||||
|
||||
### Closed Issues:
|
||||
|
||||
- !GHSA-33x6-fj46-6rfh: Path traversal via AMI ListCategories allows access to outside files
|
||||
|
||||
### Commits By Author:
|
||||
|
||||
- #### Ben Ford (1):
|
||||
- manager.c: Restrict ListCategories to the configuration directory.
|
||||
|
||||
|
||||
### Commit List:
|
||||
|
||||
- manager.c: Restrict ListCategories to the configuration directory.
|
||||
|
||||
### Commit Details:
|
||||
|
||||
#### manager.c: Restrict ListCategories to the configuration directory.
|
||||
Author: Ben Ford
|
||||
Date: 2024-12-17
|
||||
|
||||
When using the ListCategories AMI action, it was possible to traverse
|
||||
upwards through the directories to files outside of the configured
|
||||
configuration directory. This action is now restricted to the configured
|
||||
directory and an error will now be returned if the specified file is
|
||||
outside of this limitation.
|
||||
|
||||
Resolves: #GHSA-33x6-fj46-6rfh
|
||||
|
||||
UserNote: The ListCategories AMI action now restricts files to the
|
||||
configured configuration directory.
|
||||
|
||||
1093
ChangeLogs/ChangeLog-22.2.0.md
Normal file
1093
ChangeLogs/ChangeLog-22.2.0.md
Normal file
File diff suppressed because it is too large
Load Diff
562
ChangeLogs/ChangeLog-22.3.0.html
Normal file
562
ChangeLogs/ChangeLog-22.3.0.html
Normal file
@@ -0,0 +1,562 @@
|
||||
<html><head><title>ChangeLog for asterisk-22.3.0</title></head><body>
|
||||
<h2>Change Log for Release asterisk-22.3.0</h2>
|
||||
<h3>Links:</h3>
|
||||
<ul>
|
||||
<li><a href="https://downloads.asterisk.org/pub/telephony/asterisk/releases/ChangeLog-22.3.0.html">Full ChangeLog</a> </li>
|
||||
<li><a href="https://github.com/asterisk/asterisk/compare/22.2.0...22.3.0">GitHub Diff</a> </li>
|
||||
<li><a href="https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22.3.0.tar.gz">Tarball</a> </li>
|
||||
<li><a href="https://downloads.asterisk.org/pub/telephony/asterisk">Downloads</a> </li>
|
||||
</ul>
|
||||
<h3>Summary:</h3>
|
||||
<ul>
|
||||
<li>Commits: 28</li>
|
||||
<li>Commit Authors: 12</li>
|
||||
<li>Issues Resolved: 12</li>
|
||||
<li>Security Advisories Resolved: 0</li>
|
||||
</ul>
|
||||
<h3>User Notes:</h3>
|
||||
<ul>
|
||||
<li>
|
||||
<h4>ari/pjsip: Make it possible to control transfers through ARI</h4>
|
||||
Call transfers on the PJSIP channel can now be controlled by
|
||||
ARI. This can be enabled by using the PJSIP_TRANSFER_HANDLING(ari-only)
|
||||
dialplan function.</li>
|
||||
</ul>
|
||||
<h3>Upgrade Notes:</h3>
|
||||
<h3>Commit Authors:</h3>
|
||||
<ul>
|
||||
<li>Allan Nathanson: (1)</li>
|
||||
<li>Ben Ford: (1)</li>
|
||||
<li>Fabriziopicconi: (1)</li>
|
||||
<li>George Joseph: (10)</li>
|
||||
<li>Holger Hans Peter Freyther: (1)</li>
|
||||
<li>Jeremy Lainé: (1)</li>
|
||||
<li>Joshua Elson: (1)</li>
|
||||
<li>Luz Paz: (3)</li>
|
||||
<li>Maximilian Fridrich: (1)</li>
|
||||
<li>Mike Bradeen: (1)</li>
|
||||
<li>Naveen Albert: (1)</li>
|
||||
<li>Sean Bright: (6)</li>
|
||||
</ul>
|
||||
<h2>Issue and Commit Detail:</h2>
|
||||
<h3>Closed Issues:</h3>
|
||||
<ul>
|
||||
<li>211: [bug]: stasis: Off-nominal channel leave causes bridge to be destroyed</li>
|
||||
<li>1085: [bug]: utils: Compilation failure with DEVMODE due to old-style definitions</li>
|
||||
<li>1101: [bug]: when setting a var with a double quotes and using Set(HASH)</li>
|
||||
<li>1109: [bug]: Off nominal memory leak in res/ari/resource_channels.c</li>
|
||||
<li>1112: [bug]: STIR/SHAKEN verification doesn't allow anonymous callerid to be passed to the dialplan.</li>
|
||||
<li>1119: [bug]: Realtime database not working after upgrade from 22.0.0 to 22.2.0</li>
|
||||
<li>1122: Need status on CVE-2024-57520 claim.</li>
|
||||
<li>1124: [bug]: Race condition between bridge and channel delete can over-write cause code set in hangup.</li>
|
||||
<li>1131: [bug]: CHANGES link broken in README.md</li>
|
||||
<li>1135: [bug]: Problems with video decoding due to RTP marker bit set</li>
|
||||
<li>1149: [bug]: res_pjsip: Mismatch in tcp_keepalive_enable causes not to enable</li>
|
||||
<li>1164: [bug]: WARNING Message in messages.log for res_curl.conf [globals]</li>
|
||||
</ul>
|
||||
<h3>Commits By Author:</h3>
|
||||
<ul>
|
||||
<li>
|
||||
<h4>Allan Nathanson (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>config.c: #include of non-existent file should not crash</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Ben Ford (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>documentation: Update Gosub, Goto, and add new documentationtype.</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>George Joseph (10):</h4>
|
||||
</li>
|
||||
<li>docs: Add version information to ARI resources and methods.</li>
|
||||
<li>docs: Add version information to AGI command XML elements.</li>
|
||||
<li>func_strings.c: Prevent SEGV in HASH single-argument mode.</li>
|
||||
<li>resource_channels.c: Fix memory leak in ast_ari_channels_external_media.</li>
|
||||
<li>res_stir_shaken: Allow missing or anonymous CID to continue to the dialplan.</li>
|
||||
<li>res_config_pgsql: Fix regression that removed dbname config.</li>
|
||||
<li>bridging: Fix multiple bridging issues causing SEGVs and FRACKs.</li>
|
||||
<li>swagger_model.py: Fix invalid escape sequence in get_list_parameter_type().</li>
|
||||
<li>manager.c: Check for restricted file in action_createconfig.</li>
|
||||
<li>
|
||||
<p>README.md: Updates and Fixes</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Holger Hans Peter Freyther (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>ari/pjsip: Make it possible to control transfers through ARI</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Jeremy Lainé (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>docs: Fix minor typo in MixMonitor AMI action</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Joshua Elson (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>fix: Correct default flag for tcp_keepalive_enable option</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Luz Paz (3):</h4>
|
||||
</li>
|
||||
<li>docs: Fix various typos in main/ Found via `codespell -q 3 -S "./CREDITS" -L a..</li>
|
||||
<li>docs: Fix various typos in channels/ Found via `codespell -q 3 -S "./CREDITS,*..</li>
|
||||
<li>
|
||||
<p>docs: Fix typos in cdr/ Found via codespell</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Maximilian Fridrich (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>Revert "res_rtp_asterisk.c: Set Mark on rtp when timestamp skew is too big"</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Mike Bradeen (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>bridge_channel: don't set cause code on channel during bridge delete if alread..</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Naveen Albert (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>utils: Disable old style definition warnings for libdb.</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Sean Bright (6):</h4>
|
||||
</li>
|
||||
<li>docs: Indent <since> tags.</li>
|
||||
<li>channel.c: Remove dead AST_GENERATOR_FD code.</li>
|
||||
<li>res_rtp_asterisk.c: Use correct timeout value for T.140 RED timer.</li>
|
||||
<li>docs: AMI documentation fixes.</li>
|
||||
<li>res_rtp_asterisk.c: Don't truncate spec-compliant <code>ice-ufrag</code> or <code>ice-pwd</code>.</li>
|
||||
<li>
|
||||
<p>res_config_curl.c: Remove unnecessary warnings.</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>fabriziopicconi (1):</h4>
|
||||
</li>
|
||||
<li>rtp.conf.sample: Correct stunaddr example.</li>
|
||||
</ul>
|
||||
<h3>Commit List:</h3>
|
||||
<ul>
|
||||
<li>documentation: Update Gosub, Goto, and add new documentationtype.</li>
|
||||
<li>res_config_curl.c: Remove unnecessary warnings.</li>
|
||||
<li>README.md: Updates and Fixes</li>
|
||||
<li>res_rtp_asterisk.c: Don't truncate spec-compliant <code>ice-ufrag</code> or <code>ice-pwd</code>.</li>
|
||||
<li>fix: Correct default flag for tcp_keepalive_enable option</li>
|
||||
<li>docs: AMI documentation fixes.</li>
|
||||
<li>config.c: #include of non-existent file should not crash</li>
|
||||
<li>manager.c: Check for restricted file in action_createconfig.</li>
|
||||
<li>swagger_model.py: Fix invalid escape sequence in get_list_parameter_type().</li>
|
||||
<li>Revert "res_rtp_asterisk.c: Set Mark on rtp when timestamp skew is too big"</li>
|
||||
<li>res_rtp_asterisk.c: Use correct timeout value for T.140 RED timer.</li>
|
||||
<li>docs: Fix typos in cdr/ Found via codespell</li>
|
||||
<li>bridging: Fix multiple bridging issues causing SEGVs and FRACKs.</li>
|
||||
<li>res_config_pgsql: Fix regression that removed dbname config.</li>
|
||||
<li>res_stir_shaken: Allow missing or anonymous CID to continue to the dialplan.</li>
|
||||
<li>resource_channels.c: Fix memory leak in ast_ari_channels_external_media.</li>
|
||||
<li>ari/pjsip: Make it possible to control transfers through ARI</li>
|
||||
<li>channel.c: Remove dead AST_GENERATOR_FD code.</li>
|
||||
<li>func_strings.c: Prevent SEGV in HASH single-argument mode.</li>
|
||||
<li>docs: Add version information to AGI command XML elements.</li>
|
||||
<li>docs: Fix minor typo in MixMonitor AMI action</li>
|
||||
<li>utils: Disable old style definition warnings for libdb.</li>
|
||||
<li>rtp.conf.sample: Correct stunaddr example.</li>
|
||||
<li>docs: Add version information to ARI resources and methods.</li>
|
||||
<li>docs: Indent <since> tags.</li>
|
||||
</ul>
|
||||
<h3>Commit Details:</h3>
|
||||
<h4>documentation: Update Gosub, Goto, and add new documentationtype.</h4>
|
||||
<p>Author: Ben Ford
|
||||
Date: 2025-03-14</p>
|
||||
<p>Gosub and Goto were not displaying their syntax correctly on the docs
|
||||
site. This change adds a new way to specify an optional context, an
|
||||
optional extension, and a required priority that the xml stylesheet can
|
||||
parse without having to know which optional parameters come in which
|
||||
order. In Asterisk, it looks like this:</p>
|
||||
<pre><code>parameter name="context" documentationtype="dialplan_context"
|
||||
parameter name="extension" documentationtype="dialplan_extension"
|
||||
parameter name="priority" documentationtype="dialplan_priority" required="true"
|
||||
</code></pre>
|
||||
<p>The stylesheet will ignore the context and extension parameters, but for
|
||||
priority, it will automatically inject the following:</p>
|
||||
<pre><code>[[context,]extension,]priority
|
||||
</code></pre>
|
||||
<p>This is the correct oder for applications such as Gosub and Goto.</p>
|
||||
<h4>res_config_curl.c: Remove unnecessary warnings.</h4>
|
||||
<p>Author: Sean Bright
|
||||
Date: 2025-03-17</p>
|
||||
<p>Resolves: #1164</p>
|
||||
<h4>README.md: Updates and Fixes</h4>
|
||||
<p>Author: George Joseph
|
||||
Date: 2025-03-05</p>
|
||||
<ul>
|
||||
<li>Outdated information has been removed.</li>
|
||||
<li>New links added.</li>
|
||||
<li>Placeholder added for link to change logs.</li>
|
||||
</ul>
|
||||
<p>Going forward, the release process will create HTML versions of the README
|
||||
and change log and will update the link in the README to the current
|
||||
change log for the branch...</p>
|
||||
<ul>
|
||||
<li>In the development branches, the link will always point to the current
|
||||
release on GitHub.</li>
|
||||
<li>In the "releases/*" branches and the tarballs, the link will point to the
|
||||
ChangeLogs/ChangeLog-<version>.html file in the source directory.</li>
|
||||
<li>On the downloads website, the link will point to the
|
||||
ChangeLog-<version>.html file in the same directory.</li>
|
||||
</ul>
|
||||
<p>Resolves: #1131</p>
|
||||
<h4>res_rtp_asterisk.c: Don't truncate spec-compliant <code>ice-ufrag</code> or <code>ice-pwd</code>.</h4>
|
||||
<p>Author: Sean Bright
|
||||
Date: 2025-03-07</p>
|
||||
<p>RFC 8839[1] indicates that the <code>ice-ufrag</code> and <code>ice-pwd</code> attributes
|
||||
can be up to 256 bytes long. While we don't generate values of that
|
||||
size, we should be able to accomodate them without truncating.</p>
|
||||
<ol>
|
||||
<li>https://www.rfc-editor.org/rfc/rfc8839#name-ice-ufrag-and-ice-pwd-attri</li>
|
||||
</ol>
|
||||
<h4>fix: Correct default flag for tcp_keepalive_enable option</h4>
|
||||
<p>Author: Joshua Elson
|
||||
Date: 2025-03-06</p>
|
||||
<p>Resolves an issue where the tcp_keepalive_enable option was not properly enabled in the sample configuration due to an incorrect default flag setting.</p>
|
||||
<p>Fixes: #1149</p>
|
||||
<h4>docs: AMI documentation fixes.</h4>
|
||||
<p>Author: Sean Bright
|
||||
Date: 2025-02-18</p>
|
||||
<p>Most of this patch is adding missing PJSIP-related event
|
||||
documentation, but the one functional change was adding a sorcery
|
||||
to-string handler for endpoint's <code>redirect_method</code> which was not
|
||||
showing up in the AMI event details or <code>pjsip show endpoint
|
||||
<endpoint></code> output.</p>
|
||||
<p>The rest of the changes are summarized below:</p>
|
||||
<ul>
|
||||
<li>app_agent_pool.c: Typo fix Epoche -> Epoch.</li>
|
||||
<li>stasis_bridges.c: Add missing AttendedTransfer properties.</li>
|
||||
<li>stasis_channels.c: Add missing AgentLogoff properties.</li>
|
||||
<li>pjsip_manager.xml:<ul>
|
||||
<li>Add missing AorList properties.</li>
|
||||
<li>Add missing AorDetail properties.</li>
|
||||
<li>Add missing ContactList properties.</li>
|
||||
<li>Add missing ContactStatusDetail properties.</li>
|
||||
<li>Add missing EventDetail properties.</li>
|
||||
<li>Add missing AuthList properties.</li>
|
||||
<li>Add missing AuthDetail properties.</li>
|
||||
<li>Add missing TransportDetail properties.</li>
|
||||
<li>Add missing EndpointList properties.</li>
|
||||
<li>Add missing IdentifyDetail properties.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>res_pjsip_registrar.c: Add missing InboundRegistrationDetail documentation.</li>
|
||||
<li>res_pjsip_pubsub.c:<ul>
|
||||
<li>Add missing ResourceListDetail documentation.</li>
|
||||
<li>Add missing InboundSubscriptionDetail documentation.</li>
|
||||
<li>Add missing OutboundSubscriptionDetail documentation.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>res_pjsip_outbound_registration.c: Add missing OutboundRegistrationDetail documentation.</li>
|
||||
</ul>
|
||||
<h4>config.c: #include of non-existent file should not crash</h4>
|
||||
<p>Author: Allan Nathanson
|
||||
Date: 2025-03-03</p>
|
||||
<p>Corrects a segmentation fault when a configuration file has a #include
|
||||
statement that referenced a file that does not exist.</p>
|
||||
<p>Resolves: https://github.com/asterisk/asterisk/issues/1139</p>
|
||||
<h4>manager.c: Check for restricted file in action_createconfig.</h4>
|
||||
<p>Author: George Joseph
|
||||
Date: 2025-03-03</p>
|
||||
<p>The <code>CreateConfig</code> manager action now ensures that a config file can
|
||||
only be created in the AST_CONFIG_DIR unless <code>live_dangerously</code> is set.</p>
|
||||
<p>Resolves: #1122</p>
|
||||
<h4>swagger_model.py: Fix invalid escape sequence in get_list_parameter_type().</h4>
|
||||
<p>Author: George Joseph
|
||||
Date: 2025-03-04</p>
|
||||
<p>Recent python versions complain when backslashes in strings create invalid
|
||||
escape sequences. This causes issues for strings used as regex patterns like
|
||||
<code>'^List\[(.*)\]$'</code> where you want the regex parser to treat <code>[</code> and <code>]</code>
|
||||
as literals. Double-backslashing is one way to fix it but simply converting
|
||||
the string to a raw string <code>re.match(r'^List\[(.*)\]$', text)</code> is easier
|
||||
and less error prone.</p>
|
||||
<h4>Revert "res_rtp_asterisk.c: Set Mark on rtp when timestamp skew is too big"</h4>
|
||||
<p>Author: Maximilian Fridrich
|
||||
Date: 2025-02-28</p>
|
||||
<p>This reverts commit f30ad96b3f467739c38ff415e80bffc4afff1da7.</p>
|
||||
<p>The original change was not RFC compliant and caused issues because it
|
||||
set the RTP marker bit in cases when it shouldn't be set. See the
|
||||
linked issue #1135 for a detailed explanation.</p>
|
||||
<p>Fixes: #1135.</p>
|
||||
<h4>res_rtp_asterisk.c: Use correct timeout value for T.140 RED timer.</h4>
|
||||
<p>Author: Sean Bright
|
||||
Date: 2025-02-24</p>
|
||||
<p>Found while reviewing #1128</p>
|
||||
<h4>docs: Fix typos in cdr/ Found via codespell</h4>
|
||||
<p>Author: Luz Paz
|
||||
Date: 2025-02-12</p>
|
||||
<h4>docs: Fix various typos in channels/ Found via `codespell -q 3 -S "./CREDITS,*..</h4>
|
||||
<p>Author: Luz Paz
|
||||
Date: 2025-02-04</p>
|
||||
<h4>docs: Fix various typos in main/ Found via `codespell -q 3 -S "./CREDITS" -L a..</h4>
|
||||
<p>Author: Luz Paz
|
||||
Date: 2025-02-04</p>
|
||||
<h4>bridging: Fix multiple bridging issues causing SEGVs and FRACKs.</h4>
|
||||
<p>Author: George Joseph
|
||||
Date: 2025-01-22</p>
|
||||
<p>Issues:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>The bridging core allowed multiple bridges to be created with the same
|
||||
unique bridgeId at the same time. Only the last bridge created with the
|
||||
duplicate name was actually saved to the core bridges container.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The bridging core was creating a stasis topic for the bridge and saving it
|
||||
in the bridge->topic field but not increasing its reference count. In the
|
||||
case where two bridges were created with the same uniqueid (which is also
|
||||
the topic name), the second bridge would get the <em>existing</em> topic the first
|
||||
bridge created. When the first bridge was destroyed, it would take the
|
||||
topic with it so when the second bridge attempted to publish a message to
|
||||
it it either FRACKed or SEGVd.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The bridge destructor, which also destroys the bridge topic, is run from the
|
||||
bridge manager thread not the caller's thread. This makes it possible for
|
||||
an ARI developer to create a new one with the same uniqueid believing the
|
||||
old one was destroyed when, in fact, the old one's destructor hadn't
|
||||
completed. This could cause the new bridge to get the old one's topic just
|
||||
before the topic was destroyed. When the new bridge attempted to publish
|
||||
a message on that topic, asterisk could either FRACK or SEGV.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The ARI bridges resource also allowed multiple bridges to be created with
|
||||
the same uniqueid but it kept the duplicate bridges in its app_bridges
|
||||
container. This created a situation where if you added two bridges with
|
||||
the same "bridge1" uniqueid, all operations on "bridge1" were performed on
|
||||
the first bridge created and the second was basically orphaned. If you
|
||||
attempted to delete what you thought was the second bridge, you actually
|
||||
deleted the first one created.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>Changes:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>A new API <code>ast_bridge_topic_exists(uniqueid)</code> was created to determine if
|
||||
a topic already exists for a bridge.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><code>bridge_base_init()</code> in bridge.c and <code>ast_ari_bridges_create()</code> in
|
||||
resource_bridges.c now call <code>ast_bridge_topic_exists(uniqueid)</code> to check
|
||||
if a bridge with the requested uniqueid already exists and will fail if it
|
||||
does.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><code>bridge_register()</code> in bridges.c now checks the core bridges container to
|
||||
make sure a bridge doesn't already exist with the requested uniqueid.
|
||||
Although most callers of <code>bridge_register()</code> will have already called
|
||||
<code>bridge_base_init()</code>, which will now fail on duplicate bridges, there
|
||||
is no guarantee of this so we must check again.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The core bridges container allocation was changed to reject duplicate
|
||||
uniqueids instead of silently replacing an existing one. This is a "belt
|
||||
and suspenders" check.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>A global mutex was added to bridge.c to prevent concurrent calls to
|
||||
<code>bridge_base_init()</code> and <code>bridge_register()</code>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Even though you can no longer create multiple bridges with the same uniqueid
|
||||
at the same time, it's still possible that the bridge topic might be
|
||||
destroyed while a second bridge with the same uniqueid was trying to use
|
||||
it. To address this, the bridging core now increments the reference count
|
||||
on bridge->topic when a bridge is created and decrements it when the
|
||||
bridge is destroyed.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><code>bridge_create_common()</code> in res_stasis.c now checks the stasis app_bridges
|
||||
container to make sure a bridge with the requested uniqueid doesn't already
|
||||
exist. This may seem like overkill but there are so many entrypoints to
|
||||
bridge creation that we need to be safe and catch issues as soon in the
|
||||
process as possible.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The stasis app_bridges container allocation was changed to reject duplicate
|
||||
uniqueids instead of adding them. This is a "belt and suspenders" check.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The <code>bridge show all</code> CLI command now shows the bridge name as well as the
|
||||
bridge id.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Response code 409 "Conflict" was added as a possible response from the ARI
|
||||
bridge create resources to signal that a bridge with the requested uniqueid
|
||||
already exists.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Additional debugging was added to multiple bridging and stasis files.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>Resolves: #211</p>
|
||||
<h4>bridge_channel: don't set cause code on channel during bridge delete if alread..</h4>
|
||||
<p>Author: Mike Bradeen
|
||||
Date: 2025-02-18</p>
|
||||
<p>Due to a potential race condition via ARI when hanging up a channel hangup with cause
|
||||
while also deleting a bridge containing that channel, the bridge delete can over-write
|
||||
the hangup cause code resulting in Normal Call Clearing instead of the set value.</p>
|
||||
<p>With this change, bridge deletion will only set the hangup code if it hasn't been
|
||||
previously set.</p>
|
||||
<p>Resolves: #1124</p>
|
||||
<h4>res_config_pgsql: Fix regression that removed dbname config.</h4>
|
||||
<p>Author: George Joseph
|
||||
Date: 2025-02-11</p>
|
||||
<p>A recent commit accidentally removed the code that sets dbname.
|
||||
This commit adds it back in.</p>
|
||||
<p>Resolves: #1119</p>
|
||||
<h4>res_stir_shaken: Allow missing or anonymous CID to continue to the dialplan.</h4>
|
||||
<p>Author: George Joseph
|
||||
Date: 2025-02-05</p>
|
||||
<p>The verification check for missing or anonymous callerid was happening before
|
||||
the endpoint's profile was retrieved which meant that the failure_action
|
||||
parameter wasn't available. Therefore, if verification was enabled and there
|
||||
was no callerid or it was "anonymous", the call was immediately terminated
|
||||
instead of giving the dialplan the ability to decide what to do with the call.</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>The callerid check now happens after the verification context is created and
|
||||
the endpoint's stir_shaken_profile is available.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The check now processes the callerid failure just as it does for other
|
||||
verification failures and respects the failure_action parameter. If set
|
||||
to "continue" or "continue_return_reason", <code>STIR_SHAKEN(0,verify_result)</code>
|
||||
in the dialplan will return "invalid_or_no_callerid".</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>If the endpoint's failure_action is "reject_request", the call will be
|
||||
rejected with <code>433 "Anonymity Disallowed"</code>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>If the endpoint's failure_action is "continue_return_reason", the call will
|
||||
continue but a <code>Reason: STIR; cause=433; text="Anonymity Disallowed"</code>
|
||||
header will be added to the next provisional or final response.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>Resolves: #1112</p>
|
||||
<h4>resource_channels.c: Fix memory leak in ast_ari_channels_external_media.</h4>
|
||||
<p>Author: George Joseph
|
||||
Date: 2025-02-04</p>
|
||||
<p>Between ast_ari_channels_external_media(), external_media_rtp_udp(),
|
||||
and external_media_audiosocket_tcp(), the <code>variables</code> structure being passed
|
||||
around wasn't being cleaned up properly when there was a failure.</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>In ast_ari_channels_external_media(), the <code>variables</code> structure is now
|
||||
defined with RAII_VAR to ensure it always gets cleaned up.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The ast_variables_destroy() call was removed from external_media_rtp_udp().</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The ast_variables_destroy() call was removed from
|
||||
external_media_audiosocket_tcp(), its <code>endpoint</code> allocation was changed to
|
||||
to use ast_asprintf() as external_media_rtp_udp() does, and it now
|
||||
returns an error on failure.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>ast_ari_channels_external_media() now checks the new return code from
|
||||
external_media_audiosocket_tcp() and sets the appropriate error response.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>Resolves: #1109</p>
|
||||
<h4>ari/pjsip: Make it possible to control transfers through ARI</h4>
|
||||
<p>Author: Holger Hans Peter Freyther
|
||||
Date: 2024-06-15</p>
|
||||
<p>Introduce a ChannelTransfer event and the ability to notify progress to
|
||||
ARI. Implement emitting this event from the PJSIP channel instead of
|
||||
handling the transfer in Asterisk when configured.</p>
|
||||
<p>Introduce a dialplan function to the PJSIP channel to switch between the
|
||||
"core" and "ari-only" behavior.</p>
|
||||
<p>UserNote: Call transfers on the PJSIP channel can now be controlled by
|
||||
ARI. This can be enabled by using the PJSIP_TRANSFER_HANDLING(ari-only)
|
||||
dialplan function.</p>
|
||||
<h4>channel.c: Remove dead AST_GENERATOR_FD code.</h4>
|
||||
<p>Author: Sean Bright
|
||||
Date: 2025-02-06</p>
|
||||
<p>Nothing ever sets the <code>AST_GENERATOR_FD</code>, so this block of code will
|
||||
never execute. It also is the only place where the <code>generate</code> callback
|
||||
is called with the channel lock held which made it difficult to reason
|
||||
about the thread safety of <code>ast_generator</code>s.</p>
|
||||
<p>In passing, also note that <code>AST_AGENT_FD</code> isn't used either.</p>
|
||||
<h4>func_strings.c: Prevent SEGV in HASH single-argument mode.</h4>
|
||||
<p>Author: George Joseph
|
||||
Date: 2025-01-30</p>
|
||||
<p>When in single-argument mode (very rarely used), a malformation of a column
|
||||
name (also very rare) could cause a NULL to be returned when retrieving the
|
||||
channel variable for that column. Passing that to strncat causes a SEGV. We
|
||||
now check for the NULL and print a warning message.</p>
|
||||
<p>Resolves: #1101</p>
|
||||
<h4>docs: Add version information to AGI command XML elements.</h4>
|
||||
<p>Author: George Joseph
|
||||
Date: 2025-01-24</p>
|
||||
<p>This process was a bit different than the others because everything
|
||||
is in the same file, there's an array that contains the command
|
||||
names and their handler functions, and the last command was created
|
||||
over 15 years ago.</p>
|
||||
<ul>
|
||||
<li>Dump a <code>git blame</code> of res/res_agi.c from BEFORE the handle_* prototypes
|
||||
were changed.</li>
|
||||
<li>Create a command <> handler function xref by parsing the the agi_command
|
||||
array.</li>
|
||||
<li>For each entry, grep the function definition line "static int handle_*"
|
||||
from the git blame output and capture the commit. This will be the
|
||||
commit the command was created in.</li>
|
||||
<li>Do a <code>git tag --contains <commit> | sort -V | head -1</code> to get the
|
||||
tag the function was created in.</li>
|
||||
<li>Add a single since/version element to the command XML. Multiple versions
|
||||
aren't supported here because the branching and tagging scheme changed
|
||||
several times in the 2000's.</li>
|
||||
</ul>
|
||||
<h4>docs: Fix minor typo in MixMonitor AMI action</h4>
|
||||
<p>Author: Jeremy Lainé
|
||||
Date: 2025-01-28</p>
|
||||
<p>The <code>Options</code> argument was erroneously documented as lowercase
|
||||
<code>options</code>.</p>
|
||||
<h4>utils: Disable old style definition warnings for libdb.</h4>
|
||||
<p>Author: Naveen Albert
|
||||
Date: 2025-01-23</p>
|
||||
<p>Newer versions of gcc now warn about old style definitions, such
|
||||
as those in libdb, which causes compilation failure with DEVMODE
|
||||
enabled. Ignore these warnings for libdb.</p>
|
||||
<p>Resolves: #1085</p>
|
||||
<h4>rtp.conf.sample: Correct stunaddr example.</h4>
|
||||
<p>Author: fabriziopicconi
|
||||
Date: 2024-09-25</p>
|
||||
<h4>docs: Add version information to ARI resources and methods.</h4>
|
||||
<p>Author: George Joseph
|
||||
Date: 2025-01-27</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>Dump a git blame of each file in rest-api/api-docs.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Get the commit for each "resourcePath" and "httpMethod" entry.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Find the tags for each commit (same as other processes).</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Insert a "since" array after each "resourcePath" and "httpMethod" entry.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<h4>docs: Indent <since> tags.</h4>
|
||||
<p>Author: Sean Bright
|
||||
Date: 2025-01-23</p>
|
||||
<p>Also updates the 'since' of applications/functions that existed before
|
||||
XML documentation was introduced (1.6.2.0).</p>
|
||||
</body></html>
|
||||
573
ChangeLogs/ChangeLog-22.3.0.md
Normal file
573
ChangeLogs/ChangeLog-22.3.0.md
Normal file
@@ -0,0 +1,573 @@
|
||||
|
||||
## Change Log for Release asterisk-22.3.0
|
||||
|
||||
### Links:
|
||||
|
||||
- [Full ChangeLog](https://downloads.asterisk.org/pub/telephony/asterisk/releases/ChangeLog-22.3.0.html)
|
||||
- [GitHub Diff](https://github.com/asterisk/asterisk/compare/22.2.0...22.3.0)
|
||||
- [Tarball](https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22.3.0.tar.gz)
|
||||
- [Downloads](https://downloads.asterisk.org/pub/telephony/asterisk)
|
||||
|
||||
### Summary:
|
||||
|
||||
- Commits: 28
|
||||
- Commit Authors: 12
|
||||
- Issues Resolved: 12
|
||||
- Security Advisories Resolved: 0
|
||||
|
||||
### User Notes:
|
||||
|
||||
- #### ari/pjsip: Make it possible to control transfers through ARI
|
||||
Call transfers on the PJSIP channel can now be controlled by
|
||||
ARI. This can be enabled by using the PJSIP_TRANSFER_HANDLING(ari-only)
|
||||
dialplan function.
|
||||
|
||||
|
||||
### Upgrade Notes:
|
||||
|
||||
|
||||
### Commit Authors:
|
||||
|
||||
- Allan Nathanson: (1)
|
||||
- Ben Ford: (1)
|
||||
- Fabriziopicconi: (1)
|
||||
- George Joseph: (10)
|
||||
- Holger Hans Peter Freyther: (1)
|
||||
- Jeremy Lainé: (1)
|
||||
- Joshua Elson: (1)
|
||||
- Luz Paz: (3)
|
||||
- Maximilian Fridrich: (1)
|
||||
- Mike Bradeen: (1)
|
||||
- Naveen Albert: (1)
|
||||
- Sean Bright: (6)
|
||||
|
||||
## Issue and Commit Detail:
|
||||
|
||||
### Closed Issues:
|
||||
|
||||
- 211: [bug]: stasis: Off-nominal channel leave causes bridge to be destroyed
|
||||
- 1085: [bug]: utils: Compilation failure with DEVMODE due to old-style definitions
|
||||
- 1101: [bug]: when setting a var with a double quotes and using Set(HASH)
|
||||
- 1109: [bug]: Off nominal memory leak in res/ari/resource_channels.c
|
||||
- 1112: [bug]: STIR/SHAKEN verification doesn't allow anonymous callerid to be passed to the dialplan.
|
||||
- 1119: [bug]: Realtime database not working after upgrade from 22.0.0 to 22.2.0
|
||||
- 1122: Need status on CVE-2024-57520 claim.
|
||||
- 1124: [bug]: Race condition between bridge and channel delete can over-write cause code set in hangup.
|
||||
- 1131: [bug]: CHANGES link broken in README.md
|
||||
- 1135: [bug]: Problems with video decoding due to RTP marker bit set
|
||||
- 1149: [bug]: res_pjsip: Mismatch in tcp_keepalive_enable causes not to enable
|
||||
- 1164: [bug]: WARNING Message in messages.log for res_curl.conf [globals]
|
||||
|
||||
### Commits By Author:
|
||||
|
||||
- #### Allan Nathanson (1):
|
||||
- config.c: #include of non-existent file should not crash
|
||||
|
||||
- #### Ben Ford (1):
|
||||
- documentation: Update Gosub, Goto, and add new documentationtype.
|
||||
|
||||
- #### George Joseph (10):
|
||||
- docs: Add version information to ARI resources and methods.
|
||||
- docs: Add version information to AGI command XML elements.
|
||||
- func_strings.c: Prevent SEGV in HASH single-argument mode.
|
||||
- resource_channels.c: Fix memory leak in ast_ari_channels_external_media.
|
||||
- res_stir_shaken: Allow missing or anonymous CID to continue to the dialplan.
|
||||
- res_config_pgsql: Fix regression that removed dbname config.
|
||||
- bridging: Fix multiple bridging issues causing SEGVs and FRACKs.
|
||||
- swagger_model.py: Fix invalid escape sequence in get_list_parameter_type().
|
||||
- manager.c: Check for restricted file in action_createconfig.
|
||||
- README.md: Updates and Fixes
|
||||
|
||||
- #### Holger Hans Peter Freyther (1):
|
||||
- ari/pjsip: Make it possible to control transfers through ARI
|
||||
|
||||
- #### Jeremy Lainé (1):
|
||||
- docs: Fix minor typo in MixMonitor AMI action
|
||||
|
||||
- #### Joshua Elson (1):
|
||||
- fix: Correct default flag for tcp_keepalive_enable option
|
||||
|
||||
- #### Luz Paz (3):
|
||||
- docs: Fix various typos in main/ Found via `codespell -q 3 -S "./CREDITS" -L a..
|
||||
- docs: Fix various typos in channels/ Found via `codespell -q 3 -S "./CREDITS,*..
|
||||
- docs: Fix typos in cdr/ Found via codespell
|
||||
|
||||
- #### Maximilian Fridrich (1):
|
||||
- Revert "res_rtp_asterisk.c: Set Mark on rtp when timestamp skew is too big"
|
||||
|
||||
- #### Mike Bradeen (1):
|
||||
- bridge_channel: don't set cause code on channel during bridge delete if alread..
|
||||
|
||||
- #### Naveen Albert (1):
|
||||
- utils: Disable old style definition warnings for libdb.
|
||||
|
||||
- #### Sean Bright (6):
|
||||
- docs: Indent <since> tags.
|
||||
- channel.c: Remove dead AST_GENERATOR_FD code.
|
||||
- res_rtp_asterisk.c: Use correct timeout value for T.140 RED timer.
|
||||
- docs: AMI documentation fixes.
|
||||
- res_rtp_asterisk.c: Don't truncate spec-compliant `ice-ufrag` or `ice-pwd`.
|
||||
- res_config_curl.c: Remove unnecessary warnings.
|
||||
|
||||
- #### fabriziopicconi (1):
|
||||
- rtp.conf.sample: Correct stunaddr example.
|
||||
|
||||
|
||||
### Commit List:
|
||||
|
||||
- documentation: Update Gosub, Goto, and add new documentationtype.
|
||||
- res_config_curl.c: Remove unnecessary warnings.
|
||||
- README.md: Updates and Fixes
|
||||
- res_rtp_asterisk.c: Don't truncate spec-compliant `ice-ufrag` or `ice-pwd`.
|
||||
- fix: Correct default flag for tcp_keepalive_enable option
|
||||
- docs: AMI documentation fixes.
|
||||
- config.c: #include of non-existent file should not crash
|
||||
- manager.c: Check for restricted file in action_createconfig.
|
||||
- swagger_model.py: Fix invalid escape sequence in get_list_parameter_type().
|
||||
- Revert "res_rtp_asterisk.c: Set Mark on rtp when timestamp skew is too big"
|
||||
- res_rtp_asterisk.c: Use correct timeout value for T.140 RED timer.
|
||||
- docs: Fix typos in cdr/ Found via codespell
|
||||
- bridging: Fix multiple bridging issues causing SEGVs and FRACKs.
|
||||
- res_config_pgsql: Fix regression that removed dbname config.
|
||||
- res_stir_shaken: Allow missing or anonymous CID to continue to the dialplan.
|
||||
- resource_channels.c: Fix memory leak in ast_ari_channels_external_media.
|
||||
- ari/pjsip: Make it possible to control transfers through ARI
|
||||
- channel.c: Remove dead AST_GENERATOR_FD code.
|
||||
- func_strings.c: Prevent SEGV in HASH single-argument mode.
|
||||
- docs: Add version information to AGI command XML elements.
|
||||
- docs: Fix minor typo in MixMonitor AMI action
|
||||
- utils: Disable old style definition warnings for libdb.
|
||||
- rtp.conf.sample: Correct stunaddr example.
|
||||
- docs: Add version information to ARI resources and methods.
|
||||
- docs: Indent <since> tags.
|
||||
|
||||
### Commit Details:
|
||||
|
||||
#### documentation: Update Gosub, Goto, and add new documentationtype.
|
||||
Author: Ben Ford
|
||||
Date: 2025-03-14
|
||||
|
||||
Gosub and Goto were not displaying their syntax correctly on the docs
|
||||
site. This change adds a new way to specify an optional context, an
|
||||
optional extension, and a required priority that the xml stylesheet can
|
||||
parse without having to know which optional parameters come in which
|
||||
order. In Asterisk, it looks like this:
|
||||
|
||||
parameter name="context" documentationtype="dialplan_context"
|
||||
parameter name="extension" documentationtype="dialplan_extension"
|
||||
parameter name="priority" documentationtype="dialplan_priority" required="true"
|
||||
|
||||
The stylesheet will ignore the context and extension parameters, but for
|
||||
priority, it will automatically inject the following:
|
||||
|
||||
[[context,]extension,]priority
|
||||
|
||||
This is the correct oder for applications such as Gosub and Goto.
|
||||
|
||||
|
||||
#### res_config_curl.c: Remove unnecessary warnings.
|
||||
Author: Sean Bright
|
||||
Date: 2025-03-17
|
||||
|
||||
Resolves: #1164
|
||||
|
||||
#### README.md: Updates and Fixes
|
||||
Author: George Joseph
|
||||
Date: 2025-03-05
|
||||
|
||||
* Outdated information has been removed.
|
||||
* New links added.
|
||||
* Placeholder added for link to change logs.
|
||||
|
||||
Going forward, the release process will create HTML versions of the README
|
||||
and change log and will update the link in the README to the current
|
||||
change log for the branch...
|
||||
|
||||
* In the development branches, the link will always point to the current
|
||||
release on GitHub.
|
||||
* In the "releases/*" branches and the tarballs, the link will point to the
|
||||
ChangeLogs/ChangeLog-<version>.html file in the source directory.
|
||||
* On the downloads website, the link will point to the
|
||||
ChangeLog-<version>.html file in the same directory.
|
||||
|
||||
Resolves: #1131
|
||||
|
||||
#### res_rtp_asterisk.c: Don't truncate spec-compliant `ice-ufrag` or `ice-pwd`.
|
||||
Author: Sean Bright
|
||||
Date: 2025-03-07
|
||||
|
||||
RFC 8839[1] indicates that the `ice-ufrag` and `ice-pwd` attributes
|
||||
can be up to 256 bytes long. While we don't generate values of that
|
||||
size, we should be able to accomodate them without truncating.
|
||||
|
||||
1. https://www.rfc-editor.org/rfc/rfc8839#name-ice-ufrag-and-ice-pwd-attri
|
||||
|
||||
|
||||
#### fix: Correct default flag for tcp_keepalive_enable option
|
||||
Author: Joshua Elson
|
||||
Date: 2025-03-06
|
||||
|
||||
Resolves an issue where the tcp_keepalive_enable option was not properly enabled in the sample configuration due to an incorrect default flag setting.
|
||||
|
||||
Fixes: #1149
|
||||
|
||||
#### docs: AMI documentation fixes.
|
||||
Author: Sean Bright
|
||||
Date: 2025-02-18
|
||||
|
||||
Most of this patch is adding missing PJSIP-related event
|
||||
documentation, but the one functional change was adding a sorcery
|
||||
to-string handler for endpoint's `redirect_method` which was not
|
||||
showing up in the AMI event details or `pjsip show endpoint
|
||||
<endpoint>` output.
|
||||
|
||||
The rest of the changes are summarized below:
|
||||
|
||||
* app_agent_pool.c: Typo fix Epoche -> Epoch.
|
||||
* stasis_bridges.c: Add missing AttendedTransfer properties.
|
||||
* stasis_channels.c: Add missing AgentLogoff properties.
|
||||
* pjsip_manager.xml:
|
||||
- Add missing AorList properties.
|
||||
- Add missing AorDetail properties.
|
||||
- Add missing ContactList properties.
|
||||
- Add missing ContactStatusDetail properties.
|
||||
- Add missing EventDetail properties.
|
||||
- Add missing AuthList properties.
|
||||
- Add missing AuthDetail properties.
|
||||
- Add missing TransportDetail properties.
|
||||
- Add missing EndpointList properties.
|
||||
- Add missing IdentifyDetail properties.
|
||||
* res_pjsip_registrar.c: Add missing InboundRegistrationDetail documentation.
|
||||
* res_pjsip_pubsub.c:
|
||||
- Add missing ResourceListDetail documentation.
|
||||
- Add missing InboundSubscriptionDetail documentation.
|
||||
- Add missing OutboundSubscriptionDetail documentation.
|
||||
* res_pjsip_outbound_registration.c: Add missing OutboundRegistrationDetail documentation.
|
||||
|
||||
|
||||
#### config.c: #include of non-existent file should not crash
|
||||
Author: Allan Nathanson
|
||||
Date: 2025-03-03
|
||||
|
||||
Corrects a segmentation fault when a configuration file has a #include
|
||||
statement that referenced a file that does not exist.
|
||||
|
||||
Resolves: https://github.com/asterisk/asterisk/issues/1139
|
||||
|
||||
#### manager.c: Check for restricted file in action_createconfig.
|
||||
Author: George Joseph
|
||||
Date: 2025-03-03
|
||||
|
||||
The `CreateConfig` manager action now ensures that a config file can
|
||||
only be created in the AST_CONFIG_DIR unless `live_dangerously` is set.
|
||||
|
||||
Resolves: #1122
|
||||
|
||||
#### swagger_model.py: Fix invalid escape sequence in get_list_parameter_type().
|
||||
Author: George Joseph
|
||||
Date: 2025-03-04
|
||||
|
||||
Recent python versions complain when backslashes in strings create invalid
|
||||
escape sequences. This causes issues for strings used as regex patterns like
|
||||
`'^List\[(.*)\]$'` where you want the regex parser to treat `[` and `]`
|
||||
as literals. Double-backslashing is one way to fix it but simply converting
|
||||
the string to a raw string `re.match(r'^List\[(.*)\]$', text)` is easier
|
||||
and less error prone.
|
||||
|
||||
|
||||
#### Revert "res_rtp_asterisk.c: Set Mark on rtp when timestamp skew is too big"
|
||||
Author: Maximilian Fridrich
|
||||
Date: 2025-02-28
|
||||
|
||||
This reverts commit f30ad96b3f467739c38ff415e80bffc4afff1da7.
|
||||
|
||||
The original change was not RFC compliant and caused issues because it
|
||||
set the RTP marker bit in cases when it shouldn't be set. See the
|
||||
linked issue #1135 for a detailed explanation.
|
||||
|
||||
Fixes: #1135.
|
||||
|
||||
#### res_rtp_asterisk.c: Use correct timeout value for T.140 RED timer.
|
||||
Author: Sean Bright
|
||||
Date: 2025-02-24
|
||||
|
||||
Found while reviewing #1128
|
||||
|
||||
|
||||
#### docs: Fix typos in cdr/ Found via codespell
|
||||
Author: Luz Paz
|
||||
Date: 2025-02-12
|
||||
|
||||
|
||||
#### docs: Fix various typos in channels/ Found via `codespell -q 3 -S "./CREDITS,*..
|
||||
Author: Luz Paz
|
||||
Date: 2025-02-04
|
||||
|
||||
|
||||
#### docs: Fix various typos in main/ Found via `codespell -q 3 -S "./CREDITS" -L a..
|
||||
Author: Luz Paz
|
||||
Date: 2025-02-04
|
||||
|
||||
|
||||
#### bridging: Fix multiple bridging issues causing SEGVs and FRACKs.
|
||||
Author: George Joseph
|
||||
Date: 2025-01-22
|
||||
|
||||
Issues:
|
||||
|
||||
* The bridging core allowed multiple bridges to be created with the same
|
||||
unique bridgeId at the same time. Only the last bridge created with the
|
||||
duplicate name was actually saved to the core bridges container.
|
||||
|
||||
* The bridging core was creating a stasis topic for the bridge and saving it
|
||||
in the bridge->topic field but not increasing its reference count. In the
|
||||
case where two bridges were created with the same uniqueid (which is also
|
||||
the topic name), the second bridge would get the _existing_ topic the first
|
||||
bridge created. When the first bridge was destroyed, it would take the
|
||||
topic with it so when the second bridge attempted to publish a message to
|
||||
it it either FRACKed or SEGVd.
|
||||
|
||||
* The bridge destructor, which also destroys the bridge topic, is run from the
|
||||
bridge manager thread not the caller's thread. This makes it possible for
|
||||
an ARI developer to create a new one with the same uniqueid believing the
|
||||
old one was destroyed when, in fact, the old one's destructor hadn't
|
||||
completed. This could cause the new bridge to get the old one's topic just
|
||||
before the topic was destroyed. When the new bridge attempted to publish
|
||||
a message on that topic, asterisk could either FRACK or SEGV.
|
||||
|
||||
* The ARI bridges resource also allowed multiple bridges to be created with
|
||||
the same uniqueid but it kept the duplicate bridges in its app_bridges
|
||||
container. This created a situation where if you added two bridges with
|
||||
the same "bridge1" uniqueid, all operations on "bridge1" were performed on
|
||||
the first bridge created and the second was basically orphaned. If you
|
||||
attempted to delete what you thought was the second bridge, you actually
|
||||
deleted the first one created.
|
||||
|
||||
Changes:
|
||||
|
||||
* A new API `ast_bridge_topic_exists(uniqueid)` was created to determine if
|
||||
a topic already exists for a bridge.
|
||||
|
||||
* `bridge_base_init()` in bridge.c and `ast_ari_bridges_create()` in
|
||||
resource_bridges.c now call `ast_bridge_topic_exists(uniqueid)` to check
|
||||
if a bridge with the requested uniqueid already exists and will fail if it
|
||||
does.
|
||||
|
||||
* `bridge_register()` in bridges.c now checks the core bridges container to
|
||||
make sure a bridge doesn't already exist with the requested uniqueid.
|
||||
Although most callers of `bridge_register()` will have already called
|
||||
`bridge_base_init()`, which will now fail on duplicate bridges, there
|
||||
is no guarantee of this so we must check again.
|
||||
|
||||
* The core bridges container allocation was changed to reject duplicate
|
||||
uniqueids instead of silently replacing an existing one. This is a "belt
|
||||
and suspenders" check.
|
||||
|
||||
* A global mutex was added to bridge.c to prevent concurrent calls to
|
||||
`bridge_base_init()` and `bridge_register()`.
|
||||
|
||||
* Even though you can no longer create multiple bridges with the same uniqueid
|
||||
at the same time, it's still possible that the bridge topic might be
|
||||
destroyed while a second bridge with the same uniqueid was trying to use
|
||||
it. To address this, the bridging core now increments the reference count
|
||||
on bridge->topic when a bridge is created and decrements it when the
|
||||
bridge is destroyed.
|
||||
|
||||
* `bridge_create_common()` in res_stasis.c now checks the stasis app_bridges
|
||||
container to make sure a bridge with the requested uniqueid doesn't already
|
||||
exist. This may seem like overkill but there are so many entrypoints to
|
||||
bridge creation that we need to be safe and catch issues as soon in the
|
||||
process as possible.
|
||||
|
||||
* The stasis app_bridges container allocation was changed to reject duplicate
|
||||
uniqueids instead of adding them. This is a "belt and suspenders" check.
|
||||
|
||||
* The `bridge show all` CLI command now shows the bridge name as well as the
|
||||
bridge id.
|
||||
|
||||
* Response code 409 "Conflict" was added as a possible response from the ARI
|
||||
bridge create resources to signal that a bridge with the requested uniqueid
|
||||
already exists.
|
||||
|
||||
* Additional debugging was added to multiple bridging and stasis files.
|
||||
|
||||
Resolves: #211
|
||||
|
||||
#### bridge_channel: don't set cause code on channel during bridge delete if alread..
|
||||
Author: Mike Bradeen
|
||||
Date: 2025-02-18
|
||||
|
||||
Due to a potential race condition via ARI when hanging up a channel hangup with cause
|
||||
while also deleting a bridge containing that channel, the bridge delete can over-write
|
||||
the hangup cause code resulting in Normal Call Clearing instead of the set value.
|
||||
|
||||
With this change, bridge deletion will only set the hangup code if it hasn't been
|
||||
previously set.
|
||||
|
||||
Resolves: #1124
|
||||
|
||||
#### res_config_pgsql: Fix regression that removed dbname config.
|
||||
Author: George Joseph
|
||||
Date: 2025-02-11
|
||||
|
||||
A recent commit accidentally removed the code that sets dbname.
|
||||
This commit adds it back in.
|
||||
|
||||
Resolves: #1119
|
||||
|
||||
#### res_stir_shaken: Allow missing or anonymous CID to continue to the dialplan.
|
||||
Author: George Joseph
|
||||
Date: 2025-02-05
|
||||
|
||||
The verification check for missing or anonymous callerid was happening before
|
||||
the endpoint's profile was retrieved which meant that the failure_action
|
||||
parameter wasn't available. Therefore, if verification was enabled and there
|
||||
was no callerid or it was "anonymous", the call was immediately terminated
|
||||
instead of giving the dialplan the ability to decide what to do with the call.
|
||||
|
||||
* The callerid check now happens after the verification context is created and
|
||||
the endpoint's stir_shaken_profile is available.
|
||||
|
||||
* The check now processes the callerid failure just as it does for other
|
||||
verification failures and respects the failure_action parameter. If set
|
||||
to "continue" or "continue_return_reason", `STIR_SHAKEN(0,verify_result)`
|
||||
in the dialplan will return "invalid_or_no_callerid".
|
||||
|
||||
* If the endpoint's failure_action is "reject_request", the call will be
|
||||
rejected with `433 "Anonymity Disallowed"`.
|
||||
|
||||
* If the endpoint's failure_action is "continue_return_reason", the call will
|
||||
continue but a `Reason: STIR; cause=433; text="Anonymity Disallowed"`
|
||||
header will be added to the next provisional or final response.
|
||||
|
||||
Resolves: #1112
|
||||
|
||||
#### resource_channels.c: Fix memory leak in ast_ari_channels_external_media.
|
||||
Author: George Joseph
|
||||
Date: 2025-02-04
|
||||
|
||||
Between ast_ari_channels_external_media(), external_media_rtp_udp(),
|
||||
and external_media_audiosocket_tcp(), the `variables` structure being passed
|
||||
around wasn't being cleaned up properly when there was a failure.
|
||||
|
||||
* In ast_ari_channels_external_media(), the `variables` structure is now
|
||||
defined with RAII_VAR to ensure it always gets cleaned up.
|
||||
|
||||
* The ast_variables_destroy() call was removed from external_media_rtp_udp().
|
||||
|
||||
* The ast_variables_destroy() call was removed from
|
||||
external_media_audiosocket_tcp(), its `endpoint` allocation was changed to
|
||||
to use ast_asprintf() as external_media_rtp_udp() does, and it now
|
||||
returns an error on failure.
|
||||
|
||||
* ast_ari_channels_external_media() now checks the new return code from
|
||||
external_media_audiosocket_tcp() and sets the appropriate error response.
|
||||
|
||||
Resolves: #1109
|
||||
|
||||
#### ari/pjsip: Make it possible to control transfers through ARI
|
||||
Author: Holger Hans Peter Freyther
|
||||
Date: 2024-06-15
|
||||
|
||||
Introduce a ChannelTransfer event and the ability to notify progress to
|
||||
ARI. Implement emitting this event from the PJSIP channel instead of
|
||||
handling the transfer in Asterisk when configured.
|
||||
|
||||
Introduce a dialplan function to the PJSIP channel to switch between the
|
||||
"core" and "ari-only" behavior.
|
||||
|
||||
UserNote: Call transfers on the PJSIP channel can now be controlled by
|
||||
ARI. This can be enabled by using the PJSIP_TRANSFER_HANDLING(ari-only)
|
||||
dialplan function.
|
||||
|
||||
|
||||
#### channel.c: Remove dead AST_GENERATOR_FD code.
|
||||
Author: Sean Bright
|
||||
Date: 2025-02-06
|
||||
|
||||
Nothing ever sets the `AST_GENERATOR_FD`, so this block of code will
|
||||
never execute. It also is the only place where the `generate` callback
|
||||
is called with the channel lock held which made it difficult to reason
|
||||
about the thread safety of `ast_generator`s.
|
||||
|
||||
In passing, also note that `AST_AGENT_FD` isn't used either.
|
||||
|
||||
|
||||
#### func_strings.c: Prevent SEGV in HASH single-argument mode.
|
||||
Author: George Joseph
|
||||
Date: 2025-01-30
|
||||
|
||||
When in single-argument mode (very rarely used), a malformation of a column
|
||||
name (also very rare) could cause a NULL to be returned when retrieving the
|
||||
channel variable for that column. Passing that to strncat causes a SEGV. We
|
||||
now check for the NULL and print a warning message.
|
||||
|
||||
Resolves: #1101
|
||||
|
||||
#### docs: Add version information to AGI command XML elements.
|
||||
Author: George Joseph
|
||||
Date: 2025-01-24
|
||||
|
||||
This process was a bit different than the others because everything
|
||||
is in the same file, there's an array that contains the command
|
||||
names and their handler functions, and the last command was created
|
||||
over 15 years ago.
|
||||
|
||||
* Dump a `git blame` of res/res_agi.c from BEFORE the handle_* prototypes
|
||||
were changed.
|
||||
* Create a command <> handler function xref by parsing the the agi_command
|
||||
array.
|
||||
* For each entry, grep the function definition line "static int handle_*"
|
||||
from the git blame output and capture the commit. This will be the
|
||||
commit the command was created in.
|
||||
* Do a `git tag --contains <commit> | sort -V | head -1` to get the
|
||||
tag the function was created in.
|
||||
* Add a single since/version element to the command XML. Multiple versions
|
||||
aren't supported here because the branching and tagging scheme changed
|
||||
several times in the 2000's.
|
||||
|
||||
|
||||
#### docs: Fix minor typo in MixMonitor AMI action
|
||||
Author: Jeremy Lainé
|
||||
Date: 2025-01-28
|
||||
|
||||
The `Options` argument was erroneously documented as lowercase
|
||||
`options`.
|
||||
|
||||
|
||||
#### utils: Disable old style definition warnings for libdb.
|
||||
Author: Naveen Albert
|
||||
Date: 2025-01-23
|
||||
|
||||
Newer versions of gcc now warn about old style definitions, such
|
||||
as those in libdb, which causes compilation failure with DEVMODE
|
||||
enabled. Ignore these warnings for libdb.
|
||||
|
||||
Resolves: #1085
|
||||
|
||||
#### rtp.conf.sample: Correct stunaddr example.
|
||||
Author: fabriziopicconi
|
||||
Date: 2024-09-25
|
||||
|
||||
|
||||
#### docs: Add version information to ARI resources and methods.
|
||||
Author: George Joseph
|
||||
Date: 2025-01-27
|
||||
|
||||
* Dump a git blame of each file in rest-api/api-docs.
|
||||
|
||||
* Get the commit for each "resourcePath" and "httpMethod" entry.
|
||||
|
||||
* Find the tags for each commit (same as other processes).
|
||||
|
||||
* Insert a "since" array after each "resourcePath" and "httpMethod" entry.
|
||||
|
||||
|
||||
#### docs: Indent <since> tags.
|
||||
Author: Sean Bright
|
||||
Date: 2025-01-23
|
||||
|
||||
Also updates the 'since' of applications/functions that existed before
|
||||
XML documentation was introduced (1.6.2.0).
|
||||
|
||||
|
||||
537
ChangeLogs/ChangeLog-22.4.0.html
Normal file
537
ChangeLogs/ChangeLog-22.4.0.html
Normal file
@@ -0,0 +1,537 @@
|
||||
<html><head><title>ChangeLog for asterisk-22.4.0</title></head><body>
|
||||
<h2>Change Log for Release asterisk-22.4.0</h2>
|
||||
<h3>Links:</h3>
|
||||
<ul>
|
||||
<li><a href="https://downloads.asterisk.org/pub/telephony/asterisk/releases/ChangeLog-22.4.0.html">Full ChangeLog</a> </li>
|
||||
<li><a href="https://github.com/asterisk/asterisk/compare/22.3.0...22.4.0">GitHub Diff</a> </li>
|
||||
<li><a href="https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22.4.0.tar.gz">Tarball</a> </li>
|
||||
<li><a href="https://downloads.asterisk.org/pub/telephony/asterisk">Downloads</a> </li>
|
||||
</ul>
|
||||
<h3>Summary:</h3>
|
||||
<ul>
|
||||
<li>Commits: 24</li>
|
||||
<li>Commit Authors: 18</li>
|
||||
<li>Issues Resolved: 12</li>
|
||||
<li>Security Advisories Resolved: 0</li>
|
||||
</ul>
|
||||
<h3>User Notes:</h3>
|
||||
<ul>
|
||||
<li>
|
||||
<h4>stasis/control.c: Set Hangup Cause to No Answer on Dial timeout</h4>
|
||||
<p>A Dial timeout on POST /channels/{channelId}/dial will now result in a
|
||||
CANCEL and ChannelDestroyed with cause 19 / User alerting, no answer. Previously
|
||||
no explicit cause was set, resulting in a cause of 16 / Normal Call Clearing.</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>contrib: Add systemd service and timer files for malloc trim.</h4>
|
||||
<p>Service and timer files for systemd have been added to the
|
||||
contrib/systemd/ directory. If you are experiencing memory issues,
|
||||
install these files to have "malloc trim" periodically run on the
|
||||
system.</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Add log-caller-id-name option to log Caller ID Name in queue log</h4>
|
||||
<p>This patch adds a global configuration option, log-caller-id-name, to queues.conf
|
||||
to control whether the Caller ID name is logged as parameter 4 when a call enters a queue.
|
||||
When log-caller-id-name=yes, the Caller ID name is included in the queue log,
|
||||
Any '|' characters in the caller ID name will be replaced with '_'.
|
||||
(provided it’s allowed by the existing log_restricted_caller_id rules).
|
||||
When log-caller-id-name=no (the default), the Caller ID name is omitted.</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>asterisk.c: Add "pre-init" and "pre-module" capability to cli.conf.</h4>
|
||||
<p>In cli.conf, you can now define startup commands that run before
|
||||
core initialization and before module initialization.</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>audiosocket: added support for DTMF frames</h4>
|
||||
<p>The AudioSocket protocol now forwards DTMF frames with
|
||||
payload type 0x03. The payload is a 1-byte ascii representing the DTMF
|
||||
digit (0-9,*,#...).</p>
|
||||
</li>
|
||||
</ul>
|
||||
<h3>Upgrade Notes:</h3>
|
||||
<ul>
|
||||
<li>
|
||||
<h4>ARI: REST over Websocket</h4>
|
||||
This commit adds the ability to make ARI REST requests over the same
|
||||
websocket used to receive events.
|
||||
See https://docs.asterisk.org/Configuration/Interfaces/Asterisk-REST-Interface-ARI/ARI-REST-over-WebSocket/</li>
|
||||
</ul>
|
||||
<h3>Commit Authors:</h3>
|
||||
<ul>
|
||||
<li>Albrecht Oster: (1)</li>
|
||||
<li>Alexei Gradinari: (1)</li>
|
||||
<li>Allan Nathanson: (1)</li>
|
||||
<li>Andreas Wehrmann: (1)</li>
|
||||
<li>Ben Ford: (1)</li>
|
||||
<li>Florent CHAUVEAU: (1)</li>
|
||||
<li>George Joseph: (4)</li>
|
||||
<li>Joshua C. Colp: (1)</li>
|
||||
<li>Luz Paz: (1)</li>
|
||||
<li>Mark Murawski: (1)</li>
|
||||
<li>Mike Bradeen: (1)</li>
|
||||
<li>Mkmer: (1)</li>
|
||||
<li>Naveen Albert: (3)</li>
|
||||
<li>Norm Harrison: (2)</li>
|
||||
<li>Peter Jannesen: (1)</li>
|
||||
<li>Phoneben: (1)</li>
|
||||
<li>Sean Bright: (1)</li>
|
||||
<li>Zhai Liangliang: (1)</li>
|
||||
</ul>
|
||||
<h2>Issue and Commit Detail:</h2>
|
||||
<h3>Closed Issues:</h3>
|
||||
<ul>
|
||||
<li>505: [bug]: res_pjproject: ast_sockaddr_cmp() always fails on sockaddrs created by ast_sockaddr_from_pj_sockaddr()</li>
|
||||
<li>643: [new-feature]: pjsip show contact -- show all details same as AMI PJSIPShowContacts</li>
|
||||
<li>963: [bug]: missing hangup cause for ARI ChannelDestroyed when Dial times out</li>
|
||||
<li>1091: [improvement]: app queue :add to queue log callerid name</li>
|
||||
<li>1144: [bug]: action_redirect don't remove bridge_after_goto data</li>
|
||||
<li>1171: [improvement]: Need the capability in audiohook.c for fractional (float) type volume adjustments.</li>
|
||||
<li>1181: [bug]: Incorrect PJSIP Endpoint Device States on Multiple Channels</li>
|
||||
<li>1190: [bug]: Crash when starting ConfBridge recording over CLI and AMI</li>
|
||||
<li>1197: [bug]: ChannelHangupRequest does not show cause code in all cases</li>
|
||||
<li>1206: [improvement]: chan_iax2: Minor improvements to documentation and warning messages.</li>
|
||||
<li>1220: [bug]: res_pjsip_caller_id: OLI is not parsed if contained in a URI parameter</li>
|
||||
<li>1224: [improvement]: app_meetme: Removal version is incorrect</li>
|
||||
</ul>
|
||||
<h3>Commits By Author:</h3>
|
||||
<ul>
|
||||
<li>
|
||||
<h4>Albrecht Oster (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>res_pjproject: Fix DTLS client check failing on some platforms</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Alexei Gradinari (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>chan_pjsip: set correct Endpoint Device State on multiple channels</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Allan Nathanson (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>file.c: missing "custom" sound files should not generate warning logs</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Andreas Wehrmann (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>pbx_ael: unregister AELSub application and CLI commands on module load failure</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Ben Ford (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>contrib: Add systemd service and timer files for malloc trim.</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Florent CHAUVEAU (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>audiosocket: added support for DTMF frames</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>George Joseph (4):</h4>
|
||||
</li>
|
||||
<li>ARI: REST over Websocket</li>
|
||||
<li>ari_websockets: Fix frack if ARI config fails to load.</li>
|
||||
<li>asterisk.c: Add "pre-init" and "pre-module" capability to cli.conf.</li>
|
||||
<li>
|
||||
<p>Prequisites for ARI Outbound Websockets</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Joshua C. Colp (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>channel: Always provide cause code in ChannelHangupRequest.</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Luz Paz (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>docs: Fix typos in apps/</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Mark Murawski (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>chan_pjsip: Add the same details as PJSIPShowContacts to the CLI via 'pjsip s..</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Mike Bradeen (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>stasis/control.c: Set Hangup Cause to No Answer on Dial timeout</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Naveen Albert (3):</h4>
|
||||
</li>
|
||||
<li>chan_iax2: Minor improvements to documentation and warning messages.</li>
|
||||
<li>app_meetme: Remove inaccurate removal version from xmldocs.</li>
|
||||
<li>
|
||||
<p>res_pjsip_caller_id: Also parse URI parameters for ANI2.</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Norm Harrison (2):</h4>
|
||||
</li>
|
||||
<li>audiosocket: fix timeout, fix dialplan app exit, server address in logs</li>
|
||||
<li>
|
||||
<p>asterisk/channel.h: fix documentation for 'ast_waitfor_nandfds()'</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Peter Jannesen (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>action_redirect: remove after_bridge_goto_info</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Sean Bright (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>app_confbridge: Prevent crash when publishing channel-less event.</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Zhai Liangliang (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>Update config.guess and config.sub</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>mkmer (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>audiohook.c: Add ability to adjust volume with float</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>phoneben (1):</h4>
|
||||
</li>
|
||||
<li>Add log-caller-id-name option to log Caller ID Name in queue log</li>
|
||||
</ul>
|
||||
<h3>Commit List:</h3>
|
||||
<ul>
|
||||
<li>res_pjsip_caller_id: Also parse URI parameters for ANI2.</li>
|
||||
<li>app_meetme: Remove inaccurate removal version from xmldocs.</li>
|
||||
<li>docs: Fix typos in apps/</li>
|
||||
<li>stasis/control.c: Set Hangup Cause to No Answer on Dial timeout</li>
|
||||
<li>chan_iax2: Minor improvements to documentation and warning messages.</li>
|
||||
<li>pbx_ael: unregister AELSub application and CLI commands on module load failure</li>
|
||||
<li>res_pjproject: Fix DTLS client check failing on some platforms</li>
|
||||
<li>Prequisites for ARI Outbound Websockets</li>
|
||||
<li>contrib: Add systemd service and timer files for malloc trim.</li>
|
||||
<li>action_redirect: remove after_bridge_goto_info</li>
|
||||
<li>channel: Always provide cause code in ChannelHangupRequest.</li>
|
||||
<li>Add log-caller-id-name option to log Caller ID Name in queue log</li>
|
||||
<li>asterisk.c: Add "pre-init" and "pre-module" capability to cli.conf.</li>
|
||||
<li>app_confbridge: Prevent crash when publishing channel-less event.</li>
|
||||
<li>ari_websockets: Fix frack if ARI config fails to load.</li>
|
||||
<li>ARI: REST over Websocket</li>
|
||||
<li>audiohook.c: Add ability to adjust volume with float</li>
|
||||
<li>audiosocket: added support for DTMF frames</li>
|
||||
<li>asterisk/channel.h: fix documentation for 'ast_waitfor_nandfds()'</li>
|
||||
<li>audiosocket: fix timeout, fix dialplan app exit, server address in logs</li>
|
||||
<li>Update config.guess and config.sub</li>
|
||||
<li>chan_pjsip: set correct Endpoint Device State on multiple channels</li>
|
||||
<li>file.c: missing "custom" sound files should not generate warning logs</li>
|
||||
</ul>
|
||||
<h3>Commit Details:</h3>
|
||||
<h4>res_pjsip_caller_id: Also parse URI parameters for ANI2.</h4>
|
||||
<p>Author: Naveen Albert
|
||||
Date: 2025-04-26</p>
|
||||
<p>If the isup-oli was sent as a URI parameter, rather than a header
|
||||
parameter, it was not being parsed. Make sure we parse both if
|
||||
needed so the ANI2 is set regardless of which type of parameter
|
||||
the isup-oli is sent as.</p>
|
||||
<p>Resolves: #1220</p>
|
||||
<h4>app_meetme: Remove inaccurate removal version from xmldocs.</h4>
|
||||
<p>Author: Naveen Albert
|
||||
Date: 2025-04-26</p>
|
||||
<p>app_meetme is deprecated but wasn't removed as planned in 21,
|
||||
so remove the inaccurate removal version.</p>
|
||||
<p>Resolves: #1224</p>
|
||||
<h4>docs: Fix typos in apps/</h4>
|
||||
<p>Author: Luz Paz
|
||||
Date: 2025-04-09</p>
|
||||
<p>Found via codespell</p>
|
||||
<h4>stasis/control.c: Set Hangup Cause to No Answer on Dial timeout</h4>
|
||||
<p>Author: Mike Bradeen
|
||||
Date: 2025-04-17</p>
|
||||
<p>Other Dial operations (dial, app_dial) use Q.850 cause 19 when a dial timeout occurs,
|
||||
but the Dial command via ARI did not set an explicit reason. This resulted in a
|
||||
CANCEL with Normal Call Clearing and corresponding ChannelDestroyed.</p>
|
||||
<p>This change sets the hangup cause to AST_CAUSE_NO_ANSWER to be consistent with the
|
||||
other operations.</p>
|
||||
<p>Fixes: #963</p>
|
||||
<p>UserNote: A Dial timeout on POST /channels/{channelId}/dial will now result in a
|
||||
CANCEL and ChannelDestroyed with cause 19 / User alerting, no answer. Previously
|
||||
no explicit cause was set, resulting in a cause of 16 / Normal Call Clearing.</p>
|
||||
<h4>chan_iax2: Minor improvements to documentation and warning messages.</h4>
|
||||
<p>Author: Naveen Albert
|
||||
Date: 2025-04-18</p>
|
||||
<ul>
|
||||
<li>Update Dial() documentation for IAX2 to include syntax for RSA
|
||||
public key names.</li>
|
||||
<li>Add additional details to a couple warnings to provide more context
|
||||
when an undecodable frame is received.</li>
|
||||
</ul>
|
||||
<p>Resolves: #1206</p>
|
||||
<h4>pbx_ael: unregister AELSub application and CLI commands on module load failure</h4>
|
||||
<p>Author: Andreas Wehrmann
|
||||
Date: 2025-04-18</p>
|
||||
<p>This fixes crashes/hangs I noticed with Asterisk 20.3.0 and 20.13.0 and quickly found out,
|
||||
that the AEL module doesn't do proper cleanup when it fails to load.
|
||||
This happens for example when there are syntax errors and AEL fails to compile in which case pbx_load_module()
|
||||
returns an error but load_module() doesn't then unregister CLI cmds and the application.</p>
|
||||
<h4>res_pjproject: Fix DTLS client check failing on some platforms</h4>
|
||||
<p>Author: Albrecht Oster
|
||||
Date: 2025-04-10</p>
|
||||
<p>Certain platforms (mainly BSD derivatives) have an additional length
|
||||
field in <code>sockaddr_in6</code> and <code>sockaddr_in</code>.
|
||||
<code>ast_sockaddr_from_pj_sockaddr()</code> does not take this field into account
|
||||
when copying over values from the <code>pj_sockaddr</code> into the <code>ast_sockaddr</code>.
|
||||
The resulting <code>ast_sockaddr</code> will have an uninitialized value for
|
||||
<code>sin6_len</code>/<code>sin_len</code> while the other <code>ast_sockaddr</code> (not converted from
|
||||
a <code>pj_sockaddr</code>) to check against in <code>ast_sockaddr_pj_sockaddr_cmp()</code>
|
||||
has the correct length value set.</p>
|
||||
<p>This has the effect that <code>ast_sockaddr_cmp()</code> will always indicate
|
||||
an address mismatch, because it does a bitwise comparison, and all DTLS
|
||||
packets are dropped even if addresses and ports match.</p>
|
||||
<p><code>ast_sockaddr_from_pj_sockaddr()</code> now checks whether the length fields
|
||||
are available on the current platform and sets the values accordingly.</p>
|
||||
<p>Resolves: #505</p>
|
||||
<h4>Prequisites for ARI Outbound Websockets</h4>
|
||||
<p>Author: George Joseph
|
||||
Date: 2025-04-16</p>
|
||||
<p>stasis:
|
||||
* Added stasis_app_is_registered().
|
||||
* Added stasis_app_control_mark_failed().
|
||||
* Added stasis_app_control_is_failed().
|
||||
* Fixed res_stasis_device_state so unsubscribe all works properly.
|
||||
* Modified stasis_app_unregister() to unsubscribe from all event sources.
|
||||
* Modified stasis_app_exec to return -1 if stasis_app_control_is_failed()
|
||||
returns true.</p>
|
||||
<p>http:
|
||||
* Added ast_http_create_basic_auth_header().</p>
|
||||
<p>md5:
|
||||
* Added define for MD5_DIGEST_LENGTH.</p>
|
||||
<p>tcptls:
|
||||
* Added flag to ast_tcptls_session_args to suppress connection log messages
|
||||
to give callers more control over logging.</p>
|
||||
<p>http_websocket:
|
||||
* Add flag to ast_websocket_client_options to suppress connection log messages
|
||||
to give callers more control over logging.
|
||||
* Added username and password to ast_websocket_client_options to support
|
||||
outbound basic authentication.
|
||||
* Added ast_websocket_result_to_str().</p>
|
||||
<h4>contrib: Add systemd service and timer files for malloc trim.</h4>
|
||||
<p>Author: Ben Ford
|
||||
Date: 2025-04-16</p>
|
||||
<p>Adds two files to the contrib/systemd/ directory that can be installed
|
||||
to periodically run "malloc trim" on Asterisk. These files do nothing
|
||||
unless they are explicitly moved to the correct location on the system.
|
||||
Users who are experiencing Asterisk memory issues can use this service
|
||||
to potentially help combat the problem. These files can also be
|
||||
configured to change the start time and interval. See systemd.timer(5)
|
||||
and systemd.time(7) for more information.</p>
|
||||
<p>UserNote: Service and timer files for systemd have been added to the
|
||||
contrib/systemd/ directory. If you are experiencing memory issues,
|
||||
install these files to have "malloc trim" periodically run on the
|
||||
system.</p>
|
||||
<h4>action_redirect: remove after_bridge_goto_info</h4>
|
||||
<p>Author: Peter Jannesen
|
||||
Date: 2025-03-13</p>
|
||||
<p>Under certain circumstances the context/extens/prio are stored in the
|
||||
after_bridge_goto_info. This info is used when the bridge is broken by
|
||||
for hangup of the other party. In the situation that the bridge is
|
||||
broken by an AMI Redirect this info is not used but also not removed.
|
||||
With the result that when the channel is put back in a bridge and the
|
||||
bridge is broken the execution continues at the wrong
|
||||
context/extens/prio.</p>
|
||||
<p>Resolves: #1144</p>
|
||||
<h4>channel: Always provide cause code in ChannelHangupRequest.</h4>
|
||||
<p>Author: Joshua C. Colp
|
||||
Date: 2025-04-16</p>
|
||||
<p>When queueing a channel to be hung up a cause code can be
|
||||
specified in one of two ways:</p>
|
||||
<ol>
|
||||
<li>
|
||||
<p>ast_queue_hangup_with_cause
|
||||
This function takes in a cause code and queues it as part
|
||||
of the hangup request, which ultimately results in it being
|
||||
set on the channel.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>ast_channel_hangupcause_set + ast_queue_hangup
|
||||
This combination sets the hangup cause on the channel before
|
||||
queueing the hangup instead of as part of that process.</p>
|
||||
</li>
|
||||
</ol>
|
||||
<p>In the #2 case the ChannelHangupRequest event would not contain
|
||||
the cause code. For consistency if a cause code has been set
|
||||
on the channel it will now be added to the event.</p>
|
||||
<p>Resolves: #1197</p>
|
||||
<h4>Add log-caller-id-name option to log Caller ID Name in queue log</h4>
|
||||
<p>Author: phoneben
|
||||
Date: 2025-02-28</p>
|
||||
<p>Add log-caller-id-name option to log Caller ID Name in queue log</p>
|
||||
<p>This patch introduces a new global configuration option, log-caller-id-name,
|
||||
to queues.conf to control whether the Caller ID name is logged when a call enters a queue.</p>
|
||||
<p>When log-caller-id-name=yes, the Caller ID name is logged
|
||||
as parameter 4 in the queue log, provided it’s allowed by the
|
||||
existing log_restricted_caller_id rules. If log-caller-id-name=no (the default),
|
||||
the Caller ID name is omitted from the logs.</p>
|
||||
<p>Fixes: #1091</p>
|
||||
<p>UserNote: This patch adds a global configuration option, log-caller-id-name, to queues.conf
|
||||
to control whether the Caller ID name is logged as parameter 4 when a call enters a queue.
|
||||
When log-caller-id-name=yes, the Caller ID name is included in the queue log,
|
||||
Any '|' characters in the caller ID name will be replaced with '_'.
|
||||
(provided it’s allowed by the existing log_restricted_caller_id rules).
|
||||
When log-caller-id-name=no (the default), the Caller ID name is omitted.</p>
|
||||
<h4>asterisk.c: Add "pre-init" and "pre-module" capability to cli.conf.</h4>
|
||||
<p>Author: George Joseph
|
||||
Date: 2025-04-10</p>
|
||||
<p>Commands in the "[startup_commands]" section of cli.conf have historically run
|
||||
after all core and module initialization has been completed and just before
|
||||
"Asterisk Ready" is printed on the console. This meant that if you
|
||||
wanted to debug initialization of a specific module, your only option
|
||||
was to turn on debug for everything by setting "debug" in asterisk.conf.</p>
|
||||
<p>This commit introduces options to allow you to run CLI commands earlier in
|
||||
the asterisk startup process.</p>
|
||||
<p>A command with a value of "pre-init" will run just after logger initialization
|
||||
but before most core, and all module, initialization.</p>
|
||||
<p>A command with a value of "pre-module" will run just after all core
|
||||
initialization but before all module initialization.</p>
|
||||
<p>A command with a value of "fully-booted" (or "yes" for backwards
|
||||
compatibility) will run as they always have been...after all
|
||||
initialization and just before "Asterisk Ready" is printed on the console.</p>
|
||||
<p>This means you could do this...</p>
|
||||
<p><code>[startup_commands]
|
||||
core set debug 3 res_pjsip.so = pre-module
|
||||
core set debug 0 res_pjsip.so = fully-booted</code></p>
|
||||
<p>This would turn debugging on for res_pjsip.so to catch any module
|
||||
initialization debug messages then turn it off again after the module is
|
||||
loaded.</p>
|
||||
<p>UserNote: In cli.conf, you can now define startup commands that run before
|
||||
core initialization and before module initialization.</p>
|
||||
<h4>app_confbridge: Prevent crash when publishing channel-less event.</h4>
|
||||
<p>Author: Sean Bright
|
||||
Date: 2025-04-07</p>
|
||||
<p>Resolves: #1190</p>
|
||||
<h4>ari_websockets: Fix frack if ARI config fails to load.</h4>
|
||||
<p>Author: George Joseph
|
||||
Date: 2025-04-02</p>
|
||||
<p>ari_ws_session_registry_dtor() wasn't checking that the container was valid
|
||||
before running ao2_callback on it to shutdown registered sessions.</p>
|
||||
<h4>ARI: REST over Websocket</h4>
|
||||
<p>Author: George Joseph
|
||||
Date: 2025-03-12</p>
|
||||
<p>This commit adds the ability to make ARI REST requests over the same
|
||||
websocket used to receive events.</p>
|
||||
<p>For full details on how to use the new capability, visit...</p>
|
||||
<p>https://docs.asterisk.org/Configuration/Interfaces/Asterisk-REST-Interface-ARI/ARI-REST-over-WebSocket/</p>
|
||||
<p>Changes:</p>
|
||||
<ul>
|
||||
<li>Added utilities to http.c:<ul>
|
||||
<li>ast_get_http_method_from_string().</li>
|
||||
<li>ast_http_parse_post_form().</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Added utilities to json.c:<ul>
|
||||
<li>ast_json_nvp_array_to_ast_variables().</li>
|
||||
<li>ast_variables_to_json_nvp_array().</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Added definitions for new events to carry REST responses.</li>
|
||||
<li>Created res/ari/ari_websocket_requests.c to house the new request handlers.</li>
|
||||
<li>Moved non-event specific code out of res/ari/resource_events.c into
|
||||
res/ari/ari_websockets.c</li>
|
||||
<li>Refactored res/res_ari.c to move non-http code out of ast_ari_callback()
|
||||
(which is http specific) and into ast_ari_invoke() so it can be shared
|
||||
between both the http and websocket transports.</li>
|
||||
</ul>
|
||||
<p>UpgradeNote: This commit adds the ability to make ARI REST requests over the same
|
||||
websocket used to receive events.
|
||||
See https://docs.asterisk.org/Configuration/Interfaces/Asterisk-REST-Interface-ARI/ARI-REST-over-WebSocket/</p>
|
||||
<h4>audiohook.c: Add ability to adjust volume with float</h4>
|
||||
<p>Author: mkmer
|
||||
Date: 2025-03-18</p>
|
||||
<p>Add the capability to audiohook for float type volume adjustments. This allows for adjustments to volume smaller than 6dB. With INT adjustments, the first step is 2 which converts to ~6dB (or 1/2 volume / double volume depending on adjustment sign). 3dB is a typical adjustment level which can now be accommodated with an adjustment value of 1.41.</p>
|
||||
<p>This is accomplished by the following:
|
||||
Convert internal variables to type float.
|
||||
Always use ast_frame_adjust_volume_float() for adjustments.
|
||||
Cast int to float in original functions ast_audiohook_volume_set(), and ast_volume_adjust().
|
||||
Cast float to int in ast_audiohook_volume_get()
|
||||
Add functions ast_audiohook_volume_get_float, ast_audiohook_volume_set_float, and ast_audiohook_volume_adjust_float.</p>
|
||||
<p>This update maintains 100% backward compatibility.</p>
|
||||
<p>Resolves: #1171</p>
|
||||
<h4>audiosocket: added support for DTMF frames</h4>
|
||||
<p>Author: Florent CHAUVEAU
|
||||
Date: 2025-02-28</p>
|
||||
<p>Updated the AudioSocket protocol to allow sending DTMF frames.
|
||||
AST_FRAME_DTMF frames are now forwarded to the server, in addition to
|
||||
AST_FRAME_AUDIO frames. A new payload type AST_AUDIOSOCKET_KIND_DTMF
|
||||
with value 0x03 was added to the protocol. The payload is a 1-byte
|
||||
ascii representing the DTMF digit (0-9,*,#...).</p>
|
||||
<p>UserNote: The AudioSocket protocol now forwards DTMF frames with
|
||||
payload type 0x03. The payload is a 1-byte ascii representing the DTMF
|
||||
digit (0-9,*,#...).</p>
|
||||
<h4>asterisk/channel.h: fix documentation for 'ast_waitfor_nandfds()'</h4>
|
||||
<p>Author: Norm Harrison
|
||||
Date: 2023-04-03</p>
|
||||
<p>Co-authored-by: Florent CHAUVEAU <a href="mailto:florentch@pm.me">florentch@pm.me</a></p>
|
||||
<h4>audiosocket: fix timeout, fix dialplan app exit, server address in logs</h4>
|
||||
<p>Author: Norm Harrison
|
||||
Date: 2023-04-03</p>
|
||||
<ul>
|
||||
<li>Correct wait timeout logic in the dialplan application.</li>
|
||||
<li>Include server address in log messages for better traceability.</li>
|
||||
<li>Allow dialplan app to exit gracefully on hangup messages and socket closure.</li>
|
||||
<li>Optimize I/O by reducing redundant read()/write() operations.</li>
|
||||
</ul>
|
||||
<p>Co-authored-by: Florent CHAUVEAU <a href="mailto:florentch@pm.me">florentch@pm.me</a></p>
|
||||
<h4>chan_pjsip: Add the same details as PJSIPShowContacts to the CLI via 'pjsip s..</h4>
|
||||
<p>Author: Mark Murawski
|
||||
Date: 2025-03-23</p>
|
||||
<p>CLI 'pjsip show contact' does not show enough information.
|
||||
One must telnet to AMI or write a script to ask Asterisk for example what the User-Agent is on a Contact
|
||||
This feature adds the same details as PJSIPShowContacts to the CLI</p>
|
||||
<p>Resolves: #643</p>
|
||||
<h4>Update config.guess and config.sub</h4>
|
||||
<p>Author: Zhai Liangliang
|
||||
Date: 2025-03-26</p>
|
||||
<h4>chan_pjsip: set correct Endpoint Device State on multiple channels</h4>
|
||||
<p>Author: Alexei Gradinari
|
||||
Date: 2025-03-25</p>
|
||||
<ol>
|
||||
<li>
|
||||
<p>When one channel is placed on hold, the device state is set to ONHOLD
|
||||
without checking other channels states.
|
||||
In case of AST_CONTROL_HOLD set the device state as AST_DEVICE_UNKNOWN
|
||||
to calculate aggregate device state of all active channels.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The current implementation incorrectly classifies channels in use.
|
||||
The only channels that has the states: UP, RING and BUSY are considered as "in use".
|
||||
A channel should be considered "in use" if its state is anything other than
|
||||
DOWN or RESERVED.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Currently, if the number of channels "in use" is greater than device_state_busy_at,
|
||||
the system does not set the state to BUSY. Instead, it incorrectly assigns an aggregate
|
||||
device state.
|
||||
The endpoint device state should be BUSY if the number of channels "in use" is greater
|
||||
than or equal to device_state_busy_at.</p>
|
||||
</li>
|
||||
</ol>
|
||||
<p>Fixes: #1181</p>
|
||||
<h4>file.c: missing "custom" sound files should not generate warning logs</h4>
|
||||
<p>Author: Allan Nathanson
|
||||
Date: 2025-03-18</p>
|
||||
<p>With <code>sounds_search_custom_dir = yes</code> we first look to see if a sound file
|
||||
is present in the "custom" sound directory before looking in the standard
|
||||
sound directories. We should not be issuing a WARNING log message if a
|
||||
sound cannot be found in the "custom" directory.</p>
|
||||
<p>Resolves: https://github.com/asterisk/asterisk/issues/1170</p>
|
||||
</body></html>
|
||||
564
ChangeLogs/ChangeLog-22.4.0.md
Normal file
564
ChangeLogs/ChangeLog-22.4.0.md
Normal file
@@ -0,0 +1,564 @@
|
||||
|
||||
## Change Log for Release asterisk-22.4.0
|
||||
|
||||
### Links:
|
||||
|
||||
- [Full ChangeLog](https://downloads.asterisk.org/pub/telephony/asterisk/releases/ChangeLog-22.4.0.html)
|
||||
- [GitHub Diff](https://github.com/asterisk/asterisk/compare/22.3.0...22.4.0)
|
||||
- [Tarball](https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22.4.0.tar.gz)
|
||||
- [Downloads](https://downloads.asterisk.org/pub/telephony/asterisk)
|
||||
|
||||
### Summary:
|
||||
|
||||
- Commits: 24
|
||||
- Commit Authors: 18
|
||||
- Issues Resolved: 12
|
||||
- Security Advisories Resolved: 0
|
||||
|
||||
### User Notes:
|
||||
|
||||
- #### stasis/control.c: Set Hangup Cause to No Answer on Dial timeout
|
||||
A Dial timeout on POST /channels/{channelId}/dial will now result in a
|
||||
CANCEL and ChannelDestroyed with cause 19 / User alerting, no answer. Previously
|
||||
no explicit cause was set, resulting in a cause of 16 / Normal Call Clearing.
|
||||
|
||||
- #### contrib: Add systemd service and timer files for malloc trim.
|
||||
Service and timer files for systemd have been added to the
|
||||
contrib/systemd/ directory. If you are experiencing memory issues,
|
||||
install these files to have "malloc trim" periodically run on the
|
||||
system.
|
||||
|
||||
- #### Add log-caller-id-name option to log Caller ID Name in queue log
|
||||
This patch adds a global configuration option, log-caller-id-name, to queues.conf
|
||||
to control whether the Caller ID name is logged as parameter 4 when a call enters a queue.
|
||||
When log-caller-id-name=yes, the Caller ID name is included in the queue log,
|
||||
Any '|' characters in the caller ID name will be replaced with '_'.
|
||||
(provided it’s allowed by the existing log_restricted_caller_id rules).
|
||||
When log-caller-id-name=no (the default), the Caller ID name is omitted.
|
||||
|
||||
- #### asterisk.c: Add "pre-init" and "pre-module" capability to cli.conf.
|
||||
In cli.conf, you can now define startup commands that run before
|
||||
core initialization and before module initialization.
|
||||
|
||||
- #### audiosocket: added support for DTMF frames
|
||||
The AudioSocket protocol now forwards DTMF frames with
|
||||
payload type 0x03. The payload is a 1-byte ascii representing the DTMF
|
||||
digit (0-9,*,#...).
|
||||
|
||||
|
||||
### Upgrade Notes:
|
||||
|
||||
- #### ARI: REST over Websocket
|
||||
This commit adds the ability to make ARI REST requests over the same
|
||||
websocket used to receive events.
|
||||
See https://docs.asterisk.org/Configuration/Interfaces/Asterisk-REST-Interface-ARI/ARI-REST-over-WebSocket/
|
||||
|
||||
|
||||
### Commit Authors:
|
||||
|
||||
- Albrecht Oster: (1)
|
||||
- Alexei Gradinari: (1)
|
||||
- Allan Nathanson: (1)
|
||||
- Andreas Wehrmann: (1)
|
||||
- Ben Ford: (1)
|
||||
- Florent CHAUVEAU: (1)
|
||||
- George Joseph: (4)
|
||||
- Joshua C. Colp: (1)
|
||||
- Luz Paz: (1)
|
||||
- Mark Murawski: (1)
|
||||
- Mike Bradeen: (1)
|
||||
- Mkmer: (1)
|
||||
- Naveen Albert: (3)
|
||||
- Norm Harrison: (2)
|
||||
- Peter Jannesen: (1)
|
||||
- Phoneben: (1)
|
||||
- Sean Bright: (1)
|
||||
- Zhai Liangliang: (1)
|
||||
|
||||
## Issue and Commit Detail:
|
||||
|
||||
### Closed Issues:
|
||||
|
||||
- 505: [bug]: res_pjproject: ast_sockaddr_cmp() always fails on sockaddrs created by ast_sockaddr_from_pj_sockaddr()
|
||||
- 643: [new-feature]: pjsip show contact -- show all details same as AMI PJSIPShowContacts
|
||||
- 963: [bug]: missing hangup cause for ARI ChannelDestroyed when Dial times out
|
||||
- 1091: [improvement]: app queue :add to queue log callerid name
|
||||
- 1144: [bug]: action_redirect don't remove bridge_after_goto data
|
||||
- 1171: [improvement]: Need the capability in audiohook.c for fractional (float) type volume adjustments.
|
||||
- 1181: [bug]: Incorrect PJSIP Endpoint Device States on Multiple Channels
|
||||
- 1190: [bug]: Crash when starting ConfBridge recording over CLI and AMI
|
||||
- 1197: [bug]: ChannelHangupRequest does not show cause code in all cases
|
||||
- 1206: [improvement]: chan_iax2: Minor improvements to documentation and warning messages.
|
||||
- 1220: [bug]: res_pjsip_caller_id: OLI is not parsed if contained in a URI parameter
|
||||
- 1224: [improvement]: app_meetme: Removal version is incorrect
|
||||
|
||||
### Commits By Author:
|
||||
|
||||
- #### Albrecht Oster (1):
|
||||
- res_pjproject: Fix DTLS client check failing on some platforms
|
||||
|
||||
- #### Alexei Gradinari (1):
|
||||
- chan_pjsip: set correct Endpoint Device State on multiple channels
|
||||
|
||||
- #### Allan Nathanson (1):
|
||||
- file.c: missing "custom" sound files should not generate warning logs
|
||||
|
||||
- #### Andreas Wehrmann (1):
|
||||
- pbx_ael: unregister AELSub application and CLI commands on module load failure
|
||||
|
||||
- #### Ben Ford (1):
|
||||
- contrib: Add systemd service and timer files for malloc trim.
|
||||
|
||||
- #### Florent CHAUVEAU (1):
|
||||
- audiosocket: added support for DTMF frames
|
||||
|
||||
- #### George Joseph (4):
|
||||
- ARI: REST over Websocket
|
||||
- ari_websockets: Fix frack if ARI config fails to load.
|
||||
- asterisk.c: Add "pre-init" and "pre-module" capability to cli.conf.
|
||||
- Prequisites for ARI Outbound Websockets
|
||||
|
||||
- #### Joshua C. Colp (1):
|
||||
- channel: Always provide cause code in ChannelHangupRequest.
|
||||
|
||||
- #### Luz Paz (1):
|
||||
- docs: Fix typos in apps/
|
||||
|
||||
- #### Mark Murawski (1):
|
||||
- chan_pjsip: Add the same details as PJSIPShowContacts to the CLI via 'pjsip s..
|
||||
|
||||
- #### Mike Bradeen (1):
|
||||
- stasis/control.c: Set Hangup Cause to No Answer on Dial timeout
|
||||
|
||||
- #### Naveen Albert (3):
|
||||
- chan_iax2: Minor improvements to documentation and warning messages.
|
||||
- app_meetme: Remove inaccurate removal version from xmldocs.
|
||||
- res_pjsip_caller_id: Also parse URI parameters for ANI2.
|
||||
|
||||
- #### Norm Harrison (2):
|
||||
- audiosocket: fix timeout, fix dialplan app exit, server address in logs
|
||||
- asterisk/channel.h: fix documentation for 'ast_waitfor_nandfds()'
|
||||
|
||||
- #### Peter Jannesen (1):
|
||||
- action_redirect: remove after_bridge_goto_info
|
||||
|
||||
- #### Sean Bright (1):
|
||||
- app_confbridge: Prevent crash when publishing channel-less event.
|
||||
|
||||
- #### Zhai Liangliang (1):
|
||||
- Update config.guess and config.sub
|
||||
|
||||
- #### mkmer (1):
|
||||
- audiohook.c: Add ability to adjust volume with float
|
||||
|
||||
- #### phoneben (1):
|
||||
- Add log-caller-id-name option to log Caller ID Name in queue log
|
||||
|
||||
|
||||
### Commit List:
|
||||
|
||||
- res_pjsip_caller_id: Also parse URI parameters for ANI2.
|
||||
- app_meetme: Remove inaccurate removal version from xmldocs.
|
||||
- docs: Fix typos in apps/
|
||||
- stasis/control.c: Set Hangup Cause to No Answer on Dial timeout
|
||||
- chan_iax2: Minor improvements to documentation and warning messages.
|
||||
- pbx_ael: unregister AELSub application and CLI commands on module load failure
|
||||
- res_pjproject: Fix DTLS client check failing on some platforms
|
||||
- Prequisites for ARI Outbound Websockets
|
||||
- contrib: Add systemd service and timer files for malloc trim.
|
||||
- action_redirect: remove after_bridge_goto_info
|
||||
- channel: Always provide cause code in ChannelHangupRequest.
|
||||
- Add log-caller-id-name option to log Caller ID Name in queue log
|
||||
- asterisk.c: Add "pre-init" and "pre-module" capability to cli.conf.
|
||||
- app_confbridge: Prevent crash when publishing channel-less event.
|
||||
- ari_websockets: Fix frack if ARI config fails to load.
|
||||
- ARI: REST over Websocket
|
||||
- audiohook.c: Add ability to adjust volume with float
|
||||
- audiosocket: added support for DTMF frames
|
||||
- asterisk/channel.h: fix documentation for 'ast_waitfor_nandfds()'
|
||||
- audiosocket: fix timeout, fix dialplan app exit, server address in logs
|
||||
- Update config.guess and config.sub
|
||||
- chan_pjsip: set correct Endpoint Device State on multiple channels
|
||||
- file.c: missing "custom" sound files should not generate warning logs
|
||||
|
||||
### Commit Details:
|
||||
|
||||
#### res_pjsip_caller_id: Also parse URI parameters for ANI2.
|
||||
Author: Naveen Albert
|
||||
Date: 2025-04-26
|
||||
|
||||
If the isup-oli was sent as a URI parameter, rather than a header
|
||||
parameter, it was not being parsed. Make sure we parse both if
|
||||
needed so the ANI2 is set regardless of which type of parameter
|
||||
the isup-oli is sent as.
|
||||
|
||||
Resolves: #1220
|
||||
|
||||
#### app_meetme: Remove inaccurate removal version from xmldocs.
|
||||
Author: Naveen Albert
|
||||
Date: 2025-04-26
|
||||
|
||||
app_meetme is deprecated but wasn't removed as planned in 21,
|
||||
so remove the inaccurate removal version.
|
||||
|
||||
Resolves: #1224
|
||||
|
||||
#### docs: Fix typos in apps/
|
||||
Author: Luz Paz
|
||||
Date: 2025-04-09
|
||||
|
||||
Found via codespell
|
||||
|
||||
|
||||
#### stasis/control.c: Set Hangup Cause to No Answer on Dial timeout
|
||||
Author: Mike Bradeen
|
||||
Date: 2025-04-17
|
||||
|
||||
Other Dial operations (dial, app_dial) use Q.850 cause 19 when a dial timeout occurs,
|
||||
but the Dial command via ARI did not set an explicit reason. This resulted in a
|
||||
CANCEL with Normal Call Clearing and corresponding ChannelDestroyed.
|
||||
|
||||
This change sets the hangup cause to AST_CAUSE_NO_ANSWER to be consistent with the
|
||||
other operations.
|
||||
|
||||
Fixes: #963
|
||||
|
||||
UserNote: A Dial timeout on POST /channels/{channelId}/dial will now result in a
|
||||
CANCEL and ChannelDestroyed with cause 19 / User alerting, no answer. Previously
|
||||
no explicit cause was set, resulting in a cause of 16 / Normal Call Clearing.
|
||||
|
||||
|
||||
#### chan_iax2: Minor improvements to documentation and warning messages.
|
||||
Author: Naveen Albert
|
||||
Date: 2025-04-18
|
||||
|
||||
* Update Dial() documentation for IAX2 to include syntax for RSA
|
||||
public key names.
|
||||
* Add additional details to a couple warnings to provide more context
|
||||
when an undecodable frame is received.
|
||||
|
||||
Resolves: #1206
|
||||
|
||||
#### pbx_ael: unregister AELSub application and CLI commands on module load failure
|
||||
Author: Andreas Wehrmann
|
||||
Date: 2025-04-18
|
||||
|
||||
This fixes crashes/hangs I noticed with Asterisk 20.3.0 and 20.13.0 and quickly found out,
|
||||
that the AEL module doesn't do proper cleanup when it fails to load.
|
||||
This happens for example when there are syntax errors and AEL fails to compile in which case pbx_load_module()
|
||||
returns an error but load_module() doesn't then unregister CLI cmds and the application.
|
||||
|
||||
|
||||
#### res_pjproject: Fix DTLS client check failing on some platforms
|
||||
Author: Albrecht Oster
|
||||
Date: 2025-04-10
|
||||
|
||||
Certain platforms (mainly BSD derivatives) have an additional length
|
||||
field in `sockaddr_in6` and `sockaddr_in`.
|
||||
`ast_sockaddr_from_pj_sockaddr()` does not take this field into account
|
||||
when copying over values from the `pj_sockaddr` into the `ast_sockaddr`.
|
||||
The resulting `ast_sockaddr` will have an uninitialized value for
|
||||
`sin6_len`/`sin_len` while the other `ast_sockaddr` (not converted from
|
||||
a `pj_sockaddr`) to check against in `ast_sockaddr_pj_sockaddr_cmp()`
|
||||
has the correct length value set.
|
||||
|
||||
This has the effect that `ast_sockaddr_cmp()` will always indicate
|
||||
an address mismatch, because it does a bitwise comparison, and all DTLS
|
||||
packets are dropped even if addresses and ports match.
|
||||
|
||||
`ast_sockaddr_from_pj_sockaddr()` now checks whether the length fields
|
||||
are available on the current platform and sets the values accordingly.
|
||||
|
||||
Resolves: #505
|
||||
|
||||
#### Prequisites for ARI Outbound Websockets
|
||||
Author: George Joseph
|
||||
Date: 2025-04-16
|
||||
|
||||
stasis:
|
||||
* Added stasis_app_is_registered().
|
||||
* Added stasis_app_control_mark_failed().
|
||||
* Added stasis_app_control_is_failed().
|
||||
* Fixed res_stasis_device_state so unsubscribe all works properly.
|
||||
* Modified stasis_app_unregister() to unsubscribe from all event sources.
|
||||
* Modified stasis_app_exec to return -1 if stasis_app_control_is_failed()
|
||||
returns true.
|
||||
|
||||
http:
|
||||
* Added ast_http_create_basic_auth_header().
|
||||
|
||||
md5:
|
||||
* Added define for MD5_DIGEST_LENGTH.
|
||||
|
||||
tcptls:
|
||||
* Added flag to ast_tcptls_session_args to suppress connection log messages
|
||||
to give callers more control over logging.
|
||||
|
||||
http_websocket:
|
||||
* Add flag to ast_websocket_client_options to suppress connection log messages
|
||||
to give callers more control over logging.
|
||||
* Added username and password to ast_websocket_client_options to support
|
||||
outbound basic authentication.
|
||||
* Added ast_websocket_result_to_str().
|
||||
|
||||
|
||||
#### contrib: Add systemd service and timer files for malloc trim.
|
||||
Author: Ben Ford
|
||||
Date: 2025-04-16
|
||||
|
||||
Adds two files to the contrib/systemd/ directory that can be installed
|
||||
to periodically run "malloc trim" on Asterisk. These files do nothing
|
||||
unless they are explicitly moved to the correct location on the system.
|
||||
Users who are experiencing Asterisk memory issues can use this service
|
||||
to potentially help combat the problem. These files can also be
|
||||
configured to change the start time and interval. See systemd.timer(5)
|
||||
and systemd.time(7) for more information.
|
||||
|
||||
UserNote: Service and timer files for systemd have been added to the
|
||||
contrib/systemd/ directory. If you are experiencing memory issues,
|
||||
install these files to have "malloc trim" periodically run on the
|
||||
system.
|
||||
|
||||
|
||||
#### action_redirect: remove after_bridge_goto_info
|
||||
Author: Peter Jannesen
|
||||
Date: 2025-03-13
|
||||
|
||||
Under certain circumstances the context/extens/prio are stored in the
|
||||
after_bridge_goto_info. This info is used when the bridge is broken by
|
||||
for hangup of the other party. In the situation that the bridge is
|
||||
broken by an AMI Redirect this info is not used but also not removed.
|
||||
With the result that when the channel is put back in a bridge and the
|
||||
bridge is broken the execution continues at the wrong
|
||||
context/extens/prio.
|
||||
|
||||
Resolves: #1144
|
||||
|
||||
#### channel: Always provide cause code in ChannelHangupRequest.
|
||||
Author: Joshua C. Colp
|
||||
Date: 2025-04-16
|
||||
|
||||
When queueing a channel to be hung up a cause code can be
|
||||
specified in one of two ways:
|
||||
|
||||
1. ast_queue_hangup_with_cause
|
||||
This function takes in a cause code and queues it as part
|
||||
of the hangup request, which ultimately results in it being
|
||||
set on the channel.
|
||||
|
||||
2. ast_channel_hangupcause_set + ast_queue_hangup
|
||||
This combination sets the hangup cause on the channel before
|
||||
queueing the hangup instead of as part of that process.
|
||||
|
||||
In the #2 case the ChannelHangupRequest event would not contain
|
||||
the cause code. For consistency if a cause code has been set
|
||||
on the channel it will now be added to the event.
|
||||
|
||||
Resolves: #1197
|
||||
|
||||
#### Add log-caller-id-name option to log Caller ID Name in queue log
|
||||
Author: phoneben
|
||||
Date: 2025-02-28
|
||||
|
||||
Add log-caller-id-name option to log Caller ID Name in queue log
|
||||
|
||||
This patch introduces a new global configuration option, log-caller-id-name,
|
||||
to queues.conf to control whether the Caller ID name is logged when a call enters a queue.
|
||||
|
||||
When log-caller-id-name=yes, the Caller ID name is logged
|
||||
as parameter 4 in the queue log, provided it’s allowed by the
|
||||
existing log_restricted_caller_id rules. If log-caller-id-name=no (the default),
|
||||
the Caller ID name is omitted from the logs.
|
||||
|
||||
Fixes: #1091
|
||||
|
||||
UserNote: This patch adds a global configuration option, log-caller-id-name, to queues.conf
|
||||
to control whether the Caller ID name is logged as parameter 4 when a call enters a queue.
|
||||
When log-caller-id-name=yes, the Caller ID name is included in the queue log,
|
||||
Any '|' characters in the caller ID name will be replaced with '_'.
|
||||
(provided it’s allowed by the existing log_restricted_caller_id rules).
|
||||
When log-caller-id-name=no (the default), the Caller ID name is omitted.
|
||||
|
||||
|
||||
#### asterisk.c: Add "pre-init" and "pre-module" capability to cli.conf.
|
||||
Author: George Joseph
|
||||
Date: 2025-04-10
|
||||
|
||||
Commands in the "[startup_commands]" section of cli.conf have historically run
|
||||
after all core and module initialization has been completed and just before
|
||||
"Asterisk Ready" is printed on the console. This meant that if you
|
||||
wanted to debug initialization of a specific module, your only option
|
||||
was to turn on debug for everything by setting "debug" in asterisk.conf.
|
||||
|
||||
This commit introduces options to allow you to run CLI commands earlier in
|
||||
the asterisk startup process.
|
||||
|
||||
A command with a value of "pre-init" will run just after logger initialization
|
||||
but before most core, and all module, initialization.
|
||||
|
||||
A command with a value of "pre-module" will run just after all core
|
||||
initialization but before all module initialization.
|
||||
|
||||
A command with a value of "fully-booted" (or "yes" for backwards
|
||||
compatibility) will run as they always have been...after all
|
||||
initialization and just before "Asterisk Ready" is printed on the console.
|
||||
|
||||
This means you could do this...
|
||||
|
||||
```
|
||||
[startup_commands]
|
||||
core set debug 3 res_pjsip.so = pre-module
|
||||
core set debug 0 res_pjsip.so = fully-booted
|
||||
```
|
||||
|
||||
This would turn debugging on for res_pjsip.so to catch any module
|
||||
initialization debug messages then turn it off again after the module is
|
||||
loaded.
|
||||
|
||||
UserNote: In cli.conf, you can now define startup commands that run before
|
||||
core initialization and before module initialization.
|
||||
|
||||
|
||||
#### app_confbridge: Prevent crash when publishing channel-less event.
|
||||
Author: Sean Bright
|
||||
Date: 2025-04-07
|
||||
|
||||
Resolves: #1190
|
||||
|
||||
#### ari_websockets: Fix frack if ARI config fails to load.
|
||||
Author: George Joseph
|
||||
Date: 2025-04-02
|
||||
|
||||
ari_ws_session_registry_dtor() wasn't checking that the container was valid
|
||||
before running ao2_callback on it to shutdown registered sessions.
|
||||
|
||||
|
||||
#### ARI: REST over Websocket
|
||||
Author: George Joseph
|
||||
Date: 2025-03-12
|
||||
|
||||
This commit adds the ability to make ARI REST requests over the same
|
||||
websocket used to receive events.
|
||||
|
||||
For full details on how to use the new capability, visit...
|
||||
|
||||
https://docs.asterisk.org/Configuration/Interfaces/Asterisk-REST-Interface-ARI/ARI-REST-over-WebSocket/
|
||||
|
||||
Changes:
|
||||
|
||||
* Added utilities to http.c:
|
||||
* ast_get_http_method_from_string().
|
||||
* ast_http_parse_post_form().
|
||||
* Added utilities to json.c:
|
||||
* ast_json_nvp_array_to_ast_variables().
|
||||
* ast_variables_to_json_nvp_array().
|
||||
* Added definitions for new events to carry REST responses.
|
||||
* Created res/ari/ari_websocket_requests.c to house the new request handlers.
|
||||
* Moved non-event specific code out of res/ari/resource_events.c into
|
||||
res/ari/ari_websockets.c
|
||||
* Refactored res/res_ari.c to move non-http code out of ast_ari_callback()
|
||||
(which is http specific) and into ast_ari_invoke() so it can be shared
|
||||
between both the http and websocket transports.
|
||||
|
||||
UpgradeNote: This commit adds the ability to make ARI REST requests over the same
|
||||
websocket used to receive events.
|
||||
See https://docs.asterisk.org/Configuration/Interfaces/Asterisk-REST-Interface-ARI/ARI-REST-over-WebSocket/
|
||||
|
||||
|
||||
#### audiohook.c: Add ability to adjust volume with float
|
||||
Author: mkmer
|
||||
Date: 2025-03-18
|
||||
|
||||
Add the capability to audiohook for float type volume adjustments. This allows for adjustments to volume smaller than 6dB. With INT adjustments, the first step is 2 which converts to ~6dB (or 1/2 volume / double volume depending on adjustment sign). 3dB is a typical adjustment level which can now be accommodated with an adjustment value of 1.41.
|
||||
|
||||
This is accomplished by the following:
|
||||
Convert internal variables to type float.
|
||||
Always use ast_frame_adjust_volume_float() for adjustments.
|
||||
Cast int to float in original functions ast_audiohook_volume_set(), and ast_volume_adjust().
|
||||
Cast float to int in ast_audiohook_volume_get()
|
||||
Add functions ast_audiohook_volume_get_float, ast_audiohook_volume_set_float, and ast_audiohook_volume_adjust_float.
|
||||
|
||||
This update maintains 100% backward compatibility.
|
||||
|
||||
Resolves: #1171
|
||||
|
||||
#### audiosocket: added support for DTMF frames
|
||||
Author: Florent CHAUVEAU
|
||||
Date: 2025-02-28
|
||||
|
||||
Updated the AudioSocket protocol to allow sending DTMF frames.
|
||||
AST_FRAME_DTMF frames are now forwarded to the server, in addition to
|
||||
AST_FRAME_AUDIO frames. A new payload type AST_AUDIOSOCKET_KIND_DTMF
|
||||
with value 0x03 was added to the protocol. The payload is a 1-byte
|
||||
ascii representing the DTMF digit (0-9,*,#...).
|
||||
|
||||
UserNote: The AudioSocket protocol now forwards DTMF frames with
|
||||
payload type 0x03. The payload is a 1-byte ascii representing the DTMF
|
||||
digit (0-9,*,#...).
|
||||
|
||||
|
||||
#### asterisk/channel.h: fix documentation for 'ast_waitfor_nandfds()'
|
||||
Author: Norm Harrison
|
||||
Date: 2023-04-03
|
||||
|
||||
Co-authored-by: Florent CHAUVEAU <florentch@pm.me>
|
||||
|
||||
#### audiosocket: fix timeout, fix dialplan app exit, server address in logs
|
||||
Author: Norm Harrison
|
||||
Date: 2023-04-03
|
||||
|
||||
- Correct wait timeout logic in the dialplan application.
|
||||
- Include server address in log messages for better traceability.
|
||||
- Allow dialplan app to exit gracefully on hangup messages and socket closure.
|
||||
- Optimize I/O by reducing redundant read()/write() operations.
|
||||
|
||||
Co-authored-by: Florent CHAUVEAU <florentch@pm.me>
|
||||
|
||||
#### chan_pjsip: Add the same details as PJSIPShowContacts to the CLI via 'pjsip s..
|
||||
Author: Mark Murawski
|
||||
Date: 2025-03-23
|
||||
|
||||
CLI 'pjsip show contact' does not show enough information.
|
||||
One must telnet to AMI or write a script to ask Asterisk for example what the User-Agent is on a Contact
|
||||
This feature adds the same details as PJSIPShowContacts to the CLI
|
||||
|
||||
Resolves: #643
|
||||
|
||||
#### Update config.guess and config.sub
|
||||
Author: Zhai Liangliang
|
||||
Date: 2025-03-26
|
||||
|
||||
|
||||
#### chan_pjsip: set correct Endpoint Device State on multiple channels
|
||||
Author: Alexei Gradinari
|
||||
Date: 2025-03-25
|
||||
|
||||
1. When one channel is placed on hold, the device state is set to ONHOLD
|
||||
without checking other channels states.
|
||||
In case of AST_CONTROL_HOLD set the device state as AST_DEVICE_UNKNOWN
|
||||
to calculate aggregate device state of all active channels.
|
||||
|
||||
2. The current implementation incorrectly classifies channels in use.
|
||||
The only channels that has the states: UP, RING and BUSY are considered as "in use".
|
||||
A channel should be considered "in use" if its state is anything other than
|
||||
DOWN or RESERVED.
|
||||
|
||||
3. Currently, if the number of channels "in use" is greater than device_state_busy_at,
|
||||
the system does not set the state to BUSY. Instead, it incorrectly assigns an aggregate
|
||||
device state.
|
||||
The endpoint device state should be BUSY if the number of channels "in use" is greater
|
||||
than or equal to device_state_busy_at.
|
||||
|
||||
Fixes: #1181
|
||||
|
||||
#### file.c: missing "custom" sound files should not generate warning logs
|
||||
Author: Allan Nathanson
|
||||
Date: 2025-03-18
|
||||
|
||||
With `sounds_search_custom_dir = yes` we first look to see if a sound file
|
||||
is present in the "custom" sound directory before looking in the standard
|
||||
sound directories. We should not be issuing a WARNING log message if a
|
||||
sound cannot be found in the "custom" directory.
|
||||
|
||||
Resolves: https://github.com/asterisk/asterisk/issues/1170
|
||||
|
||||
611
ChangeLogs/ChangeLog-22.5.0.html
Normal file
611
ChangeLogs/ChangeLog-22.5.0.html
Normal file
@@ -0,0 +1,611 @@
|
||||
<html><head><title>ChangeLog for asterisk-22.5.0</title></head><body>
|
||||
<h2>Change Log for Release asterisk-22.5.0</h2>
|
||||
<h3>Links:</h3>
|
||||
<ul>
|
||||
<li><a href="https://downloads.asterisk.org/pub/telephony/asterisk/releases/ChangeLog-22.5.0.html">Full ChangeLog</a> </li>
|
||||
<li><a href="https://github.com/asterisk/asterisk/compare/22.4.1...22.5.0">GitHub Diff</a> </li>
|
||||
<li><a href="https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22.5.0.tar.gz">Tarball</a> </li>
|
||||
<li><a href="https://downloads.asterisk.org/pub/telephony/asterisk">Downloads</a> </li>
|
||||
</ul>
|
||||
<h3>Summary:</h3>
|
||||
<ul>
|
||||
<li>Commits: 29</li>
|
||||
<li>Commit Authors: 14</li>
|
||||
<li>Issues Resolved: 19</li>
|
||||
<li>Security Advisories Resolved: 1</li>
|
||||
<li><a href="https://github.com/asterisk/asterisk/security/advisories/GHSA-c7p6-7mvq-8jq2">GHSA-c7p6-7mvq-8jq2</a>: cli_permissions.conf: deny option does not work for disallowing shell commands</li>
|
||||
</ul>
|
||||
<h3>User Notes:</h3>
|
||||
<ul>
|
||||
<li>
|
||||
<h4>res_stir_shaken.so: Handle X5U certificate chains.</h4>
|
||||
<p>The STIR/SHAKEN verification process will now load a full
|
||||
certificate chain retrieved via the X5U URL instead of loading only
|
||||
the end user cert.</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>res_stir_shaken: Add "ignore_sip_date_header" config option.</h4>
|
||||
<p>A new STIR/SHAKEN verification option "ignore_sip_date_header" has
|
||||
been added that when set to true, will cause the verification process to
|
||||
not consider a missing or invalid SIP "Date" header to be a failure. This
|
||||
will make the IAT the sole "truth" for Date in the verification process.
|
||||
The option can be set in the "verification" and "profile" sections of
|
||||
stir_shaken.conf.
|
||||
Also fixed a bug in the port match logic.
|
||||
Resolves: #1251
|
||||
Resolves: #1271</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>app_record: Add RECORDING_INFO function.</h4>
|
||||
<p>The RECORDING_INFO function can now be used
|
||||
to retrieve the duration of a recording.</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>app_queue: queue rules – Add support for QUEUE_RAISE_PENALTY=rN to raise penal..</h4>
|
||||
<p>This change introduces QUEUE_RAISE_PENALTY=rN, allowing selective penalty raises
|
||||
only for members whose current penalty is within the [min_penalty, max_penalty] range.
|
||||
Members with lower or higher penalties are unaffected.
|
||||
This behavior is backward-compatible with existing queue rule configurations.</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>res_odbc: cache_size option to limit the cached connections.</h4>
|
||||
<p>New cache_size option for res_odbc to on a per class basis limit the
|
||||
number of cached connections. Please reference the sample configuration
|
||||
for details.</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>res_odbc: cache_type option for res_odbc.</h4>
|
||||
<p>When using res_odbc it should be noted that back-end
|
||||
connections to the underlying database can now be configured to re-use
|
||||
the cached connections in a round-robin manner rather than repeatedly
|
||||
re-using the same connection. This helps to keep connections alive, and
|
||||
to purge dead connections from the system, thus more dynamically
|
||||
adjusting to actual load. The downside is that one could keep too many
|
||||
connections active for a longer time resulting in resource also begin
|
||||
consumed on the database side.</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>ARI Outbound Websockets</h4>
|
||||
<p>Asterisk can now establish websocket sessions <em>to</em> your ARI applications
|
||||
as well as accepting websocket sessions <em>from</em> them.
|
||||
Full details: http://s.asterisk.net/ari-outbound-ws</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>res_websocket_client: Create common utilities for websocket clients.</h4>
|
||||
<p>A new module "res_websocket_client" and config file
|
||||
"websocket_client.conf" have been added to support several upcoming new
|
||||
capabilities that need common websocket client configuration.</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>asterisk.c: Add option to restrict shell access from remote consoles.</h4>
|
||||
<p>A new asterisk.conf option 'disable_remote_console_shell' has
|
||||
been added that, when set, will prevent remote consoles from executing
|
||||
shell commands using the '!' prefix.
|
||||
Resolves: #GHSA-c7p6-7mvq-8jq2</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>sig_analog: Add Call Waiting Deluxe support.</h4>
|
||||
<p>Call Waiting Deluxe can now be enabled for FXS channels
|
||||
by enabling its corresponding option.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<h3>Upgrade Notes:</h3>
|
||||
<ul>
|
||||
<li>
|
||||
<h4>jansson: Upgrade version to jansson 2.14.1</h4>
|
||||
<p>jansson has been upgraded to 2.14.1. For more
|
||||
information visit jansson Github page: https://github.com/akheron/jansson/releases/tag/v2.14.1
|
||||
Resolves: #1178</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Alternate Channel Storage Backends</h4>
|
||||
<p>With this release, you can now select an alternate channel
|
||||
storage backend based on C++ Maps. Using the new backend may increase
|
||||
performance and reduce the chances of deadlocks on heavily loaded systems.
|
||||
For more information, see http://s.asterisk.net/dc679ec3</p>
|
||||
</li>
|
||||
</ul>
|
||||
<h3>Commit Authors:</h3>
|
||||
<ul>
|
||||
<li>George Joseph: (10)</li>
|
||||
<li>Itzanh: (1)</li>
|
||||
<li>Jaco Kroon: (2)</li>
|
||||
<li>Joe Searle: (1)</li>
|
||||
<li>Michal Hajek: (1)</li>
|
||||
<li>Mike Bradeen: (2)</li>
|
||||
<li>Mkmer: (1)</li>
|
||||
<li>Nathan Monfils: (1)</li>
|
||||
<li>Naveen Albert: (3)</li>
|
||||
<li>Phoneben: (1)</li>
|
||||
<li>Sean Bright: (2)</li>
|
||||
<li>Stanislav Abramenkov: (1)</li>
|
||||
<li>Sven Kube: (2)</li>
|
||||
<li>Thomas B. Clark: (1)</li>
|
||||
</ul>
|
||||
<h2>Issue and Commit Detail:</h2>
|
||||
<h3>Closed Issues:</h3>
|
||||
<ul>
|
||||
<li>!GHSA-c7p6-7mvq-8jq2: cli_permissions.conf: deny option does not work for disallowing shell commands</li>
|
||||
<li>271: [new-feature]: sig_analog: Add Call Waiting Deluxe support.</li>
|
||||
<li>548: [improvement]: Get Record() audio duration/length</li>
|
||||
<li>1088: [bug]: app_sms: Compilation failure in DEVMODE due to stringop-overflow error in GCC 15 pre-release</li>
|
||||
<li>1141: [bug]: res_pjsip: Contact header set incorrectly for call redirect (302 Moved temp.) when external_* set</li>
|
||||
<li>1178: [improvement]: jansson: Upgrade version to jansson 2.14.1</li>
|
||||
<li>1230: [bug]: ast_frame_adjust_volume and ast_frame_adjust_volume_float crash on interpolated frames</li>
|
||||
<li>1234: [bug]: Set CalllerID lost on DTMF attended transfer</li>
|
||||
<li>1240: [bug]: WebRTC invites failing on Chrome 136</li>
|
||||
<li>1243: [bug]: make menuconfig fails due to changes in GTK callbacks</li>
|
||||
<li>1251: [improvement]: PJSIP shouldn't require SIP Date header to process full shaken passport which includes iat</li>
|
||||
<li>1254: [bug]: ActiveChannels not reported when using AMI command PJSIPShowEndpoint</li>
|
||||
<li>1271: [bug]: STIR/SHAKEN not accepting port 8443 in certificate URLs</li>
|
||||
<li>1272: [improvement]: STIR/SHAKEN handle X5U certificate chains</li>
|
||||
<li>1276: MixMonitor produces broken recordings in bridged calls with asymmetric codecs (e.g., alaw vs G.722)</li>
|
||||
<li>1279: [bug]: regression: 20.12.0 downgrades quality of wav16 recordings</li>
|
||||
<li>1282: [bug]: Alternate Channel Storage Backends menuselect not enabling it</li>
|
||||
<li>1287: [bug]: channelstorage.c: Compilation failure with DEBUG_FD_LEAKS</li>
|
||||
<li>1288: [bug]: Crash when destroying channel with C++ alternative storage backend enabled</li>
|
||||
<li>ASTERISK-30373: sig_analog: Add Call Waiting Deluxe options</li>
|
||||
</ul>
|
||||
<h3>Commits By Author:</h3>
|
||||
<ul>
|
||||
<li>
|
||||
<h4>George Joseph (10):</h4>
|
||||
</li>
|
||||
<li>Alternate Channel Storage Backends</li>
|
||||
<li>lock.h: Add include for string.h when DEBUG_THREADS is defined.</li>
|
||||
<li>asterisk.c: Add option to restrict shell access from remote consoles.</li>
|
||||
<li>res_websocket_client: Create common utilities for websocket clients.</li>
|
||||
<li>ARI Outbound Websockets</li>
|
||||
<li>res_websocket_client: Add more info to the XML documentation.</li>
|
||||
<li>res_stir_shaken: Add "ignore_sip_date_header" config option.</li>
|
||||
<li>res_stir_shaken.so: Handle X5U certificate chains.</li>
|
||||
<li>channelstorage_cpp_map_name_id: Fix callback returning non-matching channels.</li>
|
||||
<li>
|
||||
<p>channelstorage: Rename callbacks that conflict with DEBUG_FD_LEAKS.</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Itzanh (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>app_sms.c: Fix sending and receiving SMS messages in protocol 2</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Jaco Kroon (2):</h4>
|
||||
</li>
|
||||
<li>res_odbc: cache_type option for res_odbc.</li>
|
||||
<li>
|
||||
<p>res_odbc: cache_size option to limit the cached connections.</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Joe Searle (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>pjproject: Increase maximum SDP formats and attribute limits</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Michal Hajek (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>audiohook.c: Improve frame pairing logic to avoid MixMonitor breakage with mix..</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Mike Bradeen (2):</h4>
|
||||
</li>
|
||||
<li>chan_pjsip: Serialize INVITE creation on DTMF attended transfer</li>
|
||||
<li>
|
||||
<p>res_pjsip_nat.c: Do not overwrite transfer host</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Nathan Monfils (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>manager.c: Invalid ref-counting when purging events</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Naveen Albert (3):</h4>
|
||||
</li>
|
||||
<li>app_sms: Ignore false positive vectorization warning.</li>
|
||||
<li>sig_analog: Add Call Waiting Deluxe support.</li>
|
||||
<li>
|
||||
<p>app_record: Add RECORDING_INFO function.</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Sean Bright (2):</h4>
|
||||
</li>
|
||||
<li>res_pjsip: Fix empty <code>ActiveChannels</code> property in AMI responses.</li>
|
||||
<li>
|
||||
<p>channelstorage_makeopts.xml: Remove errant XML character.</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Stanislav Abramenkov (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>jansson: Upgrade version to jansson 2.14.1</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Sven Kube (2):</h4>
|
||||
</li>
|
||||
<li>res_audiosocket.c: Set the TCP_NODELAY socket option</li>
|
||||
<li>
|
||||
<p>res_audiosocket.c: Add retry mechanism for reading data from AudioSocket</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Thomas B. Clark (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>menuselect: Fix GTK menu callbacks for Fedora 42 compatibility</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>mkmer (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>frame.c: validate frame data length is less than samples when adjusting volume</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>phoneben (1):</h4>
|
||||
</li>
|
||||
<li>app_queue: queue rules – Add support for QUEUE_RAISE_PENALTY=rN to raise penal..</li>
|
||||
</ul>
|
||||
<h3>Commit List:</h3>
|
||||
<ul>
|
||||
<li>channelstorage: Rename callbacks that conflict with DEBUG_FD_LEAKS.</li>
|
||||
<li>channelstorage_cpp_map_name_id: Fix callback returning non-matching channels.</li>
|
||||
<li>channelstorage_makeopts.xml: Remove errant XML character.</li>
|
||||
<li>res_stir_shaken.so: Handle X5U certificate chains.</li>
|
||||
<li>res_stir_shaken: Add "ignore_sip_date_header" config option.</li>
|
||||
<li>app_record: Add RECORDING_INFO function.</li>
|
||||
<li>app_sms.c: Fix sending and receiving SMS messages in protocol 2</li>
|
||||
<li>res_websocket_client: Add more info to the XML documentation.</li>
|
||||
<li>res_odbc: cache_size option to limit the cached connections.</li>
|
||||
<li>res_odbc: cache_type option for res_odbc.</li>
|
||||
<li>res_pjsip: Fix empty <code>ActiveChannels</code> property in AMI responses.</li>
|
||||
<li>ARI Outbound Websockets</li>
|
||||
<li>res_websocket_client: Create common utilities for websocket clients.</li>
|
||||
<li>asterisk.c: Add option to restrict shell access from remote consoles.</li>
|
||||
<li>frame.c: validate frame data length is less than samples when adjusting volume</li>
|
||||
<li>res_audiosocket.c: Add retry mechanism for reading data from AudioSocket</li>
|
||||
<li>res_audiosocket.c: Set the TCP_NODELAY socket option</li>
|
||||
<li>menuselect: Fix GTK menu callbacks for Fedora 42 compatibility</li>
|
||||
<li>jansson: Upgrade version to jansson 2.14.1</li>
|
||||
<li>pjproject: Increase maximum SDP formats and attribute limits</li>
|
||||
<li>manager.c: Invalid ref-counting when purging events</li>
|
||||
<li>res_pjsip_nat.c: Do not overwrite transfer host</li>
|
||||
<li>chan_pjsip: Serialize INVITE creation on DTMF attended transfer</li>
|
||||
<li>sig_analog: Add Call Waiting Deluxe support.</li>
|
||||
<li>app_sms: Ignore false positive vectorization warning.</li>
|
||||
<li>lock.h: Add include for string.h when DEBUG_THREADS is defined.</li>
|
||||
<li>Alternate Channel Storage Backends</li>
|
||||
</ul>
|
||||
<h3>Commit Details:</h3>
|
||||
<h4>channelstorage: Rename callbacks that conflict with DEBUG_FD_LEAKS.</h4>
|
||||
<p>Author: George Joseph
|
||||
Date: 2025-07-08</p>
|
||||
<p>DEBUG_FD_LEAKS replaces calls to "open" and "close" with functions that keep
|
||||
track of file descriptors, even when those calls are actually callbacks
|
||||
defined in structures like ast_channelstorage_instance->open and don't touch
|
||||
file descriptors. This causes compilation failures. Those callbacks
|
||||
have been renamed to "open_instance" and "close_instance" respectively.</p>
|
||||
<p>Resolves: #1287</p>
|
||||
<h4>channelstorage_cpp_map_name_id: Fix callback returning non-matching channels.</h4>
|
||||
<p>Author: George Joseph
|
||||
Date: 2025-07-09</p>
|
||||
<p>When the callback() API was invoked but no channel passed the test, callback
|
||||
would return the last channel tested instead of NULL. It now correctly
|
||||
returns NULL when no channel matches.</p>
|
||||
<p>Resolves: #1288</p>
|
||||
<h4>audiohook.c: Improve frame pairing logic to avoid MixMonitor breakage with mix..</h4>
|
||||
<p>Author: Michal Hajek
|
||||
Date: 2025-05-21</p>
|
||||
<p>This patch adjusts the read/write synchronization logic in audiohook_read_frame_both()
|
||||
to better handle calls where participants use different codecs or sample sizes
|
||||
(e.g., alaw vs G.722). The previous hard threshold of 2 * samples caused MixMonitor
|
||||
recordings to break or stutter when frames were not aligned between both directions.</p>
|
||||
<p>The new logic uses a more tolerant limit (1.5 * samples), which prevents audio tearing
|
||||
without causing excessive buffer overruns. This fix specifically addresses issues
|
||||
with MixMonitor when recording directly on a channel in a bridge using mixed codecs.</p>
|
||||
<p>Reported-by: Michal Hajek <a href="mailto:michal.hajek@daktela.com">michal.hajek@daktela.com</a></p>
|
||||
<p>Resolves: #1276
|
||||
Resolves: #1279</p>
|
||||
<h4>channelstorage_makeopts.xml: Remove errant XML character.</h4>
|
||||
<p>Author: Sean Bright
|
||||
Date: 2025-06-30</p>
|
||||
<p>Resolves: #1282</p>
|
||||
<h4>res_stir_shaken.so: Handle X5U certificate chains.</h4>
|
||||
<p>Author: George Joseph
|
||||
Date: 2025-06-18</p>
|
||||
<p>The verification process will now load a full certificate chain retrieved
|
||||
via the X5U URL instead of loading only the end user cert.</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>Renamed crypto_load_cert_from_file() and crypto_load_cert_from_memory()
|
||||
to crypto_load_cert_chain_from_file() and crypto_load_cert_chain_from_memory()
|
||||
respectively.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The two load functions now continue to load certs from the file or memory
|
||||
PEMs and store them in a separate stack of untrusted certs specific to the
|
||||
current verification context.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>crypto_is_cert_trusted() now uses the stack of untrusted certs that were
|
||||
extracted from the PEM in addition to any untrusted certs that were passed
|
||||
in from the configuration (and any CA certs passed in from the config of
|
||||
course).</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>Resolves: #1272</p>
|
||||
<p>UserNote: The STIR/SHAKEN verification process will now load a full
|
||||
certificate chain retrieved via the X5U URL instead of loading only
|
||||
the end user cert.</p>
|
||||
<h4>res_stir_shaken: Add "ignore_sip_date_header" config option.</h4>
|
||||
<p>Author: George Joseph
|
||||
Date: 2025-06-15</p>
|
||||
<p>UserNote: A new STIR/SHAKEN verification option "ignore_sip_date_header" has
|
||||
been added that when set to true, will cause the verification process to
|
||||
not consider a missing or invalid SIP "Date" header to be a failure. This
|
||||
will make the IAT the sole "truth" for Date in the verification process.
|
||||
The option can be set in the "verification" and "profile" sections of
|
||||
stir_shaken.conf.</p>
|
||||
<p>Also fixed a bug in the port match logic.</p>
|
||||
<p>Resolves: #1251
|
||||
Resolves: #1271</p>
|
||||
<h4>app_record: Add RECORDING_INFO function.</h4>
|
||||
<p>Author: Naveen Albert
|
||||
Date: 2024-01-22</p>
|
||||
<p>Add a function that can be used to retrieve info
|
||||
about a previous recording, such as its duration.</p>
|
||||
<p>This is being added as a function to avoid possibly
|
||||
trampling on dialplan variables, and could be extended
|
||||
to provide other information in the future.</p>
|
||||
<p>Resolves: #548</p>
|
||||
<p>UserNote: The RECORDING_INFO function can now be used
|
||||
to retrieve the duration of a recording.</p>
|
||||
<h4>app_sms.c: Fix sending and receiving SMS messages in protocol 2</h4>
|
||||
<p>Author: Itzanh
|
||||
Date: 2025-04-06</p>
|
||||
<p>This fixes bugs in SMS messaging to SMS-capable analog phones that prevented app_sms.c from talking to phones using SMS protocol 2.</p>
|
||||
<ul>
|
||||
<li>Fix MORX message reception (from phone to Asterisk) in SMS protocol 2</li>
|
||||
<li>Fix MTTX message transmission (from Asterisk to phone) in SMS protocol 2</li>
|
||||
</ul>
|
||||
<p>One of the bugs caused messages to have random characters and junk appended at the end up to the character limit. Another bug prevented Asterisk from sending messages from Asterisk to the phone at all. A final bug caused the transmission from Asterisk to the phone to take a long time because app_sms.c did not hang up after correctly sending the message, causing the phone to have to time out and hang up in order to complete the message transmission.</p>
|
||||
<p>This was tested with a Linksys PAP2T and with a GrandStream HT814, sending and receiving messages with Telefónica DOMO Mensajes phones from Telefónica Spain. I had to play with both the network jitter buffer and the dB gain to get it to work. One of my phones required the gain to be set to +3dB for it to work, while another required it to be set to +6dB.</p>
|
||||
<p>Only MORX and MTTX were tested, I did not test sending and receiving messages to a TelCo SMSC.</p>
|
||||
<h4>app_queue: queue rules – Add support for QUEUE_RAISE_PENALTY=rN to raise penal..</h4>
|
||||
<p>Author: phoneben
|
||||
Date: 2025-05-26</p>
|
||||
<p>This update adds support for a new QUEUE_RAISE_PENALTY format: rN</p>
|
||||
<p>When QUEUE_RAISE_PENALTY is set to rN (e.g., r4), only members whose current penalty
|
||||
is greater than or equal to the defined min_penalty and less than or equal to max_penalty
|
||||
will have their penalty raised to N.</p>
|
||||
<p>Members with penalties outside the min/max range remain unchanged.</p>
|
||||
<p>Example behaviors:</p>
|
||||
<p>QUEUE_RAISE_PENALTY=4 → Raise all members with penalty < 4 (existing behavior)
|
||||
QUEUE_RAISE_PENALTY=r4 → Raise only members with penalty in [min_penalty, max_penalty] to 4</p>
|
||||
<p>Implementation details:</p>
|
||||
<p>Adds parsing logic to detect the r prefix and sets the raise_respect_min flag</p>
|
||||
<p>Modifies the raise logic to skip members outside the defined penalty range when the flag is active</p>
|
||||
<p>UserNote: This change introduces QUEUE_RAISE_PENALTY=rN, allowing selective penalty raises
|
||||
only for members whose current penalty is within the [min_penalty, max_penalty] range.
|
||||
Members with lower or higher penalties are unaffected.
|
||||
This behavior is backward-compatible with existing queue rule configurations.</p>
|
||||
<h4>res_websocket_client: Add more info to the XML documentation.</h4>
|
||||
<p>Author: George Joseph
|
||||
Date: 2025-06-05</p>
|
||||
<p>Added "see-also" links to chan_websocket and ARI Outbound WebSocket and
|
||||
added an example configuration for each.</p>
|
||||
<h4>res_odbc: cache_size option to limit the cached connections.</h4>
|
||||
<p>Author: Jaco Kroon
|
||||
Date: 2024-12-13</p>
|
||||
<p>Signed-off-by: Jaco Kroon <a href="mailto:jaco@uls.co.za">jaco@uls.co.za</a></p>
|
||||
<p>UserNote: New cache_size option for res_odbc to on a per class basis limit the
|
||||
number of cached connections. Please reference the sample configuration
|
||||
for details.</p>
|
||||
<h4>res_odbc: cache_type option for res_odbc.</h4>
|
||||
<p>Author: Jaco Kroon
|
||||
Date: 2024-12-10</p>
|
||||
<p>This enables setting cache_type classes to a round-robin queueing system
|
||||
rather than the historic stack mechanism.</p>
|
||||
<p>This should result in lower risk of connection drops due to shorter idle
|
||||
times (the first connection to go onto the stack could in theory never
|
||||
be used again, ever, but sit there consuming resources, there could be
|
||||
multiple of these).</p>
|
||||
<p>And with a queue rather than a stack, dead connections are guaranteed to
|
||||
be detected and purged eventually.</p>
|
||||
<p>This should end up better balancing connection_cnt with actual load
|
||||
over time, assuming the database doesn't keep connections open
|
||||
excessively long from it's side.</p>
|
||||
<p>Signed-off-by: Jaco Kroon <a href="mailto:jaco@uls.co.za">jaco@uls.co.za</a></p>
|
||||
<p>UserNote: When using res_odbc it should be noted that back-end
|
||||
connections to the underlying database can now be configured to re-use
|
||||
the cached connections in a round-robin manner rather than repeatedly
|
||||
re-using the same connection. This helps to keep connections alive, and
|
||||
to purge dead connections from the system, thus more dynamically
|
||||
adjusting to actual load. The downside is that one could keep too many
|
||||
connections active for a longer time resulting in resource also begin
|
||||
consumed on the database side.</p>
|
||||
<h4>res_pjsip: Fix empty <code>ActiveChannels</code> property in AMI responses.</h4>
|
||||
<p>Author: Sean Bright
|
||||
Date: 2025-05-27</p>
|
||||
<p>The logic appears to have been reversed since it was introduced in
|
||||
05cbf8df.</p>
|
||||
<p>Resolves: #1254</p>
|
||||
<h4>ARI Outbound Websockets</h4>
|
||||
<p>Author: George Joseph
|
||||
Date: 2025-03-28</p>
|
||||
<p>Asterisk can now establish websocket sessions <em>to</em> your ARI applications
|
||||
as well as accepting websocket sessions <em>from</em> them.
|
||||
Full details: http://s.asterisk.net/ari-outbound-ws</p>
|
||||
<p>Code change summary:
|
||||
* Added an ast_vector_string_join() function,
|
||||
* Added ApplicationRegistered and ApplicationUnregistered ARI events.
|
||||
* Converted res/ari/config.c to use sorcery to process ari.conf.
|
||||
* Added the "outbound-websocket" ARI config object.
|
||||
* Refactored res/ari/ari_websockets.c to handle outbound websockets.
|
||||
* Refactored res/ari/cli.c for the sorcery changeover.
|
||||
* Updated res/res_stasis.c for the sorcery changeover.
|
||||
* Updated apps/app_stasis.c to allow initiating per-call outbound websockets.
|
||||
* Added CLI commands to manage ARI websockets.
|
||||
* Added the new "outbound-websocket" object to ari.conf.sample.
|
||||
* Moved the ARI XML documentation out of res_ari.c into res/ari/ari_doc.xml</p>
|
||||
<p>UserNote: Asterisk can now establish websocket sessions <em>to</em> your ARI applications
|
||||
as well as accepting websocket sessions <em>from</em> them.
|
||||
Full details: http://s.asterisk.net/ari-outbound-ws</p>
|
||||
<h4>res_websocket_client: Create common utilities for websocket clients.</h4>
|
||||
<p>Author: George Joseph
|
||||
Date: 2025-05-02</p>
|
||||
<p>Since multiple Asterisk capabilities now need to create websocket clients
|
||||
it makes sense to create a common set of utilities rather than making
|
||||
each of those capabilities implement their own.</p>
|
||||
<ul>
|
||||
<li>A new configuration file "websocket_client.conf" is used to store common
|
||||
client parameters in named configuration sections.</li>
|
||||
<li>APIs are provided to list and retrieve ast_websocket_client objects created
|
||||
from the named configurations.</li>
|
||||
<li>An API is provided that accepts an ast_websocket_client object, connects
|
||||
to the remote server with retries and returns an ast_websocket object. TLS is
|
||||
supported as is basic authentication.</li>
|
||||
<li>An observer can be registered to receive notification of loaded or reloaded
|
||||
client objects.</li>
|
||||
<li>An API is provided to compare an existing client object to one just
|
||||
reloaded and return the fields that were changed. The caller can then decide
|
||||
what action to take based on which fields changed.</li>
|
||||
</ul>
|
||||
<p>Also as part of thie commit, several sorcery convenience macros were created
|
||||
to make registering common object fields easier.</p>
|
||||
<p>UserNote: A new module "res_websocket_client" and config file
|
||||
"websocket_client.conf" have been added to support several upcoming new
|
||||
capabilities that need common websocket client configuration.</p>
|
||||
<h4>asterisk.c: Add option to restrict shell access from remote consoles.</h4>
|
||||
<p>Author: George Joseph
|
||||
Date: 2025-05-19</p>
|
||||
<p>UserNote: A new asterisk.conf option 'disable_remote_console_shell' has
|
||||
been added that, when set, will prevent remote consoles from executing
|
||||
shell commands using the '!' prefix.</p>
|
||||
<p>Resolves: #GHSA-c7p6-7mvq-8jq2</p>
|
||||
<h4>frame.c: validate frame data length is less than samples when adjusting volume</h4>
|
||||
<p>Author: mkmer
|
||||
Date: 2025-05-12</p>
|
||||
<p>Resolves: #1230</p>
|
||||
<h4>res_audiosocket.c: Add retry mechanism for reading data from AudioSocket</h4>
|
||||
<p>Author: Sven Kube
|
||||
Date: 2025-05-13</p>
|
||||
<p>The added retry mechanism addresses an issue that arises when fragmented TCP
|
||||
packets are received, each containing only a portion of an AudioSocket packet.
|
||||
This situation can occur if the external service sending the AudioSocket data
|
||||
has Nagle's algorithm enabled.</p>
|
||||
<h4>res_audiosocket.c: Set the TCP_NODELAY socket option</h4>
|
||||
<p>Author: Sven Kube
|
||||
Date: 2025-05-13</p>
|
||||
<p>Disable Nagle's algorithm by setting the TCP_NODELAY socket option.
|
||||
This reduces latency by preventing delays caused by packet buffering.</p>
|
||||
<h4>menuselect: Fix GTK menu callbacks for Fedora 42 compatibility</h4>
|
||||
<p>Author: Thomas B. Clark
|
||||
Date: 2025-05-12</p>
|
||||
<p>This patch resolves a build failure in <code>menuselect_gtk.c</code> when running
|
||||
<code>make menuconfig</code> on Fedora 42. The new version of GTK introduced stricter
|
||||
type checking for callback signatures.</p>
|
||||
<p>Changes include:
|
||||
- Add wrapper functions to match the expected <code>void (*)(void)</code> signature.
|
||||
- Update <code>menu_items</code> array to use these wrappers.</p>
|
||||
<p>Fixes: #1243</p>
|
||||
<h4>jansson: Upgrade version to jansson 2.14.1</h4>
|
||||
<p>Author: Stanislav Abramenkov
|
||||
Date: 2025-03-24</p>
|
||||
<p>UpgradeNote: jansson has been upgraded to 2.14.1. For more
|
||||
information visit jansson Github page: https://github.com/akheron/jansson/releases/tag/v2.14.1</p>
|
||||
<p>Resolves: #1178</p>
|
||||
<h4>pjproject: Increase maximum SDP formats and attribute limits</h4>
|
||||
<p>Author: Joe Searle
|
||||
Date: 2025-05-15</p>
|
||||
<p>Since Chrome 136, using Windows, when initiating a video call the INVITE SDP exceeds the maximum number of allowed attributes, resulting in the INVITE being rejected. This increases the attribute limit and the number of formats allowed when using bundled pjproject.</p>
|
||||
<p>Fixes: #1240</p>
|
||||
<h4>manager.c: Invalid ref-counting when purging events</h4>
|
||||
<p>Author: Nathan Monfils
|
||||
Date: 2025-05-05</p>
|
||||
<p>We have a use-case where we generate a <em>lot</em> of events on the AMI, and
|
||||
then when doing <code>manager show eventq</code> we would see some events which
|
||||
would linger for hours or days in there. Obviously something was leaking.
|
||||
Testing allowed us to track down this logic bug in the ref-counting on
|
||||
the event purge.</p>
|
||||
<p>Reproducing the bug was not super trivial, we managed to do it in a
|
||||
production-like load testing environment with multiple AMI consumers.</p>
|
||||
<p>The race condition itself:</p>
|
||||
<ol>
|
||||
<li>something allocates and links <code>session</code></li>
|
||||
<li><code>purge_sessions</code> iterates over that <code>session</code> (takes ref)</li>
|
||||
<li><code>purge_session</code> correctly de-referencess that session</li>
|
||||
<li><code>purge_session</code> re-evaluates the while() loop, taking a reference</li>
|
||||
<li><code>purge_session</code> exits (<code>n_max > 0</code> is false)</li>
|
||||
<li>whatever allocated the <code>session</code> deallocates it, but a reference is
|
||||
now lost since we exited the <code>while</code> loop before de-referencing.</li>
|
||||
<li>since the destructor is never called, the session->last_ev->usecount
|
||||
is never decremented, leading to events lingering in the queue</li>
|
||||
</ol>
|
||||
<p>The impact of this bug does not seem major. The events are small and do
|
||||
not seem, from our testing, to be causing meaningful additional CPU
|
||||
usage. Mainly we wanted to fix this issue because we are internally
|
||||
adding prometheus metrics to the eventq and those leaked events were
|
||||
causing the metrics to show garbage data.</p>
|
||||
<h4>res_pjsip_nat.c: Do not overwrite transfer host</h4>
|
||||
<p>Author: Mike Bradeen
|
||||
Date: 2025-05-08</p>
|
||||
<p>When a call is transfered via dialplan behind a NAT, the
|
||||
host portion of the Contact header in the 302 will no longer
|
||||
be over-written with the external NAT IP and will retain the
|
||||
hostname.</p>
|
||||
<p>Fixes: #1141</p>
|
||||
<h4>chan_pjsip: Serialize INVITE creation on DTMF attended transfer</h4>
|
||||
<p>Author: Mike Bradeen
|
||||
Date: 2025-05-05</p>
|
||||
<p>When a call is transfered via DTMF feature code, the Transfer Target and
|
||||
Transferer are bridged immediately. This opens the possibilty of a race
|
||||
condition between the creation of an INVITE and the bridge induced colp
|
||||
update that can result in the set caller ID being over-written with the
|
||||
transferer's default info.</p>
|
||||
<p>Fixes: #1234</p>
|
||||
<h4>sig_analog: Add Call Waiting Deluxe support.</h4>
|
||||
<p>Author: Naveen Albert
|
||||
Date: 2023-08-24</p>
|
||||
<p>Adds support for Call Waiting Deluxe options to enhance
|
||||
the current call waiting feature.</p>
|
||||
<p>As part of this change, a mechanism is also added that
|
||||
allows a channel driver to queue an audio file for Dial()
|
||||
to play, which is necessary for the announcement function.</p>
|
||||
<p>ASTERISK-30373 #close</p>
|
||||
<p>Resolves: #271</p>
|
||||
<p>UserNote: Call Waiting Deluxe can now be enabled for FXS channels
|
||||
by enabling its corresponding option.</p>
|
||||
<h4>app_sms: Ignore false positive vectorization warning.</h4>
|
||||
<p>Author: Naveen Albert
|
||||
Date: 2025-01-24</p>
|
||||
<p>Ignore gcc warning about writing 32 bytes into a region of size 6,
|
||||
since we check that we don't go out of bounds for each byte.
|
||||
This is due to a vectorization bug in gcc 15, stemming from
|
||||
gcc commit 68326d5d1a593dc0bf098c03aac25916168bc5a9.</p>
|
||||
<p>Resolves: #1088</p>
|
||||
<h4>lock.h: Add include for string.h when DEBUG_THREADS is defined.</h4>
|
||||
<p>Author: George Joseph
|
||||
Date: 2025-05-02</p>
|
||||
<p>When DEBUG_THREADS is defined, lock.h uses strerror(), which is defined
|
||||
in the libc string.h file, to print warning messages. If the including
|
||||
source file doesn't include string.h then strerror() won't be found and
|
||||
and compile errors will be thrown. Since lock.h depends on this, string.h
|
||||
is now included from there if DEBUG_THREADS is defined. This way, including
|
||||
source files don't have to worry about it.</p>
|
||||
<h4>Alternate Channel Storage Backends</h4>
|
||||
<p>Author: George Joseph
|
||||
Date: 2024-12-31</p>
|
||||
<p>Full details: http://s.asterisk.net/dc679ec3</p>
|
||||
<p>The previous proof-of-concept showed that the cpp_map_name_id alternate
|
||||
storage backed performed better than all the others so this final PR
|
||||
adds only that option. You still need to enable it in menuselect under
|
||||
the "Alternate Channel Storage Backends" category.</p>
|
||||
<p>To select which one is used at runtime, set the "channel_storage_backend"
|
||||
option in asterisk.conf to one of the values described in
|
||||
asterisk.conf.sample. The default remains "ao2_legacy".</p>
|
||||
<p>UpgradeNote: With this release, you can now select an alternate channel
|
||||
storage backend based on C++ Maps. Using the new backend may increase
|
||||
performance and reduce the chances of deadlocks on heavily loaded systems.
|
||||
For more information, see http://s.asterisk.net/dc679ec3</p>
|
||||
</body></html>
|
||||
677
ChangeLogs/ChangeLog-22.5.0.md
Normal file
677
ChangeLogs/ChangeLog-22.5.0.md
Normal file
@@ -0,0 +1,677 @@
|
||||
|
||||
## Change Log for Release asterisk-22.5.0
|
||||
|
||||
### Links:
|
||||
|
||||
- [Full ChangeLog](https://downloads.asterisk.org/pub/telephony/asterisk/releases/ChangeLog-22.5.0.html)
|
||||
- [GitHub Diff](https://github.com/asterisk/asterisk/compare/22.4.1...22.5.0)
|
||||
- [Tarball](https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22.5.0.tar.gz)
|
||||
- [Downloads](https://downloads.asterisk.org/pub/telephony/asterisk)
|
||||
|
||||
### Summary:
|
||||
|
||||
- Commits: 29
|
||||
- Commit Authors: 14
|
||||
- Issues Resolved: 19
|
||||
- Security Advisories Resolved: 1
|
||||
- [GHSA-c7p6-7mvq-8jq2](https://github.com/asterisk/asterisk/security/advisories/GHSA-c7p6-7mvq-8jq2): cli_permissions.conf: deny option does not work for disallowing shell commands
|
||||
|
||||
### User Notes:
|
||||
|
||||
- #### res_stir_shaken.so: Handle X5U certificate chains.
|
||||
The STIR/SHAKEN verification process will now load a full
|
||||
certificate chain retrieved via the X5U URL instead of loading only
|
||||
the end user cert.
|
||||
|
||||
- #### res_stir_shaken: Add "ignore_sip_date_header" config option.
|
||||
A new STIR/SHAKEN verification option "ignore_sip_date_header" has
|
||||
been added that when set to true, will cause the verification process to
|
||||
not consider a missing or invalid SIP "Date" header to be a failure. This
|
||||
will make the IAT the sole "truth" for Date in the verification process.
|
||||
The option can be set in the "verification" and "profile" sections of
|
||||
stir_shaken.conf.
|
||||
Also fixed a bug in the port match logic.
|
||||
Resolves: #1251
|
||||
Resolves: #1271
|
||||
|
||||
- #### app_record: Add RECORDING_INFO function.
|
||||
The RECORDING_INFO function can now be used
|
||||
to retrieve the duration of a recording.
|
||||
|
||||
- #### app_queue: queue rules – Add support for QUEUE_RAISE_PENALTY=rN to raise penal..
|
||||
This change introduces QUEUE_RAISE_PENALTY=rN, allowing selective penalty raises
|
||||
only for members whose current penalty is within the [min_penalty, max_penalty] range.
|
||||
Members with lower or higher penalties are unaffected.
|
||||
This behavior is backward-compatible with existing queue rule configurations.
|
||||
|
||||
- #### res_odbc: cache_size option to limit the cached connections.
|
||||
New cache_size option for res_odbc to on a per class basis limit the
|
||||
number of cached connections. Please reference the sample configuration
|
||||
for details.
|
||||
|
||||
- #### res_odbc: cache_type option for res_odbc.
|
||||
When using res_odbc it should be noted that back-end
|
||||
connections to the underlying database can now be configured to re-use
|
||||
the cached connections in a round-robin manner rather than repeatedly
|
||||
re-using the same connection. This helps to keep connections alive, and
|
||||
to purge dead connections from the system, thus more dynamically
|
||||
adjusting to actual load. The downside is that one could keep too many
|
||||
connections active for a longer time resulting in resource also begin
|
||||
consumed on the database side.
|
||||
|
||||
- #### ARI Outbound Websockets
|
||||
Asterisk can now establish websocket sessions _to_ your ARI applications
|
||||
as well as accepting websocket sessions _from_ them.
|
||||
Full details: http://s.asterisk.net/ari-outbound-ws
|
||||
|
||||
- #### res_websocket_client: Create common utilities for websocket clients.
|
||||
A new module "res_websocket_client" and config file
|
||||
"websocket_client.conf" have been added to support several upcoming new
|
||||
capabilities that need common websocket client configuration.
|
||||
|
||||
- #### asterisk.c: Add option to restrict shell access from remote consoles.
|
||||
A new asterisk.conf option 'disable_remote_console_shell' has
|
||||
been added that, when set, will prevent remote consoles from executing
|
||||
shell commands using the '!' prefix.
|
||||
Resolves: #GHSA-c7p6-7mvq-8jq2
|
||||
|
||||
- #### sig_analog: Add Call Waiting Deluxe support.
|
||||
Call Waiting Deluxe can now be enabled for FXS channels
|
||||
by enabling its corresponding option.
|
||||
|
||||
|
||||
### Upgrade Notes:
|
||||
|
||||
- #### jansson: Upgrade version to jansson 2.14.1
|
||||
jansson has been upgraded to 2.14.1. For more
|
||||
information visit jansson Github page: https://github.com/akheron/jansson/releases/tag/v2.14.1
|
||||
Resolves: #1178
|
||||
|
||||
- #### Alternate Channel Storage Backends
|
||||
With this release, you can now select an alternate channel
|
||||
storage backend based on C++ Maps. Using the new backend may increase
|
||||
performance and reduce the chances of deadlocks on heavily loaded systems.
|
||||
For more information, see http://s.asterisk.net/dc679ec3
|
||||
|
||||
|
||||
### Commit Authors:
|
||||
|
||||
- George Joseph: (10)
|
||||
- Itzanh: (1)
|
||||
- Jaco Kroon: (2)
|
||||
- Joe Searle: (1)
|
||||
- Michal Hajek: (1)
|
||||
- Mike Bradeen: (2)
|
||||
- Mkmer: (1)
|
||||
- Nathan Monfils: (1)
|
||||
- Naveen Albert: (3)
|
||||
- Phoneben: (1)
|
||||
- Sean Bright: (2)
|
||||
- Stanislav Abramenkov: (1)
|
||||
- Sven Kube: (2)
|
||||
- Thomas B. Clark: (1)
|
||||
|
||||
## Issue and Commit Detail:
|
||||
|
||||
### Closed Issues:
|
||||
|
||||
- !GHSA-c7p6-7mvq-8jq2: cli_permissions.conf: deny option does not work for disallowing shell commands
|
||||
- 271: [new-feature]: sig_analog: Add Call Waiting Deluxe support.
|
||||
- 548: [improvement]: Get Record() audio duration/length
|
||||
- 1088: [bug]: app_sms: Compilation failure in DEVMODE due to stringop-overflow error in GCC 15 pre-release
|
||||
- 1141: [bug]: res_pjsip: Contact header set incorrectly for call redirect (302 Moved temp.) when external_* set
|
||||
- 1178: [improvement]: jansson: Upgrade version to jansson 2.14.1
|
||||
- 1230: [bug]: ast_frame_adjust_volume and ast_frame_adjust_volume_float crash on interpolated frames
|
||||
- 1234: [bug]: Set CalllerID lost on DTMF attended transfer
|
||||
- 1240: [bug]: WebRTC invites failing on Chrome 136
|
||||
- 1243: [bug]: make menuconfig fails due to changes in GTK callbacks
|
||||
- 1251: [improvement]: PJSIP shouldn't require SIP Date header to process full shaken passport which includes iat
|
||||
- 1254: [bug]: ActiveChannels not reported when using AMI command PJSIPShowEndpoint
|
||||
- 1271: [bug]: STIR/SHAKEN not accepting port 8443 in certificate URLs
|
||||
- 1272: [improvement]: STIR/SHAKEN handle X5U certificate chains
|
||||
- 1276: MixMonitor produces broken recordings in bridged calls with asymmetric codecs (e.g., alaw vs G.722)
|
||||
- 1279: [bug]: regression: 20.12.0 downgrades quality of wav16 recordings
|
||||
- 1282: [bug]: Alternate Channel Storage Backends menuselect not enabling it
|
||||
- 1287: [bug]: channelstorage.c: Compilation failure with DEBUG_FD_LEAKS
|
||||
- 1288: [bug]: Crash when destroying channel with C++ alternative storage backend enabled
|
||||
- ASTERISK-30373: sig_analog: Add Call Waiting Deluxe options
|
||||
|
||||
### Commits By Author:
|
||||
|
||||
- #### George Joseph (10):
|
||||
- Alternate Channel Storage Backends
|
||||
- lock.h: Add include for string.h when DEBUG_THREADS is defined.
|
||||
- asterisk.c: Add option to restrict shell access from remote consoles.
|
||||
- res_websocket_client: Create common utilities for websocket clients.
|
||||
- ARI Outbound Websockets
|
||||
- res_websocket_client: Add more info to the XML documentation.
|
||||
- res_stir_shaken: Add "ignore_sip_date_header" config option.
|
||||
- res_stir_shaken.so: Handle X5U certificate chains.
|
||||
- channelstorage_cpp_map_name_id: Fix callback returning non-matching channels.
|
||||
- channelstorage: Rename callbacks that conflict with DEBUG_FD_LEAKS.
|
||||
|
||||
- #### Itzanh (1):
|
||||
- app_sms.c: Fix sending and receiving SMS messages in protocol 2
|
||||
|
||||
- #### Jaco Kroon (2):
|
||||
- res_odbc: cache_type option for res_odbc.
|
||||
- res_odbc: cache_size option to limit the cached connections.
|
||||
|
||||
- #### Joe Searle (1):
|
||||
- pjproject: Increase maximum SDP formats and attribute limits
|
||||
|
||||
- #### Michal Hajek (1):
|
||||
- audiohook.c: Improve frame pairing logic to avoid MixMonitor breakage with mix..
|
||||
|
||||
- #### Mike Bradeen (2):
|
||||
- chan_pjsip: Serialize INVITE creation on DTMF attended transfer
|
||||
- res_pjsip_nat.c: Do not overwrite transfer host
|
||||
|
||||
- #### Nathan Monfils (1):
|
||||
- manager.c: Invalid ref-counting when purging events
|
||||
|
||||
- #### Naveen Albert (3):
|
||||
- app_sms: Ignore false positive vectorization warning.
|
||||
- sig_analog: Add Call Waiting Deluxe support.
|
||||
- app_record: Add RECORDING_INFO function.
|
||||
|
||||
- #### Sean Bright (2):
|
||||
- res_pjsip: Fix empty `ActiveChannels` property in AMI responses.
|
||||
- channelstorage_makeopts.xml: Remove errant XML character.
|
||||
|
||||
- #### Stanislav Abramenkov (1):
|
||||
- jansson: Upgrade version to jansson 2.14.1
|
||||
|
||||
- #### Sven Kube (2):
|
||||
- res_audiosocket.c: Set the TCP_NODELAY socket option
|
||||
- res_audiosocket.c: Add retry mechanism for reading data from AudioSocket
|
||||
|
||||
- #### Thomas B. Clark (1):
|
||||
- menuselect: Fix GTK menu callbacks for Fedora 42 compatibility
|
||||
|
||||
- #### mkmer (1):
|
||||
- frame.c: validate frame data length is less than samples when adjusting volume
|
||||
|
||||
- #### phoneben (1):
|
||||
- app_queue: queue rules – Add support for QUEUE_RAISE_PENALTY=rN to raise penal..
|
||||
|
||||
|
||||
### Commit List:
|
||||
|
||||
- channelstorage: Rename callbacks that conflict with DEBUG_FD_LEAKS.
|
||||
- channelstorage_cpp_map_name_id: Fix callback returning non-matching channels.
|
||||
- channelstorage_makeopts.xml: Remove errant XML character.
|
||||
- res_stir_shaken.so: Handle X5U certificate chains.
|
||||
- res_stir_shaken: Add "ignore_sip_date_header" config option.
|
||||
- app_record: Add RECORDING_INFO function.
|
||||
- app_sms.c: Fix sending and receiving SMS messages in protocol 2
|
||||
- res_websocket_client: Add more info to the XML documentation.
|
||||
- res_odbc: cache_size option to limit the cached connections.
|
||||
- res_odbc: cache_type option for res_odbc.
|
||||
- res_pjsip: Fix empty `ActiveChannels` property in AMI responses.
|
||||
- ARI Outbound Websockets
|
||||
- res_websocket_client: Create common utilities for websocket clients.
|
||||
- asterisk.c: Add option to restrict shell access from remote consoles.
|
||||
- frame.c: validate frame data length is less than samples when adjusting volume
|
||||
- res_audiosocket.c: Add retry mechanism for reading data from AudioSocket
|
||||
- res_audiosocket.c: Set the TCP_NODELAY socket option
|
||||
- menuselect: Fix GTK menu callbacks for Fedora 42 compatibility
|
||||
- jansson: Upgrade version to jansson 2.14.1
|
||||
- pjproject: Increase maximum SDP formats and attribute limits
|
||||
- manager.c: Invalid ref-counting when purging events
|
||||
- res_pjsip_nat.c: Do not overwrite transfer host
|
||||
- chan_pjsip: Serialize INVITE creation on DTMF attended transfer
|
||||
- sig_analog: Add Call Waiting Deluxe support.
|
||||
- app_sms: Ignore false positive vectorization warning.
|
||||
- lock.h: Add include for string.h when DEBUG_THREADS is defined.
|
||||
- Alternate Channel Storage Backends
|
||||
|
||||
### Commit Details:
|
||||
|
||||
#### channelstorage: Rename callbacks that conflict with DEBUG_FD_LEAKS.
|
||||
Author: George Joseph
|
||||
Date: 2025-07-08
|
||||
|
||||
DEBUG_FD_LEAKS replaces calls to "open" and "close" with functions that keep
|
||||
track of file descriptors, even when those calls are actually callbacks
|
||||
defined in structures like ast_channelstorage_instance->open and don't touch
|
||||
file descriptors. This causes compilation failures. Those callbacks
|
||||
have been renamed to "open_instance" and "close_instance" respectively.
|
||||
|
||||
Resolves: #1287
|
||||
|
||||
#### channelstorage_cpp_map_name_id: Fix callback returning non-matching channels.
|
||||
Author: George Joseph
|
||||
Date: 2025-07-09
|
||||
|
||||
When the callback() API was invoked but no channel passed the test, callback
|
||||
would return the last channel tested instead of NULL. It now correctly
|
||||
returns NULL when no channel matches.
|
||||
|
||||
Resolves: #1288
|
||||
|
||||
#### audiohook.c: Improve frame pairing logic to avoid MixMonitor breakage with mix..
|
||||
Author: Michal Hajek
|
||||
Date: 2025-05-21
|
||||
|
||||
This patch adjusts the read/write synchronization logic in audiohook_read_frame_both()
|
||||
to better handle calls where participants use different codecs or sample sizes
|
||||
(e.g., alaw vs G.722). The previous hard threshold of 2 * samples caused MixMonitor
|
||||
recordings to break or stutter when frames were not aligned between both directions.
|
||||
|
||||
The new logic uses a more tolerant limit (1.5 * samples), which prevents audio tearing
|
||||
without causing excessive buffer overruns. This fix specifically addresses issues
|
||||
with MixMonitor when recording directly on a channel in a bridge using mixed codecs.
|
||||
|
||||
Reported-by: Michal Hajek <michal.hajek@daktela.com>
|
||||
|
||||
Resolves: #1276
|
||||
Resolves: #1279
|
||||
|
||||
#### channelstorage_makeopts.xml: Remove errant XML character.
|
||||
Author: Sean Bright
|
||||
Date: 2025-06-30
|
||||
|
||||
Resolves: #1282
|
||||
|
||||
#### res_stir_shaken.so: Handle X5U certificate chains.
|
||||
Author: George Joseph
|
||||
Date: 2025-06-18
|
||||
|
||||
The verification process will now load a full certificate chain retrieved
|
||||
via the X5U URL instead of loading only the end user cert.
|
||||
|
||||
* Renamed crypto_load_cert_from_file() and crypto_load_cert_from_memory()
|
||||
to crypto_load_cert_chain_from_file() and crypto_load_cert_chain_from_memory()
|
||||
respectively.
|
||||
|
||||
* The two load functions now continue to load certs from the file or memory
|
||||
PEMs and store them in a separate stack of untrusted certs specific to the
|
||||
current verification context.
|
||||
|
||||
* crypto_is_cert_trusted() now uses the stack of untrusted certs that were
|
||||
extracted from the PEM in addition to any untrusted certs that were passed
|
||||
in from the configuration (and any CA certs passed in from the config of
|
||||
course).
|
||||
|
||||
Resolves: #1272
|
||||
|
||||
UserNote: The STIR/SHAKEN verification process will now load a full
|
||||
certificate chain retrieved via the X5U URL instead of loading only
|
||||
the end user cert.
|
||||
|
||||
|
||||
#### res_stir_shaken: Add "ignore_sip_date_header" config option.
|
||||
Author: George Joseph
|
||||
Date: 2025-06-15
|
||||
|
||||
UserNote: A new STIR/SHAKEN verification option "ignore_sip_date_header" has
|
||||
been added that when set to true, will cause the verification process to
|
||||
not consider a missing or invalid SIP "Date" header to be a failure. This
|
||||
will make the IAT the sole "truth" for Date in the verification process.
|
||||
The option can be set in the "verification" and "profile" sections of
|
||||
stir_shaken.conf.
|
||||
|
||||
Also fixed a bug in the port match logic.
|
||||
|
||||
Resolves: #1251
|
||||
Resolves: #1271
|
||||
|
||||
#### app_record: Add RECORDING_INFO function.
|
||||
Author: Naveen Albert
|
||||
Date: 2024-01-22
|
||||
|
||||
Add a function that can be used to retrieve info
|
||||
about a previous recording, such as its duration.
|
||||
|
||||
This is being added as a function to avoid possibly
|
||||
trampling on dialplan variables, and could be extended
|
||||
to provide other information in the future.
|
||||
|
||||
Resolves: #548
|
||||
|
||||
UserNote: The RECORDING_INFO function can now be used
|
||||
to retrieve the duration of a recording.
|
||||
|
||||
|
||||
#### app_sms.c: Fix sending and receiving SMS messages in protocol 2
|
||||
Author: Itzanh
|
||||
Date: 2025-04-06
|
||||
|
||||
This fixes bugs in SMS messaging to SMS-capable analog phones that prevented app_sms.c from talking to phones using SMS protocol 2.
|
||||
|
||||
- Fix MORX message reception (from phone to Asterisk) in SMS protocol 2
|
||||
- Fix MTTX message transmission (from Asterisk to phone) in SMS protocol 2
|
||||
|
||||
One of the bugs caused messages to have random characters and junk appended at the end up to the character limit. Another bug prevented Asterisk from sending messages from Asterisk to the phone at all. A final bug caused the transmission from Asterisk to the phone to take a long time because app_sms.c did not hang up after correctly sending the message, causing the phone to have to time out and hang up in order to complete the message transmission.
|
||||
|
||||
This was tested with a Linksys PAP2T and with a GrandStream HT814, sending and receiving messages with Telefónica DOMO Mensajes phones from Telefónica Spain. I had to play with both the network jitter buffer and the dB gain to get it to work. One of my phones required the gain to be set to +3dB for it to work, while another required it to be set to +6dB.
|
||||
|
||||
Only MORX and MTTX were tested, I did not test sending and receiving messages to a TelCo SMSC.
|
||||
|
||||
|
||||
#### app_queue: queue rules – Add support for QUEUE_RAISE_PENALTY=rN to raise penal..
|
||||
Author: phoneben
|
||||
Date: 2025-05-26
|
||||
|
||||
This update adds support for a new QUEUE_RAISE_PENALTY format: rN
|
||||
|
||||
When QUEUE_RAISE_PENALTY is set to rN (e.g., r4), only members whose current penalty
|
||||
is greater than or equal to the defined min_penalty and less than or equal to max_penalty
|
||||
will have their penalty raised to N.
|
||||
|
||||
Members with penalties outside the min/max range remain unchanged.
|
||||
|
||||
Example behaviors:
|
||||
|
||||
QUEUE_RAISE_PENALTY=4 → Raise all members with penalty < 4 (existing behavior)
|
||||
QUEUE_RAISE_PENALTY=r4 → Raise only members with penalty in [min_penalty, max_penalty] to 4
|
||||
|
||||
Implementation details:
|
||||
|
||||
Adds parsing logic to detect the r prefix and sets the raise_respect_min flag
|
||||
|
||||
Modifies the raise logic to skip members outside the defined penalty range when the flag is active
|
||||
|
||||
UserNote: This change introduces QUEUE_RAISE_PENALTY=rN, allowing selective penalty raises
|
||||
only for members whose current penalty is within the [min_penalty, max_penalty] range.
|
||||
Members with lower or higher penalties are unaffected.
|
||||
This behavior is backward-compatible with existing queue rule configurations.
|
||||
|
||||
|
||||
#### res_websocket_client: Add more info to the XML documentation.
|
||||
Author: George Joseph
|
||||
Date: 2025-06-05
|
||||
|
||||
Added "see-also" links to chan_websocket and ARI Outbound WebSocket and
|
||||
added an example configuration for each.
|
||||
|
||||
|
||||
#### res_odbc: cache_size option to limit the cached connections.
|
||||
Author: Jaco Kroon
|
||||
Date: 2024-12-13
|
||||
|
||||
Signed-off-by: Jaco Kroon <jaco@uls.co.za>
|
||||
|
||||
UserNote: New cache_size option for res_odbc to on a per class basis limit the
|
||||
number of cached connections. Please reference the sample configuration
|
||||
for details.
|
||||
|
||||
|
||||
#### res_odbc: cache_type option for res_odbc.
|
||||
Author: Jaco Kroon
|
||||
Date: 2024-12-10
|
||||
|
||||
This enables setting cache_type classes to a round-robin queueing system
|
||||
rather than the historic stack mechanism.
|
||||
|
||||
This should result in lower risk of connection drops due to shorter idle
|
||||
times (the first connection to go onto the stack could in theory never
|
||||
be used again, ever, but sit there consuming resources, there could be
|
||||
multiple of these).
|
||||
|
||||
And with a queue rather than a stack, dead connections are guaranteed to
|
||||
be detected and purged eventually.
|
||||
|
||||
This should end up better balancing connection_cnt with actual load
|
||||
over time, assuming the database doesn't keep connections open
|
||||
excessively long from it's side.
|
||||
|
||||
Signed-off-by: Jaco Kroon <jaco@uls.co.za>
|
||||
|
||||
UserNote: When using res_odbc it should be noted that back-end
|
||||
connections to the underlying database can now be configured to re-use
|
||||
the cached connections in a round-robin manner rather than repeatedly
|
||||
re-using the same connection. This helps to keep connections alive, and
|
||||
to purge dead connections from the system, thus more dynamically
|
||||
adjusting to actual load. The downside is that one could keep too many
|
||||
connections active for a longer time resulting in resource also begin
|
||||
consumed on the database side.
|
||||
|
||||
|
||||
#### res_pjsip: Fix empty `ActiveChannels` property in AMI responses.
|
||||
Author: Sean Bright
|
||||
Date: 2025-05-27
|
||||
|
||||
The logic appears to have been reversed since it was introduced in
|
||||
05cbf8df.
|
||||
|
||||
Resolves: #1254
|
||||
|
||||
#### ARI Outbound Websockets
|
||||
Author: George Joseph
|
||||
Date: 2025-03-28
|
||||
|
||||
Asterisk can now establish websocket sessions _to_ your ARI applications
|
||||
as well as accepting websocket sessions _from_ them.
|
||||
Full details: http://s.asterisk.net/ari-outbound-ws
|
||||
|
||||
Code change summary:
|
||||
* Added an ast_vector_string_join() function,
|
||||
* Added ApplicationRegistered and ApplicationUnregistered ARI events.
|
||||
* Converted res/ari/config.c to use sorcery to process ari.conf.
|
||||
* Added the "outbound-websocket" ARI config object.
|
||||
* Refactored res/ari/ari_websockets.c to handle outbound websockets.
|
||||
* Refactored res/ari/cli.c for the sorcery changeover.
|
||||
* Updated res/res_stasis.c for the sorcery changeover.
|
||||
* Updated apps/app_stasis.c to allow initiating per-call outbound websockets.
|
||||
* Added CLI commands to manage ARI websockets.
|
||||
* Added the new "outbound-websocket" object to ari.conf.sample.
|
||||
* Moved the ARI XML documentation out of res_ari.c into res/ari/ari_doc.xml
|
||||
|
||||
UserNote: Asterisk can now establish websocket sessions _to_ your ARI applications
|
||||
as well as accepting websocket sessions _from_ them.
|
||||
Full details: http://s.asterisk.net/ari-outbound-ws
|
||||
|
||||
|
||||
#### res_websocket_client: Create common utilities for websocket clients.
|
||||
Author: George Joseph
|
||||
Date: 2025-05-02
|
||||
|
||||
Since multiple Asterisk capabilities now need to create websocket clients
|
||||
it makes sense to create a common set of utilities rather than making
|
||||
each of those capabilities implement their own.
|
||||
|
||||
* A new configuration file "websocket_client.conf" is used to store common
|
||||
client parameters in named configuration sections.
|
||||
* APIs are provided to list and retrieve ast_websocket_client objects created
|
||||
from the named configurations.
|
||||
* An API is provided that accepts an ast_websocket_client object, connects
|
||||
to the remote server with retries and returns an ast_websocket object. TLS is
|
||||
supported as is basic authentication.
|
||||
* An observer can be registered to receive notification of loaded or reloaded
|
||||
client objects.
|
||||
* An API is provided to compare an existing client object to one just
|
||||
reloaded and return the fields that were changed. The caller can then decide
|
||||
what action to take based on which fields changed.
|
||||
|
||||
Also as part of thie commit, several sorcery convenience macros were created
|
||||
to make registering common object fields easier.
|
||||
|
||||
UserNote: A new module "res_websocket_client" and config file
|
||||
"websocket_client.conf" have been added to support several upcoming new
|
||||
capabilities that need common websocket client configuration.
|
||||
|
||||
|
||||
#### asterisk.c: Add option to restrict shell access from remote consoles.
|
||||
Author: George Joseph
|
||||
Date: 2025-05-19
|
||||
|
||||
UserNote: A new asterisk.conf option 'disable_remote_console_shell' has
|
||||
been added that, when set, will prevent remote consoles from executing
|
||||
shell commands using the '!' prefix.
|
||||
|
||||
Resolves: #GHSA-c7p6-7mvq-8jq2
|
||||
|
||||
#### frame.c: validate frame data length is less than samples when adjusting volume
|
||||
Author: mkmer
|
||||
Date: 2025-05-12
|
||||
|
||||
Resolves: #1230
|
||||
|
||||
#### res_audiosocket.c: Add retry mechanism for reading data from AudioSocket
|
||||
Author: Sven Kube
|
||||
Date: 2025-05-13
|
||||
|
||||
The added retry mechanism addresses an issue that arises when fragmented TCP
|
||||
packets are received, each containing only a portion of an AudioSocket packet.
|
||||
This situation can occur if the external service sending the AudioSocket data
|
||||
has Nagle's algorithm enabled.
|
||||
|
||||
|
||||
#### res_audiosocket.c: Set the TCP_NODELAY socket option
|
||||
Author: Sven Kube
|
||||
Date: 2025-05-13
|
||||
|
||||
Disable Nagle's algorithm by setting the TCP_NODELAY socket option.
|
||||
This reduces latency by preventing delays caused by packet buffering.
|
||||
|
||||
|
||||
#### menuselect: Fix GTK menu callbacks for Fedora 42 compatibility
|
||||
Author: Thomas B. Clark
|
||||
Date: 2025-05-12
|
||||
|
||||
This patch resolves a build failure in `menuselect_gtk.c` when running
|
||||
`make menuconfig` on Fedora 42. The new version of GTK introduced stricter
|
||||
type checking for callback signatures.
|
||||
|
||||
Changes include:
|
||||
- Add wrapper functions to match the expected `void (*)(void)` signature.
|
||||
- Update `menu_items` array to use these wrappers.
|
||||
|
||||
Fixes: #1243
|
||||
|
||||
#### jansson: Upgrade version to jansson 2.14.1
|
||||
Author: Stanislav Abramenkov
|
||||
Date: 2025-03-24
|
||||
|
||||
UpgradeNote: jansson has been upgraded to 2.14.1. For more
|
||||
information visit jansson Github page: https://github.com/akheron/jansson/releases/tag/v2.14.1
|
||||
|
||||
Resolves: #1178
|
||||
|
||||
#### pjproject: Increase maximum SDP formats and attribute limits
|
||||
Author: Joe Searle
|
||||
Date: 2025-05-15
|
||||
|
||||
Since Chrome 136, using Windows, when initiating a video call the INVITE SDP exceeds the maximum number of allowed attributes, resulting in the INVITE being rejected. This increases the attribute limit and the number of formats allowed when using bundled pjproject.
|
||||
|
||||
Fixes: #1240
|
||||
|
||||
#### manager.c: Invalid ref-counting when purging events
|
||||
Author: Nathan Monfils
|
||||
Date: 2025-05-05
|
||||
|
||||
We have a use-case where we generate a *lot* of events on the AMI, and
|
||||
then when doing `manager show eventq` we would see some events which
|
||||
would linger for hours or days in there. Obviously something was leaking.
|
||||
Testing allowed us to track down this logic bug in the ref-counting on
|
||||
the event purge.
|
||||
|
||||
Reproducing the bug was not super trivial, we managed to do it in a
|
||||
production-like load testing environment with multiple AMI consumers.
|
||||
|
||||
The race condition itself:
|
||||
|
||||
1. something allocates and links `session`
|
||||
2. `purge_sessions` iterates over that `session` (takes ref)
|
||||
3. `purge_session` correctly de-referencess that session
|
||||
4. `purge_session` re-evaluates the while() loop, taking a reference
|
||||
5. `purge_session` exits (`n_max > 0` is false)
|
||||
6. whatever allocated the `session` deallocates it, but a reference is
|
||||
now lost since we exited the `while` loop before de-referencing.
|
||||
7. since the destructor is never called, the session->last_ev->usecount
|
||||
is never decremented, leading to events lingering in the queue
|
||||
|
||||
The impact of this bug does not seem major. The events are small and do
|
||||
not seem, from our testing, to be causing meaningful additional CPU
|
||||
usage. Mainly we wanted to fix this issue because we are internally
|
||||
adding prometheus metrics to the eventq and those leaked events were
|
||||
causing the metrics to show garbage data.
|
||||
|
||||
|
||||
#### res_pjsip_nat.c: Do not overwrite transfer host
|
||||
Author: Mike Bradeen
|
||||
Date: 2025-05-08
|
||||
|
||||
When a call is transfered via dialplan behind a NAT, the
|
||||
host portion of the Contact header in the 302 will no longer
|
||||
be over-written with the external NAT IP and will retain the
|
||||
hostname.
|
||||
|
||||
Fixes: #1141
|
||||
|
||||
#### chan_pjsip: Serialize INVITE creation on DTMF attended transfer
|
||||
Author: Mike Bradeen
|
||||
Date: 2025-05-05
|
||||
|
||||
When a call is transfered via DTMF feature code, the Transfer Target and
|
||||
Transferer are bridged immediately. This opens the possibilty of a race
|
||||
condition between the creation of an INVITE and the bridge induced colp
|
||||
update that can result in the set caller ID being over-written with the
|
||||
transferer's default info.
|
||||
|
||||
Fixes: #1234
|
||||
|
||||
#### sig_analog: Add Call Waiting Deluxe support.
|
||||
Author: Naveen Albert
|
||||
Date: 2023-08-24
|
||||
|
||||
Adds support for Call Waiting Deluxe options to enhance
|
||||
the current call waiting feature.
|
||||
|
||||
As part of this change, a mechanism is also added that
|
||||
allows a channel driver to queue an audio file for Dial()
|
||||
to play, which is necessary for the announcement function.
|
||||
|
||||
ASTERISK-30373 #close
|
||||
|
||||
Resolves: #271
|
||||
|
||||
UserNote: Call Waiting Deluxe can now be enabled for FXS channels
|
||||
by enabling its corresponding option.
|
||||
|
||||
|
||||
#### app_sms: Ignore false positive vectorization warning.
|
||||
Author: Naveen Albert
|
||||
Date: 2025-01-24
|
||||
|
||||
Ignore gcc warning about writing 32 bytes into a region of size 6,
|
||||
since we check that we don't go out of bounds for each byte.
|
||||
This is due to a vectorization bug in gcc 15, stemming from
|
||||
gcc commit 68326d5d1a593dc0bf098c03aac25916168bc5a9.
|
||||
|
||||
Resolves: #1088
|
||||
|
||||
#### lock.h: Add include for string.h when DEBUG_THREADS is defined.
|
||||
Author: George Joseph
|
||||
Date: 2025-05-02
|
||||
|
||||
When DEBUG_THREADS is defined, lock.h uses strerror(), which is defined
|
||||
in the libc string.h file, to print warning messages. If the including
|
||||
source file doesn't include string.h then strerror() won't be found and
|
||||
and compile errors will be thrown. Since lock.h depends on this, string.h
|
||||
is now included from there if DEBUG_THREADS is defined. This way, including
|
||||
source files don't have to worry about it.
|
||||
|
||||
|
||||
#### Alternate Channel Storage Backends
|
||||
Author: George Joseph
|
||||
Date: 2024-12-31
|
||||
|
||||
Full details: http://s.asterisk.net/dc679ec3
|
||||
|
||||
The previous proof-of-concept showed that the cpp_map_name_id alternate
|
||||
storage backed performed better than all the others so this final PR
|
||||
adds only that option. You still need to enable it in menuselect under
|
||||
the "Alternate Channel Storage Backends" category.
|
||||
|
||||
To select which one is used at runtime, set the "channel_storage_backend"
|
||||
option in asterisk.conf to one of the values described in
|
||||
asterisk.conf.sample. The default remains "ao2_legacy".
|
||||
|
||||
UpgradeNote: With this release, you can now select an alternate channel
|
||||
storage backend based on C++ Maps. Using the new backend may increase
|
||||
performance and reduce the chances of deadlocks on heavily loaded systems.
|
||||
For more information, see http://s.asterisk.net/dc679ec3
|
||||
|
||||
78
ChangeLogs/ChangeLog-22.5.1.html
Normal file
78
ChangeLogs/ChangeLog-22.5.1.html
Normal file
@@ -0,0 +1,78 @@
|
||||
<html><head><title>ChangeLog for asterisk-22.5.1</title></head><body>
|
||||
<h2>Change Log for Release asterisk-22.5.1</h2>
|
||||
<h3>Links:</h3>
|
||||
<ul>
|
||||
<li><a href="https://downloads.asterisk.org/pub/telephony/asterisk/releases/ChangeLog-22.5.1.html">Full ChangeLog</a> </li>
|
||||
<li><a href="https://github.com/asterisk/asterisk/compare/22.5.0...22.5.1">GitHub Diff</a> </li>
|
||||
<li><a href="https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22.5.1.tar.gz">Tarball</a> </li>
|
||||
<li><a href="https://downloads.asterisk.org/pub/telephony/asterisk">Downloads</a> </li>
|
||||
</ul>
|
||||
<h3>Summary:</h3>
|
||||
<ul>
|
||||
<li>Commits: 2</li>
|
||||
<li>Commit Authors: 2</li>
|
||||
<li>Issues Resolved: 0</li>
|
||||
<li>Security Advisories Resolved: 2</li>
|
||||
<li><a href="https://github.com/asterisk/asterisk/security/advisories/GHSA-mrq5-74j5-f5cr">GHSA-mrq5-74j5-f5cr</a>: Remote DoS and possible RCE in asterisk/res/res_stir_shaken/verification.c</li>
|
||||
<li><a href="https://github.com/asterisk/asterisk/security/advisories/GHSA-v9q8-9j8m-5xwp">GHSA-v9q8-9j8m-5xwp</a>: Uncontrolled Search-Path Element in safe_asterisk script may allow local privilege escalation.</li>
|
||||
</ul>
|
||||
<h3>User Notes:</h3>
|
||||
<h3>Upgrade Notes:</h3>
|
||||
<ul>
|
||||
<li>
|
||||
<h4>safe_asterisk: Add ownership checks for /etc/asterisk/startup.d and its files.</h4>
|
||||
The safe_asterisk script now checks that, if it was run by the
|
||||
root user, the /etc/asterisk/startup.d directory and all the files it contains
|
||||
are owned by root. If the checks fail, safe_asterisk will exit with an error
|
||||
and Asterisk will not be started. Additionally, the default logging
|
||||
destination is now stderr instead of tty "9" which probably won't exist
|
||||
in modern systems.</li>
|
||||
</ul>
|
||||
<h3>Developer Notes:</h3>
|
||||
<h3>Commit Authors:</h3>
|
||||
<ul>
|
||||
<li>George Joseph: (1)</li>
|
||||
<li>ThatTotallyRealMyth: (1)</li>
|
||||
</ul>
|
||||
<h2>Issue and Commit Detail:</h2>
|
||||
<h3>Closed Issues:</h3>
|
||||
<ul>
|
||||
<li>!GHSA-mrq5-74j5-f5cr: Remote DoS and possible RCE in asterisk/res/res_stir_shaken/verification.c</li>
|
||||
<li>!GHSA-v9q8-9j8m-5xwp: Uncontrolled Search-Path Element in safe_asterisk script may allow local privilege escalation.</li>
|
||||
</ul>
|
||||
<h3>Commits By Author:</h3>
|
||||
<ul>
|
||||
<li>
|
||||
<h4>George Joseph (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>res_stir_shaken: Test for missing semicolon in Identity header.</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>ThatTotallyRealMyth (1):</h4>
|
||||
</li>
|
||||
<li>safe_asterisk: Add ownership checks for /etc/asterisk/startup.d and its files.</li>
|
||||
</ul>
|
||||
<h3>Commit List:</h3>
|
||||
<ul>
|
||||
<li>safe_asterisk: Add ownership checks for /etc/asterisk/startup.d and its files.</li>
|
||||
<li>res_stir_shaken: Test for missing semicolon in Identity header.</li>
|
||||
</ul>
|
||||
<h3>Commit Details:</h3>
|
||||
<h4>safe_asterisk: Add ownership checks for /etc/asterisk/startup.d and its files.</h4>
|
||||
<p>Author: ThatTotallyRealMyth
|
||||
Date: 2025-06-10</p>
|
||||
<p>UpgradeNote: The safe_asterisk script now checks that, if it was run by the
|
||||
root user, the /etc/asterisk/startup.d directory and all the files it contains
|
||||
are owned by root. If the checks fail, safe_asterisk will exit with an error
|
||||
and Asterisk will not be started. Additionally, the default logging
|
||||
destination is now stderr instead of tty "9" which probably won't exist
|
||||
in modern systems.</p>
|
||||
<p>Resolves: #GHSA-v9q8-9j8m-5xwp</p>
|
||||
<h4>res_stir_shaken: Test for missing semicolon in Identity header.</h4>
|
||||
<p>Author: George Joseph
|
||||
Date: 2025-07-31</p>
|
||||
<p>ast_stir_shaken_vs_verify() now makes sure there's a semicolon in
|
||||
the Identity header to prevent a possible segfault.</p>
|
||||
<p>Resolves: #GHSA-mrq5-74j5-f5cr</p>
|
||||
</body></html>
|
||||
86
ChangeLogs/ChangeLog-22.5.1.md
Normal file
86
ChangeLogs/ChangeLog-22.5.1.md
Normal file
@@ -0,0 +1,86 @@
|
||||
|
||||
## Change Log for Release asterisk-22.5.1
|
||||
|
||||
### Links:
|
||||
|
||||
- [Full ChangeLog](https://downloads.asterisk.org/pub/telephony/asterisk/releases/ChangeLog-22.5.1.html)
|
||||
- [GitHub Diff](https://github.com/asterisk/asterisk/compare/22.5.0...22.5.1)
|
||||
- [Tarball](https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22.5.1.tar.gz)
|
||||
- [Downloads](https://downloads.asterisk.org/pub/telephony/asterisk)
|
||||
|
||||
### Summary:
|
||||
|
||||
- Commits: 2
|
||||
- Commit Authors: 2
|
||||
- Issues Resolved: 0
|
||||
- Security Advisories Resolved: 2
|
||||
- [GHSA-mrq5-74j5-f5cr](https://github.com/asterisk/asterisk/security/advisories/GHSA-mrq5-74j5-f5cr): Remote DoS and possible RCE in asterisk/res/res_stir_shaken/verification.c
|
||||
- [GHSA-v9q8-9j8m-5xwp](https://github.com/asterisk/asterisk/security/advisories/GHSA-v9q8-9j8m-5xwp): Uncontrolled Search-Path Element in safe_asterisk script may allow local privilege escalation.
|
||||
|
||||
### User Notes:
|
||||
|
||||
|
||||
### Upgrade Notes:
|
||||
|
||||
- #### safe_asterisk: Add ownership checks for /etc/asterisk/startup.d and its files.
|
||||
The safe_asterisk script now checks that, if it was run by the
|
||||
root user, the /etc/asterisk/startup.d directory and all the files it contains
|
||||
are owned by root. If the checks fail, safe_asterisk will exit with an error
|
||||
and Asterisk will not be started. Additionally, the default logging
|
||||
destination is now stderr instead of tty "9" which probably won't exist
|
||||
in modern systems.
|
||||
|
||||
|
||||
### Developer Notes:
|
||||
|
||||
|
||||
### Commit Authors:
|
||||
|
||||
- George Joseph: (1)
|
||||
- ThatTotallyRealMyth: (1)
|
||||
|
||||
## Issue and Commit Detail:
|
||||
|
||||
### Closed Issues:
|
||||
|
||||
- !GHSA-mrq5-74j5-f5cr: Remote DoS and possible RCE in asterisk/res/res_stir_shaken/verification.c
|
||||
- !GHSA-v9q8-9j8m-5xwp: Uncontrolled Search-Path Element in safe_asterisk script may allow local privilege escalation.
|
||||
|
||||
### Commits By Author:
|
||||
|
||||
- #### George Joseph (1):
|
||||
- res_stir_shaken: Test for missing semicolon in Identity header.
|
||||
|
||||
- #### ThatTotallyRealMyth (1):
|
||||
- safe_asterisk: Add ownership checks for /etc/asterisk/startup.d and its files.
|
||||
|
||||
|
||||
### Commit List:
|
||||
|
||||
- safe_asterisk: Add ownership checks for /etc/asterisk/startup.d and its files.
|
||||
- res_stir_shaken: Test for missing semicolon in Identity header.
|
||||
|
||||
### Commit Details:
|
||||
|
||||
#### safe_asterisk: Add ownership checks for /etc/asterisk/startup.d and its files.
|
||||
Author: ThatTotallyRealMyth
|
||||
Date: 2025-06-10
|
||||
|
||||
UpgradeNote: The safe_asterisk script now checks that, if it was run by the
|
||||
root user, the /etc/asterisk/startup.d directory and all the files it contains
|
||||
are owned by root. If the checks fail, safe_asterisk will exit with an error
|
||||
and Asterisk will not be started. Additionally, the default logging
|
||||
destination is now stderr instead of tty "9" which probably won't exist
|
||||
in modern systems.
|
||||
|
||||
Resolves: #GHSA-v9q8-9j8m-5xwp
|
||||
|
||||
#### res_stir_shaken: Test for missing semicolon in Identity header.
|
||||
Author: George Joseph
|
||||
Date: 2025-07-31
|
||||
|
||||
ast_stir_shaken_vs_verify() now makes sure there's a semicolon in
|
||||
the Identity header to prevent a possible segfault.
|
||||
|
||||
Resolves: #GHSA-mrq5-74j5-f5cr
|
||||
|
||||
50
ChangeLogs/ChangeLog-22.5.2.html
Normal file
50
ChangeLogs/ChangeLog-22.5.2.html
Normal file
@@ -0,0 +1,50 @@
|
||||
<html><head><title>ChangeLog for asterisk-22.5.2</title></head><body>
|
||||
<h2>Change Log for Release asterisk-22.5.2</h2>
|
||||
<h3>Links:</h3>
|
||||
<ul>
|
||||
<li><a href="https://downloads.asterisk.org/pub/telephony/asterisk/releases/ChangeLog-22.5.2.html">Full ChangeLog</a> </li>
|
||||
<li><a href="https://github.com/asterisk/asterisk/compare/22.5.1...22.5.2">GitHub Diff</a> </li>
|
||||
<li><a href="https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22.5.2.tar.gz">Tarball</a> </li>
|
||||
<li><a href="https://downloads.asterisk.org/pub/telephony/asterisk">Downloads</a> </li>
|
||||
</ul>
|
||||
<h3>Summary:</h3>
|
||||
<ul>
|
||||
<li>Commits: 1</li>
|
||||
<li>Commit Authors: 1</li>
|
||||
<li>Issues Resolved: 0</li>
|
||||
<li>Security Advisories Resolved: 1</li>
|
||||
<li><a href="https://github.com/asterisk/asterisk/security/advisories/GHSA-64qc-9x89-rx5j">GHSA-64qc-9x89-rx5j</a>: A specifically malformed Authorization header in an incoming SIP request can cause Asterisk to crash</li>
|
||||
</ul>
|
||||
<h3>User Notes:</h3>
|
||||
<h3>Upgrade Notes:</h3>
|
||||
<h3>Developer Notes:</h3>
|
||||
<h3>Commit Authors:</h3>
|
||||
<ul>
|
||||
<li>George Joseph: (1)</li>
|
||||
</ul>
|
||||
<h2>Issue and Commit Detail:</h2>
|
||||
<h3>Closed Issues:</h3>
|
||||
<ul>
|
||||
<li>!GHSA-64qc-9x89-rx5j: A specifically malformed Authorization header in an incoming SIP request can cause Asterisk to crash</li>
|
||||
</ul>
|
||||
<h3>Commits By Author:</h3>
|
||||
<ul>
|
||||
<li>
|
||||
<h4>George Joseph (1):</h4>
|
||||
</li>
|
||||
<li>res_pjsip_authenticator_digest: Fix SEGV if get_authorization_hdr returns NULL.</li>
|
||||
</ul>
|
||||
<h3>Commit List:</h3>
|
||||
<ul>
|
||||
<li>res_pjsip_authenticator_digest: Fix SEGV if get_authorization_hdr returns NULL.</li>
|
||||
</ul>
|
||||
<h3>Commit Details:</h3>
|
||||
<h4>res_pjsip_authenticator_digest: Fix SEGV if get_authorization_hdr returns NULL.</h4>
|
||||
<p>Author: George Joseph
|
||||
Date: 2025-08-28</p>
|
||||
<p>In the highly-unlikely event that get_authorization_hdr() couldn't find an
|
||||
Authorization header in a request, trying to get the digest algorithm
|
||||
would cauase a SEGV. We now check that we have an auth header that matches
|
||||
the realm before trying to get the algorithm from it.</p>
|
||||
<p>Resolves: #GHSA-64qc-9x89-rx5j</p>
|
||||
</body></html>
|
||||
60
ChangeLogs/ChangeLog-22.5.2.md
Normal file
60
ChangeLogs/ChangeLog-22.5.2.md
Normal file
@@ -0,0 +1,60 @@
|
||||
|
||||
## Change Log for Release asterisk-22.5.2
|
||||
|
||||
### Links:
|
||||
|
||||
- [Full ChangeLog](https://downloads.asterisk.org/pub/telephony/asterisk/releases/ChangeLog-22.5.2.html)
|
||||
- [GitHub Diff](https://github.com/asterisk/asterisk/compare/22.5.1...22.5.2)
|
||||
- [Tarball](https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22.5.2.tar.gz)
|
||||
- [Downloads](https://downloads.asterisk.org/pub/telephony/asterisk)
|
||||
|
||||
### Summary:
|
||||
|
||||
- Commits: 1
|
||||
- Commit Authors: 1
|
||||
- Issues Resolved: 0
|
||||
- Security Advisories Resolved: 1
|
||||
- [GHSA-64qc-9x89-rx5j](https://github.com/asterisk/asterisk/security/advisories/GHSA-64qc-9x89-rx5j): A specifically malformed Authorization header in an incoming SIP request can cause Asterisk to crash
|
||||
|
||||
### User Notes:
|
||||
|
||||
|
||||
### Upgrade Notes:
|
||||
|
||||
|
||||
### Developer Notes:
|
||||
|
||||
|
||||
### Commit Authors:
|
||||
|
||||
- George Joseph: (1)
|
||||
|
||||
## Issue and Commit Detail:
|
||||
|
||||
### Closed Issues:
|
||||
|
||||
- !GHSA-64qc-9x89-rx5j: A specifically malformed Authorization header in an incoming SIP request can cause Asterisk to crash
|
||||
|
||||
### Commits By Author:
|
||||
|
||||
- #### George Joseph (1):
|
||||
- res_pjsip_authenticator_digest: Fix SEGV if get_authorization_hdr returns NULL.
|
||||
|
||||
|
||||
### Commit List:
|
||||
|
||||
- res_pjsip_authenticator_digest: Fix SEGV if get_authorization_hdr returns NULL.
|
||||
|
||||
### Commit Details:
|
||||
|
||||
#### res_pjsip_authenticator_digest: Fix SEGV if get_authorization_hdr returns NULL.
|
||||
Author: George Joseph
|
||||
Date: 2025-08-28
|
||||
|
||||
In the highly-unlikely event that get_authorization_hdr() couldn't find an
|
||||
Authorization header in a request, trying to get the digest algorithm
|
||||
would cauase a SEGV. We now check that we have an auth header that matches
|
||||
the realm before trying to get the algorithm from it.
|
||||
|
||||
Resolves: #GHSA-64qc-9x89-rx5j
|
||||
|
||||
1043
ChangeLogs/ChangeLog-22.6.0.html
Normal file
1043
ChangeLogs/ChangeLog-22.6.0.html
Normal file
File diff suppressed because it is too large
Load Diff
1152
ChangeLogs/ChangeLog-22.6.0.md
Normal file
1152
ChangeLogs/ChangeLog-22.6.0.md
Normal file
File diff suppressed because it is too large
Load Diff
902
ChangeLogs/ChangeLog-22.7.0-rc1.html
Normal file
902
ChangeLogs/ChangeLog-22.7.0-rc1.html
Normal file
@@ -0,0 +1,902 @@
|
||||
<html><head><title>ChangeLog for asterisk-22.7.0-rc1</title></head><body>
|
||||
<h2>Change Log for Release asterisk-22.7.0-rc1</h2>
|
||||
<h3>Links:</h3>
|
||||
<ul>
|
||||
<li><a href="https://downloads.asterisk.org/pub/telephony/asterisk/releases/ChangeLog-22.7.0-rc1.html">Full ChangeLog</a> </li>
|
||||
<li><a href="https://github.com/asterisk/asterisk/compare/22.6.0...22.7.0-rc1">GitHub Diff</a> </li>
|
||||
<li><a href="https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22.7.0-rc1.tar.gz">Tarball</a> </li>
|
||||
<li><a href="https://downloads.asterisk.org/pub/telephony/asterisk">Downloads</a> </li>
|
||||
</ul>
|
||||
<h3>Summary:</h3>
|
||||
<ul>
|
||||
<li>Commits: 53</li>
|
||||
<li>Commit Authors: 16</li>
|
||||
<li>Issues Resolved: 35</li>
|
||||
<li>Security Advisories Resolved: 0</li>
|
||||
</ul>
|
||||
<h3>User Notes:</h3>
|
||||
<ul>
|
||||
<li>
|
||||
<h4>res_stir_shaken: Add STIR_SHAKEN_ATTESTATION dialplan function.</h4>
|
||||
<p>The STIR_SHAKEN_ATTESTATION dialplan function has been added
|
||||
which will allow suppressing attestation on a call-by-call basis
|
||||
regardless of the profile attached to the outgoing endpoint.</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>func_channel: Allow R/W of ADSI CPE capability setting.</h4>
|
||||
<p>CHANNEL(adsicpe) can now be read or written to change
|
||||
the channels' ADSI CPE capability setting.</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>func_hangupcause.c: Add access to Reason headers via HANGUPCAUSE()</h4>
|
||||
<p>Added a new option to HANGUPCAUSE to access additional
|
||||
information about hangup reason. Reason headers from pjsip
|
||||
could be read using 'tech_extended' cause type.</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>func_math: Add DIGIT_SUM function.</h4>
|
||||
<p>The DIGIT_SUM function can be used to return the digit sum of
|
||||
a number.</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>app_sf: Add post-digit timer option to ReceiveSF.</h4>
|
||||
<p>The 't' option for ReceiveSF now allows for a timer since
|
||||
the last digit received, in addition to the number-wide timeout.</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>app_dial: Allow fractional seconds for dial timeouts.</h4>
|
||||
<p>The answer and progress dial timeouts now have millisecond
|
||||
precision, instead of having to be whole numbers.</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>chan_dahdi: Add DAHDI_CHANNEL function.</h4>
|
||||
<p>The DAHDI_CHANNEL function allows for getting/setting
|
||||
certain properties about DAHDI channels from the dialplan.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<h3>Upgrade Notes:</h3>
|
||||
<ul>
|
||||
<li>
|
||||
<h4>pjsip: Move from threadpool to taskpool</h4>
|
||||
<p>The threadpool_* options in pjsip.conf have now
|
||||
been deprecated though they continue to be read and used.
|
||||
They have been replaced with taskpool options that give greater
|
||||
control over the underlying taskpool used for PJSIP. An alembic
|
||||
upgrade script has been added to add these options to realtime
|
||||
as well.</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>app_queue.c: Fix error in Queue parameter documentation.</h4>
|
||||
<p>As part of Asterisk 21, macros were removed from Asterisk.
|
||||
This resulted in argument order changing for the Queue dialplan
|
||||
application since the macro argument was removed. Upgrade notice was
|
||||
missed when this was done, so this upgrade note has been added to
|
||||
provide a record of such and a notice to users who may have not upgraded
|
||||
yet.</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>res_audiosocket: add message types for all slin sample rates</h4>
|
||||
<p>New audiosocket message types 0x11 - 0x18 has been added
|
||||
for slin12, slin16, slin24, slin32, slin44, slin48, slin96, and
|
||||
slin192 audio. External applications using audiosocket may need to be
|
||||
updated to support these message types if the audiosocket channel is
|
||||
created with one of these audio formats.</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>taskpool: Add taskpool API, switch Stasis to using it.</h4>
|
||||
<p>The threadpool_* options in stasis.conf have now been deprecated
|
||||
though they continue to be read and used. They have been replaced with taskpool
|
||||
options that give greater control over the underlying taskpool used for stasis.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<h3>Developer Notes:</h3>
|
||||
<ul>
|
||||
<li>
|
||||
<h4>chan_pjsip: Add technology-specific off-nominal hangup cause to events.</h4>
|
||||
<p>A "tech_cause" parameter has been added to the
|
||||
ChannelHangupRequest and ChannelDestroyed ARI event messages and a "TechCause"
|
||||
parameter has been added to the HangupRequest, SoftHangupRequest and Hangup
|
||||
AMI event messages. For chan_pjsip, these will be set to the last SIP
|
||||
response status code for off-nominally terminated calls. The parameter is
|
||||
suppressed for nominal termination.</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>ARI: The bridges play and record APIs now handle sample rates > 8K correctly.</h4>
|
||||
<p>The ARI /bridges/play and /bridges/record REST APIs have new
|
||||
parameters that allow the caller to specify the format to be used on the
|
||||
"Announcer" and "Recorder" channels respecitvely.</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>taskpool: Add taskpool API, switch Stasis to using it.</h4>
|
||||
<p>The taskpool API has been added for common usage of a
|
||||
pool of taskprocessors. It is suggested to use this API instead of the
|
||||
threadpool+taskprocessor approach.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<h3>Commit Authors:</h3>
|
||||
<ul>
|
||||
<li>Anthony Minessale: (1)</li>
|
||||
<li>Bastian Triller: (1)</li>
|
||||
<li>Ben Ford: (2)</li>
|
||||
<li>Christoph Moench-Tegeder: (1)</li>
|
||||
<li>Gauravs456: (1)</li>
|
||||
<li>George Joseph: (8)</li>
|
||||
<li>Igor Goncharovsky: (1)</li>
|
||||
<li>Joshua C. Colp: (8)</li>
|
||||
<li>Max Grobecker: (1)</li>
|
||||
<li>Nathan Monfils: (1)</li>
|
||||
<li>Naveen Albert: (18)</li>
|
||||
<li>Phoneben: (2)</li>
|
||||
<li>Roman Pertsev: (1)</li>
|
||||
<li>Sean Bright: (3)</li>
|
||||
<li>Sven Kube: (3)</li>
|
||||
<li>Tinet-Mucw: (1)</li>
|
||||
</ul>
|
||||
<h2>Issue and Commit Detail:</h2>
|
||||
<h3>Closed Issues:</h3>
|
||||
<ul>
|
||||
<li>781: [improvement]: Allow call by call disabling Stir/Shaken header inclusion </li>
|
||||
<li>1340: [bug]: comfort noise packet corrupted</li>
|
||||
<li>1419: [bug]: static code analysis issues in app_adsiprog.c</li>
|
||||
<li>1422: [bug]: static code analysis issues in apps/app_externalivr.c</li>
|
||||
<li>1425: [bug]: static code analysis issues in apps/app_queue.c</li>
|
||||
<li>1434: [improvement]: pbx_variables: Create real channel for dialplan eval CLI command</li>
|
||||
<li>1436: [improvement]: res_cliexec: Avoid unnecessary cast to char*</li>
|
||||
<li>1455: [new-feature]: chan_dahdi: Add DAHDI_CHANNEL function</li>
|
||||
<li>1467: [bug]: Crash in res_pjsip_refer during REFER progress teardown with PJSIP_TRANSFER_HANDLING(ari-only)</li>
|
||||
<li>1478: [improvement]: Stasis threadpool -> taskpool</li>
|
||||
<li>1479: [bug]: The ARI bridge play and record APIs limit audio bandwidth by forcing the slin8 format.</li>
|
||||
<li>1483: [improvement]: sig_analog: Eliminate possible timeout for Last Number Redial</li>
|
||||
<li>1485: [improvement]: func_scramble: Add example to XML documentation.</li>
|
||||
<li>1487: [improvement]: app_dial: Allow partial seconds to be used for dial timeouts</li>
|
||||
<li>1489: [improvement]: config_options.c: Improve misleading error message</li>
|
||||
<li>1491: [bug]: Segfault: <code>channelstorage_cpp</code> fast lookup without lock (<code>get_by_name_exact</code>/<code>get_by_uniqueid</code>) leads to UAF during hangup</li>
|
||||
<li>1493: [new-feature]: app_sf: Add post-digit timer option</li>
|
||||
<li>1496: [improvement]: dsp.c: Minor fixes to debug log messages</li>
|
||||
<li>1499: [new-feature]: func_math: Add function to return the digit sum</li>
|
||||
<li>1501: [improvement]: codec_builtin: Fix some inaccurate quality weights.</li>
|
||||
<li>1505: [improvement]: res_fax: Add XML documentation for channel variables</li>
|
||||
<li>1507: [improvement]: res_tonedetect: Minor formatting issue in documentation</li>
|
||||
<li>1509: [improvement]: res_fax.c — log debug error as debug, not regular log</li>
|
||||
<li>1510: [new-feature]: sig_analog: Allow '#' to end the inter-digit timeout when dialing.</li>
|
||||
<li>1514: [improvement]: func_channel: Allow R/W of ADSI CPE capability setting.</li>
|
||||
<li>1517: [improvement]: core_unreal: Preserve ADSI capability when dialing Local channels</li>
|
||||
<li>1519: [improvement]: app_dial / func_callerid: DNIS information is not propagated by Dial</li>
|
||||
<li>1525: [bug]: chan_websocket: fix use of raw payload variable for string comparison in process_text_message</li>
|
||||
<li>1534: [bug]: app_queue when using gosub breaks dialplan when going from 20 to 21, What's new in 21 doesn't mention it's a breaking change,</li>
|
||||
<li>1535: [bug]: chan_pjsip changes SSRC on WebRTC channels, which is unsupported by some browsers</li>
|
||||
<li>1536: [bug]: asterisk -rx connects to console instead of executing a command</li>
|
||||
<li>1539: [bug]: safe_asterisk without TTY doesn't log to file</li>
|
||||
<li>1544: [improvement]: While Receiving the MediaConnect Message Using External Media Over websocket ChannelID is Details are missing</li>
|
||||
<li>1554: [bug]: safe_asterisk recurses into subdirectories of startup.d after f97361</li>
|
||||
<li>1559: [improvement]: Handle TLS handshake attacks in order to resolve the issue of exceeding the maximum number of HTTPS sessions.</li>
|
||||
</ul>
|
||||
<h3>Commits By Author:</h3>
|
||||
<ul>
|
||||
<li>
|
||||
<h4>Anthony Minessale (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>Update contact information for anthm</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Bastian Triller (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>Fix some doxygen, typos and whitespace</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Ben Ford (2):</h4>
|
||||
</li>
|
||||
<li>rtp_engine.c: Add exception for comfort noise payload.</li>
|
||||
<li>
|
||||
<p>app_queue.c: Fix error in Queue parameter documentation.</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Christoph Moench-Tegeder (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>Fix Endianness detection in utils.h for non-Linux</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>George Joseph (8):</h4>
|
||||
</li>
|
||||
<li>ARI: The bridges play and record APIs now handle sample rates > 8K correctly.</li>
|
||||
<li>channelstorage_cpp_map_name_id: Add read locking around retrievals.</li>
|
||||
<li>chan_websocket.c: Change payload references to command instead.</li>
|
||||
<li>taskpool: Fix some references to threadpool that should be taskpool.</li>
|
||||
<li>chan_pjsip: Add technology-specific off-nominal hangup cause to events.</li>
|
||||
<li>safe_asterisk: Fix logging and sorting issue.</li>
|
||||
<li>chan_pjsip: Disable SSRC change for WebRTC endpoints.</li>
|
||||
<li>
|
||||
<p>res_stir_shaken: Add STIR_SHAKEN_ATTESTATION dialplan function.</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Igor Goncharovsky (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>func_hangupcause.c: Add access to Reason headers via HANGUPCAUSE()</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Joshua C. Colp (8):</h4>
|
||||
</li>
|
||||
<li>taskpool: Add taskpool API, switch Stasis to using it.</li>
|
||||
<li>taskpool: Update versions for taskpool stasis options.</li>
|
||||
<li>sorcery: Move from threadpool to taskpool.</li>
|
||||
<li>app_queue: Allow stasis message filtering to work.</li>
|
||||
<li>endpoints: Remove need for stasis subscription.</li>
|
||||
<li>devicestate: Don't publish redundant device state messages.</li>
|
||||
<li>pjsip: Move from threadpool to taskpool</li>
|
||||
<li>
|
||||
<p>Revert "pjsip: Move from threadpool to taskpool"</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Max Grobecker (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>res_pjsip_geolocation: Add support for Geolocation loc-src parameter</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Nathan Monfils (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>manager.c: Fix presencestate object leak</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Naveen Albert (18):</h4>
|
||||
</li>
|
||||
<li>pbx_variables.c: Create real channel for "dialplan eval function".</li>
|
||||
<li>res_cliexec: Remove unnecessary casts to char*.</li>
|
||||
<li>app_adsiprog: Fix possible NULL dereference.</li>
|
||||
<li>chan_dahdi: Add DAHDI_CHANNEL function.</li>
|
||||
<li>sig_analog: Eliminate potential timeout with Last Number Redial.</li>
|
||||
<li>func_scramble: Add example to XML documentation.</li>
|
||||
<li>config_options.c: Improve misleading warning.</li>
|
||||
<li>dsp.c: Make minor fixes to debug log messages.</li>
|
||||
<li>app_dial: Allow fractional seconds for dial timeouts.</li>
|
||||
<li>res_fax: Add XML documentation for channel variables.</li>
|
||||
<li>res_tonedetect: Fix formatting of XML documentation.</li>
|
||||
<li>codec_builtin.c: Adjust some of the quality scores to reflect reality.</li>
|
||||
<li>app_sf: Add post-digit timer option to ReceiveSF.</li>
|
||||
<li>func_math: Add DIGIT_SUM function.</li>
|
||||
<li>sig_analog: Allow '#' to end the inter-digit timeout when dialing.</li>
|
||||
<li>core_unreal: Preserve ADSI capability when dialing Local channels.</li>
|
||||
<li>func_channel: Allow R/W of ADSI CPE capability setting.</li>
|
||||
<li>
|
||||
<p>func_callerid: Document limitation of DNID fields.</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Roman Pertsev (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>res_audiosocket: fix temporarily unavailable</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Sean Bright (3):</h4>
|
||||
</li>
|
||||
<li>audiohook.c: Ensure correct AO2 reference is dereffed.</li>
|
||||
<li>app_externalivr: Prevent out-of-bounds read during argument processing.</li>
|
||||
<li>
|
||||
<p>safe_asterisk: Resolve a POSIX sh problem and restore globbing behavior.</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Sven Kube (3):</h4>
|
||||
</li>
|
||||
<li>stasis_channels.c: Add null check for referred_by in ast_ari_transfer_message_..</li>
|
||||
<li>stasis_channels.c: Make protocol_id optional to enable blind transfer via ari</li>
|
||||
<li>
|
||||
<p>res_audiosocket: add message types for all slin sample rates</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Tinet-mucw (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>iostream.c: Handle TLS handshake attacks in order to resolve the issue of exce..</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>gauravs456 (1):</h4>
|
||||
</li>
|
||||
<li>
|
||||
<p>chan_websocket: Add channel_id to MEDIA_START, DRIVER_STATUS and DTMF_END even..</p>
|
||||
</li>
|
||||
<li>
|
||||
<h4>phoneben (2):</h4>
|
||||
</li>
|
||||
<li>app_queue: Add NULL pointer checks in app_queue</li>
|
||||
<li>res_fax.c: lower FAXOPT read warning to debug level</li>
|
||||
</ul>
|
||||
<h3>Commit List:</h3>
|
||||
<ul>
|
||||
<li>res_audiosocket: fix temporarily unavailable</li>
|
||||
<li>safe_asterisk: Resolve a POSIX sh problem and restore globbing behavior.</li>
|
||||
<li>res_stir_shaken: Add STIR_SHAKEN_ATTESTATION dialplan function.</li>
|
||||
<li>Revert "pjsip: Move from threadpool to taskpool"</li>
|
||||
<li>chan_pjsip: Disable SSRC change for WebRTC endpoints.</li>
|
||||
<li>pjsip: Move from threadpool to taskpool</li>
|
||||
<li>safe_asterisk: Fix logging and sorting issue.</li>
|
||||
<li>Fix Endianness detection in utils.h for non-Linux</li>
|
||||
<li>app_queue.c: Fix error in Queue parameter documentation.</li>
|
||||
<li>devicestate: Don't publish redundant device state messages.</li>
|
||||
<li>chan_pjsip: Add technology-specific off-nominal hangup cause to events.</li>
|
||||
<li>res_audiosocket: add message types for all slin sample rates</li>
|
||||
<li>res_fax.c: lower FAXOPT read warning to debug level</li>
|
||||
<li>endpoints: Remove need for stasis subscription.</li>
|
||||
<li>app_queue: Allow stasis message filtering to work.</li>
|
||||
<li>taskpool: Fix some references to threadpool that should be taskpool.</li>
|
||||
<li>Update contact information for anthm</li>
|
||||
<li>chan_websocket.c: Change payload references to command instead.</li>
|
||||
<li>func_callerid: Document limitation of DNID fields.</li>
|
||||
<li>func_channel: Allow R/W of ADSI CPE capability setting.</li>
|
||||
<li>core_unreal: Preserve ADSI capability when dialing Local channels.</li>
|
||||
<li>func_hangupcause.c: Add access to Reason headers via HANGUPCAUSE()</li>
|
||||
<li>sig_analog: Allow '#' to end the inter-digit timeout when dialing.</li>
|
||||
<li>func_math: Add DIGIT_SUM function.</li>
|
||||
<li>app_sf: Add post-digit timer option to ReceiveSF.</li>
|
||||
<li>codec_builtin.c: Adjust some of the quality scores to reflect reality.</li>
|
||||
<li>res_tonedetect: Fix formatting of XML documentation.</li>
|
||||
<li>res_fax: Add XML documentation for channel variables.</li>
|
||||
<li>channelstorage_cpp_map_name_id: Add read locking around retrievals.</li>
|
||||
<li>app_dial: Allow fractional seconds for dial timeouts.</li>
|
||||
<li>dsp.c: Make minor fixes to debug log messages.</li>
|
||||
<li>config_options.c: Improve misleading warning.</li>
|
||||
<li>func_scramble: Add example to XML documentation.</li>
|
||||
<li>sig_analog: Eliminate potential timeout with Last Number Redial.</li>
|
||||
<li>ARI: The bridges play and record APIs now handle sample rates > 8K correctly.</li>
|
||||
<li>res_pjsip_geolocation: Add support for Geolocation loc-src parameter</li>
|
||||
<li>sorcery: Move from threadpool to taskpool.</li>
|
||||
<li>stasis_channels.c: Make protocol_id optional to enable blind transfer via ari</li>
|
||||
<li>Fix some doxygen, typos and whitespace</li>
|
||||
<li>app_queue: Add NULL pointer checks in app_queue</li>
|
||||
<li>app_externalivr: Prevent out-of-bounds read during argument processing.</li>
|
||||
<li>chan_dahdi: Add DAHDI_CHANNEL function.</li>
|
||||
<li>taskpool: Update versions for taskpool stasis options.</li>
|
||||
<li>taskpool: Add taskpool API, switch Stasis to using it.</li>
|
||||
<li>app_adsiprog: Fix possible NULL dereference.</li>
|
||||
<li>manager.c: Fix presencestate object leak</li>
|
||||
<li>audiohook.c: Ensure correct AO2 reference is dereffed.</li>
|
||||
<li>res_cliexec: Remove unnecessary casts to char*.</li>
|
||||
<li>rtp_engine.c: Add exception for comfort noise payload.</li>
|
||||
<li>pbx_variables.c: Create real channel for "dialplan eval function".</li>
|
||||
</ul>
|
||||
<h3>Commit Details:</h3>
|
||||
<h4>res_audiosocket: fix temporarily unavailable</h4>
|
||||
<p>Author: Roman Pertsev
|
||||
Date: 2025-10-07</p>
|
||||
<p>Operations on non-blocking sockets may return a resource temporarily unavailable error (EAGAIN or EWOULDBLOCK). This is not a fatal error but a normal condition indicating that the operation would block.</p>
|
||||
<p>This patch corrects the handling of this case. Instead of incorrectly treating it as a reason to terminate the connection, the code now waits for data to arrive on the socket.</p>
|
||||
<h4>safe_asterisk: Resolve a POSIX sh problem and restore globbing behavior.</h4>
|
||||
<p>Author: Sean Bright
|
||||
Date: 2025-10-22</p>
|
||||
<ul>
|
||||
<li>Using <code>==</code> with the POSIX sh <code>test</code> utility is UB.</li>
|
||||
<li>Switch back to using globs instead of using <code>$(find … | sort)</code>.</li>
|
||||
<li>Fix a missing redirect when checking for the OS type.</li>
|
||||
</ul>
|
||||
<p>Resolves: #1554</p>
|
||||
<h4>res_stir_shaken: Add STIR_SHAKEN_ATTESTATION dialplan function.</h4>
|
||||
<p>Author: George Joseph
|
||||
Date: 2025-10-24</p>
|
||||
<p>Also...</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>Refactored the verification datastore process so instead of having
|
||||
a separate channel datastore for each verification result, there's only
|
||||
one channel datastore with a vector of results.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Refactored some log messages to include channel name and removed
|
||||
some that would be redundant if a memory allocation failed.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>Resolves: #781</p>
|
||||
<p>UserNote: The STIR_SHAKEN_ATTESTATION dialplan function has been added
|
||||
which will allow suppressing attestation on a call-by-call basis
|
||||
regardless of the profile attached to the outgoing endpoint.</p>
|
||||
<h4>Revert "pjsip: Move from threadpool to taskpool"</h4>
|
||||
<p>Author: Joshua C. Colp
|
||||
Date: 2025-10-27</p>
|
||||
<p>This reverts commit bb6b76c2d8239b2665223dcbf6d507aa9aa4534e.</p>
|
||||
<h4>iostream.c: Handle TLS handshake attacks in order to resolve the issue of exce..</h4>
|
||||
<p>Author: Tinet-mucw
|
||||
Date: 2025-10-26</p>
|
||||
<p>The TCP three-way handshake completes, but if the server is under a TLS handshake attack, asterisk will get stuck at SSL_do_handshake().
|
||||
In this case, a timeout mechanism should be set for the SSL/TLS handshake process to prevent indefinite waiting during the SSL handshake.</p>
|
||||
<p>Resolves: #1559</p>
|
||||
<h4>chan_pjsip: Disable SSRC change for WebRTC endpoints.</h4>
|
||||
<p>Author: George Joseph
|
||||
Date: 2025-10-21</p>
|
||||
<p>Commit b333ee3b introduced a fix to chan_pjsip that addressed RTP issues with
|
||||
blind transfers and some SBCs. Unfortunately, the fix broke some WebRTC
|
||||
clients that are sensitive to SSRC changes and non-monotonic timestamps so
|
||||
the fix is now disabled for endpoints with the "bundle" parameter set to true.</p>
|
||||
<p>Resolves: #1535</p>
|
||||
<h4>chan_websocket: Add channel_id to MEDIA_START, DRIVER_STATUS and DTMF_END even..</h4>
|
||||
<p>Author: gauravs456
|
||||
Date: 2025-10-21</p>
|
||||
<p>Resolves: #1544</p>
|
||||
<h4>pjsip: Move from threadpool to taskpool</h4>
|
||||
<p>Author: Joshua C. Colp
|
||||
Date: 2025-09-23</p>
|
||||
<p>This change moves the PJSIP module from the threadpool API
|
||||
to the taskpool API. PJSIP-specific implementations for
|
||||
task usage have been removed and replaced with calls to
|
||||
the optimized taskpool implementations instead. The need
|
||||
for a pool of serializers has also been removed as
|
||||
taskpool inherently provides this. The default settings
|
||||
have also been changed to be more realistic for common
|
||||
usage.</p>
|
||||
<p>UpgradeNote: The threadpool_* options in pjsip.conf have now
|
||||
been deprecated though they continue to be read and used.
|
||||
They have been replaced with taskpool options that give greater
|
||||
control over the underlying taskpool used for PJSIP. An alembic
|
||||
upgrade script has been added to add these options to realtime
|
||||
as well.</p>
|
||||
<h4>safe_asterisk: Fix logging and sorting issue.</h4>
|
||||
<p>Author: George Joseph
|
||||
Date: 2025-10-17</p>
|
||||
<p>Re-enabled "TTY=9" which was erroneously disabled as part of a recent
|
||||
security fix and removed another logging "fix" that was added.</p>
|
||||
<p>Also added a sort to the "find" that enumerates the scripts to be sourced so
|
||||
they're sourced in the correct order.</p>
|
||||
<p>Resolves: #1539</p>
|
||||
<h4>Fix Endianness detection in utils.h for non-Linux</h4>
|
||||
<p>Author: Christoph Moench-Tegeder
|
||||
Date: 2025-10-19</p>
|
||||
<p>Commit 43bf8a4ded7a65203b766b91eaf8331a600e9d8d introduced endian
|
||||
dependend byte-swapping code in include/asterisk/utils.h, where the
|
||||
endianness was detected using the __BYTE_ORDER macro. This macro
|
||||
lives in endian.h, which on Linux is included implicitely (by the
|
||||
network-related headers, I think), but on FreeBSD the headers are
|
||||
laid out differently and we do not get __BYTE_ORDER the implicit way.</p>
|
||||
<p>Instead, this makes the usage of endian.h explicit by including it
|
||||
where we need it, and switches the BYTE_ORDER/*ENDIAN macros to the
|
||||
POSIX-defined ones (see
|
||||
https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/endian.h.html
|
||||
for standard compliance). Additionally, this adds a compile-time check
|
||||
for the endianness-logic: compilation will fail if neither big nor
|
||||
little endian can be detected.</p>
|
||||
<p>Fixes: #1536</p>
|
||||
<h4>app_queue.c: Fix error in Queue parameter documentation.</h4>
|
||||
<p>Author: Ben Ford
|
||||
Date: 2025-10-20</p>
|
||||
<p>When macro was removed in Asterisk 21, the parameter documentation in
|
||||
code was not updated to reflect the correct numerization for gosub. It
|
||||
still stated that it was the seventh parameter, but got shifted to the
|
||||
sixth due to the removal of macro. This has been updated to correctly
|
||||
reflect the parameter order, and a note has been added to the XML that
|
||||
states this was done after the initial commit.</p>
|
||||
<p>Fixes: #1534</p>
|
||||
<p>UpgradeNote: As part of Asterisk 21, macros were removed from Asterisk.
|
||||
This resulted in argument order changing for the Queue dialplan
|
||||
application since the macro argument was removed. Upgrade notice was
|
||||
missed when this was done, so this upgrade note has been added to
|
||||
provide a record of such and a notice to users who may have not upgraded
|
||||
yet.</p>
|
||||
<h4>devicestate: Don't publish redundant device state messages.</h4>
|
||||
<p>Author: Joshua C. Colp
|
||||
Date: 2025-10-17</p>
|
||||
<p>When publishing device state check the local cache for the
|
||||
existing device state. If the new device state is unchanged
|
||||
from the prior one, don't bother publishing the update. This
|
||||
can reduce the work done by consumers of device state, such
|
||||
as hints and app_queue, by not publishing a message to them.</p>
|
||||
<p>These messages would most often occur with devices that are
|
||||
seeing numerous simultaneous channels. The underlying device
|
||||
state would remain as in use throughout, but an update would
|
||||
be published as channels are created and hung up.</p>
|
||||
<h4>chan_pjsip: Add technology-specific off-nominal hangup cause to events.</h4>
|
||||
<p>Author: George Joseph
|
||||
Date: 2025-10-14</p>
|
||||
<p>Although the ISDN/Q.850/Q.931 hangup cause code is already part of the ARI
|
||||
and AMI hangup and channel destroyed events, it can be helpful to know what
|
||||
the actual channel technology code was if the call was unsuccessful.
|
||||
For PJSIP, it's the SIP response code.</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>A new "tech_hangupcause" field was added to the ast_channel structure along
|
||||
with ast_channel_tech_hangupcause() and ast_channel_tech_hangupcause_set()
|
||||
functions. It should only be set for off-nominal terminations.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>chan_pjsip was modified to set the tech hangup cause in the
|
||||
chan_pjsip_hangup() and chan_pjsip_session_end() functions. This is a bit
|
||||
tricky because these two functions aren't always called in the same order.
|
||||
The channel that hangs up first will get chan_pjsip_session_end() called
|
||||
first which will trigger the core to call chan_pjsip_hangup() on itself,
|
||||
then call chan_pjsip_hangup() on the other channel. The other channel's
|
||||
chan_pjsip_session_end() function will get called last. Unfortunately,
|
||||
the other channel's HangupRequest events are sent before chan_pjsip has had a
|
||||
chance to set the tech hangupcause code so the HangupRequest events for that
|
||||
channel won't have the cause code set. The ChannelDestroyed and Hangup
|
||||
events however will have the code set for both channels.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>A new "tech_cause" field was added to the ast_channel_snapshot_hangup
|
||||
structure. This is a public structure so a bit of refactoring was needed to
|
||||
preserve ABI compatibility.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The ARI ChannelHangupRequest and ChannelDestroyed events were modified to
|
||||
include the "tech_cause" parameter in the JSON for off-nominal terminations.
|
||||
The parameter is suppressed for nominal termination.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The AMI SoftHangupRequest, HangupRequest and Hangup events were modified to
|
||||
include the "TechCause" parameter for off-nominal terminations. Like their ARI
|
||||
counterparts, the parameter is suppressed for nominal termination.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>DeveloperNote: A "tech_cause" parameter has been added to the
|
||||
ChannelHangupRequest and ChannelDestroyed ARI event messages and a "TechCause"
|
||||
parameter has been added to the HangupRequest, SoftHangupRequest and Hangup
|
||||
AMI event messages. For chan_pjsip, these will be set to the last SIP
|
||||
response status code for off-nominally terminated calls. The parameter is
|
||||
suppressed for nominal termination.</p>
|
||||
<h4>res_audiosocket: add message types for all slin sample rates</h4>
|
||||
<p>Author: Sven Kube
|
||||
Date: 2025-10-10</p>
|
||||
<p>Extend audiosocket messages with types 0x11 - 0x18 to create asterisk
|
||||
frames in slin12, slin16, slin24, slin32, slin44, slin48, slin96, and
|
||||
slin192 format, enabling the transmission of audio at a higher sample
|
||||
rates. For audiosocket messages sent by Asterisk, the message kind is
|
||||
determined by the format of the originating asterisk frame.</p>
|
||||
<p>UpgradeNote: New audiosocket message types 0x11 - 0x18 has been added
|
||||
for slin12, slin16, slin24, slin32, slin44, slin48, slin96, and
|
||||
slin192 audio. External applications using audiosocket may need to be
|
||||
updated to support these message types if the audiosocket channel is
|
||||
created with one of these audio formats.</p>
|
||||
<h4>res_fax.c: lower FAXOPT read warning to debug level</h4>
|
||||
<p>Author: phoneben
|
||||
Date: 2025-10-03</p>
|
||||
<p>Reading ${FAXOPT()} before a fax session is common in dialplans to check fax state.
|
||||
Currently this logs an error even when no fax datastore exists, creating excessive noise.
|
||||
Change these messages to ast_debug(3, …) so they appear only with debug enabled.</p>
|
||||
<p>Resolves: #1509</p>
|
||||
<h4>endpoints: Remove need for stasis subscription.</h4>
|
||||
<p>Author: Joshua C. Colp
|
||||
Date: 2025-10-10</p>
|
||||
<p>When an endpoint is created in the core of Asterisk a subscription
|
||||
was previously created alongside it to monitor any channels being
|
||||
destroyed that were related to it. This was done by receiving all
|
||||
channel snapshot updates for every channel and only reacting when
|
||||
it was indicated that the channel was dead.</p>
|
||||
<p>This change removes this logic and instead provides an API call
|
||||
for directly removing a channel from an endpoint. This is called
|
||||
when channels are destroyed. This operation is fast, so blocking
|
||||
the calling thread for a short period of time doesn't have any
|
||||
noticeable impact.</p>
|
||||
<h4>app_queue: Allow stasis message filtering to work.</h4>
|
||||
<p>Author: Joshua C. Colp
|
||||
Date: 2025-10-10</p>
|
||||
<p>The app_queue module subscribes on a per-dialed agent basis to both
|
||||
the bridge all and channel all topics to keep apprised of things going
|
||||
on involving them. This subscription has associated state that must
|
||||
be cleaned up when the subscription ends. This was done by setting
|
||||
a default router callback that only had logic to handle the case
|
||||
where the subscription ends. By using the default router callback
|
||||
all filtering for the subscription was disabled, causing unrelated
|
||||
messages to get published and handled by it.</p>
|
||||
<p>This change makes it so that an explicit route is added for the
|
||||
message type used for the message indicating the subscription has
|
||||
ended and removes the default router callback. This allows message
|
||||
filtering to occur on publishing reducing the messages to app_queue
|
||||
to only those it is interested in.</p>
|
||||
<h4>taskpool: Fix some references to threadpool that should be taskpool.</h4>
|
||||
<p>Author: George Joseph
|
||||
Date: 2025-10-10</p>
|
||||
<p>Resolves: #1478</p>
|
||||
<h4>Update contact information for anthm</h4>
|
||||
<p>Author: Anthony Minessale
|
||||
Date: 2025-10-10</p>
|
||||
<h4>chan_websocket.c: Change payload references to command instead.</h4>
|
||||
<p>Author: George Joseph
|
||||
Date: 2025-10-08</p>
|
||||
<p>Some of the tests in process_text_message() were still comparing to the
|
||||
websocket message payload instead of the "command" string.</p>
|
||||
<p>Resolves: #1525</p>
|
||||
<h4>func_callerid: Document limitation of DNID fields.</h4>
|
||||
<p>Author: Naveen Albert
|
||||
Date: 2025-10-06</p>
|
||||
<p>The Dial() application does not propagate DNID fields, which is counter
|
||||
to the behavior of the other Caller ID fields. This behavior is likely
|
||||
intentional since the use of Dial theoretically suggests a new dialed
|
||||
number, but document this caveat to inform users of it.</p>
|
||||
<p>Resolves: #1519</p>
|
||||
<h4>func_channel: Allow R/W of ADSI CPE capability setting.</h4>
|
||||
<p>Author: Naveen Albert
|
||||
Date: 2025-10-06</p>
|
||||
<p>Allow retrieving and setting the channel's ADSI capability from the
|
||||
dialplan.</p>
|
||||
<p>Resolves: #1514</p>
|
||||
<p>UserNote: CHANNEL(adsicpe) can now be read or written to change
|
||||
the channels' ADSI CPE capability setting.</p>
|
||||
<h4>core_unreal: Preserve ADSI capability when dialing Local channels.</h4>
|
||||
<p>Author: Naveen Albert
|
||||
Date: 2025-10-06</p>
|
||||
<p>Dial() already preserves the ADSI capability by copying it to the new
|
||||
channel, but since Local channel pairs consist of two channels, we
|
||||
also need to copy the capability to the second channel.</p>
|
||||
<p>Resolves: #1517</p>
|
||||
<h4>func_hangupcause.c: Add access to Reason headers via HANGUPCAUSE()</h4>
|
||||
<p>Author: Igor Goncharovsky
|
||||
Date: 2025-09-04</p>
|
||||
<p>As soon as SIP call may end with several Reason headers, we
|
||||
want to make all of them available through the HAGUPCAUSE() function.
|
||||
This implementation uses the same ao2 hash for cause codes storage
|
||||
and adds a flag to make difference between last processed sip
|
||||
message and content of reason headers.</p>
|
||||
<p>UserNote: Added a new option to HANGUPCAUSE to access additional
|
||||
information about hangup reason. Reason headers from pjsip
|
||||
could be read using 'tech_extended' cause type.</p>
|
||||
<h4>sig_analog: Allow '#' to end the inter-digit timeout when dialing.</h4>
|
||||
<p>Author: Naveen Albert
|
||||
Date: 2025-10-03</p>
|
||||
<p>It is customary to allow # to terminate digit collection immediately
|
||||
when there would normally be a timeout. However, currently, users are
|
||||
forced to wait for the timeout to expire when dialing numbers that
|
||||
are prefixes of other valid matches, and there is no way to end the
|
||||
timeout early. Customarily, # terminates the timeout, but at the moment,
|
||||
this is just rejected unless there happens to be a matching extension
|
||||
ending in #.</p>
|
||||
<p>Allow # to terminate the timeout in cases where there is no dialplan
|
||||
match. This ensures that the dialplan is always respected, but if a
|
||||
valid extension has been dialed that happens to prefix other valid
|
||||
matches, # can be used to dial it immediately.</p>
|
||||
<p>Resolves: #1510</p>
|
||||
<h4>func_math: Add DIGIT_SUM function.</h4>
|
||||
<p>Author: Naveen Albert
|
||||
Date: 2025-10-01</p>
|
||||
<p>Add a function (DIGIT_SUM) which returns the digit sum of a number.</p>
|
||||
<p>Resolves: #1499</p>
|
||||
<p>UserNote: The DIGIT_SUM function can be used to return the digit sum of
|
||||
a number.</p>
|
||||
<h4>app_sf: Add post-digit timer option to ReceiveSF.</h4>
|
||||
<p>Author: Naveen Albert
|
||||
Date: 2025-10-01</p>
|
||||
<p>Add a sorely needed option to set a timeout between digits, rather than
|
||||
for receiving the entire number. This is needed if the number of digits
|
||||
being sent is unknown by the receiver in advance. Previously, we had
|
||||
to wait for the entire timer to expire.</p>
|
||||
<p>Resolves: #1493</p>
|
||||
<p>UserNote: The 't' option for ReceiveSF now allows for a timer since
|
||||
the last digit received, in addition to the number-wide timeout.</p>
|
||||
<h4>codec_builtin.c: Adjust some of the quality scores to reflect reality.</h4>
|
||||
<p>Author: Naveen Albert
|
||||
Date: 2025-10-02</p>
|
||||
<p>Among the lower-quality voice codecs, some of the quality scores did
|
||||
not make sense relative to each other.</p>
|
||||
<p>For instance, quality-wise, G.729 > G.723 > PLC10.
|
||||
However, current scores do not uphold these relationships.</p>
|
||||
<p>Tweak the scores slightly to reflect more accurate relationships.</p>
|
||||
<p>Resolves: #1501</p>
|
||||
<h4>res_tonedetect: Fix formatting of XML documentation.</h4>
|
||||
<p>Author: Naveen Albert
|
||||
Date: 2025-10-02</p>
|
||||
<p>Fix the indentation in the documentation for the variable list.</p>
|
||||
<p>Resolves: #1507</p>
|
||||
<h4>res_fax: Add XML documentation for channel variables.</h4>
|
||||
<p>Author: Naveen Albert
|
||||
Date: 2025-10-02</p>
|
||||
<p>Document the channel variables currently set by SendFAX and ReceiveFAX.</p>
|
||||
<p>Resolves: #1505</p>
|
||||
<h4>channelstorage_cpp_map_name_id: Add read locking around retrievals.</h4>
|
||||
<p>Author: George Joseph
|
||||
Date: 2025-10-01</p>
|
||||
<p>When we retrieve a channel from a C++ map, we actually get back a wrapper
|
||||
object that points to the channel then right after we retrieve it, we bump its
|
||||
reference count. There's a tiny chance however that between those two
|
||||
statements a delete and/or unref might happen which would cause the wrapper
|
||||
object or the channel itself to become invalid resulting in a SEGV. To avoid
|
||||
this we now perform a read lock on the driver around those statements.</p>
|
||||
<p>Resolves: #1491</p>
|
||||
<h4>app_dial: Allow fractional seconds for dial timeouts.</h4>
|
||||
<p>Author: Naveen Albert
|
||||
Date: 2025-09-30</p>
|
||||
<p>Even though Dial() internally uses milliseconds for its dial timeouts,
|
||||
this capability has been mostly obscured from users as the argument is
|
||||
only parsed as an integer, thus forcing the use of whole seconds for
|
||||
timeouts.</p>
|
||||
<p>Parse it as a decimal instead so that timeouts can now truly have
|
||||
millisecond precision.</p>
|
||||
<p>Resolves: #1487</p>
|
||||
<p>UserNote: The answer and progress dial timeouts now have millisecond
|
||||
precision, instead of having to be whole numbers.</p>
|
||||
<h4>dsp.c: Make minor fixes to debug log messages.</h4>
|
||||
<p>Author: Naveen Albert
|
||||
Date: 2025-10-01</p>
|
||||
<p>Commit dc8e3eeaaf094a3d16991289934093d5e7127680 improved the debug log
|
||||
messages in dsp.c. This makes two minor corrections to it:</p>
|
||||
<ul>
|
||||
<li>Properly guard an added log statement in a conditional.</li>
|
||||
<li>Don't add one to the hit count if there was no hit (however, we do
|
||||
still want to do this for the case where this is one).</li>
|
||||
</ul>
|
||||
<p>Resolves: #1496</p>
|
||||
<h4>config_options.c: Improve misleading warning.</h4>
|
||||
<p>Author: Naveen Albert
|
||||
Date: 2025-09-30</p>
|
||||
<p>When running "config show help <module>", if no XML documentation exists
|
||||
for the specified module, "Module <module> not found." is returned,
|
||||
which is misleading if the module is loaded but simply has no XML
|
||||
documentation for its config. Improve the message to clarify that the
|
||||
module may simply have no config documentation.</p>
|
||||
<p>Resolves: #1489</p>
|
||||
<h4>func_scramble: Add example to XML documentation.</h4>
|
||||
<p>Author: Naveen Albert
|
||||
Date: 2025-09-29</p>
|
||||
<p>The previous lack of an example made it ambiguous if the arguments went
|
||||
inside the function arguments or were part of the right-hand value.</p>
|
||||
<p>Resolves: #1485</p>
|
||||
<h4>sig_analog: Eliminate potential timeout with Last Number Redial.</h4>
|
||||
<p>Author: Naveen Albert
|
||||
Date: 2025-09-29</p>
|
||||
<p>If Last Number Redial is used to redial, ensure that we do not wait
|
||||
for further digits. This was possible if the number that was last
|
||||
dialed is a prefix of another possible dialplan match. Since all we
|
||||
did is copy the number into the extension buffer, if other matches
|
||||
are now possible, there would thus be a timeout before the call went
|
||||
through. We now complete redialed calls immediaetly in all cases.</p>
|
||||
<p>Resolves: #1483</p>
|
||||
<h4>ARI: The bridges play and record APIs now handle sample rates > 8K correctly.</h4>
|
||||
<p>Author: George Joseph
|
||||
Date: 2025-09-25</p>
|
||||
<p>The bridge play and record APIs were forcing the Announcer/Recorder channel
|
||||
to slin8 which meant that if you played or recorded audio with a sample
|
||||
rate > 8K, it was downsampled to 8K limiting the bandwidth.</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>The /bridges/play REST APIs have a new "announcer_format" parameter that
|
||||
allows the caller to explicitly set the format on the "Announcer" channel
|
||||
through which the audio is played into the bridge. If not specified, the
|
||||
default depends on how many channels are currently in the bridge. If
|
||||
a single channel is in the bridge, then the Announcer channel's format
|
||||
will be set to the same as that channel's. If multiple channels are in the
|
||||
bridge, the channels will be scanned to find the one with the highest
|
||||
sample rate and the Announcer channel's format will be set to the slin
|
||||
format that has an equal to or greater than sample rate.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The /bridges/record REST API has a new "recorder_format" parameter that
|
||||
allows the caller to explicitly set the format on the "Recorder" channel
|
||||
from which audio is retrieved to write to the file. If not specified,
|
||||
the Recorder channel's format will be set to the format that was requested
|
||||
to save the audio in.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>Resolves: #1479</p>
|
||||
<p>DeveloperNote: The ARI /bridges/play and /bridges/record REST APIs have new
|
||||
parameters that allow the caller to specify the format to be used on the
|
||||
"Announcer" and "Recorder" channels respecitvely.</p>
|
||||
<h4>res_pjsip_geolocation: Add support for Geolocation loc-src parameter</h4>
|
||||
<p>Author: Max Grobecker
|
||||
Date: 2025-09-21</p>
|
||||
<p>This adds support for the Geolocation 'loc-src' parameter to res_pjsip_geolocation.
|
||||
The already existing config option 'location_source` in res_geolocation is documented to add a 'loc-src' parameter containing a user-defined FQDN to the 'Geolocation:' header,
|
||||
but that option had no effect as it was not implemented by res_pjsip_geolocation.</p>
|
||||
<p>If the <code>location_source</code> configuration option is not set or invalid, that parameter will not be added (this is already checked by res_geolocation).</p>
|
||||
<p>This commits adds already documented functionality.</p>
|
||||
<h4>sorcery: Move from threadpool to taskpool.</h4>
|
||||
<p>Author: Joshua C. Colp
|
||||
Date: 2025-09-23</p>
|
||||
<p>This change moves observer invocation from the use of
|
||||
a threadpool to a taskpool. The taskpool options have also
|
||||
been adjusted to ensure that at least one taskprocessor
|
||||
remains available at all times.</p>
|
||||
<h4>stasis_channels.c: Make protocol_id optional to enable blind transfer via ari</h4>
|
||||
<p>Author: Sven Kube
|
||||
Date: 2025-09-22</p>
|
||||
<p>When handling SIP transfers via ARI, there is no protocol_id in case of
|
||||
a blind transfer.</p>
|
||||
<p>Resolves: #1467</p>
|
||||
<h4>Fix some doxygen, typos and whitespace</h4>
|
||||
<p>Author: Bastian Triller
|
||||
Date: 2025-09-21</p>
|
||||
<h4>stasis_channels.c: Add null check for referred_by in ast_ari_transfer_message_..</h4>
|
||||
<p>Author: Sven Kube
|
||||
Date: 2025-09-18</p>
|
||||
<p>When handling SIP transfers via ARI, the <code>referred_by</code> field in
|
||||
<code>transfer_ari_state</code> may be null, since SIP REFER requests are not
|
||||
required to include a <code>Referred-By</code> header. Without this check, a null
|
||||
value caused the transfer to fail and triggered a NOTIFY with a 500
|
||||
Internal Server Error.</p>
|
||||
<h4>app_queue: Add NULL pointer checks in app_queue</h4>
|
||||
<p>Author: phoneben
|
||||
Date: 2025-09-11</p>
|
||||
<p>Add NULL check for word_list before calling word_in_list()
|
||||
Add NULL checks for channel snapshots from ast_multi_channel_blob_get_channel()</p>
|
||||
<p>Resolves: #1425</p>
|
||||
<h4>app_externalivr: Prevent out-of-bounds read during argument processing.</h4>
|
||||
<p>Author: Sean Bright
|
||||
Date: 2025-09-17</p>
|
||||
<p>Resolves: #1422</p>
|
||||
<h4>chan_dahdi: Add DAHDI_CHANNEL function.</h4>
|
||||
<p>Author: Naveen Albert
|
||||
Date: 2025-09-11</p>
|
||||
<p>Add a dialplan function that can be used to get/set properties of
|
||||
DAHDI channels (as opposed to Asterisk channels). This exposes
|
||||
properties that were not previously available, allowing for certain
|
||||
operations to now be performed in the dialplan.</p>
|
||||
<p>Resolves: #1455</p>
|
||||
<p>UserNote: The DAHDI_CHANNEL function allows for getting/setting
|
||||
certain properties about DAHDI channels from the dialplan.</p>
|
||||
<h4>taskpool: Update versions for taskpool stasis options.</h4>
|
||||
<p>Author: Joshua C. Colp
|
||||
Date: 2025-09-16</p>
|
||||
<h4>taskpool: Add taskpool API, switch Stasis to using it.</h4>
|
||||
<p>Author: Joshua C. Colp
|
||||
Date: 2025-08-06</p>
|
||||
<p>This change introduces a new API called taskpool. This is a pool
|
||||
of taskprocessors. It provides the following functionality:</p>
|
||||
<ol>
|
||||
<li>Task pushing to a pool of taskprocessors</li>
|
||||
<li>Synchronous tasks</li>
|
||||
<li>Serializers for execution ordering of tasks</li>
|
||||
<li>Growing/shrinking of number of taskprocessors in pool</li>
|
||||
</ol>
|
||||
<p>This functionality already exists through the combination of
|
||||
threadpool+taskprocessors but through investigating I determined
|
||||
that this carries substantial overhead for short to medium duration
|
||||
tasks. The threadpool uses a single queue of work, and for management
|
||||
of threads it involves additional tasks.</p>
|
||||
<p>I wrote taskpool to eliminate the extra overhead and management
|
||||
as much as possible. Instead of a single queue of work each
|
||||
taskprocessor has its own queue and at push time a selector chooses
|
||||
the taskprocessor to queue the task to. Each taskprocessor also
|
||||
has its own thread like normal. This spreads out the tasks immediately
|
||||
and reduces contention on shared resources.</p>
|
||||
<p>Using the included efficiency tests the number of tasks that can be
|
||||
executed per second in a taskpool is 6-12 times more than an equivalent
|
||||
threadpool+taskprocessor setup.</p>
|
||||
<p>Stasis has been moved over to using this new API as it is a heavy consumer
|
||||
of threadpool+taskprocessors and produces a lot of tasks.</p>
|
||||
<p>UpgradeNote: The threadpool_* options in stasis.conf have now been deprecated
|
||||
though they continue to be read and used. They have been replaced with taskpool
|
||||
options that give greater control over the underlying taskpool used for stasis.</p>
|
||||
<p>DeveloperNote: The taskpool API has been added for common usage of a
|
||||
pool of taskprocessors. It is suggested to use this API instead of the
|
||||
threadpool+taskprocessor approach.</p>
|
||||
<h4>app_adsiprog: Fix possible NULL dereference.</h4>
|
||||
<p>Author: Naveen Albert
|
||||
Date: 2025-09-10</p>
|
||||
<p>get_token can return NULL, but process_token uses this result without
|
||||
checking for NULL; as elsewhere, check for a NULL result to avoid
|
||||
possible NULL dereference.</p>
|
||||
<p>Resolves: #1419</p>
|
||||
<h4>manager.c: Fix presencestate object leak</h4>
|
||||
<p>Author: Nathan Monfils
|
||||
Date: 2025-09-08</p>
|
||||
<p>ast_presence_state allocates subtype and message. We straightforwardly
|
||||
need to clean those up.</p>
|
||||
<h4>audiohook.c: Ensure correct AO2 reference is dereffed.</h4>
|
||||
<p>Author: Sean Bright
|
||||
Date: 2025-09-10</p>
|
||||
<p>Part of #1440.</p>
|
||||
<h4>res_cliexec: Remove unnecessary casts to char*.</h4>
|
||||
<p>Author: Naveen Albert
|
||||
Date: 2025-09-09</p>
|
||||
<p>Resolves: #1436</p>
|
||||
<h4>rtp_engine.c: Add exception for comfort noise payload.</h4>
|
||||
<p>Author: Ben Ford
|
||||
Date: 2025-09-09</p>
|
||||
<p>In a previous commit, a change was made to
|
||||
ast_rtp_codecs_payload_code_tx_sample_rate to check for differing sample
|
||||
rates. This ended up returning an invalid payload int for comfort noise.
|
||||
A check has been added that returns early if the payload is in fact
|
||||
supposed to be comfort noise.</p>
|
||||
<p>Fixes: #1340</p>
|
||||
<h4>pbx_variables.c: Create real channel for "dialplan eval function".</h4>
|
||||
<p>Author: Naveen Albert
|
||||
Date: 2025-09-09</p>
|
||||
<p>"dialplan eval function" has been using a dummy channel for function
|
||||
evaluation, much like many of the unit tests. However, sometimes, this
|
||||
can cause issues for functions that are not expecting dummy channels.
|
||||
As an example, ast_channel_tech(chan) is NULL on such channels, and
|
||||
ast_channel_tech(chan)->type consequently results in a NULL dereference.
|
||||
Normally, functions do not worry about this since channels executing
|
||||
dialplan aren't dummy channels.</p>
|
||||
<p>While some functions are better about checking for these sorts of edge
|
||||
cases, use a real channel with a dummy technology to make this CLI
|
||||
command inherently safe for any dialplan function that could be evaluated
|
||||
from the CLI.</p>
|
||||
<p>Resolves: #1434</p>
|
||||
</body></html>
|
||||
993
ChangeLogs/ChangeLog-22.7.0-rc1.md
Normal file
993
ChangeLogs/ChangeLog-22.7.0-rc1.md
Normal file
@@ -0,0 +1,993 @@
|
||||
|
||||
## Change Log for Release asterisk-22.7.0-rc1
|
||||
|
||||
### Links:
|
||||
|
||||
- [Full ChangeLog](https://downloads.asterisk.org/pub/telephony/asterisk/releases/ChangeLog-22.7.0-rc1.html)
|
||||
- [GitHub Diff](https://github.com/asterisk/asterisk/compare/22.6.0...22.7.0-rc1)
|
||||
- [Tarball](https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22.7.0-rc1.tar.gz)
|
||||
- [Downloads](https://downloads.asterisk.org/pub/telephony/asterisk)
|
||||
|
||||
### Summary:
|
||||
|
||||
- Commits: 53
|
||||
- Commit Authors: 16
|
||||
- Issues Resolved: 35
|
||||
- Security Advisories Resolved: 0
|
||||
|
||||
### User Notes:
|
||||
|
||||
- #### res_stir_shaken: Add STIR_SHAKEN_ATTESTATION dialplan function.
|
||||
The STIR_SHAKEN_ATTESTATION dialplan function has been added
|
||||
which will allow suppressing attestation on a call-by-call basis
|
||||
regardless of the profile attached to the outgoing endpoint.
|
||||
|
||||
- #### func_channel: Allow R/W of ADSI CPE capability setting.
|
||||
CHANNEL(adsicpe) can now be read or written to change
|
||||
the channels' ADSI CPE capability setting.
|
||||
|
||||
- #### func_hangupcause.c: Add access to Reason headers via HANGUPCAUSE()
|
||||
Added a new option to HANGUPCAUSE to access additional
|
||||
information about hangup reason. Reason headers from pjsip
|
||||
could be read using 'tech_extended' cause type.
|
||||
|
||||
- #### func_math: Add DIGIT_SUM function.
|
||||
The DIGIT_SUM function can be used to return the digit sum of
|
||||
a number.
|
||||
|
||||
- #### app_sf: Add post-digit timer option to ReceiveSF.
|
||||
The 't' option for ReceiveSF now allows for a timer since
|
||||
the last digit received, in addition to the number-wide timeout.
|
||||
|
||||
- #### app_dial: Allow fractional seconds for dial timeouts.
|
||||
The answer and progress dial timeouts now have millisecond
|
||||
precision, instead of having to be whole numbers.
|
||||
|
||||
- #### chan_dahdi: Add DAHDI_CHANNEL function.
|
||||
The DAHDI_CHANNEL function allows for getting/setting
|
||||
certain properties about DAHDI channels from the dialplan.
|
||||
|
||||
|
||||
### Upgrade Notes:
|
||||
|
||||
- #### pjsip: Move from threadpool to taskpool
|
||||
The threadpool_* options in pjsip.conf have now
|
||||
been deprecated though they continue to be read and used.
|
||||
They have been replaced with taskpool options that give greater
|
||||
control over the underlying taskpool used for PJSIP. An alembic
|
||||
upgrade script has been added to add these options to realtime
|
||||
as well.
|
||||
|
||||
- #### app_queue.c: Fix error in Queue parameter documentation.
|
||||
As part of Asterisk 21, macros were removed from Asterisk.
|
||||
This resulted in argument order changing for the Queue dialplan
|
||||
application since the macro argument was removed. Upgrade notice was
|
||||
missed when this was done, so this upgrade note has been added to
|
||||
provide a record of such and a notice to users who may have not upgraded
|
||||
yet.
|
||||
|
||||
- #### res_audiosocket: add message types for all slin sample rates
|
||||
New audiosocket message types 0x11 - 0x18 has been added
|
||||
for slin12, slin16, slin24, slin32, slin44, slin48, slin96, and
|
||||
slin192 audio. External applications using audiosocket may need to be
|
||||
updated to support these message types if the audiosocket channel is
|
||||
created with one of these audio formats.
|
||||
|
||||
- #### taskpool: Add taskpool API, switch Stasis to using it.
|
||||
The threadpool_* options in stasis.conf have now been deprecated
|
||||
though they continue to be read and used. They have been replaced with taskpool
|
||||
options that give greater control over the underlying taskpool used for stasis.
|
||||
|
||||
|
||||
### Developer Notes:
|
||||
|
||||
- #### chan_pjsip: Add technology-specific off-nominal hangup cause to events.
|
||||
A "tech_cause" parameter has been added to the
|
||||
ChannelHangupRequest and ChannelDestroyed ARI event messages and a "TechCause"
|
||||
parameter has been added to the HangupRequest, SoftHangupRequest and Hangup
|
||||
AMI event messages. For chan_pjsip, these will be set to the last SIP
|
||||
response status code for off-nominally terminated calls. The parameter is
|
||||
suppressed for nominal termination.
|
||||
|
||||
- #### ARI: The bridges play and record APIs now handle sample rates > 8K correctly.
|
||||
The ARI /bridges/play and /bridges/record REST APIs have new
|
||||
parameters that allow the caller to specify the format to be used on the
|
||||
"Announcer" and "Recorder" channels respecitvely.
|
||||
|
||||
- #### taskpool: Add taskpool API, switch Stasis to using it.
|
||||
The taskpool API has been added for common usage of a
|
||||
pool of taskprocessors. It is suggested to use this API instead of the
|
||||
threadpool+taskprocessor approach.
|
||||
|
||||
|
||||
### Commit Authors:
|
||||
|
||||
- Anthony Minessale: (1)
|
||||
- Bastian Triller: (1)
|
||||
- Ben Ford: (2)
|
||||
- Christoph Moench-Tegeder: (1)
|
||||
- Gauravs456: (1)
|
||||
- George Joseph: (8)
|
||||
- Igor Goncharovsky: (1)
|
||||
- Joshua C. Colp: (8)
|
||||
- Max Grobecker: (1)
|
||||
- Nathan Monfils: (1)
|
||||
- Naveen Albert: (18)
|
||||
- Phoneben: (2)
|
||||
- Roman Pertsev: (1)
|
||||
- Sean Bright: (3)
|
||||
- Sven Kube: (3)
|
||||
- Tinet-Mucw: (1)
|
||||
|
||||
## Issue and Commit Detail:
|
||||
|
||||
### Closed Issues:
|
||||
|
||||
- 781: [improvement]: Allow call by call disabling Stir/Shaken header inclusion
|
||||
- 1340: [bug]: comfort noise packet corrupted
|
||||
- 1419: [bug]: static code analysis issues in app_adsiprog.c
|
||||
- 1422: [bug]: static code analysis issues in apps/app_externalivr.c
|
||||
- 1425: [bug]: static code analysis issues in apps/app_queue.c
|
||||
- 1434: [improvement]: pbx_variables: Create real channel for dialplan eval CLI command
|
||||
- 1436: [improvement]: res_cliexec: Avoid unnecessary cast to char*
|
||||
- 1455: [new-feature]: chan_dahdi: Add DAHDI_CHANNEL function
|
||||
- 1467: [bug]: Crash in res_pjsip_refer during REFER progress teardown with PJSIP_TRANSFER_HANDLING(ari-only)
|
||||
- 1478: [improvement]: Stasis threadpool -> taskpool
|
||||
- 1479: [bug]: The ARI bridge play and record APIs limit audio bandwidth by forcing the slin8 format.
|
||||
- 1483: [improvement]: sig_analog: Eliminate possible timeout for Last Number Redial
|
||||
- 1485: [improvement]: func_scramble: Add example to XML documentation.
|
||||
- 1487: [improvement]: app_dial: Allow partial seconds to be used for dial timeouts
|
||||
- 1489: [improvement]: config_options.c: Improve misleading error message
|
||||
- 1491: [bug]: Segfault: `channelstorage_cpp` fast lookup without lock (`get_by_name_exact`/`get_by_uniqueid`) leads to UAF during hangup
|
||||
- 1493: [new-feature]: app_sf: Add post-digit timer option
|
||||
- 1496: [improvement]: dsp.c: Minor fixes to debug log messages
|
||||
- 1499: [new-feature]: func_math: Add function to return the digit sum
|
||||
- 1501: [improvement]: codec_builtin: Fix some inaccurate quality weights.
|
||||
- 1505: [improvement]: res_fax: Add XML documentation for channel variables
|
||||
- 1507: [improvement]: res_tonedetect: Minor formatting issue in documentation
|
||||
- 1509: [improvement]: res_fax.c — log debug error as debug, not regular log
|
||||
- 1510: [new-feature]: sig_analog: Allow '#' to end the inter-digit timeout when dialing.
|
||||
- 1514: [improvement]: func_channel: Allow R/W of ADSI CPE capability setting.
|
||||
- 1517: [improvement]: core_unreal: Preserve ADSI capability when dialing Local channels
|
||||
- 1519: [improvement]: app_dial / func_callerid: DNIS information is not propagated by Dial
|
||||
- 1525: [bug]: chan_websocket: fix use of raw payload variable for string comparison in process_text_message
|
||||
- 1534: [bug]: app_queue when using gosub breaks dialplan when going from 20 to 21, What's new in 21 doesn't mention it's a breaking change,
|
||||
- 1535: [bug]: chan_pjsip changes SSRC on WebRTC channels, which is unsupported by some browsers
|
||||
- 1536: [bug]: asterisk -rx connects to console instead of executing a command
|
||||
- 1539: [bug]: safe_asterisk without TTY doesn't log to file
|
||||
- 1544: [improvement]: While Receiving the MediaConnect Message Using External Media Over websocket ChannelID is Details are missing
|
||||
- 1554: [bug]: safe_asterisk recurses into subdirectories of startup.d after f97361
|
||||
- 1559: [improvement]: Handle TLS handshake attacks in order to resolve the issue of exceeding the maximum number of HTTPS sessions.
|
||||
|
||||
### Commits By Author:
|
||||
|
||||
- #### Anthony Minessale (1):
|
||||
- Update contact information for anthm
|
||||
|
||||
- #### Bastian Triller (1):
|
||||
- Fix some doxygen, typos and whitespace
|
||||
|
||||
- #### Ben Ford (2):
|
||||
- rtp_engine.c: Add exception for comfort noise payload.
|
||||
- app_queue.c: Fix error in Queue parameter documentation.
|
||||
|
||||
- #### Christoph Moench-Tegeder (1):
|
||||
- Fix Endianness detection in utils.h for non-Linux
|
||||
|
||||
- #### George Joseph (8):
|
||||
- ARI: The bridges play and record APIs now handle sample rates > 8K correctly.
|
||||
- channelstorage_cpp_map_name_id: Add read locking around retrievals.
|
||||
- chan_websocket.c: Change payload references to command instead.
|
||||
- taskpool: Fix some references to threadpool that should be taskpool.
|
||||
- chan_pjsip: Add technology-specific off-nominal hangup cause to events.
|
||||
- safe_asterisk: Fix logging and sorting issue.
|
||||
- chan_pjsip: Disable SSRC change for WebRTC endpoints.
|
||||
- res_stir_shaken: Add STIR_SHAKEN_ATTESTATION dialplan function.
|
||||
|
||||
- #### Igor Goncharovsky (1):
|
||||
- func_hangupcause.c: Add access to Reason headers via HANGUPCAUSE()
|
||||
|
||||
- #### Joshua C. Colp (8):
|
||||
- taskpool: Add taskpool API, switch Stasis to using it.
|
||||
- taskpool: Update versions for taskpool stasis options.
|
||||
- sorcery: Move from threadpool to taskpool.
|
||||
- app_queue: Allow stasis message filtering to work.
|
||||
- endpoints: Remove need for stasis subscription.
|
||||
- devicestate: Don't publish redundant device state messages.
|
||||
- pjsip: Move from threadpool to taskpool
|
||||
- Revert "pjsip: Move from threadpool to taskpool"
|
||||
|
||||
- #### Max Grobecker (1):
|
||||
- res_pjsip_geolocation: Add support for Geolocation loc-src parameter
|
||||
|
||||
- #### Nathan Monfils (1):
|
||||
- manager.c: Fix presencestate object leak
|
||||
|
||||
- #### Naveen Albert (18):
|
||||
- pbx_variables.c: Create real channel for "dialplan eval function".
|
||||
- res_cliexec: Remove unnecessary casts to char*.
|
||||
- app_adsiprog: Fix possible NULL dereference.
|
||||
- chan_dahdi: Add DAHDI_CHANNEL function.
|
||||
- sig_analog: Eliminate potential timeout with Last Number Redial.
|
||||
- func_scramble: Add example to XML documentation.
|
||||
- config_options.c: Improve misleading warning.
|
||||
- dsp.c: Make minor fixes to debug log messages.
|
||||
- app_dial: Allow fractional seconds for dial timeouts.
|
||||
- res_fax: Add XML documentation for channel variables.
|
||||
- res_tonedetect: Fix formatting of XML documentation.
|
||||
- codec_builtin.c: Adjust some of the quality scores to reflect reality.
|
||||
- app_sf: Add post-digit timer option to ReceiveSF.
|
||||
- func_math: Add DIGIT_SUM function.
|
||||
- sig_analog: Allow '#' to end the inter-digit timeout when dialing.
|
||||
- core_unreal: Preserve ADSI capability when dialing Local channels.
|
||||
- func_channel: Allow R/W of ADSI CPE capability setting.
|
||||
- func_callerid: Document limitation of DNID fields.
|
||||
|
||||
- #### Roman Pertsev (1):
|
||||
- res_audiosocket: fix temporarily unavailable
|
||||
|
||||
- #### Sean Bright (3):
|
||||
- audiohook.c: Ensure correct AO2 reference is dereffed.
|
||||
- app_externalivr: Prevent out-of-bounds read during argument processing.
|
||||
- safe_asterisk: Resolve a POSIX sh problem and restore globbing behavior.
|
||||
|
||||
- #### Sven Kube (3):
|
||||
- stasis_channels.c: Add null check for referred_by in ast_ari_transfer_message_..
|
||||
- stasis_channels.c: Make protocol_id optional to enable blind transfer via ari
|
||||
- res_audiosocket: add message types for all slin sample rates
|
||||
|
||||
- #### Tinet-mucw (1):
|
||||
- iostream.c: Handle TLS handshake attacks in order to resolve the issue of exce..
|
||||
|
||||
- #### gauravs456 (1):
|
||||
- chan_websocket: Add channel_id to MEDIA_START, DRIVER_STATUS and DTMF_END even..
|
||||
|
||||
- #### phoneben (2):
|
||||
- app_queue: Add NULL pointer checks in app_queue
|
||||
- res_fax.c: lower FAXOPT read warning to debug level
|
||||
|
||||
|
||||
### Commit List:
|
||||
|
||||
- res_audiosocket: fix temporarily unavailable
|
||||
- safe_asterisk: Resolve a POSIX sh problem and restore globbing behavior.
|
||||
- res_stir_shaken: Add STIR_SHAKEN_ATTESTATION dialplan function.
|
||||
- Revert "pjsip: Move from threadpool to taskpool"
|
||||
- chan_pjsip: Disable SSRC change for WebRTC endpoints.
|
||||
- pjsip: Move from threadpool to taskpool
|
||||
- safe_asterisk: Fix logging and sorting issue.
|
||||
- Fix Endianness detection in utils.h for non-Linux
|
||||
- app_queue.c: Fix error in Queue parameter documentation.
|
||||
- devicestate: Don't publish redundant device state messages.
|
||||
- chan_pjsip: Add technology-specific off-nominal hangup cause to events.
|
||||
- res_audiosocket: add message types for all slin sample rates
|
||||
- res_fax.c: lower FAXOPT read warning to debug level
|
||||
- endpoints: Remove need for stasis subscription.
|
||||
- app_queue: Allow stasis message filtering to work.
|
||||
- taskpool: Fix some references to threadpool that should be taskpool.
|
||||
- Update contact information for anthm
|
||||
- chan_websocket.c: Change payload references to command instead.
|
||||
- func_callerid: Document limitation of DNID fields.
|
||||
- func_channel: Allow R/W of ADSI CPE capability setting.
|
||||
- core_unreal: Preserve ADSI capability when dialing Local channels.
|
||||
- func_hangupcause.c: Add access to Reason headers via HANGUPCAUSE()
|
||||
- sig_analog: Allow '#' to end the inter-digit timeout when dialing.
|
||||
- func_math: Add DIGIT_SUM function.
|
||||
- app_sf: Add post-digit timer option to ReceiveSF.
|
||||
- codec_builtin.c: Adjust some of the quality scores to reflect reality.
|
||||
- res_tonedetect: Fix formatting of XML documentation.
|
||||
- res_fax: Add XML documentation for channel variables.
|
||||
- channelstorage_cpp_map_name_id: Add read locking around retrievals.
|
||||
- app_dial: Allow fractional seconds for dial timeouts.
|
||||
- dsp.c: Make minor fixes to debug log messages.
|
||||
- config_options.c: Improve misleading warning.
|
||||
- func_scramble: Add example to XML documentation.
|
||||
- sig_analog: Eliminate potential timeout with Last Number Redial.
|
||||
- ARI: The bridges play and record APIs now handle sample rates > 8K correctly.
|
||||
- res_pjsip_geolocation: Add support for Geolocation loc-src parameter
|
||||
- sorcery: Move from threadpool to taskpool.
|
||||
- stasis_channels.c: Make protocol_id optional to enable blind transfer via ari
|
||||
- Fix some doxygen, typos and whitespace
|
||||
- app_queue: Add NULL pointer checks in app_queue
|
||||
- app_externalivr: Prevent out-of-bounds read during argument processing.
|
||||
- chan_dahdi: Add DAHDI_CHANNEL function.
|
||||
- taskpool: Update versions for taskpool stasis options.
|
||||
- taskpool: Add taskpool API, switch Stasis to using it.
|
||||
- app_adsiprog: Fix possible NULL dereference.
|
||||
- manager.c: Fix presencestate object leak
|
||||
- audiohook.c: Ensure correct AO2 reference is dereffed.
|
||||
- res_cliexec: Remove unnecessary casts to char*.
|
||||
- rtp_engine.c: Add exception for comfort noise payload.
|
||||
- pbx_variables.c: Create real channel for "dialplan eval function".
|
||||
|
||||
### Commit Details:
|
||||
|
||||
#### res_audiosocket: fix temporarily unavailable
|
||||
Author: Roman Pertsev
|
||||
Date: 2025-10-07
|
||||
|
||||
Operations on non-blocking sockets may return a resource temporarily unavailable error (EAGAIN or EWOULDBLOCK). This is not a fatal error but a normal condition indicating that the operation would block.
|
||||
|
||||
This patch corrects the handling of this case. Instead of incorrectly treating it as a reason to terminate the connection, the code now waits for data to arrive on the socket.
|
||||
|
||||
#### safe_asterisk: Resolve a POSIX sh problem and restore globbing behavior.
|
||||
Author: Sean Bright
|
||||
Date: 2025-10-22
|
||||
|
||||
* Using `==` with the POSIX sh `test` utility is UB.
|
||||
* Switch back to using globs instead of using `$(find … | sort)`.
|
||||
* Fix a missing redirect when checking for the OS type.
|
||||
|
||||
Resolves: #1554
|
||||
|
||||
#### res_stir_shaken: Add STIR_SHAKEN_ATTESTATION dialplan function.
|
||||
Author: George Joseph
|
||||
Date: 2025-10-24
|
||||
|
||||
Also...
|
||||
|
||||
* Refactored the verification datastore process so instead of having
|
||||
a separate channel datastore for each verification result, there's only
|
||||
one channel datastore with a vector of results.
|
||||
|
||||
* Refactored some log messages to include channel name and removed
|
||||
some that would be redundant if a memory allocation failed.
|
||||
|
||||
Resolves: #781
|
||||
|
||||
UserNote: The STIR_SHAKEN_ATTESTATION dialplan function has been added
|
||||
which will allow suppressing attestation on a call-by-call basis
|
||||
regardless of the profile attached to the outgoing endpoint.
|
||||
|
||||
#### Revert "pjsip: Move from threadpool to taskpool"
|
||||
Author: Joshua C. Colp
|
||||
Date: 2025-10-27
|
||||
|
||||
This reverts commit bb6b76c2d8239b2665223dcbf6d507aa9aa4534e.
|
||||
|
||||
#### iostream.c: Handle TLS handshake attacks in order to resolve the issue of exce..
|
||||
Author: Tinet-mucw
|
||||
Date: 2025-10-26
|
||||
|
||||
The TCP three-way handshake completes, but if the server is under a TLS handshake attack, asterisk will get stuck at SSL_do_handshake().
|
||||
In this case, a timeout mechanism should be set for the SSL/TLS handshake process to prevent indefinite waiting during the SSL handshake.
|
||||
|
||||
Resolves: #1559
|
||||
|
||||
#### chan_pjsip: Disable SSRC change for WebRTC endpoints.
|
||||
Author: George Joseph
|
||||
Date: 2025-10-21
|
||||
|
||||
Commit b333ee3b introduced a fix to chan_pjsip that addressed RTP issues with
|
||||
blind transfers and some SBCs. Unfortunately, the fix broke some WebRTC
|
||||
clients that are sensitive to SSRC changes and non-monotonic timestamps so
|
||||
the fix is now disabled for endpoints with the "bundle" parameter set to true.
|
||||
|
||||
Resolves: #1535
|
||||
|
||||
#### chan_websocket: Add channel_id to MEDIA_START, DRIVER_STATUS and DTMF_END even..
|
||||
Author: gauravs456
|
||||
Date: 2025-10-21
|
||||
|
||||
Resolves: #1544
|
||||
|
||||
#### pjsip: Move from threadpool to taskpool
|
||||
Author: Joshua C. Colp
|
||||
Date: 2025-09-23
|
||||
|
||||
This change moves the PJSIP module from the threadpool API
|
||||
to the taskpool API. PJSIP-specific implementations for
|
||||
task usage have been removed and replaced with calls to
|
||||
the optimized taskpool implementations instead. The need
|
||||
for a pool of serializers has also been removed as
|
||||
taskpool inherently provides this. The default settings
|
||||
have also been changed to be more realistic for common
|
||||
usage.
|
||||
|
||||
UpgradeNote: The threadpool_* options in pjsip.conf have now
|
||||
been deprecated though they continue to be read and used.
|
||||
They have been replaced with taskpool options that give greater
|
||||
control over the underlying taskpool used for PJSIP. An alembic
|
||||
upgrade script has been added to add these options to realtime
|
||||
as well.
|
||||
|
||||
#### safe_asterisk: Fix logging and sorting issue.
|
||||
Author: George Joseph
|
||||
Date: 2025-10-17
|
||||
|
||||
Re-enabled "TTY=9" which was erroneously disabled as part of a recent
|
||||
security fix and removed another logging "fix" that was added.
|
||||
|
||||
Also added a sort to the "find" that enumerates the scripts to be sourced so
|
||||
they're sourced in the correct order.
|
||||
|
||||
Resolves: #1539
|
||||
|
||||
#### Fix Endianness detection in utils.h for non-Linux
|
||||
Author: Christoph Moench-Tegeder
|
||||
Date: 2025-10-19
|
||||
|
||||
Commit 43bf8a4ded7a65203b766b91eaf8331a600e9d8d introduced endian
|
||||
dependend byte-swapping code in include/asterisk/utils.h, where the
|
||||
endianness was detected using the __BYTE_ORDER macro. This macro
|
||||
lives in endian.h, which on Linux is included implicitely (by the
|
||||
network-related headers, I think), but on FreeBSD the headers are
|
||||
laid out differently and we do not get __BYTE_ORDER the implicit way.
|
||||
|
||||
Instead, this makes the usage of endian.h explicit by including it
|
||||
where we need it, and switches the BYTE_ORDER/*ENDIAN macros to the
|
||||
POSIX-defined ones (see
|
||||
https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/endian.h.html
|
||||
for standard compliance). Additionally, this adds a compile-time check
|
||||
for the endianness-logic: compilation will fail if neither big nor
|
||||
little endian can be detected.
|
||||
|
||||
Fixes: #1536
|
||||
|
||||
#### app_queue.c: Fix error in Queue parameter documentation.
|
||||
Author: Ben Ford
|
||||
Date: 2025-10-20
|
||||
|
||||
When macro was removed in Asterisk 21, the parameter documentation in
|
||||
code was not updated to reflect the correct numerization for gosub. It
|
||||
still stated that it was the seventh parameter, but got shifted to the
|
||||
sixth due to the removal of macro. This has been updated to correctly
|
||||
reflect the parameter order, and a note has been added to the XML that
|
||||
states this was done after the initial commit.
|
||||
|
||||
Fixes: #1534
|
||||
|
||||
UpgradeNote: As part of Asterisk 21, macros were removed from Asterisk.
|
||||
This resulted in argument order changing for the Queue dialplan
|
||||
application since the macro argument was removed. Upgrade notice was
|
||||
missed when this was done, so this upgrade note has been added to
|
||||
provide a record of such and a notice to users who may have not upgraded
|
||||
yet.
|
||||
|
||||
#### devicestate: Don't publish redundant device state messages.
|
||||
Author: Joshua C. Colp
|
||||
Date: 2025-10-17
|
||||
|
||||
When publishing device state check the local cache for the
|
||||
existing device state. If the new device state is unchanged
|
||||
from the prior one, don't bother publishing the update. This
|
||||
can reduce the work done by consumers of device state, such
|
||||
as hints and app_queue, by not publishing a message to them.
|
||||
|
||||
These messages would most often occur with devices that are
|
||||
seeing numerous simultaneous channels. The underlying device
|
||||
state would remain as in use throughout, but an update would
|
||||
be published as channels are created and hung up.
|
||||
|
||||
#### chan_pjsip: Add technology-specific off-nominal hangup cause to events.
|
||||
Author: George Joseph
|
||||
Date: 2025-10-14
|
||||
|
||||
Although the ISDN/Q.850/Q.931 hangup cause code is already part of the ARI
|
||||
and AMI hangup and channel destroyed events, it can be helpful to know what
|
||||
the actual channel technology code was if the call was unsuccessful.
|
||||
For PJSIP, it's the SIP response code.
|
||||
|
||||
* A new "tech_hangupcause" field was added to the ast_channel structure along
|
||||
with ast_channel_tech_hangupcause() and ast_channel_tech_hangupcause_set()
|
||||
functions. It should only be set for off-nominal terminations.
|
||||
|
||||
* chan_pjsip was modified to set the tech hangup cause in the
|
||||
chan_pjsip_hangup() and chan_pjsip_session_end() functions. This is a bit
|
||||
tricky because these two functions aren't always called in the same order.
|
||||
The channel that hangs up first will get chan_pjsip_session_end() called
|
||||
first which will trigger the core to call chan_pjsip_hangup() on itself,
|
||||
then call chan_pjsip_hangup() on the other channel. The other channel's
|
||||
chan_pjsip_session_end() function will get called last. Unfortunately,
|
||||
the other channel's HangupRequest events are sent before chan_pjsip has had a
|
||||
chance to set the tech hangupcause code so the HangupRequest events for that
|
||||
channel won't have the cause code set. The ChannelDestroyed and Hangup
|
||||
events however will have the code set for both channels.
|
||||
|
||||
* A new "tech_cause" field was added to the ast_channel_snapshot_hangup
|
||||
structure. This is a public structure so a bit of refactoring was needed to
|
||||
preserve ABI compatibility.
|
||||
|
||||
* The ARI ChannelHangupRequest and ChannelDestroyed events were modified to
|
||||
include the "tech_cause" parameter in the JSON for off-nominal terminations.
|
||||
The parameter is suppressed for nominal termination.
|
||||
|
||||
* The AMI SoftHangupRequest, HangupRequest and Hangup events were modified to
|
||||
include the "TechCause" parameter for off-nominal terminations. Like their ARI
|
||||
counterparts, the parameter is suppressed for nominal termination.
|
||||
|
||||
DeveloperNote: A "tech_cause" parameter has been added to the
|
||||
ChannelHangupRequest and ChannelDestroyed ARI event messages and a "TechCause"
|
||||
parameter has been added to the HangupRequest, SoftHangupRequest and Hangup
|
||||
AMI event messages. For chan_pjsip, these will be set to the last SIP
|
||||
response status code for off-nominally terminated calls. The parameter is
|
||||
suppressed for nominal termination.
|
||||
|
||||
#### res_audiosocket: add message types for all slin sample rates
|
||||
Author: Sven Kube
|
||||
Date: 2025-10-10
|
||||
|
||||
Extend audiosocket messages with types 0x11 - 0x18 to create asterisk
|
||||
frames in slin12, slin16, slin24, slin32, slin44, slin48, slin96, and
|
||||
slin192 format, enabling the transmission of audio at a higher sample
|
||||
rates. For audiosocket messages sent by Asterisk, the message kind is
|
||||
determined by the format of the originating asterisk frame.
|
||||
|
||||
UpgradeNote: New audiosocket message types 0x11 - 0x18 has been added
|
||||
for slin12, slin16, slin24, slin32, slin44, slin48, slin96, and
|
||||
slin192 audio. External applications using audiosocket may need to be
|
||||
updated to support these message types if the audiosocket channel is
|
||||
created with one of these audio formats.
|
||||
|
||||
#### res_fax.c: lower FAXOPT read warning to debug level
|
||||
Author: phoneben
|
||||
Date: 2025-10-03
|
||||
|
||||
Reading ${FAXOPT()} before a fax session is common in dialplans to check fax state.
|
||||
Currently this logs an error even when no fax datastore exists, creating excessive noise.
|
||||
Change these messages to ast_debug(3, …) so they appear only with debug enabled.
|
||||
|
||||
Resolves: #1509
|
||||
|
||||
#### endpoints: Remove need for stasis subscription.
|
||||
Author: Joshua C. Colp
|
||||
Date: 2025-10-10
|
||||
|
||||
When an endpoint is created in the core of Asterisk a subscription
|
||||
was previously created alongside it to monitor any channels being
|
||||
destroyed that were related to it. This was done by receiving all
|
||||
channel snapshot updates for every channel and only reacting when
|
||||
it was indicated that the channel was dead.
|
||||
|
||||
This change removes this logic and instead provides an API call
|
||||
for directly removing a channel from an endpoint. This is called
|
||||
when channels are destroyed. This operation is fast, so blocking
|
||||
the calling thread for a short period of time doesn't have any
|
||||
noticeable impact.
|
||||
|
||||
#### app_queue: Allow stasis message filtering to work.
|
||||
Author: Joshua C. Colp
|
||||
Date: 2025-10-10
|
||||
|
||||
The app_queue module subscribes on a per-dialed agent basis to both
|
||||
the bridge all and channel all topics to keep apprised of things going
|
||||
on involving them. This subscription has associated state that must
|
||||
be cleaned up when the subscription ends. This was done by setting
|
||||
a default router callback that only had logic to handle the case
|
||||
where the subscription ends. By using the default router callback
|
||||
all filtering for the subscription was disabled, causing unrelated
|
||||
messages to get published and handled by it.
|
||||
|
||||
This change makes it so that an explicit route is added for the
|
||||
message type used for the message indicating the subscription has
|
||||
ended and removes the default router callback. This allows message
|
||||
filtering to occur on publishing reducing the messages to app_queue
|
||||
to only those it is interested in.
|
||||
|
||||
#### taskpool: Fix some references to threadpool that should be taskpool.
|
||||
Author: George Joseph
|
||||
Date: 2025-10-10
|
||||
|
||||
Resolves: #1478
|
||||
|
||||
#### Update contact information for anthm
|
||||
Author: Anthony Minessale
|
||||
Date: 2025-10-10
|
||||
|
||||
|
||||
#### chan_websocket.c: Change payload references to command instead.
|
||||
Author: George Joseph
|
||||
Date: 2025-10-08
|
||||
|
||||
Some of the tests in process_text_message() were still comparing to the
|
||||
websocket message payload instead of the "command" string.
|
||||
|
||||
Resolves: #1525
|
||||
|
||||
#### func_callerid: Document limitation of DNID fields.
|
||||
Author: Naveen Albert
|
||||
Date: 2025-10-06
|
||||
|
||||
The Dial() application does not propagate DNID fields, which is counter
|
||||
to the behavior of the other Caller ID fields. This behavior is likely
|
||||
intentional since the use of Dial theoretically suggests a new dialed
|
||||
number, but document this caveat to inform users of it.
|
||||
|
||||
Resolves: #1519
|
||||
|
||||
#### func_channel: Allow R/W of ADSI CPE capability setting.
|
||||
Author: Naveen Albert
|
||||
Date: 2025-10-06
|
||||
|
||||
Allow retrieving and setting the channel's ADSI capability from the
|
||||
dialplan.
|
||||
|
||||
Resolves: #1514
|
||||
|
||||
UserNote: CHANNEL(adsicpe) can now be read or written to change
|
||||
the channels' ADSI CPE capability setting.
|
||||
|
||||
#### core_unreal: Preserve ADSI capability when dialing Local channels.
|
||||
Author: Naveen Albert
|
||||
Date: 2025-10-06
|
||||
|
||||
Dial() already preserves the ADSI capability by copying it to the new
|
||||
channel, but since Local channel pairs consist of two channels, we
|
||||
also need to copy the capability to the second channel.
|
||||
|
||||
Resolves: #1517
|
||||
|
||||
#### func_hangupcause.c: Add access to Reason headers via HANGUPCAUSE()
|
||||
Author: Igor Goncharovsky
|
||||
Date: 2025-09-04
|
||||
|
||||
As soon as SIP call may end with several Reason headers, we
|
||||
want to make all of them available through the HAGUPCAUSE() function.
|
||||
This implementation uses the same ao2 hash for cause codes storage
|
||||
and adds a flag to make difference between last processed sip
|
||||
message and content of reason headers.
|
||||
|
||||
UserNote: Added a new option to HANGUPCAUSE to access additional
|
||||
information about hangup reason. Reason headers from pjsip
|
||||
could be read using 'tech_extended' cause type.
|
||||
|
||||
#### sig_analog: Allow '#' to end the inter-digit timeout when dialing.
|
||||
Author: Naveen Albert
|
||||
Date: 2025-10-03
|
||||
|
||||
It is customary to allow # to terminate digit collection immediately
|
||||
when there would normally be a timeout. However, currently, users are
|
||||
forced to wait for the timeout to expire when dialing numbers that
|
||||
are prefixes of other valid matches, and there is no way to end the
|
||||
timeout early. Customarily, # terminates the timeout, but at the moment,
|
||||
this is just rejected unless there happens to be a matching extension
|
||||
ending in #.
|
||||
|
||||
Allow # to terminate the timeout in cases where there is no dialplan
|
||||
match. This ensures that the dialplan is always respected, but if a
|
||||
valid extension has been dialed that happens to prefix other valid
|
||||
matches, # can be used to dial it immediately.
|
||||
|
||||
Resolves: #1510
|
||||
|
||||
#### func_math: Add DIGIT_SUM function.
|
||||
Author: Naveen Albert
|
||||
Date: 2025-10-01
|
||||
|
||||
Add a function (DIGIT_SUM) which returns the digit sum of a number.
|
||||
|
||||
Resolves: #1499
|
||||
|
||||
UserNote: The DIGIT_SUM function can be used to return the digit sum of
|
||||
a number.
|
||||
|
||||
#### app_sf: Add post-digit timer option to ReceiveSF.
|
||||
Author: Naveen Albert
|
||||
Date: 2025-10-01
|
||||
|
||||
Add a sorely needed option to set a timeout between digits, rather than
|
||||
for receiving the entire number. This is needed if the number of digits
|
||||
being sent is unknown by the receiver in advance. Previously, we had
|
||||
to wait for the entire timer to expire.
|
||||
|
||||
Resolves: #1493
|
||||
|
||||
UserNote: The 't' option for ReceiveSF now allows for a timer since
|
||||
the last digit received, in addition to the number-wide timeout.
|
||||
|
||||
#### codec_builtin.c: Adjust some of the quality scores to reflect reality.
|
||||
Author: Naveen Albert
|
||||
Date: 2025-10-02
|
||||
|
||||
Among the lower-quality voice codecs, some of the quality scores did
|
||||
not make sense relative to each other.
|
||||
|
||||
For instance, quality-wise, G.729 > G.723 > PLC10.
|
||||
However, current scores do not uphold these relationships.
|
||||
|
||||
Tweak the scores slightly to reflect more accurate relationships.
|
||||
|
||||
Resolves: #1501
|
||||
|
||||
#### res_tonedetect: Fix formatting of XML documentation.
|
||||
Author: Naveen Albert
|
||||
Date: 2025-10-02
|
||||
|
||||
Fix the indentation in the documentation for the variable list.
|
||||
|
||||
Resolves: #1507
|
||||
|
||||
#### res_fax: Add XML documentation for channel variables.
|
||||
Author: Naveen Albert
|
||||
Date: 2025-10-02
|
||||
|
||||
Document the channel variables currently set by SendFAX and ReceiveFAX.
|
||||
|
||||
Resolves: #1505
|
||||
|
||||
#### channelstorage_cpp_map_name_id: Add read locking around retrievals.
|
||||
Author: George Joseph
|
||||
Date: 2025-10-01
|
||||
|
||||
When we retrieve a channel from a C++ map, we actually get back a wrapper
|
||||
object that points to the channel then right after we retrieve it, we bump its
|
||||
reference count. There's a tiny chance however that between those two
|
||||
statements a delete and/or unref might happen which would cause the wrapper
|
||||
object or the channel itself to become invalid resulting in a SEGV. To avoid
|
||||
this we now perform a read lock on the driver around those statements.
|
||||
|
||||
Resolves: #1491
|
||||
|
||||
#### app_dial: Allow fractional seconds for dial timeouts.
|
||||
Author: Naveen Albert
|
||||
Date: 2025-09-30
|
||||
|
||||
Even though Dial() internally uses milliseconds for its dial timeouts,
|
||||
this capability has been mostly obscured from users as the argument is
|
||||
only parsed as an integer, thus forcing the use of whole seconds for
|
||||
timeouts.
|
||||
|
||||
Parse it as a decimal instead so that timeouts can now truly have
|
||||
millisecond precision.
|
||||
|
||||
Resolves: #1487
|
||||
|
||||
UserNote: The answer and progress dial timeouts now have millisecond
|
||||
precision, instead of having to be whole numbers.
|
||||
|
||||
#### dsp.c: Make minor fixes to debug log messages.
|
||||
Author: Naveen Albert
|
||||
Date: 2025-10-01
|
||||
|
||||
Commit dc8e3eeaaf094a3d16991289934093d5e7127680 improved the debug log
|
||||
messages in dsp.c. This makes two minor corrections to it:
|
||||
|
||||
* Properly guard an added log statement in a conditional.
|
||||
* Don't add one to the hit count if there was no hit (however, we do
|
||||
still want to do this for the case where this is one).
|
||||
|
||||
Resolves: #1496
|
||||
|
||||
#### config_options.c: Improve misleading warning.
|
||||
Author: Naveen Albert
|
||||
Date: 2025-09-30
|
||||
|
||||
When running "config show help <module>", if no XML documentation exists
|
||||
for the specified module, "Module <module> not found." is returned,
|
||||
which is misleading if the module is loaded but simply has no XML
|
||||
documentation for its config. Improve the message to clarify that the
|
||||
module may simply have no config documentation.
|
||||
|
||||
Resolves: #1489
|
||||
|
||||
#### func_scramble: Add example to XML documentation.
|
||||
Author: Naveen Albert
|
||||
Date: 2025-09-29
|
||||
|
||||
The previous lack of an example made it ambiguous if the arguments went
|
||||
inside the function arguments or were part of the right-hand value.
|
||||
|
||||
Resolves: #1485
|
||||
|
||||
#### sig_analog: Eliminate potential timeout with Last Number Redial.
|
||||
Author: Naveen Albert
|
||||
Date: 2025-09-29
|
||||
|
||||
If Last Number Redial is used to redial, ensure that we do not wait
|
||||
for further digits. This was possible if the number that was last
|
||||
dialed is a prefix of another possible dialplan match. Since all we
|
||||
did is copy the number into the extension buffer, if other matches
|
||||
are now possible, there would thus be a timeout before the call went
|
||||
through. We now complete redialed calls immediaetly in all cases.
|
||||
|
||||
Resolves: #1483
|
||||
|
||||
#### ARI: The bridges play and record APIs now handle sample rates > 8K correctly.
|
||||
Author: George Joseph
|
||||
Date: 2025-09-25
|
||||
|
||||
The bridge play and record APIs were forcing the Announcer/Recorder channel
|
||||
to slin8 which meant that if you played or recorded audio with a sample
|
||||
rate > 8K, it was downsampled to 8K limiting the bandwidth.
|
||||
|
||||
* The /bridges/play REST APIs have a new "announcer_format" parameter that
|
||||
allows the caller to explicitly set the format on the "Announcer" channel
|
||||
through which the audio is played into the bridge. If not specified, the
|
||||
default depends on how many channels are currently in the bridge. If
|
||||
a single channel is in the bridge, then the Announcer channel's format
|
||||
will be set to the same as that channel's. If multiple channels are in the
|
||||
bridge, the channels will be scanned to find the one with the highest
|
||||
sample rate and the Announcer channel's format will be set to the slin
|
||||
format that has an equal to or greater than sample rate.
|
||||
|
||||
* The /bridges/record REST API has a new "recorder_format" parameter that
|
||||
allows the caller to explicitly set the format on the "Recorder" channel
|
||||
from which audio is retrieved to write to the file. If not specified,
|
||||
the Recorder channel's format will be set to the format that was requested
|
||||
to save the audio in.
|
||||
|
||||
Resolves: #1479
|
||||
|
||||
DeveloperNote: The ARI /bridges/play and /bridges/record REST APIs have new
|
||||
parameters that allow the caller to specify the format to be used on the
|
||||
"Announcer" and "Recorder" channels respecitvely.
|
||||
|
||||
#### res_pjsip_geolocation: Add support for Geolocation loc-src parameter
|
||||
Author: Max Grobecker
|
||||
Date: 2025-09-21
|
||||
|
||||
This adds support for the Geolocation 'loc-src' parameter to res_pjsip_geolocation.
|
||||
The already existing config option 'location_source` in res_geolocation is documented to add a 'loc-src' parameter containing a user-defined FQDN to the 'Geolocation:' header,
|
||||
but that option had no effect as it was not implemented by res_pjsip_geolocation.
|
||||
|
||||
If the `location_source` configuration option is not set or invalid, that parameter will not be added (this is already checked by res_geolocation).
|
||||
|
||||
This commits adds already documented functionality.
|
||||
|
||||
#### sorcery: Move from threadpool to taskpool.
|
||||
Author: Joshua C. Colp
|
||||
Date: 2025-09-23
|
||||
|
||||
This change moves observer invocation from the use of
|
||||
a threadpool to a taskpool. The taskpool options have also
|
||||
been adjusted to ensure that at least one taskprocessor
|
||||
remains available at all times.
|
||||
|
||||
#### stasis_channels.c: Make protocol_id optional to enable blind transfer via ari
|
||||
Author: Sven Kube
|
||||
Date: 2025-09-22
|
||||
|
||||
When handling SIP transfers via ARI, there is no protocol_id in case of
|
||||
a blind transfer.
|
||||
|
||||
Resolves: #1467
|
||||
|
||||
#### Fix some doxygen, typos and whitespace
|
||||
Author: Bastian Triller
|
||||
Date: 2025-09-21
|
||||
|
||||
|
||||
#### stasis_channels.c: Add null check for referred_by in ast_ari_transfer_message_..
|
||||
Author: Sven Kube
|
||||
Date: 2025-09-18
|
||||
|
||||
When handling SIP transfers via ARI, the `referred_by` field in
|
||||
`transfer_ari_state` may be null, since SIP REFER requests are not
|
||||
required to include a `Referred-By` header. Without this check, a null
|
||||
value caused the transfer to fail and triggered a NOTIFY with a 500
|
||||
Internal Server Error.
|
||||
|
||||
#### app_queue: Add NULL pointer checks in app_queue
|
||||
Author: phoneben
|
||||
Date: 2025-09-11
|
||||
|
||||
Add NULL check for word_list before calling word_in_list()
|
||||
Add NULL checks for channel snapshots from ast_multi_channel_blob_get_channel()
|
||||
|
||||
Resolves: #1425
|
||||
|
||||
#### app_externalivr: Prevent out-of-bounds read during argument processing.
|
||||
Author: Sean Bright
|
||||
Date: 2025-09-17
|
||||
|
||||
Resolves: #1422
|
||||
|
||||
#### chan_dahdi: Add DAHDI_CHANNEL function.
|
||||
Author: Naveen Albert
|
||||
Date: 2025-09-11
|
||||
|
||||
Add a dialplan function that can be used to get/set properties of
|
||||
DAHDI channels (as opposed to Asterisk channels). This exposes
|
||||
properties that were not previously available, allowing for certain
|
||||
operations to now be performed in the dialplan.
|
||||
|
||||
Resolves: #1455
|
||||
|
||||
UserNote: The DAHDI_CHANNEL function allows for getting/setting
|
||||
certain properties about DAHDI channels from the dialplan.
|
||||
|
||||
#### taskpool: Update versions for taskpool stasis options.
|
||||
Author: Joshua C. Colp
|
||||
Date: 2025-09-16
|
||||
|
||||
|
||||
#### taskpool: Add taskpool API, switch Stasis to using it.
|
||||
Author: Joshua C. Colp
|
||||
Date: 2025-08-06
|
||||
|
||||
This change introduces a new API called taskpool. This is a pool
|
||||
of taskprocessors. It provides the following functionality:
|
||||
|
||||
1. Task pushing to a pool of taskprocessors
|
||||
2. Synchronous tasks
|
||||
3. Serializers for execution ordering of tasks
|
||||
4. Growing/shrinking of number of taskprocessors in pool
|
||||
|
||||
This functionality already exists through the combination of
|
||||
threadpool+taskprocessors but through investigating I determined
|
||||
that this carries substantial overhead for short to medium duration
|
||||
tasks. The threadpool uses a single queue of work, and for management
|
||||
of threads it involves additional tasks.
|
||||
|
||||
I wrote taskpool to eliminate the extra overhead and management
|
||||
as much as possible. Instead of a single queue of work each
|
||||
taskprocessor has its own queue and at push time a selector chooses
|
||||
the taskprocessor to queue the task to. Each taskprocessor also
|
||||
has its own thread like normal. This spreads out the tasks immediately
|
||||
and reduces contention on shared resources.
|
||||
|
||||
Using the included efficiency tests the number of tasks that can be
|
||||
executed per second in a taskpool is 6-12 times more than an equivalent
|
||||
threadpool+taskprocessor setup.
|
||||
|
||||
Stasis has been moved over to using this new API as it is a heavy consumer
|
||||
of threadpool+taskprocessors and produces a lot of tasks.
|
||||
|
||||
UpgradeNote: The threadpool_* options in stasis.conf have now been deprecated
|
||||
though they continue to be read and used. They have been replaced with taskpool
|
||||
options that give greater control over the underlying taskpool used for stasis.
|
||||
|
||||
DeveloperNote: The taskpool API has been added for common usage of a
|
||||
pool of taskprocessors. It is suggested to use this API instead of the
|
||||
threadpool+taskprocessor approach.
|
||||
|
||||
#### app_adsiprog: Fix possible NULL dereference.
|
||||
Author: Naveen Albert
|
||||
Date: 2025-09-10
|
||||
|
||||
get_token can return NULL, but process_token uses this result without
|
||||
checking for NULL; as elsewhere, check for a NULL result to avoid
|
||||
possible NULL dereference.
|
||||
|
||||
Resolves: #1419
|
||||
|
||||
#### manager.c: Fix presencestate object leak
|
||||
Author: Nathan Monfils
|
||||
Date: 2025-09-08
|
||||
|
||||
ast_presence_state allocates subtype and message. We straightforwardly
|
||||
need to clean those up.
|
||||
|
||||
#### audiohook.c: Ensure correct AO2 reference is dereffed.
|
||||
Author: Sean Bright
|
||||
Date: 2025-09-10
|
||||
|
||||
Part of #1440.
|
||||
|
||||
#### res_cliexec: Remove unnecessary casts to char*.
|
||||
Author: Naveen Albert
|
||||
Date: 2025-09-09
|
||||
|
||||
Resolves: #1436
|
||||
|
||||
#### rtp_engine.c: Add exception for comfort noise payload.
|
||||
Author: Ben Ford
|
||||
Date: 2025-09-09
|
||||
|
||||
In a previous commit, a change was made to
|
||||
ast_rtp_codecs_payload_code_tx_sample_rate to check for differing sample
|
||||
rates. This ended up returning an invalid payload int for comfort noise.
|
||||
A check has been added that returns early if the payload is in fact
|
||||
supposed to be comfort noise.
|
||||
|
||||
Fixes: #1340
|
||||
|
||||
#### pbx_variables.c: Create real channel for "dialplan eval function".
|
||||
Author: Naveen Albert
|
||||
Date: 2025-09-09
|
||||
|
||||
"dialplan eval function" has been using a dummy channel for function
|
||||
evaluation, much like many of the unit tests. However, sometimes, this
|
||||
can cause issues for functions that are not expecting dummy channels.
|
||||
As an example, ast_channel_tech(chan) is NULL on such channels, and
|
||||
ast_channel_tech(chan)->type consequently results in a NULL dereference.
|
||||
Normally, functions do not worry about this since channels executing
|
||||
dialplan aren't dummy channels.
|
||||
|
||||
While some functions are better about checking for these sorts of edge
|
||||
cases, use a real channel with a dummy technology to make this CLI
|
||||
command inherently safe for any dialplan function that could be evaluated
|
||||
from the CLI.
|
||||
|
||||
Resolves: #1434
|
||||
|
||||
29
LICENSE
29
LICENSE
@@ -1,6 +1,6 @@
|
||||
Asterisk is distributed under the GNU General Public License version 2
|
||||
and is also available under alternative licenses negotiated directly
|
||||
with Digium, Inc. If you obtained Asterisk under the GPL, then the GPL
|
||||
with Sangoma US Inc. If you obtained Asterisk under the GPL, then the GPL
|
||||
applies to all loadable Asterisk modules used on your system as well,
|
||||
except as defined below. The GPL (version 2) is included in this
|
||||
source tree in the file COPYING.
|
||||
@@ -10,14 +10,13 @@ Asterisk itself; these components are in the 'contrib' directory
|
||||
and its subdirectories. These components are also distributed under the
|
||||
GPL version 2 as well.
|
||||
|
||||
Digium, Inc. (formerly Linux Support Services) holds copyright
|
||||
and/or sufficient licenses to all components of the Asterisk
|
||||
package, and therefore can grant, at its sole discretion, the ability
|
||||
for companies, individuals, or organizations to create proprietary or
|
||||
Open Source (even if not GPL) modules which may be dynamically linked at
|
||||
runtime with the portions of Asterisk which fall under our
|
||||
copyright/license umbrella, or are distributed under more flexible
|
||||
licenses than GPL.
|
||||
Sangoma US Inc. holds copyright and/or sufficient licenses to all
|
||||
components of the Asterisk package, and therefore can grant, at its
|
||||
sole discretion, the ability for companies, individuals, or
|
||||
organizations to create proprietary or Open Source (even if not GPL)
|
||||
modules which may be dynamically linked at runtime with the portions
|
||||
of Asterisk which fall under our copyright/license umbrella, or are
|
||||
distributed under more flexible licenses than GPL.
|
||||
|
||||
If you wish to use our code in other GPL programs, don't worry --
|
||||
there is no requirement that you provide the same exception in your
|
||||
@@ -38,10 +37,10 @@ these protocols do fall under the terms of the GPL, then we hereby grant you a
|
||||
license to use these protocols in combination with Asterisk in external
|
||||
applications licensed under any license you wish.
|
||||
|
||||
The 'Asterisk' name and logos are trademarks owned by Digium, Inc.,
|
||||
The 'Asterisk' name and logos are trademarks owned by Sangoma US Inc,
|
||||
and use of them is subject to our trademark licensing policies. If you
|
||||
wish to use these trademarks for purposes other than simple
|
||||
redistribution of Asterisk source code obtained from Digium, you
|
||||
redistribution of Asterisk source code obtained from Sangoma, you
|
||||
should contact our licensing department to determine the necessary
|
||||
steps you must take. For more information on this policy, please read:
|
||||
|
||||
@@ -53,9 +52,9 @@ contact us:
|
||||
+1.877.344.4861 (via telephone in the USA)
|
||||
+1.256.428.6000 (via telephone outside the USA)
|
||||
+1.256.864.0464 (via FAX inside or outside the USA)
|
||||
licensing@digium.com (via email)
|
||||
legal@sangoma.com (via email)
|
||||
|
||||
Digium, Inc.
|
||||
445 Jan Davis Drive
|
||||
Huntsville, AL 35806
|
||||
Sangoma US Inc.
|
||||
301 N. Cattlemen Road, Suite 300
|
||||
Sarasota, FL 34232
|
||||
USA
|
||||
|
||||
3
Makefile
3
Makefile
@@ -1092,12 +1092,13 @@ menuselect/nmenuselect: menuselect/makeopts .lastclean
|
||||
menuselect/makeopts: makeopts .lastclean
|
||||
+$(MAKE_MENUSELECT) makeopts
|
||||
|
||||
menuselect-tree: $(foreach dir,$(filter-out main,$(MOD_SUBDIRS)),$(wildcard $(dir)/*.c) $(wildcard $(dir)/*.cc) $(wildcard $(dir)/*.xml)) build_tools/cflags.xml build_tools/cflags-devmode.xml sounds/sounds.xml utils/utils.xml agi/agi.xml configure makeopts
|
||||
menuselect-tree: $(foreach dir,$(filter-out main,$(MOD_SUBDIRS)),$(wildcard $(dir)/*.c) $(wildcard $(dir)/*.cc) $(wildcard $(dir)/*.xml)) main/channelstorage_makeopts.xml build_tools/cflags.xml build_tools/cflags-devmode.xml sounds/sounds.xml utils/utils.xml agi/agi.xml configure makeopts
|
||||
@echo "Generating input for menuselect ..."
|
||||
@echo "<?xml version=\"1.0\"?>" > $@
|
||||
@echo >> $@
|
||||
@echo "<menu name=\"Asterisk Module and Build Option Selection\">" >> $@
|
||||
+@for dir in $(sort $(filter-out main,$(MOD_SUBDIRS))); do $(SILENTMAKE) -C $${dir} SUBDIR=$${dir} moduleinfo >> $@; done
|
||||
@cat main/channelstorage_makeopts.xml >> $@
|
||||
@cat build_tools/cflags.xml >> $@
|
||||
+@for dir in $(sort $(filter-out main,$(MOD_SUBDIRS))); do $(SILENTMAKE) -C $${dir} SUBDIR=$${dir} makeopts >> $@; done
|
||||
@if [ "${AST_DEVMODE}" = "yes" ]; then \
|
||||
|
||||
174
README.html
Normal file
174
README.html
Normal file
@@ -0,0 +1,174 @@
|
||||
<html><head><title>Readme for asterisk-22.7.0-rc1</title></head><body>
|
||||
<h1>The Asterisk(R) Open Source PBX</h1>
|
||||
<pre><code>By Mark Spencer <markster@digium.com> and the Asterisk.org developer community.
|
||||
Copyright (C) 2001-2025 Sangoma Technologies Corporation and other copyright holders.
|
||||
</code></pre>
|
||||
<h2>SECURITY</h2>
|
||||
<p>It is imperative that you read and fully understand the contents of
|
||||
the security information document before you attempt to configure and run
|
||||
an Asterisk server.</p>
|
||||
<p>See <a href="https://docs.asterisk.org/Deployment/Important-Security-Considerations">Important Security Considerations</a> for more information.</p>
|
||||
<h2>WHAT IS ASTERISK ?</h2>
|
||||
<p>Asterisk is an Open Source PBX and telephony toolkit. It is, in a
|
||||
sense, middleware between Internet and telephony channels on the bottom,
|
||||
and Internet and telephony applications at the top. However, Asterisk supports
|
||||
more telephony interfaces than just Internet telephony. Asterisk also has a
|
||||
vast amount of support for traditional PSTN telephony, as well.</p>
|
||||
<p>For more information on the project itself, please visit the <a href="https://www.asterisk.org">Asterisk
|
||||
Home Page</a> and the official
|
||||
<a href="https://docs.asterisk.org">Asterisk Documentation</a>.</p>
|
||||
<h2>SUPPORTED OPERATING SYSTEMS</h2>
|
||||
<h3>Linux</h3>
|
||||
<p>The Asterisk Open Source PBX is developed and tested primarily on the
|
||||
GNU/Linux operating system, and is supported on every major GNU/Linux
|
||||
distribution.</p>
|
||||
<h3>Others</h3>
|
||||
<p>Asterisk has also been 'ported' and reportedly runs properly on other
|
||||
operating systems as well, Apple's Mac OS X, and the BSD variants.</p>
|
||||
<h2>GETTING STARTED</h2>
|
||||
<p>Most users are using VoIP/SIP exclusively these days but if you need to
|
||||
interface to TDM or analog services or devices, be sure you've got supported
|
||||
hardware.</p>
|
||||
<p>Supported telephony hardware includes:
|
||||
* All Analog and Digital Interface cards from Sangoma
|
||||
* Any full duplex sound card supported by PortAudio
|
||||
* The Xorcom Astribank channel bank</p>
|
||||
<h3>UPGRADING FROM AN EARLIER VERSION</h3>
|
||||
<p>If you are updating from a previous version of Asterisk, make sure you
|
||||
read the Change Logs.</p>
|
||||
<!-- CHANGELOGS (the URL will change based on the location of this README) -->
|
||||
<p><a href="ChangeLogs/ChangeLog-22.7.0-rc1.html">Change Logs</a></p>
|
||||
<!-- END-CHANGELOGS -->
|
||||
|
||||
<h3>NEW INSTALLATIONS</h3>
|
||||
<p>Ensure that your system contains a compatible compiler and development
|
||||
libraries. Asterisk requires either the GNU Compiler Collection (GCC) version
|
||||
4.1 or higher, or a compiler that supports the C99 specification and some of
|
||||
the gcc language extensions. In addition, your system needs to have the C
|
||||
library headers available, and the headers and libraries for ncurses.</p>
|
||||
<p>There are many modules that have additional dependencies. To see what
|
||||
libraries are being looked for, see <code>./configure --help</code>, or run
|
||||
<code>make menuselect</code> to view the dependencies for specific modules.</p>
|
||||
<p>On many distributions, these dependencies are installed by packages with names
|
||||
like 'glibc-devel', 'ncurses-devel', 'openssl-devel' and 'zlib-devel'
|
||||
or similar. The <code>contrib/scripts/install_prereq</code> script can be used to install
|
||||
the dependencies for most Debian and Redhat based Linux distributions.
|
||||
The script also handles SUSE, Arch, Gentoo, FreeBSD, NetBSD and OpenBSD but
|
||||
those distributions mightnoit have complete support or they might be out of date.</p>
|
||||
<p>So, let's proceed:</p>
|
||||
<ol>
|
||||
<li>
|
||||
<p>Read the documentation.<br>
|
||||
The <a href="https://docs.asterisk.org">Asterisk Documentation</a> website has full
|
||||
information for building, installing, configuring and running Asterisk.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Run <code>./configure</code><br>
|
||||
Execute the configure script to guess values for system-dependent
|
||||
variables used during compilation. If the script indicates that some required
|
||||
components are missing, you can run <code>./contrib/scripts/install_prereq install</code>
|
||||
to install the necessary components. Note that this will install all dependencies
|
||||
for every functionality of Asterisk. After running the script, you will need
|
||||
to rerun <code>./configure</code>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Run <code>make menuselect</code><br>
|
||||
This is needed if you want to select the modules that will be compiled and to
|
||||
check dependencies for various optional modules.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Run <code>make</code><br>
|
||||
Assuming the build completes successfully:</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Run <code>make install</code><br>
|
||||
If this is your first time working with Asterisk, you may wish to install
|
||||
the sample PBX, with demonstration extensions, etc. If so, run:</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Run <code>make samples</code><br>
|
||||
Doing so will overwrite any existing configuration files you have installed.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Finally, you can launch Asterisk in the foreground mode (not a daemon) with
|
||||
<code>asterisk -vvvc</code><br>
|
||||
You'll see a bunch of verbose messages fly by your screen as Asterisk
|
||||
initializes (that's the "very very verbose" mode). When it's ready, if
|
||||
you specified the "c" then you'll get a command line console, that looks
|
||||
like this:<br>
|
||||
<code>*CLI></code><br>
|
||||
You can type <code>core show help</code> at any time to get help with the system. For help
|
||||
with a specific command, type <code>core show help <command></code>.</p>
|
||||
</li>
|
||||
</ol>
|
||||
<p><code>man asterisk</code> at the Unix/Linux command prompt will give you detailed
|
||||
information on how to start and stop Asterisk, as well as all the command
|
||||
line options for starting Asterisk.</p>
|
||||
<h3>ABOUT CONFIGURATION FILES</h3>
|
||||
<p>All Asterisk configuration files share a common format. Comments are
|
||||
delimited by <code>;</code> (since <code>#</code> of course, being a DTMF digit, may occur in
|
||||
many places). A configuration file is divided into sections whose names
|
||||
appear in <code>[]</code>'s. Each section typically contains statements in the form
|
||||
<code>variable = value</code> although you may see <code>variable => value</code> in older samples.</p>
|
||||
<h3>SPECIAL NOTE ON TIME</h3>
|
||||
<p>Those using SIP phones should be aware that Asterisk is sensitive to
|
||||
large jumps in time. Manually changing the system time using date(1)
|
||||
(or other similar commands) may cause SIP registrations and other
|
||||
internal processes to fail. For this reason, you should always use
|
||||
a time synchronization package to keep your system time accurate.
|
||||
All OS/distributions make one or more of the following packages
|
||||
available:</p>
|
||||
<ul>
|
||||
<li>ntpd/ntpsec</li>
|
||||
<li>chronyd</li>
|
||||
<li>systemd-timesyncd</li>
|
||||
</ul>
|
||||
<p>Be sure to install and configure one (and only one) of them.</p>
|
||||
<h3>FILE DESCRIPTORS</h3>
|
||||
<p>Depending on the size of your system and your configuration,
|
||||
Asterisk can consume a large number of file descriptors. In UNIX,
|
||||
file descriptors are used for more than just files on disk. File
|
||||
descriptors are also used for handling network communication
|
||||
(e.g. SIP, IAX2, or H.323 calls) and hardware access (e.g. analog and
|
||||
digital trunk hardware). Asterisk accesses many on-disk files for
|
||||
everything from configuration information to voicemail storage.</p>
|
||||
<p>Most systems limit the number of file descriptors that Asterisk can
|
||||
have open at one time. This can limit the number of simultaneous
|
||||
calls that your system can handle. For example, if the limit is set
|
||||
at 1024 (a common default value) Asterisk can handle approximately 150
|
||||
SIP calls simultaneously. To change the number of file descriptors
|
||||
follow the instructions for your system below:</p>
|
||||
<h4>PAM-BASED LINUX SYSTEM</h4>
|
||||
<p>If your system uses PAM (Pluggable Authentication Modules) edit
|
||||
<code>/etc/security/limits.conf</code>. Add these lines to the bottom of the file:</p>
|
||||
<pre><code class="language-text">root soft nofile 4096
|
||||
root hard nofile 8196
|
||||
asterisk soft nofile 4096
|
||||
asterisk hard nofile 8196
|
||||
</code></pre>
|
||||
<p>(adjust the numbers to taste). You may need to reboot the system for
|
||||
these changes to take effect.</p>
|
||||
<h4>GENERIC UNIX SYSTEM</h4>
|
||||
<p>If there are no instructions specifically adapted to your system
|
||||
above you can try adding the command <code>ulimit -n 8192</code> to the script
|
||||
that starts Asterisk.</p>
|
||||
<h2>MORE INFORMATION</h2>
|
||||
<p>Visit the <a href="https://docs.asterisk.org">Asterisk Documentation</a> website
|
||||
for more documentation on various features and please read all the
|
||||
configuration samples that include documentation on the configuration options.</p>
|
||||
<p>Finally, you may wish to join the
|
||||
<a href="https://community.asterisk.org">Asterisk Community Forums</a></p>
|
||||
<p>Welcome to the growing worldwide community of Asterisk users!</p>
|
||||
<pre><code> Mark Spencer, and the Asterisk.org development community
|
||||
</code></pre>
|
||||
<hr>
|
||||
<p>Asterisk is a trademark of Sangoma Technologies Corporation</p>
|
||||
<p>[<a href="https://www.sangoma.com/">Sangoma</a>]
|
||||
[<a href="https://www.asterisk.org">Home Page</a>]
|
||||
[<a href="https://www.asterisk.org/support">Support</a>]
|
||||
[<a href="https://docs.asterisk.org">Documentation</a>]
|
||||
[<a href="https://community.asterisk.org">Community Forums</a>]
|
||||
[<a href="https://github.com/asterisk/asterisk/releases">Release Notes</a>]
|
||||
[<a href="https://docs.asterisk.org/Deployment/Important-Security-Considerations/">Security</a>]
|
||||
[<a href="https://lists.digium.com">Mailing List Archive</a>] </p>
|
||||
</body></html>
|
||||
236
README.md
236
README.md
@@ -1,209 +1,151 @@
|
||||
# The Asterisk(R) Open Source PBX
|
||||
```text
|
||||
By Mark Spencer <markster@digium.com> and the Asterisk.org developer community.
|
||||
Copyright (C) 2001-2021 Sangoma Technologies Corporation and other copyright holders.
|
||||
|
||||
```
|
||||
By Mark Spencer <markster@digium.com> and the Asterisk.org developer community.
|
||||
Copyright (C) 2001-2025 Sangoma Technologies Corporation and other copyright holders.
|
||||
```
|
||||
|
||||
## SECURITY
|
||||
|
||||
It is imperative that you read and fully understand the contents of
|
||||
It is imperative that you read and fully understand the contents of
|
||||
the security information document before you attempt to configure and run
|
||||
an Asterisk server.
|
||||
|
||||
See [Important Security Considerations] for more information.
|
||||
See [Important Security Considerations](https://docs.asterisk.org/Deployment/Important-Security-Considerations) for more information.
|
||||
|
||||
## WHAT IS ASTERISK ?
|
||||
|
||||
Asterisk is an Open Source PBX and telephony toolkit. It is, in a
|
||||
Asterisk is an Open Source PBX and telephony toolkit. It is, in a
|
||||
sense, middleware between Internet and telephony channels on the bottom,
|
||||
and Internet and telephony applications at the top. However, Asterisk supports
|
||||
more telephony interfaces than just Internet telephony. Asterisk also has a
|
||||
vast amount of support for traditional PSTN telephony, as well.
|
||||
|
||||
For more information on the project itself, please visit the Asterisk
|
||||
[home page] and the official [documentation]. In addition you'll find lots
|
||||
of information compiled by the Asterisk community at [voip-info.org].
|
||||
|
||||
There is a book on Asterisk published by O'Reilly under the Creative Commons
|
||||
License. It is available in book stores as well as in a downloadable version on
|
||||
the [asteriskdocs.org] web site.
|
||||
For more information on the project itself, please visit the [Asterisk
|
||||
Home Page](https://www.asterisk.org) and the official
|
||||
[Asterisk Documentation](https://docs.asterisk.org).
|
||||
|
||||
## SUPPORTED OPERATING SYSTEMS
|
||||
|
||||
### Linux
|
||||
|
||||
The Asterisk Open Source PBX is developed and tested primarily on the
|
||||
The Asterisk Open Source PBX is developed and tested primarily on the
|
||||
GNU/Linux operating system, and is supported on every major GNU/Linux
|
||||
distribution.
|
||||
|
||||
### Others
|
||||
|
||||
Asterisk has also been 'ported' and reportedly runs properly on other
|
||||
operating systems as well, including Sun Solaris, Apple's Mac OS X, Cygwin,
|
||||
and the BSD variants.
|
||||
Asterisk has also been 'ported' and reportedly runs properly on other
|
||||
operating systems as well, Apple's Mac OS X, and the BSD variants.
|
||||
|
||||
## GETTING STARTED
|
||||
|
||||
First, be sure you've got supported hardware (but note that you don't need
|
||||
ANY special hardware, not even a sound card) to install and run Asterisk.
|
||||
Most users are using VoIP/SIP exclusively these days but if you need to
|
||||
interface to TDM or analog services or devices, be sure you've got supported
|
||||
hardware.
|
||||
|
||||
Supported telephony hardware includes:
|
||||
* All Analog and Digital Interface cards from [Sangoma]
|
||||
* QuickNet Internet PhoneJack and LineJack
|
||||
* any full duplex sound card supported by ALSA, OSS, or PortAudio
|
||||
* any ISDN card supported by mISDN on Linux
|
||||
* All Analog and Digital Interface cards from Sangoma
|
||||
* Any full duplex sound card supported by PortAudio
|
||||
* The Xorcom Astribank channel bank
|
||||
* VoiceTronix OpenLine products
|
||||
|
||||
### UPGRADING FROM AN EARLIER VERSION
|
||||
|
||||
If you are updating from a previous version of Asterisk, make sure you
|
||||
read the [UPGRADE.txt] file in the source directory. There are some files
|
||||
and configuration options that you will have to change, even though we
|
||||
made every effort possible to maintain backwards compatibility.
|
||||
If you are updating from a previous version of Asterisk, make sure you
|
||||
read the Change Logs.
|
||||
|
||||
In order to discover new features to use, please check the configuration
|
||||
examples in the [configs] directory of the source code distribution. For a
|
||||
list of new features in this version of Asterisk, see the [CHANGES] file.
|
||||
<!-- CHANGELOGS (the URL will change based on the location of this README) -->
|
||||
[Change Logs](ChangeLogs/ChangeLog-22.7.0-rc1.html)
|
||||
<!-- END-CHANGELOGS -->
|
||||
|
||||
### NEW INSTALLATIONS
|
||||
|
||||
Ensure that your system contains a compatible compiler and development
|
||||
Ensure that your system contains a compatible compiler and development
|
||||
libraries. Asterisk requires either the GNU Compiler Collection (GCC) version
|
||||
4.1 or higher, or a compiler that supports the C99 specification and some of
|
||||
the gcc language extensions. In addition, your system needs to have the C
|
||||
library headers available, and the headers and libraries for ncurses.
|
||||
|
||||
There are many modules that have additional dependencies. To see what
|
||||
There are many modules that have additional dependencies. To see what
|
||||
libraries are being looked for, see `./configure --help`, or run
|
||||
`make menuselect` to view the dependencies for specific modules.
|
||||
|
||||
On many distributions, these dependencies are installed by packages with names
|
||||
On many distributions, these dependencies are installed by packages with names
|
||||
like 'glibc-devel', 'ncurses-devel', 'openssl-devel' and 'zlib-devel'
|
||||
or similar.
|
||||
or similar. The `contrib/scripts/install_prereq` script can be used to install
|
||||
the dependencies for most Debian and Redhat based Linux distributions.
|
||||
The script also handles SUSE, Arch, Gentoo, FreeBSD, NetBSD and OpenBSD but
|
||||
those distributions mightnoit have complete support or they might be out of date.
|
||||
|
||||
So, let's proceed:
|
||||
1. Read this file.
|
||||
|
||||
There are more documents than this one in the [doc] directory. You may also
|
||||
want to check the configuration files that contain examples and reference
|
||||
guides in the [configs] directory.
|
||||
1. Read the documentation.<br>
|
||||
The [Asterisk Documentation](https://docs.asterisk.org) website has full
|
||||
information for building, installing, configuring and running Asterisk.
|
||||
|
||||
2. Run `./configure`
|
||||
|
||||
Execute the configure script to guess values for system-dependent
|
||||
variables used during compilation. If the script indicates that some required
|
||||
2. Run `./configure`<br>
|
||||
Execute the configure script to guess values for system-dependent
|
||||
variables used during compilation. If the script indicates that some required
|
||||
components are missing, you can run `./contrib/scripts/install_prereq install`
|
||||
to install the necessary components. Note that this will install all dependencies for every functionality of Asterisk. After running the script, you will need
|
||||
to install the necessary components. Note that this will install all dependencies
|
||||
for every functionality of Asterisk. After running the script, you will need
|
||||
to rerun `./configure`.
|
||||
|
||||
3. Run `make menuselect` _\[optional]_
|
||||
|
||||
This is needed if you want to select the modules that will be compiled and to
|
||||
3. Run `make menuselect`<br>
|
||||
This is needed if you want to select the modules that will be compiled and to
|
||||
check dependencies for various optional modules.
|
||||
|
||||
4. Run `make`
|
||||
|
||||
4. Run `make`<br>
|
||||
Assuming the build completes successfully:
|
||||
|
||||
5. Run `make install`
|
||||
|
||||
If this is your first time working with Asterisk, you may wish to install
|
||||
5. Run `make install`<br>
|
||||
If this is your first time working with Asterisk, you may wish to install
|
||||
the sample PBX, with demonstration extensions, etc. If so, run:
|
||||
|
||||
6. Run `make samples`
|
||||
6. Run `make samples`<br>
|
||||
Doing so will overwrite any existing configuration files you have installed.
|
||||
|
||||
Doing so will overwrite any existing configuration files you have installed.
|
||||
|
||||
7. Finally, you can launch Asterisk in the foreground mode (not a daemon) with:
|
||||
```
|
||||
# asterisk -vvvc
|
||||
```
|
||||
You'll see a bunch of verbose messages fly by your screen as Asterisk
|
||||
7. Finally, you can launch Asterisk in the foreground mode (not a daemon) with
|
||||
`asterisk -vvvc`<br>
|
||||
You'll see a bunch of verbose messages fly by your screen as Asterisk
|
||||
initializes (that's the "very very verbose" mode). When it's ready, if
|
||||
you specified the "c" then you'll get a command line console, that looks
|
||||
like this:
|
||||
```
|
||||
*CLI>
|
||||
```
|
||||
You can type "core show help" at any time to get help with the system. For help
|
||||
with a specific command, type "core show help <command>". To start the PBX using
|
||||
your sound card, you can type "console dial" to dial the PBX. Then you can use
|
||||
"console answer", "console hangup", and "console dial" to simulate the actions
|
||||
of a telephone. Remember that if you don't have a full duplex sound card
|
||||
(and Asterisk will tell you somewhere in its verbose messages if you do/don't)
|
||||
then it won't work right (not yet).
|
||||
like this:<br>
|
||||
`*CLI>`<br>
|
||||
You can type `core show help` at any time to get help with the system. For help
|
||||
with a specific command, type `core show help <command>`.
|
||||
|
||||
"man asterisk" at the Unix/Linux command prompt will give you detailed
|
||||
`man asterisk` at the Unix/Linux command prompt will give you detailed
|
||||
information on how to start and stop Asterisk, as well as all the command
|
||||
line options for starting Asterisk.
|
||||
|
||||
Feel free to look over the configuration files in `/etc/asterisk`, where you
|
||||
will find a lot of information about what you can do with Asterisk.
|
||||
|
||||
### ABOUT CONFIGURATION FILES
|
||||
|
||||
All Asterisk configuration files share a common format. Comments are
|
||||
delimited by ';' (since '#' of course, being a DTMF digit, may occur in
|
||||
All Asterisk configuration files share a common format. Comments are
|
||||
delimited by `;` (since `#` of course, being a DTMF digit, may occur in
|
||||
many places). A configuration file is divided into sections whose names
|
||||
appear in []'s. Each section typically contains two types of statements,
|
||||
those of the form 'variable = value', and those of the form 'object =>
|
||||
parameters'. Internally the use of '=' and '=>' is exactly the same, so
|
||||
they're used only to help make the configuration file easier to
|
||||
understand, and do not affect how it is actually parsed.
|
||||
|
||||
Entries of the form 'variable=value' set the value of some parameter in
|
||||
asterisk. For example, in [chan_dahdi.conf], one might specify:
|
||||
```
|
||||
switchtype=national
|
||||
```
|
||||
In order to indicate to Asterisk that the switch they are connecting to is
|
||||
of the type "national". In general, the parameter will apply to
|
||||
instantiations which occur below its specification. For example, if the
|
||||
configuration file read:
|
||||
```
|
||||
switchtype = national
|
||||
channel => 1-4
|
||||
channel => 10-12
|
||||
switchtype = dms100
|
||||
channel => 25-47
|
||||
```
|
||||
|
||||
The "national" switchtype would be applied to channels one through
|
||||
four and channels 10 through 12, whereas the "dms100" switchtype would
|
||||
apply to channels 25 through 47.
|
||||
|
||||
The "object => parameters" instantiates an object with the given
|
||||
parameters. For example, the line "channel => 25-47" creates objects for
|
||||
the channels 25 through 47 of the card, obtaining the settings
|
||||
from the variables specified above.
|
||||
appear in `[]`'s. Each section typically contains statements in the form
|
||||
`variable = value` although you may see `variable => value` in older samples.
|
||||
|
||||
### SPECIAL NOTE ON TIME
|
||||
|
||||
Those using SIP phones should be aware that Asterisk is sensitive to
|
||||
Those using SIP phones should be aware that Asterisk is sensitive to
|
||||
large jumps in time. Manually changing the system time using date(1)
|
||||
(or other similar commands) may cause SIP registrations and other
|
||||
internal processes to fail. If your system cannot keep accurate time
|
||||
by itself use [NTP] to keep the system clock
|
||||
synchronized to "real time". NTP is designed to keep the system clock
|
||||
synchronized by speeding up or slowing down the system clock until it
|
||||
is synchronized to "real time" rather than by jumping the time and
|
||||
causing discontinuities. Most Linux distributions include precompiled
|
||||
versions of NTP. Beware of some time synchronization methods that get
|
||||
the correct real time periodically and then manually set the system
|
||||
clock.
|
||||
internal processes to fail. For this reason, you should always use
|
||||
a time synchronization package to keep your system time accurate.
|
||||
All OS/distributions make one or more of the following packages
|
||||
available:
|
||||
|
||||
Apparent time changes due to daylight savings time are just that,
|
||||
apparent. The use of daylight savings time in a Linux system is
|
||||
purely a user interface issue and does not affect the operation of the
|
||||
Linux kernel or Asterisk. The system clock on Linux kernels operates
|
||||
on UTC. UTC does not use daylight savings time.
|
||||
* ntpd/ntpsec
|
||||
* chronyd
|
||||
* systemd-timesyncd
|
||||
|
||||
Also note that this issue is separate from the clocking of TDM
|
||||
channels, and is known to at least affect SIP registrations.
|
||||
Be sure to install and configure one (and only one) of them.
|
||||
|
||||
### FILE DESCRIPTORS
|
||||
|
||||
Depending on the size of your system and your configuration,
|
||||
Depending on the size of your system and your configuration,
|
||||
Asterisk can consume a large number of file descriptors. In UNIX,
|
||||
file descriptors are used for more than just files on disk. File
|
||||
descriptors are also used for handling network communication
|
||||
@@ -211,7 +153,7 @@ descriptors are also used for handling network communication
|
||||
digital trunk hardware). Asterisk accesses many on-disk files for
|
||||
everything from configuration information to voicemail storage.
|
||||
|
||||
Most systems limit the number of file descriptors that Asterisk can
|
||||
Most systems limit the number of file descriptors that Asterisk can
|
||||
have open at one time. This can limit the number of simultaneous
|
||||
calls that your system can handle. For example, if the limit is set
|
||||
at 1024 (a common default value) Asterisk can handle approximately 150
|
||||
@@ -220,8 +162,9 @@ follow the instructions for your system below:
|
||||
|
||||
#### PAM-BASED LINUX SYSTEM
|
||||
|
||||
If your system uses PAM (Pluggable Authentication Modules) edit
|
||||
If your system uses PAM (Pluggable Authentication Modules) edit
|
||||
`/etc/security/limits.conf`. Add these lines to the bottom of the file:
|
||||
|
||||
```text
|
||||
root soft nofile 4096
|
||||
root hard nofile 8196
|
||||
@@ -234,20 +177,22 @@ these changes to take effect.
|
||||
|
||||
#### GENERIC UNIX SYSTEM
|
||||
|
||||
If there are no instructions specifically adapted to your system
|
||||
If there are no instructions specifically adapted to your system
|
||||
above you can try adding the command `ulimit -n 8192` to the script
|
||||
that starts Asterisk.
|
||||
|
||||
## MORE INFORMATION
|
||||
|
||||
See the [doc] directory for more documentation on various features.
|
||||
Again, please read all the configuration samples that include documentation
|
||||
on the configuration options.
|
||||
Visit the [Asterisk Documentation](https://docs.asterisk.org) website
|
||||
for more documentation on various features and please read all the
|
||||
configuration samples that include documentation on the configuration options.
|
||||
|
||||
Finally, you may wish to join the
|
||||
[Asterisk Community Forums](https://community.asterisk.org)
|
||||
|
||||
Finally, you may wish to visit the [support] site and join the [mailing
|
||||
list] if you're interested in getting more information.
|
||||
|
||||
Welcome to the growing worldwide community of Asterisk users!
|
||||
|
||||
```
|
||||
Mark Spencer, and the Asterisk.org development community
|
||||
```
|
||||
@@ -256,17 +201,12 @@ Welcome to the growing worldwide community of Asterisk users!
|
||||
|
||||
Asterisk is a trademark of Sangoma Technologies Corporation
|
||||
|
||||
[home page]: https://www.asterisk.org
|
||||
[support]: https://www.asterisk.org/support
|
||||
[documentation]: https://docs.asterisk.org/
|
||||
[mailing list]: http://lists.digium.com/mailman/listinfo/asterisk-users
|
||||
[chan_dahdi.conf]: configs/samples/chan_dahdi.conf.sample
|
||||
[voip-info.org]: http://www.voip-info.org/wiki-Asterisk
|
||||
[asteriskdocs.org]: http://www.asteriskdocs.org
|
||||
[NTP]: http://www.ntp.org/
|
||||
[Sangoma]: https://www.sangoma.com/
|
||||
[UPGRADE.txt]: UPGRADE.txt
|
||||
[CHANGES]: CHANGES
|
||||
[configs]: configs
|
||||
[doc]: doc
|
||||
[Important Security Considerations]: https://docs.asterisk.org/Deployment/Important-Security-Considerations/
|
||||
\[[Sangoma](https://www.sangoma.com/)\]
|
||||
\[[Home Page](https://www.asterisk.org)\]
|
||||
\[[Support](https://www.asterisk.org/support)\]
|
||||
\[[Documentation](https://docs.asterisk.org)\]
|
||||
\[[Community Forums](https://community.asterisk.org)\]
|
||||
\[[Release Notes](https://github.com/asterisk/asterisk/releases)\]
|
||||
\[[Security](https://docs.asterisk.org/Deployment/Important-Security-Considerations/)\]
|
||||
\[[Mailing List Archive](https://lists.digium.com)\]
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
* This code is released into public domain
|
||||
* without any warranty of any kind.
|
||||
*
|
||||
* \ingroup agi
|
||||
* \ingroup agi
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
@@ -52,6 +52,8 @@ $(call MOD_ADD_C,app_confbridge,$(wildcard confbridge/*.c))
|
||||
app_confbridge.o: _ASTCFLAGS+=$(AST_NO_FORMAT_TRUNCATION)
|
||||
app_meetme.o: _ASTCFLAGS+=$(AST_NO_FORMAT_TRUNCATION)
|
||||
app_minivm.o: _ASTCFLAGS+=$(AST_NO_FORMAT_TRUNCATION)
|
||||
# Needed to work around gcc 15 bug: https://github.com/asterisk/asterisk/issues/1088
|
||||
app_sms.o: _ASTCFLAGS+=-fno-tree-vectorize
|
||||
app_voicemail.o: _ASTCFLAGS+=$(AST_NO_FORMAT_TRUNCATION) -DFILE_STORAGE
|
||||
app_voicemail_odbc.o: _ASTCFLAGS+=$(AST_NO_FORMAT_TRUNCATION) -DODBC_STORAGE
|
||||
app_voicemail_imap.o: _ASTCFLAGS+=$(AST_NO_FORMAT_TRUNCATION) -DIMAP_STORAGE
|
||||
|
||||
@@ -57,6 +57,9 @@ static const char app[] = "ADSIProg";
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="ADSIProg" language="en_US">
|
||||
<since>
|
||||
<version>0.1.12</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Load Asterisk ADSI Scripts into phone
|
||||
</synopsis>
|
||||
@@ -845,7 +848,10 @@ static int onevent(char *buf, char *name, int id, char *args, struct adsi_script
|
||||
return 0;
|
||||
}
|
||||
/* Process 'in' things */
|
||||
tok = get_token(&args, script, lineno);
|
||||
if (!(tok = get_token(&args, script, lineno))) {
|
||||
ast_log(LOG_WARNING, "Missing state name at line %d of %s\n", lineno, script);
|
||||
return 0;
|
||||
}
|
||||
if (process_token(sname, tok, sizeof(sname), ARG_STRING)) {
|
||||
ast_log(LOG_WARNING, "'%s' is not a valid state name at line %d of %s\n", tok, lineno, script);
|
||||
return 0;
|
||||
|
||||
@@ -57,6 +57,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="AgentLogin" language="en_US">
|
||||
<since>
|
||||
<version>12.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Login an agent.
|
||||
</synopsis>
|
||||
@@ -105,6 +108,9 @@
|
||||
</see-also>
|
||||
</application>
|
||||
<application name="AgentRequest" language="en_US">
|
||||
<since>
|
||||
<version>12.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Request an agent to connect with the channel.
|
||||
</synopsis>
|
||||
@@ -130,6 +136,9 @@
|
||||
</see-also>
|
||||
</application>
|
||||
<function name="AGENT" language="en_US">
|
||||
<since>
|
||||
<version>12.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Gets information about an Agent
|
||||
</synopsis>
|
||||
@@ -141,9 +150,6 @@
|
||||
<enum name="status">
|
||||
<para>(default) The status of the agent (LOGGEDIN | LOGGEDOUT)</para>
|
||||
</enum>
|
||||
<enum name="password">
|
||||
<para>Deprecated. The dialplan handles any agent authentication.</para>
|
||||
</enum>
|
||||
<enum name="name">
|
||||
<para>The name of the agent</para>
|
||||
</enum>
|
||||
@@ -162,6 +168,9 @@
|
||||
<description></description>
|
||||
</function>
|
||||
<manager name="Agents" language="en_US">
|
||||
<since>
|
||||
<version>1.2.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Lists agents and their status.
|
||||
</synopsis>
|
||||
@@ -178,6 +187,9 @@
|
||||
</manager>
|
||||
<managerEvent language="en_US" name="Agents">
|
||||
<managerEventInstance class="EVENT_FLAG_AGENT">
|
||||
<since>
|
||||
<version>12.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Response event in a series to the Agents AMI action containing
|
||||
information about a defined agent.
|
||||
@@ -203,11 +215,11 @@
|
||||
<para>Present if Status value is <literal>AGENT_ONCALL</literal>.</para>
|
||||
</parameter>
|
||||
<parameter name="CallStarted">
|
||||
<para>Epoche time when the agent started talking with the caller.</para>
|
||||
<para>Epoch time when the agent started talking with the caller.</para>
|
||||
<para>Present if Status value is <literal>AGENT_ONCALL</literal>.</para>
|
||||
</parameter>
|
||||
<parameter name="LoggedInTime">
|
||||
<para>Epoche time when the agent logged in.</para>
|
||||
<para>Epoch time when the agent logged in.</para>
|
||||
<para>Present if Status value is <literal>AGENT_IDLE</literal> or <literal>AGENT_ONCALL</literal>.</para>
|
||||
</parameter>
|
||||
<channel_snapshot/>
|
||||
@@ -223,6 +235,9 @@
|
||||
</managerEvent>
|
||||
<managerEvent language="en_US" name="AgentsComplete">
|
||||
<managerEventInstance class="EVENT_FLAG_AGENT">
|
||||
<since>
|
||||
<version>12.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Final response event in a series of events to the Agents AMI action.
|
||||
</synopsis>
|
||||
@@ -235,6 +250,9 @@
|
||||
</managerEventInstance>
|
||||
</managerEvent>
|
||||
<manager name="AgentLogoff" language="en_US">
|
||||
<since>
|
||||
<version>1.2.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Sets an agent as no longer logged in.
|
||||
</synopsis>
|
||||
@@ -262,11 +280,17 @@
|
||||
<synopsis>Unused, but reserved.</synopsis>
|
||||
</configObject>
|
||||
<configObject name="agent-id">
|
||||
<since>
|
||||
<version>12.0.0</version>
|
||||
</since>
|
||||
<synopsis>Configure an agent for the pool.</synopsis>
|
||||
<description>
|
||||
<xi:include xpointer="xpointer(/docs/configInfo[@name='app_agent_pool']/description/note)" />
|
||||
</description>
|
||||
<configOption name="ackcall">
|
||||
<since>
|
||||
<version>12.0.0</version>
|
||||
</since>
|
||||
<synopsis>Enable to require the agent to acknowledge a call.</synopsis>
|
||||
<description>
|
||||
<para>Enable to require the agent to give a DTMF acknowledgement
|
||||
@@ -276,6 +300,9 @@
|
||||
</description>
|
||||
</configOption>
|
||||
<configOption name="acceptdtmf">
|
||||
<since>
|
||||
<version>12.0.0</version>
|
||||
</since>
|
||||
<synopsis>DTMF key sequence the agent uses to acknowledge a call.</synopsis>
|
||||
<description>
|
||||
<note><para>The option is overridden by <variable>AGENTACCEPTDTMF</variable> on agent login.</para></note>
|
||||
@@ -284,6 +311,9 @@
|
||||
</description>
|
||||
</configOption>
|
||||
<configOption name="autologoff">
|
||||
<since>
|
||||
<version>12.0.0</version>
|
||||
</since>
|
||||
<synopsis>Time the agent has to acknowledge a call before being logged off.</synopsis>
|
||||
<description>
|
||||
<para>Set how many seconds a call for the agent has to wait for the
|
||||
@@ -296,6 +326,9 @@
|
||||
</description>
|
||||
</configOption>
|
||||
<configOption name="wrapuptime">
|
||||
<since>
|
||||
<version>12.0.0</version>
|
||||
</since>
|
||||
<synopsis>Minimum time the agent has between calls.</synopsis>
|
||||
<description>
|
||||
<para>Set the minimum amount of time in milliseconds after
|
||||
@@ -305,12 +338,18 @@
|
||||
</description>
|
||||
</configOption>
|
||||
<configOption name="musiconhold">
|
||||
<since>
|
||||
<version>12.0.0</version>
|
||||
</since>
|
||||
<synopsis>Music on hold class the agent listens to between calls.</synopsis>
|
||||
<description>
|
||||
<xi:include xpointer="xpointer(/docs/configInfo[@name='app_agent_pool']/description/note)" />
|
||||
</description>
|
||||
</configOption>
|
||||
<configOption name="recordagentcalls">
|
||||
<since>
|
||||
<version>12.0.0</version>
|
||||
</since>
|
||||
<synopsis>Enable to automatically record calls the agent takes.</synopsis>
|
||||
<description>
|
||||
<para>Enable recording calls the agent takes automatically by
|
||||
@@ -321,12 +360,18 @@
|
||||
</description>
|
||||
</configOption>
|
||||
<configOption name="custom_beep">
|
||||
<since>
|
||||
<version>12.4.0</version>
|
||||
</since>
|
||||
<synopsis>Sound file played to alert the agent when a call is present.</synopsis>
|
||||
<description>
|
||||
<xi:include xpointer="xpointer(/docs/configInfo[@name='app_agent_pool']/description/note)" />
|
||||
</description>
|
||||
</configOption>
|
||||
<configOption name="fullname">
|
||||
<since>
|
||||
<version>12.0.0</version>
|
||||
</since>
|
||||
<synopsis>A friendly name for the agent used in log messages.</synopsis>
|
||||
<description>
|
||||
<xi:include xpointer="xpointer(/docs/configInfo[@name='app_agent_pool']/description/note)" />
|
||||
|
||||
@@ -146,6 +146,9 @@ struct timeval call_start_time;
|
||||
static const char app[] = "AlarmReceiver";
|
||||
/*** DOCUMENTATION
|
||||
<application name="AlarmReceiver" language="en_US">
|
||||
<since>
|
||||
<version>1.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Provide support for receiving alarm reports from a burglar or fire alarm panel.
|
||||
</synopsis>
|
||||
|
||||
@@ -54,6 +54,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="AMD" language="en_US">
|
||||
<since>
|
||||
<version>1.4.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Attempt to detect answering machines.
|
||||
</synopsis>
|
||||
|
||||
@@ -40,6 +40,10 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="AttendedTransfer" language="en_US">
|
||||
<since>
|
||||
<version>13.28.0</version>
|
||||
<version>16.5.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Attended transfer to the extension provided and TRANSFER_CONTEXT
|
||||
</synopsis>
|
||||
|
||||
@@ -38,38 +38,42 @@
|
||||
#include "asterisk/module.h"
|
||||
#include "asterisk/channel.h"
|
||||
#include "asterisk/app.h"
|
||||
#include "asterisk/pbx.h"
|
||||
#include "asterisk/res_audiosocket.h"
|
||||
#include "asterisk/utils.h"
|
||||
#include "asterisk/format_cache.h"
|
||||
|
||||
#define AST_MODULE "app_audiosocket"
|
||||
#define AUDIOSOCKET_CONFIG "audiosocket.conf"
|
||||
#define MAX_CONNECT_TIMEOUT_MSEC 2000
|
||||
#define MAX_WAIT_TIMEOUT_MSEC 2000
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="AudioSocket" language="en_US">
|
||||
<since>
|
||||
<version>18.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Transmit and receive audio between channel and TCP socket
|
||||
Transmit and receive PCM audio between a channel and a TCP socket server.
|
||||
</synopsis>
|
||||
<syntax>
|
||||
<parameter name="uuid" required="true">
|
||||
<para>UUID is the universally-unique identifier of the call for the audio socket service. This ID must conform to the string form of a standard UUID.</para>
|
||||
</parameter>
|
||||
<parameter name="service" required="true">
|
||||
<para>Service is the name or IP address and port number of the audio socket service to which this call should be connected. This should be in the form host:port, such as myserver:9019 </para>
|
||||
<para>Service is the name or IP address and port number of the audio socket service to which this call should be connected. This should be in the form host:port, such as myserver:9019. IPv6 addresses can be specified in square brackets, like [::1]:9019</para>
|
||||
</parameter>
|
||||
</syntax>
|
||||
<description>
|
||||
<para>Connects to the given TCP service, then transmits channel audio over that socket. In turn, audio is received from the socket and sent to the channel. Only audio frames will be transmitted.</para>
|
||||
<para>Connects to the given TCP server, then transmits channel audio as 16-bit, 8KHz mono PCM over that socket (other codecs available via the channel driver interface). In turn, PCM audio is received from the socket and sent to the channel. Only audio frames and DTMF frames will be transmitted.</para>
|
||||
<para>Protocol is specified at https://docs.asterisk.org/Configuration/Channel-Drivers/AudioSocket/</para>
|
||||
<para>This application does not automatically answer and should generally be preceeded by an application such as Answer() or Progress().</para>
|
||||
<para>This application does not automatically answer and should generally be preceded by an application such as Answer() or Progress().</para>
|
||||
</description>
|
||||
</application>
|
||||
***/
|
||||
|
||||
static const char app[] = "AudioSocket";
|
||||
|
||||
static int audiosocket_run(struct ast_channel *chan, const char *id, const int svc);
|
||||
static int audiosocket_run(struct ast_channel *chan, const char *id, const int svc, const char *server);
|
||||
|
||||
static int audiosocket_exec(struct ast_channel *chan, const char *data)
|
||||
{
|
||||
@@ -105,67 +109,53 @@ static int audiosocket_exec(struct ast_channel *chan, const char *data)
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Save current channel audio format and force to linear PCM. */
|
||||
|
||||
writeFormat = ao2_bump(ast_channel_writeformat(chan));
|
||||
readFormat = ao2_bump(ast_channel_readformat(chan));
|
||||
|
||||
if (ast_set_write_format(chan, ast_format_slin)) {
|
||||
ast_log(LOG_ERROR, "Failed to set write format to SLINEAR for channel %s\n", chanName);
|
||||
ao2_ref(writeFormat, -1);
|
||||
ao2_ref(readFormat, -1);
|
||||
close(s);
|
||||
return -1;
|
||||
ast_log(LOG_ERROR, "Failed to set write format to SLINEAR for channel '%s'\n", chanName);
|
||||
res = -1;
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (ast_set_read_format(chan, ast_format_slin)) {
|
||||
ast_log(LOG_ERROR, "Failed to set read format to SLINEAR for channel %s\n", chanName);
|
||||
|
||||
/* Attempt to restore previous write format even though it is likely to
|
||||
* fail, since setting the read format did.
|
||||
*/
|
||||
if (ast_set_write_format(chan, writeFormat)) {
|
||||
ast_log(LOG_ERROR, "Failed to restore write format for channel %s\n", chanName);
|
||||
}
|
||||
ao2_ref(writeFormat, -1);
|
||||
ao2_ref(readFormat, -1);
|
||||
close(s);
|
||||
return -1;
|
||||
ast_log(LOG_ERROR, "Failed to set read format to SLINEAR for channel '%s'\n", chanName);
|
||||
res = -1;
|
||||
goto end;
|
||||
}
|
||||
|
||||
res = audiosocket_run(chan, args.idStr, s);
|
||||
/* On non-zero return, report failure */
|
||||
if (res) {
|
||||
/* Restore previous formats and close the connection */
|
||||
if (ast_set_write_format(chan, writeFormat)) {
|
||||
ast_log(LOG_ERROR, "Failed to restore write format for channel %s\n", chanName);
|
||||
}
|
||||
if (ast_set_read_format(chan, readFormat)) {
|
||||
ast_log(LOG_ERROR, "Failed to restore read format for channel %s\n", chanName);
|
||||
}
|
||||
ao2_ref(writeFormat, -1);
|
||||
ao2_ref(readFormat, -1);
|
||||
close(s);
|
||||
return res;
|
||||
}
|
||||
close(s);
|
||||
/* Only a requested hangup or socket closure from the remote end will
|
||||
return a 0 value (normal exit). All other events that disrupt an
|
||||
active connection are treated as errors for now (non-zero). */
|
||||
|
||||
res = audiosocket_run(chan, args.idStr, s, args.server);
|
||||
|
||||
end:
|
||||
|
||||
/* Restore previous formats and close the connection */
|
||||
if (ast_set_write_format(chan, writeFormat)) {
|
||||
ast_log(LOG_ERROR, "Failed to restore write format for channel %s\n", chanName);
|
||||
ast_log(LOG_ERROR, "Failed to restore write format for channel '%s'\n", chanName);
|
||||
}
|
||||
if (ast_set_read_format(chan, readFormat)) {
|
||||
ast_log(LOG_ERROR, "Failed to restore read format for channel %s\n", chanName);
|
||||
ast_log(LOG_ERROR, "Failed to restore read format for channel '%s'\n", chanName);
|
||||
}
|
||||
ao2_ref(writeFormat, -1);
|
||||
ao2_ref(readFormat, -1);
|
||||
close(s);
|
||||
|
||||
return 0;
|
||||
return res;
|
||||
}
|
||||
|
||||
static int audiosocket_run(struct ast_channel *chan, const char *id, int svc)
|
||||
static int audiosocket_run(struct ast_channel *chan, const char *id, int svc, const char *server)
|
||||
{
|
||||
const char *chanName;
|
||||
struct ast_channel *targetChan;
|
||||
int ms = 0;
|
||||
int ms = MAX_WAIT_TIMEOUT_MSEC;
|
||||
int outfd = -1;
|
||||
struct ast_frame *f;
|
||||
int hangup;
|
||||
|
||||
if (!chan || ast_channel_state(chan) != AST_STATE_UP) {
|
||||
ast_log(LOG_ERROR, "Channel is %s\n", chan ? "not answered" : "missing");
|
||||
@@ -173,46 +163,63 @@ static int audiosocket_run(struct ast_channel *chan, const char *id, int svc)
|
||||
}
|
||||
|
||||
if (ast_audiosocket_init(svc, id)) {
|
||||
ast_log(LOG_ERROR, "Failed to intialize AudioSocket\n");
|
||||
ast_log(LOG_ERROR, "Failed to initialize AudioSocket\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
chanName = ast_channel_name(chan);
|
||||
|
||||
while (1) {
|
||||
ms = -1;
|
||||
/* Timeout is hard-coded currently, could be made into an
|
||||
argument if needed, but 2 seconds seems like a realistic
|
||||
time range to give. */
|
||||
targetChan = ast_waitfor_nandfds(&chan, 1, &svc, 1, NULL, &outfd, &ms);
|
||||
ms = MAX_WAIT_TIMEOUT_MSEC;
|
||||
|
||||
if (targetChan) {
|
||||
/* Receive frame from connected channel. */
|
||||
f = ast_read(chan);
|
||||
if (!f) {
|
||||
ast_log(LOG_WARNING, "Failed to receive frame from channel '%s' connected to AudioSocket server '%s'", chanName, server);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (f->frametype == AST_FRAME_VOICE) {
|
||||
/* Send audio frame to audiosocket */
|
||||
if (f->frametype == AST_FRAME_VOICE || f->frametype == AST_FRAME_DTMF) {
|
||||
/* Send audio frame or DTMF frame to audiosocket */
|
||||
if (ast_audiosocket_send_frame(svc, f)) {
|
||||
ast_log(LOG_ERROR, "Failed to forward channel frame from %s to AudioSocket\n",
|
||||
chanName);
|
||||
ast_log(LOG_WARNING, "Failed to forward frame from channel '%s' to AudioSocket server '%s'\n",
|
||||
chanName, server);
|
||||
ast_frfree(f);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
ast_frfree(f);
|
||||
}
|
||||
|
||||
if (outfd >= 0) {
|
||||
f = ast_audiosocket_receive_frame(svc);
|
||||
} else if (outfd >= 0) {
|
||||
/* Receive audio frame from audiosocket. */
|
||||
f = ast_audiosocket_receive_frame_with_hangup(svc, &hangup);
|
||||
if (hangup) {
|
||||
/* Graceful termination, no frame to free. */
|
||||
return 0;
|
||||
}
|
||||
if (!f) {
|
||||
ast_log(LOG_ERROR, "Failed to receive frame from AudioSocket message for"
|
||||
"channel %s\n", chanName);
|
||||
ast_log(LOG_WARNING, "Failed to receive frame from AudioSocket server '%s'"
|
||||
" connected to channel '%s'\n", server, chanName);
|
||||
return -1;
|
||||
}
|
||||
/* Send audio frame to connected channel. */
|
||||
if (ast_write(chan, f)) {
|
||||
ast_log(LOG_WARNING, "Failed to forward frame to channel %s\n", chanName);
|
||||
ast_log(LOG_WARNING, "Failed to forward frame from AudioSocket server '%s' to channel '%s'\n", server, chanName);
|
||||
ast_frfree(f);
|
||||
return -1;
|
||||
}
|
||||
ast_frfree(f);
|
||||
|
||||
} else {
|
||||
/* Neither the channel nor audio socket had activity
|
||||
before timeout. Assume connection was lost. */
|
||||
ast_log(LOG_ERROR, "Reached timeout after %d ms of no activity on AudioSocket connection between '%s' and '%s'\n", MAX_WAIT_TIMEOUT_MSEC, chanName, server);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
||||
@@ -58,6 +58,9 @@ AST_APP_OPTIONS(auth_app_options, {
|
||||
static const char app[] = "Authenticate";
|
||||
/*** DOCUMENTATION
|
||||
<application name="Authenticate" language="en_US">
|
||||
<since>
|
||||
<version>0.4.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Authenticate a user
|
||||
</synopsis>
|
||||
|
||||
@@ -39,6 +39,10 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="BlindTransfer" language="en_US">
|
||||
<since>
|
||||
<version>13.28.0</version>
|
||||
<version>16.5.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Blind transfer channel(s) to the extension and context provided
|
||||
</synopsis>
|
||||
|
||||
@@ -39,6 +39,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="BridgeAdd" language="en_US">
|
||||
<since>
|
||||
<version>14.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Join a bridge that contains the specified channel.
|
||||
</synopsis>
|
||||
|
||||
@@ -50,6 +50,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="BridgeWait" language="en_US">
|
||||
<since>
|
||||
<version>12.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Put a call into the holding bridge.
|
||||
</synopsis>
|
||||
|
||||
@@ -46,6 +46,10 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="Broadcast" language="en_US">
|
||||
<since>
|
||||
<version>18.17.0</version>
|
||||
<version>20.2.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Transmit or receive audio to or from multiple channels simultaneously
|
||||
</synopsis>
|
||||
@@ -249,6 +253,7 @@ static int start_spying(struct ast_autochan *autochan, const char *spychan_name,
|
||||
ast_debug(1, "Attaching spy channel %s to %s\n", spychan_name, ast_channel_name(autochan->chan));
|
||||
|
||||
if (ast_test_flag(flags, OPTION_READONLY)) {
|
||||
ast_audiohook_set_frame_feed_direction(audiohook, AST_AUDIOHOOK_DIRECTION_READ);
|
||||
ast_set_flag(audiohook, AST_AUDIOHOOK_MUTE_WRITE);
|
||||
} else {
|
||||
ast_set_flag(audiohook, AST_AUDIOHOOK_TRIGGER_SYNC);
|
||||
@@ -263,6 +268,25 @@ static int start_spying(struct ast_autochan *autochan, const char *spychan_name,
|
||||
return res;
|
||||
}
|
||||
|
||||
static int start_whispering(struct ast_autochan *autochan, const char *spychan_name, struct ast_audiohook *audiohook, struct ast_flags *flags)
|
||||
{
|
||||
int res;
|
||||
|
||||
ast_autochan_channel_lock(autochan);
|
||||
ast_verb(3, "Attaching spy channel %s to %s\n",
|
||||
spychan_name, ast_channel_name(autochan->chan));
|
||||
|
||||
ast_set_flag(audiohook, AST_AUDIOHOOK_TRIGGER_SYNC);
|
||||
if (ast_test_flag(flags, OPTION_LONG_QUEUE)) {
|
||||
ast_debug(9, "Using a long queue to store audio frames in whisper audiohook\n");
|
||||
} else {
|
||||
ast_set_flag(audiohook, AST_AUDIOHOOK_SMALL_QUEUE);
|
||||
}
|
||||
res = ast_audiohook_attach(autochan->chan, audiohook);
|
||||
ast_autochan_channel_unlock(autochan);
|
||||
return res;
|
||||
}
|
||||
|
||||
static int attach_barge(struct ast_autochan *spyee_autochan, struct ast_autochan **spyee_bridge_autochan,
|
||||
struct ast_audiohook *bridge_whisper_audiohook, const char *spyer_name, const char *name, struct ast_flags *flags)
|
||||
{
|
||||
@@ -294,7 +318,7 @@ static int attach_barge(struct ast_autochan *spyee_autochan, struct ast_autochan
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (start_spying(internal_bridge_autochan, spyer_name, bridge_whisper_audiohook, flags)) {
|
||||
if (start_whispering(internal_bridge_autochan, spyer_name, bridge_whisper_audiohook, flags)) {
|
||||
ast_log(LOG_WARNING, "Unable to attach barge audiohook on spyee '%s'. Barge mode disabled.\n", name);
|
||||
retval = -1;
|
||||
}
|
||||
@@ -395,7 +419,7 @@ static int do_broadcast(struct ast_channel *chan, struct ast_flags *flags, const
|
||||
mac->connected = 1;
|
||||
ast_audiohook_init(&mac->whisper_audiohook, AST_AUDIOHOOK_TYPE_WHISPER, "Broadcast", 0);
|
||||
/* Inject audio from our channel to this target. */
|
||||
if (start_spying(mac->autochan, next, &mac->whisper_audiohook, flags)) {
|
||||
if (start_whispering(mac->autochan, next, &mac->whisper_audiohook, flags)) {
|
||||
ast_log(LOG_WARNING, "Unable to attach whisper audiohook to %s\n", next);
|
||||
multi_autochan_free(mac);
|
||||
continue;
|
||||
|
||||
@@ -39,6 +39,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="ResetCDR" language="en_US">
|
||||
<since>
|
||||
<version>12.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Resets the Call Data Record.
|
||||
</synopsis>
|
||||
@@ -88,7 +91,7 @@ struct app_cdr_message_payload {
|
||||
const char *channel_name;
|
||||
/*! Reset the CDR */
|
||||
unsigned int reset:1;
|
||||
/*! If reseting the CDR, keep the variables */
|
||||
/*! If resetting the CDR, keep the variables */
|
||||
unsigned int keep_variables:1;
|
||||
};
|
||||
|
||||
|
||||
@@ -36,6 +36,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="CELGenUserEvent" language="en_US">
|
||||
<since>
|
||||
<version>1.8.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Generates a CEL User Defined Event.
|
||||
</synopsis>
|
||||
|
||||
@@ -47,6 +47,9 @@ static const char app[] = "ChanIsAvail";
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="ChanIsAvail" language="en_US">
|
||||
<since>
|
||||
<version>0.4.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Check channel availability
|
||||
</synopsis>
|
||||
|
||||
@@ -39,6 +39,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="ChannelRedirect" language="en_US">
|
||||
<since>
|
||||
<version>1.4.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Redirects given channel to a dialplan target
|
||||
</synopsis>
|
||||
|
||||
@@ -62,6 +62,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="ChanSpy" language="en_US">
|
||||
<since>
|
||||
<version>1.2.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Listen to a channel, and optionally whisper into it.
|
||||
</synopsis>
|
||||
@@ -129,6 +132,9 @@
|
||||
<argument name="mailbox" />
|
||||
<argument name="context" />
|
||||
</option>
|
||||
<option name="N">
|
||||
<para>Do not answer the channel automatically.</para>
|
||||
</option>
|
||||
<option name="o">
|
||||
<para>Only listen to audio coming from this channel.</para>
|
||||
</option>
|
||||
@@ -204,6 +210,9 @@
|
||||
</see-also>
|
||||
</application>
|
||||
<application name="ExtenSpy" language="en_US">
|
||||
<since>
|
||||
<version>1.4.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Listen to a channel, and optionally whisper into it.
|
||||
</synopsis>
|
||||
@@ -283,6 +292,9 @@
|
||||
<argument name="mailbox" />
|
||||
<argument name="context" />
|
||||
</option>
|
||||
<option name="N">
|
||||
<para>Do not answer the channel automatically.</para>
|
||||
</option>
|
||||
<option name="o">
|
||||
<para>Only listen to audio coming from this channel.</para>
|
||||
</option>
|
||||
@@ -351,6 +363,9 @@
|
||||
</see-also>
|
||||
</application>
|
||||
<application name="DAHDIScan" language="en_US">
|
||||
<since>
|
||||
<version>1.4.22</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Scan DAHDI channels to monitor calls.
|
||||
</synopsis>
|
||||
@@ -399,6 +414,7 @@ enum {
|
||||
OPTION_UNIQUEID = (1 << 19), /* The chanprefix is a channel uniqueid or fully specified channel name. */
|
||||
OPTION_LONG_QUEUE = (1 << 20), /* Allow usage of a long queue to store audio frames. */
|
||||
OPTION_INTERLEAVED = (1 << 21), /* Interleave the Read and Write frames in the output frame. */
|
||||
OPTION_NOANSWER = (1 << 22), /* Do not automatically answer the channel */
|
||||
};
|
||||
|
||||
enum {
|
||||
@@ -423,6 +439,7 @@ AST_APP_OPTIONS(spy_opts, {
|
||||
AST_APP_OPTION_ARG('g', OPTION_GROUP, OPT_ARG_GROUP),
|
||||
AST_APP_OPTION('l', OPTION_LONG_QUEUE),
|
||||
AST_APP_OPTION_ARG('n', OPTION_NAME, OPT_ARG_NAME),
|
||||
AST_APP_OPTION('N', OPTION_NOANSWER),
|
||||
AST_APP_OPTION('o', OPTION_READONLY),
|
||||
AST_APP_OPTION('q', OPTION_QUIET),
|
||||
AST_APP_OPTION_ARG('r', OPTION_RECORD, OPT_ARG_RECORD),
|
||||
@@ -570,6 +587,7 @@ static int start_spying(struct ast_autochan *autochan, const char *spychan_name,
|
||||
spychan_name, ast_channel_name(autochan->chan));
|
||||
|
||||
if (ast_test_flag(flags, OPTION_READONLY)) {
|
||||
ast_audiohook_set_frame_feed_direction(audiohook, AST_AUDIOHOOK_DIRECTION_READ);
|
||||
ast_set_flag(audiohook, AST_AUDIOHOOK_MUTE_WRITE);
|
||||
} else {
|
||||
ast_set_flag(audiohook, AST_AUDIOHOOK_TRIGGER_SYNC);
|
||||
@@ -584,6 +602,25 @@ static int start_spying(struct ast_autochan *autochan, const char *spychan_name,
|
||||
return res;
|
||||
}
|
||||
|
||||
static int start_whispering(struct ast_autochan *autochan, const char *spychan_name, struct ast_audiohook *audiohook, struct ast_flags *flags)
|
||||
{
|
||||
int res;
|
||||
|
||||
ast_autochan_channel_lock(autochan);
|
||||
ast_verb(3, "Attaching spy channel %s to %s\n",
|
||||
spychan_name, ast_channel_name(autochan->chan));
|
||||
|
||||
ast_set_flag(audiohook, AST_AUDIOHOOK_TRIGGER_SYNC);
|
||||
if (ast_test_flag(flags, OPTION_LONG_QUEUE)) {
|
||||
ast_debug(9, "Using a long queue to store audio frames in whisper audiohook\n");
|
||||
} else {
|
||||
ast_set_flag(audiohook, AST_AUDIOHOOK_SMALL_QUEUE);
|
||||
}
|
||||
res = ast_audiohook_attach(autochan->chan, audiohook);
|
||||
ast_autochan_channel_unlock(autochan);
|
||||
return res;
|
||||
}
|
||||
|
||||
static void change_spy_mode(const char digit, struct ast_flags *flags)
|
||||
{
|
||||
if (digit == '4') {
|
||||
@@ -684,7 +721,7 @@ static int attach_barge(struct ast_autochan *spyee_autochan,
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (start_spying(internal_bridge_autochan, spyer_name, bridge_whisper_audiohook, flags)) {
|
||||
if (start_whispering(internal_bridge_autochan, spyer_name, bridge_whisper_audiohook, flags)) {
|
||||
ast_log(LOG_WARNING, "Unable to attach barge audiohook on spyee '%s'. Barge mode disabled.\n", name);
|
||||
retval = -1;
|
||||
}
|
||||
@@ -746,7 +783,7 @@ static int channel_spy(struct ast_channel *chan, struct ast_autochan *spyee_auto
|
||||
*/
|
||||
ast_audiohook_init(&csth.whisper_audiohook, AST_AUDIOHOOK_TYPE_WHISPER, "ChanSpy", 0);
|
||||
|
||||
if (start_spying(spyee_autochan, spyer_name, &csth.whisper_audiohook, flags)) {
|
||||
if (start_whispering(spyee_autochan, spyer_name, &csth.whisper_audiohook, flags)) {
|
||||
ast_log(LOG_WARNING, "Unable to attach whisper audiohook to spyee %s. Whisper mode disabled!\n", name);
|
||||
}
|
||||
}
|
||||
@@ -970,8 +1007,9 @@ static int common_exec(struct ast_channel *chan, struct ast_flags *flags,
|
||||
ast_channel_unlock(chan);
|
||||
}
|
||||
|
||||
if (ast_channel_state(chan) != AST_STATE_UP)
|
||||
if (!ast_test_flag(flags, OPTION_NOANSWER) && ast_channel_state(chan) != AST_STATE_UP) {
|
||||
ast_answer(chan);
|
||||
}
|
||||
|
||||
ast_channel_set_flag(chan, AST_FLAG_SPYING);
|
||||
|
||||
|
||||
@@ -76,6 +76,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="ConfBridge" language="en_US">
|
||||
<since>
|
||||
<version>12.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Conference bridge application.
|
||||
</synopsis>
|
||||
@@ -135,7 +138,6 @@
|
||||
<since>
|
||||
<version>16.19.0</version>
|
||||
<version>18.5.0</version>
|
||||
<version>19.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Kicks channel(s) from the requested ConfBridge.
|
||||
@@ -169,6 +171,9 @@
|
||||
</see-also>
|
||||
</application>
|
||||
<function name="CONFBRIDGE" language="en_US">
|
||||
<since>
|
||||
<version>10.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Set a custom dynamic bridge, user, or menu profile on a channel for the
|
||||
ConfBridge application using the same options available in confbridge.conf.
|
||||
@@ -224,6 +229,9 @@
|
||||
</description>
|
||||
</function>
|
||||
<function name="CONFBRIDGE_INFO" language="en_US">
|
||||
<since>
|
||||
<version>10.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Get information about a ConfBridge conference.
|
||||
</synopsis>
|
||||
@@ -262,9 +270,9 @@
|
||||
</function>
|
||||
<function name="CONFBRIDGE_CHANNELS" language="en_US">
|
||||
<since>
|
||||
<version>16.26.0</version>
|
||||
<version>18.12.0</version>
|
||||
<version>19.4.0</version>
|
||||
<version>16.27.0</version>
|
||||
<version>18.13.0</version>
|
||||
<version>19.5.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Get a list of channels in a ConfBridge conference.
|
||||
@@ -302,6 +310,9 @@
|
||||
</see-also>
|
||||
</function>
|
||||
<manager name="ConfbridgeList" language="en_US">
|
||||
<since>
|
||||
<version>10.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
List participants in a conference.
|
||||
</synopsis>
|
||||
@@ -319,6 +330,10 @@
|
||||
</manager>
|
||||
<managerEvent language="en_US" name="ConfbridgeList">
|
||||
<managerEventInstance class="EVENT_FLAG_REPORTING">
|
||||
<since>
|
||||
<version>13.20.0</version>
|
||||
<version>15.3.0</version>
|
||||
</since>
|
||||
<synopsis>Raised as part of the ConfbridgeList action response list.</synopsis>
|
||||
<syntax>
|
||||
<parameter name="Conference">
|
||||
@@ -381,6 +396,9 @@
|
||||
</managerEventInstance>
|
||||
</managerEvent>
|
||||
<manager name="ConfbridgeListRooms" language="en_US">
|
||||
<since>
|
||||
<version>10.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
List active conferences.
|
||||
</synopsis>
|
||||
@@ -395,6 +413,11 @@
|
||||
</manager>
|
||||
<managerEvent language="en_US" name="ConfbridgeListRooms">
|
||||
<managerEventInstance class="EVENT_FLAG_REPORTING">
|
||||
<since>
|
||||
<version>16.29.0</version>
|
||||
<version>18.15.0</version>
|
||||
<version>19.7.0</version>
|
||||
</since>
|
||||
<synopsis>Raised as part of the ConfbridgeListRooms action response list.</synopsis>
|
||||
<syntax>
|
||||
<parameter name="Conference">
|
||||
@@ -425,6 +448,9 @@
|
||||
</managerEventInstance>
|
||||
</managerEvent>
|
||||
<manager name="ConfbridgeMute" language="en_US">
|
||||
<since>
|
||||
<version>10.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Mute a Confbridge user.
|
||||
</synopsis>
|
||||
@@ -441,6 +467,9 @@
|
||||
</description>
|
||||
</manager>
|
||||
<manager name="ConfbridgeUnmute" language="en_US">
|
||||
<since>
|
||||
<version>10.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Unmute a Confbridge user.
|
||||
</synopsis>
|
||||
@@ -457,6 +486,9 @@
|
||||
</description>
|
||||
</manager>
|
||||
<manager name="ConfbridgeKick" language="en_US">
|
||||
<since>
|
||||
<version>10.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Kick a Confbridge user.
|
||||
</synopsis>
|
||||
@@ -472,6 +504,9 @@
|
||||
</description>
|
||||
</manager>
|
||||
<manager name="ConfbridgeLock" language="en_US">
|
||||
<since>
|
||||
<version>10.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Lock a Confbridge conference.
|
||||
</synopsis>
|
||||
@@ -483,6 +518,9 @@
|
||||
</description>
|
||||
</manager>
|
||||
<manager name="ConfbridgeUnlock" language="en_US">
|
||||
<since>
|
||||
<version>10.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Unlock a Confbridge conference.
|
||||
</synopsis>
|
||||
@@ -494,6 +532,9 @@
|
||||
</description>
|
||||
</manager>
|
||||
<manager name="ConfbridgeStartRecord" language="en_US">
|
||||
<since>
|
||||
<version>10.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Start recording a Confbridge conference.
|
||||
</synopsis>
|
||||
@@ -507,6 +548,9 @@
|
||||
</description>
|
||||
</manager>
|
||||
<manager name="ConfbridgeStopRecord" language="en_US">
|
||||
<since>
|
||||
<version>10.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Stop recording a Confbridge conference.
|
||||
</synopsis>
|
||||
@@ -518,6 +562,9 @@
|
||||
</description>
|
||||
</manager>
|
||||
<manager name="ConfbridgeSetSingleVideoSrc" language="en_US">
|
||||
<since>
|
||||
<version>10.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Set a conference user as the single video source distributed to all other participants.
|
||||
</synopsis>
|
||||
@@ -1069,7 +1116,7 @@ static int sound_file_exists(const char *filename)
|
||||
* \param user Optional Caller
|
||||
* \param bridge_channel The bridged channel involved
|
||||
*
|
||||
* \note if caller is NULL, the announcment will be sent to all participants in the conference.
|
||||
* \note if caller is NULL, the announcement will be sent to all participants in the conference.
|
||||
* \retval 0 on success.
|
||||
* \retval -1 if the user hung up.
|
||||
*/
|
||||
|
||||
@@ -40,6 +40,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="ControlPlayback" language="en_US">
|
||||
<since>
|
||||
<version>1.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Play a file with fast forward and rewind.
|
||||
</synopsis>
|
||||
@@ -98,6 +101,9 @@
|
||||
</description>
|
||||
</application>
|
||||
<manager name="ControlPlayback" language="en_US">
|
||||
<since>
|
||||
<version>12.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Control the playback of a file being played to a channel.
|
||||
</synopsis>
|
||||
|
||||
@@ -43,6 +43,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="DBdeltree" language="en_US">
|
||||
<since>
|
||||
<version>0.4.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Delete a family or keytree from the asterisk database.
|
||||
</synopsis>
|
||||
|
||||
@@ -70,6 +70,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="Dial" language="en_US">
|
||||
<since>
|
||||
<version>0.1.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Attempt to connect to another device or endpoint and bridge the call.
|
||||
</synopsis>
|
||||
@@ -94,6 +97,7 @@
|
||||
<para>If a second argument is specified, this controls the number of seconds we attempt to dial the specified devices
|
||||
without receiving early media or ringing. If neither progress, ringing, nor voice frames have been received when this
|
||||
timeout expires, the call will be treated as a CHANUNAVAIL. This can be used to skip destinations that may not be responsive.</para>
|
||||
<para>The timeouts need not be whole numbers; both arguments accept fractional seconds.</para>
|
||||
</parameter>
|
||||
<parameter name="options" required="false">
|
||||
<optionlist>
|
||||
@@ -211,7 +215,7 @@
|
||||
and <emphasis>start</emphasis> execution at that location.</para>
|
||||
<para>NOTE: Any channel variables you want the called channel to inherit from the caller channel must be
|
||||
prefixed with one or two underbars ('_').</para>
|
||||
<para>NOTE: Using this option from a GoSub() might not make sense as there would be no return points.</para>
|
||||
<para>NOTE: Using this option from a Gosub() might not make sense as there would be no return points.</para>
|
||||
</option>
|
||||
<option name="g">
|
||||
<para>Proceed with dialplan execution at the next priority in the current extension if the
|
||||
@@ -584,7 +588,7 @@
|
||||
nonexistent location, e.g. nonexistent DNS hostname.
|
||||
</value>
|
||||
<value name="CONGESTION">
|
||||
Channel or switching congestion occured when routing the call.
|
||||
Channel or switching congestion occurred when routing the call.
|
||||
This can occur if there is a slow or no response from the remote end.
|
||||
</value>
|
||||
<value name="NOANSWER">
|
||||
@@ -624,6 +628,9 @@
|
||||
</see-also>
|
||||
</application>
|
||||
<application name="RetryDial" language="en_US">
|
||||
<since>
|
||||
<version>1.2.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Place a call, retrying on failure allowing an optional exit extension.
|
||||
</synopsis>
|
||||
@@ -1214,7 +1221,6 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in,
|
||||
struct cause_args num = *num_in;
|
||||
int prestart = num.busy + num.congestion + num.nochan;
|
||||
int orig_answer_to = *to_answer;
|
||||
int progress_to_dup = *to_progress;
|
||||
int orig_progress_to = *to_progress;
|
||||
struct ast_channel *peer = NULL;
|
||||
struct chanlist *outgoing = AST_LIST_FIRST(out_chans);
|
||||
@@ -1259,7 +1265,7 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in,
|
||||
|
||||
is_cc_recall = ast_cc_is_recall(in, &cc_recall_core_id, NULL);
|
||||
|
||||
while ((*to_answer = ast_remaining_ms(start, orig_answer_to)) && (*to_progress = ast_remaining_ms(start, progress_to_dup)) && !peer) {
|
||||
while ((*to_answer = ast_remaining_ms(start, orig_answer_to)) && (*to_progress = ast_remaining_ms(start, orig_progress_to)) && !peer) {
|
||||
struct chanlist *o;
|
||||
int pos = 0; /* how many channels do we handle */
|
||||
int numlines = prestart;
|
||||
@@ -1291,7 +1297,10 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in,
|
||||
}
|
||||
SCOPE_EXIT_RTN_VALUE(NULL, "%s: No outgoing channels available\n", ast_channel_name(in));
|
||||
}
|
||||
winner = ast_waitfor_n(watchers, pos, to_answer);
|
||||
|
||||
/* If progress timeout is active, use that if it's the shorter of the 2 timeouts. */
|
||||
winner = ast_waitfor_n(watchers, pos, *to_progress > 0 && (*to_answer < 0 || *to_progress < *to_answer) ? to_progress : to_answer);
|
||||
|
||||
AST_LIST_TRAVERSE(out_chans, o, node) {
|
||||
int res = 0;
|
||||
struct ast_frame *f;
|
||||
@@ -1506,7 +1515,7 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in,
|
||||
*/
|
||||
++num_ringing;
|
||||
*to_progress = -1;
|
||||
progress_to_dup = -1;
|
||||
orig_progress_to = -1;
|
||||
if (ignore_cc || cc_frame_received || num_ringing == numlines) {
|
||||
ast_verb(3, "%s is ringing\n", ast_channel_name(c));
|
||||
/* Setup early media if appropriate */
|
||||
@@ -1551,7 +1560,7 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in,
|
||||
}
|
||||
}
|
||||
*to_progress = -1;
|
||||
progress_to_dup = -1;
|
||||
orig_progress_to = -1;
|
||||
if (!sent_progress) {
|
||||
struct timeval now, then;
|
||||
int64_t diff;
|
||||
@@ -1720,6 +1729,15 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in,
|
||||
case AST_CONTROL_PVT_CAUSE_CODE:
|
||||
ast_indicate_data(in, AST_CONTROL_PVT_CAUSE_CODE, f->data.ptr, f->datalen);
|
||||
break;
|
||||
case AST_CONTROL_PLAYBACK_BEGIN:
|
||||
if (!f->data.ptr) {
|
||||
ast_log(LOG_WARNING, "Got playback begin directive without filename on %s\n", ast_channel_name(c));
|
||||
} else {
|
||||
const char *filename = f->data.ptr;
|
||||
ast_verb(3, "Playing audio file %s on %s\n", filename, ast_channel_name(in));
|
||||
ast_streamfile(in, filename, ast_channel_language(in));
|
||||
}
|
||||
break;
|
||||
case -1:
|
||||
if (single && !caller_entertained) {
|
||||
ast_verb(3, "%s stopped sounds\n", ast_channel_name(c));
|
||||
@@ -1741,7 +1759,7 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in,
|
||||
break;
|
||||
}
|
||||
*to_progress = -1;
|
||||
progress_to_dup = -1;
|
||||
orig_progress_to = -1;
|
||||
/* Fall through */
|
||||
case AST_FRAME_TEXT:
|
||||
if (single && ast_write(in, f)) {
|
||||
@@ -1791,7 +1809,10 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in,
|
||||
if (ast_test_flag64(peerflags, OPT_DTMF_EXIT)) {
|
||||
const char *context;
|
||||
ast_channel_lock(in);
|
||||
context = pbx_builtin_getvar_helper(in, "EXITCONTEXT");
|
||||
if ((context = pbx_builtin_getvar_helper(in, "EXITCONTEXT"))) {
|
||||
context = ast_strdupa(context);
|
||||
}
|
||||
ast_channel_unlock(in);
|
||||
if (onedigit_goto(in, context, (char) f->subclass.integer, 1)) {
|
||||
ast_verb(3, "User hit %c to disconnect call.\n", f->subclass.integer);
|
||||
*to_answer = 0;
|
||||
@@ -1800,14 +1821,12 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in,
|
||||
pa->canceled = 1;
|
||||
publish_dial_end_event(in, out_chans, NULL, pa->status);
|
||||
ast_frfree(f);
|
||||
ast_channel_unlock(in);
|
||||
if (is_cc_recall) {
|
||||
ast_cc_completed(in, "CC completed, but the caller used DTMF to exit");
|
||||
}
|
||||
SCOPE_EXIT_RTN_VALUE(NULL, "%s: Caller pressed %c to end call\n",
|
||||
ast_channel_name(in), f->subclass.integer);
|
||||
}
|
||||
ast_channel_unlock(in);
|
||||
}
|
||||
|
||||
if (ast_test_flag64(peerflags, OPT_CALLER_HANGUP) &&
|
||||
@@ -2916,22 +2935,23 @@ static int dial_exec_full(struct ast_channel *chan, const char *data, struct ast
|
||||
to_answer = -1;
|
||||
to_progress = -1;
|
||||
} else {
|
||||
double tmp;
|
||||
char *anstimeout = strsep(&args.timeout, "^");
|
||||
if (!ast_strlen_zero(anstimeout)) {
|
||||
to_answer = atoi(anstimeout);
|
||||
if (to_answer > 0) {
|
||||
to_answer *= 1000;
|
||||
if (sscanf(anstimeout, "%30lf", &tmp) == 1 && tmp > 0) {
|
||||
to_answer = tmp * 1000;
|
||||
ast_debug(3, "Dial timeout set to %d ms\n", to_answer);
|
||||
} else {
|
||||
ast_log(LOG_WARNING, "Invalid answer timeout specified: '%s'. Setting timeout to infinite\n", args.timeout);
|
||||
ast_log(LOG_WARNING, "Invalid answer timeout specified: '%s'. Setting timeout to infinite\n", anstimeout);
|
||||
to_answer = -1;
|
||||
}
|
||||
} else {
|
||||
to_answer = -1;
|
||||
}
|
||||
if (!ast_strlen_zero(args.timeout)) {
|
||||
to_progress = atoi(args.timeout);
|
||||
if (to_progress > 0) {
|
||||
to_progress *= 1000;
|
||||
if (sscanf(args.timeout, "%30lf", &tmp) == 1 && tmp > 0) {
|
||||
to_progress = tmp * 1000;
|
||||
ast_debug(3, "Dial progress timeout set to %d ms\n", to_progress);
|
||||
} else {
|
||||
ast_log(LOG_WARNING, "Invalid progress timeout specified: '%s'. Setting timeout to infinite\n", args.timeout);
|
||||
to_progress = -1;
|
||||
|
||||
@@ -45,6 +45,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="Dictate" language="en_US">
|
||||
<since>
|
||||
<version>1.2.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Virtual Dictation Machine.
|
||||
</synopsis>
|
||||
|
||||
@@ -49,6 +49,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="Pickup" language="en_US">
|
||||
<since>
|
||||
<version>1.2.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Directed extension call pickup.
|
||||
</synopsis>
|
||||
@@ -91,6 +94,9 @@
|
||||
</description>
|
||||
</application>
|
||||
<application name="PickupChan" language="en_US">
|
||||
<since>
|
||||
<version>1.6.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Pickup a ringing channel.
|
||||
</synopsis>
|
||||
|
||||
@@ -43,6 +43,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="Directory" language="en_US">
|
||||
<since>
|
||||
<version>0.1.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Provide directory of voicemail extensions.
|
||||
</synopsis>
|
||||
|
||||
@@ -50,6 +50,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="DISA" language="en_US">
|
||||
<since>
|
||||
<version>0.1.9</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Direct Inward System Access.
|
||||
</synopsis>
|
||||
|
||||
@@ -44,7 +44,6 @@
|
||||
<since>
|
||||
<version>16.20.0</version>
|
||||
<version>18.6.0</version>
|
||||
<version>19.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Stores DTMF digits transmitted or received on a channel.
|
||||
|
||||
@@ -43,6 +43,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="DumpChan" language="en_US">
|
||||
<since>
|
||||
<version>1.2.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Dump Info About The Calling Channel.
|
||||
</synopsis>
|
||||
|
||||
@@ -37,6 +37,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="Echo" language="en_US">
|
||||
<since>
|
||||
<version>0.1.2</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Echo media, DTMF back to the calling party
|
||||
</synopsis>
|
||||
@@ -46,7 +49,7 @@
|
||||
channel back to itself. This will not echo CONTROL, MODEM, or NULL
|
||||
frames. Note: If '#' detected application exits.</para>
|
||||
<para>This application does not automatically answer and should be
|
||||
preceeded by an application such as Answer() or Progress().</para>
|
||||
preceded by an application such as Answer() or Progress().</para>
|
||||
</description>
|
||||
</application>
|
||||
***/
|
||||
|
||||
@@ -39,6 +39,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="Exec" language="en_US">
|
||||
<since>
|
||||
<version>1.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Executes dialplan application.
|
||||
</synopsis>
|
||||
@@ -58,6 +61,9 @@
|
||||
</description>
|
||||
</application>
|
||||
<application name="TryExec" language="en_US">
|
||||
<since>
|
||||
<version>1.4.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Executes dialplan application, always returning.
|
||||
</synopsis>
|
||||
@@ -88,6 +94,9 @@
|
||||
</description>
|
||||
</application>
|
||||
<application name="ExecIf" language="en_US">
|
||||
<since>
|
||||
<version>1.2.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Executes dialplan application, conditionally.
|
||||
</synopsis>
|
||||
|
||||
@@ -52,6 +52,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="ExternalIVR" language="en_US">
|
||||
<since>
|
||||
<version>1.2.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Interfaces with an external IVR application.
|
||||
</synopsis>
|
||||
@@ -421,8 +424,11 @@ static int app_exec(struct ast_channel *chan, const char *data)
|
||||
AST_APP_ARG(application);
|
||||
AST_APP_ARG(options);
|
||||
);
|
||||
|
||||
#define MAX_EIVR_APPLICATION_ARGS 32
|
||||
|
||||
AST_DECLARE_APP_ARGS(application_args,
|
||||
AST_APP_ARG(cmd)[32];
|
||||
AST_APP_ARG(cmd)[MAX_EIVR_APPLICATION_ARGS];
|
||||
);
|
||||
|
||||
u->abort_current_sound = 0;
|
||||
@@ -455,7 +461,7 @@ static int app_exec(struct ast_channel *chan, const char *data)
|
||||
|
||||
/* Put the application + the arguments in a , delimited list */
|
||||
ast_str_reset(comma_delim_args);
|
||||
for (j = 0; application_args.cmd[j] != NULL; j++) {
|
||||
for (j = 0; j < MAX_EIVR_APPLICATION_ARGS && application_args.cmd[j]; j++) {
|
||||
ast_str_append(&comma_delim_args, 0, "%s%s", j == 0 ? "" : ",", application_args.cmd[j]);
|
||||
}
|
||||
|
||||
@@ -834,7 +840,7 @@ static int eivr_comm(struct ast_channel *chan, struct ivr_localuser *u,
|
||||
}
|
||||
} else if (input[0] == EIVR_CMD_GET) {
|
||||
char response[2048];
|
||||
ast_verb(4, "Retriving Variables from channel: %s\n", &input[2]);
|
||||
ast_verb(4, "Retrieving Variables from channel: %s\n", &input[2]);
|
||||
ast_eivr_getvariable(chan, &input[2], response, sizeof(response));
|
||||
send_eivr_event(eivr_events, 'G', response, chan);
|
||||
} else if (input[0] == EIVR_CMD_SVAR) {
|
||||
@@ -844,7 +850,7 @@ static int eivr_comm(struct ast_channel *chan, struct ivr_localuser *u,
|
||||
ast_chan_log(LOG_NOTICE, chan, "Log message from EIVR: %s\n", &input[2]);
|
||||
} else if (input[0] == EIVR_CMD_XIT) {
|
||||
ast_chan_log(LOG_NOTICE, chan, "Exiting: %s\n", &input[2]);
|
||||
ast_chan_log(LOG_WARNING, chan, "e'X'it command is depricated, use 'E'xit instead\n");
|
||||
ast_chan_log(LOG_WARNING, chan, "e'X'it command is deprecated, use 'E'xit instead\n");
|
||||
res = 0;
|
||||
break;
|
||||
} else if (input[0] == EIVR_CMD_EXIT) {
|
||||
|
||||
@@ -69,6 +69,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="Festival" language="en_US">
|
||||
<since>
|
||||
<version>0.2.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Say text to the user.
|
||||
</synopsis>
|
||||
|
||||
@@ -44,6 +44,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="Flash" language="en_US">
|
||||
<since>
|
||||
<version>1.6.1.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Flashes a DAHDI Trunk.
|
||||
</synopsis>
|
||||
|
||||
@@ -68,6 +68,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="FollowMe" language="en_US">
|
||||
<since>
|
||||
<version>1.6.1.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Find-Me/Follow-Me application.
|
||||
</synopsis>
|
||||
|
||||
@@ -43,6 +43,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="ForkCDR" language="en_US">
|
||||
<since>
|
||||
<version>1.6.1.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Forks the current Call Data Record for this channel.
|
||||
</synopsis>
|
||||
|
||||
@@ -41,6 +41,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="GetCPEID" language="en_US">
|
||||
<since>
|
||||
<version>0.1.12</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Get ADSI CPE ID.
|
||||
</synopsis>
|
||||
|
||||
@@ -37,6 +37,10 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="If" language="en_US">
|
||||
<since>
|
||||
<version>18.16.0</version>
|
||||
<version>20.1.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Start an if branch.
|
||||
</synopsis>
|
||||
@@ -57,6 +61,10 @@
|
||||
</see-also>
|
||||
</application>
|
||||
<application name="ElseIf" language="en_US">
|
||||
<since>
|
||||
<version>18.16.0</version>
|
||||
<version>20.1.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Start an else if branch.
|
||||
</synopsis>
|
||||
@@ -78,6 +86,10 @@
|
||||
</see-also>
|
||||
</application>
|
||||
<application name="Else" language="en_US">
|
||||
<since>
|
||||
<version>18.16.0</version>
|
||||
<version>20.1.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Define an optional else branch.
|
||||
</synopsis>
|
||||
@@ -96,6 +108,10 @@
|
||||
</see-also>
|
||||
</application>
|
||||
<application name="EndIf" language="en_US">
|
||||
<since>
|
||||
<version>18.16.0</version>
|
||||
<version>20.1.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
End an if branch.
|
||||
</synopsis>
|
||||
@@ -111,6 +127,10 @@
|
||||
</see-also>
|
||||
</application>
|
||||
<application name="ExitIf" language="en_US">
|
||||
<since>
|
||||
<version>18.16.0</version>
|
||||
<version>20.1.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
End an If branch.
|
||||
</synopsis>
|
||||
|
||||
@@ -41,6 +41,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="IVRDemo" language="en_US">
|
||||
<since>
|
||||
<version>1.2.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
IVR Demo Application.
|
||||
</synopsis>
|
||||
|
||||
@@ -76,6 +76,9 @@
|
||||
" name. Use this option to specify a custom client name.\n"
|
||||
/*** DOCUMENTATION
|
||||
<application name="JACK" language="en_US">
|
||||
<since>
|
||||
<version>1.6.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Jack Audio Connection Kit
|
||||
</synopsis>
|
||||
@@ -607,7 +610,7 @@ static int queue_voice_frame(struct jack_data *jack_data, struct ast_frame *f)
|
||||
* \param[in] jack_data This is the jack_data struct that contains the input
|
||||
* ringbuffer that audio will be read from.
|
||||
* \param[out] out_frame If this argument is non-NULL, then assuming there is
|
||||
* enough data avilable in the ringbuffer, the audio in this frame
|
||||
* enough data available in the ringbuffer, the audio in this frame
|
||||
* will get replaced with audio from the input buffer. If there is
|
||||
* not enough data available to read at this time, then the frame
|
||||
* data gets zeroed out.
|
||||
|
||||
@@ -40,7 +40,6 @@
|
||||
<support_level>deprecated</support_level>
|
||||
<replacement>app_confbridge</replacement>
|
||||
<deprecated_in>19</deprecated_in>
|
||||
<removed_in>21</removed_in>
|
||||
***/
|
||||
|
||||
#include "asterisk.h"
|
||||
@@ -79,6 +78,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="MeetMe" language="en_US">
|
||||
<since>
|
||||
<version>0.1.12</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
MeetMe conference bridge.
|
||||
</synopsis>
|
||||
@@ -263,6 +265,9 @@
|
||||
</see-also>
|
||||
</application>
|
||||
<application name="MeetMeCount" language="en_US">
|
||||
<since>
|
||||
<version>0.1.12</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
MeetMe participant count.
|
||||
</synopsis>
|
||||
@@ -284,6 +289,9 @@
|
||||
</see-also>
|
||||
</application>
|
||||
<application name="MeetMeAdmin" language="en_US">
|
||||
<since>
|
||||
<version>1.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
MeetMe conference administration.
|
||||
</synopsis>
|
||||
@@ -381,6 +389,9 @@
|
||||
</see-also>
|
||||
</application>
|
||||
<application name="MeetMeChannelAdmin" language="en_US">
|
||||
<since>
|
||||
<version>1.6.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
MeetMe conference Administration (channel specific).
|
||||
</synopsis>
|
||||
@@ -406,6 +417,9 @@
|
||||
</description>
|
||||
</application>
|
||||
<function name="MEETME_INFO" language="en_US">
|
||||
<since>
|
||||
<version>1.6.1.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Query a given conference of various properties.
|
||||
</synopsis>
|
||||
@@ -440,6 +454,9 @@
|
||||
</see-also>
|
||||
</function>
|
||||
<manager name="MeetmeMute" language="en_US">
|
||||
<since>
|
||||
<version>1.4.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Mute a Meetme user.
|
||||
</synopsis>
|
||||
@@ -452,6 +469,9 @@
|
||||
</description>
|
||||
</manager>
|
||||
<manager name="MeetmeUnmute" language="en_US">
|
||||
<since>
|
||||
<version>1.4.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Unmute a Meetme user.
|
||||
</synopsis>
|
||||
@@ -464,6 +484,9 @@
|
||||
</description>
|
||||
</manager>
|
||||
<manager name="MeetmeList" language="en_US">
|
||||
<since>
|
||||
<version>1.6.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
List participants in a conference.
|
||||
</synopsis>
|
||||
@@ -480,6 +503,9 @@
|
||||
</description>
|
||||
</manager>
|
||||
<manager name="MeetmeListRooms" language="en_US">
|
||||
<since>
|
||||
<version>10.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
List active conferences.
|
||||
</synopsis>
|
||||
@@ -494,6 +520,9 @@
|
||||
</manager>
|
||||
<managerEvent language="en_US" name="MeetmeJoin">
|
||||
<managerEventInstance class="EVENT_FLAG_CALL">
|
||||
<since>
|
||||
<version>12.0.0</version>
|
||||
</since>
|
||||
<synopsis>Raised when a user joins a MeetMe conference.</synopsis>
|
||||
<syntax>
|
||||
<parameter name="Meetme">
|
||||
@@ -512,6 +541,9 @@
|
||||
</managerEvent>
|
||||
<managerEvent language="en_US" name="MeetmeLeave">
|
||||
<managerEventInstance class="EVENT_FLAG_CALL">
|
||||
<since>
|
||||
<version>12.0.0</version>
|
||||
</since>
|
||||
<synopsis>Raised when a user leaves a MeetMe conference.</synopsis>
|
||||
<syntax>
|
||||
<xi:include xpointer="xpointer(/docs/managerEvent[@name='MeetmeJoin']/managerEventInstance/syntax/parameter)" />
|
||||
@@ -527,6 +559,9 @@
|
||||
</managerEvent>
|
||||
<managerEvent language="en_US" name="MeetmeEnd">
|
||||
<managerEventInstance class="EVENT_FLAG_CALL">
|
||||
<since>
|
||||
<version>12.0.0</version>
|
||||
</since>
|
||||
<synopsis>Raised when a MeetMe conference ends.</synopsis>
|
||||
<syntax>
|
||||
<xi:include xpointer="xpointer(/docs/managerEvent[@name='MeetmeJoin']/managerEventInstance/syntax/parameter[@name='Meetme'])" />
|
||||
@@ -538,6 +573,9 @@
|
||||
</managerEvent>
|
||||
<managerEvent language="en_US" name="MeetmeTalkRequest">
|
||||
<managerEventInstance class="EVENT_FLAG_CALL">
|
||||
<since>
|
||||
<version>12.0.0</version>
|
||||
</since>
|
||||
<synopsis>Raised when a MeetMe user has started talking.</synopsis>
|
||||
<syntax>
|
||||
<xi:include xpointer="xpointer(/docs/managerEvent[@name='MeetmeJoin']/managerEventInstance/syntax/parameter)" />
|
||||
@@ -556,6 +594,9 @@
|
||||
</managerEvent>
|
||||
<managerEvent language="en_US" name="MeetmeTalking">
|
||||
<managerEventInstance class="EVENT_FLAG_CALL">
|
||||
<since>
|
||||
<version>12.0.0</version>
|
||||
</since>
|
||||
<synopsis>Raised when a MeetMe user begins or ends talking.</synopsis>
|
||||
<syntax>
|
||||
<xi:include xpointer="xpointer(/docs/managerEvent[@name='MeetmeJoin']/managerEventInstance/syntax/parameter)" />
|
||||
@@ -566,6 +607,9 @@
|
||||
</managerEvent>
|
||||
<managerEvent language="en_US" name="MeetmeMute">
|
||||
<managerEventInstance class="EVENT_FLAG_CALL">
|
||||
<since>
|
||||
<version>12.0.0</version>
|
||||
</since>
|
||||
<synopsis>Raised when a MeetMe user is muted or unmuted.</synopsis>
|
||||
<syntax>
|
||||
<xi:include xpointer="xpointer(/docs/managerEvent[@name='MeetmeJoin']/managerEventInstance/syntax/parameter)" />
|
||||
@@ -576,6 +620,11 @@
|
||||
</managerEvent>
|
||||
<managerEvent language="en_US" name="MeetmeList">
|
||||
<managerEventInstance class="EVENT_FLAG_CALL">
|
||||
<since>
|
||||
<version>16.29.0</version>
|
||||
<version>18.15.0</version>
|
||||
<version>19.7.0</version>
|
||||
</since>
|
||||
<synopsis>Raised in response to a MeetmeList command.</synopsis>
|
||||
<syntax>
|
||||
<parameter name="Conference">
|
||||
@@ -623,6 +672,11 @@
|
||||
</managerEvent>
|
||||
<managerEvent language="en_US" name="MeetmeListRooms">
|
||||
<managerEventInstance class="EVENT_FLAG_CALL">
|
||||
<since>
|
||||
<version>16.29.0</version>
|
||||
<version>18.15.0</version>
|
||||
<version>19.7.0</version>
|
||||
</since>
|
||||
<synopsis>Raised in response to a MeetmeListRooms command.</synopsis>
|
||||
<syntax>
|
||||
<parameter name="Conference">
|
||||
@@ -638,7 +692,7 @@
|
||||
<para>Total duration of conference in HH:MM:SS format.</para>
|
||||
</parameter>
|
||||
<parameter name="Creation">
|
||||
<para>How the conference was created: "Dyanmic" or "Static".</para>
|
||||
<para>How the conference was created: "Dynamic" or "Static".</para>
|
||||
</parameter>
|
||||
<parameter name="Locked">
|
||||
<para>Whether or not the conference is locked.</para>
|
||||
|
||||
@@ -43,9 +43,8 @@
|
||||
/*** DOCUMENTATION
|
||||
<application name="ReceiveMF" language="en_US">
|
||||
<since>
|
||||
<version>16.21.0</version>
|
||||
<version>18.7.0</version>
|
||||
<version>19.0.0</version>
|
||||
<version>16.24.0</version>
|
||||
<version>18.10.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Detects MF digits on a channel and saves them to a variable.
|
||||
@@ -121,7 +120,6 @@
|
||||
<since>
|
||||
<version>16.21.0</version>
|
||||
<version>18.7.0</version>
|
||||
<version>19.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Sends arbitrary MF digits on the current or specified channel.
|
||||
|
||||
@@ -39,6 +39,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="Milliwatt" language="en_US">
|
||||
<since>
|
||||
<version>0.1.12</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Generates a 1004 Hz test tone at 0dbm (mu-law).
|
||||
</synopsis>
|
||||
|
||||
@@ -183,6 +183,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="MinivmRecord" language="en_US">
|
||||
<since>
|
||||
<version>1.6.1.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Receive Mini-Voicemail and forward via e-mail.
|
||||
</synopsis>
|
||||
@@ -233,6 +236,9 @@
|
||||
</description>
|
||||
</application>
|
||||
<application name="MinivmGreet" language="en_US">
|
||||
<since>
|
||||
<version>1.6.1.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Play Mini-Voicemail prompts.
|
||||
</synopsis>
|
||||
@@ -262,7 +268,7 @@
|
||||
<description>
|
||||
<para>This application is part of the Mini-Voicemail system, configured in minivm.conf.</para>
|
||||
<para>MinivmGreet() plays default prompts or user specific prompts for an account.</para>
|
||||
<para>Busy and unavailable messages can be choosen, but will be overridden if a temporary
|
||||
<para>Busy and unavailable messages can be chosen, but will be overridden if a temporary
|
||||
message exists for the account.</para>
|
||||
<variablelist>
|
||||
<variable name="MVM_GREET_STATUS">
|
||||
@@ -275,6 +281,9 @@
|
||||
</description>
|
||||
</application>
|
||||
<application name="MinivmNotify" language="en_US">
|
||||
<since>
|
||||
<version>1.6.1.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Notify voicemail owner about new messages.
|
||||
</synopsis>
|
||||
@@ -314,6 +323,9 @@
|
||||
</description>
|
||||
</application>
|
||||
<application name="MinivmDelete" language="en_US">
|
||||
<since>
|
||||
<version>1.6.1.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Delete Mini-Voicemail voicemail messages.
|
||||
</synopsis>
|
||||
@@ -336,6 +348,9 @@
|
||||
</application>
|
||||
|
||||
<application name="MinivmAccMess" language="en_US">
|
||||
<since>
|
||||
<version>1.6.1.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Record account specific messages.
|
||||
</synopsis>
|
||||
@@ -381,6 +396,9 @@
|
||||
</description>
|
||||
</application>
|
||||
<application name="MinivmMWI" language="en_US">
|
||||
<since>
|
||||
<version>1.6.1.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Send Message Waiting Notification to subscriber(s) of mailbox.
|
||||
</synopsis>
|
||||
@@ -410,6 +428,9 @@
|
||||
</description>
|
||||
</application>
|
||||
<function name="MINIVMCOUNTER" language="en_US">
|
||||
<since>
|
||||
<version>1.6.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Reads or sets counters for MiniVoicemail message.
|
||||
</synopsis>
|
||||
@@ -444,6 +465,9 @@
|
||||
</see-also>
|
||||
</function>
|
||||
<function name="MINIVMACCOUNT" language="en_US">
|
||||
<since>
|
||||
<version>1.6.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Gets MiniVoicemail account information.
|
||||
</synopsis>
|
||||
@@ -503,6 +527,9 @@
|
||||
</function>
|
||||
<managerEvent language="en_US" name="MiniVoiceMail">
|
||||
<managerEventInstance class="EVENT_FLAG_CALL">
|
||||
<since>
|
||||
<version>12.0.0</version>
|
||||
</since>
|
||||
<synopsis>Raised when a notification is sent out by a MiniVoiceMail application</synopsis>
|
||||
<syntax>
|
||||
<channel_snapshot/>
|
||||
@@ -1071,7 +1098,7 @@ static const char *ast_str_encode_mime(struct ast_str **end, ssize_t maxlen, con
|
||||
}
|
||||
|
||||
/*!\internal
|
||||
* \brief Wraps a character sequence in double quotes, escaping occurences of quotes within the string.
|
||||
* \brief Wraps a character sequence in double quotes, escaping occurrences of quotes within the string.
|
||||
* \param from The string to work with.
|
||||
* \param buf The destination buffer to write the modified quoted string.
|
||||
* \param maxlen Always zero. \see ast_str
|
||||
@@ -1961,7 +1988,7 @@ static void queue_mwi_event(const char *channel_id, const char *mbx, const char
|
||||
}
|
||||
|
||||
/*!\internal
|
||||
* \brief Send MWI using interal Asterisk event subsystem */
|
||||
* \brief Send MWI using internal Asterisk event subsystem */
|
||||
static int minivm_mwi_exec(struct ast_channel *chan, const char *data)
|
||||
{
|
||||
int argc;
|
||||
@@ -3398,7 +3425,7 @@ static int reload(void)
|
||||
return(load_config(1));
|
||||
}
|
||||
|
||||
/*! \brief Reload cofiguration */
|
||||
/*! \brief Reload configuration */
|
||||
static char *handle_minivm_reload(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
|
||||
{
|
||||
|
||||
|
||||
@@ -63,6 +63,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="MixMonitor" language="en_US">
|
||||
<since>
|
||||
<version>1.2.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Record a call and mix the audio during the recording. Use of StopMixMonitor is required
|
||||
to guarantee the audio file is available for processing during dialplan execution.
|
||||
@@ -127,6 +130,13 @@
|
||||
Like with the basic filename argument, if an absolute path isn't given, it will create
|
||||
the file in the configured monitoring directory.</para>
|
||||
</option>
|
||||
<option name="D">
|
||||
<para>Interleave the audio coming from the channel and the audio
|
||||
going to the channel and output it as a 2 channel (stereo)
|
||||
raw stream rather than mixing it. You must use the
|
||||
<literal>.raw</literal> file extension. Any other extension
|
||||
will produce a corrupted file.</para>
|
||||
</option>
|
||||
<option name="n">
|
||||
<para>When the <replaceable>r</replaceable> or <replaceable>t</replaceable> option is
|
||||
used, MixMonitor will insert silence into the specified files to maintain
|
||||
@@ -163,7 +173,7 @@
|
||||
</syntax>
|
||||
<description>
|
||||
<para>Records the audio on the current channel to the specified file.</para>
|
||||
<para>This application does not automatically answer and should be preceeded by
|
||||
<para>This application does not automatically answer and should be preceded by
|
||||
an application such as Answer or Progress().</para>
|
||||
<note><para>MixMonitor runs as an audiohook.</para></note>
|
||||
<note><para>If a filename passed to MixMonitor ends with
|
||||
@@ -181,12 +191,18 @@
|
||||
parameters. You risk a command injection attack executing arbitrary commands
|
||||
if the untrusted strings aren't filtered to remove dangerous characters. See
|
||||
function <variable>FILTER()</variable>.</para></warning>
|
||||
<warning><para>When using the <literal>D</literal> option to save
|
||||
interleaved audio, you MUST use <literal>.raw</literal> as the
|
||||
file extension. Any other extension will produce a corrupted file.</para></warning>
|
||||
</description>
|
||||
<see-also>
|
||||
<ref type="application">StopMixMonitor</ref>
|
||||
</see-also>
|
||||
</application>
|
||||
<application name="StopMixMonitor" language="en_US">
|
||||
<since>
|
||||
<version>1.4.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Stop recording a call through MixMonitor, and free the recording's file handle.
|
||||
</synopsis>
|
||||
@@ -205,6 +221,9 @@
|
||||
</see-also>
|
||||
</application>
|
||||
<manager name="MixMonitorMute" language="en_US">
|
||||
<since>
|
||||
<version>1.8.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Mute / unMute a Mixmonitor recording.
|
||||
</synopsis>
|
||||
@@ -225,6 +244,9 @@
|
||||
</description>
|
||||
</manager>
|
||||
<manager name="MixMonitor" language="en_US">
|
||||
<since>
|
||||
<version>11.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Record a call and mix the audio during the recording. Use of StopMixMonitor is required
|
||||
to guarantee the audio file is available for processing during dialplan execution.
|
||||
@@ -242,7 +264,7 @@
|
||||
neither MIXMONITOR_FILENAME or this parameter is set, the mixed stream won't
|
||||
be recorded.</para>
|
||||
</parameter>
|
||||
<parameter name="options">
|
||||
<parameter name="Options">
|
||||
<para>Options that apply to the MixMonitor in the same way as they
|
||||
would apply if invoked from the MixMonitor application. For a list of
|
||||
available options, see the documentation for the mixmonitor application. </para>
|
||||
@@ -268,6 +290,9 @@
|
||||
</description>
|
||||
</manager>
|
||||
<manager name="StopMixMonitor" language="en_US">
|
||||
<since>
|
||||
<version>11.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Stop recording a call through MixMonitor, and free the recording's file handle.
|
||||
</synopsis>
|
||||
@@ -287,6 +312,9 @@
|
||||
</description>
|
||||
</manager>
|
||||
<function name="MIXMONITOR" language="en_US">
|
||||
<since>
|
||||
<version>13.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Retrieve data pertaining to specific instances of MixMonitor on a channel.
|
||||
</synopsis>
|
||||
@@ -305,6 +333,10 @@
|
||||
</function>
|
||||
<managerEvent language="en_US" name="MixMonitorStart">
|
||||
<managerEventInstance class="EVENT_FLAG_CALL">
|
||||
<since>
|
||||
<version>16.17.0</version>
|
||||
<version>18.3.0</version>
|
||||
</since>
|
||||
<synopsis>Raised when monitoring has started on a channel.</synopsis>
|
||||
<syntax>
|
||||
<channel_snapshot/>
|
||||
@@ -318,6 +350,10 @@
|
||||
</managerEvent>
|
||||
<managerEvent language="en_US" name="MixMonitorStop">
|
||||
<managerEventInstance class="EVENT_FLAG_CALL">
|
||||
<since>
|
||||
<version>16.17.0</version>
|
||||
<version>18.3.0</version>
|
||||
</since>
|
||||
<synopsis>Raised when monitoring has stopped on a channel.</synopsis>
|
||||
<syntax>
|
||||
<channel_snapshot/>
|
||||
@@ -331,6 +367,10 @@
|
||||
</managerEvent>
|
||||
<managerEvent language="en_US" name="MixMonitorMute">
|
||||
<managerEventInstance class="EVENT_FLAG_CALL">
|
||||
<since>
|
||||
<version>16.17.0</version>
|
||||
<version>18.3.0</version>
|
||||
</since>
|
||||
<synopsis>Raised when monitoring is muted or unmuted on a channel.</synopsis>
|
||||
<syntax>
|
||||
<channel_snapshot/>
|
||||
@@ -414,6 +454,7 @@ enum mixmonitor_flags {
|
||||
MUXFLAG_NO_RWSYNC = (1 << 15),
|
||||
MUXFLAG_AUTO_DELETE = (1 << 16),
|
||||
MUXFLAG_REAL_CALLERID = (1 << 17),
|
||||
MUXFLAG_INTERLEAVED = (1 << 18),
|
||||
};
|
||||
|
||||
enum mixmonitor_args {
|
||||
@@ -443,6 +484,7 @@ AST_APP_OPTIONS(mixmonitor_opts, {
|
||||
AST_APP_OPTION_ARG('W', MUXFLAG_VOLUME, OPT_ARG_VOLUME),
|
||||
AST_APP_OPTION_ARG('r', MUXFLAG_READ, OPT_ARG_READNAME),
|
||||
AST_APP_OPTION_ARG('t', MUXFLAG_WRITE, OPT_ARG_WRITENAME),
|
||||
AST_APP_OPTION('D', MUXFLAG_INTERLEAVED),
|
||||
AST_APP_OPTION_ARG('i', MUXFLAG_UID, OPT_ARG_UID),
|
||||
AST_APP_OPTION_ARG('m', MUXFLAG_VMRECIPIENTS, OPT_ARG_VMRECIPIENTS),
|
||||
AST_APP_OPTION_ARG('S', MUXFLAG_DEPRECATED_RWSYNC, OPT_ARG_DEPRECATED_RWSYNC),
|
||||
@@ -792,6 +834,46 @@ static void *mixmonitor_thread(void *obj)
|
||||
}
|
||||
}
|
||||
|
||||
if (ast_test_flag(mixmonitor, MUXFLAG_INTERLEAVED)) {
|
||||
/* The 'D' option is set, so mix the frame as an interleaved dual channel frame */
|
||||
int i;
|
||||
short read_buf[SAMPLES_PER_FRAME];
|
||||
short write_buf[SAMPLES_PER_FRAME];
|
||||
short stereo_buf[SAMPLES_PER_FRAME * 2];
|
||||
struct ast_frame stereo_frame = {
|
||||
.frametype = AST_FRAME_VOICE,
|
||||
.datalen = sizeof(stereo_buf),
|
||||
.samples = SAMPLES_PER_FRAME,
|
||||
};
|
||||
|
||||
if (fr) {
|
||||
ast_frame_free(fr, 0);
|
||||
fr = NULL;
|
||||
}
|
||||
|
||||
if (fr_read) {
|
||||
memcpy(read_buf, fr_read->data.ptr, sizeof(read_buf));
|
||||
} else {
|
||||
memset(read_buf, 0, sizeof(read_buf));
|
||||
}
|
||||
|
||||
if (fr_write) {
|
||||
memcpy(write_buf, fr_write->data.ptr, sizeof(write_buf));
|
||||
} else {
|
||||
memset(write_buf, 0, sizeof(write_buf));
|
||||
}
|
||||
|
||||
for (i = 0; i < SAMPLES_PER_FRAME; i++) {
|
||||
stereo_buf[i * 2] = read_buf[i];
|
||||
stereo_buf[i * 2 + 1] = write_buf[i];
|
||||
}
|
||||
|
||||
stereo_frame.data.ptr = stereo_buf;
|
||||
stereo_frame.subclass.format = ast_format_cache_get_slin_by_rate(SAMPLES_PER_FRAME);
|
||||
|
||||
fr = ast_frdup(&stereo_frame);
|
||||
}
|
||||
|
||||
if ((*fs) && (fr)) {
|
||||
struct ast_frame *cur;
|
||||
|
||||
|
||||
@@ -41,6 +41,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="Morsecode" language="en_US">
|
||||
<since>
|
||||
<version>1.4.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Plays morse code.
|
||||
</synopsis>
|
||||
@@ -51,7 +54,7 @@
|
||||
</syntax>
|
||||
<description>
|
||||
<para>Plays the Morse code equivalent of the passed string.</para>
|
||||
<para>This application does not automatically answer and should be preceeded by
|
||||
<para>This application does not automatically answer and should be preceded by
|
||||
an application such as Answer() or Progress().</para>
|
||||
<para>This application uses the following variables:</para>
|
||||
<variablelist>
|
||||
|
||||
@@ -53,6 +53,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="MP3Player" language="en_US">
|
||||
<since>
|
||||
<version>0.1.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Play an MP3 file or M3U playlist file or stream.
|
||||
</synopsis>
|
||||
@@ -71,7 +74,7 @@
|
||||
<example title="Play an MP3 playlist">
|
||||
exten => 1234,1,MP3Player(/var/lib/asterisk/playlist.m3u)
|
||||
</example>
|
||||
<para>This application does not automatically answer and should be preceeded by an
|
||||
<para>This application does not automatically answer and should be preceded by an
|
||||
application such as Answer() or Progress().</para>
|
||||
</description>
|
||||
</application>
|
||||
|
||||
@@ -46,6 +46,9 @@ static const char app_originate[] = "Originate";
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="Originate" language="en_US">
|
||||
<since>
|
||||
<version>1.6.1.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Originate a call.
|
||||
</synopsis>
|
||||
|
||||
@@ -44,6 +44,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="Page" language="en_US">
|
||||
<since>
|
||||
<version>1.2.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Page series of phones
|
||||
</synopsis>
|
||||
|
||||
@@ -43,6 +43,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="Playback" language="en_US">
|
||||
<since>
|
||||
<version>0.1.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Play a file.
|
||||
</synopsis>
|
||||
@@ -94,7 +97,7 @@
|
||||
<para>WaitExten (application) -- wait for digits from caller, optionally play music on hold</para>
|
||||
</description>
|
||||
<see-also>
|
||||
<ref type="application">Background</ref>
|
||||
<ref type="application">BackGround</ref>
|
||||
<ref type="application">WaitExten</ref>
|
||||
<ref type="application">ControlPlayback</ref>
|
||||
<ref type="agi">stream file</ref>
|
||||
|
||||
@@ -41,6 +41,9 @@ static const char stopplaytones_app[] = "StopPlayTones";
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="PlayTones" language="en_US">
|
||||
<since>
|
||||
<version>1.6.1.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Play a tone list.
|
||||
</synopsis>
|
||||
@@ -61,6 +64,9 @@ static const char stopplaytones_app[] = "StopPlayTones";
|
||||
</see-also>
|
||||
</application>
|
||||
<application name="StopPlayTones" language="en_US">
|
||||
<since>
|
||||
<version>1.6.1.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Stop playing a tone list.
|
||||
</synopsis>
|
||||
|
||||
@@ -44,6 +44,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="PrivacyManager" language="en_US">
|
||||
<since>
|
||||
<version>0.4.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Require phone number to be entered, if no CallerID sent
|
||||
</synopsis>
|
||||
|
||||
370
apps/app_queue.c
370
apps/app_queue.c
@@ -123,6 +123,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="Queue" language="en_US">
|
||||
<since>
|
||||
<version>0.2.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Queue a call for a call queue.
|
||||
</synopsis>
|
||||
@@ -171,7 +174,7 @@
|
||||
to the specified destination and <emphasis>start</emphasis> execution at that location.</para>
|
||||
<para>NOTE: Any channel variables you want the called channel to inherit from the caller channel must be
|
||||
prefixed with one or two underbars ('_').</para>
|
||||
<para>NOTE: Using this option from a GoSub() might not make sense as there would be no return points.</para>
|
||||
<para>NOTE: Using this option from a Gosub() might not make sense as there would be no return points.</para>
|
||||
</option>
|
||||
<option name="h">
|
||||
<para>Allow <emphasis>callee</emphasis> to hang up by pressing <literal>*</literal>.</para>
|
||||
@@ -256,6 +259,10 @@
|
||||
<para>Will run a gosub on the called party's channel (the queue member)
|
||||
once the parties are connected. The subroutine execution starts in the
|
||||
named context at the s exten and priority 1.</para>
|
||||
<note><para>Macro was removed in Asterisk 21 which resulted in an
|
||||
argument ordering change. The upgrade notice was missed for this,
|
||||
so a note is being made here to provide a record of the change
|
||||
for users who have not upgraded yet.</para></note>
|
||||
</parameter>
|
||||
<parameter name="rule">
|
||||
<para>Will cause the queue's defaultrule to be overridden by the rule specified.</para>
|
||||
@@ -271,7 +278,7 @@
|
||||
up by another user.</para>
|
||||
<para>This application will return to the dialplan if the queue does not exist, or
|
||||
any of the join options cause the caller to not enter the queue.</para>
|
||||
<para>This application does not automatically answer and should be preceeded
|
||||
<para>This application does not automatically answer and should be preceded
|
||||
by an application such as Answer(), Progress(), or Ringing().</para>
|
||||
<para>This application sets the following channel variables upon completion:</para>
|
||||
<variablelist>
|
||||
@@ -316,6 +323,9 @@
|
||||
</see-also>
|
||||
</application>
|
||||
<application name="AddQueueMember" language="en_US">
|
||||
<since>
|
||||
<version>0.5.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Dynamically adds queue members.
|
||||
</synopsis>
|
||||
@@ -323,7 +333,17 @@
|
||||
<parameter name="queuename" required="true" />
|
||||
<parameter name="interface" />
|
||||
<parameter name="penalty" />
|
||||
<parameter name="options" />
|
||||
<parameter name="options">
|
||||
<optionlist>
|
||||
<option name="p">
|
||||
<para>Add queue member in paused state.</para>
|
||||
</option>
|
||||
<option name="r">
|
||||
<argument name="reason" required="true" />
|
||||
<para>Specify a reason why the member is in paused state.</para>
|
||||
</option>
|
||||
</optionlist>
|
||||
</parameter>
|
||||
<parameter name="membername" />
|
||||
<parameter name="stateinterface" />
|
||||
<parameter name="wrapuptime" />
|
||||
@@ -359,6 +379,9 @@
|
||||
</see-also>
|
||||
</application>
|
||||
<application name="RemoveQueueMember" language="en_US">
|
||||
<since>
|
||||
<version>0.5.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Dynamically removes queue members.
|
||||
</synopsis>
|
||||
@@ -399,6 +422,9 @@
|
||||
</see-also>
|
||||
</application>
|
||||
<application name="PauseQueueMember" language="en_US">
|
||||
<since>
|
||||
<version>1.2.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Pauses a queue member.
|
||||
</synopsis>
|
||||
@@ -446,6 +472,9 @@
|
||||
</see-also>
|
||||
</application>
|
||||
<application name="UnpauseQueueMember" language="en_US">
|
||||
<since>
|
||||
<version>1.2.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Unpauses a queue member.
|
||||
</synopsis>
|
||||
@@ -490,6 +519,9 @@
|
||||
</see-also>
|
||||
</application>
|
||||
<application name="QueueLog" language="en_US">
|
||||
<since>
|
||||
<version>1.4.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Writes to the queue_log file.
|
||||
</synopsis>
|
||||
@@ -524,6 +556,9 @@
|
||||
</see-also>
|
||||
</application>
|
||||
<application name="QueueUpdate" language="en_US">
|
||||
<since>
|
||||
<version>15.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Writes to the queue_log file for outbound calls and updates Realtime Data.
|
||||
Is used at h extension to be able to have all the parameters.
|
||||
@@ -544,6 +579,9 @@
|
||||
</description>
|
||||
</application>
|
||||
<function name="QUEUE_VARIABLES" language="en_US">
|
||||
<since>
|
||||
<version>1.6.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Return Queue information in variables.
|
||||
</synopsis>
|
||||
@@ -551,7 +589,7 @@
|
||||
<parameter name="queuename" required="true">
|
||||
<enumlist>
|
||||
<enum name="QUEUEMAX">
|
||||
<para>Maxmimum number of calls allowed.</para>
|
||||
<para>Maximum number of calls allowed.</para>
|
||||
</enum>
|
||||
<enum name="QUEUESTRATEGY">
|
||||
<para>The strategy of the queue.</para>
|
||||
@@ -599,6 +637,9 @@
|
||||
</see-also>
|
||||
</function>
|
||||
<function name="QUEUE_MEMBER" language="en_US">
|
||||
<since>
|
||||
<version>1.6.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Provides a count of queue members based on the provided criteria, or updates a
|
||||
queue member's settings.
|
||||
@@ -664,6 +705,9 @@
|
||||
</see-also>
|
||||
</function>
|
||||
<function name="QUEUE_MEMBER_COUNT" language="en_US">
|
||||
<since>
|
||||
<version>1.4.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Count number of members answering a queue.
|
||||
</synopsis>
|
||||
@@ -692,6 +736,9 @@
|
||||
</see-also>
|
||||
</function>
|
||||
<function name="QUEUE_EXISTS" language="en_US">
|
||||
<since>
|
||||
<version>1.8.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Check if a named queue exists on this server
|
||||
</synopsis>
|
||||
@@ -719,6 +766,9 @@
|
||||
</see-also>
|
||||
</function>
|
||||
<function name="QUEUE_GET_CHANNEL" language="en_US">
|
||||
<since>
|
||||
<version>14.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Return caller at the specified position in a queue.
|
||||
</synopsis>
|
||||
@@ -747,6 +797,9 @@
|
||||
</see-also>
|
||||
</function>
|
||||
<function name="QUEUE_WAITING_COUNT" language="en_US">
|
||||
<since>
|
||||
<version>1.4.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Count number of calls currently waiting in a queue.
|
||||
</synopsis>
|
||||
@@ -774,6 +827,9 @@
|
||||
</see-also>
|
||||
</function>
|
||||
<function name="QUEUE_MEMBER_LIST" language="en_US">
|
||||
<since>
|
||||
<version>1.4.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Returns a list of interfaces on a queue.
|
||||
</synopsis>
|
||||
@@ -801,6 +857,9 @@
|
||||
</see-also>
|
||||
</function>
|
||||
<function name="QUEUE_MEMBER_PENALTY" language="en_US">
|
||||
<since>
|
||||
<version>1.6.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Gets or sets queue members penalty.
|
||||
</synopsis>
|
||||
@@ -830,6 +889,9 @@
|
||||
</see-also>
|
||||
</function>
|
||||
<manager name="QueueStatus" language="en_US">
|
||||
<since>
|
||||
<version>0.5.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Show queue status.
|
||||
</synopsis>
|
||||
@@ -847,6 +909,9 @@
|
||||
</description>
|
||||
</manager>
|
||||
<manager name="QueueSummary" language="en_US">
|
||||
<since>
|
||||
<version>1.6.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Show queue summary.
|
||||
</synopsis>
|
||||
@@ -861,6 +926,9 @@
|
||||
</description>
|
||||
</manager>
|
||||
<manager name="QueueAdd" language="en_US">
|
||||
<since>
|
||||
<version>1.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Add interface to queue.
|
||||
</synopsis>
|
||||
@@ -878,6 +946,9 @@
|
||||
<parameter name="Paused">
|
||||
<para>To pause or not the member initially (true/false or 1/0).</para>
|
||||
</parameter>
|
||||
<parameter name="Reason" required="false">
|
||||
<para>Text description why the member is paused.</para>
|
||||
</parameter>
|
||||
<parameter name="MemberName">
|
||||
<para>Text alias for the interface.</para>
|
||||
</parameter>
|
||||
@@ -887,6 +958,9 @@
|
||||
</description>
|
||||
</manager>
|
||||
<manager name="QueueRemove" language="en_US">
|
||||
<since>
|
||||
<version>1.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Remove interface from queue.
|
||||
</synopsis>
|
||||
@@ -903,6 +977,9 @@
|
||||
</description>
|
||||
</manager>
|
||||
<manager name="QueuePause" language="en_US">
|
||||
<since>
|
||||
<version>1.2.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Makes a queue member temporarily unavailable.
|
||||
</synopsis>
|
||||
@@ -914,10 +991,10 @@
|
||||
<parameter name="Paused" required="true">
|
||||
<para>Pause or unpause the interface. Set to 'true' to pause the member or 'false' to unpause.</para>
|
||||
</parameter>
|
||||
<parameter name="Queue">
|
||||
<parameter name="Queue" required="false">
|
||||
<para>The name of the queue in which to pause or unpause this member. If not specified, the member will be paused or unpaused in all the queues it is a member of.</para>
|
||||
</parameter>
|
||||
<parameter name="Reason">
|
||||
<parameter name="Reason" required="false">
|
||||
<para>Text description, returned in the event QueueMemberPaused.</para>
|
||||
</parameter>
|
||||
</syntax>
|
||||
@@ -926,6 +1003,9 @@
|
||||
</description>
|
||||
</manager>
|
||||
<manager name="QueueLog" language="en_US">
|
||||
<since>
|
||||
<version>1.6.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Adds custom entry in queue_log.
|
||||
</synopsis>
|
||||
@@ -941,6 +1021,9 @@
|
||||
</description>
|
||||
</manager>
|
||||
<manager name="QueuePenalty" language="en_US">
|
||||
<since>
|
||||
<version>1.6.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Set the penalty for a queue member.
|
||||
</synopsis>
|
||||
@@ -961,6 +1044,9 @@
|
||||
</description>
|
||||
</manager>
|
||||
<manager name="QueueMemberRingInUse" language="en_US">
|
||||
<since>
|
||||
<version>11.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Set the ringinuse value for a queue member.
|
||||
</synopsis>
|
||||
@@ -974,6 +1060,9 @@
|
||||
</description>
|
||||
</manager>
|
||||
<manager name="QueueRule" language="en_US">
|
||||
<since>
|
||||
<version>1.6.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Queue Rules.
|
||||
</synopsis>
|
||||
@@ -988,6 +1077,9 @@
|
||||
</description>
|
||||
</manager>
|
||||
<manager name="QueueReload" language="en_US">
|
||||
<since>
|
||||
<version>1.6.2.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Reload a queue, queues, or any sub-section of a queue or queues.
|
||||
</synopsis>
|
||||
@@ -1022,6 +1114,9 @@
|
||||
</description>
|
||||
</manager>
|
||||
<manager name="QueueReset" language="en_US">
|
||||
<since>
|
||||
<version>1.6.2.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Reset queue statistics.
|
||||
</synopsis>
|
||||
@@ -1036,6 +1131,9 @@
|
||||
</description>
|
||||
</manager>
|
||||
<manager name="QueueChangePriorityCaller" language="en_US">
|
||||
<since>
|
||||
<version>15.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Change priority of a caller on queue.
|
||||
</synopsis>
|
||||
@@ -1059,6 +1157,11 @@
|
||||
</description>
|
||||
</manager>
|
||||
<manager name="QueueWithdrawCaller" language="en_US">
|
||||
<since>
|
||||
<version>19.3.0</version>
|
||||
<version>18.11.0</version>
|
||||
<version>16.25.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Request to withdraw a caller from the queue back to the dialplan.
|
||||
</synopsis>
|
||||
@@ -1080,6 +1183,11 @@
|
||||
|
||||
<managerEvent language="en_US" name="QueueParams">
|
||||
<managerEventInstance class="EVENT_FLAG_AGENT">
|
||||
<since>
|
||||
<version>16.24.0</version>
|
||||
<version>18.10.0</version>
|
||||
<version>19.2.0</version>
|
||||
</since>
|
||||
<synopsis>Raised in response to the QueueStatus action.</synopsis>
|
||||
<syntax>
|
||||
<parameter name="Max">
|
||||
@@ -1118,6 +1226,11 @@
|
||||
</managerEvent>
|
||||
<managerEvent language="en_US" name="QueueEntry">
|
||||
<managerEventInstance class="EVENT_FLAG_AGENT">
|
||||
<since>
|
||||
<version>16.24.0</version>
|
||||
<version>18.10.0</version>
|
||||
<version>19.2.0</version>
|
||||
</since>
|
||||
<synopsis>Raised in response to the QueueStatus action.</synopsis>
|
||||
<syntax>
|
||||
<parameter name="Queue">
|
||||
@@ -1159,6 +1272,9 @@
|
||||
</managerEvent>
|
||||
<managerEvent language="en_US" name="QueueMemberStatus">
|
||||
<managerEventInstance class="EVENT_FLAG_AGENT">
|
||||
<since>
|
||||
<version>12.0.0</version>
|
||||
</since>
|
||||
<synopsis>Raised when a Queue member's status has changed.</synopsis>
|
||||
<syntax>
|
||||
<parameter name="Queue">
|
||||
@@ -1239,6 +1355,9 @@
|
||||
</managerEvent>
|
||||
<managerEvent language="en_US" name="QueueMemberAdded">
|
||||
<managerEventInstance class="EVENT_FLAG_AGENT">
|
||||
<since>
|
||||
<version>12.0.0</version>
|
||||
</since>
|
||||
<synopsis>Raised when a member is added to the queue.</synopsis>
|
||||
<syntax>
|
||||
<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueMemberStatus']/managerEventInstance/syntax/parameter)" />
|
||||
@@ -1251,6 +1370,9 @@
|
||||
</managerEvent>
|
||||
<managerEvent language="en_US" name="QueueMemberRemoved">
|
||||
<managerEventInstance class="EVENT_FLAG_AGENT">
|
||||
<since>
|
||||
<version>12.0.0</version>
|
||||
</since>
|
||||
<synopsis>Raised when a member is removed from the queue.</synopsis>
|
||||
<syntax>
|
||||
<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueMemberStatus']/managerEventInstance/syntax/parameter)" />
|
||||
@@ -1263,6 +1385,9 @@
|
||||
</managerEvent>
|
||||
<managerEvent language="en_US" name="QueueMemberPause">
|
||||
<managerEventInstance class="EVENT_FLAG_AGENT">
|
||||
<since>
|
||||
<version>12.2.0</version>
|
||||
</since>
|
||||
<synopsis>Raised when a member is paused/unpaused in the queue.</synopsis>
|
||||
<syntax>
|
||||
<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueMemberStatus']/managerEventInstance/syntax/parameter)" />
|
||||
@@ -1275,6 +1400,9 @@
|
||||
</managerEvent>
|
||||
<managerEvent language="en_US" name="QueueMemberPenalty">
|
||||
<managerEventInstance class="EVENT_FLAG_AGENT">
|
||||
<since>
|
||||
<version>12.0.0</version>
|
||||
</since>
|
||||
<synopsis>Raised when a member's penalty is changed.</synopsis>
|
||||
<syntax>
|
||||
<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueMemberStatus']/managerEventInstance/syntax/parameter)" />
|
||||
@@ -1286,6 +1414,9 @@
|
||||
</managerEvent>
|
||||
<managerEvent language="en_US" name="QueueMemberRinginuse">
|
||||
<managerEventInstance class="EVENT_FLAG_AGENT">
|
||||
<since>
|
||||
<version>12.0.0</version>
|
||||
</since>
|
||||
<synopsis>Raised when a member's ringinuse setting is changed.</synopsis>
|
||||
<syntax>
|
||||
<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueMemberStatus']/managerEventInstance/syntax/parameter)" />
|
||||
@@ -1297,6 +1428,9 @@
|
||||
</managerEvent>
|
||||
<managerEvent language="en_US" name="QueueCallerJoin">
|
||||
<managerEventInstance class="EVENT_FLAG_AGENT">
|
||||
<since>
|
||||
<version>12.0.0</version>
|
||||
</since>
|
||||
<synopsis>Raised when a caller joins a Queue.</synopsis>
|
||||
<syntax>
|
||||
<channel_snapshot/>
|
||||
@@ -1316,6 +1450,9 @@
|
||||
</managerEvent>
|
||||
<managerEvent language="en_US" name="QueueCallerLeave">
|
||||
<managerEventInstance class="EVENT_FLAG_AGENT">
|
||||
<since>
|
||||
<version>12.0.0</version>
|
||||
</since>
|
||||
<synopsis>Raised when a caller leaves a Queue.</synopsis>
|
||||
<syntax>
|
||||
<channel_snapshot/>
|
||||
@@ -1330,6 +1467,9 @@
|
||||
</managerEvent>
|
||||
<managerEvent language="en_US" name="QueueCallerAbandon">
|
||||
<managerEventInstance class="EVENT_FLAG_AGENT">
|
||||
<since>
|
||||
<version>12.0.0</version>
|
||||
</since>
|
||||
<synopsis>Raised when a caller abandons the queue.</synopsis>
|
||||
<syntax>
|
||||
<channel_snapshot/>
|
||||
@@ -1346,6 +1486,9 @@
|
||||
</managerEvent>
|
||||
<managerEvent language="en_US" name="AgentCalled">
|
||||
<managerEventInstance class="EVENT_FLAG_AGENT">
|
||||
<since>
|
||||
<version>12.0.0</version>
|
||||
</since>
|
||||
<synopsis>Raised when an queue member is notified of a caller in the queue.</synopsis>
|
||||
<syntax>
|
||||
<channel_snapshot/>
|
||||
@@ -1363,6 +1506,9 @@
|
||||
</managerEvent>
|
||||
<managerEvent language="en_US" name="AgentRingNoAnswer">
|
||||
<managerEventInstance class="EVENT_FLAG_AGENT">
|
||||
<since>
|
||||
<version>12.0.0</version>
|
||||
</since>
|
||||
<synopsis>Raised when a queue member is notified of a caller in the queue and fails to answer.</synopsis>
|
||||
<syntax>
|
||||
<channel_snapshot/>
|
||||
@@ -1381,6 +1527,9 @@
|
||||
</managerEvent>
|
||||
<managerEvent language="en_US" name="AgentComplete">
|
||||
<managerEventInstance class="EVENT_FLAG_AGENT">
|
||||
<since>
|
||||
<version>12.0.0</version>
|
||||
</since>
|
||||
<synopsis>Raised when a queue member has finished servicing a caller in the queue.</synopsis>
|
||||
<syntax>
|
||||
<channel_snapshot/>
|
||||
@@ -1408,6 +1557,9 @@
|
||||
</managerEvent>
|
||||
<managerEvent language="en_US" name="AgentDump">
|
||||
<managerEventInstance class="EVENT_FLAG_AGENT">
|
||||
<since>
|
||||
<version>12.0.0</version>
|
||||
</since>
|
||||
<synopsis>Raised when a queue member hangs up on a caller in the queue.</synopsis>
|
||||
<syntax>
|
||||
<channel_snapshot/>
|
||||
@@ -1424,6 +1576,9 @@
|
||||
</managerEvent>
|
||||
<managerEvent language="en_US" name="AgentConnect">
|
||||
<managerEventInstance class="EVENT_FLAG_AGENT">
|
||||
<since>
|
||||
<version>12.0.0</version>
|
||||
</since>
|
||||
<synopsis>Raised when a queue member answers and is bridged to a caller in the queue.</synopsis>
|
||||
<syntax>
|
||||
<channel_snapshot/>
|
||||
@@ -1502,6 +1657,22 @@ AST_APP_OPTIONS(queue_exec_options, BEGIN_OPTIONS
|
||||
AST_APP_OPTION('W', OPT_CALLER_AUTOMON),
|
||||
END_OPTIONS);
|
||||
|
||||
|
||||
enum aqm_flags {
|
||||
AQMFLAG_PAUSED = (1 << 1),
|
||||
AQMFLAG_REASON = (1 << 2),
|
||||
};
|
||||
|
||||
enum aqm_args {
|
||||
AQM_OPT_ARG_PAUSE_REASON = 0,
|
||||
AQM_OPT_ARG_ARRAY_SIZE, /* Always last element of the enum */
|
||||
};
|
||||
|
||||
AST_APP_OPTIONS(aqm_opts, {
|
||||
AST_APP_OPTION('p', AQMFLAG_PAUSED),
|
||||
AST_APP_OPTION_ARG('r', AQMFLAG_REASON, AQM_OPT_ARG_PAUSE_REASON),
|
||||
});
|
||||
|
||||
enum {
|
||||
QUEUE_STRATEGY_RINGALL = 0,
|
||||
QUEUE_STRATEGY_LEASTRECENT,
|
||||
@@ -1616,6 +1787,12 @@ static int log_membername_as_agent;
|
||||
/*! \brief queues.conf [general] option */
|
||||
static int force_longest_waiting_caller;
|
||||
|
||||
/*! \brief queues.conf [general] option */
|
||||
static int log_caller_id_name;
|
||||
|
||||
/*! \brief queues.conf [general] option */
|
||||
static int log_unpause_on_reason_change;
|
||||
|
||||
/*! \brief name of the ringinuse field in the realtime database */
|
||||
static char *realtime_ringinuse_field;
|
||||
|
||||
@@ -1710,6 +1887,7 @@ struct queue_ent {
|
||||
int max_penalty; /*!< Limit the members that can take this call to this penalty or lower */
|
||||
int min_penalty; /*!< Limit the members that can take this call to this penalty or higher */
|
||||
int raise_penalty; /*!< Float lower penalty members to a minimum penalty */
|
||||
int raise_respect_min; /*!< A switch raise_penalty should respect min_penalty not just max_penalty */
|
||||
int linpos; /*!< If using linear strategy, what position are we at? */
|
||||
int linwrapped; /*!< Is the linpos wrapped? */
|
||||
time_t start; /*!< When we started holding */
|
||||
@@ -1780,6 +1958,7 @@ struct penalty_rule {
|
||||
int max_relative; /*!< Is the max adjustment relative? 1 for relative, 0 for absolute */
|
||||
int min_relative; /*!< Is the min adjustment relative? 1 for relative, 0 for absolute */
|
||||
int raise_relative; /*!< Is the min adjustment relative? 1 for relative, 0 for absolute */
|
||||
int raise_respect_min; /*!< A switch raise_penalty should respect min_penalty not just max_penalty */
|
||||
AST_LIST_ENTRY(penalty_rule) list; /*!< Next penalty_rule */
|
||||
};
|
||||
|
||||
@@ -1855,7 +2034,7 @@ struct call_queue {
|
||||
int periodicannouncestartdelay; /*!< How long into the queue should the periodic accouncement start */
|
||||
int periodicannouncefrequency; /*!< How often to play periodic announcement */
|
||||
int numperiodicannounce; /*!< The number of periodic announcements configured */
|
||||
int randomperiodicannounce; /*!< Are periodic announcments randomly chosen */
|
||||
int randomperiodicannounce; /*!< Are periodic announcements randomly chosen */
|
||||
int roundingseconds; /*!< How many seconds do we round to? */
|
||||
int holdtime; /*!< Current avg holdtime, based on an exponential average */
|
||||
int talktime; /*!< Current avg talktime, based on the same exponential average */
|
||||
@@ -2419,7 +2598,7 @@ static struct ast_json *queue_member_blob_create(struct call_queue *q, struct me
|
||||
* is available, the function immediately returns 0. If no members are available,
|
||||
* then -1 is returned.
|
||||
*/
|
||||
static int get_member_status(struct call_queue *q, int max_penalty, int min_penalty, int raise_penalty, enum empty_conditions conditions, int devstate)
|
||||
static int get_member_status(struct call_queue *q, int max_penalty, int min_penalty, int raise_penalty, enum empty_conditions conditions, int devstate, int raise_respect_min)
|
||||
{
|
||||
struct member *member;
|
||||
struct ao2_iterator mem_iter;
|
||||
@@ -2429,8 +2608,13 @@ static int get_member_status(struct call_queue *q, int max_penalty, int min_pena
|
||||
for (; (member = ao2_iterator_next(&mem_iter)); ao2_ref(member, -1)) {
|
||||
int penalty = member->penalty;
|
||||
if (raise_penalty != INT_MAX && penalty < raise_penalty) {
|
||||
ast_debug(4, "%s is having his penalty raised up from %d to %d\n", member->membername, penalty, raise_penalty);
|
||||
penalty = raise_penalty;
|
||||
/* Check if we should respect minimum penalty threshold */
|
||||
if (raise_respect_min && penalty < min_penalty) {
|
||||
ast_debug(4, "%s penalty %d not raised (below min %d)\n", member->membername, penalty, min_penalty);
|
||||
} else {
|
||||
ast_debug(4, "%s is having his penalty raised up from %d to %d\n", member->membername, penalty, raise_penalty);
|
||||
penalty = raise_penalty;
|
||||
}
|
||||
}
|
||||
if ((max_penalty != INT_MAX && penalty > max_penalty) || (min_penalty != INT_MAX && penalty < min_penalty)) {
|
||||
if (conditions & QUEUE_EMPTY_PENALTY) {
|
||||
@@ -2497,7 +2681,7 @@ static int get_member_status(struct call_queue *q, int max_penalty, int min_pena
|
||||
|
||||
if (!devstate && (conditions & QUEUE_EMPTY_RINGING)) {
|
||||
/* member state still may be RINGING due to lag in event message - check again with device state */
|
||||
return get_member_status(q, max_penalty, min_penalty, raise_penalty, conditions, 1);
|
||||
return get_member_status(q, max_penalty, min_penalty, raise_penalty, conditions, 1, raise_respect_min);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
@@ -3136,6 +3320,11 @@ static int insert_penaltychange(const char *list_name, const char *content, cons
|
||||
}
|
||||
|
||||
if (!ast_strlen_zero(raisestr)) {
|
||||
rule->raise_respect_min = 0; /* Initialize to 0 */
|
||||
if (*raisestr == 'r') {
|
||||
rule->raise_respect_min = 1; /* Set the flag */
|
||||
raisestr++;
|
||||
}
|
||||
if (*raisestr == '+' || *raisestr == '-') {
|
||||
rule->raise_relative = 1;
|
||||
}
|
||||
@@ -3255,12 +3444,22 @@ static int load_realtime_rules(void)
|
||||
}
|
||||
}
|
||||
if (!(raisestr = ast_variable_retrieve(cfg, rulecat, "raise_penalty")) ||
|
||||
ast_strlen_zero(raisestr) || sscanf(raisestr, "%30d", &raise_penalty) != 1) {
|
||||
ast_strlen_zero(raisestr) ) {
|
||||
raise_penalty = 0;
|
||||
raise_relative = 1;
|
||||
} else {
|
||||
if (*raisestr == 'r') {
|
||||
new_penalty_rule->raise_respect_min = 1;
|
||||
raisestr++;
|
||||
} else {
|
||||
new_penalty_rule->raise_respect_min = 0;
|
||||
}
|
||||
if (*raisestr == '+' || *raisestr == '-') {
|
||||
raise_relative = 1;
|
||||
}
|
||||
if (sscanf(raisestr, "%30d", &raise_penalty) != 1) {
|
||||
raise_penalty = 0;
|
||||
raise_relative = 1;
|
||||
}
|
||||
}
|
||||
new_penalty_rule->time = penaltychangetime;
|
||||
@@ -4072,7 +4271,7 @@ static int join_queue(char *queuename, struct queue_ent *qe, enum queue_result *
|
||||
/* This is our one */
|
||||
if (q->joinempty) {
|
||||
int status = 0;
|
||||
if ((status = get_member_status(q, qe->max_penalty, qe->min_penalty, qe->raise_penalty, q->joinempty, 0))) {
|
||||
if ((status = get_member_status(q, qe->max_penalty, qe->min_penalty, qe->raise_penalty, q->joinempty, 0, qe->raise_respect_min))) {
|
||||
*reason = QUEUE_JOINEMPTY;
|
||||
ao2_unlock(q);
|
||||
queue_t_unref(q, "Done with realtime queue");
|
||||
@@ -4222,7 +4421,7 @@ static int say_position(struct queue_ent *qe, int ringing)
|
||||
}
|
||||
|
||||
/* Only announce if the caller's queue position has improved since last time */
|
||||
if (qe->parent->announceposition_only_up && qe->last_pos_said <= qe->pos) {
|
||||
if (qe->parent->announceposition_only_up && qe->last_pos_said > 0 && qe->last_pos_said <= qe->pos) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -5908,7 +6107,7 @@ static int wait_our_turn(struct queue_ent *qe, int ringing, enum queue_result *r
|
||||
if (qe->parent->leavewhenempty) {
|
||||
int status = 0;
|
||||
|
||||
if ((status = get_member_status(qe->parent, qe->max_penalty, qe->min_penalty, qe->raise_penalty, qe->parent->leavewhenempty, 0))) {
|
||||
if ((status = get_member_status(qe->parent, qe->max_penalty, qe->min_penalty, qe->raise_penalty, qe->parent->leavewhenempty, 0, qe->raise_respect_min))) {
|
||||
record_abandoned(qe);
|
||||
*reason = QUEUE_LEAVEEMPTY;
|
||||
ast_queue_log(qe->parent->name, ast_channel_uniqueid(qe->chan), "NONE", "EXITEMPTY", "%d|%d|%ld", qe->pos, qe->opos, (long) (time(NULL) - qe->start));
|
||||
@@ -6550,7 +6749,15 @@ static void handle_local_optimization_begin(void *userdata, struct stasis_subscr
|
||||
struct local_optimization *optimization;
|
||||
unsigned int id;
|
||||
SCOPED_AO2LOCK(lock, queue_data);
|
||||
|
||||
|
||||
if (!local_one || !local_two || !source) {
|
||||
ast_debug(1, "Local optimization begin missing channel snapshots:%s%s%s\n",
|
||||
!local_one ? " local_one," : "",
|
||||
!local_two ? " local_two," : "",
|
||||
!source ? " source," : "");
|
||||
return;
|
||||
}
|
||||
|
||||
if (queue_data->dying) {
|
||||
return;
|
||||
}
|
||||
@@ -6791,7 +6998,7 @@ static int setup_stasis_subs(struct queue_ent *qe, struct ast_channel *peer, str
|
||||
handle_blind_transfer, queue_data);
|
||||
stasis_message_router_add(queue_data->bridge_router, ast_attended_transfer_type(),
|
||||
handle_attended_transfer, queue_data);
|
||||
stasis_message_router_set_default(queue_data->bridge_router,
|
||||
stasis_message_router_add(queue_data->bridge_router, stasis_subscription_change_type(),
|
||||
queue_bridge_cb, queue_data);
|
||||
|
||||
queue_data->channel_router = stasis_message_router_create_pool(ast_channel_topic_all());
|
||||
@@ -6813,7 +7020,7 @@ static int setup_stasis_subs(struct queue_ent *qe, struct ast_channel *peer, str
|
||||
handle_hangup, queue_data);
|
||||
stasis_message_router_add(queue_data->channel_router, ast_channel_masquerade_type(),
|
||||
handle_masquerade, queue_data);
|
||||
stasis_message_router_set_default(queue_data->channel_router,
|
||||
stasis_message_router_add(queue_data->channel_router, stasis_subscription_change_type(),
|
||||
queue_channel_cb, queue_data);
|
||||
|
||||
return 0;
|
||||
@@ -6972,7 +7179,7 @@ static void setup_mixmonitor(struct queue_ent *qe, const char *filename)
|
||||
* \param[in,out] tries the number of times we have tried calling queue members
|
||||
* \param[out] noption set if the call to Queue() has the 'n' option set.
|
||||
* \param[in] agi the agi passed as the fifth parameter to the Queue() application
|
||||
* \param[in] gosub the gosub passed as the seventh parameter to the Queue() application
|
||||
* \param[in] gosub the gosub passed as the sixth parameter to the Queue() application
|
||||
* \param[in] ringing 1 if the 'r' option is set, otherwise 0
|
||||
*/
|
||||
static int try_calling(struct queue_ent *qe, struct ast_flags opts, char **opt_args, char *announceoverride, const char *url, int *tries, int *noption, const char *agi, const char *gosub, int ringing)
|
||||
@@ -7787,6 +7994,11 @@ static void set_queue_member_pause(struct call_queue *q, struct member *mem, con
|
||||
if (mem->paused == paused) {
|
||||
ast_debug(1, "%spausing already-%spaused queue member %s:%s\n",
|
||||
(paused ? "" : "un"), (paused ? "" : "un"), q->name, mem->interface);
|
||||
if (log_unpause_on_reason_change && paused) {
|
||||
if (!ast_strings_equal(mem->reason_paused, reason)) {
|
||||
ast_queue_log(q->name, "NONE", mem->membername, "UNPAUSE", "%s", "Auto-Unpause");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (mem->realtime && !ast_strlen_zero(mem->rt_uniqueid)) {
|
||||
@@ -8354,7 +8566,7 @@ static int rqm_exec(struct ast_channel *chan, const char *data)
|
||||
static int aqm_exec(struct ast_channel *chan, const char *data)
|
||||
{
|
||||
int res=-1;
|
||||
char *parse, *tmp, *temppos = NULL;
|
||||
char *parse, *tmp, *temppos = NULL, *reason = NULL;
|
||||
AST_DECLARE_APP_ARGS(args,
|
||||
AST_APP_ARG(queuename);
|
||||
AST_APP_ARG(interface);
|
||||
@@ -8365,7 +8577,9 @@ static int aqm_exec(struct ast_channel *chan, const char *data)
|
||||
AST_APP_ARG(wrapuptime);
|
||||
);
|
||||
int penalty = 0;
|
||||
int paused = 0;
|
||||
int wrapuptime;
|
||||
struct ast_flags flags = { 0 };
|
||||
|
||||
if (ast_strlen_zero(data)) {
|
||||
ast_log(LOG_WARNING, "AddQueueMember requires an argument (queuename[,interface[,penalty[,options[,membername[,stateinterface][,wrapuptime]]]]])\n");
|
||||
@@ -8376,6 +8590,17 @@ static int aqm_exec(struct ast_channel *chan, const char *data)
|
||||
|
||||
AST_STANDARD_APP_ARGS(args, parse);
|
||||
|
||||
if (args.options) {
|
||||
char *opts[AQM_OPT_ARG_ARRAY_SIZE] = { NULL, };
|
||||
ast_app_parse_options(aqm_opts, &flags, opts, args.options);
|
||||
if (ast_test_flag(&flags, AQMFLAG_PAUSED)) {
|
||||
paused = 1;
|
||||
if (ast_test_flag(&flags, AQMFLAG_REASON) && !ast_strlen_zero(opts[AQM_OPT_ARG_PAUSE_REASON])) {
|
||||
reason = ast_strdupa(opts[AQM_OPT_ARG_PAUSE_REASON]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ast_strlen_zero(args.interface)) {
|
||||
args.interface = ast_strdupa(ast_channel_name(chan));
|
||||
temppos = strrchr(args.interface, '-');
|
||||
@@ -8402,12 +8627,12 @@ static int aqm_exec(struct ast_channel *chan, const char *data)
|
||||
wrapuptime = 0;
|
||||
}
|
||||
|
||||
switch (add_to_queue(args.queuename, args.interface, args.membername, penalty, 0, queue_persistent_members, args.state_interface, NULL, wrapuptime)) {
|
||||
switch (add_to_queue(args.queuename, args.interface, args.membername, penalty, paused, queue_persistent_members, args.state_interface, reason, wrapuptime)) {
|
||||
case RES_OKAY:
|
||||
if (ast_strlen_zero(args.membername) || !log_membername_as_agent) {
|
||||
ast_queue_log(args.queuename, ast_channel_uniqueid(chan), args.interface, "ADDMEMBER", "%s", "");
|
||||
ast_queue_log(args.queuename, ast_channel_uniqueid(chan), args.interface, "ADDMEMBER", "%s", paused ? "PAUSED" : "");
|
||||
} else {
|
||||
ast_queue_log(args.queuename, ast_channel_uniqueid(chan), args.membername, "ADDMEMBER", "%s", "");
|
||||
ast_queue_log(args.queuename, ast_channel_uniqueid(chan), args.membername, "ADDMEMBER", "%s", paused ? "PAUSED" : "");
|
||||
}
|
||||
ast_log(LOG_NOTICE, "Added interface '%s' to queue '%s'\n", args.interface, args.queuename);
|
||||
pbx_builtin_setvar_helper(chan, "AQMSTATUS", "ADDED");
|
||||
@@ -8632,8 +8857,14 @@ static int queue_exec(struct ast_channel *chan, const char *data)
|
||||
}
|
||||
|
||||
if ((raise_penalty_str = pbx_builtin_getvar_helper(chan, "QUEUE_RAISE_PENALTY"))) {
|
||||
if (*raise_penalty_str == 'r') {
|
||||
qe.raise_respect_min = 1;
|
||||
raise_penalty_str++;
|
||||
} else {
|
||||
qe.raise_respect_min = 0;
|
||||
}
|
||||
if (sscanf(raise_penalty_str, "%30d", &raise_penalty) == 1) {
|
||||
ast_debug(1, "%s: Got raise penalty %d from ${QUEUE_RAISE_PENALTY}.\n", ast_channel_name(chan), raise_penalty);
|
||||
ast_debug(1, "%s: Got raise penalty %s%d from ${QUEUE_RAISE_PENALTY}.\n", ast_channel_name(chan), qe.raise_respect_min ? "r" : "", raise_penalty);
|
||||
} else {
|
||||
ast_log(LOG_WARNING, "${QUEUE_RAISE_PENALTY}: Invalid value (%s), channel %s.\n",
|
||||
raise_penalty_str, ast_channel_name(chan));
|
||||
@@ -8691,11 +8922,33 @@ static int queue_exec(struct ast_channel *chan, const char *data)
|
||||
|
||||
cid_allow = qe.parent->log_restricted_caller_id || ((ast_party_id_presentation(&ast_channel_caller(chan)->id) & AST_PRES_RESTRICTION) == AST_PRES_ALLOWED);
|
||||
|
||||
ast_queue_log(args.queuename, ast_channel_uniqueid(chan), "NONE", "ENTERQUEUE", "%s|%s|%d",
|
||||
S_OR(args.url, ""),
|
||||
S_COR(cid_allow && ast_channel_caller(chan)->id.number.valid, ast_channel_caller(chan)->id.number.str, ""),
|
||||
qe.opos);
|
||||
if (log_caller_id_name) {
|
||||
char *escaped_cidname = NULL;
|
||||
/* Ensure caller ID name is valid and not NULL before processing */
|
||||
if (cid_allow && ast_channel_caller(chan)->id.name.valid && ast_channel_caller(chan)->id.name.str) {
|
||||
escaped_cidname = ast_strdupa(ast_channel_caller(chan)->id.name.str);
|
||||
/* Only iterate if '|' is found */
|
||||
if (strchr(escaped_cidname, '|')) {
|
||||
for (char *p = escaped_cidname; *p; p++) {
|
||||
if (*p == '|') {
|
||||
*p = '_';
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ast_queue_log(args.queuename, ast_channel_uniqueid(chan), "NONE", "ENTERQUEUE", "%s|%s|%d|%s",
|
||||
S_OR(args.url, ""),
|
||||
S_COR(cid_allow && ast_channel_caller(chan)->id.number.valid, ast_channel_caller(chan)->id.number.str, ""),
|
||||
qe.opos,
|
||||
S_OR(escaped_cidname, ""));
|
||||
} else {
|
||||
ast_queue_log(args.queuename, ast_channel_uniqueid(chan), "NONE", "ENTERQUEUE", "%s|%s|%d",
|
||||
S_OR(args.url, ""),
|
||||
S_COR(cid_allow && ast_channel_caller(chan)->id.number.valid, ast_channel_caller(chan)->id.number.str, ""),
|
||||
qe.opos);
|
||||
}
|
||||
|
||||
/* PREDIAL: Preprocess any callee gosub arguments. */
|
||||
if (ast_test_flag(&opts, OPT_PREDIAL_CALLEE)
|
||||
&& !ast_strlen_zero(opt_args[OPT_ARG_PREDIAL_CALLEE])) {
|
||||
@@ -8803,7 +9056,7 @@ check_turns:
|
||||
|
||||
if (qe.parent->leavewhenempty) {
|
||||
int status = 0;
|
||||
if ((status = get_member_status(qe.parent, qe.max_penalty, qe.min_penalty, qe.raise_penalty, qe.parent->leavewhenempty, 0))) {
|
||||
if ((status = get_member_status(qe.parent, qe.max_penalty, qe.min_penalty, qe.raise_penalty, qe.parent->leavewhenempty, 0, qe.raise_respect_min))) {
|
||||
record_abandoned(&qe);
|
||||
reason = QUEUE_LEAVEEMPTY;
|
||||
ast_queue_log(args.queuename, ast_channel_uniqueid(chan), "NONE", "EXITEMPTY", "%d|%d|%ld", qe.pos, qe.opos, (long)(time(NULL) - qe.start));
|
||||
@@ -9576,6 +9829,7 @@ static void queue_reset_global_params(void)
|
||||
negative_penalty_invalid = 0;
|
||||
log_membername_as_agent = 0;
|
||||
force_longest_waiting_caller = 0;
|
||||
log_unpause_on_reason_change = 0;
|
||||
}
|
||||
|
||||
/*! Set the global queue parameters as defined in the "general" section of queues.conf */
|
||||
@@ -9604,6 +9858,13 @@ static void queue_set_global_params(struct ast_config *cfg)
|
||||
if ((general_val = ast_variable_retrieve(cfg, "general", "force_longest_waiting_caller"))) {
|
||||
force_longest_waiting_caller = ast_true(general_val);
|
||||
}
|
||||
if ((general_val = ast_variable_retrieve(cfg, "general", "log_unpause_on_reason_change"))) {
|
||||
log_unpause_on_reason_change = ast_true(general_val);
|
||||
}
|
||||
/* Apply log-caller-id-name in the same place as other global settings */
|
||||
if ((general_val = ast_variable_retrieve(cfg, "general", "log-caller-id-name"))) {
|
||||
log_caller_id_name = ast_true(general_val);
|
||||
}
|
||||
}
|
||||
|
||||
/*! \brief reload information pertaining to a single member
|
||||
@@ -9623,6 +9884,7 @@ static void reload_single_member(const char *memberdata, struct call_queue *q)
|
||||
int penalty;
|
||||
int ringinuse;
|
||||
int wrapuptime;
|
||||
int paused;
|
||||
AST_DECLARE_APP_ARGS(args,
|
||||
AST_APP_ARG(interface);
|
||||
AST_APP_ARG(penalty);
|
||||
@@ -9630,6 +9892,7 @@ static void reload_single_member(const char *memberdata, struct call_queue *q)
|
||||
AST_APP_ARG(state_interface);
|
||||
AST_APP_ARG(ringinuse);
|
||||
AST_APP_ARG(wrapuptime);
|
||||
AST_APP_ARG(paused);
|
||||
);
|
||||
|
||||
if (ast_strlen_zero(memberdata)) {
|
||||
@@ -9695,11 +9958,30 @@ static void reload_single_member(const char *memberdata, struct call_queue *q)
|
||||
wrapuptime = 0;
|
||||
}
|
||||
|
||||
if (!ast_strlen_zero(args.paused)) {
|
||||
tmp = args.paused;
|
||||
ast_strip(tmp);
|
||||
if (ast_true(tmp)) {
|
||||
paused = 1;
|
||||
} else if (ast_false(tmp)) {
|
||||
paused = 0;
|
||||
} else {
|
||||
ast_log(LOG_ERROR, "Member %s has an invalid paused value.\n", membername);
|
||||
paused = 0;
|
||||
}
|
||||
} else {
|
||||
paused = 0;
|
||||
}
|
||||
|
||||
/* Find the old position in the list */
|
||||
ast_copy_string(tmpmem.interface, interface, sizeof(tmpmem.interface));
|
||||
cur = ao2_find(q->members, &tmpmem, OBJ_POINTER);
|
||||
|
||||
if ((newm = create_queue_member(interface, membername, penalty, cur ? cur->paused : 0, state_interface, ringinuse, wrapuptime))) {
|
||||
if (cur) {
|
||||
paused = cur->paused;
|
||||
}
|
||||
|
||||
if ((newm = create_queue_member(interface, membername, penalty, paused, state_interface, ringinuse, wrapuptime))) {
|
||||
newm->wrapuptime = wrapuptime;
|
||||
if (cur) {
|
||||
ao2_lock(q->members);
|
||||
@@ -10324,7 +10606,7 @@ static char *complete_queue(const char *line, const char *word, int pos, int sta
|
||||
queue_iter = ao2_iterator_init(queues, 0);
|
||||
while ((q = ao2_t_iterator_next(&queue_iter, "Iterate through queues"))) {
|
||||
if (!strncasecmp(word, q->name, wordlen) && ++which > state
|
||||
&& (!word_list_offset || !word_in_list(word_list, q->name))) {
|
||||
&& (!word_list_offset || !word_list || !word_in_list(word_list, q->name))) {
|
||||
ret = ast_strdup(q->name);
|
||||
queue_t_unref(q, "Done with iterator");
|
||||
break;
|
||||
@@ -10610,13 +10892,14 @@ static int manager_queues_status(struct mansession *s, const struct message *m)
|
||||
|
||||
static int manager_add_queue_member(struct mansession *s, const struct message *m)
|
||||
{
|
||||
const char *queuename, *interface, *penalty_s, *paused_s, *membername, *state_interface, *wrapuptime_s;
|
||||
const char *queuename, *interface, *penalty_s, *paused_s, *reason, *membername, *state_interface, *wrapuptime_s;
|
||||
int paused, penalty, wrapuptime = 0;
|
||||
|
||||
queuename = astman_get_header(m, "Queue");
|
||||
interface = astman_get_header(m, "Interface");
|
||||
penalty_s = astman_get_header(m, "Penalty");
|
||||
paused_s = astman_get_header(m, "Paused");
|
||||
reason = astman_get_header(m, "Reason"); /* Optional */
|
||||
membername = astman_get_header(m, "MemberName");
|
||||
state_interface = astman_get_header(m, "StateInterface");
|
||||
wrapuptime_s = astman_get_header(m, "Wrapuptime");
|
||||
@@ -10649,7 +10932,7 @@ static int manager_add_queue_member(struct mansession *s, const struct message *
|
||||
paused = abs(ast_true(paused_s));
|
||||
}
|
||||
|
||||
switch (add_to_queue(queuename, interface, membername, penalty, paused, queue_persistent_members, state_interface, NULL, wrapuptime)) {
|
||||
switch (add_to_queue(queuename, interface, membername, penalty, paused, queue_persistent_members, state_interface, reason, wrapuptime)) {
|
||||
case RES_OKAY:
|
||||
if (ast_strlen_zero(membername) || !log_membername_as_agent) {
|
||||
ast_queue_log(queuename, "MANAGER", interface, "ADDMEMBER", "%s", paused ? "PAUSED" : "");
|
||||
@@ -10989,21 +11272,21 @@ static int manager_request_withdraw_caller_from_queue(struct mansession *s, cons
|
||||
|
||||
static char *handle_queue_add_member(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
|
||||
{
|
||||
const char *queuename, *interface, *membername = NULL, *state_interface = NULL;
|
||||
int penalty;
|
||||
const char *queuename, *interface, *membername = NULL, *state_interface = NULL, *reason = NULL;
|
||||
int penalty, paused = 0;
|
||||
|
||||
switch ( cmd ) {
|
||||
case CLI_INIT:
|
||||
e->command = "queue add member";
|
||||
e->usage =
|
||||
"Usage: queue add member <dial string> to <queue> [penalty <penalty> [as <membername> [state_interface <interface>]]]\n"
|
||||
"Usage: queue add member <dial string> to <queue> [penalty <penalty> [as <membername> [state_interface <interface> [paused <reason>]]]]\n"
|
||||
" Add a dial string (Such as a channel,e.g. SIP/6001) to a queue with optionally: a penalty, membername and a state_interface\n";
|
||||
return NULL;
|
||||
case CLI_GENERATE:
|
||||
return complete_queue_add_member(a->line, a->word, a->pos, a->n);
|
||||
}
|
||||
|
||||
if ((a->argc != 6) && (a->argc != 8) && (a->argc != 10) && (a->argc != 12)) {
|
||||
if ((a->argc != 6) && (a->argc != 8) && (a->argc != 10) && (a->argc != 12) && (a->argc != 14)) {
|
||||
return CLI_SHOWUSAGE;
|
||||
} else if (strcmp(a->argv[4], "to")) {
|
||||
return CLI_SHOWUSAGE;
|
||||
@@ -11013,6 +11296,8 @@ static char *handle_queue_add_member(struct ast_cli_entry *e, int cmd, struct as
|
||||
return CLI_SHOWUSAGE;
|
||||
} else if ((a->argc == 12) && strcmp(a->argv[10], "state_interface")) {
|
||||
return CLI_SHOWUSAGE;
|
||||
} else if ((a->argc == 14) && strcmp(a->argv[12], "paused")) {
|
||||
return CLI_SHOWUSAGE;
|
||||
}
|
||||
|
||||
queuename = a->argv[5];
|
||||
@@ -11039,12 +11324,17 @@ static char *handle_queue_add_member(struct ast_cli_entry *e, int cmd, struct as
|
||||
state_interface = a->argv[11];
|
||||
}
|
||||
|
||||
switch (add_to_queue(queuename, interface, membername, penalty, 0, queue_persistent_members, state_interface, NULL, 0)) {
|
||||
if (a->argc >= 14) {
|
||||
paused = 1;
|
||||
reason = a->argv[13];
|
||||
}
|
||||
|
||||
switch (add_to_queue(queuename, interface, membername, penalty, paused, queue_persistent_members, state_interface, reason, 0)) {
|
||||
case RES_OKAY:
|
||||
if (ast_strlen_zero(membername) || !log_membername_as_agent) {
|
||||
ast_queue_log(queuename, "CLI", interface, "ADDMEMBER", "%s", "");
|
||||
ast_queue_log(queuename, "CLI", interface, "ADDMEMBER", "%s", paused ? "PAUSED" : "");
|
||||
} else {
|
||||
ast_queue_log(queuename, "CLI", membername, "ADDMEMBER", "%s", "");
|
||||
ast_queue_log(queuename, "CLI", membername, "ADDMEMBER", "%s", paused ? "PAUSED" : "");
|
||||
}
|
||||
ast_cli(a->fd, "Added interface '%s' to queue '%s'\n", interface, queuename);
|
||||
return CLI_SUCCESS;
|
||||
|
||||
@@ -40,6 +40,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="Read" language="en_US">
|
||||
<since>
|
||||
<version>1.6.1.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Read a variable.
|
||||
</synopsis>
|
||||
|
||||
@@ -39,6 +39,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="ReadExten" language="en_US">
|
||||
<since>
|
||||
<version>1.6.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Read an extension into a variable.
|
||||
</synopsis>
|
||||
|
||||
@@ -42,6 +42,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="Record" language="en_US">
|
||||
<since>
|
||||
<version>0.1.8</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Record to a file.
|
||||
</synopsis>
|
||||
@@ -116,8 +119,32 @@
|
||||
</variable>
|
||||
</variablelist>
|
||||
</description>
|
||||
<see-also>
|
||||
<ref type="function">RECORDING_INFO</ref>
|
||||
</see-also>
|
||||
</application>
|
||||
|
||||
<function name="RECORDING_INFO" language="en_US">
|
||||
<synopsis>
|
||||
Retrieve information about a recording previously created using the Record application
|
||||
</synopsis>
|
||||
<syntax>
|
||||
<parameter name="property" required="true">
|
||||
<para>The property about the recording to retrieve.</para>
|
||||
<enumlist>
|
||||
<enum name="duration">
|
||||
<para>The duration, in milliseconds, of the recording.</para>
|
||||
</enum>
|
||||
</enumlist>
|
||||
</parameter>
|
||||
</syntax>
|
||||
<description>
|
||||
<para>Returns information about the previous recording created by <literal>Record</literal>.
|
||||
This function cannot be used if no recordings have yet been completed.</para>
|
||||
</description>
|
||||
<see-also>
|
||||
<ref type="application">Record</ref>
|
||||
</see-also>
|
||||
</function>
|
||||
***/
|
||||
|
||||
#define OPERATOR_KEY '0'
|
||||
@@ -218,13 +245,65 @@ static int create_destination_directory(const char *path)
|
||||
return ast_mkdir(directory, 0777);
|
||||
}
|
||||
|
||||
struct recording_data {
|
||||
unsigned long duration; /* Duration, in ms */
|
||||
};
|
||||
|
||||
static void recording_data_free(void *data)
|
||||
{
|
||||
ast_free(data);
|
||||
}
|
||||
|
||||
static const struct ast_datastore_info recording_data_info = {
|
||||
.type = "RECORDING_INFO",
|
||||
.destroy = recording_data_free,
|
||||
};
|
||||
|
||||
static int recording_info_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
|
||||
{
|
||||
struct ast_datastore *ds;
|
||||
struct recording_data *recdata;
|
||||
|
||||
*buf = '\0';
|
||||
|
||||
if (!chan) {
|
||||
ast_log(LOG_ERROR, "%s() can only be executed on a channel\n", cmd);
|
||||
return -1;
|
||||
} else if (ast_strlen_zero(data)) {
|
||||
ast_log(LOG_ERROR, "%s() requires an argument\n", cmd);
|
||||
return -1;
|
||||
}
|
||||
|
||||
ast_channel_lock(chan);
|
||||
ds = ast_channel_datastore_find(chan, &recording_data_info, NULL);
|
||||
ast_channel_unlock(chan);
|
||||
|
||||
if (!ds) {
|
||||
ast_log(LOG_ERROR, "No recordings have completed on channel %s\n", ast_channel_name(chan));
|
||||
return -1;
|
||||
}
|
||||
|
||||
recdata = ds->data;
|
||||
|
||||
if (!strcasecmp(data, "duration")) {
|
||||
snprintf(buf, len, "%ld", recdata->duration);
|
||||
} else {
|
||||
ast_log(LOG_ERROR, "Invalid property type: %s\n", data);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int record_exec(struct ast_channel *chan, const char *data)
|
||||
{
|
||||
struct ast_datastore *ds;
|
||||
int res = 0;
|
||||
char *ext = NULL, *opts[0];
|
||||
char *parse;
|
||||
int i = 0;
|
||||
char tmp[PATH_MAX];
|
||||
struct recording_data *recdata;
|
||||
|
||||
struct ast_filestream *s = NULL;
|
||||
struct ast_frame *f = NULL;
|
||||
@@ -252,6 +331,31 @@ static int record_exec(struct ast_channel *chan, const char *data)
|
||||
struct timeval start;
|
||||
const char *status_response = "ERROR";
|
||||
|
||||
/* Retrieve or create the datastore */
|
||||
ast_channel_lock(chan);
|
||||
if (!(ds = ast_channel_datastore_find(chan, &recording_data_info, NULL))) {
|
||||
if (!(ds = ast_datastore_alloc(&recording_data_info, NULL))) {
|
||||
ast_log(LOG_ERROR, "Unable to allocate new datastore.\n");
|
||||
ast_channel_unlock(chan);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!(recdata = ast_calloc(1, sizeof(*recdata)))) {
|
||||
ast_datastore_free(ds);
|
||||
ast_channel_unlock(chan);
|
||||
return -1;
|
||||
}
|
||||
|
||||
ds->data = recdata;
|
||||
ast_channel_datastore_add(chan, ds);
|
||||
} else {
|
||||
recdata = ds->data;
|
||||
}
|
||||
ast_channel_unlock(chan);
|
||||
|
||||
/* Reset, in case already set */
|
||||
recdata->duration = 0;
|
||||
|
||||
/* The next few lines of code parse out the filename and header from the input string */
|
||||
if (ast_strlen_zero(data)) { /* no data implies no filename or anything is present */
|
||||
ast_log(LOG_WARNING, "Record requires an argument (filename)\n");
|
||||
@@ -514,6 +618,8 @@ static int record_exec(struct ast_channel *chan, const char *data)
|
||||
ast_channel_stop_silence_generator(chan, silgen);
|
||||
|
||||
out:
|
||||
recdata->duration = ast_tvdiff_ms(ast_tvnow(), start);
|
||||
|
||||
if ((silence > 0) && rfmt) {
|
||||
res = ast_set_read_format(chan, rfmt);
|
||||
if (res) {
|
||||
@@ -530,14 +636,25 @@ out:
|
||||
return res;
|
||||
}
|
||||
|
||||
static struct ast_custom_function acf_recording_info = {
|
||||
.name = "RECORDING_INFO",
|
||||
.read = recording_info_read,
|
||||
};
|
||||
|
||||
static int unload_module(void)
|
||||
{
|
||||
return ast_unregister_application(app);
|
||||
int res;
|
||||
res = ast_custom_function_unregister(&acf_recording_info);
|
||||
res |= ast_unregister_application(app);
|
||||
return res;
|
||||
}
|
||||
|
||||
static int load_module(void)
|
||||
{
|
||||
return ast_register_application_xml(app, record_exec);
|
||||
int res;
|
||||
res = ast_register_application_xml(app, record_exec);
|
||||
res |= ast_custom_function_register(&acf_recording_info);
|
||||
return res;
|
||||
}
|
||||
|
||||
AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Trivial Record Application");
|
||||
|
||||
@@ -42,7 +42,6 @@
|
||||
<since>
|
||||
<version>16.20.0</version>
|
||||
<version>18.6.0</version>
|
||||
<version>19.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Reloads an Asterisk module, blocking the channel until the reload has completed.
|
||||
|
||||
@@ -31,6 +31,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="SayCountedNoun" language="en_US">
|
||||
<since>
|
||||
<version>1.8.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Say a noun in declined form in order to count things
|
||||
</synopsis>
|
||||
@@ -63,7 +66,7 @@
|
||||
implement complicated spelling rules. We simply record the word
|
||||
"men" in the sound file named "mans".</para>
|
||||
<para>This application does not automatically answer and should be
|
||||
preceeded by an application such as Answer() or Progress.</para>
|
||||
preceded by an application such as Answer() or Progress.</para>
|
||||
</description>
|
||||
<see-also>
|
||||
<ref type="application">SayCountedAdj</ref>
|
||||
@@ -71,6 +74,9 @@
|
||||
</see-also>
|
||||
</application>
|
||||
<application name="SayCountedAdj" language="en_US">
|
||||
<since>
|
||||
<version>1.8.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Say a adjective in declined form in order to count things
|
||||
</synopsis>
|
||||
@@ -102,7 +108,7 @@
|
||||
SayCountedAdj(5,new,f) will play sound file "newx" (containing the
|
||||
word "novikh").</para>
|
||||
<para>This application does not automatically answer and should be
|
||||
preceeded by an application such as Answer(), Progress(), or
|
||||
preceded by an application such as Answer(), Progress(), or
|
||||
Proceeding().</para>
|
||||
</description>
|
||||
<see-also>
|
||||
|
||||
@@ -40,6 +40,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="SayUnixTime" language="en_US">
|
||||
<since>
|
||||
<version>0.7.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Says a specified time in a custom format.
|
||||
</synopsis>
|
||||
@@ -76,6 +79,9 @@
|
||||
</see-also>
|
||||
</application>
|
||||
<application name="DateTime" language="en_US">
|
||||
<since>
|
||||
<version>0.2.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Says a specified time in a custom format.
|
||||
</synopsis>
|
||||
|
||||
@@ -39,6 +39,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="SendDTMF" language="en_US">
|
||||
<since>
|
||||
<version>0.3.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Sends arbitrary DTMF digits
|
||||
</synopsis>
|
||||
@@ -75,6 +78,9 @@
|
||||
</see-also>
|
||||
</application>
|
||||
<manager name="PlayDTMF" language="en_US">
|
||||
<since>
|
||||
<version>1.4.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Play DTMF signal on a specific channel.
|
||||
</synopsis>
|
||||
@@ -98,6 +104,10 @@
|
||||
</description>
|
||||
</manager>
|
||||
<manager name="SendFlash" language="en_US">
|
||||
<since>
|
||||
<version>20.3.0</version>
|
||||
<version>18.18.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Send a hook flash on a specific channel.
|
||||
</synopsis>
|
||||
|
||||
@@ -43,6 +43,9 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="SendText" language="en_US">
|
||||
<since>
|
||||
<version>1.0.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Send a Text Message on a channel.
|
||||
</synopsis>
|
||||
|
||||
@@ -78,6 +78,20 @@
|
||||
<option name="m">
|
||||
<para>Mute conference.</para>
|
||||
</option>
|
||||
<option name="t">
|
||||
<para>Post-digit timeout, in seconds. If more than this amount of time
|
||||
elapses after a digit, the number will be deemed finalized and
|
||||
the application will return This is useful when reading a variable
|
||||
number of digits that is unknown in advance.</para>
|
||||
<para>This can be almost any positive decimal number of seconds, but must
|
||||
be no less than 0.6 seconds, since this is the SF inter-digit timeout.
|
||||
The default is 0.8, which should be compatible with <literal>SendSF</literal>.
|
||||
Values lower than 0.75 will generally produce unreliable results.</para>
|
||||
<para>Note this timer only kicks in after at least one digit has been received,
|
||||
to account for sender/receiver synchronization.</para>
|
||||
<para>Note that <literal>RECEIVESFSTATUS</literal> will still be
|
||||
set to <literal>TIMEOUT</literal> if the post-digit timer expires.</para>
|
||||
</option>
|
||||
<option name="q">
|
||||
<para>Quelch SF from in-band.</para>
|
||||
</option>
|
||||
@@ -146,18 +160,35 @@
|
||||
</application>
|
||||
***/
|
||||
|
||||
/* Default post-digit timer */
|
||||
#define DEFAULT_POST_DIGIT_TIMER 0.8
|
||||
|
||||
/* Bell System Technical Journal 39 (Nov. 1960) */
|
||||
#define SF_MIN_OFF 25
|
||||
#define SF_ON 67
|
||||
#define SF_BETWEEN 600
|
||||
#define SF_MIN_DETECT 50
|
||||
|
||||
enum read_option_flags {
|
||||
OPT_DELAY = (1 << 0),
|
||||
OPT_MUTE = (1 << 1),
|
||||
OPT_QUELCH = (1 << 2),
|
||||
OPT_RELAXED = (1 << 3),
|
||||
OPT_EXTRAPULSES = (1 << 4),
|
||||
OPT_DIGIT_TIMEOUT = (1 << 5),
|
||||
};
|
||||
|
||||
enum {
|
||||
OPT_ARG_DIGIT_TIMEOUT,
|
||||
/* note: this entry _MUST_ be the last one in the enum */
|
||||
OPT_ARG_ARRAY_SIZE,
|
||||
};
|
||||
|
||||
AST_APP_OPTIONS(read_app_options, {
|
||||
AST_APP_OPTION('d', OPT_DELAY),
|
||||
AST_APP_OPTION('e', OPT_EXTRAPULSES),
|
||||
AST_APP_OPTION('m', OPT_MUTE),
|
||||
AST_APP_OPTION_ARG('t', OPT_DIGIT_TIMEOUT, OPT_ARG_DIGIT_TIMEOUT),
|
||||
AST_APP_OPTION('q', OPT_QUELCH),
|
||||
AST_APP_OPTION('r', OPT_RELAXED),
|
||||
});
|
||||
@@ -172,6 +203,7 @@ static const char sendsf_name[] = "SendSF";
|
||||
* \param buf Buffer in which to store digits
|
||||
* \param buflen Size of buffer
|
||||
* \param timeout ms to wait for all digits before giving up
|
||||
* \param digit_timeout ms to wait for the next digit before giving up
|
||||
* \param maxdigits Maximum number of digits
|
||||
* \param freq Frequency to use
|
||||
* \param features DSP features
|
||||
@@ -180,13 +212,8 @@ static const char sendsf_name[] = "SendSF";
|
||||
* \retval 0 if successful
|
||||
* \retval -1 if unsuccessful (including hangup).
|
||||
*/
|
||||
static int read_sf_digits(struct ast_channel *chan, char *buf, int buflen, int timeout, int maxdigits, int freq, int features, int extrapulses) {
|
||||
/* Bell System Technical Journal 39 (Nov. 1960) */
|
||||
#define SF_MIN_OFF 25
|
||||
#define SF_ON 67
|
||||
#define SF_BETWEEN 600
|
||||
#define SF_MIN_DETECT 50
|
||||
|
||||
static int read_sf_digits(struct ast_channel *chan, char *buf, int buflen, int timeout, int digit_timeout, int maxdigits, int freq, int features, int extrapulses)
|
||||
{
|
||||
struct ast_dsp *dsp = NULL;
|
||||
struct ast_frame *frame = NULL;
|
||||
struct timeval start, pulsetimer, digittimer;
|
||||
@@ -212,6 +239,23 @@ static int read_sf_digits(struct ast_channel *chan, char *buf, int buflen, int t
|
||||
if (timeout > 0) {
|
||||
remaining_time = ast_remaining_ms(start, timeout);
|
||||
if (remaining_time <= 0) {
|
||||
ast_debug(1, "SF all-digit timer expired\n");
|
||||
pbx_builtin_setvar_helper(chan, "RECEIVESFSTATUS", "TIMEOUT");
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* If we haven't received a digit yet, don't apply the post-digit timer just yet,
|
||||
* since the sender may not have started sending any digits.
|
||||
*
|
||||
* Note that we use the digit timer, which is reset for each SF pulse,
|
||||
* as opposed to simply an entire digit being received.
|
||||
* This is done because we only want to expire the timer if there has been no activity
|
||||
* since the last digit. If we're in the middle of receiving a digit (e.g. 0)
|
||||
* we may not have a full digit yet but that should not cause an expiration. */
|
||||
if (digits_read > 0 && digit_timeout > 0) {
|
||||
int remaining_time_for_next_digit = ast_remaining_ms(digittimer, digit_timeout);
|
||||
if (remaining_time_for_next_digit <= 0) {
|
||||
ast_debug(1, "SF post-digit timer expired (>= %d ms since last SF pulse)\n", digit_timeout);
|
||||
pbx_builtin_setvar_helper(chan, "RECEIVESFSTATUS", "TIMEOUT");
|
||||
break;
|
||||
}
|
||||
@@ -261,7 +305,7 @@ static int read_sf_digits(struct ast_channel *chan, char *buf, int buflen, int t
|
||||
}
|
||||
} else if (hits > 0 && ast_remaining_ms(digittimer, SF_BETWEEN) <= 0) {
|
||||
/* has the digit finished? */
|
||||
ast_debug(2, "Received SF digit: %d\n", hits);
|
||||
ast_debug(2, "Received SF digit: %d\n", hits == 10 ? 0 : hits); /* Edge case for 10, since this is the digit '0' */
|
||||
digits_read++;
|
||||
if (hits > 10) {
|
||||
if (extrapulses) {
|
||||
@@ -321,10 +365,11 @@ static int read_sf_exec(struct ast_channel *chan, const char *data)
|
||||
{
|
||||
#define BUFFER_SIZE 256
|
||||
char tmp[BUFFER_SIZE] = "";
|
||||
double tosec;
|
||||
double tosec, digitsec;
|
||||
struct ast_flags flags = {0};
|
||||
char *opt_args[OPT_ARG_ARRAY_SIZE];
|
||||
char *argcopy = NULL;
|
||||
int res, features = 0, digits = 0, to = 0, freq = 2600;
|
||||
int res, features = 0, digits = 0, to = 0, digit_timeout = 0, freq = 2600;
|
||||
|
||||
AST_DECLARE_APP_ARGS(arglist,
|
||||
AST_APP_ARG(variable);
|
||||
@@ -344,7 +389,7 @@ static int read_sf_exec(struct ast_channel *chan, const char *data)
|
||||
AST_STANDARD_APP_ARGS(arglist, argcopy);
|
||||
|
||||
if (!ast_strlen_zero(arglist.options)) {
|
||||
ast_app_parse_options(read_app_options, &flags, NULL, arglist.options);
|
||||
ast_app_parse_options(read_app_options, &flags, opt_args, arglist.options);
|
||||
}
|
||||
|
||||
if (!ast_strlen_zero(arglist.timeout)) {
|
||||
@@ -355,6 +400,18 @@ static int read_sf_exec(struct ast_channel *chan, const char *data)
|
||||
to = tosec * 1000.0;
|
||||
}
|
||||
}
|
||||
if (ast_test_flag(&flags, OPT_DIGIT_TIMEOUT)) {
|
||||
digitsec = (!ast_strlen_zero(opt_args[OPT_ARG_DIGIT_TIMEOUT]) ? atof(opt_args[OPT_ARG_DIGIT_TIMEOUT]) : DEFAULT_POST_DIGIT_TIMER);
|
||||
if (digitsec <= 0) {
|
||||
digit_timeout = 0;
|
||||
} else {
|
||||
digit_timeout = digitsec * 1000.0;
|
||||
if (digit_timeout < SF_BETWEEN) {
|
||||
ast_log(LOG_WARNING, "SF post-digit timer (%d) cannot be less than the SF inter-digit timeout (%d ms)\n", digit_timeout, SF_BETWEEN);
|
||||
digit_timeout = SF_BETWEEN; /* If we have a shorter timeout, it won't work at all */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!ast_strlen_zero(arglist.digits) && (ast_str_to_int(arglist.digits, &digits) || digits <= 0)) {
|
||||
ast_log(LOG_WARNING, "Invalid number of digits: %s\n", arglist.digits);
|
||||
@@ -387,7 +444,7 @@ static int read_sf_exec(struct ast_channel *chan, const char *data)
|
||||
features |= DSP_DIGITMODE_RELAXDTMF;
|
||||
}
|
||||
|
||||
res = read_sf_digits(chan, tmp, BUFFER_SIZE, to, digits, freq, features, ast_test_flag(&flags, OPT_EXTRAPULSES));
|
||||
res = read_sf_digits(chan, tmp, BUFFER_SIZE, to, digit_timeout, digits, freq, features, ast_test_flag(&flags, OPT_EXTRAPULSES));
|
||||
pbx_builtin_setvar_helper(chan, arglist.variable, tmp);
|
||||
if (!ast_strlen_zero(tmp)) {
|
||||
ast_verb(3, "SF digits received: '%s'\n", tmp);
|
||||
|
||||
@@ -40,6 +40,10 @@
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<application name="Signal" language="en_US">
|
||||
<since>
|
||||
<version>18.17.0</version>
|
||||
<version>20.2.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Sends a signal to any waiting channels.
|
||||
</synopsis>
|
||||
@@ -76,6 +80,10 @@
|
||||
</see-also>
|
||||
</application>
|
||||
<application name="WaitForSignal" language="en_US">
|
||||
<since>
|
||||
<version>18.17.0</version>
|
||||
<version>20.2.0</version>
|
||||
</since>
|
||||
<synopsis>
|
||||
Waits for a named signal on a channel.
|
||||
</synopsis>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user