Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
124 changes: 87 additions & 37 deletions src/activate.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
}
Expand All @@ -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);
Expand All @@ -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, "<dict>");
if (activation_info_start == NULL) {
Expand Down Expand Up @@ -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", "");
Expand Down Expand Up @@ -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);
Expand Down
10 changes: 6 additions & 4 deletions src/cache.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand All @@ -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;
}
Expand All @@ -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);
}
Binary file added src/ideviceactivate
Binary file not shown.
2 changes: 1 addition & 1 deletion src/ideviceactivate.c
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ int main(int argc, char* argv[]) {
switch (opt) {
case 'h':
usage(argc, argv);
break;
return 0;

case 'd':
debug = 1;
Expand Down
7 changes: 2 additions & 5 deletions src/util.c
Original file line number Diff line number Diff line change
Expand Up @@ -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... */
Expand Down
2 changes: 1 addition & 1 deletion src/util.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down