fix(trunks,outbound): activation trust_id_outbound et formatage strict Caller ID Name (CNAM) pour trunks SIP (v1.6.3)
This commit is contained in:
1 parent
4caef3abef
commit
5e80461d12
6 files changed
+92
-9
No files matched your search
+75
-3
@@ -302,6 +302,7 @@ class ConfigGenerator
|
||||
$sendRpid = ((int)($trunk['send_rpid'] ?? 0) === 1) ? 'yes' : 'no';
|
||||
$sendDiversion = ((int)($trunk['send_diversion'] ?? 1) === 1) ? 'yes' : 'no';
|
||||
$trustInbound = ((int)($trunk['trust_id_inbound'] ?? 1) === 1) ? 'yes' : 'no';
|
||||
$trustOutbound = (!isset($trunk['trust_id_outbound']) || (int)$trunk['trust_id_outbound'] === 1) ? 'yes' : 'no';
|
||||
$dtmfMode = trim((string)($trunk['dtmf_mode'] ?? 'rfc4733')) ?: 'rfc4733';
|
||||
$mediaEnc = trim((string)($trunk['media_encryption'] ?? 'no')) ?: 'no';
|
||||
$natSym = ((int)($trunk['nat_symmetric'] ?? 1) === 1) ? 'yes' : 'no';
|
||||
@@ -354,7 +355,18 @@ class ConfigGenerator
|
||||
$lines[] = "outbound_proxy = {$outboundProxy}";
|
||||
}
|
||||
if ($callerId !== '') {
|
||||
$lines[] = "callerid = {$callerId}";
|
||||
if (preg_match('/^(?:\"?([^\"<>]+?)\"?\s*)?<([^>]+)>$/u', $callerId, $cm)) {
|
||||
$cName = trim($cm[1] ?? '');
|
||||
$cNum = trim($cm[2] ?? '');
|
||||
if ($cName !== '') {
|
||||
$cNameClean = str_replace('"', '', $cName);
|
||||
$lines[] = "callerid = \"{$cNameClean}\" <{$cNum}>";
|
||||
} else {
|
||||
$lines[] = "callerid = <{$cNum}>";
|
||||
}
|
||||
} else {
|
||||
$lines[] = "callerid = {$callerId}";
|
||||
}
|
||||
}
|
||||
$lines[] = "disallow = all";
|
||||
foreach ($codecs as $codec) {
|
||||
@@ -370,6 +382,7 @@ class ConfigGenerator
|
||||
$lines[] = "send_rpid = {$sendRpid}";
|
||||
$lines[] = "send_diversion = {$sendDiversion}";
|
||||
$lines[] = "trust_id_inbound = {$trustInbound}";
|
||||
$lines[] = "trust_id_outbound = {$trustOutbound}";
|
||||
$lines[] = "timers = {$timers}";
|
||||
if ($rtpKeepalive > 0) {
|
||||
$lines[] = "rtp_keepalive = {$rtpKeepalive}";
|
||||
@@ -1158,7 +1171,9 @@ class ConfigGenerator
|
||||
|
||||
// 3. Positionnement du CallerID Sortant de la route
|
||||
if ($rCid !== '') {
|
||||
$sub[] = " same => n,Set(CALLERID(all)={$rCid})";
|
||||
foreach ($this->buildCallerIdDialplan($rCid) as $cidStmt) {
|
||||
$sub[] = $cidStmt;
|
||||
}
|
||||
}
|
||||
|
||||
// 4. Séquence de Trunks avec bascule automatique (Failover)
|
||||
@@ -1173,7 +1188,9 @@ class ConfigGenerator
|
||||
$tFallbackCid = $tObj ? trim((string)($tObj['outbound_callerid'] ?? '')) : '';
|
||||
|
||||
if ($rCid === '' && $tFallbackCid !== '' && $overrideCid) {
|
||||
$sub[] = " same => n,Set(CALLERID(all)={$tFallbackCid})";
|
||||
foreach ($this->buildCallerIdDialplan($tFallbackCid) as $cidStmt) {
|
||||
$sub[] = $cidStmt;
|
||||
}
|
||||
}
|
||||
|
||||
$validTrunkCount++;
|
||||
@@ -2257,5 +2274,60 @@ class ConfigGenerator
|
||||
$slug = preg_replace('/[^a-z0-9]+/', '-', $slug);
|
||||
return trim($slug, '-') ?: 'default';
|
||||
}
|
||||
|
||||
/**
|
||||
* Formate les instructions Dialplan pour le positionnement du Caller ID (Nom, Numéro, Présentation, CallerID all)
|
||||
* afin de garantir la transmission du CNAM (Caller ID Name) et du CLI par Asterisk PJSIP.
|
||||
*
|
||||
* @param string $cidString Chaîne du type '"Sytelis Consulting" <0422560185>', 'Sytelis <0422560185>', '0422560185' ou 'Sytelis'
|
||||
* @param string $indent
|
||||
* @return array<string>
|
||||
*/
|
||||
private function buildCallerIdDialplan(string $cidString, string $indent = ' same => n,'): array
|
||||
{
|
||||
$cidString = trim($cidString);
|
||||
if ($cidString === '') {
|
||||
return [];
|
||||
}
|
||||
|
||||
$name = '';
|
||||
$num = '';
|
||||
|
||||
// Formats reconnus :
|
||||
// 1. "Nom Complet" <0422560185> ou Nom Complet <0422560185>
|
||||
if (preg_match('/^(?:\"?([^\"<>]+?)\"?\s*)?<([^>]+)>$/u', $cidString, $m)) {
|
||||
$name = trim($m[1] ?? '');
|
||||
$num = trim($m[2] ?? '');
|
||||
} elseif (preg_match('/^<([^>]+)>$/', $cidString, $m)) {
|
||||
$num = trim($m[1]);
|
||||
} elseif (preg_match('/^\+?[0-9*#]+$/', $cidString)) {
|
||||
$num = $cidString;
|
||||
} else {
|
||||
// Uniquement un nom
|
||||
$name = trim($cidString, " \t\n\r\0\x0B\"");
|
||||
}
|
||||
|
||||
$lines = [];
|
||||
if ($num !== '') {
|
||||
$lines[] = "{$indent}Set(CALLERID(num)={$num})";
|
||||
$lines[] = "{$indent}Set(CALLERID(num-pres)=allowed_passed_screen)";
|
||||
}
|
||||
if ($name !== '') {
|
||||
$cleanName = str_replace('"', '', $name);
|
||||
$lines[] = "{$indent}Set(CALLERID(name)=\"{$cleanName}\")";
|
||||
$lines[] = "{$indent}Set(CALLERID(name-pres)=allowed_passed_screen)";
|
||||
}
|
||||
if ($name !== '' && $num !== '') {
|
||||
$cleanName = str_replace('"', '', $name);
|
||||
$lines[] = "{$indent}Set(CALLERID(all)=\"{$cleanName}\" <{$num}>)";
|
||||
} elseif ($num !== '') {
|
||||
$lines[] = "{$indent}Set(CALLERID(all)={$num})";
|
||||
} elseif ($name !== '') {
|
||||
$cleanName = str_replace('"', '', $name);
|
||||
$lines[] = "{$indent}Set(CALLERID(all)=\"{$cleanName}\")";
|
||||
}
|
||||
|
||||
return $lines;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -150,6 +150,7 @@ class Database
|
||||
send_pai INTEGER NOT NULL DEFAULT 1 CHECK (send_pai IN (0, 1)),
|
||||
send_rpid INTEGER NOT NULL DEFAULT 0 CHECK (send_rpid IN (0, 1)),
|
||||
trust_id_inbound INTEGER NOT NULL DEFAULT 1 CHECK (trust_id_inbound IN (0, 1)),
|
||||
trust_id_outbound INTEGER NOT NULL DEFAULT 1 CHECK (trust_id_outbound IN (0, 1)),
|
||||
codecs VARCHAR(64) NOT NULL DEFAULT 'alaw,ulaw,g722',
|
||||
dtmf_mode VARCHAR(16) NOT NULL DEFAULT 'rfc4733',
|
||||
media_encryption VARCHAR(16) NOT NULL DEFAULT 'no',
|
||||
@@ -525,6 +526,7 @@ class Database
|
||||
'moh_sound_id' => "INTEGER NOT NULL DEFAULT 0",
|
||||
'cid_name_prefix' => "VARCHAR(64) NOT NULL DEFAULT ''",
|
||||
'dial_options' => "VARCHAR(32) NOT NULL DEFAULT 'tTR'",
|
||||
'trust_id_outbound' => "INTEGER NOT NULL DEFAULT 1 CHECK (trust_id_outbound IN (0, 1))",
|
||||
];
|
||||
|
||||
foreach ($extraColumns as $colName => $colDef) {
|
||||
|
||||
Reference in new issue
Block a user