Skip to content

Commit 3bdcc8d

Browse files
committed
Merge commit for 4.5.0
2 parents ebc0b0d + eb37d65 commit 3bdcc8d

File tree

359 files changed

+5299
-1415
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

359 files changed

+5299
-1415
lines changed

ChangeLog

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,35 @@
1+
Thu, 09 Oct 2025 10:09:18 +0200 IvozProvider Team <vozip+ivozprovider@irontec.com>
2+
3+
* IvozProvider 4.5.0 released
4+
5+
Portal
6+
- Changed company selector to use new dynamicAutocomplete component (#3023)
7+
- Added disable diversion toggle in outgoing routes
8+
- Displayed new Product Name field in all web portals dashboards (#2990)
9+
- Fixed deletion logic for CarrierServers linked to outbound routes (#3011)
10+
- Added regex validation and capture group matching for transformation rules (#2999)
11+
- Updated routable options and added locution option in DDIs (#2991)
12+
13+
Kamailio
14+
- Avoided while loops in hints search and increased loop limits in kamusers and kamtrunks (#3002)
15+
- Fixed asterisk sorcery configuration to avoid memory leaks
16+
- Disabled Diversion logic in outgoing routes (#2981)
17+
- Enabled SDES-pad flag for SRTP calls
18+
19+
AGI / Microservices
20+
- Updated Voicemail Sender to handle nullable voicemails (#3014)
21+
- Fixed premature deletion of recordings and updated ended recording checker (#3004)
22+
- Added support for friend blind transfers (#2982)
23+
24+
Provisioning
25+
- Remove leading spaces from provision templates
26+
27+
Misc
28+
- Improved error handling in RatingPlanGroup simulator
29+
- Updated version info rules in About dialog (#2978)
30+
- Minor refactors and consistency updates across components
31+
32+
133
Mon, 26 May 2025 11:25:43 +0200 IvozProvider Team <vozip+ivozprovider@irontec.com>
234

335
* IvozProvider 4.4.0 released

FAQ.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ That address must be present in your network interfaces in order to bind service
4747
### I have trouble with my environment!
4848

4949
We don't provide any kind of free support for installations. If you have trouble, you can contact our sales department
50-
at comercial@irontec.com or ask in [ivozprovider-users](https://groups.google.com/forum/#!forum/ivozprovider-users) group.
50+
at comms.clientes@irontec.com or ask in [ivozprovider-users](https://groups.google.com/forum/#!forum/ivozprovider-users) group.
5151

5252
If by any chance you receive support in the group or #ivozprovider Libera.Chat IRC channel by any developer, it's most
5353
probably provided during spare time, so be thankful for the people giving part of their time.
@@ -61,7 +61,7 @@ in Github project. We appreciate well documented bug reports that help to improv
6161

6262
If you have a feature request that you think it would be helpful for others, don't hesitate to open an issue in github
6363
project. Take into account that we're a small development team and features won't be scheduled unless someone pays
64-
for them. If you're interested in sponsoring a feature, please contact with our sales department at comercial@irontec.com
64+
for them. If you're interested in sponsoring a feature, please contact with our sales department at comms.clientes@irontec.com
6565
Otherwise, the feature won't be implemented unless one of our clients finds it useful.
6666

6767
### What language should I use while reporting?
@@ -73,7 +73,7 @@ grammatical errors, but we think it's the best way to share knowledge and inform
7373

7474
Currently there is no documentation for distributed installations. This requires quite some time and we are a small team with
7575
lots of tasks scheduled. If you need advice or support for distributed installations, please contact our sales department at
76-
comercial@irontec.com so we can schedule it properly.
76+
comms.clientes@irontec.com so we can schedule it properly.
7777

7878
### This solution is not useful without this feature
7979

Jenkinsfile

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ pipeline {
66
// Pipeline options
77
// ------------------------------------------------------------------------
88
options {
9-
timeout(time: 25, unit: 'MINUTES')
9+
timeout(time: 60, unit: 'MINUTES')
1010
timestamps()
1111
disableConcurrentBuilds()
1212
buildDiscarder(
@@ -29,7 +29,7 @@ pipeline {
2929
BRANCH_NAME = getBranchName()
3030
BASE_BRANCH = getBaseBranch()
3131
JIRA_TICKET = getJiraTicket()
32-
HASH_BACK = getCurrentHash("asterisk/agi library microservices schema web/rest")
32+
HASH_BACK = getCurrentHash("asterisk/agi doc library microservices schema web/rest")
3333
HASH_FRONT_PLATFORM = getCurrentHash("web/portal/platform")
3434
HASH_FRONT_BRAND = getCurrentHash("web/portal/brand")
3535
HASH_FRONT_CLIENT = getCurrentHash("web/portal/client")
@@ -787,6 +787,13 @@ pipeline {
787787
unstable "Feature branch ${env.CHANGE_TARGET} is not properly rebased. Merge is blocked."
788788
}
789789
} else {
790+
def currentVersion = issue.data.fields.fixVersions[0];
791+
if (currentVersion && !currentVersion.name.contains('current')) {
792+
unstable "Pull request fixedVersions (${currentVersion.name}) is not current version. Merge is blocked."
793+
} else {
794+
echo "Fixed Version: ${currentVersion.name}"
795+
}
796+
790797
echo "${env.JIRA_TICKET} is a task. Checking subtasks..."
791798

792799
if (env.CHANGE_TARGET != "main") {

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<img src="doc/images/logoprovider.png" width="350"> ![stable](https://raster.shields.io/badge/latest-4.4-blue.png) ![release](https://raster.shields.io/badge/release-tempest-14b9bc.png)
1+
<img src="doc/images/logoprovider.png" width="350"> ![stable](https://raster.shields.io/badge/latest-4.5-blue.png) ![release](https://raster.shields.io/badge/release-tempest-14b9bc.png)
22

33
Ivoz Provider is a multitenant solution for VoIP telephony providers designed for horizontal scaling and load balancing.
44

@@ -51,7 +51,7 @@ If you want to test an [standalone](https://irontec.github.io/ivozprovider/en/ba
5151
| oasis | 1.7 | [![iso http](doc/images/iso-http-green.png)](https://packages.irontec.com/isos/ivozprovider-1.7.1-oasis-amd64.iso) |
5252
| artemis | 2.23.0 | [![iso http](doc/images/iso-http-green.png)](https://packages.irontec.com/isos/ivozprovider-2.23~2.23.0-artemis-amd64.iso) | |
5353
| halliday | 3.4.1 | [![iso http](doc/images/iso-http-green.png)](https://packages.irontec.com/isos/ivozprovider-3.4~3.4.1-halliday-amd64.iso) | |
54-
| tempest | 4.4.0 | [![iso http](doc/images/iso-http-green.png)](https://packages.irontec.com/isos/ivozprovider-4.4~4.4.0-tempest-amd64.iso) | |
54+
| tempest | 4.5.0 | [![iso http](doc/images/iso-http-green.png)](https://packages.irontec.com/isos/ivozprovider-4.5~4.5.0-tempest-amd64.iso) | |
5555

5656

5757
You can read about differences between releases [here](https://github.com/irontec/ivozprovider/blob/main/FAQ.md#what-release-should-i-use).

asterisk/agi/config/services.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,3 +235,7 @@ services:
235235
Agi\Action\VoicemailAction:
236236
lazy: true
237237
arguments: ~
238+
239+
Agi\Action\LocutionAction:
240+
lazy: true
241+
arguments: ~

asterisk/agi/src/Agi/Action/DdiAction.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ public function process()
154154
->setRouteQueue($ddi->getQueue())
155155
->setRouteResidential($ddi->getResidentialDevice())
156156
->setRouteConditional($ddi->getConditionalRoute())
157+
->setRouteLocution($ddi->getLocution())
157158
->route();
158159
}
159160
}

asterisk/agi/src/Agi/Action/ExtensionAction.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ public function process()
6666
->setRouteQueue($extension->getQueue())
6767
->setRouteConditional($extension->getConditionalRoute())
6868
->setRouteVoicemail($extension->getVoicemail())
69+
->setRouteLocution($extension->getLocution())
6970
->route();
7071
}
7172
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?php
2+
3+
namespace Agi\Action;
4+
5+
use Agi\Wrapper;
6+
use Ivoz\Provider\Domain\Model\Locution\LocutionInterface;
7+
8+
class LocutionAction
9+
{
10+
/**
11+
* @var Wrapper
12+
*/
13+
protected $agi;
14+
15+
/**
16+
* @var LocutionInterface|null
17+
*/
18+
protected $locution;
19+
20+
/**
21+
* LocutionAction constructor.
22+
*
23+
* @param Wrapper $agi
24+
*/
25+
public function __construct(
26+
Wrapper $agi
27+
) {
28+
$this->agi = $agi;
29+
}
30+
31+
/**
32+
* @param LocutionInterface $locution
33+
* @return $this
34+
*/
35+
public function setLocution(LocutionInterface $locution = null): self
36+
{
37+
$this->locution = $locution;
38+
return $this;
39+
}
40+
41+
public function process(): void
42+
{
43+
$locution = $this->locution;
44+
if (is_null($locution)) {
45+
$this->agi->error("Locution is not properly defined. Check configuration.");
46+
$this->agi->hangup();
47+
return;
48+
}
49+
50+
// Some feedback for asterisk cli
51+
$this->agi->notice("Processing Locution %s [%s]", $locution->getName(), $locution);
52+
53+
// Play locution and hangup
54+
$this->agi->playbackLocution($locution);
55+
$this->agi->hangup();
56+
}
57+
}

asterisk/agi/src/Agi/Action/RouterAction.php

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
use Ivoz\Provider\Domain\Model\RetailAccount\RetailAccountInterface;
2222
use Ivoz\Provider\Domain\Model\User\UserInterface;
2323
use Ivoz\Provider\Domain\Model\Voicemail\VoicemailInterface;
24+
use Ivoz\Provider\Domain\Model\Locution\LocutionInterface;
2425

2526
class RouterAction
2627
{
@@ -41,6 +42,7 @@ class RouterAction
4142
const Residential = 'residential';
4243
const Retail = 'retail';
4344
const Conditional = 'conditional';
45+
const Locution = 'locution';
4446

4547
/**
4648
* @var Wrapper
@@ -132,6 +134,11 @@ class RouterAction
132134
*/
133135
protected $routeConditional;
134136

137+
/**
138+
* @var ?LocutionInterface
139+
*/
140+
protected $routeLocution;
141+
135142
/**
136143
* @var CompanyServiceInterface
137144
*/
@@ -207,6 +214,11 @@ class RouterAction
207214
*/
208215
protected $voicemailAction;
209216

217+
/**
218+
* @var LocutionAction
219+
*/
220+
protected $locutionAction;
221+
210222
public function __construct(
211223
Wrapper $agi,
212224
ChannelInfo $channelInfo,
@@ -223,7 +235,8 @@ public function __construct(
223235
ResidentialCallAction $residentialCallAction,
224236
RetailCallAction $retailCallAction,
225237
ServiceAction $serviceAction,
226-
VoicemailAction $voiceMailAction
238+
VoicemailAction $voiceMailAction,
239+
LocutionAction $locutionAction
227240
) {
228241
$this->agi = $agi;
229242
$this->channelInfo = $channelInfo;
@@ -241,6 +254,7 @@ public function __construct(
241254
$this->retailCallAction = $retailCallAction;
242255
$this->serviceAction = $serviceAction;
243256
$this->voicemailAction = $voiceMailAction;
257+
$this->locutionAction = $locutionAction;
244258
}
245259

246260
public function setRouteType(string $routeType = null)
@@ -341,6 +355,12 @@ public function setRouteFax(FaxInterface $routeFax = null)
341355
return $this;
342356
}
343357

358+
public function setRouteLocution(LocutionInterface $routeLocution = null): self
359+
{
360+
$this->routeLocution = $routeLocution;
361+
return $this;
362+
}
363+
344364
public function route()
345365
{
346366
// Handle based on configured route type
@@ -387,6 +407,9 @@ public function route()
387407
case RouterAction::Service:
388408
$this->routeService();
389409
break;
410+
case RouterAction::Locution:
411+
$this->routeToLocution();
412+
break;
390413
default:
391414
$this->agi->notice("No configured route type");
392415
break;
@@ -498,4 +521,11 @@ protected function routeService()
498521
->setService($this->routeService)
499522
->process();
500523
}
524+
525+
protected function routeToLocution(): void
526+
{
527+
$this->locutionAction
528+
->setLocution($this->routeLocution)
529+
->process();
530+
}
501531
}

asterisk/agi/src/Dialplan/Friends.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,16 @@ public function __construct(
8585
*/
8686
public function process()
8787
{
88-
// Get identified Enpoint name
89-
$endpointName = $this->agi->getEndpoint();
88+
// Get Refer information
89+
$transferred = $this->agi->getVariable("SIPTRANSFER");
90+
if (!empty($transferred)) {
91+
// Get transferer endpoint name
92+
$endpointName = $this->agi->getVariable("DIALEDPEERNUMBER");
93+
} else {
94+
/** Normal call from User's terminal */
95+
// Get endpoint name from channel
96+
$endpointName = $this->agi->getEndpoint();
97+
}
9098

9199
// Get friend from the endpoint.
92100
$friend = $this->endpointResolver->getFriendFromEndpoint($endpointName);

0 commit comments

Comments
 (0)