mirror of
https://github.com/MengMengCode/VoCat.git
synced 2026-08-20 23:03:44 +08:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8d06231494 |
@@ -661,6 +661,12 @@ func inspectIgnoredCarrierFields(plists []ipccPlist, warnings *ipccWarningSet) {
|
|||||||
warnings.add("apn_settings_ignored", "APN settings and credentials are outside the VoCat carrier-profile importer", fullPath)
|
warnings.add("apn_settings_ignored", "APN settings and credentials are outside the VoCat carrier-profile importer", fullPath)
|
||||||
case key == "media" && strings.Contains(strings.ToLower(strings.Join(keyPath, ".")), "imsconfig"):
|
case key == "media" && strings.Contains(strings.ToLower(strings.Join(keyPath, ".")), "imsconfig"):
|
||||||
warnings.add("device_media_overrides_ignored", "device-family media and codec overrides require hardware validation and were not imported", fullPath)
|
warnings.add("device_media_overrides_ignored", "device-family media and codec overrides require hardware validation and were not imported", fullPath)
|
||||||
|
case key == "countryoforiginationformat":
|
||||||
|
warnings.add(
|
||||||
|
"country_of_origination_format_not_imported",
|
||||||
|
"CountryOfOriginationFormat was not imported because VoCat has no trusted runtime country source; a P-Access-Network-Info value must not be fabricated",
|
||||||
|
fullPath,
|
||||||
|
)
|
||||||
case strings.Contains(key, "emergency") || strings.Contains(key, "e911"):
|
case strings.Contains(key, "emergency") || strings.Contains(key, "e911"):
|
||||||
warnings.add("emergency_settings_ignored", "emergency-service settings are never imported", fullPath)
|
warnings.add("emergency_settings_ignored", "emergency-service settings are never imported", fullPath)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,9 +42,12 @@ func TestImportCarrierIPCCConvertsBinaryAndXMLPlistsSafely(t *testing.T) {
|
|||||||
},
|
},
|
||||||
"IMSConfig": map[string]any{
|
"IMSConfig": map[string]any{
|
||||||
"EnableWiFiCallingWithoutEntitlement": true,
|
"EnableWiFiCallingWithoutEntitlement": true,
|
||||||
"Signaling": map[string]any{"UseIPSec": true},
|
"Signaling": map[string]any{
|
||||||
"Media": map[string]any{"SupportPCMA": false},
|
"UseIPSec": true,
|
||||||
"Emergency": map[string]any{"E911OverITechSupported": true},
|
"CountryOfOriginationFormat": "PANI",
|
||||||
|
},
|
||||||
|
"Media": map[string]any{"SupportPCMA": false},
|
||||||
|
"Emergency": map[string]any{"E911OverITechSupported": true},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -79,6 +82,7 @@ func TestImportCarrierIPCCConvertsBinaryAndXMLPlistsSafely(t *testing.T) {
|
|||||||
"entitlement_bypass_ignored",
|
"entitlement_bypass_ignored",
|
||||||
"apn_settings_ignored",
|
"apn_settings_ignored",
|
||||||
"device_media_overrides_ignored",
|
"device_media_overrides_ignored",
|
||||||
|
"country_of_origination_format_not_imported",
|
||||||
"emergency_settings_ignored",
|
"emergency_settings_ignored",
|
||||||
} {
|
} {
|
||||||
if !hasIPCCWarning(result.Warnings, code) {
|
if !hasIPCCWarning(result.Warnings, code) {
|
||||||
|
|||||||
@@ -991,19 +991,17 @@ func (session *Session) buildRegister(
|
|||||||
}
|
}
|
||||||
lines = append(lines, "User-Agent: "+userAgent)
|
lines = append(lines, "User-Agent: "+userAgent)
|
||||||
|
|
||||||
defaultPANI := "IEEE-802.11;i-wlan-node-id=000000000000;network-provided"
|
|
||||||
pani := defaultPANI
|
|
||||||
if registerOptions.PAccessNetworkInfo != nil {
|
|
||||||
pani = *registerOptions.PAccessNetworkInfo
|
|
||||||
}
|
|
||||||
|
|
||||||
if registerOptions.PPreferredIdentity {
|
if registerOptions.PPreferredIdentity {
|
||||||
lines = append(lines, "P-Preferred-Identity: <"+session.identity.public+">")
|
lines = append(lines, "P-Preferred-Identity: <"+session.identity.public+">")
|
||||||
}
|
}
|
||||||
if value := strings.TrimSpace(registerOptions.PVisitedNetworkID); value != "" {
|
if value := strings.TrimSpace(registerOptions.PVisitedNetworkID); value != "" {
|
||||||
lines = append(lines, `P-Visited-Network-ID: "`+value+`"`)
|
lines = append(lines, `P-Visited-Network-ID: "`+value+`"`)
|
||||||
}
|
}
|
||||||
if pani != "" {
|
// PANI carries access/location information and must not be fabricated.
|
||||||
|
// In particular, "network-provided" identifies a value inserted by a
|
||||||
|
// trusted network proxy, not one generated by this UE. Send the header
|
||||||
|
// only when a carrier profile explicitly supplies a reviewed value.
|
||||||
|
if pani := optionalRegisterHeader(registerOptions.PAccessNetworkInfo); pani != "" {
|
||||||
lines = append(lines, "P-Access-Network-Info: "+pani)
|
lines = append(lines, "P-Access-Network-Info: "+pani)
|
||||||
}
|
}
|
||||||
if value := strings.TrimSpace(registerOptions.CellularNetworkInfo); value != "" {
|
if value := strings.TrimSpace(registerOptions.CellularNetworkInfo); value != "" {
|
||||||
@@ -1047,6 +1045,13 @@ func (session *Session) buildRegister(
|
|||||||
return []byte(strings.Join(lines, "\r\n")), nil
|
return []byte(strings.Join(lines, "\r\n")), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func optionalRegisterHeader(value *string) string {
|
||||||
|
if value == nil {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return strings.TrimSpace(*value)
|
||||||
|
}
|
||||||
|
|
||||||
func (session *Session) buildContact(contactAddress string, registerOptions vowifi.IMSRegisterOptions) string {
|
func (session *Session) buildContact(contactAddress string, registerOptions vowifi.IMSRegisterOptions) string {
|
||||||
base := fmt.Sprintf("<sip:%s@%s;transport=%s>", session.identity.user, contactAddress, session.transport)
|
base := fmt.Sprintf("<sip:%s@%s;transport=%s>", session.identity.user, contactAddress, session.transport)
|
||||||
instanceID := session.instanceID
|
instanceID := session.instanceID
|
||||||
|
|||||||
@@ -377,6 +377,7 @@ func serveRegistration(listener *net.UDPConn, nonce string, confirmSMS bool) err
|
|||||||
for _, forbidden := range []string{
|
for _, forbidden := range []string{
|
||||||
"p-visited-network-id",
|
"p-visited-network-id",
|
||||||
"p-preferred-identity",
|
"p-preferred-identity",
|
||||||
|
"p-access-network-info",
|
||||||
} {
|
} {
|
||||||
if headers[forbidden] != "" {
|
if headers[forbidden] != "" {
|
||||||
return fmt.Errorf(
|
return fmt.Errorf(
|
||||||
@@ -386,9 +387,6 @@ func serveRegistration(listener *net.UDPConn, nonce string, confirmSMS bool) err
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if headers["p-access-network-info"] != "IEEE-802.11;i-wlan-node-id=000000000000;network-provided" {
|
|
||||||
return fmt.Errorf("REGISTER P-Access-Network-Info = %q", headers["p-access-network-info"])
|
|
||||||
}
|
|
||||||
if !strings.Contains(headers["allow"], "MESSAGE") ||
|
if !strings.Contains(headers["allow"], "MESSAGE") ||
|
||||||
!strings.Contains(string(packet[:count]), "Accept-Contact: *;+g.3gpp.smsip") {
|
!strings.Contains(string(packet[:count]), "Accept-Contact: *;+g.3gpp.smsip") {
|
||||||
return fmt.Errorf("REGISTER omitted SMS-over-IMS capability: Allow=%q", headers["allow"])
|
return fmt.Errorf("REGISTER omitted SMS-over-IMS capability: Allow=%q", headers["allow"])
|
||||||
@@ -497,6 +495,26 @@ func serveRegistration(listener *net.UDPConn, nonce string, confirmSMS bool) err
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestOptionalRegisterHeaderRequiresExplicitNonemptyValue(t *testing.T) {
|
||||||
|
explicit := " IEEE-802.11;i-wlan-node-id=aabbccddeeff "
|
||||||
|
empty := " "
|
||||||
|
for _, test := range []struct {
|
||||||
|
name string
|
||||||
|
value *string
|
||||||
|
want string
|
||||||
|
}{
|
||||||
|
{name: "unspecified", value: nil, want: ""},
|
||||||
|
{name: "explicit omission", value: &empty, want: ""},
|
||||||
|
{name: "explicit value", value: &explicit, want: "IEEE-802.11;i-wlan-node-id=aabbccddeeff"},
|
||||||
|
} {
|
||||||
|
t.Run(test.name, func(t *testing.T) {
|
||||||
|
if got := optionalRegisterHeader(test.value); got != test.want {
|
||||||
|
t.Fatalf("optionalRegisterHeader() = %q, want %q", got, test.want)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func serveRefreshFailure(listener *net.UDPConn, nonce string) error {
|
func serveRefreshFailure(listener *net.UDPConn, nonce string) error {
|
||||||
var callID string
|
var callID string
|
||||||
for step := 0; step < 3; step++ {
|
for step := 0; step < 3; step++ {
|
||||||
|
|||||||
Reference in New Issue
Block a user