Current Directory: /home/astoriaah/www/old15/components/com_foxcontact/helpers
Viewing File: /home/astoriaah/www/old15/components/com_foxcontact/helpers/fmimetype.php
<?php defined("_JEXEC") or die(file_get_contents("index.html"));
// Program: Fox Contact for Joomla
// Copyright (C): 2011 Demis Palma
// Documentation: http://www.fox.ra.it/forum/2-documentation.html
// License: Distributed under the terms of the GNU General Public License GNU/GPL v3 http://www.gnu.org/licenses/gpl-3.0.html
$inc_dir = realpath(dirname(__FILE__));
require_once($inc_dir . '/flogger.php');
include_once(realpath(dirname(__FILE__) . "/../" . substr(basename(realpath(dirname(__FILE__) . "/..")), 4) . ".inc"));
class FMimeType
{
public $Allowed = array();
public $Mimetype;
public function __construct()
{
}
public function Check($filename, &$cparams)
{
// If a filter is not required, return without checking anything else
// Note that default value is 1 as a protection against malformed session
if (!(bool)$cparams->get("upload_filter", 0)) return true;
// Ok, we are not so lucky. First we read allowed mime types family
// Note that default value is 0 as a protection against malformed session
if ((bool)$cparams->get("upload_audio", 0)) $this->Allowed[] = "/^audio\//";
if ((bool)$cparams->get("upload_video", 0)) $this->Allowed[] = "/^video\//";
if ((bool)$cparams->get("upload_images", 0)) $this->Allowed[] = "/^image\//";
if ((bool)$cparams->get("upload_archives", 0))
{
$this->Allowed[] = "/^application\/.*zip/"; // zip
$this->Allowed[] = "/^application\/x-compress/"; // z
$this->Allowed[] = "/^application\/x-compressed/"; // tgz
$this->Allowed[] = "/^application\/x-gzip/"; // gz
$this->Allowed[] = "/^application\/x-rar/"; // rar
}
if ((bool)$cparams->get("upload_documents", 0))
{
$this->Allowed[] = "/^(application|text)\/rtf/"; // rtf
$this->Allowed[] = "/^application\/pdf/"; // pdf
$this->Allowed[] = "/^application\/msword/"; // doc dot
$this->Allowed[] = "/^application\/vnd.ms-/"; // (excel) xla xlc xlm xls xlt xlw (powerpoint) pot pps ppt (works) wcm wdb wks wps
$this->Allowed[] = "/^application\/vnd\.openxmlformats-officedocument\./"; // docx xlsx pptx
$this->Allowed[] = "/^application\/x-mspublisher/"; // pub
$this->Allowed[] = "/^application\/x-mswrite/"; // wri
$this->Allowed[] = "/^application\/vnd\.oasis\.opendocument\.text/"; // odt
}
$this->Mimetype = $this->read_mimetype($filename);
// Filter disabled because of poor mimeinfo support on server
// which means that $cparams->get("upload_filter") IS NOT SET IN THE PARAMETERS
// and weren't return in the first line of this function
if ($this->Mimetype == "disabled") return true;
// Remove charset information. Not really needed, but useful if the caller wants to display the mimetype
$this->Mimetype = preg_replace("/;.*/", "", $this->Mimetype);
foreach ($this->Allowed as $allowed_type)
{
if ((bool)preg_match($allowed_type, $this->Mimetype)) return true;
}
return false;
}
private function read_mimetype($filename)
{
$db = JFactory::getDBO();
$sql = "SELECT value FROM #__" . $GLOBALS["ext_name"] . "_settings WHERE name = 'mimefilter';";
$db->setQuery($sql);
$method = $db->loadResult();
if (!$method)
{
return "";
}
$result = $this->$method($filename);
return $result;
}
private function use_fileinfo($filename)
{
$minfo = new finfo(FILEINFO_MIME);
return $minfo->file($filename);
}
private function use_mimecontent($filename)
{
return mime_content_type($filename);
}
private function disabled($filename)
{
// 1) In the component options, a disabled value is not stored and subsequential query load a default
// 2) I have to set as default filter enabled to 1 and all filetype to 0 in function Check()
// This is the only rasonable point to detect that mime filter is disabled. The caller will check this return value
return "disabled";
}
}
class fmimetypeCheckEnvironment
{
protected $InstallLog;
public function __construct()
{
$this->InstallLog = new FLogger("fmimetype", "install");
$this->InstallLog->Write("--- Determining if this system is able to detect file mime types ---");
switch (true)
{
case $this->fileinfo_usable(): $value = "use_fileinfo"; break;
case $this->mimecontent_usable(): $value = "use_mimecontent"; break;
// No way to determine files mime type
default: $value = "disabled";
}
$db = JFactory::getDBO();
$sql = "REPLACE INTO #__" . $GLOBALS["ext_name"] . "_settings (name, value) VALUES ('mimefilter', '$value');";
$db->setQuery($sql);
$result = $db->query();
$this->InstallLog->Write("--- Method choosen to detect file mime types is [$value] ---");
return $result;
}
// If available, we'll use PECL FileInfo
private function fileinfo_usable()
{
if (!extension_loaded('fileinfo'))
{
$this->InstallLog->Write("fileinfo extension not found");
return false;
}
$this->InstallLog->Write("fileinfo extension found. Let's see if it works.");
$minfo = @new finfo(FILEINFO_MIME);
$result = true;
$result &= $this->test(@$minfo->file($this->filename("test.mp3")), "/^audio\//");
$result &= $this->test(@$minfo->file($this->filename("test.mp4")), "/^video\//");
$result &= $this->test(@$minfo->file($this->filename("test.jpg")), "/^image\//");
$result &= $this->test(@$minfo->file($this->filename("test.zip")), "/^application\/.*zip/");
$result &= $this->test(@$minfo->file($this->filename("test.pdf")), "/^application\/pdf/");
return $result;
}
// So you have an outdated server... as a second choice, we'll use deprecated function mime_content_type
private function mimecontent_usable()
{
if (!function_exists('mime_content_type'))
{
$this->InstallLog->Write("mime_content_type() function not found");
return false;
}
$this->InstallLog->Write("mime_content_type() function found. Let's see if it works.");
$result = true;
$result &= $this->test(mime_content_type($this->filename("test.mp3")), "/^audio\//");
$result &= $this->test(mime_content_type($this->filename("test.mp4")), "/^video\//");
$result &= $this->test(mime_content_type($this->filename("test.jpg")), "/^image\//");
$result &= $this->test(mime_content_type($this->filename("test.zip")), "/^application\/.*zip/");
$result &= $this->test(mime_content_type($this->filename("test.pdf")), "/^application\/pdf/");
return $result;
}
private function test($detected, $expected)
{
//$result = strpos($detected, $expected) !== false;
$result = preg_match($expected, $detected);
$this->InstallLog->Write("testing detected mimetype [$detected] seeking expected string [$expected]... [" . intval($result) . "]");
return $result;
}
private function filename($filename)
{
return JPATH_ROOT . "/media/" . $GLOBALS["com_name"] . "/mimetypes/" . $filename;
}
}