summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Nikias Bassen2017-12-07 16:48:36 +0700
committerGravatar Nikias Bassen2017-12-07 16:48:36 +0700
commitb7feed9f5a62833c1df3f503fd3693e2ed2e4738 (patch)
tree7611b740d75cef22e4d3ff18154f302a2143e476
parent5b3fcb7fa704bcbf1a1cc655264ec0d6ab121799 (diff)
downloadlibimobiledevice-b7feed9f5a62833c1df3f503fd3693e2ed2e4738.tar.gz
libimobiledevice-b7feed9f5a62833c1df3f503fd3693e2ed2e4738.tar.bz2
mobileactivation: Allow passing activation response headers as required for iOS 11.2+
When activating in session mode - which is required for newer iOS versions - we can now pass the activation response headers with the activation command. For iOS 11.2+ this is mandatory or the activation will fail.
-rw-r--r--include/libimobiledevice/mobileactivation.h8
-rw-r--r--src/mobileactivation.c60
2 files changed, 50 insertions, 18 deletions
diff --git a/include/libimobiledevice/mobileactivation.h b/include/libimobiledevice/mobileactivation.h
index bb1f3f4..b7f8064 100644
--- a/include/libimobiledevice/mobileactivation.h
+++ b/include/libimobiledevice/mobileactivation.h
@@ -164,16 +164,18 @@ mobileactivation_error_t mobileactivation_activate(mobileactivation_client_t cli
164 164
165/** 165/**
166 * Activates the device with the given activation record in 'session' mode. 166 * Activates the device with the given activation record in 'session' mode.
167 * The activation record plist dictionary must be obtained using the 167 * The activation record plist must be obtained using the
168 * activation protocol requesting from Apple's https webservice. 168 * activation protocol requesting from Apple's https webservice.
169 * 169 *
170 * @param client The mobileactivation client 170 * @param client The mobileactivation client
171 * @param activation_record The activation record plist dictionary 171 * @param activation_record The activation record in plist format
172 * @param headers A plist dictionary with the activation response headers
173 * as returned from Apple's https webservice with the activation record
172 * 174 *
173 * @return MOBILEACTIVATION_E_SUCCESS on success, or an MOBILEACTIVATION_E_* 175 * @return MOBILEACTIVATION_E_SUCCESS on success, or an MOBILEACTIVATION_E_*
174 * error code otherwise. 176 * error code otherwise.
175 */ 177 */
176mobileactivation_error_t mobileactivation_activate_with_session(mobileactivation_client_t client, plist_t activation_record); 178mobileactivation_error_t mobileactivation_activate_with_session(mobileactivation_client_t client, plist_t activation_record, plist_t headers);
177 179
178/** 180/**
179 * Deactivates the device. 181 * Deactivates the device.
diff --git a/src/mobileactivation.c b/src/mobileactivation.c
index 433497a..010484e 100644
--- a/src/mobileactivation.c
+++ b/src/mobileactivation.c
@@ -124,6 +124,38 @@ static mobileactivation_error_t mobileactivation_check_result(plist_t dict, cons
124 return ret; 124 return ret;
125} 125}
126 126
127static mobileactivation_error_t mobileactivation_send_command_plist(mobileactivation_client_t client, plist_t command, plist_t *result)
128{
129 if (!client || !command)
130 return MOBILEACTIVATION_E_INVALID_ARG;
131
132 plist_t cmd = plist_dict_get_item(command, "Command");
133 char* command_str = NULL;
134 if (cmd) {
135 plist_get_string_val(cmd, &command_str);
136 }
137 if (!command_str)
138 return MOBILEACTIVATION_E_INVALID_ARG;
139
140 mobileactivation_error_t ret = MOBILEACTIVATION_E_UNKNOWN_ERROR;
141 *result = NULL;
142
143 ret = mobileactivation_error(property_list_service_send_binary_plist(client->parent, command));
144
145 plist_t dict = NULL;
146 ret = mobileactivation_error(property_list_service_receive_plist(client->parent, &dict));
147 if (!dict) {
148 debug_info("ERROR: Did not get reply for %s command", command_str);
149 free(command_str);
150 return MOBILEACTIVATION_E_PLIST_ERROR;
151 }
152
153 *result = dict;
154 ret = mobileactivation_check_result(dict, command_str);
155 free(command_str);
156 return ret;
157}
158
127static mobileactivation_error_t mobileactivation_send_command(mobileactivation_client_t client, const char* command, plist_t value, plist_t *result) 159static mobileactivation_error_t mobileactivation_send_command(mobileactivation_client_t client, const char* command, plist_t value, plist_t *result)
128{ 160{
129 if (!client || !command || !result) 161 if (!client || !command || !result)
@@ -138,18 +170,9 @@ static mobileactivation_error_t mobileactivation_send_command(mobileactivation_c
138 plist_dict_set_item(dict, "Value", plist_copy(value)); 170 plist_dict_set_item(dict, "Value", plist_copy(value));
139 } 171 }
140 172
141 ret = mobileactivation_error(property_list_service_send_binary_plist(client->parent, dict)); 173 ret = mobileactivation_send_command_plist(client, dict, result);
142 plist_free(dict); 174 plist_free(dict);
143 dict = NULL; 175 return ret;
144
145 ret = mobileactivation_error(property_list_service_receive_plist(client->parent, &dict));
146 if (!dict) {
147 debug_info("ERROR: Did not get reply for %s command", command);
148 return MOBILEACTIVATION_E_PLIST_ERROR;
149 }
150
151 *result = dict;
152 return mobileactivation_check_result(dict, command);
153} 176}
154 177
155LIBIMOBILEDEVICE_API mobileactivation_error_t mobileactivation_get_activation_state(mobileactivation_client_t client, plist_t *state) 178LIBIMOBILEDEVICE_API mobileactivation_error_t mobileactivation_get_activation_state(mobileactivation_client_t client, plist_t *state)
@@ -253,15 +276,22 @@ LIBIMOBILEDEVICE_API mobileactivation_error_t mobileactivation_activate(mobileac
253 return ret; 276 return ret;
254} 277}
255 278
256LIBIMOBILEDEVICE_API mobileactivation_error_t mobileactivation_activate_with_session(mobileactivation_client_t client, plist_t activation_record) 279LIBIMOBILEDEVICE_API mobileactivation_error_t mobileactivation_activate_with_session(mobileactivation_client_t client, plist_t activation_record, plist_t headers)
257{ 280{
258 if (!client || !activation_record) 281 if (!client || !activation_record)
259 return MOBILEACTIVATION_E_INVALID_ARG; 282 return MOBILEACTIVATION_E_INVALID_ARG;
260 283
261 plist_t result = NULL; 284 plist_t result = NULL;
262 plist_t data = plist_data_from_plist(activation_record); 285
263 mobileactivation_error_t ret = mobileactivation_send_command(client, "HandleActivationInfoWithSessionRequest", data, &result); 286 plist_t dict = plist_new_dict();
264 plist_free(data); 287 plist_dict_set_item(dict, "Command", plist_new_string("HandleActivationInfoWithSessionRequest"));
288 plist_dict_set_item(dict, "Value", plist_data_from_plist(activation_record));
289 if (headers) {
290 plist_dict_set_item(dict, "ActivationResponseHeaders", plist_copy(headers));
291 }
292
293 mobileactivation_error_t ret = mobileactivation_send_command_plist(client, dict, &result);
294 plist_free(dict);
265 plist_free(result); 295 plist_free(result);
266 result = NULL; 296 result = NULL;
267 297