Changeset 7120
- Timestamp:
- 01/21/08 09:13:59 (10 months ago)
- Files:
-
- branches/1.1/lib/action/sfComponent.class.php (modified) (1 diff)
- branches/1.1/lib/plugins/sfPropelPlugin/data/generator/sfPropelCrud/default/template/templates/editSuccess.php (modified) (1 diff)
- branches/1.1/lib/view/escaper/sfOutputEscaper.class.php (modified) (4 diffs)
- branches/1.1/lib/view/escaper/sfOutputEscaperSafe.class.php (added)
- branches/1.1/lib/view/sfView.class.php (modified) (1 diff)
- branches/1.1/test/unit/view/escaper/sfOutputEscaperSafeTest.php (added)
- branches/1.1/test/unit/view/escaper/sfOutputEscaperTest.php (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/1.1/lib/action/sfComponent.class.php
r6509 r7120 237 237 * Sets a variable for the template. 238 238 * 239 * @param string The variable name 240 * @param mixed The variable value 241 */ 242 public function setVar($name, $value) 243 { 244 $this->varHolder->set($name, $value); 239 * If you add a safe value, the variable won't be output escaped 240 * by symfony, so this is your responsability to ensure that the 241 * value is escaped properly. 242 * 243 * @param string The variable name 244 * @param mixed The variable value 245 * @param Boolean true if the value is safe for output (false by default) 246 */ 247 public function setVar($name, $value, $safe = false) 248 { 249 $this->varHolder->set($name, $safe ? new sfOutputEscaperSafe($value) : $value); 245 250 } 246 251 branches/1.1/lib/plugins/sfPropelPlugin/data/generator/sfPropelCrud/default/template/templates/editSuccess.php
r6882 r7120 18 18 <tbody> 19 19 <?php if (isset($this->params['non_verbose_templates']) && $this->params['non_verbose_templates']): ?> 20 [?php echo $ this->getAttributeHolder()->isEscaped() ? $form->render(ESC_RAW) : $form ?]20 [?php echo $form ?] 21 21 <?php else: ?> 22 22 branches/1.1/lib/view/escaper/sfOutputEscaper.class.php
r7109 r7120 33 33 */ 34 34 protected $escapingMethod; 35 36 static protected $safeClasses = array(); 35 37 36 38 /** … … 101 103 if ($value instanceof sfOutputEscaper) 102 104 { 103 // avoid double decoration when passing values from action template to component/partial105 // avoid double decoration 104 106 $copy = clone $value; 105 107 … … 108 110 return $copy; 109 111 } 110 else if ($value instanceof Traversable)112 else if ($value instanceof Traversable) 111 113 { 112 114 return new sfOutputEscaperIteratorDecorator($escapingMethod, $value); 115 } 116 else if ($value instanceof sfOutputEscaperSafe) 117 { 118 // do not escape objects marked as safe 119 // return the original object 120 return $value->getValue(); 121 } 122 else if (self::isClassMarkedAsSafe(get_class($value))) 123 { 124 // the class or one of its children is marked as safe 125 // return the unescaped object 126 return $value; 113 127 } 114 128 else … … 123 137 124 138 /** 139 * Returns true if the class if marked as safe. 140 * 141 * @param string A class name 142 * 143 * @return Boolean true if the class if safe, false otherwise 144 */ 145 static public function isClassMarkedAsSafe($class) 146 { 147 if (in_array($class, self::$safeClasses)) 148 { 149 return true; 150 } 151 152 foreach (self::$safeClasses as $safeClass) 153 { 154 if (is_subclass_of($class, $safeClass)) 155 { 156 return true; 157 } 158 } 159 160 return false; 161 } 162 163 /** 164 * Marks an array of classes (and all its children) as being safe for output. 165 * 166 * @param array An array of class names 167 */ 168 static public function markClassesAsSafe(array $classes) 169 { 170 self::$safeClasses = array_unique(array_merge(self::$safeClasses, $classes)); 171 } 172 173 /** 174 * Marks a class (and all its children) as being safe for output. 175 * 176 * @param string A class name 177 */ 178 static public function markClassAsSafe($class) 179 { 180 self::markClassesAsSafe(array($class)); 181 } 182 183 /** 125 184 * Returns the raw value associated with this instance. 126 185 * branches/1.1/lib/view/sfView.class.php
r6176 r7120 119 119 } 120 120 121 sfOutputEscaper::markClassAsSafe('sfForm'); 122 121 123 $this->attributeHolder = false === sfConfig::get('sf_escaping_method') ? new sfViewParameterHolder() : new sfEscapedViewParameterHolder(); 122 124 $this->attributeHolder->initialize($this->dispatcher, array(), array( branches/1.1/test/unit/view/escaper/sfOutputEscaperTest.php
r7109 r7120 15 15 require_once(dirname(__FILE__).'/../../../../lib/view/escaper/sfOutputEscaperObjectDecorator.class.php'); 16 16 require_once(dirname(__FILE__).'/../../../../lib/view/escaper/sfOutputEscaperIteratorDecorator.class.php'); 17 require_once(dirname(__FILE__).'/../../../../lib/view/escaper/sfOutputEscaperSafe.class.php'); 17 18 18 19 require_once(dirname(__FILE__).'/../../../../lib/plugins/sfCompat10Plugin/lib/helper/EscapingHelper.php'); … … 21 22 sfConfig::set('sf_charset', 'UTF-8'); 22 23 23 $t = new lime_test( 18, new lime_output_color());24 $t = new lime_test(21, new lime_output_color()); 24 25 25 26 class OutputEscaperTestClass … … 38 39 return $o->getTitle(); 39 40 } 41 } 42 43 class OutputEscaperTestClassChild extends OutputEscaperTestClass 44 { 40 45 } 41 46 … … 77 82 $t->isa_ok(sfOutputEscaper::escape('esc_entities', new DirectoryIterator('.')), 'sfOutputEscaperIteratorDecorator', '::escape() returns a sfOutputEscaperIteratorDecorator object if the value to escape is an object that implements the ArrayAccess interface'); 78 83 84 $t->diag('::escape() does not escape object marked as being safe'); 85 $t->isa_ok(sfOutputEscaper::escape('esc_entities', new sfOutputEscaperSafe(new OutputEscaperTestClass())), 'OutputEscaperTestClass', '::escape() returns the original value if it is marked as being safe'); 86 87 sfOutputEscaper::markClassAsSafe('OutputEscaperTestClass'); 88 $t->isa_ok(sfOutputEscaper::escape('esc_entities', new OutputEscaperTestClass()), 'OutputEscaperTestClass', '::escape() returns the original value if the object class is marked as being safe'); 89 $t->isa_ok(sfOutputEscaper::escape('esc_entities', new OutputEscaperTestClassChild()), 'OutputEscaperTestClassChild', '::escape() returns the original value if one of the object parent class is marked as being safe'); 90 79 91 $t->diag('::escape() cannot escape resources'); 80 92 $fh = fopen(__FILE__, 'r');