<?php
/**
* Main configuration
*
* @category PHP
* @package VenoFileManager
* @author Nicola Franchini <info@veno.it>
* @license Exclusively sold on CodeCanyon
* @link http://filemanager.veno.it/
*/
if (!class_exists('SetUp', false)) {
/**
* SetUp Class
*
* @category PHP
* @package VenoFileManager
* @author Nicola Franchini <info@veno.it>
* @license Exclusively sold on CodeCanyon
* @link http://filemanager.veno.it/
*/
class SetUp
{
public $lang;
private $_CONFIG = false;
private $_TRANSLATIONS = false;
/**
* Set session and language
*
* @return set lang session
*/
public function __construct()
{
$this->_CONFIG = $this->loadConfig();
$relative = dirname(dirname(__FILE__)).'/';
$timeconfig = $this->getConfig('default_timezone');
$timezone = (strlen($timeconfig) > 0) ? $timeconfig : "UTC";
date_default_timezone_set($timezone);
if (!isset($_SESSION)) {
if (strlen($this->getConfig('session_name')) > 0) {
session_name($this->getConfig('session_name'));
}
if (PHP_VERSION_ID >= 70300) {
session_set_cookie_params(
// ['httponly' => true]
['httponly' => true, 'samesite' => 'strict']
);
}
/**
* To keep session between www and non www
* Better redirect the whole domain: https://stackoverflow.com/a/24195369
*/
// $parsed = parse_url($this->getConfig('script_url'));
// session_set_cookie_params(0, '/', '.'.$parsed["host"]);
session_start();
}
if (isset($_GET['lang']) && file_exists($relative.'translations/'.$_GET['lang'].'.php')) {
$this->lang = $_GET['lang'];
$_SESSION['lang'] = $_GET['lang'];
}
if (isset($_SESSION['lang'])) {
$this->lang = $_SESSION['lang'];
} else {
$lang = $this->getConfig('lang');
// Get browser lang
if ($this->getConfig('browser_lang') && isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
global $translations_index;
$acceptLang = is_array($translations_index) ? array_keys($translations_index) : array($lang);
$arr = explode(",", $_SERVER['HTTP_ACCEPT_LANGUAGE'], 2);
$get_lang = $arr[0];
$sublang = substr($get_lang, 0, 2);
$stolang = $lang;
foreach ($acceptLang as $value) {
if ($value == $get_lang) {
$stolang = $value;
break;
}
$subval = substr($value, 0, 2);
if ($subval == $sublang) {
$stolang = $value;
}
if ($get_lang == $subval || $value == $sublang) {
$stolang = $value;
}
}
if (file_exists($relative.'translations/'.$stolang.'.php')) {
$lang = $stolang;
}
}
$_SESSION['lang'] = $lang;
$this->lang = $lang;
}
$this->_TRANSLATIONS = $this->loadTranslations($this->lang);
}
/**
* Get language direction
*
* @return direction array
*/
public function getLangDirection()
{
$rtl_languages = array(
'ar',
'ar-SA',
'he',
'he-IL',
'ur',
'ur-PK',
'ps',
'ps-AF',
'dv',
'dv-MV',
'sd',
'sd-PK',
'yi',
);
$lang_direction = array(
'dir' => 'ltr',
'att' => '',
'ext' => '',
'class' => '',
);
if (in_array($this->lang, $rtl_languages)) {
$lang_direction['dir'] = 'rtl';
$lang_direction['att'] = ' dir="rtl"';
$lang_direction['ext'] = '.rtl';
$lang_direction['class'] = ' rtl';
}
return $lang_direction;
}
/**
* Get string in current language
*
* @param string $stringName string to translate
*
* @return translated string
*/
public function getString($stringName)
{
return $this->getLangString($stringName);
}
/**
* The function for getting a translated string.
* Falls back to english if the correct language is missing something.
*
* @param string $stringName string to translate
*
* @return translation
*/
public function getLangString($stringName)
{
// global $_TRANSLATIONS;
$_TRANSLATIONS = $this->_TRANSLATIONS;
if ($_TRANSLATIONS && is_array($_TRANSLATIONS) && isset($_TRANSLATIONS[$stringName]) && strlen($_TRANSLATIONS[$stringName]) > 0) {
$translation = htmlspecialchars($_TRANSLATIONS[$stringName], ENT_COMPAT, 'UTF-8', false);
// Don't bother if there are no specialchars - saves some processing.
if (!preg_match('/[&<>"\']/', $translation)) {
return $translation;
}
$translation = stripslashes(strip_tags($translation));
return $translation;
} else {
return '>'.stripslashes(strip_tags(htmlspecialchars($stringName))).'<';
}
}
/**
* Print languages list
*
* @param string $dir realtive path to translations
*
* @return Languages list
*/
public function printLangMenu($dir = '')
{
global $setUp;
global $translations_index;
$menu = '';
$active_languages = $setUp->getConfig('active_languages', false) ? json_decode($setUp->getConfig('active_languages')) : array('en');
parse_str($_SERVER['QUERY_STRING'], $params);
unset($params['lang']);
$query = http_build_query($params);
$query = $query !== '' ? '?'.$query.'&' : '?';
foreach ($active_languages as $item) {
$langname = isset($translations_index[$item]) ? $translations_index[$item] : $item;
$menu .= '<li';
if ($this->lang === $item) {
$menu .= ' class="active"';
}
$menu .='><a class="dropdown-item" href="'.$query.'lang='.$item.'">';
$menu .= '<span>'.$langname.'</span></a></li>';
}
return $menu;
}
/**
* The function outputting the shortcut icon tag
*
* @param string $path relative path to the file
*
* @return $output
*/
public function printIcon($path = '')
{
$icon_ico = $path.'favicon.ico';
// $icon_png = $path.'favicon-152.png';
$output = '';
$iconsizes = array(
'144', '168', '192', '256', '512'
);
if (file_exists($icon_ico)) {
$output .= '<link rel="shortcut icon" href="'.$icon_ico.'">';
}
foreach ($iconsizes as $size) {
if (file_exists($path.'favicon-'.$size.'.png')) {
$output .= '
<link rel="apple-touch-icon" sizes="'.$size.'x'.$size.'" href="'.$path.'favicon-'.$size.'.png">';
}
}
return $output;
}
/**
* Load $_CONFIG config from config.php
*
* @return users array
*/
public function loadConfig()
{
$_CONFIG = false;
$filepath = dirname(__DIR__).'/config.php';
if (file_exists($filepath)) {
include $filepath;
}
return $_CONFIG;
}
/**
* Load translations file
*
* @param string $lang current lang
*
* @return users array
*/
public function loadTranslations($lang)
{
$_TRANSLATIONS = false;
$custom_filepath = dirname(__DIR__).'/_content/translations/'.$lang.'.php';
$filepath = dirname(__DIR__).'/translations/'.$lang.'.php';
$original = array();
if (file_exists($filepath)) {
include $filepath;
$original = $_TRANSLATIONS;
}
if (file_exists($custom_filepath)) {
include $custom_filepath;
$custom = $_TRANSLATIONS;
$_TRANSLATIONS = array_unique(array_merge($original, $custom), SORT_REGULAR);
}
return $_TRANSLATIONS;
}
/**
* The function for getting configuration values
*
* @param string $name config option name
* @param string $default optional default value
*
* @return config value
*/
public function getConfig($name, $default = false)
{
if ($this->_CONFIG && isset($this->_CONFIG[$name])) {
if ($this->_CONFIG[$name] !== false) {
return $this->_CONFIG[$name];
}
}
return $default;
}
/**
* Get app description
*
* @return html decoded description or false
*/
public function getDescription()
{
global $setUp;
$fulldesc = html_entity_decode($setUp->getConfig('description'), ENT_QUOTES, 'UTF-8');
$cleandesc = strip_tags($fulldesc, '<img>');
if (strlen(trim($cleandesc)) > 0) {
return $fulldesc;
}
return false;
}
/**
* Print alert messages
*
* @return the alert
*/
public function printAlert()
{
global $setUp;
$_ERROR = isset($_SESSION['error']) ? $_SESSION['error'] : false;
$_SUCCESS = isset($_SESSION['success']) ? $_SESSION['success'] : false;
$_WARNING = isset($_SESSION['warning']) ? $_SESSION['warning'] : false;
$alert = false;
$output = '';
$sticky_class = ' top-0 start-0';
$stickypos = array(
'top-left' => ' top-0 start-0',
'bottom-left' => ' bottom-0 start-0',
'top-right' => ' top-0 end-0',
'bottom-right' => ' bottom-0 end-0',
);
$stickypos_get = $setUp->getConfig('sticky_alerts_pos', 'top-left');
$sticky_class = isset($stickypos[$stickypos_get]) ? $stickypos[$stickypos_get] : $sticky_class;
$output .= '<div class="toast-container d-none position-fixed p-3'.$sticky_class.'" style="z-index: 1031; max-height: 100vh; overflow-y:auto;">';
$opentoast = '<div class="toast align-items-center fade show rounded-0" role="alert" aria-live="assertive" aria-atomic="true"><div class="d-flex">';
$closetoast = '</div></div>';
$closebtn = '<button type="button" class="btn-close me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>';
if (is_array($_ERROR)) {
foreach ($_ERROR as $error) {
$output .= $opentoast.'<div class="toast-body w-100 border-5 border-start border-danger">'.$error.'</div>'.$closebtn.$closetoast;
}
$alert = true;
}
if (is_array($_WARNING)) {
foreach ($_WARNING as $warning) {
$output .= $opentoast.'<div class="toast-body w-100 border-5 border-start border-warning">'.$warning.'</div>'.$closebtn.$closetoast;
}
$alert = true;
}
if (is_array($_SUCCESS)) {
foreach ($_SUCCESS as $success) {
$output .= $opentoast.'<div class="toast-body w-100 border-5 border-start border-success">'.$success.'</div>'.$closebtn.$closetoast;
}
$alert = true;
}
$output .= '</div>';
if ($alert === true) {
unset($_SESSION['success']);
unset($_SESSION['error']);
unset($_SESSION['warning']);
return $output;
}
return false;
}
/**
* Format modification date time
*
* @param string $time new format
*
* @return formatted date
*/
public static function formatModTime($time)
{
global $setUp;
$timeformat = 'd.m.y H:i:s';
if ($setUp->getConfig('time_format') != null
&& strlen($setUp->getConfig('time_format')) > 0
) {
$timeformat = $setUp->getConfig('time_format');
}
return date($timeformat, $time);
}
/**
* Format file size
*
* @param string $size new format
*
* @return formatted size
*/
public function formatSize($size)
{
$sizes = array('B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB');
$syz = $sizes[0];
for ($i = 1; (($i < count($sizes)) && ($size >= 1024)); $i++) {
$size = $size / 1024;
$syz = $sizes[$i];
}
return round($size, 2).' '.$syz;
}
/**
* Return ini values in bytes
*
* @param string $val value to convert
*
* @return value in bytes
*/
public function returnIniBytes($val)
{
$val = trim($val);
$last = strtolower($val[strlen($val)-1]);
$val = floatval($val);
switch($last)
{
case 'g':
$val *= 1024;
case 'm':
$val *= 1024;
case 'k':
$val *= 1024;
}
return $val;
}
/**
* Server available max upload size
*
* @return available max upload size in bytes
*/
public function getMaxUploadSize()
{
// select maximum upload size
$max_upload = ($this->returnIniBytes(ini_get('upload_max_filesize'))/2);
// select post limit
$max_post = ($this->returnIniBytes(ini_get('post_max_size'))/2);
// select memory limit
$init_memory_limit = ini_get('memory_limit');
// set equal to post_max_size if memory_limit is unlimited
$memory_limit = $init_memory_limit == '-1' ? $max_post : ($this->returnIniBytes($init_memory_limit)/2);
// get the smallest of them, this defines the real limit
$available = min($max_upload, $max_post, $memory_limit);
// Set 1MB as minimum safe
$available_safe = max(1048576, $available);
// return the value in bytes
return round($available_safe);
}
/**
* Upload chunk size
*
* @return chunksize in bytes (32M if the server can upload at least 64M).
*/
public function getChunkSize()
{
$serverSize = $this->getMaxUploadSize();
$idealSize = 32*1048576; // 1048576 == 1MB
return min($serverSize, $idealSize);
}
/**
* Check if target file is writeable
*
* @param string $path path to check
*
* @return true/false
*/
public function sanitizePath($path)
{
global $setUp;
$prefix = ltrim($setUp->getConfig('starting_dir'), './');
$trimpath = ltrim($path, './');
if (substr($trimpath, 0, strlen($prefix)) == $prefix) {
$trimpath = substr($trimpath, strlen($prefix));
}
return $trimpath;
}
}
}