summaryrefslogtreecommitdiffstats
path: root/src/lockdown.c
diff options
context:
space:
mode:
authorGravatar Nikias Bassen2021-07-29 03:36:29 +0200
committerGravatar Nikias Bassen2021-07-29 03:36:29 +0200
commit6c7b50355cc5de1da1d7677e012f18efbce34237 (patch)
tree9f70fb484fd9f4c5ecc65b4f2ca4fd4732c94e65 /src/lockdown.c
parent8e01e874113f430dc7a1835282ff93226863e47c (diff)
downloadlibimobiledevice-6c7b50355cc5de1da1d7677e012f18efbce34237.tar.gz
libimobiledevice-6c7b50355cc5de1da1d7677e012f18efbce34237.tar.bz2
lockdown: Get DeviceClass to make sure OS version dependent code is executed correctly
The code in lockdownd_client_new_with_handshake would call the function lockdownd_validate_pair based on the OS version being less than 7.0 without taking into account that Watch OS has a different versioning scheme compared to the other device classes. For this and any future version/device specific checks, the code now queries the DeviceClass and stores it in the idevice_private struct.
Diffstat (limited to 'src/lockdown.c')
-rw-r--r--src/lockdown.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/src/lockdown.c b/src/lockdown.c
index 159f741..2cacc71 100644
--- a/src/lockdown.c
+++ b/src/lockdown.c
@@ -696,6 +696,30 @@ LIBIMOBILEDEVICE_API lockdownd_error_t lockdownd_client_new_with_handshake(idevi
}
plist_free(p_version);
}
+ if (device->device_class == 0) {
+ plist_t p_device_class = NULL;
+ if (lockdownd_get_value(client_loc, NULL, "DeviceClass", &p_device_class) == LOCKDOWN_E_SUCCESS) {
+ char* s_device_class = NULL;
+ plist_get_string_val(p_device_class, &s_device_class);
+ if (s_device_class != NULL) {
+ if (!strcmp(s_device_class, "iPhone")) {
+ device->device_class = DEVICE_CLASS_IPHONE;
+ } else if (!strcmp(s_device_class, "iPad")) {
+ device->device_class = DEVICE_CLASS_IPAD;
+ } else if (!strcmp(s_device_class, "iPod")) {
+ device->device_class = DEVICE_CLASS_IPOD;
+ } else if (!strcmp(s_device_class, "Watch")) {
+ device->device_class = DEVICE_CLASS_WATCH;
+ } else if (!strcmp(s_device_class, "AppleTV")) {
+ device->device_class = DEVICE_CLASS_APPLETV;
+ } else {
+ device->device_class = DEVICE_CLASS_UNKNOWN;
+ }
+ free(s_device_class);
+ }
+ }
+ plist_free(p_device_class);
+ }
userpref_error_t uerr = userpref_read_pair_record(client_loc->udid, &pair_record);
if (uerr == USERPREF_E_READ_ERROR) {
@@ -720,7 +744,7 @@ LIBIMOBILEDEVICE_API lockdownd_error_t lockdownd_client_new_with_handshake(idevi
plist_free(pair_record);
pair_record = NULL;
- if (device->version < DEVICE_VERSION(7,0,0)) {
+ if (device->version < DEVICE_VERSION(7,0,0) && device->device_class != DEVICE_CLASS_WATCH) {
/* for older devices, we need to validate pairing to receive trusted host status */
ret = lockdownd_validate_pair(client_loc, NULL);