blob: 158483a064372ef6ef2d75270b56041966bc1989 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
<?php
/* Icinga Web 2 | (c) 2014 Icinga Development Team | GPLv2+ */
namespace Icinga\Web;
use Icinga\Application\Icinga;
use Icinga\Web\Session\SessionNamespace;
class Window
{
const UNDEFINED = 'undefined';
/** @var Window */
protected static $window;
/** @var string */
protected $id;
/** @var string */
protected $containerId;
public function __construct($id)
{
$parts = explode('_', $id, 2);
if (isset($parts[1])) {
$this->id = $parts[0];
$this->containerId = $id;
} else {
$this->id = $id;
}
}
/**
* Get whether the window's ID is undefined
*
* @return bool
*/
public function isUndefined()
{
return $this->id === self::UNDEFINED;
}
/**
* Get the window's ID
*
* @return string
*/
public function getId()
{
return $this->id;
}
/**
* Get the container's ID
*
* @return string
*/
public function getContainerId()
{
return $this->containerId ?: $this->id;
}
/**
* Return a window-aware session by using the given prefix
*
* @param string $prefix The prefix to use
* @param bool $reset Whether to reset any existing session-data
*
* @return SessionNamespace
*/
public function getSessionNamespace($prefix, $reset = false)
{
$session = Session::getSession();
$identifier = $prefix . '_' . $this->getId();
if ($reset && $session->hasNamespace($identifier)) {
$session->removeNamespace($identifier);
}
$namespace = $session->getNamespace($identifier);
$nsUndef = $prefix . '_' . self::UNDEFINED;
if (! $reset && ! $this->isUndefined() && $session->hasNamespace($nsUndef)) {
// We may not have any window-id on the very first request. Now we add
// all values from the namespace, that has been created in this case,
// to the new one and remove it afterwards.
foreach ($session->getNamespace($nsUndef) as $name => $value) {
$namespace->set($name, $value);
}
$session->removeNamespace($nsUndef);
}
return $namespace;
}
/**
* Generate a random string
*
* @return string
*/
public static function generateId()
{
$letters = 'abcefghijklmnopqrstuvwxyz';
return substr(str_shuffle($letters), 0, 12);
}
/**
* @return Window
*/
public static function getInstance()
{
if (! isset(static::$window)) {
$id = Icinga::app()->getRequest()->getHeader('X-Icinga-WindowId');
if (empty($id) || $id === static::UNDEFINED) {
Icinga::app()->getResponse()->setOverrideWindowId();
$id = static::generateId();
}
static::$window = new Window($id);
}
return static::$window;
}
}
|