/** * 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; }
/** * 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; }