diff options
| author | 2017-12-07 16:48:36 +0700 | |
|---|---|---|
| committer | 2017-12-07 16:48:36 +0700 | |
| commit | b7feed9f5a62833c1df3f503fd3693e2ed2e4738 (patch) | |
| tree | 7611b740d75cef22e4d3ff18154f302a2143e476 /src | |
| parent | 5b3fcb7fa704bcbf1a1cc655264ec0d6ab121799 (diff) | |
| download | libimobiledevice-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.
Diffstat (limited to 'src')
| -rw-r--r-- | src/mobileactivation.c | 60 |
1 files changed, 45 insertions, 15 deletions
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 | ||
| 127 | static 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 | |||
| 127 | static mobileactivation_error_t mobileactivation_send_command(mobileactivation_client_t client, const char* command, plist_t value, plist_t *result) | 159 | static 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 | ||
| 155 | LIBIMOBILEDEVICE_API mobileactivation_error_t mobileactivation_get_activation_state(mobileactivation_client_t client, plist_t *state) | 178 | LIBIMOBILEDEVICE_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 | ||
| 256 | LIBIMOBILEDEVICE_API mobileactivation_error_t mobileactivation_activate_with_session(mobileactivation_client_t client, plist_t activation_record) | 279 | LIBIMOBILEDEVICE_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 | ||
