pymobiledevice3 4.26.5__tar.gz → 6.1.4__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 (281) hide show
  1. pymobiledevice3-6.1.4/.github/workflows/generate-executable.py +67 -0
  2. pymobiledevice3-6.1.4/.github/workflows/python-app.yml +45 -0
  3. pymobiledevice3-6.1.4/.github/workflows/python-publish.yml +27 -0
  4. pymobiledevice3-6.1.4/.pre-commit-config.yaml +9 -0
  5. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/PKG-INFO +4 -7
  6. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/misc/plist_sniffer.py +15 -15
  7. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/misc/remotexpc_sniffer.py +29 -28
  8. pymobiledevice3-6.1.4/pymobiledevice3/__main__.py +339 -0
  9. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/_version.py +3 -3
  10. pymobiledevice3-6.1.4/pymobiledevice3/bonjour.py +381 -0
  11. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/ca.py +32 -24
  12. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/cli/activation.py +7 -7
  13. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/cli/afc.py +19 -19
  14. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/cli/amfi.py +4 -4
  15. pymobiledevice3-6.1.4/pymobiledevice3/cli/apps.py +98 -0
  16. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/cli/backup.py +58 -32
  17. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/cli/bonjour.py +27 -20
  18. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/cli/cli_common.py +112 -81
  19. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/cli/companion_proxy.py +4 -4
  20. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/cli/completions.py +10 -10
  21. pymobiledevice3-6.1.4/pymobiledevice3/cli/crash.py +88 -0
  22. pymobiledevice3-6.1.4/pymobiledevice3/cli/developer.py +1560 -0
  23. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/cli/diagnostics.py +38 -33
  24. pymobiledevice3-6.1.4/pymobiledevice3/cli/idam.py +46 -0
  25. pymobiledevice3-6.1.4/pymobiledevice3/cli/lockdown.py +195 -0
  26. pymobiledevice3-6.1.4/pymobiledevice3/cli/mounter.py +199 -0
  27. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/cli/notification.py +10 -10
  28. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/cli/pcap.py +19 -14
  29. pymobiledevice3-6.1.4/pymobiledevice3/cli/power_assertion.py +27 -0
  30. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/cli/processes.py +10 -10
  31. pymobiledevice3-6.1.4/pymobiledevice3/cli/profile.py +191 -0
  32. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/cli/provision.py +17 -17
  33. pymobiledevice3-6.1.4/pymobiledevice3/cli/remote.py +339 -0
  34. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/cli/restore.py +43 -40
  35. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/cli/springboard.py +30 -28
  36. pymobiledevice3-6.1.4/pymobiledevice3/cli/syslog.py +230 -0
  37. pymobiledevice3-6.1.4/pymobiledevice3/cli/usbmux.py +69 -0
  38. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/cli/version.py +3 -2
  39. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/cli/webinspector.py +231 -123
  40. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/common.py +1 -1
  41. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/exceptions.py +156 -61
  42. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/irecv.py +49 -53
  43. pymobiledevice3-6.1.4/pymobiledevice3/irecv_devices.py +1503 -0
  44. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/lockdown.py +404 -251
  45. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/lockdown_service_provider.py +10 -7
  46. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/osu/os_utils.py +18 -9
  47. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/osu/posix_util.py +28 -15
  48. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/osu/win_util.py +14 -8
  49. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/pair_records.py +19 -19
  50. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/remote/common.py +4 -4
  51. pymobiledevice3-6.1.4/pymobiledevice3/remote/core_device/app_service.py +154 -0
  52. pymobiledevice3-6.1.4/pymobiledevice3/remote/core_device/core_device_service.py +37 -0
  53. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/remote/core_device/device_info.py +5 -5
  54. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/remote/core_device/diagnostics_service.py +10 -8
  55. pymobiledevice3-6.1.4/pymobiledevice3/remote/core_device/file_service.py +102 -0
  56. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/remote/remote_service_discovery.py +57 -35
  57. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/remote/remotexpc.py +64 -42
  58. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/remote/tunnel_service.py +383 -297
  59. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/remote/utils.py +14 -13
  60. pymobiledevice3-6.1.4/pymobiledevice3/remote/xpc_message.py +346 -0
  61. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/resources/dsc_uuid_map.py +19 -19
  62. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/resources/firmware_notifications.py +16 -16
  63. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/restore/asr.py +27 -27
  64. pymobiledevice3-6.1.4/pymobiledevice3/restore/base_restore.py +162 -0
  65. pymobiledevice3-6.1.4/pymobiledevice3/restore/consts.py +91 -0
  66. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/restore/device.py +11 -11
  67. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/restore/fdr.py +46 -46
  68. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/restore/ftab.py +19 -19
  69. pymobiledevice3-6.1.4/pymobiledevice3/restore/img4.py +163 -0
  70. pymobiledevice3-6.1.4/pymobiledevice3/restore/mbn.py +587 -0
  71. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/restore/recovery.py +125 -135
  72. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/restore/restore.py +537 -525
  73. pymobiledevice3-6.1.4/pymobiledevice3/restore/restore_options.py +225 -0
  74. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/restore/restored_client.py +25 -22
  75. pymobiledevice3-6.1.4/pymobiledevice3/restore/tss.py +912 -0
  76. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/service_connection.py +61 -54
  77. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/accessibilityaudit.py +137 -127
  78. pymobiledevice3-6.1.4/pymobiledevice3/services/afc.py +1526 -0
  79. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/amfi.py +21 -18
  80. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/companion.py +23 -19
  81. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/crash_reports.py +61 -47
  82. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/debugserver_applist.py +3 -3
  83. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/device_arbitration.py +8 -8
  84. pymobiledevice3-6.1.4/pymobiledevice3/services/device_link.py +229 -0
  85. pymobiledevice3-6.1.4/pymobiledevice3/services/diagnostics.py +1038 -0
  86. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/dtfetchsymbols.py +8 -8
  87. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/dvt/dvt_secure_socket_proxy.py +4 -4
  88. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/dvt/dvt_testmanaged_proxy.py +4 -4
  89. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/dvt/instruments/activity_trace_tap.py +85 -74
  90. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/dvt/instruments/application_listing.py +2 -3
  91. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/dvt/instruments/condition_inducer.py +7 -6
  92. pymobiledevice3-6.1.4/pymobiledevice3/services/dvt/instruments/core_profile_session_tap.py +769 -0
  93. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/dvt/instruments/device_info.py +11 -11
  94. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/dvt/instruments/energy_monitor.py +1 -1
  95. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/dvt/instruments/graphics.py +1 -1
  96. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/dvt/instruments/location_simulation.py +1 -1
  97. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/dvt/instruments/location_simulation_base.py +10 -10
  98. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/dvt/instruments/network_monitor.py +17 -17
  99. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/dvt/instruments/notifications.py +1 -1
  100. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/dvt/instruments/process_control.py +25 -10
  101. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/dvt/instruments/screenshot.py +2 -2
  102. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/dvt/instruments/sysmontap.py +15 -15
  103. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/dvt/testmanaged/xcuitest.py +42 -52
  104. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/file_relay.py +10 -10
  105. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/heartbeat.py +8 -7
  106. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/house_arrest.py +12 -15
  107. pymobiledevice3-6.1.4/pymobiledevice3/services/idam.py +20 -0
  108. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/installation_proxy.py +119 -100
  109. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/lockdown_service.py +12 -5
  110. pymobiledevice3-6.1.4/pymobiledevice3/services/misagent.py +58 -0
  111. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/mobile_activation.py +84 -72
  112. pymobiledevice3-6.1.4/pymobiledevice3/services/mobile_config.py +435 -0
  113. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/mobile_image_mounter.py +137 -116
  114. pymobiledevice3-6.1.4/pymobiledevice3/services/mobilebackup2.py +422 -0
  115. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/notification_proxy.py +11 -11
  116. pymobiledevice3-6.1.4/pymobiledevice3/services/os_trace.py +242 -0
  117. pymobiledevice3-6.1.4/pymobiledevice3/services/pcapd.py +412 -0
  118. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/power_assertion.py +10 -9
  119. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/preboard.py +4 -4
  120. pymobiledevice3-6.1.4/pymobiledevice3/services/remote_fetch_symbols.py +53 -0
  121. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/remote_server.py +176 -146
  122. pymobiledevice3-6.1.4/pymobiledevice3/services/restore_service.py +45 -0
  123. pymobiledevice3-6.1.4/pymobiledevice3/services/screenshot.py +32 -0
  124. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/simulate_location.py +7 -7
  125. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/springboard.py +15 -15
  126. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/syslog.py +5 -5
  127. pymobiledevice3-6.1.4/pymobiledevice3/services/web_protocol/alert.py +26 -0
  128. pymobiledevice3-6.1.4/pymobiledevice3/services/web_protocol/automation_session.py +409 -0
  129. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/web_protocol/cdp_screencast.py +44 -36
  130. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/web_protocol/cdp_server.py +19 -19
  131. pymobiledevice3-6.1.4/pymobiledevice3/services/web_protocol/cdp_target.py +718 -0
  132. pymobiledevice3-6.1.4/pymobiledevice3/services/web_protocol/driver.py +198 -0
  133. pymobiledevice3-6.1.4/pymobiledevice3/services/web_protocol/element.py +208 -0
  134. pymobiledevice3-6.1.4/pymobiledevice3/services/web_protocol/inspector_session.py +268 -0
  135. pymobiledevice3-6.1.4/pymobiledevice3/services/web_protocol/selenium_api.py +91 -0
  136. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/web_protocol/session_protocol.py +18 -12
  137. pymobiledevice3-6.1.4/pymobiledevice3/services/web_protocol/switch_to.py +70 -0
  138. pymobiledevice3-6.1.4/pymobiledevice3/services/webinspector.py +380 -0
  139. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/tcp_forwarder.py +64 -50
  140. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/tunneld/api.py +20 -15
  141. pymobiledevice3-6.1.4/pymobiledevice3/tunneld/server.py +603 -0
  142. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/usbmux.py +197 -148
  143. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/utils.py +14 -11
  144. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3.egg-info/PKG-INFO +4 -7
  145. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3.egg-info/SOURCES.txt +4 -0
  146. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3.egg-info/requires.txt +2 -6
  147. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pyproject.toml +50 -0
  148. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pytest.ini +1 -0
  149. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/requirements.txt +3 -7
  150. pymobiledevice3-6.1.4/tests/cli/test_cli.py +77 -0
  151. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/tests/conftest.py +28 -25
  152. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/tests/services/instruments/test_core_profile_session.py +6 -4
  153. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/tests/services/instruments/test_dvt_secure_socket_proxy.py +27 -25
  154. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/tests/services/instruments/test_fetch_symbols.py +9 -7
  155. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/tests/services/instruments/test_location.py +3 -1
  156. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/tests/services/instruments/test_screenshot.py +2 -2
  157. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/tests/services/test_accessibility.py +3 -3
  158. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/tests/services/test_afc.py +135 -120
  159. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/tests/services/test_apps.py +2 -3
  160. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/tests/services/test_backup2.py +10 -5
  161. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/tests/services/test_bonjour.py +4 -4
  162. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/tests/services/test_crash_reports.py +15 -14
  163. pymobiledevice3-6.1.4/tests/services/test_house_arrest.py +26 -0
  164. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/tests/services/test_springboard_services_relay.py +1 -1
  165. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/tests/services/test_start_tunnel.py +6 -3
  166. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/tests/services/test_syslog_relay.py +3 -3
  167. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/tests/services/test_tcp_forwarder.py +2 -2
  168. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/tests/services/test_web_protocol/common.py +2 -2
  169. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/tests/services/test_web_protocol/conftest.py +7 -8
  170. pymobiledevice3-6.1.4/tests/services/test_web_protocol/test_driver.py +38 -0
  171. pymobiledevice3-6.1.4/tests/services/test_web_protocol/test_element.py +8 -0
  172. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/tests/services/test_webinspector.py +7 -8
  173. pymobiledevice3-4.26.5/.github/workflows/generate-executable.py +0 -63
  174. pymobiledevice3-4.26.5/.github/workflows/python-app.yml +0 -122
  175. pymobiledevice3-4.26.5/.github/workflows/python-publish.yml +0 -29
  176. pymobiledevice3-4.26.5/.pre-commit-config.yaml +0 -15
  177. pymobiledevice3-4.26.5/pymobiledevice3/__main__.py +0 -287
  178. pymobiledevice3-4.26.5/pymobiledevice3/bonjour.py +0 -145
  179. pymobiledevice3-4.26.5/pymobiledevice3/cli/apps.py +0 -86
  180. pymobiledevice3-4.26.5/pymobiledevice3/cli/crash.py +0 -82
  181. pymobiledevice3-4.26.5/pymobiledevice3/cli/developer.py +0 -1288
  182. pymobiledevice3-4.26.5/pymobiledevice3/cli/lockdown.py +0 -185
  183. pymobiledevice3-4.26.5/pymobiledevice3/cli/mounter.py +0 -182
  184. pymobiledevice3-4.26.5/pymobiledevice3/cli/power_assertion.py +0 -25
  185. pymobiledevice3-4.26.5/pymobiledevice3/cli/profile.py +0 -180
  186. pymobiledevice3-4.26.5/pymobiledevice3/cli/remote.py +0 -262
  187. pymobiledevice3-4.26.5/pymobiledevice3/cli/syslog.py +0 -187
  188. pymobiledevice3-4.26.5/pymobiledevice3/cli/usbmux.py +0 -68
  189. pymobiledevice3-4.26.5/pymobiledevice3/irecv_devices.py +0 -506
  190. pymobiledevice3-4.26.5/pymobiledevice3/remote/core_device/app_service.py +0 -127
  191. pymobiledevice3-4.26.5/pymobiledevice3/remote/core_device/core_device_service.py +0 -34
  192. pymobiledevice3-4.26.5/pymobiledevice3/remote/core_device/file_service.py +0 -88
  193. pymobiledevice3-4.26.5/pymobiledevice3/remote/xpc_message.py +0 -326
  194. pymobiledevice3-4.26.5/pymobiledevice3/restore/base_restore.py +0 -119
  195. pymobiledevice3-4.26.5/pymobiledevice3/restore/consts.py +0 -70
  196. pymobiledevice3-4.26.5/pymobiledevice3/restore/img4.py +0 -166
  197. pymobiledevice3-4.26.5/pymobiledevice3/restore/restore_options.py +0 -218
  198. pymobiledevice3-4.26.5/pymobiledevice3/restore/tss.py +0 -804
  199. pymobiledevice3-4.26.5/pymobiledevice3/services/afc.py +0 -970
  200. pymobiledevice3-4.26.5/pymobiledevice3/services/device_link.py +0 -207
  201. pymobiledevice3-4.26.5/pymobiledevice3/services/diagnostics.py +0 -1035
  202. pymobiledevice3-4.26.5/pymobiledevice3/services/dvt/instruments/core_profile_session_tap.py +0 -687
  203. pymobiledevice3-4.26.5/pymobiledevice3/services/misagent.py +0 -55
  204. pymobiledevice3-4.26.5/pymobiledevice3/services/mobile_config.py +0 -405
  205. pymobiledevice3-4.26.5/pymobiledevice3/services/mobilebackup2.py +0 -384
  206. pymobiledevice3-4.26.5/pymobiledevice3/services/os_trace.py +0 -182
  207. pymobiledevice3-4.26.5/pymobiledevice3/services/pcapd.py +0 -412
  208. pymobiledevice3-4.26.5/pymobiledevice3/services/remote_fetch_symbols.py +0 -46
  209. pymobiledevice3-4.26.5/pymobiledevice3/services/restore_service.py +0 -45
  210. pymobiledevice3-4.26.5/pymobiledevice3/services/screenshot.py +0 -29
  211. pymobiledevice3-4.26.5/pymobiledevice3/services/web_protocol/alert.py +0 -26
  212. pymobiledevice3-4.26.5/pymobiledevice3/services/web_protocol/automation_session.py +0 -399
  213. pymobiledevice3-4.26.5/pymobiledevice3/services/web_protocol/cdp_target.py +0 -680
  214. pymobiledevice3-4.26.5/pymobiledevice3/services/web_protocol/driver.py +0 -195
  215. pymobiledevice3-4.26.5/pymobiledevice3/services/web_protocol/element.py +0 -195
  216. pymobiledevice3-4.26.5/pymobiledevice3/services/web_protocol/inspector_session.py +0 -264
  217. pymobiledevice3-4.26.5/pymobiledevice3/services/web_protocol/selenium_api.py +0 -91
  218. pymobiledevice3-4.26.5/pymobiledevice3/services/web_protocol/switch_to.py +0 -67
  219. pymobiledevice3-4.26.5/pymobiledevice3/services/webinspector.py +0 -379
  220. pymobiledevice3-4.26.5/pymobiledevice3/tunneld/server.py +0 -481
  221. pymobiledevice3-4.26.5/tests/cli/test_cli.py +0 -45
  222. pymobiledevice3-4.26.5/tests/services/test_web_protocol/test_driver.py +0 -38
  223. pymobiledevice3-4.26.5/tests/services/test_web_protocol/test_element.py +0 -8
  224. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/.gitattributes +0 -0
  225. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/.github/FUNDING.yml +0 -0
  226. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  227. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  228. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  229. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/.github/pull_request_template.md +0 -0
  230. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/.github/workflows/codeql.yml +0 -0
  231. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/.github/workflows/markdown-lint.yml +0 -0
  232. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/.gitignore +0 -0
  233. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/CODE_OF_CONDUCT.md +0 -0
  234. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/CONTRIBUTING.md +0 -0
  235. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/LICENSE +0 -0
  236. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/README.md +0 -0
  237. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/example.gif +0 -0
  238. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/markdownlint-config.json +0 -0
  239. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/misc/DTServices-14.2.txt +0 -0
  240. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/misc/DTServices-14.5.txt +0 -0
  241. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/misc/RemoteXPC.md +0 -0
  242. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/misc/pyinstaller.md +0 -0
  243. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/misc/understanding_idevice_protocol_layers.md +0 -0
  244. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/misc/usbmux_sniff.sh +0 -0
  245. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/__init__.py +0 -0
  246. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/cli/__init__.py +0 -0
  247. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/osu/__init__.py +0 -0
  248. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/remote/__init__.py +0 -0
  249. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/remote/core_device/__init__.py +0 -0
  250. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/remote/module_imports.py +0 -0
  251. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/remote/remote_service.py +0 -0
  252. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/resources/__init__.py +0 -0
  253. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/resources/dsc_uuid_map.json +0 -0
  254. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/resources/notifications.txt +0 -0
  255. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/resources/webinspector/element_attribute.js +0 -0
  256. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/resources/webinspector/element_clear.js +0 -0
  257. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/resources/webinspector/enter_fullscreen.js +0 -0
  258. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/resources/webinspector/find_nodes.js +0 -0
  259. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/resources/webinspector/focus.js +0 -0
  260. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/resources/webinspector/get_attribute.js +0 -0
  261. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/resources/webinspector/is_displayed.js +0 -0
  262. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/resources/webinspector/is_editable.js +0 -0
  263. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/resources/webinspector/is_enabled.js +0 -0
  264. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/restore/__init__.py +0 -0
  265. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/__init__.py +0 -0
  266. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/dvt/__init__.py +0 -0
  267. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/dvt/instruments/__init__.py +0 -0
  268. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/services/web_protocol/__init__.py +0 -0
  269. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3/tunneld/__init__.py +0 -0
  270. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3.egg-info/dependency_links.txt +0 -0
  271. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3.egg-info/entry_points.txt +0 -0
  272. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/pymobiledevice3.egg-info/top_level.txt +0 -0
  273. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/setup.cfg +0 -0
  274. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/tests/__init__.py +0 -0
  275. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/tests/cli/__init__.py +0 -0
  276. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/tests/services/__init__.py +0 -0
  277. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/tests/services/instruments/__init__.py +0 -0
  278. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/tests/services/test_list_devices.py +0 -0
  279. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/tests/services/test_lockdown.py +0 -0
  280. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/tests/services/test_pcapd.py +0 -0
  281. {pymobiledevice3-4.26.5 → pymobiledevice3-6.1.4}/tests/services/test_web_protocol/__init__.py +0 -0
@@ -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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pymobiledevice3
3
- Version: 4.26.5
3
+ Version: 6.1.4
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>
@@ -15,6 +15,7 @@ Classifier: Programming Language :: Python :: 3.10
15
15
  Classifier: Programming Language :: Python :: 3.11
16
16
  Classifier: Programming Language :: Python :: 3.12
17
17
  Classifier: Programming Language :: Python :: 3.13
18
+ Classifier: Programming Language :: Python :: 3.14
18
19
  Classifier: Programming Language :: Python :: 3 :: Only
19
20
  Requires-Python: >=3.9
20
21
  Description-Content-Type: text/markdown
@@ -27,9 +28,8 @@ Requires-Dist: IPython
27
28
  Requires-Dist: bpylist2>=4.0.1
28
29
  Requires-Dist: pygments
29
30
  Requires-Dist: hexdump
30
- Requires-Dist: arrow
31
31
  Requires-Dist: daemonize
32
- Requires-Dist: gpxpy<1.6.0
32
+ Requires-Dist: gpxpy!=1.6.0,<1.7.0
33
33
  Requires-Dist: pykdebugparser>=1.2.7
34
34
  Requires-Dist: pyusb>=1.2.1
35
35
  Requires-Dist: tqdm
@@ -42,14 +42,11 @@ Requires-Dist: cryptography>=41.0.1
42
42
  Requires-Dist: pycrashreport>=1.2.7
43
43
  Requires-Dist: fastapi[all]>=0.93.0
44
44
  Requires-Dist: uvicorn>=0.15.0
45
- Requires-Dist: starlette
46
45
  Requires-Dist: wsproto
47
46
  Requires-Dist: nest_asyncio>=1.5.5
48
47
  Requires-Dist: Pillow
49
48
  Requires-Dist: inquirer3>=0.6.0
50
- Requires-Dist: ipsw_parser>=1.3.4
51
- Requires-Dist: remotezip2
52
- Requires-Dist: zeroconf>=0.132.2
49
+ Requires-Dist: ipsw_parser>=1.5.0
53
50
  Requires-Dist: ifaddr
54
51
  Requires-Dist: hyperframe
55
52
  Requires-Dist: srptools
@@ -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()