예제 #1
0
 /**
  * Validates file extension.
  * @param string $extension the extension that must be validated.
  * @param boolean $validateEncoded whether method must validate encoded in local file system charset extension.
  * This param internally is used by this method.
  * @return boolean whether this extension can be used for saving new file.
  */
 protected function isValidExtension($extension, $validateEncoded = true)
 {
     $charset = Yii::$app->charset;
     if (!is_string($extension) || $extension === '' || mb_strpos($extension, '.', 0, $charset) !== false) {
         return false;
     }
     if (!preg_match($this->extensionRegular, $extension)) {
         return false;
     }
     if ($this->containsSpecialChar($extension)) {
         return false;
     }
     $extensionLoweredCase = mb_strtolower($extension, $charset);
     foreach ($this->disallowedExtensions as $disallowedExt) {
         if (mb_strtolower($disallowedExt, $charset) === $extensionLoweredCase) {
             return false;
         }
     }
     if ($validateEncoded) {
         $encodedExtension = FileSystemHelper::encodeFilename($extension);
         return $this->isValidExtension($encodedExtension, false);
     }
     return true;
 }
예제 #2
0
 /**
  * Parses extension from file path.
  * It returns [[self::$extension]] is the last is set.
  * Otherwise the method tries to detect file mime type.
  * If mime type was not detected the method tries to parse file extension.
  * @param string $readFilePath path to file which extension must be parsed.
  * @return string|null parsed extension in local file system charset or null if extension is unknown.
  */
 protected function parseFileExtension($readFilePath)
 {
     if ($this->extension !== null) {
         return $this->extension;
     }
     // try to determine mime type
     $mimeType = FileSystemHelper::getMimeType($readFilePath, null, true);
     if ($mimeType !== null) {
         $extensions = FileSystemHelper::getExtensionsByMimeType($mimeType, $this->mimeMagicFile);
         if (is_array($extensions) && count($extensions)) {
             return reset($extensions);
         }
     }
     // try to parse extension
     $decodedReadFilePath = FileSystemHelper::decodeFilename($readFilePath);
     if ($decodedReadFilePath === false) {
         return null;
     }
     $extension = FileSystemHelper::extension($decodedReadFilePath);
     if ($extension === null || $extension === '') {
         return $extension;
     }
     $fsExtension = FileSystemHelper::encodeFilename($extension);
     return $fsExtension === false ? null : $fsExtension;
 }