JsonApiTest.php 9.9 KB

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