a43b7d05580f8e66a68253d578ae10b932efdf41
[moodle.git] / lib / tests / htmlpurifier_test.php
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
17 /**
18  * Unit tests for the HTMLPurifier integration
19  *
20  * @package    core_core
21  * @category   phpunit
22  * @copyright  2012 Petr Skoda {@link http://skodak.org}
23  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24  */
26 defined('MOODLE_INTERNAL') || die();
29 class core_htmlpurifier_testcase extends basic_testcase {
31     /**
32      * Verify _blank target is allowed
33      * @return void
34      */
35     public function test_allow_blank_target() {
36         $text = '<a href="http://moodle.org" target="_blank">Some link</a>';
37         $result = format_text($text, FORMAT_HTML);
38         $this->assertSame($text, $result);
40         $result = format_text('<a href="http://moodle.org" target="some">Some link</a>', FORMAT_HTML);
41         $this->assertSame('<a href="http://moodle.org">Some link</a>', $result);
42     }
44     /**
45      * Verify our nolink tag accepted
46      * @return void
47      */
48     public function test_nolink() {
49         // we can not use format text because nolink changes result
50         $text = '<nolink><div>no filters</div></nolink>';
51         $result = purify_html($text, array());
52         $this->assertSame($text, $result);
54         $text = '<nolink>xxx<em>xx</em><div>xxx</div></nolink>';
55         $result = purify_html($text, array());
56         $this->assertSame($text, $result);
57     }
59     /**
60      * Verify our tex tag accepted
61      * @return void
62      */
63     public function test_tex() {
64         $text = '<tex>a+b=c</tex>';
65         $result = purify_html($text, array());
66         $this->assertSame($text, $result);
67     }
69     /**
70      * Verify our algebra tag accepted
71      * @return void
72      */
73     public function test_algebra() {
74         $text = '<algebra>a+b=c</algebra>';
75         $result = purify_html($text, array());
76         $this->assertSame($text, $result);
77     }
79     /**
80      * Verify our hacky multilang works
81      * @return void
82      */
83     public function test_multilang() {
84         $text = '<lang lang="en">hmmm</lang><lang lang="anything">hm</lang>';
85         $result = purify_html($text, array());
86         $this->assertSame($text, $result);
88         $text = '<span lang="en" class="multilang">hmmm</span><span lang="anything" class="multilang">hm</span>';
89         $result = purify_html($text, array());
90         $this->assertSame($text, $result);
92         $text = '<span lang="en">hmmm</span>';
93         $result = purify_html($text, array());
94         $this->assertNotSame($text, $result);
96         // keep standard lang tags
98         $text = '<span lang="de_DU" class="multilang">asas</span>';
99         $result = purify_html($text, array());
100         $this->assertSame($text, $result);
102         $text = '<lang lang="de_DU">xxxxxx</lang>';
103         $result = purify_html($text, array());
104         $this->assertSame($text, $result);
105     }
107     /**
108      * Tests the 'allowid' option for format_text.
109      * @return void
110      */
111     public function test_format_text_allowid() {
112         // Start off by not allowing ids (default)
113         $options = array(
114             'nocache' => true
115         );
116         $result = format_text('<div id="example">Frog</div>', FORMAT_HTML, $options);
117         $this->assertSame('<div>Frog</div>', $result);
119         // Now allow ids
120         $options['allowid'] = true;
121         $result = format_text('<div id="example">Frog</div>', FORMAT_HTML, $options);
122         $this->assertSame('<div id="example">Frog</div>', $result);
123     }
125     /**
126      * Test if linebreaks kept unchanged.
127      * @return void
128      */
129     function test_line_breaking() {
130         $text = "\n\raa\rsss\nsss\r";
131         $this->assertSame($text, purify_html($text));
132     }
134     /**
135      * Test fixing of strict problems.
136      * @return void
137      */
138     function test_tidy() {
139         $text = "<p>xx";
140         $this->assertSame('<p>xx</p>', purify_html($text));
142         $text = "<P>xx</P>";
143         $this->assertSame('<p>xx</p>', purify_html($text));
145         $text = "xx<br>";
146         $this->assertSame('xx<br />', purify_html($text));
147     }
149     /**
150      * Test nesting - this used to cause problems in earlier versions
151      * @return void
152      */
153     function test_nested_lists() {
154         $text = "<ul><li>One<ul><li>Two</li></ul></li><li>Three</li></ul>";
155         $this->assertSame($text, purify_html($text));
156     }
158     /**
159      * Test that XSS protection works, complete smoke tests are in htmlpurifier itself.
160      * @return void
161      */
162     function test_cleaning_nastiness() {
163         $text = "x<SCRIPT>alert('XSS')</SCRIPT>x";
164         $this->assertSame('xx', purify_html($text));
166         $text = '<DIV STYLE="background-image:url(javascript:alert(\'XSS\'))">xx</DIV>';
167         $this->assertSame('<div>xx</div>', purify_html($text));
169         $text = '<DIV STYLE="width:expression(alert(\'XSS\'));">xx</DIV>';
170         $this->assertSame('<div>xx</div>', purify_html($text));
172         $text = 'x<IFRAME SRC="javascript:alert(\'XSS\');"></IFRAME>x';
173         $this->assertSame('xx', purify_html($text));
175         $text = 'x<OBJECT TYPE="text/x-scriptlet" DATA="http://ha.ckers.org/scriptlet.html"></OBJECT>x';
176         $this->assertSame('xx', purify_html($text));
178         $text = 'x<EMBED SRC="http://ha.ckers.org/xss.swf" AllowScriptAccess="always"></EMBED>x';
179         $this->assertSame('xx', purify_html($text));
181         $text = 'x<form></form>x';
182         $this->assertSame('xx', purify_html($text));
183     }