Mini Shell
<?php
/**
* CubeCart v6
* ========================================
* CubeCart is a registered trade mark of CubeCart Limited
* Copyright CubeCart Limited 2023. All rights reserved.
* UK Private Limited Company No. 5323904
* ========================================
* Web: https://www.cubecart.com
* Email: hello@cubecart.com
* License: GPL-3.0 https://www.gnu.org/licenses/quick-guide-gplv3.html
*/
require_once preg_replace('/setup/', '', realpath(dirname(__FILE__))) . 'ini.inc.php';
require_once CC_INCLUDES_DIR . 'functions.inc.php';
$error_log_path = ini_get('error_log');
if(!strstr($error_log_path, '/')) {
ini_set('error_log', '../'.$error_log_path);
}
@set_time_limit('900');
define('CC_IN_SETUP', true);
define('CC_IN_ADMIN', false);
/*! Check cache folder is writable! */
@chmod(CC_CACHE_DIR, chmod_writable());
if (!is_writable(CC_CACHE_DIR)) {
$cache_dir = str_replace(CC_ROOT_DIR, '', CC_CACHE_DIR);
die('<p>Please make sure the following folders are writable in order to continue.</p><pre>' . $cache_dir . '</pre>');
}
$gitignore = CC_ROOT_DIR.'/images/source/.gitignore';
if (file_exists($gitignore)) {
@unlink($gitignore);
if (file_exists($gitignore)) {
die('Please delete the images/source/.gitignore file before proceeding.');
}
}
$global_file = CC_INCLUDES_DIR . 'global.inc.php';
$setup_path = CC_ROOT_DIR . '/setup' . '/';
session_start();
if (isset($_GET['autoupdate']) && $_GET['autoupdate']) {
$_SESSION['setup'] = array(); // remove any past upgrade/install data
$_SESSION['setup']['method'] = 'upgrade';
$_SESSION['setup']['autoupgrade'] = true;
httpredir('index.php');
}
// Empty the cache before we start
$GLOBALS['cache'] = Cache::getInstance();
if (!isset($_SESSION['setup']) || (isset($_SESSION['setup']) && empty($_SESSION['setup']))) {
$GLOBALS['cache']->clear();
// Remove cached skins
$skin_cached = glob(CC_CACHE_DIR . 'skin/*.*');
if ($skin_cached) {
foreach ($skin_cached as $cache_file) {
unlink($cache_file);
}
unset($skin_cached);
}
// Remove all other cache
$cached = glob(CC_CACHE_DIR . '*.*');
if ($cached) {
foreach ($cached as $cache_file) {
unlink($cache_file);
}
unset($cached);
}
}
$GLOBALS['debug'] = Debug::getInstance();
$proceed = true;
$retry = false;
$installed = false;
$restart = true;
$domain = parse_url(CC_STORE_URL);
$cookie_domain = strpos($domain['host'], '.') ? '.'.str_replace('www.', '', $domain['host']) : '';
$default_config_settings = array(
'csrf' => '1',
'update_main_stock' => '',
'tax_number' => '',
'recaptcha_public_key' => '',
'recaptcha_secret_key' => '',
'no_skip_processing_check' => '',
'hide_out_of_stock' => '',
'force_completed' => '',
'dispatch_date_format' => 'M d Y',
'disable_shipping_groups' => '',
'disable_mobile_skin' => '1',
'disable_checkout_terms' => '',
'allow_no_shipping' => '',
'cookie_dialogue' => '',
'debug_ip_addresses' => '',
'twitter' => 'https://twitter.com',
'facebook' => 'https://facebook.com',
'linkedin' => 'https://linkedin.com',
'vimeo' => 'https://vimeo.com',
'default_language' => '',
'default_currency' => '',
'email_address' => '',
'store_title' => '',
'store_name' => '',
'email_name' => '',
'admin_notify_status' => '2',
'catalogue_mode' => '0',
'debug' => '0',
'admin_skin' => 'default',
'skin_folder' => 'foundation',
'skin_style' => 'default',
'skin_change' => '0',
'default_rss_feed' => 'https://forums.cubecart.com/forum/1-news-announcements.xml',
'email_method' => 'mail',
'seo_metadata' => '2',
'store_meta_description' => '',
'recaptcha' => '0',
'time_format' => 'j M Y, H:i',
'time_offset' => '0',
'time_zone' => '',
'download_expire' => '36000',
'download_count' => '10',
'email_smtp' => '0',
'email_smtp_host' => '',
'email_smtp_password' => '',
'email_smtp_port' => '',
'email_smtp_user' => '',
'enable_ssl' => '0',
'cache' => '1',
'basket_allow_non_invoice_address' => '1',
'basket_jump_to' => '0',
'basket_order_expire' => '',
'basket_out_of_stock_purchase' => '0',
'basket_tax_by_delivery' => '0',
'store_country' => '826',
'store_zone' => '12',
'catalogue_expand_tree' => '1',
'catalogue_hide_prices' => '0',
'catalogue_latest_products_count' => '9',
'catalogue_latest_products' => '1',
'catalogue_popular_products_count' => '10',
'catalogue_popular_products_source' => '0',
'catalogue_products_per_page' => '10',
'catalogue_sale_items' => '10',
'catalogue_sale_mode' => '1',
'catalogue_sale_percentage' => '',
'catalogue_show_empty' => '1',
'product_weight_unit' => 'Kg',
'product_size_unit' => 'cm',
'proxy' => '0',
'proxy_host' => '',
'proxy_port' => '',
'product_precis' => '120',
'stock_warn_type' => '0',
'stock_warn_level' => '5',
'enable_reviews' => '1',
'store_address' => '',
'store_copyright' => '<p>©'.date('Y').' '.$domain['host'].' - All rights reserved.</p>',
'store_postcode' => '',
'standard_url' => preg_replace(array('#^https#i','#/setup$#'), array('http',''), CC_STORE_URL),
'cookie_domain' => $cookie_domain,
'show_basket_weight' => '1',
'stock_change_time' => '1',
'stock_level' => '0',
'offline' => '0',
'offline_content' => '<html><head><title>Store Offline</title></head><body><p>We are offline right now. Please visit again soon.</p></body></html>',
'product_sort_column' => 'name',
'product_sort_direction' => 'ASC',
'bftime' => '600',
'bfattempts' => '5',
'fuzzy_time_format' => 'H:i',
'feed_access_key' => randomString(12),
'seo_add_cats' => '2',
'seo_cat_add_cats' => '1',
'r_admin_activity' => '30',
'r_admin_error' => '30',
'r_email' => '30',
'r_request' => '14',
'r_staff' => '30',
'r_system_error' => '7',
'seo_ext' => ''
);
ksort($default_config_settings);
$GLOBALS['debug']->debugTail($_SESSION, '$_SESSION');
$GLOBALS['smarty'] = new Smarty();
$GLOBALS['smarty']->compile_dir = CC_SKIN_CACHE_DIR;
$GLOBALS['smarty']->config_dir = CC_SKIN_CACHE_DIR;
$GLOBALS['smarty']->cache_dir = CC_SKIN_CACHE_DIR;
$GLOBALS['smarty']->template_dir = dirname(__FILE__) . '/';
$language = Language::getInstance();
$languages = $language->listLanguages();
if (isset($_POST['language'])) {
$_SESSION['language'] = $_POST['language'];
httpredir('index.php', 'language');
} else {
if (!isset($_SESSION['language'])) {
$_SESSION['language'] = 'en-GB';
}
}
$language->change($_SESSION['language']);
if (is_array($languages)) {
foreach ($languages as $code => $lang) {
$lang['selected'] = ($code == $_SESSION['language']) ? ' selected="selected"' : '';
$GLOBALS['smarty']->append('LANG_LIST', $lang);
}
}
$strings = $language->getStrings();
$GLOBALS['smarty']->assign('LANG', $strings);
$GLOBALS['smarty']->assign('VERSION', CC_VERSION);
$GLOBALS['smarty']->assign('ROOT', CC_ROOT_DIR);
if (isset($_POST['proceed'])) {
$redir = true;
if (!isset($_SESSION['setup'])) {
$_SESSION['setup'] = array();
} else {
if (!isset($_POST['method']) && !isset($_SESSION['setup']['method'])) {
$errors[] = $strings['setup']['error_action_required'];
$redir = false;
}
if (isset($_SESSION['setup']['method']) && !isset($_POST['licence']) && !isset($_SESSION['setup']['licence'])) {
$errors[] = $strings['setup']['error_accept_licence'];
$redir = false;
}
if (isset($_POST['method'])) {
$_SESSION['setup']['method'] = $_POST['method'];
} elseif (isset($_POST['licence'])) {
$_SESSION['setup']['licence'] = true;
} elseif (isset($_POST['permissions'])) {
$_SESSION['setup']['permissions'] = true;
} elseif (isset($_POST['progress'])) {
$redir = false;
}
}
if (!isset($errors) && $redir) {
httpredir('index.php');
}
} elseif (isset($_POST['cancel']) || isset($_GET['cancel'])) {
$_SESSION['setup'] = array();
httpredir('index.php', 'cancelled');
}
if (!isset($_SESSION['setup'])) {
$restart = false;
$step = 1;
// Compatibility Test
$checks = array(
'PHP' => array(
'title' => 'PHP 7.4+ (8.2 Recommended)',
'status' => version_compare(PHP_VERSION, '7.4', '>='),
'pass' => PHP_VERSION,
'fail' => PHP_VERSION
),
'MySQL' => array(
'title' => 'MySQL 5.6+',
'status' => extension_loaded('mysqli'),
'pass' => (function_exists('mysqli_get_client_info')) ? mysqli_get_client_info() : "Bad database extension",
'fail' => "PHP mysqli extension not installed"
),
'GD' => array(
'title' => 'GD Image Library',
'status' => detectGD(),
'pass' => $strings['common']['installed'],
'fail' => $strings['common']['not_installed']
),
'XML' => array(
'title' => 'Simple XML Parser',
'status' => extension_loaded('simplexml'),
'pass' => $strings['common']['installed'],
'fail' => $strings['common']['not_installed']
),
'cURL' => array(
'title' => 'cURL',
'status' => extension_loaded('curl'),
'pass' => $strings['common']['installed'],
'fail' => $strings['common']['not_installed']
),
'Zip' => array(
'title' => 'Zip (ZipArchive)',
'status' => class_exists('ZipArchive'),
'pass' => $strings['common']['installed'],
'fail' => $strings['common']['not_installed']
),
'mbstring' => array(
'title' => 'mbstring (Multibyte String)',
'status' => extension_loaded('mbstring'),
'pass' => $strings['common']['installed'],
'fail' => $strings['common']['not_installed']
)
);
$status = true;
foreach($checks as $check_type => $data) {
foreach($data as $key => $value) {
if($key=='status') {
if(!$value) {
$status = false;
break;
}
}
}
}
if(!$status) {
$errors[] = 'Hosting not compatible. Please rectify or setup a hosted CubeCart store instantly at <a href="https://hosted.cubecart.com" target="_blank">https://hosted.cubecart.com</a>.';
$retry = true;
$proceed = false;
}
$GLOBALS['smarty']->assign('CHECKS', $checks);
$GLOBALS['smarty']->assign('MODE_COMPAT', true);
} else {
if (!isset($_SESSION['setup']['method'])) {
$step = 2;
// Select Install/Upgrade
$GLOBALS['smarty']->assign('LANG_INSTALL_CUBECART_TITLE', sprintf($strings['setup']['install_cubecart_title'], CC_VERSION));
// Check if upgrading is possible
if (file_exists($global_file)) {
include $global_file;
$installed = (isset($glob['installed'])) ? (bool) $glob['installed'] : false;
unset($glob);
}
if ($installed) {
$GLOBALS['smarty']->assign('LANG_UPGRADE_CUBECART_TITLE', sprintf($strings['setup']['upgrade_cubecart_title'], CC_VERSION));
$GLOBALS['smarty']->assign('SHOW_UPGRADE', true);
}
$GLOBALS['smarty']->assign('MODE_METHOD', true);
} elseif (!isset($_SESSION['setup']['licence'])) {
if (file_exists(CC_ROOT_DIR . '/docs/license.txt')) {
$GLOBALS['smarty']->assign('SOFTWARE_LICENCE', file_get_contents(CC_ROOT_DIR . '/docs/license.txt'));
}
$GLOBALS['smarty']->assign('MODE_LICENCE', true);
} elseif (!isset($_SESSION['setup']['complete'])) {
if (in_array($_SESSION['setup']['method'], array(
'install', 'upgrade'))) {
require_once 'setup.' . $_SESSION['setup']['method'] . '.php';
} else {
require_once 'setup.install.php';
}
} else {
// Install/Upgrade Complete
// Upgrade Main Configuration
include $global_file;
$GLOBALS['db'] = Database::getInstance($glob);
// Move to scripts folder?
$config_string = $db->select('CubeCart_config', array(
'array'
), array(
'name' => 'config'
));
$main_config = json_decode(base64_decode($config_string[0]['array']), true);
if ($_SESSION['setup']['config_update'] && is_array($main_config)) {
// Remove unused keys
$dead_keys = array(
'cat_newest_first',
'captcha_private',
'captcha_public',
'copyright',
'currecyAuto',
'currencyAuto',
'dateFormat',
'ftp_server',
'ftp_username',
'ftp_password',
'ftp_root_dir',
'gdGifSupport',
'gdmaxImgSize',
'gdquality',
'gdthumbSize',
'gdversion',
'maxImageUploadSize',
'imgGalleryType',
'richTextEditor',
'rteHeight',
'rteHeightUnit',
'sefprodnamefirst',
'show_category_count',
'sqlSessionExpiry',
'taxCountry',
'taxCounty',
'uploadSize',
'noRelatedProds'
);
// Rename existing keys
$remapped = array(
'dirSymbol' => 'defualt_directory_symbol',
'installTime' => 'install_time',
'defaultCurrency' => 'default_currency',
'defaultLang' => 'default_language',
'dirSymbol' => 'default_directory_symbol',
'latestNewsRRS' => 'default_rss_feed',
'dnLoadExpire' => 'download_expire',
'dnLoadTimes' => 'download_count',
'mailMethod' => 'email_method',
'masterName' => 'email_name',
'masterEmail' => 'email_address',
'disable_alert_email' => 'email_disable_alert',
'smtpAuth' => 'email_smtp',
'smtpHost' => 'email_smtp_host',
'smtpPassword' => 'email_smtp_password',
'smtpPort' => 'email_smtp_port',
'smtpUsername' => 'email_smtp_user',
'hide_prices' => 'catalogue_hide_prices',
'cat_tree' => 'catalogue_expand_tree',
'productPages' => 'catalogue_products_per_page',
'showLatestProds' => 'catalogue_latest_products',
'noLatestProds' => 'catalogue_latest_products_count',
'show_empty_cat' => 'catalogue_show_empty',
'noPopularBoxItems' => 'catalogue_popular_products_count',
'pop_products_source' => 'catalogue_popular_products_source',
'saleMode' => 'catalogue_sale_mode',
'noSaleBoxItems' => 'catalogue_sale_items',
'salePercentOff' => 'catalogue_sale_percentage',
'productPrecis' => 'product_precis',
'weightUnit' => 'product_weight_unit',
'stockLevel' => 'stock_level',
'add_to_basket_act' => 'basket_jump_to',
'shipAddressLock' => 'basket_allow_non_invoice_address',
'outofstockPurchase' => 'basket_out_of_stock_purchase',
'priceTaxDelInv' => 'basket_tax_by_delivery',
'orderExpire' => 'basket_order_expire',
'offLine' => 'offline',
'offLineContent' => 'offline_content',
'proxyHost' => 'proxy_host',
'proxyPort' => 'proxy_port',
'sef' => 'seo',
'sefserverconfig' => 'seo_method',
'seftags' => 'seo_metadata',
'storeAddress' => 'store_address',
'storeName' => 'store_name',
'postcode' => 'store_postcode',
'siteCountry' => 'store_country',
'siteCounty' => 'store_zone',
'siteTitle' => 'store_title',
'metaDescription' => 'store_meta_description',
'metaKeyWords' => 'store_meta_keywords',
'skinDir' => 'skin_folder',
'skinStyle' => 'skin_style',
'changeskin' => 'skin_change',
'timeFormat' => 'time_format',
'timeOffset' => 'time_offset',
'timezone' => 'time_zone',
'floodControl' => 'recaptcha'
);
## Remap store country from id to numcode
if (isset($main_config['siteCountry']) && $main_config['siteCountry'] > 0) {
$country = $db->select('CubeCart_geo_country', array(
'numcode'
), array(
'id' => $main_config['siteCountry']
));
$main_config['siteCountry'] = $country[0]['numcode'];
}
## Parse
$new_config = array();
foreach ($main_config as $key => $value) {
if (in_array($key, $dead_keys)) {
unset($main_config[$key]);
continue;
} else {
if (isset($remapped[$key])) {
$new_config[$remapped[$key]] = $value;
unset($main_config[$key]);
}
}
}
if ($new_config['recaptcha'] == 'recaptcha') {
$new_config['recaptcha'] = true;
}
## Set default RSS feed to correct value if not set, empty or our of date
if (empty($new_config['default_rss_feed']) || !isset($new_config['default_rss_feed']) || $new_config['default_rss_feed'] == 'http://forums.cubecart.com/index.php?act=rssout&id=1') {
$new_config['default_rss_feed'] = 'http://forums.cubecart.com/rss/forums/1-cubecart-news-announcements/';
}
if (file_exists('language/' . $main_config['default_language'] . '.xml')) {
$default_language = $main_config['default_language'];
} elseif (isset($_SESSION['setup']['long_lang_identifier']) && file_exists('language/' . $_SESSION['setup']['long_lang_identifier'] . '.xml')) {
$default_language = $_SESSION['setup']['long_lang_identifier'];
} else {
$default_language = isset($_SESSION['setup']['config']['default_language']) ? $_SESSION['setup']['config']['default_language'] : 'en-GB';
}
if (!file_exists('language/' . $default_language . '.xml')) {
$default_language = 'en-GB';
}
## Redefine the default skin
$reset = array(
'skin_folder' => 'foundation',
'skin_style' => 'default',
'default_language' => $default_language
);
$new_config = array_merge($main_config, $new_config, $reset);
## Set some defaults
$defaults = array(
'admin_skin' => 'default',
'enable_reviews' => true,
'show_basket_weight' => true
);
$new_config = array_merge($defaults, $new_config);
ksort($new_config);
// Write new config to database
$db->update('CubeCart_config', array(
'array' => base64_encode(json_encode($new_config))
), array(
'name' => 'config'
));
$_SESSION['setup']['config_update'] = true;
}
$proceed = false;
$restart = true;
$step = 6;
switch ($_SESSION['setup']['method']) {
case 'install':
$GLOBALS['smarty']->assign('MODE_COMPLETE_INSTALL', true);
break;
case 'upgrade':
$GLOBALS['smarty']->assign('MODE_COMPLETE_UPGRADE', true);
break;
}
$GLOBALS['smarty']->assign('MODE_COMPLETE', true);
// delete setup folder on admin login
$date = new Datetime(date('r',time()+7200));
$attributes = '';
$attributes .= ';Expires='.$date->format(DateTime::COOKIE);
if(CC_SSL) {
$attributes .= ';SameSite=None';
$attributes .= ';Secure';
}
$attributes .= ';HttpOnly';
header('Set-Cookie: delete_setup=1'.$attributes);
/* //Attempt admin file and folder rename
if (!isset($_SESSION['setup']['admin_rename']) && (file_exists('../admin') || file_exists('../admin.php'))) {
$adminFolder = 'admin_'.randomString(6);
$adminFile = 'admin_'.randomString(6).'.php';
$update_config = false;
rename('../'.$glob['adminFolder'], '../'.$adminFolder);
rename('../'.$glob['adminFile'], '../'.$adminFile);
if (file_exists('../'.$adminFolder)) {
$update_config = true;
} else {
$adminFolder = $glob['adminFolder'];
}
if (file_exists('../'.$adminFile)) {
$update_config = true;
} else {
$adminFile = $glob['adminFile'];
}
if ($update_config) {
$_SESSION['setup']['admin_rename'] = true;
foreach ($glob as $key => $value) {
if ($key=='adminFile') {
$value = $adminFile;
} elseif ($key=='adminFolder') {
$value = $adminFolder;
}
$value = is_array($value) ? var_export($value, true) : "'".addslashes($value)."'";
$config[] = sprintf("\$glob['%s'] = %s;", $key, $value);
}
$config = sprintf("<?php\n%s\n?>", implode("\n", $config));
## Backup existing config file, if it exists
if (file_exists($global_file)) {
rename($global_file, $global_file.'-'.date('Ymdgis').'.php');
}
if (file_put_contents($global_file, $config));
}
$adminURL = str_replace('/setup', '', CC_STORE_URL).'/'.$adminFile;
if ($admins = $db->select('CubeCart_admin_users', false, array('status'=> 1))) {
$headers = 'From: nobody@'.parse_url(CC_STORE_URL, PHP_URL_HOST);
foreach ($admins as $admin) {
mail($admin['email'], "Store Admin URL", "Hi ".html_entity_decode($admin['name'], ENT_QUOTES).",\r\n\r\nYour store has been setup to CubeCart version ".CC_VERSION.".\r\n\r\nFor security reasons the administrator URL has been obscured to divert any possible unwanted attention. Please set your bookmark to ".$adminURL."\r\n\r\n\r\nThis email was sent automatically by the CubeCart setup tool.", $headers);
}
}*/
$adminFile = '[[soft_adminFile]]';
$GLOBALS['smarty']->assign('ADMIN_URL', $adminURL);
$GLOBALS['smarty']->assign('STORE_URL', str_replace('/setup', '', CC_STORE_URL).'/');
$GLOBALS['smarty']->assign('SHOW_LINKS', true);
//}
// secure global files
$gfs = glob(CC_INCLUDES_DIR.'global.*.php');
if (is_array($gfs)) {
foreach ($gfs as $gf) {
chmod($gf, 0444);
}
}
/* Truncate CubeCart_system_error_log table. There are a number of failed SQL queries on upgrade depending
* on to/from version. We need a clean slate to detect operational errors.
*/
$db->truncate('CubeCart_system_error_log');
include $global_file;
if ($_SESSION['setup']['autoupgrade'] && !$update_config) {
httpredir('../'.$glob['adminFile'].'?_g=maintenance&node=index', 'upgrade');
}
}
}
## Display error messages
if (isset($errors) && is_array($errors)) {
$vars['errors'] = $errors;
$GLOBALS['smarty']->assign('GUI_MESSAGE', $vars);
}
if (isset($step)) {
$progress = (100 / 5) * ((int) $step - 1);
$progress = ($progress >= 100) ? 100 : $progress;
$GLOBALS['smarty']->assign('PROGRESS', array(
'percent' => (int) $progress,
'message' => sprintf($strings['setup']['percent_complete'], (int) $progress)
));
}
## Build Logos
function build_logos($image_name = '')
{
global $db;
$logo_path = empty($image_name) ? 'skins/foundation/images/default/logo/default.png' : 'images/logos/'.$image_name;
$logo_config = array(
'foundationdefault' => $logo_path,
'emails' => $logo_path,
'invoices' => $logo_path
);
$db->insert('CubeCart_config', array(
'name' => 'logos',
'array' => base64_encode(json_encode($logo_config))
));
}
## Controller elements
if ($proceed) {
$vars['controller']['continue'] = true;
}
if ($retry) {
$vars['controller']['retry'] = true;
}
if ($restart) {
$vars['controller']['restart'] = true;
}
if (isset($vars['controller'])) {
$GLOBALS['smarty']->assign('CONTROLLER', $vars['controller']);
}
$GLOBALS['smarty']->assign('COPYRIGHT_YEAR', date('Y'));
$GLOBALS['smarty']->display('skin.install.php');
Zerion Mini Shell 1.0