Add FQDN support in the Connection Editor
Make the Connection Editor accept things that basically look like FQDNs Add quotation around the connection ID for wg-quick up/down Move the is_empty function to shared/master
parent
317e741e86
commit
013c65096c
|
@ -54,24 +54,6 @@ typedef struct {
|
||||||
gboolean new_connection;
|
gboolean new_connection;
|
||||||
} WireguardEditorPrivate;
|
} WireguardEditorPrivate;
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
// check if the given string is NULL or empty
|
|
||||||
static gboolean
|
|
||||||
is_empty(const char *str)
|
|
||||||
{
|
|
||||||
gboolean empty = FALSE;
|
|
||||||
gchar *tmp = g_strdup(str);
|
|
||||||
tmp = g_strstrip(tmp);
|
|
||||||
|
|
||||||
if(!tmp || !tmp[0]){
|
|
||||||
empty = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_free(tmp);
|
|
||||||
return empty;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
// functions for checking the contents of the input fields in the GUI
|
// functions for checking the contents of the input fields in the GUI
|
||||||
|
|
||||||
|
@ -174,7 +156,7 @@ check_peer_allowed_ips(const char *str)
|
||||||
static gboolean
|
static gboolean
|
||||||
check_peer_endpoint(const char *str)
|
check_peer_endpoint(const char *str)
|
||||||
{
|
{
|
||||||
return is_ip4((char *)str) || is_ip6((char *)str);
|
return is_ip4((char *)str) || is_ip6((char *)str) || is_fqdn((char *)str);
|
||||||
}
|
}
|
||||||
|
|
||||||
// used in 'check()', matches the functions above
|
// used in 'check()', matches the functions above
|
||||||
|
|
101
shared/utils.c
101
shared/utils.c
|
@ -249,6 +249,22 @@ out_fail:
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
// check if the given string is NULL or empty
|
||||||
|
gboolean
|
||||||
|
is_empty(const char *str)
|
||||||
|
{
|
||||||
|
gboolean empty = FALSE;
|
||||||
|
gchar *tmp = g_strdup(str);
|
||||||
|
tmp = g_strstrip(tmp);
|
||||||
|
|
||||||
|
if(!tmp || !tmp[0]){
|
||||||
|
empty = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_free(tmp);
|
||||||
|
return empty;
|
||||||
|
}
|
||||||
|
|
||||||
// check if the given string looks like an IPv4 address
|
// check if the given string looks like an IPv4 address
|
||||||
// that is, four segments of numbers (0-255), separated by dots
|
// that is, four segments of numbers (0-255), separated by dots
|
||||||
// additionally, there may be a port suffix (separated from the address by a colon; 0 - 65535)
|
// additionally, there may be a port suffix (separated from the address by a colon; 0 - 65535)
|
||||||
|
@ -444,3 +460,88 @@ ip6end:
|
||||||
g_strfreev(parts);
|
g_strfreev(parts);
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// check if the address looks like a valid FQDN
|
||||||
|
gboolean is_fqdn(char *addr)
|
||||||
|
{
|
||||||
|
int idx = 0;
|
||||||
|
int idx2 = 0;
|
||||||
|
int dots = 0;
|
||||||
|
gchar **parts;
|
||||||
|
gchar **tmp;
|
||||||
|
gchar *lastpart;
|
||||||
|
gboolean success = TRUE;
|
||||||
|
gboolean contains_alpha = FALSE;
|
||||||
|
|
||||||
|
if(!addr){
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
while(addr && addr[idx]){
|
||||||
|
if(addr[idx] == '.'){
|
||||||
|
dots++;
|
||||||
|
}
|
||||||
|
idx++;
|
||||||
|
}
|
||||||
|
|
||||||
|
parts = g_strsplit_set(addr, ".", 0);
|
||||||
|
lastpart = parts[dots];
|
||||||
|
|
||||||
|
// iterate over all parts of the name
|
||||||
|
for(idx = 0; idx <= dots; idx++){
|
||||||
|
contains_alpha = FALSE;
|
||||||
|
|
||||||
|
// if the part is empty
|
||||||
|
if(is_empty(parts[idx])){
|
||||||
|
success = FALSE;
|
||||||
|
goto fqdn_end;
|
||||||
|
}
|
||||||
|
|
||||||
|
idx2 = 0;
|
||||||
|
while(parts[idx] && parts[idx][idx2]){
|
||||||
|
char c = parts[idx][idx2];
|
||||||
|
|
||||||
|
// we have arrived at the last part and found the beginning of the port
|
||||||
|
if((idx == dots) && (c == ':')){
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!g_ascii_isalnum(c) && (c != '-')){
|
||||||
|
// if there's a character other than something alphanumeric or a hyphen,
|
||||||
|
// reject it
|
||||||
|
// TODO: cover more than just ASCII, check length, etc.
|
||||||
|
success = FALSE;
|
||||||
|
goto fqdn_end;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(g_ascii_isalpha(c)){
|
||||||
|
contains_alpha = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
idx2++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// names consisting of only numbers are not legitimate
|
||||||
|
if(!contains_alpha){
|
||||||
|
success = FALSE;
|
||||||
|
goto fqdn_end;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// might have a port suffix after a colon (e.g. tuwien.ac.at:8080)
|
||||||
|
if(g_strrstr(lastpart, ":")){
|
||||||
|
tmp = g_strsplit(lastpart, ":", 2);
|
||||||
|
|
||||||
|
// the last part has been checked in the loop above, so we only need
|
||||||
|
// to check the port
|
||||||
|
if(!g_ascii_string_to_unsigned(tmp[1], 10, 0, 65535, NULL, NULL)){
|
||||||
|
success = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_strfreev(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
fqdn_end:
|
||||||
|
g_strfreev(parts);
|
||||||
|
return success;
|
||||||
|
}
|
|
@ -96,10 +96,14 @@ gboolean is_pkcs12 (const char *filepath);
|
||||||
|
|
||||||
gboolean is_encrypted (const char *filename);
|
gboolean is_encrypted (const char *filename);
|
||||||
|
|
||||||
|
gboolean is_empty(const char *str);
|
||||||
|
|
||||||
gboolean is_ip4 (char *addr);
|
gboolean is_ip4 (char *addr);
|
||||||
|
|
||||||
gboolean is_ip6 (char *addr);
|
gboolean is_ip6 (char *addr);
|
||||||
|
|
||||||
|
gboolean is_fqdn(char *addr);
|
||||||
|
|
||||||
#define NMOVPN_PROTCOL_TYPES \
|
#define NMOVPN_PROTCOL_TYPES \
|
||||||
"udp", \
|
"udp", \
|
||||||
"udp4", \
|
"udp4", \
|
||||||
|
|
|
@ -186,7 +186,7 @@ wg_disconnect(NMVpnServicePlugin *plugin,
|
||||||
g_chmod(filename, 0400);
|
g_chmod(filename, 0400);
|
||||||
|
|
||||||
// join together our command
|
// join together our command
|
||||||
command = g_strdup_printf("%s down %s", wg_quick_path, filename);
|
command = g_strdup_printf("%s down '%s'", wg_quick_path, filename);
|
||||||
|
|
||||||
if(!g_spawn_command_line_sync(command, NULL, NULL, &retcode, error)){
|
if(!g_spawn_command_line_sync(command, NULL, NULL, &retcode, error)){
|
||||||
_LOGW("An error occured while spawning wg-quick! (Error: %s)", (*error)->message);
|
_LOGW("An error occured while spawning wg-quick! (Error: %s)", (*error)->message);
|
||||||
|
@ -474,7 +474,7 @@ connect_common(NMVpnServicePlugin *plugin,
|
||||||
g_chmod(filename, 0400);
|
g_chmod(filename, 0400);
|
||||||
|
|
||||||
// join together our command
|
// join together our command
|
||||||
command = g_strdup_printf("%s up %s", wg_quick_path, filename);
|
command = g_strdup_printf("%s up '%s'", wg_quick_path, filename);
|
||||||
|
|
||||||
if(!g_spawn_command_line_sync(command, NULL, NULL, &retcode, error)){
|
if(!g_spawn_command_line_sync(command, NULL, NULL, &retcode, error)){
|
||||||
_LOGW("An error occured while spawning wg-quick! (Error: %s)", (*error)->message);
|
_LOGW("An error occured while spawning wg-quick! (Error: %s)", (*error)->message);
|
||||||
|
|
Loading…
Reference in New Issue