diff --git a/doc/Installation.md b/doc/Installation.md index 13c57d80..3dd342e0 100644 --- a/doc/Installation.md +++ b/doc/Installation.md @@ -177,11 +177,7 @@ CREATE TABLE prefix_paste ( dataid CHAR(16) NOT NULL, data MEDIUMBLOB, expiredate INT, - opendiscussion INT, - burnafterreading INT, meta TEXT, - attachment MEDIUMBLOB, - attachmentname BLOB, PRIMARY KEY (dataid) ); diff --git a/js/privatebin.js b/js/privatebin.js index 4d6ffc55..dbad580c 100644 --- a/js/privatebin.js +++ b/js/privatebin.js @@ -91,7 +91,6 @@ jQuery.PrivateBin = (function($) { * @class */ function CryptoData(data) { - this.v = 1; // store all keys in the default locations for drop-in replacement for (let key in data) { this[key] = data[key]; @@ -102,11 +101,11 @@ jQuery.PrivateBin = (function($) { * * @name CryptoData.getCipherData * @function - * @return {Array}|{string} + * @return {Array} */ this.getCipherData = function() { - return this.v === 1 ? this.data : [this.ct, this.adata]; + return [this.ct, this.adata]; } } @@ -131,7 +130,7 @@ jQuery.PrivateBin = (function($) { */ this.getFormat = function() { - return this.v === 1 ? this.meta.formatter : this.adata[1]; + return this.adata[1]; } /** @@ -145,7 +144,7 @@ jQuery.PrivateBin = (function($) { */ this.getTimeToLive = function() { - return (this.v === 1 ? this.meta.remaining_time : this.meta.time_to_live) || 0; + return this.meta.time_to_live || 0; } /** @@ -157,7 +156,7 @@ jQuery.PrivateBin = (function($) { */ this.isBurnAfterReadingEnabled = function() { - return (this.v === 1 ? this.meta.burnafterreading : this.adata[3]); + return this.adata[3]; } /** @@ -169,7 +168,7 @@ jQuery.PrivateBin = (function($) { */ this.isDiscussionEnabled = function() { - return (this.v === 1 ? this.meta.opendiscussion : this.adata[2]); + return this.adata[2]; } } @@ -194,7 +193,7 @@ jQuery.PrivateBin = (function($) { */ this.getCreated = function() { - return this.meta[this.v === 1 ? 'postdate' : 'created'] || 0; + return this.meta['created'] || 0; } /** @@ -206,7 +205,7 @@ jQuery.PrivateBin = (function($) { */ this.getIcon = function() { - return this.meta[this.v === 1 ? 'vizhash' : 'icon'] || ''; + return this.meta['icon'] || ''; } } @@ -5316,7 +5315,7 @@ jQuery.PrivateBin = (function($) { */ async function decryptPaste(paste, key, password) { - let pastePlain = await decryptOrPromptPassword( + const pastePlain = await decryptOrPromptPassword( key, password, paste.getCipherData() ); @@ -5332,36 +5331,21 @@ jQuery.PrivateBin = (function($) { } } - if (paste.v > 1) { - // version 2 paste - const pasteMessage = JSON.parse(pastePlain); - if (pasteMessage.hasOwnProperty('attachment') && pasteMessage.hasOwnProperty('attachment_name')) { - if (Array.isArray(pasteMessage.attachment) && Array.isArray(pasteMessage.attachment_name)) { - pasteMessage.attachment.forEach((attachment, key) => { - const attachment_name = pasteMessage.attachment_name[key]; - AttachmentViewer.setAttachment(attachment, attachment_name); - }); - } else { - // Continue to process attachment parameters as strings to ensure backward compatibility - AttachmentViewer.setAttachment(pasteMessage.attachment, pasteMessage.attachment_name); - } - AttachmentViewer.showAttachment(); - } - pastePlain = pasteMessage.paste; - } else { - // version 1 paste - if (paste.hasOwnProperty('attachment') && paste.hasOwnProperty('attachmentname')) { - Promise.all([ - CryptTool.decipher(key, password, paste.attachment), - CryptTool.decipher(key, password, paste.attachmentname) - ]).then((attachment) => { - AttachmentViewer.setAttachment(attachment[0], attachment[1]); - AttachmentViewer.showAttachment(); + const pasteMessage = JSON.parse(pastePlain); + if (pasteMessage.hasOwnProperty('attachment') && pasteMessage.hasOwnProperty('attachment_name')) { + if (Array.isArray(pasteMessage.attachment) && Array.isArray(pasteMessage.attachment_name)) { + pasteMessage.attachment.forEach((attachment, key) => { + const attachment_name = pasteMessage.attachment_name[key]; + AttachmentViewer.setAttachment(attachment, attachment_name); }); + } else { + // Continue to process attachment parameters as strings to ensure backward compatibility + AttachmentViewer.setAttachment(pasteMessage.attachment, pasteMessage.attachment_name); } + AttachmentViewer.showAttachment(); } PasteViewer.setFormat(paste.getFormat()); - PasteViewer.setText(pastePlain); + PasteViewer.setText(pasteMessage.paste); PasteViewer.run(); } @@ -5388,28 +5372,15 @@ jQuery.PrivateBin = (function($) { const comment = new Comment(paste.comments[i]), commentPromise = CryptTool.decipher(key, password, comment.getCipherData()); paste.comments[i] = comment; - if (comment.v > 1) { - // version 2 comment - commentDecryptionPromises.push( - commentPromise.then(function (commentJson) { - const commentMessage = JSON.parse(commentJson); - return [ - commentMessage.comment || '', - commentMessage.nickname || '' - ]; - }) - ); - } else { - // version 1 comment - commentDecryptionPromises.push( - Promise.all([ - commentPromise, - paste.comments[i].meta.hasOwnProperty('nickname') ? - CryptTool.decipher(key, password, paste.comments[i].meta.nickname) : - Promise.resolve('') - ]) - ); - } + commentDecryptionPromises.push( + commentPromise.then(function (commentJson) { + const commentMessage = JSON.parse(commentJson); + return [ + commentMessage.comment || '', + commentMessage.nickname || '' + ]; + }) + ); } return Promise.all(commentDecryptionPromises).then(function (plaintexts) { for (let i = 0; i < paste.comments.length; ++i) { diff --git a/js/test/PasteStatus.js b/js/test/PasteStatus.js index bb24840b..b50b233b 100644 --- a/js/test/PasteStatus.js +++ b/js/test/PasteStatus.js @@ -177,36 +177,7 @@ describe('PasteStatus', function () { this.timeout(30000); jsc.property( - 'shows burn after reading message or remaining time v1', - 'bool', - 'nat', - common.jscUrl(), - function (burnafterreading, remainingTime, url) { - let clean = jsdom('', {url: common.urlToString(url)}), - result; - $('body').html('
'); - $.PrivateBin.PasteStatus.init(); - $.PrivateBin.PasteStatus.showRemainingTime($.PrivateBin.Helper.PasteFactory({'meta': { - 'burnafterreading': burnafterreading, - 'remaining_time': remainingTime - }})); - if (burnafterreading) { - result = $('#remainingtime').hasClass('foryoureyesonly') && - !$('#remainingtime').hasClass('hidden'); - } else if (remainingTime) { - result =!$('#remainingtime').hasClass('foryoureyesonly') && - !$('#remainingtime').hasClass('hidden'); - } else { - result = $('#remainingtime').hasClass('hidden') && - !$('#remainingtime').hasClass('foryoureyesonly'); - } - clean(); - return result; - } - ); - - jsc.property( - 'shows burn after reading message or remaining time v2', + 'shows burn after reading message or remaining time', 'bool', 'nat', common.jscUrl(), diff --git a/lib/Configuration.php b/lib/Configuration.php index 84ce53a3..13c37a30 100644 --- a/lib/Configuration.php +++ b/lib/Configuration.php @@ -116,7 +116,7 @@ class Configuration 'js/kjua-0.9.0.js' => 'sha512-CVn7af+vTMBd9RjoS4QM5fpLFEOtBCoB0zPtaqIDC7sF4F8qgUSRFQQpIyEDGsr6yrjbuOLzdf20tkHHmpaqwQ==', 'js/legacy.js' => 'sha512-UxW/TOZKon83n6dk/09GsYKIyeO5LeBHokxyIq+r7KFS5KMBeIB/EM7NrkVYIezwZBaovnyNtY2d9tKFicRlXg==', 'js/prettify.js' => 'sha512-puO0Ogy++IoA2Pb9IjSxV1n4+kQkKXYAEUtVzfZpQepyDPyXk8hokiYDS7ybMogYlyyEIwMLpZqVhCkARQWLMg==', - 'js/privatebin.js' => 'sha512-wQci0zYb+eGsbQaLWunZ7sMoT7+3w5SUfvBJ3JactOOO2WytQGt/q6wRdWZsCkZjCE6hxkEBOxlfSqLHluh3KQ==', + 'js/privatebin.js' => 'sha512-9PIA4e9hN7XUWzN4w7K0BKtEK3/N7ZztNchTrV5M0joeMCPdbU1dJWxRr0XmsFmb+V/Zsr8n+YopxiCc5HMPIQ==', 'js/purify-3.2.6.js' => 'sha512-zqwL4OoBLFx89QPewkz4Lz5CSA2ktU+f31fuECkF0iK3Id5qd3Zpq5dMby8KwHjIEpsUgOqwF58cnmcaNem0EA==', 'js/showdown-2.1.0.js' => 'sha512-WYXZgkTR0u/Y9SVIA4nTTOih0kXMEd8RRV6MLFdL6YU8ymhR528NLlYQt1nlJQbYz4EW+ZsS0fx1awhiQJme1Q==', 'js/zlib-1.3.1-1.js' => 'sha512-5bU9IIP4PgBrOKLZvGWJD4kgfQrkTz8Z3Iqeu058mbQzW3mCumOU6M3UVbVZU9rrVoVwaW4cZK8U8h5xjF88eQ==', diff --git a/lib/Controller.php b/lib/Controller.php index 6ea852cd..915c963a 100644 --- a/lib/Controller.php +++ b/lib/Controller.php @@ -239,19 +239,15 @@ class Controller /** * Store new paste or comment * - * POST contains one or both: - * data = json encoded FormatV2 encrypted text (containing keys: iv,v,iter,ks,ts,mode,adata,cipher,salt,ct) - * attachment = json encoded FormatV2 encrypted text (containing keys: iv,v,iter,ks,ts,mode,adata,cipher,salt,ct) - * - * All optional data will go to meta information: - * expire (optional) = expiration delay (never,5min,10min,1hour,1day,1week,1month,1year,burn) (default:never) - * formatter (optional) = format to display the paste as (plaintext,syntaxhighlighting,markdown) (default:syntaxhighlighting) - * burnafterreading (optional) = if this paste may only viewed once ? (0/1) (default:0) - * opendiscusssion (optional) = is the discussion allowed on this paste ? (0/1) (default:0) - * attachmentname = json encoded FormatV2 encrypted text (containing keys: iv,v,iter,ks,ts,mode,adata,cipher,salt,ct) - * nickname (optional) = in discussion, encoded FormatV2 encrypted text nickname of author of comment (containing keys: iv,v,iter,ks,ts,mode,adata,cipher,salt,ct) - * parentid (optional) = in discussion, which comment this comment replies to. - * pasteid (optional) = in discussion, which paste this comment belongs to. + * POST contains: + * JSON encoded object with mandatory keys: + * v = 2 (version) + * adata (array) + * ct (base64 encoded, encrypted text) + * meta (optional): + * expire = expiration delay (never,5min,10min,1hour,1day,1week,1month,1year,burn) (default:1week) + * parentid (optional) = in discussions, which comment this comment replies to. + * pasteid (optional) = in discussions, which paste this comment belongs to. * * @access private * @return string diff --git a/lib/Data/AbstractData.php b/lib/Data/AbstractData.php index bc038be8..56ddf2bd 100644 --- a/lib/Data/AbstractData.php +++ b/lib/Data/AbstractData.php @@ -190,25 +190,4 @@ abstract class AbstractData } return $postdate; } - - /** - * 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; - } } diff --git a/lib/Data/Database.php b/lib/Data/Database.php index 508555a2..8cfe557c 100644 --- a/lib/Data/Database.php +++ b/lib/Data/Database.php @@ -143,48 +143,20 @@ class Database extends AbstractData public function create($pasteid, array &$paste) { $expire_date = 0; - $opendiscussion = $burnafterreading = false; - $attachment = $attachmentname = null; $meta = $paste['meta']; - $isVersion1 = array_key_exists('data', $paste); if (array_key_exists('expire_date', $meta)) { $expire_date = (int) $meta['expire_date']; unset($meta['expire_date']); } - if (array_key_exists('opendiscussion', $meta)) { - $opendiscussion = $meta['opendiscussion']; - unset($meta['opendiscussion']); - } - if (array_key_exists('burnafterreading', $meta)) { - $burnafterreading = $meta['burnafterreading']; - unset($meta['burnafterreading']); - } - if ($isVersion1) { - if (array_key_exists('attachment', $meta)) { - $attachment = $meta['attachment']; - unset($meta['attachment']); - } - if (array_key_exists('attachmentname', $meta)) { - $attachmentname = $meta['attachmentname']; - unset($meta['attachmentname']); - } - } else { - $opendiscussion = $paste['adata'][2]; - $burnafterreading = $paste['adata'][3]; - } try { return $this->_exec( 'INSERT INTO "' . $this->_sanitizeIdentifier('paste') . - '" VALUES(?,?,?,?,?,?,?,?)', + '" VALUES(?,?,?,?)', array( $pasteid, - $isVersion1 ? $paste['data'] : Json::encode($paste), + Json::encode($paste), $expire_date, - (int) $opendiscussion, - (int) $burnafterreading, Json::encode($meta), - $attachment, - $attachmentname, ) ); } catch (Exception $e) { @@ -213,38 +185,17 @@ class Database extends AbstractData return false; } // create array - $data = Json::decode($row['data']); - $isVersion2 = array_key_exists('v', $data) && $data['v'] >= 2; - $paste = $isVersion2 ? $data : array('data' => $row['data']); + $paste = Json::decode($row['data']); try { - $row['meta'] = Json::decode($row['meta']); + $paste['meta'] = Json::decode($row['meta']); } catch (Exception $e) { - $row['meta'] = array(); + $paste['meta'] = array(); } - $row = self::upgradePreV1Format($row); - $paste['meta'] = $row['meta']; - $expire_date = (int) $row['expiredate']; + $expire_date = (int) $row['expiredate']; if ($expire_date > 0) { $paste['meta']['expire_date'] = $expire_date; } - if ($isVersion2) { - return $paste; - } - - // support v1 attachments - if (array_key_exists('attachment', $row) && !empty($row['attachment'])) { - $paste['attachment'] = $row['attachment']; - if (array_key_exists('attachmentname', $row) && !empty($row['attachmentname'])) { - $paste['attachmentname'] = $row['attachmentname']; - } - } - if ($row['opendiscussion']) { - $paste['meta']['opendiscussion'] = true; - } - if ($row['burnafterreading']) { - $paste['meta']['burnafterreading'] = true; - } return $paste; } @@ -299,21 +250,14 @@ class Database extends AbstractData */ public function createComment($pasteid, $parentid, $commentid, array &$comment) { - if (array_key_exists('data', $comment)) { - $version = 1; - $data = $comment['data']; - } else { - try { - $version = 2; - $data = Json::encode($comment); - } catch (Exception $e) { - return false; - } + try { + $data = Json::encode($comment); + } catch (Exception $e) { + return false; } - list($createdKey, $iconKey) = $this->_getVersionedKeys($version); - $meta = $comment['meta']; + $meta = $comment['meta']; unset($comment['meta']); - foreach (array('nickname', $iconKey) as $key) { + foreach (array('nickname', 'icon') as $key) { if (!array_key_exists($key, $meta)) { $meta[$key] = null; } @@ -328,8 +272,8 @@ class Database extends AbstractData $parentid, $data, $meta['nickname'], - $meta[$iconKey], - $meta[$createdKey], + $meta['icon'], + $meta['created'], ) ); } catch (Exception $e) { @@ -355,20 +299,12 @@ class Database extends AbstractData $comments = array(); if (is_array($rows) && count($rows)) { foreach ($rows as $row) { - $i = $this->getOpenSlot($comments, (int) $row['postdate']); - $data = Json::decode($row['data']); - if (array_key_exists('v', $data) && $data['v'] >= 2) { - $version = 2; - $comments[$i] = $data; - } else { - $version = 1; - $comments[$i] = array('data' => $row['data']); - } - list($createdKey, $iconKey) = $this->_getVersionedKeys($version); + $i = $this->getOpenSlot($comments, (int) $row['postdate']); + $comments[$i] = Json::decode($row['data']); $comments[$i]['id'] = $row['dataid']; $comments[$i]['parentid'] = $row['parentid']; - $comments[$i]['meta'] = array($createdKey => (int) $row['postdate']); - foreach (array('nickname' => 'nickname', 'vizhash' => $iconKey) as $rowKey => $commentKey) { + $comments[$i]['meta'] = array('created' => (int) $row['postdate']); + foreach (array('nickname' => 'nickname', 'vizhash' => 'icon') as $rowKey => $commentKey) { if (array_key_exists($rowKey, $row) && !empty($row[$rowKey])) { $comments[$i]['meta'][$commentKey] = $row[$rowKey]; } @@ -561,21 +497,6 @@ class Database extends AbstractData return $result; } - /** - * get version dependent key names - * - * @access private - * @param int $version - * @return array - */ - private function _getVersionedKeys($version) - { - if ($version === 1) { - return array('postdate', 'vizhash'); - } - return array('created', 'icon'); - } - /** * get table list query, depending on the database type * @@ -737,16 +658,12 @@ class Database extends AbstractData "\"dataid\" CHAR(16) NOT NULL$main_key, " . "\"data\" $attachmentType, " . '"expiredate" INT, ' . - '"opendiscussion" INT, ' . - '"burnafterreading" INT, ' . - "\"meta\" $metaType, " . - "\"attachment\" $attachmentType, " . - "\"attachmentname\" $dataType$after_key )" + "\"meta\" $metaType$after_key )" ); } /** - * create the paste table + * create the comment table * * @access private */ @@ -789,7 +706,7 @@ class Database extends AbstractData } /** - * create the paste table + * create the config table * * @access private */ @@ -839,6 +756,26 @@ class Database extends AbstractData return preg_replace('/[^A-Za-z0-9_]+/', '', $this->_prefix . $identifier); } + /** + * check if the current database type supports dropping columns + * + * @access private + * @return bool + */ + private function _supportsDropColumn() + { + $supportsDropColumn = true; + if ($this->_type === 'sqlite') { + try { + $row = $this->_select('SELECT sqlite_version() AS "v"', array(), true); + $supportsDropColumn = version_compare($row['v'], '3.35.0', '>='); + } catch (PDOException $e) { + $supportsDropColumn = false; + } + } + return $supportsDropColumn; + } + /** * upgrade the database schema from an old version * @@ -910,22 +847,33 @@ class Database extends AbstractData } } if (version_compare($oldversion, '1.7.1', '<=')) { - $supportsDropColumn = true; - if ($this->_type === 'sqlite') { - try { - $row = $this->_select('SELECT sqlite_version() AS "v"', array(), true); - $supportsDropColumn = version_compare($row['v'], '3.35.0', '>='); - } catch (PDOException $e) { - $supportsDropColumn = false; - } - } - if ($supportsDropColumn) { + if ($this->_supportsDropColumn()) { $this->_db->exec( 'ALTER TABLE "' . $this->_sanitizeIdentifier('paste') . '" DROP COLUMN "postdate"' ); } } + if (version_compare($oldversion, '1.7.8', '<=')) { + if ($this->_supportsDropColumn()) { + $this->_db->exec( + 'ALTER TABLE "' . $this->_sanitizeIdentifier('paste') . + '" DROP COLUMN "opendiscussion"' + ); + $this->_db->exec( + 'ALTER TABLE "' . $this->_sanitizeIdentifier('paste') . + '" DROP COLUMN "burnafterreading"' + ); + $this->_db->exec( + 'ALTER TABLE "' . $this->_sanitizeIdentifier('paste') . + '" DROP COLUMN "attachment"' + ); + $this->_db->exec( + 'ALTER TABLE "' . $this->_sanitizeIdentifier('paste') . + '" DROP COLUMN "attachmentname"' + ); + } + } $this->_exec( 'UPDATE "' . $this->_sanitizeIdentifier('config') . '" SET "value" = ? WHERE "id" = ?', diff --git a/lib/Data/Filesystem.php b/lib/Data/Filesystem.php index 85cd2a5e..fec62c20 100644 --- a/lib/Data/Filesystem.php +++ b/lib/Data/Filesystem.php @@ -113,7 +113,7 @@ class Filesystem extends AbstractData ) { return false; } - return self::upgradePreV1Format($paste); + return $paste; } /** diff --git a/lib/Data/GoogleCloudStorage.php b/lib/Data/GoogleCloudStorage.php index e4866f46..2ab5d296 100644 --- a/lib/Data/GoogleCloudStorage.php +++ b/lib/Data/GoogleCloudStorage.php @@ -98,8 +98,7 @@ class GoogleCloudStorage extends AbstractData /** * Uploads the payload in the $this->_bucket under the specified key. * The entire payload is stored as a JSON document. The metadata is replicated - * as the GCS object's metadata except for the fields attachment, attachmentname - * and salt. + * as the GCS object's metadata except for the field salt. * * @param $key string to store the payload under * @param $payload array to store @@ -108,7 +107,7 @@ class GoogleCloudStorage extends AbstractData private function _upload($key, &$payload) { $metadata = array_key_exists('meta', $payload) ? $payload['meta'] : array(); - unset($metadata['attachment'], $metadata['attachmentname'], $metadata['salt']); + unset($metadata['salt']); foreach ($metadata as $k => $v) { $metadata[$k] = strval($v); } diff --git a/lib/Data/S3Storage.php b/lib/Data/S3Storage.php index d221d845..e72285f2 100644 --- a/lib/Data/S3Storage.php +++ b/lib/Data/S3Storage.php @@ -158,8 +158,7 @@ class S3Storage extends AbstractData /** * Uploads the payload in the $this->_bucket under the specified key. * The entire payload is stored as a JSON document. The metadata is replicated - * as the S3 object's metadata except for the fields attachment, attachmentname - * and salt. + * as the S3 object's metadata except for the field salt. * * @param $key string to store the payload under * @param $payload array to store @@ -168,7 +167,7 @@ class S3Storage extends AbstractData private function _upload($key, &$payload) { $metadata = array_key_exists('meta', $payload) ? $payload['meta'] : array(); - unset($metadata['attachment'], $metadata['attachmentname'], $metadata['salt']); + unset($metadata['salt']); foreach ($metadata as $k => $v) { $metadata[$k] = strval($v); } diff --git a/lib/Model/Paste.php b/lib/Model/Paste.php index 63233a4f..fa4288d4 100644 --- a/lib/Model/Paste.php +++ b/lib/Model/Paste.php @@ -22,6 +22,27 @@ use PrivateBin\Persistence\ServerSalt; */ class Paste extends AbstractModel { + /** + * authenticated data index of paste formatter (plaintext/syntaxhighlighting/markdown) + * + * @const int + */ + const ADATA_FORMATTER = 1; + + /** + * authenticated data index of open-discussion flag (0/1) + * + * @const int + */ + const ADATA_OPEN_DISCUSSION = 2; + + /** + * authenticated data index of burn-after-reading flag (0/1) + * + * @const int + */ + const ADATA_BURN_AFTER_READING = 3; + /** * Get paste data. * @@ -38,12 +59,13 @@ class Paste extends AbstractModel // check if paste has expired and delete it if necessary. if (array_key_exists('expire_date', $data['meta'])) { - if ($data['meta']['expire_date'] < time()) { + $now = time(); + if ($data['meta']['expire_date'] < $now) { $this->delete(); throw new Exception(Controller::GENERIC_ERROR, 63); } // We kindly provide the remaining time before expiration (in seconds) - $data['meta']['time_to_live'] = $data['meta']['expire_date'] - time(); + $data['meta']['time_to_live'] = $data['meta']['expire_date'] - $now; unset($data['meta']['expire_date']); } foreach (array('created', 'postdate') as $key) { @@ -54,8 +76,8 @@ class Paste extends AbstractModel // check if non-expired burn after reading paste needs to be deleted if ( - (array_key_exists('adata', $data) && $data['adata'][3] === 1) || - (array_key_exists('burnafterreading', $data['meta']) && $data['meta']['burnafterreading']) + array_key_exists('adata', $data) && + $data['adata'][self::ADATA_BURN_AFTER_READING] === 1 ) { $this->delete(); } @@ -205,9 +227,8 @@ class Paste extends AbstractModel if (!array_key_exists('adata', $this->_data) && !array_key_exists('data', $this->_data)) { $this->get(); } - return - (array_key_exists('adata', $this->_data) && $this->_data['adata'][2] === 1) || - (array_key_exists('opendiscussion', $this->_data['meta']) && $this->_data['meta']['opendiscussion']); + return array_key_exists('adata', $this->_data) && + $this->_data['adata'][self::ADATA_OPEN_DISCUSSION] === 1; } /** @@ -242,23 +263,26 @@ class Paste extends AbstractModel protected function _validate(array &$data) { // reject invalid or disabled formatters - if (!array_key_exists($data['adata'][1], $this->_conf->getSection('formatter_options'))) { + if (!array_key_exists($data['adata'][self::ADATA_FORMATTER], $this->_conf->getSection('formatter_options'))) { throw new Exception('Invalid data.', 75); } // discussion requested, but disabled in config or burn after reading requested as well, or invalid integer if ( - ($data['adata'][2] === 1 && ( // open discussion flag + ($data['adata'][self::ADATA_OPEN_DISCUSSION] === 1 && ( !$this->_conf->getKey('discussion') || - $data['adata'][3] === 1 // burn after reading flag + $data['adata'][self::ADATA_BURN_AFTER_READING] === 1 )) || - ($data['adata'][2] !== 0 && $data['adata'][2] !== 1) + ($data['adata'][self::ADATA_OPEN_DISCUSSION] !== 0 && $data['adata'][self::ADATA_OPEN_DISCUSSION] !== 1) ) { throw new Exception('Invalid data.', 74); } // reject invalid burn after reading - if ($data['adata'][3] !== 0 && $data['adata'][3] !== 1) { + if ( + $data['adata'][self::ADATA_BURN_AFTER_READING] !== 0 && + $data['adata'][self::ADATA_BURN_AFTER_READING] !== 1 + ) { throw new Exception('Invalid data.', 73); } } diff --git a/tst/Bootstrap.php b/tst/Bootstrap.php index 8748686d..f11894fc 100644 --- a/tst/Bootstrap.php +++ b/tst/Bootstrap.php @@ -39,22 +39,6 @@ class Helper */ private static $pasteid = '5b65a01b43987bc2'; - /** - * example paste version 1 - * - * @var array - */ - private static $pasteV1 = array( - 'data' => '{"iv":"EN39/wd5Nk8HAiSG2K5AsQ","v":1,"iter":1000,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"QKN1DBXe5PI","ct":"8hA83xDdXjD7K2qfmw5NdA"}', - 'attachment' => '{"iv":"Pd4pOKWkmDTT9uPwVwd5Ag","v":1,"iter":1000,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"ZIUhFTliVz4","ct":"6nOCU3peNDclDDpFtJEBKA"}', - 'attachmentname' => '{"iv":"76MkAtOGC4oFogX/aSMxRA","v":1,"iter":1000,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"ZIUhFTliVz4","ct":"b6Ae/U1xJdsX/+lATud4sQ"}', - 'meta' => array( - 'formatter' => 'plaintext', - 'postdate' => 1344803344, - 'opendiscussion' => true, - ), - ); - /** * example paste version 2 * @@ -91,17 +75,13 @@ class Helper private static $commentid = '5a52eebf11c4c94b'; /** - * example comment + * example comment meta data * * @var array */ - private static $commentV1 = array( - 'data' => '{"iv":"Pd4pOKWkmDTT9uPwVwd5Ag","v":1,"iter":1000,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"ZIUhFTliVz4","ct":"6nOCU3peNDclDDpFtJEBKA"}', - 'meta' => array( - 'nickname' => '{"iv":"76MkAtOGC4oFogX/aSMxRA","v":1,"iter":1000,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"ZIUhFTliVz4","ct":"b6Ae/U1xJdsX/+lATud4sQ"}', - 'vizhash' => 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAABGUlEQVQokWOsl5/94983CNKQMjnxaOePf98MeKwPfNjkLZ3AgARab6b9+PeNEVnDj3/ff/z7ZiHnzsDA8Pv7H2TVPJw8EAYLAwb48OaVgIgYKycLsrYv378wMDB8//qdCVMDRA9EKSsnCwRBxNsepaLboMFlyMDAICAi9uHNK24GITQ/MDAwoNhgIGMLtwGrzegaLjw5jMz9+vUdnN17uwDCQDhJgk0O07yvX9+teDX1x79v6DYIsIjgcgMaYGFgYOBg4kJx2JejkAiBxAw+PzAwMNz4dp6wDXDw4MdNNOl0rWYsNkD89OLXI/xmo9sgzatJjAYmBgYGDiauD3/ePP18nVgb4MF89+M5ZX6js293wUMpnr8KTQMAxsCJnJ30apMAAAAASUVORK5CYII=', - 'postdate' => 1344803528, - ), + private static $commentV2 = array( + 'icon' => 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAABGUlEQVQokWOsl5/94983CNKQMjnxaOePf98MeKwPfNjkLZ3AgARab6b9+PeNEVnDj3/ff/z7ZiHnzsDA8Pv7H2TVPJw8EAYLAwb48OaVgIgYKycLsrYv378wMDB8//qdCVMDRA9EKSsnCwRBxNsepaLboMFlyMDAICAi9uHNK24GITQ/MDAwoNhgIGMLtwGrzegaLjw5jMz9+vUdnN17uwDCQDhJgk0O07yvX9+teDX1x79v6DYIsIjgcgMaYGFgYOBg4kJx2JejkAiBxAw+PzAwMNz4dp6wDXDw4MdNNOl0rWYsNkD89OLXI/xmo9sgzatJjAYmBgYGDiauD3/ePP18nVgb4MF89+M5ZX6js293wUMpnr8KTQMAxsCJnJ30apMAAAAASUVORK5CYII=', + 'created' => 1344803528, ); /** @@ -124,30 +104,12 @@ class Helper /** * get example paste, as stored on server * - * @param int $version * @param array $meta * @return array */ - public static function getPaste($version = 2, array $meta = array()): array + public static function getPaste(array $meta = array()): array { - $example = self::getPasteWithAttachment($version, $meta); - // v1 has the attachment stored in a separate property - if ($version === 1) { - unset($example['attachment'], $example['attachmentname']); - } - return $example; - } - - /** - * get example paste with attachment, as stored on server - * - * @param int $version - * @param array $meta - * @return array - */ - public static function getPasteWithAttachment($version = 2, array $meta = array()): array - { - $example = $version === 1 ? self::$pasteV1 : self::$pasteV2; + $example = self::$pasteV2; $example['meta']['salt'] = ServerSalt::generate(); $example['meta'] = array_merge($example['meta'], $meta); return $example; @@ -156,31 +118,25 @@ class Helper /** * get example paste, as decoded from POST by the request object * - * @param int $version * @param array $meta * @return array */ - public static function getPastePost($version = 2, array $meta = array()): array + public static function getPastePost(array $meta = array()): array { - $example = self::getPaste($version, $meta); - if ($version == 2) { - $example['meta'] = array('expire' => $example['meta']['expire']); - } else { - unset($example['meta']['postdate']); - } + $example = self::getPaste($meta); + $example['meta'] = array('expire' => $example['meta']['expire']); return $example; } /** * get example paste, as received via POST by the user * - * @param int $version * @param array $meta * @return string */ - public static function getPasteJson($version = 2, array $meta = array()): string + public static function getPasteJson(array $meta = array()): string { - return json_encode(self::getPastePost($version, $meta)); + return json_encode(self::getPastePost($meta)); } /** @@ -196,20 +152,16 @@ class Helper /** * get example comment, as stored on server * - * @param int $version * @param array $meta * @return array */ - public static function getComment($version = 2, array $meta = array()): array + public static function getComment(array $meta = array()): array { - $example = $version === 1 ? self::$commentV1 : self::$pasteV2; - if ($version === 2) { - $example['adata'] = $example['adata'][0]; - $example['pasteid'] = $example['parentid'] = self::getPasteId(); - $example['meta']['created'] = self::$commentV1['meta']['postdate']; - $example['meta']['icon'] = self::$commentV1['meta']['vizhash']; - unset($example['meta']['expire']); - } + $example = self::$pasteV2; + $example['adata'] = $example['adata'][0]; + $example['pasteid'] = $example['parentid'] = self::getPasteId(); + unset($example['meta']['expire']); + $example['meta'] = array_merge($example['meta'], self::$commentV2); $example['meta'] = array_merge($example['meta'], $meta); return $example; } @@ -217,7 +169,6 @@ class Helper /** * get example comment, as decoded from POST by the request object * - * @param int $version * @return array */ public static function getCommentPost(): array @@ -230,7 +181,6 @@ class Helper /** * get example comment, as received via POST by user * - * @param int $version * @return string */ public static function getCommentJson(): string diff --git a/tst/ControllerTest.php b/tst/ControllerTest.php index 1cc62c74..a3ebb652 100644 --- a/tst/ControllerTest.php +++ b/tst/ControllerTest.php @@ -201,7 +201,7 @@ class ControllerTest extends TestCase $options = parse_ini_file(CONF, true); $options['traffic']['limit'] = 0; Helper::createIniFile(CONF, $options); - $paste = Helper::getPasteJson(2, array('expire' => 25)); + $paste = Helper::getPasteJson(array('expire' => 25)); $file = tempnam(sys_get_temp_dir(), 'FOO'); file_put_contents($file, $paste); Request::setInputStream($file); @@ -379,7 +379,7 @@ class ControllerTest extends TestCase $options = parse_ini_file(CONF, true); $options['traffic']['limit'] = 0; Helper::createIniFile(CONF, $options); - $paste = Helper::getPasteJson(2, array('expire' => 'foo')); + $paste = Helper::getPasteJson(array('expire' => 'foo')); $file = tempnam(sys_get_temp_dir(), 'FOO'); file_put_contents($file, $paste); Request::setInputStream($file); @@ -510,7 +510,7 @@ class ControllerTest extends TestCase $options['traffic']['limit'] = 0; Helper::createIniFile(CONF, $options); $file = tempnam(sys_get_temp_dir(), 'FOO'); - file_put_contents($file, Helper::getPasteJson(1)); + file_put_contents($file, '{"data":"","meta":{}}'); Request::setInputStream($file); $_SERVER['HTTP_X_REQUESTED_WITH'] = 'JSONHttpRequest'; $_SERVER['REQUEST_METHOD'] = 'POST'; @@ -696,7 +696,7 @@ class ControllerTest extends TestCase */ public function testReadExpired() { - $expiredPaste = Helper::getPaste(2, array('expire_date' => 1344803344)); + $expiredPaste = Helper::getPaste(array('expire_date' => 1344803344)); $this->_data->create(Helper::getPasteId(), $expiredPaste); $_SERVER['QUERY_STRING'] = Helper::getPasteId(); $_GET[Helper::getPasteId()] = ''; @@ -767,37 +767,6 @@ class ControllerTest extends TestCase $this->assertEquals(0, $response['comment_offset'], 'outputs comment_offset correctly'); } - /** - * @runInSeparateProcess - */ - public function testReadOldSyntax() - { - $paste = Helper::getPaste(1); - $paste['meta'] = array( - 'syntaxcoloring' => true, - 'postdate' => $paste['meta']['postdate'], - 'opendiscussion' => $paste['meta']['opendiscussion'], - ); - $this->_data->create(Helper::getPasteId(), $paste); - $_SERVER['QUERY_STRING'] = Helper::getPasteId(); - $_GET[Helper::getPasteId()] = ''; - $_SERVER['HTTP_X_REQUESTED_WITH'] = 'JSONHttpRequest'; - ob_start(); - new Controller; - $content = ob_get_contents(); - ob_end_clean(); - $response = json_decode($content, true); - $this->assertEquals(0, $response['status'], 'outputs success status'); - $this->assertEquals(Helper::getPasteId(), $response['id'], 'outputs data correctly'); - $this->assertStringEndsWith('?' . $response['id'], $response['url'], 'returned URL points to new paste'); - $this->assertEquals($paste['data'], $response['data'], 'outputs data correctly'); - $this->assertEquals('syntaxhighlighting', $response['meta']['formatter'], 'outputs format correctly'); - $this->assertFalse(array_key_exists('postdate', $response['meta']), 'does not output postdate'); - $this->assertEquals($paste['meta']['opendiscussion'], $response['meta']['opendiscussion'], 'outputs opendiscussion correctly'); - $this->assertEquals(0, $response['comment_count'], 'outputs comment_count correctly'); - $this->assertEquals(0, $response['comment_offset'], 'outputs comment_offset correctly'); - } - /** * @runInSeparateProcess */ @@ -933,7 +902,7 @@ class ControllerTest extends TestCase */ public function testDeleteExpired() { - $expiredPaste = Helper::getPaste(2, array('expire_date' => 1000)); + $expiredPaste = Helper::getPaste(array('expire_date' => 1000)); $this->assertFalse($this->_data->exists(Helper::getPasteId()), 'paste does not exist before being created'); $this->_data->create(Helper::getPasteId(), $expiredPaste); $this->assertTrue($this->_data->exists(Helper::getPasteId()), 'paste exists before deleting data'); diff --git a/tst/Data/DatabaseTest.php b/tst/Data/DatabaseTest.php index d76ea6ec..303d780b 100644 --- a/tst/Data/DatabaseTest.php +++ b/tst/Data/DatabaseTest.php @@ -60,8 +60,8 @@ class DatabaseTest extends TestCase $this->assertEquals($paste, $this->_model->read(Helper::getPasteId())); // storing comments - $comment1 = Helper::getComment(1); - $comment2 = Helper::getComment(2); + $comment1 = Helper::getComment(); + $comment2 = Helper::getComment(); $meta1 = $comment1['meta']; $meta2 = $comment2['meta']; $this->assertFalse($this->_model->existsComment(Helper::getPasteId(), Helper::getPasteId(), Helper::getCommentId()), 'v1 comment does not yet exist'); @@ -78,7 +78,7 @@ class DatabaseTest extends TestCase $comment2['meta'] = $meta2; $this->assertEquals( array( - $comment1['meta']['postdate'] => $comment1, + $comment1['meta']['created'] => $comment1, $comment2['meta']['created'] . '.1' => $comment2, ), $this->_model->readComments(Helper::getPasteId()) @@ -95,11 +95,8 @@ class DatabaseTest extends TestCase { // this assumes a version 1 formatted paste $this->_model->delete(Helper::getPasteId()); - $original = $paste = Helper::getPasteWithAttachment(1, array('expire_date' => 1344803344)); + $original = $paste = Helper::getPaste(array('expire_date' => 1344803344)); $paste['meta']['burnafterreading'] = $original['meta']['burnafterreading'] = true; - $paste['meta']['attachment'] = $paste['attachment']; - $paste['meta']['attachmentname'] = $paste['attachmentname']; - unset($paste['attachment'], $paste['attachmentname']); $this->assertFalse($this->_model->exists(Helper::getPasteId()), 'paste does not yet exist'); $this->assertTrue($this->_model->create(Helper::getPasteId(), $paste), 'store new paste'); $this->assertTrue($this->_model->exists(Helper::getPasteId()), 'paste exists after storing it'); @@ -113,8 +110,8 @@ class DatabaseTest extends TestCase public function testPurge() { $this->_model->delete(Helper::getPasteId()); - $expired = Helper::getPaste(2, array('expire_date' => 1344803344)); - $paste = Helper::getPaste(2, array('expire_date' => time() + 3600)); + $expired = Helper::getPaste(array('expire_date' => 1344803344)); + $paste = Helper::getPaste(array('expire_date' => time() + 3600)); $keys = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'x', 'y', 'z'); $ids = array(); foreach ($keys as $key) { @@ -145,7 +142,7 @@ class DatabaseTest extends TestCase public function testErrorDetection() { $this->_model->delete(Helper::getPasteId()); - $paste = Helper::getPaste(2, array('expire' => "Invalid UTF-8 sequence: \xB1\x31")); + $paste = Helper::getPaste(array('expire' => "Invalid UTF-8 sequence: \xB1\x31")); $this->assertFalse($this->_model->exists(Helper::getPasteId()), 'paste does not yet exist'); $this->assertFalse($this->_model->create(Helper::getPasteId(), $paste), 'unable to store broken paste'); $this->assertFalse($this->_model->exists(Helper::getPasteId()), 'paste does still not exist'); @@ -155,7 +152,7 @@ class DatabaseTest extends TestCase { $this->_model->delete(Helper::getPasteId()); $data = Helper::getPaste(); - $comment = Helper::getComment(2, array('nickname' => "Invalid UTF-8 sequence: \xB1\x31")); + $comment = Helper::getComment(array('icon' => "Invalid UTF-8 sequence: \xB1\x31")); $this->assertFalse($this->_model->exists(Helper::getPasteId()), 'paste does not yet exist'); $this->assertTrue($this->_model->create(Helper::getPasteId(), $data), 'store new paste'); $this->assertTrue($this->_model->exists(Helper::getPasteId()), 'paste exists after storing it'); @@ -263,91 +260,6 @@ class DatabaseTest extends TestCase new Database($options); } - public function testOldAttachments() - { - mkdir($this->_path); - $path = $this->_path . DIRECTORY_SEPARATOR . 'attachement-test.sq3'; - if (is_file($path)) { - unlink($path); - } - $this->_options['dsn'] = 'sqlite:' . $path; - $this->_options['tbl'] = 'bar_'; - $model = new Database($this->_options); - - $original = $paste = Helper::getPasteWithAttachment(1, array('expire_date' => 1344803344)); - $meta = $paste['meta']; - $meta['attachment'] = $paste['attachment']; - $meta['attachmentname'] = $paste['attachmentname']; - unset($paste['attachment'], $paste['attachmentname']); - - $db = new PDO( - $this->_options['dsn'], - $this->_options['usr'], - $this->_options['pwd'], - $this->_options['opt'] - ); - $statement = $db->prepare('INSERT INTO bar_paste VALUES(?,?,?,?,?,?,?,?)'); - $statement->execute( - array( - Helper::getPasteId(), - $paste['data'], - $paste['meta']['expire_date'], - 0, - 0, - json_encode($meta), - null, - null, - ) - ); - $statement->closeCursor(); - - $this->assertTrue($model->exists(Helper::getPasteId()), 'paste exists after storing it'); - $this->assertEquals($original, $model->read(Helper::getPasteId())); - - Helper::rmDir($this->_path); - } - - public function testCorruptMeta() - { - mkdir($this->_path); - $path = $this->_path . DIRECTORY_SEPARATOR . 'meta-test.sq3'; - if (is_file($path)) { - unlink($path); - } - $this->_options['dsn'] = 'sqlite:' . $path; - $this->_options['tbl'] = 'baz_'; - $model = new Database($this->_options); - $paste = Helper::getPaste(1, array('expire_date' => 1344803344)); - unset($paste['meta']['formatter'], $paste['meta']['opendiscussion'], $paste['meta']['postdate'], $paste['meta']['salt']); - $model->delete(Helper::getPasteId()); - - $db = new PDO( - $this->_options['dsn'], - $this->_options['usr'], - $this->_options['pwd'], - $this->_options['opt'] - ); - $statement = $db->prepare('INSERT INTO baz_paste VALUES(?,?,?,?,?,?,?,?)'); - $statement->execute( - array( - Helper::getPasteId(), - $paste['data'], - $paste['meta']['expire_date'], - 0, - 0, - '{', - null, - null, - ) - ); - $statement->closeCursor(); - - $this->assertTrue($model->exists(Helper::getPasteId()), 'paste exists after storing it'); - $this->assertEquals($paste, $model->read(Helper::getPasteId())); - - Helper::rmDir($this->_path); - } - public function testTableUpgrade() { mkdir($this->_path); diff --git a/tst/Data/FilesystemTest.php b/tst/Data/FilesystemTest.php index 49ffe954..507b4f5f 100644 --- a/tst/Data/FilesystemTest.php +++ b/tst/Data/FilesystemTest.php @@ -37,7 +37,7 @@ class FilesystemTest extends TestCase $this->_model->delete(Helper::getPasteId()); // storing pastes - $paste = Helper::getPaste(2, array('expire_date' => 1344803344)); + $paste = Helper::getPaste(array('expire_date' => 1344803344)); $this->assertFalse($this->_model->exists(Helper::getPasteId()), 'paste does not yet exist'); $this->assertTrue($this->_model->create(Helper::getPasteId(), $paste), 'store new paste'); $this->assertTrue($this->_model->exists(Helper::getPasteId()), 'paste exists after storing it'); @@ -67,10 +67,7 @@ class FilesystemTest extends TestCase public function testFileBasedAttachmentStoreWorks() { $this->_model->delete(Helper::getPasteId()); - $original = $paste = Helper::getPasteWithAttachment(1, array('expire_date' => 1344803344)); - $paste['meta']['attachment'] = $paste['attachment']; - $paste['meta']['attachmentname'] = $paste['attachmentname']; - unset($paste['attachment'], $paste['attachmentname']); + $original = $paste = Helper::getPaste(array('expire_date' => 1344803344)); $this->assertFalse($this->_model->exists(Helper::getPasteId()), 'paste does not yet exist'); $this->assertTrue($this->_model->create(Helper::getPasteId(), $paste), 'store new paste'); $this->assertTrue($this->_model->exists(Helper::getPasteId()), 'paste exists after storing it'); @@ -84,8 +81,8 @@ class FilesystemTest extends TestCase public function testPurge() { mkdir($this->_path . DIRECTORY_SEPARATOR . '00', 0777, true); - $expired = Helper::getPaste(2, array('expire_date' => 1344803344)); - $paste = Helper::getPaste(2, array('expire_date' => time() + 3600)); + $expired = Helper::getPaste(array('expire_date' => 1344803344)); + $paste = Helper::getPaste(array('expire_date' => time() + 3600)); $keys = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'x', 'y', 'z'); $ids = array(); foreach ($keys as $key) { @@ -115,7 +112,7 @@ class FilesystemTest extends TestCase public function testErrorDetection() { $this->_model->delete(Helper::getPasteId()); - $paste = Helper::getPaste(2, array('expire' => "Invalid UTF-8 sequence: \xB1\x31")); + $paste = Helper::getPaste(array('expire' => "Invalid UTF-8 sequence: \xB1\x31")); $this->assertFalse($this->_model->exists(Helper::getPasteId()), 'paste does not yet exist'); $this->assertFalse($this->_model->create(Helper::getPasteId(), $paste), 'unable to store broken paste'); $this->assertFalse($this->_model->exists(Helper::getPasteId()), 'paste does still not exist'); @@ -126,7 +123,7 @@ class FilesystemTest extends TestCase { $this->_model->delete(Helper::getPasteId()); $data = Helper::getPaste(); - $comment = Helper::getComment(1, array('nickname' => "Invalid UTF-8 sequence: \xB1\x31")); + $comment = Helper::getComment(array('icon' => "Invalid UTF-8 sequence: \xB1\x31")); $this->assertFalse($this->_model->exists(Helper::getPasteId()), 'paste does not yet exist'); $this->assertTrue($this->_model->create(Helper::getPasteId(), $data), 'store new paste'); $this->assertTrue($this->_model->exists(Helper::getPasteId()), 'paste exists after storing it'); diff --git a/tst/Data/GoogleCloudStorageTest.php b/tst/Data/GoogleCloudStorageTest.php index 42a32c2f..dde19dd4 100644 --- a/tst/Data/GoogleCloudStorageTest.php +++ b/tst/Data/GoogleCloudStorageTest.php @@ -50,7 +50,7 @@ class GoogleCloudStorageTest extends TestCase $this->_model->delete(Helper::getPasteId()); // storing pastes - $paste = Helper::getPaste(2, array('expire_date' => 1344803344)); + $paste = Helper::getPaste(array('expire_date' => 1344803344)); $this->assertFalse($this->_model->exists(Helper::getPasteId()), 'paste does not yet exist'); $this->assertTrue($this->_model->create(Helper::getPasteId(), $paste), 'store new paste'); $this->assertTrue($this->_model->exists(Helper::getPasteId()), 'paste exists after storing it'); @@ -82,8 +82,8 @@ class GoogleCloudStorageTest extends TestCase */ public function testPurge() { - $expired = Helper::getPaste(2, array('expire_date' => 1344803344)); - $paste = Helper::getPaste(2, array('expire_date' => time() + 3600)); + $expired = Helper::getPaste(array('expire_date' => 1344803344)); + $paste = Helper::getPaste(array('expire_date' => time() + 3600)); $keys = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'x', 'y', 'z'); $ids = array(); foreach ($keys as $key) { @@ -113,7 +113,7 @@ class GoogleCloudStorageTest extends TestCase public function testErrorDetection() { $this->_model->delete(Helper::getPasteId()); - $paste = Helper::getPaste(2, array('expire' => "Invalid UTF-8 sequence: \xB1\x31")); + $paste = Helper::getPaste(array('expire' => "Invalid UTF-8 sequence: \xB1\x31")); $this->assertFalse($this->_model->exists(Helper::getPasteId()), 'paste does not yet exist'); $this->assertFalse($this->_model->create(Helper::getPasteId(), $paste), 'unable to store broken paste'); $this->assertFalse($this->_model->exists(Helper::getPasteId()), 'paste does still not exist'); @@ -123,7 +123,7 @@ class GoogleCloudStorageTest extends TestCase { $this->_model->delete(Helper::getPasteId()); $data = Helper::getPaste(); - $comment = Helper::getComment(1, array('nickname' => "Invalid UTF-8 sequence: \xB1\x31")); + $comment = Helper::getComment(array('icon' => "Invalid UTF-8 sequence: \xB1\x31")); $this->assertFalse($this->_model->exists(Helper::getPasteId()), 'paste does not yet exist'); $this->assertTrue($this->_model->create(Helper::getPasteId(), $data), 'store new paste'); $this->assertTrue($this->_model->exists(Helper::getPasteId()), 'paste exists after storing it'); diff --git a/tst/ModelTest.php b/tst/ModelTest.php index 301856bc..00cc378e 100644 --- a/tst/ModelTest.php +++ b/tst/ModelTest.php @@ -103,57 +103,6 @@ class ModelTest extends TestCase $this->assertEquals(array(), $paste->getComments(), 'comment was deleted with paste'); } - public function testPasteV1() - { - $pasteData = Helper::getPaste(1); - unset($pasteData['meta']['formatter']); - - $path = $this->_path . DIRECTORY_SEPARATOR . 'v1-test.sq3'; - if (is_file($path)) { - unlink($path); - } - $options = parse_ini_file(CONF_SAMPLE, true); - $options['purge']['limit'] = 0; - $options['model'] = array( - 'class' => 'Database', - ); - $options['model_options'] = array( - 'dsn' => 'sqlite:' . $path, - 'usr' => null, - 'pwd' => null, - 'opt' => array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION), - ); - Helper::createIniFile(CONF, $options); - $model = new Model(new Configuration); - $model->getPaste('0000000000000000')->exists(); // triggers database table creation - $model->getPaste(Helper::getPasteId())->delete(); // deletes the cache - - $db = new PDO( - $options['model_options']['dsn'], - $options['model_options']['usr'], - $options['model_options']['pwd'], - $options['model_options']['opt'] - ); - $statement = $db->prepare('INSERT INTO paste VALUES(?,?,?,?,?,?,?,?)'); - $statement->execute( - array( - Helper::getPasteId(), - $pasteData['data'], - 0, - 0, - 0, - json_encode($pasteData['meta']), - null, - null, - ) - ); - $statement->closeCursor(); - - $paste = $model->getPaste(Helper::getPasteId()); - $this->assertNotEmpty($paste->getDeleteToken(), 'excercise the condition to load the data from storage'); - $this->assertEquals('plaintext', $paste->get()['meta']['formatter'], 'paste got created with default formatter'); - } - public function testCommentDefaults() { $class = 'PrivateBin\\Data\\' . $this->_conf->getKey('class', 'model'); @@ -428,8 +377,8 @@ class ModelTest extends TestCase $conf = new Configuration; $store = new Database($conf->getSection('model_options')); $store->delete(Helper::getPasteId()); - $expired = Helper::getPaste(2, array('expire_date' => 1344803344)); - $paste = Helper::getPaste(2, array('expire_date' => time() + 3600)); + $expired = Helper::getPaste(array('expire_date' => 1344803344)); + $paste = Helper::getPaste(array('expire_date' => time() + 3600)); $keys = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'x', 'y', 'z'); $ids = array(); foreach ($keys as $key) {