mirror of
				https://github.com/billz/raspap-webgui.git
				synced 2025-03-01 10:31:47 +00:00 
			
		
		
		
	Merge pull request #1393 from RaspAP/maint/authenticate
Refactors existing auth mechanism
This commit is contained in:
		
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -4,3 +4,4 @@ yarn-error.log | ||||
| *.swp | ||||
| includes/config.php | ||||
| rootCA.pem | ||||
| vendor | ||||
|   | ||||
| @@ -3,12 +3,6 @@ | ||||
| require '../../includes/csrf.php'; | ||||
|  | ||||
| require_once '../../includes/config.php'; | ||||
| require_once RASPI_CONFIG.'/raspap.php'; | ||||
|  | ||||
| header('X-Frame-Options: DENY'); | ||||
| header("Content-Security-Policy: default-src 'none'; connect-src 'self'"); | ||||
| require_once '../../includes/authenticate.php'; | ||||
|  | ||||
|  | ||||
| $interface = filter_input(INPUT_GET, 'inet', FILTER_SANITIZE_SPECIAL_CHARS); | ||||
| if (empty($interface)) { | ||||
|   | ||||
| @@ -228,3 +228,8 @@ button > i.fas { | ||||
|   pointer-events: none; | ||||
| } | ||||
|  | ||||
| .close { | ||||
|   font-weight: 400; | ||||
|   font-size: 1.3rem; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -18,7 +18,8 @@ function createNetmaskAddr(bitCount) { | ||||
| } | ||||
|  | ||||
| function loadSummary(strInterface) { | ||||
|     $.post('ajax/networking/get_ip_summary.php',{interface:strInterface},function(data){ | ||||
|     var csrfToken = $('meta[name=csrf_token]').attr('content'); | ||||
|     $.post('ajax/networking/get_ip_summary.php',{'interface': strInterface, 'csrf_token': csrfToken},function(data){ | ||||
|         jsonData = JSON.parse(data); | ||||
|         if(jsonData['return'] == 0) { | ||||
|             $('#'+strInterface+'-summary').html(jsonData['output'].join('<br />')); | ||||
| @@ -122,21 +123,24 @@ $(document).on("click", "#gen_wpa_passphrase", function(e) { | ||||
| }); | ||||
|  | ||||
| $(document).on("click", "#js-clearhostapd-log", function(e) { | ||||
|     $.post('ajax/logging/clearlog.php?',{'logfile':'/tmp/hostapd.log'},function(data){ | ||||
|     var csrfToken = $('meta[name=csrf_token]').attr('content'); | ||||
|     $.post('ajax/logging/clearlog.php?',{'logfile':'/tmp/hostapd.log', 'csrf_token': csrfToken},function(data){ | ||||
|         jsonData = JSON.parse(data); | ||||
|         $("#hostapd-log").val(""); | ||||
|     }); | ||||
| }); | ||||
|  | ||||
| $(document).on("click", "#js-cleardnsmasq-log", function(e) { | ||||
|     $.post('ajax/logging/clearlog.php?',{'logfile':'/var/log/dnsmasq.log'},function(data){ | ||||
|     var csrfToken = $('meta[name=csrf_token]').attr('content'); | ||||
|     $.post('ajax/logging/clearlog.php?',{'logfile':'/var/log/dnsmasq.log', 'csrf_token': csrfToken},function(data){ | ||||
|         jsonData = JSON.parse(data); | ||||
|         $("#dnsmasq-log").val(""); | ||||
|     }); | ||||
| }); | ||||
|  | ||||
| $(document).on("click", "#js-clearopenvpn-log", function(e) { | ||||
|     $.post('ajax/logging/clearlog.php?',{'logfile':'/tmp/openvpn.log'},function(data){ | ||||
|     var csrfToken = $('meta[name=csrf_token]').attr('content'); | ||||
|     $.post('ajax/logging/clearlog.php?',{'logfile':'/tmp/openvpn.log', 'csrf_token': csrfToken},function(data){ | ||||
|         jsonData = JSON.parse(data); | ||||
|         $("#openvpn-log").val(""); | ||||
|     }); | ||||
| @@ -286,7 +290,8 @@ $('#configureClientModal').on('shown.bs.modal', function (e) { | ||||
|  | ||||
| $('#ovpn-confirm-delete').on('click', '.btn-delete', function (e) { | ||||
|     var cfg_id = $(this).data('recordId'); | ||||
|     $.post('ajax/openvpn/del_ovpncfg.php',{'cfg_id':cfg_id},function(data){ | ||||
|     var csrfToken = $('meta[name=csrf_token]').attr('content'); | ||||
|     $.post('ajax/openvpn/del_ovpncfg.php',{'cfg_id':cfg_id, 'csrf_token': csrfToken},function(data){ | ||||
|         jsonData = JSON.parse(data); | ||||
|         $("#ovpn-confirm-delete").modal('hide'); | ||||
|         var row = $(document.getElementById("openvpn-client-row-" + cfg_id)); | ||||
| @@ -303,7 +308,8 @@ $('#ovpn-confirm-delete').on('show.bs.modal', function (e) { | ||||
|  | ||||
| $('#ovpn-confirm-activate').on('click', '.btn-activate', function (e) { | ||||
|     var cfg_id = $(this).data('record-id'); | ||||
|     $.post('ajax/openvpn/activate_ovpncfg.php',{'cfg_id':cfg_id},function(data){ | ||||
|     var csrfToken = $('meta[name=csrf_token]').attr('content'); | ||||
|     $.post('ajax/openvpn/activate_ovpncfg.php',{'cfg_id':cfg_id, 'csrf_token': csrfToken},function(data){ | ||||
|         jsonData = JSON.parse(data); | ||||
|         $("#ovpn-confirm-activate").modal('hide'); | ||||
|         setTimeout(function(){ | ||||
| @@ -419,11 +425,12 @@ function loadChannelSelect(selected) { | ||||
| function setHardwareModeTooltip() { | ||||
|     var iface = $('#cbxinterface').val(); | ||||
|     var hwmodeText = ''; | ||||
|     var csrfToken = $('meta[name=csrf_token]').attr('content'); | ||||
|     // Explanatory text if 802.11ac is disabled | ||||
|     if ($('#cbxhwmode').find('option[value="ac"]').prop('disabled') == true ) { | ||||
|         var hwmodeText = $('#hwmode').attr('data-tooltip'); | ||||
|     } | ||||
|     $.post('ajax/networking/get_frequencies.php?',{'interface': iface},function(data){ | ||||
|     $.post('ajax/networking/get_frequencies.php?',{'interface': iface, 'csrf_token': csrfToken},function(data){ | ||||
|         var responseText = JSON.parse(data); | ||||
|         $('#tiphwmode').attr('data-original-title', responseText + '\n' + hwmodeText ); | ||||
|     }); | ||||
| @@ -435,10 +442,11 @@ function setHardwareModeTooltip() { | ||||
|  */ | ||||
| function updateBlocklist() { | ||||
|     var blocklist_id = $('#cbxblocklist').val(); | ||||
|     var csrfToken = $('meta[name=csrf_token]').attr('content'); | ||||
|     if (blocklist_id == '') { return; } | ||||
|     $('#cbxblocklist-status').find('i').removeClass('fas fa-check').addClass('fas fa-cog fa-spin'); | ||||
|     $('#cbxblocklist-status').removeClass('check-hidden').addClass('check-progress'); | ||||
|     $.post('ajax/adblock/update_blocklist.php',{ 'blocklist_id':blocklist_id },function(data){ | ||||
|     $.post('ajax/adblock/update_blocklist.php',{ 'blocklist_id':blocklist_id, 'csrf_token': csrfToken},function(data){ | ||||
|         var jsonData = JSON.parse(data); | ||||
|         if (jsonData['return'] == '0') { | ||||
|             $('#cbxblocklist-status').find('i').removeClass('fas fa-cog fa-spin').addClass('fas fa-check'); | ||||
| @@ -457,7 +465,8 @@ $('.wg-keygen').click(function(){ | ||||
|     var entity_pub = $(this).parent('div').prev('input[type="text"]'); | ||||
|     var entity_priv = $(this).parent('div').next('input[type="hidden"]'); | ||||
|     var updated = entity_pub.attr('name')+"-pubkey-status"; | ||||
|     $.post('ajax/networking/get_wgkey.php',{'entity':entity_pub.attr('name') },function(data){ | ||||
|     var csrfToken = $('meta[name=csrf_token]').attr('content'); | ||||
|     $.post('ajax/networking/get_wgkey.php',{'entity':entity_pub.attr('name'), 'csrf_token': csrfToken},function(data){ | ||||
|         var jsonData = JSON.parse(data); | ||||
|         entity_pub.val(jsonData.pubkey); | ||||
|         $('#' + updated).removeClass('check-hidden').addClass('check-updated').delay(500).animate({ opacity: 1 }, 700); | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| <?php | ||||
|  | ||||
| require_once 'includes/status_messages.php'; | ||||
| require_once 'config.php'; | ||||
|  | ||||
| /** | ||||
| @@ -9,7 +8,7 @@ require_once 'config.php'; | ||||
|  */ | ||||
| function DisplayAdBlockConfig() | ||||
| { | ||||
|     $status = new StatusMessages(); | ||||
|     $status = new \RaspAP\Messages\StatusMessage; | ||||
|     $enabled = false; | ||||
|     $custom_enabled = false; | ||||
|  | ||||
|   | ||||
| @@ -1,10 +1,12 @@ | ||||
| <?php | ||||
|  | ||||
| require_once 'includes/status_messages.php'; | ||||
|  | ||||
| function DisplayAuthConfig($username, $password) | ||||
| function DisplayAuthConfig($username) | ||||
| { | ||||
|     $status = new StatusMessages(); | ||||
|     $status = new \RaspAP\Messages\StatusMessage; | ||||
|     $auth = new \RaspAP\Auth\HTTPAuth; | ||||
|     $config = $auth->getAuthConfig(); | ||||
|     $password = $config['admin_pass']; | ||||
|  | ||||
|     if (isset($_POST['UpdateAdminPassword'])) { | ||||
|         if (password_verify($_POST['oldpass'], $password)) { | ||||
|             $new_username=trim($_POST['username']); | ||||
| @@ -33,5 +35,10 @@ function DisplayAuthConfig($username, $password) | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     echo renderTemplate("admin", compact("status", "username")); | ||||
|     echo renderTemplate( | ||||
|         "admin", compact( | ||||
|             "status", | ||||
|             "username" | ||||
|         ) | ||||
|     ); | ||||
| } | ||||
|   | ||||
| @@ -1,22 +1,16 @@ | ||||
| <?php | ||||
| $user = $_SERVER['PHP_AUTH_USER'] ?? ""; | ||||
| $pass = $_SERVER['PHP_AUTH_PW'] ?? ""; | ||||
|  | ||||
| require_once RASPI_CONFIG.'/raspap.php'; | ||||
| $config = getConfig(); | ||||
|  | ||||
| if (RASPI_AUTH_ENABLED) { | ||||
|     $validated = ($user == $config['admin_user']) && password_verify($pass, $config['admin_pass']); | ||||
|     if (!$validated) { | ||||
|         header('WWW-Authenticate: Basic realm="RaspAP"'); | ||||
|         if (function_exists('http_response_code')) { | ||||
|             // http_response_code will respond with proper HTTP version back. | ||||
|             http_response_code(401); | ||||
|     $user = $_SERVER['PHP_AUTH_USER'] ?? ''; | ||||
|     $pass = $_SERVER['PHP_AUTH_PW'] ?? ''; | ||||
|  | ||||
|     $auth = new \RaspAP\Auth\HTTPAuth; | ||||
|  | ||||
|     if (!$auth->isLogged()) { | ||||
|         if ($auth->login($user, $pass)) { | ||||
|             $config = $auth->getAuthConfig(); | ||||
|         } else { | ||||
|             header('HTTP/1.0 401 Unauthorized'); | ||||
|             $auth->authenticate(); | ||||
|         } | ||||
|         exit('Not authorized'.PHP_EOL); | ||||
|     } | ||||
| } else { | ||||
|     $validated = true; | ||||
| } | ||||
|   | ||||
							
								
								
									
										41
									
								
								includes/autoload.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										41
									
								
								includes/autoload.php
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| <?php | ||||
| /** | ||||
|  * PSR-4 compliant class autoloader | ||||
|  * | ||||
|  * @see https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md | ||||
|  * @link https://www.php.net/manual/en/function.spl-autoload-register.php | ||||
|  * @param string $class fully-qualified class name | ||||
|  * @return void | ||||
|  */ | ||||
| spl_autoload_register(function ($class) { | ||||
|  | ||||
|     // project-specific namespace prefix | ||||
|     $prefix = ''; | ||||
|  | ||||
|     // base directory for the namespace prefix | ||||
|     $base_dir = 'src/'; | ||||
|  | ||||
|     // normalize the base directory with a trailing separator | ||||
|     $base_dir = rtrim($base_dir, DIRECTORY_SEPARATOR) . '/'; | ||||
|  | ||||
|     // does the class use the namespace prefix? | ||||
|     $len = strlen($prefix); | ||||
|     if (strncmp($prefix, $class, $len) !== 0) { | ||||
|         // no, move to the next registered autoloader | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     // get the relative class name | ||||
|     $relative_class = substr($class, $len); | ||||
|  | ||||
|     // replace the namespace prefix with the base directory, replace namespace | ||||
|     // separators with directory separators in the relative class name, append | ||||
|     // with .php | ||||
|     $file = $base_dir . str_replace('\\', '/', $relative_class) . '.php'; | ||||
|  | ||||
|     // if the file exists, require it | ||||
|     if (file_exists($file)) { | ||||
|         require $file; | ||||
|     } | ||||
| }); | ||||
|  | ||||
| @@ -1,6 +1,5 @@ | ||||
| <?php | ||||
|  | ||||
| require_once 'includes/status_messages.php'; | ||||
| require_once 'includes/wifi_functions.php'; | ||||
|  | ||||
| /** | ||||
| @@ -9,7 +8,7 @@ require_once 'includes/wifi_functions.php'; | ||||
|  */ | ||||
| function DisplayWPAConfig() | ||||
| { | ||||
|     $status = new StatusMessages(); | ||||
|     $status = new \RaspAP\Messages\StatusMessage; | ||||
|     $networks = []; | ||||
|  | ||||
|     getWifiInterface(); | ||||
|   | ||||
| @@ -10,7 +10,7 @@ require_once 'includes/functions.php'; | ||||
| function DisplayDashboard(&$extraFooterScripts) | ||||
| { | ||||
|     getWifiInterface(); | ||||
|     $status = new StatusMessages(); | ||||
|     $status = new \RaspAP\Messages\StatusMessage; | ||||
|     // Need this check interface name for proper shell execution. | ||||
|     if (!preg_match('/^([a-zA-Z0-9]+)$/', $_SESSION['wifi_client_interface'])) { | ||||
|         $status->addMessage(_('Interface name invalid.'), 'danger'); | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| <?php | ||||
|  | ||||
| require_once 'includes/status_messages.php'; | ||||
| require_once 'config.php'; | ||||
|  | ||||
| /** | ||||
| @@ -8,7 +7,7 @@ require_once 'config.php'; | ||||
|  */ | ||||
| function DisplayDHCPConfig() | ||||
| { | ||||
|     $status = new StatusMessages(); | ||||
|     $status = new \RaspAP\Messages\StatusMessage; | ||||
|     if (!RASPI_MONITOR_ENABLED) { | ||||
|         if (isset($_POST['savedhcpdsettings'])) { | ||||
|             saveDHCPConfig($status); | ||||
|   | ||||
| @@ -1,368 +0,0 @@ | ||||
| <?php | ||||
|  | ||||
| require_once 'includes/status_messages.php'; | ||||
| require_once 'includes/functions.php'; | ||||
|  | ||||
| define('RASPAP_IPTABLES_SCRIPT', "/tmp/iptables_raspap.sh"); | ||||
| define('RASPAP_IP6TABLES_SCRIPT', "/tmp/ip6tables_raspap.sh"); | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * @param  array $rule | ||||
|  * @param  array $conf | ||||
|  * @return array $don | ||||
|  */ | ||||
| function getDependson(&$rule, &$conf) | ||||
| { | ||||
|     if (isset($rule["dependson"][0]) ) { | ||||
|         $don = &$rule["dependson"]; | ||||
|         if (!empty($don[0]) && isset($conf[$don[0]["var"]]) ) { | ||||
|             if (!isset($don[0]["type"]) ) { $don[0]["type"]="bool"; | ||||
|             } | ||||
|             return $don; | ||||
|         } | ||||
|     } | ||||
|     return false; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * @param  array $sect | ||||
|  * @param  array $conf | ||||
|  * @return boolean $active | ||||
|  */ | ||||
| function isRuleEnabled(&$sect, &$conf) | ||||
| { | ||||
|     $fw_on = isset($conf["firewall-enable"]) && $conf["firewall-enable"]; | ||||
|     $active = isset($sect["fw-state"]) && $sect["fw-state"]==1; | ||||
|     $active = $fw_on ? $active : !$active; | ||||
|     $active = $active || !isset($sect["fw-state"]); | ||||
|     if (($don = getDependson($sect, $conf)) !== false  | ||||
|         && $don[0]["type"] == "bool" && !$conf[$don[0]["var"]]  | ||||
|     ) {  $active = false; | ||||
|     } | ||||
|     return $active; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * @param  array $sect | ||||
|  * @param  array $conf | ||||
|  * @return string $str | ||||
|  */ | ||||
| function createRuleStr(&$sect, &$conf) | ||||
| { | ||||
|     if (!is_array($sect["rules"]) ) { return ""; | ||||
|     } | ||||
|     $rules = $sect["rules"]; | ||||
|     $depon = getDependson($sect, $conf); | ||||
|     $rs = array(); | ||||
|     foreach ( $rules as $rule ) { | ||||
|         if (preg_match('/\$[a-z0-9]*\$/i', $rule) ) { | ||||
|             $r = array($rule); | ||||
|             foreach ( $depon as $dep ) { | ||||
|                 $rr = array(); | ||||
|                 $repl=$val=""; | ||||
|                 switch ( $dep["type"] ) { | ||||
|                 case "list": | ||||
|                     if (isset($dep["var"]) && !empty($conf[$dep["var"]]) ) { $val = explode(' ', $conf[$dep["var"]]); | ||||
|                     } | ||||
|                     if (!empty($val) && isset($dep["replace"]) ) { $repl=$dep["replace"]; | ||||
|                     } | ||||
|                     break; | ||||
|                 case "string": | ||||
|                     if (isset($dep["var"]) ) { $val=$conf[$dep["var"]]; | ||||
|                     } | ||||
|                     if (!empty($val) && isset($dep["replace"]) ) { $repl=$dep["replace"]; | ||||
|                     } | ||||
|                     break; | ||||
|                 default: | ||||
|                     break; | ||||
|                 } | ||||
|                 if (!empty($repl) && !empty($val) ) { | ||||
|                     if (is_array($val) ) { | ||||
|                         foreach ( $val as $v ) { $rr = array_merge($rr, str_replace($repl, $v, $r)); | ||||
|                         } | ||||
|                     } | ||||
|                     else { $rr = array_merge($rr, str_replace($repl, $val, $r)); | ||||
|                     } | ||||
|                 } | ||||
|                 $r = !empty($rr) ? $rr : $r; | ||||
|             } | ||||
|             $rs = array_merge($rs, $rr); | ||||
|         } else { | ||||
|             $rs[] = $rule; | ||||
|         } | ||||
|     } | ||||
|     $str=""; | ||||
|     foreach ( $rs as $r ) { | ||||
|         if (!preg_match('/\$[a-z0-9]*\$/i', $r) ) { $str .= '$IPT '.$r."\n"; | ||||
|         } | ||||
|     } | ||||
|     return $str; | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * @param  array $rule | ||||
|  * @return boolean | ||||
|  */ | ||||
| function isIPv4(&$rule) | ||||
| { | ||||
|     return !isset($rule["ip-version"]) || strstr($rule["ip-version"], "4") !== false;  | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * @param  array $rule | ||||
|  * @return boolean | ||||
|  */ | ||||
| function isIPv6(&$rule) | ||||
| { | ||||
|     return !isset($rule["ip-version"]) || strstr($rule["ip-version"], "6") !== false;  | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * @return boolean  | ||||
|  */ | ||||
| function configureFirewall() | ||||
| { | ||||
|     $json = file_get_contents(RASPI_IPTABLES_CONF); | ||||
|     $ipt  = json_decode($json, true); | ||||
|     $conf = ReadFirewallConf(); | ||||
|     $txt = "#!/bin/bash\n"; | ||||
|     file_put_contents(RASPAP_IPTABLES_SCRIPT, $txt); | ||||
|     file_put_contents(RASPAP_IP6TABLES_SCRIPT, $txt); | ||||
|     file_put_contents(RASPAP_IPTABLES_SCRIPT, 'IPT="iptables"'."\n", FILE_APPEND); | ||||
|     file_put_contents(RASPAP_IP6TABLES_SCRIPT, 'IPT="ip6tables"'."\n", FILE_APPEND); | ||||
|     $txt = "\$IPT -F\n"; | ||||
|     $txt .= "\$IPT -X\n"; | ||||
|     $txt .= "\$IPT -t nat -F\n"; | ||||
|     file_put_contents(RASPAP_IPTABLES_SCRIPT, $txt, FILE_APPEND); | ||||
|     file_put_contents(RASPAP_IP6TABLES_SCRIPT, $txt, FILE_APPEND); | ||||
|     if (empty($conf) || empty($ipt) ) { return false; | ||||
|     } | ||||
|     $count=0; | ||||
|     foreach ( $ipt["order"] as $idx ) { | ||||
|         if (isset($ipt[$idx]) ) { | ||||
|             foreach ( $ipt[$idx] as $i => $sect ) { | ||||
|                 if (isRuleEnabled($sect, $conf) ) { | ||||
|                     $str_rules= createRuleStr($sect, $conf); | ||||
|                     if (!empty($str_rules) ) { | ||||
|                         if (isIPv4($sect) ) { file_put_contents(RASPAP_IPTABLES_SCRIPT, $str_rules, FILE_APPEND); | ||||
|                         } | ||||
|                         if (isIPv6($sect) ) { file_put_contents(RASPAP_IP6TABLES_SCRIPT, $str_rules, FILE_APPEND); | ||||
|                         } | ||||
|                         ++$count; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     if ($count > 0 ) { | ||||
|         exec("chmod +x ".RASPAP_IPTABLES_SCRIPT); | ||||
|         exec("sudo ".RASPAP_IPTABLES_SCRIPT); | ||||
|         exec("sudo iptables-save | sudo tee /etc/iptables/rules.v4"); | ||||
|         unlink(RASPAP_IPTABLES_SCRIPT); | ||||
|         exec("chmod +x ".RASPAP_IP6TABLES_SCRIPT); | ||||
|         exec("sudo ".RASPAP_IP6TABLES_SCRIPT); | ||||
|         exec("sudo ip6tables-save | sudo tee /etc/iptables/rules.v6"); | ||||
|         unlink(RASPAP_IP6TABLES_SCRIPT); | ||||
|     } | ||||
|     return ($count > 0); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * @param array $conf | ||||
|  * @return string $ret | ||||
|  */ | ||||
| function WriteFirewallConf($conf) | ||||
| { | ||||
|     $ret = false; | ||||
|     if (is_array($conf) ) { write_php_ini($conf, RASPI_FIREWALL_CONF); | ||||
|     } | ||||
|     return $ret; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * @return array $conf | ||||
|  */ | ||||
| function ReadFirewallConf() | ||||
| { | ||||
|     $conf = array(); | ||||
|     if (file_exists(RASPI_FIREWALL_CONF) ) { | ||||
|         $conf = parse_ini_file(RASPI_FIREWALL_CONF); | ||||
|     } | ||||
|     if ( !isset($conf["firewall-enable"]) ) { | ||||
|         $conf["firewall-enable"] = false; | ||||
|         $conf["ssh-enable"] = false; | ||||
|         $conf["http-enable"] = false; | ||||
|         $conf["excl-devices"] = ""; | ||||
|         $conf["excluded-ips"] = ""; | ||||
|         $conf["ap-device"] = ""; | ||||
|         $conf["client-device"] = ""; | ||||
|         $conf["restricted-ips"] = ""; | ||||
|     } | ||||
|     exec('ifconfig | grep -E -i "^tun[0-9]"', $ret); | ||||
|     $conf["openvpn-enable"] = !empty($ret); | ||||
|     unset($ret); | ||||
|     exec('ifconfig | grep -E -i "^wg[0-9]"', $ret); | ||||
|     $conf["wireguard-enable"] = !empty($ret); | ||||
|     return $conf; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * @return string $ips | ||||
|  */ | ||||
| function getVPN_IPs() | ||||
| { | ||||
|     $ips = ""; | ||||
|     // get openvpn and wireguard server IPs | ||||
|     if (RASPI_OPENVPN_ENABLED && ($fconf = glob(RASPI_OPENVPN_CLIENT_PATH ."/*.conf")) !== false && !empty($fconf) ) { | ||||
|         foreach ( $fconf as $f ) { | ||||
|             unset($result); | ||||
|             exec('cat '.$f.' |  sed -rn "s/^remote\s*([a-z0-9\.\-\_:]*)\s*([0-9]*)\s*$/\1 \2/ip" ', $result); | ||||
|             if (!empty($result) ) { | ||||
|                 $result = explode(" ", $result[0]); | ||||
|                 $ip = (isset($result[0])) ? $result[0] : ""; | ||||
|                 $port = (isset($result[1])) ? $result[1] : ""; | ||||
|                 if (!empty($ip) ) { | ||||
|                     $ip = gethostbyname($ip); | ||||
|                     if (filter_var($ip, FILTER_VALIDATE_IP) && strpos($ips, $ip) === false ) { $ips .= " $ip"; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     // get wireguard server IPs | ||||
|     if (RASPI_WIREGUARD_ENABLED && ($fconf = glob(RASPI_WIREGUARD_PATH ."/*.conf")) !== false && !empty($fconf) ) { | ||||
|         foreach ( $fconf as $f ) { | ||||
|             unset($result); | ||||
|             exec('sudo /bin/cat '.$f.' |  sed -rn "s/^endpoint\s*=\s*\[?([a-z0-9\.\-\_:]*)\]?:([0-9]*)\s*$/\1 \2/ip" ', $result); | ||||
|             if (!empty($result) ) { | ||||
|                 $result = explode(" ", $result[0]); | ||||
|                 $ip = (isset($result[0])) ? $result[0] : ""; | ||||
|                 $port = (isset($result[1])) ? $result[1] : ""; | ||||
|                 if (!empty($ip) ) { | ||||
|                      $ip = gethostbyname($ip); | ||||
|                     if (filter_var($ip, FILTER_VALIDATE_IP) && strpos($ips, $ip) === false ) { $ips .= " $ip"; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     return trim($ips); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * @return array $fw_conf | ||||
|  */ | ||||
| function getFirewallConfiguration()  | ||||
| { | ||||
|     $fw_conf = ReadFirewallConf(); | ||||
|      | ||||
|     $json = file_get_contents(RASPI_IPTABLES_CONF); | ||||
|     getWifiInterface(); | ||||
|     $ap_device = $_SESSION['ap_interface']; | ||||
|     $clients = getClients(); | ||||
|     $str_clients = ""; | ||||
|     foreach( $clients["device"] as $dev ) { | ||||
|         if (!$dev["isAP"] ) { | ||||
|             if (!empty($str_clients) ) { $str_clients .= ", "; | ||||
|             } | ||||
|             $str_clients .= $dev["name"]; | ||||
|         } | ||||
|     } | ||||
|     $fw_conf["ap-device"] = $ap_device; | ||||
|     $fw_conf["client-list"] = $str_clients; | ||||
|     $id=findCurrentClientIndex($clients); | ||||
|     if ($id >= 0 ) { $fw_conf["client-device"] = $clients["device"][$id]["name"]; | ||||
|     } | ||||
|     return $fw_conf; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  */ | ||||
| function updateFirewall()  | ||||
| { | ||||
|     $fw_conf = getFirewallConfiguration(); | ||||
|     if ( isset($fw_conf["firewall-enable"]) ) { | ||||
|         WriteFirewallConf($fw_conf); | ||||
|         configureFirewall(); | ||||
|     } | ||||
|     return; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  */ | ||||
| function DisplayFirewallConfig() | ||||
| { | ||||
|     $status = new StatusMessages(); | ||||
|  | ||||
|     $fw_conf = getFirewallConfiguration(); | ||||
|     $ap_device = $fw_conf["ap-device"]; | ||||
|     $str_clients = $fw_conf["client-list"]; | ||||
|  | ||||
|     if (!empty($_POST)) { | ||||
|         $fw_conf["ssh-enable"] = isset($_POST['ssh-enable']); | ||||
|         $fw_conf["http-enable"] = isset($_POST['http-enable']); | ||||
|         $fw_conf["firewall-enable"] = isset($_POST['firewall-enable']) || isset($_POST['apply-firewall']); | ||||
|         if (isset($_POST['firewall-enable']) ) { $status->addMessage(_('Firewall is now enabled'), 'success'); | ||||
|         } | ||||
|         if (isset($_POST['apply-firewall']) ) {  $status->addMessage(_('Firewall settings changed'), 'success'); | ||||
|         } | ||||
|         if (isset($_POST['firewall-disable']) ) { $status->addMessage(_('Firewall is now disabled'), 'warning'); | ||||
|         } | ||||
|         if (isset($_POST['save-firewall']) ) {  $status->addMessage(_('Firewall settings saved. Firewall is still disabled.'), 'success'); | ||||
|         } | ||||
|         if (isset($_POST['excl-devices'])  ) { | ||||
|             $excl = filter_var($_POST['excl-devices'], FILTER_SANITIZE_STRING); | ||||
|             $excl = str_replace(',', ' ', $excl); | ||||
|             $excl = trim(preg_replace('/\s+/', ' ', $excl)); | ||||
|             if ($fw_conf["excl-devices"] != $excl ) { | ||||
|                 $status->addMessage(_('Exclude devices '. $excl), 'success'); | ||||
|                 $fw_conf["excl-devices"] = $excl; | ||||
|             } | ||||
|         } | ||||
|         if (isset($_POST['excluded-ips'])  ) { | ||||
|             $excl = filter_var($_POST['excluded-ips'], FILTER_SANITIZE_STRING); | ||||
|             $excl = str_replace(',', ' ', $excl); | ||||
|             $excl = trim(preg_replace('/\s+/', ' ', $excl)); | ||||
|             if (!empty($excl) ) { | ||||
|                 $excl = explode(' ', $excl); | ||||
|                 $str_excl = ""; | ||||
|                 foreach ( $excl as $ip ) { | ||||
|                     if (filter_var($ip, FILTER_VALIDATE_IP) ) { $str_excl .= "$ip "; | ||||
|                     } else { $status->addMessage(_('Exclude IP address '. $ip . ' failed - not a valid IP address'), 'warning'); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             $str_excl = trim($str_excl); | ||||
|             if ($fw_conf["excluded-ips"] != $str_excl ) { | ||||
|                  $status->addMessage(_('Exclude IP address(es) '. $str_excl), 'success'); | ||||
|                  $fw_conf["excluded-ips"] = $str_excl; | ||||
|             } | ||||
|         } | ||||
|         WriteFirewallConf($fw_conf); | ||||
|         configureFirewall(); | ||||
|     } | ||||
|     $vpn_ips = getVPN_IPs(); | ||||
|     echo renderTemplate( | ||||
|         "firewall", compact( | ||||
|             "status", | ||||
|             "ap_device", | ||||
|             "str_clients", | ||||
|             "fw_conf", | ||||
|             "vpn_ips" | ||||
|         ) | ||||
|     ); | ||||
| } | ||||
|  | ||||
| @@ -664,10 +664,18 @@ function formatDateAgo($datetime, $full = false) | ||||
|     return $string ? implode(', ', $string) . ' ago' : 'just now'; | ||||
| } | ||||
|  | ||||
| function initializeApp() | ||||
| { | ||||
|     $_SESSION["theme_url"] = getThemeOpt(); | ||||
|     $_SESSION["toggleState"] = getSidebarState(); | ||||
|     $_SESSION["bridgedEnabled"] = getBridgedState(); | ||||
| } | ||||
|  | ||||
| function getThemeOpt() | ||||
| { | ||||
|     if (!isset($_COOKIE['theme'])) { | ||||
|         $theme = "custom.php"; | ||||
|         setcookie('theme', $theme); | ||||
|     } else { | ||||
|         $theme = $_COOKIE['theme']; | ||||
|     } | ||||
| @@ -680,6 +688,7 @@ function getColorOpt() | ||||
|         $color = "#2b8080"; | ||||
|     } else { | ||||
|         $color = $_COOKIE['color']; | ||||
|         setcookie('color', $color); | ||||
|     } | ||||
|     return $color; | ||||
| } | ||||
| @@ -737,7 +746,7 @@ function validate_host($host) | ||||
| // @return boolean | ||||
| function getNightmode() | ||||
| { | ||||
|     if ($_COOKIE['theme'] == 'lightsout.css') { | ||||
|     if (isset($_COOKIE['theme']) && $_COOKIE['theme'] == 'lightsout.css') { | ||||
|         return true; | ||||
|     } else { | ||||
|         return false; | ||||
| @@ -810,3 +819,15 @@ function getTooltip($msg, $id, $visible = true, $data_html = false) | ||||
|     echo '<i class="fas fa-question-circle text-muted ' .$opt1.'" id="' .$id. '" data-toggle="tooltip" ' .$opt2. ' data-placement="auto" title="' . _($msg). '"></i>'; | ||||
| } | ||||
|  | ||||
| // Load non default JS/ECMAScript in footer | ||||
| function loadFooterScripts($extraFooterScripts) | ||||
| { | ||||
|     foreach ($extraFooterScripts as $script) { | ||||
|         echo '<script type="text/javascript" src="' , $script['src'] , '"'; | ||||
|         if ($script['defer']) { | ||||
|             echo ' defer="defer"'; | ||||
|         } | ||||
|         echo '></script>' , PHP_EOL; | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -1,22 +1,17 @@ | ||||
| <?php | ||||
|  | ||||
| require_once 'status_messages.php'; | ||||
| require_once 'app/lib/system.php'; | ||||
| require_once 'includes/wifi_functions.php'; | ||||
| require_once 'includes/config.php'; | ||||
|  | ||||
| getWifiInterface(); | ||||
|  | ||||
| $system = new \RaspAP\System\Sysinfo; | ||||
| $os = $system->operatingSystem(); | ||||
|  | ||||
| /** | ||||
|  * Initialize hostapd values, display interface | ||||
|  * | ||||
|  */ | ||||
| function DisplayHostAPDConfig() | ||||
| { | ||||
|     $status = new StatusMessages(); | ||||
|     $status = new \RaspAP\Messages\StatusMessage; | ||||
|     $system = new \RaspAP\System\Sysinfo; | ||||
|     $operatingSystem = $system->operatingSystem(); | ||||
|     $arrConfig = array(); | ||||
|   | ||||
							
								
								
									
										23
									
								
								includes/navbar.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										23
									
								
								includes/navbar.php
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,23 @@ | ||||
|       <nav class="navbar navbar-expand navbar-light topbar mb-1 static-top"> | ||||
|         <!-- Sidebar Toggle (Topbar) --> | ||||
|         <button id="sidebarToggleTopbar" class="btn btn-link d-md-none rounded-circle mr-3"> | ||||
|           <i class="fa fa-bars"></i> | ||||
|         </button> | ||||
|         <!-- Topbar Navbar --> | ||||
|         <p class="text-left brand-title mt-3 ml-2"></p> | ||||
|         <ul class="navbar-nav ml-auto"> | ||||
|           <!-- Nav Item - Night mode --> | ||||
|           <div class="custom-control custom-switch mt-4"> | ||||
|             <input type="checkbox" class="custom-control-input" id="night-mode" <?php echo getNightmode() ? 'checked' : null ; ?> > | ||||
|             <label class="custom-control-label" for="night-mode"><i class="far fa-moon mr-1 text-muted"></i></label> | ||||
|           </div> | ||||
|           <div class="topbar-divider d-none d-sm-block"></div> | ||||
|           <!-- Nav Item - User --> | ||||
|           <li class="nav-item dropdown no-arrow"> | ||||
|           <a class="nav-link" href="auth_conf"> | ||||
|             <span class="mr-2 d-none d-lg-inline small"><?php echo htmlspecialchars($_SESSION['user_id'], ENT_QUOTES); ?></span> | ||||
|             <i class="fas fa-user-circle fa-3x"></i> | ||||
|           </a> | ||||
|           </li> | ||||
|         </ul> | ||||
|       </nav> | ||||
| @@ -1,6 +1,5 @@ | ||||
| <?php | ||||
|  | ||||
| require_once 'includes/status_messages.php'; | ||||
| require_once 'includes/internetRoute.php'; | ||||
|  | ||||
| /** | ||||
| @@ -9,8 +8,7 @@ require_once 'includes/internetRoute.php'; | ||||
|  */ | ||||
| function DisplayNetworkingConfig() | ||||
| { | ||||
|  | ||||
|     $status = new StatusMessages(); | ||||
|     $status = new \RaspAP\Messages\StatusMessage; | ||||
|  | ||||
|     exec("ls /sys/class/net | grep -v lo", $interfaces); | ||||
|     $routeInfo = getRouteInfo(true); | ||||
|   | ||||
| @@ -1,9 +1,7 @@ | ||||
| <?php | ||||
|  | ||||
| require_once 'includes/status_messages.php'; | ||||
| require_once 'includes/config.php'; | ||||
| require_once 'includes/wifi_functions.php'; | ||||
| require_once 'app/lib/uploader.php'; | ||||
|  | ||||
| getWifiInterface(); | ||||
|  | ||||
| @@ -12,7 +10,7 @@ getWifiInterface(); | ||||
|  */ | ||||
| function DisplayOpenVPNConfig() | ||||
| { | ||||
|     $status = new StatusMessages(); | ||||
|     $status = new \RaspAP\Messages\StatusMessage; | ||||
|     if (!RASPI_MONITOR_ENABLED) { | ||||
|         if (isset($_POST['SaveOpenVPNSettings'])) { | ||||
|             if (isset($_POST['authUser'])) { | ||||
| @@ -109,7 +107,7 @@ function SaveOpenVPNConfig($status, $file, $authUser, $authPassword) | ||||
|             throw new RuntimeException('Invalid parameters'); | ||||
|         } | ||||
|  | ||||
|         $upload = \RaspAP\Uploader\Upload::factory('ovpn',$tmp_destdir); | ||||
|         $upload = \RaspAP\Uploader\FileUpload::factory('ovpn',$tmp_destdir); | ||||
|         $upload->set_max_file_size(64*KB); | ||||
|         $upload->set_allowed_mime_types(array('ovpn' => 'text/plain')); | ||||
|         $upload->file($file); | ||||
|   | ||||
							
								
								
									
										52
									
								
								includes/page_actions.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										52
									
								
								includes/page_actions.php
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,52 @@ | ||||
|       <?php | ||||
|         $extraFooterScripts = array(); | ||||
|         $page = $_SERVER['PATH_INFO']; | ||||
|         // handle page actions | ||||
|         switch ($page) { | ||||
|         case "/wlan0_info": | ||||
|             DisplayDashboard($extraFooterScripts); | ||||
|             break; | ||||
|         case "/dhcpd_conf": | ||||
|             DisplayDHCPConfig(); | ||||
|             break; | ||||
|         case "/wpa_conf": | ||||
|             DisplayWPAConfig(); | ||||
|             break; | ||||
|         case "/network_conf": | ||||
|             DisplayNetworkingConfig(); | ||||
|             break; | ||||
|         case "/hostapd_conf": | ||||
|             DisplayHostAPDConfig(); | ||||
|             break; | ||||
|         case "/adblock_conf": | ||||
|             DisplayAdBlockConfig(); | ||||
|             break; | ||||
|         case "/openvpn_conf": | ||||
|             DisplayOpenVPNConfig(); | ||||
|             break; | ||||
|         case "/wg_conf": | ||||
|             DisplayWireGuardConfig(); | ||||
|             break; | ||||
|         case "/torproxy_conf": | ||||
|             DisplayTorProxyConfig(); | ||||
|             break; | ||||
|         case "/auth_conf": | ||||
|             DisplayAuthConfig($_SESSION['user_id']); | ||||
|             break; | ||||
|         case "/save_hostapd_conf": | ||||
|             SaveTORAndVPNConfig(); | ||||
|             break; | ||||
|         case "/data_use": | ||||
|             DisplayDataUsage($extraFooterScripts); | ||||
|             break; | ||||
|         case "/system_info": | ||||
|             DisplaySystem($extraFooterScripts); | ||||
|             break; | ||||
|         case "/about": | ||||
|             DisplayAbout(); | ||||
|             break; | ||||
|         default: | ||||
|             DisplayDashboard($extraFooterScripts); | ||||
|         } | ||||
|       ?> | ||||
|  | ||||
							
								
								
									
										93
									
								
								includes/sidebar.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										93
									
								
								includes/sidebar.php
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,93 @@ | ||||
|       <ul class="navbar-nav sidebar sidebar-light d-none d-md-block accordion <?php echo (isset($_SESSION["toggleState"])) ? $_SESSION["toggleState"] : null ; ?>" id="accordionSidebar"> | ||||
|         <!-- Sidebar - Brand --> | ||||
|         <a class="sidebar-brand d-flex align-items-center justify-content-center" href="wlan0_info"> | ||||
|           <div class="sidebar-brand-text ml-1"><?php echo RASPI_BRAND_TEXT; ?></div> | ||||
|         </a> | ||||
|         <!-- Divider --> | ||||
|         <hr class="sidebar-divider my-0"> | ||||
|         <div class="row"> | ||||
|           <div class="col-xs ml-3 sidebar-brand-icon"> | ||||
|             <img src="app/img/raspAP-logo.php" class="navbar-logo" width="64" height="64"> | ||||
|           </div> | ||||
|           <div class="col-xs ml-2"> | ||||
|             <div class="ml-1">Status</div> | ||||
|             <div class="info-item-xs"><span class="icon"> | ||||
|               <i class="fas fa-circle <?php echo ($hostapd_led); ?>"></i></span> <?php echo _("Hotspot").' '. _($hostapd_status); ?> | ||||
|             </div> | ||||
|             <div class="info-item-xs"><span class="icon"> | ||||
|               <i class="fas fa-circle <?php echo ($memused_led); ?>"></i></span> <?php echo _("Memory Use").': '. htmlspecialchars(strval($memused), ENT_QUOTES); ?>% | ||||
|             </div> | ||||
|             <div class="info-item-xs"><span class="icon"> | ||||
|               <i class="fas fa-circle <?php echo ($cputemp_led); ?>"></i></span> <?php echo _("CPU Temp").': '. htmlspecialchars($cputemp, ENT_QUOTES); ?>°C | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|         <li class="nav-item"> | ||||
|           <a class="nav-link" href="wlan0_info"><i class="fas fa-tachometer-alt fa-fw mr-2"></i><span class="nav-label"><?php echo _("Dashboard"); ?></span></a> | ||||
|         </li> | ||||
|         <?php if (RASPI_HOTSPOT_ENABLED) : ?> | ||||
|         <li class="nav-item"> | ||||
|           <a class="nav-link" href="hostapd_conf"><i class="far fa-dot-circle fa-fw mr-2"></i><span class="nav-label"><?php echo _("Hotspot"); ?></a> | ||||
|         </li> | ||||
|         <?php endif; ?> | ||||
|         <?php if (RASPI_DHCP_ENABLED && !$_SESSION["bridgedEnabled"]) : ?> | ||||
|         <li class="nav-item"> | ||||
|           <a class="nav-link" href="dhcpd_conf"><i class="fas fa-exchange-alt fa-fw mr-2"></i><span class="nav-label"><?php echo _("DHCP Server"); ?></a> | ||||
|         </li> | ||||
|         <?php endif; ?> | ||||
|         <?php if (RASPI_ADBLOCK_ENABLED && !$_SESSION["bridgedEnabled"]) : ?> | ||||
|         <li class="nav-item"> | ||||
|            <a class="nav-link" href="adblock_conf"><i class="far fa-hand-paper fa-fw mr-2"></i><span class="nav-label"><?php echo _("Ad Blocking"); ?></a> | ||||
|         </li> | ||||
|         <?php endif; ?> | ||||
|         <?php if (RASPI_NETWORK_ENABLED) : ?> | ||||
|         <li class="nav-item"> | ||||
|            <a class="nav-link" href="network_conf"><i class="fas fa-network-wired fa-fw mr-2"></i><span class="nav-label"><?php echo _("Networking"); ?></a> | ||||
|         </li> | ||||
|         <?php endif; ?> | ||||
|         <?php if (RASPI_WIFICLIENT_ENABLED && !$_SESSION["bridgedEnabled"]) : ?> | ||||
|         <li class="nav-item"> | ||||
|           <a class="nav-link" href="wpa_conf"><i class="fas fa-wifi fa-fw mr-2"></i><span class="nav-label"><?php echo _("WiFi client"); ?></span></a> | ||||
|         </li> | ||||
|         <?php endif; ?> | ||||
|         <?php if (RASPI_OPENVPN_ENABLED) : ?> | ||||
|         <li class="nav-item"> | ||||
|           <a class="nav-link" href="openvpn_conf"><i class="fas fa-key fa-fw mr-2"></i><span class="nav-label"><?php echo _("OpenVPN"); ?></a> | ||||
|         </li> | ||||
|         <?php endif; ?> | ||||
|         <?php if (RASPI_WIREGUARD_ENABLED) : ?> | ||||
|         <li class="nav-item"> | ||||
|           <a class="nav-link" href="wg_conf"><span class="ra-wireguard mr-2"></span><span class="nav-label"><?php echo _("WireGuard"); ?></a> | ||||
|         </li> | ||||
|         <?php endif; ?> | ||||
|         <?php if (RASPI_TORPROXY_ENABLED) : ?> | ||||
|         <li class="nav-item"> | ||||
|            <a class="nav-link" href="torproxy_conf"><i class="fas fa-eye-slash fa-fw mr-2"></i><span class="nav-label"><?php echo _("TOR proxy"); ?></a> | ||||
|         </li> | ||||
|         <?php endif; ?> | ||||
|         <?php if (RASPI_CONFAUTH_ENABLED) : ?> | ||||
|         <li class="nav-item"> | ||||
|           <a class="nav-link" href="auth_conf"><i class="fas fa-user-lock fa-fw mr-2"></i><span class="nav-label"><?php echo _("Authentication"); ?></a> | ||||
|         </li> | ||||
|         <?php endif; ?> | ||||
|         <?php if (RASPI_VNSTAT_ENABLED) : ?> | ||||
|         <li class="nav-item"> | ||||
|           <a class="nav-link" href="data_use"><i class="fas fa-chart-bar fa-fw mr-2"></i><span class="nav-label"><?php echo _("Data usage"); ?></a> | ||||
|         </li> | ||||
|         <?php endif; ?> | ||||
|         <?php if (RASPI_SYSTEM_ENABLED) : ?> | ||||
|         <li class="nav-item"> | ||||
|           <a class="nav-link" href="system_info"><i class="fas fa-cube fa-fw mr-2"></i><span class="nav-label"><?php echo _("System"); ?></a> | ||||
|         </li> | ||||
|         <?php endif; ?> | ||||
|          <li class="nav-item"> | ||||
|           <a class="nav-link" href="about"><i class="fas fa-info-circle fa-fw mr-2"></i><span class="nav-label"><?php echo _("About RaspAP"); ?></a> | ||||
|         </li> | ||||
|         <!-- Divider --> | ||||
|         <hr class="sidebar-divider d-none d-md-block"> | ||||
|  | ||||
|         <!-- Sidebar Toggler (Sidebar) --> | ||||
|         <div class="text-center d-none d-md-block"> | ||||
|           <button class="rounded-circle border-0" id="sidebarToggle"></button> | ||||
|         </div> | ||||
|     </ul> | ||||
| @@ -1,7 +1,5 @@ | ||||
| <?php | ||||
|  | ||||
| require_once 'app/lib/system.php'; | ||||
|  | ||||
| $system = new \RaspAP\System\Sysinfo; | ||||
|  | ||||
| $hostname = $system->hostname(); | ||||
|   | ||||
| @@ -1,74 +1,14 @@ | ||||
| <?php | ||||
|  | ||||
| require_once 'includes/status_messages.php'; | ||||
| require_once 'includes/functions.php'; | ||||
| require_once 'config.php'; | ||||
| require_once 'app/lib/system.php'; | ||||
|  | ||||
| /** | ||||
|  * Find the version of the Raspberry Pi | ||||
|  * Currently only used for the system information page but may useful elsewhere | ||||
|  */ | ||||
|  | ||||
| function RPiVersion() | ||||
| { | ||||
|     // Lookup table from http://www.raspberrypi-spy.co.uk/2012/09/checking-your-raspberry-pi-board-version/ | ||||
|     $revisions = array( | ||||
|     '0002' => 'Model B Revision 1.0', | ||||
|     '0003' => 'Model B Revision 1.0 + ECN0001', | ||||
|     '0004' => 'Model B Revision 2.0 (256 MB)', | ||||
|     '0005' => 'Model B Revision 2.0 (256 MB)', | ||||
|     '0006' => 'Model B Revision 2.0 (256 MB)', | ||||
|     '0007' => 'Model A', | ||||
|     '0008' => 'Model A', | ||||
|     '0009' => 'Model A', | ||||
|     '000d' => 'Model B Revision 2.0 (512 MB)', | ||||
|     '000e' => 'Model B Revision 2.0 (512 MB)', | ||||
|     '000f' => 'Model B Revision 2.0 (512 MB)', | ||||
|     '0010' => 'Model B+', | ||||
|     '0013' => 'Model B+', | ||||
|     '0011' => 'Compute Module', | ||||
|     '0012' => 'Model A+', | ||||
|     'a01041' => 'a01041', | ||||
|     'a21041' => 'a21041', | ||||
|     '900092' => 'PiZero 1.2', | ||||
|     '900093' => 'PiZero 1.3', | ||||
|     '9000c1' => 'PiZero W', | ||||
|     'a02082' => 'Pi 3 Model B', | ||||
|     'a22082' => 'Pi 3 Model B', | ||||
|     'a32082' => 'Pi 3 Model B', | ||||
|     'a52082' => 'Pi 3 Model B', | ||||
|     'a020d3' => 'Pi 3 Model B+', | ||||
|     'a220a0' => 'Compute Module 3', | ||||
|     'a020a0' => 'Compute Module 3', | ||||
|     'a02100' => 'Compute Module 3+', | ||||
|     'a03111' => 'Model 4B Revision 1.1 (1 GB)', | ||||
|     'b03111' => 'Model 4B Revision 1.1 (2 GB)', | ||||
|     'c03111' => 'Model 4B Revision 1.1 (4 GB)' | ||||
|     ); | ||||
|  | ||||
|     $cpuinfo_array = ''; | ||||
|     exec('cat /proc/cpuinfo', $cpuinfo_array); | ||||
|     $rev = trim(array_pop(explode(':', array_pop(preg_grep("/^Revision/", $cpuinfo_array))))); | ||||
|     if (array_key_exists($rev, $revisions)) { | ||||
|         return $revisions[$rev]; | ||||
|     } else { | ||||
|         exec('cat /proc/device-tree/model', $model); | ||||
|         if (isset($model[0])) { | ||||
|             return $model[0]; | ||||
|         } else { | ||||
|             return 'Unknown Device'; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  */ | ||||
| function DisplaySystem(&$extraFooterScripts) | ||||
| { | ||||
|  | ||||
|     $status = new StatusMessages(); | ||||
|     $status = new \RaspAP\Messages\StatusMessage; | ||||
|  | ||||
|     if (isset($_POST['SaveLanguage'])) { | ||||
|         if (isset($_POST['locale'])) { | ||||
| @@ -134,7 +74,7 @@ function DisplaySystem(&$extraFooterScripts) | ||||
|     // define locales | ||||
|     $arrLocales = getLocales(); | ||||
|  | ||||
|     #fetch system status variables. | ||||
|     // fetch system status variables | ||||
|     $system = new \RaspAP\System\Sysinfo; | ||||
|  | ||||
|     $hostname = $system->hostname(); | ||||
| @@ -143,7 +83,8 @@ function DisplaySystem(&$extraFooterScripts) | ||||
|     $os       = $system->operatingSystem(); | ||||
|     $kernel   = $system->kernelVersion(); | ||||
|     $systime  = $system->systime(); | ||||
|  | ||||
|     $revision = $system->rpiRevision(); | ||||
|      | ||||
|     // mem used | ||||
|     $memused  = $system->usedMemory(); | ||||
|     $memused_status = "primary"; | ||||
| @@ -215,6 +156,7 @@ function DisplaySystem(&$extraFooterScripts) | ||||
|         "hostname", | ||||
|         "uptime", | ||||
|         "systime", | ||||
|         "revision", | ||||
|         "cores", | ||||
|         "os", | ||||
|         "kernel", | ||||
|   | ||||
| @@ -1,7 +1,5 @@ | ||||
| <?php | ||||
|  | ||||
| require_once 'includes/status_messages.php'; | ||||
|  | ||||
| /** | ||||
|  * Manage Tor Proxy configuration | ||||
|  */ | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| <?php | ||||
|  | ||||
| require_once 'includes/status_messages.php'; | ||||
| require_once 'config.php'; | ||||
|  | ||||
| /** | ||||
| @@ -8,7 +7,7 @@ require_once 'config.php'; | ||||
|  */ | ||||
| function DisplayWireGuardConfig() | ||||
| { | ||||
|     $status = new StatusMessages(); | ||||
|     $status = new \RaspAP\Messages\StatusMessage; | ||||
|     if (!RASPI_MONITOR_ENABLED) { | ||||
|         $optRules     = $_POST['wgRules']; | ||||
|         $optConf      = $_POST['wgCnfOpt']; | ||||
| @@ -112,7 +111,7 @@ function SaveWireGuardUpload($status, $file, $optRules) | ||||
|             throw new RuntimeException('Invalid parameters'); | ||||
|         } | ||||
|  | ||||
|         $upload = \RaspAP\Uploader\Upload::factory('wg',$tmp_destdir); | ||||
|         $upload = \RaspAP\Uploader\FileUpload::factory('wg',$tmp_destdir); | ||||
|         $upload->set_max_file_size(64*KB); | ||||
|         $upload->set_allowed_mime_types(array('text/plain')); | ||||
|         $upload->file($file); | ||||
|   | ||||
							
								
								
									
										251
									
								
								index.php
									
									
									
									
									
								
							
							
						
						
									
										251
									
								
								index.php
									
									
									
									
									
								
							| @@ -4,12 +4,12 @@ | ||||
|  * Raspbian WiFi Configuration Portal (RaspAP) | ||||
|  * | ||||
|  * Simple AP setup & WiFi management for Debian-based devices. | ||||
|  * Enables use of simple web interface rather than SSH to control WiFi and related services  on the Raspberry Pi. | ||||
|  * Enables use of simple web interface rather than SSH to control WiFi and related services on the Raspberry Pi. | ||||
|  * Recommended distribution is Raspberry Pi OS (64-bit) Lite. Specific instructions to install the supported software are | ||||
|  * in the README and original post by @SirLagz. For a quick run through, the packages required for the WebGUI are: | ||||
|  * lighttpd (version 1.4.59 installed via apt) | ||||
|  * php-cgi (version 7.4.28 installed via apt) | ||||
|  * along with their supporting packages, php7.3 will also need to be enabled. | ||||
|  * php-cgi (version 7.4.33 installed via apt) | ||||
|  * along with their supporting packages, php7.4 will also need to be enabled. | ||||
|  * | ||||
|  * @author  Lawrence Yau <sirlagz@gmail.com> | ||||
|  * @author  Bill Zimmerman <billzimmerman@gmail.com> | ||||
| @@ -27,8 +27,8 @@ require 'includes/csrf.php'; | ||||
| ensureCSRFSessionToken(); | ||||
|  | ||||
| require_once 'includes/config.php'; | ||||
| require_once 'includes/autoload.php'; | ||||
| require_once 'includes/defaults.php'; | ||||
| require_once RASPI_CONFIG.'/raspap.php'; | ||||
| require_once 'includes/locale.php'; | ||||
| require_once 'includes/functions.php'; | ||||
| require_once 'includes/dashboard.php'; | ||||
| @@ -47,15 +47,9 @@ require_once 'includes/openvpn.php'; | ||||
| require_once 'includes/wireguard.php'; | ||||
| require_once 'includes/torproxy.php'; | ||||
|  | ||||
| $config = getConfig(); | ||||
| $output = $return = 0; | ||||
| $page = $_SERVER['PATH_INFO']; | ||||
|  | ||||
| $theme_url = getThemeOpt(); | ||||
| $toggleState = getSidebarState(); | ||||
| $bridgedEnabled = getBridgedState(); | ||||
|  | ||||
| ?><!DOCTYPE html> | ||||
| initializeApp(); | ||||
| ?> | ||||
| <!DOCTYPE html> | ||||
| <html lang="en"> | ||||
|   <head> | ||||
|     <meta charset="utf-8"> | ||||
| @@ -86,8 +80,7 @@ $bridgedEnabled = getBridgedState(); | ||||
|     <link href="dist/raspap/css/style.css" rel="stylesheet" type="text/css"> | ||||
|  | ||||
|     <!-- Custom CSS --> | ||||
|     <link href="<?php echo $theme_url; ?>" title="main" rel="stylesheet"> | ||||
|  | ||||
|     <link href="<?php echo $_SESSION["theme_url"]; ?>" title="main" rel="stylesheet"> | ||||
|     <link rel="shortcut icon" type="image/png" href="app/icons/favicon.png?ver=2.0"> | ||||
|     <link rel="apple-touch-icon" sizes="180x180" href="app/icons/apple-touch-icon.png"> | ||||
|     <link rel="icon" type="image/png" sizes="32x32" href="app/icons/favicon-32x32.png"> | ||||
| @@ -109,203 +102,30 @@ $bridgedEnabled = getBridgedState(); | ||||
|     <!-- Page Wrapper --> | ||||
|     <div id="wrapper"> | ||||
|       <!-- Sidebar --> | ||||
|       <ul class="navbar-nav sidebar sidebar-light d-none d-md-block accordion <?php echo (isset($toggleState)) ? $toggleState : null ; ?>" id="accordionSidebar"> | ||||
|         <!-- Sidebar - Brand --> | ||||
|         <a class="sidebar-brand d-flex align-items-center justify-content-center" href="wlan0_info"> | ||||
|           <div class="sidebar-brand-text ml-1"><?php echo RASPI_BRAND_TEXT; ?></div> | ||||
|         </a> | ||||
|         <!-- Divider --> | ||||
|         <hr class="sidebar-divider my-0"> | ||||
|         <div class="row"> | ||||
|           <div class="col-xs ml-3 sidebar-brand-icon"> | ||||
|             <img src="app/img/raspAP-logo.php" class="navbar-logo" width="64" height="64"> | ||||
|           </div> | ||||
|           <div class="col-xs ml-2"> | ||||
|             <div class="ml-1">Status</div> | ||||
|             <div class="info-item-xs"><span class="icon"> | ||||
|               <i class="fas fa-circle <?php echo ($hostapd_led); ?>"></i></span> <?php echo _("Hotspot").' '. _($hostapd_status); ?> | ||||
|             </div> | ||||
|             <div class="info-item-xs"><span class="icon"> | ||||
|               <i class="fas fa-circle <?php echo ($memused_led); ?>"></i></span> <?php echo _("Memory Use").': '. htmlspecialchars($memused, ENT_QUOTES); ?>% | ||||
|             </div> | ||||
|             <div class="info-item-xs"><span class="icon"> | ||||
|               <i class="fas fa-circle <?php echo ($cputemp_led); ?>"></i></span> <?php echo _("CPU Temp").': '. htmlspecialchars($cputemp, ENT_QUOTES); ?>°C | ||||
|       <?php require_once 'includes/sidebar.php'; ?> | ||||
|       <!-- End of Sidebar --> | ||||
|       <!-- Content Wrapper --> | ||||
|       <div id="content-wrapper" class="d-flex flex-column"> | ||||
|         <!-- Main Content --> | ||||
|         <div id="content"> | ||||
|           <!-- Topbar --> | ||||
|           <?php require_once 'includes/navbar.php'; ?> | ||||
|           <!-- End of Topbar --> | ||||
|           <!-- Begin Page Content --> | ||||
|           <div class="container-fluid"> | ||||
|           <?php require_once 'includes/page_actions.php'; ?> | ||||
|           </div><!-- /.container-fluid --> | ||||
|         </div><!-- End of Main Content --> | ||||
|         <!-- Footer --> | ||||
|         <footer class="sticky-footer bg-grey-100"> | ||||
|           <div class="container my-auto"> | ||||
|             <div class="copyright text-center my-auto"> | ||||
|               <span></span> | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|         <li class="nav-item"> | ||||
|           <a class="nav-link" href="wlan0_info"><i class="fas fa-tachometer-alt fa-fw mr-2"></i><span class="nav-label"><?php echo _("Dashboard"); ?></span></a> | ||||
|         </li> | ||||
|           <?php if (RASPI_HOTSPOT_ENABLED) : ?> | ||||
|         <li class="nav-item"> | ||||
|           <a class="nav-link" href="hostapd_conf"><i class="far fa-dot-circle fa-fw mr-2"></i><span class="nav-label"><?php echo _("Hotspot"); ?></a> | ||||
|         </li> | ||||
|           <?php endif; ?> | ||||
|           <?php if (RASPI_DHCP_ENABLED && !$bridgedEnabled) : ?> | ||||
|         <li class="nav-item"> | ||||
|           <a class="nav-link" href="dhcpd_conf"><i class="fas fa-exchange-alt fa-fw mr-2"></i><span class="nav-label"><?php echo _("DHCP Server"); ?></a> | ||||
|         </li> | ||||
|           <?php endif; ?> | ||||
|           <?php if (RASPI_ADBLOCK_ENABLED && !$bridgedEnabled) : ?> | ||||
|         <li class="nav-item"> | ||||
|            <a class="nav-link" href="adblock_conf"><i class="far fa-hand-paper fa-fw mr-2"></i><span class="nav-label"><?php echo _("Ad Blocking"); ?></a> | ||||
|         </li> | ||||
|           <?php endif; ?> | ||||
|           <?php if (RASPI_NETWORK_ENABLED) : ?> | ||||
|         <li class="nav-item"> | ||||
|            <a class="nav-link" href="network_conf"><i class="fas fa-network-wired fa-fw mr-2"></i><span class="nav-label"><?php echo _("Networking"); ?></a> | ||||
|         </li>  | ||||
|           <?php endif; ?> | ||||
|           <?php if (RASPI_WIFICLIENT_ENABLED && !$bridgedEnabled) : ?> | ||||
|         <li class="nav-item"> | ||||
|           <a class="nav-link" href="wpa_conf"><i class="fas fa-wifi fa-fw mr-2"></i><span class="nav-label"><?php echo _("WiFi client"); ?></span></a> | ||||
|         </li> | ||||
|           <?php endif; ?> | ||||
|           <?php if (RASPI_OPENVPN_ENABLED) : ?> | ||||
|         <li class="nav-item"> | ||||
|           <a class="nav-link" href="openvpn_conf"><i class="fas fa-key fa-fw mr-2"></i><span class="nav-label"><?php echo _("OpenVPN"); ?></a> | ||||
|         </li> | ||||
|           <?php endif; ?> | ||||
|           <?php if (RASPI_WIREGUARD_ENABLED) : ?> | ||||
|         <li class="nav-item"> | ||||
|           <a class="nav-link" href="wg_conf"><span class="ra-wireguard mr-2"></span><span class="nav-label"><?php echo _("WireGuard"); ?></a> | ||||
|         </li> | ||||
|           <?php endif; ?> | ||||
|           <?php if (RASPI_TORPROXY_ENABLED) : ?> | ||||
|         <li class="nav-item"> | ||||
|            <a class="nav-link" href="torproxy_conf"><i class="fas fa-eye-slash fa-fw mr-2"></i><span class="nav-label"><?php echo _("TOR proxy"); ?></a> | ||||
|         </li> | ||||
|           <?php endif; ?> | ||||
|           <?php if (RASPI_CONFAUTH_ENABLED) : ?> | ||||
|         <li class="nav-item"> | ||||
|         <a class="nav-link" href="auth_conf"><i class="fas fa-user-lock fa-fw mr-2"></i><span class="nav-label"><?php echo _("Authentication"); ?></a> | ||||
|         </li> | ||||
|           <?php endif; ?> | ||||
|           <?php if (RASPI_VNSTAT_ENABLED) : ?> | ||||
|         <li class="nav-item"> | ||||
|           <a class="nav-link" href="data_use"><i class="fas fa-chart-bar fa-fw mr-2"></i><span class="nav-label"><?php echo _("Data usage"); ?></a> | ||||
|         </li> | ||||
|           <?php endif; ?> | ||||
|             <?php if (RASPI_SYSTEM_ENABLED) : ?> | ||||
|           <li class="nav-item"> | ||||
|           <a class="nav-link" href="system_info"><i class="fas fa-cube fa-fw mr-2"></i><span class="nav-label"><?php echo _("System"); ?></a> | ||||
|           </li> | ||||
|             <?php endif; ?> | ||||
|          <li class="nav-item"> | ||||
|           <a class="nav-link" href="about"><i class="fas fa-info-circle fa-fw mr-2"></i><span class="nav-label"><?php echo _("About RaspAP"); ?></a> | ||||
|         </li> | ||||
|         <!-- Divider --> | ||||
|         <hr class="sidebar-divider d-none d-md-block"> | ||||
|  | ||||
|         <!-- Sidebar Toggler (Sidebar) --> | ||||
|         <div class="text-center d-none d-md-block"> | ||||
|           <button class="rounded-circle border-0" id="sidebarToggle"></button> | ||||
|         </div> | ||||
|  | ||||
|     </ul> | ||||
|     <!-- End of Sidebar --> | ||||
|  | ||||
|     <!-- Content Wrapper --> | ||||
|     <div id="content-wrapper" class="d-flex flex-column"> | ||||
|  | ||||
|     <!-- Main Content --> | ||||
|     <div id="content"> | ||||
|       <!-- Topbar --> | ||||
|       <nav class="navbar navbar-expand navbar-light topbar mb-1 static-top"> | ||||
|         <!-- Sidebar Toggle (Topbar) --> | ||||
|         <button id="sidebarToggleTopbar" class="btn btn-link d-md-none rounded-circle mr-3"> | ||||
|           <i class="fa fa-bars"></i> | ||||
|         </button> | ||||
|         <!-- Topbar Navbar --> | ||||
|         <p class="text-left brand-title mt-3 ml-2"></p> | ||||
|         <ul class="navbar-nav ml-auto"> | ||||
|           <!-- Nav Item - Insiders --> | ||||
|           <div class="insiders mt-4"> | ||||
|             <a href="https://docs.raspap.com/insiders" target="blank"><i class="fas fa-heart mr-3" style="color: #e63946"></i></a> | ||||
|           </div> | ||||
|           <!-- Nav Item - Night mode --> | ||||
|           <div class="custom-control custom-switch mt-4"> | ||||
|             <input type="checkbox" class="custom-control-input" id="night-mode" <?php echo getNightmode() ? 'checked' : null ; ?> > | ||||
|             <label class="custom-control-label" for="night-mode"><i class="far fa-moon mr-1 text-muted"></i></label> | ||||
|           </div> | ||||
|           <div class="topbar-divider d-none d-sm-block"></div> | ||||
|           <!-- Nav Item - User --> | ||||
|           <li class="nav-item dropdown no-arrow"> | ||||
|           <a class="nav-link" href="auth_conf"> | ||||
|             <span class="mr-2 d-none d-lg-inline small"><?php echo htmlspecialchars($config['admin_user'], ENT_QUOTES); ?></span> | ||||
|             <i class="fas fa-user-circle fa-3x"></i> | ||||
|           </a> | ||||
|           </li> | ||||
|         </ul> | ||||
|       </nav> | ||||
|       <!-- End of Topbar --> | ||||
|       <!-- Begin Page Content --> | ||||
|       <div class="container-fluid"> | ||||
|       <?php | ||||
|         $extraFooterScripts = array(); | ||||
|         // handle page actions | ||||
|         switch ($page) { | ||||
|         case "/wlan0_info": | ||||
|             DisplayDashboard($extraFooterScripts); | ||||
|             break; | ||||
|         case "/dhcpd_conf": | ||||
|             DisplayDHCPConfig(); | ||||
|             break; | ||||
|         case "/wpa_conf": | ||||
|             DisplayWPAConfig(); | ||||
|             break; | ||||
|         case "/network_conf": | ||||
|             DisplayNetworkingConfig(); | ||||
|             break; | ||||
|         case "/hostapd_conf": | ||||
|             DisplayHostAPDConfig(); | ||||
|             break; | ||||
|         case "/adblock_conf": | ||||
|             DisplayAdBlockConfig(); | ||||
|             break; | ||||
|         case "/openvpn_conf": | ||||
|             DisplayOpenVPNConfig(); | ||||
|             break; | ||||
|         case "/wg_conf": | ||||
|             DisplayWireGuardConfig(); | ||||
|             break; | ||||
|         case "/torproxy_conf": | ||||
|             DisplayTorProxyConfig(); | ||||
|             break; | ||||
|         case "/torproxy_conf": | ||||
|             DisplayTorProxyConfig(); | ||||
|             break; | ||||
|         case "/auth_conf": | ||||
|             DisplayAuthConfig($config['admin_user'], $config['admin_pass']); | ||||
|             break; | ||||
|         case "/save_hostapd_conf": | ||||
|             SaveTORAndVPNConfig(); | ||||
|             break; | ||||
|         case "/data_use": | ||||
|             DisplayDataUsage($extraFooterScripts); | ||||
|             break; | ||||
|         case "/system_info": | ||||
|             DisplaySystem($extraFooterScripts); | ||||
|             break; | ||||
|         case "/about": | ||||
|             DisplayAbout(); | ||||
|             break; | ||||
|         default: | ||||
|             DisplayDashboard($extraFooterScripts); | ||||
|         } | ||||
|         ?> | ||||
|       </div><!-- /.container-fluid --> | ||||
|     </div><!-- End of Main Content --> | ||||
|     <!-- Footer --> | ||||
|     <footer class="sticky-footer bg-grey-100"> | ||||
|       <div class="container my-auto"> | ||||
|         <div class="copyright text-center my-auto"> | ||||
|           <span></span> | ||||
|         </div> | ||||
|       </div> | ||||
|     </footer> | ||||
|     <!-- End Footer --> | ||||
|     </div><!-- End of Content Wrapper --> | ||||
|         </footer> | ||||
|         <!-- End Footer --> | ||||
|       </div><!-- End of Content Wrapper --> | ||||
|     </div><!-- End of Page Wrapper --> | ||||
|     <!-- Scroll to Top Button--> | ||||
|     <a class="scroll-to-top rounded" href="#page-top" style="display: inline;"> | ||||
| @@ -330,15 +150,6 @@ $bridgedEnabled = getBridgedState(); | ||||
|     <!-- Custom RaspAP JS --> | ||||
|     <script src="app/js/custom.js"></script> | ||||
|  | ||||
|     <?php | ||||
|     // Load non default JS/ECMAScript in footer. | ||||
|     foreach ($extraFooterScripts as $script) { | ||||
|         echo '<script type="text/javascript" src="' , $script['src'] , '"'; | ||||
|         if ($script['defer']) { | ||||
|             echo ' defer="defer"'; | ||||
|         } | ||||
|         echo '></script>' , PHP_EOL; | ||||
|     } | ||||
|     ?> | ||||
|     <?php loadFooterScripts($extraFooterScripts); ?> | ||||
|   </body> | ||||
| </html> | ||||
|   | ||||
							
								
								
									
										19
									
								
								raspap.php
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								raspap.php
									
									
									
									
									
								
							| @@ -1,19 +0,0 @@ | ||||
| <?php | ||||
|  | ||||
| function getConfig() | ||||
| { | ||||
|     $config = array( | ||||
|         'admin_user' => 'admin', | ||||
|         'admin_pass' => '$2y$10$YKIyWAmnQLtiJAy6QgHQ.eCpY4m.HCEbiHaTgN6.acNC6bDElzt.i' | ||||
|     ); | ||||
|  | ||||
|     if (file_exists(RASPI_CONFIG . '/raspap.auth')) { | ||||
|         if ($auth_details = fopen(RASPI_CONFIG . '/raspap.auth', 'r')) { | ||||
|             $config['admin_user'] = trim(fgets($auth_details)); | ||||
|             $config['admin_pass'] = trim(fgets($auth_details)); | ||||
|             fclose($auth_details); | ||||
|         } | ||||
|     } | ||||
|     return $config; | ||||
| } | ||||
|  | ||||
							
								
								
									
										136
									
								
								src/RaspAP/Auth/HTTPAuth.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										136
									
								
								src/RaspAP/Auth/HTTPAuth.php
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,136 @@ | ||||
| <?php | ||||
|  | ||||
| /** | ||||
|  * Authentication class | ||||
|  * | ||||
|  * @description Basic HTTP authentication class for RaspAP | ||||
|  * @author      Bill Zimmerman <billzimmerman@gmail.com> | ||||
|  * @license     https://github.com/raspap/raspap-webgui/blob/master/LICENSE | ||||
|  * @see         https://www.php.net/manual/en/features.http-auth.php | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace RaspAP\Auth; | ||||
|  | ||||
| class HTTPAuth | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * @var string $realm | ||||
|      */ | ||||
|     public $realm = 'Authentication Required'; | ||||
|  | ||||
|     /** | ||||
|      * Stored login credentials | ||||
|      * @var array $auth_config | ||||
|      */ | ||||
|     protected $auth_config; | ||||
|  | ||||
|     /** | ||||
|      * Default login credentials | ||||
|      * @var array $auth_default | ||||
|      */ | ||||
|     private $auth_default = array( | ||||
|         'admin_user' => 'admin', | ||||
|         'admin_pass' => '$2y$10$YKIyWAmnQLtiJAy6QgHQ.eCpY4m.HCEbiHaTgN6.acNC6bDElzt.i' | ||||
|     ); | ||||
|  | ||||
|     // Constructor | ||||
|     public function __construct() | ||||
|     { | ||||
|         $this->auth_config = $this->getAuthConfig(); | ||||
|     } | ||||
|  | ||||
|     /* | ||||
|      * Determines if user is logged in | ||||
|      * return boolean | ||||
|      */ | ||||
|     public function isLogged() | ||||
|     { | ||||
|         return isset($_SESSION['user_id']); | ||||
|     } | ||||
|  | ||||
|     /* | ||||
|      * Authenticate a user using HTTP basic auth | ||||
|      */ | ||||
|     public function authenticate() | ||||
|     { | ||||
|         if (!$this->isLogged()) { | ||||
|             header('HTTP/1.0 401 Unauthorized'); | ||||
|             header('WWW-Authenticate: Basic realm="'.$this->realm.'"'); | ||||
|             if (function_exists('http_response_code')) { | ||||
|                 // http_response_code will respond with proper HTTP version | ||||
|                 http_response_code(401); | ||||
|             } else { | ||||
|                 header('HTTP/1.0 401 Unauthorized'); | ||||
|             } | ||||
|             exit('Not authorized'.PHP_EOL); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /* | ||||
|      * Attempt to login a user with supplied credentials | ||||
|      * @var string $user | ||||
|      * @var string $pass | ||||
|      * return boolean | ||||
|      */ | ||||
|     public function login(string $user, string $pass) | ||||
|     { | ||||
|         if ($this->isValidCredentials($user, $pass)) { | ||||
|             $_SESSION['user_id'] = $user; | ||||
|             return true; | ||||
|         } | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     /* | ||||
|      * Gets the current authentication config | ||||
|      * return array $config | ||||
|      */ | ||||
|     public function getAuthConfig() | ||||
|     { | ||||
|         $config = $this->auth_default; | ||||
|  | ||||
|         if (file_exists(RASPI_CONFIG . '/raspap.auth')) { | ||||
|             if ($auth_details = fopen(RASPI_CONFIG . '/raspap.auth', 'r')) { | ||||
|                 $config['admin_user'] = trim(fgets($auth_details)); | ||||
|                 $config['admin_pass'] = trim(fgets($auth_details)); | ||||
|                 fclose($auth_details); | ||||
|             } | ||||
|         } | ||||
|         return $config; | ||||
|     } | ||||
|  | ||||
|     /* | ||||
|      * Validates a set of credentials | ||||
|      * @var string $user | ||||
|      * @var string $pass | ||||
|      * return boolean | ||||
|      */ | ||||
|     protected function isValidCredentials(string $user, string $pass) | ||||
|     { | ||||
|         return $this->validateUser($user) && $this->validatePassword($pass); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Validates a user | ||||
|      * | ||||
|      * @param string $user | ||||
|      */ | ||||
|     protected function validateUser(string $user) | ||||
|     { | ||||
|         return $user == $this->auth_config['admin_user']; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Validates a password | ||||
|      * | ||||
|      * @param string $pass | ||||
|      */ | ||||
|     protected function validatePassword(string $pass) | ||||
|     { | ||||
|         return password_verify($pass, $this->auth_config['admin_pass']); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -1,5 +1,16 @@ | ||||
| <?php | ||||
| class StatusMessages | ||||
| 
 | ||||
| /** | ||||
|  * Status message class | ||||
|  * | ||||
|  * @description Status message class for RaspAP | ||||
|  * @author      Bill Zimmerman <billzimmerman@gmail.com> | ||||
|  * @license     https://github.com/raspap/raspap-webgui/blob/master/LICENSE | ||||
|  */ | ||||
| 
 | ||||
| namespace RaspAP\Messages; | ||||
| 
 | ||||
| class StatusMessage | ||||
| { | ||||
|     public $messages = array(); | ||||
| 
 | ||||
							
								
								
									
										59
									
								
								app/lib/system.php → src/RaspAP/System/Sysinfo.php
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										59
									
								
								app/lib/system.php → src/RaspAP/System/Sysinfo.php
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @@ -1,7 +1,7 @@ | ||||
| <?php | ||||
| 
 | ||||
| /** | ||||
|  * Sytem info class | ||||
|  * System info class | ||||
|  * | ||||
|  * @description System info class for RaspAP | ||||
|  * @author      Bill Zimmerman <billzimmerman@gmail.com> | ||||
| @@ -92,5 +92,62 @@ class Sysinfo | ||||
|         $kernel = shell_exec("uname -r"); | ||||
|         return $kernel; | ||||
|     } | ||||
| 
 | ||||
|     /* | ||||
|      * Returns RPi Model and PCB Revision from Pi Revision Code (cpuinfo) | ||||
|      * @see http://www.raspberrypi-spy.co.uk/2012/09/checking-your-raspberry-pi-board-version/ | ||||
|      */ | ||||
|     public function rpiRevision() | ||||
|     { | ||||
|         $revisions = array( | ||||
|         '0002' => 'Model B Revision 1.0', | ||||
|         '0003' => 'Model B Revision 1.0 + ECN0001', | ||||
|         '0004' => 'Model B Revision 2.0 (256 MB)', | ||||
|         '0005' => 'Model B Revision 2.0 (256 MB)', | ||||
|         '0006' => 'Model B Revision 2.0 (256 MB)', | ||||
|         '0007' => 'Model A', | ||||
|         '0008' => 'Model A', | ||||
|         '0009' => 'Model A', | ||||
|         '000d' => 'Model B Revision 2.0 (512 MB)', | ||||
|         '000e' => 'Model B Revision 2.0 (512 MB)', | ||||
|         '000f' => 'Model B Revision 2.0 (512 MB)', | ||||
|         '0010' => 'Model B+', | ||||
|         '0013' => 'Model B+', | ||||
|         '0011' => 'Compute Module', | ||||
|         '0012' => 'Model A+', | ||||
|         'a01041' => 'a01041', | ||||
|         'a21041' => 'a21041', | ||||
|         '900092' => 'PiZero 1.2', | ||||
|         '900093' => 'PiZero 1.3', | ||||
|         '9000c1' => 'PiZero W', | ||||
|         'a02082' => 'Pi 3 Model B', | ||||
|         'a22082' => 'Pi 3 Model B', | ||||
|         'a32082' => 'Pi 3 Model B', | ||||
|         'a52082' => 'Pi 3 Model B', | ||||
|         'a020d3' => 'Pi 3 Model B+', | ||||
|         'a220a0' => 'Compute Module 3', | ||||
|         'a020a0' => 'Compute Module 3', | ||||
|         'a02100' => 'Compute Module 3+', | ||||
|         'a03111' => 'Model 4B Revision 1.1 (1 GB)', | ||||
|         'b03111' => 'Model 4B Revision 1.1 (2 GB)', | ||||
|         'c03111' => 'Model 4B Revision 1.1 (4 GB)' | ||||
|         ); | ||||
| 
 | ||||
|         $cpuinfo_array = ''; | ||||
|         exec('cat /proc/cpuinfo', $cpuinfo_array); | ||||
|         $info = preg_grep("/^Revision/", $cpuinfo_array); | ||||
|         $tmp = explode(':', array_pop($info)); | ||||
|         $rev = trim(array_pop($tmp)); | ||||
|         if (array_key_exists($rev, $revisions)) { | ||||
|             return $revisions[$rev]; | ||||
|         } else { | ||||
|             exec('cat /proc/device-tree/model', $model); | ||||
|             if (isset($model[0])) { | ||||
|                 return $model[0]; | ||||
|             } else { | ||||
|                 return 'Unknown Device'; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
							
								
								
									
										6
									
								
								app/lib/uploader.php → src/RaspAP/Uploader/FileUpload.php
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										6
									
								
								app/lib/uploader.php → src/RaspAP/Uploader/FileUpload.php
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @@ -3,8 +3,6 @@ | ||||
| /** | ||||
|  * Simple PHP upload class | ||||
|  * | ||||
|  * Adapted from aivis/PHP-file-upload-class | ||||
|  * | ||||
|  * @description File upload class for RaspAP | ||||
|  * @author      Bill Zimmerman <billzimmerman@gmail.com> | ||||
|  * @author      Aivis Silins | ||||
| @@ -14,7 +12,7 @@ | ||||
| 
 | ||||
| namespace RaspAP\Uploader; | ||||
| 
 | ||||
| class Upload | ||||
| class FileUpload | ||||
| { | ||||
| 
 | ||||
|     /** | ||||
| @@ -110,7 +108,7 @@ class Upload | ||||
|      */ | ||||
|     public static function factory($destination, $root = false) | ||||
|     { | ||||
|         return new Upload($destination, $root); | ||||
|         return new FileUpload($destination, $root); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
| @@ -21,20 +21,35 @@ | ||||
|           </div> | ||||
|           <div class="row"> | ||||
|             <div class="form-group col-md-6"> | ||||
|               <label for="password"><?php echo _("Old password"); ?></label> | ||||
|               <input type="password" class="form-control" name="oldpass"/> | ||||
|               <div class="mb-2"><?php echo _("Old password"); ?></div> | ||||
|               <div class="input-group"> | ||||
|                 <input type="password" class="form-control" name="oldpass"/> | ||||
|                 <div class="input-group-append"> | ||||
|                   <button class="btn btn-light js-toggle-password" type="button" data-target="[name=oldpass]" data-toggle-with="fas fa-eye-slash"><i class="fas fa-eye mx-2"></i></button> | ||||
|                 </div> | ||||
|               </div> | ||||
|             </div> | ||||
|           </div> | ||||
|           <div class="row"> | ||||
|             <div class="form-group col-md-6"> | ||||
|               <label for="password"><?php echo _("New password"); ?></label> | ||||
|               <input type="password" class="form-control" name="newpass"/> | ||||
|               <div class="mb-2"><?php echo _("New password"); ?></div> | ||||
|               <div class="input-group"> | ||||
|                 <input type="password" class="form-control" name="newpass"/> | ||||
|                 <div class="input-group-append"> | ||||
|                   <button class="btn btn-light js-toggle-password" type="button" data-target="[name=newpass]" data-toggle-with="fas fa-eye-slash"><i class="fas fa-eye mx-2"></i></button> | ||||
|                 </div> | ||||
|               </div> | ||||
|             </div> | ||||
|           </div> | ||||
|           <div class="row"> | ||||
|             <div class="form-group col-md-6"> | ||||
|               <label for="password"><?php echo _("Repeat new password"); ?></label> | ||||
|               <input type="password" class="form-control" name="newpassagain"/> | ||||
|               <div class="mb-2"><?php echo _("Repeat new password"); ?></div> | ||||
|               <div class="input-group"> | ||||
|                 <input type="password" class="form-control" name="newpassagain"/> | ||||
|                 <div class="input-group-append"> | ||||
|                   <button class="btn btn-light js-toggle-password" type="button" data-target="[name=newpassagain]" data-toggle-with="fas fa-eye-slash"><i class="fas fa-eye mx-2"></i></button> | ||||
|                 </div> | ||||
|               </div> | ||||
|             </div> | ||||
|           </div> | ||||
|           <input type="submit" class="btn btn-outline btn-primary" name="UpdateAdminPassword" value="<?php echo _("Save settings"); ?>" /> | ||||
|   | ||||
| @@ -1,110 +0,0 @@ | ||||
| <div class="row"> | ||||
|   <div class="col-lg-12"> | ||||
|     <div class="card"> | ||||
|       <div class="card-header"> | ||||
|         <div class="row"> | ||||
|           <div class="col"> | ||||
|             <i class="fas fa-shield-alt mr-2"></i><?php echo _("Firewall"); ?> | ||||
|           </div> | ||||
|         </div><!-- /.row --> | ||||
|       </div><!-- /.card-header --> | ||||
|       <div class="card-body"> | ||||
|         <?php $status->showMessages(); ?> | ||||
|         <h4><?php echo _("Client Firewall"); ?></h4> | ||||
|         <?php if ( $fw_conf["firewall-enable"]) : ?> | ||||
|            <i class="fas fa-circle mr-2 service-status-up"></i><?php echo _("Firewall is ENABLED"); ?> | ||||
|         <?php else : ?> | ||||
|            <i class="fas fa-circle mr-2 service-status-down"></i><?php echo _("Firewall is OFF"); ?> | ||||
|         <?php endif ?> | ||||
|         <div class="row"> | ||||
|           <div class="col-md-6"> | ||||
|             <p class="mr-2"> | ||||
|               <small> | ||||
|                 <?php echo _("The default firewall will only allow outgoing and already established traffic."); ?><br /> | ||||
|                 <?php echo _("No incoming UDP traffic is allowed."); ?><br /> | ||||
|                 <?php printf(_("There are no restrictions for the access point <code>%s</code>."), $ap_device); ?> | ||||
|               </small> | ||||
|             </p> | ||||
|           </div> | ||||
|         </div> | ||||
|         <form id="frm-firewall" action="firewall_conf" method="POST" > | ||||
|           <?php echo CSRFTokenFieldTag(); ?> | ||||
|           <h5><?php echo _("Exception: Service"); ?></h4> | ||||
|           <div class="row"> | ||||
|             <div class="form-group col-md-6"> | ||||
|                 <div class="custom-control custom-switch"> | ||||
|                     <input class="custom-control-input" id="ssh-enable" type="checkbox" name="ssh-enable" value="1" aria-describedby="exception-description" <?php if ($fw_conf["ssh-enable"]) echo "checked"; ?> > | ||||
|                     <label class="custom-control-label" for="ssh-enable"><?php echo _("allow SSH access on port 22") ?></label> | ||||
|                 </div> | ||||
|                 <div class="custom-control custom-switch"> | ||||
|                     <input class="custom-control-input" id="http-enable" type="checkbox" name="http-enable" value="1" aria-describedby="exceptions-description" <?php if ($fw_conf["http-enable"]) echo "checked"; ?> > | ||||
|                     <label class="custom-control-label" for="http-enable"><?php echo _("allow access to the RaspAP GUI on port 80 or 443") ?></label> | ||||
|                 </div> | ||||
|                 <p class="mb-0" id="exceptions-description"> | ||||
|                     <small><?php echo _("Allow incoming connections for some services from the internet side.") ?></small> | ||||
|                 </p> | ||||
|             </div> | ||||
|           </div> | ||||
|           <h5><?php echo _("Exception: network device"); ?></h4> | ||||
|           <div class="row"> | ||||
|             <div class="form-group col-md-6"> | ||||
|                 <label for="excl-device"><?php echo _("Exclude device(s)") ?></label> | ||||
|                 <input class="form-control" id="excl-devices" type="text" name="excl-devices" value="<?php echo $fw_conf["excl-devices"] ?>" aria-describedby="exclusion-description"  > | ||||
|                 <p class="mb-0" id="exclusion-description"> | ||||
|                   <small> | ||||
|                     <?php echo _("Exclude the given network device(s) (separated by a blank or comma) from firewall rules."); ?><br /> | ||||
|                     <?php printf(_("Current client devices: <code>%s</code>"), $str_clients); ?><br /> | ||||
|                     <?php printf(_("The access point <code>%s</code> is per default excluded."), $ap_device); ?> | ||||
|                   </small> | ||||
|                 </p> | ||||
|             </div> | ||||
|           </div> | ||||
|           <h5><?php echo _("Exception: IP-Address"); ?></h4> | ||||
|           <div class="row"> | ||||
|             <div class="form-group col-md-6"> | ||||
|                 <label for="excluded-ips"><?php echo _("Allow incoming connections from") ?></label> | ||||
|                 <input class="form-control" id="excluded-ips" type="text" name="excluded-ips" value="<?php echo $fw_conf["excluded-ips"] ?>" aria-describedby="excl-ips-description"  > | ||||
|                 <p class="mb-0" id="excl-ips-description"> | ||||
|                   <small> | ||||
|                     <?php echo _("For the given IP-addresses (separated by a blank or comma) the incoming connection (via TCP and UDP) is accepted."); ?><br /> | ||||
|                     <?php echo _("This is required for an OpenVPN via UDP or Wireguard connection."); ?><br /> | ||||
|                     <?php if ( !empty($vpn_ips) ) printf (_("The list of configured VPN server IP addresses: <code><b>%s</b></code>"), $vpn_ips); ?> | ||||
|                   </small> | ||||
|                 </p> | ||||
|             </div> | ||||
|           </div> | ||||
|           <?php if ($fw_conf["firewall-enable"]) : ?> | ||||
|               <input type="submit" class="btn btn-outline btn-primary" value="<?php echo _("Apply changes"); ?>" name="apply-firewall" /> | ||||
|               <input type="submit" class="btn btn-warning firewall-apply" value="<?php echo _("Disable Firewall") ?>"  name="firewall-disable" data-toggle="modal" data-target="#firewallModal"/> | ||||
|           <?php else : ?> | ||||
|               <input type="submit" class="btn btn-outline btn-primary" value="<?php echo _("Save settings"); ?>" name="save-firewall" /> | ||||
|               <input type="submit" class="btn btn-success firewall-apply" value="<?php echo _("Enable Firewall") ?>" name="firewall-enable" data-toggle="modal" data-target="#firewallModal"/> | ||||
|           <?php endif ?> | ||||
|         </form> | ||||
|       </div><!-- /.card-body --> | ||||
|       <div class="card-footer"></div> | ||||
|     </div><!-- /.card --> | ||||
|   </div><!-- /.col-lg-12 --> | ||||
| </div><!-- /.row --> | ||||
|  | ||||
| <!-- Modal --> | ||||
| <div class="modal fade" id="firewallModal" tabindex="-1" role="dialog" aria-labelledby="ModalLabel" aria-hidden="true"> | ||||
|   <div class="modal-dialog" role="document"> | ||||
|     <div class="modal-content"> | ||||
|       <div class="modal-header"> | ||||
|         <div class="modal-title" id="ModalLabel"> | ||||
|           <i class="fas fa-sync-alt mr-2"></i><?php echo _("Executing firewall option") ?> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="modal-body"> | ||||
|         <div class="col-md-12 mb-3 mt-1"> | ||||
|           <?php if($fw_conf["firewall-enable"]) echo _("Disabling firewall").'...'; else echo _("Enabling firewall").'...'; ?> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="modal-footer"> | ||||
|         <button type="button" class="btn btn-outline btn-primary" data-dismiss="modal"><?php echo _("Close"); ?></button> | ||||
|       </div> | ||||
|     </div> | ||||
|   </div> | ||||
| </div> | ||||
|  | ||||
| @@ -14,7 +14,7 @@ include('includes/sysstats.php'); | ||||
|               <div class="info-item col-xs-3"><?php echo _("Hostname"); ?></div><div class="info-value col-xs-3"><?php echo htmlspecialchars($hostname, ENT_QUOTES); ?></div> | ||||
|             </div> | ||||
|             <div class="row mb-1"> | ||||
|               <div class="info-item col-xs-3"><?php echo _("Pi Revision"); ?></div><div class="info-value col-xs-3"><?php echo htmlspecialchars(RPiVersion(), ENT_QUOTES); ?></div> | ||||
|               <div class="info-item col-xs-3"><?php echo _("Pi Revision"); ?></div><div class="info-value col-xs-3"><?php echo htmlspecialchars($revision, ENT_QUOTES); ?></div> | ||||
|             </div> | ||||
|             <div class="row mb-1"> | ||||
|               <div class="info-item col-xs-3"><?php echo _("OS"); ?></div><div class="info-value col-xs-3"><?php echo htmlspecialchars($os, ENT_QUOTES); ?></div> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user