1: <?php
2:
3: /*
4: * This file is part of the Symfony package.
5: *
6: * (c) Fabien Potencier <fabien@symfony.com>
7: *
8: * For the full copyright and license information, please view the LICENSE
9: * file that was distributed with this source code.
10: */
11:
12: namespace Symfony\Component\HttpFoundation\Session\Storage;
13:
14: use Symfony\Component\HttpFoundation\Session\SessionBagInterface;
15:
16: /**
17: * Metadata container.
18: *
19: * Adds metadata to the session.
20: *
21: * @author Drak <drak@zikula.org>
22: */
23: class MetadataBag implements SessionBagInterface
24: {
25: const CREATED = 'c';
26: const UPDATED = 'u';
27: const LIFETIME = 'l';
28:
29: /**
30: * @var string
31: */
32: private $name = '__metadata';
33:
34: /**
35: * @var string
36: */
37: private $storageKey;
38:
39: /**
40: * @var array
41: */
42: protected $meta = array(self::CREATED => 0, self::UPDATED => 0, self::LIFETIME => 0);
43:
44: /**
45: * Unix timestamp.
46: *
47: * @var int
48: */
49: private $lastUsed;
50:
51: /**
52: * @var int
53: */
54: private $updateThreshold;
55:
56: /**
57: * Constructor.
58: *
59: * @param string $storageKey The key used to store bag in the session.
60: * @param int $updateThreshold The time to wait between two UPDATED updates
61: */
62: public function __construct($storageKey = '_sf2_meta', $updateThreshold = 0)
63: {
64: $this->storageKey = $storageKey;
65: $this->updateThreshold = $updateThreshold;
66: }
67:
68: /**
69: * {@inheritdoc}
70: */
71: public function initialize(array &$array)
72: {
73: $this->meta = &$array;
74:
75: if (isset($array[self::CREATED])) {
76: $this->lastUsed = $this->meta[self::UPDATED];
77:
78: $timeStamp = time();
79: if ($timeStamp - $array[self::UPDATED] >= $this->updateThreshold) {
80: $this->meta[self::UPDATED] = $timeStamp;
81: }
82: } else {
83: $this->stampCreated();
84: }
85: }
86:
87: /**
88: * Gets the lifetime that the session cookie was set with.
89: *
90: * @return int
91: */
92: public function getLifetime()
93: {
94: return $this->meta[self::LIFETIME];
95: }
96:
97: /**
98: * Stamps a new session's metadata.
99: *
100: * @param int $lifetime Sets the cookie lifetime for the session cookie. A null value
101: * will leave the system settings unchanged, 0 sets the cookie
102: * to expire with browser session. Time is in seconds, and is
103: * not a Unix timestamp.
104: */
105: public function stampNew($lifetime = null)
106: {
107: $this->stampCreated($lifetime);
108: }
109:
110: /**
111: * {@inheritdoc}
112: */
113: public function getStorageKey()
114: {
115: return $this->storageKey;
116: }
117:
118: /**
119: * Gets the created timestamp metadata.
120: *
121: * @return int Unix timestamp
122: */
123: public function getCreated()
124: {
125: return $this->meta[self::CREATED];
126: }
127:
128: /**
129: * Gets the last used metadata.
130: *
131: * @return int Unix timestamp
132: */
133: public function getLastUsed()
134: {
135: return $this->lastUsed;
136: }
137:
138: /**
139: * {@inheritdoc}
140: */
141: public function clear()
142: {
143: // nothing to do
144: }
145:
146: /**
147: * {@inheritdoc}
148: */
149: public function getName()
150: {
151: return $this->name;
152: }
153:
154: /**
155: * Sets name.
156: *
157: * @param string $name
158: */
159: public function setName($name)
160: {
161: $this->name = $name;
162: }
163:
164: private function stampCreated($lifetime = null)
165: {
166: $timeStamp = time();
167: $this->meta[self::CREATED] = $this->meta[self::UPDATED] = $this->lastUsed = $timeStamp;
168: $this->meta[self::LIFETIME] = (null === $lifetime) ? ini_get('session.cookie_lifetime') : $lifetime;
169: }
170: }
171: