mirror of
				https://github.com/max-moser/network-manager-wireguard.git
				synced 2025-11-04 09:03:49 +03:00 
			
		
		
		
	Start implementation of import
This commit is contained in:
		
							parent
							
								
									3bb3c292bb
								
							
						
					
					
						commit
						41d3c7d065
					
				@ -777,6 +777,216 @@ inline_blob_write_out (const InlineBlobData *data, GError **error)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/*****************************************************************************/
 | 
					/*****************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static gboolean
 | 
				
			||||||
 | 
					_parse_common (const char **line, int *idx, char **out_error)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int len = 0;
 | 
				
			||||||
 | 
						while(line && line[len]){
 | 
				
			||||||
 | 
							len++;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// TODO what happens when we have KEY=VALUE?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(!line[0]){
 | 
				
			||||||
 | 
							*out_error = g_strdup_printf("Nothing found in the line");
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else if(!line[1]){
 | 
				
			||||||
 | 
							*out_error = g_strdup_printf("No value found for setting '%s'", line[0]);
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else if(!g_strcmp0("=", line[1])){
 | 
				
			||||||
 | 
							// we have an equals sign included
 | 
				
			||||||
 | 
							// KEY = VALUE
 | 
				
			||||||
 | 
							if(!line[2]){
 | 
				
			||||||
 | 
								*out_error = g_strdup_printf("Expected line to be of form KEY = VALUE");
 | 
				
			||||||
 | 
								return FALSE;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							*idx = 2;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else{
 | 
				
			||||||
 | 
							// we don't have an equals sign included
 | 
				
			||||||
 | 
							// KEY VALUE
 | 
				
			||||||
 | 
							*idx = 1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static gboolean
 | 
				
			||||||
 | 
					parse_endpoint(const char **line, char **endpoint, char **out_error)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int idx = 0;
 | 
				
			||||||
 | 
						if(!_parse_common(line, &idx, out_error)){
 | 
				
			||||||
 | 
							*endpoint = NULL;
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						*endpoint = g_strdup(line[idx]);
 | 
				
			||||||
 | 
						return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static gboolean
 | 
				
			||||||
 | 
					parse_listen_port(const char **line, char **port, char **out_error)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int idx = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(!_parse_common(line, &idx, out_error)){
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						*port = g_strdup(line[idx]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(!g_ascii_string_to_unsigned(*port, 10, 0, 65535, NULL, NULL)){
 | 
				
			||||||
 | 
							*out_error = g_strdup_printf("'%s' is not a valid port assignment!", *port);
 | 
				
			||||||
 | 
							g_free(*port);
 | 
				
			||||||
 | 
							*port = NULL;
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static gboolean
 | 
				
			||||||
 | 
					parse_private_key(const char **line, char **key, char **out_error)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int idx = 0;
 | 
				
			||||||
 | 
						if(!_parse_common(line, &idx, out_error)){
 | 
				
			||||||
 | 
							*key = NULL;
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						*key = g_strdup(line[idx]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// TODO check if base64?
 | 
				
			||||||
 | 
						// TOOD check length?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define parse_public_key(line, key, out_error) parse_private_key(line, key, out_error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static gboolean
 | 
				
			||||||
 | 
					parse_preshared_key(const char **line, char **key, char **out_error)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int idx = 0;
 | 
				
			||||||
 | 
						if(!_parse_common(line, &idx, out_error)){
 | 
				
			||||||
 | 
							*key = NULL;
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						*key = g_strdup(line[idx]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// TODO any checks?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static gboolean
 | 
				
			||||||
 | 
					_is_ip4(char *addr)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int idx = 0;
 | 
				
			||||||
 | 
						int dots = 0;
 | 
				
			||||||
 | 
						while(addr && addr[idx]){
 | 
				
			||||||
 | 
							if(addr[idx] == '.'){
 | 
				
			||||||
 | 
								dots++;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							idx++;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(dots != 3){
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// might have a subnet suffix after a slash (e.g. 192.168.1.254/24)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// might have a port suffix after a colon (e.g. 192.168.1.254:8080)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static gboolean
 | 
				
			||||||
 | 
					_is_ip6(char *addr)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static char *
 | 
				
			||||||
 | 
					_parse_ip4_address(char *address)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						char *ip4 = g_strdup(address);
 | 
				
			||||||
 | 
						size_t len = strlen(ip4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// if there is a trailing comma, remove it
 | 
				
			||||||
 | 
						// -- might be, because the config can have an IP4 and IP6
 | 
				
			||||||
 | 
						if(ip4[len - 1] == ','){
 | 
				
			||||||
 | 
							ip4[len - 1] = '\0';
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(!_is_ip4(ip4)){
 | 
				
			||||||
 | 
							g_free(ip4);
 | 
				
			||||||
 | 
							ip4 = NULL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return ip4;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static char *
 | 
				
			||||||
 | 
					_parse_ip6_address(char *address)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						char *ip6 = g_strdup(address);
 | 
				
			||||||
 | 
						size_t len = strlen(ip6);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// same as for IP4
 | 
				
			||||||
 | 
						if(ip6[len - 1] == ','){
 | 
				
			||||||
 | 
							ip6[len - 1] = '\0';
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(!_is_ip6(ip6)){
 | 
				
			||||||
 | 
							g_free(ip6);
 | 
				
			||||||
 | 
							ip6 = NULL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return ip6;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static gboolean
 | 
				
			||||||
 | 
					parse_address(const char **line, char **ip4_address, char **ip6_address, char **out_error)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int idx = 0;
 | 
				
			||||||
 | 
						char *ip4 = NULL;
 | 
				
			||||||
 | 
						char *ip6 = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(!_parse_common(line, &idx, out_error)){
 | 
				
			||||||
 | 
							*ip4_address = NULL;
 | 
				
			||||||
 | 
							*ip6_address = NULL;
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while(line && line[idx]){
 | 
				
			||||||
 | 
							ip4 = _parse_ip4_address(line[idx]);
 | 
				
			||||||
 | 
							if(ip4){
 | 
				
			||||||
 | 
								printf("Found IP4: %s\n", ip4);
 | 
				
			||||||
 | 
								*ip4_address = ip4;
 | 
				
			||||||
 | 
								idx++;
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ip6 = _parse_ip6_address(line[idx]);
 | 
				
			||||||
 | 
							if(ip6){
 | 
				
			||||||
 | 
								printf("Found IP6: %s\n", ip6);
 | 
				
			||||||
 | 
								*ip6_address = ip6;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							idx++;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
NMConnection *
 | 
					NMConnection *
 | 
				
			||||||
do_import (const char *path, const char *contents, gsize contents_len, GError **error)
 | 
					do_import (const char *path, const char *contents, gsize contents_len, GError **error)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -858,6 +1068,121 @@ do_import (const char *path, const char *contents, gsize contents_len, GError **
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		g_assert (params[0]);
 | 
							g_assert (params[0]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// interface section
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (NM_IN_STRSET (params[0], NMV_WG_TAG_INTERFACE)){
 | 
				
			||||||
 | 
								printf("contgrats! you found the %s section!\n", params[0]);
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (NM_IN_STRSET (params[0], NMV_WG_TAG_LISTEN_PORT)){
 | 
				
			||||||
 | 
								char *port = NULL;
 | 
				
			||||||
 | 
								if(!parse_listen_port(params, &port, &line_error)){
 | 
				
			||||||
 | 
									goto handle_line_error;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// TODO
 | 
				
			||||||
 | 
								printf("Port: %s\n", port);
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (NM_IN_STRSET (params[0], NMV_WG_TAG_ADDRESS)){
 | 
				
			||||||
 | 
								char *addr4 = NULL;
 | 
				
			||||||
 | 
								char *addr6 = NULL;
 | 
				
			||||||
 | 
								if(!parse_address(params, &addr4, &addr6, &line_error)){
 | 
				
			||||||
 | 
									goto handle_line_error;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								printf("You have IP4: %s\n", addr4);
 | 
				
			||||||
 | 
								printf("You have IP6: %s\n", addr6);
 | 
				
			||||||
 | 
								// TODO probably needs further processing because format is
 | 
				
			||||||
 | 
								// Address = 0.0.0.1, ::1
 | 
				
			||||||
 | 
								// i.e. there might be a comma after the first address
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (NM_IN_STRSET (params[0], NMV_WG_TAG_PRIVATE_KEY)){
 | 
				
			||||||
 | 
								char *key = NULL;
 | 
				
			||||||
 | 
								if(!parse_private_key(params, &key, &line_error)){
 | 
				
			||||||
 | 
									goto handle_line_error;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								printf("gonna leak your private key now: %s\n", key);
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (NM_IN_STRSET (params[0], NMV_WG_TAG_PRESHARED_KEY)){
 | 
				
			||||||
 | 
								char *psk = NULL;
 | 
				
			||||||
 | 
								if(!parse_preshared_key(params, &psk, &line_error)){
 | 
				
			||||||
 | 
									goto handle_line_error;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								printf("*gasp* your secret really is: %s?\n", psk);
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (NM_IN_STRSET (params[0], NMV_WG_TAG_POST_UP)){
 | 
				
			||||||
 | 
								char *script = NULL;
 | 
				
			||||||
 | 
								// TODO
 | 
				
			||||||
 | 
								printf("PostUp: %s\n", params[2]);
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (NM_IN_STRSET (params[0], NMV_WG_TAG_POST_DOWN)){
 | 
				
			||||||
 | 
								// TODO
 | 
				
			||||||
 | 
								printf("PostDown: %s\n", params[2]);
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// peer section
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (NM_IN_STRSET (params[0], NMV_WG_TAG_PEER)){
 | 
				
			||||||
 | 
								printf("congrats! you found the %s section!\n", params[0]);
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if(NM_IN_STRSET (params[0], NMV_WG_TAG_ALLOWED_IPS)){
 | 
				
			||||||
 | 
								printf("Allowed IPs: %s\n", params[2]);
 | 
				
			||||||
 | 
								// TODO
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if(NM_IN_STRSET (params[0], NMV_WG_TAG_PUBLIC_KEY)){
 | 
				
			||||||
 | 
								char *key = NULL;
 | 
				
			||||||
 | 
								if(!parse_public_key(params, &key, &line_error)){
 | 
				
			||||||
 | 
									goto handle_line_error;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								printf("Public Key of the peer: %s\n", key);
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (NM_IN_STRSET (params[0], NMV_WG_TAG_ENDPOINT)){
 | 
				
			||||||
 | 
								char *endpoint;
 | 
				
			||||||
 | 
								if(!parse_endpoint(params, &endpoint, &line_error)){
 | 
				
			||||||
 | 
									goto handle_line_error;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								/*
 | 
				
			||||||
 | 
								if (params[1] && !g_strcmp0("=", params[1])){
 | 
				
			||||||
 | 
									if(!params[2]){
 | 
				
			||||||
 | 
										line_error = g_strdup_printf("Endpoint expects at least one IP address");
 | 
				
			||||||
 | 
										goto handle_line_error;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									printf("There was no equals sign.\n");
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								printf("Have you heard the one about Wireguard and Endpoints already?\n");
 | 
				
			||||||
 | 
								printf("%s...\n", params[1]);
 | 
				
			||||||
 | 
								if(params[1] && params[2]){
 | 
				
			||||||
 | 
									printf("> %s...\n", params[2]);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								*/
 | 
				
			||||||
 | 
								printf("Endpoint: %s\n", endpoint);
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/*************************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* allow for a leading double-dash and skip over it (bypass_doubledash). */
 | 
							/* allow for a leading double-dash and skip over it (bypass_doubledash). */
 | 
				
			||||||
		if (g_str_has_prefix (params[0], "--"))
 | 
							if (g_str_has_prefix (params[0], "--"))
 | 
				
			||||||
			params[0] = ¶ms[0][2];
 | 
								params[0] = ¶ms[0][2];
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user