diff options
| -rw-r--r-- | src/lockdown.c | 47 | ||||
| -rw-r--r-- | src/lockdown.h | 2 |
2 files changed, 27 insertions, 22 deletions
diff --git a/src/lockdown.c b/src/lockdown.c index afca410..6bf4c84 100644 --- a/src/lockdown.c +++ b/src/lockdown.c | |||
| @@ -120,13 +120,18 @@ lockdownd_error_t lockdownd_stop_session(lockdownd_client_t client) | |||
| 120 | if (!client) | 120 | if (!client) |
| 121 | return LOCKDOWN_E_INVALID_ARG; | 121 | return LOCKDOWN_E_INVALID_ARG; |
| 122 | 122 | ||
| 123 | if (!client->session_id) { | ||
| 124 | log_dbg_msg(DBGMASK_LOCKDOWND, "%s: no session_id given, cannot stop session\n", __func__); | ||
| 125 | return LOCKDOWN_E_INVALID_ARG; | ||
| 126 | } | ||
| 127 | |||
| 123 | lockdownd_error_t ret = LOCKDOWN_E_UNKNOWN_ERROR; | 128 | lockdownd_error_t ret = LOCKDOWN_E_UNKNOWN_ERROR; |
| 124 | 129 | ||
| 125 | plist_t dict = plist_new_dict(); | 130 | plist_t dict = plist_new_dict(); |
| 126 | plist_dict_insert_item(dict,"Request", plist_new_string("StopSession")); | 131 | plist_dict_insert_item(dict,"Request", plist_new_string("StopSession")); |
| 127 | plist_dict_insert_item(dict,"SessionID", plist_new_string(client->session_id)); | 132 | plist_dict_insert_item(dict,"SessionID", plist_new_string(client->session_id)); |
| 128 | 133 | ||
| 129 | log_dbg_msg(DBGMASK_LOCKDOWND, "%s: called\n", __func__); | 134 | log_dbg_msg(DBGMASK_LOCKDOWND, "%s: stopping session %s\n", __func__, client->session_id); |
| 130 | 135 | ||
| 131 | ret = lockdownd_send(client, dict); | 136 | ret = lockdownd_send(client, dict); |
| 132 | 137 | ||
| @@ -148,6 +153,9 @@ lockdownd_error_t lockdownd_stop_session(lockdownd_client_t client) | |||
| 148 | plist_free(dict); | 153 | plist_free(dict); |
| 149 | dict = NULL; | 154 | dict = NULL; |
| 150 | 155 | ||
| 156 | free(client->session_id); | ||
| 157 | client->session_id = NULL; | ||
| 158 | |||
| 151 | return ret; | 159 | return ret; |
| 152 | } | 160 | } |
| 153 | 161 | ||
| @@ -209,6 +217,10 @@ lockdownd_error_t lockdownd_client_free(lockdownd_client_t client) | |||
| 209 | } | 217 | } |
| 210 | } | 218 | } |
| 211 | 219 | ||
| 220 | if (client->session_id) { | ||
| 221 | free(client->session_id); | ||
| 222 | } | ||
| 223 | |||
| 212 | free(client); | 224 | free(client); |
| 213 | return ret; | 225 | return ret; |
| 214 | } | 226 | } |
| @@ -642,6 +654,7 @@ lockdownd_error_t lockdownd_client_new(iphone_device_t device, lockdownd_client_ | |||
| 642 | client_loc->ssl_session = NULL; | 654 | client_loc->ssl_session = NULL; |
| 643 | client_loc->ssl_certificate = NULL; | 655 | client_loc->ssl_certificate = NULL; |
| 644 | client_loc->in_SSL = 0; | 656 | client_loc->in_SSL = 0; |
| 657 | client_loc->session_id = NULL; | ||
| 645 | 658 | ||
| 646 | if (LOCKDOWN_E_SUCCESS != lockdownd_query_type(client_loc)) { | 659 | if (LOCKDOWN_E_SUCCESS != lockdownd_query_type(client_loc)) { |
| 647 | log_debug_msg("%s: QueryType failed in the lockdownd client.\n", __func__); | 660 | log_debug_msg("%s: QueryType failed in the lockdownd client.\n", __func__); |
| @@ -985,7 +998,10 @@ lockdownd_error_t lockdownd_start_ssl_session(lockdownd_client_t client, const c | |||
| 985 | uint32_t return_me = 0; | 998 | uint32_t return_me = 0; |
| 986 | 999 | ||
| 987 | lockdownd_error_t ret = LOCKDOWN_E_UNKNOWN_ERROR; | 1000 | lockdownd_error_t ret = LOCKDOWN_E_UNKNOWN_ERROR; |
| 988 | client->session_id[0] = '\0'; | 1001 | if (client->session_id) { |
| 1002 | free(client->session_id); | ||
| 1003 | client->session_id = NULL; | ||
| 1004 | } | ||
| 989 | 1005 | ||
| 990 | /* Setup DevicePublicKey request plist */ | 1006 | /* Setup DevicePublicKey request plist */ |
| 991 | dict = plist_new_dict(); | 1007 | dict = plist_new_dict(); |
| @@ -1100,27 +1116,16 @@ lockdownd_error_t lockdownd_start_ssl_session(lockdownd_client_t client, const c | |||
| 1100 | ret = LOCKDOWN_E_SUCCESS; | 1116 | ret = LOCKDOWN_E_SUCCESS; |
| 1101 | } | 1117 | } |
| 1102 | } | 1118 | } |
| 1103 | /* store session id */ | 1119 | /* store session id, we need it for StopSession */ |
| 1104 | plist_t session_node = plist_dict_get_item(dict, "SessionID"); | 1120 | plist_t session_node = plist_dict_get_item(dict, "SessionID"); |
| 1105 | if (session_node) { | 1121 | if (session_node && (plist_get_node_type(session_node) == PLIST_STRING)) { |
| 1106 | 1122 | plist_get_string_val(session_node, &client->session_id); | |
| 1107 | plist_type session_node_type = plist_get_node_type(session_node); | 1123 | } |
| 1108 | 1124 | if (client->session_id) { | |
| 1109 | if (session_node_type == PLIST_STRING) { | 1125 | log_dbg_msg(DBGMASK_LOCKDOWND, "%s: SessionID: %s\n", __func__, client->session_id); |
| 1110 | 1126 | } else { | |
| 1111 | char *session_id = NULL; | ||
| 1112 | plist_get_string_val(session_node, &session_id); | ||
| 1113 | |||
| 1114 | if (session_node_type == PLIST_STRING && session_id) { | ||
| 1115 | /* we need to store the session ID for StopSession */ | ||
| 1116 | strcpy(client->session_id, session_id); | ||
| 1117 | log_dbg_msg(DBGMASK_LOCKDOWND, "%s: SessionID: %s\n", __func__, client->session_id); | ||
| 1118 | } | ||
| 1119 | if (session_id) | ||
| 1120 | free(session_id); | ||
| 1121 | } | ||
| 1122 | } else | ||
| 1123 | log_dbg_msg(DBGMASK_LOCKDOWND, "%s: Failed to get SessionID!\n", __func__); | 1127 | log_dbg_msg(DBGMASK_LOCKDOWND, "%s: Failed to get SessionID!\n", __func__); |
| 1128 | } | ||
| 1124 | plist_free(dict); | 1129 | plist_free(dict); |
| 1125 | dict = NULL; | 1130 | dict = NULL; |
| 1126 | 1131 | ||
diff --git a/src/lockdown.h b/src/lockdown.h index 9312867..49b467f 100644 --- a/src/lockdown.h +++ b/src/lockdown.h | |||
| @@ -32,7 +32,7 @@ struct lockdownd_client_int { | |||
| 32 | gnutls_session_t ssl_session; | 32 | gnutls_session_t ssl_session; |
| 33 | gnutls_certificate_credentials_t ssl_certificate; | 33 | gnutls_certificate_credentials_t ssl_certificate; |
| 34 | int in_SSL; | 34 | int in_SSL; |
| 35 | char session_id[40]; | 35 | char *session_id; |
| 36 | }; | 36 | }; |
| 37 | 37 | ||
| 38 | lockdownd_error_t lockdownd_get_device_public_key(lockdownd_client_t client, gnutls_datum_t * public_key); | 38 | lockdownd_error_t lockdownd_get_device_public_key(lockdownd_client_t client, gnutls_datum_t * public_key); |
