| <?php |
|
|
| namespace Kanboard\Core\Session; |
|
|
| use PicoDb\Database; |
| use SessionHandlerInterface; |
|
|
| |
| |
| |
| |
| |
| class SessionHandler implements SessionHandlerInterface |
| { |
| const TABLE = 'sessions'; |
|
|
| |
| |
| |
| private $db; |
|
|
| public function __construct(Database $db) |
| { |
| $this->db = $db; |
| } |
|
|
| #[\ReturnTypeWillChange] |
| public function close() |
| { |
| return true; |
| } |
|
|
| #[\ReturnTypeWillChange] |
| public function destroy($sessionID) |
| { |
| return $this->db->table(self::TABLE)->eq('id', $sessionID)->remove(); |
| } |
|
|
| #[\ReturnTypeWillChange] |
| public function gc($maxlifetime) |
| { |
| return $this->db->table(self::TABLE)->lt('expire_at', time())->remove(); |
| } |
|
|
| #[\ReturnTypeWillChange] |
| public function open($savePath, $name) |
| { |
| return true; |
| } |
|
|
| #[\ReturnTypeWillChange] |
| public function read($sessionID) |
| { |
| $result = $this->db->table(self::TABLE)->eq('id', $sessionID)->findOneColumn('data'); |
| return $result ?: ''; |
| } |
|
|
| #[\ReturnTypeWillChange] |
| public function write($sessionID, $data) |
| { |
| if (SESSION_DURATION > 0) { |
| $lifetime = time() + SESSION_DURATION; |
| } else { |
| $lifetime = time() + (ini_get('session.gc_maxlifetime') ?: 1440); |
| } |
|
|
| $this->db->startTransaction(); |
|
|
| if ($this->db->table(self::TABLE)->eq('id', $sessionID)->exists()) { |
| $this->db->table(self::TABLE)->eq('id', $sessionID)->update([ |
| 'expire_at' => $lifetime, |
| 'data' => $data, |
| ]); |
| } else { |
| $this->db->table(self::TABLE)->insert([ |
| 'id' => $sessionID, |
| 'expire_at' => $lifetime, |
| 'data' => $data, |
| ]); |
| } |
|
|
| $this->db->closeTransaction(); |
|
|
| return true; |
| } |
| } |
|
|