2016-08-12 19:00:43 +02:00
< ? php
/**
*
*
*/
function DisplayWPAConfig (){
2016-08-12 22:53:44 +02:00
$status = new StatusMessages ();
$scanned_networks = array ();
2016-08-12 19:00:43 +02:00
2016-08-14 18:40:59 +02:00
// Find currently configured networks
2016-08-12 23:22:21 +02:00
exec ( ' sudo cat ' . RASPI_WPA_SUPPLICANT_CONFIG , $known_return );
2016-08-14 18:40:59 +02:00
$network = null ;
$ssid = null ;
2016-08-12 23:22:21 +02:00
foreach ( $known_return as $line ) {
if ( preg_match ( '/network\s*=/' , $line )) {
2016-08-14 19:25:53 +02:00
$network = array ( 'visible' => false , 'configured' => true , 'connected' => false );
2016-08-14 18:40:59 +02:00
} elseif ( $network !== null ) {
2016-08-12 23:22:21 +02:00
if ( preg_match ( '/^\s*}\s*$/' , $line )) {
2016-08-14 18:40:59 +02:00
$networks [ $ssid ] = $network ;
$network = null ;
$ssid = null ;
2016-08-12 23:22:21 +02:00
} elseif ( $lineArr = preg_split ( '/\s*=\s*/' , trim ( $line ))) {
switch ( strtolower ( $lineArr [ 0 ])) {
case 'ssid' :
2016-08-14 18:40:59 +02:00
$ssid = trim ( $lineArr [ 1 ], '"' );
2016-08-12 23:22:21 +02:00
break ;
case 'psk' :
2016-08-14 18:40:59 +02:00
if ( array_key_exists ( 'passphrase' , $network )) {
2016-08-12 23:22:21 +02:00
break ;
}
case '#psk' :
2016-08-14 18:40:59 +02:00
$network [ 'protocol' ] = 'WPA' ;
2016-08-12 23:22:21 +02:00
case 'wep_key0' : // Untested
2016-08-14 18:40:59 +02:00
$network [ 'passphrase' ] = trim ( $lineArr [ 1 ], '"' );
2016-08-12 23:22:21 +02:00
break ;
case 'key_mgmt' :
2016-08-14 18:40:59 +02:00
if ( ! array_key_exists ( 'passphrase' , $network ) && $lineArr [ 1 ] === 'NONE' ) {
$network [ 'protocol' ] = 'Open' ;
2016-08-12 23:22:21 +02:00
}
break ;
2018-02-23 02:07:52 +01:00
case 'priority' :
$network [ 'priority' ] = trim ( $lineArr [ 1 ], '"' );
break ;
2016-08-12 23:22:21 +02:00
}
}
}
}
2016-08-14 18:40:59 +02:00
if ( isset ( $_POST [ 'client_settings' ]) && CSRFValidate () ) {
$tmp_networks = $networks ;
if ( $wpa_file = fopen ( '/tmp/wifidata' , 'w' )) {
fwrite ( $wpa_file , 'ctrl_interface=DIR=' . RASPI_WPA_CTRL_INTERFACE . ' GROUP=netdev' . PHP_EOL );
fwrite ( $wpa_file , 'update_config=1' . PHP_EOL );
foreach ( array_keys ( $_POST ) as $post ) {
if ( preg_match ( '/delete(\d+)/' , $post , $post_match )) {
unset ( $tmp_networks [ $_POST [ 'ssid' . $post_match [ 1 ]]]);
} elseif ( preg_match ( '/update(\d+)/' , $post , $post_match )) {
// NB, at the moment, the value of protocol from the form may
// contain HTML line breaks
$tmp_networks [ $_POST [ 'ssid' . $post_match [ 1 ]]] = array (
'protocol' => ( $_POST [ 'protocol' . $post_match [ 1 ]] === 'Open' ? 'Open' : 'WPA' ),
'passphrase' => $_POST [ 'passphrase' . $post_match [ 1 ]],
'configured' => true
);
2018-02-23 02:07:52 +01:00
if ( array_key_exists ( 'priority' . $post_match [ 1 ], $_POST )) {
$tmp_networks [ $_POST [ 'ssid' . $post_match [ 1 ]]][ 'priority' ] = $_POST [ 'priority' . $post_match [ 1 ]];
}
2016-08-14 18:40:59 +02:00
}
}
$ok = true ;
foreach ( $tmp_networks as $ssid => $network ) {
if ( $network [ 'protocol' ] === 'Open' ) {
fwrite ( $wpa_file , " network= { " . PHP_EOL );
fwrite ( $wpa_file , " \t ssid= \" " . $ssid . " \" " . PHP_EOL );
fwrite ( $wpa_file , " \t key_mgmt=NONE " . PHP_EOL );
2018-02-23 02:07:52 +01:00
if ( array_key_exists ( 'priority' , $network )) {
fwrite ( $wpa_file , " \t priority= " . $network [ 'priority' ] . PHP_EOL );
}
2016-08-14 18:40:59 +02:00
fwrite ( $wpa_file , " } " . PHP_EOL );
} else {
if ( strlen ( $network [ 'passphrase' ]) >= 8 && strlen ( $network [ 'passphrase' ]) <= 63 ) {
2018-02-23 02:07:52 +01:00
unset ( $wpa_passphrase );
2017-06-03 16:25:11 +02:00
unset ( $line );
2018-02-23 02:07:52 +01:00
exec ( 'wpa_passphrase ' . escapeshellarg ( $ssid ) . ' ' . escapeshellarg ( $network [ 'passphrase' ]), $wpa_passphrase );
2016-08-14 18:40:59 +02:00
foreach ( $wpa_passphrase as $line ) {
2018-02-23 02:07:52 +01:00
if ( preg_match ( '/^\s*}\s*$/' , $line )) {
if ( array_key_exists ( 'priority' , $network )) {
fwrite ( $wpa_file , " \t priority= " . $network [ 'priority' ] . PHP_EOL );
}
fwrite ( $wpa_file , $line . PHP_EOL );
} else {
fwrite ( $wpa_file , $line . PHP_EOL );
}
2016-08-14 18:40:59 +02:00
}
} else {
$status -> addMessage ( 'WPA passphrase must be between 8 and 63 characters' , 'danger' );
$ok = false ;
}
}
}
if ( $ok ) {
system ( 'sudo cp /tmp/wifidata ' . RASPI_WPA_SUPPLICANT_CONFIG , $returnval );
if ( $returnval == 0 ) {
exec ( 'sudo wpa_cli reconfigure' , $reconfigure_out , $reconfigure_return );
if ( $reconfigure_return == 0 ) {
$status -> addMessage ( 'Wifi settings updated successfully' , 'success' );
$networks = $tmp_networks ;
} else {
2017-10-29 23:59:14 +01:00
$status -> addMessage ( 'Wifi settings updated but cannot restart (cannot execute "wpa_cli reconfigure")' , 'danger' );
2016-08-14 18:40:59 +02:00
}
} else {
$status -> addMessage ( 'Wifi settings failed to be updated' , 'danger' );
}
}
} else {
2017-10-24 12:26:00 +02:00
$status -> addMessage ( 'Failed to update wifi settings' , 'danger' );
2016-08-14 18:40:59 +02:00
}
}
2018-03-28 12:09:58 +02:00
exec ( 'sudo wpa_cli -i ' . RASPI_WIFI_CLIENT_INTERFACE . ' scan' );
2016-08-14 18:40:59 +02:00
sleep ( 3 );
2018-03-28 12:09:58 +02:00
exec ( 'sudo wpa_cli -i ' . RASPI_WIFI_CLIENT_INTERFACE . ' scan_results' , $scan_return );
2018-06-12 19:08:27 +02:00
for ( $shift = 0 ; $shift < 1 ; $shift ++ ) {
2016-08-14 18:40:59 +02:00
array_shift ( $scan_return );
}
// display output
foreach ( $scan_return as $network ) {
$arrNetwork = preg_split ( " /[ \t ]+/ " , $network );
2018-02-23 02:07:52 +01:00
if ( array_key_exists ( 4 , $arrNetwork ) && array_key_exists ( $arrNetwork [ 4 ], $networks )) {
2016-08-14 18:40:59 +02:00
$networks [ $arrNetwork [ 4 ]][ 'visible' ] = true ;
$networks [ $arrNetwork [ 4 ]][ 'channel' ] = ConvertToChannel ( $arrNetwork [ 1 ]);
// TODO What if the security has changed?
} else {
$networks [ $arrNetwork [ 4 ]] = array (
'configured' => false ,
'protocol' => ConvertToSecurity ( $arrNetwork [ 3 ]),
'channel' => ConvertToChannel ( $arrNetwork [ 1 ]),
'passphrase' => '' ,
2016-08-14 19:25:53 +02:00
'visible' => true ,
'connected' => false
2016-08-14 18:40:59 +02:00
);
}
}
2016-08-14 19:25:53 +02:00
2017-12-07 20:00:48 +01:00
exec ( 'iwconfig ' . RASPI_WIFI_CLIENT_INTERFACE , $iwconfig_return );
2016-08-14 19:25:53 +02:00
foreach ( $iwconfig_return as $line ) {
2017-05-19 15:25:47 +02:00
if ( preg_match ( '/ESSID:\"([^"]+)\"/i' , $line , $iwconfig_ssid )) {
2016-08-14 19:25:53 +02:00
$networks [ $iwconfig_ssid [ 1 ]][ 'connected' ] = true ;
}
}
2016-08-12 23:22:21 +02:00
?>
2016-08-12 19:00:43 +02:00
2016-08-12 22:53:44 +02:00
< div class = " row " >
< div class = " col-lg-12 " >
2018-08-04 01:58:34 +02:00
< div class = " panel panel-primary " >
2017-10-23 21:51:34 +02:00
< div class = " panel-heading " >< i class = " fa fa-signal fa-fw " ></ i > < ? php echo _ ( " Configure client " ); ?> </div>
2016-08-12 22:53:44 +02:00
<!-- /. panel - heading -->
< div class = " panel-body " >
< p >< ? php $status -> showMessages (); ?> </p>
2017-10-24 15:50:17 +02:00
< h4 >< ? php echo _ ( " Client settings " ); ?> </h4>
2018-05-27 10:42:54 +02:00
< div class = " btn-group btn-block " >
2018-08-04 01:58:34 +02:00
< a href = " .?<?php echo htmlspecialchars( $_SERVER['QUERY_STRING'] , ENT_QUOTES); ?> " style = " padding:10px;float: right;display: block;position: relative;margin-top: -55px; " class = " col-md-2 btn btn-info " id = " update " >< ? php echo _ ( " Rescan " ); ?> </a>
2018-05-27 10:42:54 +02:00
</ div >
2016-08-14 18:40:59 +02:00
< form method = " POST " action = " ?page=wpa_conf " name = " wpa_conf_form " >
< ? php CSRFToken () ?>
< input type = " hidden " name = " client_settings " ?>
< table class = " table table-responsive table-striped " >
< tr >
< th ></ th >
2017-10-23 21:51:34 +02:00
< th >< ? php echo _ ( " SSID " ); ?> </th>
< th >< ? php echo _ ( " Channel " ); ?> </th>
< th >< ? php echo _ ( " Security " ); ?> </th>
< th >< ? php echo _ ( " Passphrase " ); ?> </th>
2016-08-14 18:40:59 +02:00
< th ></ th >
</ tr >
< ? php $index = 0 ; ?>
< ? php foreach ( $networks as $ssid => $network ) { ?>
< tr >
2016-08-14 19:25:53 +02:00
< td >
< ? php if ( $network [ 'configured' ]) { ?>
< i class = " fa fa-check-circle fa-fw " ></ i >
< ? php } ?>
2018-02-23 02:07:52 +01:00
< ? php if ( array_key_exists ( 'connected' , $network ) && $network [ 'connected' ]) { ?>
2016-08-14 19:25:53 +02:00
< i class = " fa fa-exchange fa-fw " ></ i >
< ? php } ?>
</ td >
2016-08-14 18:40:59 +02:00
< td >
2018-08-04 01:58:34 +02:00
< input type = " hidden " name = " ssid<?php echo $index ?> " value = " <?php echo htmlentities( $ssid , ENT_QUOTES) ?> " />
< ? php echo htmlspecialchars ( $ssid , ENT_QUOTES ); ?>
2016-08-14 18:40:59 +02:00
</ td >
2018-02-23 02:07:52 +01:00
< ? php if ( array_key_exists ( 'visible' , $network ) && $network [ 'visible' ]) { ?>
2018-08-04 01:58:34 +02:00
< td >< ? php echo htmlspecialchars ( $network [ 'channel' ], ENT_QUOTES ); ?> </td>
2016-08-14 18:40:59 +02:00
< ? php } else { ?>
< td >< span class = " label label-warning " > X </ span ></ td >
< ? php } ?>
2018-02-23 02:07:52 +01:00
< td >
< ? php if ( array_key_exists ( 'priority' , $network )) { ?>
2018-08-04 01:58:34 +02:00
< input type = " hidden " name = " priority<?php echo $index ?> " value = " <?php echo htmlspecialchars( $network['priority'] , ENT_QUOTES); ?> " />
2018-02-23 02:07:52 +01:00
< ? php } ?>
2018-08-04 01:58:34 +02:00
< input type = " hidden " name = " protocol<?php echo $index ?> " value = " <?php echo htmlspecialchars( $network['protocol'] , ENT_QUOTES); ?> " />< ? php echo htmlspecialchars ( $network [ 'protocol' ], ENT_QUOTES ); ?>
2018-02-23 02:07:52 +01:00
</ td >
2016-08-14 18:40:59 +02:00
< ? php if ( $network [ 'protocol' ] === 'Open' ) { ?>
< td >< input type = " hidden " name = " passphrase<?php echo $index ?> " value = " " />---</ td >
< ? php } else { ?>
2016-08-14 18:56:13 +02:00
< td >< input type = " text " class = " form-control " name = " passphrase<?php echo $index ?> " value = " <?php echo $network['passphrase'] ?> " onKeyUp = " CheckPSK(this, 'update<?php echo $index ?>') " />
2016-08-14 18:40:59 +02:00
< ? php } ?>
< td >
< div class = " btn-group btn-block " >
< ? php if ( $network [ 'configured' ]) { ?>
2017-10-24 15:50:17 +02:00
< input type = " submit " class = " col-md-6 btn btn-warning " value = " <?php echo _( " Update " ); ?> " id = " update<?php echo $index ?> " name = " update<?php echo $index ?> " < ? php echo ( $network [ 'protocol' ] === 'Open' ? ' disabled' : '' ) ?> />
2016-08-14 18:40:59 +02:00
< ? php } else { ?>
2017-10-24 15:50:17 +02:00
< input type = " submit " class = " col-md-6 btn btn-info " value = " <?php echo _( " Add " ); ?> " id = " update<?php echo $index ?> " name = " update<?php echo $index ?> " < ? php echo ( $network [ 'protocol' ] === 'Open' ? '' : ' disabled' ) ?> />
2016-08-14 18:40:59 +02:00
< ? php } ?>
2017-10-24 15:50:17 +02:00
< input type = " submit " class = " col-md-6 btn btn-danger " value = " <?php echo _( " Delete " ); ?> " name = " delete<?php echo $index ?> " < ? php echo ( $network [ 'configured' ] ? '' : ' disabled' ) ?> />
2016-08-12 22:53:44 +02:00
</ div >
2016-08-14 18:40:59 +02:00
</ td >
</ tr >
< ? php $index += 1 ; ?>
< ? php } ?>
</ table >
</ form >
2016-08-12 19:29:56 +02:00
</ div ><!-- ./ Panel body -->
2017-10-23 21:51:34 +02:00
< div class = " panel-footer " >< ? php echo _ ( " <strong>Note:</strong> WEP access points appear as 'Open'. RaspAP does not currently support connecting to WEP " ); ?> </div>
2016-08-12 22:53:44 +02:00
</ div ><!-- /. panel - primary -->
2016-08-12 19:29:56 +02:00
</ div ><!-- /. col - lg - 12 -->
</ div ><!-- /. row -->
2016-08-12 19:00:43 +02:00
< ? php
}