MongodbSessionHandler::write()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 10
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 10
ccs 5
cts 5
cp 1
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 5
nc 2
nop 2
crap 2
1
<?php
2
3
namespace LegalThings;
4
5
/**
6
 * A class that implements SessionHandlerInterface and can be used to store sessions as structured data in MongoDB
7
 */
8
class MongodbSessionHandler implements \SessionHandlerInterface
9
{
10
    /**
11
     * Session collection
12
     * @var \MongoDB\Collection
13
     */
14
    protected $collection;
15
16
    /**
17
     * Never store changes to a session
18
     * @var boolean
19
     */
20
    protected $readonly = false;
21
22
23
    /**
24
     * Class constructor
25
     * 
26
     * @param \MongoDB\Collection $collection
27
     * @param string              $mode        'w' for read-write or 'r' for read-only
28
     */
29 10
    public function __construct(\MongoDB\Collection $collection, $mode = 'w')
30
    {
31 10
        $this->collection = $collection;
32 10
        $this->readonly = ($mode === 'r');
33 10
    }
34
    
35
    /**
36
     * Initialize session
37
     * @link http://php.net/manual/en/sessionhandlerinterface.open.php
38
     * 
39
     * @param string $save_path  The path where to store/retrieve the session.
40
     * @param string $name       The session name.
41
     * @return boolean
42
     */
43 1
    public function open($save_path, $name)
44
    {
45 1
        return true;
46
    }
47
48
    /**
49
     * Close the session
50
     * @link http://php.net/manual/en/sessionhandlerinterface.close.php
51
     * 
52
     * @return boolean
53
     */
54 1
    public function close()
55
    {
56 1
        unset($_SESSION);
57 1
        return true;
58
    }
59
60
    /**
61
     * (PHP 5 &gt;= 5.4.0)<br/>
62
     * Read session data
63
     * @link http://php.net/manual/en/sessionhandlerinterface.read.php
64
     * @param string $session_id  The session id.
65
     * @return string
66
     */
67 2
    public function read($session_id)
68
    {
69 2
        $values = $this->collection->findOne(['_id' => $session_id]);
70
        
71 2
        if (empty($values)) {
72 1
            return '';
73
        }
74
        
75 1
        unset($values['_id']);
76
77 1
        foreach ($values as $key => $value) {
78 1
            $_SESSION[$key] = $value;
79
        }
80
81 1
        return '';
82
    }
83
84
    /**
85
     * (PHP 5 &gt;= 5.4.0)<br/>
86
     * Write session data
87
     * @link http://php.net/manual/en/sessionhandlerinterface.write.php
88
     * @param string $session_id    The session id.
89
     * @param string $session_data  The encoded session data.
90
     * @return boolean
91
     */
92 2
    public function write($session_id, $session_data)
93
    {
94 2
        if ($this->readonly) {
95 1
            return true;
96
        }
97
        
98 1
        $this->collection->insertOne(['_id' => $session_id] + $_SESSION);
99
100 1
        return true;
101
    }
102
103
    /**
104
     * (PHP 5 &gt;= 5.4.0)<br/>
105
     * Destroy a session
106
     * @link http://php.net/manual/en/sessionhandlerinterface.destroy.php
107
     * @param string $session_id The session ID being destroyed.
108
     * @return boolean
109
     */
110 2
    public function destroy($session_id)
111
    {
112 2
        if ($this->readonly) {
113 1
            return true;
114
        }
115
        
116 1
        $this->collection->deleteOne(['_id' => $session_id]);
117 1
        return true;
118
    }
119
120
    /**
121
     * This method must be implemented for the interface, but isn't used. Instead use a MongoDB tty index.
122
     * @link http://php.net/manual/en/sessionhandlerinterface.gc.php
123
     * @link https://docs.mongodb.com/manual/core/index-ttl/
124
     * 
125
     * @param int $maxlifetime
126
     */
127 1
    public function gc($maxlifetime)
128
    {
129 1
    }
130
    
131
    /**
132
     * This callback is executed when a new session ID is required. No parameters are provided, and the return value
133
     * should be a string that is a valid session ID for your handler.
134
     * 
135
     * @return string
136
     */
137 1
    public function create_sid()
0 ignored issues
show
Coding Style introduced by
Method name "MongodbSessionHandler::create_sid" is not in camel caps format
Loading history...
138
    {
139 1
        $hex = bin2hex(random_bytes(16));
140 1
        $id = base_convert($hex, 16, 36);
141
        
142 1
        return sprintf('%024s', substr($id, -24));
143
    }
144
}
145