pymobiledevice3 4.14.6__py3-none-any.whl → 7.0.6__py3-none-any.whl

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 (164) hide show
  1. misc/plist_sniffer.py +15 -15
  2. misc/remotexpc_sniffer.py +29 -28
  3. misc/understanding_idevice_protocol_layers.md +15 -10
  4. pymobiledevice3/__main__.py +317 -127
  5. pymobiledevice3/_version.py +22 -4
  6. pymobiledevice3/bonjour.py +358 -113
  7. pymobiledevice3/ca.py +253 -16
  8. pymobiledevice3/cli/activation.py +31 -23
  9. pymobiledevice3/cli/afc.py +49 -40
  10. pymobiledevice3/cli/amfi.py +16 -21
  11. pymobiledevice3/cli/apps.py +87 -42
  12. pymobiledevice3/cli/backup.py +160 -90
  13. pymobiledevice3/cli/bonjour.py +44 -40
  14. pymobiledevice3/cli/cli_common.py +204 -198
  15. pymobiledevice3/cli/companion_proxy.py +14 -14
  16. pymobiledevice3/cli/crash.py +105 -56
  17. pymobiledevice3/cli/developer/__init__.py +62 -0
  18. pymobiledevice3/cli/developer/accessibility/__init__.py +65 -0
  19. pymobiledevice3/cli/developer/accessibility/settings.py +43 -0
  20. pymobiledevice3/cli/developer/arbitration.py +50 -0
  21. pymobiledevice3/cli/developer/condition.py +33 -0
  22. pymobiledevice3/cli/developer/core_device.py +294 -0
  23. pymobiledevice3/cli/developer/debugserver.py +244 -0
  24. pymobiledevice3/cli/developer/dvt/__init__.py +438 -0
  25. pymobiledevice3/cli/developer/dvt/core_profile_session.py +295 -0
  26. pymobiledevice3/cli/developer/dvt/simulate_location.py +56 -0
  27. pymobiledevice3/cli/developer/dvt/sysmon/__init__.py +69 -0
  28. pymobiledevice3/cli/developer/dvt/sysmon/process.py +188 -0
  29. pymobiledevice3/cli/developer/fetch_symbols.py +108 -0
  30. pymobiledevice3/cli/developer/simulate_location.py +51 -0
  31. pymobiledevice3/cli/diagnostics/__init__.py +75 -0
  32. pymobiledevice3/cli/diagnostics/battery.py +47 -0
  33. pymobiledevice3/cli/idam.py +42 -0
  34. pymobiledevice3/cli/lockdown.py +108 -103
  35. pymobiledevice3/cli/mounter.py +158 -99
  36. pymobiledevice3/cli/notification.py +38 -26
  37. pymobiledevice3/cli/pcap.py +45 -24
  38. pymobiledevice3/cli/power_assertion.py +18 -17
  39. pymobiledevice3/cli/processes.py +17 -23
  40. pymobiledevice3/cli/profile.py +165 -109
  41. pymobiledevice3/cli/provision.py +35 -34
  42. pymobiledevice3/cli/remote.py +217 -129
  43. pymobiledevice3/cli/restore.py +159 -143
  44. pymobiledevice3/cli/springboard.py +63 -53
  45. pymobiledevice3/cli/syslog.py +193 -86
  46. pymobiledevice3/cli/usbmux.py +73 -33
  47. pymobiledevice3/cli/version.py +5 -7
  48. pymobiledevice3/cli/webinspector.py +376 -214
  49. pymobiledevice3/common.py +3 -1
  50. pymobiledevice3/exceptions.py +182 -58
  51. pymobiledevice3/irecv.py +52 -53
  52. pymobiledevice3/irecv_devices.py +1489 -464
  53. pymobiledevice3/lockdown.py +473 -275
  54. pymobiledevice3/lockdown_service_provider.py +15 -8
  55. pymobiledevice3/osu/os_utils.py +27 -9
  56. pymobiledevice3/osu/posix_util.py +34 -15
  57. pymobiledevice3/osu/win_util.py +14 -8
  58. pymobiledevice3/pair_records.py +102 -21
  59. pymobiledevice3/remote/common.py +8 -4
  60. pymobiledevice3/remote/core_device/app_service.py +94 -67
  61. pymobiledevice3/remote/core_device/core_device_service.py +17 -14
  62. pymobiledevice3/remote/core_device/device_info.py +5 -5
  63. pymobiledevice3/remote/core_device/diagnostics_service.py +19 -4
  64. pymobiledevice3/remote/core_device/file_service.py +53 -23
  65. pymobiledevice3/remote/remote_service_discovery.py +79 -45
  66. pymobiledevice3/remote/remotexpc.py +73 -44
  67. pymobiledevice3/remote/tunnel_service.py +442 -317
  68. pymobiledevice3/remote/utils.py +14 -13
  69. pymobiledevice3/remote/xpc_message.py +145 -125
  70. pymobiledevice3/resources/dsc_uuid_map.py +19 -19
  71. pymobiledevice3/resources/firmware_notifications.py +20 -16
  72. pymobiledevice3/resources/notifications.txt +144 -0
  73. pymobiledevice3/restore/asr.py +27 -27
  74. pymobiledevice3/restore/base_restore.py +110 -21
  75. pymobiledevice3/restore/consts.py +87 -66
  76. pymobiledevice3/restore/device.py +59 -12
  77. pymobiledevice3/restore/fdr.py +46 -48
  78. pymobiledevice3/restore/ftab.py +19 -19
  79. pymobiledevice3/restore/img4.py +163 -0
  80. pymobiledevice3/restore/mbn.py +587 -0
  81. pymobiledevice3/restore/recovery.py +151 -151
  82. pymobiledevice3/restore/restore.py +562 -544
  83. pymobiledevice3/restore/restore_options.py +131 -110
  84. pymobiledevice3/restore/restored_client.py +51 -31
  85. pymobiledevice3/restore/tss.py +385 -267
  86. pymobiledevice3/service_connection.py +252 -59
  87. pymobiledevice3/services/accessibilityaudit.py +202 -120
  88. pymobiledevice3/services/afc.py +962 -365
  89. pymobiledevice3/services/amfi.py +24 -30
  90. pymobiledevice3/services/companion.py +23 -19
  91. pymobiledevice3/services/crash_reports.py +71 -47
  92. pymobiledevice3/services/debugserver_applist.py +3 -3
  93. pymobiledevice3/services/device_arbitration.py +8 -8
  94. pymobiledevice3/services/device_link.py +101 -79
  95. pymobiledevice3/services/diagnostics.py +973 -967
  96. pymobiledevice3/services/dtfetchsymbols.py +8 -8
  97. pymobiledevice3/services/dvt/dvt_secure_socket_proxy.py +4 -4
  98. pymobiledevice3/services/dvt/dvt_testmanaged_proxy.py +4 -4
  99. pymobiledevice3/services/dvt/instruments/activity_trace_tap.py +85 -74
  100. pymobiledevice3/services/dvt/instruments/application_listing.py +2 -3
  101. pymobiledevice3/services/dvt/instruments/condition_inducer.py +7 -6
  102. pymobiledevice3/services/dvt/instruments/core_profile_session_tap.py +466 -384
  103. pymobiledevice3/services/dvt/instruments/device_info.py +20 -11
  104. pymobiledevice3/services/dvt/instruments/energy_monitor.py +1 -1
  105. pymobiledevice3/services/dvt/instruments/graphics.py +1 -1
  106. pymobiledevice3/services/dvt/instruments/location_simulation.py +1 -1
  107. pymobiledevice3/services/dvt/instruments/location_simulation_base.py +10 -10
  108. pymobiledevice3/services/dvt/instruments/network_monitor.py +17 -17
  109. pymobiledevice3/services/dvt/instruments/notifications.py +1 -1
  110. pymobiledevice3/services/dvt/instruments/process_control.py +35 -10
  111. pymobiledevice3/services/dvt/instruments/screenshot.py +2 -2
  112. pymobiledevice3/services/dvt/instruments/sysmontap.py +15 -15
  113. pymobiledevice3/services/dvt/testmanaged/xcuitest.py +42 -52
  114. pymobiledevice3/services/file_relay.py +10 -10
  115. pymobiledevice3/services/heartbeat.py +9 -8
  116. pymobiledevice3/services/house_arrest.py +16 -15
  117. pymobiledevice3/services/idam.py +20 -0
  118. pymobiledevice3/services/installation_proxy.py +173 -81
  119. pymobiledevice3/services/lockdown_service.py +20 -10
  120. pymobiledevice3/services/misagent.py +22 -19
  121. pymobiledevice3/services/mobile_activation.py +147 -64
  122. pymobiledevice3/services/mobile_config.py +331 -294
  123. pymobiledevice3/services/mobile_image_mounter.py +141 -113
  124. pymobiledevice3/services/mobilebackup2.py +203 -145
  125. pymobiledevice3/services/notification_proxy.py +11 -11
  126. pymobiledevice3/services/os_trace.py +134 -74
  127. pymobiledevice3/services/pcapd.py +314 -302
  128. pymobiledevice3/services/power_assertion.py +10 -9
  129. pymobiledevice3/services/preboard.py +4 -4
  130. pymobiledevice3/services/remote_fetch_symbols.py +21 -14
  131. pymobiledevice3/services/remote_server.py +176 -146
  132. pymobiledevice3/services/restore_service.py +16 -16
  133. pymobiledevice3/services/screenshot.py +15 -12
  134. pymobiledevice3/services/simulate_location.py +7 -7
  135. pymobiledevice3/services/springboard.py +15 -15
  136. pymobiledevice3/services/syslog.py +5 -5
  137. pymobiledevice3/services/web_protocol/alert.py +11 -11
  138. pymobiledevice3/services/web_protocol/automation_session.py +251 -239
  139. pymobiledevice3/services/web_protocol/cdp_screencast.py +46 -37
  140. pymobiledevice3/services/web_protocol/cdp_server.py +19 -19
  141. pymobiledevice3/services/web_protocol/cdp_target.py +411 -373
  142. pymobiledevice3/services/web_protocol/driver.py +114 -111
  143. pymobiledevice3/services/web_protocol/element.py +124 -111
  144. pymobiledevice3/services/web_protocol/inspector_session.py +106 -102
  145. pymobiledevice3/services/web_protocol/selenium_api.py +49 -49
  146. pymobiledevice3/services/web_protocol/session_protocol.py +18 -12
  147. pymobiledevice3/services/web_protocol/switch_to.py +30 -27
  148. pymobiledevice3/services/webinspector.py +189 -155
  149. pymobiledevice3/tcp_forwarder.py +87 -69
  150. pymobiledevice3/tunneld/__init__.py +0 -0
  151. pymobiledevice3/tunneld/api.py +63 -0
  152. pymobiledevice3/tunneld/server.py +603 -0
  153. pymobiledevice3/usbmux.py +198 -147
  154. pymobiledevice3/utils.py +14 -11
  155. {pymobiledevice3-4.14.6.dist-info → pymobiledevice3-7.0.6.dist-info}/METADATA +55 -28
  156. pymobiledevice3-7.0.6.dist-info/RECORD +188 -0
  157. {pymobiledevice3-4.14.6.dist-info → pymobiledevice3-7.0.6.dist-info}/WHEEL +1 -1
  158. pymobiledevice3/cli/developer.py +0 -1215
  159. pymobiledevice3/cli/diagnostics.py +0 -99
  160. pymobiledevice3/tunneld.py +0 -524
  161. pymobiledevice3-4.14.6.dist-info/RECORD +0 -168
  162. {pymobiledevice3-4.14.6.dist-info → pymobiledevice3-7.0.6.dist-info}/entry_points.txt +0 -0
  163. {pymobiledevice3-4.14.6.dist-info → pymobiledevice3-7.0.6.dist-info/licenses}/LICENSE +0 -0
  164. {pymobiledevice3-4.14.6.dist-info → pymobiledevice3-7.0.6.dist-info}/top_level.txt +0 -0
pymobiledevice3/common.py CHANGED
@@ -2,9 +2,11 @@ from pathlib import Path
2
2
 
3
3
  from pymobiledevice3.osu.os_utils import get_os_utils
4
4
 
5
- _HOMEFOLDER = get_os_utils().get_homedir() / '.pymobiledevice3'
5
+ _OS_UTILS = get_os_utils()
6
+ _HOMEFOLDER = _OS_UTILS.get_homedir() / ".pymobiledevice3"
6
7
 
7
8
 
8
9
  def get_home_folder() -> Path:
9
10
  _HOMEFOLDER.mkdir(exist_ok=True, parents=True)
11
+ _OS_UTILS.chown_to_non_sudo_if_needed(_HOMEFOLDER)
10
12
  return _HOMEFOLDER
@@ -1,20 +1,74 @@
1
1
  __all__ = [
2
- 'PyMobileDevice3Exception', 'DeviceVersionNotSupportedError', 'IncorrectModeError',
3
- 'NotTrustedError', 'PairingError', 'NotPairedError', 'CannotStopSessionError',
4
- 'PasswordRequiredError', 'StartServiceError', 'FatalPairingError', 'NoDeviceConnectedError', 'DeviceNotFoundError',
5
- 'TunneldConnectionError', 'ConnectionFailedToUsbmuxdError', 'MuxException', 'InvalidConnectionError',
6
- 'MuxVersionError', 'ArgumentError', 'AfcException', 'AfcFileNotFoundError', 'DvtException', 'DvtDirListError',
7
- 'NotMountedError', 'AlreadyMountedError', 'UnsupportedCommandError', 'ExtractingStackshotError',
8
- 'ConnectionTerminatedError', 'WirError', 'WebInspectorNotEnabledError', 'RemoteAutomationNotEnabledError',
9
- 'ArbitrationError', 'InternalError', 'DeveloperModeIsNotEnabledError', 'DeviceAlreadyInUseError', 'LockdownError',
10
- 'PairingDialogResponsePendingError', 'UserDeniedPairingError', 'InvalidHostIDError', 'SetProhibitedError',
11
- 'MissingValueError', 'PasscodeRequiredError', 'AmfiError', 'DeviceHasPasscodeSetError', 'NotificationTimeoutError',
12
- 'DeveloperModeError', 'ProfileError', 'IRecvError', 'IRecvNoDeviceConnectedError', 'UnrecognizedSelectorError',
13
- 'MessageNotSupportedError', 'InvalidServiceError', 'InspectorEvaluateError',
14
- 'LaunchingApplicationError', 'BadCommandError', 'BadDevError', 'ConnectionFailedError', 'CoreDeviceError',
15
- 'AccessDeniedError', 'RSDRequiredError', 'SysdiagnoseTimeoutError', 'GetProhibitedError',
16
- 'FeatureNotSupportedError', 'OSNotSupportedError', 'DeprecationError', 'NotEnoughDiskSpaceError',
17
- 'CloudConfigurationAlreadyPresentError'
2
+ "AccessDeniedError",
3
+ "AfcException",
4
+ "AfcFileNotFoundError",
5
+ "AlreadyMountedError",
6
+ "AmfiError",
7
+ "ArbitrationError",
8
+ "ArgumentError",
9
+ "BadCommandError",
10
+ "BadDevError",
11
+ "CannotStopSessionError",
12
+ "CloudConfigurationAlreadyPresentError",
13
+ "ConnectionFailedError",
14
+ "ConnectionFailedToUsbmuxdError",
15
+ "ConnectionTerminatedError",
16
+ "CoreDeviceError",
17
+ "DeprecationError",
18
+ "DeveloperModeError",
19
+ "DeveloperModeIsNotEnabledError",
20
+ "DeviceAlreadyInUseError",
21
+ "DeviceHasPasscodeSetError",
22
+ "DeviceNotFoundError",
23
+ "DeviceVersionNotSupportedError",
24
+ "DisableMemoryLimitError",
25
+ "DvtDirListError",
26
+ "DvtException",
27
+ "ExtractingStackshotError",
28
+ "FatalPairingError",
29
+ "FeatureNotSupportedError",
30
+ "GetProhibitedError",
31
+ "IRecvError",
32
+ "IRecvNoDeviceConnectedError",
33
+ "IncorrectModeError",
34
+ "InspectorEvaluateError",
35
+ "InternalError",
36
+ "InvalidConnectionError",
37
+ "InvalidHostIDError",
38
+ "InvalidServiceError",
39
+ "LaunchingApplicationError",
40
+ "LockdownError",
41
+ "MessageNotSupportedError",
42
+ "MissingValueError",
43
+ "MuxException",
44
+ "MuxVersionError",
45
+ "NoDeviceConnectedError",
46
+ "NotEnoughDiskSpaceError",
47
+ "NotMountedError",
48
+ "NotPairedError",
49
+ "NotTrustedError",
50
+ "NotificationTimeoutError",
51
+ "OSNotSupportedError",
52
+ "PairingDialogResponsePendingError",
53
+ "PairingError",
54
+ "PasscodeRequiredError",
55
+ "PasswordRequiredError",
56
+ "ProfileError",
57
+ "PyMobileDevice3Exception",
58
+ "QuicProtocolNotSupportedError",
59
+ "RSDRequiredError",
60
+ "RemoteAutomationNotEnabledError",
61
+ "RemotePairingCompletedError",
62
+ "SetProhibitedError",
63
+ "StartServiceError",
64
+ "SysdiagnoseTimeoutError",
65
+ "TSSError",
66
+ "TunneldConnectionError",
67
+ "UnrecognizedSelectorError",
68
+ "UnsupportedCommandError",
69
+ "UserDeniedPairingError",
70
+ "WebInspectorNotEnabledError",
71
+ "WirError",
18
72
  ]
19
73
 
20
74
  from typing import Optional
@@ -53,7 +107,10 @@ class PasswordRequiredError(PairingError):
53
107
 
54
108
 
55
109
  class StartServiceError(PyMobileDevice3Exception):
56
- pass
110
+ def __init__(self, service_name: str, message: str) -> None:
111
+ super().__init__()
112
+ self.service_name = service_name
113
+ self.message = message
57
114
 
58
115
 
59
116
  class FatalPairingError(PyMobileDevice3Exception):
@@ -109,9 +166,10 @@ class ArgumentError(PyMobileDevice3Exception):
109
166
 
110
167
 
111
168
  class AfcException(PyMobileDevice3Exception, OSError):
112
- def __init__(self, message, status):
169
+ def __init__(self, message: str, status: str, filename: Optional[str] = None) -> None:
113
170
  OSError.__init__(self, status, message)
114
171
  self.status = status
172
+ self.filename = filename
115
173
 
116
174
 
117
175
  class AfcFileNotFoundError(AfcException):
@@ -119,113 +177,131 @@ class AfcFileNotFoundError(AfcException):
119
177
 
120
178
 
121
179
  class DvtException(PyMobileDevice3Exception):
122
- """ Domain exception for DVT operations. """
180
+ """Domain exception for DVT operations."""
181
+
123
182
  pass
124
183
 
125
184
 
126
185
  class UnrecognizedSelectorError(DvtException):
127
- """ Attempted to call an unrecognized selector from DVT. """
186
+ """Attempted to call an unrecognized selector from DVT."""
187
+
128
188
  pass
129
189
 
130
190
 
131
191
  class DvtDirListError(DvtException):
132
- """ Raise when directory listing fails. """
192
+ """Raise when directory listing fails."""
193
+
133
194
  pass
134
195
 
135
196
 
136
197
  class NotMountedError(PyMobileDevice3Exception):
137
- """ Given image for umount wasn't mounted in the first place """
198
+ """Given image for umount wasn't mounted in the first place"""
199
+
138
200
  pass
139
201
 
140
202
 
141
203
  class AlreadyMountedError(PyMobileDevice3Exception):
142
- """ Given image for mount has already been mounted in the first place """
204
+ """Given image for mount has already been mounted in the first place"""
205
+
143
206
  pass
144
207
 
145
208
 
146
209
  class MissingManifestError(PyMobileDevice3Exception):
147
- """ No manifest could be found """
210
+ """No manifest could be found"""
211
+
148
212
  pass
149
213
 
150
214
 
151
215
  class UnsupportedCommandError(PyMobileDevice3Exception):
152
- """ Given command isn't supported for this iOS version """
216
+ """Given command isn't supported for this iOS version"""
217
+
153
218
  pass
154
219
 
155
220
 
156
221
  class ExtractingStackshotError(PyMobileDevice3Exception):
157
- """ Raise when stackshot is not received in the core profile session. """
222
+ """Raise when stackshot is not received in the core profile session."""
223
+
158
224
  pass
159
225
 
160
226
 
161
227
  class ConnectionTerminatedError(PyMobileDevice3Exception):
162
- """ Raise when a connection is terminated abruptly. """
228
+ """Raise when a connection is terminated abruptly."""
229
+
163
230
  pass
164
231
 
165
232
 
166
233
  class StreamClosedError(ConnectionTerminatedError):
167
- """ Raise when trying to send a message on a closed stream. """
234
+ """Raise when trying to send a message on a closed stream."""
235
+
168
236
  pass
169
237
 
170
238
 
171
239
  class WebInspectorNotEnabledError(PyMobileDevice3Exception):
172
- """ Raise when Web Inspector is not enabled. """
240
+ """Raise when Web Inspector is not enabled."""
241
+
173
242
  pass
174
243
 
175
244
 
176
245
  class RemoteAutomationNotEnabledError(PyMobileDevice3Exception):
177
- """ Raise when Web Inspector remote automation is not enabled. """
246
+ """Raise when Web Inspector remote automation is not enabled."""
247
+
178
248
  pass
179
249
 
180
250
 
181
251
  class WirError(PyMobileDevice3Exception):
182
- """ Raise when Webinspector WIR command fails. """
252
+ """Raise when Webinspector WIR command fails."""
253
+
183
254
  pass
184
255
 
185
256
 
186
257
  class InternalError(PyMobileDevice3Exception):
187
- """ Some internal Apple error """
258
+ """Some internal Apple error"""
259
+
188
260
  pass
189
261
 
190
262
 
191
263
  class ArbitrationError(PyMobileDevice3Exception):
192
- """ Arbitration failed """
264
+ """Arbitration failed"""
265
+
193
266
  pass
194
267
 
195
268
 
196
269
  class DeviceAlreadyInUseError(ArbitrationError):
197
- """ Device is already checked-in by someone """
270
+ """Device is already checked-in by someone"""
198
271
 
199
272
  @property
200
273
  def message(self):
201
- return self.args[0].get('message')
274
+ return self.args[0].get("message")
202
275
 
203
276
  @property
204
277
  def owner(self):
205
- return self.args[0].get('owner')
278
+ return self.args[0].get("owner")
206
279
 
207
280
  @property
208
281
  def result(self):
209
- return self.args[0].get('result')
282
+ return self.args[0].get("result")
210
283
 
211
284
 
212
285
  class DeveloperModeIsNotEnabledError(PyMobileDevice3Exception):
213
- """ Raise when mounting failed because developer mode is not enabled. """
286
+ """Raise when mounting failed because developer mode is not enabled."""
287
+
214
288
  pass
215
289
 
216
290
 
217
291
  class DeveloperDiskImageNotFoundError(PyMobileDevice3Exception):
218
- """ Failed to locate the correct DeveloperDiskImage.dmg """
292
+ """Failed to locate the correct DeveloperDiskImage.dmg"""
293
+
219
294
  pass
220
295
 
221
296
 
222
297
  class DeveloperModeError(PyMobileDevice3Exception):
223
- """ Raise when amfid failed to enable developer mode. """
298
+ """Raise when amfid failed to enable developer mode."""
299
+
224
300
  pass
225
301
 
226
302
 
227
303
  class LockdownError(PyMobileDevice3Exception):
228
- """ lockdown general error """
304
+ """lockdown general error"""
229
305
 
230
306
  def __init__(self, message: str, identifier: Optional[str] = None) -> None:
231
307
  super().__init__(message)
@@ -241,7 +317,8 @@ class SetProhibitedError(LockdownError):
241
317
 
242
318
 
243
319
  class PairingDialogResponsePendingError(PairingError):
244
- """ User hasn't yet confirmed the device is trusted """
320
+ """User hasn't yet confirmed the device is trusted"""
321
+
245
322
  pass
246
323
 
247
324
 
@@ -254,7 +331,8 @@ class InvalidHostIDError(PairingError):
254
331
 
255
332
 
256
333
  class MissingValueError(LockdownError):
257
- """ raised when attempting to query non-existent domain/key """
334
+ """raised when attempting to query non-existent domain/key"""
335
+
258
336
  pass
259
337
 
260
338
 
@@ -263,7 +341,8 @@ class InvalidConnectionError(LockdownError):
263
341
 
264
342
 
265
343
  class PasscodeRequiredError(LockdownError):
266
- """ passcode must be present for this action """
344
+ """passcode must be present for this action"""
345
+
267
346
  pass
268
347
 
269
348
 
@@ -304,8 +383,14 @@ class InvalidServiceError(LockdownError):
304
383
 
305
384
 
306
385
  class InspectorEvaluateError(PyMobileDevice3Exception):
307
- def __init__(self, class_name: str, message: str, line: Optional[int] = None, column: Optional[int] = None,
308
- stack: Optional[list[str]] = None):
386
+ def __init__(
387
+ self,
388
+ class_name: str,
389
+ message: str,
390
+ line: Optional[int] = None,
391
+ column: Optional[int] = None,
392
+ stack: Optional[list[str]] = None,
393
+ ):
309
394
  super().__init__()
310
395
  self.class_name = class_name
311
396
  self.message = message
@@ -314,10 +399,8 @@ class InspectorEvaluateError(PyMobileDevice3Exception):
314
399
  self.stack = stack
315
400
 
316
401
  def __str__(self) -> str:
317
- stack_trace = '\n'.join([f'\t - {frame}' for frame in self.stack])
318
- return (f'{self.class_name}: {self.message}.\n'
319
- f'Line: {self.line} Column: {self.column}\n'
320
- f'Stack: {stack_trace}')
402
+ stack_trace = "\n".join([f"\t - {frame}" for frame in self.stack])
403
+ return f"{self.class_name}: {self.message}.\nLine: {self.line} Column: {self.column}\nStack: {stack_trace}"
321
404
 
322
405
 
323
406
  class LaunchingApplicationError(PyMobileDevice3Exception):
@@ -337,7 +420,8 @@ class CoreDeviceError(PyMobileDevice3Exception):
337
420
 
338
421
 
339
422
  class AccessDeniedError(PyMobileDevice3Exception):
340
- """ Need extra permissions to execute this command """
423
+ """Need extra permissions to execute this command"""
424
+
341
425
  pass
342
426
 
343
427
 
@@ -346,22 +430,25 @@ class NoSuchBuildIdentityError(PyMobileDevice3Exception):
346
430
 
347
431
 
348
432
  class MobileActivationException(PyMobileDevice3Exception):
349
- """ Mobile activation can not be done """
433
+ """Mobile activation can not be done"""
434
+
350
435
  pass
351
436
 
352
437
 
353
438
  class NotEnoughDiskSpaceError(PyMobileDevice3Exception):
354
- """ Computer does not have enough disk space for the intended operation """
439
+ """Computer does not have enough disk space for the intended operation"""
440
+
355
441
  pass
356
442
 
357
443
 
358
444
  class DeprecationError(PyMobileDevice3Exception):
359
- """ The requested action/service/method is deprecated """
445
+ """The requested action/service/method is deprecated"""
446
+
360
447
  pass
361
448
 
362
449
 
363
450
  class RSDRequiredError(PyMobileDevice3Exception):
364
- """ The requested action requires an RSD object """
451
+ """The requested action requires an RSD object"""
365
452
 
366
453
  def __init__(self, identifier: str) -> None:
367
454
  self.identifier = identifier
@@ -369,7 +456,8 @@ class RSDRequiredError(PyMobileDevice3Exception):
369
456
 
370
457
 
371
458
  class SysdiagnoseTimeoutError(PyMobileDevice3Exception, TimeoutError):
372
- """ Timeout collecting new sysdiagnose archive """
459
+ """Timeout collecting new sysdiagnose archive"""
460
+
373
461
  pass
374
462
 
375
463
 
@@ -380,13 +468,49 @@ class SupportError(PyMobileDevice3Exception):
380
468
 
381
469
 
382
470
  class OSNotSupportedError(SupportError):
383
- """ Operating system is not supported. """
471
+ """Operating system is not supported."""
472
+
384
473
  pass
385
474
 
386
475
 
387
476
  class FeatureNotSupportedError(SupportError):
388
- """ Feature has not been implemented for OS. """
477
+ """Feature has not been implemented for OS."""
389
478
 
390
479
  def __init__(self, os_name, feature):
391
480
  super().__init__(os_name)
392
481
  self.feature = feature
482
+
483
+
484
+ class QuicProtocolNotSupportedError(PyMobileDevice3Exception):
485
+ """QUIC tunnel support was removed on iOS 18.2+"""
486
+
487
+ pass
488
+
489
+
490
+ class RemotePairingCompletedError(PyMobileDevice3Exception):
491
+ """
492
+ Raised upon pairing completion using the `remotepairingdeviced` service (RemoteXPC).
493
+
494
+ remotepairingdeviced closes connection after pairing, so client must re-establish it after pairing is
495
+ completed.
496
+ """
497
+
498
+ pass
499
+
500
+
501
+ class DisableMemoryLimitError(PyMobileDevice3Exception):
502
+ """Disabling memory limit fails."""
503
+
504
+ pass
505
+
506
+
507
+ class ProtocolError(PyMobileDevice3Exception):
508
+ """An unexpected protocol message was received"""
509
+
510
+ pass
511
+
512
+
513
+ class TSSError(PyMobileDevice3Exception):
514
+ """An unexpected message was received from apple ticket server"""
515
+
516
+ pass