JsonApiTest.php 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. <?php
  2. use PHPUnit\Framework\TestCase;
  3. use PrivateBin\Controller;
  4. use PrivateBin\Data\Filesystem;
  5. use PrivateBin\Persistence\ServerSalt;
  6. use PrivateBin\Request;
  7. class JsonApiTest extends TestCase
  8. {
  9. protected $_model;
  10. protected $_path;
  11. public function setUp(): void
  12. {
  13. /* Setup Routine */
  14. $this->_path = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'privatebin_data';
  15. $this->_model = Filesystem::getInstance(array('dir' => $this->_path));
  16. ServerSalt::setPath($this->_path);
  17. $_POST = array();
  18. $_GET = array();
  19. $_SERVER = array();
  20. if ($this->_model->exists(Helper::getPasteId())) {
  21. $this->_model->delete(Helper::getPasteId());
  22. }
  23. $options = parse_ini_file(CONF_SAMPLE, true);
  24. $options['purge']['dir'] = $this->_path;
  25. $options['traffic']['dir'] = $this->_path;
  26. $options['model_options']['dir'] = $this->_path;
  27. Helper::confBackup();
  28. Helper::createIniFile(CONF, $options);
  29. }
  30. public function tearDown(): void
  31. {
  32. /* Tear Down Routine */
  33. unlink(CONF);
  34. Helper::confRestore();
  35. Helper::rmDir($this->_path);
  36. }
  37. /**
  38. * @runInSeparateProcess
  39. */
  40. public function testCreate()
  41. {
  42. $options = parse_ini_file(CONF, true);
  43. $options['traffic']['limit'] = 0;
  44. Helper::createIniFile(CONF, $options);
  45. $paste = Helper::getPasteJson();
  46. $file = tempnam(sys_get_temp_dir(), 'FOO');
  47. file_put_contents($file, $paste);
  48. Request::setInputStream($file);
  49. $_SERVER['HTTP_X_REQUESTED_WITH'] = 'JSONHttpRequest';
  50. $_SERVER['REQUEST_METHOD'] = 'POST';
  51. $_SERVER['REMOTE_ADDR'] = '::1';
  52. $_SERVER['REQUEST_URI'] = '/';
  53. ob_start();
  54. new Controller;
  55. $content = ob_get_contents();
  56. ob_end_clean();
  57. $response = json_decode($content, true);
  58. $this->assertEquals(0, $response['status'], 'outputs status');
  59. $this->assertStringEndsWith('?' . $response['id'], $response['url'], 'returned URL points to new paste');
  60. $this->assertTrue($this->_model->exists($response['id']), 'paste exists after posting data');
  61. $paste = $this->_model->read($response['id']);
  62. $this->assertEquals(
  63. hash_hmac('sha256', $response['id'], $paste['meta']['salt']),
  64. $response['deletetoken'],
  65. 'outputs valid delete token'
  66. );
  67. }
  68. /**
  69. * @runInSeparateProcess
  70. */
  71. public function testPut()
  72. {
  73. $options = parse_ini_file(CONF, true);
  74. $options['traffic']['limit'] = 0;
  75. Helper::createIniFile(CONF, $options);
  76. $paste = Helper::getPasteJson();
  77. $file = tempnam(sys_get_temp_dir(), 'FOO');
  78. file_put_contents($file, $paste);
  79. Request::setInputStream($file);
  80. $_SERVER['QUERY_STRING'] = Helper::getPasteId();
  81. $_GET[Helper::getPasteId()] = '';
  82. $_SERVER['HTTP_X_REQUESTED_WITH'] = 'JSONHttpRequest';
  83. $_SERVER['REQUEST_METHOD'] = 'PUT';
  84. $_SERVER['REMOTE_ADDR'] = '::1';
  85. ob_start();
  86. new Controller;
  87. $content = ob_get_contents();
  88. ob_end_clean();
  89. unlink($file);
  90. $response = json_decode($content, true);
  91. $this->assertEquals(0, $response['status'], 'outputs status');
  92. $this->assertEquals(Helper::getPasteId(), $response['id'], 'outputted paste ID matches input');
  93. $this->assertStringEndsWith('?' . $response['id'], $response['url'], 'returned URL points to new paste');
  94. $this->assertTrue($this->_model->exists($response['id']), 'paste exists after posting data');
  95. $paste = $this->_model->read($response['id']);
  96. $this->assertEquals(
  97. hash_hmac('sha256', $response['id'], $paste['meta']['salt']),
  98. $response['deletetoken'],
  99. 'outputs valid delete token'
  100. );
  101. }
  102. /**
  103. * @runInSeparateProcess
  104. */
  105. public function testDelete()
  106. {
  107. $this->_model->create(Helper::getPasteId(), Helper::getPaste());
  108. $this->assertTrue($this->_model->exists(Helper::getPasteId()), 'paste exists before deleting data');
  109. $paste = $this->_model->read(Helper::getPasteId());
  110. $file = tempnam(sys_get_temp_dir(), 'FOO');
  111. file_put_contents($file, json_encode(array(
  112. 'deletetoken' => hash_hmac('sha256', Helper::getPasteId(), $paste['meta']['salt']),
  113. )));
  114. Request::setInputStream($file);
  115. $_SERVER['QUERY_STRING'] = Helper::getPasteId();
  116. $_GET[Helper::getPasteId()] = '';
  117. $_SERVER['HTTP_X_REQUESTED_WITH'] = 'JSONHttpRequest';
  118. $_SERVER['REQUEST_METHOD'] = 'DELETE';
  119. ob_start();
  120. new Controller;
  121. $content = ob_get_contents();
  122. ob_end_clean();
  123. unlink($file);
  124. $response = json_decode($content, true);
  125. $this->assertEquals(0, $response['status'], 'outputs status');
  126. $this->assertFalse($this->_model->exists(Helper::getPasteId()), 'paste successfully deleted');
  127. }
  128. /**
  129. * @runInSeparateProcess
  130. */
  131. public function testDeleteWithPost()
  132. {
  133. $this->_model->create(Helper::getPasteId(), Helper::getPaste());
  134. $this->assertTrue($this->_model->exists(Helper::getPasteId()), 'paste exists before deleting data');
  135. $paste = $this->_model->read(Helper::getPasteId());
  136. $file = tempnam(sys_get_temp_dir(), 'FOO');
  137. file_put_contents($file, json_encode(array(
  138. 'pasteid' => Helper::getPasteId(),
  139. 'deletetoken' => hash_hmac('sha256', Helper::getPasteId(), $paste['meta']['salt']),
  140. )));
  141. Request::setInputStream($file);
  142. $_SERVER['HTTP_X_REQUESTED_WITH'] = 'JSONHttpRequest';
  143. $_SERVER['REQUEST_METHOD'] = 'POST';
  144. ob_start();
  145. new Controller;
  146. $content = ob_get_contents();
  147. ob_end_clean();
  148. $response = json_decode($content, true);
  149. $this->assertEquals(0, $response['status'], 'outputs status');
  150. $this->assertFalse($this->_model->exists(Helper::getPasteId()), 'paste successfully deleted');
  151. }
  152. /**
  153. * @runInSeparateProcess
  154. */
  155. public function testRead()
  156. {
  157. $paste = Helper::getPaste();
  158. $this->_model->create(Helper::getPasteId(), $paste);
  159. $_SERVER['QUERY_STRING'] = Helper::getPasteId();
  160. $_GET[Helper::getPasteId()] = '';
  161. $_SERVER['HTTP_X_REQUESTED_WITH'] = 'JSONHttpRequest';
  162. ob_start();
  163. new Controller;
  164. $content = ob_get_contents();
  165. ob_end_clean();
  166. $response = json_decode($content, true);
  167. $this->assertEquals(0, $response['status'], 'outputs success status');
  168. $this->assertEquals(Helper::getPasteId(), $response['id'], 'outputs data correctly');
  169. $this->assertStringEndsWith('?' . $response['id'], $response['url'], 'returned URL points to new paste');
  170. $this->assertEquals($paste['ct'], $response['ct'], 'outputs data correctly');
  171. $this->assertEquals($paste['meta']['created'], $response['meta']['created'], 'outputs postdate correctly');
  172. $this->assertEquals(0, $response['comment_count'], 'outputs comment_count correctly');
  173. $this->assertEquals(0, $response['comment_offset'], 'outputs comment_offset correctly');
  174. }
  175. /**
  176. * @runInSeparateProcess
  177. */
  178. public function testJsonLdPaste()
  179. {
  180. $paste = Helper::getPaste();
  181. $this->_model->create(Helper::getPasteId(), $paste);
  182. $_GET['jsonld'] = 'paste';
  183. ob_start();
  184. new Controller;
  185. $content = ob_get_contents();
  186. ob_end_clean();
  187. $this->assertEquals(str_replace(
  188. '?jsonld=',
  189. '/?jsonld=',
  190. file_get_contents(PUBLIC_PATH . '/js/paste.jsonld')
  191. ), $content, 'outputs data correctly');
  192. }
  193. /**
  194. * @runInSeparateProcess
  195. */
  196. public function testJsonLdComment()
  197. {
  198. $paste = Helper::getPaste();
  199. $this->_model->create(Helper::getPasteId(), $paste);
  200. $_GET['jsonld'] = 'comment';
  201. ob_start();
  202. new Controller;
  203. $content = ob_get_contents();
  204. ob_end_clean();
  205. $this->assertEquals(str_replace(
  206. '?jsonld=',
  207. '/?jsonld=',
  208. file_get_contents(PUBLIC_PATH . '/js/comment.jsonld')
  209. ), $content, 'outputs data correctly');
  210. }
  211. /**
  212. * @runInSeparateProcess
  213. */
  214. public function testJsonLdPasteMeta()
  215. {
  216. $paste = Helper::getPaste();
  217. $this->_model->create(Helper::getPasteId(), $paste);
  218. $_GET['jsonld'] = 'pastemeta';
  219. ob_start();
  220. new Controller;
  221. $content = ob_get_contents();
  222. ob_end_clean();
  223. $this->assertEquals(str_replace(
  224. '?jsonld=',
  225. '/?jsonld=',
  226. file_get_contents(PUBLIC_PATH . '/js/pastemeta.jsonld')
  227. ), $content, 'outputs data correctly');
  228. }
  229. /**
  230. * @runInSeparateProcess
  231. */
  232. public function testJsonLdCommentMeta()
  233. {
  234. $paste = Helper::getPaste();
  235. $this->_model->create(Helper::getPasteId(), $paste);
  236. $_GET['jsonld'] = 'commentmeta';
  237. ob_start();
  238. new Controller;
  239. $content = ob_get_contents();
  240. ob_end_clean();
  241. $this->assertEquals(str_replace(
  242. '?jsonld=',
  243. '/?jsonld=',
  244. file_get_contents(PUBLIC_PATH . '/js/commentmeta.jsonld')
  245. ), $content, 'outputs data correctly');
  246. }
  247. /**
  248. * @runInSeparateProcess
  249. */
  250. public function testJsonLdInvalid()
  251. {
  252. $paste = Helper::getPaste();
  253. $this->_model->create(Helper::getPasteId(), $paste);
  254. $_GET['jsonld'] = CONF;
  255. ob_start();
  256. new Controller;
  257. $content = ob_get_contents();
  258. ob_end_clean();
  259. $this->assertEquals('{}', $content, 'does not output nasty data');
  260. }
  261. }