Merge branch 'dev' of https://git.steelants.cz/JonatanRek/PHP_SMART_HOME_V3
This commit is contained in:
		@@ -24,7 +24,7 @@
 | 
				
			|||||||
[](https://github.com/GamerClassN7/Smart_Home/search?l=js)
 | 
					[](https://github.com/GamerClassN7/Smart_Home/search?l=js)
 | 
				
			||||||
[](https://github.com/GamerClassN7/Smart_Home/search?l=html)
 | 
					[](https://github.com/GamerClassN7/Smart_Home/search?l=html)
 | 
				
			||||||
[](https://opensource.org/licenses/MIT)
 | 
					[](https://opensource.org/licenses/MIT)
 | 
				
			||||||
[](https://discord.gg/6BPErAS)
 | 
					[](https://discord.gg/XJpT3UQ)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<!-- ABOUT THE PROJECT -->
 | 
					<!-- ABOUT THE PROJECT -->
 | 
				
			||||||
## About Smart_Home
 | 
					## About Smart_Home
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -141,7 +141,7 @@ CREATE TABLE `users` (
 | 
				
			|||||||
  `username` varchar(255) NOT NULL,
 | 
					  `username` varchar(255) NOT NULL,
 | 
				
			||||||
  `password` varchar(255) NOT NULL,
 | 
					  `password` varchar(255) NOT NULL,
 | 
				
			||||||
  `startPage` int(11) NOT NULL,
 | 
					  `startPage` int(11) NOT NULL,
 | 
				
			||||||
  `at_home` varchar(255) NOT NULL
 | 
					  `at_home` varchar(255) NOT NULL DEFAULT 'false'
 | 
				
			||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -172,10 +172,5 @@ class UserManager
 | 
				
			|||||||
			return false;
 | 
								return false;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					 | 
				
			||||||
	public function setOta($code, $secret){
 | 
					 | 
				
			||||||
		$userId = $_SESSION['user']['id'];
 | 
					 | 
				
			||||||
		Db::edit ('users', ['ota' => $secret], 'WHERE user_id = ?', array($userId));
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
?>
 | 
					?>
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										17
									
								
								app/controls/settings.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								app/controls/settings.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					if (isset($_POST) && !empty($_POST)){
 | 
				
			||||||
 | 
						if (isset($_POST['submitPasswordChange']) && $_POST['submitPasswordChange'] != "") {
 | 
				
			||||||
 | 
							$oldPassword = $_POST['oldPassword'];
 | 
				
			||||||
 | 
							$newPassword = $_POST['newPassword1'];
 | 
				
			||||||
 | 
							$newPassword2 = $_POST['newPassword2'];
 | 
				
			||||||
 | 
							UserManager::changePassword($oldPassword, $newPassword, $newPassword2);
 | 
				
			||||||
 | 
							header('Location: ' . BASEDIR . 'logout');
 | 
				
			||||||
 | 
							die();
 | 
				
			||||||
 | 
						} else if (isset($_POST['submitCreateUser']) && $_POST['submitCreateUser'] != "") {
 | 
				
			||||||
 | 
							$userName = $_POST['userName'];
 | 
				
			||||||
 | 
							$password = $_POST['userPassword'];
 | 
				
			||||||
 | 
							UserManager::createUser($userName, $password);
 | 
				
			||||||
 | 
							header('Location: ' . BASEDIR . 'setting');
 | 
				
			||||||
 | 
							die();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -18,10 +18,16 @@ return $lang = [
 | 
				
			|||||||
	'b_create' => 'Vytvořit',
 | 
						'b_create' => 'Vytvořit',
 | 
				
			||||||
	'b_edit' => 'Upravit',
 | 
						'b_edit' => 'Upravit',
 | 
				
			||||||
	'b_remove' => 'Smazat',
 | 
						'b_remove' => 'Smazat',
 | 
				
			||||||
 | 
						'b_finish' => 'Dokončit',
 | 
				
			||||||
	'b_approve' => 'Povolit',
 | 
						'b_approve' => 'Povolit',
 | 
				
			||||||
	'b_disable' => 'Zakázat',
 | 
						'b_disable' => 'Zakázat',
 | 
				
			||||||
	'b_save' => 'Uložit',
 | 
						'b_save' => 'Uložit',
 | 
				
			||||||
 | 
						'b_logOut' => 'Odhlásit',
 | 
				
			||||||
 | 
						'b_sendTestNotification' => 'Odeslat testovací notifikaci',
 | 
				
			||||||
 | 
						'b_rooms' => 'Místnosti',
 | 
				
			||||||
 | 
						'b_restart' => 'Restart',
 | 
				
			||||||
 | 
						'b_disable' => 'Deaktivovat',
 | 
				
			||||||
 | 
						'b_select' => 'Zvolit',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//labels
 | 
						//labels
 | 
				
			||||||
	'l_choseDevice' => 'Zvolte zařízení:',
 | 
						'l_choseDevice' => 'Zvolte zařízení:',
 | 
				
			||||||
@@ -46,14 +52,24 @@ return $lang = [
 | 
				
			|||||||
	'l_atHome' => 'Doma Jsou',
 | 
						'l_atHome' => 'Doma Jsou',
 | 
				
			||||||
	'l_nameAt' => 'Název',
 | 
						'l_nameAt' => 'Název',
 | 
				
			||||||
	'l_lastSeen' => 'Naposledy připojeno',
 | 
						'l_lastSeen' => 'Naposledy připojeno',
 | 
				
			||||||
 | 
						'l_notificationStatus' => 'Notification status',
 | 
				
			||||||
 | 
						'l_userName' => 'Uživatelské jméno',
 | 
				
			||||||
 | 
						'l_password' => 'Heslo',
 | 
				
			||||||
 | 
						'l_oldPassword' => 'Staré Heslo',
 | 
				
			||||||
 | 
						'l_newPassword' => 'Nové Heslo',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//Title
 | 
						//Title
 | 
				
			||||||
	't_createScene' => 'Vytvořit scénu',
 | 
						't_createScene' => 'Vytvořit scénu',
 | 
				
			||||||
	't_editScene' => 'Upravit scénu',
 | 
						't_editScene' => 'Upravit scénu',
 | 
				
			||||||
 | 
					 | 
				
			||||||
	't_createAutomation' => 'Vytvořit Automatizaci',
 | 
						't_createAutomation' => 'Vytvořit Automatizaci',
 | 
				
			||||||
 | 
						't_addDevice' => 'Přidat Zařízení',
 | 
				
			||||||
	't_editDevice' => 'Upravit Zařízení',
 | 
						't_editDevice' => 'Upravit Zařízení',
 | 
				
			||||||
 | 
						't_pageAfterLogIn' => 'stránka po přihlášení',
 | 
				
			||||||
 | 
						't_profile' => 'Profil',
 | 
				
			||||||
 | 
						't_notification' => 'Notificatifikace',
 | 
				
			||||||
 | 
						't_experimental' => 'Experimental',
 | 
				
			||||||
 | 
						't_createuser' => 'Vytvořit Uživatele',
 | 
				
			||||||
 | 
						't_changePassword' => 'Změnit Heslo',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//constants
 | 
						//constants
 | 
				
			||||||
	'temp' => 'Teplota',
 | 
						'temp' => 'Teplota',
 | 
				
			||||||
@@ -74,6 +90,21 @@ return $lang = [
 | 
				
			|||||||
	'w_neni' => 'Není',
 | 
						'w_neni' => 'Není',
 | 
				
			||||||
	'w_is' => 'je',
 | 
						'w_is' => 'je',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//tables
 | 
				
			||||||
 | 
						't_time' => 'Čas',
 | 
				
			||||||
 | 
						't_state' => 'Stav',
 | 
				
			||||||
 | 
						't_userName' => 'Uživatelské Jméno',
 | 
				
			||||||
 | 
						't_action' => 'Akce',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//Days Long
 | 
				
			||||||
 | 
						'd_monday' => 'Pondělí',
 | 
				
			||||||
 | 
						'd_tuesday' => 'Ůterí',
 | 
				
			||||||
 | 
						'd_wednesday' => 'Středa',
 | 
				
			||||||
 | 
						'd_thursday' => 'Čtvrtek',
 | 
				
			||||||
 | 
						'd_friday' => 'Pátek',
 | 
				
			||||||
 | 
						'd_saturday' => 'Sobota',
 | 
				
			||||||
 | 
						'd_sunday' => 'Neděle',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//example
 | 
						//example
 | 
				
			||||||
	'' => '',
 | 
						'' => '',
 | 
				
			||||||
];
 | 
					];
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,7 +29,6 @@ return $lang = [
 | 
				
			|||||||
	'b_disable' => 'disabele',
 | 
						'b_disable' => 'disabele',
 | 
				
			||||||
	'b_select' => 'Select',
 | 
						'b_select' => 'Select',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
	//labels
 | 
						//labels
 | 
				
			||||||
	'l_choseDevice' => 'Chose device:',
 | 
						'l_choseDevice' => 'Chose device:',
 | 
				
			||||||
	'l_inHome' => 'When entering',
 | 
						'l_inHome' => 'When entering',
 | 
				
			||||||
@@ -54,6 +53,10 @@ return $lang = [
 | 
				
			|||||||
	'l_nameAt' => 'Name',
 | 
						'l_nameAt' => 'Name',
 | 
				
			||||||
	'l_lastSeen' => 'Last Seen',
 | 
						'l_lastSeen' => 'Last Seen',
 | 
				
			||||||
	'l_notificationStatus' => 'Notification status',
 | 
						'l_notificationStatus' => 'Notification status',
 | 
				
			||||||
 | 
						'l_userName' => 'Username',
 | 
				
			||||||
 | 
						'l_password' => 'Password',
 | 
				
			||||||
 | 
						'l_oldPassword' => 'Old Password',
 | 
				
			||||||
 | 
						'l_newPassword' => 'New Password',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//Title
 | 
						//Title
 | 
				
			||||||
	't_createScene' => 'Create Scene',
 | 
						't_createScene' => 'Create Scene',
 | 
				
			||||||
@@ -65,6 +68,8 @@ return $lang = [
 | 
				
			|||||||
	't_profile' => 'Profile',
 | 
						't_profile' => 'Profile',
 | 
				
			||||||
	't_notification' => 'Notification',
 | 
						't_notification' => 'Notification',
 | 
				
			||||||
	't_experimental' => 'Experimental',
 | 
						't_experimental' => 'Experimental',
 | 
				
			||||||
 | 
						't_createuser' => 'Create User',
 | 
				
			||||||
 | 
						't_changePassword' => 'Change Password',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//constants
 | 
						//constants
 | 
				
			||||||
	'humi' => 'Humidity',
 | 
						'humi' => 'Humidity',
 | 
				
			||||||
@@ -88,6 +93,8 @@ return $lang = [
 | 
				
			|||||||
	//tables
 | 
						//tables
 | 
				
			||||||
	't_time' => 'Time',
 | 
						't_time' => 'Time',
 | 
				
			||||||
	't_state' => 'State',
 | 
						't_state' => 'State',
 | 
				
			||||||
 | 
						't_userName' => 'State',
 | 
				
			||||||
 | 
						't_action' => 'Action',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//Days Long
 | 
						//Days Long
 | 
				
			||||||
	'd_monday' => 'Monday',
 | 
						'd_monday' => 'Monday',
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,6 +18,7 @@ return $lang = [
 | 
				
			|||||||
	'b_create' => 'Utwórz',
 | 
						'b_create' => 'Utwórz',
 | 
				
			||||||
	'b_edit' => 'Edytuj',
 | 
						'b_edit' => 'Edytuj',
 | 
				
			||||||
	'b_remove' => 'Usuń',
 | 
						'b_remove' => 'Usuń',
 | 
				
			||||||
 | 
						'b_finish' => 'Dokončit', //newOne
 | 
				
			||||||
	'b_approve' => 'Zaakceptuj',
 | 
						'b_approve' => 'Zaakceptuj',
 | 
				
			||||||
	'b_disable' => 'Wyłącz',
 | 
						'b_disable' => 'Wyłącz',
 | 
				
			||||||
	'b_save' => 'Zapisz',
 | 
						'b_save' => 'Zapisz',
 | 
				
			||||||
@@ -50,9 +51,12 @@ return $lang = [
 | 
				
			|||||||
	'l_sleepTime' => 'Czas snu urządzenia',
 | 
						'l_sleepTime' => 'Czas snu urządzenia',
 | 
				
			||||||
	'l_atHome' => 'W domu',
 | 
						'l_atHome' => 'W domu',
 | 
				
			||||||
	'l_nameAt' => 'Nazwa',
 | 
						'l_nameAt' => 'Nazwa',
 | 
				
			||||||
	'l_nameAt' => 'Nazwa',
 | 
					 | 
				
			||||||
	'l_lastSeen' => 'Ostatnio zaktualizowany',
 | 
						'l_lastSeen' => 'Ostatnio zaktualizowany',
 | 
				
			||||||
	'l_notificationStatus' => 'Stan powiadomienia',
 | 
						'l_notificationStatus' => 'Stan powiadomienia',
 | 
				
			||||||
 | 
						'l_userName' => 'Username', //newOne
 | 
				
			||||||
 | 
						'l_password' => 'Password', //newOne
 | 
				
			||||||
 | 
						'l_oldPassword' => 'Old Password', //newOne
 | 
				
			||||||
 | 
						'l_newPassword' => 'New Password', //newOne
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//Title
 | 
						//Title
 | 
				
			||||||
	't_createScene' => 'Utwórz scenariusz',
 | 
						't_createScene' => 'Utwórz scenariusz',
 | 
				
			||||||
@@ -64,6 +68,8 @@ return $lang = [
 | 
				
			|||||||
	't_profile' => 'Profil',
 | 
						't_profile' => 'Profil',
 | 
				
			||||||
	't_notification' => 'Powiadomienie',
 | 
						't_notification' => 'Powiadomienie',
 | 
				
			||||||
	't_experimental' => 'Eksperymentalne',
 | 
						't_experimental' => 'Eksperymentalne',
 | 
				
			||||||
 | 
						't_createuser' => 'Vytvořit Uživatele', //newOne
 | 
				
			||||||
 | 
						't_changePassword' => 'Změnit Heslo', //newOne
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//constants
 | 
						//constants
 | 
				
			||||||
	'humi' => 'Wilgotność',
 | 
						'humi' => 'Wilgotność',
 | 
				
			||||||
@@ -87,6 +93,8 @@ return $lang = [
 | 
				
			|||||||
	//tables
 | 
						//tables
 | 
				
			||||||
	't_time' => 'Czas',
 | 
						't_time' => 'Czas',
 | 
				
			||||||
	't_state' => 'Stan',
 | 
						't_state' => 'Stan',
 | 
				
			||||||
 | 
						't_userName' => 'State', //newOne
 | 
				
			||||||
 | 
						't_action' => 'Action', //newOne
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//Days Long
 | 
						//Days Long
 | 
				
			||||||
	'd_monday' => 'Poniedziałek',
 | 
						'd_monday' => 'Poniedziałek',
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								app/templates/css/override.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								app/templates/css/override.css
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
				
			|||||||
 | 
					table.table td, table.table th {
 | 
				
			||||||
 | 
					  border: 2px solid #121a2b;
 | 
				
			||||||
 | 
					  padding: 8px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*tr:nth-child(even){background-color: #f2f2f2;}*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					table.table tr:hover {background-color: #121a2b;}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					table.table th {
 | 
				
			||||||
 | 
					  padding-top: 12px;
 | 
				
			||||||
 | 
					  padding-bottom: 12px;
 | 
				
			||||||
 | 
					  text-align: left;
 | 
				
			||||||
 | 
					  background-color: #121a2b;
 | 
				
			||||||
 | 
					  color: white;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -38,3 +38,21 @@ function sendTestNotification(){
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$( "button[name='deactivateOta']" ).click(function(){
 | 
				
			||||||
 | 
					    console.log("Didabling ota");
 | 
				
			||||||
 | 
					    $.ajax({
 | 
				
			||||||
 | 
					        url: 'ajax',
 | 
				
			||||||
 | 
					        type: 'POST',
 | 
				
			||||||
 | 
					        data: {
 | 
				
			||||||
 | 
					            "ota" : 'X',
 | 
				
			||||||
 | 
					            "action": 'disable'
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        success: function(data){
 | 
				
			||||||
 | 
					            console.log(data);
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        error: function (request, status, error) {
 | 
				
			||||||
 | 
					            console.log("ERROR ", request, error);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,26 +8,16 @@
 | 
				
			|||||||
	<title><?php echo $TITLE ?></title>
 | 
						<title><?php echo $TITLE ?></title>
 | 
				
			||||||
</head>
 | 
					</head>
 | 
				
			||||||
<body class="no-transitions">
 | 
					<body class="no-transitions">
 | 
				
			||||||
	<div class="modal-container">
 | 
						<?php
 | 
				
			||||||
		<div class="modal">
 | 
						if (isset($ota) && $ota != '') {	
 | 
				
			||||||
			<h4 class="mb-4">Login</h4>
 | 
							$partial = new Partial('loginOta');
 | 
				
			||||||
			<form method="post">
 | 
							$partial->prepare('ota',$ota);
 | 
				
			||||||
				<div class="field">
 | 
							$partial->render();
 | 
				
			||||||
					<div class="label">Name:</div>
 | 
						} else {
 | 
				
			||||||
					<input class="input" type="text" name="username" placeholder="Jméno.."/>
 | 
							$partial = new Partial('loginForm');
 | 
				
			||||||
				</div>
 | 
							$partial->render();
 | 
				
			||||||
				<div class="field">
 | 
						}
 | 
				
			||||||
					<div class="label">Password:</div>
 | 
						?>
 | 
				
			||||||
					<input class="input" type="password" name="password" placeholder="Heslo.."/>
 | 
					 | 
				
			||||||
				</div>
 | 
					 | 
				
			||||||
				<div class="field">
 | 
					 | 
				
			||||||
					<div class="label">Remember me:</div>
 | 
					 | 
				
			||||||
					<input class="" type="checkbox" name="remember" value="true"/>
 | 
					 | 
				
			||||||
				</div>
 | 
					 | 
				
			||||||
				<input type="submit" class="button" name="login" value="Login"/>
 | 
					 | 
				
			||||||
			</form>
 | 
					 | 
				
			||||||
		</div>
 | 
					 | 
				
			||||||
	</div>
 | 
					 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	<?php
 | 
						<?php
 | 
				
			||||||
	$partial = new Partial('footer');
 | 
						$partial = new Partial('footer');
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,3 +23,4 @@
 | 
				
			|||||||
<link rel="stylesheet" href="./app/templates/css/modal.css">
 | 
					<link rel="stylesheet" href="./app/templates/css/modal.css">
 | 
				
			||||||
<link rel="stylesheet" href="./app/templates/css/pre.css">
 | 
					<link rel="stylesheet" href="./app/templates/css/pre.css">
 | 
				
			||||||
<link rel="stylesheet" href="./app/templates/css/loading.css">
 | 
					<link rel="stylesheet" href="./app/templates/css/loading.css">
 | 
				
			||||||
 | 
					<link rel="stylesheet" href="./app/templates/css/override.css">
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										20
									
								
								app/templates/part/loginForm.phtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								app/templates/part/loginForm.phtml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
				
			|||||||
 | 
					<div class="modal-container">
 | 
				
			||||||
 | 
					    <div class="modal">
 | 
				
			||||||
 | 
					        <h4 class="mb-4">Login</h4>
 | 
				
			||||||
 | 
					        <form method="post">
 | 
				
			||||||
 | 
					            <div class="field">
 | 
				
			||||||
 | 
					                <div class="label">Name:</div>
 | 
				
			||||||
 | 
					                <input class="input" type="text" name="username" placeholder="Jméno.."/>
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					            <div class="field">
 | 
				
			||||||
 | 
					                <div class="label">Password:</div>
 | 
				
			||||||
 | 
					                <input class="input" type="password" name="password" placeholder="Heslo.."/>
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					            <div class="field">
 | 
				
			||||||
 | 
					                <div class="label">Remember me:</div>
 | 
				
			||||||
 | 
					                <input class="" type="checkbox" name="remember" value="true"/>
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					            <input type="submit" class="button" name="login" value="Login"/>
 | 
				
			||||||
 | 
					        </form>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
							
								
								
									
										13
									
								
								app/templates/part/loginOta.phtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								app/templates/part/loginOta.phtml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					<div class="modal-container">
 | 
				
			||||||
 | 
					    <div class="modal">
 | 
				
			||||||
 | 
					        <h4 class="mb-4">OTA</h4>
 | 
				
			||||||
 | 
					        <form method="post">
 | 
				
			||||||
 | 
					            <input type="hidden" name="otaSecret" value="<?php echo $OTA; ?>"/>
 | 
				
			||||||
 | 
					            <div class="field">
 | 
				
			||||||
 | 
					                <div class="label">Code:</div>
 | 
				
			||||||
 | 
					                <input class="input" type="text" name="otaCode" placeholder=""/>
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					            <input type="submit" class="button" name="login" value="Login"/>
 | 
				
			||||||
 | 
					        </form>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
							
								
								
									
										252
									
								
								app/vendor/GoogleAuthenticator.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										252
									
								
								app/vendor/GoogleAuthenticator.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,252 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * PHP Class for handling Google Authenticator 2-factor authentication.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @author Michael Kliewe
 | 
				
			||||||
 | 
					 * @copyright 2012 Michael Kliewe
 | 
				
			||||||
 | 
					 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @link http://www.phpgangsta.de/
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					class PHPGangsta_GoogleAuthenticator
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    protected $_codeLength = 6;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Create new secret.
 | 
				
			||||||
 | 
					     * 16 characters, randomly chosen from the allowed base32 characters.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param int $secretLength
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return string
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function createSecret($secretLength = 16)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $validChars = $this->_getBase32LookupTable();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Valid secret lengths are 80 to 640 bits
 | 
				
			||||||
 | 
					        if ($secretLength < 16 || $secretLength > 128) {
 | 
				
			||||||
 | 
					            throw new Exception('Bad secret length');
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        $secret = '';
 | 
				
			||||||
 | 
					        $rnd = false;
 | 
				
			||||||
 | 
					        if (function_exists('random_bytes')) {
 | 
				
			||||||
 | 
					            $rnd = random_bytes($secretLength);
 | 
				
			||||||
 | 
					        } elseif (function_exists('mcrypt_create_iv')) {
 | 
				
			||||||
 | 
					            $rnd = mcrypt_create_iv($secretLength, MCRYPT_DEV_URANDOM);
 | 
				
			||||||
 | 
					        } elseif (function_exists('openssl_random_pseudo_bytes')) {
 | 
				
			||||||
 | 
					            $rnd = openssl_random_pseudo_bytes($secretLength, $cryptoStrong);
 | 
				
			||||||
 | 
					            if (!$cryptoStrong) {
 | 
				
			||||||
 | 
					                $rnd = false;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if ($rnd !== false) {
 | 
				
			||||||
 | 
					            for ($i = 0; $i < $secretLength; ++$i) {
 | 
				
			||||||
 | 
					                $secret .= $validChars[ord($rnd[$i]) & 31];
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            throw new Exception('No source of secure random');
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return $secret;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Calculate the code, with given secret and point in time.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param string   $secret
 | 
				
			||||||
 | 
					     * @param int|null $timeSlice
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return string
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function getCode($secret, $timeSlice = null)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if ($timeSlice === null) {
 | 
				
			||||||
 | 
					            $timeSlice = floor(time() / 30);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $secretkey = $this->_base32Decode($secret);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Pack time into binary string
 | 
				
			||||||
 | 
					        $time = chr(0).chr(0).chr(0).chr(0).pack('N*', $timeSlice);
 | 
				
			||||||
 | 
					        // Hash it with users secret key
 | 
				
			||||||
 | 
					        $hm = hash_hmac('SHA1', $time, $secretkey, true);
 | 
				
			||||||
 | 
					        // Use last nipple of result as index/offset
 | 
				
			||||||
 | 
					        $offset = ord(substr($hm, -1)) & 0x0F;
 | 
				
			||||||
 | 
					        // grab 4 bytes of the result
 | 
				
			||||||
 | 
					        $hashpart = substr($hm, $offset, 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Unpak binary value
 | 
				
			||||||
 | 
					        $value = unpack('N', $hashpart);
 | 
				
			||||||
 | 
					        $value = $value[1];
 | 
				
			||||||
 | 
					        // Only 32 bits
 | 
				
			||||||
 | 
					        $value = $value & 0x7FFFFFFF;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $modulo = pow(10, $this->_codeLength);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return str_pad($value % $modulo, $this->_codeLength, '0', STR_PAD_LEFT);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Get QR-Code URL for image, from google charts.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param string $name
 | 
				
			||||||
 | 
					     * @param string $secret
 | 
				
			||||||
 | 
					     * @param string $title
 | 
				
			||||||
 | 
					     * @param array  $params
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return string
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function getQRCodeGoogleUrl($name, $secret, $title = null, $params = array())
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $width = !empty($params['width']) && (int) $params['width'] > 0 ? (int) $params['width'] : 200;
 | 
				
			||||||
 | 
					        $height = !empty($params['height']) && (int) $params['height'] > 0 ? (int) $params['height'] : 200;
 | 
				
			||||||
 | 
					        $level = !empty($params['level']) && array_search($params['level'], array('L', 'M', 'Q', 'H')) !== false ? $params['level'] : 'M';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $urlencoded = urlencode('otpauth://totp/'.$name.'?secret='.$secret.'');
 | 
				
			||||||
 | 
					        if (isset($title)) {
 | 
				
			||||||
 | 
					            $urlencoded .= urlencode('&issuer='.urlencode($title));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return "https://api.qrserver.com/v1/create-qr-code/?data=$urlencoded&size=${width}x${height}&ecc=$level";
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Check if the code is correct. This will accept codes starting from $discrepancy*30sec ago to $discrepancy*30sec from now.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param string   $secret
 | 
				
			||||||
 | 
					     * @param string   $code
 | 
				
			||||||
 | 
					     * @param int      $discrepancy      This is the allowed time drift in 30 second units (8 means 4 minutes before or after)
 | 
				
			||||||
 | 
					     * @param int|null $currentTimeSlice time slice if we want use other that time()
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return bool
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function verifyCode($secret, $code, $discrepancy = 1, $currentTimeSlice = null)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if ($currentTimeSlice === null) {
 | 
				
			||||||
 | 
					            $currentTimeSlice = floor(time() / 30);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (strlen($code) != 6) {
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for ($i = -$discrepancy; $i <= $discrepancy; ++$i) {
 | 
				
			||||||
 | 
					            $calculatedCode = $this->getCode($secret, $currentTimeSlice + $i);
 | 
				
			||||||
 | 
					            if ($this->timingSafeEquals($calculatedCode, $code)) {
 | 
				
			||||||
 | 
					                return true;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Set the code length, should be >=6.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param int $length
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return PHPGangsta_GoogleAuthenticator
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function setCodeLength($length)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $this->_codeLength = $length;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return $this;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Helper class to decode base32.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param $secret
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return bool|string
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    protected function _base32Decode($secret)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (empty($secret)) {
 | 
				
			||||||
 | 
					            return '';
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $base32chars = $this->_getBase32LookupTable();
 | 
				
			||||||
 | 
					        $base32charsFlipped = array_flip($base32chars);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $paddingCharCount = substr_count($secret, $base32chars[32]);
 | 
				
			||||||
 | 
					        $allowedValues = array(6, 4, 3, 1, 0);
 | 
				
			||||||
 | 
					        if (!in_array($paddingCharCount, $allowedValues)) {
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        for ($i = 0; $i < 4; ++$i) {
 | 
				
			||||||
 | 
					            if ($paddingCharCount == $allowedValues[$i] &&
 | 
				
			||||||
 | 
					                substr($secret, -($allowedValues[$i])) != str_repeat($base32chars[32], $allowedValues[$i])) {
 | 
				
			||||||
 | 
					                return false;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        $secret = str_replace('=', '', $secret);
 | 
				
			||||||
 | 
					        $secret = str_split($secret);
 | 
				
			||||||
 | 
					        $binaryString = '';
 | 
				
			||||||
 | 
					        for ($i = 0; $i < count($secret); $i = $i + 8) {
 | 
				
			||||||
 | 
					            $x = '';
 | 
				
			||||||
 | 
					            if (!in_array($secret[$i], $base32chars)) {
 | 
				
			||||||
 | 
					                return false;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            for ($j = 0; $j < 8; ++$j) {
 | 
				
			||||||
 | 
					                $x .= str_pad(base_convert(@$base32charsFlipped[@$secret[$i + $j]], 10, 2), 5, '0', STR_PAD_LEFT);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            $eightBits = str_split($x, 8);
 | 
				
			||||||
 | 
					            for ($z = 0; $z < count($eightBits); ++$z) {
 | 
				
			||||||
 | 
					                $binaryString .= (($y = chr(base_convert($eightBits[$z], 2, 10))) || ord($y) == 48) ? $y : '';
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return $binaryString;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Get array with all 32 characters for decoding from/encoding to base32.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return array
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    protected function _getBase32LookupTable()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return array(
 | 
				
			||||||
 | 
					            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', //  7
 | 
				
			||||||
 | 
					            'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', // 15
 | 
				
			||||||
 | 
					            'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', // 23
 | 
				
			||||||
 | 
					            'Y', 'Z', '2', '3', '4', '5', '6', '7', // 31
 | 
				
			||||||
 | 
					            '=',  // padding char
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * A timing safe equals comparison
 | 
				
			||||||
 | 
					     * more info here: http://blog.ircmaxell.com/2014/11/its-all-about-time.html.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param string $safeString The internal (safe) value to be checked
 | 
				
			||||||
 | 
					     * @param string $userString The user submitted (unsafe) value
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return bool True if the two strings are identical
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private function timingSafeEquals($safeString, $userString)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (function_exists('hash_equals')) {
 | 
				
			||||||
 | 
					            return hash_equals($safeString, $userString);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        $safeLen = strlen($safeString);
 | 
				
			||||||
 | 
					        $userLen = strlen($userString);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ($userLen != $safeLen) {
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $result = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for ($i = 0; $i < $userLen; ++$i) {
 | 
				
			||||||
 | 
					            $result |= (ord($safeString[$i]) ^ ord($userString[$i]));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // They are only identical strings if $result is exactly 0...
 | 
				
			||||||
 | 
					        return $result === 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -13,7 +13,7 @@ mb_internal_encoding ("UTF-8");
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Autoloader
 | 
					//Autoloader
 | 
				
			||||||
foreach (["class", "views"] as $dir) {
 | 
					foreach (["vendor","class", "views"] as $dir) {
 | 
				
			||||||
	$files = scandir('./app/'.$dir.'/');
 | 
						$files = scandir('./app/'.$dir.'/');
 | 
				
			||||||
	$files = array_diff($files, array('.', '..', 'app'));
 | 
						$files = array_diff($files, array('.', '..', 'app'));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -47,9 +47,10 @@ Db::connect (DBHOST, DBUSER, DBPASS, DBNAME);
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
//TODO: Přesunout do Login Pohledu
 | 
					//TODO: Přesunout do Login Pohledu
 | 
				
			||||||
$userManager = new UserManager();
 | 
					$userManager = new UserManager();
 | 
				
			||||||
if (isset($_POST['username']) && isset($_POST['password']) ) {
 | 
					
 | 
				
			||||||
	$userManager->login($_POST['username'], $_POST['password'], (isset ($_POST['remember']) ? $_POST['remember'] : 'false'));
 | 
					// if (isset($_POST['username']) && isset($_POST['password']) ) {
 | 
				
			||||||
}
 | 
					// 	$userManager->login($_POST['username'], $_POST['password'], (isset ($_POST['remember']) ? $_POST['remember'] : 'false'));
 | 
				
			||||||
 | 
					// }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Logs
 | 
					//Logs
 | 
				
			||||||
$logManager = new LogManager();
 | 
					$logManager = new LogManager();
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user