mirror of
https://github.com/MengMengCode/VoCat.git
synced 2026-08-21 23:33:42 +08:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b2daa972d2 |
@@ -115,7 +115,9 @@ func (session *Session) DialCall(ctx context.Context, number string) (vowifi.Cal
|
|||||||
"P-Preferred-Identity: <"+preferredIdentity+">",
|
"P-Preferred-Identity: <"+preferredIdentity+">",
|
||||||
"P-Preferred-Service: "+mmtelServiceURN,
|
"P-Preferred-Service: "+mmtelServiceURN,
|
||||||
`Accept-Contact: *;+g.3gpp.icsi-ref="`+mmtelFeatureTag+`"`,
|
`Accept-Contact: *;+g.3gpp.icsi-ref="`+mmtelFeatureTag+`"`,
|
||||||
"P-Access-Network-Info: "+session.pAccessNetworkInfo(),
|
)
|
||||||
|
lines = session.appendPAccessNetworkInfoHeader(lines)
|
||||||
|
lines = append(lines,
|
||||||
"User-Agent: "+session.imsUserAgent(),
|
"User-Agent: "+session.imsUserAgent(),
|
||||||
"Allow: INVITE, ACK, CANCEL, BYE, OPTIONS, MESSAGE, PRACK, UPDATE, INFO",
|
"Allow: INVITE, ACK, CANCEL, BYE, OPTIONS, MESSAGE, PRACK, UPDATE, INFO",
|
||||||
"Supported: 100rel, timer, replaces",
|
"Supported: 100rel, timer, replaces",
|
||||||
@@ -499,7 +501,9 @@ func (session *Session) sendRejectedInviteACK(call *imsCall, response *sipRespon
|
|||||||
"To: "+to,
|
"To: "+to,
|
||||||
"Call-ID: "+call.callID,
|
"Call-ID: "+call.callID,
|
||||||
fmt.Sprintf("CSeq: %d ACK", call.cseq),
|
fmt.Sprintf("CSeq: %d ACK", call.cseq),
|
||||||
"P-Access-Network-Info: "+session.pAccessNetworkInfo(),
|
)
|
||||||
|
lines = session.appendPAccessNetworkInfoHeader(lines)
|
||||||
|
lines = append(lines,
|
||||||
"User-Agent: "+session.imsUserAgent(),
|
"User-Agent: "+session.imsUserAgent(),
|
||||||
"Content-Length: 0", "", "",
|
"Content-Length: 0", "", "",
|
||||||
)
|
)
|
||||||
@@ -577,7 +581,9 @@ func (session *Session) sendPRACK(call *imsCall, response *sipResponse) {
|
|||||||
lines = append(lines,
|
lines = append(lines,
|
||||||
"From: "+from, "To: "+to, "Call-ID: "+call.callID,
|
"From: "+from, "To: "+to, "Call-ID: "+call.callID,
|
||||||
fmt.Sprintf("CSeq: %d PRACK", cseq), "RAck: "+rseq+" "+inviteCSeq,
|
fmt.Sprintf("CSeq: %d PRACK", cseq), "RAck: "+rseq+" "+inviteCSeq,
|
||||||
"P-Access-Network-Info: "+session.pAccessNetworkInfo(),
|
)
|
||||||
|
lines = session.appendPAccessNetworkInfoHeader(lines)
|
||||||
|
lines = append(lines,
|
||||||
"User-Agent: "+session.imsUserAgent(),
|
"User-Agent: "+session.imsUserAgent(),
|
||||||
"Content-Length: 0", "", "",
|
"Content-Length: 0", "", "",
|
||||||
)
|
)
|
||||||
@@ -712,7 +718,7 @@ func (session *Session) buildDialogRequest(call *imsCall, method string, cseq ui
|
|||||||
"User-Agent: "+session.imsUserAgent(),
|
"User-Agent: "+session.imsUserAgent(),
|
||||||
)
|
)
|
||||||
if method != "CANCEL" {
|
if method != "CANCEL" {
|
||||||
lines = append(lines, "P-Access-Network-Info: "+session.pAccessNetworkInfo())
|
lines = session.appendPAccessNetworkInfoHeader(lines)
|
||||||
}
|
}
|
||||||
if method == "UPDATE" {
|
if method == "UPDATE" {
|
||||||
lines = append(lines, session.dialogContactHeader())
|
lines = append(lines, session.dialogContactHeader())
|
||||||
@@ -827,6 +833,13 @@ func (session *Session) pAccessNetworkInfo() string {
|
|||||||
return resolveSessionPAccessNetworkInfo(session.request.Identity, session.imsLogger())
|
return resolveSessionPAccessNetworkInfo(session.request.Identity, session.imsLogger())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (session *Session) appendPAccessNetworkInfoHeader(lines []string) []string {
|
||||||
|
if pani := session.pAccessNetworkInfo(); pani != "" {
|
||||||
|
return append(lines, "P-Access-Network-Info: "+pani)
|
||||||
|
}
|
||||||
|
return lines
|
||||||
|
}
|
||||||
|
|
||||||
func callResponseDiagnostic(response *sipResponse) string {
|
func callResponseDiagnostic(response *sipResponse) string {
|
||||||
if response == nil {
|
if response == nil {
|
||||||
return ""
|
return ""
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"io"
|
"io"
|
||||||
"net"
|
"net"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
@@ -239,6 +241,56 @@ func TestOutgoingLocalNumberUsesIMSPhoneContextAndMMTelHeaders(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestDialogRequestOmitsPAccessNetworkInfoWhenProfileDisablesPANI(t *testing.T) {
|
||||||
|
profileDir := t.TempDir()
|
||||||
|
profile := `{"version":1,"profiles":[{"id":"test-pani-disabled","match":{"home_plmns":["00101"]},"ims":{"pani_enabled":false}}]}`
|
||||||
|
if err := os.WriteFile(filepath.Join(profileDir, "pani-disabled.json"), []byte(profile), 0o600); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
emptyProfileDir := t.TempDir()
|
||||||
|
t.Cleanup(func() {
|
||||||
|
if err := vowifi.LoadCarrierProfileDirectory(emptyProfileDir); err != nil {
|
||||||
|
t.Errorf("clear external carrier profiles: %v", err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if err := vowifi.LoadCarrierProfileDirectory(profileDir); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
identity := vowifi.SIMIdentity{HomeMCC: "001", HomeMNC: "01", IMSI: "001010123456789"}
|
||||||
|
pani := resolveSessionPAccessNetworkInfo(identity, nil)
|
||||||
|
if pani != "" {
|
||||||
|
t.Fatalf("disabled profile PANI = %q, want empty", pani)
|
||||||
|
}
|
||||||
|
client, peer := net.Pipe()
|
||||||
|
t.Cleanup(func() {
|
||||||
|
if err := client.Close(); err != nil {
|
||||||
|
t.Errorf("close client connection: %v", err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
t.Cleanup(func() {
|
||||||
|
if err := peer.Close(); err != nil {
|
||||||
|
t.Errorf("close peer connection: %v", err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
session := &Session{
|
||||||
|
request: vowifi.IMSRequest{Identity: identity},
|
||||||
|
transport: "tcp",
|
||||||
|
conn: client,
|
||||||
|
}
|
||||||
|
call := &imsCall{
|
||||||
|
target: "sip:[email protected]",
|
||||||
|
from: "<sip:[email protected]>;tag=local",
|
||||||
|
to: "<sip:[email protected]>;tag=remote",
|
||||||
|
callID: "pani-disabled-call",
|
||||||
|
}
|
||||||
|
|
||||||
|
request := string(session.buildDialogRequest(call, "BYE", 2))
|
||||||
|
if strings.Contains(request, "\r\nP-Access-Network-Info:") {
|
||||||
|
t.Fatalf("BYE contains disabled P-Access-Network-Info header:\n%s", request)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestCallOriginatingIdentitiesFallBackToRegisteredIMPU(t *testing.T) {
|
func TestCallOriginatingIdentitiesFallBackToRegisteredIMPU(t *testing.T) {
|
||||||
session := &Session{
|
session := &Session{
|
||||||
identity: identitySet{
|
identity: identitySet{
|
||||||
|
|||||||
Reference in New Issue
Block a user