fix: domínio SIP único por tenant + grupo de captura + revelar senha do ramal
Achado real, detalhado pelo usuário testando o PABX de verdade: TenantsController
.create() gravava telephonyDomain="b2bcall.local" fixo pra TODO tenant novo —
b2bcall-fs-config decide qual tenant é dono de um REGISTER só pelo domínio
(Tenant.findFirst({telephonyDomain})), então com todo tenant no mesmo domínio o
isolamento de PABX (ramais, call groups, filas, IVR) não tinha como funcionar de
verdade. Investigado direto no container antes de mudar qualquer coisa: o sofia
profile "internal" (vanilla) já vem com <domain name="all" alias="true".../> — o
FreeSWITCH sempre aceitou domínio dinâmico por REGISTER, o bug era só a aplicação.
Nenhuma mudança de infra foi necessária.
Tenant.telephonyDomain agora é obrigatório e @unique (migration com backfill:
tenants existentes ganharam {code}.b2bcall.net, e os Extension.domain já criados
foram atualizados junto). Tela de criação de tenant sugere {code}.b2bcall.net ao
digitar o código, editável.
Extension.callGroup (novo) — ramais no mesmo grupo podem capturar a chamada um do
outro (*8), fora do grupo não. Vira a variable call-group no directory XML; a regra
de dialplan do *8 em si fica pra configurar em Telefonia > Dialplan (editor já
existe). Editável na criação e depois (PATCH /extensions/:id, novo).
POST /extensions/:id/reveal-password (novo) — achado real: "show once" puro não
funciona no dia a dia (reconfigurar um telefone/softphone precisa da senha de novo;
forçar reset toda vez derruba outro aparelho já configurado). sipPasswordEnc sempre
foi criptografia reversível, nunca hash — só não estava exposto. Auditado
(EXTENSION_PASSWORD_REVEALED) por ser sensível mesmo sem escrita.
apps/freeswitch-config reconstruído e reiniciado. Testado ponta a ponta contra o
container REAL via docker exec: senha revelada bate com a gerada na criação,
call-group aparece no XML, e o mesmo número de ramal em domínios diferentes nunca
se confunde (isolamento cross-tenant confirmado de verdade).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BFaBaBSQGhyXGEgtTYZGV8
This commit is contained in:
@@ -0,0 +1,19 @@
|
||||
-- AlterTable
|
||||
ALTER TABLE "extensions" ADD COLUMN "call_group" TEXT;
|
||||
|
||||
-- Backfill: todo tenant existente nascia com o mesmo telephony_domain fixo
|
||||
-- ("b2bcall.local") — achado real reportado pelo usuário (isolamento de
|
||||
-- PABX por tenant nao funciona sem dominio unico por tenant, secao 178).
|
||||
-- Da' um valor distinto e' pra cada um antes de criar a constraint UNIQUE
|
||||
-- abaixo, seguindo a mesma convencao que passa a ser sugerida na criacao
|
||||
-- de tenant novo (`{code}.b2bcall.net`).
|
||||
UPDATE "tenants" SET "telephony_domain" = "code" || '.b2bcall.net' WHERE "telephony_domain" IS NOT NULL;
|
||||
|
||||
-- Ramais já existentes guardaram o domain antigo no momento da criação
|
||||
-- (Extension.domain é uma cópia, não uma FK) — sem isto ficariam com um
|
||||
-- <domain> desatualizado no XML do directory depois do backfill acima.
|
||||
UPDATE "extensions" e SET "domain" = t."telephony_domain"
|
||||
FROM "tenants" t WHERE e."tenant_id" = t."id";
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "tenants_telephony_domain_key" ON "tenants"("telephony_domain");
|
||||
Reference in New Issue
Block a user