JsonApiTest.php 10.0 KB

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