Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
mahara
mahara
Commits
c5a64db0
Commit
c5a64db0
authored
Aug 20, 2019
by
Robert Lyon
Committed by
Gerrit Code Review
Aug 20, 2019
Browse files
Merge "Bug 1836803: Upgrading HTMLPurifier"
parents
6ff33511
ee794865
Changes
375
Expand all
Hide whitespace changes
Inline
Side-by-side
htdocs/lib/htmlpurifier/HTMLPurifier.auto.php
View file @
c5a64db0
<?php
/**
* This is a stub include that automatically configures the include path.
*/
set_include_path
(
dirname
(
__FILE__
)
.
PATH_SEPARATOR
.
get_include_path
()
);
require_once
'HTMLPurifier/Bootstrap.php'
;
require_once
'HTMLPurifier.autoload.php'
;
// vim: et sw=4 sts=4
<?php
/**
* This is a stub include that automatically configures the include path.
*/
set_include_path
(
dirname
(
__FILE__
)
.
PATH_SEPARATOR
.
get_include_path
()
);
require_once
'HTMLPurifier/Bootstrap.php'
;
require_once
'HTMLPurifier.autoload.php'
;
// vim: et sw=4 sts=4
htdocs/lib/htmlpurifier/HTMLPurifier.autoload-legacy.php
View file @
c5a64db0
<?php
/**
* @file
* Legacy autoloader for systems lacking spl_autoload_register
*
* Must be separate to prevent deprecation warning on PHP 7.2
*/
function
__autoload
(
$class
)
{
return
HTMLPurifier_Bootstrap
::
autoload
(
$class
);
}
// vim: et sw=4 sts=4
<?php
/**
* @file
* Legacy autoloader for systems lacking spl_autoload_register
*
* Must be separate to prevent deprecation warning on PHP 7.2
*/
function
__autoload
(
$class
)
{
return
HTMLPurifier_Bootstrap
::
autoload
(
$class
);
}
// vim: et sw=4 sts=4
htdocs/lib/htmlpurifier/HTMLPurifier.autoload.php
View file @
c5a64db0
<?php
/**
* @file
* Convenience file that registers autoload handler for HTML Purifier.
* It also does some sanity checks.
*/
if
(
function_exists
(
'spl_autoload_register'
)
&&
function_exists
(
'spl_autoload_unregister'
))
{
// We need unregister for our pre-registering functionality
HTMLPurifier_Bootstrap
::
registerAutoload
();
if
(
function_exists
(
'__autoload'
))
{
// Be polite and ensure that userland autoload gets retained
spl_autoload_register
(
'__autoload'
);
}
}
elseif
(
!
function_exists
(
'__autoload'
))
{
require
dirname
(
__FILE__
)
.
'/HTMLPurifier.autoload-legacy.php'
;
}
if
(
ini_get
(
'zend.ze1_compatibility_mode'
))
{
trigger_error
(
"HTML Purifier is not compatible with zend.ze1_compatibility_mode; please turn it off"
,
E_USER_ERROR
);
}
// vim: et sw=4 sts=4
<?php
/**
* @file
* Convenience file that registers autoload handler for HTML Purifier.
* It also does some sanity checks.
*/
if
(
function_exists
(
'spl_autoload_register'
)
&&
function_exists
(
'spl_autoload_unregister'
))
{
// We need unregister for our pre-registering functionality
HTMLPurifier_Bootstrap
::
registerAutoload
();
if
(
function_exists
(
'__autoload'
))
{
// Be polite and ensure that userland autoload gets retained
spl_autoload_register
(
'__autoload'
);
}
}
elseif
(
!
function_exists
(
'__autoload'
))
{
require
dirname
(
__FILE__
)
.
'/HTMLPurifier.autoload-legacy.php'
;
}
if
(
ini_get
(
'zend.ze1_compatibility_mode'
))
{
trigger_error
(
"HTML Purifier is not compatible with zend.ze1_compatibility_mode; please turn it off"
,
E_USER_ERROR
);
}
// vim: et sw=4 sts=4
htdocs/lib/htmlpurifier/HTMLPurifier.composer.php
View file @
c5a64db0
<?php
if
(
!
defined
(
'HTMLPURIFIER_PREFIX'
))
{
define
(
'HTMLPURIFIER_PREFIX'
,
dirname
(
__FILE__
));
}
<?php
if
(
!
defined
(
'HTMLPURIFIER_PREFIX'
))
{
define
(
'HTMLPURIFIER_PREFIX'
,
dirname
(
__FILE__
));
}
htdocs/lib/htmlpurifier/HTMLPurifier.func.php
View file @
c5a64db0
<?php
/**
* @file
* Defines a function wrapper for HTML Purifier for quick use.
* @note ''HTMLPurifier()'' is NOT the same as ''new HTMLPurifier()''
*/
/**
* Purify HTML.
* @param string $html String HTML to purify
* @param mixed $config Configuration to use, can be any value accepted by
* HTMLPurifier_Config::create()
* @return string
*/
function
HTMLPurifier
(
$html
,
$config
=
null
)
{
static
$purifier
=
false
;
if
(
!
$purifier
)
{
$purifier
=
new
HTMLPurifier
();
}
return
$purifier
->
purify
(
$html
,
$config
);
}
// vim: et sw=4 sts=4
<?php
/**
* @file
* Defines a function wrapper for HTML Purifier for quick use.
* @note ''HTMLPurifier()'' is NOT the same as ''new HTMLPurifier()''
*/
/**
* Purify HTML.
* @param string $html String HTML to purify
* @param mixed $config Configuration to use, can be any value accepted by
* HTMLPurifier_Config::create()
* @return string
*/
function
HTMLPurifier
(
$html
,
$config
=
null
)
{
static
$purifier
=
false
;
if
(
!
$purifier
)
{
$purifier
=
new
HTMLPurifier
();
}
return
$purifier
->
purify
(
$html
,
$config
);
}
// vim: et sw=4 sts=4
htdocs/lib/htmlpurifier/HTMLPurifier.includes.php
View file @
c5a64db0
This diff is collapsed.
Click to expand it.
htdocs/lib/htmlpurifier/HTMLPurifier.kses.php
View file @
c5a64db0
<?php
/**
* @file
* Emulation layer for code that used kses(), substituting in HTML Purifier.
*/
require_once
dirname
(
__FILE__
)
.
'/HTMLPurifier.auto.php'
;
function
kses
(
$string
,
$allowed_html
,
$allowed_protocols
=
null
)
{
$config
=
HTMLPurifier_Config
::
createDefault
();
$allowed_elements
=
array
();
$allowed_attributes
=
array
();
foreach
(
$allowed_html
as
$element
=>
$attributes
)
{
$allowed_elements
[
$element
]
=
true
;
foreach
(
$attributes
as
$attribute
=>
$x
)
{
$allowed_attributes
[
"
$element
.
$attribute
"
]
=
true
;
}
}
$config
->
set
(
'HTML.AllowedElements'
,
$allowed_elements
);
$config
->
set
(
'HTML.AllowedAttributes'
,
$allowed_attributes
);
if
(
$allowed_protocols
!==
null
)
{
$config
->
set
(
'URI.AllowedSchemes'
,
$allowed_protocols
);
}
$purifier
=
new
HTMLPurifier
(
$config
);
return
$purifier
->
purify
(
$string
);
}
// vim: et sw=4 sts=4
<?php
/**
* @file
* Emulation layer for code that used kses(), substituting in HTML Purifier.
*/
require_once
dirname
(
__FILE__
)
.
'/HTMLPurifier.auto.php'
;
function
kses
(
$string
,
$allowed_html
,
$allowed_protocols
=
null
)
{
$config
=
HTMLPurifier_Config
::
createDefault
();
$allowed_elements
=
array
();
$allowed_attributes
=
array
();
foreach
(
$allowed_html
as
$element
=>
$attributes
)
{
$allowed_elements
[
$element
]
=
true
;
foreach
(
$attributes
as
$attribute
=>
$x
)
{
$allowed_attributes
[
"
$element
.
$attribute
"
]
=
true
;
}
}
$config
->
set
(
'HTML.AllowedElements'
,
$allowed_elements
);
$config
->
set
(
'HTML.AllowedAttributes'
,
$allowed_attributes
);
if
(
$allowed_protocols
!==
null
)
{
$config
->
set
(
'URI.AllowedSchemes'
,
$allowed_protocols
);
}
$purifier
=
new
HTMLPurifier
(
$config
);
return
$purifier
->
purify
(
$string
);
}
// vim: et sw=4 sts=4
htdocs/lib/htmlpurifier/HTMLPurifier.path.php
View file @
c5a64db0
<?php
/**
* @file
* Convenience stub file that adds HTML Purifier's library file to the path
* without any other side-effects.
*/
set_include_path
(
dirname
(
__FILE__
)
.
PATH_SEPARATOR
.
get_include_path
()
);
// vim: et sw=4 sts=4
<?php
/**
* @file
* Convenience stub file that adds HTML Purifier's library file to the path
* without any other side-effects.
*/
set_include_path
(
dirname
(
__FILE__
)
.
PATH_SEPARATOR
.
get_include_path
()
);
// vim: et sw=4 sts=4
htdocs/lib/htmlpurifier/HTMLPurifier.php
View file @
c5a64db0
This diff is collapsed.
Click to expand it.
htdocs/lib/htmlpurifier/HTMLPurifier.safe-includes.php
View file @
c5a64db0
This diff is collapsed.
Click to expand it.
htdocs/lib/htmlpurifier/HTMLPurifier/Arborize.php
View file @
c5a64db0
<?php
/**
* Converts a stream of HTMLPurifier_Token into an HTMLPurifier_Node,
* and back again.
*
* @note This transformation is not an equivalence. We mutate the input
* token stream to make it so; see all [MUT] markers in code.
*/
class
HTMLPurifier_Arborize
{
public
static
function
arborize
(
$tokens
,
$config
,
$context
)
{
$definition
=
$config
->
getHTMLDefinition
();
$parent
=
new
HTMLPurifier_Token_Start
(
$definition
->
info_parent
);
$stack
=
array
(
$parent
->
toNode
());
foreach
(
$tokens
as
$token
)
{
$token
->
skip
=
null
;
// [MUT]
$token
->
carryover
=
null
;
// [MUT]
if
(
$token
instanceof
HTMLPurifier_Token_End
)
{
$token
->
start
=
null
;
// [MUT]
$r
=
array_pop
(
$stack
);
//assert($r->name === $token->name);
//assert(empty($token->attr));
$r
->
endCol
=
$token
->
col
;
$r
->
endLine
=
$token
->
line
;
$r
->
endArmor
=
$token
->
armor
;
continue
;
}
$node
=
$token
->
toNode
();
$stack
[
count
(
$stack
)
-
1
]
->
children
[]
=
$node
;
if
(
$token
instanceof
HTMLPurifier_Token_Start
)
{
$stack
[]
=
$node
;
}
}
//assert(count($stack) == 1);
return
$stack
[
0
];
}
public
static
function
flatten
(
$node
,
$config
,
$context
)
{
$level
=
0
;
$nodes
=
array
(
$level
=>
new
HTMLPurifier_Queue
(
array
(
$node
)));
$closingTokens
=
array
();
$tokens
=
array
();
do
{
while
(
!
$nodes
[
$level
]
->
isEmpty
())
{
$node
=
$nodes
[
$level
]
->
shift
();
// FIFO
list
(
$start
,
$end
)
=
$node
->
toTokenPair
();
if
(
$level
>
0
)
{
$tokens
[]
=
$start
;
}
if
(
$end
!==
NULL
)
{
$closingTokens
[
$level
][]
=
$end
;
}
if
(
$node
instanceof
HTMLPurifier_Node_Element
)
{
$level
++
;
$nodes
[
$level
]
=
new
HTMLPurifier_Queue
();
foreach
(
$node
->
children
as
$childNode
)
{
$nodes
[
$level
]
->
push
(
$childNode
);
}
}
}
$level
--
;
if
(
$level
&&
isset
(
$closingTokens
[
$level
]))
{
while
(
$token
=
array_pop
(
$closingTokens
[
$level
]))
{
$tokens
[]
=
$token
;
}
}
}
while
(
$level
>
0
);
return
$tokens
;
}
}
<?php
/**
* Converts a stream of HTMLPurifier_Token into an HTMLPurifier_Node,
* and back again.
*
* @note This transformation is not an equivalence. We mutate the input
* token stream to make it so; see all [MUT] markers in code.
*/
class
HTMLPurifier_Arborize
{
public
static
function
arborize
(
$tokens
,
$config
,
$context
)
{
$definition
=
$config
->
getHTMLDefinition
();
$parent
=
new
HTMLPurifier_Token_Start
(
$definition
->
info_parent
);
$stack
=
array
(
$parent
->
toNode
());
foreach
(
$tokens
as
$token
)
{
$token
->
skip
=
null
;
// [MUT]
$token
->
carryover
=
null
;
// [MUT]
if
(
$token
instanceof
HTMLPurifier_Token_End
)
{
$token
->
start
=
null
;
// [MUT]
$r
=
array_pop
(
$stack
);
//assert($r->name === $token->name);
//assert(empty($token->attr));
$r
->
endCol
=
$token
->
col
;
$r
->
endLine
=
$token
->
line
;
$r
->
endArmor
=
$token
->
armor
;
continue
;
}
$node
=
$token
->
toNode
();
$stack
[
count
(
$stack
)
-
1
]
->
children
[]
=
$node
;
if
(
$token
instanceof
HTMLPurifier_Token_Start
)
{
$stack
[]
=
$node
;
}
}
//assert(count($stack) == 1);
return
$stack
[
0
];
}
public
static
function
flatten
(
$node
,
$config
,
$context
)
{
$level
=
0
;
$nodes
=
array
(
$level
=>
new
HTMLPurifier_Queue
(
array
(
$node
)));
$closingTokens
=
array
();
$tokens
=
array
();
do
{
while
(
!
$nodes
[
$level
]
->
isEmpty
())
{
$node
=
$nodes
[
$level
]
->
shift
();
// FIFO
list
(
$start
,
$end
)
=
$node
->
toTokenPair
();
if
(
$level
>
0
)
{
$tokens
[]
=
$start
;
}
if
(
$end
!==
NULL
)
{
$closingTokens
[
$level
][]
=
$end
;
}
if
(
$node
instanceof
HTMLPurifier_Node_Element
)
{
$level
++
;
$nodes
[
$level
]
=
new
HTMLPurifier_Queue
();
foreach
(
$node
->
children
as
$childNode
)
{
$nodes
[
$level
]
->
push
(
$childNode
);
}
}
}
$level
--
;
if
(
$level
&&
isset
(
$closingTokens
[
$level
]))
{
while
(
$token
=
array_pop
(
$closingTokens
[
$level
]))
{
$tokens
[]
=
$token
;
}
}
}
while
(
$level
>
0
);
return
$tokens
;
}
}
htdocs/lib/htmlpurifier/HTMLPurifier/AttrCollections.php
View file @
c5a64db0
<?php
/**
* Defines common attribute collections that modules reference
*/
class
HTMLPurifier_AttrCollections
{
/**
* Associative array of attribute collections, indexed by name.
* @type array
*/
public
$info
=
array
();
/**
* Performs all expansions on internal data for use by other inclusions
* It also collects all attribute collection extensions from
* modules
* @param HTMLPurifier_AttrTypes $attr_types HTMLPurifier_AttrTypes instance
* @param HTMLPurifier_HTMLModule[] $modules Hash array of HTMLPurifier_HTMLModule members
*/
public
function
__construct
(
$attr_types
,
$modules
)
{
$this
->
doConstruct
(
$attr_types
,
$modules
);
}
public
function
doConstruct
(
$attr_types
,
$modules
)
{
// load extensions from the modules
foreach
(
$modules
as
$module
)
{
foreach
(
$module
->
attr_collections
as
$coll_i
=>
$coll
)
{
if
(
!
isset
(
$this
->
info
[
$coll_i
]))
{
$this
->
info
[
$coll_i
]
=
array
();
}
foreach
(
$coll
as
$attr_i
=>
$attr
)
{
if
(
$attr_i
===
0
&&
isset
(
$this
->
info
[
$coll_i
][
$attr_i
]))
{
// merge in includes
$this
->
info
[
$coll_i
][
$attr_i
]
=
array_merge
(
$this
->
info
[
$coll_i
][
$attr_i
],
$attr
);
continue
;
}
$this
->
info
[
$coll_i
][
$attr_i
]
=
$attr
;
}
}
}
// perform internal expansions and inclusions
foreach
(
$this
->
info
as
$name
=>
$attr
)
{
// merge attribute collections that include others
$this
->
performInclusions
(
$this
->
info
[
$name
]);
// replace string identifiers with actual attribute objects
$this
->
expandIdentifiers
(
$this
->
info
[
$name
],
$attr_types
);
}
}
/**
* Takes a reference to an attribute associative array and performs
* all inclusions specified by the zero index.
* @param array &$attr Reference to attribute array
*/
public
function
performInclusions
(
&
$attr
)
{
if
(
!
isset
(
$attr
[
0
]))
{
return
;
}
$merge
=
$attr
[
0
];
$seen
=
array
();
// recursion guard
// loop through all the inclusions
for
(
$i
=
0
;
isset
(
$merge
[
$i
]);
$i
++
)
{
if
(
isset
(
$seen
[
$merge
[
$i
]]))
{
continue
;
}
$seen
[
$merge
[
$i
]]
=
true
;
// foreach attribute of the inclusion, copy it over
if
(
!
isset
(
$this
->
info
[
$merge
[
$i
]]))
{
continue
;
}
foreach
(
$this
->
info
[
$merge
[
$i
]]
as
$key
=>
$value
)
{
if
(
isset
(
$attr
[
$key
]))
{
continue
;
}
// also catches more inclusions
$attr
[
$key
]
=
$value
;
}
if
(
isset
(
$this
->
info
[
$merge
[
$i
]][
0
]))
{
// recursion
$merge
=
array_merge
(
$merge
,
$this
->
info
[
$merge
[
$i
]][
0
]);
}
}
unset
(
$attr
[
0
]);
}
/**
* Expands all string identifiers in an attribute array by replacing
* them with the appropriate values inside HTMLPurifier_AttrTypes
* @param array &$attr Reference to attribute array
* @param HTMLPurifier_AttrTypes $attr_types HTMLPurifier_AttrTypes instance
*/
public
function
expandIdentifiers
(
&
$attr
,
$attr_types
)
{
// because foreach will process new elements we add, make sure we
// skip duplicates
$processed
=
array
();
foreach
(
$attr
as
$def_i
=>
$def
)
{
// skip inclusions
if
(
$def_i
===
0
)
{
continue
;
}
if
(
isset
(
$processed
[
$def_i
]))
{
continue
;
}
// determine whether or not attribute is required
if
(
$required
=
(
strpos
(
$def_i
,
'*'
)
!==
false
))
{
// rename the definition
unset
(
$attr
[
$def_i
]);
$def_i
=
trim
(
$def_i
,
'*'
);
$attr
[
$def_i
]
=
$def
;
}
$processed
[
$def_i
]
=
true
;
// if we've already got a literal object, move on
if
(
is_object
(
$def
))
{
// preserve previous required
$attr
[
$def_i
]
->
required
=
(
$required
||
$attr
[
$def_i
]
->
required
);
continue
;
}
if
(
$def
===
false
)
{
unset
(
$attr
[
$def_i
]);
continue
;
}
if
(
$t
=
$attr_types
->
get
(
$def
))
{
$attr
[
$def_i
]
=
$t
;
$attr
[
$def_i
]
->
required
=
$required
;
}
else
{
unset
(
$attr
[
$def_i
]);
}
}
}
}
// vim: et sw=4 sts=4
<?php
/**
* Defines common attribute collections that modules reference
*/
class
HTMLPurifier_AttrCollections
{
/**
* Associative array of attribute collections, indexed by name.
* @type array
*/
public
$info
=
array
();
/**
* Performs all expansions on internal data for use by other inclusions
* It also collects all attribute collection extensions from
* modules
* @param HTMLPurifier_AttrTypes $attr_types HTMLPurifier_AttrTypes instance
* @param HTMLPurifier_HTMLModule[] $modules Hash array of HTMLPurifier_HTMLModule members
*/
public
function
__construct
(
$attr_types
,
$modules
)
{
$this
->
doConstruct
(
$attr_types
,
$modules
);
}
public
function
doConstruct
(
$attr_types
,
$modules
)
{
// load extensions from the modules
foreach
(
$modules
as
$module
)
{
foreach
(
$module
->
attr_collections
as
$coll_i
=>
$coll
)
{
if
(
!
isset
(
$this
->
info
[
$coll_i
]))
{
$this
->
info
[
$coll_i
]
=
array
();
}
foreach
(
$coll
as
$attr_i
=>
$attr
)
{
if
(
$attr_i
===
0
&&
isset
(
$this
->
info
[
$coll_i
][
$attr_i
]))
{
// merge in includes
$this
->
info
[
$coll_i
][
$attr_i
]