]> git.ipfire.org Git - people/ms/network.git/blobdiff - src/functions/functions.wireless
wireless-ap: Check that secret has the correct length and no invalid characters
[people/ms/network.git] / src / functions / functions.wireless
index 221866ec63342056034a178c1e5df24262baa130..733a35621b3efbcbc0cd19589ebdc35063f11159 100644 (file)
@@ -29,6 +29,17 @@ WIRELESS_DEFAULT_ENCRYPTION_MODE="NONE"
 WIRELESS_VALID_ENCRYPTION_MODES="WPA2-PSK-SHA256 WPA2-PSK \
        WPA-PSK-SHA256 WPA-PSK NONE"
 
+declare -A WIRELESS_CHANNEL_BANDWIDTHS=(
+       ["802.11ac"]="20 40 80 160 80+80"
+       ["802.11a/n"]="20 40"
+       ["802.11a"]="20 40"
+       ["802.11g/n"]="20 40"
+       ["802.11g"]="20 40"
+)
+
+WIRELESS_ENVIRONMENTS=( "indoor+outdoor" "indoor" "outdoor" )
+WIRELESS_DEFAULT_ENVIRONMENT="${WIRELESS_ENVIRONMENTS[0]}"
+
 cli_wireless() {
        local action=${1}
        shift 1
@@ -309,6 +320,18 @@ wireless_channel_is_valid() {
        return ${EXIT_FALSE}
 }
 
+wireless_channel_bandwidth_is_valid() {
+       local mode="${1}"
+       assert isset mode
+
+       local bandwidth="${2}"
+       assert isset bandwidth
+
+       local bandwidths="${WIRELESS_CHANNEL_BANDWIDTHS["${mode}"]}"
+
+       list_match "${bandwidth}" ${bandwidths}
+}
+
 wireless_channel_is_ht40_plus() {
        local channel="${1}"
        assert isinteger channel
@@ -374,24 +397,23 @@ wireless_set_channel() {
 }
 
 wireless_pre_shared_key_is_valid() {
-       local encryption_mode="${1}"
-       local psk="${2}"
+       local psk="${1}"
 
        # Length of the PSK
        local l="${#psk}"
 
-       case "${encryption_mode}" in
-               # For WPA*, the key must be between 8 and 63 chars
-               WPA2-PSK|WPA2-PSK-SHA256|WPA-PSK|WPA-PSK-SHA256)
-                       if [ ${l} -ge 8 ] && [ ${l} -le 63 ]; then
-                               return ${EXIT_TRUE}
-                       fi
+       # For WPA*, the key must be between 8 and 63 chars
+       if [ ${l} -lt 8 ] || [ ${l} -gt 63 ]; then
+               return ${EXIT_FALSE}
+       fi
 
-                       return ${EXIT_FALSE}
-                       ;;
-       esac
+       # Can only contain ASCII chararcters
+       if contains_non_ascii_characters "${psk}"; then
+               return ${EXIT_FALSE}
+       fi
 
-       return ${EXIT_ERROR}
+       # Seems OK
+       return ${EXIT_TRUE}
 }
 
 wireless_client_is_connected() {
@@ -516,6 +538,19 @@ wireless_get_vht_caps() {
        network-phy-list-vht-caps "${phy}"
 }
 
+wireless_supports_acs() {
+       local device="${1}"
+       assert isset device
+
+       local phy="$(device_get_phy "${device}")"
+       if ! isset phy; then
+               log ERROR "Could not determine PHY for ${device}"
+               return ${EXIT_ERROR}
+       fi
+
+       phy_supports_acs "${phy}"
+}
+
 wireless_supports_dfs() {
        local device="${1}"
        assert isset device
@@ -528,3 +563,9 @@ wireless_supports_dfs() {
 
        phy_supports_dfs "${phy}"
 }
+
+wireless_environment_is_valid() {
+       local environment="${1}"
+
+       list_match "${environment}" "${WIRELESS_ENVIRONMENTS[@]}"
+}