kopia lustrzana https://github.com/jprochazka/adsb-receiver
				
				
				
			Web admin login and password change added.
							rodzic
							
								
									58f3546c82
								
							
						
					
					
						commit
						fd14a859c7
					
				|  | @ -0,0 +1,72 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  |     session_start(); | ||||||
|  | 
 | ||||||
|  |     echo "Authenticated: ".$_SESSION['authenticated'].'<br />'; | ||||||
|  |     echo "Login: ".$_SESSION['login'].'<br />'; | ||||||
|  |     echo "First Login: ".$_SESSION['firstLogin'].'<br />'; | ||||||
|  | 
 | ||||||
|  |     // Load the require PHP classes.
 | ||||||
|  |     require_once('classes/common.class.php'); | ||||||
|  |     require_once('classes/account.class.php'); | ||||||
|  | 
 | ||||||
|  |     $common = new common(); | ||||||
|  |     $account = new account(); | ||||||
|  | 
 | ||||||
|  |     // Check if the user is logged in.
 | ||||||
|  |     if (!$account->isAuthenticated()) { | ||||||
|  |         // The user is not logged in so forward them to the login page.
 | ||||||
|  |         header ("Location: login.php?origin=".urlencode('account.php')); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if ($common->postBack()) { | ||||||
|  | 
 | ||||||
|  |         echo "POSTBACK!"; | ||||||
|  | 
 | ||||||
|  |         // Check that the user supplied a password matching the one currently stored in administrators.xml.
 | ||||||
|  |         $authenticated = $account->authenticate($_SESSION['login'], $_POST['password'], FALSE, FALSE); | ||||||
|  |         // Check that the supplied passwords match.
 | ||||||
|  |         if ($authenticated && $_POST['password1'] == $_POST['password2']) { | ||||||
|  | 
 | ||||||
|  |             echo "AUTHENTICATED!"; | ||||||
|  | 
 | ||||||
|  |             // Change the password stored in administrators.xml related to this users login.
 | ||||||
|  |             $account->changePassword($_SESSION['login'], $_POST['password1']); | ||||||
|  |             // Since the password has changed we will log the user out to clear older session variables.
 | ||||||
|  |             $account->logout(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     require_once('includes/header.include.php'); | ||||||
|  | 
 | ||||||
|  |     /////////////////////
 | ||||||
|  |     // BEGIN HTML BODY //
 | ||||||
|  | 
 | ||||||
|  | ?>
 | ||||||
|  |         <div>You must change your current password before continuing.</div> | ||||||
|  |         <div>The password for this account has been changed successfully.</div> | ||||||
|  |         <div>You must supply the correct current password for this account.</div> | ||||||
|  |         <div>The passwords supplied for the new password did not match.</div> | ||||||
|  | 
 | ||||||
|  |         <form method="post" action="account.php"> | ||||||
|  |             <div> | ||||||
|  |                 <label for="password">Current Password:</label> | ||||||
|  |                 <input type="password" name="password"> | ||||||
|  |             </div> | ||||||
|  |             <div> | ||||||
|  |                 <label for="password1">New Password:</label> | ||||||
|  |                 <input type="password" name="password1"> | ||||||
|  |             </div> | ||||||
|  |             <div> | ||||||
|  |                 <label for="password2">Confirm Password:</label> | ||||||
|  |                 <input type="password" name="password2"> | ||||||
|  |             </div> | ||||||
|  |             <input type="submit" value="Change Password"> | ||||||
|  |         </form> | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  |     // END HTML BODY //
 | ||||||
|  |     ///////////////////
 | ||||||
|  | 
 | ||||||
|  |     require_once('includes/footer.include.php'); | ||||||
|  | ?>
 | ||||||
|  | @ -0,0 +1,97 @@ | ||||||
|  | <?php | ||||||
|  |     class account { | ||||||
|  | 
 | ||||||
|  |         /////////////////////////////////////////////////////////
 | ||||||
|  |         // Check if the administrator is authenticated or not.
 | ||||||
|  | 
 | ||||||
|  |         function isAuthenticated() { | ||||||
|  |             // Check if the remeber me cookie is set and if so set sessions variables using the stored values.
 | ||||||
|  |             if (isset($_COOKIE['login']) && isset($_COOKIE['authenticated']) && isset($_COOKIE['firstLogin']) && $_COOKIE['authenticated']) { | ||||||
|  |                 $_SESSION['authenticated'] = TRUE; | ||||||
|  |                 $_SESSION['login'] = $_COOKIE['login']; | ||||||
|  |                 $_SESSION['firstLogin'] = $_COOKIE['firstLogin']; | ||||||
|  |             } else { | ||||||
|  |                 // Unset any cookies pertaining to user authentication since something is wrong or missing.
 | ||||||
|  |                 unset($_COOKIE["authenticated"]); | ||||||
|  |                 unset($_COOKIE["login"]); | ||||||
|  |                 unset($_COOKIE["firstLogin"]); | ||||||
|  |             } | ||||||
|  |             // Make sure that the session variable Authenticated is set to TRUE and that the session Login variable is set.
 | ||||||
|  |             if (isset($_SESSION['login']) && isset($_SESSION['authenticated']) && isset($_SESSION['firstLogin']) && $_SESSION['authenticated']) { | ||||||
|  |                 if ($_SESSION['firstLogin'] && basename($_SERVER['PHP_SELF']) != "account.php") { | ||||||
|  |                     header ("Location: account.php"); | ||||||
|  |                 } | ||||||
|  |                 return TRUE; | ||||||
|  |             } | ||||||
|  |             return FALSE; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||||
|  |         // Authenticate an administrator by comparing their supplied login and password with the ones stored in administrators.xml.
 | ||||||
|  | 
 | ||||||
|  |         function authenticate($login, $password, $remember = FALSE, $forward = TRUE, $origin = NULL) { | ||||||
|  |             $common = new common(); | ||||||
|  |             // Get all the administrators from the administrators.xml file.
 | ||||||
|  |             $administrators = simplexml_load_file("../data/administrators.xml") or die("Error: Cannot create administrators object"); | ||||||
|  |             foreach ($administrators as $administrator) { | ||||||
|  |                 // If or when we get to a matching login compare the supplied password to the one stored inadministrators.xml.
 | ||||||
|  |                 if ($administrator->login == $login) { | ||||||
|  |                     if (password_verify($password, $administrator->password)) { | ||||||
|  |                         // Set the session variable Authenticated to TRUE and assign the variable Login the supplied login.
 | ||||||
|  |                         $_SESSION['authenticated'] = TRUE; | ||||||
|  |                         $_SESSION['login'] = $login; | ||||||
|  |                         $_SESSION['firstLogin'] = $common->stringToBoolean($administrator->firstLogin); | ||||||
|  |                         // If the user wishes to be remembered set a cookie containg the authenticated and login variables.
 | ||||||
|  |                         if ($remember) { | ||||||
|  |                             setcookie("authenticated", TRUE, time() + (10 * 365 * 24 * 60 * 60)); | ||||||
|  |                             setcookie("login", $login, time() + (10 * 365 * 24 * 60 * 60)); | ||||||
|  |                             setcookie("firstLogin", $common->stringToBoolean($administrator->firstLogin), time() + (10 * 365 * 24 * 60 * 60)); | ||||||
|  |                         } | ||||||
|  |                         // Forward the user if the $forward variable is set to TRUE.
 | ||||||
|  |                         if ($forward) { | ||||||
|  |                             if (isset($origin)) { | ||||||
|  |                                 // Redirect the authenticated visitor to their original destination.
 | ||||||
|  |                                 header ("Location: ".urldecode($origin)); | ||||||
|  |                             } else { | ||||||
|  |                                 // Redirect the user to the administration homepage.
 | ||||||
|  |                                 header ("Location: index.php"); | ||||||
|  |                             } | ||||||
|  |                         } | ||||||
|  |                         return TRUE; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             // If things got this far authentication failed.
 | ||||||
|  |             return FALSE; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         //////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||||
|  |         // Logs the user out by deleting current session varialbes related to administrative functions.
 | ||||||
|  | 
 | ||||||
|  |         function logout() { | ||||||
|  |             // Unset any session variables pertaining to user authentication.
 | ||||||
|  |             unset($_SESSION['authenticated']); | ||||||
|  |             unset($_SESSION['login']); | ||||||
|  |             unset($_SESSION['firstLogin']); | ||||||
|  |             // Unset any cookies pertaining to user authentication.
 | ||||||
|  |             unset($_COOKIE["authenticated"]); | ||||||
|  |             unset($_COOKIE["login"]); | ||||||
|  |             unset($_COOKIE["firstLogin"]); | ||||||
|  |             // Redirect the user to the main homepage.
 | ||||||
|  |             header ("Location: login.php"); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         ////////////////////////////////////////////////////////////////////////////////////////////
 | ||||||
|  |         // Change a password stored for an existing administrator in the file administrators.xml.
 | ||||||
|  | 
 | ||||||
|  |         function changePassword($login, $password) { | ||||||
|  |             $administrators = simplexml_load_file("../data/administrators.xml") or die("Error: Cannot create administrators object"); | ||||||
|  |             foreach ($administrators->xpath("administrator[login='".$login."']") as $administrator) { | ||||||
|  |                 $administrator->password = password_hash($password, PASSWORD_DEFAULT); | ||||||
|  |                 $administrator->firstLogin = "FALSE"; | ||||||
|  |             } | ||||||
|  |             file_put_contents("../data/administrators.xml", $administrators->asXML()); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | ?>
 | ||||||
|  | @ -0,0 +1,32 @@ | ||||||
|  | <?php | ||||||
|  |      class common { | ||||||
|  | 
 | ||||||
|  |         ////////////////////////////////////////
 | ||||||
|  |         // Check if page load is a post back.
 | ||||||
|  | 
 | ||||||
|  |         function postBack() { | ||||||
|  |             if (empty($_SERVER['HTTP_REFERER'])) { | ||||||
|  |                 return FALSE; | ||||||
|  |             } | ||||||
|  |             $methodUsed = strtoupper($_SERVER['REQUEST_METHOD']); | ||||||
|  |             $referer = strtolower(basename($_SERVER['HTTP_REFERER'])); | ||||||
|  |             $thisScript = strtolower(basename($_SERVER['SCRIPT_NAME'])); | ||||||
|  |             if ($methodUsed == 'POST' && $referer == $thisScript) { | ||||||
|  |                 return TRUE; | ||||||
|  |             } | ||||||
|  |             return FALSE; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         /////////////////////////////////////
 | ||||||
|  |         // Return a boolean from a string.
 | ||||||
|  | 
 | ||||||
|  |         function stringToBoolean($value) { | ||||||
|  |             switch(strtoupper($value)) { | ||||||
|  |                 case 'TRUE': return TRUE; | ||||||
|  |                 case 'FALSE': return FALSE; | ||||||
|  |                 default: return NULL; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |      } | ||||||
|  | ?>
 | ||||||
|  | @ -0,0 +1,4 @@ | ||||||
|  |         <script type="text/javascript" src="//code.jquery.com/jquery-2.1.4.min.js"></script> | ||||||
|  |         <script type="text/javascript" src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script> | ||||||
|  |     </body> | ||||||
|  | </html> | ||||||
|  | @ -0,0 +1,9 @@ | ||||||
|  | <!DOCTYPE html> | ||||||
|  | <html lang="en"> | ||||||
|  |     <head> | ||||||
|  |         <meta charset="utf-8" /> | ||||||
|  |         <title></title> | ||||||
|  |         <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" /> | ||||||
|  |         <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap-theme.min.css" /> | ||||||
|  |     </head> | ||||||
|  |     <body> | ||||||
|  | @ -0,0 +1,32 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  |     session_start(); | ||||||
|  | 
 | ||||||
|  |     // Load the require PHP classes.
 | ||||||
|  |     require_once('classes/common.class.php'); | ||||||
|  |     require_once('classes/account.class.php'); | ||||||
|  | 
 | ||||||
|  |     $common = new common(); | ||||||
|  |     $account = new account(); | ||||||
|  | 
 | ||||||
|  |     // Check if the user is logged in.
 | ||||||
|  |     if (!$account->isAuthenticated()) { | ||||||
|  |         // The user is not logged in so forward them to the login page.
 | ||||||
|  |         header ("Location: login.php"); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     echo "Authenticated: ".$_SESSION['authenticated'].'<br />'; | ||||||
|  |     echo "Login: ".$_SESSION['login'].'<br />'; | ||||||
|  |     echo "First Login: ".$_SESSION['firstLogin'].'<br />'; | ||||||
|  | ?>
 | ||||||
|  | 
 | ||||||
|  | <!DOCTYPE html> | ||||||
|  | <html lang="en"> | ||||||
|  |     <head> | ||||||
|  |         <meta charset="utf-8" /> | ||||||
|  |         <title></title> | ||||||
|  |     </head> | ||||||
|  |     <body> | ||||||
|  |         index.php | ||||||
|  |     </body> | ||||||
|  | </html> | ||||||
|  | @ -0,0 +1,86 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  |     ///////////////////////////////
 | ||||||
|  |     // Default Login Information //
 | ||||||
|  |     ///////////////////////////////
 | ||||||
|  |     // Login: admin              //
 | ||||||
|  |     // Password: adsbfeeder      //
 | ||||||
|  |     ///////////////////////////////
 | ||||||
|  | 
 | ||||||
|  |     session_start(); | ||||||
|  | 
 | ||||||
|  |     // Load the require PHP classes.
 | ||||||
|  |     require_once('classes/common.class.php'); | ||||||
|  |     require_once('classes/account.class.php'); | ||||||
|  | 
 | ||||||
|  |     $common = new common(); | ||||||
|  |     $account = new account(); | ||||||
|  | 
 | ||||||
|  |     // Check if the user is already logged in.
 | ||||||
|  |     if ($account->isAuthenticated()) { | ||||||
|  |         if (isset($_REQUEST['origin'])) { | ||||||
|  |             // Redirect the authenticated visitor to their original destination.
 | ||||||
|  |             header ("Location: ".urldecode($_REQUEST['origin'])); | ||||||
|  |         } else { | ||||||
|  |             // Redirect the user to the administration homepage.
 | ||||||
|  |             header ("Location: index.php"); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if ($common->postBack()) { | ||||||
|  |         // Try to authenticate the user using the credentials supplied.
 | ||||||
|  |         $remember = (isset($_POST['remember']) ? TRUE : FALSE); | ||||||
|  |         $origin = (isset($_REQUEST['origin']) ? $_REQUEST['origin'] : NULL); | ||||||
|  |         $authenticated = $account->authenticate($_POST['login'], $_POST['password'], $remember, TRUE, $origin); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /////////////////////
 | ||||||
|  |     // BEGIN HTML BODY //
 | ||||||
|  | 
 | ||||||
|  | ?>
 | ||||||
|  | <!DOCTYPE html> | ||||||
|  | <html lang="en"> | ||||||
|  |     <head> | ||||||
|  |         <meta charset="utf-8" /> | ||||||
|  |         <title></title> | ||||||
|  |         <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" /> | ||||||
|  |         <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap-theme.min.css" /> | ||||||
|  |         <link rel="stylesheet" href="../assets/css/admin.login.css" /> | ||||||
|  |     </head> | ||||||
|  |     <body> | ||||||
|  |         <div class="container"> | ||||||
|  | <?php | ||||||
|  |     // If authentication failed display the following error message.
 | ||||||
|  |     if ($common->postBack() && !$authenticated) { | ||||||
|  | ?>
 | ||||||
|  |             <div>The supplied login and/or password did not match.</div> | ||||||
|  | <?php | ||||||
|  |     } | ||||||
|  | ?>
 | ||||||
|  |             <form class="form-signin" method="post" action="login.php"> | ||||||
|  |                 <h2 class="form-signin-heading">ADS-B Feeder Login</h2> | ||||||
|  |                 <div> | ||||||
|  |                     <label for="login" class="sr-only">Login</label> | ||||||
|  |                     <input type="text" id="login" name="login" class="form-control" placeholder="Login" required autofocus> | ||||||
|  |                 </div> | ||||||
|  |                 <div> | ||||||
|  |                     <label for="password" class="sr-only">Password</label> | ||||||
|  |                     <input type="password" id="password" name="password" class="form-control" placeholder="Password" required autofocus> | ||||||
|  |                 </div> | ||||||
|  |                 <div class="checkbox"> | ||||||
|  |                     <label> | ||||||
|  |                         <input type="checkbox" name="remember" value="TRUE"> Remember me | ||||||
|  |                     </label> | ||||||
|  |                 </div> | ||||||
|  |                 <input type="submit" value="Login" class="btn btn-lg btn-primary btn-block"> | ||||||
|  |             </form> | ||||||
|  |         </div> | ||||||
|  |         <script type="text/javascript" src="//code.jquery.com/jquery-2.1.4.min.js"></script> | ||||||
|  |         <script type="text/javascript" src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script> | ||||||
|  |     </body> | ||||||
|  | </html> | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  |     // END HTML BODY //
 | ||||||
|  |     ///////////////////
 | ||||||
|  | ?>
 | ||||||
|  | @ -0,0 +1,38 @@ | ||||||
|  | body { | ||||||
|  |   padding-top: 40px; | ||||||
|  |   padding-bottom: 40px; | ||||||
|  |   background-color: #eee; | ||||||
|  | } | ||||||
|  | .form-signin { | ||||||
|  |   max-width: 330px; | ||||||
|  |   padding: 15px; | ||||||
|  |   margin: 0 auto; | ||||||
|  | } | ||||||
|  | .form-signin .form-signin-heading, .form-signin .checkbox { | ||||||
|  |   margin-bottom: 10px; | ||||||
|  | } | ||||||
|  | .form-signin .checkbox { | ||||||
|  |   font-weight: normal; | ||||||
|  | } | ||||||
|  | .form-signin .form-control { | ||||||
|  |   position: relative; | ||||||
|  |   height: auto; | ||||||
|  |   -webkit-box-sizing: border-box; | ||||||
|  |      -moz-box-sizing: border-box; | ||||||
|  |           box-sizing: border-box; | ||||||
|  |   padding: 10px; | ||||||
|  |   font-size: 16px; | ||||||
|  | } | ||||||
|  | .form-signin .form-control:focus { | ||||||
|  |   z-index: 2; | ||||||
|  | } | ||||||
|  | .form-signin input[type="email"] { | ||||||
|  |   margin-bottom: -1px; | ||||||
|  |   border-bottom-right-radius: 0; | ||||||
|  |   border-bottom-left-radius: 0; | ||||||
|  | } | ||||||
|  | .form-signin input[type="password"] { | ||||||
|  |   margin-bottom: 10px; | ||||||
|  |   border-top-left-radius: 0; | ||||||
|  |   border-top-right-radius: 0; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,7 @@ | ||||||
|  | <?xml version="1.0" encoding="utf-8"?> <administrators> | ||||||
|  |     <administrator> | ||||||
|  |         <login>admin</login> | ||||||
|  |         <password>$2y$10$uDSOA6NhbgmtMAiNp.QAROD/PG6RUQE/m0xp6fRgo5/TBkMWxReBq</password> | ||||||
|  |         <firstLogin>TRUE</firstLogin> | ||||||
|  |     </administrator> | ||||||
|  | </administrators> | ||||||
		Ładowanie…
	
		Reference in New Issue
	
	 Joe Prochazka
						Joe Prochazka