From 4481d1be86fd2068747cf8912d1402fa18c2134c Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Sun, 27 Jan 2019 02:39:20 +0100 Subject: activation: Add API calls to query if an input field is secure and to get its placeholder --- include/libideviceactivation.h | 2 ++ src/activation.c | 48 +++++++++++++++++++++++++++++++++++++++--- 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/include/libideviceactivation.h b/include/libideviceactivation.h index de5d3a2..9f1b8aa 100644 --- a/include/libideviceactivation.h +++ b/include/libideviceactivation.h @@ -79,6 +79,7 @@ void idevice_activation_response_free(idevice_activation_response_t response); void idevice_activation_response_get_field(idevice_activation_response_t response, const char* key, char** value); void idevice_activation_response_get_fields(idevice_activation_response_t response, plist_t* fields); void idevice_activation_response_get_label(idevice_activation_response_t response, const char* key, char** value); +void idevice_activation_response_get_placeholder(idevice_activation_response_t response, const char* key, char **value); void idevice_activation_response_get_title(idevice_activation_response_t response, const char** title); void idevice_activation_response_get_description(idevice_activation_response_t response, const char** description); @@ -88,6 +89,7 @@ void idevice_activation_response_get_headers(idevice_activation_response_t respo int idevice_activation_response_is_activation_acknowledged(idevice_activation_response_t response); int idevice_activation_response_is_authentication_required(idevice_activation_response_t response); int idevice_activation_response_field_requires_input(idevice_activation_response_t response, const char* key); +int idevice_activation_response_field_secure_input(idevice_activation_response_t response, const char* key); int idevice_activation_response_has_errors(idevice_activation_response_t response); idevice_activation_error_t idevice_activation_send_request(idevice_activation_request_t request, idevice_activation_response_t* response); diff --git a/src/activation.c b/src/activation.c index f96e8b7..3018d0a 100644 --- a/src/activation.c +++ b/src/activation.c @@ -81,7 +81,9 @@ struct idevice_activation_response_private { plist_t headers; plist_t fields; plist_t fields_require_input; + plist_t fields_secure_input; plist_t labels; + plist_t labels_placeholder; int is_activation_ack; int is_auth_required; int has_errors; @@ -196,12 +198,15 @@ static idevice_activation_error_t idevice_activation_activation_record_from_plis return IDEVICE_ACTIVATION_E_SUCCESS; } -static void idevice_activation_response_add_field(idevice_activation_response_t response, const char* key, const char* value, int required_input) +static void idevice_activation_response_add_field(idevice_activation_response_t response, const char* key, const char* value, int required_input, int secure_input) { plist_dict_set_item(response->fields, key, plist_new_string(value)); if (required_input) { plist_dict_set_item(response->fields_require_input, key, plist_new_bool(1)); } + if (secure_input) { + plist_dict_set_item(response->fields_secure_input, key, plist_new_bool(1)); + } } static idevice_activation_error_t idevice_activation_parse_buddyml_response(idevice_activation_response_t response) @@ -356,14 +361,27 @@ static idevice_activation_error_t idevice_activation_parse_buddyml_response(idev result = IDEVICE_ACTIVATION_E_BUDDYML_PARSING_ERROR; goto cleanup; } + int secure_input = 0; + xmlChar* secure = xmlGetProp(xpath_result->nodesetval->nodeTab[i], (const xmlChar*) "secure"); + if (secure) { + if (!strcmp((const char*)secure, "true")) { + secure_input = 1; + } + xmlFree(secure); + } - idevice_activation_response_add_field(response, (const char*) id, "", 1); + idevice_activation_response_add_field(response, (const char*) id, "", 1, secure_input); xmlChar* label = xmlGetProp(xpath_result->nodesetval->nodeTab[i], (const xmlChar*) "label"); if (label) { plist_dict_set_item(response->labels, (const char*)id, plist_new_string((const char*) label)); xmlFree(label); } + xmlChar* placeholder = xmlGetProp(xpath_result->nodesetval->nodeTab[i], (const xmlChar*) "placeholder"); + if (placeholder) { + plist_dict_set_item(response->labels_placeholder, (const char*)id, plist_new_string((const char*) placeholder)); + xmlFree(placeholder); + } xmlFree(id); } @@ -390,7 +408,7 @@ static idevice_activation_error_t idevice_activation_parse_buddyml_response(idev } idevice_activation_response_add_field(response, - (const char*) xpath_result->nodesetval->nodeTab[i]->name, (const char*) content, 0); + (const char*) xpath_result->nodesetval->nodeTab[i]->name, (const char*) content, 0, 0); xmlFree(content); } } @@ -960,7 +978,9 @@ IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_response_ne tmp_response->headers = plist_new_dict(); tmp_response->fields = plist_new_dict(); tmp_response->fields_require_input = plist_new_dict(); + tmp_response->fields_secure_input = plist_new_dict(); tmp_response->labels = plist_new_dict(); + tmp_response->labels_placeholder = plist_new_dict(); tmp_response->is_activation_ack = 0; tmp_response->is_auth_required = 0; tmp_response->has_errors = 0; @@ -1037,7 +1057,9 @@ IDEVICE_ACTIVATION_API void idevice_activation_response_free(idevice_activation_ plist_free(response->headers); plist_free(response->fields); plist_free(response->fields_require_input); + plist_free(response->fields_secure_input); plist_free(response->labels); + plist_free(response->labels_placeholder); free(response); } @@ -1073,6 +1095,18 @@ IDEVICE_ACTIVATION_API void idevice_activation_response_get_label(idevice_activa } } +IDEVICE_ACTIVATION_API void idevice_activation_response_get_placeholder(idevice_activation_response_t response, const char* key, char** value) +{ + if (!response || !key || !value) + return; + + *value = NULL; + plist_t item = plist_dict_get_item(response->labels_placeholder, key); + if (item) { + plist_get_string_val(item, value); + } +} + IDEVICE_ACTIVATION_API void idevice_activation_response_get_title(idevice_activation_response_t response, const char** title) { if (!response || !title) @@ -1133,6 +1167,14 @@ IDEVICE_ACTIVATION_API int idevice_activation_response_field_requires_input(idev return (plist_dict_get_item(response->fields_require_input, key) ? 1 : 0); } +IDEVICE_ACTIVATION_API int idevice_activation_response_field_secure_input(idevice_activation_response_t response, const char* key) +{ + if (!response || !key) + return 0; + + return (plist_dict_get_item(response->fields_secure_input, key) ? 1 : 0); +} + IDEVICE_ACTIVATION_API int idevice_activation_response_has_errors(idevice_activation_response_t response) { if (!response) -- cgit v1.1-32-gdbae