2024-06-04 01:13:55 -04:00
|
|
|
<?php declare(strict_types=1);
|
2012-04-29 13:15:06 -04:00
|
|
|
/**
|
2016-07-11 05:58:15 -04:00
|
|
|
* PrivateBin
|
2012-04-29 13:15:06 -04:00
|
|
|
*
|
|
|
|
* a zero-knowledge paste bin
|
|
|
|
*
|
2016-07-11 05:58:15 -04:00
|
|
|
* @link https://github.com/PrivateBin/PrivateBin
|
2012-04-29 13:15:06 -04:00
|
|
|
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
|
2016-07-19 07:56:52 -04:00
|
|
|
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
|
2012-04-29 13:15:06 -04:00
|
|
|
*/
|
2016-12-12 12:43:23 -05:00
|
|
|
|
2016-12-12 12:49:08 -05:00
|
|
|
namespace PrivateBin\Data;
|
2016-07-21 11:09:48 -04:00
|
|
|
|
2012-04-29 13:15:06 -04:00
|
|
|
/**
|
2016-08-09 06:21:32 -04:00
|
|
|
* AbstractData
|
2012-04-29 13:15:06 -04:00
|
|
|
*
|
2022-10-27 19:01:02 -04:00
|
|
|
* Abstract model for data access
|
2012-04-29 13:15:06 -04:00
|
|
|
*/
|
2016-07-21 11:09:48 -04:00
|
|
|
abstract class AbstractData
|
2012-04-29 13:15:06 -04:00
|
|
|
{
|
2021-06-09 01:47:40 -04:00
|
|
|
/**
|
|
|
|
* cache for the traffic limiter
|
|
|
|
*
|
2012-04-29 13:15:06 -04:00
|
|
|
* @access protected
|
2022-10-27 19:01:02 -04:00
|
|
|
* @var array
|
2012-04-29 13:15:06 -04:00
|
|
|
*/
|
2022-10-27 19:01:02 -04:00
|
|
|
protected $_last_cache = array();
|
2012-04-29 13:15:06 -04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Create a paste.
|
|
|
|
*
|
|
|
|
* @access public
|
|
|
|
* @param string $pasteid
|
|
|
|
* @param array $paste
|
2015-09-03 16:55:36 -04:00
|
|
|
* @return bool
|
2012-04-29 13:15:06 -04:00
|
|
|
*/
|
2019-05-10 15:35:36 -04:00
|
|
|
abstract public function create($pasteid, array $paste);
|
2012-04-29 13:15:06 -04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Read a paste.
|
|
|
|
*
|
|
|
|
* @access public
|
|
|
|
* @param string $pasteid
|
2019-05-19 03:42:55 -04:00
|
|
|
* @return array|false
|
2012-04-29 13:15:06 -04:00
|
|
|
*/
|
2019-05-10 15:35:36 -04:00
|
|
|
abstract public function read($pasteid);
|
2012-04-29 13:15:06 -04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Delete a paste and its discussion.
|
|
|
|
*
|
|
|
|
* @access public
|
|
|
|
* @param string $pasteid
|
|
|
|
*/
|
2019-05-10 15:35:36 -04:00
|
|
|
abstract public function delete($pasteid);
|
2012-04-29 13:15:06 -04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Test if a paste exists.
|
|
|
|
*
|
|
|
|
* @access public
|
2016-07-19 08:44:17 -04:00
|
|
|
* @param string $pasteid
|
2015-09-26 21:03:55 -04:00
|
|
|
* @return bool
|
2012-04-29 13:15:06 -04:00
|
|
|
*/
|
2019-05-10 15:35:36 -04:00
|
|
|
abstract public function exists($pasteid);
|
2012-04-29 13:15:06 -04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Create a comment in a paste.
|
|
|
|
*
|
|
|
|
* @access public
|
|
|
|
* @param string $pasteid
|
|
|
|
* @param string $parentid
|
|
|
|
* @param string $commentid
|
|
|
|
* @param array $comment
|
2015-09-03 16:55:36 -04:00
|
|
|
* @return bool
|
2012-04-29 13:15:06 -04:00
|
|
|
*/
|
2019-05-10 15:35:36 -04:00
|
|
|
abstract public function createComment($pasteid, $parentid, $commentid, array $comment);
|
2012-04-29 13:15:06 -04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Read all comments of paste.
|
|
|
|
*
|
|
|
|
* @access public
|
|
|
|
* @param string $pasteid
|
|
|
|
* @return array
|
|
|
|
*/
|
2019-05-10 15:35:36 -04:00
|
|
|
abstract public function readComments($pasteid);
|
2012-04-29 13:15:06 -04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Test if a comment exists.
|
|
|
|
*
|
|
|
|
* @access public
|
2016-07-19 08:44:17 -04:00
|
|
|
* @param string $pasteid
|
2012-04-29 13:15:06 -04:00
|
|
|
* @param string $parentid
|
|
|
|
* @param string $commentid
|
2016-08-09 07:07:11 -04:00
|
|
|
* @return bool
|
2012-04-29 13:15:06 -04:00
|
|
|
*/
|
2019-05-10 15:35:36 -04:00
|
|
|
abstract public function existsComment($pasteid, $parentid, $commentid);
|
2015-10-12 15:07:41 -04:00
|
|
|
|
2021-06-08 01:49:22 -04:00
|
|
|
/**
|
|
|
|
* Purge outdated entries.
|
|
|
|
*
|
|
|
|
* @access public
|
|
|
|
* @param string $namespace
|
|
|
|
* @param int $time
|
|
|
|
* @return void
|
|
|
|
*/
|
2021-06-09 01:47:40 -04:00
|
|
|
public function purgeValues($namespace, $time)
|
|
|
|
{
|
|
|
|
if ($namespace === 'traffic_limiter') {
|
2022-10-27 19:01:02 -04:00
|
|
|
foreach ($this->_last_cache as $key => $last_submission) {
|
2021-06-13 04:53:01 -04:00
|
|
|
if ($last_submission <= $time) {
|
2022-11-04 15:19:41 -04:00
|
|
|
unset($this->_last_cache[$key]);
|
2021-06-09 01:47:40 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2021-06-08 01:49:22 -04:00
|
|
|
|
2021-06-07 00:53:15 -04:00
|
|
|
/**
|
|
|
|
* Save a value.
|
|
|
|
*
|
|
|
|
* @access public
|
|
|
|
* @param string $value
|
|
|
|
* @param string $namespace
|
|
|
|
* @param string $key
|
|
|
|
* @return bool
|
|
|
|
*/
|
|
|
|
abstract public function setValue($value, $namespace, $key = '');
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Load a value.
|
|
|
|
*
|
|
|
|
* @access public
|
|
|
|
* @param string $namespace
|
|
|
|
* @param string $key
|
|
|
|
* @return string
|
|
|
|
*/
|
|
|
|
abstract public function getValue($namespace, $key = '');
|
|
|
|
|
2016-07-15 11:02:59 -04:00
|
|
|
/**
|
|
|
|
* Returns up to batch size number of paste ids that have expired
|
|
|
|
*
|
|
|
|
* @access protected
|
|
|
|
* @param int $batchsize
|
|
|
|
* @return array
|
|
|
|
*/
|
2019-05-10 15:35:36 -04:00
|
|
|
abstract protected function _getExpiredPastes($batchsize);
|
2016-07-15 11:02:59 -04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Perform a purge of old pastes, at most the given batchsize is deleted.
|
|
|
|
*
|
|
|
|
* @access public
|
|
|
|
* @param int $batchsize
|
|
|
|
*/
|
2019-05-10 16:35:18 -04:00
|
|
|
public function purge($batchsize)
|
2016-07-15 11:02:59 -04:00
|
|
|
{
|
2016-07-26 02:19:35 -04:00
|
|
|
if ($batchsize < 1) {
|
|
|
|
return;
|
|
|
|
}
|
2016-07-15 11:02:59 -04:00
|
|
|
$pastes = $this->_getExpiredPastes($batchsize);
|
2016-07-26 02:19:35 -04:00
|
|
|
if (count($pastes)) {
|
|
|
|
foreach ($pastes as $pasteid) {
|
2016-07-15 11:02:59 -04:00
|
|
|
$this->delete($pasteid);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-10-27 19:01:02 -04:00
|
|
|
/**
|
|
|
|
* Returns all paste ids
|
|
|
|
*
|
|
|
|
* @access public
|
|
|
|
* @return array
|
|
|
|
*/
|
|
|
|
abstract public function getAllPastes();
|
|
|
|
|
2015-10-12 15:07:41 -04:00
|
|
|
/**
|
|
|
|
* Get next free slot for comment from postdate.
|
|
|
|
*
|
2019-05-08 16:11:21 -04:00
|
|
|
* @access protected
|
2015-10-12 15:07:41 -04:00
|
|
|
* @param array $comments
|
|
|
|
* @param int|string $postdate
|
2016-07-19 08:44:17 -04:00
|
|
|
* @return int|string
|
2015-10-12 15:07:41 -04:00
|
|
|
*/
|
2019-05-05 12:22:57 -04:00
|
|
|
protected function getOpenSlot(array &$comments, $postdate)
|
2015-10-12 15:07:41 -04:00
|
|
|
{
|
2016-07-26 02:19:35 -04:00
|
|
|
if (array_key_exists($postdate, $comments)) {
|
2024-06-04 01:27:45 -04:00
|
|
|
$parts = explode('.', (string) $postdate, 2);
|
2016-07-26 02:19:35 -04:00
|
|
|
if (!array_key_exists(1, $parts)) {
|
|
|
|
$parts[1] = 0;
|
|
|
|
}
|
2015-10-12 15:07:41 -04:00
|
|
|
++$parts[1];
|
2015-10-16 17:13:36 -04:00
|
|
|
return $this->getOpenSlot($comments, implode('.', $parts));
|
2015-10-12 15:07:41 -04:00
|
|
|
}
|
|
|
|
return $postdate;
|
|
|
|
}
|
2019-05-08 16:11:21 -04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Upgrade pre-version 1 pastes with attachment to version 1 format.
|
|
|
|
*
|
|
|
|
* @access protected
|
|
|
|
* @static
|
|
|
|
* @param array $paste
|
|
|
|
* @return array
|
|
|
|
*/
|
|
|
|
protected static function upgradePreV1Format(array $paste)
|
|
|
|
{
|
|
|
|
if (array_key_exists('attachment', $paste['meta'])) {
|
|
|
|
$paste['attachment'] = $paste['meta']['attachment'];
|
|
|
|
unset($paste['meta']['attachment']);
|
|
|
|
if (array_key_exists('attachmentname', $paste['meta'])) {
|
|
|
|
$paste['attachmentname'] = $paste['meta']['attachmentname'];
|
|
|
|
unset($paste['meta']['attachmentname']);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return $paste;
|
|
|
|
}
|
2012-04-29 13:15:06 -04:00
|
|
|
}
|