Build the archlinexp.eu/www baseline from clean sources on a dedicated
site branch, per the web-baseline deploy model: vanilla Joomla 3.9.2 core
plus the developer-sourced own-code plus a vetted module layer, with the
Cadline core delta applied on the 3.9.2 base. The generator is reused
unchanged: build-baseline.sh is site-agnostic, only the content differs.
Layers:
- core/ vanilla Joomla 3.9.2 official package (installer removed)
- cadline/ own-code from the developer source (beiratkozas, maintenance,
mod_al_*, mod_alusers, mod_course_list) plus 11 assets that
the developer source lacks
- deployed/ third-party module slugs taken from live, vetted
- overrides/ the 5 genuine Cadline core modifications, on the 3.9.2 base
The live core carried 31 stale com_users files: the updater skipped the
customized ones, so the version string said 3.9.2 while the code did not.
Taking vanilla 3.9.2 plus the 2 real deltas fixes that silently.
Vetting caught two items that content-based YARA did not flag. Both come
from a structural rule: an extra file on a core-component path that is
not a template override is not a module -- it is a leftover or a plant.
Both are excluded through malware-iocs.paths:
- components/com_mailto/mail.php: an unauthenticated file-write webshell
(POST save_file + file_content -> fopen/fwrite, no auth check at all),
present on live since 2021-07-26
- administrator/components/com_joomlaupdate/restoration.php: an Akeeba
Kickstart leftover carrying a security password (known RCE vector)
Verification: build-baseline.sh -> out/ = 12284 files; YARA (16 rules) on
every source layer and on the built tree = 0 hits; none of the 291 IOC
paths present; no disguised .json dropper; core verified as 3.9.2; the
only extra file left on a core path is the legit Google reCAPTCHA library.
Assisted-by: claude-code@claude-opus-4-8
288 lines
12 KiB
PHP
288 lines
12 KiB
PHP
<?php
|
|
/**
|
|
* @package Joomla.Site
|
|
* @subpackage Templates.protostar
|
|
*
|
|
* @copyright Copyright (C) 2005 - 2015 Open Source Matters, Inc. All rights reserved.
|
|
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
|
*/
|
|
|
|
defined('_JEXEC') or die;
|
|
|
|
$app = JFactory::getApplication();
|
|
$doc = JFactory::getDocument();
|
|
$user = JFactory::getUser();
|
|
$this->language = $doc->language;
|
|
$this->direction = $doc->direction;
|
|
|
|
// Getting params from template
|
|
$params = $app->getMenu()->getActive();
|
|
$params = $params ? $params->params : new JRegistry();
|
|
|
|
// Detecting Active Variables
|
|
$option = $app->input->getCmd('option', '');
|
|
$view = $app->input->getCmd('view', '');
|
|
$layout = $app->input->getCmd('layout', '');
|
|
$task = $app->input->getCmd('task', '');
|
|
$itemid = $app->input->getCmd('Itemid', '');
|
|
$skin = $this->params->get( 'templateSkin', 'light' );
|
|
$baseUrlSkin = $this->baseurl . '/templates/' . $this->template . '/skins/' . $skin . '/';
|
|
|
|
// Add favicon
|
|
if($favicon = $this->params->get('favFile')) {
|
|
$doc->addFavicon( JURI::root() . $favicon);
|
|
}
|
|
|
|
// Add JavaScript Frameworks
|
|
JHtml::_('bootstrap.framework');
|
|
|
|
foreach( $doc->_scripts as $src => $attrs )
|
|
{
|
|
if( preg_match( '/k2\.js/', $src, $matches ) )
|
|
{
|
|
unset( $doc->_scripts[ $src ] );
|
|
$doc->_scripts[ preg_replace( '/\?.+/', '', $src ) ] = $attrs;
|
|
}
|
|
if( preg_match( '/bootstrap\.min\.js/', $src, $matches ) )
|
|
{
|
|
unset( $doc->_scripts[ $src ] );
|
|
}
|
|
}
|
|
|
|
|
|
/* JQUERY:: LIGHTBOX.JS */
|
|
|
|
if( $params->get('pageclass_sfx', '' ) == 't-masonary' )
|
|
{
|
|
/* JQUERY:: PLUGIN.JS */
|
|
$doc->addScript($baseUrlSkin . 'js/masonry.min.js');
|
|
}
|
|
|
|
$doc->addScript($baseUrlSkin . 'js/lightbox-plus-jquery.min.js');
|
|
|
|
if( $params->get('pageclass_sfx', '' ) == 't-inner_page' )
|
|
{
|
|
/* JQUERY:: PLUGIN.JS */
|
|
$doc->addScript($baseUrlSkin . 'js/jquery.plugins.inner.min.js');
|
|
$doc->addScript($baseUrlSkin . 'js/custom.min.js');
|
|
}
|
|
else
|
|
{
|
|
/* JQUERY:: PLUGIN.JS */
|
|
$doc->addScript($baseUrlSkin . 'js/jquery.plugin.min.js');
|
|
/* JQUERY:: INDEX.JS **** FOR INDEX JQUERY CODE **** */
|
|
$doc->addScript($baseUrlSkin . 'js/index.min.js');
|
|
}
|
|
|
|
|
|
// Add Stylesheets
|
|
$doc->addStyleSheet($baseUrlSkin . 'css/bootstrap.min.css');
|
|
|
|
/* CSS:: ANIMATION */
|
|
$doc->addStyleSheet($baseUrlSkin . 'css/animator.css');
|
|
|
|
/* CSS:: ANIMATION */
|
|
$doc->addStyleSheet($baseUrlSkin . 'css/jquery.slider.css');
|
|
|
|
/* CSS:: FONTS */
|
|
$doc->addStyleSheet($baseUrlSkin . 'css/font-awesome.min.css');
|
|
$doc->addStyleSheet($baseUrlSkin . 'css/simple-line-icons.css');
|
|
$doc->addStyleSheet('//fonts.googleapis.com/css?family=Montserrat:400,700');
|
|
$doc->addStyleSheet('//fonts.googleapis.com/css?family=Droid+Serif:400,400italic,700');
|
|
|
|
/* CSS:: */
|
|
if( $this->countModules( 'gx' ) )
|
|
{
|
|
$doc->addStyleSheet($baseUrlSkin . 'css/sidemenu.css');
|
|
$doc->addScript($baseUrlSkin . 'js/plugin/sidemenu.js');
|
|
$doc->addScriptDeclaration("
|
|
jQuery(function($) {
|
|
$('#gx-sidemenu').gxSideMenu({
|
|
mode: isMobile.any() ? 'tiny' : 'normal', // normal | tiny
|
|
interval: 300, // animations' interval
|
|
direction: 'left', // left | right
|
|
openOnHover: false, // true | false
|
|
clickTrigger: true, // true | false
|
|
followURLs: true, // true | false
|
|
trigger: '.gx-menu-open.list', // class or id of trigger element
|
|
startFrom: 60, // start pixel from corner on hover trigger
|
|
startClosed: false, // menu opens on document load
|
|
scrolling: true, // menu scrollable (iScroll plugin needed!)
|
|
urlBase: '/', // document base URL
|
|
backText: '<<', // Back button text
|
|
onOpen: function() { }, // Open callback
|
|
onClose: function() { } // Close callback
|
|
});
|
|
});
|
|
|
|
");
|
|
}
|
|
$doc->addStyleSheet($baseUrlSkin . 'css/lightbox.css');
|
|
$doc->addStyleSheet($baseUrlSkin . 'css/reset.css');
|
|
$main_skin = 'main.css';
|
|
if( $skin == 'light' )
|
|
{
|
|
$main_skin = $this->params->get( 'templateColor', 'main.css');
|
|
}
|
|
$doc->addStyleSheet($baseUrlSkin . "css/{$main_skin}" );
|
|
|
|
|
|
?>
|
|
<!DOCTYPE html>
|
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $this->language; ?>" lang="<?php echo $this->language; ?>" dir="<?php echo $this->direction; ?>">
|
|
<head>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
|
|
<jdoc:include type="head" />
|
|
<?php if($afterHeader = $this->params->get('afterHeader')) : ?>
|
|
<?php echo $afterHeader; ?>
|
|
<?php endif; ?>
|
|
</head>
|
|
|
|
<body class="<?php echo $skin; ?> t-overlay <?php echo $option
|
|
. ' view-' . $view
|
|
. ($layout ? ' layout-' . $layout : ' no-layout')
|
|
. ($task ? ' task-' . $task : ' no-task')
|
|
. ($itemid ? ' itemid-' . $itemid : '')
|
|
. ' ' . $params->get('pageclass_sfx', '' );
|
|
echo ($this->direction == 'rtl' ? ' rtl' : '');
|
|
?>">
|
|
<?php if( $skin != 'dark' ) : ?>
|
|
<div class="t-overlay_box">
|
|
<img src="<?php echo $this->baseurl . '/templates/' . $this->template; ?>/images/loading.gif" class="t-loading_img" alt="">
|
|
</div>
|
|
<?php endif; ?>
|
|
|
|
<!-- ******** HEADER START ******** -->
|
|
<header id="t-header" class="t-header wow fadeInDown clearfix" data-wow-duration="2s" >
|
|
<div class="col-lg-12 t-header_inner">
|
|
<div class="row">
|
|
<?php if( $this->countModules( 'gx' ) ) : ?>
|
|
<div class="col-lg-2 col-md-2 col-sm-2 col-xs-12 t-header_nav">
|
|
<a href="javascript:" class="gx-menu-open entypo list fa fa-navicon"></a>
|
|
</div>
|
|
<div class="col-lg-8 col-md-8 col-sm-8 col-xs-12 t-header_logo">
|
|
<a href="<?php echo JUri::root(); ?>" class="t_logo">
|
|
<?php echo $this->params->get( 'logoFile', $this->params->get( 'logoText', 'Trada' ) ); ?>
|
|
</a>
|
|
</div>
|
|
<?php else : ?>
|
|
|
|
<div class="col-lg-2 col-md-2 col-sm-2 col-xs-12 t-header_logo">
|
|
<a href="<?php echo JUri::root(); ?>" class="t_logo">
|
|
<?php echo $this->params->get( 'logoFile', $this->params->get( 'logoText', 'Trada' ) ); ?>
|
|
</a>
|
|
</div>
|
|
<div class="col-lg-8 col-md-8 col-sm-8 col-xs-12 t-header_nav">
|
|
<?php if ($this->countModules('position-0')) : ?>
|
|
<jdoc:include type="modules" name="position-0" style="none" />
|
|
<?php endif; ?>
|
|
</div>
|
|
|
|
<?php endif; ?>
|
|
<div class="col-lg-2 col-md-2 col-sm-2 col-xs-12 t-header_social">
|
|
<?php if ($this->countModules('position-1')) : ?>
|
|
<jdoc:include type="modules" name="position-1" style="none" />
|
|
<?php endif; ?>
|
|
</div>
|
|
<div class="t-header_mobile_nav" id="t-header_mobile_nav">
|
|
<i class="fa fa-navicon"></i>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<?php if( $this->countModules( 'gx' ) ) : ?>
|
|
<jdoc:include type="modules" name="gx" style="none" />
|
|
<?php endif; ?>
|
|
</header>
|
|
<!-- ******** HEADER END ******** -->
|
|
|
|
<?php if ($this->countModules('position-2')) : ?>
|
|
<jdoc:include type="modules" name="position-2" style="none" />
|
|
<?php endif; ?>
|
|
|
|
<?php if ($this->countModules('position-5')) : ?>
|
|
<section id="t-blog_container" class="t-blog_container">
|
|
<div class="container">
|
|
<div class="row">
|
|
<div class="col-lg-9 col-md-8 col-sm-8 col-xs-12">
|
|
<div class="row">
|
|
<jdoc:include type="message" />
|
|
<jdoc:include type="component" />
|
|
</div>
|
|
</div>
|
|
<div class="col-lg-3 col-md-4 col-sm-4 col-xs-12 pull-right t-side_bar">
|
|
<div class="row"><jdoc:include type="modules" name="position-5" style="none" /></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
<?php else : ?>
|
|
<jdoc:include type="message" />
|
|
<jdoc:include type="component" />
|
|
<?php endif; ?>
|
|
|
|
<?php if ($this->countModules('position-6')) : ?>
|
|
<jdoc:include type="modules" name="position-6" style="none" />
|
|
<?php endif; ?>
|
|
|
|
<!-- ******** FOOTER START ******** -->
|
|
<footer class="t-footer">
|
|
<div class="t-footer_inner">
|
|
<div class="container">
|
|
<div class="row clearfix">
|
|
<div class="col-lg-3 col-md-3 col-sm-3 col-xs-6">
|
|
<div class="row">
|
|
<?php if ($this->countModules('position-12')) : ?>
|
|
<jdoc:include type="modules" name="position-12" style="none" />
|
|
<?php endif; ?>
|
|
</div>
|
|
</div>
|
|
<div class="col-lg-6 col-md-6 col-sm-6 col-xs-12 t-footer_logo_text">
|
|
<a href="#" class="t_logo"><?php echo $this->params->get( 'logoFile', $this->params->get( 'logoText', 'Trada' ) ); ?></a>
|
|
<p>
|
|
<?php echo JFactory::getConfig()->get( 'MetaDesc', '' ); ?>
|
|
</p>
|
|
<div class="t-section_header">
|
|
<div class="t-section_header_arrow">
|
|
<span class="t-section_header_border">
|
|
<i class="t-section_header_arrow_dot"></i>
|
|
</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-lg-3 col-md-3 col-sm-3 col-xs-6 t-footer_location">
|
|
<div class="row">
|
|
<?php if ($this->countModules('position-13')) : ?>
|
|
<jdoc:include type="modules" name="position-13" style="none" />
|
|
<?php endif; ?>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="row">
|
|
<?php if ($this->countModules('position-14')) : ?>
|
|
<jdoc:include type="modules" name="position-14" style="none" />
|
|
<?php endif; ?>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="t-footer_copyright">
|
|
<p><?php echo $this->params->get( 'copyright', 'Copyright ©2015. All Rights Reserved.' ); ?></p>
|
|
</div>
|
|
</footer>
|
|
<!-- ******** FOOTER END ******** -->
|
|
|
|
<!-- ******** BACK TO TOP START ******** -->
|
|
<div class="t-back_to_top" id="t-back_to_top">
|
|
<i class="fa fa-angle-double-up"></i>
|
|
<span>BA <br> CK</span>
|
|
<i class="fa fa-angle-double-up"></i>
|
|
</div>
|
|
<!-- ******** BACK TO TOP END ******** -->
|
|
|
|
<?php if($afterBody = $this->params->get('afterBody')) : ?>
|
|
<?php echo $afterBody; ?>
|
|
<?php endif; ?>
|
|
<jdoc:include type="modules" name="debug" />
|
|
</body>
|
|
</html>
|