.
*
*/
defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo'));
/**
* Esta clase es la encargada de mostrar el HTML
*/
class SP_Html {
private static $htmlPage = array();
public static $htmlBodyOpts = "";
/**
* @brief Crear un elemento del tipo SELECT
* @param array $arrValues con los valores del select
* @param array $arrSelectProp con las propiedades del select
* @param bool $useValue para usar el Id como valor
* @return none
*
* Esta función genera un elemento SELECT con las propiedades y valores pasados.
*/
public static function printSelect($arrValues, $arrSelectProp, $useValue = TRUE) {
if (!is_array($arrSelectProp)) {
return;
}
$strAttrs = ( is_array($arrSelectProp["attribs"]) ) ? implode(" ", $arrSelectProp["attribs"]) : "";
$strClass = ( $arrSelectProp["class"] ) ? 'class="' . $arrSelectProp["class"] . '"' : "";
if (!is_array($arrValues)) {
echo '';
echo '';
return;
}
if ($arrSelectProp["label"]) {
echo '';
}
echo '';
}
/**
* @brief Mostrar la página HTML
* @param string $page opcional con la página a mostar
* @param array $err con los errores generados
* @return none
*
* Esta función es la encargada de devolver el código HTML al navegador.
*/
public static function render($page = "main", $err = NULL) {
$data['showlogo'] = 1;
// UTF8 Headers
header("Content-Type: text/html; charset=UTF-8");
if (!is_null($err) && is_array($err) && count($err) > 0) {
$data['errors'] = $err;
}
// Start the page
self::$htmlPage[] = '';
self::$htmlPage[] = '';
self::makeHeader();
self::makeBody($page);
self::$htmlPage[] = '';
foreach (self::$htmlPage as $html) {
if (is_array($html) && array_key_exists('include', $html)) {
self::getTemplate($html['include'], $data);
} else {
echo $html . PHP_EOL;
}
}
}
/**
* @brief Crear el header en HTML
* @return none
*
* Esta función crea la cabecera de una página HTML
*/
private static function makeHeader() {
$info = self::getAppInfo();
self::$htmlPage[] = '
';
self::$htmlPage[] = '' . $info['appname'] . ' :: ' . $info['appdesc'] . '';
self::$htmlPage[] = '';
self::$htmlPage[] = '';
self::setCss();
self::setJs();
self::$htmlPage[] = '';
}
/**
* @brief Crear el body en HTML
* @return none
*
* Esta función crea el cuerpo de una página HTML
*/
private static function makeBody($page) {
self::$htmlPage[] = '';
self::$htmlPage[] = '
';
self::$htmlPage[] = '';
}
/**
* @brief Crear el pie de la página HTML
* @param string $page opcional con la paǵina a mostrar
* @return none
*
* Esta función crea el pie de página en HTML
*/
public static function makeFooter($page = "main") {
$info = self::getAppInfo();
self::$htmlPage[] = ' ';
self::$htmlPage[] = '';
}
/**
* @brief Crea la barra de navegación para búsqueda de cuentas
* @param int $intSortKey con el número de campo del filro
* @param int $intCur con el número de página actual
* @param int $intTotal con el número total de páginas
* @param int $intLimit con el límite de registros a mostrar
* @param int $intTime con el tiempo de carga de los resultados
* @param bool $filterOn opcional con el estado del filtrado
* @return none
*/
public static function printQuerySearchNavBar($intSortKey, $intCur, $intTotal, $intLimit, $intTime, $filterOn = FALSE) {
$firstPage = ceil(($intCur + 1) / $intLimit);
$lastPage = ceil($intTotal / $intLimit);
$globalOn = SP_Common::parseParams('p', 'gsearch', 0, FALSE, 1);
echo '
';
}
/**
* @brief Crea la barra de navegación para el registro de eventos
* @param int $intCur con el número de página actual
* @param int $intTotal con el número total de páginas
* @param int $intTime con el tiempo de carga de los resultados
* @return none
*/
public static function printQueryLogNavBar($intCur, $intTotal, $intTime = 0) {
$intLimit = 50;
$firstPage = ceil(($intCur + 1) / $intLimit);
$lastPage = ceil($intTotal / $intLimit);
echo '
';
}
/**
* @brief Limpia los datos recibidos de un formulario
* @param string $data con los datos a limpiar
* @return string con los datos limpiados
*/
public static function sanitize(&$data) {
if (!$data) {
return FALSE;
}
if (is_array($data)) {
array_walk_recursive($data, 'SP_Html::sanitize');
} else {
$data = strip_tags($data);
// Fix &entity\n;
$data = str_replace(array('&', '<', '>'), array('&', '<', '>'), $data);
$data = preg_replace('/(*\w+)[\x00-\x20]+;/u', '$1;', $data);
$data = preg_replace('/(*[0-9A-F]+);*/iu', '$1;', $data);
$data = html_entity_decode($data, ENT_COMPAT, 'UTF-8');
// Remove any attribute starting with "on" or xmlns
$data = preg_replace('#(<[^>]+?[\x00-\x20"\'])(?:on|xmlns)[^>]*+>#iu', '$1>', $data);
// Remove javascript: and vbscript: protocols
$data = preg_replace('#([a-z]*)[\x00-\x20]*=[\x00-\x20]*([`\'"]*)[\x00-\x20]*j[\x00-\x20]*a[\x00-\x20]*v[\x00-\x20]*a[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2nojavascript...', $data);
$data = preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*v[\x00-\x20]*b[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2novbscript...', $data);
$data = preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*-moz-binding[\x00-\x20]*:#u', '$1=$2nomozbinding...', $data);
// Only works in IE:
$data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?expression[\x00-\x20]*\([^>]*+>#i', '$1>', $data);
$data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?behaviour[\x00-\x20]*\([^>]*+>#i', '$1>', $data);
$data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:*[^>]*+>#iu', '$1>', $data);
// Remove namespaced elements (we do not need them)
$data = preg_replace('#*\w+:\w[^>]*+>#i', '', $data);
do {
// Remove really unwanted tags
$old_data = $data;
$data = preg_replace('#*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|i(?:frame|layer)|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|title|xml)[^>]*+>#i', '', $data);
} while ($old_data !== $data);
}
return $data;
}
/**
* @brief Establece los enlaces CSS de la página HTML
* @return none
*/
public static function setCss() {
$versionParameter = '?v=' . md5(implode(SP_Util::getVersion()));
$cssProp = array(
array("href" => "css/reset.css", "media" => ""),
array("href" => "css/smoothness/jquery-ui.css", "media" => "screen"),
array("href" => "css/jquery.powertip.css", "media" => "screen"),
array("href" => "css/jquery.powertip-yellow.min.css", "media" => "screen"),
array("href" => "css/chosen.css", "media" => "screen"),
array("href" => "css/alertify.core.css", "media" => "screen"),
array("href" => "css/alertify.default.css", "media" => "screen"),
array("href" => "css/jquery.tagsinput.css", "media" => "screen"),
array("href" => "js/fancybox/jquery.fancybox.css", "media" => "screen"),
array("href" => "css/styles.css", "media" => ""));
foreach ($cssProp as $css) {
self::$htmlPage[] = '';
}
}
/**
* @brief Establece los enlaces JAVASCRIPT de la página HTML
* @return none
*/
public static function setJs() {
$versionParameter = md5(implode(SP_Util::getVersion()));
$js_files = self::getJs();
foreach ($js_files as $js) {
self::$htmlPage[] = '';
}
}
/**
* @brief Devuelve un array con los archivos JS a incluir
* @return array con los archivos js y parámetros
*/
public static function getJs() {
$jsProp = array(
array("src" => "js/jquery.js", "params" => ""),
array("src" => "js/jquery.placeholder.js", "params" => ""),
array("src" => "js/jquery-ui.js", "params" => ""),
array("src" => "js/fancybox/jquery.fancybox.pack.js", "params" => ""),
array("src" => "js/jquery.powertip.min.js", "params" => ""),
array("src" => "js/chosen.jquery.min.js", "params" => ""),
array("src" => "js/alertify.min.js", "params" => ""),
array("src" => "js/jquery.fileDownload.js", "params" => ""),
array("src" => "js/jquery.filedrop.js", "params" => ""),
array("src" => "js/jquery.tagsinput.js", "params" => ""),
array("src" => "js/functions.php", "params" => "&l=" . SP_Init::$LANG . "&r=" . urlencode(base64_encode(SP_Init::$WEBROOT)))
);
return $jsProp;
}
/**
* @brief Devuelve información sobre la aplicación
* @return array con las propiedades de la aplicación
*/
public static function getAppInfo($index = NULL) {
$appinfo = array(
'appname' => 'sysPass',
'appdesc' => 'Sysadmin Password Manager',
'appwebsite' => 'http://www.syspass.org',
'appblog' => 'http://www.cygnux.org',
'appdoc' => 'http://wiki.syspass.org',
'appupdates' => 'http://sourceforge.net/api/file/index/project-id/775555/mtime/desc/limit/20/rss',
'apphelp' => 'help.syspass.org',
'appchangelog' => '');
if (!is_null($index) && array_key_exists($index, $appinfo)) {
return $appinfo[$index];
}
return $appinfo;
}
/**
* @brief Muestra una barra de información con los registros y tiempo de la consulta
* @param int $intTotal con el total de registros devueltos
* @param int $startTime con el tiempo de inicio de la consulta
* @return none
*/
public static function printQueryInfoBar($intTotal, $startTime) {
$endTime = microtime();
$totalTime = round($endTime - $startTime, 5);
echo '
';
echo '
' . $intTotal . ' @ ' . $totalTime . ' s
';
echo '
';
}
/**
* @brief Truncar un texto a una determinada longitud
* @return string con el texto truncado
*/
public static function truncate($str, $len) {
$tail = max(0, $len - 10);
$truncate = substr($str, 0, $tail);
$truncate .= strrev(preg_replace('~^..+?[\s,:]\b|^...~', '...', strrev(substr($str, $tail, $len - $tail))));
return $truncate;
}
/**
* @brief Cargar un archivo de plantilla
* @param string $template con el nombre de la plantilla
* @param array $tplvars con los datos a pasar a la plantilla
* @return none
*/
public static function getTemplate($template, $tplvars = array()) {
$tpl = dirname(__FILE__) . '/tpl/' . $template . '.php';
if (file_exists($tpl)) {
$data = $tplvars;
include_once $tpl;
//self::$htmlPage[] = array('include' => $tpl);
}
}
/**
* @brief Devolver errores comunes
* @param string $code con el código de error a mostrar
* @return none
*
* Esta función muestra la página de error con el error indicado.
*/
public static function showCommonError($code) {
$commonErrors = array(
'unavailable' => array('txt' => _('Opción no disponible'), 'hint' => _('Consulte con el administrador')),
'noaccpermission' => array('txt' => _('No tiene permisos para acceder a esta cuenta'), 'hint' => _('Consulte con el administrador')),
'nopermission' => array('txt' => _('No tiene permisos para acceder a esta página'), 'hint' => _('Consulte con el administrador')),
'updatempass' => array('txt' => _('Clave maestra actualizada'), 'hint' => _('Reinicie la sesión para cambiarla'))
);
$data['errors'][] = array(
'type' => 'critical',
'description' => $commonErrors[$code]['txt'],
'hint' => $commonErrors[$code]['hint']);
self::getTemplate('error', $data);
exit();
}
private static function minifier($files) {
if (!is_array($files)) {
return FALSE;
}
foreach ($files as $file) {
//$output_min .= file_get_contents($file['src']);
include_once SP_Init::$SERVERROOT . '/' . $file['src'];
}
//return $output_min;
}
/**
* @brief Convertir un color RGB a HEX
* @param array $rgb con color en RGB
* @return string
*
* From: http://bavotasan.com/2011/convert-hex-color-to-rgb-using-php/
*/
public static function rgb2hex($rgb) {
$hex = "#";
$hex .= str_pad(dechex($rgb[0]), 2, "0", STR_PAD_LEFT);
$hex .= str_pad(dechex($rgb[1]), 2, "0", STR_PAD_LEFT);
$hex .= str_pad(dechex($rgb[2]), 2, "0", STR_PAD_LEFT);
return $hex; // returns the hex value including the number sign (#)
}
/**
* @brief Devolver una tabla con el resultado de una consulta y acciones
* @param array $arrTableProp con las propiedades de la tabla
* @return none
*/
public static function getQueryTable($arrTableProp, $queryItems) {
$sk = SP_Common::getSessionKey(TRUE);
echo '