diff --git a/includes/functions.php b/includes/functions.php index c31d16fd..f4e26eca 100755 --- a/includes/functions.php +++ b/includes/functions.php @@ -823,6 +823,23 @@ function loadFooterScripts($extraFooterScripts) } } +/** + * Validate whether the given network interface exists on the system. + * This function retrieves all currently available network interfaces using the `ip link show` command + * and checks if the provided interface name is in the list. + */ +function validateInterface($interface) +{ + // Retrieve all available network interfaces + $valid_interfaces = shell_exec('ip -o link show | awk -F": " \'{print $2}\''); + + // Convert to array (one interface per line) + $valid_interfaces = explode("\n", trim($valid_interfaces)); + + // Check if the provided interface exists in the list + return in_array($interface, $valid_interfaces, true); +} + /** * Returns ISO standard 2-letter country codes * diff --git a/includes/hostapd.php b/includes/hostapd.php index 99b24fe3..93386c5e 100755 --- a/includes/hostapd.php +++ b/includes/hostapd.php @@ -34,7 +34,7 @@ function DisplayHostAPDConfig() $reg_domain = shell_exec("iw reg get | grep -o 'country [A-Z]\{2\}' | awk 'NR==1{print $2}'"); - $cmd = "iw dev ".$_SESSION['ap_interface']." info | awk '$1==\"txpower\" {print $2}'"; + $cmd = "iw dev ".escapeshellarg($_SESSION['ap_interface'])." info | awk '$1==\"txpower\" {print $2}'"; exec($cmd, $txpower); $txpower = intval($txpower[0]); @@ -76,7 +76,7 @@ function DisplayHostAPDConfig() } exec('cat '. RASPI_HOSTAPD_CONFIG, $hostapdconfig); if (isset($_SESSION['wifi_client_interface'])) { - exec('iwgetid '.$_SESSION['wifi_client_interface']. ' -r', $wifiNetworkID); + exec('iwgetid '.escapeshellarg($_SESSION['wifi_client_interface']). ' -r', $wifiNetworkID); if (!empty($wifiNetworkID[0])) { $managedModeEnabled = true; } @@ -249,17 +249,18 @@ function SaveHostAPDConfig($wpa_array, $enc_types, $modes, $interfaces, $reg_dom exec('sudo '.RASPI_CONFIG.'/hostapd/disablelog.sh'); } } + // set AP interface default, override for ap-sta & bridged options - $ap_iface = $_POST['interface']; // the hostap AP interface - $cli_iface = $_POST['interface']; // the wifi client interface - $session_iface = $_POST['interface']; // the interface that the UI needs to monitor for data usage etc. + $iface = validateInterface($_POST['interface']) ? $_POST['interface'] : RASPI_WIFI_AP_INTERFACE; + + $ap_iface = $iface; // the hostap AP interface + $cli_iface = $iface; // the wifi client interface + $session_iface = $iface; // the interface that the UI needs to monitor for data usage etc. if ($wifiAPEnable) { // for AP-STA we monitor the uap0 interface, which is always the ap interface. - $ap_iface = 'uap0'; - $session_iface = 'uap0'; + $ap_iface = $session_iface = 'uap0'; } if ($bridgedEnable) { // for bridged mode we monitor the bridge, but keep the selected interface as AP. - $session_iface = 'br0'; - $cli_iface = 'br0'; + $cli_iface = $session_iface = 'br0'; } // persist user options to /etc/raspap diff --git a/includes/wifi_functions.php b/includes/wifi_functions.php index f55e525a..ad0982a6 100755 --- a/includes/wifi_functions.php +++ b/includes/wifi_functions.php @@ -165,6 +165,10 @@ function getWifiInterface() $iface = $_SESSION['ap_interface'] = $arrHostapdConf['WifiInterface'] ?? RASPI_WIFI_AP_INTERFACE; + if (!validateInterface($iface)) { + $iface = RASPI_WIFI_AP_INTERFACE; + } + // check for 2nd wifi interface -> wifi client on different interface exec("iw dev | awk '$1==\"Interface\" && $2!=\"$iface\" {print $2}'", $iface2); $client_iface = $_SESSION['wifi_client_interface'] = empty($iface2) ? $iface : trim($iface2[0]); diff --git a/includes/wireguard.php b/includes/wireguard.php index f6beb3dd..233dd33b 100755 --- a/includes/wireguard.php +++ b/includes/wireguard.php @@ -11,13 +11,14 @@ function DisplayWireGuardConfig() $parseFlag = true; if (!RASPI_MONITOR_ENABLED) { $optRules = isset($_POST['wgRules']) ? $_POST['wgRules'] : null; + $optInterface = isset($_POST['wgInterface']) ? $_POST['wgInterface'] : null; $optConf = isset($_POST['wgCnfOpt']) ? $_POST['wgCnfOpt'] : null; $optSrvEnable = isset($_POST['wgSrvEnable']) ? $_POST['wgSrvEnable'] : null; $optLogEnable = isset($_POST['wgLogEnable']) ? $_POST['wgLogEnable'] : null; if (isset($_POST['savewgsettings']) && $optConf == 'manual' && $optSrvEnable == 1 ) { SaveWireGuardConfig($status); } elseif (isset($_POST['savewgsettings']) && $optConf == 'upload' && is_uploaded_file($_FILES["wgFile"]["tmp_name"])) { - SaveWireGuardUpload($status, $_FILES['wgFile'], $optRules); + SaveWireGuardUpload($status, $_FILES['wgFile'], $optRules, $optInterface); } elseif (isset($_POST['savewgsettings']) && isset($_POST['wg_penabled']) ) { SaveWireGuardConfig($status); } elseif (isset($_POST['startwg'])) { @@ -77,12 +78,17 @@ function DisplayWireGuardConfig() } $peer_id = $peer_id ?? "1"; + // fetch available interfaces + exec("ip -o link show | awk -F': ' '{print $2}'", $interfaces); + sort($interfaces); + echo renderTemplate( "wireguard", compact( "status", "wg_state", "serviceStatus", "public_ip", + "interfaces", "optRules", "optLogEnable", "peer_id", @@ -110,9 +116,10 @@ function DisplayWireGuardConfig() * @param object $status * @param object $file * @param boolean $optRules + * @param string $optInterface * @return object $status */ -function SaveWireGuardUpload($status, $file, $optRules) +function SaveWireGuardUpload($status, $file, $optRules, $optInterface) { define('KB', 1024); $tmp_destdir = '/tmp/'; @@ -147,7 +154,7 @@ function SaveWireGuardUpload($status, $file, $optRules) $rules[] = 'PostDown = '.getDefaultNetValue('wireguard','server','PostDown'); $rules[] = ''; $rules = join(PHP_EOL, $rules); - $rules = preg_replace('/wlan0/m', $_SESSION['ap_interface'], $rules); + $rules = preg_replace('/wlan0/m', $optInterface, $rules); $tmp_contents = preg_replace('/^\s*$/ms', $rules, $tmp_contents, 1); file_put_contents($tmp_wgconfig, $tmp_contents); } diff --git a/locale/en_US/LC_MESSAGES/messages.mo b/locale/en_US/LC_MESSAGES/messages.mo index 799128f8..222464eb 100644 Binary files a/locale/en_US/LC_MESSAGES/messages.mo and b/locale/en_US/LC_MESSAGES/messages.mo differ diff --git a/locale/en_US/LC_MESSAGES/messages.po b/locale/en_US/LC_MESSAGES/messages.po index da8c34b3..208959ce 100644 --- a/locale/en_US/LC_MESSAGES/messages.po +++ b/locale/en_US/LC_MESSAGES/messages.po @@ -1355,14 +1355,14 @@ msgstr "Upload a WireGuard config" msgid "This option uploads and installs an existing WireGuard .conf file on this device." msgstr "This option uploads and installs an existing WireGuard .conf file on this device." -msgid "Apply iptables rules for AP interface" -msgstr "Apply iptables rules for AP interface" +msgid "Apply iptables rules to the selected interface" +msgstr "Apply iptables rules to the selected interface" -msgid "Recommended if you wish to forward network traffic from the wg0 interface to clients connected on the AP interface." -msgstr "Recommended if you wish to forward network traffic from the wg0 interface to clients connected on the AP interface." +msgid "Recommended if you wish to forward network traffic from the wg0 interface to clients connected on a desired interface. The active AP interface is the default." +msgstr "Recommended if you wish to forward network traffic from the wg0 interface to clients connected on a desired interface. The active AP interface is the default." -msgid "This option adds iptables Postup and PostDown rules for the configured AP interface (%s)." -msgstr "This option adds iptables Postup and PostDown rules for the configured AP interface (%s)." +msgid "This option adds iptables Postup and PostDown rules for the interface selected below." +msgstr "This option adds iptables Postup and PostDown rules for the interface selected below." msgid "Select WireGuard configuration file (.conf)" msgstr "Select WireGuard configuration file (.conf)" diff --git a/templates/wg/general.php b/templates/wg/general.php index bdc4d812..9b8b8246 100644 --- a/templates/wg/general.php +++ b/templates/wg/general.php @@ -35,17 +35,20 @@
/> - - "> + + ">

- iptables Postup and PostDown rules for the configured AP interface (%s)."), $_SESSION['ap_interface']) ?> + iptables Postup and PostDown rules for the interface selected below."); ?> +

+ +

-
+