diff --git a/src/activate.c b/src/activate.c index 8a8357a..917401b 100755 --- a/src/activate.c +++ b/src/activate.c @@ -69,69 +69,111 @@ int activate_fetch_record(lockdownd_client_t client, plist_t* record, char* cust struct curl_httppost* last = NULL; activate_response* response = NULL; + plist_t imei_node = NULL; + plist_t imsi_node = NULL; + plist_t iccid_node = NULL; + plist_t serial_number_node = NULL; plist_t activation_info_node = NULL; - char* activation_info; - - activate_info* ainfo; + char* imei=NULL; + char* imsi=NULL; + char* iccid=NULL; + char* serial_number=NULL; + char* activation_info=NULL; char* device_class = NULL; - device_class=(char*)lockdownd_get_string_value(client, "DeviceClass"); + plist_t device_class_node = NULL; + lockdownd_get_value(client, NULL, "DeviceClass", &device_class_node); + if (!device_class_node || plist_get_node_type(device_class_node) != PLIST_STRING) { + fprintf(stderr, "Unable to get DeviceClass from lockdownd\n"); + return -1; + } + plist_get_string_val(device_class_node, &device_class); + plist_free(device_class_node); + + plist_t uuid_node=NULL; + char* uuid=NULL; + lockdownd_get_value(client, NULL, "UniqueDeviceID", &uuid_node); + if (!uuid_node || plist_get_node_type(uuid_node) != PLIST_STRING) { + fprintf(stderr, "Unable to get UUID from lockdownd\n"); + return -1; + } + plist_get_string_val(uuid_node, &uuid); + plist_free(uuid_node); + cache("UUID", (const char *)uuid); if (!strcmp(device_class, "iPhone")) { if (use_cache!=1) { if (cust_iccid==NULL) { - ainfo->iccid=(char*)lockdownd_get_string_value(client, "IntegratedCircuitCardIdentity"); + lockdownd_get_value(client, NULL, "IntegratedCircuitCardIdentity", &iccid_node); + if (!iccid_node || plist_get_node_type(iccid_node) != PLIST_STRING) { + fprintf(stderr, "Unable to get ICCID from lockdownd\n"); + return -1; + } + plist_get_string_val(iccid_node, &iccid); + plist_free(iccid_node); } else { info("ICCID specified on the command line..."); - ainfo->iccid=cust_iccid; + iccid=cust_iccid; } if (cust_imei==NULL) { - ainfo->imei=(char*)lockdownd_get_string_value(client, "InternationalMobileEquipmentIdentity"); + lockdownd_get_value(client, NULL, "InternationalMobileEquipmentIdentity", &imei_node); + if (!imei_node || plist_get_node_type(imei_node) != PLIST_STRING) { + fprintf(stderr, "Unable to get IMEI from lockdownd\n"); + return -1; + } + plist_get_string_val(imei_node, &imei); + plist_free(imei_node); } else { info("IMEI specified on the command line..."); - ainfo->imei=cust_imei; + imei=cust_imei; } if (cust_imsi==NULL) { - ainfo->imsi=(char*)lockdownd_get_string_value(client, "InternationalMobileSubscriberIdentity"); + lockdownd_get_value(client, NULL, "InternationalMobileSubscriberIdentity", &imsi_node); + if (!imsi_node || plist_get_node_type(imsi_node) != PLIST_STRING) { + fprintf(stderr, "Unable to get IMSI from lockdownd\n"); + return -1; + } + plist_get_string_val(imsi_node, &imsi); + plist_free(imsi_node); } else { info("IMSI specified on the command line..."); - ainfo->imsi=cust_imsi; + imsi=cust_imsi; } } else { if (cust_iccid==NULL) { - ainfo->iccid=get_from_cache("ICCID"); + iccid=get_from_cache("ICCID"); } else { - ainfo->iccid=cust_iccid; + iccid=cust_iccid; } if (cust_imei==NULL) { - ainfo->imei=get_from_cache("IMEI"); + imei=get_from_cache("IMEI"); } else { - ainfo->imei=cust_imei; + imei=cust_imei; } if (cust_imsi==NULL) { - ainfo->imsi=get_from_cache("IMSI"); + imsi=get_from_cache("IMSI"); } else { - ainfo->imsi=cust_imsi; + imsi=cust_imsi; } } } @@ -140,15 +182,22 @@ int activate_fetch_record(lockdownd_client_t client, plist_t* record, char* cust { if (use_cache!=1) { - ainfo->serial_number=(char*)lockdownd_get_string_value(client, "SerialNumber"); + plist_t serial_num_node = NULL; + lockdownd_get_value(client, NULL, "SerialNumber", &serial_num_node); + if (!serial_num_node || plist_get_node_type(serial_num_node) != PLIST_STRING) { + fprintf(stderr, "Unable to get DeviceClass from lockdownd\n"); + return -1; + } + plist_get_string_val(serial_num_node, &serial_number); + plist_free(serial_num_node); } else { - ainfo->serial_number=get_from_cache("SerialNumber"); + serial_number=get_from_cache("SerialNumber"); } } else { info("Serial number specified on the command line..."); - ainfo->serial_number=cust_serial_num; + serial_number=cust_serial_num; } lockdownd_get_value(client, NULL, "ActivationInfo", &activation_info_node); @@ -163,7 +212,7 @@ int activate_fetch_record(lockdownd_client_t client, plist_t* record, char* cust char* activation_info_data = NULL; plist_to_xml(activation_info_node, &activation_info_data, &activation_info_size); plist_free(activation_info_node); - //printf("%s\n\n", activation_info_data); + printf("%s\n\n", activation_info_data); char* activation_info_start = strstr(activation_info_data, ""); if (activation_info_start == NULL) { @@ -194,37 +243,38 @@ int activate_fetch_record(lockdownd_client_t client, plist_t* record, char* cust curl_formadd(&post, &last, CURLFORM_COPYNAME, "machineName", CURLFORM_COPYCONTENTS, "linux", CURLFORM_END); curl_formadd(&post, &last, CURLFORM_COPYNAME, "InStoreActivation", CURLFORM_COPYCONTENTS, "false", CURLFORM_END); - if (ainfo->imei != NULL) { - curl_formadd(&post, &last, CURLFORM_COPYNAME, "IMEI", CURLFORM_COPYCONTENTS, ainfo->imei, CURLFORM_END); - cache("IMEI", (const char *)ainfo->imei); - //free(ainfo->imei); + + if (imei != NULL) { + curl_formadd(&post, &last, CURLFORM_COPYNAME, "IMEI", CURLFORM_COPYCONTENTS, imei, CURLFORM_END); + cache("IMEI", (const char *)imei); + free(imei); } else { cache("IMEI", ""); } - if (ainfo->imsi != NULL) { - curl_formadd(&post, &last, CURLFORM_COPYNAME, "IMSI", CURLFORM_COPYCONTENTS, ainfo->imsi, CURLFORM_END); - cache("IMSI", (const char *)ainfo->imsi); - //free(ainfo->imsi); + if (imsi != NULL) { + curl_formadd(&post, &last, CURLFORM_COPYNAME, "IMSI", CURLFORM_COPYCONTENTS, imsi, CURLFORM_END); + cache("IMSI", (const char *)imsi); + free(imsi); } else { cache("IMSI", ""); } - if (ainfo->iccid != NULL) { - curl_formadd(&post, &last, CURLFORM_COPYNAME, "ICCID", CURLFORM_COPYCONTENTS, ainfo->iccid, CURLFORM_END); - cache("ICCID", (const char *)ainfo->iccid); - //free(ainfo->iccid); + if (iccid != NULL) { + curl_formadd(&post, &last, CURLFORM_COPYNAME, "ICCID", CURLFORM_COPYCONTENTS, iccid, CURLFORM_END); + cache("ICCID", (const char *)iccid); + free(iccid); } else { cache("ICCID", ""); } - if (ainfo->serial_number != NULL) { - curl_formadd(&post, &last, CURLFORM_COPYNAME, "AppleSerialNumber", CURLFORM_COPYCONTENTS, ainfo->serial_number, CURLFORM_END); - cache("SerialNumber", (const char *)ainfo->serial_number); - free(ainfo->serial_number); + if (serial_number != NULL) { + curl_formadd(&post, &last, CURLFORM_COPYNAME, "AppleSerialNumber", CURLFORM_COPYCONTENTS, serial_number, CURLFORM_END); + cache("SerialNumber", (const char *)serial_number); + free(serial_number); } else { cache("SeralNumber", ""); @@ -320,7 +370,7 @@ int do_activation(lockdownd_client_t client, plist_t activation_record) // Just my little dump'n'run exercise with the activation record... uint32_t len=0; - char **xml=NULL; + char *xml=NULL; plist_to_xml(activation_record, &xml, &len); printf("ACTIVATION RECORD:\n\n%s\n\n", xml); diff --git a/src/cache.c b/src/cache.c index c75c56c..1ec28b7 100755 --- a/src/cache.c +++ b/src/cache.c @@ -99,7 +99,7 @@ int cache_plist(const char *fname, plist_t plist) if (backup_to_cache==1) { uint32_t len=0; - char **xml=NULL; + char *xml=NULL; plist_to_xml(plist, &xml, &len); @@ -116,8 +116,8 @@ char* get_from_cache(const char *what) char fname[512]; snprintf(fname, 512, "%s/%s", cachedir, what); - char *d[BUFSIZE]; - read_file((const char *)fname, &d); + char d[BUFSIZE]; + read_file((const char *)fname, d); return (char *)d; } @@ -134,7 +134,9 @@ void cache_warning() int check_cache(lockdownd_client_t c) { char* uuid_from_cache=get_from_cache("UUID"); - char* uuid_from_device=(char *)lockdownd_get_string_value(c, "UniqueDeviceID"); + char *uuid_from_device=NULL; + + lockdownd_get_string_value(c, "UniqueDeviceID", uuid_from_device); return strcmp(uuid_from_cache, uuid_from_device); } diff --git a/src/ideviceactivate b/src/ideviceactivate new file mode 100755 index 0000000..d2df627 Binary files /dev/null and b/src/ideviceactivate differ diff --git a/src/ideviceactivate.c b/src/ideviceactivate.c index 615256f..43fed9c 100755 --- a/src/ideviceactivate.c +++ b/src/ideviceactivate.c @@ -78,7 +78,7 @@ int main(int argc, char* argv[]) { switch (opt) { case 'h': usage(argc, argv); - break; + return 0; case 'd': debug = 1; diff --git a/src/util.c b/src/util.c index e2ce17d..c6c38e4 100755 --- a/src/util.c +++ b/src/util.c @@ -86,20 +86,17 @@ int plist_read_from_filename(plist_t *plist, const char *filename) { } /* This one is a wrapper for p0sixninja's rather repetetive code... */ -char *lockdownd_get_string_value(lockdownd_client_t client, const char *what) +void lockdownd_get_string_value(lockdownd_client_t client, const char *what, char *val) { plist_t val_node=NULL; - char* val=NULL; lockdownd_get_value(client, NULL, what, &val_node); if (!val_node || plist_get_node_type(val_node) != PLIST_STRING) { fprintf(stderr, "Unable to get %s from lockdownd\n", what); - return NULL; + val=NULL; } plist_get_string_val(val_node, &val); plist_free(val_node); - - return (char *)val; } /* This is really just a function to allow some hooking into Gtk stuff in iDeviceActivator... */ diff --git a/src/util.h b/src/util.h index 5e5132d..51c0774 100755 --- a/src/util.h +++ b/src/util.h @@ -24,7 +24,7 @@ // These just wrap p0sixninja's original code, just trying to clean up... extern int plist_read_from_filename(plist_t *plist, const char *filename); extern int buffer_read_from_filename(const char *filename, char **buffer, uint32_t *length); -extern char *lockdownd_get_string_value(lockdownd_client_t client, const char *what); +extern void lockdownd_get_string_value(lockdownd_client_t client, const char *what, char *val); // The main purpose of these two is to provide a way to mod the behavior, plus a bit of shorthand ;) extern void info(const char *m);