feat(baseline): add remaining legit files (postupdate, isis js, windwalker cli, sbtrack)

Completeness: administrator/postupdate.php + isis/js/_template.js (clean core
files absent from the downloaded package), bin/windwalker (Windwalker CLI),
sbtrack.php (Cadline tracking docroot PHP). All vetted malware-free.

Signed-off-by: LÁZÁR Imre <imre@illusion.hu>
Assisted-by: claude-code@claude-opus-4-8
This commit is contained in:
LÁZÁR Imre AI Agent 2026-07-16 11:40:36 +02:00
parent 2dd018c729
commit 4168b737cc
3 changed files with 325 additions and 0 deletions

View File

@ -0,0 +1,4 @@
#!/usr/bin/env php
<?php
include_once dirname(__DIR__) . '/libraries/windwalker/bin/windwalker.php';

View File

@ -0,0 +1,97 @@
<?php
/**
* @package Joomla.Administrator
*
* @copyright Copyright (C) 2016 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
/**
* Define the application's minimum supported PHP version as a constant so it can be referenced within the application.
*/
define('JOOMLA_MINIMUM_PHP', '5.3.10');
if (version_compare(PHP_VERSION, JOOMLA_MINIMUM_PHP, '<'))
{
die('Your host needs to use PHP ' . JOOMLA_MINIMUM_PHP . ' or higher to run this version of Joomla!');
}
/**
* Constant that is checked in included files to prevent direct access.
* define() is used in the installation folder rather than "const" to not error for PHP 5.2 and lower
*/
define('_JEXEC', 1);
// Load the administrator application's path constants
if (file_exists(__DIR__ . '/defines.php'))
{
include_once __DIR__ . '/defines.php';
}
if (!defined('_JDEFINES'))
{
define('JPATH_BASE', __DIR__);
require_once JPATH_BASE . '/includes/defines.php';
}
require_once JPATH_BASE . '/includes/framework.php';
require_once JPATH_BASE . '/includes/helper.php';
require_once JPATH_BASE . '/includes/toolbar.php';
// Boot JApplicationAdministrator so the application references in the factory resolve correctly.
JFactory::getApplication('administrator');
// Set the component path (un)constants
define('JPATH_COMPONENT', JPATH_ADMINISTRATOR . '/components/com_joomlaupdate');
define('JPATH_COMPONENT_ADMINISTRATOR', JPATH_ADMINISTRATOR . '/components/com_joomlaupdate');
define('JPATH_COMPONENT_SITE', JPATH_SITE . '/components/com_joomlaupdate');
// Load the update component's model to run the cleanup methods
JModelLegacy::addIncludePath(JPATH_COMPONENT_ADMINISTRATOR . '/models', 'JoomlaupdateModel');
/** @var JoomlaupdateModelDefault $model */
$model = JModelLegacy::getInstance('default', 'JoomlaupdateModel');
// Make sure we got the model
if (!($model instanceof JoomlaupdateModelDefault))
{
echo 'Could not load update component model, please check the logs for additional details.' . PHP_EOL;
exit(1);
}
// Load up the logger
JLog::addLogger(
array(
'format' => '{DATE}\t{TIME}\t{LEVEL}\t{CODE}\t{MESSAGE}',
'text_file' => 'joomla_update.php',
),
JLog::INFO,
array('Update', 'databasequery', 'jerror')
);
JLog::add('Starting manual update using postupdate', JLog::INFO, 'Update');
// Load the Joomla library and update component language files
JFactory::getLanguage()->load('lib_joomla');
JFactory::getLanguage()->load('com_joomlaupdate');
JLog::add(JText::_('COM_JOOMLAUPDATE_UPDATE_LOG_FINALISE'), JLog::INFO, 'Update');
// Finalize the update
if ($model->finaliseUpgrade() === false)
{
echo 'Failed to finalize the upgrade, please check the logs for additional details.' . PHP_EOL;
exit(1);
}
JLog::add(JText::_('COM_JOOMLAUPDATE_UPDATE_LOG_CLEANUP'), JLog::INFO, 'Update');
// Cleanup after the update
$model->cleanUp();
JLog::add(JText::sprintf('COM_JOOMLAUPDATE_UPDATE_LOG_COMPLETE', JVERSION), JLog::INFO, 'Update');
JLog::add('Finished manual update using postupdate', JLog::INFO, 'Update');
echo 'Update to ' . JVERSION . ' completed successfully.' . PHP_EOL;

View File

@ -0,0 +1,224 @@
/**
* @package Joomla.Administrator
* @subpackage Templates.isis
* @copyright Copyright (C) 2005 - 2016 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
* @since 3.0
*/
(function($)
{
$(document).ready(function()
{
$('*[rel=tooltip]').tooltip();
// Turn radios into btn-group
$('.radio.btn-group label').addClass('btn');
$('.btn-group label:not(.active)').click(function()
{
var label = $(this);
var input = $('#' + label.attr('for'));
if (!input.prop('checked')) {
label.closest('.btn-group').find('label').removeClass('active btn-success btn-danger btn-primary');
if (input.val() == '') {
label.addClass('active btn-primary');
} else if (input.val() == 0) {
label.addClass('active btn-danger');
} else {
label.addClass('active btn-success');
}
input.prop('checked', true);
input.trigger('change');
}
});
$('.btn-group input[checked=checked]').each(function()
{
if ($(this).val() == '') {
$('label[for=' + $(this).attr('id') + ']').addClass('active btn-primary');
} else if ($(this).val() == 0) {
$('label[for=' + $(this).attr('id') + ']').addClass('active btn-danger');
} else {
$('label[for=' + $(this).attr('id') + ']').addClass('active btn-success');
}
});
// add color classes to chosen field based on value
$('select[class^="chzn-color"], select[class*=" chzn-color"]').on('liszt:ready', function(){
var select = $(this);
var cls = this.className.replace(/^.(chzn-color[a-z0-9-_]*)$.*/, '\1');
var container = select.next('.chzn-container').find('.chzn-single');
container.addClass(cls).attr('rel', 'value_' + select.val());
select.on('change click', function()
{
container.attr('rel', 'value_' + select.val());
});
});
/**
* USED IN: All views with toolbar and sticky bar enabled
*/
var navTop;
var isFixed = false;
if (window.isisStickyToolbar == 1) {
processScrollInit();
processScroll();
$(window).on('resize', processScrollInit);
$(window).on('scroll', processScroll);
}
function processScrollInit() {
if ($('.subhead').length) {
navTop = $('.subhead').length && $('.subhead').offset().top - window.isisOffsetTop;
// Fix the container top
$(".container-main").css("top", $('.subhead').height() + $('nav.navbar').height());
// Only apply the scrollspy when the toolbar is not collapsed
if (document.body.clientWidth > 480) {
$('.subhead-collapse').height($('.subhead').height());
$('.subhead').scrollspy({offset: {top: $('.subhead').offset().top - $('nav.navbar').height()}});
}
}
}
function processScroll() {
if ($('.subhead').length) {
var scrollTop = $(window).scrollTop();
if (scrollTop >= navTop && !isFixed) {
isFixed = true;
$('.subhead').addClass('subhead-fixed');
// Fix the container top
$(".container-main").css("top", $('.subhead').height() + $('nav.navbar').height());
} else if (scrollTop <= navTop && isFixed) {
isFixed = false;
$('.subhead').removeClass('subhead-fixed');
}
}
}
/**
* USED IN: All list views to hide/show the sidebar
*/
window.toggleSidebar = function(force)
{
var context = 'jsidebar';
var $sidebar = $('#j-sidebar-container'),
$main = $('#j-main-container'),
$message = $('#system-message-container'),
$debug = $('#system-debug'),
$toggleSidebarIcon = $('#j-toggle-sidebar-icon'),
$toggleButtonWrapper = $('#j-toggle-button-wrapper'),
$toggleButton = $('#j-toggle-sidebar-button'),
$sidebarToggle = $('#j-toggle-sidebar');
var openIcon = 'icon-arrow-left-2',
closedIcon = 'icon-arrow-right-2';
var $visible = $sidebarToggle.is(":visible");
if (jQuery(document.querySelector("html")).attr('dir') == 'rtl')
{
openIcon = 'icon-arrow-right-2';
closedIcon = 'icon-arrow-left-2';
}
var isComponent = $('body').hasClass('component');
$sidebar.removeClass('span2').addClass('j-sidebar-container');
$message.addClass('j-toggle-main');
$main.addClass('j-toggle-main');
if (!isComponent) {
$debug.addClass('j-toggle-main');
}
var mainHeight = $main.outerHeight()+30,
sidebarHeight = $sidebar.outerHeight(),
bodyWidth = $('body').outerWidth(),
sidebarWidth = $sidebar.outerWidth(),
contentWidth = $('#content').outerWidth(),
contentWidthRelative = contentWidth / bodyWidth * 100,
mainWidthRelative = (contentWidth - sidebarWidth) / bodyWidth * 100;
if (force)
{
// Load the value from localStorage
if (typeof(Storage) !== "undefined")
{
$visible = localStorage.getItem(context);
}
// Need to convert the value to a boolean
$visible = ($visible == 'true');
}
else
{
$message.addClass('j-toggle-transition');
$sidebar.addClass('j-toggle-transition');
$toggleButtonWrapper.addClass('j-toggle-transition');
$main.addClass('j-toggle-transition');
if (!isComponent) {
$debug.addClass('j-toggle-transition');
}
}
if ($visible)
{
$sidebarToggle.hide();
$sidebar.removeClass('j-sidebar-visible').addClass('j-sidebar-hidden');
$toggleButtonWrapper.removeClass('j-toggle-visible').addClass('j-toggle-hidden');
$toggleSidebarIcon.removeClass('j-toggle-visible').addClass('j-toggle-hidden');
$message.removeClass('span10').addClass('span12');
$main.removeClass('span10').addClass('span12 expanded');
$toggleSidebarIcon.removeClass(openIcon).addClass(closedIcon);
$toggleButton.attr( 'data-original-title', Joomla.JText._('JTOGGLE_SHOW_SIDEBAR') );
$sidebar.attr('aria-hidden', true);
$sidebar.find('a').attr('tabindex', '-1');
$sidebar.find(':input').attr('tabindex', '-1');
if (!isComponent) {
$debug.css( 'width', contentWidthRelative + '%' );
}
if (typeof(Storage) !== "undefined")
{
// Set the last selection in localStorage
localStorage.setItem(context, true);
}
}
else
{
$sidebarToggle.show();
$sidebar.removeClass('j-sidebar-hidden').addClass('j-sidebar-visible');
$toggleButtonWrapper.removeClass('j-toggle-hidden').addClass('j-toggle-visible');
$toggleSidebarIcon.removeClass('j-toggle-hidden').addClass('j-toggle-visible');
$message.removeClass('span12').addClass('span10');
$main.removeClass('span12 expanded').addClass('span10');
$toggleSidebarIcon.removeClass(closedIcon).addClass(openIcon);
$toggleButton.attr( 'data-original-title', Joomla.JText._('JTOGGLE_HIDE_SIDEBAR') );
$sidebar.removeAttr('aria-hidden');
$sidebar.find('a').removeAttr('tabindex');
$sidebar.find(':input').removeAttr('tabindex');
if (!isComponent && bodyWidth > 768 && mainHeight < sidebarHeight)
{
$debug.css( 'width', mainWidthRelative + '%' );
}
else if (!isComponent)
{
$debug.css( 'width', contentWidthRelative + '%' );
}
if (typeof(Storage) !== "undefined")
{
// Set the last selection in localStorage
localStorage.setItem( context, false );
}
}
}
});
})(jQuery);