appserver-io /
properties
This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
| 1 | <?php |
||
| 2 | |||
| 3 | /** |
||
| 4 | * \AppserverIo\Properties\Properties |
||
| 5 | * |
||
| 6 | * NOTICE OF LICENSE |
||
| 7 | * |
||
| 8 | * This source file is subject to the Open Software License (OSL 3.0) |
||
| 9 | * that is available through the world-wide-web at this URL: |
||
| 10 | * http://opensource.org/licenses/osl-3.0.php |
||
| 11 | * |
||
| 12 | * PHP version 5 |
||
| 13 | * |
||
| 14 | * @author Tim Wagner <[email protected]> |
||
| 15 | * @copyright 2015 TechDivision GmbH <[email protected]> |
||
| 16 | * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) |
||
| 17 | * @link http://github.com/appserver-io/properties |
||
| 18 | * @link http://www.appserver.io |
||
| 19 | */ |
||
| 20 | |||
| 21 | namespace AppserverIo\Properties; |
||
| 22 | |||
| 23 | use AppserverIo\Lang\Strng; |
||
| 24 | use AppserverIo\Lang\NullPointerException; |
||
| 25 | use AppserverIo\Collections\HashMap; |
||
| 26 | |||
| 27 | /** |
||
| 28 | * The Properties class represents a persistent set of properties. |
||
| 29 | * The Properties can be saved to a stream or loaded from a stream. |
||
| 30 | * Each key and its corresponding value in the property list is a string. |
||
| 31 | * |
||
| 32 | * A property list can contain another property list as its "defaults"; |
||
| 33 | * this second property list is searched if the property key is not |
||
| 34 | * found in the original property list. |
||
| 35 | * |
||
| 36 | * Because Properties inherits from HashMap, the put method can be |
||
| 37 | * applied to a Properties object. Their use is strongly discouraged |
||
| 38 | * as they allow the caller to insert entries whose keys or values are |
||
| 39 | * not Strings. The setProperty method should be used instead. If the |
||
| 40 | * store or save method is called on a "compromised" Properties object |
||
| 41 | * that contains a non-String key or value, the call will fail. |
||
| 42 | * |
||
| 43 | * @author Tim Wagner <[email protected]> |
||
| 44 | * @copyright 2015 TechDivision GmbH <[email protected]> |
||
| 45 | * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) |
||
| 46 | * @link http://github.com/appserver-io/properties |
||
| 47 | * @link http://www.appserver.io |
||
| 48 | */ |
||
| 49 | class Properties extends HashMap implements PropertiesInterface |
||
| 50 | { |
||
| 51 | |||
| 52 | /** |
||
| 53 | * This member is TRUE if the sections should be parsed, else FALSE |
||
| 54 | * |
||
| 55 | * @var boolean |
||
| 56 | */ |
||
| 57 | protected $sections = false; |
||
| 58 | |||
| 59 | /** |
||
| 60 | * The default constructor. |
||
| 61 | * |
||
| 62 | * @param \AppserverIo\Properties\Properties $defaults The properties we want want to use for initialization |
||
| 63 | */ |
||
| 64 | 11 | public function __construct(Properties $defaults = null) |
|
| 65 | { |
||
| 66 | // check if properties are passed |
||
| 67 | 11 | if ($defaults != null) { |
|
| 68 | // if yes set them |
||
| 69 | parent::__construct($defaults->toArray()); |
||
| 70 | } else { |
||
| 71 | 11 | parent::__construct(); |
|
| 72 | } |
||
| 73 | 11 | } |
|
| 74 | |||
| 75 | /** |
||
| 76 | * Factory method. |
||
| 77 | * |
||
| 78 | * @param \AppserverIo\Properties\Properties $defaults Default properties to initialize the new ones with |
||
| 79 | * |
||
| 80 | * @return \AppserverIo\Properties\Properties The initialized properties |
||
| 81 | */ |
||
| 82 | 8 | public static function create(Properties $defaults = null) |
|
| 83 | { |
||
| 84 | 8 | return new Properties($defaults); |
|
| 85 | } |
||
| 86 | |||
| 87 | /** |
||
| 88 | * Reads a property list (key and element pairs) from the passed file. |
||
| 89 | * |
||
| 90 | * @param string $file The path and the name of the file to load the properties from |
||
| 91 | * @param boolean $sections Has to be TRUE to parse the sections |
||
| 92 | * @param integer $scannerMode Can either be INI_SCANNER_NORMAL (default) or INI_SCANNER_RAW, if INI_SCANNER_RAW is supplied, then option values will not be parsed. |
||
| 93 | * |
||
| 94 | * @return \AppserverIo\Properties\Properties The initialized properties |
||
| 95 | * @throws \AppserverIo\Properties\PropertyFileParseException Is thrown if an error occurs while parsing the property file |
||
| 96 | * @throws \AppserverIo\Properties\PropertyFileNotFoundException Is thrown if the property file passed as parameter does not exist in the include path |
||
| 97 | * @link http://php.net/parse_ini_string |
||
| 98 | */ |
||
| 99 | 7 | public function load($file, $sections = false, $scannerMode = INI_SCANNER_RAW) |
|
| 100 | { |
||
| 101 | // try to load the file content |
||
| 102 | 7 | $content = @file_get_contents($file, FILE_USE_INCLUDE_PATH); |
|
| 103 | // check if file has successfully been loaded |
||
| 104 | 7 | if (! $content) { |
|
| 105 | // throw an exception if the file can not be found in the include path |
||
| 106 | 1 | throw new PropertyFileNotFoundException(sprintf('File %s not found in include path', $file)); |
|
| 107 | } |
||
| 108 | // parse the file content |
||
| 109 | 6 | $properties = parse_ini_string($content, $this->sections = $sections, $scannerMode); |
|
| 110 | // check if property file was parsed successfully |
||
| 111 | 6 | if ($properties == false) { |
|
| 112 | // throw an exception if an error occurs |
||
| 113 | 1 | throw new PropertyFileParseException(sprintf('File %s can not be parsed as property file', $file)); |
|
| 114 | } |
||
| 115 | // set the found values |
||
| 116 | 5 | $this->items = $properties; |
|
| 117 | // return the initialized properties |
||
| 118 | 5 | return $this; |
|
| 119 | } |
||
| 120 | |||
| 121 | /** |
||
| 122 | * Stores the properties in the property file. This method is NOT using the include path for storing the file. |
||
| 123 | * |
||
| 124 | * @param string $file The path and the name of the file to store the properties to |
||
| 125 | * |
||
| 126 | * @return void |
||
| 127 | * |
||
| 128 | * @throws \AppserverIo\Properties\PropertyFileStoreException Is thrown if the file could not be written |
||
| 129 | * @todo Actually only properties without sections will be stored, if a section is specified, then it will be ignored |
||
|
0 ignored issues
–
show
|
|||
| 130 | */ |
||
| 131 | 2 | public function store($file) |
|
| 132 | { |
||
| 133 | // create a new file or replace the old one if it exists |
||
| 134 | 2 | if (($handle = @fopen($file, "w+")) === false) { |
|
| 135 | 1 | throw new PropertyFileStoreException(sprintf('Can\'t open property file %s for writing', $file)); |
|
| 136 | } |
||
| 137 | // store the property in the file |
||
| 138 | 1 | foreach ($this->items as $name => $value) { |
|
| 139 | 1 | $written = @fwrite($handle, $name . " = " . addslashes($value) . PHP_EOL); |
|
| 140 | 1 | if ($written === false) { |
|
| 141 | throw new PropertyFileStoreException(sprintf('Can\'t attach property with name %s to property file %s', $name, $file)); |
||
| 142 | } |
||
| 143 | 1 | } |
|
| 144 | // saves and closes the file and returns TRUE if the file was written successfully |
||
| 145 | 1 | if (!@fclose($handle)) { |
|
| 146 | throw new PropertyFileStoreException(sprintf('Error while closing and writing property file %s', $file)); |
||
| 147 | } |
||
| 148 | 1 | } |
|
| 149 | |||
| 150 | /** |
||
| 151 | * Searches for the property with the specified key in this property list. |
||
| 152 | * |
||
| 153 | * @param string $key Holds the key of the value to return |
||
| 154 | * @param string $section Holds a string with the section name to return the key for (only matters if sections is set to TRUE) |
||
| 155 | * |
||
| 156 | * @return string Holds the value of the passed key |
||
| 157 | * @throws \AppserverIo\Lang\NullPointerException Is thrown if the passed key, or, if sections are TRUE, the passed section is NULL |
||
| 158 | */ |
||
| 159 | 6 | public function getProperty($key, $section = null) |
|
| 160 | { |
||
| 161 | // initialize the property value |
||
| 162 | 6 | $property = null; |
|
| 163 | // check if the sections are included |
||
| 164 | 6 | if ($this->sections) { |
|
| 165 | // if the passed section OR the passed key is NULL throw an exception |
||
| 166 | 1 | if ($section == null) { |
|
|
0 ignored issues
–
show
|
|||
| 167 | throw new NullPointerException('Passed section is null'); |
||
| 168 | } |
||
| 169 | 1 | if ($key == null) { |
|
| 170 | throw new NullPointerException('Passed key is null'); |
||
| 171 | } |
||
| 172 | // if the section exists ... |
||
| 173 | 1 | if ($this->exists($section)) { |
|
| 174 | // get all entries of the section |
||
| 175 | 1 | $entries = new HashMap($this->get($section)); |
|
| 176 | 1 | if ($entries->exists($key)) { |
|
| 177 | // if yes set it |
||
| 178 | 1 | $property = $entries->get($key); |
|
| 179 | 1 | } |
|
| 180 | 1 | } |
|
| 181 | 1 | } else { |
|
| 182 | // if the passed key is NULL throw an exception |
||
| 183 | 5 | if ($key == null) { |
|
| 184 | throw new NullPointerException('Passed key is null'); |
||
| 185 | } |
||
| 186 | // check if the property exists in the internal list |
||
| 187 | 5 | if ($this->exists($key)) { |
|
| 188 | // if yes set it |
||
| 189 | 5 | $property = $this->get($key); |
|
| 190 | 5 | } |
|
| 191 | } |
||
| 192 | // return the property or null |
||
| 193 | 6 | return $property; |
|
| 194 | } |
||
| 195 | |||
| 196 | /** |
||
| 197 | * Calls the HashMap method add. |
||
| 198 | * |
||
| 199 | * @param string $key Holds the key of the value to return |
||
| 200 | * @param mixed $value Holds the value to add to the properties |
||
| 201 | * @param string $section Holds a string with the section name to return the key for (only matters if sections is set to TRUE) |
||
| 202 | * |
||
| 203 | * @return void |
||
| 204 | * @throws \AppserverIo\Lang\NullPointerException Is thrown if the passed key, or, if sections are TRUE, the passed section is NULL |
||
| 205 | */ |
||
| 206 | 5 | public function setProperty($key, $value, $section = null) |
|
| 207 | { |
||
| 208 | // check if the sections are included |
||
| 209 | 5 | if ($this->sections) { |
|
| 210 | // if the passed section OR the passed key is NULL throw an exception |
||
| 211 | if ($section == null) { |
||
|
0 ignored issues
–
show
|
|||
| 212 | throw new NullPointerException('Passed section is null'); |
||
| 213 | } |
||
| 214 | if ($key == null) { |
||
| 215 | throw new NullPointerException('Passed key is null'); |
||
| 216 | } |
||
| 217 | // if the section exists ... |
||
| 218 | if ($this->exists($section)) { |
||
| 219 | // get all entries of the section |
||
| 220 | $entries = new HashMap($this->get($section)); |
||
| 221 | $entries->add($key, $value); |
||
| 222 | } |
||
| 223 | } else { |
||
| 224 | // if the passed key is NULL throw an exception |
||
| 225 | 5 | if ($key == null) { |
|
| 226 | throw new NullPointerException('Passed key is null'); |
||
| 227 | } |
||
| 228 | // add the value with the passed |
||
| 229 | 5 | $this->add($key, $value); |
|
| 230 | } |
||
| 231 | 5 | } |
|
| 232 | |||
| 233 | /** |
||
| 234 | * Returns all properties with their keys as a string. |
||
| 235 | * |
||
| 236 | * @return string String with all key -> properties pairs |
||
| 237 | */ |
||
| 238 | public function __toString() |
||
| 239 | { |
||
| 240 | // initialize the return value |
||
| 241 | $return = ""; |
||
| 242 | // iterate over all items and concatenate the values to |
||
| 243 | // the return string |
||
| 244 | foreach ($this->items as $key => $value) { |
||
| 245 | // if sections are set to true there can be subarrays |
||
| 246 | // with key/value pairs |
||
| 247 | if (is_array($value)) { |
||
| 248 | // set the section and add the key/value pairs to the section |
||
| 249 | $return .= "[" . $key . "]"; |
||
| 250 | foreach ($value as $sectionKey => $sectionValue) { |
||
| 251 | $return .= $sectionKey . "=" . $sectionValue . PHP_EOL; |
||
| 252 | } |
||
| 253 | } |
||
| 254 | // add the key/value pair |
||
| 255 | $return .= $key . "=" . $value . PHP_EOL; |
||
| 256 | } |
||
| 257 | // return the string |
||
| 258 | return $return; |
||
| 259 | } |
||
| 260 | |||
| 261 | /** |
||
| 262 | * Returns all properties with their keys as a String. |
||
| 263 | * |
||
| 264 | * @return \AppserverIo\Lang\String String with all key -> properties pairs |
||
| 265 | */ |
||
| 266 | public function toString() |
||
| 267 | { |
||
| 268 | return new Strng($this->__toString()); |
||
| 269 | } |
||
| 270 | |||
| 271 | /** |
||
| 272 | * Merges the passed properties into the actual instance. If override |
||
| 273 | * flag is set to TRUE, existing properties will be overwritten. |
||
| 274 | * |
||
| 275 | * @param \AppserverIo\Properties\PropertiesInterface $properties The properties to merge |
||
| 276 | * @param boolean $override TRUE if existing properties have to be overwritten, else FALSE |
||
| 277 | * |
||
| 278 | * @return void |
||
| 279 | */ |
||
| 280 | 2 | public function mergeProperties(PropertiesInterface $properties, $override = false) |
|
| 281 | { |
||
| 282 | // iterate over the keys of the passed properties and add thm, or replace existing ones |
||
| 283 | 2 | foreach ($properties as $key => $value) { |
|
|
0 ignored issues
–
show
|
|||
| 284 | 2 | if ($this->exists($key) === false || ($this->exists($key) === true && $override === true)) { |
|
| 285 | 2 | $this->setProperty($key, $value); |
|
| 286 | 2 | } |
|
| 287 | 2 | } |
|
| 288 | 2 | } |
|
| 289 | |||
| 290 | /** |
||
| 291 | * Returns all key values as an array. |
||
| 292 | * |
||
| 293 | * @return array The keys as array values |
||
| 294 | */ |
||
| 295 | 3 | public function getKeys() |
|
| 296 | { |
||
| 297 | // check if the property file is sectioned |
||
| 298 | 3 | if ($this->sections) { |
|
| 299 | // initialize the array for the keys |
||
| 300 | 1 | $keys = array(); |
|
| 301 | // iterate over the sections and merge all sectioned keys |
||
| 302 | 1 | foreach ($this->items as $item) { |
|
| 303 | 1 | $keys = array_merge($keys, array_keys($item)); |
|
| 304 | 1 | } |
|
| 305 | // return the keys |
||
| 306 | 1 | return $keys; |
|
| 307 | } else { |
||
| 308 | 2 | return array_keys($this->items); |
|
| 309 | } |
||
| 310 | } |
||
| 311 | } |
||
| 312 |
This check looks
TODOcomments that have been left in the code.``TODO``s show that something is left unfinished and should be attended to.