2016-07-27 22:43:40 +02:00
< ? php
2016-08-05 16:50:05 +02:00
2020-02-15 18:57:46 +01:00
require_once 'includes/status_messages.php' ;
require_once 'app/lib/system.php' ;
2020-02-14 03:38:46 +01:00
require_once 'config.php' ;
2016-08-05 16:50:05 +02:00
2016-07-27 22:43:40 +02:00
/**
2020-02-15 18:57:46 +01:00
*
*
*/
2018-10-03 14:40:55 +02:00
function DisplayHostAPDConfig ()
{
2019-04-10 10:37:35 +02:00
$status = new StatusMessages ();
2020-02-15 18:57:46 +01:00
$system = new System ();
2019-04-10 10:37:35 +02:00
$arrHostapdConf = parse_ini_file ( '/etc/raspap/hostapd.ini' );
$arrConfig = array ();
2019-08-01 23:01:31 +02:00
$arr80211Standard = [
'a' => '802.11a - 5 GHz' ,
'b' => '802.11b - 2.4 GHz' ,
'g' => '802.11g - 2.4 GHz' ,
2019-12-26 07:17:27 +01:00
'n' => '802.11n - 2.4 GHz' ,
'ac' => '802.11.ac - 5 GHz'
2020-02-15 18:57:46 +01:00
];
2019-04-10 10:37:35 +02:00
$arrSecurity = array ( 1 => 'WPA' , 2 => 'WPA2' , 3 => 'WPA+WPA2' , 'none' => _ ( " None " ));
$arrEncType = array ( 'TKIP' => 'TKIP' , 'CCMP' => 'CCMP' , 'TKIP CCMP' => 'TKIP+CCMP' );
2019-12-13 15:05:41 +01:00
$managedModeEnabled = false ;
2019-04-10 10:37:35 +02:00
exec ( " ip -o link show | awk -F': ' ' { print $ 2}' " , $interfaces );
2020-02-14 03:38:46 +01:00
if ( ! RASPI_MONITOR_ENABLED ) {
if ( isset ( $_POST [ 'SaveHostAPDSettings' ])) {
SaveHostAPDConfig ( $arrSecurity , $arrEncType , $arr80211Standard , $interfaces , $status );
2020-02-18 22:01:38 +01:00
} elseif ( isset ( $_POST [ 'StartHotspot' ]) || isset ( $_POST [ 'RestartHotspot' ])) {
2020-02-14 03:38:46 +01:00
$status -> addMessage ( 'Attempting to start hotspot' , 'info' );
2020-03-12 22:02:26 +01:00
if ( $arrHostapdConf [ 'BridgedEnable' ] == 1 ) {
2020-03-10 09:42:08 +01:00
exec ( 'sudo /etc/raspap/hostapd/servicestart.sh --interface br0 --seconds 3' , $return );
2020-03-12 22:02:26 +01:00
} elseif ( $arrHostapdConf [ 'WifiAPEnable' ] == 1 ) {
exec ( 'sudo /etc/raspap/hostapd/servicestart.sh --interface uap0 --seconds 3' , $return );
2020-02-14 03:38:46 +01:00
} else {
2020-02-18 22:01:38 +01:00
exec ( 'sudo /etc/raspap/hostapd/servicestart.sh --seconds 3' , $return );
2020-02-14 03:38:46 +01:00
}
foreach ( $return as $line ) {
$status -> addMessage ( $line , 'info' );
}
} elseif ( isset ( $_POST [ 'StopHotspot' ])) {
$status -> addMessage ( 'Attempting to stop hotspot' , 'info' );
exec ( 'sudo /bin/systemctl stop hostapd.service' , $return );
foreach ( $return as $line ) {
$status -> addMessage ( $line , 'info' );
}
2019-04-10 10:37:35 +02:00
}
}
2017-11-02 15:43:41 +01:00
2019-04-10 10:37:35 +02:00
exec ( 'cat ' . RASPI_HOSTAPD_CONFIG , $hostapdconfig );
2019-12-13 15:05:41 +01:00
exec ( 'iwgetid ' . RASPI_WIFI_CLIENT_INTERFACE . ' -r' , $wifiNetworkID );
2020-02-15 18:57:46 +01:00
if ( ! empty ( $wifiNetworkID [ 0 ])) {
2019-12-13 15:05:41 +01:00
$managedModeEnabled = true ;
}
2020-02-01 12:07:54 +01:00
$hostapdstatus = $system -> hostapdStatus ();
2019-11-01 10:10:24 +01:00
$serviceStatus = $hostapdstatus [ 0 ] == 0 ? " down " : " up " ;
2016-07-27 22:43:40 +02:00
2019-04-10 10:37:35 +02:00
foreach ( $hostapdconfig as $hostapdconfigline ) {
if ( strlen ( $hostapdconfigline ) === 0 ) {
continue ;
}
2016-07-27 22:43:40 +02:00
2019-04-10 10:37:35 +02:00
if ( $hostapdconfigline [ 0 ] != " # " ) {
2020-02-15 18:57:46 +01:00
$arrLine = explode ( " = " , $hostapdconfigline );
2019-04-10 10:37:35 +02:00
$arrConfig [ $arrLine [ 0 ]] = $arrLine [ 1 ];
}
};
2018-08-04 01:58:34 +02:00
2020-02-15 18:57:46 +01:00
echo renderTemplate (
" hostapd " , compact (
" status " ,
" serviceStatus " ,
" hostapdstatus " ,
" managedModeEnabled " ,
" interfaces " ,
" arrConfig " ,
" arr80211Standard " ,
" selectedHwMode " ,
" arrSecurity " ,
" arrEncType " ,
" arrHostapdConf "
)
);
2016-07-27 22:43:40 +02:00
}
2016-07-27 22:48:27 +02:00
2019-04-10 10:37:35 +02:00
function SaveHostAPDConfig ( $wpa_array , $enc_types , $modes , $interfaces , $status )
{
// It should not be possible to send bad data for these fields so clearly
// someone is up to something if they fail. Fail silently.
2020-02-15 18:57:46 +01:00
if ( ! ( array_key_exists ( $_POST [ 'wpa' ], $wpa_array )
&& array_key_exists ( $_POST [ 'wpa_pairwise' ], $enc_types )
&& array_key_exists ( $_POST [ 'hw_mode' ], $modes ))
) {
2019-04-10 10:37:35 +02:00
error_log ( " Attempting to set hostapd config with wpa=' " . $_POST [ 'wpa' ] . " ', wpa_pairwise=' " . $_POST [ 'wpa_pairwise' ] . " ' and hw_mode=' " . $_POST [ 'hw_mode' ] . " ' " ); // FIXME: log injection
return false ;
}
2018-08-04 01:58:34 +02:00
2019-04-10 10:37:35 +02:00
if ( ! filter_var ( $_POST [ 'channel' ], FILTER_VALIDATE_INT )) {
error_log ( " Attempting to set channel to invalid number. " );
return false ;
}
2018-10-03 14:40:55 +02:00
2019-12-30 05:39:37 +01:00
if ( intval ( $_POST [ 'channel' ]) < 1 || intval ( $_POST [ 'channel' ]) > 48 ) {
2019-04-10 10:37:35 +02:00
error_log ( " Attempting to set channel to ' " . $_POST [ 'channel' ] . " ' " );
return false ;
}
2016-08-05 22:38:02 +02:00
2019-04-10 10:37:35 +02:00
$good_input = true ;
2019-03-06 14:24:51 +01:00
2020-03-10 09:42:08 +01:00
// Check for Bridged AP mode checkbox
$bridgedEnable = 0 ;
if ( $arrHostapdConf [ 'BridgedEnable' ] == 0 ) {
if ( isset ( $_POST [ 'bridgedEnable' ])) {
$bridgedEnable = 1 ;
}
} else {
if ( isset ( $_POST [ 'bridgedEnable' ])) {
$bridgedEnable = 1 ;
}
}
2020-03-12 22:02:26 +01:00
// Check for WiFi client AP mode checkbox
$wifiAPEnable = 0 ;
if ( $bridgedEnable == 0 ) { // enable client mode actions when not bridged
if ( $arrHostapdConf [ 'WifiAPEnable' ] == 0 ) {
if ( isset ( $_POST [ 'wifiAPEnable' ])) {
$wifiAPEnable = 1 ;
}
} else {
if ( isset ( $_POST [ 'wifiAPEnable' ])) {
$wifiAPEnable = 1 ;
}
}
}
2019-04-10 10:37:35 +02:00
// Check for Logfile output checkbox
$logEnable = 0 ;
if ( $arrHostapdConf [ 'LogEnable' ] == 0 ) {
if ( isset ( $_POST [ 'logEnable' ])) {
$logEnable = 1 ;
exec ( 'sudo /etc/raspap/hostapd/enablelog.sh' );
} else {
exec ( 'sudo /etc/raspap/hostapd/disablelog.sh' );
}
2019-03-12 00:47:09 +01:00
} else {
2019-04-10 10:37:35 +02:00
if ( isset ( $_POST [ 'logEnable' ])) {
$logEnable = 1 ;
exec ( 'sudo /etc/raspap/hostapd/enablelog.sh' );
} else {
exec ( 'sudo /etc/raspap/hostapd/disablelog.sh' );
}
2019-03-12 00:47:09 +01:00
}
2020-03-12 22:02:26 +01:00
2019-04-10 10:37:35 +02:00
$cfg = [];
$cfg [ 'LogEnable' ] = $logEnable ;
2020-03-12 22:02:26 +01:00
// Save previous Client mode status when Bridged
$cfg [ 'WifiAPEnable' ] = ( $bridgedEnable == 1 ?
$arrHostapdConf [ 'WifiAPEnable' ] : $wifiAPEnable );
2020-03-10 09:42:08 +01:00
$cfg [ 'BridgedEnable' ] = $bridgedEnable ;
2019-04-30 20:29:09 +02:00
$cfg [ 'WifiManaged' ] = RASPI_WIFI_CLIENT_INTERFACE ;
2019-04-10 10:37:35 +02:00
write_php_ini ( $cfg , '/etc/raspap/hostapd.ini' );
// Verify input
if ( empty ( $_POST [ 'ssid' ]) || strlen ( $_POST [ 'ssid' ]) > 32 ) {
// Not sure of all the restrictions of SSID
$status -> addMessage ( 'SSID must be between 1 and 32 characters' , 'danger' );
$good_input = false ;
2019-03-12 00:47:09 +01:00
}
2019-03-06 19:42:13 +01:00
2020-02-15 18:57:46 +01:00
if ( $_POST [ 'wpa' ] !== 'none'
&& ( strlen ( $_POST [ 'wpa_passphrase' ]) < 8 || strlen ( $_POST [ 'wpa_passphrase' ]) > 63 )
) {
2019-04-10 10:37:35 +02:00
$status -> addMessage ( 'WPA passphrase must be between 8 and 63 characters' , 'danger' );
$good_input = false ;
}
2019-03-12 00:47:09 +01:00
2019-04-10 10:37:35 +02:00
if ( isset ( $_POST [ 'hiddenSSID' ])) {
if ( ! is_int (( int ) $_POST [ 'hiddenSSID' ])) {
$status -> addMessage ( 'Parameter hiddenSSID not a number.' , 'danger' );
$good_input = false ;
} elseif (( int ) $_POST [ 'hiddenSSID' ] < 0 || ( int ) $_POST [ 'hiddenSSID' ] >= 3 ) {
$status -> addMessage ( 'Parameter hiddenSSID contains invalid configuratie value.' , 'danger' );
$good_input = false ;
} else {
$ignore_broadcast_ssid = $_POST [ 'hiddenSSID' ];
}
2019-03-12 00:47:09 +01:00
} else {
2019-04-10 10:37:35 +02:00
$ignore_broadcast_ssid = '0' ;
2019-03-12 00:47:09 +01:00
}
2019-04-10 10:37:35 +02:00
if ( ! in_array ( $_POST [ 'interface' ], $interfaces )) {
// The user is probably up to something here but it may also be a
// genuine error.
$status -> addMessage ( 'Unknown interface ' . htmlspecialchars ( $_POST [ 'interface' ], ENT_QUOTES ), 'danger' );
$good_input = false ;
2019-03-12 00:47:09 +01:00
}
2019-04-10 10:37:35 +02:00
if ( strlen ( $_POST [ 'country_code' ]) !== 0 && strlen ( $_POST [ 'country_code' ]) != 2 ) {
$status -> addMessage ( 'Country code must be blank or two characters' , 'danger' );
$good_input = false ;
}
2019-03-12 00:47:09 +01:00
2019-08-01 22:32:44 +02:00
$_POST [ 'max_num_sta' ] = ( int ) $_POST [ 'max_num_sta' ];
$_POST [ 'max_num_sta' ] = $_POST [ 'max_num_sta' ] > 2007 ? 2007 : $_POST [ 'max_num_sta' ];
$_POST [ 'max_num_sta' ] = $_POST [ 'max_num_sta' ] < 1 ? null : $_POST [ 'max_num_sta' ];
2019-04-10 10:37:35 +02:00
if ( $good_input ) {
// Fixed values
2019-12-26 07:17:27 +01:00
$country_code = $_POST [ 'country_code' ];
2019-04-10 10:37:35 +02:00
$config = 'driver=nl80211' . PHP_EOL ;
$config .= 'ctrl_interface=' . RASPI_HOSTAPD_CTRL_INTERFACE . PHP_EOL ;
$config .= 'ctrl_interface_group=0' . PHP_EOL ;
$config .= 'auth_algs=1' . PHP_EOL ;
$config .= 'wpa_key_mgmt=WPA-PSK' . PHP_EOL ;
$config .= 'beacon_int=100' . PHP_EOL ;
$config .= 'ssid=' . $_POST [ 'ssid' ] . PHP_EOL ;
$config .= 'channel=' . $_POST [ 'channel' ] . PHP_EOL ;
if ( $_POST [ 'hw_mode' ] === 'n' ) {
$config .= 'hw_mode=g' . PHP_EOL ;
$config .= 'ieee80211n=1' . PHP_EOL ;
// Enable basic Quality of service
2019-08-01 22:19:46 +02:00
$config .= 'wmm_enabled=1' . PHP_EOL ;
2019-12-26 07:17:27 +01:00
} elseif ( $_POST [ 'hw_mode' ] === 'ac' ) {
$config .= 'hw_mode=a' . PHP_EOL . PHP_EOL ;
$config .= '# N' . PHP_EOL ;
$config .= 'ieee80211n=1' . PHP_EOL ;
$config .= 'require_ht=1' . PHP_EOL ;
$config .= 'ht_capab=[MAX-AMSDU-3839][HT40+][SHORT-GI-20][SHORT-GI-40][DSSS_CCK-40]' . PHP_EOL . PHP_EOL ;
$config .= '# AC' . PHP_EOL ;
$config .= 'ieee80211ac=1' . PHP_EOL ;
$config .= 'require_vht=1' . PHP_EOL ;
$config .= 'ieee80211d=0' . PHP_EOL ;
$config .= 'ieee80211h=0' . PHP_EOL ;
$config .= 'vht_capab=[MAX-AMSDU-3839][SHORT-GI-80]' . PHP_EOL ;
$config .= 'vht_oper_chwidth=1' . PHP_EOL ;
$config .= 'vht_oper_centr_freq_seg0_idx=42' . PHP_EOL . PHP_EOL ;
2019-04-10 10:37:35 +02:00
} else {
$config .= 'hw_mode=' . $_POST [ 'hw_mode' ] . PHP_EOL ;
$config .= 'ieee80211n=0' . PHP_EOL ;
}
2019-11-26 14:14:14 +01:00
if ( $_POST [ 'wpa' ] !== 'none' ) {
$config .= 'wpa_passphrase=' . $_POST [ 'wpa_passphrase' ] . PHP_EOL ;
}
2019-04-10 10:37:35 +02:00
if ( $wifiAPEnable == 1 ) {
$config .= 'interface=uap0' . PHP_EOL ;
2020-03-15 12:02:20 +01:00
} elseif ( $bridgedEnable == 1 ) {
$config .= 'interface=' . RASPI_WIFI_CLIENT_INTERFACE . PHP_EOL ;
$config .= 'bridge=br0' . PHP_EOL ;
2019-04-10 10:37:35 +02:00
} else {
$config .= 'interface=' . $_POST [ 'interface' ] . PHP_EOL ;
}
$config .= 'wpa=' . $_POST [ 'wpa' ] . PHP_EOL ;
$config .= 'wpa_pairwise=' . $_POST [ 'wpa_pairwise' ] . PHP_EOL ;
$config .= 'country_code=' . $_POST [ 'country_code' ] . PHP_EOL ;
$config .= 'ignore_broadcast_ssid=' . $ignore_broadcast_ssid . PHP_EOL ;
2019-08-01 22:32:44 +02:00
if ( isset ( $_POST [ 'max_num_sta' ])) {
$config .= 'max_num_sta=' . $_POST [ 'max_num_sta' ] . PHP_EOL ;
}
2019-04-10 10:37:35 +02:00
2019-07-30 20:51:48 +02:00
file_put_contents ( " /tmp/hostapddata " , $config );
2019-04-10 10:37:35 +02:00
system ( " sudo cp /tmp/hostapddata " . RASPI_HOSTAPD_CONFIG , $return );
2019-11-04 10:40:23 +01:00
// Fetch dhcp-range, lease time from system config
2019-09-08 17:28:01 +02:00
$dhcpConfig = parse_ini_file ( RASPI_DNSMASQ_CONFIG , false , INI_SCANNER_RAW );
2019-04-10 10:37:35 +02:00
if ( $wifiAPEnable == 1 ) {
// Enable uap0 configuration in dnsmasq for Wifi client AP mode
2019-11-04 10:40:23 +01:00
// Set dhcp-range from system config. If undefined, fallback to default
2020-01-06 19:00:07 +01:00
$dhcp_range = ( $dhcpConfig [ 'dhcp-range' ] == '10.3.141.50,10.3.141.255,255.255.255.0,12h' ||
$dhcpConfig [ 'dhcp-range' ] == '' ) ? '192.168.50.50,192.168.50.150,12h' : $dhcpConfig [ 'dhcp-range' ];
2019-04-10 10:37:35 +02:00
$config = 'interface=lo,uap0 # Enable uap0 interface for wireless client AP mode' . PHP_EOL ;
2020-01-13 10:42:05 +01:00
$config .= 'bind-dynamic # Hybrid between --bind-interfaces and default' . PHP_EOL ;
2019-04-10 10:37:35 +02:00
$config .= 'server=8.8.8.8 # Forward DNS requests to Google DNS' . PHP_EOL ;
$config .= 'domain-needed # Don\'t forward short names' . PHP_EOL ;
$config .= 'bogus-priv # Never forward addresses in the non-routed address spaces' . PHP_EOL ;
2019-11-04 10:40:23 +01:00
$config .= 'dhcp-range=' . $dhcp_range . PHP_EOL ;
if ( ! empty ( $dhcpConfig [ 'dhcp-option' ])) {
$config .= 'dhcp-option=' . $dhcpConfig [ 'dhcp-option' ] . PHP_EOL ;
}
2019-04-10 10:37:35 +02:00
} else {
2019-11-04 10:40:23 +01:00
// Set dhcp-range from system config. If undefined, fallback to default
2020-01-06 19:00:07 +01:00
$dhcp_range = ( $dhcpConfig [ 'dhcp-range' ] == '192.168.50.50,192.168.50.150,12h' ||
$dhcpConfig [ 'dhcp-range' ] == '' ) ? '10.3.141.50,10.3.141.255,255.255.255.0,12h' : $dhcpConfig [ 'dhcp-range' ];
2019-04-10 10:37:35 +02:00
$config = 'domain-needed' . PHP_EOL ;
$config .= 'interface=' . $_POST [ 'interface' ] . PHP_EOL ;
2019-09-08 17:28:01 +02:00
$config .= 'dhcp-range=' . $dhcp_range . PHP_EOL ;
2019-11-04 10:40:23 +01:00
if ( ! empty ( $dhcpConfig [ 'dhcp-option' ])) {
$config .= 'dhcp-option=' . $dhcpConfig [ 'dhcp-option' ] . PHP_EOL ;
}
2019-04-10 10:37:35 +02:00
}
2019-07-30 21:16:43 +02:00
file_put_contents ( " /tmp/dnsmasqdata " , $config );
system ( 'sudo cp /tmp/dnsmasqdata ' . RASPI_DNSMASQ_CONFIG , $return );
2019-04-10 10:37:35 +02:00
2019-09-08 17:28:01 +02:00
// Set dnsmasq values from ini, fallback to default if undefined
$intConfig = parse_ini_file ( RASPI_CONFIG_NETWORKING . '/' . RASPI_WIFI_CLIENT_INTERFACE . '.ini' , false , INI_SCANNER_RAW );
$domain_name_server = ( $intConfig [ 'domain_name_server' ] == '' ) ? '1.1.1.1 8.8.8.8' : $intConfig [ 'domain_name_server' ];
$routers = ( $intConfig [ 'routers' ] == '' ) ? '10.3.141.1' : $intConfig [ 'routers' ];
2020-02-28 18:51:33 +01:00
$config = [ '# RaspAP wlan0 configuration' ];
$config [] = 'hostname' ;
$config [] = 'clientid' ;
$config [] = 'persistent' ;
$config [] = 'option rapid_commit' ;
$config [] = 'option domain_name_servers, domain_name, domain_search, host_name' ;
$config [] = 'option classless_static_routes' ;
$config [] = 'option ntp_servers' ;
$config [] = 'require dhcp_server_identifier' ;
$config [] = 'slaac private' ;
$config [] = 'nohook lookup-hostname' ;
2020-03-10 09:42:08 +01:00
if ( $bridgedEnable == 1 ) {
$config [] = 'denyinterfaces eth0 wlan0' ;
$config [] = 'interface br0' ;
} elseif ( $wifiAPEnable == 1 ) {
2019-04-10 10:37:35 +02:00
// Enable uap0 configuration in dhcpcd for Wifi client AP mode
2019-11-04 11:04:11 +01:00
$intConfig = parse_ini_file ( RASPI_CONFIG_NETWORKING . '/uap0.ini' , false , INI_SCANNER_RAW );
$ip_address = ( $intConfig [ 'ip_address' ] == '' ) ? '192.168.50.1/24' : $intConfig [ 'ip_address' ];
2020-02-28 18:51:33 +01:00
$config [] = 'interface uap0' ;
$config [] = 'static ip_address=' . $ip_address ;
$config [] = 'nohook wpa_supplicant' ;
2019-04-10 10:37:35 +02:00
} else {
// Default config
2019-11-04 11:04:11 +01:00
$ip_address = ( $intConfig [ 'ip_address' ] == '' ) ? '10.3.141.1/24' : $intConfig [ 'ip_address' ];
2020-02-28 18:51:33 +01:00
$config [] = 'interface ' . RASPI_WIFI_CLIENT_INTERFACE ;
$config [] = 'static ip_address=' . $ip_address ;
$config [] = 'static routers=' . $routers ;
$config [] = 'static domain_name_server=' . $domain_name_server ;
2019-04-10 10:37:35 +02:00
}
2020-02-28 18:51:33 +01:00
$config = join ( PHP_EOL , $config );
2019-07-30 20:51:48 +02:00
file_put_contents ( " /tmp/dhcpddata " , $config );
2019-04-10 10:37:35 +02:00
system ( 'sudo cp /tmp/dhcpddata ' . RASPI_DHCPCD_CONFIG , $return );
if ( $return == 0 ) {
$status -> addMessage ( 'Wifi Hotspot settings saved' , 'success' );
} else {
$status -> addMessage ( 'Unable to save wifi hotspot settings' , 'danger' );
}
2016-08-05 22:38:02 +02:00
} else {
2019-04-10 10:37:35 +02:00
$status -> addMessage ( 'Unable to save wifi hotspot settings' , 'danger' );
return false ;
2016-07-27 22:48:27 +02:00
}
2018-08-04 01:58:34 +02:00
2019-04-10 10:37:35 +02:00
return true ;
2016-07-27 22:48:27 +02:00
}