diff options
author | Jonathan Beck | 2008-08-03 20:21:23 +0200 |
---|---|---|
committer | Matt Colyer | 2008-08-05 23:28:10 -0700 |
commit | c58482a7dbb3978bacfb5ffd8085d915bcde297d (patch) | |
tree | c7c42d6359e99f092a6db0066f460dafa367bfcd | |
parent | b6ed54477c00e2b4572e898fe0a47aa64a028c26 (diff) | |
download | libimobiledevice-c58482a7dbb3978bacfb5ffd8085d915bcde297d.tar.gz libimobiledevice-c58482a7dbb3978bacfb5ffd8085d915bcde297d.tar.bz2 |
prepare config for pairing
Signed-off-by: Matt Colyer <matt@colyer.name>
-rw-r--r-- | src/userpref.c | 230 | ||||
-rw-r--r-- | src/userpref.h | 44 |
2 files changed, 265 insertions, 9 deletions
diff --git a/src/userpref.c b/src/userpref.c index bc92f96..399e054 100644 --- a/src/userpref.c +++ b/src/userpref.c @@ -29,27 +29,239 @@ extern int debug; +inline void create_config_dir() { + gchar* config_dir = g_build_path(G_DIR_SEPARATOR_S, g_get_user_config_dir(), LIBIPHONE_CONF_DIR, NULL); + g_mkdir_with_parents (config_dir, 755); + return; +} + char* get_host_id() { char* host_id = NULL; - gchar* config_file = NULL; + gchar* config_file = g_build_path(G_DIR_SEPARATOR_S, g_get_user_config_dir(), LIBIPHONE_CONF_DIR, LIBIPHONE_CONF_FILE, NULL); + + /* now parse file to get the HostID */ + GKeyFile* key_file = g_key_file_new (); + if( g_key_file_load_from_file (key_file, config_file, G_KEY_FILE_KEEP_COMMENTS, NULL) ) { + + gchar* loc_host_id = g_key_file_get_value(key_file, "Global", "HostID", NULL); + if (loc_host_id) + host_id = strdup((char*)loc_host_id); + g_free(loc_host_id); + } + g_key_file_free(key_file); + + if (debug) printf("Using %s as HostID\n",host_id); + return host_id; +} + +int is_device_known(char* public_key) +{ + int ret = 0; /* first get config file */ - config_file = g_build_path(G_DIR_SEPARATOR_S, g_get_user_config_dir(), LIBIPHONE_CONF_DIR, LIBIPHONE_CONF_FILE, NULL); + gchar* config_file = g_build_path(G_DIR_SEPARATOR_S, g_get_user_config_dir(), LIBIPHONE_CONF_DIR, LIBIPHONE_CONF_FILE, NULL); if (g_file_test(config_file, (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR))) { - /* now parse file to get the HostID */ + /* now parse file to get knwon devices list */ GKeyFile* key_file = g_key_file_new (); if( g_key_file_load_from_file (key_file, config_file, G_KEY_FILE_KEEP_COMMENTS, NULL) ) { - gchar* loc_host_id = g_key_file_get_value(key_file, "Global", "HostID", NULL); - if (loc_host_id) - host_id = strdup((char*)loc_host_id); - g_free(loc_host_id); + gchar** devices_list = g_key_file_get_string_list (key_file, "Global", "DevicesList", NULL, NULL); + if (devices_list) { + gchar** pcur = devices_list; + while(*pcur && !ret) { + /* open associated base64 encoded key */ + gchar* keyfilepath = g_build_path(G_DIR_SEPARATOR_S, g_get_user_config_dir(), LIBIPHONE_CONF_DIR, *pcur, NULL); + if (g_file_test(keyfilepath, (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR))) { + GIOChannel* keyfile = g_io_channel_new_file (keyfilepath, "r", NULL); + + gchar* stored_key = NULL; + g_io_channel_read_to_end (keyfile, &stored_key, NULL, NULL); + + /* now compare to input */ + if (strcmp(public_key, stored_key) == 2) + ret = 1; + g_free(stored_key); + g_io_channel_shutdown(keyfile, FALSE, NULL); + pcur++; + } + } + } + g_strfreev(devices_list); } g_key_file_free(key_file); } - if (debug) printf("Using %s as HostID\n",host_id); - return host_id; + return ret; +} + +int store_device_public_key(char* public_key) +{ + if (NULL == public_key || is_device_known(public_key)) + return 0; + + /* first get config file */ + gchar* config_file = g_build_path(G_DIR_SEPARATOR_S, g_get_user_config_dir(), LIBIPHONE_CONF_DIR, LIBIPHONE_CONF_FILE, NULL); + if (g_file_test(config_file, (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR))) { + + + GKeyFile* key_file = g_key_file_new (); + if( g_key_file_load_from_file (key_file, config_file, G_KEY_FILE_KEEP_COMMENTS, NULL) ) { + + gchar** devices_list = g_key_file_get_string_list (key_file, "Global", "DevicesList", NULL, NULL); + + guint length = 0; + if (devices_list) + g_strv_length(devices_list); + g_strfreev(devices_list); + + gchar dev_file[20]; + g_sprintf (dev_file, "Device%i", length); + + gchar* device_file = g_build_path(G_DIR_SEPARATOR_S, g_get_user_config_dir(), LIBIPHONE_CONF_DIR, dev_file, NULL); + GIOChannel* file = g_io_channel_new_file (device_file, "w", NULL); + g_io_channel_write_chars (file, public_key, length, NULL, NULL); + g_io_channel_shutdown(file, FALSE, NULL); + + /* append device to list */ + gchar** new_devices_list = (gchar**)g_malloc(sizeof(gchar*)* (length + 1)); + int i; + for( i = 0; i < length; i++) + new_devices_list[i] = devices_list[i]; + new_devices_list[length] = dev_file; + new_devices_list[length+1] = NULL; + g_key_file_set_string_list (key_file,"Global", "DevicesList", new_devices_list, length+1); + g_free(new_devices_list); + + } + gsize length; + gchar* buf = g_key_file_to_data (key_file, &length,NULL); + GIOChannel* file = g_io_channel_new_file (config_file, "w", NULL); + g_io_channel_write_chars (file, buf, length, NULL, NULL); + g_io_channel_shutdown(file, FALSE, NULL); + g_key_file_free(key_file); + } + + return 1; +} + + +char* get_root_private_key() +{ + char* private_key = NULL; + + /* first get config file */ + gchar* config_file = g_build_path(G_DIR_SEPARATOR_S, g_get_user_config_dir(), LIBIPHONE_CONF_DIR, LIBIPHONE_CONF_FILE, NULL); + if (g_file_test(config_file, (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR))) { + + /* now parse file to get knwon devices list */ + GKeyFile* key_file = g_key_file_new (); + if( g_key_file_load_from_file (key_file, config_file, G_KEY_FILE_KEEP_COMMENTS, NULL) ) { + + gchar* loc_private_key = g_key_file_get_value(key_file, "Global", "RootPrivateKey", NULL); + if (loc_private_key) + private_key = strdup((char*)loc_private_key); + g_free(loc_private_key); + } + g_key_file_free(key_file); + } + return private_key; } +char* get_host_private_key() +{ + char* private_key = NULL; + + /* first get config file */ + gchar* config_file = g_build_path(G_DIR_SEPARATOR_S, g_get_user_config_dir(), LIBIPHONE_CONF_DIR, LIBIPHONE_CONF_FILE, NULL); + if (g_file_test(config_file, (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR))) { + + /* now parse file to get knwon devices list */ + GKeyFile* key_file = g_key_file_new (); + if( g_key_file_load_from_file (key_file, config_file, G_KEY_FILE_KEEP_COMMENTS, NULL) ) { + + gchar* loc_private_key = g_key_file_get_value(key_file, "Global", "HostPrivateKey", NULL); + if (loc_private_key) + private_key = strdup((char*)loc_private_key); + g_free(loc_private_key); + } + g_key_file_free(key_file); + } + return private_key; +} + + +char* get_root_certificate() +{ + char* cert = NULL; + + /* first get config file */ + gchar* config_file = g_build_path(G_DIR_SEPARATOR_S, g_get_user_config_dir(), LIBIPHONE_CONF_DIR, LIBIPHONE_CONF_FILE, NULL); + if (g_file_test(config_file, (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR))) { + + /* now parse file to get knwon devices list */ + GKeyFile* key_file = g_key_file_new (); + if( g_key_file_load_from_file (key_file, config_file, G_KEY_FILE_KEEP_COMMENTS, NULL) ) { + + gchar* loc_cert = g_key_file_get_value(key_file, "Global", "RootCertificate", NULL); + if (loc_cert) + cert = strdup((char*)loc_cert); + g_free(loc_cert); + } + g_key_file_free(key_file); + } + return cert; +} + +char* get_host_certificate() +{ + char* cert = NULL; + + /* first get config file */ + gchar* config_file = g_build_path(G_DIR_SEPARATOR_S, g_get_user_config_dir(), LIBIPHONE_CONF_DIR, LIBIPHONE_CONF_FILE, NULL); + if (g_file_test(config_file, (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR))) { + + /* now parse file to get knwon devices list */ + GKeyFile* key_file = g_key_file_new (); + if( g_key_file_load_from_file (key_file, config_file, G_KEY_FILE_KEEP_COMMENTS, NULL) ) { + + gchar* loc_cert = g_key_file_get_value(key_file, "Global", "HostCertificate", NULL); + if (loc_cert) + cert = strdup((char*)loc_cert); + g_free(loc_cert); + } + g_key_file_free(key_file); + } + return cert; +} + +int init_config_file(char* host_id, char* root_private_key, char* host_private_key, char* root_cert, char* host_cert) +{ + if (!host_id || !root_private_key || !host_private_key) + return 0; + + gchar* config_file = g_build_path(G_DIR_SEPARATOR_S, g_get_user_config_dir(), LIBIPHONE_CONF_DIR, LIBIPHONE_CONF_FILE, NULL); + /* make sure config directory exists*/ + create_config_dir(); + + /* now parse file to get the HostID */ + GKeyFile* key_file = g_key_file_new (); + + /* store in config file */ + g_key_file_set_value (key_file, "Global", "HostID", host_id); + g_key_file_set_value (key_file, "Global", "RootPrivateKey", root_private_key); + g_key_file_set_value (key_file, "Global", "HostPrivateKey", host_private_key); + g_key_file_set_value (key_file, "Global", "RootCertificate", root_cert); + g_key_file_set_value (key_file, "Global", "HostCertificate", host_cert); + + /* write config file on disk */ + gsize length; + gchar* buf = g_key_file_to_data (key_file, &length,NULL); + GIOChannel* file = g_io_channel_new_file (config_file, "w", NULL); + g_io_channel_write_chars (file, buf, length, NULL, NULL); + g_io_channel_shutdown(file, FALSE, NULL); + + g_key_file_free(key_file); + + return 1; +} diff --git a/src/userpref.h b/src/userpref.h index b097084..cef0bed 100644 --- a/src/userpref.h +++ b/src/userpref.h @@ -29,4 +29,48 @@ */ char* get_host_id(); +/** +* \fn int is_device_known(char* public_key) +* determine if we already paired this device. +* \return 1 if device is already paired. Returns 0 otherwise. +*/ +int is_device_known(char* public_key); + +/** +* \fn int store_device_public_key(char* public_key) +* \return 1 if everything went well. Returns 0 otherwise. +*/ +int store_device_public_key(char* public_key); + +/** +* \fn char* get_root_private_key() +* \return RootPrivateKey if exists. Returns NULL otherwise. +*/ +char* get_root_private_key(); + +/** +* \fn char* get_host_private_key() +* \return HostPrivateKey if exists. Returns NULL otherwise. +*/ +char* get_host_private_key(); + +/** +* \fn char* get_root_certificate() +* \return RootCertificate if exists. Returns NULL otherwise. +*/ +char* get_root_certificate(); + +/** +* \fn char* get_host_certificate() +* \return HostCertificate if exists. Returns NULL otherwise. +*/ +char* get_host_certificate(); + +/** +* \fn int init_config_file(char* host_id, char* root_private_key, char* host_private_key, char* root_cert, char* host_cert) +* setup a brand new config file. +* \return 1 if everything went well. Returns 0 otherwise. +*/ +int init_config_file(char* host_id, char* root_private_key, char* host_private_key, char* root_cert, char* host_cert); #endif + |