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:
parent
2dd018c729
commit
4168b737cc
4
deployed/windwalker/bin/windwalker
Normal file
4
deployed/windwalker/bin/windwalker
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
#!/usr/bin/env php
|
||||||
|
<?php
|
||||||
|
|
||||||
|
include_once dirname(__DIR__) . '/libraries/windwalker/bin/windwalker.php';
|
||||||
97
overrides/administrator/postupdate.php
Normal file
97
overrides/administrator/postupdate.php
Normal 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;
|
||||||
224
overrides/administrator/templates/isis/js/_template.js
Normal file
224
overrides/administrator/templates/isis/js/_template.js
Normal 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);
|
||||||
Loading…
Reference in New Issue
Block a user