Twig-1.3.0/lib/Twig/Sandbox/SecurityPolicy.php
changeset 4 9a001a04b634
equal deleted inserted replaced
3:6d109e3804ac 4:9a001a04b634
       
     1 <?php
       
     2 
       
     3 /*
       
     4  * This file is part of Twig.
       
     5  *
       
     6  * (c) 2009 Fabien Potencier
       
     7  *
       
     8  * For the full copyright and license information, please view the LICENSE
       
     9  * file that was distributed with this source code.
       
    10  */
       
    11 
       
    12 /**
       
    13  * Represents a security policy which need to be enforced when sandbox mode is enabled.
       
    14  *
       
    15  * @package    twig
       
    16  * @author     Fabien Potencier <fabien@symfony.com>
       
    17  */
       
    18 class Twig_Sandbox_SecurityPolicy implements Twig_Sandbox_SecurityPolicyInterface
       
    19 {
       
    20     protected $allowedTags;
       
    21     protected $allowedFilters;
       
    22     protected $allowedMethods;
       
    23     protected $allowedProperties;
       
    24     protected $allowedFunctions;
       
    25 
       
    26     public function __construct(array $allowedTags = array(), array $allowedFilters = array(), array $allowedMethods = array(), array $allowedProperties = array(), array $allowedFunctions = array())
       
    27     {
       
    28         $this->allowedTags = $allowedTags;
       
    29         $this->allowedFilters = $allowedFilters;
       
    30         $this->setAllowedMethods($allowedMethods);
       
    31         $this->allowedProperties = $allowedProperties;
       
    32         $this->allowedFunctions = $allowedFunctions;
       
    33     }
       
    34 
       
    35     public function setAllowedTags(array $tags)
       
    36     {
       
    37         $this->allowedTags = $tags;
       
    38     }
       
    39 
       
    40     public function setAllowedFilters(array $filters)
       
    41     {
       
    42         $this->allowedFilters = $filters;
       
    43     }
       
    44 
       
    45     public function setAllowedMethods(array $methods)
       
    46     {
       
    47         $this->allowedMethods = array();
       
    48         foreach ($methods as $class => $m) {
       
    49             $this->allowedMethods[$class] = array_map('strtolower', is_array($m) ? $m : array($m));
       
    50         }
       
    51     }
       
    52 
       
    53     public function setAllowedProperties(array $properties)
       
    54     {
       
    55         $this->allowedProperties = $properties;
       
    56     }
       
    57 
       
    58     public function setAllowedFunctions(array $functions)
       
    59     {
       
    60         $this->allowedFunctions = $functions;
       
    61     }
       
    62 
       
    63     public function checkSecurity($tags, $filters, $functions)
       
    64     {
       
    65         foreach ($tags as $tag) {
       
    66             if (!in_array($tag, $this->allowedTags)) {
       
    67                 throw new Twig_Sandbox_SecurityError(sprintf('Tag "%s" is not allowed.', $tag));
       
    68             }
       
    69         }
       
    70 
       
    71         foreach ($filters as $filter) {
       
    72             if (!in_array($filter, $this->allowedFilters)) {
       
    73                 throw new Twig_Sandbox_SecurityError(sprintf('Filter "%s" is not allowed.', $filter));
       
    74             }
       
    75         }
       
    76 
       
    77         foreach ($functions as $function) {
       
    78             if (!in_array($function, $this->allowedFunctions)) {
       
    79                 throw new Twig_Sandbox_SecurityError(sprintf('Function "%s" is not allowed.', $function));
       
    80             }
       
    81         }
       
    82     }
       
    83 
       
    84     public function checkMethodAllowed($obj, $method)
       
    85     {
       
    86         if ($obj instanceof Twig_TemplateInterface || $obj instanceof Twig_Markup) {
       
    87             return true;
       
    88         }
       
    89 
       
    90         $allowed = false;
       
    91         $method = strtolower($method);
       
    92         foreach ($this->allowedMethods as $class => $methods) {
       
    93             if ($obj instanceof $class) {
       
    94                 $allowed = in_array($method, $methods);
       
    95 
       
    96                 break;
       
    97             }
       
    98         }
       
    99 
       
   100         if (!$allowed) {
       
   101             throw new Twig_Sandbox_SecurityError(sprintf('Calling "%s" method on a "%s" object is not allowed.', $method, get_class($obj)));
       
   102         }
       
   103     }
       
   104 
       
   105     public function checkPropertyAllowed($obj, $property)
       
   106     {
       
   107         $allowed = false;
       
   108         foreach ($this->allowedProperties as $class => $properties) {
       
   109             if ($obj instanceof $class) {
       
   110                 $allowed = in_array($property, is_array($properties) ? $properties : array($properties));
       
   111 
       
   112                 break;
       
   113             }
       
   114         }
       
   115 
       
   116         if (!$allowed) {
       
   117             throw new Twig_Sandbox_SecurityError(sprintf('Calling "%s" property on a "%s" object is not allowed.', $property, get_class($obj)));
       
   118         }
       
   119     }
       
   120 }