reset(); $output->download_headers('test'); $this->assertCount(3, $output->headers); $this->assertContains('Content-Disposition: attachment; filename="test"', $output->headers); $this->assertContains('Content-Type: application/octet-stream', $output->headers); $this->assertContains('Content-Security-Policy: default-src \'none\'; img-src \'self\'', $output->headers); // Invalid content type $output->reset(); $params = ['type' => 'invalid']; $output->download_headers('test', $params); $this->assertCount(3, $output->headers); $this->assertContains('Content-Type: application/octet-stream', $output->headers); // Test inline disposition with type_charset $output->reset(); $params = ['disposition' => 'inline', 'type' => 'text/plain', 'type_charset' => 'ISO-8859-1']; $output->download_headers('test', $params); $this->assertCount(3, $output->headers); $this->assertContains('Content-Disposition: inline; filename="test"', $output->headers); $this->assertContains('Content-Type: text/plain; charset=ISO-8859-1', $output->headers); // Insecure content-type elimination for inline mode $types = [ 'application/ecmascript', 'application/javascript', 'application/javascript-1.2', 'application/x-javascript', 'application/x-jscript', 'application/xml', 'application/xhtml+xml', 'text/javascript', 'text/xml', 'text/unknown', ]; foreach ($types as $type) { $output->reset(); $params = ['type' => $type, 'disposition' => 'inline']; $output->download_headers('test', $params); $this->assertContains('Content-Type: text/plain; charset=' . RCUBE_CHARSET, $output->headers, "Case:{$type}"); } // TODO: More test cases $this->markTestIncomplete(); } /** * Test get_edit_field() */ public function test_get_edit_field() { $out = \rcube_output::get_edit_field('test', 'value'); $this->assertSame('', $out); $_POST['_test'] = 'testv'; $out = \rcube_output::get_edit_field('test', 'value'); $this->assertSame('', $out); $out = \rcube_output::get_edit_field('test', 'value', ['class' => 'a'], 'checkbox'); $this->assertSame('', $out); $out = \rcube_output::get_edit_field('test', 'value', ['class' => 'a'], 'textarea'); $this->assertSame('', $out); $out = \rcube_output::get_edit_field('test', 'value', ['class' => 'a'], 'select'); $this->assertSame('', $out); $_POST['_test'] = 'tt'; $attr = ['options' => ['tt' => 'oo']]; $out = \rcube_output::get_edit_field('test', 'value', $attr, 'select'); $this->assertSame('', $out ); } /** * Test json_serialize() */ public function test_json_serialize() { $this->assertSame('""', \rcube_output::json_serialize('')); $this->assertSame('[]', \rcube_output::json_serialize([])); $this->assertSame('10', \rcube_output::json_serialize(10)); $this->assertSame('{"test":"test"}', \rcube_output::json_serialize(['test' => 'test'])); // Test non-utf-8 input $this->assertSame('{"ab":"ab"}', \rcube_output::json_serialize(["a\x8cb" => "a\x8cb"])); } }