| Server IP : 195.130.67.5 / Your IP : 216.73.217.154 Web Server : Microsoft-IIS/10.0 System : Windows NT WEBSERVER1 10.0 build 17763 (Windows Server 2016) i586 User : IUSR ( 0) PHP Version : 7.4.19 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : OFF | Perl : OFF | Python : OFF | Sudo : OFF | Pkexec : OFF Directory : /inetpub/wwwroot/icd/administrator/components/com_linkr/models/ |
Upload File : |
<?php
defined('_JEXEC') or die;
// Import librairies
jimport('joomla.application.component.model');
/**
* JSON request model
*/
class LinkrModelRequest extends JModel
{
/*
* Allowed file extensions
*/
var $_fileExt = array(
'aiff', 'asf', 'avi', 'bmp', 'css', 'csv', 'doc', 'docx', 'gif',
'gz', 'htm', 'html', 'jar', 'jpg', 'jpeg', 'js', 'm3u', 'mid',
'mov', 'mp3', 'mp4', 'mpg', 'mpeg', 'odg', 'odp', 'ogg', 'ods',
'odt', 'pdf', 'png', 'ppt', 'qt', 'rar', 'rm', 'rtf', 'swf', 'tar',
'tar.bz2', 'tar.gz', 'txt', 'wav', 'wks', 'wps', 'wpt', 'xcf',
'xlr', 'xls', 'xlsx', 'xlt', 'xltx', 'xml', 'zip'
);
/*
* Allowed bookmark extensions
*/
var $_bmExt = array('gif', 'ico', 'jpg', 'jpeg', 'png');
/*
* Returns requested content
*/
function getRequest()
{
// Performance check
$request = JRequest::getWord('request');
if (!is_string($request) || !strlen($request)) {
//return $this->badRequest();
return json_encode($this->badRequest());
}
// Get content
switch ($request)
{
case 'bm':
case 'ra':
case 'dirs':
case 'files':
case 'dblist':
case 'dbobject':
case 'paths':
$results = $this->$request();
break;
default:
$results = $this->badRequest();
}
// Return results
return json_encode($results);
}
/*
* Returns bookmarks data
*/
function bm()
{
$pc = & LinkrHelper::getPluginParameters();
$p = $pc ? $pc : new JObject();
// Settings
$s = JRequest::getVar('s', array(), 'array');
if (!isset($s['size']) || !strlen($s['size'])) {
$s['size'] = $p->get('bm_size', 'text');
}
if (!isset($s['text']) || !strlen($s['text'])) {
$s['text'] = 'nn';
}
if (!isset($s['separator']) || !JString::strlen($s['separator'])) {
$s['separator'] = ' ';
}
if (!isset($s['badges']) || !strlen($s['badges'])) {
$s['badges'] = ($p->get('bm_select', '0')) ? '*' : 'p';
}
$s = LinkrHelper::UTF8Encode($s);
// Bookmarks list
$s['bookmarks'] = $this->getBookmarksList();
if (is_array($s['bookmarks'])) {
foreach ($s['bookmarks'] as $i => $b) {
$this->getIcon( $s['bookmarks'][$i] );
}
}
// Return bookmarks data
return $s;
}
/*
* Returns bookmarks list
*/
function getBookmarksList()
{
// Query database
$b = $this->_getList(
'SELECT id, name, icon, popular '.
'FROM #__linkr_bookmarks '.
'ORDER BY ordering, name'
);
// Return results
if ($this->_db->getErrorNum()) {
return 'Database Error: '. $this->_db->getErrorMsg();
} elseif (empty($b) || empty($b[0])) {
return JText::_('NORESULTS');
} else {
return $b;
}
}
/*
* Formats a bookmark icon
*/
function getIcon( &$b )
{
// Encode name
$name = LinkrHelper::UTF8Encode($b->name);
// No icon
if (empty( $b->icon )) {
$b->icon = $name;
return;
}
// Check icon URL
if (strpos($b->icon, 'http') !== 0)
{
if (strpos($b->icon, '/') === 0) {
$b->icon = substr($b->icon, 1);
}
$b->icon = JURI::root() . $b->icon;
}
// Check icon extension
jimport('joomla.filesystem.file');
$ext = JFile::getExt($b->icon);
if (!in_array($ext, $this->_bmExt)) {
$b->icon = $name;
}
}
/*
* Returns related articles data
*/
function ra()
{
$c = array();
$pc = & LinkrHelper::getPluginParameters();
$p = $pc ? $pc : new JObject();
// Related articles data
$c['keywords'] = JString::trim(JRequest::getString('kw', ''));
$c['limit'] = JRequest::getInt('limit', $p->get('rel_limit', 5));
$c['title'] = JString::trim(JRequest::getString('title', ''));
if (!JString::strlen($c['title'])) {
$c['title'] = $p->get('rel_title', JText::_('RELATED_ARTICLES'));
$c['title'] = LinkrHelper::UTF8Encode($c['title']);
}
// Excluded articles
jimport('joomla.utilities.arrayhelper');
$c['exclude'] = JRequest::getString('exclude', '');
if (strlen($c['exclude']) > 0) {
$c['exclude'] = @explode(',', $c['exclude']);
} else {
$c['exclude'] = array();
}
JArrayHelper::toInteger($c['exclude']);
// Article list
$c['articles'] = $this->getRelatedPreview($c['keywords']);
if (is_array($c['articles'])) {
foreach ($c['articles'] as $i => $a) {
$short = $this->snip($a->title, 30);
$c['articles'][$i]->stitle = LinkrHelper::UTF8Encode($short);
$c['articles'][$i]->title = LinkrHelper::UTF8Encode($a->title);
}
}
// Return related articles data
return $c;
}
/*
* Returns articles related to keywords
*/
function getRelatedPreview($txt)
{
// Check text
$txt = JString::trim($txt);
if (JString::strlen( $txt ) < 3) {
return JText::sprintf('TYPEMIN', 3);
}
// Keywords
$where = array();
$txt = JString::str_ireplace(',', ';', $txt);
$txt = @explode(';', $txt);
foreach ($txt as $t)
{
$t = $this->_db->getEscaped($t, true);
$t = $this->_db->Quote('%'. $t .'%', false);
$w = array(
'LOWER(title) LIKE '. $t,
'LOWER(introtext) LIKE '. $t,
'LOWER('. $this->_nQ('fulltext') .') LIKE '. $t,
'LOWER(metakey) LIKE '. $t,
'LOWER(metadesc) LIKE '. $t
);
$where[] = '('. implode(') OR (', $w) .')';
}
// Publish dates
$dbo = & JFactory::getDBO();
$date = & JFactory::getDate();
$now = $dbo->Quote($date->toMySQL());
$nulld = $dbo->Quote($dbo->getNullDate());
// User access
$user = & JFactory::getUser();
$aid = (int) $user->get('aid', 0);
// Order
switch (LinkrHelper::getPluginParam('rel_sort', 'random'))
{
case 'title':
$order = 'title ASC, alias ASC';
break;
case 'date_asc':
$order = 'publish_up ASC, created ASC, modified ASC';
break;
case 'date_desc':
$order = 'publish_up DESC, created DESC, modified DESC';
break;
case 'modified':
$order = 'modified ASC, publish_up ASC, created ASC';
break;
case 'popular':
$order = 'hits DESC, publish_up ASC, created ASC';
break;
default:
$order = 'rand()';
}
// SQL Query
$q =
' SELECT id, title FROM #__content '.
' WHERE state = 1 AND access <= '. $aid .
' AND ( publish_up = '. $nulld .' OR publish_up <= '. $now .' ) '.
' AND ( publish_down = '. $nulld .' OR publish_down >= '. $now .' ) '.
' AND ('. implode(') OR (', $where) .') '.
' ORDER BY '. $order;
// Query database
$list = $this->_getList($q);
if ($this->_db->getErrorNum()) {
return 'Database Error: '. $this->_db->getErrorMsg();
} elseif (empty($list) || empty($list[0])) {
return JText::_('NORESULTS');
}
// Return article list
return $list;
}
/*
* Returns directories data
*/
function dirs()
{
$folders = array();
$i = $this->getFileInfo();
$dirs = LinkrHelper::listDirectories($i['base'], $i['base.regex']);
// Base path
$folders[] = array(
'value' => $i['base.64'],
'text' => rawurlencode($i['base.folder'])
);
// Other paths
foreach ($dirs as $d)
{
$folders[] = array(
'value' => $d['path.64'],
'text' => rawurlencode($d['folder'])
);
// Add subdirectories
$subs = LinkrHelper::listDirectories($d['path'], '.', true);
if (!empty( $subs )) {
foreach ($subs as $s) {
$folders[] = array(
'value' => $s['path.64'],
'text' => rawurlencode($s['folder'])
);
}
}
}
// Return directories data
return array(
'info' => $i,
'folders' => $folders
);
}
/*
* Returns files data
*/
function files()
{
// Get folder
$folder = JRequest::getVar('f', '', 'REQUEST', 'base64');
$folder = @base64_decode($folder);
if (!$folder || !strlen($folder)) {
return $this->badRequest();
}
// Check folder
$i = $this->getFileInfo($folder);
if ($folder != $i['base'])
{
foreach ($i['path.list'] as $p)
{
if (strpos($folder, $p) === 0) {
$c = true;
break;
}
}
// Invalid folder
if (!$c) {
return $this->badRequest('Invalid directory');
}
}
// Save folder
$this->setState('current', $i['path.64']);
// Get folders
if ($folder != $i['base']) {
$folders = LinkrHelper::listDirectories($folder);
} else {
$folders = LinkrHelper::listDirectories($i['base'], $i['base.regex']);
}
// Get files
$exts = LinkrHelper::getMediaParam('upload_extensions', '');
$exts = strlen($exts) ? $exts : 'bmp,csv,doc,gif,jpg,jpeg,odg,odp,ods,odt,pdf,png,ppt,txt,xcf,xls';
$exts = preg_replace('/[^A-Z0-9,]/i', '', $exts);
$exts = '\.('. str_replace(',', '|', $exts) .')';
$simple = (bool) LinkrHelper::getParam('simple_list', false);
$simple = (bool) $this->getState('simplelist', $simple, 'INT');
$files = LinkrHelper::listFiles($folder, $exts, $simple);
// Return files data
return array(
'files' => $files,
'folders' => $folders,
'current' => $i['path.64'],
'parent' => $i['parent'] ? $i['parent.64'] : false,
'mode' => $simple ? 'simple' : 'normal'
);
}
/*
* Returns filepaths
*/
function paths()
{
// Get folder
$f = JRequest::getVar('f', '', 'REQUEST', 'BASE64');
if (!$f = base64_decode($f)) {
return $this->badRequest('Invalid directory');
}
// Get extensions
$e = trim(JRequest::getCmd('e', ''));
if (!strlen($e)) {
return $this->badRequest('No extensions specified');
} elseif ($e == 'all') {
$e = $this->_fileExt;
} else {
$e = @explode('-', $e);
}
// Check folder
$inSite = false;
$root = LinkrHelper::listDirectories(JPATH_ROOT);
foreach ($root as $check) {
if (stripos($f, $check['name']) === 0) {
$inSite = true;
break;
}
}
if (!$inSite) {
return $this->badRequest('Directory not within Joomla! installation');
}
// Check extensions
$exts = array();
foreach ($e as $x)
{
if (!in_array(strtolower(trim($x)), $this->_fileExt)) {
return $this->badRequest('Disallowed extension "'. $x .'"');
}
$exts[] = '.'. $x;
}
// List files
$regex = '('. implode('|', $exts) .')$';
$path = JPATH_ROOT . DS . str_replace('/', DS, $f);
$files = LinkrHelper::listFiles($path, $regex, true);
// Return files data
return array(
'status' => 'ok',
'result' => $files
);
}
/*
* Returns filesystem information
*/
function getFileInfo($path = null)
{
$i = $this->_fileInfo();
// Set current path
if ($path && is_dir($path) && strpos($path, $i['base']) === 0)
{
$i['path'] = $path;
$i['path.64'] = base64_encode($path);
if ($i['path'] != $i['base']) {
$parent = substr($i['path'], 0, strrpos($i['path'], DS));
$i['parent'] = $parent;
$i['parent.64'] = base64_encode($parent);
} else {
$i['parent'] = false;
$i['parent.64'] = false;
}
}
return $i;
}
function _fileInfo()
{
if (isset($this->_fi)) {
return $this->_fi;
}
// Paths list
$i = array('path.list' => array());
$paths = LinkrHelper::getParam('paths', 'images');
$paths = $this->getState('path', $paths, 'STRING');
$list = @explode(',', $paths);
foreach ($list as $p)
{
$p = trim($p);
if (!strlen($p)) {
continue;
}
$p = str_replace('/', DS, $p);
$p = substr($p, 0, 1) == DS ? $p : DS . $p;
$p = substr($p, -1) == DS ? substr($p, 0, -1) : $p;
if (is_dir(JPATH_ROOT . $p)) {
$i['path.list'][] = JPATH_ROOT . $p;
}
}
if (!count($i['path.list'])) {
$i['path.list'][] = JPATH_ROOT.DS.'images';
}
// Base folder
if (count($i['path.list']) == 1)
{
$i['base'] = $i['path.list'][0];
$i['base.regex'] = '.';
$i['base.folder'] = str_replace(JPATH_ROOT.DS, '', $i['base']);
$i['base.folder'] = str_replace(DS, '/', $i['base.folder']);
}
else
{
$i['base'] = strlen(JPATH_ROOT) ? JPATH_ROOT : DS;
$i['base.regex'] = LinkrHelper::buildRegex($paths);
$i['base.folder'] = '/';
}
// Current path
$i['path'] = $this->getState('current', null);
$i['path'] = $i['path'] ? base64_decode($i['path']) : $i['base'];
if (strpos($i['path'], $i['base']) !== 0) {
$i['path'] = $i['base'];
}
$i['path.64'] = base64_encode($i['path']);
// Collect information
$i['base.64'] = base64_encode($i['base']);
if ($i['path'] != $i['base']) {
$parent = substr($i['path'], 0, strrpos($i['path'], DS));
$i['parent'] = $parent;
$i['parent.64'] = base64_encode($parent);
} else {
$i['parent'] = false;
$i['parent.64'] = false;
}
// Return information
$this->_fi = $i;
return $this->_fi;
}
/*
* Queries the database
*/
function dblist()
{
// Get query
$q = $this->getQuery('q');
if (is_array($q)) {
return $q;
}
// Query database
$s = JRequest::getInt('s', 0);
$l = JRequest::getInt('l', 0);
$r = $this->_getAssocList($q, $s, $l);
if ($this->_db->getErrorNum()) {
return $this->badRequest($this->_db->getErrorMsg());
} elseif (is_string($r)) {
return $this->badRequest($r);
}
// UTF8 encode values
$r = LinkrHelper::UTF8Encode($r);
// Return results
return array(
'status' => 'ok',
'result' => $r
);
}
/*
* Queries the database
*/
function dbobject()
{
// Get query
$q = $this->getQuery('q');
if (is_array($q)) {
return $q;
}
// Query database
$r = $this->_getObj($q);
if ($this->_db->getErrorNum()) {
return $this->badRequest($this->_db->getErrorMsg());
} elseif (is_string($r)) {
return $this->badRequest($r);
}
// UTF8 encode values
$r = LinkrHelper::UTF8Encode($r);
// Return results
return array(
'status' => 'ok',
'result' => $r
);
}
/*
* Returns SQL query
*/
function getQuery($name = 'q')
{
$q = JRequest::getVar($name, array(), 'REQUEST', 'ARRAY');
$q = (string) preg_replace('/[^A-Z0-9\/+=]/i', '', implode('', $q));
// Decode
if (!$q = base64_decode($q)) {
return $this->badRequest('Malformed SQL query');
}
// Replace Linkr markers
$q = JString::str_ireplace('_Q_', '\'', $q);
$q = JString::str_ireplace('_NQ_', $this->_db->_nameQuote, $q);
// Return query
return $q;
}
/*
* Database functions
*/
function _Q($w, $l = false, $x = false) {
$w = $this->_db->getEscaped($w, $x);
$w = $l ? '%'. $w .'%' : $w;
return $this->_db->Quote($w, false);
}
function _nQ($n) {
return $this->_db->nameQuote($n);
}
function _getAssocList($q, $s = 0, $l = 0) {
$this->_db->setQuery($q, $s, $l);
return $this->_db->loadAssocList();
}
function _getObj($q, $type = 'object') {
$this->_db->setQuery($q);
return $type == 'array' ? $this->_db->loadResultArray() : $this->_db->loadObject();
}
/*
* Method to shorten text
*/
function snip($string, $length = 30)
{
$string = JString::trim( $string );
$orglen = JString::strlen( $string );
$words = @explode(' ', $string);
$strlen = 0;
$final = array();
for ($i = 0, $n = count( $words ); $i < $n; $i++) {
if ($strlen < $length) {
$final[] = $words[$i];
$strlen += JString::strlen( $words[$i] ) + 1;
} else {
break;
}
}
$final = implode(' ', $final);
$final .= ($orglen == $strlen - 1) ? '' : '...';
return $final;
}
/*
* Invalid requests
*/
function badRequest($msg = '') {
$msg = JString::strlen($msg) ? $msg : JText::_('bad request');
return array(
'status'=> 'error',
'msg' => $msg
);
}
/*
* Variable handling
*/
function getState($request, $def = null, $type = 'none') {
global $mainframe;
return $mainframe->getUserStateFromRequest('linkr.'. $request, $request, $def, $type);
}
function setState($var, $value) {
global $mainframe;
return $mainframe->setUserState('linkr.'. $var, $value);
}
}