Merge branch 'sessions_in_db'

This commit is contained in:
Isaac Connor 2020-10-02 15:57:11 -04:00
commit 7261a7b1dd
7 changed files with 133 additions and 3 deletions

View File

@ -1024,6 +1024,13 @@ INSERT INTO MontageLayouts (`Name`,`Positions`) VALUES ('3 Wide', '{ "default":{
INSERT INTO MontageLayouts (`Name`,`Positions`) VALUES ('4 Wide', '{ "default":{"float":"left", "width":"24.5%","left":"0px","right":"0px","top":"0px","bottom":"0px"} }' );
INSERT INTO MontageLayouts (`Name`,`Positions`) VALUES ('5 Wide', '{ "default":{"float":"left", "width":"19%","left":"0px","right":"0px","top":"0px","bottom":"0px"} }' );
CREATE TABLE Sessions (
id char(32) not null,
access INT(10) UNSIGNED DEFAULT NULL,
data text,
PRIMARY KEY(id)
) ENGINE=InnoDB;
-- We generally don't alter triggers, we drop and re-create them, so let's keep them in a separate file that we can just source in update scripts.
source @PKGDATADIR@/db/triggers.sql
--

21
db/zm_update-1.35.9.sql Normal file
View File

@ -0,0 +1,21 @@
--
-- This adds Sessions Table
--
SET @s = (SELECT IF(
(SELECT COUNT(*)
FROM INFORMATION_SCHEMA.TABLES
WHERE table_name = 'Sessions'
AND table_schema = DATABASE()
) > 0,
"SELECT 'Sessions table exists'",
"CREATE TABLE Sessions (
id char(32) not null,
access INT(10) UNSIGNED DEFAULT NULL,
data text,
PRIMARY KEY(id)
) ENGINE=InnoDB;"
));
PREPARE stmt FROM @s;
EXECUTE stmt;

View File

@ -28,7 +28,7 @@
%global _hardened_build 1
Name: zoneminder
Version: 1.35.8
Version: 1.35.9
Release: 1%{?dist}
Summary: A camera monitoring and analysis tool
Group: System Environment/Daemons

View File

@ -1 +1 @@
1.35.8
1.35.9

View File

@ -30,6 +30,44 @@ global $CLANG;
</div>
<div class="modal-body">
<p><?php echo sprintf( $CLANG['CurrentLogin'], $user['Username'] ) ?></p>
<?php if ( canView('System') ) { ?>
<p>Other logged in users:<br/>
<table>
<tr>
<th><?php echo(translate('Username'))?></th>
<th><?php echo(translate('Last Access'))?></th>
</tr>
<?php
require_once('includes/User.php');
$result = dbQuery('SELECT * FROM Sessions');
if ( ! $result ) return;
$current_session = $_SESSION;
zm_session_start();
while ( $row = $result->fetch(PDO::FETCH_ASSOC) ) {
$_SESSION = array();
if ( ! session_decode($row['data']) ) {
ZM\Warning('Failed to decode ' . $row['data']);
continue;
}
if ( isset($_SESSION['last_time']) ) {
# This is a dead session
continue;
}
$user = ZM\User::find_one(array('Username'=>$_SESSION['username']));
if ( ! $user ) {
ZM\Logger::Debug('User not found for ' . $_SESSION['username']);
continue;
}
echo '<tr><td>'.$user->Username().'</td><td>'.strftime(STRF_FMT_DATETIME_SHORTER, $row['access']).'</td></tr>';
} # end while
session_abort();
$_SESSION = $current_session;
?>
</table>
<?php } # end if canView(System) ?>
</div>
<div class="modal-footer">
<form name="logoutForm" id="logoutForm" method="post" action="?">

View File

@ -22,7 +22,6 @@
if ( $action == 'logout' ) {
userLogout();
$view = 'login';
ZM\Logger::Debug("User: " . print_r($user,true));
} elseif ( $action == 'config' ) {
$redirect = '?view=user&uid='.$user['Id'];
}

View File

@ -87,4 +87,69 @@ function zm_session_clear() {
session_write_close();
session_start();
} // function zm_session_clear()
class Session {
private $db;
public function __construct() {
global $dbConn;
$this->db = $dbConn;
// Set handler to overide SESSION
session_set_save_handler(
array($this, '_open'),
array($this, '_close'),
array($this, '_read'),
array($this, '_write'),
array($this, '_destroy'),
array($this, '_gc')
);
// Start the session
//zm_session_start();
}
public function _open() {
return $this->db ? true : false;
}
public function _close(){
// The example code closed the db connection.. I don't think we care to.
return true;
}
public function _read($id){
$sth = $this->db->prepare('SELECT data FROM Sessions WHERE id = :id');
$sth->bindParam(':id', $id, PDO::PARAM_STR, 32);
if ( $sth->execute() and ( $row = $sth->fetch(PDO::FETCH_ASSOC) ) ) {
return $row['data'];
}
// Return an empty string
return '';
}
public function _write($id, $data){
// Create time stamp
$access = time();
$sth = $this->db->prepare('REPLACE INTO Sessions VALUES (:id, :access, :data)');
$sth->bindParam(':id', $id, PDO::PARAM_STR, 32);
$sth->bindParam(':access', $access, PDO::PARAM_INT);
$sth->bindParam(':data', $data);
return $sth->execute() ? true : false;
}
public function _destroy($id) {
$sth = $this->db->prepare('DELETE FROM Sessions WHERE Id = :id');
$sth->bindParam(':id', $id, PDO::PARAM_STR, 32);
return $sth->execute() ? true : false;
}
public function _gc($max) {
// Calculate what is to be deemed old
$old = time() - $max;
$sth = $this->db->prepare('DELETE * FROM Sessions WHERE access < :old');
$sth->bindParam(':old', $old, PDO::PARAM_INT);
return $sth->execute() ? true : false;
}
} # end class Session
$session = new Session;
?>