MDL-28627 remove buggy and obsolete KSES cleaning
authorPetr Skoda <commits@skodak.org>
Sat, 22 Oct 2011 07:25:06 +0000 (09:25 +0200)
committerPetr Skoda <commits@skodak.org>
Sat, 22 Oct 2011 07:25:06 +0000 (09:25 +0200)
admin/settings/security.php
lang/en/admin.php
lib/db/upgrade.php
lib/kses.php [deleted file]
lib/setup.php
lib/simpletest/testpurifier.php
lib/simpletest/testweblib.php
lib/thirdpartylibs.xml
lib/weblib.php
version.php

index b72333c..de44e51 100644 (file)
@@ -33,9 +33,6 @@ if ($hassiteconfig) { // speedup for non-admins, add all caps used on this page
     $params->displaysize = display_size($defaultuserquota);
     $temp->add(new admin_setting_configtext('userquota', get_string('userquota', 'admin'), get_string('configuserquota', 'admin', $params), $defaultuserquota));
 
-    $item = new admin_setting_configcheckbox('enablehtmlpurifier', get_string('enablehtmlpurifier', 'admin'), get_string('configenablehtmlpurifier', 'admin'), 1);
-    $item->set_updatedcallback('reset_text_filters_cache');
-    $temp->add($item);
     $temp->add(new admin_setting_configcheckbox('allowobjectembed', get_string('allowobjectembed', 'admin'), get_string('configallowobjectembed', 'admin'), 0));
     $temp->add(new admin_setting_configcheckbox('enabletrusttext', get_string('enabletrusttext', 'admin'), get_string('configenabletrusttext', 'admin'), 0));
     $temp->add(new admin_setting_configselect('maxeditingtime', get_string('maxeditingtime','admin'), get_string('configmaxeditingtime','admin'), 1800,
index 0f626f8..1ca55e4 100644 (file)
@@ -191,7 +191,6 @@ $string['configenablecomments'] = 'Enable comments';
 $string['configenablecourserequests'] = 'This will allow any user to request a course be created.';
 $string['configenableglobalsearch'] = 'This setting enables global text searching in resources and activities, it is not compatible with PHP 4.';
 $string['configenablegroupmembersonly'] = 'If enabled, access to activities can be restricted to group members only. This may result in an increased server load. In addition, gradebook categories must be set up in a certain way to ensure that activities are hidden from non-group members.';
-$string['configenablehtmlpurifier'] = 'Use HTML Purifier instead of KSES for cleaning of untrusted text. HTML Purifier is actively developed and is believed to be more secure, but it is more resource intensive. Expect minor visual differences in the resulting html code. Please note that embed and object tags can not be enabled, MathML tags and old lang tags are not supported.';
 $string['configenablemobilewebservice'] = 'Enable mobile service for the official Moodle app or other app requesting it. For more information, read the {$a}';
 $string['configenablerssfeeds'] = 'This switch will enable RSS feeds from across the site.  To actually see any change you will need to enable RSS feeds in the individual modules too - go to the Modules settings under Admin Configuration.';
 $string['configenablerssfeedsdisabled'] = 'It is not available because RSS feeds are disabled in all the Site. To enable them, go to the Variables settings under Admin Configuration.';
@@ -473,7 +472,6 @@ $string['enableglobalsearch'] = 'Enable global search';
 $string['enablegravatar'] = 'Enable Gravatar';
 $string['enablegravatar_help'] = 'When enabled Moodle will attempt to fetch a user profile picture from Gravatar if the user has not uploaded an image.';
 $string['enablegroupmembersonly'] = 'Enable group members only';
-$string['enablehtmlpurifier'] = 'Enable HTML Purifier';
 $string['enablemobilewebservice'] = 'Enable mobile web service';
 $string['enablerecordcache'] = 'Enable record cache';
 $string['enablerssfeeds'] = 'Enable RSS feeds';
index a100802..0184da5 100644 (file)
@@ -3716,14 +3716,6 @@ WHERE gradeitemid IS NOT NULL AND grademax IS NOT NULL");
         upgrade_main_savepoint(true, 2010051801);
     }
 
-    if ($oldversion < 2010052100) {
-        // Switch to html purifier as default cleaning engine - KSES is really very bad
-        if (empty($CFG->enablehtmlpurifier)) {
-            unset_config('enablehtmlpurifier');
-        }
-        upgrade_main_savepoint(true, 2010052100);
-    }
-
     if ($oldversion < 2010052200) {
         // Define field legacyfiles to be added to course - just in case we are upgrading from PR1
         $table = new xmldb_table('course');
@@ -6810,6 +6802,12 @@ FROM
         upgrade_main_savepoint(true, 2011101200.01);
     }
 
+    if ($oldversion < 2011101900.02) {
+        // remove unused setting
+        unset_config('enablehtmlpurifier');
+        upgrade_main_savepoint(true, 2011101900.02);
+    }
+
     return true;
 }
 
diff --git a/lib/kses.php b/lib/kses.php
deleted file mode 100644 (file)
index 8d87c23..0000000
+++ /dev/null
@@ -1,712 +0,0 @@
-<?php
-/**
- * kses 0.2.2 - HTML/XHTML filter that only allows some elements and attributes
- * Copyright (C) 2002, 2003, 2005  Ulf Harnhammar
- *
- * This program is free software and open source software; you can redistribute
- * it and/or modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 3 of the License,
- * or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA  or visit
- * http://www.gnu.org/licenses/gpl.html
- *
- * *** CONTACT INFORMATION ***
- *
- * E-mail:      metaur at users dot sourceforge dot net
- * Web page:    http://sourceforge.net/projects/kses
- * Paper mail:  Ulf Harnhammar
- *              Ymergatan 17 C
- *              753 25  Uppsala
- *              SWEDEN
- *
- * [kses strips evil scripts!]
- *
- * @package   moodlecore
- * @copyright Ulf Harnhammar  {@link http://sourceforge.net/projects/kses}
- * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-
-/**
- * This function makes sure that only the allowed HTML element names, attribute
- * names and attribute values plus only sane HTML entities will occur in
- * $string. You have to remove any slashes from PHP's magic quotes before you
- * call this function.
- *
- * @param string $string
- * @param string $allowed_html
- * @param array $allowed_protocols
- * @return string
- */
-function kses($string, $allowed_html, $allowed_protocols =
-               array('http', 'https', 'ftp', 'news', 'nntp', 'telnet',
-                     'gopher', 'mailto'))
-###############################################################################
-# This function makes sure that only the allowed HTML element names, attribute
-# names and attribute values plus only sane HTML entities will occur in
-# $string. You have to remove any slashes from PHP's magic quotes before you
-# call this function.
-###############################################################################
-{
-  $string = kses_no_null($string);
-  $string = kses_js_entities($string);
-  $string = kses_normalize_entities($string);
-  $string = kses_hook($string);
-  $allowed_html_fixed = kses_array_lc($allowed_html);
-  return kses_split($string, $allowed_html_fixed, $allowed_protocols);
-} # function kses
-
-
-/**
- * You add any kses hooks here
- *
- * @param string $string
- * @return string
- */
-function kses_hook($string)
-###############################################################################
-# You add any kses hooks here.
-###############################################################################
-{
-  return $string;
-} # function kses_hook
-
-/**
- * This function returns kses' version number.
- *
- * @return string
- */
-function kses_version()
-###############################################################################
-# This function returns kses' version number.
-###############################################################################
-{
-  return '0.2.2';
-} # function kses_version
-
-
-/**
- * This function searches for HTML tags, no matter how malformed. It also
- * matches stray ">" characters.
- *
- * @param string $string
- * @param string $allowed_html
- * @param array $allowed_protocols
- * @return string
- */
-function kses_split($string, $allowed_html, $allowed_protocols)
-###############################################################################
-# This function searches for HTML tags, no matter how malformed. It also
-# matches stray ">" characters.
-###############################################################################
-{
-  return preg_replace('%(<'.   # EITHER: <
-                      '[^>]*'. # things that aren't >
-                      '(>|$)'. # > or end of string
-                      '|>)%e', # OR: just a >
-                      "kses_split2('\\1', \$allowed_html, ".
-                      '$allowed_protocols)',
-                      $string);
-} # function kses_split
-
-/**
- * This function does a lot of work. It rejects some very malformed things
- * like <:::>. It returns an empty string, if the element isn't allowed (look
- * ma, no strip_tags()!). Otherwise it splits the tag into an element and an
- * attribute list.
- *
- * @param string $string
- * @param string $allowed_html
- * @param array $allowed_protocols
- * @return string
- */
-function kses_split2($string, $allowed_html, $allowed_protocols)
-###############################################################################
-# This function does a lot of work. It rejects some very malformed things
-# like <:::>. It returns an empty string, if the element isn't allowed (look
-# ma, no strip_tags()!). Otherwise it splits the tag into an element and an
-# attribute list.
-###############################################################################
-{
-  $string = kses_stripslashes($string);
-
-  if (substr($string, 0, 1) != '<')
-    return '&gt;';
-    # It matched a ">" character
-
-  if (!preg_match('%^<\s*(/\s*)?([a-zA-Z0-9]+)([^>]*)>?$%', $string, $matches))
-    return '';
-    # It's seriously malformed
-
-  $slash = trim($matches[1]);
-  $elem = $matches[2];
-  $attrlist = $matches[3];
-
-  if (!@isset($allowed_html[strtolower($elem)]))
-    return '';
-    # They are using a not allowed HTML element
-
-  if ($slash != '')
-    return "<$slash$elem>";
-  # No attributes are allowed for closing elements
-
-  return kses_attr("$slash$elem", $attrlist, $allowed_html,
-                   $allowed_protocols);
-} # function kses_split2
-
-/**
- * This function removes all attributes, if none are allowed for this element.
- * If some are allowed it calls kses_hair() to split them further, and then it
- * builds up new HTML code from the data that kses_hair() returns. It also
- * removes "<" and ">" characters, if there are any left. One more thing it
- * does is to check if the tag has a closing XHTML slash, and if it does,
- * it puts one in the returned code as well.
- *
- * @param string $element
- * @param string $attr
- * @param string $allowed_html
- * @param array $allowed_protocols
- * @return string
- */
-function kses_attr($element, $attr, $allowed_html, $allowed_protocols)
-###############################################################################
-# This function removes all attributes, if none are allowed for this element.
-# If some are allowed it calls kses_hair() to split them further, and then it
-# builds up new HTML code from the data that kses_hair() returns. It also
-# removes "<" and ">" characters, if there are any left. One more thing it
-# does is to check if the tag has a closing XHTML slash, and if it does,
-# it puts one in the returned code as well.
-###############################################################################
-{
-# Is there a closing XHTML slash at the end of the attributes?
-
-  $xhtml_slash = '';
-  if (preg_match('%\s/\s*$%', $attr))
-    $xhtml_slash = ' /';
-
-# Are any attributes allowed at all for this element?
-
-  if (@count($allowed_html[strtolower($element)]) == 0)
-    return "<$element$xhtml_slash>";
-
-# Split it
-
-  $attrarr = kses_hair($attr, $allowed_protocols);
-
-# Go through $attrarr, and save the allowed attributes for this element
-# in $attr2
-
-  $attr2 = '';
-
-  foreach ($attrarr as $arreach)
-  {
-    if (!@isset($allowed_html[strtolower($element)]
-                            [strtolower($arreach['name'])]))
-      continue; # the attribute is not allowed
-
-    $current = $allowed_html[strtolower($element)]
-                            [strtolower($arreach['name'])];
-
-    if (!is_array($current))
-      $attr2 .= ' '.$arreach['whole'];
-    # there are no checks
-
-    else
-    {
-    # there are some checks
-      $ok = true;
-      foreach ($current as $currkey => $currval)
-        if (!kses_check_attr_val($arreach['value'], $arreach['vless'],
-                                 $currkey, $currval))
-        { $ok = false; break; }
-
-      if ($ok)
-        $attr2 .= ' '.$arreach['whole']; # it passed them
-    } # if !is_array($current)
-  } # foreach
-
-# Remove any "<" or ">" characters
-
-  $attr2 = preg_replace('/[<>]/', '', $attr2);
-
-  return "<$element$attr2$xhtml_slash>";
-} # function kses_attr
-
-/**
- * This function does a lot of work. It parses an attribute list into an array
- * with attribute data, and tries to do the right thing even if it gets weird
- * input. It will add quotes around attribute values that don't have any quotes
- * or apostrophes around them, to make it easier to produce HTML code that will
- * conform to W3C's HTML specification. It will also remove bad URL protocols
- * from attribute values.
- *
- * @param string $attr
- * @param array $allowed_protocols
- * @return array
- */
-function kses_hair($attr, $allowed_protocols)
-###############################################################################
-# This function does a lot of work. It parses an attribute list into an array
-# with attribute data, and tries to do the right thing even if it gets weird
-# input. It will add quotes around attribute values that don't have any quotes
-# or apostrophes around them, to make it easier to produce HTML code that will
-# conform to W3C's HTML specification. It will also remove bad URL protocols
-# from attribute values.
-###############################################################################
-{
-  $attrarr = array();
-  $mode = 0;
-  $attrname = '';
-
-# Loop through the whole attribute list
-
-  while (strlen($attr) != 0)
-  {
-    $working = 0; # Was the last operation successful?
-
-    switch ($mode)
-    {
-      case 0: # attribute name, href for instance
-
-        if (preg_match('/^([-a-zA-Z]+)/', $attr, $match))
-        {
-          $attrname = $match[1];
-          $working = $mode = 1;
-          $attr = preg_replace('/^[-a-zA-Z]+/', '', $attr);
-        }
-
-        break;
-
-      case 1: # equals sign or valueless ("selected")
-
-        if (preg_match('/^\s*=\s*/', $attr)) # equals sign
-        {
-          $working = 1; $mode = 2;
-          $attr = preg_replace('/^\s*=\s*/', '', $attr);
-          break;
-        }
-
-        if (preg_match('/^\s+/', $attr)) # valueless
-        {
-          $working = 1; $mode = 0;
-          $attrarr[] = array
-                        ('name'  => $attrname,
-                         'value' => '',
-                         'whole' => $attrname,
-                         'vless' => 'y');
-          $attr = preg_replace('/^\s+/', '', $attr);
-        }
-
-        break;
-
-      case 2: # attribute value, a URL after href= for instance
-
-        if (preg_match('/^"([^"]*)"(\s+|$)/', $attr, $match))
-         # "value"
-        {
-          // MDL-2684 - kses stripping CSS styles that it thinks look like protocols
-          if ($attrname == 'style') {
-              $thisval = $match[1];
-          } else {
-              $thisval = kses_bad_protocol($match[1], $allowed_protocols);
-          }
-
-          $attrarr[] = array
-                        ('name'  => $attrname,
-                         'value' => $thisval,
-                         'whole' => "$attrname=\"$thisval\"",
-                         'vless' => 'n');
-          $working = 1; $mode = 0;
-          $attr = preg_replace('/^"[^"]*"(\s+|$)/', '', $attr);
-          break;
-        }
-
-        if (preg_match("/^'([^']*)'(\s+|$)/", $attr, $match))
-         # 'value'
-        {
-          $thisval = kses_bad_protocol($match[1], $allowed_protocols);
-
-          $attrarr[] = array
-                        ('name'  => $attrname,
-                         'value' => $thisval,
-                         'whole' => "$attrname='$thisval'",
-                         'vless' => 'n');
-          $working = 1; $mode = 0;
-          $attr = preg_replace("/^'[^']*'(\s+|$)/", '', $attr);
-          break;
-        }
-
-        if (preg_match("%^([^\s\"']+)(\s+|$)%", $attr, $match))
-         # value
-        {
-          $thisval = kses_bad_protocol($match[1], $allowed_protocols);
-
-          $attrarr[] = array
-                        ('name'  => $attrname,
-                         'value' => $thisval,
-                         'whole' => "$attrname=\"$thisval\"",
-                         'vless' => 'n');
-                         # We add quotes to conform to W3C's HTML spec.
-          $working = 1; $mode = 0;
-          $attr = preg_replace("%^[^\s\"']+(\s+|$)%", '', $attr);
-        }
-
-        break;
-    } # switch
-
-    if ($working == 0) # not well formed, remove and try again
-    {
-      $attr = kses_html_error($attr);
-      $mode = 0;
-    }
-  } # while
-
-  if ($mode == 1)
-  # special case, for when the attribute list ends with a valueless
-  # attribute like "selected"
-    $attrarr[] = array
-                  ('name'  => $attrname,
-                   'value' => '',
-                   'whole' => $attrname,
-                   'vless' => 'y');
-
-  return $attrarr;
-} # function kses_hair
-
-/**
- * This function performs different checks for attribute values. The currently
- * implemented checks are "maxlen", "minlen", "maxval", "minval" and "valueless"
- * with even more checks to come soon.
- *
- * @param string $value
- * @param string $vless
- * @param string $checkname
- * @param string $checkvalue
- * @return bool
- */
-function kses_check_attr_val($value, $vless, $checkname, $checkvalue)
-###############################################################################
-# This function performs different checks for attribute values. The currently
-# implemented checks are "maxlen", "minlen", "maxval", "minval" and "valueless"
-# with even more checks to come soon.
-###############################################################################
-{
-  $ok = true;
-
-  switch (strtolower($checkname))
-  {
-    case 'maxlen':
-    # The maxlen check makes sure that the attribute value has a length not
-    # greater than the given value. This can be used to avoid Buffer Overflows
-    # in WWW clients and various Internet servers.
-
-      if (strlen($value) > $checkvalue)
-        $ok = false;
-      break;
-
-    case 'minlen':
-    # The minlen check makes sure that the attribute value has a length not
-    # smaller than the given value.
-
-      if (strlen($value) < $checkvalue)
-        $ok = false;
-      break;
-
-    case 'maxval':
-    # The maxval check does two things: it checks that the attribute value is
-    # an integer from 0 and up, without an excessive amount of zeroes or
-    # whitespace (to avoid Buffer Overflows). It also checks that the attribute
-    # value is not greater than the given value.
-    # This check can be used to avoid Denial of Service attacks.
-
-      if (!preg_match('/^\s{0,6}[0-9]{1,6}\s{0,6}$/', $value))
-        $ok = false;
-      if ($value > $checkvalue)
-        $ok = false;
-      break;
-
-    case 'minval':
-    # The minval check checks that the attribute value is a positive integer,
-    # and that it is not smaller than the given value.
-
-      if (!preg_match('/^\s{0,6}[0-9]{1,6}\s{0,6}$/', $value))
-        $ok = false;
-      if ($value < $checkvalue)
-        $ok = false;
-      break;
-
-    case 'valueless':
-    # The valueless check checks if the attribute has a value
-    # (like <a href="blah">) or not (<option selected>). If the given value
-    # is a "y" or a "Y", the attribute must not have a value.
-    # If the given value is an "n" or an "N", the attribute must have one.
-
-      if (strtolower($checkvalue) != $vless)
-        $ok = false;
-      break;
-  } # switch
-
-  return $ok;
-} # function kses_check_attr_val
-
-/**
- * This function removes all non-allowed protocols from the beginning of
- * $string. It ignores whitespace and the case of the letters, and it does
- * understand HTML entities. It does its work in a while loop, so it won't be
- * fooled by a string like "javascript:javascript:alert(57)".
- *
- * @param string $string
- * @param array $$allowed_protocols
- * @return string
- */
-function kses_bad_protocol($string, $allowed_protocols)
-###############################################################################
-# This function removes all non-allowed protocols from the beginning of
-# $string. It ignores whitespace and the case of the letters, and it does
-# understand HTML entities. It does its work in a while loop, so it won't be
-# fooled by a string like "javascript:javascript:alert(57)".
-###############################################################################
-{
-  $string = kses_no_null($string);
-  $string = preg_replace('/([^\xc3-\xcf])\xad+/', '\\1', $string); # deals with Opera "feature" -- moodle utf8 fix
-  $string2 = $string.'a';
-
-  while ($string != $string2)
-  {
-    $string2 = $string;
-    $string = kses_bad_protocol_once($string, $allowed_protocols);
-  } # while
-
-  return $string;
-} # function kses_bad_protocol
-
-/**
- * This function removes any NULL characters in $string.
- *
- * @param string $string
- * @return string
- */
-function kses_no_null($string)
-###############################################################################
-# This function removes any NULL characters in $string.
-###############################################################################
-{
-  $string = preg_replace('/\0+/', '', $string);
-  $string = preg_replace('/(\\\\0)+/', '', $string);
-
-  return $string;
-} # function kses_no_null
-
-
-/**
- * This function changes the character sequence  \"  to just  "
- * It leaves all other slashes alone. It's really weird, but the quoting from
- * preg_replace(//e) seems to require this.
- *
- * @param string $string
- * @return string
- */
-function kses_stripslashes($string)
-###############################################################################
-# This function changes the character sequence  \"  to just  "
-# It leaves all other slashes alone. It's really weird, but the quoting from
-# preg_replace(//e) seems to require this.
-###############################################################################
-{
-  return preg_replace('%\\\\"%', '"', $string);
-} # function kses_stripslashes
-
-
-/**
- * This function goes through an array, and changes the keys to all lower case.
- *
- * @param array $inarray
- * @return array
- */
-function kses_array_lc($inarray)
-###############################################################################
-# This function goes through an array, and changes the keys to all lower case.
-###############################################################################
-{
-  $outarray = array();
-
-  foreach ($inarray as $inkey => $inval)
-  {
-    $outkey = strtolower($inkey);
-    $outarray[$outkey] = array();
-
-    foreach ($inval as $inkey2 => $inval2)
-    {
-      $outkey2 = strtolower($inkey2);
-      $outarray[$outkey][$outkey2] = $inval2;
-    } # foreach $inval
-  } # foreach $inarray
-
-  return $outarray;
-} # function kses_array_lc
-
-/**
- * This function removes the HTML JavaScript entities found in early versions of
- * Netscape 4.
- *
- * @param string $string
- */
-function kses_js_entities($string)
-###############################################################################
-# This function removes the HTML JavaScript entities found in early versions of
-# Netscape 4.
-###############################################################################
-{
-  return preg_replace('%&\s*\{[^}]*(\}\s*;?|$)%', '', $string);
-} # function kses_js_entities
-
-/**
- * This function deals with parsing errors in kses_hair(). The general plan is
- * to remove everything to and including some whitespace, but it deals with
- * quotes and apostrophes as well.
- *
- * @param string $string
- * @return string
- */
-function kses_html_error($string)
-###############################################################################
-# This function deals with parsing errors in kses_hair(). The general plan is
-# to remove everything to and including some whitespace, but it deals with
-# quotes and apostrophes as well.
-###############################################################################
-{
-  return preg_replace('/^("[^"]*("|$)|\'[^\']*(\'|$)|\S)*\s*/', '', $string);
-} # function kses_html_error
-
-/**
- * This function searches for URL protocols at the beginning of $string, while
- * handling whitespace and HTML entities.
- *
- * @param string $string
- * @param string $allowed_protocols
- * @return string
- */
-function kses_bad_protocol_once($string, $allowed_protocols)
-###############################################################################
-# This function searches for URL protocols at the beginning of $string, while
-# handling whitespace and HTML entities.
-###############################################################################
-{
-  $string2 = preg_split('/:|&#58;|&#x3a;/i', $string, 2);
-  if(isset($string2[1]) && !preg_match('%/\?%',$string2[0]))
-  {
-    $string = kses_bad_protocol_once2($string2[0],$allowed_protocols).trim($string2[1]);
-  }
-  return $string;
-} # function kses_bad_protocol_once
-
-/**
- * This function processes URL protocols, checks to see if they're in the white-
- * list or not, and returns different data depending on the answer.
- *
- * @param string $string
- * @param string $allowed_protocols
- * @return string
- */
-function kses_bad_protocol_once2($string, $allowed_protocols)
-###############################################################################
-# This function processes URL protocols, checks to see if they're in the white-
-# list or not, and returns different data depending on the answer.
-###############################################################################
-{
-  $string2 = kses_decode_entities($string);
-  $string2 = preg_replace('/\s/', '', $string2);
-  $string2 = kses_no_null($string2);
-  $string2 = preg_replace('/\xad+/', '', $string2);
-   # deals with Opera "feature"
-  $string2 = strtolower($string2);
-
-  $allowed = false;
-  foreach ($allowed_protocols as $one_protocol)
-    if (strtolower($one_protocol) == $string2)
-    {
-      $allowed = true;
-      break;
-    }
-
-  if ($allowed)
-    return "$string2:";
-  else
-    return '';
-} # function kses_bad_protocol_once2
-
-/**
- * This function normalizes HTML entities. It will convert "AT&T" to the correct
- * "AT&amp;T", "&#00058;" to "&#58;", "&#XYZZY;" to "&amp;#XYZZY;" and so on.
- *
- * @param string $string
- * @return string
- */
-function kses_normalize_entities($string)
-###############################################################################
-# This function normalizes HTML entities. It will convert "AT&T" to the correct
-# "AT&amp;T", "&#00058;" to "&#58;", "&#XYZZY;" to "&amp;#XYZZY;" and so on.
-###############################################################################
-{
-# Disarm all entities by converting & to &amp;
-
-  $string = str_replace('&', '&amp;', $string);
-
-# Change back the allowed entities in our entity whitelist
-
-  $string = preg_replace('/&amp;([A-Za-z][A-Za-z0-9]{0,19});/',
-                         '&\\1;', $string);
-  $string = preg_replace('/&amp;#0*([0-9]{1,5});/e',
-                         'kses_normalize_entities2("\\1")', $string);
-  $string = preg_replace('/&amp;#([Xx])0*(([0-9A-Fa-f]{2}){1,2});/',
-                         '&#\\1\\2;', $string);
-
-  return $string;
-} # function kses_normalize_entities
-
-/**
- * This function helps kses_normalize_entities() to only accept 16 bit values
- * and nothing more for &#number; entities.
- *
- * @param int $i
- * @return string
- */
-function kses_normalize_entities2($i)
-###############################################################################
-# This function helps kses_normalize_entities() to only accept 16 bit values
-# and nothing more for &#number; entities.
-###############################################################################
-{
-  return (($i > 65535) ? "&amp;#$i;" : "&#$i;");
-} # function kses_normalize_entities2
-
-/**
- * This function decodes numeric HTML entities (&#65; and &#x41;). It doesn't
- * do anything with other entities like &auml;, but we don't need them in the
- * URL protocol whitelisting system anyway.
- *
- * @param string $string
- * @return string
- */
-function kses_decode_entities($string)
-###############################################################################
-# This function decodes numeric HTML entities (&#65; and &#x41;). It doesn't
-# do anything with other entities like &auml;, but we don't need them in the
-# URL protocol whitelisting system anyway.
-###############################################################################
-{
-  $string = preg_replace('/&#([0-9]+);/e', 'chr("\\1")', $string);
-  $string = preg_replace('/&#[Xx]([0-9A-Fa-f]+);/e', 'chr(hexdec("\\1"))',
-                         $string);
-
-  return $string;
-} # function kses_decode_entities
-
-?>
index e2faeef..66dfd53 100644 (file)
@@ -811,9 +811,6 @@ if ($USER && function_exists('apache_note')
     apache_note('MOODLEUSER', $logname);
 }
 
-// Adjust ALLOWED_TAGS
-adjust_allowed_tags();
-
 // Use a custom script replacement if one exists
 if (!empty($CFG->customscripts)) {
     if (($customscript = custom_script_path()) !== false) {
index 8dcad34..e066d26 100644 (file)
@@ -30,21 +30,16 @@ class purifier_test extends UnitTestCase {
 
     public static $includecoverage = array('lib/htmlpurifier/HTMLPurifier.php');
 
-    private $enablehtmlpurifier = null;
     private $cachetext = null;
 
     function setUp() {
         global $CFG;
-        $this->enablehtmlpurifier = $CFG->enablehtmlpurifier;
-        $CFG->enablehtmlpurifier = 1;
-
         $this->cachetext = $CFG->cachetext;
         $CFG->cachetext = 0;
     }
 
     function tearDown() {
         global $CFG;
-        $CFG->enablehtmlpurifier = $this->enablehtmlpurifier;
         $CFG->cachetext = $this->cachetext;
     }
 
index 0e7a39d..cf2c84b 100644 (file)
@@ -83,11 +83,6 @@ class web_test extends UnitTestCase {
         $this->assertEqual(wikify_links('this is a <a href="http://someaddress.com/query">link</a>'), 'this is a link [ http://someaddress.com/query ]');
     }
 
-    function test_fix_non_standard_entities() {
-        $this->assertEqual(fix_non_standard_entities('&#x00A3&#0228'), '&#xA3;&#228;');
-        $this->assertEqual(fix_non_standard_entities('&#x00A3;&#0228;'), '&#xA3;&#228;');
-    }
-
     function test_compare_url() {
         $url1 = new moodle_url('index.php', array('var1' => 1, 'var2' => 2));
         $url2 = new moodle_url('index2.php', array('var1' => 1, 'var2' => 2, 'var3' => 3));
index 0acdd8f..409838a 100644 (file)
     <version>1.0.0</version>
     <licenseversion>3.0+</licenseversion>
   </library>
-  <library>
-    <location>kses.php</location>
-    <name>KSES</name>
-    <license>GPL</license>
-    <version>0.2.2</version>
-    <licenseversion>3.0+</licenseversion>
-  </library>
   <library>
     <location>markdown.php</location>
     <name>Markdown original+extra</name>
index 38c57fc..d58e34d 100644 (file)
@@ -77,26 +77,6 @@ define('URL_MATCH_PARAMS', 1);
  */
 define('URL_MATCH_EXACT', 2);
 
-/**
- * Allowed tags - string of html tags that can be tested against for safe html tags
- * @global string $ALLOWED_TAGS
- * @name $ALLOWED_TAGS
- */
-global $ALLOWED_TAGS;
-$ALLOWED_TAGS =
-'<p><br><b><i><u><font><table><tbody><thead><tfoot><span><div><tr><td><th><ol><ul><dl><li><dt><dd><h1><h2><h3><h4><h5><h6><hr><img><a><strong><emphasis><em><sup><sub><address><cite><blockquote><pre><strike><param><acronym><nolink><lang><tex><algebra><math><mi><mn><mo><mtext><mspace><ms><mrow><mfrac><msqrt><mroot><mstyle><merror><mpadded><mphantom><mfenced><msub><msup><msubsup><munder><mover><munderover><mmultiscripts><mtable><mtr><mtd><maligngroup><malignmark><maction><cn><ci><apply><reln><fn><interval><inverse><sep><condition><declare><lambda><compose><ident><quotient><exp><factorial><divide><max><min><minus><plus><power><rem><times><root><gcd><and><or><xor><not><implies><forall><exists><abs><conjugate><eq><neq><gt><lt><geq><leq><ln><log><int><diff><partialdiff><lowlimit><uplimit><bvar><degree><set><list><union><intersect><in><notin><subset><prsubset><notsubset><notprsubset><setdiff><sum><product><limit><tendsto><mean><sdev><variance><median><mode><moment><vector><matrix><matrixrow><determinant><transpose><selector><annotation><semantics><annotation-xml><tt><code>';
-
-/**
- * Allowed protocols - array of protocols that are safe to use in links and so on
- * @global string $ALLOWED_PROTOCOLS
- */
-$ALLOWED_PROTOCOLS = array('http', 'https', 'ftp', 'news', 'mailto', 'rtsp', 'teamspeak', 'gopher', 'mms',
-                           'color', 'callto', 'cursor', 'text-align', 'font-size', 'font-weight', 'font-style', 'font-family',
-                           'border', 'border-bottom', 'border-left', 'border-top', 'border-right', 'margin', 'margin-bottom', 'margin-left', 'margin-top', 'margin-right',
-                           'padding', 'padding-bottom', 'padding-left', 'padding-top', 'padding-right', 'vertical-align',
-                           'background', 'background-color', 'text-decoration');   // CSS as well to get through kses
-
-
 /// Functions
 
 /**
@@ -1309,19 +1289,6 @@ function wikify_links($string) {
     return preg_replace('~(<a [^<]*href=["|\']?([^ "\']*)["|\']?[^>]*>([^<]*)</a>)~i','$3 [ $2 ]', $string);
 }
 
-/**
- * Replaces non-standard HTML entities
- *
- * @param string $string
- * @return string
- */
-function fix_non_standard_entities($string) {
-    $text = preg_replace('/&#0*([0-9]+);?/', '&#$1;', $string);
-    $text = preg_replace('/&#x0*([0-9a-fA-F]+);?/', '&#x$1;', $text);
-    $text = preg_replace('[\x00-\x08\x0b-\x0c\x0e-\x1f]', '', $text);
-    return $text;
-}
-
 /**
  * Given text in a variety of format codings, this function returns
  * the text as plain text suitable for plain email.
@@ -1436,8 +1403,6 @@ function trusttext_trusted($context) {
 /**
  * Is trusttext feature active?
  *
- * @global object
- * @param object $context
  * @return bool
  */
 function trusttext_active() {
@@ -1459,8 +1424,6 @@ function trusttext_active() {
  * @return string The cleaned up text
  */
 function clean_text($text, $format = FORMAT_HTML, $options = array()) {
-    global $ALLOWED_TAGS, $CFG;
-
     if (empty($text) or is_numeric($text)) {
        return (string)$text;
     }
@@ -1474,22 +1437,7 @@ function clean_text($text, $format = FORMAT_HTML, $options = array()) {
         return $text;
     }
 
-    if (!empty($CFG->enablehtmlpurifier)) {
-        $text = purify_html($text, $options);
-    } else {
-    /// Fix non standard entity notations
-        $text = fix_non_standard_entities($text);
-
-    /// Remove tags that are not allowed
-        $text = strip_tags($text, $ALLOWED_TAGS);
-
-    /// Clean up embedded scripts and , using kses
-        $text = cleanAttributes($text);
-
-    /// Again remove tags that are not allowed
-        $text = strip_tags($text, $ALLOWED_TAGS);
-
-    }
+    $text = purify_html($text, $options);
 
     // Remove potential script events - some extra protection for undiscovered bugs in our code
     $text = preg_replace("~([^a-z])language([[:space:]]*)=~i", "$1Xlanguage=", $text);
@@ -1501,10 +1449,10 @@ function clean_text($text, $format = FORMAT_HTML, $options = array()) {
 /**
  * KSES replacement cleaning function - uses HTML Purifier.
  *
- * @global object
  * @param string $text The (X)HTML string to purify
  * @param array $options Array of options; currently only option supported is 'allowid' (if set,
  *   does not remove id attributes when cleaning)
+ * @return string
  */
 function purify_html($text, $options = array()) {
     global $CFG;
@@ -1568,89 +1516,6 @@ function purify_html($text, $options = array()) {
     return $text;
 }
 
-/**
- * This function takes a string and examines it for HTML tags.
- *
- * If tags are detected it passes the string to a helper function {@link cleanAttributes2()}
- * which checks for attributes and filters them for malicious content
- *
- * @param string $str The string to be examined for html tags
- * @return string
- */
-function cleanAttributes($str){
-    $result = preg_replace_callback(
-            '%(<[^>]*(>|$)|>)%m', #search for html tags
-            "cleanAttributes2",
-            $str
-            );
-    return  $result;
-}
-
-/**
- * This function takes a string with an html tag and strips out any unallowed
- * protocols e.g. javascript:
- *
- * It calls ancillary functions in kses which are prefixed by kses
- *
- * @global object
- * @global string
- * @param array $htmlArray An array from {@link cleanAttributes()}, containing in its 1st
- *              element the html to be cleared
- * @return string
- */
-function cleanAttributes2($htmlArray){
-
-    global $CFG, $ALLOWED_PROTOCOLS;
-    require_once($CFG->libdir .'/kses.php');
-
-    $htmlTag = $htmlArray[1];
-    if (substr($htmlTag, 0, 1) != '<') {
-        return '&gt;';  //a single character ">" detected
-    }
-    if (!preg_match('%^<\s*(/\s*)?([a-zA-Z0-9]+)([^>]*)>?$%', $htmlTag, $matches)) {
-        return ''; // It's seriously malformed
-    }
-    $slash = trim($matches[1]); //trailing xhtml slash
-    $elem = $matches[2];    //the element name
-    $attrlist = $matches[3]; // the list of attributes as a string
-
-    $attrArray = kses_hair($attrlist, $ALLOWED_PROTOCOLS);
-
-    $attStr = '';
-    foreach ($attrArray as $arreach) {
-        $arreach['name'] = strtolower($arreach['name']);
-        if ($arreach['name'] == 'style') {
-            $value = $arreach['value'];
-            while (true) {
-                $prevvalue = $value;
-                $value = kses_no_null($value);
-                $value = preg_replace("/\/\*.*\*\//Us", '', $value);
-                $value = kses_decode_entities($value);
-                $value = preg_replace('/(&#[0-9]+)(;?)/', "\\1;", $value);
-                $value = preg_replace('/(&#x[0-9a-fA-F]+)(;?)/', "\\1;", $value);
-                if ($value === $prevvalue) {
-                    $arreach['value'] = $value;
-                    break;
-                }
-            }
-            $arreach['value'] = preg_replace("/j\s*a\s*v\s*a\s*s\s*c\s*r\s*i\s*p\s*t/i", "Xjavascript", $arreach['value']);
-            $arreach['value'] = preg_replace("/v\s*b\s*s\s*c\s*r\s*i\s*p\s*t/i", "Xvbscript", $arreach['value']);
-            $arreach['value'] = preg_replace("/e\s*x\s*p\s*r\s*e\s*s\s*s\s*i\s*o\s*n/i", "Xexpression", $arreach['value']);
-            $arreach['value'] = preg_replace("/b\s*i\s*n\s*d\s*i\s*n\s*g/i", "Xbinding", $arreach['value']);
-        } else if ($arreach['name'] == 'href') {
-            //Adobe Acrobat Reader XSS protection
-            $arreach['value'] = preg_replace('/(\.(pdf|fdf|xfdf|xdp|xfd)[^#]*)#.*$/i', '$1', $arreach['value']);
-        }
-        $attStr .=  ' '.$arreach['name'].'="'.$arreach['value'].'"';
-    }
-
-    $xhtml_slash = '';
-    if (preg_match('%/\s*$%', $attrlist)) {
-        $xhtml_slash = ' /';
-    }
-    return '<'. $slash . $elem . $attStr . $xhtml_slash .'>';
-}
-
 /**
  * Given plain text, makes it into HTML as nicely as possible.
  * May contain HTML tags already
@@ -1659,7 +1524,6 @@ function cleanAttributes2($htmlArray){
  * by {@see format_text()} to convert FORMAT_MOODLE to HTML. You are supposed
  * to call format_text() in most of cases.
  *
- * @global object
  * @param string $text The string to convert.
  * @param boolean $smiley_ignored Was used to determine if smiley characters should convert to smiley images, ignored now
  * @param boolean $para If true then the returned string will be wrapped in div tags
@@ -1668,8 +1532,6 @@ function cleanAttributes2($htmlArray){
  */
 
 function text_to_html($text, $smiley_ignored=null, $para=true, $newlines=true) {
-    global $CFG;
-
 /// Remove any whitespace that may be between HTML tags
     $text = preg_replace("~>([[:space:]]+)<~i", "><", $text);
 
@@ -2612,22 +2474,6 @@ function print_maintenance_message() {
     die;
 }
 
-/**
- * Adjust the list of allowed tags based on $CFG->allowobjectembed and user roles (admin)
- *
- * @global object
- * @global string
- * @return void
- */
-function adjust_allowed_tags() {
-
-    global $CFG, $ALLOWED_TAGS;
-
-    if (!empty($CFG->allowobjectembed)) {
-        $ALLOWED_TAGS .= '<embed><object>';
-    }
-}
-
 /**
  * A class for tabs, Some code to print tabs
  *
index 96eb18b..c1b1edf 100644 (file)
@@ -31,7 +31,7 @@ defined('MOODLE_INTERNAL') || die();
 
 
 
-$version  = 2011101900.01;              // YYYYMMDD      = weekly release date of this DEV branch
+$version  = 2011101900.02;              // YYYYMMDD      = weekly release date of this DEV branch
                                         //         RR    = release increments - 00 in DEV branches
                                         //           .XX = incremental changes