Skip to content

Instantly share code, notes, and snippets.

@nikias
Created December 6, 2017 08:49
Show Gist options
  • Save nikias/679b0ae23dcd671d3cea556eb1e7928b to your computer and use it in GitHub Desktop.
Save nikias/679b0ae23dcd671d3cea556eb1e7928b to your computer and use it in GitHub Desktop.
diff --git a/include/libimobiledevice/mobileactivation.h b/include/libimobiledevice/mobileactivation.h
index bb1f3f4..6f954ee 100644
--- a/include/libimobiledevice/mobileactivation.h
+++ b/include/libimobiledevice/mobileactivation.h
@@ -169,11 +169,12 @@ mobileactivation_error_t mobileactivation_activate(mobileactivation_client_t cli
*
* @param client The mobileactivation client
* @param activation_record The activation record plist dictionary
+ * @param headers plist dictionary with the activation response headers from Apple's https webservice
*
* @return MOBILEACTIVATION_E_SUCCESS on success, or an MOBILEACTIVATION_E_*
* error code otherwise.
*/
-mobileactivation_error_t mobileactivation_activate_with_session(mobileactivation_client_t client, plist_t activation_record);
+mobileactivation_error_t mobileactivation_activate_with_session(mobileactivation_client_t client, plist_t activation_record, plist_t headers);
/**
* Deactivates the device.
diff --git a/src/mobileactivation.c b/src/mobileactivation.c
index 7ae35bb..cce5552 100644
--- a/src/mobileactivation.c
+++ b/src/mobileactivation.c
@@ -121,6 +121,38 @@ static mobileactivation_error_t mobileactivation_check_result(plist_t dict, cons
return ret;
}
+static mobileactivation_error_t mobileactivation_send_command_plist(mobileactivation_client_t client, plist_t command, plist_t *result)
+{
+ if (!client || !command)
+ return MOBILEACTIVATION_E_INVALID_ARG;
+
+ plist_t cmd = plist_dict_get_item(command, "Command");
+ char* command_str = NULL;
+ if (cmd) {
+ plist_get_string_val(cmd, &command_str);
+ }
+ if (!command_str)
+ return MOBILEACTIVATION_E_INVALID_ARG;
+
+ mobileactivation_error_t ret = MOBILEACTIVATION_E_UNKNOWN_ERROR;
+ *result = NULL;
+
+ ret = mobileactivation_error(property_list_service_send_binary_plist(client->parent, command));
+
+ plist_t dict = NULL;
+ ret = mobileactivation_error(property_list_service_receive_plist(client->parent, &dict));
+ if (!dict) {
+ debug_info("ERROR: Did not get reply for %s command", command_str);
+ free(command_str);
+ return MOBILEACTIVATION_E_PLIST_ERROR;
+ }
+
+ *result = dict;
+ ret = mobileactivation_check_result(dict, command_str);
+ free(command_str);
+ return ret;
+}
+
static mobileactivation_error_t mobileactivation_send_command(mobileactivation_client_t client, const char* command, plist_t value, plist_t *result)
{
if (!client || !command || !result)
@@ -135,18 +167,9 @@ static mobileactivation_error_t mobileactivation_send_command(mobileactivation_c
plist_dict_set_item(dict, "Value", plist_copy(value));
}
- ret = mobileactivation_error(property_list_service_send_binary_plist(client->parent, dict));
+ ret = mobileactivation_send_command_plist(client, dict, result);
plist_free(dict);
- dict = NULL;
-
- ret = mobileactivation_error(property_list_service_receive_plist(client->parent, &dict));
- if (!dict) {
- debug_info("ERROR: Did not get reply for %s command", command);
- return MOBILEACTIVATION_E_PLIST_ERROR;
- }
-
- *result = dict;
- return mobileactivation_check_result(dict, command);
+ return ret;
}
LIBIMOBILEDEVICE_API mobileactivation_error_t mobileactivation_get_activation_state(mobileactivation_client_t client, plist_t *state)
@@ -250,15 +273,20 @@ LIBIMOBILEDEVICE_API mobileactivation_error_t mobileactivation_activate(mobileac
return ret;
}
-LIBIMOBILEDEVICE_API mobileactivation_error_t mobileactivation_activate_with_session(mobileactivation_client_t client, plist_t activation_record)
+LIBIMOBILEDEVICE_API mobileactivation_error_t mobileactivation_activate_with_session(mobileactivation_client_t client, plist_t activation_record, plist_t headers)
{
if (!client || !activation_record)
return MOBILEACTIVATION_E_INVALID_ARG;
plist_t result = NULL;
- plist_t data = plist_data_from_plist(activation_record);
- mobileactivation_error_t ret = mobileactivation_send_command(client, "HandleActivationInfoWithSessionRequest", data, &result);
- plist_free(data);
+
+ plist_t dict = plist_new_dict();
+ plist_dict_set_item(dict, "Command", plist_new_string("HandleActivationInfoWithSessionRequest"));
+ plist_dict_set_item(dict, "Value", plist_data_from_plist(activation_record));
+ plist_dict_set_item(dict, "ActivationResponseHeaders", plist_copy(headers));
+
+ mobileactivation_error_t ret = mobileactivation_send_command_plist(client, dict, &result);
+ plist_free(dict);
plist_free(result);
result = NULL;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment