Skip to content

Commit 9145d06

Browse files
author
Huakang Li
committed
fix: parse trusted phone numbers from bridgeInitiateData
1 parent 3a97872 commit 9145d06

File tree

3 files changed

+12
-2
lines changed

3 files changed

+12
-2
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
## Unreleased
44

5+
- fix: parse SMS trusted phone numbers from Apple's `bridgeInitiateData` payload
6+
57
## 1.32.2 (2025-09-01)
68

79
- fix: HTTP response content not captured for authentication and non-streaming requests [#1240](https://github.com/icloud-photos-downloader/icloud_photos_downloader/issues/1240)

src/pyicloud_ipd/sms.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,10 @@ def parse_trusted_phone_numbers_payload(content: str) -> Sequence[TrustedDevice]
6565
parser = _SMSParser()
6666
parser.feed(content)
6767
parser.close()
68+
two_sv = parser.sms_data.get("direct", {}).get("twoSV", {})
6869
numbers: Sequence[Mapping[str, Any]] = (
69-
parser.sms_data.get("direct", {})
70-
.get("twoSV", {})
70+
two_sv.get("phoneNumberVerification", {}).get("trustedPhoneNumbers", [])
71+
or two_sv.get("bridgeInitiateData", {})
7172
.get("phoneNumberVerification", {})
7273
.get("trustedPhoneNumbers", [])
7374
)

tests/test_authentication.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,13 @@ def test_parse_trusted_phone_numbers_payload_minimal(self) -> None:
202202
self.assertEqual(1, len(result), "number of numbers parsed")
203203
self.assertEqual(expected, result[0], "parsed number")
204204

205+
def test_parse_trusted_phone_numbers_payload_bridge_initiate_data(self) -> None:
206+
html = '<script type="application/json" class="boot_args">{"direct":{"twoSV":{"bridgeInitiateData":{"phoneNumberVerification":{"trustedPhoneNumbers":[{"numberWithDialCode":"+1 (•••) •••-••81","pushMode":"sms","obfuscatedNumber":"(•••) •••-••81","lastTwoDigits":"81","id":1}]}},"authInitialRoute":"auth/verify/phone"}}}</script>' # noqa: E501
207+
expected = _TrustedDevice(id=1, obfuscated_number="(***) ***-**81")
208+
result = parse_trusted_phone_numbers_payload(html)
209+
self.assertEqual(1, len(result), "number of numbers parsed")
210+
self.assertEqual(expected, result[0], "parsed number")
211+
205212
def test_parse_trusted_phone_numbers_payload_missing_node0(self) -> None:
206213
html = '<script type="application/json" class="boot_args">{"MISSINGdirect":{"twoSV":{"phoneNumberVerification":{"trustedPhoneNumbers":[{"numberWithDialCode":"+1 (•••) •••-••81","pushMode":"sms","obfuscatedNumber":"(•••) •••-••81","lastTwoDigits":"81","id":1}]},"authInitialRoute":"auth/verify/phone"}}}</script>' # noqa: E501
207214
result = parse_trusted_phone_numbers_payload(html)

0 commit comments

Comments
 (0)