diff options
| author | 2008-08-03 20:21:23 +0200 | |
|---|---|---|
| committer | 2008-08-05 23:28:10 -0700 | |
| commit | c58482a7dbb3978bacfb5ffd8085d915bcde297d (patch) | |
| tree | c7c42d6359e99f092a6db0066f460dafa367bfcd | |
| parent | b6ed54477c00e2b4572e898fe0a47aa64a028c26 (diff) | |
| download | libplist-c58482a7dbb3978bacfb5ffd8085d915bcde297d.tar.gz libplist-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 + | 
