wg-installer: check if a key is already inserted
authorNick Hainke <[email protected]>
Tue, 18 Jan 2022 17:31:46 +0000 (18:31 +0100)
committerNick Hainke <[email protected]>
Thu, 20 Jan 2022 08:19:04 +0000 (09:19 +0100)
Check if a peer is already existing with a given public key. Introduce a
response code for signaling why the server rejected the request.

Signed-off-by: Nick Hainke <[email protected]>
net/wg-installer/wg-client/lib/rpcd_ubus.sh
net/wg-installer/wg-server/lib/wg_functions.sh

index 08024d4769181f1b12a6622b6684cbe3a8887821..581e2f1b2abecc07b284c39e75126787ae9267c7 100644 (file)
@@ -95,6 +95,15 @@ wg_rpcd_get_usage () {
        echo "num_interfaces: ${num_interfaces}"
 }
 
+wg_error_handling () {
+       local response_code=$1
+
+       case "$response_code" in
+               1)      logger -t "wginstaller" "Server rejected request since the public key is already used!" ;;
+               *)      logger -t "wginstaller" "Unknown Error Code!";;
+       esac
+}
+
 wg_rpcd_register () {
        local token=$5
        local ip=$6
@@ -123,6 +132,11 @@ wg_rpcd_register () {
        json_get_vars result result
        json_select result
        json_select 2
+       json_get_var response_code response_code
+       if [ "$response_code" -ne 0 ]; then
+               wg_error_handling "$response_code"
+               return 1
+       fi
        json_get_var gw_pubkey gw_pubkey
        json_get_var gw_ipv4 gw_ipv4
        json_get_var gw_ipv6 gw_ipv6
index ab8f40e96f85c6bb30f937c730e74a96a68e8eb4..98f823324e0fde33ca4afd79b1501b6fdcda526b 100644 (file)
@@ -3,6 +3,12 @@
 . /usr/share/libubox/jshn.sh
 . /usr/share/wginstaller/wg.sh
 
+wg_key_exists () {
+       local key=$1
+
+       wg show | grep -q "$key"
+}
+
 wg_timeout () {
        local int=$1
 
@@ -42,6 +48,14 @@ wg_register () {
        local mtu=$2
        local public_key=$3
 
+       if wg_key_exists $public_key; then
+               logger -t "wginstaller" "Rejecting request since the public key is already used!" "$public_key"
+               json_init
+               json_add_int "response_code" 1
+               json_dump
+               return 1
+       fi
+
        base_prefix_ipv6=$(uci get wgserver.@server[0].base_prefix_ipv6)
        port_start=$(uci get wgserver.@server[0].port_start)
        port_end=$(uci get wgserver.@server[0].port_end)
@@ -82,6 +96,7 @@ wg_register () {
 
        # craft return address
        json_init
+       json_add_int "response_code" 0
        json_add_string "gw_pubkey" "$wg_server_pubkey"
        if test -n "${gw_ipv4_assign-}"; then
                json_add_string "gw_ipv4" "$gw_ipv4_assign"