Merge branch 'dev' of https://git.steelants.cz/JonatanRek/PHP_SMART_HOME_V3
This commit is contained in:
commit
60cf61fee8
@ -24,7 +24,7 @@
|
|||||||
[![JS](https://img.shields.io/badge/JS-red.svg)](https://github.com/GamerClassN7/Smart_Home/search?l=js)
|
[![JS](https://img.shields.io/badge/JS-red.svg)](https://github.com/GamerClassN7/Smart_Home/search?l=js)
|
||||||
[![HTML](https://img.shields.io/badge/HTML-blue.svg)](https://github.com/GamerClassN7/Smart_Home/search?l=html)
|
[![HTML](https://img.shields.io/badge/HTML-blue.svg)](https://github.com/GamerClassN7/Smart_Home/search?l=html)
|
||||||
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
|
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
|
||||||
[![Discord](https://img.shields.io/discord/604697675430101003.svg?color=Blue&label=Discord&logo=Discord)](https://discord.gg/6BPErAS)
|
[![Discord](https://img.shields.io/discord/604697675430101003.svg?color=Blue&label=Discord&logo=Discord)](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;
|
||||||
|
}
|
@ -37,4 +37,22 @@ function sendTestNotification(){
|
|||||||
console.log("ERROR ", request, error);
|
console.log("ERROR ", request, error);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$( "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();
|
||||||
|
Loading…
Reference in New Issue
Block a user