diff --git a/CHANGELOG.md b/CHANGELOG.md index 19be64c73..64cb212a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +- fix: parse SMS trusted phone numbers from Apple's `bridgeInitiateData` payload + ## 1.32.2 (2025-09-01) - fix: HTTP response content not captured for authentication and non-streaming requests [#1240](https://github.com/icloud-photos-downloader/icloud_photos_downloader/issues/1240) diff --git a/src/pyicloud_ipd/sms.py b/src/pyicloud_ipd/sms.py index 0a78e2b4f..cb1d8ad24 100644 --- a/src/pyicloud_ipd/sms.py +++ b/src/pyicloud_ipd/sms.py @@ -65,9 +65,10 @@ def parse_trusted_phone_numbers_payload(content: str) -> Sequence[TrustedDevice] parser = _SMSParser() parser.feed(content) parser.close() + two_sv = parser.sms_data.get("direct", {}).get("twoSV", {}) numbers: Sequence[Mapping[str, Any]] = ( - parser.sms_data.get("direct", {}) - .get("twoSV", {}) + two_sv.get("phoneNumberVerification", {}).get("trustedPhoneNumbers", []) + or two_sv.get("bridgeInitiateData", {}) .get("phoneNumberVerification", {}) .get("trustedPhoneNumbers", []) ) diff --git a/tests/test_authentication.py b/tests/test_authentication.py index 02cf211b2..ee8d71303 100644 --- a/tests/test_authentication.py +++ b/tests/test_authentication.py @@ -202,6 +202,13 @@ def test_parse_trusted_phone_numbers_payload_minimal(self) -> None: self.assertEqual(1, len(result), "number of numbers parsed") self.assertEqual(expected, result[0], "parsed number") + def test_parse_trusted_phone_numbers_payload_bridge_initiate_data(self) -> None: + html = '' # noqa: E501 + expected = _TrustedDevice(id=1, obfuscated_number="(***) ***-**81") + result = parse_trusted_phone_numbers_payload(html) + self.assertEqual(1, len(result), "number of numbers parsed") + self.assertEqual(expected, result[0], "parsed number") + def test_parse_trusted_phone_numbers_payload_missing_node0(self) -> None: html = '' # noqa: E501 result = parse_trusted_phone_numbers_payload(html)