PABX da Simples IP
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

162 lines
5.2 KiB

<?php
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
/**
* Description of SessionHandler
*
* @author victor
*/
class AppSessionHandler {
private $savePath;
private static $FILE_NAME = "sess_%s";
/**
*
*/
public function __construct() {
$this->savePath = ini_get("session.save_path");
}
/**
*
* @param string $id
* @return string
*/
private function getFilePath($id) {
return $this->savePath . DIRECTORY_SEPARATOR . sprintf(static::$FILE_NAME, $id);
}
/**
*
* @return array
*/
public function getActiveSessions() {
$allSessions = [];
$it = new FilesystemIterator($this->savePath, FilesystemIterator::SKIP_DOTS);
foreach ($it as $fileinfo) {
$fileName = $fileinfo->getFilename();
$fullPath = $fileinfo->getPath() . DIRECTORY_SEPARATOR . $fileName;
$sessionName = substr($fileName, 5, strlen($fileName));
if (!file_exists($fullPath) || !is_file($fullPath)) {
continue;
}
$contents = file_get_contents($fullPath);
$sessionData = static::unserialize($contents);
if (!isset($sessionData['SSlogin']) || empty($sessionData['SSlogin'])) {
continue;
}
$walk = static::recursive('utf8_encode', $sessionData);
$allSessions[$sessionName] = $walk;
$parts = parse_url($sessionData['UltimaRequisicao']);
parse_str($parts['query'], $query);
if ($sessionName != session_id()) {
$allSessions[$sessionName]['sessionId'] = $sessionName;
}
$allSessions[$sessionName]['UltimaRotina'] = GetDispProgSel($query['idProg']);
}
return $allSessions;
}
/**
* Desloga uma sess<EFBFBD>o ativa
* @param type $sessionId
* @throws \OutOfBoundsException
*/
public function logout($sessionId = null, $idProgRedirect = 12100) {
$currentSession = session_id();
if (is_null($sessionId)) {
$sessionId = session_id();
}
if (!in_array($sessionId, array_keys($this->getActiveSessions()))) {
throw new \OutOfBoundsException("A sess<EFBFBD>o {$sessionId} n<EFBFBD>o existe");
}
session_id($sessionId);
session_start();
// Unset all of the session variables.
$_SESSION = array();
// If it's desired to kill the session, also delete the session cookie.
// Note: This will destroy the session, and not just the session data!
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
$path = $domain = $secure = $httponly = null;
extract($params);
setcookie(session_name(), '', time() - 42000, $path, $domain, $secure, $httponly);
}
session_destroy();
session_id($currentSession);
session_start();
header('Location: index.php?idProg=' . $idProgRedirect);
}
/**
*
* @param callback $callback
* @param array $array
* @return array
*/
private static function recursive($callback, $array) {
$func = function ($item) use (&$func, &$callback) {
return is_array($item) ? array_map($func, $item) : call_user_func($callback, $item);
};
return array_map($func, $array);
}
public static function unserialize($session_data) {
$method = ini_get("session.serialize_handler");
switch ($method) {
case "php":
return self::unserialize_php($session_data);
break;
case "php_binary":
return self::unserialize_phpbinary($session_data);
break;
default:
throw new Exception("Unsupported session.serialize_handler: {$method}. Supported: php, php_binary");
}
}
private static function unserialize_php($session_data) {
$return_data = array();
$offset = 0;
while ($offset < strlen($session_data)) {
if (!strstr(substr($session_data, $offset), "|")) {
throw new Exception("invalid data, remaining: " . substr($session_data, $offset));
}
$pos = strpos($session_data, "|", $offset);
$num = $pos - $offset;
$varname = substr($session_data, $offset, $num);
$offset += $num + 1;
$data = unserialize(substr($session_data, $offset));
$return_data[$varname] = $data;
$offset += strlen(serialize($data));
}
return $return_data;
}
private static function unserialize_phpbinary($session_data) {
$return_data = array();
$offset = 0;
while ($offset < strlen($session_data)) {
$num = ord($session_data[$offset]);
$offset += 1;
$varname = substr($session_data, $offset, $num);
$offset += $num;
$data = unserialize(substr($session_data, $offset));
$return_data[$varname] = $data;
$offset += strlen(serialize($data));
}
return $return_data;
}
}