|
|
<?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; |
|
|
} |
|
|
} |
|
|
|