| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- <?php
- /**
- * PrivateBin
- *
- * a zero-knowledge paste bin
- *
- * @link https://github.com/PrivateBin/PrivateBin
- * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
- * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
- * @version 1.2.1
- */
- namespace PrivateBin\Model;
- use Exception;
- use Identicon\Identicon;
- use PrivateBin\Persistence\TrafficLimiter;
- use PrivateBin\Sjcl;
- use PrivateBin\Vizhash16x16;
- /**
- * Comment
- *
- * Model of a PrivateBin comment.
- */
- class Comment extends AbstractModel
- {
- /**
- * Instance's parent.
- *
- * @access private
- * @var Paste
- */
- private $_paste;
- /**
- * Get comment data.
- *
- * @access public
- * @throws Exception
- * @return stdClass
- */
- public function get()
- {
- // @todo add support to read specific comment
- $comments = $this->_store->readComments($this->getPaste()->getId());
- foreach ($comments as $comment) {
- if (
- $comment->parentid == $this->getParentId() &&
- $comment->id == $this->getId()
- ) {
- $this->_data = $comment;
- break;
- }
- }
- return $this->_data;
- }
- /**
- * Store the comment's data.
- *
- * @access public
- * @throws Exception
- */
- public function store()
- {
- // Make sure paste exists.
- $pasteid = $this->getPaste()->getId();
- if (!$this->getPaste()->exists()) {
- throw new Exception('Invalid data.', 67);
- }
- // Make sure the discussion is opened in this paste and in configuration.
- if (!$this->getPaste()->isOpendiscussion() || !$this->_conf->getKey('discussion')) {
- throw new Exception('Invalid data.', 68);
- }
- // Check for improbable collision.
- if ($this->exists()) {
- throw new Exception('You are unlucky. Try again.', 69);
- }
- $this->_data->meta->postdate = time();
- // store comment
- if (
- $this->_store->createComment(
- $pasteid,
- $this->getParentId(),
- $this->getId(),
- json_decode(json_encode($this->_data), true)
- ) === false
- ) {
- throw new Exception('Error saving comment. Sorry.', 70);
- }
- }
- /**
- * Delete the comment.
- *
- * @access public
- * @throws Exception
- */
- public function delete()
- {
- throw new Exception('To delete a comment, delete its parent paste', 64);
- }
- /**
- * Test if comment exists in store.
- *
- * @access public
- * @return bool
- */
- public function exists()
- {
- return $this->_store->existsComment(
- $this->getPaste()->getId(),
- $this->getParentId(),
- $this->getId()
- );
- }
- /**
- * Set paste.
- *
- * @access public
- * @param Paste $paste
- * @throws Exception
- */
- public function setPaste(Paste $paste)
- {
- $this->_paste = $paste;
- $this->_data->meta->pasteid = $paste->getId();
- }
- /**
- * Get paste.
- *
- * @access public
- * @return Paste
- */
- public function getPaste()
- {
- return $this->_paste;
- }
- /**
- * Set parent ID.
- *
- * @access public
- * @param string $id
- * @throws Exception
- */
- public function setParentId($id)
- {
- if (!self::isValidId($id)) {
- throw new Exception('Invalid paste ID.', 65);
- }
- $this->_data->meta->parentid = $id;
- }
- /**
- * Get parent ID.
- *
- * @access public
- * @return string
- */
- public function getParentId()
- {
- if (!property_exists($this->_data->meta, 'parentid')) {
- $this->_data->meta->parentid = '';
- }
- return $this->_data->meta->parentid;
- }
- /**
- * Set nickname.
- *
- * @access public
- * @param string $nickname
- * @throws Exception
- */
- public function setNickname($nickname)
- {
- if (!Sjcl::isValid($nickname)) {
- throw new Exception('Invalid data.', 66);
- }
- $this->_data->meta->nickname = $nickname;
- // If a nickname is provided, we generate an icon based on a SHA512 HMAC
- // of the users IP. (We assume that if the user did not enter a nickname,
- // the user wants to be anonymous and we will not generate an icon.)
- $icon = $this->_conf->getKey('icon');
- if ($icon != 'none') {
- $pngdata = '';
- $hmac = TrafficLimiter::getHash();
- if ($icon == 'identicon') {
- $identicon = new Identicon();
- $pngdata = $identicon->getImageDataUri($hmac, 16);
- } elseif ($icon == 'vizhash') {
- $vh = new Vizhash16x16();
- $pngdata = 'data:image/png;base64,' . base64_encode(
- $vh->generate($hmac)
- );
- }
- if ($pngdata != '') {
- $this->_data->meta->vizhash = $pngdata;
- }
- }
- // Once the icon is generated, we do not keep the IP address hash.
- }
- }
|