pymobiledevice3 4.20.21__tar.gz → 7.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (322) hide show
  1. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/.github/FUNDING.yml +1 -1
  2. pymobiledevice3-7.3.0/.github/workflows/generate-executable.py +67 -0
  3. pymobiledevice3-7.3.0/.github/workflows/python-app.yml +45 -0
  4. pymobiledevice3-7.3.0/.github/workflows/python-publish.yml +27 -0
  5. pymobiledevice3-7.3.0/.pre-commit-config.yaml +9 -0
  6. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/PKG-INFO +13 -15
  7. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/README.md +1 -0
  8. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/misc/plist_sniffer.py +15 -15
  9. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/misc/remotexpc_sniffer.py +29 -28
  10. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/misc/understanding_idevice_protocol_layers.md +11 -6
  11. pymobiledevice3-7.3.0/pymobiledevice3/__main__.py +440 -0
  12. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/_version.py +16 -3
  13. pymobiledevice3-7.3.0/pymobiledevice3/bonjour.py +380 -0
  14. pymobiledevice3-7.3.0/pymobiledevice3/ca.py +290 -0
  15. pymobiledevice3-7.3.0/pymobiledevice3/cli/activation.py +46 -0
  16. pymobiledevice3-7.3.0/pymobiledevice3/cli/afc.py +64 -0
  17. pymobiledevice3-7.3.0/pymobiledevice3/cli/amfi.py +33 -0
  18. pymobiledevice3-7.3.0/pymobiledevice3/cli/apps.py +104 -0
  19. pymobiledevice3-7.3.0/pymobiledevice3/cli/backup.py +241 -0
  20. pymobiledevice3-7.3.0/pymobiledevice3/cli/bonjour.py +87 -0
  21. pymobiledevice3-7.3.0/pymobiledevice3/cli/cli_common.py +309 -0
  22. pymobiledevice3-7.3.0/pymobiledevice3/cli/companion_proxy.py +22 -0
  23. pymobiledevice3-7.3.0/pymobiledevice3/cli/crash.py +131 -0
  24. pymobiledevice3-7.3.0/pymobiledevice3/cli/developer/__init__.py +62 -0
  25. pymobiledevice3-7.3.0/pymobiledevice3/cli/developer/accessibility/__init__.py +65 -0
  26. pymobiledevice3-7.3.0/pymobiledevice3/cli/developer/accessibility/settings.py +44 -0
  27. pymobiledevice3-7.3.0/pymobiledevice3/cli/developer/arbitration.py +50 -0
  28. pymobiledevice3-7.3.0/pymobiledevice3/cli/developer/condition.py +33 -0
  29. pymobiledevice3-7.3.0/pymobiledevice3/cli/developer/core_device.py +294 -0
  30. pymobiledevice3-7.3.0/pymobiledevice3/cli/developer/debugserver.py +286 -0
  31. pymobiledevice3-7.3.0/pymobiledevice3/cli/developer/dvt/__init__.py +442 -0
  32. pymobiledevice3-7.3.0/pymobiledevice3/cli/developer/dvt/core_profile_session.py +295 -0
  33. pymobiledevice3-7.3.0/pymobiledevice3/cli/developer/dvt/simulate_location.py +56 -0
  34. pymobiledevice3-7.3.0/pymobiledevice3/cli/developer/dvt/sysmon/__init__.py +69 -0
  35. pymobiledevice3-7.3.0/pymobiledevice3/cli/developer/dvt/sysmon/process.py +188 -0
  36. pymobiledevice3-7.3.0/pymobiledevice3/cli/developer/fetch_symbols.py +108 -0
  37. pymobiledevice3-7.3.0/pymobiledevice3/cli/developer/simulate_location.py +51 -0
  38. pymobiledevice3-7.3.0/pymobiledevice3/cli/diagnostics/__init__.py +75 -0
  39. pymobiledevice3-7.3.0/pymobiledevice3/cli/diagnostics/battery.py +47 -0
  40. pymobiledevice3-7.3.0/pymobiledevice3/cli/idam.py +42 -0
  41. pymobiledevice3-7.3.0/pymobiledevice3/cli/lockdown.py +191 -0
  42. pymobiledevice3-7.3.0/pymobiledevice3/cli/mounter.py +241 -0
  43. pymobiledevice3-7.3.0/pymobiledevice3/cli/notification.py +68 -0
  44. pymobiledevice3-7.3.0/pymobiledevice3/cli/pcap.py +78 -0
  45. pymobiledevice3-7.3.0/pymobiledevice3/cli/power_assertion.py +26 -0
  46. pymobiledevice3-7.3.0/pymobiledevice3/cli/processes.py +31 -0
  47. pymobiledevice3-7.3.0/pymobiledevice3/cli/profile.py +236 -0
  48. pymobiledevice3-7.3.0/pymobiledevice3/cli/provision.py +59 -0
  49. pymobiledevice3-7.3.0/pymobiledevice3/cli/remote.py +348 -0
  50. pymobiledevice3-7.3.0/pymobiledevice3/cli/restore.py +252 -0
  51. pymobiledevice3-7.3.0/pymobiledevice3/cli/springboard.py +90 -0
  52. pymobiledevice3-7.3.0/pymobiledevice3/cli/syslog.py +294 -0
  53. pymobiledevice3-7.3.0/pymobiledevice3/cli/usbmux.py +116 -0
  54. pymobiledevice3-7.3.0/pymobiledevice3/cli/version.py +14 -0
  55. pymobiledevice3-7.3.0/pymobiledevice3/cli/webinspector.py +584 -0
  56. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/common.py +1 -1
  57. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/exceptions.py +164 -61
  58. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/irecv.py +49 -53
  59. pymobiledevice3-7.3.0/pymobiledevice3/irecv_devices.py +1503 -0
  60. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/lockdown.py +425 -257
  61. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/lockdown_service_provider.py +10 -7
  62. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/osu/os_utils.py +18 -9
  63. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/osu/posix_util.py +28 -15
  64. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/osu/win_util.py +14 -8
  65. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/pair_records.py +19 -19
  66. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/remote/common.py +4 -4
  67. pymobiledevice3-7.3.0/pymobiledevice3/remote/core_device/app_service.py +154 -0
  68. pymobiledevice3-7.3.0/pymobiledevice3/remote/core_device/core_device_service.py +37 -0
  69. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/remote/core_device/device_info.py +5 -5
  70. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/remote/core_device/diagnostics_service.py +10 -8
  71. pymobiledevice3-7.3.0/pymobiledevice3/remote/core_device/file_service.py +102 -0
  72. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/remote/remote_service_discovery.py +63 -37
  73. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/remote/remotexpc.py +69 -44
  74. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/remote/tunnel_service.py +401 -306
  75. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/remote/utils.py +14 -13
  76. pymobiledevice3-7.3.0/pymobiledevice3/remote/xpc_message.py +346 -0
  77. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/resources/dsc_uuid_map.py +19 -19
  78. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/resources/firmware_notifications.py +16 -16
  79. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/resources/notifications.txt +52 -0
  80. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/restore/asr.py +27 -27
  81. pymobiledevice3-7.3.0/pymobiledevice3/restore/base_restore.py +162 -0
  82. pymobiledevice3-7.3.0/pymobiledevice3/restore/consts.py +91 -0
  83. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/restore/device.py +47 -15
  84. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/restore/fdr.py +46 -48
  85. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/restore/ftab.py +19 -19
  86. pymobiledevice3-7.3.0/pymobiledevice3/restore/img4.py +163 -0
  87. pymobiledevice3-7.3.0/pymobiledevice3/restore/mbn.py +587 -0
  88. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/restore/recovery.py +141 -149
  89. pymobiledevice3-7.3.0/pymobiledevice3/restore/restore.py +1396 -0
  90. pymobiledevice3-7.3.0/pymobiledevice3/restore/restore_options.py +225 -0
  91. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/restore/restored_client.py +25 -22
  92. pymobiledevice3-7.3.0/pymobiledevice3/restore/tss.py +912 -0
  93. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/service_connection.py +85 -72
  94. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/accessibilityaudit.py +137 -127
  95. pymobiledevice3-7.3.0/pymobiledevice3/services/afc.py +1551 -0
  96. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/amfi.py +22 -19
  97. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/companion.py +23 -19
  98. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/crash_reports.py +61 -47
  99. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/debugserver_applist.py +3 -3
  100. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/device_arbitration.py +8 -8
  101. pymobiledevice3-7.3.0/pymobiledevice3/services/device_link.py +229 -0
  102. pymobiledevice3-7.3.0/pymobiledevice3/services/diagnostics.py +1038 -0
  103. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/dtfetchsymbols.py +8 -8
  104. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/dvt/dvt_secure_socket_proxy.py +4 -4
  105. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/dvt/dvt_testmanaged_proxy.py +4 -4
  106. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/dvt/instruments/activity_trace_tap.py +85 -74
  107. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/dvt/instruments/application_listing.py +2 -3
  108. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/dvt/instruments/condition_inducer.py +7 -6
  109. pymobiledevice3-7.3.0/pymobiledevice3/services/dvt/instruments/core_profile_session_tap.py +769 -0
  110. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/dvt/instruments/device_info.py +20 -11
  111. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/dvt/instruments/energy_monitor.py +1 -1
  112. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/dvt/instruments/graphics.py +1 -1
  113. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/dvt/instruments/location_simulation.py +1 -1
  114. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/dvt/instruments/location_simulation_base.py +10 -10
  115. pymobiledevice3-7.3.0/pymobiledevice3/services/dvt/instruments/network_monitor.py +158 -0
  116. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/dvt/instruments/notifications.py +1 -1
  117. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/dvt/instruments/process_control.py +25 -10
  118. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/dvt/instruments/screenshot.py +2 -2
  119. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/dvt/instruments/sysmontap.py +15 -15
  120. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/dvt/testmanaged/xcuitest.py +42 -52
  121. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/file_relay.py +10 -10
  122. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/heartbeat.py +8 -7
  123. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/house_arrest.py +12 -15
  124. pymobiledevice3-7.3.0/pymobiledevice3/services/idam.py +20 -0
  125. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/installation_proxy.py +121 -99
  126. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/lockdown_service.py +20 -10
  127. pymobiledevice3-7.3.0/pymobiledevice3/services/misagent.py +58 -0
  128. pymobiledevice3-7.3.0/pymobiledevice3/services/mobile_activation.py +237 -0
  129. pymobiledevice3-7.3.0/pymobiledevice3/services/mobile_config.py +435 -0
  130. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/mobile_image_mounter.py +141 -113
  131. pymobiledevice3-7.3.0/pymobiledevice3/services/mobilebackup2.py +425 -0
  132. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/notification_proxy.py +11 -11
  133. pymobiledevice3-7.3.0/pymobiledevice3/services/os_trace.py +242 -0
  134. pymobiledevice3-7.3.0/pymobiledevice3/services/pcapd.py +412 -0
  135. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/power_assertion.py +10 -9
  136. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/preboard.py +4 -4
  137. pymobiledevice3-7.3.0/pymobiledevice3/services/remote_fetch_symbols.py +53 -0
  138. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/remote_server.py +176 -146
  139. pymobiledevice3-7.3.0/pymobiledevice3/services/restore_service.py +45 -0
  140. pymobiledevice3-7.3.0/pymobiledevice3/services/screenshot.py +32 -0
  141. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/simulate_location.py +7 -7
  142. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/springboard.py +15 -15
  143. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/syslog.py +5 -5
  144. pymobiledevice3-7.3.0/pymobiledevice3/services/web_protocol/alert.py +26 -0
  145. pymobiledevice3-7.3.0/pymobiledevice3/services/web_protocol/automation_session.py +411 -0
  146. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/web_protocol/cdp_screencast.py +46 -37
  147. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/web_protocol/cdp_server.py +19 -19
  148. pymobiledevice3-7.3.0/pymobiledevice3/services/web_protocol/cdp_target.py +718 -0
  149. pymobiledevice3-7.3.0/pymobiledevice3/services/web_protocol/driver.py +198 -0
  150. pymobiledevice3-7.3.0/pymobiledevice3/services/web_protocol/element.py +208 -0
  151. pymobiledevice3-7.3.0/pymobiledevice3/services/web_protocol/inspector_session.py +268 -0
  152. pymobiledevice3-7.3.0/pymobiledevice3/services/web_protocol/selenium_api.py +91 -0
  153. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/web_protocol/session_protocol.py +18 -12
  154. pymobiledevice3-7.3.0/pymobiledevice3/services/web_protocol/switch_to.py +70 -0
  155. pymobiledevice3-7.3.0/pymobiledevice3/services/webinspector.py +380 -0
  156. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/tcp_forwarder.py +64 -50
  157. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/tunneld/api.py +20 -15
  158. pymobiledevice3-7.3.0/pymobiledevice3/tunneld/server.py +614 -0
  159. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/usbmux.py +224 -158
  160. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/utils.py +14 -11
  161. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3.egg-info/PKG-INFO +13 -15
  162. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3.egg-info/SOURCES.txt +20 -3
  163. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3.egg-info/requires.txt +9 -12
  164. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pyproject.toml +72 -7
  165. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pytest.ini +2 -0
  166. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/requirements.txt +9 -12
  167. pymobiledevice3-7.3.0/tests/cli/test_cli.py +77 -0
  168. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/conftest.py +23 -24
  169. pymobiledevice3-7.3.0/tests/services/instruments/test_core_profile_session.py +17 -0
  170. pymobiledevice3-7.3.0/tests/services/instruments/test_dvt_secure_socket_proxy.py +108 -0
  171. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/services/instruments/test_fetch_symbols.py +9 -8
  172. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/services/instruments/test_location.py +3 -2
  173. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/services/instruments/test_screenshot.py +4 -3
  174. pymobiledevice3-7.3.0/tests/services/test_accessibility.py +23 -0
  175. pymobiledevice3-7.3.0/tests/services/test_afc.py +355 -0
  176. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/services/test_apps.py +5 -5
  177. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/services/test_backup2.py +12 -7
  178. pymobiledevice3-7.3.0/tests/services/test_bonjour.py +25 -0
  179. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/services/test_crash_reports.py +24 -23
  180. pymobiledevice3-7.3.0/tests/services/test_house_arrest.py +26 -0
  181. pymobiledevice3-7.3.0/tests/services/test_list_devices.py +6 -0
  182. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/services/test_lockdown.py +3 -1
  183. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/services/test_pcapd.py +2 -1
  184. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/services/test_springboard_services_relay.py +5 -4
  185. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/services/test_start_tunnel.py +7 -4
  186. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/services/test_syslog_relay.py +5 -4
  187. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/services/test_tcp_forwarder.py +4 -4
  188. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/services/test_web_protocol/common.py +2 -2
  189. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/services/test_web_protocol/conftest.py +7 -8
  190. pymobiledevice3-7.3.0/tests/services/test_web_protocol/test_driver.py +38 -0
  191. pymobiledevice3-7.3.0/tests/services/test_web_protocol/test_element.py +9 -0
  192. pymobiledevice3-7.3.0/tests/services/test_webinspector.py +20 -0
  193. pymobiledevice3-4.20.21/.github/workflows/generate-executable.py +0 -63
  194. pymobiledevice3-4.20.21/.github/workflows/python-app.yml +0 -122
  195. pymobiledevice3-4.20.21/.github/workflows/python-publish.yml +0 -29
  196. pymobiledevice3-4.20.21/.pre-commit-config.yaml +0 -15
  197. pymobiledevice3-4.20.21/pymobiledevice3/__main__.py +0 -287
  198. pymobiledevice3-4.20.21/pymobiledevice3/bonjour.py +0 -135
  199. pymobiledevice3-4.20.21/pymobiledevice3/ca.py +0 -53
  200. pymobiledevice3-4.20.21/pymobiledevice3/cli/activation.py +0 -38
  201. pymobiledevice3-4.20.21/pymobiledevice3/cli/afc.py +0 -56
  202. pymobiledevice3-4.20.21/pymobiledevice3/cli/amfi.py +0 -38
  203. pymobiledevice3-4.20.21/pymobiledevice3/cli/apps.py +0 -59
  204. pymobiledevice3-4.20.21/pymobiledevice3/cli/backup.py +0 -174
  205. pymobiledevice3-4.20.21/pymobiledevice3/cli/bonjour.py +0 -83
  206. pymobiledevice3-4.20.21/pymobiledevice3/cli/cli_common.py +0 -308
  207. pymobiledevice3-4.20.21/pymobiledevice3/cli/companion_proxy.py +0 -22
  208. pymobiledevice3-4.20.21/pymobiledevice3/cli/completions.py +0 -50
  209. pymobiledevice3-4.20.21/pymobiledevice3/cli/crash.py +0 -82
  210. pymobiledevice3-4.20.21/pymobiledevice3/cli/developer.py +0 -1280
  211. pymobiledevice3-4.20.21/pymobiledevice3/cli/diagnostics.py +0 -99
  212. pymobiledevice3-4.20.21/pymobiledevice3/cli/lockdown.py +0 -185
  213. pymobiledevice3-4.20.21/pymobiledevice3/cli/mounter.py +0 -182
  214. pymobiledevice3-4.20.21/pymobiledevice3/cli/notification.py +0 -56
  215. pymobiledevice3-4.20.21/pymobiledevice3/cli/pcap.py +0 -57
  216. pymobiledevice3-4.20.21/pymobiledevice3/cli/power_assertion.py +0 -25
  217. pymobiledevice3-4.20.21/pymobiledevice3/cli/processes.py +0 -37
  218. pymobiledevice3-4.20.21/pymobiledevice3/cli/profile.py +0 -180
  219. pymobiledevice3-4.20.21/pymobiledevice3/cli/provision.py +0 -58
  220. pymobiledevice3-4.20.21/pymobiledevice3/cli/remote.py +0 -262
  221. pymobiledevice3-4.20.21/pymobiledevice3/cli/restore.py +0 -240
  222. pymobiledevice3-4.20.21/pymobiledevice3/cli/springboard.py +0 -88
  223. pymobiledevice3-4.20.21/pymobiledevice3/cli/syslog.py +0 -187
  224. pymobiledevice3-4.20.21/pymobiledevice3/cli/usbmux.py +0 -68
  225. pymobiledevice3-4.20.21/pymobiledevice3/cli/version.py +0 -16
  226. pymobiledevice3-4.20.21/pymobiledevice3/cli/webinspector.py +0 -431
  227. pymobiledevice3-4.20.21/pymobiledevice3/irecv_devices.py +0 -480
  228. pymobiledevice3-4.20.21/pymobiledevice3/remote/core_device/app_service.py +0 -127
  229. pymobiledevice3-4.20.21/pymobiledevice3/remote/core_device/core_device_service.py +0 -34
  230. pymobiledevice3-4.20.21/pymobiledevice3/remote/core_device/file_service.py +0 -88
  231. pymobiledevice3-4.20.21/pymobiledevice3/remote/xpc_message.py +0 -326
  232. pymobiledevice3-4.20.21/pymobiledevice3/restore/base_restore.py +0 -119
  233. pymobiledevice3-4.20.21/pymobiledevice3/restore/consts.py +0 -70
  234. pymobiledevice3-4.20.21/pymobiledevice3/restore/img4.py +0 -161
  235. pymobiledevice3-4.20.21/pymobiledevice3/restore/restore.py +0 -1376
  236. pymobiledevice3-4.20.21/pymobiledevice3/restore/restore_options.py +0 -215
  237. pymobiledevice3-4.20.21/pymobiledevice3/restore/tss.py +0 -798
  238. pymobiledevice3-4.20.21/pymobiledevice3/services/afc.py +0 -970
  239. pymobiledevice3-4.20.21/pymobiledevice3/services/device_link.py +0 -207
  240. pymobiledevice3-4.20.21/pymobiledevice3/services/diagnostics.py +0 -1035
  241. pymobiledevice3-4.20.21/pymobiledevice3/services/dvt/instruments/core_profile_session_tap.py +0 -687
  242. pymobiledevice3-4.20.21/pymobiledevice3/services/dvt/instruments/network_monitor.py +0 -102
  243. pymobiledevice3-4.20.21/pymobiledevice3/services/misagent.py +0 -55
  244. pymobiledevice3-4.20.21/pymobiledevice3/services/mobile_activation.py +0 -156
  245. pymobiledevice3-4.20.21/pymobiledevice3/services/mobile_config.py +0 -400
  246. pymobiledevice3-4.20.21/pymobiledevice3/services/mobilebackup2.py +0 -384
  247. pymobiledevice3-4.20.21/pymobiledevice3/services/os_trace.py +0 -182
  248. pymobiledevice3-4.20.21/pymobiledevice3/services/pcapd.py +0 -412
  249. pymobiledevice3-4.20.21/pymobiledevice3/services/remote_fetch_symbols.py +0 -46
  250. pymobiledevice3-4.20.21/pymobiledevice3/services/restore_service.py +0 -45
  251. pymobiledevice3-4.20.21/pymobiledevice3/services/screenshot.py +0 -29
  252. pymobiledevice3-4.20.21/pymobiledevice3/services/web_protocol/alert.py +0 -26
  253. pymobiledevice3-4.20.21/pymobiledevice3/services/web_protocol/automation_session.py +0 -399
  254. pymobiledevice3-4.20.21/pymobiledevice3/services/web_protocol/cdp_target.py +0 -680
  255. pymobiledevice3-4.20.21/pymobiledevice3/services/web_protocol/driver.py +0 -195
  256. pymobiledevice3-4.20.21/pymobiledevice3/services/web_protocol/element.py +0 -195
  257. pymobiledevice3-4.20.21/pymobiledevice3/services/web_protocol/inspector_session.py +0 -264
  258. pymobiledevice3-4.20.21/pymobiledevice3/services/web_protocol/selenium_api.py +0 -91
  259. pymobiledevice3-4.20.21/pymobiledevice3/services/web_protocol/switch_to.py +0 -67
  260. pymobiledevice3-4.20.21/pymobiledevice3/services/webinspector.py +0 -379
  261. pymobiledevice3-4.20.21/pymobiledevice3/tunneld/server.py +0 -476
  262. pymobiledevice3-4.20.21/tests/cli/test_cli.py +0 -44
  263. pymobiledevice3-4.20.21/tests/services/instruments/test_core_profile_session.py +0 -14
  264. pymobiledevice3-4.20.21/tests/services/instruments/test_dvt_secure_socket_proxy.py +0 -107
  265. pymobiledevice3-4.20.21/tests/services/test_accessibility.py +0 -22
  266. pymobiledevice3-4.20.21/tests/services/test_afc.py +0 -339
  267. pymobiledevice3-4.20.21/tests/services/test_bonjour.py +0 -24
  268. pymobiledevice3-4.20.21/tests/services/test_list_devices.py +0 -5
  269. pymobiledevice3-4.20.21/tests/services/test_web_protocol/test_driver.py +0 -38
  270. pymobiledevice3-4.20.21/tests/services/test_web_protocol/test_element.py +0 -8
  271. pymobiledevice3-4.20.21/tests/services/test_webinspector.py +0 -20
  272. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/.gitattributes +0 -0
  273. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  274. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  275. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  276. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/.github/pull_request_template.md +0 -0
  277. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/.github/workflows/codeql.yml +0 -0
  278. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/.github/workflows/markdown-lint.yml +0 -0
  279. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/.gitignore +0 -0
  280. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/CODE_OF_CONDUCT.md +0 -0
  281. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/CONTRIBUTING.md +0 -0
  282. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/LICENSE +0 -0
  283. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/example.gif +0 -0
  284. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/markdownlint-config.json +0 -0
  285. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/misc/DTServices-14.2.txt +0 -0
  286. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/misc/DTServices-14.5.txt +0 -0
  287. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/misc/RemoteXPC.md +0 -0
  288. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/misc/pyinstaller.md +0 -0
  289. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/misc/usbmux_sniff.sh +0 -0
  290. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/__init__.py +0 -0
  291. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/cli/__init__.py +0 -0
  292. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/osu/__init__.py +0 -0
  293. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/remote/__init__.py +0 -0
  294. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/remote/core_device/__init__.py +0 -0
  295. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/remote/module_imports.py +0 -0
  296. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/remote/remote_service.py +0 -0
  297. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/resources/__init__.py +0 -0
  298. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/resources/dsc_uuid_map.json +0 -0
  299. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/resources/webinspector/element_attribute.js +0 -0
  300. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/resources/webinspector/element_clear.js +0 -0
  301. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/resources/webinspector/enter_fullscreen.js +0 -0
  302. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/resources/webinspector/find_nodes.js +0 -0
  303. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/resources/webinspector/focus.js +0 -0
  304. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/resources/webinspector/get_attribute.js +0 -0
  305. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/resources/webinspector/is_displayed.js +0 -0
  306. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/resources/webinspector/is_editable.js +0 -0
  307. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/resources/webinspector/is_enabled.js +0 -0
  308. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/restore/__init__.py +0 -0
  309. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/__init__.py +0 -0
  310. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/dvt/__init__.py +0 -0
  311. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/dvt/instruments/__init__.py +0 -0
  312. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/web_protocol/__init__.py +0 -0
  313. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/tunneld/__init__.py +0 -0
  314. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3.egg-info/dependency_links.txt +0 -0
  315. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3.egg-info/entry_points.txt +0 -0
  316. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3.egg-info/top_level.txt +0 -0
  317. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/setup.cfg +0 -0
  318. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/__init__.py +0 -0
  319. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/cli/__init__.py +0 -0
  320. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/services/__init__.py +0 -0
  321. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/services/instruments/__init__.py +0 -0
  322. {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/services/test_web_protocol/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  # These are supported funding model platforms
2
2
 
3
- github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
3
+ github: doronz88
4
4
  patreon: # Replace with a single Patreon username
5
5
  open_collective: # Replace with a single Open Collective username
6
6
  ko_fi: doronz
@@ -0,0 +1,67 @@
1
+ import logging
2
+ import os
3
+ import site
4
+ import sys
5
+ from pathlib import Path
6
+
7
+ import coloredlogs
8
+ import PyInstaller.__main__
9
+
10
+ import pymobiledevice3.__main__
11
+ import pymobiledevice3.cli
12
+ import pymobiledevice3.resources
13
+
14
+ coloredlogs.install(level=logging.DEBUG)
15
+
16
+ ROOT = Path(__file__).parent.parent.parent
17
+ DEFAULT_OUTPUT = ROOT / Path("dist/__main__").with_suffix(".exe" if sys.platform == "win32" else "")
18
+ OUTPUT = (ROOT / "dist/pymobiledevice3").with_suffix(".exe" if sys.platform == "win32" else "")
19
+
20
+
21
+ def main() -> None:
22
+ site_packages_path = site.getsitepackages()[0]
23
+ resources_dir = Path(pymobiledevice3.resources.__file__).parent
24
+ pymobiledevice3_cli_path = Path(pymobiledevice3.cli.__file__).parent
25
+
26
+ hidden_imports = []
27
+
28
+ for module in pymobiledevice3_cli_path.iterdir():
29
+ if module.name.endswith(".py") and module.name != "__init__.py": # Avoid including the __init__.py
30
+ # Create the module name to be added to hidden imports
31
+ module_name = "pymobiledevice3.cli." + os.path.splitext(module.name)[0]
32
+ hidden_imports.append("--hidden-import=" + module_name)
33
+
34
+ pyinstaller_args = [
35
+ pymobiledevice3.__main__.__file__,
36
+ "--hidden-import=ipsw_parser",
37
+ "--hidden-import=zeroconf",
38
+ "--hidden-import=pyimg4",
39
+ "--hidden-import=zeroconf._utils.ipaddress",
40
+ "--hidden-import=zeroconf._handlers.answers",
41
+ "--hidden-import=readchar",
42
+ "--copy-metadata=pyimg4",
43
+ "--copy-metadata=readchar",
44
+ "--copy-metadata=apple_compress",
45
+ "--onefile",
46
+ ]
47
+ if sys.platform == "win32":
48
+ pyinstaller_args.extend([
49
+ "--add-binary",
50
+ f"{site_packages_path}/Lib/site-packages/pytun_pmd3/wintun/*;pytun_pmd3/wintun/bin",
51
+ "--add-binary",
52
+ f"{resources_dir}/webinspector;pymobiledevice3/resources/webinspector",
53
+ ])
54
+ else:
55
+ pyinstaller_args.extend([
56
+ "--add-binary",
57
+ f"{site_packages_path}/pytun_pmd3:pytun_pmd3",
58
+ "--add-binary",
59
+ f"{resources_dir}/webinspector:pymobiledevice3/resources/webinspector",
60
+ ])
61
+ pyinstaller_args.extend(hidden_imports)
62
+ PyInstaller.__main__.run(pyinstaller_args)
63
+ DEFAULT_OUTPUT.rename(OUTPUT)
64
+
65
+
66
+ if __name__ == "__main__":
67
+ main()
@@ -0,0 +1,45 @@
1
+ name: Python application
2
+
3
+ on:
4
+ pull_request:
5
+ branches: [ "master" ]
6
+ paths:
7
+ - '.github/workflows/python-app.yml'
8
+ - 'pymobiledevice3/**'
9
+ - 'requirements.txt'
10
+ - 'pyproject.toml'
11
+ release:
12
+ types: [ created ]
13
+
14
+ concurrency:
15
+ group: ${{ github.workflow }}-${{ github.ref }}
16
+ cancel-in-progress: true
17
+
18
+ jobs:
19
+ test:
20
+ if: '! github.event.pull_request.draft'
21
+ runs-on: ${{ matrix.os }}
22
+
23
+ strategy:
24
+ matrix:
25
+ python-version: [ "3.9", "3.10", "3.11", "3.12", "3.13", "3.14" ]
26
+ os: [ ubuntu-latest, macos-latest, windows-latest ]
27
+
28
+ steps:
29
+ - uses: actions/checkout@v4
30
+ - name: Set up Python ${{ matrix.python-version }}
31
+ uses: actions/setup-python@v4
32
+ with:
33
+ python-version: ${{ matrix.python-version }}
34
+ - name: Install dependencies
35
+ run: |
36
+ python3 -m pip install --upgrade pip
37
+ python3 -m pip install pre-commit
38
+ - name: Run pre-commit hooks
39
+ run: |
40
+ pre-commit run --all-files
41
+ - name: Test install
42
+ run: |
43
+ python -m pip install -U '.[test]'
44
+ - name: Test show usage
45
+ run: pytest -m cli
@@ -0,0 +1,27 @@
1
+ # This workflow builds and uploads the Python package to PyPI when a release is created
2
+
3
+ name: Upload Python Package
4
+
5
+ on:
6
+ release:
7
+ types: [ created ]
8
+
9
+ jobs:
10
+ deploy:
11
+ permissions:
12
+ id-token: write
13
+ runs-on: ubuntu-latest
14
+ steps:
15
+ - uses: actions/checkout@v4
16
+ - name: Set up Python
17
+ uses: actions/setup-python@v5
18
+ with:
19
+ python-version: '3.12'
20
+ - name: Install uv
21
+ uses: astral-sh/setup-uv@v3
22
+ - name: Build distributions
23
+ run: uv build
24
+ - name: Publish to PyPI
25
+ uses: pypa/gh-action-pypi-publish@release/v1
26
+ with:
27
+ packages-dir: dist
@@ -0,0 +1,9 @@
1
+ repos:
2
+ - repo: https://github.com/astral-sh/ruff-pre-commit
3
+ # Ruff version.
4
+ rev: v0.14.2
5
+ hooks:
6
+ # Run the linter.
7
+ - id: ruff-check
8
+ # Run the formatter.
9
+ - id: ruff-format
@@ -1,37 +1,36 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pymobiledevice3
3
- Version: 4.20.21
3
+ Version: 7.3.0
4
4
  Summary: Pure python3 implementation for working with iDevices (iPhone, etc...)
5
5
  Author-email: doronz88 <doron88@gmail.com>, matan <matan1008@gmail.com>
6
6
  Maintainer-email: doronz88 <doron88@gmail.com>, matan <matan1008@gmail.com>
7
- License: GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007
7
+ License-Expression: GPL-3.0-or-later
8
8
  Project-URL: Homepage, https://github.com/doronz88/pymobiledevice3
9
9
  Project-URL: Bug Reports, https://github.com/doronz88/pymobiledevice3/issues
10
10
  Keywords: ios,protocol,lockdownd,instruments,automation,cli,afc
11
11
  Classifier: Development Status :: 5 - Production/Stable
12
- Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
13
12
  Classifier: Programming Language :: Python :: 3
14
13
  Classifier: Programming Language :: Python :: 3.9
15
14
  Classifier: Programming Language :: Python :: 3.10
16
15
  Classifier: Programming Language :: Python :: 3.11
17
16
  Classifier: Programming Language :: Python :: 3.12
18
17
  Classifier: Programming Language :: Python :: 3.13
18
+ Classifier: Programming Language :: Python :: 3.14
19
19
  Classifier: Programming Language :: Python :: 3 :: Only
20
20
  Requires-Python: >=3.9
21
21
  Description-Content-Type: text/markdown
22
22
  License-File: LICENSE
23
23
  Requires-Dist: construct>=2.9.29
24
+ Requires-Dist: construct-typing>=0.7.0
24
25
  Requires-Dist: asn1
25
- Requires-Dist: click
26
26
  Requires-Dist: coloredlogs
27
27
  Requires-Dist: IPython
28
28
  Requires-Dist: bpylist2>=4.0.1
29
29
  Requires-Dist: pygments
30
30
  Requires-Dist: hexdump
31
- Requires-Dist: arrow
32
31
  Requires-Dist: daemonize
33
- Requires-Dist: gpxpy<1.6.0
34
- Requires-Dist: pykdebugparser>=1.2.4
32
+ Requires-Dist: gpxpy!=1.6.0,<1.7.0
33
+ Requires-Dist: pykdebugparser>=1.2.7
35
34
  Requires-Dist: pyusb>=1.2.1
36
35
  Requires-Dist: tqdm
37
36
  Requires-Dist: requests
@@ -40,17 +39,14 @@ Requires-Dist: parameter_decorators
40
39
  Requires-Dist: packaging
41
40
  Requires-Dist: pygnuutils>=0.0.7
42
41
  Requires-Dist: cryptography>=41.0.1
43
- Requires-Dist: pycrashreport>=1.2.4
42
+ Requires-Dist: pycrashreport>=1.2.7
44
43
  Requires-Dist: fastapi[all]>=0.93.0
45
44
  Requires-Dist: uvicorn>=0.15.0
46
- Requires-Dist: starlette
47
45
  Requires-Dist: wsproto
48
46
  Requires-Dist: nest_asyncio>=1.5.5
49
47
  Requires-Dist: Pillow
50
48
  Requires-Dist: inquirer3>=0.6.0
51
- Requires-Dist: ipsw_parser>=1.3.4
52
- Requires-Dist: remotezip2
53
- Requires-Dist: zeroconf>=0.132.2
49
+ Requires-Dist: ipsw_parser>=1.5.0
54
50
  Requires-Dist: ifaddr
55
51
  Requires-Dist: hyperframe
56
52
  Requires-Dist: srptools
@@ -58,13 +54,14 @@ Requires-Dist: qh3<2,>=1.0.0
58
54
  Requires-Dist: developer_disk_image>=0.0.2
59
55
  Requires-Dist: opack2
60
56
  Requires-Dist: psutil
61
- Requires-Dist: pytun-pmd3>=2.0.9
62
- Requires-Dist: aiofiles
57
+ Requires-Dist: pytun-pmd3>=3.0.2
63
58
  Requires-Dist: prompt_toolkit
64
59
  Requires-Dist: sslpsk-pmd3>=1.0.3; python_version < "3.13"
65
60
  Requires-Dist: python-pcapng>=2.1.1
66
61
  Requires-Dist: plumbum
67
- Requires-Dist: pyimg4>=0.8.7
62
+ Requires-Dist: pyimg4>=0.8.8
63
+ Requires-Dist: typer>=0.20.0
64
+ Requires-Dist: typer-injector>=0.2.0
68
65
  Provides-Extra: test
69
66
  Requires-Dist: pytest; extra == "test"
70
67
  Requires-Dist: pytest-asyncio; extra == "test"
@@ -77,6 +74,7 @@ Dynamic: license-file
77
74
  [![Pypi version](https://img.shields.io/pypi/v/pymobiledevice3.svg)](https://pypi.org/project/pymobiledevice3/ "PyPi package")
78
75
  [![Downloads](https://static.pepy.tech/personalized-badge/pymobiledevice3?period=total&units=none&left_color=grey&right_color=blue&left_text=Downloads)](https://pepy.tech/project/pymobiledevice3)
79
76
  [![Discord](https://img.shields.io/discord/1133265168051208214?logo=Discord&label=Discord)](https://discord.gg/52mZGC3JXJ)
77
+ [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/doronz88/pymobiledevice3)
80
78
  <!-- markdownlint-enable MD013 -->
81
79
 
82
80
  - [PyMobileDevice3](#pymobiledevice3)
@@ -5,6 +5,7 @@
5
5
  [![Pypi version](https://img.shields.io/pypi/v/pymobiledevice3.svg)](https://pypi.org/project/pymobiledevice3/ "PyPi package")
6
6
  [![Downloads](https://static.pepy.tech/personalized-badge/pymobiledevice3?period=total&units=none&left_color=grey&right_color=blue&left_text=Downloads)](https://pepy.tech/project/pymobiledevice3)
7
7
  [![Discord](https://img.shields.io/discord/1133265168051208214?logo=Discord&label=Discord)](https://discord.gg/52mZGC3JXJ)
8
+ [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/doronz88/pymobiledevice3)
8
9
  <!-- markdownlint-enable MD013 -->
9
10
 
10
11
  - [PyMobileDevice3](#pymobiledevice3)
@@ -7,8 +7,8 @@ import click
7
7
  from scapy.packet import Packet, Raw
8
8
  from scapy.sendrecv import sniff
9
9
 
10
- BPLIST_MAGIC = b'bplist'
11
- PLIST_MAGIC = b'<plist'
10
+ BPLIST_MAGIC = b"bplist"
11
+ PLIST_MAGIC = b"<plist"
12
12
 
13
13
 
14
14
  class PcapSniffer:
@@ -20,13 +20,13 @@ class PcapSniffer:
20
20
 
21
21
  if BPLIST_MAGIC in packet:
22
22
  try:
23
- plist = plistlib.loads(packet[packet.find(BPLIST_MAGIC):])
23
+ plist = plistlib.loads(packet[packet.find(BPLIST_MAGIC) :])
24
24
  self.report(plist)
25
25
  except plistlib.InvalidFileException:
26
26
  pass
27
27
  if PLIST_MAGIC in packet:
28
28
  try:
29
- plist = plistlib.loads(packet[packet.find(PLIST_MAGIC):])
29
+ plist = plistlib.loads(packet[packet.find(PLIST_MAGIC) :])
30
30
  self.report(plist)
31
31
  except xml.parsers.expat.ExpatError:
32
32
  pass
@@ -35,37 +35,37 @@ class PcapSniffer:
35
35
  try:
36
36
  print(plist)
37
37
  if self.file is not None:
38
- self.file.write('---\n')
38
+ self.file.write("---\n")
39
39
  self.file.write(pprint.pformat(plist))
40
- self.file.write('\n---\n')
40
+ self.file.write("\n---\n")
41
41
  except ValueError:
42
- print('failed to print plist')
42
+ print("failed to print plist")
43
43
 
44
44
 
45
45
  @click.group()
46
46
  def cli():
47
- """ Parse RemoteXPC traffic """
47
+ """Parse RemoteXPC traffic"""
48
48
  pass
49
49
 
50
50
 
51
51
  @cli.command()
52
- @click.argument('pcap', type=click.Path(exists=True, file_okay=True, dir_okay=False))
53
- @click.option('-o', '--out', type=click.File('wt'))
52
+ @click.argument("pcap", type=click.Path(exists=True, file_okay=True, dir_okay=False))
53
+ @click.option("-o", "--out", type=click.File("wt"))
54
54
  def offline(pcap: str, out: IO):
55
- """ Parse plists traffic from a .pcap file """
55
+ """Parse plists traffic from a .pcap file"""
56
56
  sniffer = PcapSniffer(out)
57
57
  for p in sniff(offline=pcap):
58
58
  sniffer.process_packet(p)
59
59
 
60
60
 
61
61
  @cli.command()
62
- @click.argument('iface')
63
- @click.option('-o', '--out', type=click.File('wt'))
62
+ @click.argument("iface")
63
+ @click.option("-o", "--out", type=click.File("wt"))
64
64
  def live(iface: str, out: IO):
65
- """ Parse plists live from a given network interface """
65
+ """Parse plists live from a given network interface"""
66
66
  sniffer = PcapSniffer(out)
67
67
  sniff(iface=iface, prn=sniffer.process_packet)
68
68
 
69
69
 
70
- if __name__ == '__main__':
70
+ if __name__ == "__main__":
71
71
  cli()
@@ -22,7 +22,7 @@ FRAME_HEADER_SIZE = 9
22
22
 
23
23
 
24
24
  def create_stream_key(src: str, sport: int, dst: str, dport: int) -> str:
25
- return f'{src}/{sport}//{dst}/{dport}'
25
+ return f"{src}/{sport}//{dst}/{dport}"
26
26
 
27
27
 
28
28
  class TCPStream:
@@ -37,7 +37,7 @@ class TCPStream:
37
37
  self.segments = {} # data segments to add later
38
38
 
39
39
  def __repr__(self) -> str:
40
- return f'Stream<{self.key}>'
40
+ return f"Stream<{self.key}>"
41
41
 
42
42
  def __len__(self) -> int:
43
43
  return len(self.data)
@@ -58,12 +58,12 @@ class TCPStream:
58
58
  return False
59
59
  else:
60
60
  # if this data is in order (has a place to be inserted)
61
- self.data[seq_offset:seq_offset + data_len] = data
61
+ self.data[seq_offset : seq_offset + data_len] = data
62
62
  # check if there are any waiting data segments to add
63
63
  for seq_offset in sorted(self.segments.keys()):
64
64
  if seq_offset <= len(self.data): # if we can add this segment to the stream
65
65
  segment_payload = self.segments[seq_offset]
66
- self.data[seq_offset:seq_offset + len(segment_payload)] = segment_payload
66
+ self.data[seq_offset : seq_offset + len(segment_payload)] = segment_payload
67
67
  self.segments.pop(seq_offset)
68
68
  else:
69
69
  break # short circuit because list is sorted
@@ -72,12 +72,12 @@ class TCPStream:
72
72
 
73
73
  class H2Stream(TCPStream):
74
74
  def pop_frames(self) -> list[Frame]:
75
- """ Pop all available H2Frames """
75
+ """Pop all available H2Frames"""
76
76
 
77
77
  # If self.data starts with the http/2 magic bytes, pop them off
78
78
  if self.data.startswith(HTTP2_MAGIC):
79
- logger.debug('HTTP/2 magic bytes')
80
- self.data = self.data[len(HTTP2_MAGIC):]
79
+ logger.debug("HTTP/2 magic bytes")
80
+ self.data = self.data[len(HTTP2_MAGIC) :]
81
81
  self.seq += len(HTTP2_MAGIC)
82
82
 
83
83
  frames = []
@@ -120,13 +120,14 @@ class RemoteXPCSniffer:
120
120
  tcp_pkt = pkt[TCP]
121
121
  stream_key = create_stream_key(net_pkt.src, tcp_pkt.sport, net_pkt.dst, tcp_pkt.dport)
122
122
  stream = self._h2_streams.setdefault(
123
- stream_key, H2Stream(net_pkt.src, tcp_pkt.sport, net_pkt.dst, tcp_pkt.dport))
123
+ stream_key, H2Stream(net_pkt.src, tcp_pkt.sport, net_pkt.dst, tcp_pkt.dport)
124
+ )
124
125
  stream_finished_assembling = stream.add(tcp_pkt)
125
126
  if stream_finished_assembling: # if we just added something in order
126
127
  self._process_stream(stream)
127
128
 
128
129
  def _handle_data_frame(self, stream: H2Stream, frame: DataFrame) -> None:
129
- previous_frame_data = self._previous_frame_data.get(stream.key, b'')
130
+ previous_frame_data = self._previous_frame_data.get(stream.key, b"")
130
131
  try:
131
132
  payload = XpcWrapper.parse(previous_frame_data + frame.data).message.payload
132
133
  if payload is None:
@@ -134,10 +135,11 @@ class RemoteXPCSniffer:
134
135
  xpc_message = decode_xpc_object(payload.obj)
135
136
  except ConstError: # if we don't know what this payload is
136
137
  logger.debug(
137
- f'New Data frame {stream.src}->{stream.dst} on HTTP/2 stream {frame.stream_id} TCP port {stream.dport}')
138
+ f"New Data frame {stream.src}->{stream.dst} on HTTP/2 stream {frame.stream_id} TCP port {stream.dport}"
139
+ )
138
140
  hexdump(frame.data[:64])
139
141
  if len(frame.data) > 64:
140
- logger.debug(f'... {len(frame.data)} bytes')
142
+ logger.debug(f"... {len(frame.data)} bytes")
141
143
  return
142
144
  except StreamError:
143
145
  self._previous_frame_data[stream.key] = previous_frame_data + frame.data
@@ -149,27 +151,26 @@ class RemoteXPCSniffer:
149
151
  if xpc_message is None:
150
152
  return
151
153
 
152
- logger.info(f'As Python Object (#{frame.stream_id}): {pformat(xpc_message)}')
154
+ logger.info(f"As Python Object (#{frame.stream_id}): {pformat(xpc_message)}")
153
155
 
154
156
  # print `pairingData` if exists, since it contains an inner struct
155
- if 'value' not in xpc_message:
157
+ if "value" not in xpc_message:
156
158
  return
157
- message = xpc_message['value']['message']
158
- if 'plain' not in message:
159
+ message = xpc_message["value"]["message"]
160
+ if "plain" not in message:
159
161
  return
160
- plain = message['plain']['_0']
161
- if 'event' not in plain:
162
+ plain = message["plain"]["_0"]
163
+ if "event" not in plain:
162
164
  return
163
- pairing_data = plain['event']['_0']['pairingData']['_0']['data']
165
+ pairing_data = plain["event"]["_0"]["pairingData"]["_0"]["data"]
164
166
  logger.info(PairingDataComponentTLVBuf.parse(pairing_data))
165
167
 
166
168
  def _handle_single_frame(self, stream: H2Stream, frame: Frame) -> None:
167
- logger.debug(f'New HTTP/2 frame: {stream.key} ({frame})')
169
+ logger.debug(f"New HTTP/2 frame: {stream.key} ({frame})")
168
170
  if isinstance(frame, HeadersFrame):
169
- logger.debug(
170
- f'{stream.src} opening stream {frame.stream_id} for communication on port {stream.dport}')
171
+ logger.debug(f"{stream.src} opening stream {frame.stream_id} for communication on port {stream.dport}")
171
172
  elif isinstance(frame, GoAwayFrame):
172
- logger.debug(f'{stream.src} closing stream {frame.stream_id} on port {stream.sport}')
173
+ logger.debug(f"{stream.src} closing stream {frame.stream_id} on port {stream.sport}")
173
174
  elif isinstance(frame, DataFrame):
174
175
  self._handle_data_frame(stream, frame)
175
176
 
@@ -180,27 +181,27 @@ class RemoteXPCSniffer:
180
181
 
181
182
  @click.group()
182
183
  def cli():
183
- """ Parse RemoteXPC traffic """
184
+ """Parse RemoteXPC traffic"""
184
185
  pass
185
186
 
186
187
 
187
188
  @cli.command()
188
- @click.argument('file', type=click.Path(exists=True, file_okay=True, dir_okay=False))
189
+ @click.argument("file", type=click.Path(exists=True, file_okay=True, dir_okay=False))
189
190
  def offline(file: str):
190
- """ Parse RemoteXPC traffic from a .pcap file """
191
+ """Parse RemoteXPC traffic from a .pcap file"""
191
192
  sniffer = RemoteXPCSniffer()
192
193
  for p in sniff(offline=file):
193
194
  sniffer.process_packet(p)
194
195
 
195
196
 
196
197
  @cli.command()
197
- @click.argument('iface')
198
+ @click.argument("iface")
198
199
  def live(iface: str):
199
- """ Parse RemoteXPC live from a given network interface """
200
+ """Parse RemoteXPC live from a given network interface"""
200
201
  sniffer = RemoteXPCSniffer()
201
202
  sniff(iface=iface, prn=sniffer.process_packet)
202
203
 
203
204
 
204
- if __name__ == '__main__':
205
+ if __name__ == "__main__":
205
206
  coloredlogs.install(level=logging.DEBUG)
206
207
  cli()
@@ -287,14 +287,14 @@ pymobiledevice3 developer dvt launch com.apple.mobilesafari
287
287
 
288
288
  ## DVT
289
289
 
290
- One of the more interesting developer services, is the one exposed by `DTServiceHub`. It is using DTX protocol messages,
290
+ One of the more interesting developer services is the one exposed by `DTServiceHub`. It is using DTX protocol messages,
291
291
  but since it mainly wraps and allows access to stuff in `DVTFoundation.framework` we called it DVT in our
292
292
  implementation (probably standing for DeveloperTools).
293
293
 
294
294
  We don't delve too much into this protocol, but we'll say in general it allows us to invoke a whitelist of ObjC methods
295
295
  in different ObjC objects. The terminology used by DVT to each such ObjC object is called "channels".
296
296
 
297
- In order to access this different object use the following APIs:
297
+ To access this different object use the following APIs:
298
298
 
299
299
  ```python
300
300
  from pymobiledevice3.lockdown import create_using_usbmux
@@ -313,17 +313,22 @@ dvt_channel = Screenshot(dvt)
313
313
  open('/tmp/screen.png', 'wb').write(dvt_channel.get_screenshot())
314
314
  ```
315
315
 
316
- Looking for an unimplemented feature/channel? Feel free to play with it (and submit a PR afterwards 🙏) using the
316
+ Looking for an unimplemented feature/channel? Feel free to play with it (and submit a PR afterward 🙏) using the
317
317
  following shell:
318
318
 
319
319
  ```shell
320
320
  pymobiledevice3 developer dvt shell
321
321
  ```
322
322
 
323
+ > **NOTE:** The full list of the methods that can be invoked on a DVT channel can be found by looking at all ObjC
324
+ > classes in `DVTInstrumentsFoundation.framework` implementing the `DTXAllowedRPC` protocol.
325
+ > There is an existing [Anubis rule](https://github.com/netanelc305/anubis/blob/9da337178ebd7e9f168e9df2d82b192eba4f1b30/example_rules.yaml#L14-L17)
326
+ > I use to diff new methods against the existing ones.
327
+
323
328
  ## RemoteXPC
324
329
 
325
330
  Starting at iOS 17.0, Apple made a large refactor in the manner we all interact with the developer services. There can
326
- be multiple reasons for that decision, but in general this refactor main key points are:
331
+ be multiple reasons for that decision, but in general these refactor main key points are:
327
332
 
328
333
  - Create a single standard for interacting with the new lockdown services (XPC Messages, Apple's proprietary IPC)
329
334
  - Optimize the protocol for large file transfers (such as the dyld_shared_cache)
@@ -347,10 +352,10 @@ Since all this communication is IP-based, but without any additional exported TC
347
352
  help us here. Instead, starting at iOS 16.0, when connecting an iDevice, it exports another non-standard USB-Ethernet
348
353
  adapter (with IPv6 link-local address), placing us in a subnet with the device's `remoted`.
349
354
 
350
- As we've said this communication is non-standard, and requires either:
355
+ As we've said, this communication is non-standard and requires either:
351
356
 
352
357
  - macOS Monterey or higher
353
- - Special driver on your linux/windows machine
358
+ - Special driver on your linux/Windows machine
354
359
 
355
360
  > **Spoiler Alert:** Apple may have regretted this, since starting at iOS 17.4, they added the `CodeDeviceProxy` - a new
356
361
  > lockdown service, allowing us skip all the steps this special driver is required for.