summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGravatar Nikias Bassen2019-01-27 04:42:17 +0100
committerGravatar Nikias Bassen2019-01-27 04:42:17 +0100
commit3100d735cf8887df1c1dc1946bc9d7ea20b27d34 (patch)
treeea7d92245cab709a9e0e38a14d9fa84e7c8f0a86 /src
parent7a66710a5c9396e25f6906c09aa11bd1a7bc233e (diff)
downloadlibideviceactivation-3100d735cf8887df1c1dc1946bc9d7ea20b27d34.tar.gz
libideviceactivation-3100d735cf8887df1c1dc1946bc9d7ea20b27d34.tar.bz2
activation: Make sure to get IMSI and ICCID from lockdownd
For some reason, asking lockdownd for 'InternationalMobileSubscriberIdentity' sometimes returns "MissingValue", even though ideviceinfo (without passing a key) shows it. This commit changes the code to get the whole lockdownd 'NULL domain' info (equivalent to ideviceinfo without specifying any key) and parse the required info from there.
Diffstat (limited to 'src')
-rw-r--r--src/activation.c45
1 files changed, 27 insertions, 18 deletions
diff --git a/src/activation.c b/src/activation.c
index 198289f..c4586eb 100644
--- a/src/activation.c
+++ b/src/activation.c
@@ -743,83 +743,92 @@ IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_request_new
uint8_t has_telephony_capability = 0;
uint8_t has_mobile_equipment_id = 0;
lockdownd_error_t err;
+ plist_t info = NULL;
plist_t node = NULL;
plist_t fields = plist_new_dict();
// add InStoreActivation
plist_dict_set_item(fields, "InStoreActivation", plist_new_string("false"));
+ // get a bunch of information at once
+ err = lockdownd_get_value(lockdown, NULL, NULL, &info);
+ if (err != LOCKDOWN_E_SUCCESS) {
+ if (debug_level > 0)
+ fprintf(stderr, "%s: Unable to get basic information from lockdownd\n", __func__);
+ plist_free(fields);
+ return IDEVICE_ACTIVATION_E_INCOMPLETE_INFO;
+ }
+
// add AppleSerialNumber
- err = lockdownd_get_value(lockdown, NULL, "SerialNumber", &node);
- if (err != LOCKDOWN_E_SUCCESS || !node || plist_get_node_type(node) != PLIST_STRING) {
+ node = plist_dict_get_item(info, "SerialNumber");
+ if (!node || plist_get_node_type(node) != PLIST_STRING) {
if (debug_level > 0)
fprintf(stderr, "%s: Unable to get SerialNumber from lockdownd\n", __func__);
plist_free(fields);
+ plist_free(info);
return IDEVICE_ACTIVATION_E_INCOMPLETE_INFO;
}
plist_dict_set_item(fields, "AppleSerialNumber", plist_copy(node));
- plist_free(node);
node = NULL;
+
// check if device has telephone capability
- err = lockdownd_get_value(lockdown, NULL, "TelephonyCapability", &node);
- if (err != LOCKDOWN_E_SUCCESS || !node || plist_get_node_type(node) != PLIST_BOOLEAN) {
+ node = plist_dict_get_item(info, "TelephonyCapability");
+ if (!node || plist_get_node_type(node) != PLIST_BOOLEAN) {
has_telephony_capability = 0;
} else {
plist_get_bool_val(node, &has_telephony_capability);
}
- plist_free(node);
node = NULL;
if (has_telephony_capability) {
// add IMEI
- err = lockdownd_get_value(lockdown, NULL, "InternationalMobileEquipmentIdentity", &node);
- if (err != LOCKDOWN_E_SUCCESS || !node || plist_get_node_type(node) != PLIST_STRING) {
+ node = plist_dict_get_item(info, "InternationalMobileEquipmentIdentity");
+ if (!node || plist_get_node_type(node) != PLIST_STRING) {
has_mobile_equipment_id = 0;
} else {
plist_dict_set_item(fields, "IMEI", plist_copy(node));
has_mobile_equipment_id = 1;
}
- plist_free(node);
node = NULL;
// add MEID
- err = lockdownd_get_value(lockdown, NULL, "MobileEquipmentIdentifier", &node);
- if (err != LOCKDOWN_E_SUCCESS || !node || plist_get_node_type(node) != PLIST_STRING) {
+ node = plist_dict_get_item(info, "MobileEquipmentIdentifier");
+ if (!node || plist_get_node_type(node) != PLIST_STRING) {
if (debug_level > 0)
fprintf(stderr, "%s: Unable to get MEID from lockdownd\n", __func__);
if (!has_mobile_equipment_id) {
plist_free(fields);
+ plist_free(info);
return IDEVICE_ACTIVATION_E_INCOMPLETE_INFO;
}
} else {
plist_dict_set_item(fields, "MEID", plist_copy(node));
}
- plist_free(node);
node = NULL;
// add IMSI
- err = lockdownd_get_value(lockdown, NULL, "InternationalMobileSubscriberIdentity", &node);
- if (err != LOCKDOWN_E_SUCCESS || !node || plist_get_node_type(node) != PLIST_STRING) {
+ node = plist_dict_get_item(info, "InternationalMobileSubscriberIdentity");
+ if (!node || plist_get_node_type(node) != PLIST_STRING) {
if (debug_level > 0)
fprintf(stderr, "%s: Unable to get IMSI from lockdownd\n", __func__);
} else {
plist_dict_set_item(fields, "IMSI", plist_copy(node));
}
- plist_free(node);
node = NULL;
// add ICCID
- err = lockdownd_get_value(lockdown, NULL, "IntegratedCircuitCardIdentity", &node);
- if (err != LOCKDOWN_E_SUCCESS || !node || plist_get_node_type(node) != PLIST_STRING) {
+ node = plist_dict_get_item(info, "IntegratedCircuitCardIdentity");
+ if (!node || plist_get_node_type(node) != PLIST_STRING) {
if (debug_level > 0)
fprintf(stderr, "%s: Unable to get ICCID from lockdownd\n", __func__);
} else {
plist_dict_set_item(fields, "ICCID", plist_copy(node));
}
- plist_free(node);
node = NULL;
}
+ plist_free(info);
+ info = NULL;
// add activation-info
err = lockdownd_get_value(lockdown, NULL, "ActivationInfo", &node);