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�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�o {$sessionId} n�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; } }