# osCommerce Online Merchant v2.2 RC1 Upgrade Notes

The following upgrade guide is based on the osCommerce 2.2 Milestone 2 Update 060817 release. If you have not yet updated to this release please review its upgrade guide in the extras directory (update-20060817.txt) before applying these changes.

The following changes should be performed in order on your installation to upgrade it to osCommerce Online Merchant v2.2 RC1. Please note that the following changes are only the recommended changes to make and does not include the new Administration Tool login routine or the Administration Tool index page summary modules that are available with new installations. This is to avoid a conflict with existing Administration Tool securing mechanisms already in place.

- [BUGFIX] Caching of the Manufacturers Box
- [IMPROVEMENT] Database Backup
- [IMPROVEMENT] Input Fields on Checkout Confirmation Page
- [IMPROVEMENT] register_globals Compatibility for PHP 4.3+ Servers
- [BUGFIX] Currency Case-Sensitivity
- [BUGFIX] Invoice and Packing Slip Billing Address
- [IMPROVEMENT] Configuration -> Minimum Values Settings
- [BUGFIX] Compatibility Array Index
- [IMPROVEMENT] MySQL Database Connection Identifier Link
- [BUGFIX] Product Sorting SQL Injection Vulnerability
- [BUGFIX] Product Price Calculations
- [BUGFIX] Country Name on the Order History Page
- [BUGFIX] Shopping Cart Product Quantity as Integer Value
- [IMPROVEMENT] Maximum Order Product Quantities [+SQL]
- [IMPROVEMENT] Accepting State Names
- [BUGFIX] Load the Order Total Modules Before Loading the Payment Modules
- [BUGFIX] Payment Module Selection
- [BUGFIX] Category Image Removal
- [BUGFIX] Add the Session ID to GET Based Forms
- [BUGFIX] Fix Typo on the Products New Page
- [BUGFIX] Process the Order Total Modules Earlier on the Checkout Confirmation Page
- [BUGFIX] PHP < 4.1 Compatibility Update
- [BUGFIX] Strip Additional Slashes When Editing Reviews
- [IMPROVEMENT] New Public Title for Payment Modules
- [IMPROVEMENT] Navigation History Parameter Filter
- [IMPROVEMENT] Increase Configuration Key and Title Database Field Sizes [SQL]
- [BUGFIX] Strip Additional Slashes When Editing Files Through the File Manager

### [BUGFIX] Caching of the Manufacturers Box

Fix a spelling mistake preventing the manufacturers box being cached.

Affected Files
catalog/includes/functions/cache.php

File: catalog/includes/functions/cache.php

119 | function tep_cache_manufacturers_box($auto_expire = false, $refresh = false) { | = | 119 | function tep_cache_manufacturers_box($auto_expire = false, $refresh = false) {
120 | global $HTTP_GET_VARS, $language; |  | 120 | global $HTTP_GET_VARS, $language;
121 |  |  | 121 |
122 | $cache_output = ''; |  | 122 | $cache_output = '';
123 |  |  | 123 |
124 | $manufacturers_id = ''; |  | 124 | $manufacturers_id = '';
125 | if (isset($HTTP_GET_VARS['manufactuers_id']) && is_numeric($HTTP_GET_VARS['manufacturers_id'])) { | <> | 125 | if (isset($HTTP_GET_VARS['manufacturers_id']) && is_numeric($HTTP_GET_VARS['manufacturers_id'])) {
126 | $manufacturers_id = $HTTP_GET_VARS['manufacturers_id']; | = | 126 | $manufacturers_id = $HTTP_GET_VARS['manufacturers_id'];
127 | } |  | 127 | }
128 |  |  | 128 |
129 | if (($refresh == true) || !read_cache($cache_output, 'manufacturers_box-' . $language . '.cache' . $manufacturers_id, $auto_expire)) { |  | 129 | if (($refresh == true) || !read_cache($cache_output, 'manufacturers_box-' . $language . '.cache' . $manufacturers_id, $auto_expire)) {
130 | ob_start(); |  | 130 | ob_start();
131 | include(DIR_WS_BOXES . 'manufacturers.php'); |  | 131 | include(DIR_WS_BOXES . 'manufacturers.php');

### [IMPROVEMENT] Database Backup

Don't store the session and whos online database tables in the database backups.

Affected Files
catalog/admin/backup.php

File: catalog/admin/backup.php

70 | $keys_query = tep_db_query("show keys from " . $table); | = | 70 | $keys_query = tep_db_query("show keys from " . $table);
71 | while ($keys = tep_db_fetch_array($keys_query)) { |  | 71 | while ($keys = tep_db_fetch_array($keys_query)) {
72 | $kname = $keys['Key_name']; |  | 72 | $kname = $keys['Key_name'];
73 |  |  | 73 |
74 | if (!isset($index[$kname])) { |  | 74 | if (!isset($index[$kname])) {
75 | $index[$kname] = array('unique' => !$keys['Non_unique'], |  | 75 | $index[$kname] = array('unique' => !$keys['Non_unique'],
|  | -+ | 76 | 'fulltext' => ($keys['Index_type'] == 'FULLTEXT' ? '1' : '0'),
76 | 'columns' => array()); | = | 77 | 'columns' => array());
77 | } |  | 78 | }
78 |  |  | 79 |
79 | $index[$kname]['columns'][] = $keys['Column_name']; |  | 80 | $index[$kname]['columns'][] = $keys['Column_name'];
80 | } |  | 81 | }
81 |  |  | 82 |
83 | $schema .= ',' . "\n"; | = | 84 | $schema .= ',' . "\n";
84 |  |  | 85 |
85 | $columns = implode($info['columns'], ', '); |  | 86 | $columns = implode($info['columns'], ', ');
86 |  |  | 87 |
87 | if ($kname == 'PRIMARY') { |  | 88 | if ($kname == 'PRIMARY') {
88 | $schema .= ' PRIMARY KEY (' . $columns . ')'; |  | 89 | $schema .= ' PRIMARY KEY (' . $columns . ')';
|  | -+ | 90 | } elseif ( $info['fulltext'] == '1' ) {
|  |  | 91 | $schema .= ' FULLTEXT ' . $kname . ' (' . $columns . ')';
89 | } elseif ($info['unique']) { | = | 92 | } elseif ($info['unique']) {
90 | $schema .= ' UNIQUE ' . $kname . ' (' . $columns . ')'; |  | 93 | $schema .= ' UNIQUE ' . $kname . ' (' . $columns . ')';
91 | } else { |  | 94 | } else {
92 | $schema .= ' KEY ' . $kname . ' (' . $columns . ')'; |  | 95 | $schema .= ' KEY ' . $kname . ' (' . $columns . ')';
93 | } |  | 96 | }
94 | } |  | 97 | }
95 |  |  | 98 |
96 | $schema .= "\n" . ');' . "\n\n"; |  | 99 | $schema .= "\n" . ');' . "\n\n";
97 | fputs($fp, $schema); |  | 100 | fputs($fp, $schema);
98 |  |  | 101 |
99 | // dump the data |  | 102 | // dump the data
|  | <> | 103 | if ( ($table != TABLE_SESSIONS ) && ($table != TABLE_WHOS_ONLINE) ) {
100 | $rows_query = tep_db_query("select " . implode(',', $table_list) . " from " . $table); |  | 104 | $rows_query = tep_db_query("select " . implode(',', $table_list) . " from " . $table);
101 | while ($rows = tep_db_fetch_array($rows_query)) { |  | 105 | while ($rows = tep_db_fetch_array($rows_query)) {
102 | $schema = 'insert into ' . $table . ' (' . implode(', ', $table_list) . ') values ('; |  | 106 | $schema = 'insert into ' . $table . ' (' . implode(', ', $table_list) . ') values (';
103 |  | = | 107 |
104 | reset($table_list); | <> | 108 | reset($table_list);
105 | while (list(,$i) = each($table_list)) { |  | 109 | while (list(,$i) = each($table_list)) {
106 | if (!isset($rows[$i])) { |  | 110 | if (!isset($rows[$i])) {
107 | $schema .= 'NULL, '; |  | 111 | $schema .= 'NULL, ';
108 | } elseif (tep_not_null($rows[$i])) { |  | 112 | } elseif (tep_not_null($rows[$i])) {
109 | $row = addslashes($rows[$i]); |  | 113 | $row = addslashes($rows[$i]);
110 | $row = ereg_replace("\n#", "\n".'\#', $row); |  | 114 | $row = ereg_replace("\n#", "\n".'\#', $row);
111 |  | = | 115 |
112 | $schema .= '\'' . $row . '\', '; | <> | 116 | $schema .= '\'' . $row . '\', ';
113 | } else { |  | 117 | } else {
114 | $schema .= '\'\', '; |  | 118 | $schema .= '\'\', ';
|  |  | 119 | }
115 | } | = | 120 | }
|  | -+ | 121 |
|  |  | 122 | $schema = ereg_replace(', $', '', $schema) . ');' . "\n";
|  |  | 123 | fputs($fp, $schema);
116 | } | = | 124 | }
117 |  | +- |  |
118 | $schema = ereg_replace(', $', '', $schema) . ');' . "\n"; |  |  |
119 | fputs($fp, $schema); |  |  |
120 |  |  |  |
121 | } | = | 125 | }
122 | } |  | 126 | }
123 |  |  | 127 |
124 | fclose($fp); |  | 128 | fclose($fp);
125 |  |  | 129 |
126 | if (isset($HTTP_POST_VARS['download']) && ($HTTP_POST_VARS['download'] == 'yes')) { |  | 130 | if (isset($HTTP_POST_VARS['download']) && ($HTTP_POST_VARS['download'] == 'yes')) {
247 | tep_db_query("drop table if exists address_book, address_format, banners, banners_history, categories, categories_description, configuration, configuration_group, counter, counter_history, countries, currencies, customers, customers_basket, customers_basket_attributes, customers_info, languages, manufacturers, manufacturers_info, orders, orders_products, orders_status, orders_status_history, orders_products_attributes, orders_products_download, products, products_attributes, products_attributes_download, prodcts_description, products_options, products_options_values, products_options_values_to_products_options, products_to_categories, reviews, reviews_description, sessions, specials, tax_class, tax_rates, geo_zones, whos_online, zones, zones_to_geo_zones"); | = | 251 | tep_db_query("drop table if exists address_book, address_format, banners, banners_history, categories, categories_description, configuration, configuration_group, counter, counter_history, countries, currencies, customers, customers_basket, customers_basket_attributes, customers_info, languages, manufacturers, manufacturers_info, orders, orders_products, orders_status, orders_status_history, orders_products_attributes, orders_products_download, products, products_attributes, products_attributes_download, prodcts_description, products_options, products_options_values, products_options_values_to_products_options, products_to_categories, reviews, reviews_description, sessions, specials, tax_class, tax_rates, geo_zones, whos_online, zones, zones_to_geo_zones");
248 |  |  | 252 |
249 | for ($i=0, $n=sizeof($sql_array); $i<$n; $i++) { |  | 253 | for ($i=0, $n=sizeof($sql_array); $i<$n; $i++) {
250 | tep_db_query($sql_array[$i]); |  | 254 | tep_db_query($sql_array[$i]);
251 | } |  | 255 | }
252 |  |  | 256 |
|  | -+ | 257 | tep_session_close();
|  |  | 258 |
|  |  | 259 | tep_db_query("delete from " . TABLE_WHOS_ONLINE);
|  |  | 260 | tep_db_query("delete from " . TABLE_SESSIONS);
|  |  | 261 |
253 | tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key = 'DB_LAST_RESTORE'"); | = | 262 | tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key = 'DB_LAST_RESTORE'");
254 | tep_db_query("insert into " . TABLE_CONFIGURATION . " values ('', 'Last Database Restore', 'DB_LAST_RESTORE', '" . $read_from . "', 'Last database restore file', '6', '', '', now(), '', '')"); |  | 263 | tep_db_query("insert into " . TABLE_CONFIGURATION . " values ('', 'Last Database Restore', 'DB_LAST_RESTORE', '" . $read_from . "', 'Last database restore file', '6', '', '', now(), '', '')");
255 |  |  | 264 |
256 | if (isset($remove_raw) && ($remove_raw == true)) { |  | 265 | if (isset($remove_raw) && ($remove_raw == true)) {
257 | unlink($restore_from); |  | 266 | unlink($restore_from);
258 | } |  | 267 | }

### [IMPROVEMENT] Input Fields on Checkout Confirmation Page

Allow payment modules to display input fields on the checkout confirmation page. This is for PCI conformance where the credit card number can be directly passed to the payment gateway.

Affected Files
catalog/checkout_confirmation.php

File: catalog/checkout_confirmation.php

107 | <?php require(DIR_WS_INCLUDES . 'column_left.php'); ?> | = | 107 | <?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
108 | <!-- left_navigation_eof //--> |  | 108 | <!-- left_navigation_eof //-->
109 | </table></td> |  | 109 | </table></td>
110 | <!-- body_text //--> |  | 110 | <!-- body_text //-->
111 | <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="0"> |  | 111 | <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="0">
112 | <tr> |  | 112 | <tr>
|  | <> | 113 | <td>
|  |  | 114 | <?php
|  |  | 115 | if (isset($$payment->form_action_url)) {
|  |  | 116 | $form_action_url = $$payment->form_action_url;
|  |  | 117 | } else {
|  |  | 118 | $form_action_url = tep_href_link(FILENAME_CHECKOUT_PROCESS, '', 'SSL');
|  |  | 119 | }
|  |  | 120 |
|  |  | 121 | echo tep_draw_form('checkout_confirmation', $form_action_url, 'post');
|  |  | 122 | ?>
113 | <td><table border="0" width="100%" cellspacing="0" cellpadding="0"> |  | 123 | <table border="0" width="100%" cellspacing="0" cellpadding="0">
114 | <tr> | = | 124 | <tr>
115 | <td class="pageHeading"><?php echo HEADING_TITLE; ?></td> |  | 125 | <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
116 | <td class="pageHeading" align="right"><?php echo tep_image(DIR_WS_IMAGES . 'table_background_confirmation.gif', HEADING_TITLE, HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td> |  | 126 | <td class="pageHeading" align="right"><?php echo tep_image(DIR_WS_IMAGES . 'table_background_confirmation.gif', HEADING_TITLE, HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
117 | </tr> |  | 127 | </tr>
118 | </table></td> |  | 128 | </table></td>
119 | </tr> |  | 129 | </tr>
306 | ?> | = | 316 | ?>
307 | <tr> |  | 317 | <tr>
308 | <td><table border="0" width="100%" cellspacing="0" cellpadding="0"> |  | 318 | <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
309 | <tr> |  | 319 | <tr>
310 | <td align="right" class="main"> |  | 320 | <td align="right" class="main">
311 | <?php |  | 321 | <?php
312 | if (isset($$payment->form_action_url)) { | +- |  |
313 | $form_action_url = $$payment->form_action_url; |  |  |
314 | } else { |  |  |
315 | $form_action_url = tep_href_link(FILENAME_CHECKOUT_PROCESS, '', 'SSL'); |  |  |
316 | } |  |  |
317 |  |  |  |
318 | echo tep_draw_form('checkout_confirmation', $form_action_url, 'post'); |  |  |
319 |  |  |  |
320 | if (is_array($payment_modules->modules)) { | = | 322 | if (is_array($payment_modules->modules)) {
321 | echo $payment_modules->process_button(); |  | 323 | echo $payment_modules->process_button();
322 | } |  | 324 | }
323 |  |  | 325 |
324 | echo tep_image_submit('button_confirm_order.gif', IMAGE_BUTTON_CONFIRM_ORDER) . '</form>' . "\n"; | <> | 326 | echo tep_image_submit('button_confirm_order.gif', IMAGE_BUTTON_CONFIRM_ORDER) . "\n";
325 | ?> | = | 327 | ?>
326 | </td> |  | 328 | </td>
327 | </tr> |  | 329 | </tr>
328 | </table></td> |  | 330 | </table></td>
329 | </tr> |  | 331 | </tr>
330 | <tr> |  | 332 | <tr>
359 | <td align="center" width="25%" class="checkoutBarFrom"><?php echo '<a href="' . tep_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL') . '" class="checkoutBarFrom">' . CHECKOUT_BAR_PAYMENT . '</a>'; ?></td> | = | 361 | <td align="center" width="25%" class="checkoutBarFrom"><?php echo '<a href="' . tep_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL') . '" class="checkoutBarFrom">' . CHECKOUT_BAR_PAYMENT . '</a>'; ?></td>
360 | <td align="center" width="25%" class="checkoutBarCurrent"><?php echo CHECKOUT_BAR_CONFIRMATION; ?></td> |  | 362 | <td align="center" width="25%" class="checkoutBarCurrent"><?php echo CHECKOUT_BAR_CONFIRMATION; ?></td>
361 | <td align="center" width="25%" class="checkoutBarTo"><?php echo CHECKOUT_BAR_FINISHED; ?></td> |  | 363 | <td align="center" width="25%" class="checkoutBarTo"><?php echo CHECKOUT_BAR_FINISHED; ?></td>
362 | </tr> |  | 364 | </tr>
363 | </table></td> |  | 365 | </table></td>
364 | </tr> |  | 366 | </tr>
365 | </table></td> | <> | 367 | </table></form></td>
366 | <!-- body_text_eof //--> | = | 368 | <!-- body_text_eof //-->
367 | <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2"> |  | 369 | <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
368 | <!-- right_navigation //--> |  | 370 | <!-- right_navigation //-->
369 | <?php require(DIR_WS_INCLUDES . 'column_right.php'); ?> |  | 371 | <?php require(DIR_WS_INCLUDES . 'column_right.php'); ?>
370 | <!-- right_navigation_eof //--> |  | 372 | <!-- right_navigation_eof //-->
371 | </table></td> |  | 373 | </table></td>

### [IMPROVEMENT] register_globals Compatibility for PHP 4.3+ Servers

Add a register_globals compatibility layer for PHP 4.3+ servers.

Affected Files
catalog/includes/application_top.php
catalog/includes/functions/compatibility.php
catalog/includes/functions/sessions.php
catalog/includes/functions/html_output.php
catalog/includes/classes/order.php
catalog/includes/modules/address_book_details.php
catalog/checkout_payment.php
catalog/admin/includes/application_top.php
catalog/admin/includes/functions/compatibility.php
catalog/admin/includes/functions/sessions.php
catalog/admin/includes/functions/html_output.php
catalog/admin/includes/classes/upload.php
catalog/admin/file_manager.php

File: catalog/includes/application_top.php

13 | // start the timer for the page parse time log | = | 13 | // start the timer for the page parse time log
14 | define('PAGE_PARSE_START_TIME', microtime()); |  | 14 | define('PAGE_PARSE_START_TIME', microtime());
15 |  |  | 15 |
16 | // set the level of error reporting |  | 16 | // set the level of error reporting
17 | error_reporting(E_ALL & ~E_NOTICE); |  | 17 | error_reporting(E_ALL & ~E_NOTICE);
18 |  |  | 18 |
19 | // check if register_globals is enabled. | <> | 19 | // check support for register_globals
20 | // since this is a te mporary measure this message is hardcoded. The requirement wil l be removed before 2.2 is f inalized. |  | 20 | if (function_exists('ini_get') && (ini_get('register_globals') == false) && (PHP_VERSION < 4.3) ) {
21 | if (function_exists('ini_get')) { |  | 21 | exit('Server Requirement Error: register_globals is disabled in your PHP co nfiguration. This can be enabled in your php.ini configuration file or in the .htaccess file in your catalog directory. Please use PHP 4.3+ if register_globals cann ot be e nabled on the server.');
22 | ini_get('register_globals') or exit('Server Requirement Error: register_globals is disabled in your PHP configuration. This can be enabled in your php.ini configuration file or in the .htaccess file in your catalog directory.'); |  |  |
23 | } | = | 22 | }
24 |  |  | 23 |
25 | // Set the local configuration parameters - mainly for developers |  | 24 | // Set the local configuration parameters - mainly for developers
26 | if (file_exists('includes/local/configure.php')) include('includes/local/configure.php'); |  | 25 | if (file_exists('includes/local/configure.php')) include('includes/local/configure.php');
27 |  |  | 26 |
28 | // include server parameters |  | 27 | // include server parameters
33 | header('Location: install/index.php'); | = | 32 | header('Location: install/index.php');
34 | } |  | 33 | }
35 | } |  | 34 | }
36 |  |  | 35 |
37 | // define the project version |  | 36 | // define the project version
38 | define('PROJECT_VERSION', 'osCommerce 2.2-MS2'); |  | 37 | define('PROJECT_VERSION', 'osCommerce 2.2-MS2');
|  | -+ | 38 |
|  |  | 39 | // some code to solve compatibility issues
|  |  | 40 | require(DIR_WS_FUNCTIONS . 'compatibility.php');
39 |  | = | 41 |
40 | // set the type of request (secure or not) |  | 42 | // set the type of request (secure or not)
41 | $request_type = (getenv('HTTPS') == 'on') ? 'SSL' : 'NONSSL'; |  | 43 | $request_type = (getenv('HTTPS') == 'on') ? 'SSL' : 'NONSSL';
42 |  |  | 44 |
43 | // set php_self in the local scope |  | 45 | // set php_self in the local scope
44 | if (!isset($PHP_SELF)) $PHP_SELF = $HTTP_SERVER_VARS['PHP_SELF']; |  | 46 | if (!isset($PHP_SELF)) $PHP_SELF = $HTTP_SERVER_VARS['PHP_SELF'];
122 | // include shopping cart class | = | 124 | // include shopping cart class
123 | require(DIR_WS_CLASSES . 'shopping_cart.php'); |  | 125 | require(DIR_WS_CLASSES . 'shopping_cart.php');
124 |  |  | 126 |
125 | // include navigation history class |  | 127 | // include navigation history class
126 | require(DIR_WS_CLASSES . 'navigation_history.php'); |  | 128 | require(DIR_WS_CLASSES . 'navigation_history.php');
127 |  |  | 129 |
128 | // some code to solve compatibility issues | +- |  |
129 | require(DIR_WS_FUNCTIONS . 'compatibility.php'); |  |  |
130 |  |  |  |
131 | // check if sessions are supported, otherwise use the php3 compatible session class | = | 130 | // check if sessions are supported, otherwise use the php3 compatible session class
132 | if (!function_exists('session_start')) { |  | 131 | if (!function_exists('session_start')) {
133 | define('PHP_SESSION_NAME', 'osCsid'); |  | 132 | define('PHP_SESSION_NAME', 'osCsid');
134 | define('PHP_SESSION_PATH', $cookie_path); |  | 133 | define('PHP_SESSION_PATH', $cookie_path);
135 | define('PHP_SESSION_DOMAIN', $cookie_domain); |  | 134 | define('PHP_SESSION_DOMAIN', $cookie_domain);
136 | define('PHP_SESSION_SAVE_PATH', SESSION_WRITE_DIRECTORY); |  | 135 | define('PHP_SESSION_SAVE_PATH', SESSION_WRITE_DIRECTORY);
191 | tep_session_start(); | = | 190 | tep_session_start();
192 | $session_started = true; |  | 191 | $session_started = true;
193 | } |  | 192 | }
194 | } else { |  | 193 | } else {
195 | tep_session_start(); |  | 194 | tep_session_start();
196 | $session_started = true; |  | 195 | $session_started = true;
|  | -+ | 196 | }
|  |  | 197 |
|  |  | 198 | if ( ($session_started == true) && (PHP_VERSION >= 4.3) && function_exists('ini_get') && (ini_get('register_globals') == false) ) {
|  |  | 199 | extract($_SESSION, EXTR_OVERWRITE+EXTR_REFS);
197 | } | = | 200 | }
198 |  |  | 201 |
199 | // set SID once, even if empty |  | 202 | // set SID once, even if empty
200 | $SID = (defined('SID') ? SID : ''); |  | 203 | $SID = (defined('SID') ? SID : '');
201 |  |  | 204 |
202 | // verify the ssl_session_id if the feature is enabled |  | 205 | // verify the ssl_session_id if the feature is enabled

File: catalog/includes/functions/compatibility.php

2 | /* | = | 2 | /*
3 | $Id: compatibility.php,v 1.19 2003/04/09 16:12:54 project3000 Exp $ |  | 3 | $Id: compatibility.php,v 1.19 2003/04/09 16:12:54 project3000 Exp $
4 |  |  | 4 |
5 | osCommerce, Open Source E-Commerce Solutions |  | 5 | osCommerce, Open Source E-Commerce Solutions
6 | http://www.oscommerce.com |  | 6 | http://www.oscommerce.com
7 |  |  | 7 |
8 | Copyright (c) 2006 osCommerce |  | 8 | Copyright (c) 2007 osCommerce
9 |  |  | 9 |
10 | Released under the GNU General Public License |  | 10 | Released under the GNU General Public License
11 |  | +- |  |
12 | Modified by Marco Canini, <m.canini@libero.it> |  |  |
13 | - Fixed a bug with arrays in $HTTP_xxx_VARS |  |  |
14 | */ | = | 11 | */
15 |  |  | 12 |
16 | //// |  | 13 | ////
17 | // Recursively handle magic_quotes_gpc turned off. |  | 14 | // Recursively handle magic_quotes_gpc turned off.
18 | // This is due to the possibility of have an array in |  | 15 | // This is due to the possibility of have an array in
19 | // $HTTP_xxx_VARS |  | 16 | // $HTTP_xxx_VARS
27 | } else { | = | 24 | } else {
28 | $ar[$key] = addslashes($value); |  | 25 | $ar[$key] = addslashes($value);
29 | } |  | 26 | }
30 | } |  | 27 | }
31 | } |  | 28 | }
32 |  |  | 29 |
33 | // $HTTP_x xx_VARS are always s et on php4 | <> | 30 | if (PHP_VERSION >= 4.1) {
|  |  | 31 | $HTTP_GET_VARS =& $_GET;
|  |  | 32 | $HTTP_POST_VARS =& $_POST;
|  |  | 33 | $HTTP_COOKIE_VARS =& $_COOKIE;
|  |  | 34 | $HTTP_SESSION_VARS =& $_SESSION;
|  |  | 35 | $HTTP_POST_FILES =& $_FILES;
|  |  | 36 | $HTTP_SERVER_VARS =& $_SERVER;
|  |  | 37 | } else {
34 | if (!is_array($HTTP_GET_VARS)) $HTTP_GET_VARS = array(); |  | 38 | if (!is_array($HTTP_GET_VARS)) $HTTP_GET_VARS = array();
35 | if (!is_array($HTTP_POST_VARS)) $HTTP_POST_VARS = array(); |  | 39 | if (!is_array($HTTP_POST_VARS)) $HTTP_POST_VARS = array();
36 | if (!is_array($HTTP_COOKIE_VARS)) $HTTP_COOKIE_VARS = array(); |  | 40 | if (!is_array($HTTP_COOKIE_VARS)) $HTTP_COOKIE_VARS = array();
|  |  | 41 | }
37 |  | = | 42 |
38 | // handle magic_quotes_gpc turned off. |  | 43 | // handle magic_quotes_gpc turned off.
39 | if (!get_magic_quotes_gpc()) { |  | 44 | if (!get_magic_quotes_gpc()) {
40 | do_magic_quotes_gpc($HTTP_GET_VARS); |  | 45 | do_magic_quotes_gpc($HTTP_GET_VARS);
41 | do_magic_quotes_gpc($HTTP_POST_VARS); |  | 46 | do_magic_quotes_gpc($HTTP_POST_VARS);
42 | do_magic_quotes_gpc($HTTP_COOKIE_VARS); |  | 47 | do_magic_quotes_gpc($HTTP_COOKIE_VARS);

File: catalog/includes/functions/sessions.php

98 | } | = | 98 | }
99 |  |  | 99 |
100 | function tep_session_register($variable) { |  | 100 | function tep_session_register($variable) {
101 | global $session_started; |  | 101 | global $session_started;
102 |  |  | 102 |
103 | if ($session_started == true) { |  | 103 | if ($session_started == true) {
|  | <> | 104 | if (PHP_VERSION < 4.3) {
104 | return session_register($variable); |  | 105 | return session_register($variable);
105 | } else { |  | 106 | } else {
|  |  | 107 | $_SESSION[$variable] = (isset($GLOBALS[$variable])) ? $GLOBALS[$variable] : null;
|  |  | 108 |
|  |  | 109 | $GLOBALS[$variable] =& $_SESSION[$variable];
106 | r eturn false; |  | 110 | }
107 | } | = | 111 | }
|  | -+ | 112 |
|  |  | 113 | return false;
108 | } | = | 114 | }
109 |  |  | 115 |
110 | function tep_session_is_registered($variable) { |  | 116 | function tep_session_is_registered($variable) {
|  | <> | 117 | if (PHP_VERSION < 4.3) {
111 | return session_is_registered($variable); |  | 118 | return session_is_registered($variable);
|  |  | 119 | } else {
|  |  | 120 | return isset($_SESSION[$variable]);
|  |  | 121 | }
112 | } | = | 122 | }
113 |  |  | 123 |
114 | function tep_session_unregister($variable) { |  | 124 | function tep_session_unregister($variable) {
|  | <> | 125 | if (PHP_VERSION < 4.3) {
115 | return session_unregister($variable); |  | 126 | return session_unregister($variable);
|  |  | 127 | } else {
|  |  | 128 | unset($_SESSION[$variable]);
|  |  | 129 | }
116 | } | = | 130 | }
117 |  |  | 131 |
118 | function tep_session_id($sessid = '') { |  | 132 | function tep_session_id($sessid = '') {
119 | if (!empty($sessid)) { |  | 133 | if (!empty($sessid)) {
120 | return session_id($sessid); |  | 134 | return session_id($sessid);
121 | } else { |  | 135 | } else {

File: catalog/includes/functions/html_output.php

155 | return $form; | = | 155 | return $form;
156 | } |  | 156 | }
157 |  |  | 157 |
158 | //// |  | 158 | ////
159 | // Output a form input field |  | 159 | // Output a form input field
160 | function tep_draw_input_field($name, $value = '', $parameters = '', $type = 'text', $reinsert_value = true) { |  | 160 | function tep_draw_input_field($name, $value = '', $parameters = '', $type = 'text', $reinsert_value = true) {
|  | -+ | 161 | global $HTTP_GET_VARS, $HTTP_POST_VARS;
|  |  | 162 |
161 | $field = '<input type="' . tep_output_string($type) . '" name="' . tep_output_string($name) . '"'; | = | 163 | $field = '<input type="' . tep_output_string($type) . '" name="' . tep_output_string($name) . '"';
162 |  |  | 164 |
163 | if ( (isset($GLOBALS[$name])) && ($reinsert_value == true) ) { | <> | 165 | if ( ($reinsert_value == true) && ( (isset($HTTP_GE T_VARS[$name]) && is_string($HTTP_GET_VARS[$na me])) || (isset($HT TP_POST_VARS[$name]) && is_string($HTTP_POST_VARS[$na me])) ) ) {
164 | $field .= ' value="' . tep_output_string(stripsl ashes($GLOBALS[$name])) . '"'; |  | 166 | if (isset($HTTP_GET_VARS[$name]) && is_string($HTTP_GET_VARS[$name])) {
|  |  | 167 | $value = stripslashes($HTTP_GET_VARS[$name]);
|  |  | 168 | } elseif (isset($HTTP_POST_VARS[$name]) && is_string($HTTP_POST_VARS[$name])) {
|  |  | 169 | $value = stripslashes($HTTP_POST_VARS[$name]);
|  |  | 170 | }
|  |  | 171 | }
|  |  | 172 |
165 | } elseif (tep_not_null($value)) { |  | 173 | if (tep_not_null($value)) {
166 | $field .= ' value="' . tep_output_string($value) . '"'; | = | 174 | $field .= ' value="' . tep_output_string($value) . '"';
167 | } |  | 175 | }
168 |  |  | 176 |
169 | if (tep_not_null($parameters)) $field .= ' ' . $parameters; |  | 177 | if (tep_not_null($parameters)) $field .= ' ' . $parameters;
170 |  |  | 178 |
171 | $field .= '>'; |  | 179 | $field .= '>';
179 | return tep_draw_input_field($name, $value, $parameters, 'password', false); | = | 187 | return tep_draw_input_field($name, $value, $parameters, 'password', false);
180 | } |  | 188 | }
181 |  |  | 189 |
182 | //// |  | 190 | ////
183 | // Output a selection field - alias function for tep_draw_checkbox_field() and tep_draw_radio_field() |  | 191 | // Output a selection field - alias function for tep_draw_checkbox_field() and tep_draw_radio_field()
184 | function tep_draw_selection_field($name, $type, $value = '', $checked = false, $parameters = '') { |  | 192 | function tep_draw_selection_field($name, $type, $value = '', $checked = false, $parameters = '') {
|  | -+ | 193 | global $HTTP_GET_VARS, $HTTP_POST_VARS;
|  |  | 194 |
185 | $selection = '<input type="' . tep_output_string($type) . '" name="' . tep_output_string($name) . '"'; | = | 195 | $selection = '<input type="' . tep_output_string($type) . '" name="' . tep_output_string($name) . '"';
186 |  |  | 196 |
187 | if (tep_not_null($value)) $selection .= ' value="' . tep_output_string($value) . '"'; |  | 197 | if (tep_not_null($value)) $selection .= ' value="' . tep_output_string($value) . '"';
188 |  |  | 198 |
189 | if ( ($checked == true) || ( isset($GLOBALS[$name]) && is_string($GLOBALS[$name]) && ( ($GLOBALS[$name] == 'on') || (isset($value) && (stripslashes($GLOBALS[$name]) == $value)) ) ) ) { | <> | 199 | if ( ($checked == true) || (isset($HTTP_GET_V ARS[$name]) && is_string($HTTP_GET_V ARS[$name]) && (($HTTP_GET_V ARS[$name] == 'on') || (str i p s la s h es($HTTP_GET_VARS[$name]) == $value))) || (isset($HTTP_POST_VARS[$name]) && is_string($HTTP_POST_VARS[$name]) && (($HTTP_POST_VARS[$name] == 'on') || (stripslashes($HT TP_P OS T_V ARS[$name]) == $value))) ) {
190 | $selection .= ' CHECKED'; | = | 200 | $selection .= ' CHECKED';
191 | } |  | 201 | }
192 |  |  | 202 |
193 | if (tep_not_null($parameters)) $selection .= ' ' . $parameters; |  | 203 | if (tep_not_null($parameters)) $selection .= ' ' . $parameters;
194 |  |  | 204 |
195 | $selection .= '>'; |  | 205 | $selection .= '>';
209 | return tep_draw_selection_field($name, 'radio', $value, $checked, $parameters); | = | 219 | return tep_draw_selection_field($name, 'radio', $value, $checked, $parameters);
210 | } |  | 220 | }
211 |  |  | 221 |
212 | //// |  | 222 | ////
213 | // Output a form textarea field |  | 223 | // Output a form textarea field
214 | function tep_draw_textarea_field($name, $wrap, $width, $height, $text = '', $parameters = '', $reinsert_value = true) { |  | 224 | function tep_draw_textarea_field($name, $wrap, $width, $height, $text = '', $parameters = '', $reinsert_value = true) {
|  | -+ | 225 | global $HTTP_GET_VARS, $HTTP_POST_VARS;
|  |  | 226 |
215 | $field = '<textarea name="' . tep_output_string($name) . '" wrap="' . tep_output_string($wrap) . '" cols="' . tep_output_string($width) . '" rows="' . tep_output_string($height) . '"'; | = | 227 | $field = '<textarea name="' . tep_output_string($name) . '" wrap="' . tep_output_string($wrap) . '" cols="' . tep_output_string($width) . '" rows="' . tep_output_string($height) . '"';
216 |  |  | 228 |
217 | if (tep_not_null($parameters)) $field .= ' ' . $parameters; |  | 229 | if (tep_not_null($parameters)) $field .= ' ' . $parameters;
218 |  |  | 230 |
219 | $field .= '>'; |  | 231 | $field .= '>';
220 |  |  | 232 |
221 | if ( (isset($GLOBALS[$name])) && ($reinsert_value == true) ) { | <> | 233 | if ( ($reinsert_value == true) && ( (isset($HTTP_GE T_VARS[$name]) && is_string($HTTP_GET_VARS[$na me])) || (isset($HT TP_POST_VARS[$name]) && is_string($HTTP_POST_VARS[$na me])) ) ) {
|  |  | 234 | if (isset($HTTP_GET_VARS[$name]) && is_string($HTTP_GET_VARS[$name])) {
222 | $field .= tep_output_string_protected(stripslashes($GLOBALS[$name])); |  | 235 | $field .= tep_output_string_protected(stripslashes($HTTP_GE T_VARS[$name]));
|  |  | 236 | } elseif (isset($HTTP_POST_VARS[$name]) && is_string($HTTP_POST_VARS[$name])) {
|  |  | 237 | $field .= tep_output_string_protected(stripslashes($HTTP_POST_VARS[$name]));
|  |  | 238 | }
223 | } elseif (tep_not_null($text)) { | = | 239 | } elseif (tep_not_null($text)) {
224 | $field .= tep_output_string_protected($text); |  | 240 | $field .= tep_output_string_protected($text);
225 | } |  | 241 | }
226 |  |  | 242 |
227 | $field .= '</textarea>'; |  | 243 | $field .= '</textarea>';
228 |  |  | 244 |
229 | return $field; |  | 245 | return $field;
230 | } |  | 246 | }
231 |  |  | 247 |
232 | //// |  | 248 | ////
233 | // Output a form hidden field |  | 249 | // Output a form hidden field
234 | function tep_draw_hidden_field($name, $value = '', $parameters = '') { |  | 250 | function tep_draw_hidden_field($name, $value = '', $parameters = '') {
|  | -+ | 251 | global $HTTP_GET_VARS, $HTTP_POST_VARS;
|  |  | 252 |
235 | $field = '<input type="hidden" name="' . tep_output_string($name) . '"'; | = | 253 | $field = '<input type="hidden" name="' . tep_output_string($name) . '"';
236 |  |  | 254 |
237 | if (tep_not_null($value)) { |  | 255 | if (tep_not_null($value)) {
238 | $field .= ' value="' . tep_output_string($value) . '"'; |  | 256 | $field .= ' value="' . tep_output_string($value) . '"';
239 | } elseif (isset($GLOBALS[$name])) { | <> | 257 | } elseif ( (isset($HTTP_GE T_VARS[$name]) && is_string($HTTP_GET_VARS[$name])) || (isset($HTTP_POST_VARS[$name]) && is_string($HTTP_POST_VARS[$name])) ) {
|  |  | 258 | if ( (isset($HTTP_GET_VARS[$name]) && is_string($HTTP_GET_VARS[$name])) ) {
240 | $field .= ' value="' . tep_output_string(stripslashes($GLOBALS[$name])) . '"'; |  | 259 | $field .= ' value="' . tep_output_string(stripslashes($HTTP_GE T_VARS[$name])) . '"';
|  |  | 260 | } elseif ( (isset($HTTP_POST_VARS[$name]) && is_string($HTTP_POST_VARS[$name])) ) {
|  |  | 261 | $field .= ' value="' . tep_output_string(stripslashes($HTTP_POST_VARS[$name])) . '"';
|  |  | 262 | }
241 | } | = | 263 | }
242 |  |  | 264 |
243 | if (tep_not_null($parameters)) $field .= ' ' . $parameters; |  | 265 | if (tep_not_null($parameters)) $field .= ' ' . $parameters;
244 |  |  | 266 |
245 | $field .= '>'; |  | 267 | $field .= '>';
246 |  |  | 268 |
257 | } | = | 279 | }
258 | } |  | 280 | }
259 |  |  | 281 |
260 | //// |  | 282 | ////
261 | // Output a form pull down menu |  | 283 | // Output a form pull down menu
262 | function tep_draw_pull_down_menu($name, $values, $default = '', $parameters = '', $required = false) { |  | 284 | function tep_draw_pull_down_menu($name, $values, $default = '', $parameters = '', $required = false) {
|  | -+ | 285 | global $HTTP_GET_VARS, $HTTP_POST_VARS;
|  |  | 286 |
263 | $field = '<select name="' . tep_output_string($name) . '"'; | = | 287 | $field = '<select name="' . tep_output_string($name) . '"';
264 |  |  | 288 |
265 | if (tep_not_null($parameters)) $field .= ' ' . $parameters; |  | 289 | if (tep_not_null($parameters)) $field .= ' ' . $parameters;
266 |  |  | 290 |
267 | $field .= '>'; |  | 291 | $field .= '>';
268 |  |  | 292 |
269 | if (empty($default) && isset($GLOBALS[$name])) $default = stripslashes($GLOBALS[$name]); | <> | 293 | if (empty($default) && ( (isset($HTTP_GET_VARS[$name]) && is_string($HTTP_GE T_VARS[$name])) || (isset($HTTP_POST_VARS[$na me]) && i s_strin g($HTTP_POST_VARS[$name])) ) ) {
|  |  | 294 | if (isset($HTTP_GET_VARS[$name]) && is_string($HTTP_GET_VARS[$name])) {
|  |  | 295 | $default = stripslashes($HTTP_GET_VARS[$name]);
|  |  | 296 | } elseif (isset($HTTP_POST_VARS[$name]) && is_string($HTTP_POST_VARS[$name])) {
|  |  | 297 | $default = stripslashes($HTTP_POST_VARS[$name]);
|  |  | 298 | }
|  |  | 299 | }
270 |  | = | 300 |
271 | for ($i=0, $n=sizeof($values); $i<$n; $i++) { |  | 301 | for ($i=0, $n=sizeof($values); $i<$n; $i++) {
272 | $field .= '<option value="' . tep_output_string($values[$i]['id']) . '"'; |  | 302 | $field .= '<option value="' . tep_output_string($values[$i]['id']) . '"';
273 | if ($default == $values[$i]['id']) { |  | 303 | if ($default == $values[$i]['id']) {
274 | $field .= ' SELECTED'; |  | 304 | $field .= ' SELECTED';
275 | } |  | 305 | }

File: catalog/includes/classes/order.php

128 |  | = | 128 |
129 | $index++; |  | 129 | $index++;
130 | } |  | 130 | }
131 | } |  | 131 | }
132 |  |  | 132 |
133 | function cart() { |  | 133 | function cart() {
134 | global $customer_id, $sendto, $billto, $cart, $languages_id, $currency, $currencies, $shipping, $payment; | <> | 134 | global $HTTP_POST_VARS, $customer_id, $sendto, $billto, $cart, $languages_id, $currency, $currencies, $shipping, $payment, $comments;
135 |  | = | 135 |
136 | $this->content_type = $cart->get_content_type(); |  | 136 | $this->content_type = $cart->get_content_type();
137 |  |  | 137 |
138 | $customer_address_query = tep_db_query("select c.customers_firstname, c.customers_lastname, c.customers_telephone, c.customers_email_address, ab.entry_company, ab.entry_street_address, ab.entry_suburb, ab.entry_postcode, ab.entry_city, ab.entry_zone_id, z.zone_name, co.countries_id, co.countries_name, co.countries_iso_code_2, co.countries_iso_code_3, co.address_format_id, ab.entry_state from " . TABLE_CUSTOMERS . " c, " . TABLE_ADDRESS_BOOK . " ab left join " . TABLE_ZONES . " z on (ab.entry_zone_id = z.zone_id) left join " . TABLE_COUNTRIES . " co on (ab.entry_country_id = co.countries_id) where c.customers_id = '" . (int)$customer_id . "' and ab.customers_id = '" . (int)$customer_id . "' and c.customers_default_address_id = ab.address_book_id"); |  | 138 | $customer_address_query = tep_db_query("select c.customers_firstname, c.customers_lastname, c.customers_telephone, c.customers_email_address, ab.entry_company, ab.entry_street_address, ab.entry_suburb, ab.entry_postcode, ab.entry_city, ab.entry_zone_id, z.zone_name, co.countries_id, co.countries_name, co.countries_iso_code_2, co.countries_iso_code_3, co.address_format_id, ab.entry_state from " . TABLE_CUSTOMERS . " c, " . TABLE_ADDRESS_BOOK . " ab left join " . TABLE_ZONES . " z on (ab.entry_zone_id = z.zone_id) left join " . TABLE_COUNTRIES . " co on (ab.entry_country_id = co.countries_id) where c.customers_id = '" . (int)$customer_id . "' and ab.customers_id = '" . (int)$customer_id . "' and c.customers_default_address_id = ab.address_book_id");
139 | $customer_address = tep_db_fetch_array($customer_address_query); |  | 139 | $customer_address = tep_db_fetch_array($customer_address_query);
140 |  |  | 140 |
148 | $tax_address = tep_db_fetch_array($tax_address_query); | = | 148 | $tax_address = tep_db_fetch_array($tax_address_query);
149 |  |  | 149 |
150 | $this->info = array('order_status' => DEFAULT_ORDERS_STATUS_ID, |  | 150 | $this->info = array('order_status' => DEFAULT_ORDERS_STATUS_ID,
151 | 'currency' => $currency, |  | 151 | 'currency' => $currency,
152 | 'currency_value' => $currencies->currencies[$currency]['value'], |  | 152 | 'currency_value' => $currencies->currencies[$currency]['value'],
153 | 'payment_method' => $payment, |  | 153 | 'payment_method' => $payment,
154 | 'cc_type' => (isset($GLOBALS['cc_type']) ? $GLOBALS['cc_type'] : ''), | <> | 154 | 'cc_type' => (isset($HTTP_POST_VARS['cc_type']) ? $HTTP_POST_VARS['cc_type'] : ''),
155 | 'cc_owner' => (isset($GLOBALS['cc_owner']) ? $GLOBALS['cc_owner'] : ''), |  | 155 | 'cc_owner' => (isset($HTTP_POST_VARS['cc_owner']) ? $HTTP_POST_VARS['cc_owner'] : ''),
156 | 'cc_number' => (isset($GLOBALS['cc_number']) ? $GLOBALS['cc_number'] : ''), |  | 156 | 'cc_number' => (isset($HTTP_POST_VARS['cc_number']) ? $HTTP_POST_VARS['cc_number'] : ''),
157 | 'cc_expires' => (isset($GLOBALS['cc_expires']) ? $GLOBALS['cc_expires'] : ''), |  | 157 | 'cc_expires' => (isset($HTTP_POST_VARS['cc_expires']) ? $HTTP_POST_VARS['cc_expires'] : ''),
158 | 'shipping_method' => $shipping['title'], | = | 158 | 'shipping_method' => $shipping['title'],
159 | 'shipping_cost' => $shipping['cost'], |  | 159 | 'shipping_cost' => $shipping['cost'],
160 | 'subtotal' => 0, |  | 160 | 'subtotal' => 0,
161 | 'tax' => 0, |  | 161 | 'tax' => 0,
162 | 'tax_groups' => array(), |  | 162 | 'tax_groups' => array(),
163 | 'comments' => (isset($GLOBALS['comments']) ? $GLOBALS['comments'] : '')); | <> | 163 | 'comments' => (te p_session_is_registered('comments') && !empty($comm ents) ? $comments : ''));
164 |  | = | 164 |
165 | if (isset($GLOBALS[$payment]) && is_object($GLOBALS[$payment])) { |  | 165 | if (isset($GLOBALS[$payment]) && is_object($GLOBALS[$payment])) {
166 | $this->info['payment_method'] = $GLOBALS[$payment]->title; |  | 166 | $this->info['payment_method'] = $GLOBALS[$payment]->title;
167 |  |  | 167 |
168 | if ( isset($GLOBALS[$payment]->order_status) && is_numeric($GLOBALS[$payment]->order_status) && ($GLOBALS[$payment]->order_status > 0) ) { |  | 168 | if ( isset($GLOBALS[$payment]->order_status) && is_numeric($GLOBALS[$payment]->order_status) && ($GLOBALS[$payment]->order_status > 0) ) {
169 | $this->info['order_status'] = $GLOBALS[$payment]->order_status; |  | 169 | $this->info['order_status'] = $GLOBALS[$payment]->order_status;

File: catalog/includes/modules/address_book_details.php

24 | <tr> | = | 24 | <tr>
25 | <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox"> |  | 25 | <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
26 | <tr class="infoBoxContents"> |  | 26 | <tr class="infoBoxContents">
27 | <td><table border="0" cellspacing="2" cellpadding="2"> |  | 27 | <td><table border="0" cellspacing="2" cellpadding="2">
28 | <?php |  | 28 | <?php
29 | if (ACCOUNT_GENDER == 'true') { |  | 29 | if (ACCOUNT_GENDER == 'true') {
|  | -+ | 30 | $male = $female = false;
30 | if (isset($gender)) { | = | 31 | if (isset($gender)) {
31 | $male = ($gender == 'm') ? true : false; |  | 32 | $male = ($gender == 'm') ? true : false;
32 | } else { | <> | 33 | $fem ale = !$male;
|  |  | 34 | } elseif (isset($entry['entry_gender'])) {
33 | $male = ($entry['entry_gender'] == 'm') ? true : false; | = | 35 | $male = ($entry['entry_gender'] == 'm') ? true : false;
|  | -+ | 36 | $female = !$male;
34 | } | = | 37 | }
35 | $female = !$male; | +- |  |
36 | ?> | = | 38 | ?>
37 | <tr> |  | 39 | <tr>
38 | <td class="main"><?php echo ENTRY_GENDER; ?></td> |  | 40 | <td class="main"><?php echo ENTRY_GENDER; ?></td>
39 | <td class="main"><?php echo tep_draw_radio_field('gender', 'm', $male) . '&nbsp;&nbsp;' . MALE . '&nbsp;&nbsp;' . tep_draw_radio_field('gender', 'f', $female) . '&nbsp;&nbsp;' . FEMALE . '&nbsp;' . (tep_not_null(ENTRY_GENDER_TEXT) ? '<span class="inputRequirement">' . ENTRY_GENDER_TEXT . '</span>': ''); ?></td> |  | 41 | <td class="main"><?php echo tep_draw_radio_field('gender', 'm', $male) . '&nbsp;&nbsp;' . MALE . '&nbsp;&nbsp;' . tep_draw_radio_field('gender', 'f', $female) . '&nbsp;&nbsp;' . FEMALE . '&nbsp;' . (tep_not_null(ENTRY_GENDER_TEXT) ? '<span class="inputRequirement">' . ENTRY_GENDER_TEXT . '</span>': ''); ?></td>
40 | </tr> |  | 42 | </tr>
41 | <?php |  | 43 | <?php

File: catalog/checkout_payment.php

62 | } | = | 62 | }
63 |  |  | 63 |
64 | require(DIR_WS_CLASSES . 'order.php'); |  | 64 | require(DIR_WS_CLASSES . 'order.php');
65 | $order = new order; |  | 65 | $order = new order;
66 |  |  | 66 |
67 | if (!tep_session_is_registered('comments')) tep_session_register('comments'); |  | 67 | if (!tep_session_is_registered('comments')) tep_session_register('comments');
|  | -+ | 68 | if (isset($HTTP_POST_VARS['comments']) && tep_not_null($HTTP_POST_VARS['comments'])) {
|  |  | 69 | $comments = tep_db_prepare_input($HTTP_POST_VARS['comments']);
|  |  | 70 | }
68 |  | = | 71 |
69 | $total_weight = $cart->show_weight(); |  | 72 | $total_weight = $cart->show_weight();
70 | $total_count = $cart->count_contents(); |  | 73 | $total_count = $cart->count_contents();
71 |  |  | 74 |
72 | // load all enabled payment modules |  | 75 | // load all enabled payment modules
73 | require(DIR_WS_CLASSES . 'payment.php'); |  | 76 | require(DIR_WS_CLASSES . 'payment.php');
319 | </tr> | = | 322 | </tr>
320 | <tr> |  | 323 | <tr>
321 | <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox"> |  | 324 | <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
322 | <tr class="infoBoxContents"> |  | 325 | <tr class="infoBoxContents">
323 | <td><table border="0" width="100%" cellspacing="0" cellpadding="2"> |  | 326 | <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
324 | <tr> |  | 327 | <tr>
325 | <td><?php echo tep_draw_textarea_field('comments', 'soft', '60', '5'); ?></td> | <> | 328 | <td><?php echo tep_draw_textarea_field('comments', 'soft', '60', '5', $comments); ?></td>
326 | </tr> | = | 329 | </tr>
327 | </table></td> |  | 330 | </table></td>
328 | </tr> |  | 331 | </tr>
329 | </table></td> |  | 332 | </table></td>
330 | </tr> |  | 333 | </tr>
331 | <tr> |  | 334 | <tr>

File: catalog/admin/includes/application_top.php

13 | // Start the clock for the page parse time log | = | 13 | // Start the clock for the page parse time log
14 | define('PAGE_PARSE_START_TIME', microtime()); |  | 14 | define('PAGE_PARSE_START_TIME', microtime());
15 |  |  | 15 |
16 | // Set the level of error reporting |  | 16 | // Set the level of error reporting
17 | error_reporting(E_ALL & ~E_NOTICE); |  | 17 | error_reporting(E_ALL & ~E_NOTICE);
18 |  |  | 18 |
19 | // Check if register_globals is enabled. | <> | 19 | // check support for register_globals
20 | // Since this is a te mporary measure this message is hardcoded. The requirement wil l be removed before 2.2 is f inalized. |  | 20 | if (function_exists('ini_get') && (ini_get('register_globals') == false) && (PHP_VERSION < 4.3) ) {
21 | if (function_exists('ini_get')) { |  | 21 | exit('Server Requirement Error: register_globals is disabled in your PHP co nfiguration. This can be enabled in your php.ini configuration file or in the .htaccess file in your catalog directory. Please use PHP 4.3+ if register_globals cann ot be e nabled on the server.');
22 | ini_get('register_globals') or exit('Server Requirement Error: register_globals is disabled in your PHP configuration. This can be enabled in your php.ini configuration file or in the .htaccess file in your catalog directory.'); |  |  |
23 | } | = | 22 | }
24 |  |  | 23 |
25 | // Set the local configuration parameters - mainly for developers |  | 24 | // Set the local configuration parameters - mainly for developers
26 | if (file_exists('includes/local/configure.php')) include('includes/local/configure.php'); |  | 25 | if (file_exists('includes/local/configure.php')) include('includes/local/configure.php');
27 |  |  | 26 |
28 | // Include application configuration parameters |  | 27 | // Include application configuration parameters
29 | require('includes/configure.php'); |  | 28 | require('includes/configure.php');
30 |  |  | 29 |
31 | // Define the project version |  | 30 | // Define the project version
32 | define('PROJECT_VERSION', 'osCommerce 2.2-MS2'); |  | 31 | define('PROJECT_VERSION', 'osCommerce 2.2-MS2');
|  | -+ | 32 |
|  |  | 33 | // some code to solve compatibility issues
|  |  | 34 | require(DIR_WS_FUNCTIONS . 'compatibility.php');
33 |  | = | 35 |
34 | // set php_self in the local scope |  | 36 | // set php_self in the local scope
35 | $PHP_SELF = (isset($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : $HTTP_SERVER_VARS['SCRIPT_NAME']); |  | 37 | $PHP_SELF = (isset($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : $HTTP_SERVER_VARS['SCRIPT_NAME']);
36 |  |  | 38 |
37 | // Used in the "Backup Manager" to compress backups |  | 39 | // Used in the "Backup Manager" to compress backups
38 | define('LOCAL_EXE_GZIP', '/usr/bin/gzip'); |  | 40 | define('LOCAL_EXE_GZIP', '/usr/bin/gzip');
73 | // initialize the logger class | = | 75 | // initialize the logger class
74 | require(DIR_WS_CLASSES . 'logger.php'); |  | 76 | require(DIR_WS_CLASSES . 'logger.php');
75 |  |  | 77 |
76 | // include shopping cart class |  | 78 | // include shopping cart class
77 | require(DIR_WS_CLASSES . 'shopping_cart.php'); |  | 79 | require(DIR_WS_CLASSES . 'shopping_cart.php');
78 |  |  | 80 |
79 | // some code to solve compatibility issues | +- |  |
80 | require(DIR_WS_FUNCTIONS . 'compatibility.php'); |  |  |
81 |  |  |  |
82 | // check to see if php implemented session management functions - if not, include php3/php4 compatible session class | = | 81 | // check to see if php implemented session management functions - if not, include php3/php4 compatible session class
83 | if (!function_exists('session_start')) { |  | 82 | if (!function_exists('session_start')) {
84 | define('PHP_SESSION_NAME', 'osCAdminID'); |  | 83 | define('PHP_SESSION_NAME', 'osCAdminID');
85 | define('PHP_SESSION_PATH', '/'); |  | 84 | define('PHP_SESSION_PATH', '/');
86 | define('PHP_SESSION_SAVE_PATH', SESSION_WRITE_DIRECTORY); |  | 85 | define('PHP_SESSION_SAVE_PATH', SESSION_WRITE_DIRECTORY);
87 |  |  | 86 |
102 | ini_set('session.cookie_lifetime', '0'); | = | 101 | ini_set('session.cookie_lifetime', '0');
103 | ini_set('session.cookie_path', DIR_WS_ADMIN); |  | 102 | ini_set('session.cookie_path', DIR_WS_ADMIN);
104 | } |  | 103 | }
105 |  |  | 104 |
106 | // lets start our session |  | 105 | // lets start our session
107 | tep_session_start(); |  | 106 | tep_session_start();
|  | -+ | 107 |
|  |  | 108 | if ( (PHP_VERSION >= 4.3) && function_exists('ini_get') && (ini_get('register_globals') == false) ) {
|  |  | 109 | extract($_SESSION, EXTR_OVERWRITE+EXTR_REFS);
|  |  | 110 | }
108 |  | = | 111 |
109 | // set the language |  | 112 | // set the language
110 | if (!tep_session_is_registered('language') || isset($HTTP_GET_VARS['language'])) { |  | 113 | if (!tep_session_is_registered('language') || isset($HTTP_GET_VARS['language'])) {
111 | if (!tep_session_is_registered('language')) { |  | 114 | if (!tep_session_is_registered('language')) {
112 | tep_session_register('language'); |  | 115 | tep_session_register('language');
113 | tep_session_register('languages_id'); |  | 116 | tep_session_register('languages_id');

File: catalog/admin/includes/functions/compatibility.php

24 | } else { | = | 24 | } else {
25 | $ar[$key] = addslashes($value); |  | 25 | $ar[$key] = addslashes($value);
26 | } |  | 26 | }
27 | } |  | 27 | }
28 | } |  | 28 | }
29 |  |  | 29 |
30 | // $HTTP_x xx_VARS are always s et on php4 | <> | 30 | if (PHP_VERSION >= 4.1) {
|  |  | 31 | $HTTP_GET_VARS =& $_GET;
|  |  | 32 | $HTTP_POST_VARS =& $_POST;
|  |  | 33 | $HTTP_COOKIE_VARS =& $_COOKIE;
|  |  | 34 | $HTTP_SESSION_VARS =& $_SESSION;
|  |  | 35 | $HTTP_POST_FILES =& $_FILES;
|  |  | 36 | $HTTP_SERVER_VARS =& $_SERVER;
|  |  | 37 | } else {
31 | if (!is_array($HTTP_GET_VARS)) $HTTP_GET_VARS = array(); |  | 38 | if (!is_array($HTTP_GET_VARS)) $HTTP_GET_VARS = array();
32 | if (!is_array($HTTP_POST_VARS)) $HTTP_POST_VARS = array(); |  | 39 | if (!is_array($HTTP_POST_VARS)) $HTTP_POST_VARS = array();
33 | if (!is_array($HTTP_COOKIE_VARS)) $HTTP_COOKIE_VARS = array(); |  | 40 | if (!is_array($HTTP_COOKIE_VARS)) $HTTP_COOKIE_VARS = array();
|  |  | 41 | }
34 |  | = | 42 |
35 | // handle magic_quotes_gpc turned off. |  | 43 | // handle magic_quotes_gpc turned off.
36 | if (!get_magic_quotes_gpc()) { |  | 44 | if (!get_magic_quotes_gpc()) {
37 | do_magic_quotes_gpc($HTTP_GET_VARS); |  | 45 | do_magic_quotes_gpc($HTTP_GET_VARS);
38 | do_magic_quotes_gpc($HTTP_POST_VARS); |  | 46 | do_magic_quotes_gpc($HTTP_POST_VARS);
39 | do_magic_quotes_gpc($HTTP_COOKIE_VARS); |  | 47 | do_magic_quotes_gpc($HTTP_COOKIE_VARS);

File: catalog/admin/includes/functions/sessions.php

21 |  | = | 21 |
22 | function _sess_close() { |  | 22 | function _sess_close() {
23 | return true; |  | 23 | return true;
24 | } |  | 24 | }
25 |  |  | 25 |
26 | function _sess_read($key) { |  | 26 | function _sess_read($key) {
27 | $qid = tep_db_query("select value from " . TABLE_SESSIONS . " where sesskey = '" . tep_db_input($key) . "' and expiry > '" . time() . "'"); | <> | 27 | $value_que ry = tep_db_query("select value from " . TABLE_SESSIONS . " where sesskey = '" . tep_db_input($key) . "' and expiry > '" . time() . "'");
|  |  | 28 | $value = tep_db_fetch_array($value_query);
28 |  | = | 29 |
29 | $value = tep_db_fetch_array($qid); | <> |  |
30 | if ($value['value']) { |  | 30 | if (isset($value['value'])) {
31 | return $value['value']; | = | 31 | return $value['value'];
32 | } |  | 32 | }
33 |  |  | 33 |
34 | return false; |  | 34 | return false;
35 | } |  | 35 | }
36 |  |  | 36 |
37 | function _sess_write($key, $val) { |  | 37 | function _sess_write($key, $val) {
38 | global $SESS_LIFE; |  | 38 | global $SESS_LIFE;
39 |  |  | 39 |
40 | $expiry = time() + $SESS_LIFE; |  | 40 | $expiry = time() + $SESS_LIFE;
41 | $value = $val; |  | 41 | $value = $val;
42 |  |  | 42 |
43 | $qid = tep_db_query("select count(*) as total from " . TABLE_SESSIONS . " where sesskey = '" . tep_db_input($key) . "'"); | <> | 43 | $check_que ry = tep_db_query("select count(*) as total from " . TABLE_SESSIONS . " where sesskey = '" . tep_db_input($key) . "'");
44 | $total = tep_db_fetch_array($qid); |  | 44 | $check = tep_db_fetch_array($check_que ry);
45 |  | = | 45 |
46 | if ($total['total'] > 0) { | <> | 46 | if ($check['total'] > 0) {
47 | return tep_db_query("update " . TABLE_SESSIONS . " set expiry = '" . tep_db_input($expiry) . "', value = '" . tep_db_input($value) . "' where sesskey = '" . tep_db_input($key) . "'"); | = | 47 | return tep_db_query("update " . TABLE_SESSIONS . " set expiry = '" . tep_db_input($expiry) . "', value = '" . tep_db_input($value) . "' where sesskey = '" . tep_db_input($key) . "'");
48 | } else { |  | 48 | } else {
49 | return tep_db_query("insert into " . TABLE_SESSIONS . " values ('" . tep_db_input($key) . "', '" . tep_db_input($expiry) . "', '" . tep_db_input($value) . "')"); |  | 49 | return tep_db_query("insert into " . TABLE_SESSIONS . " values ('" . tep_db_input($key) . "', '" . tep_db_input($expiry) . "', '" . tep_db_input($value) . "')");
50 | } |  | 50 | }
51 | } |  | 51 | }
52 |  |  | 52 |
61 | } | = | 61 | }
62 |  |  | 62 |
63 | session_set_save_handler('_sess_open', '_sess_close', '_sess_read', '_sess_write', '_sess_destroy', '_sess_gc'); |  | 63 | session_set_save_handler('_sess_open', '_sess_close', '_sess_read', '_sess_write', '_sess_destroy', '_sess_gc');
64 | } |  | 64 | }
65 |  |  | 65 |
66 | function tep_session_start() { |  | 66 | function tep_session_start() {
|  | -+ | 67 | global $HTTP_GET_VARS, $HTTP_POST_VARS, $HTTP_COOKIE_VARS;
|  |  | 68 |
|  |  | 69 | $sane_session_id = true;
|  |  | 70 |
|  |  | 71 | if (isset($HTTP_GET_VARS[tep_session_name()])) {
|  |  | 72 | if (preg_match('/^[a-zA-Z0-9]+$/', $HTTP_GET_VARS[tep_session_name()]) == false) {
|  |  | 73 | unset($HTTP_GET_VARS[tep_session_name()]);
|  |  | 74 |
|  |  | 75 | $sane_session_id = false;
|  |  | 76 | }
|  |  | 77 | } elseif (isset($HTTP_POST_VARS[tep_session_name()])) {
|  |  | 78 | if (preg_match('/^[a-zA-Z0-9]+$/', $HTTP_POST_VARS[tep_session_name()]) == false) {
|  |  | 79 | unset($HTTP_POST_VARS[tep_session_name()]);
|  |  | 80 |
|  |  | 81 | $sane_session_id = false;
|  |  | 82 | }
|  |  | 83 | } elseif (isset($HTTP_COOKIE_VARS[tep_session_name()])) {
|  |  | 84 | if (preg_match('/^[a-zA-Z0-9]+$/', $HTTP_COOKIE_VARS[tep_session_name()]) == false) {
|  |  | 85 | $session_data = session_get_cookie_params();
|  |  | 86 |
|  |  | 87 | setcookie(tep_session_name(), '', time()-42000, $session_data['path'], $session_data['domain']);
|  |  | 88 |
|  |  | 89 | $sane_session_id = false;
|  |  | 90 | }
|  |  | 91 | }
|  |  | 92 |
|  |  | 93 | if ($sane_session_id == false) {
|  |  | 94 | tep_redirect(tep_href_link(FILENAME_DEFAULT, '', 'NONSSL', false));
|  |  | 95 | }
|  |  | 96 |
67 | return session_start(); | = | 97 | return session_start();
68 | } |  | 98 | }
69 |  |  | 99 |
70 | function tep_session_register($variable) { |  | 100 | function tep_session_register($variable) {
|  | <> | 101 | if (PHP_VERSION < 4.3) {
71 | return session_register($variable); |  | 102 | return session_register($variable);
|  |  | 103 | } else {
|  |  | 104 | if (isset($GLOBALS[$variable])) {
|  |  | 105 | $_SESSION[$variable] =& $GLOBALS[$variable];
|  |  | 106 | } else {
|  |  | 107 | $_SESSION[$variable] = null;
|  |  | 108 | }
|  |  | 109 | $GLOBALS[$variable] =& $_SESSION[$variable];
|  |  | 110 | }
|  |  | 111 |
|  |  | 112 | return false;
72 | } | = | 113 | }
73 |  |  | 114 |
74 | function tep_session_is_registered($variable) { |  | 115 | function tep_session_is_registered($variable) {
|  | <> | 116 | if (PHP_VERSION < 4.3) {
75 | return session_is_registered($variable); |  | 117 | return session_is_registered($variable);
|  |  | 118 | } else {
|  |  | 119 | return isset($_SESSION[$variable]);
|  |  | 120 | }
76 | } | = | 121 | }
77 |  |  | 122 |
78 | function tep_session_unregister($variable) { |  | 123 | function tep_session_unregister($variable) {
|  | <> | 124 | if (PHP_VERSION < 4.3) {
79 | return session_unregister($variable); |  | 125 | return session_unregister($variable);
|  |  | 126 | } else {
|  |  | 127 | unset($_SESSION[$variable]);
|  |  | 128 | }
80 | } | = | 129 | }
81 |  |  | 130 |
82 | function tep_session_id($sessid = '') { |  | 131 | function tep_session_id($sessid = '') {
83 | if ($sessid != '') { |  | 132 | if ($sessid != '') {
84 | return session_id($sessid); |  | 133 | return session_id($sessid);
85 | } else { |  | 134 | } else {
93 | } else { | = | 142 | } else {
94 | return session_name(); |  | 143 | return session_name();
95 | } |  | 144 | }
96 | } |  | 145 | }
97 |  |  | 146 |
98 | function tep_session_close() { |  | 147 | function tep_session_close() {
|  | <> | 148 | if (PHP_VERSION >= '4.0.4') {
|  |  | 149 | return session_write_close();
99 | if (function_exists('session_close')) { |  | 150 | } elseif (function_exists('session_close')) {
100 | return session_close(); | = | 151 | return session_close();
101 | } |  | 152 | }
102 | } |  | 153 | }
103 |  |  | 154 |
104 | function tep_session_destroy() { |  | 155 | function tep_session_destroy() {
105 | return session_destroy(); |  | 156 | return session_destroy();

File: catalog/admin/includes/functions/html_output.php

167 | return $form; | = | 167 | return $form;
168 | } |  | 168 | }
169 |  |  | 169 |
170 | //// |  | 170 | ////
171 | // Output a form input field |  | 171 | // Output a form input field
172 | function tep_draw_input_field($name, $value = '', $parameters = '', $required = false, $type = 'text', $reinsert_value = true) { |  | 172 | function tep_draw_input_field($name, $value = '', $parameters = '', $required = false, $type = 'text', $reinsert_value = true) {
|  | -+ | 173 | global $HTTP_GET_VARS, $HTTP_POST_VARS;
|  |  | 174 |
173 | $field = '<input type="' . tep_output_string($type) . '" name="' . tep_output_string($name) . '"'; | = | 175 | $field = '<input type="' . tep_output_string($type) . '" name="' . tep_output_string($name) . '"';
174 |  |  | 176 |
175 | if (isset($GLOBALS[$name]) && ($reinsert_value == true) && is_string($GLOBALS[$name])) { | <> | 177 | if ( ($reinsert_value == true) && ( (isset($HTTP_GE T_VARS[$name]) && is_string($HTTP_GET_VARS[$na me])) || (isset($HT TP_PO ST_VARS[$name]) && is_string($HTTP_POST_VARS[$name])) ) ) {
176 | $field .= ' value="' . tep_output_string(stripsl ashes($GLOBALS[$name])) . '"'; |  | 178 | if (isset($HTTP_GET_VARS[$name]) && is_string($HTTP_GET_VARS[$name])) {
|  |  | 179 | $value = stripslashes($HTTP_GET_VARS[$name]);
|  |  | 180 | } elseif (isset($HTTP_POST_VARS[$name]) && is_string($HTTP_POST_VARS[$name])) {
|  |  | 181 | $value = stripslashes($HTTP_POST_VARS[$name]);
|  |  | 182 | }
|  |  | 183 | }
|  |  | 184 |
177 | } elseif (tep_not_null($value)) { |  | 185 | if (tep_not_null($value)) {
178 | $field .= ' value="' . tep_output_string($value) . '"'; | = | 186 | $field .= ' value="' . tep_output_string($value) . '"';
179 | } |  | 187 | }
180 |  |  | 188 |
181 | if (tep_not_null($parameters)) $field .= ' ' . $parameters; |  | 189 | if (tep_not_null($parameters)) $field .= ' ' . $parameters;
182 |  |  | 190 |
183 | $field .= '>'; |  | 191 | $field .= '>';
203 | return $field; | = | 211 | return $field;
204 | } |  | 212 | }
205 |  |  | 213 |
206 | //// |  | 214 | ////
207 | // Output a selection field - alias function for tep_draw_checkbox_field() and tep_draw_radio_field() |  | 215 | // Output a selection field - alias function for tep_draw_checkbox_field() and tep_draw_radio_field()
208 | function tep_draw_selection_field($name, $type, $value = '', $checked = false, $compare = '') { |  | 216 | function tep_draw_selection_field($name, $type, $value = '', $checked = false, $compare = '') {
|  | -+ | 217 | global $HTTP_GET_VARS, $HTTP_POST_VARS;
|  |  | 218 |
209 | $selection = '<input type="' . tep_output_string($type) . '" name="' . tep_output_string($name) . '"'; | = | 219 | $selection = '<input type="' . tep_output_string($type) . '" name="' . tep_output_string($name) . '"';
210 |  |  | 220 |
211 | if (tep_not_null($value)) $selection .= ' value="' . tep_output_string($value) . '"'; |  | 221 | if (tep_not_null($value)) $selection .= ' value="' . tep_output_string($value) . '"';
212 |  |  | 222 |
213 | if ( ($checked == true) || (isset($GLOBALS[$name]) && is_string($GLOBALS[$name]) && ($GLOBALS[$name] == 'on')) || (isset($value) && iss e t($GLOBALS[$name]) && (stripslashes($GLOBALS[$name]) == $value)) || (tep_not_null($value) && tep_not_null($compare) && ($value == $compare)) ) { | <> | 223 | if ( ($checked == true) || (isset($HTTP_GET_V ARS[$name]) && is_string($HTTP_GET_V ARS[$name]) && (($HTTP_GET_V ARS[$name] == 'on') || (str i p s la s h es($HTTP_GET_VARS[$name]) == $value))) || (isset($HTTP_POST_VARS[$name]) && is_st ring($HT TP_P OS T_V ARS[$name]) && (($HTTP_POST_VARS[$name] == 'on') || (stripslashes($HT TP_P OS T_V ARS[$name]) == $value))) || (tep_not_null($compare) && ($value == $compare)) ) {
214 | $selection .= ' CHECKED'; | = | 224 | $selection .= ' CHECKED';
215 | } |  | 225 | }
216 |  |  | 226 |
217 | $selection .= '>'; |  | 227 | $selection .= '>';
218 |  |  | 228 |
219 | return $selection; |  | 229 | return $selection;
231 | return tep_draw_selection_field($name, 'radio', $value, $checked, $compare); | = | 241 | return tep_draw_selection_field($name, 'radio', $value, $checked, $compare);
232 | } |  | 242 | }
233 |  |  | 243 |
234 | //// |  | 244 | ////
235 | // Output a form textarea field |  | 245 | // Output a form textarea field
236 | function tep_draw_textarea_field($name, $wrap, $width, $height, $text = '', $parameters = '', $reinsert_value = true) { |  | 246 | function tep_draw_textarea_field($name, $wrap, $width, $height, $text = '', $parameters = '', $reinsert_value = true) {
|  | -+ | 247 | global $HTTP_GET_VARS, $HTTP_POST_VARS;
|  |  | 248 |
237 | $field = '<textarea name="' . tep_output_string($name) . '" wrap="' . tep_output_string($wrap) . '" cols="' . tep_output_string($width) . '" rows="' . tep_output_string($height) . '"'; | = | 249 | $field = '<textarea name="' . tep_output_string($name) . '" wrap="' . tep_output_string($wrap) . '" cols="' . tep_output_string($width) . '" rows="' . tep_output_string($height) . '"';
238 |  |  | 250 |
239 | if (tep_not_null($parameters)) $field .= ' ' . $parameters; |  | 251 | if (tep_not_null($parameters)) $field .= ' ' . $parameters;
240 |  |  | 252 |
241 | $field .= '>'; |  | 253 | $field .= '>';
242 |  |  | 254 |
243 | if ( (isset($GLOBALS[$name])) && ($reinsert_value == true) ) { | <> | 255 | if ( ($reinsert_value == true) && ( (isset($HTTP_GE T_VARS[$name]) && is_string($HTTP_GET_VARS[$na me])) || (isset($HT TP_POST_VARS[$name]) && is_string($HTTP_POST_VARS[$na me])) ) ) {
|  |  | 256 | if (isset($HTTP_GET_VARS[$name]) && is_string($HTTP_GET_VARS[$name])) {
244 | $field .= tep_output_string_protected(stripslashes($GLOBALS[$name])); |  | 257 | $field .= tep_output_string_protected(stripslashes($HTTP_GE T_VARS[$name]));
|  |  | 258 | } elseif (isset($HTTP_POST_VARS[$name]) && is_string($HTTP_POST_VARS[$name])) {
|  |  | 259 | $field .= tep_output_string_protected(stripslashes($HTTP_POST_VARS[$name]));
|  |  | 260 | }
245 | } elseif (tep_not_null($text)) { | = | 261 | } elseif (tep_not_null($text)) {
246 | $field .= tep_output_string_protected($text); |  | 262 | $field .= tep_output_string_protected($text);
247 | } |  | 263 | }
248 |  |  | 264 |
249 | $field .= '</textarea>'; |  | 265 | $field .= '</textarea>';
250 |  |  | 266 |
251 | return $field; |  | 267 | return $field;
252 | } |  | 268 | }
253 |  |  | 269 |
254 | //// |  | 270 | ////
255 | // Output a form hidden field |  | 271 | // Output a form hidden field
256 | function tep_draw_hidden_field($name, $value = '', $parameters = '') { |  | 272 | function tep_draw_hidden_field($name, $value = '', $parameters = '') {
|  | -+ | 273 | global $HTTP_GET_VARS, $HTTP_POST_VARS;
|  |  | 274 |
257 | $field = '<input type="hidden" name="' . tep_output_string($name) . '"'; | = | 275 | $field = '<input type="hidden" name="' . tep_output_string($name) . '"';
258 |  |  | 276 |
259 | if (tep_not_null($value)) { |  | 277 | if (tep_not_null($value)) {
260 | $field .= ' value="' . tep_output_string($value) . '"'; |  | 278 | $field .= ' value="' . tep_output_string($value) . '"';
261 | } elseif (isset($GLOBALS[$name]) && is_string($GLOBALS[$name])) { | <> | 279 | } elseif ( (isset($HTTP_GE T_VARS[$name]) && is_string($HTTP_GE T_VARS[$name])) || (isset($HTTP_POST_VARS[$name]) && is_string($HTTP_POST_VARS[$name])) ) {
|  |  | 280 | if ( (isset($HTTP_GET_VARS[$name]) && is_string($HTTP_GET_VARS[$name])) ) {
262 | $field .= ' value="' . tep_output_string(stripslashes($GLOBALS[$name])) . '"'; |  | 281 | $field .= ' value="' . tep_output_string(stripslashes($HTTP_GE T_VARS[$name])) . '"';
|  |  | 282 | } elseif ( (isset($HTTP_POST_VARS[$name]) && is_string($HTTP_POST_VARS[$name])) ) {
|  |  | 283 | $field .= ' value="' . tep_output_string(stripslashes($HTTP_POST_VARS[$name])) . '"';
|  |  | 284 | }
263 | } | = | 285 | }
264 |  |  | 286 |
265 | if (tep_not_null($parameters)) $field .= ' ' . $parameters; |  | 287 | if (tep_not_null($parameters)) $field .= ' ' . $parameters;
266 |  |  | 288 |
267 | $field .= '>'; |  | 289 | $field .= '>';
268 |  |  | 290 |
269 | return $field; |  | 291 | return $field;
270 | } |  | 292 | }
271 |  |  | 293 |
272 | //// |  | 294 | ////
273 | // Output a form pull down menu |  | 295 | // Output a form pull down menu
274 | function tep_draw_pull_down_menu($name, $values, $default = '', $parameters = '', $required = false) { |  | 296 | function tep_draw_pull_down_menu($name, $values, $default = '', $parameters = '', $required = false) {
|  | -+ | 297 | global $HTTP_GET_VARS, $HTTP_POST_VARS;
|  |  | 298 |
275 | $field = '<select name="' . tep_output_string($name) . '"'; | = | 299 | $field = '<select name="' . tep_output_string($name) . '"';
276 |  |  | 300 |
277 | if (tep_not_null($parameters)) $field .= ' ' . $parameters; |  | 301 | if (tep_not_null($parameters)) $field .= ' ' . $parameters;
278 |  |  | 302 |
279 | $field .= '>'; |  | 303 | $field .= '>';
280 |  |  | 304 |
281 | if (empty($default) && isset($GLOBALS[$name])) $default = stripslashes($GLOBALS[$name]); | <> | 305 | if (empty($default) && ( (isset($HTTP_GET_VARS[$name]) && is_string($HTTP_GE T_VARS[$name])) || (isset($HTTP_POST_VARS[$na me]) && i s_strin g($HTTP_POST_VARS[$name])) ) ) {
|  |  | 306 | if (isset($HTTP_GET_VARS[$name]) && is_string($HTTP_GET_VARS[$name])) {
|  |  | 307 | $default = stripslashes($HTTP_GET_VARS[$name]);
|  |  | 308 | } elseif (isset($HTTP_POST_VARS[$name]) && is_string($HTTP_POST_VARS[$name])) {
|  |  | 309 | $default = stripslashes($HTTP_POST_VARS[$name]);
|  |  | 310 | }
|  |  | 311 | }
282 |  | = | 312 |
283 | for ($i=0, $n=sizeof($values); $i<$n; $i++) { |  | 313 | for ($i=0, $n=sizeof($values); $i<$n; $i++) {
284 | $field .= '<option value="' . tep_output_string($values[$i]['id']) . '"'; |  | 314 | $field .= '<option value="' . tep_output_string($values[$i]['id']) . '"';
285 | if ($default == $values[$i]['id']) { |  | 315 | if ($default == $values[$i]['id']) {
286 | $field .= ' SELECTED'; |  | 316 | $field .= ' SELECTED';
287 | } |  | 317 | }

File: catalog/admin/includes/classes/upload.php

30 | return false; | = | 30 | return false;
31 | } |  | 31 | }
32 | } |  | 32 | }
33 | } |  | 33 | }
34 |  |  | 34 |
35 | function parse() { |  | 35 | function parse() {
36 | global $messageStack; | <> | 36 | global $HTTP_POST_FILES, $messageStack;
37 |  | = | 37 |
|  | -+ | 38 | $file = array();
|  |  | 39 |
38 | if (isset($_FILES[$this->file])) { | = | 40 | if (isset($_FILES[$this->file])) {
39 | $file = array('name' => $_FILES[$this->file]['name'], |  | 41 | $file = array('name' => $_FILES[$this->file]['name'],
40 | 'type' => $_FILES[$this->file]['type'], |  | 42 | 'type' => $_FILES[$this->file]['type'],
41 | 'size' => $_FILES[$this->file]['size'], |  | 43 | 'size' => $_FILES[$this->file]['size'],
42 | 'tmp_name' => $_FILES[$this->file]['tmp_name']); |  | 44 | 'tmp_name' => $_FILES[$this->file]['tmp_name']);
43 | } elseif (isset($GLOBALS['HTTP_POST_FILES'][$this->file])) { | <> | 45 | } elseif (isset($HTTP_POST_FILES[$this->file])) {
44 | global $HTTP_POST_FILES; |  |  |
45 |  |  |  |
46 | $file = array('name' => $HTTP_POST_FILES[$this->file]['name'], | = | 46 | $file = array('name' => $HTTP_POST_FILES[$this->file]['name'],
47 | 'type' => $HTTP_POST_FILES[$this->file]['type'], |  | 47 | 'type' => $HTTP_POST_FILES[$this->file]['type'],
48 | 'size' => $HTTP_POST_FILES[$this->file]['size'], |  | 48 | 'size' => $HTTP_POST_FILES[$this->file]['size'],
49 | 'tmp_name' => $HTTP_POST_FILES[$this->file]['tmp_name']); |  | 49 | 'tmp_name' => $HTTP_POST_FILES[$this->file]['tmp_name']);
50 | } else { | +- |  |
51 | $file = array('name' => (isset($GLOBALS[$this->file . '_name']) ? $GLOBALS[$this->file . '_name'] : ''), |  |  |
52 | 'type' => (isset($GLOBALS[$this->file . '_type']) ? $GLOBALS[$this->file . '_type'] : ''), |  |  |
53 | 'size' => (isset($GLOBALS[$this->file . '_size']) ? $GLOBALS[$this->file . '_size'] : ''), |  |  |
54 | 'tmp_name' => (isset($GLOBALS[$this->file]) ? $GLOBALS[$this->file] : '')); |  |  |
55 | } | = | 50 | }
56 |  |  | 51 |
57 | if ( tep_not_null($file['tmp_name']) && ($file['tmp_name'] != 'none') && is_uploaded_file($file['tmp_name']) ) { |  | 52 | if ( tep_not_null($file['tmp_name']) && ($file['tmp_name'] != 'none') && is_uploaded_file($file['tmp_name']) ) {
58 | if (sizeof($this->extensions) > 0) { |  | 53 | if (sizeof($this->extensions) > 0) {
59 | if (!in_array(strtolower(substr($file['name'], strrpos($file['name'], '.')+1)), $this->extensions)) { |  | 54 | if (!in_array(strtolower(substr($file['name'], strrpos($file['name'], '.')+1)), $this->extensions)) {
60 | if ($this->message_location == 'direct') { |  | 55 | if ($this->message_location == 'direct') {

File: catalog/admin/file_manager.php

53 | fclose($fp); | = | 53 | fclose($fp);
54 | tep_redirect(tep_href_link(FILENAME_FILE_MANAGER, 'info=' . urlencode($HTTP_POST_VARS['filename']))); |  | 54 | tep_redirect(tep_href_link(FILENAME_FILE_MANAGER, 'info=' . urlencode($HTTP_POST_VARS['filename'])));
55 | } |  | 55 | }
56 | break; |  | 56 | break;
57 | case 'processuploads': |  | 57 | case 'processuploads':
58 | for ($i=1; $i<6; $i++) { |  | 58 | for ($i=1; $i<6; $i++) {
59 | if (isset($GLOBALS['file_' . $i]) && tep_not_null($GLOBA LS['file_' . $i])) { | <> | 59 | if (is_uploaded_file($HTTP_POST_FILES['file_' . $i]['tmp_name'])) {
60 | new upload('file_' . $i, $current_path); | = | 60 | new upload('file_' . $i, $current_path);
61 | } |  | 61 | }
62 | } |  | 62 | }
63 |  |  | 63 |
64 | tep_redirect(tep_href_link(FILENAME_FILE_MANAGER)); |  | 64 | tep_redirect(tep_href_link(FILENAME_FILE_MANAGER));
65 | break; |  | 65 | break;

### [BUGFIX] Currency Case-Sensitivity

Use the currency code from the currencies database table instead of the value checked on to make sure the currency is valid.

Affected Files
catalog/includes/application_top.php
catalog/includes/functions/general.php

File: catalog/includes/application_top.php

288 | require(DIR_WS_LANGUAGES . $language . '.php'); | = | 288 | require(DIR_WS_LANGUAGES . $language . '.php');
289 |  |  | 289 |
290 | // currency |  | 290 | // currency
291 | if (!tep_session_is_registered('currency') || isset($HTTP_GET_VARS['currency']) || ( (USE_DEFAULT_LANGUAGE_CURRENCY == 'true') && (LANGUAGE_CURRENCY != $currency) ) ) { |  | 291 | if (!tep_session_is_registered('currency') || isset($HTTP_GET_VARS['currency']) || ( (USE_DEFAULT_LANGUAGE_CURRENCY == 'true') && (LANGUAGE_CURRENCY != $currency) ) ) {
292 | if (!tep_session_is_registered('currency')) tep_session_register('currency'); |  | 292 | if (!tep_session_is_registered('currency')) tep_session_register('currency');
293 |  |  | 293 |
294 | if (isset($HTTP_GET_VARS['currency'])) { | <> | 294 | if (isset($HTTP_GET_VARS['currency']) && $currencies->is_set($HTTP_GET_VARS['currency'])) {
295 | if (!$currency = tep_currency_exists($HTTP_GET_VARS['currency'])) $currency = (USE_DEFAULT_LANGUAGE_CURRENCY == 'true') ? LANGUAGE_CURRENCY : DEFAULT_CURRENCY; |  | 295 | $currency = $HTTP_GET_VARS['currency'];
296 | } else { | = | 296 | } else {
297 | $currency = (USE_DEFAULT_LANGUAGE_CURRENCY == 'true') ? LANGUAGE_CURRENCY : DEFAULT_CURRENCY; |  | 297 | $currency = (USE_DEFAULT_LANGUAGE_CURRENCY == 'true') ? LANGUAGE_CURRENCY : DEFAULT_CURRENCY;
298 | } |  | 298 | }
299 | } |  | 299 | }
300 |  |  | 300 |
301 | // navigation history |  | 301 | // navigation history

File: catalog/includes/functions/general.php

1168 | //// | = | 1168 | ////
1169 | // Checks to see if the currency code exists as a currency |  | 1169 | // Checks to see if the currency code exists as a currency
1170 | // TABLES: currencies |  | 1170 | // TABLES: currencies
1171 | function tep_currency_exists($code) { |  | 1171 | function tep_currency_exists($code) {
1172 | $code = tep_db_prepare_input($code); |  | 1172 | $code = tep_db_prepare_input($code);
1173 |  |  | 1173 |
1174 | $currency_code = tep_db_query("select cu rrencies_id from " . TABLE_CURRENCIES . " where code = '" . tep_db_input($code) . "'"); | <> | 1174 | $currency_q uery = tep_db_query("select code from " . TABLE_CURRENCIES . " where code = '" . tep_db_input($code) . "' limit 1");
1175 | if (tep_db_num_rows($currency_code)) { |  | 1175 | if (tep_db_num_rows($currency_q uery)) {
|  |  | 1176 | $currency = tep_db_fetch_array($currency_query);
1176 | return $code; |  | 1177 | return $currency['code'];
1177 | } else { | = | 1178 | } else {
1178 | return false; |  | 1179 | return false;
1179 | } |  | 1180 | }
1180 | } |  | 1181 | }
1181 |  |  | 1182 |
1182 | function tep_string_to_int($string) { |  | 1183 | function tep_string_to_int($string) {

### [BUGFIX] Invoice and Packing Slip Billing Address

Correct the display of the billing address on the invoice and packing slip pages.

Affected Files
catalog/admin/invoice.php
catalog/admin/packingslip.php

File: catalog/admin/invoice.php

48 | <tr> | = | 48 | <tr>
49 | <td valign="top"><table width="100%" border="0" cellspacing="0" cellpadding="2"> |  | 49 | <td valign="top"><table width="100%" border="0" cellspacing="0" cellpadding="2">
50 | <tr> |  | 50 | <tr>
51 | <td class="main"><b><?php echo ENTRY_SOLD_TO; ?></b></td> |  | 51 | <td class="main"><b><?php echo ENTRY_SOLD_TO; ?></b></td>
52 | </tr> |  | 52 | </tr>
53 | <tr> |  | 53 | <tr>
54 | <td class="main"><?php echo tep_address_format($order->customer['format_id'], $order->c ustomer, 1, '', '<br>'); ?></td> | <> | 54 | <td class="main"><?php echo tep_address_format($order->customer['format_id'], $order->billing, 1, '', '<br>'); ?></td>
55 | </tr> | = | 55 | </tr>
56 | <tr> |  | 56 | <tr>
57 | <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '5'); ?></td> |  | 57 | <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '5'); ?></td>
58 | </tr> |  | 58 | </tr>
59 | <tr> |  | 59 | <tr>
60 | <td class="main"><?php echo $order->customer['telephone']; ?></td> |  | 60 | <td class="main"><?php echo $order->customer['telephone']; ?></td>

File: catalog/admin/packingslip.php

47 | <tr> | = | 47 | <tr>
48 | <td valign="top"><table width="100%" border="0" cellspacing="0" cellpadding="2"> |  | 48 | <td valign="top"><table width="100%" border="0" cellspacing="0" cellpadding="2">
49 | <tr> |  | 49 | <tr>
50 | <td class="main"><b><?php echo ENTRY_SOLD_TO; ?></b></td> |  | 50 | <td class="main"><b><?php echo ENTRY_SOLD_TO; ?></b></td>
51 | </tr> |  | 51 | </tr>
52 | <tr> |  | 52 | <tr>
53 | <td class="main"><?php echo tep_address_format($order->customer['format_id'], $order->c ustomer, 1, '', '<br>'); ?></td> | <> | 53 | <td class="main"><?php echo tep_address_format($order->customer['format_id'], $order->billing, 1, '', '<br>'); ?></td>
54 | </tr> | = | 54 | </tr>
55 | <tr> |  | 55 | <tr>
56 | <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '5'); ?></td> |  | 56 | <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '5'); ?></td>
57 | </tr> |  | 57 | </tr>
58 | <tr> |  | 58 | <tr>
59 | <td class="main"><?php echo $order->customer['telephone']; ?></td> |  | 59 | <td class="main"><?php echo $order->customer['telephone']; ?></td>

### [IMPROVEMENT] Configuration -> Minimum Values Settings

Respect the Configuration -> Minimum Values settings when editing a customer on the Administration Tool.

Affected Files
catalog/includes/form_check.js.php
catalog/admin/customers.php

File: catalog/includes/form_check.js.php

17 | var error_message = ""; | = | 17 | var error_message = "";
18 |  |  | 18 |
19 | function check_input(field_name, field_size, message) { |  | 19 | function check_input(field_name, field_size, message) {
20 | if (form.elements[field_name] && (form.elements[field_name].type != "hidden")) { |  | 20 | if (form.elements[field_name] && (form.elements[field_name].type != "hidden")) {
21 | var field_value = form.elements[field_name].value; |  | 21 | var field_value = form.elements[field_name].value;
22 |  |  | 22 |
23 | if (field_value == '' || field_value.length < field_size) { | <> | 23 | if (field_value.length < field_size) {
24 | error_message = error_message + "* " + message + "\n"; | = | 24 | error_message = error_message + "* " + message + "\n";
25 | error = true; |  | 25 | error = true;
26 | } |  | 26 | }
27 | } |  | 27 | }
28 | } |  | 28 | }
29 |  |  | 29 |
60 |  | = | 60 |
61 | function check_password(field_name_1, field_name_2, field_size, message_1, message_2) { |  | 61 | function check_password(field_name_1, field_name_2, field_size, message_1, message_2) {
62 | if (form.elements[field_name_1] && (form.elements[field_name_1].type != "hidden")) { |  | 62 | if (form.elements[field_name_1] && (form.elements[field_name_1].type != "hidden")) {
63 | var password = form.elements[field_name_1].value; |  | 63 | var password = form.elements[field_name_1].value;
64 | var confirmation = form.elements[field_name_2].value; |  | 64 | var confirmation = form.elements[field_name_2].value;
65 |  |  | 65 |
66 | if (password == '' || password.length < field_size) { | <> | 66 | if (password.length < field_size) {
67 | error_message = error_message + "* " + message_1 + "\n"; | = | 67 | error_message = error_message + "* " + message_1 + "\n";
68 | error = true; |  | 68 | error = true;
69 | } else if (password != confirmation) { |  | 69 | } else if (password != confirmation) {
70 | error_message = error_message + "* " + message_2 + "\n"; |  | 70 | error_message = error_message + "* " + message_2 + "\n";
71 | error = true; |  | 71 | error = true;
72 | } |  | 72 | }
76 | function check_password_new(field_name_1, field_name_2, field_name_3, field_size, message_1, message_2, message_3) { | = | 76 | function check_password_new(field_name_1, field_name_2, field_name_3, field_size, message_1, message_2, message_3) {
77 | if (form.elements[field_name_1] && (form.elements[field_name_1].type != "hidden")) { |  | 77 | if (form.elements[field_name_1] && (form.elements[field_name_1].type != "hidden")) {
78 | var password_current = form.elements[field_name_1].value; |  | 78 | var password_current = form.elements[field_name_1].value;
79 | var password_new = form.elements[field_name_2].value; |  | 79 | var password_new = form.elements[field_name_2].value;
80 | var password_confirmation = form.elements[field_name_3].value; |  | 80 | var password_confirmation = form.elements[field_name_3].value;
81 |  |  | 81 |
82 | if (password_current == '' || password_current.length < field_size) { | <> | 82 | if (password_current.length < field_size) {
83 | error_message = error_message + "* " + message_1 + "\n"; | = | 83 | error_message = error_message + "* " + message_1 + "\n";
84 | error = true; |  | 84 | error = true;
85 | } else if (password_new == '' || password_new.length < field_size) { | <> | 85 | } else if (password_new.length < field_size) {
86 | error_message = error_message + "* " + message_2 + "\n"; | = | 86 | error_message = error_message + "* " + message_2 + "\n";
87 | error = true; |  | 87 | error = true;
88 | } else if (password_new != password_confirmation) { |  | 88 | } else if (password_new != password_confirmation) {
89 | error_message = error_message + "* " + message_3 + "\n"; |  | 89 | error_message = error_message + "* " + message_3 + "\n";
90 | error = true; |  | 90 | error = true;
91 | } |  | 91 | }

File: catalog/admin/customers.php

123 | $entry_zone_id = $zone_values['zone_id']; | = | 123 | $entry_zone_id = $zone_values['zone_id'];
124 | } else { |  | 124 | } else {
125 | $error = true; |  | 125 | $error = true;
126 | $entry_state_error = true; |  | 126 | $entry_state_error = true;
127 | } |  | 127 | }
128 | } else { |  | 128 | } else {
129 | if ($entry_state == false) { | <> | 129 | if (strlen($entry_state) < ENTRY_STATE_MIN_L ENGTH) {
130 | $error = true; | = | 130 | $error = true;
131 | $entry_state_error = true; |  | 131 | $entry_state_error = true;
132 | } |  | 132 | }
133 | } |  | 133 | }
134 | } |  | 134 | }
135 | } |  | 135 | }
258 | } else { | = | 258 | } else {
259 | error_message = error_message + "<?php echo JS_GENDER; ?>"; |  | 259 | error_message = error_message + "<?php echo JS_GENDER; ?>";
260 | error = 1; |  | 260 | error = 1;
261 | } |  | 261 | }
262 | <?php } ?> |  | 262 | <?php } ?>
263 |  |  | 263 |
264 | if (customers_firstname == "" || customers_firstname.length < <?php echo ENTRY_FIRST_NAME_MIN_LENGTH; ?>) { | <> | 264 | if (customers_firstname.length < <?php echo ENTRY_FIRST_NAME_MIN_LENGTH; ?>) {
265 | error_message = error_message + "<?php echo JS_FIRST_NAME; ?>"; | = | 265 | error_message = error_message + "<?php echo JS_FIRST_NAME; ?>";
266 | error = 1; |  | 266 | error = 1;
267 | } |  | 267 | }
268 |  |  | 268 |
269 | if (customers_lastname == "" || customers_lastname.length < <?php echo ENTRY_LAST_NAME_MIN_LENGTH; ?>) { | <> | 269 | if (customers_lastname.length < <?php echo ENTRY_LAST_NAME_MIN_LENGTH; ?>) {
270 | error_message = error_message + "<?php echo JS_LAST_NAME; ?>"; | = | 270 | error_message = error_message + "<?php echo JS_LAST_NAME; ?>";
271 | error = 1; |  | 271 | error = 1;
272 | } |  | 272 | }
273 |  |  | 273 |
274 | <?php if (ACCOUNT_DOB == 'true') { ?> |  | 274 | <?php if (ACCOUNT_DOB == 'true') { ?>
275 | if (customers_dob == "" || customers_dob.length < <?php echo ENTRY_DOB_MIN_LENGTH; ?>) { | <> | 275 | if (customers_dob.length < <?php echo ENTRY_DOB_MIN_LENGTH; ?>) {
276 | error_message = error_message + "<?php echo JS_DOB; ?>"; | = | 276 | error_message = error_message + "<?php echo JS_DOB; ?>";
277 | error = 1; |  | 277 | error = 1;
278 | } |  | 278 | }
279 | <?php } ?> |  | 279 | <?php } ?>
280 |  |  | 280 |
281 | if (customers_email_address == "" || customers_email_address.length < <?php echo ENTRY_EMAIL_ADDRESS_MIN_LENGTH; ?>) { | <> | 281 | if (customers_email_address.length < <?php echo ENTRY_EMAIL_ADDRESS_MIN_LENGTH; ?>) {
282 | error_message = error_message + "<?php echo JS_EMAIL_ADDRESS; ?>"; | = | 282 | error_message = error_message + "<?php echo JS_EMAIL_ADDRESS; ?>";
283 | error = 1; |  | 283 | error = 1;
284 | } |  | 284 | }
285 |  |  | 285 |
286 | if (entry_street_address == "" || entry_street_address.length < <?php echo ENTRY_STREET_ADDRESS_MIN_LENGTH; ?>) { | <> | 286 | if (entry_street_address.length < <?php echo ENTRY_STREET_ADDRESS_MIN_LENGTH; ?>) {
287 | error_message = error_message + "<?php echo JS_ADDRESS; ?>"; | = | 287 | error_message = error_message + "<?php echo JS_ADDRESS; ?>";
288 | error = 1; |  | 288 | error = 1;
289 | } |  | 289 | }
290 |  |  | 290 |
291 | if (entry_postcode == "" || entry_postcode.length < <?php echo ENTRY_POSTCODE_MIN_LENGTH; ?>) { | <> | 291 | if (entry_postcode.length < <?php echo ENTRY_POSTCODE_MIN_LENGTH; ?>) {
292 | error_message = error_message + "<?php echo JS_POST_CODE; ?>"; | = | 292 | error_message = error_message + "<?php echo JS_POST_CODE; ?>";
293 | error = 1; |  | 293 | error = 1;
294 | } |  | 294 | }
295 |  |  | 295 |
296 | if (entry_city == "" || entry_city.length < <?php echo ENTRY_CITY_MIN_LENGTH; ?>) { | <> | 296 | if (entry_city.length < <?php echo ENTRY_CITY_MIN_LENGTH; ?>) {
297 | error_message = error_message + "<?php echo JS_CITY; ?>"; | = | 297 | error_message = error_message + "<?php echo JS_CITY; ?>";
298 | error = 1; |  | 298 | error = 1;
299 | } |  | 299 | }
300 |  |  | 300 |
301 | <?php |  | 301 | <?php
302 | if (ACCOUNT_STATE == 'true') { |  | 302 | if (ACCOUNT_STATE == 'true') {
303 | ?> |  | 303 | ?>
304 | if (document.customers.elements['entry_state'].type != "hidden") { |  | 304 | if (document.customers.elements['entry_state'].type != "hidden") {
305 | if (document.customers.entry_state.value == '' || document.customers.entry_state.value.length < <?php echo ENTRY_STATE_MIN_LENGTH; ?> ) { | <> | 305 | if (document.customers.entry_state.value.length < <?php echo ENTRY_STATE_MIN_LENGTH; ?>) {
306 | error_message = error_message + "<?php echo JS_STATE; ?>"; | = | 306 | error_message = error_message + "<?php echo JS_STATE; ?>";
307 | error = 1; |  | 307 | error = 1;
308 | } |  | 308 | }
309 | } |  | 309 | }
310 | <?php |  | 310 | <?php
311 | } |  | 311 | }
315 | if (document.customers.entry_country_id.value == 0) { | = | 315 | if (document.customers.entry_country_id.value == 0) {
316 | error_message = error_message + "<?php echo JS_COUNTRY; ?>"; |  | 316 | error_message = error_message + "<?php echo JS_COUNTRY; ?>";
317 | error = 1; |  | 317 | error = 1;
318 | } |  | 318 | }
319 | } |  | 319 | }
320 |  |  | 320 |
321 | if (customers_telephone == "" || customers_telephone.length < <?php echo ENTRY_TELEPHONE_MIN_LENGTH; ?>) { | <> | 321 | if (customers_telephone.length < <?php echo ENTRY_TELEPHONE_MIN_LENGTH; ?>) {
322 | error_message = error_message + "<?php echo JS_TELEPHONE; ?>"; | = | 322 | error_message = error_message + "<?php echo JS_TELEPHONE; ?>";
323 | error = 1; |  | 323 | error = 1;
324 | } |  | 324 | }
325 |  |  | 325 |
326 | if (error == 1) { |  | 326 | if (error == 1) {
327 | alert(error_message); |  | 327 | alert(error_message);

### [BUGFIX] Compatibility Array Index

Reset compatibility array indexes when working through its elements.

Affected Files
catalog/includes/functions/compatibility.php
catalog/admin/includes/functions/compatibility.php

File: catalog/includes/functions/compatibility.php

15 | // This is due to the possibility of have an array in | = | 15 | // This is due to the possibility of have an array in
16 | // $HTTP_xxx_VARS |  | 16 | // $HTTP_xxx_VARS
17 | // Ie, products attributes |  | 17 | // Ie, products attributes
18 | function do_magic_quotes_gpc(&$ar) { |  | 18 | function do_magic_quotes_gpc(&$ar) {
19 | if (!is_array($ar)) return false; |  | 19 | if (!is_array($ar)) return false;
20 |  |  | 20 |
|  | -+ | 21 | reset($ar);
21 | while (list($key, $value) = each($ar)) { | = | 22 | while (list($key, $value) = each($ar)) {
22 | if (is_array($ar[$key])) { |  | 23 | if (is_array($ar[$key])) {
23 | do_magic_quotes_gpc($ar[$key]); |  | 24 | do_magic_quotes_gpc($ar[$key]);
24 | } else { |  | 25 | } else {
25 | $ar[$key] = addslashes($value); |  | 26 | $ar[$key] = addslashes($value);
26 | } |  | 27 | }
27 | } |  | 28 | }
|  | -+ | 29 | reset($ar);
28 | } | = | 30 | }
29 |  |  | 31 |
30 | if (PHP_VERSION >= 4.1) { |  | 32 | if (PHP_VERSION >= 4.1) {
31 | $HTTP_GET_VARS =& $_GET; |  | 33 | $HTTP_GET_VARS =& $_GET;
32 | $HTTP_POST_VARS =& $_POST; |  | 34 | $HTTP_POST_VARS =& $_POST;
33 | $HTTP_COOKIE_VARS =& $_COOKIE; |  | 35 | $HTTP_COOKIE_VARS =& $_COOKIE;

File: catalog/admin/includes/functions/compatibility.php

15 | // This is due to the possibility of have an array in | = | 15 | // This is due to the possibility of have an array in
16 | // $HTTP_xxx_VARS |  | 16 | // $HTTP_xxx_VARS
17 | // Ie, products attributes |  | 17 | // Ie, products attributes
18 | function do_magic_quotes_gpc(&$ar) { |  | 18 | function do_magic_quotes_gpc(&$ar) {
19 | if (!is_array($ar)) return false; |  | 19 | if (!is_array($ar)) return false;
20 |  |  | 20 |
|  | -+ | 21 | reset($ar);
21 | while (list($key, $value) = each($ar)) { | = | 22 | while (list($key, $value) = each($ar)) {
22 | if (is_array($ar[$key])) { |  | 23 | if (is_array($ar[$key])) {
23 | do_magic_quotes_gpc($ar[$key]); |  | 24 | do_magic_quotes_gpc($ar[$key]);
24 | } else { |  | 25 | } else {
25 | $ar[$key] = addslashes($value); |  | 26 | $ar[$key] = addslashes($value);
26 | } |  | 27 | }
27 | } |  | 28 | }
|  | -+ | 29 | reset($ar);
28 | } | = | 30 | }
29 |  |  | 31 |
30 | if (PHP_VERSION >= 4.1) { |  | 32 | if (PHP_VERSION >= 4.1) {
31 | $HTTP_GET_VARS =& $_GET; |  | 33 | $HTTP_GET_VARS =& $_GET;
32 | $HTTP_POST_VARS =& $_POST; |  | 34 | $HTTP_POST_VARS =& $_POST;
33 | $HTTP_COOKIE_VARS =& $_COOKIE; |  | 35 | $HTTP_COOKIE_VARS =& $_COOKIE;

### [IMPROVEMENT] MySQL Database Connection Identifier Link

Pass the MySQL connection identifier link to the mysql_insert_id() function.

Affected Files
catalog/includes/functions/database.php
catalog/admin/includes/functions/database.php

File: catalog/includes/functions/database.php

104 | } | = | 104 | }
105 |  |  | 105 |
106 | function tep_db_data_seek($db_query, $row_number) { |  | 106 | function tep_db_data_seek($db_query, $row_number) {
107 | return mysql_data_seek($db_query, $row_number); |  | 107 | return mysql_data_seek($db_query, $row_number);
108 | } |  | 108 | }
109 |  |  | 109 |
110 | function tep_db_insert_id() { | <> | 110 | function tep_db_insert_id($link = 'db_link') {
|  |  | 111 | global $$link;
|  |  | 112 |
111 | return mysql_insert_id(); |  | 113 | return mysql_insert_id($$link);
112 | } | = | 114 | }
113 |  |  | 115 |
114 | function tep_db_free_result($db_query) { |  | 116 | function tep_db_free_result($db_query) {
115 | return mysql_free_result($db_query); |  | 117 | return mysql_free_result($db_query);
116 | } |  | 118 | }
117 |  |  | 119 |

File: catalog/admin/includes/functions/database.php

108 | } | = | 108 | }
109 |  |  | 109 |
110 | function tep_db_data_seek($db_query, $row_number) { |  | 110 | function tep_db_data_seek($db_query, $row_number) {
111 | return mysql_data_seek($db_query, $row_number); |  | 111 | return mysql_data_seek($db_query, $row_number);
112 | } |  | 112 | }
113 |  |  | 113 |
114 | function tep_db_insert_id() { | <> | 114 | function tep_db_insert_id($link = 'db_link') {
|  |  | 115 | global $$link;
|  |  | 116 |
115 | return mysql_insert_id(); |  | 117 | return mysql_insert_id($$link);
116 | } | = | 118 | }
117 |  |  | 119 |
118 | function tep_db_free_result($db_query) { |  | 120 | function tep_db_free_result($db_query) {
119 | return mysql_free_result($db_query); |  | 121 | return mysql_free_result($db_query);
120 | } |  | 122 | }
121 |  |  | 123 |

### [BUGFIX] Product Sorting SQL Injection Vulnerability

Fix an SQL injection vulnerability when sorting products on the index listing.

Affected Files
catalog/index.php

File: catalog/index.php

185 | } else { | = | 185 | } else {
186 | // We show them all |  | 186 | // We show them all
187 | $listing_sql = "select " . $select_column_list . " p.products_id, p.manufacturers_id, p.products_price, p.products_tax_class_id, IF(s.status, s.specials_new_products_price, NULL) as specials_new_products_price, IF(s.status, s.specials_new_products_price, p.products_price) as final_price from " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_PRODUCTS . " p left join " . TABLE_MANUFACTURERS . " m on p.manufacturers_id = m.manufacturers_id left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c where p.products_status = '1' and p.products_id = p2c.products_id and pd.products_id = p2c.products_id and pd.language_id = '" . (int)$languages_id . "' and p2c.categories_id = '" . (int)$current_category_id . "'"; |  | 187 | $listing_sql = "select " . $select_column_list . " p.products_id, p.manufacturers_id, p.products_price, p.products_tax_class_id, IF(s.status, s.specials_new_products_price, NULL) as specials_new_products_price, IF(s.status, s.specials_new_products_price, p.products_price) as final_price from " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_PRODUCTS . " p left join " . TABLE_MANUFACTURERS . " m on p.manufacturers_id = m.manufacturers_id left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c where p.products_status = '1' and p.products_id = p2c.products_id and pd.products_id = p2c.products_id and pd.language_id = '" . (int)$languages_id . "' and p2c.categories_id = '" . (int)$current_category_id . "'";
188 | } |  | 188 | }
189 | } |  | 189 | }
190 |  |  | 190 |
191 | if ( (!isset($HTTP_GET_VARS['sort'])) || (!ereg('[1-8][ad]', $HTTP_GET_VARS['sort'])) || (substr($HTTP_GET_VARS['sort'], 0, 1) > sizeof($column_list)) ) { | <> | 191 | if ( (!isset($HTTP_GET_VARS['sort'])) || (!ereg('^[1-8][ad]$', $HTTP_GET_VARS['sort'])) || (substr($HTTP_GET_VARS['sort'], 0, 1) > sizeof($column_list)) ) {
192 | for ($i=0, $n=sizeof($column_list); $i<$n; $i++) { | = | 192 | for ($i=0, $n=sizeof($column_list); $i<$n; $i++) {
193 | if ($column_list[$i] == 'PRODUCT_LIST_NAME') { |  | 193 | if ($column_list[$i] == 'PRODUCT_LIST_NAME') {
194 | $HTTP_GET_VARS['sort'] = $i+1 . 'a'; |  | 194 | $HTTP_GET_VARS['sort'] = $i+1 . 'a';
195 | $listing_sql .= " order by pd.products_name"; |  | 195 | $listing_sql .= " order by pd.products_name";
196 | break; |  | 196 | break;
197 | } |  | 197 | }
198 | } |  | 198 | }
199 | } else { |  | 199 | } else {
200 | $sort_col = substr($HTTP_GET_VARS['sort'], 0 , 1); |  | 200 | $sort_col = substr($HTTP_GET_VARS['sort'], 0 , 1);
201 | $sort_order = substr($HTTP_GET_VARS['sort'], 1); |  | 201 | $sort_order = substr($HTTP_GET_VARS['sort'], 1);
202 | $listing_sql .= ' order by '; | <> | 202 |
203 | switch ($column_list[$sort_col-1]) { | = | 203 | switch ($column_list[$sort_col-1]) {
204 | case 'PRODUCT_LIST_MODEL': |  | 204 | case 'PRODUCT_LIST_MODEL':
205 | $listing_sql .= "p.products_model " . ($sort_order == 'd' ? 'desc' : '') . ", pd.products_name"; | <> | 205 | $listing_sql .= " order by p.products_model " . ($sort_order == 'd' ? 'desc' : '') . ", pd.products_name";
206 | break; | = | 206 | break;
207 | case 'PRODUCT_LIST_NAME': |  | 207 | case 'PRODUCT_LIST_NAME':
208 | $listing_sql .= "pd.products_name " . ($sort_order == 'd' ? 'desc' : ''); | <> | 208 | $listing_sql .= " order by pd.products_name " . ($sort_order == 'd' ? 'desc' : '');
209 | break; | = | 209 | break;
210 | case 'PRODUCT_LIST_MANUFACTURER': |  | 210 | case 'PRODUCT_LIST_MANUFACTURER':
211 | $listing_sql .= "m.manufacturers_name " . ($sort_order == 'd' ? 'desc' : '') . ", pd.products_name"; | <> | 211 | $listing_sql .= " order by m.manufacturers_name " . ($sort_order == 'd' ? 'desc' : '') . ", pd.products_name";
212 | break; | = | 212 | break;
213 | case 'PRODUCT_LIST_QUANTITY': |  | 213 | case 'PRODUCT_LIST_QUANTITY':
214 | $listing_sql .= "p.products_quantity " . ($sort_order == 'd' ? 'desc' : '') . ", pd.products_name"; | <> | 214 | $listing_sql .= " order by p.products_quantity " . ($sort_order == 'd' ? 'desc' : '') . ", pd.products_name";
215 | break; | = | 215 | break;
216 | case 'PRODUCT_LIST_IMAGE': |  | 216 | case 'PRODUCT_LIST_IMAGE':
217 | $listing_sql .= "pd.products_name"; | <> | 217 | $listing_sql .= " order by pd.products_name";
218 | break; | = | 218 | break;
219 | case 'PRODUCT_LIST_WEIGHT': |  | 219 | case 'PRODUCT_LIST_WEIGHT':
220 | $listing_sql .= "p.products_weight " . ($sort_order == 'd' ? 'desc' : '') . ", pd.products_name"; | <> | 220 | $listing_sql .= " order by p.products_weight " . ($sort_order == 'd' ? 'desc' : '') . ", pd.products_name";
221 | break; | = | 221 | break;
222 | case 'PRODUCT_LIST_PRICE': |  | 222 | case 'PRODUCT_LIST_PRICE':
223 | $listing_sql .= "final_price " . ($sort_order == 'd' ? 'desc' : '') . ", pd.products_name"; | <> | 223 | $listing_sql .= " order by final_price " . ($sort_order == 'd' ? 'desc' : '') . ", pd.products_name";
224 | break; | = | 224 | break;
225 | } |  | 225 | }
226 | } |  | 226 | }
227 | ?> |  | 227 | ?>
228 | <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="0"> |  | 228 | <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="0">
229 | <tr> |  | 229 | <tr>

### [BUGFIX] Product Price Calculations

Don't calculate product prices with tax by rounding the net value as this brings down the default precision of 4 to the decimal places of the selected currency.

Affected Files
catalog/includes/classes/currencies.php
catalog/includes/classes/order.php
catalog/includes/classes/shopping_cart.php
catalog/includes/functions/general.php
catalog/admin/includes/classes/currencies.php
catalog/admin/includes/functions/general.php
catalog/admin/orders.php
catalog/admin/invoice.php

File: catalog/includes/classes/currencies.php

49 | $format_string = $this->currencies[$currency_type]['symbol_left'] . number_format(tep_round($number, $this->currencies[$currency_type]['decimal_places']), $this->currencies[$currency_type]['decimal_places'], $this->currencies[$currency_type]['decimal_point'], $this->currencies[$currency_type]['thousands_point']) . $this->currencies[$currency_type]['symbol_right']; | = | 49 | $format_string = $this->currencies[$currency_type]['symbol_left'] . number_format(tep_round($number, $this->currencies[$currency_type]['decimal_places']), $this->currencies[$currency_type]['decimal_places'], $this->currencies[$currency_type]['decimal_point'], $this->currencies[$currency_type]['thousands_point']) . $this->currencies[$currency_type]['symbol_right'];
50 | } |  | 50 | }
51 |  |  | 51 |
52 | return $format_string; |  | 52 | return $format_string;
53 | } |  | 53 | }
54 |  |  | 54 |
|  | -+ | 55 | function calculate_price($products_price, $products_tax, $quantity = 1) {
|  |  | 56 | global $currency;
|  |  | 57 |
|  |  | 58 | return tep_round(tep_add_tax($products_price, $products_tax), $this->currencies[$currency]['decimal_places']) * $quantity;
|  |  | 59 | }
|  |  | 60 |
55 | function is_set($code) { | = | 61 | function is_set($code) {
56 | if (isset($this->currencies[$code]) && tep_not_null($this->currencies[$code])) { |  | 62 | if (isset($this->currencies[$code]) && tep_not_null($this->currencies[$code])) {
57 | return true; |  | 63 | return true;
58 | } else { |  | 64 | } else {
59 | return false; |  | 65 | return false;
60 | } |  | 66 | }
66 |  | = | 72 |
67 | function get_decimal_places($code) { |  | 73 | function get_decimal_places($code) {
68 | return $this->currencies[$code]['decimal_places']; |  | 74 | return $this->currencies[$code]['decimal_places'];
69 | } |  | 75 | }
70 |  |  | 76 |
71 | function display_price($products_price, $products_tax, $quantity = 1) { |  | 77 | function display_price($products_price, $products_tax, $quantity = 1) {
72 | return $this->format(tep_add_tax($products_price, $products_tax) * $quantity); | <> | 78 | return $this->format($this->calculate_pric e($products_price, $products_tax, $quantity));
73 | } | = | 79 | }
74 | } |  | 80 | }
75 | ?> |  | 81 | ?>

File: catalog/includes/classes/order.php

238 | 'price' => $attributes['options_values_price']); | = | 238 | 'price' => $attributes['options_values_price']);
239 |  |  | 239 |
240 | $subindex++; |  | 240 | $subindex++;
241 | } |  | 241 | }
242 | } |  | 242 | }
243 |  |  | 243 |
244 | $shown_price = tep_add_tax($this->products[$index]['final_price'], $this->products[$index]['tax']) * $this->products[$index]['qty']; | <> | 244 | $shown_price = $cur rencies->calculate_pric e($this->products[$index]['final_price'], $this->products[$index]['tax'], $this->products[$index]['qty']);
245 | $this->info['subtotal'] += $shown_price; | = | 245 | $this->info['subtotal'] += $shown_price;
246 |  |  | 246 |
247 | $products_tax = $this->products[$index]['tax']; |  | 247 | $products_tax = $this->products[$index]['tax'];
248 | $products_tax_description = $this->products[$index]['tax_description']; |  | 248 | $products_tax_description = $this->products[$index]['tax_description'];
249 | if (DISPLAY_PRICE_WITH_TAX == 'true') { |  | 249 | if (DISPLAY_PRICE_WITH_TAX == 'true') {
250 | $this->info['tax'] += $shown_price - ($shown_price / (($products_tax < 10) ? "1.0" . str_replace('.', '', $products_tax) : "1." . str_replace('.', '', $products_tax))); |  | 250 | $this->info['tax'] += $shown_price - ($shown_price / (($products_tax < 10) ? "1.0" . str_replace('.', '', $products_tax) : "1." . str_replace('.', '', $products_tax)));

File: catalog/includes/classes/shopping_cart.php

26 | if (is_array($this->contents)) { | = | 26 | if (is_array($this->contents)) {
27 | reset($this->contents); |  | 27 | reset($this->contents);
28 | while (list($products_id, ) = each($this->contents)) { |  | 28 | while (list($products_id, ) = each($this->contents)) {
29 | $qty = $this->contents[$products_id]['qty']; |  | 29 | $qty = $this->contents[$products_id]['qty'];
30 | $product_query = tep_db_query("select products_id from " . TABLE_CUSTOMERS_BASKET . " where customers_id = '" . (int)$customer_id . "' and products_id = '" . tep_db_input($products_id) . "'"); |  | 30 | $product_query = tep_db_query("select products_id from " . TABLE_CUSTOMERS_BASKET . " where customers_id = '" . (int)$customer_id . "' and products_id = '" . tep_db_input($products_id) . "'");
31 | if (!tep_db_num_rows($product_query)) { |  | 31 | if (!tep_db_num_rows($product_query)) {
32 | tep_db_query("insert into " . TABLE_CUSTOMERS_BASKET . " (customers_id, products_id, customers_basket_quantity, customers_basket_date_added) values ('" . (int)$customer_id . "', '" . tep_db_input($products_id) . "', '" . $qty . "', '" . date('Ymd') . "')"); | <> | 32 | tep_db_query("insert into " . TABLE_CUSTOMERS_BASKET . " (customers_id, products_id, customers_basket_quantity, customers_basket_date_added) values ('" . (int)$customer_id . "', '" . tep_db_input($products_id) . "', '" . tep_db_input($qty) . "', '" . date('Ymd') . "')");
33 | if (isset($this->contents[$products_id]['attributes'])) { | = | 33 | if (isset($this->contents[$products_id]['attributes'])) {
34 | reset($this->contents[$products_id]['attributes']); |  | 34 | reset($this->contents[$products_id]['attributes']);
35 | while (list($option, $value) = each($this->contents[$products_id]['attributes'])) { |  | 35 | while (list($option, $value) = each($this->contents[$products_id]['attributes'])) {
36 | tep_db_query("insert into " . TABLE_CUSTOMERS_BASKET_ATTRIBUTES . " (customers_id, products_id, products_options_id, products_options_value_id) values ('" . (int)$customer_id . "', '" . tep_db_input($products_id) . "', '" . (int)$option . "', '" . (int)$value . "')"); |  | 36 | tep_db_query("insert into " . TABLE_CUSTOMERS_BASKET_ATTRIBUTES . " (customers_id, products_id, products_options_id, products_options_value_id) values ('" . (int)$customer_id . "', '" . tep_db_input($products_id) . "', '" . (int)$option . "', '" . (int)$value . "')");
37 | } |  | 37 | }
38 | } |  | 38 | }
39 | } else { |  | 39 | } else {
40 | tep_db_query("update " . TABLE_CUSTOMERS_BASKET . " set customers_basket_quantity = '" . $qty . "' where customers_id = '" . (int)$customer_id . "' and products_id = '" . tep_db_input($products_id) . "'"); | <> | 40 | tep_db_query("update " . TABLE_CUSTOMERS_BASKET . " set customers_basket_quantity = '" . tep_db_input($qty) . "' where customers_id = '" . (int)$customer_id . "' and products_id = '" . tep_db_input($products_id) . "'");
41 | } | = | 41 | }
42 | } |  | 42 | }
43 | } |  | 43 | }
44 |  |  | 44 |
45 | // reset per-session cart contents, but not the database contents |  | 45 | // reset per-session cart contents, but not the database contents
46 | $this->reset(false); |  | 46 | $this->reset(false);
234 | } | = | 234 | }
235 |  |  | 235 |
236 | return substr($product_id_list, 2); |  | 236 | return substr($product_id_list, 2);
237 | } |  | 237 | }
238 |  |  | 238 |
239 | function calculate() { |  | 239 | function calculate() {
|  | -+ | 240 | global $currencies;
|  |  | 241 |
240 | $this->total = 0; | = | 242 | $this->total = 0;
241 | $this->weight = 0; |  | 243 | $this->weight = 0;
242 | if (!is_array($this->contents)) return 0; |  | 244 | if (!is_array($this->contents)) return 0;
243 |  |  | 245 |
244 | reset($this->contents); |  | 246 | reset($this->contents);
245 | while (list($products_id, ) = each($this->contents)) { |  | 247 | while (list($products_id, ) = each($this->contents)) {
256 | $specials_query = tep_db_query("select specials_new_products_price from " . TABLE_SPECIALS . " where products_id = '" . (int)$prid . "' and status = '1'"); | = | 258 | $specials_query = tep_db_query("select specials_new_products_price from " . TABLE_SPECIALS . " where products_id = '" . (int)$prid . "' and status = '1'");
257 | if (tep_db_num_rows ($specials_query)) { |  | 259 | if (tep_db_num_rows ($specials_query)) {
258 | $specials = tep_db_fetch_array($specials_query); |  | 260 | $specials = tep_db_fetch_array($specials_query);
259 | $products_price = $specials['specials_new_products_price']; |  | 261 | $products_price = $specials['specials_new_products_price'];
260 | } |  | 262 | }
261 |  |  | 263 |
262 | $this->total += tep_add_tax($products_price, $products_tax) * $qty; | <> | 264 | $this->total += $cur rencies->calculate_pric e($products_price, $products_tax, $qty);
263 | $this->weight += ($qty * $products_weight); | = | 265 | $this->weight += ($qty * $products_weight);
264 | } |  | 266 | }
265 |  |  | 267 |
266 | // attributes price |  | 268 | // attributes price
267 | if (isset($this->contents[$products_id]['attributes'])) { |  | 269 | if (isset($this->contents[$products_id]['attributes'])) {
268 | reset($this->contents[$products_id]['attributes']); |  | 270 | reset($this->contents[$products_id]['attributes']);
269 | while (list($option, $value) = each($this->contents[$products_id]['attributes'])) { |  | 271 | while (list($option, $value) = each($this->contents[$products_id]['attributes'])) {
270 | $attribute_price_query = tep_db_query("select options_values_price, price_prefix from " . TABLE_PRODUCTS_ATTRIBUTES . " where products_id = '" . (int)$prid . "' and options_id = '" . (int)$option . "' and options_values_id = '" . (int)$value . "'"); |  | 272 | $attribute_price_query = tep_db_query("select options_values_price, price_prefix from " . TABLE_PRODUCTS_ATTRIBUTES . " where products_id = '" . (int)$prid . "' and options_id = '" . (int)$option . "' and options_values_id = '" . (int)$value . "'");
271 | $attribute_price = tep_db_fetch_array($attribute_price_query); |  | 273 | $attribute_price = tep_db_fetch_array($attribute_price_query);
272 | if ($attribute_price['price_prefix'] == '+') { |  | 274 | if ($attribute_price['price_prefix'] == '+') {
273 | $this->total += $qty * tep_add_tax($attribute_price['options_values_price'], $products_tax); | <> | 275 | $this->total += $c urrencies->calculate_pric e($attribute_price['options_values_price'], $products_tax, $qty);
274 | } else { | = | 276 | } else {
275 | $this->total -= $qty * tep_add_tax($attribute_price['options_values_price'], $products_tax); | <> | 277 | $this->total -= $c urrencies->calculate_pric e($attribute_price['options_values_price'], $products_tax, $qty);
276 | } | = | 278 | }
277 | } |  | 279 | }
278 | } |  | 280 | }
279 | } |  | 281 | }
280 | } |  | 282 | }
281 |  |  | 283 |

File: catalog/includes/functions/general.php

352 | } | = | 352 | }
353 | } |  | 353 | }
354 |  |  | 354 |
355 | //// |  | 355 | ////
356 | // Add tax to a products price |  | 356 | // Add tax to a products price
357 | function tep_add_tax($price, $tax) { |  | 357 | function tep_add_tax($price, $tax) {
358 | global $currencies; | +- |  |
359 |  |  |  |
360 | if ( (DISPLAY_PRICE_WITH_TAX == 'true') && ($tax > 0) ) { | = | 358 | if ( (DISPLAY_PRICE_WITH_TAX == 'true') && ($tax > 0) ) {
361 | return tep_round($price, $currencies->currencies[DEFAULT_CURRENCY]['decimal_places']) + tep_calculate_tax($price, $tax); | <> | 359 | return $price + tep_calculate_tax($price, $tax);
362 | } else { | = | 360 | } else {
363 | return tep_round($price, $currencies->currencies[DEFAULT_CURRENCY]['decimal_places']); | <> | 361 | return $price;
364 | } | = | 362 | }
365 | } |  | 363 | }
366 |  |  | 364 |
367 | // Calculates Tax rounding the result |  | 365 | // Calculates Tax rounding the result
368 | function tep_calculate_tax($price, $tax) { |  | 366 | function tep_calculate_tax($price, $tax) {
369 | global $currencies; | <> | 367 | return $price * $tax / 100;
370 |  |  |  |
371 | return tep_round($price * $tax / 100, $currencies->currencies[DEFAULT_CURRENCY]['decimal_places']); |  |  |
372 | } | = | 368 | }
373 |  |  | 369 |
374 | //// |  | 370 | ////
375 | // Return the number of products in a category |  | 371 | // Return the number of products in a category
376 | // TABLES: products, products_to_categories, categories |  | 372 | // TABLES: products, products_to_categories, categories
377 | function tep_count_products_in_category($category_id, $include_inactive = false) { |  | 373 | function tep_count_products_in_category($category_id, $include_inactive = false) {

File: catalog/admin/includes/classes/currencies.php

49 | } | = | 49 | }
50 |  |  | 50 |
51 | function get_value($code) { |  | 51 | function get_value($code) {
52 | return $this->currencies[$code]['value']; |  | 52 | return $this->currencies[$code]['value'];
53 | } |  | 53 | }
54 |  |  | 54 |
55 | function display_price($products_price, $products_tax, $quantity = 1) { | <> | 55 | function display_price($products_price, $products_tax, $quantity = 1, $currency_type = DEFAULT_CURRENCY) {
56 | return $this->format(tep_add_tax($products_price, $products_tax) * $quantity); |  | 56 | return $this->format(tep_round(tep_add_tax($products_price, $products_tax), $this->currencies[$currency_type]['decimal_places']) * $quantity);
57 | } | = | 57 | }
58 | } |  | 58 | }
59 | ?> |  | 59 | ?>

File: catalog/admin/includes/functions/general.php

1130 | return round($value, $precision); | = | 1130 | return round($value, $precision);
1131 | } |  | 1131 | }
1132 | } |  | 1132 | }
1133 |  |  | 1133 |
1134 | //// |  | 1134 | ////
1135 | // Add tax to a products price |  | 1135 | // Add tax to a products price
1136 | function tep_add_tax($price, $tax) { | <> | 1136 | function tep_add_tax($price, $tax, $override = false) {
1137 | global $currencies; |  | 1137 | if ( ( (DISPLAY_PRICE_WITH_TAX == 'true') || ($override == true) ) && ($tax > 0) ) {
1138 |  |  | 1138 | return $price + tep_calculate_tax($price, $tax);
1139 | if (DISPLAY_PRICE_WITH_TAX == 'true') { |  |  |
1140 | return tep_round($price, $currencies->currencies[DEFAULT_CURRENCY]['decimal_places']) + tep_calculate_tax($price, $tax); |  |  |
1141 | } else { | = | 1139 | } else {
1142 | return tep_round($price, $currencies->currencies[DEFAULT_CURRENCY]['decimal_places']); | <> | 1140 | return $price;
1143 | } | = | 1141 | }
1144 | } |  | 1142 | }
1145 |  |  | 1143 |
1146 | // Calculates Tax rounding the result |  | 1144 | // Calculates Tax rounding the result
1147 | function tep_calculate_tax($price, $tax) { |  | 1145 | function tep_calculate_tax($price, $tax) {
1148 | global $currencies; | <> | 1146 | return $price * $tax / 100;
1149 |  |  |  |
1150 | return tep_round($price * $tax / 100, $currencies->currencies[DEFAULT_CURRENCY]['decimal_places']); |  |  |
1151 | } | = | 1147 | }
1152 |  |  | 1148 |
1153 | //// |  | 1149 | ////
1154 | // Returns the tax rate for a zone / class |  | 1150 | // Returns the tax rate for a zone / class
1155 | // TABLES: tax_rates, zones_to_geo_zones |  | 1151 | // TABLES: tax_rates, zones_to_geo_zones
1156 | function tep_get_tax_rate($class_id, $country_id = -1, $zone_id = -1) { |  | 1152 | function tep_get_tax_rate($class_id, $country_id = -1, $zone_id = -1) {

File: catalog/admin/orders.php

231 | } | = | 231 | }
232 |  |  | 232 |
233 | echo ' </td>' . "\n" . |  | 233 | echo ' </td>' . "\n" .
234 | ' <td class="dataTableContent" valign="top">' . $order->products[$i]['model'] . '</td>' . "\n" . |  | 234 | ' <td class="dataTableContent" valign="top">' . $order->products[$i]['model'] . '</td>' . "\n" .
235 | ' <td class="dataTableContent" align="right" valign="top">' . tep_display_tax_value($order->products[$i]['tax']) . '%</td>' . "\n" . |  | 235 | ' <td class="dataTableContent" align="right" valign="top">' . tep_display_tax_value($order->products[$i]['tax']) . '%</td>' . "\n" .
236 | ' <td class="dataTableContent" align="right" valign="top"><b>' . $currencies->format($order->products[$i]['final_price'], true, $order->info['currency'], $order->info['currency_value']) . '</b></td>' . "\n" . |  | 236 | ' <td class="dataTableContent" align="right" valign="top"><b>' . $currencies->format($order->products[$i]['final_price'], true, $order->info['currency'], $order->info['currency_value']) . '</b></td>' . "\n" .
237 | ' <td class="dataTableContent" align="right" valign="top"><b>' . $currencies->format(tep_add_tax($order->products[$i]['final_price'], $order->products[$i]['tax']), true, $order->info['currency'], $order->info['currency_value']) . '</b></td>' . "\n" . | <> | 237 | ' <td class="dataTableContent" align="right" valign="top"><b>' . $currencies->format(tep_add_tax($order->products[$i]['final_price'], $order->products[$i]['tax'], true), true, $order->info['currency'], $order->info['currency_value']) . '</b></td>' . "\n" .
238 | ' <td class="dataTableContent" align="right" valign="top"><b>' . $currencies->format($order->products[$i]['final_price'] * $order->products[$i]['qty'], true, $order->info['currency'], $order->info['currency_value']) . '</b></td>' . "\n" . | = | 238 | ' <td class="dataTableContent" align="right" valign="top"><b>' . $currencies->format($order->products[$i]['final_price'] * $order->products[$i]['qty'], true, $order->info['currency'], $order->info['currency_value']) . '</b></td>' . "\n" .
239 | ' <td class="dataTableContent" align="right" valign="top"><b>' . $currencies->format(tep_add_tax($order->products[$i]['final_price'], $order->products[$i]['tax']) * $order->products[$i]['qty'], true, $order->info['currency'], $order->info['currency_value']) . '</b></td>' . "\n"; | <> | 239 | ' <td class="dataTableContent" align="right" valign="top"><b>' . $currencies->format(tep_add_tax($order->products[$i]['final_price'], $order->products[$i]['tax'], true) * $order->products[$i]['qty'], true, $order->info['currency'], $order->info['currency_value']) . '</b></td>' . "\n";
240 | echo ' </tr>' . "\n"; | = | 240 | echo ' </tr>' . "\n";
241 | } |  | 241 | }
242 | ?> |  | 242 | ?>
243 | <tr> |  | 243 | <tr>
244 | <td align="right" colspan="8"><table border="0" cellspacing="0" cellpadding="2"> |  | 244 | <td align="right" colspan="8"><table border="0" cellspacing="0" cellpadding="2">
245 | <?php |  | 245 | <?php

File: catalog/admin/invoice.php

114 | } | = | 114 | }
115 |  |  | 115 |
116 | echo ' </td>' . "\n" . |  | 116 | echo ' </td>' . "\n" .
117 | ' <td class="dataTableContent" valign="top">' . $order->products[$i]['model'] . '</td>' . "\n"; |  | 117 | ' <td class="dataTableContent" valign="top">' . $order->products[$i]['model'] . '</td>' . "\n";
118 | echo ' <td class="dataTableContent" align="right" valign="top">' . tep_display_tax_value($order->products[$i]['tax']) . '%</td>' . "\n" . |  | 118 | echo ' <td class="dataTableContent" align="right" valign="top">' . tep_display_tax_value($order->products[$i]['tax']) . '%</td>' . "\n" .
119 | ' <td class="dataTableContent" align="right" valign="top"><b>' . $currencies->format($order->products[$i]['final_price'], true, $order->info['currency'], $order->info['currency_value']) . '</b></td>' . "\n" . |  | 119 | ' <td class="dataTableContent" align="right" valign="top"><b>' . $currencies->format($order->products[$i]['final_price'], true, $order->info['currency'], $order->info['currency_value']) . '</b></td>' . "\n" .
120 | ' <td class="dataTableContent" align="right" valign="top"><b>' . $currencies->format(tep_add_tax($order->products[$i]['final_price'], $order->products[$i]['tax']), true, $order->info['currency'], $order->info['currency_value']) . '</b></td>' . "\n" . | <> | 120 | ' <td class="dataTableContent" align="right" valign="top"><b>' . $currencies->format(tep_add_tax($order->products[$i]['final_price'], $order->products[$i]['tax'], true), true, $order->info['currency'], $order->info['currency_value']) . '</b></td>' . "\n" .
121 | ' <td class="dataTableContent" align="right" valign="top"><b>' . $currencies->format($order->products[$i]['final_price'] * $order->products[$i]['qty'], true, $order->info['currency'], $order->info['currency_value']) . '</b></td>' . "\n" . | = | 121 | ' <td class="dataTableContent" align="right" valign="top"><b>' . $currencies->format($order->products[$i]['final_price'] * $order->products[$i]['qty'], true, $order->info['currency'], $order->info['currency_value']) . '</b></td>' . "\n" .
122 | ' <td class="dataTableContent" align="right" valign="top"><b>' . $currencies->format(tep_add_tax($order->products[$i]['final_price'], $order->products[$i]['tax']) * $order->products[$i]['qty'], true, $order->info['currency'], $order->info['currency_value']) . '</b></td>' . "\n"; | <> | 122 | ' <td class="dataTableContent" align="right" valign="top"><b>' . $currencies->format(tep_add_tax($order->products[$i]['final_price'], $order->products[$i]['tax'], true) * $order->products[$i]['qty'], true, $order->info['currency'], $order->info['currency_value']) . '</b></td>' . "\n";
123 | echo ' </tr>' . "\n"; | = | 123 | echo ' </tr>' . "\n";
124 | } |  | 124 | }
125 | ?> |  | 125 | ?>
126 | <tr> |  | 126 | <tr>
127 | <td align="right" colspan="8"><table border="0" cellspacing="0" cellpadding="2"> |  | 127 | <td align="right" colspan="8"><table border="0" cellspacing="0" cellpadding="2">
128 | <?php |  | 128 | <?php

### [BUGFIX] Country Name on the Order History Page

Fix the display of the country name on the order history page.

Affected Files
catalog/includes/classes/order.php

File: catalog/includes/classes/order.php

68 | 'company' => $order['customers_company'], | = | 68 | 'company' => $order['customers_company'],
69 | 'street_address' => $order['customers_street_address'], |  | 69 | 'street_address' => $order['customers_street_address'],
70 | 'suburb' => $order['customers_suburb'], |  | 70 | 'suburb' => $order['customers_suburb'],
71 | 'city' => $order['customers_city'], |  | 71 | 'city' => $order['customers_city'],
72 | 'postcode' => $order['customers_postcode'], |  | 72 | 'postcode' => $order['customers_postcode'],
73 | 'state' => $order['customers_state'], |  | 73 | 'state' => $order['customers_state'],
74 | 'country' => $order['customers_country'], | <> | 74 | 'country' => array('title' => $order['customers_country']),
75 | 'format_id' => $order['customers_address_format_id'], | = | 75 | 'format_id' => $order['customers_address_format_id'],
76 | 'telephone' => $order['customers_telephone'], |  | 76 | 'telephone' => $order['customers_telephone'],
77 | 'email_address' => $order['customers_email_address']); |  | 77 | 'email_address' => $order['customers_email_address']);
78 |  |  | 78 |
79 | $this->delivery = array('name' => $order['delivery_name'], |  | 79 | $this->delivery = array('name' => $order['delivery_name'],
80 | 'company' => $order['delivery_company'], |  | 80 | 'company' => $order['delivery_company'],
81 | 'street_address' => $order['delivery_street_address'], |  | 81 | 'street_address' => $order['delivery_street_address'],
82 | 'suburb' => $order['delivery_suburb'], |  | 82 | 'suburb' => $order['delivery_suburb'],
83 | 'city' => $order['delivery_city'], |  | 83 | 'city' => $order['delivery_city'],
84 | 'postcode' => $order['delivery_postcode'], |  | 84 | 'postcode' => $order['delivery_postcode'],
85 | 'state' => $order['delivery_state'], |  | 85 | 'state' => $order['delivery_state'],
86 | 'country' => $order['delivery_country'], | <> | 86 | 'country' => array('title' => $order['delivery_country']),
87 | 'format_id' => $order['delivery_address_format_id']); | = | 87 | 'format_id' => $order['delivery_address_format_id']);
88 |  |  | 88 |
89 | if (empty($this->delivery['name']) && empty($this->delivery['street_address'])) { |  | 89 | if (empty($this->delivery['name']) && empty($this->delivery['street_address'])) {
90 | $this->delivery = false; |  | 90 | $this->delivery = false;
91 | } |  | 91 | }
92 |  |  | 92 |
94 | 'company' => $order['billing_company'], | = | 94 | 'company' => $order['billing_company'],
95 | 'street_address' => $order['billing_street_address'], |  | 95 | 'street_address' => $order['billing_street_address'],
96 | 'suburb' => $order['billing_suburb'], |  | 96 | 'suburb' => $order['billing_suburb'],
97 | 'city' => $order['billing_city'], |  | 97 | 'city' => $order['billing_city'],
98 | 'postcode' => $order['billing_postcode'], |  | 98 | 'postcode' => $order['billing_postcode'],
99 | 'state' => $order['billing_state'], |  | 99 | 'state' => $order['billing_state'],
100 | 'country' => $order['billing_country'], | <> | 100 | 'country' => array('title' => $order['billing_country']),
101 | 'format_id' => $order['billing_address_format_id']); | = | 101 | 'format_id' => $order['billing_address_format_id']);
102 |  |  | 102 |
103 | $index = 0; |  | 103 | $index = 0;
104 | $orders_products_query = tep_db_query("select orders_products_id, products_id, products_name, products_model, products_price, products_tax, products_quantity, final_price from " . TABLE_ORDERS_PRODUCTS . " where orders_id = '" . (int)$order_id . "'"); |  | 104 | $orders_products_query = tep_db_query("select orders_products_id, products_id, products_name, products_model, products_price, products_tax, products_quantity, final_price from " . TABLE_ORDERS_PRODUCTS . " where orders_id = '" . (int)$order_id . "'");
105 | while ($orders_products = tep_db_fetch_array($orders_products_query)) { |  | 105 | while ($orders_products = tep_db_fetch_array($orders_products_query)) {
106 | $this->products[$index] = array('qty' => $orders_products['products_quantity'], |  | 106 | $this->products[$index] = array('qty' => $orders_products['products_quantity'],

### [BUGFIX] Shopping Cart Product Quantity as Integer Value

The product quantity is added to the database shopping cart table as an integer so the value in the shopping cart session should also be treated as an integer.

Affected Files
catalog/includes/classes/shopping_cart.php

File: catalog/includes/classes/shopping_cart.php

103 | tep_session_register('new_products_id_in_cart'); | = | 103 | tep_session_register('new_products_id_in_cart');
104 | } |  | 104 | }
105 |  |  | 105 |
106 | if ($this->in_cart($products_id_string)) { |  | 106 | if ($this->in_cart($products_id_string)) {
107 | $this->update_quantity($products_id_string, $qty, $attributes); |  | 107 | $this->update_quantity($products_id_string, $qty, $attributes);
108 | } else { |  | 108 | } else {
109 | $this->contents[$products_id_string] = array('qty' => $qty); | <> | 109 | $this->contents[$products_id_string] = array('qty' => (int)$qty);
110 | // insert into database | = | 110 | // insert into database
111 | if (tep_session_is_registered('customer_id')) tep_db_query("insert into " . TABLE_CUSTOMERS_BASKET . " (customers_id, products_id, customers_basket_quantity, customers_basket_date_added) values ('" . (int)$customer_id . "', '" . tep_db_input($products_id_string) . "', '" . (int)$qty . "', '" . date('Ymd') . "')"); |  | 111 | if (tep_session_is_registered('customer_id')) tep_db_query("insert into " . TABLE_CUSTOMERS_BASKET . " (customers_id, products_id, customers_basket_quantity, customers_basket_date_added) values ('" . (int)$customer_id . "', '" . tep_db_input($products_id_string) . "', '" . (int)$qty . "', '" . date('Ymd') . "')");
112 |  |  | 112 |
113 | if (is_array($attributes)) { |  | 113 | if (is_array($attributes)) {
114 | reset($attributes); |  | 114 | reset($attributes);
115 | while (list($option, $value) = each($attributes)) { |  | 115 | while (list($option, $value) = each($attributes)) {
144 | break; | = | 144 | break;
145 | } |  | 145 | }
146 | } |  | 146 | }
147 | } |  | 147 | }
148 |  |  | 148 |
149 | if (is_numeric($products_id) && isset($this->contents[$products_id_string]) && is_numeric($quantity) && ($attributes_pass_check == true)) { |  | 149 | if (is_numeric($products_id) && isset($this->contents[$products_id_string]) && is_numeric($quantity) && ($attributes_pass_check == true)) {
150 | $this->contents[$products_id_string] = array('qty' => $quantity); | <> | 150 | $this->contents[$products_id_string] = array('qty' => (int)$quantity);
151 | // update database | = | 151 | // update database
152 | if (tep_session_is_registered('customer_id')) tep_db_query("update " . TABLE_CUSTOMERS_BASKET . " set customers_basket_quantity = '" . (int)$quantity . "' where customers_id = '" . (int)$customer_id . "' and products_id = '" . tep_db_input($products_id_string) . "'"); |  | 152 | if (tep_session_is_registered('customer_id')) tep_db_query("update " . TABLE_CUSTOMERS_BASKET . " set customers_basket_quantity = '" . (int)$quantity . "' where customers_id = '" . (int)$customer_id . "' and products_id = '" . tep_db_input($products_id_string) . "'");
153 |  |  | 153 |
154 | if (is_array($attributes)) { |  | 154 | if (is_array($attributes)) {
155 | reset($attributes); |  | 155 | reset($attributes);
156 | while (list($option, $value) = each($attributes)) { |  | 156 | while (list($option, $value) = each($attributes)) {

### [IMPROVEMENT] Maximum Order Product Quantities [+SQL]

Add a new configuration parameter to control the maximum quantity number a product can be ordered (default 99).

Database Changes to Perform:
INSERT INTO configuration (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) VALUES ('Product Quantities In Shopping Cart', 'MAX_QTY_IN_CART', '99', 'Maximum number of product quantities that can be added to the shopping cart (0 for no limit)', '3', '19', now());

Affected Files
catalog/includes/classes/shopping_cart.php

File: catalog/includes/classes/shopping_cart.php

78 | function add_cart($products_id, $qty = '1', $attributes = '', $notify = true) { | = | 78 | function add_cart($products_id, $qty = '1', $attributes = '', $notify = true) {
79 | global $new_products_id_in_cart, $customer_id; |  | 79 | global $new_products_id_in_cart, $customer_id;
80 |  |  | 80 |
81 | $products_id_string = tep_get_uprid($products_id, $attributes); |  | 81 | $products_id_string = tep_get_uprid($products_id, $attributes);
82 | $products_id = tep_get_prid($products_id_string); |  | 82 | $products_id = tep_get_prid($products_id_string);
83 |  |  | 83 |
|  | -+ | 84 | if (defined('MAX_QTY_IN_CART') && (MAX_QTY_IN_CART > 0) && ((int)$qty > MAX_QTY_IN_CART)) {
|  |  | 85 | $qty = MAX_QTY_IN_CART;
|  |  | 86 | }
|  |  | 87 |
84 | $attributes_pass_check = true; | = | 88 | $attributes_pass_check = true;
85 |  |  | 89 |
86 | if (is_array($attributes)) { |  | 90 | if (is_array($attributes)) {
87 | reset($attributes); |  | 91 | reset($attributes);
88 | while (list($option, $value) = each($attributes)) { |  | 92 | while (list($option, $value) = each($attributes)) {
89 | if (!is_numeric($option) || !is_numeric($value)) { |  | 93 | if (!is_numeric($option) || !is_numeric($value)) {
130 |  | = | 134 |
131 | function update_quantity($products_id, $quantity = '', $attributes = '') { |  | 135 | function update_quantity($products_id, $quantity = '', $attributes = '') {
132 | global $customer_id; |  | 136 | global $customer_id;
133 |  |  | 137 |
134 | $products_id_string = tep_get_uprid($products_id, $attributes); |  | 138 | $products_id_string = tep_get_uprid($products_id, $attributes);
135 | $products_id = tep_get_prid($products_id_string); |  | 139 | $products_id = tep_get_prid($products_id_string);
|  | -+ | 140 |
|  |  | 141 | if (defined('MAX_QTY_IN_CART') && (MAX_QTY_IN_CART > 0) && ((int)$quantity > MAX_QTY_IN_CART)) {
|  |  | 142 | $quantity = MAX_QTY_IN_CART;
|  |  | 143 | }
136 |  | = | 144 |
137 | $attributes_pass_check = true; |  | 145 | $attributes_pass_check = true;
138 |  |  | 146 |
139 | if (is_array($attributes)) { |  | 147 | if (is_array($attributes)) {
140 | reset($attributes); |  | 148 | reset($attributes);
141 | while (list($option, $value) = each($attributes)) { |  | 149 | while (list($option, $value) = each($attributes)) {

### [IMPROVEMENT] Accepting State Names

Improve the logic of accepting state names.

Affected Files
catalog/address_book_process.php
catalog/checkout_payment_address.php
catalog/checkout_shipping_address.php
catalog/create_account.php

File: catalog/address_book_process.php

99 | if (ACCOUNT_STATE == 'true') { | = | 99 | if (ACCOUNT_STATE == 'true') {
100 | $zone_id = 0; |  | 100 | $zone_id = 0;
101 | $check_query = tep_db_query("select count(*) as total from " . TABLE_ZONES . " where zone_country_id = '" . (int)$country . "'"); |  | 101 | $check_query = tep_db_query("select count(*) as total from " . TABLE_ZONES . " where zone_country_id = '" . (int)$country . "'");
102 | $check = tep_db_fetch_array($check_query); |  | 102 | $check = tep_db_fetch_array($check_query);
103 | $entry_state_has_zones = ($check['total'] > 0); |  | 103 | $entry_state_has_zones = ($check['total'] > 0);
104 | if ($entry_state_has_zones == true) { |  | 104 | if ($entry_state_has_zones == true) {
105 | $zone_query = tep_db_query("select distinct zone_id from " . TABLE_ZONES . " where zone_country_id = '" . (int)$country . "' and (zone_name lik e '" . tep_db_input($state) . "%' or zone_code lik e '%" . tep_db_input($state) . "%')"); | <> | 105 | $zone_query = tep_db_query("select distinct zone_id from " . TABLE_ZONES . " where zone_country_id = '" . (int)$country . "' and (zone_name = '" . tep_db_input($state) . "' or zone_code = '" . tep_db_input($state) . "')");
106 | if (tep_db_num_rows($zone_query) == 1) { | = | 106 | if (tep_db_num_rows($zone_query) == 1) {
107 | $zone = tep_db_fetch_array($zone_query); |  | 107 | $zone = tep_db_fetch_array($zone_query);
108 | $zone_id = $zone['zone_id']; |  | 108 | $zone_id = $zone['zone_id'];
109 | } else { |  | 109 | } else {
110 | $error = true; |  | 110 | $error = true;
111 |  |  | 111 |

File: catalog/checkout_payment_address.php

92 | if (ACCOUNT_STATE == 'true') { | = | 92 | if (ACCOUNT_STATE == 'true') {
93 | $zone_id = 0; |  | 93 | $zone_id = 0;
94 | $check_query = tep_db_query("select count(*) as total from " . TABLE_ZONES . " where zone_country_id = '" . (int)$country . "'"); |  | 94 | $check_query = tep_db_query("select count(*) as total from " . TABLE_ZONES . " where zone_country_id = '" . (int)$country . "'");
95 | $check = tep_db_fetch_array($check_query); |  | 95 | $check = tep_db_fetch_array($check_query);
96 | $entry_state_has_zones = ($check['total'] > 0); |  | 96 | $entry_state_has_zones = ($check['total'] > 0);
97 | if ($entry_state_has_zones == true) { |  | 97 | if ($entry_state_has_zones == true) {
98 | $zone_query = tep_db_query("select distinct zone_id from " . TABLE_ZONES . " where zone_country_id = '" . (int)$country . "' and (zone_name lik e '" . tep_db_input($state) . "%' or zone_code lik e '%" . tep_db_input($state) . "%')"); | <> | 98 | $zone_query = tep_db_query("select distinct zone_id from " . TABLE_ZONES . " where zone_country_id = '" . (int)$country . "' and (zone_name = '" . tep_db_input($state) . "' or zone_code = '" . tep_db_input($state) . "')");
99 | if (tep_db_num_rows($zone_query) == 1) { | = | 99 | if (tep_db_num_rows($zone_query) == 1) {
100 | $zone = tep_db_fetch_array($zone_query); |  | 100 | $zone = tep_db_fetch_array($zone_query);
101 | $zone_id = $zone['zone_id']; |  | 101 | $zone_id = $zone['zone_id'];
102 | } else { |  | 102 | } else {
103 | $error = true; |  | 103 | $error = true;
104 |  |  | 104 |

File: catalog/checkout_shipping_address.php

105 | if (ACCOUNT_STATE == 'true') { | = | 105 | if (ACCOUNT_STATE == 'true') {
106 | $zone_id = 0; |  | 106 | $zone_id = 0;
107 | $check_query = tep_db_query("select count(*) as total from " . TABLE_ZONES . " where zone_country_id = '" . (int)$country . "'"); |  | 107 | $check_query = tep_db_query("select count(*) as total from " . TABLE_ZONES . " where zone_country_id = '" . (int)$country . "'");
108 | $check = tep_db_fetch_array($check_query); |  | 108 | $check = tep_db_fetch_array($check_query);
109 | $entry_state_has_zones = ($check['total'] > 0); |  | 109 | $entry_state_has_zones = ($check['total'] > 0);
110 | if ($entry_state_has_zones == true) { |  | 110 | if ($entry_state_has_zones == true) {
111 | $zone_query = tep_db_query("select distinct zone_id from " . TABLE_ZONES . " where zone_country_id = '" . (int)$country . "' and (zone_name lik e '" . tep_db_input($state) . "%' or zone_code lik e '%" . tep_db_input($state) . "%')"); | <> | 111 | $zone_query = tep_db_query("select distinct zone_id from " . TABLE_ZONES . " where zone_country_id = '" . (int)$country . "' and (zone_name = '" . tep_db_input($state) . "' or zone_code = '" . tep_db_input($state) . "')");
112 | if (tep_db_num_rows($zone_query) == 1) { | = | 112 | if (tep_db_num_rows($zone_query) == 1) {
113 | $zone = tep_db_fetch_array($zone_query); |  | 113 | $zone = tep_db_fetch_array($zone_query);
114 | $zone_id = $zone['zone_id']; |  | 114 | $zone_id = $zone['zone_id'];
115 | } else { |  | 115 | } else {
116 | $error = true; |  | 116 | $error = true;
117 |  |  | 117 |

File: catalog/create_account.php

129 | if (ACCOUNT_STATE == 'true') { | = | 129 | if (ACCOUNT_STATE == 'true') {
130 | $zone_id = 0; |  | 130 | $zone_id = 0;
131 | $check_query = tep_db_query("select count(*) as total from " . TABLE_ZONES . " where zone_country_id = '" . (int)$country . "'"); |  | 131 | $check_query = tep_db_query("select count(*) as total from " . TABLE_ZONES . " where zone_country_id = '" . (int)$country . "'");
132 | $check = tep_db_fetch_array($check_query); |  | 132 | $check = tep_db_fetch_array($check_query);
133 | $entry_state_has_zones = ($check['total'] > 0); |  | 133 | $entry_state_has_zones = ($check['total'] > 0);
134 | if ($entry_state_has_zones == true) { |  | 134 | if ($entry_state_has_zones == true) {
135 | $zone_query = tep_db_query("select distinct zone_id from " . TABLE_ZONES . " where zone_country_id = '" . (int)$country . "' and (zone_name lik e '" . tep_db_input($state) . "%' or zone_code lik e '%" . tep_db_input($state) . "%')"); | <> | 135 | $zone_query = tep_db_query("select distinct zone_id from " . TABLE_ZONES . " where zone_country_id = '" . (int)$country . "' and (zone_name = '" . tep_db_input($state) . "' or zone_code = '" . tep_db_input($state) . "')");
136 | if (tep_db_num_rows($zone_query) == 1) { | = | 136 | if (tep_db_num_rows($zone_query) == 1) {
137 | $zone = tep_db_fetch_array($zone_query); |  | 137 | $zone = tep_db_fetch_array($zone_query);
138 | $zone_id = $zone['zone_id']; |  | 138 | $zone_id = $zone['zone_id'];
139 | } else { |  | 139 | } else {
140 | $error = true; |  | 140 | $error = true;
141 |  |  | 141 |

### [BUGFIX] Load the Order Total Modules Before Loading the Payment Modules

The order total modules should be loaded before the payment modules so the payment modules have access to the order total values.

Affected Files
catalog/checkout_process.php

File: catalog/checkout_process.php

43 | require(DIR_WS_CLASSES . 'shipping.php'); | = | 43 | require(DIR_WS_CLASSES . 'shipping.php');
44 | $shipping_modules = new shipping($shipping); |  | 44 | $shipping_modules = new shipping($shipping);
45 |  |  | 45 |
46 | require(DIR_WS_CLASSES . 'order.php'); |  | 46 | require(DIR_WS_CLASSES . 'order.php');
47 | $order = new order; |  | 47 | $order = new order;
48 |  |  | 48 |
49 | // load the before_process function from the payment modules | +- |  |
50 | $payment_modules->before_process(); |  |  |
51 |  |  |  |
52 | require(DIR_WS_CLASSES . 'order_total.php'); | = | 49 | require(DIR_WS_CLASSES . 'order_total.php');
53 | $order_total_modules = new order_total; |  | 50 | $order_total_modules = new order_total;
54 |  |  | 51 |
55 | $order_totals = $order_total_modules->process(); |  | 52 | $order_totals = $order_total_modules->process();
|  | -+ | 53 |
|  |  | 54 | // load the before_process function from the payment modules
|  |  | 55 | $payment_modules->before_process();
56 |  | = | 56 |
57 | $sql_data_array = array('customers_id' => $customer_id, |  | 57 | $sql_data_array = array('customers_id' => $customer_id,
58 | 'customers_name' => $order->customer['firstname'] . ' ' . $order->customer['lastname'], |  | 58 | 'customers_name' => $order->customer['firstname'] . ' ' . $order->customer['lastname'],
59 | 'customers_company' => $order->customer['company'], |  | 59 | 'customers_company' => $order->customer['company'],
60 | 'customers_street_address' => $order->customer['street_address'], |  | 60 | 'customers_street_address' => $order->customer['street_address'],
61 | 'customers_suburb' => $order->customer['suburb'], |  | 61 | 'customers_suburb' => $order->customer['suburb'],

### [BUGFIX] Payment Module Selection

Pass the selected module code to its radio button to have it selected by default if a payment method has already been selected.

Affected Files
catalog/checkout_payment.php

File: catalog/checkout_payment.php

255 | ?> | = | 255 | ?>
256 | <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td> |  | 256 | <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
257 | <td class="main" colspan="3"><b><?php echo $selection[$i]['module']; ?></b></td> |  | 257 | <td class="main" colspan="3"><b><?php echo $selection[$i]['module']; ?></b></td>
258 | <td class="main" align="right"> |  | 258 | <td class="main" align="right">
259 | <?php |  | 259 | <?php
260 | if (sizeof($selection) > 1) { |  | 260 | if (sizeof($selection) > 1) {
261 | echo tep_draw_radio_field('payment', $selection[$i]['id']); | <> | 261 | echo tep_draw_radio_field('payment', $selection[$i]['id'], ($selection[$i]['id'] == $payment));
262 | } else { | = | 262 | } else {
263 | echo tep_draw_hidden_field('payment', $selection[$i]['id']); |  | 263 | echo tep_draw_hidden_field('payment', $selection[$i]['id']);
264 | } |  | 264 | }
265 | ?> |  | 265 | ?>
266 | </td> |  | 266 | </td>
267 | <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td> |  | 267 | <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>

### [BUGFIX] Category Image Removal

Don't delete the category image when editing its values without uploading a new image.

Affected Files
catalog/admin/categories.php

File: catalog/admin/categories.php

74 | tep_db_perform(TABLE_CATEGORIES_DESCRIPTION, $sql_data_array); | = | 74 | tep_db_perform(TABLE_CATEGORIES_DESCRIPTION, $sql_data_array);
75 | } elseif ($action == 'update_category') { |  | 75 | } elseif ($action == 'update_category') {
76 | tep_db_perform(TABLE_CATEGORIES_DESCRIPTION, $sql_data_array, 'update', "categories_id = '" . (int)$categories_id . "' and language_id = '" . (int)$languages[$i]['id'] . "'"); |  | 76 | tep_db_perform(TABLE_CATEGORIES_DESCRIPTION, $sql_data_array, 'update', "categories_id = '" . (int)$categories_id . "' and language_id = '" . (int)$languages[$i]['id'] . "'");
77 | } |  | 77 | }
78 | } |  | 78 | }
79 |  |  | 79 |
80 | if ($categories_image = new upload('categories_image', DIR_FS_CATALOG_IMAGES)) { | <> | 80 | $categories_image = new upload('categories_image');
|  |  | 81 | $categories_image->set_destination(DIR_FS_CATALOG_IMAGES);
|  |  | 82 |
|  |  | 83 | if ($categories_image->parse() && $categories_image->save()) {
81 | tep_db_query("update " . TABLE_CATEGORIES . " set categories_image = '" . tep_db_input($categories_image->filename) . "' where categories_id = '" . (int)$categories_id . "'"); | = | 84 | tep_db_query("update " . TABLE_CATEGORIES . " set categories_image = '" . tep_db_input($categories_image->filename) . "' where categories_id = '" . (int)$categories_id . "'");
82 | } |  | 85 | }
83 |  |  | 86 |
84 | if (USE_CACHE == 'true') { |  | 87 | if (USE_CACHE == 'true') {
85 | tep_reset_cache_block('categories'); |  | 88 | tep_reset_cache_block('categories');
86 | tep_reset_cache_block('also_purchased'); |  | 89 | tep_reset_cache_block('also_purchased');

### [BUGFIX] Add the Session ID to GET Based Forms

Add the session ID to GET based forms incase the browser has cookies disabled.

Affected Files
catalog/index.php
catalog/admin/includes/classes/split_page_results.php
catalog/admin/includes/functions/html_output.php
catalog/admin/banner_statistics.php
catalog/admin/categories.php
catalog/admin/customers.php
catalog/admin/define_language.php
catalog/admin/file_manager.php
catalog/admin/index.php
catalog/admin/orders.php

File: catalog/index.php

250 | } | = | 250 | }
251 | echo tep_draw_hidden_field('sort', $HTTP_GET_VARS['sort']); |  | 251 | echo tep_draw_hidden_field('sort', $HTTP_GET_VARS['sort']);
252 | while ($filterlist = tep_db_fetch_array($filterlist_query)) { |  | 252 | while ($filterlist = tep_db_fetch_array($filterlist_query)) {
253 | $options[] = array('id' => $filterlist['id'], 'text' => $filterlist['name']); |  | 253 | $options[] = array('id' => $filterlist['id'], 'text' => $filterlist['name']);
254 | } |  | 254 | }
255 | echo tep_draw_pull_down_menu('filter_id', $options, (isset($HTTP_GET_VARS['filter_id']) ? $HTTP_GET_VARS['filter_id'] : ''), 'onchange="this.form.submit()"'); |  | 255 | echo tep_draw_pull_down_menu('filter_id', $options, (isset($HTTP_GET_VARS['filter_id']) ? $HTTP_GET_VARS['filter_id'] : ''), 'onchange="this.form.submit()"');
256 | echo '</form></td>' . "\n"; | <> | 256 | echo tep_hide_session_id() . '</form></td>' . "\n";
257 | } | = | 257 | }
258 | } |  | 258 | }
259 |  |  | 259 |
260 | // Get the right image for the top-right |  | 260 | // Get the right image for the top-right
261 | $image = DIR_WS_IMAGES . 'table_background_list.gif'; |  | 261 | $image = DIR_WS_IMAGES . 'table_background_list.gif';
262 | if (isset($HTTP_GET_VARS['manufacturers_id'])) { |  | 262 | if (isset($HTTP_GET_VARS['manufacturers_id'])) {

File: catalog/admin/includes/classes/split_page_results.php

74 | while (list(, $pair) = each($pairs)) { | = | 74 | while (list(, $pair) = each($pairs)) {
75 | list($key,$value) = explode('=', $pair); |  | 75 | list($key,$value) = explode('=', $pair);
76 | $display_links .= tep_draw_hidden_field(rawurldecode($key), rawurldecode($value)); |  | 76 | $display_links .= tep_draw_hidden_field(rawurldecode($key), rawurldecode($value));
77 | } |  | 77 | }
78 | } |  | 78 | }
79 |  |  | 79 |
80 | if (SID) $display_links .= tep_draw_hidden_field(tep_session_name(), tep_session_id()); | <> |  |
81 |  |  |  |
82 | $display_links .= '</form>'; |  | 80 | $display_links .= tep_hide_session_id() . '</form>';
83 | } else { | = | 81 | } else {
84 | $display_links = sprintf(TEXT_RESULT_PAGE, $num_pages, $num_pages); |  | 82 | $display_links = sprintf(TEXT_RESULT_PAGE, $num_pages, $num_pages);
85 | } |  | 83 | }
86 |  |  | 84 |
87 | return $display_links; |  | 85 | return $display_links;
88 | } |  | 86 | }

File: catalog/admin/includes/functions/html_output.php

289 | $field .= '>'; | = | 289 | $field .= '>';
290 |  |  | 290 |
291 | return $field; |  | 291 | return $field;
292 | } |  | 292 | }
293 |  |  | 293 |
294 | //// |  | 294 | ////
|  | -+ | 295 | // Hide form elements
|  |  | 296 | function tep_hide_session_id() {
|  |  | 297 | $string = '';
|  |  | 298 |
|  |  | 299 | if (defined('SID') && tep_not_null(SID)) {
|  |  | 300 | $string = tep_draw_hidden_field(tep_session_name(), tep_session_id());
|  |  | 301 | }
|  |  | 302 |
|  |  | 303 | return $string;
|  |  | 304 | }
|  |  | 305 |
|  |  | 306 | ////
295 | // Output a form pull down menu | = | 307 | // Output a form pull down menu
296 | function tep_draw_pull_down_menu($name, $values, $default = '', $parameters = '', $required = false) { |  | 308 | function tep_draw_pull_down_menu($name, $values, $default = '', $parameters = '', $required = false) {
297 | global $HTTP_GET_VARS, $HTTP_POST_VARS; |  | 309 | global $HTTP_GET_VARS, $HTTP_POST_VARS;
298 |  |  | 310 |
299 | $field = '<select name="' . tep_output_string($name) . '"'; |  | 311 | $field = '<select name="' . tep_output_string($name) . '"';
300 |  |  | 312 |

File: catalog/admin/banner_statistics.php

91 | case 'daily': | = | 91 | case 'daily':
92 | echo TITLE_MONTH . ' ' . tep_draw_pull_down_menu('month', $months_array, (isset($HTTP_GET_VARS['month']) ? $HTTP_GET_VARS['month'] : date('n')), 'onChange="this.form.submit();"') . '<noscript><input type="submit" value="GO"></noscript><br>' . TITLE_YEAR . ' ' . tep_draw_pull_down_menu('year', $years_array, (isset($HTTP_GET_VARS['year']) ? $HTTP_GET_VARS['year'] : date('Y')), 'onChange="this.form.submit();"') . '<noscript><input type="submit" value="GO"></noscript>'; |  | 92 | echo TITLE_MONTH . ' ' . tep_draw_pull_down_menu('month', $months_array, (isset($HTTP_GET_VARS['month']) ? $HTTP_GET_VARS['month'] : date('n')), 'onChange="this.form.submit();"') . '<noscript><input type="submit" value="GO"></noscript><br>' . TITLE_YEAR . ' ' . tep_draw_pull_down_menu('year', $years_array, (isset($HTTP_GET_VARS['year']) ? $HTTP_GET_VARS['year'] : date('Y')), 'onChange="this.form.submit();"') . '<noscript><input type="submit" value="GO"></noscript>';
93 | break; |  | 93 | break;
94 | } |  | 94 | }
95 | ?> |  | 95 | ?>
96 | </td> |  | 96 | </td>
97 | <?php echo tep_draw_hidden_field('page', $HTTP_GET_VARS['page']) . tep_draw_hidden_field('bID', $HTTP_GET_VARS['bID']); ?></form></tr> | <> | 97 | <?php echo tep_draw_hidden_field('page', $HTTP_GET_VARS['page']) . tep_draw_hidden_field('bID', $HTTP_GET_VARS['bID']) . tep_hide_session_id(); ?></form></tr>
98 | </table></td> | = | 98 | </table></td>
99 | </tr> |  | 99 | </tr>
100 | <tr> |  | 100 | <tr>
101 | <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td> |  | 101 | <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
102 | </tr> |  | 102 | </tr>
103 | <tr> |  | 103 | <tr>

File: catalog/admin/categories.php

740 | <td align="right"><table border="0" width="100%" cellspacing="0" cellpadding="0"> | = | 740 | <td align="right"><table border="0" width="100%" cellspacing="0" cellpadding="0">
741 | <tr> |  | 741 | <tr>
742 | <td class="smallText" align="right"> |  | 742 | <td class="smallText" align="right">
743 | <?php |  | 743 | <?php
744 | echo tep_draw_form('search', FILENAME_CATEGORIES, '', 'get'); |  | 744 | echo tep_draw_form('search', FILENAME_CATEGORIES, '', 'get');
745 | echo HEADING_TITLE_SEARCH . ' ' . tep_draw_input_field('search'); |  | 745 | echo HEADING_TITLE_SEARCH . ' ' . tep_draw_input_field('search');
746 | echo '</form>'; | <> | 746 | echo tep_hide_session_id() . '</form>';
747 | ?> | = | 747 | ?>
748 | </td> |  | 748 | </td>
749 | </tr> |  | 749 | </tr>
750 | <tr> |  | 750 | <tr>
751 | <td class="smallText" align="right"> |  | 751 | <td class="smallText" align="right">
752 | <?php |  | 752 | <?php
753 | echo tep_draw_form('goto', FILENAME_CATEGORIES, '', 'get'); |  | 753 | echo tep_draw_form('goto', FILENAME_CATEGORIES, '', 'get');
754 | echo HEADING_TITLE_GOTO . ' ' . tep_draw_pull_down_menu('cPath', tep_get_category_tree(), $current_category_id, 'onChange="this.form.submit();"'); |  | 754 | echo HEADING_TITLE_GOTO . ' ' . tep_draw_pull_down_menu('cPath', tep_get_category_tree(), $current_category_id, 'onChange="this.form.submit();"');
755 | echo '</form>'; | <> | 755 | echo tep_hide_session_id() . '</form>';
756 | ?> | = | 756 | ?>
757 | </td> |  | 757 | </td>
758 | </tr> |  | 758 | </tr>
759 | </table></td> |  | 759 | </table></td>
760 | </tr> |  | 760 | </tr>
761 | </table></td> |  | 761 | </table></td>

File: catalog/admin/customers.php

694 | <tr> | = | 694 | <tr>
695 | <td><table border="0" width="100%" cellspacing="0" cellpadding="0"> |  | 695 | <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
696 | <tr><?php echo tep_draw_form('search', FILENAME_CUSTOMERS, '', 'get'); ?> |  | 696 | <tr><?php echo tep_draw_form('search', FILENAME_CUSTOMERS, '', 'get'); ?>
697 | <td class="pageHeading"><?php echo HEADING_TITLE; ?></td> |  | 697 | <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
698 | <td class="pageHeading" align="right"><?php echo tep_draw_separator('pixel_trans.gif', 1, HEADING_IMAGE_HEIGHT); ?></td> |  | 698 | <td class="pageHeading" align="right"><?php echo tep_draw_separator('pixel_trans.gif', 1, HEADING_IMAGE_HEIGHT); ?></td>
699 | <td class="smallText" align="right"><?php echo HEADING_TITLE_SEARCH . ' ' . tep_draw_input_field('search'); ?></td> |  | 699 | <td class="smallText" align="right"><?php echo HEADING_TITLE_SEARCH . ' ' . tep_draw_input_field('search'); ?></td>
700 | </form></tr> | <> | 700 | <?php echo tep_hide_session_id(); ?></form></tr>
701 | </table></td> | = | 701 | </table></td>
702 | </tr> |  | 702 | </tr>
703 | <tr> |  | 703 | <tr>
704 | <td><table border="0" width="100%" cellspacing="0" cellpadding="0"> |  | 704 | <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
705 | <tr> |  | 705 | <tr>
706 | <td valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2"> |  | 706 | <td valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">

File: catalog/admin/define_language.php

81 | <tr> | = | 81 | <tr>
82 | <td><table border="0" width="100%" cellspacing="0" cellpadding="0"> |  | 82 | <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
83 | <tr><?php echo tep_draw_form('lng', FILENAME_DEFINE_LANGUAGE, '', 'get'); ?> |  | 83 | <tr><?php echo tep_draw_form('lng', FILENAME_DEFINE_LANGUAGE, '', 'get'); ?>
84 | <td class="pageHeading"><?php echo HEADING_TITLE; ?></td> |  | 84 | <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
85 | <td class="pageHeading" align="right"><?php echo tep_draw_separator('pixel_trans.gif', '1', HEADING_IMAGE_HEIGHT); ?></td> |  | 85 | <td class="pageHeading" align="right"><?php echo tep_draw_separator('pixel_trans.gif', '1', HEADING_IMAGE_HEIGHT); ?></td>
86 | <td class="pageHeading" align="right"><?php echo tep_draw_pull_down_menu('lngdir', $languages_array, $language, 'onChange="this.form.submit();"'); ?></td> |  | 86 | <td class="pageHeading" align="right"><?php echo tep_draw_pull_down_menu('lngdir', $languages_array, $language, 'onChange="this.form.submit();"'); ?></td>
87 | </form></tr> | <> | 87 | <?php echo tep_hide_session_id(); ?></form></tr>
88 | </table></td> | = | 88 | </table></td>
89 | </tr> |  | 89 | </tr>
90 | <tr> |  | 90 | <tr>
91 | <td><table border="0" width="100%" cellspacing="0" cellpadding="2"> |  | 91 | <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
92 | <?php |  | 92 | <?php
93 | if (isset($HTTP_GET_VARS['lngdir']) && isset($HTTP_GET_VARS['filename'])) { |  | 93 | if (isset($HTTP_GET_VARS['lngdir']) && isset($HTTP_GET_VARS['filename'])) {

File: catalog/admin/file_manager.php

129 | <tr> | = | 129 | <tr>
130 | <td width="100%"><table border="0" width="100%" cellspacing="0" cellpadding="0"> |  | 130 | <td width="100%"><table border="0" width="100%" cellspacing="0" cellpadding="0">
131 | <tr><?php echo tep_draw_form('goto', FILENAME_FILE_MANAGER, '', 'get'); ?> |  | 131 | <tr><?php echo tep_draw_form('goto', FILENAME_FILE_MANAGER, '', 'get'); ?>
132 | <td class="pageHeading"><?php echo HEADING_TITLE . '<br><span class="smallText">' . $current_path . '</span>'; ?></td> |  | 132 | <td class="pageHeading"><?php echo HEADING_TITLE . '<br><span class="smallText">' . $current_path . '</span>'; ?></td>
133 | <td class="pageHeading" align="right"><?php echo tep_draw_separator('pixel_trans.gif', '1', HEADING_IMAGE_HEIGHT); ?></td> |  | 133 | <td class="pageHeading" align="right"><?php echo tep_draw_separator('pixel_trans.gif', '1', HEADING_IMAGE_HEIGHT); ?></td>
134 | <td class="pageHeading" align="right"><?php echo tep_draw_pull_down_menu('goto', $goto_array, $current_path, 'onChange="this.form.submit();"'); ?></td> |  | 134 | <td class="pageHeading" align="right"><?php echo tep_draw_pull_down_menu('goto', $goto_array, $current_path, 'onChange="this.form.submit();"'); ?></td>
135 | </form></tr> | <> | 135 | <?php echo tep_hide_session_id(); ?></form></tr>
136 | </table></td> | = | 136 | </table></td>
137 | </tr> |  | 137 | </tr>
138 | <?php |  | 138 | <?php
139 | if ( (($action == 'new_file') && ($directory_writeable == true)) || ($action == 'edit') ) { |  | 139 | if ( (($action == 'new_file') && ($directory_writeable == true)) || ($action == 'edit') ) {
140 | if (isset($HTTP_GET_VARS['info']) && strstr($HTTP_GET_VARS['info'], '..')) tep_redirect(tep_href_link(FILENAME_FILE_MANAGER)); |  | 140 | if (isset($HTTP_GET_VARS['info']) && strstr($HTTP_GET_VARS['info'], '..')) tep_redirect(tep_href_link(FILENAME_FILE_MANAGER));
141 |  |  | 141 |

File: catalog/admin/index.php

189 | <td width="460"><table border="0" width="460" height="390" cellspacing="0" cellpadding="2"> | = | 189 | <td width="460"><table border="0" width="460" height="390" cellspacing="0" cellpadding="2">
190 | <tr> |  | 190 | <tr>
191 | <td colspan="2"><table border="0" width="100%" cellspacing="0" cellpadding="2"> |  | 191 | <td colspan="2"><table border="0" width="100%" cellspacing="0" cellpadding="2">
192 | <tr><?php echo tep_draw_form('languages', 'index.php', '', 'get'); ?> |  | 192 | <tr><?php echo tep_draw_form('languages', 'index.php', '', 'get'); ?>
193 | <td class="heading"><?php echo HEADING_TITLE; ?></td> |  | 193 | <td class="heading"><?php echo HEADING_TITLE; ?></td>
194 | <td align="right"><?php echo tep_draw_pull_down_menu('language', $languages_array, $languages_selected, 'onChange="this.form.submit();"'); ?></td> |  | 194 | <td align="right"><?php echo tep_draw_pull_down_menu('language', $languages_array, $languages_selected, 'onChange="this.form.submit();"'); ?></td>
195 | </form></tr> | <> | 195 | <?php echo tep_hide_session_id(); ?></form></tr>
196 | </table></td> | = | 196 | </table></td>
197 | </tr> |  | 197 | </tr>
198 | <?php |  | 198 | <?php
199 | $col = 2; |  | 199 | $col = 2;
200 | $counter = 0; |  | 200 | $counter = 0;
201 | for ($i = 0, $n = sizeof($cat); $i < $n; $i++) { |  | 201 | for ($i = 0, $n = sizeof($cat); $i < $n; $i++) {

File: catalog/admin/orders.php

328 | <tr> | = | 328 | <tr>
329 | <td class="pageHeading"><?php echo HEADING_TITLE; ?></td> |  | 329 | <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
330 | <td class="pageHeading" align="right"><?php echo tep_draw_separator('pixel_trans.gif', 1, HEADING_IMAGE_HEIGHT); ?></td> |  | 330 | <td class="pageHeading" align="right"><?php echo tep_draw_separator('pixel_trans.gif', 1, HEADING_IMAGE_HEIGHT); ?></td>
331 | <td align="right"><table border="0" width="100%" cellspacing="0" cellpadding="0"> |  | 331 | <td align="right"><table border="0" width="100%" cellspacing="0" cellpadding="0">
332 | <tr><?php echo tep_draw_form('orders', FILENAME_ORDERS, '', 'get'); ?> |  | 332 | <tr><?php echo tep_draw_form('orders', FILENAME_ORDERS, '', 'get'); ?>
333 | <td class="smallText" align="right"><?php echo HEADING_TITLE_SEARCH . ' ' . tep_draw_input_field('oID', '', 'size="12"') . tep_draw_hidden_field('action', 'edit'); ?></td> |  | 333 | <td class="smallText" align="right"><?php echo HEADING_TITLE_SEARCH . ' ' . tep_draw_input_field('oID', '', 'size="12"') . tep_draw_hidden_field('action', 'edit'); ?></td>
334 | </form></tr> | <> | 334 | <?php echo tep_hide_session_id(); ?></form></tr>
335 | <tr><?php echo tep_draw_form('status', FILENAME_ORDERS, '', 'get'); ?> | = | 335 | <tr><?php echo tep_draw_form('status', FILENAME_ORDERS, '', 'get'); ?>
336 | <td class="smallText" align="right"><?php echo HEADING_TITLE_STATUS . ' ' . tep_draw_pull_down_menu('status', array_merge(array(array('id' => '', 'text' => TEXT_ALL_ORDERS)), $orders_statuses), '', 'onChange="this.form.submit();"'); ?></td> |  | 336 | <td class="smallText" align="right"><?php echo HEADING_TITLE_STATUS . ' ' . tep_draw_pull_down_menu('status', array_merge(array(array('id' => '', 'text' => TEXT_ALL_ORDERS)), $orders_statuses), '', 'onChange="this.form.submit();"'); ?></td>
337 | </form></tr> | <> | 337 | <?php echo tep_hide_session_id(); ?></form></tr>
338 | </table></td> | = | 338 | </table></td>
339 | </tr> |  | 339 | </tr>
340 | </table></td> |  | 340 | </table></td>
341 | </tr> |  | 341 | </tr>
342 | <tr> |  | 342 | <tr>
343 | <td><table border="0" width="100%" cellspacing="0" cellpadding="0"> |  | 343 | <td><table border="0" width="100%" cellspacing="0" cellpadding="0">

### [BUGFIX] Fix Typo on the Products New Page

Fix typo on the products new page.

Affected Files
catalog/products_new.php

File: catalog/products_new.php

87 | <tr> | = | 87 | <tr>
88 | <td width="<?php echo SMALL_IMAGE_WIDTH + 10; ?>" valign="top" class="main"><?php echo '<a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $products_new['products_id']) . '">' . tep_image(DIR_WS_IMAGES . $products_new['products_image'], $products_new['products_name'], SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT) . '</a>'; ?></td> |  | 88 | <td width="<?php echo SMALL_IMAGE_WIDTH + 10; ?>" valign="top" class="main"><?php echo '<a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $products_new['products_id']) . '">' . tep_image(DIR_WS_IMAGES . $products_new['products_image'], $products_new['products_name'], SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT) . '</a>'; ?></td>
89 | <td valign="top" class="main"><?php echo '<a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $products_new['products_id']) . '"><b><u>' . $products_new['products_name'] . '</u></b></a><br>' . TEXT_DATE_ADDED . ' ' . tep_date_long($products_new['products_date_added']) . '<br>' . TEXT_MANUFACTURER . ' ' . $products_new['manufacturers_name'] . '<br><br>' . TEXT_PRICE . ' ' . $products_price; ?></td> |  | 89 | <td valign="top" class="main"><?php echo '<a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $products_new['products_id']) . '"><b><u>' . $products_new['products_name'] . '</u></b></a><br>' . TEXT_DATE_ADDED . ' ' . tep_date_long($products_new['products_date_added']) . '<br>' . TEXT_MANUFACTURER . ' ' . $products_new['manufacturers_name'] . '<br><br>' . TEXT_PRICE . ' ' . $products_price; ?></td>
90 | <td align="right" valign="middle" class="main"><?php echo '<a href="' . tep_href_link(FILENAME_PRODUCTS_NEW, tep_get_all_get_params(array('action')) . 'action=buy_now&products_id=' . $products_new['products_id']) . '">' . tep_image_button('button_in_cart.gif', IMAGE_BUTTON_IN_CART) . '</a>'; ?></td> |  | 90 | <td align="right" valign="middle" class="main"><?php echo '<a href="' . tep_href_link(FILENAME_PRODUCTS_NEW, tep_get_all_get_params(array('action')) . 'action=buy_now&products_id=' . $products_new['products_id']) . '">' . tep_image_button('button_in_cart.gif', IMAGE_BUTTON_IN_CART) . '</a>'; ?></td>
91 | </tr> |  | 91 | </tr>
92 | <tr> |  | 92 | <tr>
93 | <td colspüan="3"><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td> | <> | 93 | <td colspan="3"><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
94 | </tr> | = | 94 | </tr>
95 | <?php |  | 95 | <?php
96 | } |  | 96 | }
97 | } else { |  | 97 | } else {
98 | ?> |  | 98 | ?>
99 | <tr> |  | 99 | <tr>

### [BUGFIX] Process the Order Total Modules Earlier on the Checkout Confirmation Page

Process the order total modules on the checkout confirmation page.

Affected Files
catalog/checkout_confirmation.php

File: catalog/checkout_confirmation.php

63 | // load the selected shipping module | = | 63 | // load the selected shipping module
64 | require(DIR_WS_CLASSES . 'shipping.php'); |  | 64 | require(DIR_WS_CLASSES . 'shipping.php');
65 | $shipping_modules = new shipping($shipping); |  | 65 | $shipping_modules = new shipping($shipping);
66 |  |  | 66 |
67 | require(DIR_WS_CLASSES . 'order_total.php'); |  | 67 | require(DIR_WS_CLASSES . 'order_total.php');
68 | $order_total_modules = new order_total; |  | 68 | $order_total_modules = new order_total;
|  | -+ | 69 | $order_total_modules->process();
69 |  | = | 70 |
70 | // Stock Check |  | 71 | // Stock Check
71 | $any_out_of_stock = false; |  | 72 | $any_out_of_stock = false;
72 | if (STOCK_CHECK == 'true') { |  | 73 | if (STOCK_CHECK == 'true') {
73 | for ($i=0, $n=sizeof($order->products); $i<$n; $i++) { |  | 74 | for ($i=0, $n=sizeof($order->products); $i<$n; $i++) {
74 | if (tep_check_stock($order->products[$i]['id'], $order->products[$i]['qty'])) { |  | 75 | if (tep_check_stock($order->products[$i]['id'], $order->products[$i]['qty'])) {
234 | <td class="main"><?php echo $order->info['payment_method']; ?></td> | = | 235 | <td class="main"><?php echo $order->info['payment_method']; ?></td>
235 | </tr> |  | 236 | </tr>
236 | </table></td> |  | 237 | </table></td>
237 | <td width="70%" valign="top" align="right"><table border="0" cellspacing="0" cellpadding="2"> |  | 238 | <td width="70%" valign="top" align="right"><table border="0" cellspacing="0" cellpadding="2">
238 | <?php |  | 239 | <?php
239 | if (MODULE_ORDER_TOTAL_INSTALLED) { |  | 240 | if (MODULE_ORDER_TOTAL_INSTALLED) {
240 | $order_total_modules->process(); | +- |  |
241 | echo $order_total_modules->output(); | = | 241 | echo $order_total_modules->output();
242 | } |  | 242 | }
243 | ?> |  | 243 | ?>
244 | </table></td> |  | 244 | </table></td>
245 | </tr> |  | 245 | </tr>
246 | </table></td> |  | 246 | </table></td>

### [BUGFIX] PHP < 4.1 Compatibility Update

Use $HTTP_SERVER_VARS instead of $_SERVER.

Affected Files
catalog/includes/functions/general.php

File: catalog/includes/functions/general.php

1221 |  | = | 1221 |
1222 | function tep_setcookie($name, $value = '', $expire = 0, $path = '/', $domain = '', $secure = 0) { |  | 1222 | function tep_setcookie($name, $value = '', $expire = 0, $path = '/', $domain = '', $secure = 0) {
1223 | setcookie($name, $value, $expire, $path, (tep_not_null($domain) ? $domain : ''), $secure); |  | 1223 | setcookie($name, $value, $expire, $path, (tep_not_null($domain) ? $domain : ''), $secure);
1224 | } |  | 1224 | }
1225 |  |  | 1225 |
1226 | function tep_get_ip_address() { |  | 1226 | function tep_get_ip_address() {
|  | <> | 1227 | global $HTTP_SERVER_VARS;
|  |  | 1228 |
1227 | if (isset($_SERVER)) { |  | 1229 | if (isset($HTTP_SERVER_VARS)) {
1228 | if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { |  | 1230 | if (isset($HTTP_SERVER_VARS['HTTP_X_FORWARDED_FOR'])) {
1229 | $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; |  | 1231 | $ip = $HTTP_SERVER_VARS['HTTP_X_FORWARDED_FOR'];
1230 | } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) { |  | 1232 | } elseif (isset($HTTP_SERVER_VARS['HTTP_CLIENT_IP'])) {
1231 | $ip = $_SERVER['HTTP_CLIENT_IP']; |  | 1233 | $ip = $HTTP_SERVER_VARS['HTTP_CLIENT_IP'];
1232 | } else { | = | 1234 | } else {
1233 | $ip = $_SERVER['REMOTE_ADDR']; | <> | 1235 | $ip = $HTTP_SERVER_VARS['REMOTE_ADDR'];
1234 | } | = | 1236 | }
1235 | } else { |  | 1237 | } else {
1236 | if (getenv('HTTP_X_FORWARDED_FOR')) { |  | 1238 | if (getenv('HTTP_X_FORWARDED_FOR')) {
1237 | $ip = getenv('HTTP_X_FORWARDED_FOR'); |  | 1239 | $ip = getenv('HTTP_X_FORWARDED_FOR');
1238 | } elseif (getenv('HTTP_CLIENT_IP')) { |  | 1240 | } elseif (getenv('HTTP_CLIENT_IP')) {
1239 | $ip = getenv('HTTP_CLIENT_IP'); |  | 1241 | $ip = getenv('HTTP_CLIENT_IP');

### [BUGFIX] Strip Additional Slashes When Editing Reviews

Strip additional slashes when editing reviews.

Affected Files
catalog/admin/reviews.php

File: catalog/admin/reviews.php

159 | <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td> | = | 159 | <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
160 | </tr> |  | 160 | </tr>
161 | <?php |  | 161 | <?php
162 | if (tep_not_null($HTTP_POST_VARS)) { |  | 162 | if (tep_not_null($HTTP_POST_VARS)) {
163 | /* Re-Post all POST'ed variables */ |  | 163 | /* Re-Post all POST'ed variables */
164 | reset($HTTP_POST_VARS); |  | 164 | reset($HTTP_POST_VARS);
165 | while(list($key, $value) = each($HTTP_POST_VARS)) echo tep_draw_hidden_field($key, $value); | <> | 165 | while (list($key, $value) = each($HTTP_POST_VARS)) echo tep_draw_hidden_field($key, htmlspecialchars(stripslashes($value)));
166 | ?> | = | 166 | ?>
167 | <tr> |  | 167 | <tr>
168 | <td align="right" class="smallText"><?php echo '<a href="' . tep_href_link(FILENAME_REVIEWS, 'page=' . $HTTP_GET_VARS['page'] . '&rID=' . $rInfo->reviews_id . '&action=edit') . '">' . tep_image_button('button_back.gif', IMAGE_BACK) . '</a> ' . tep_image_submit('button_update.gif', IMAGE_UPDATE) . ' <a href="' . tep_href_link(FILENAME_REVIEWS, 'page=' . $HTTP_GET_VARS['page'] . '&rID=' . $rInfo->reviews_id) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>'; ?></td> |  | 168 | <td align="right" class="smallText"><?php echo '<a href="' . tep_href_link(FILENAME_REVIEWS, 'page=' . $HTTP_GET_VARS['page'] . '&rID=' . $rInfo->reviews_id . '&action=edit') . '">' . tep_image_button('button_back.gif', IMAGE_BACK) . '</a> ' . tep_image_submit('button_update.gif', IMAGE_UPDATE) . ' <a href="' . tep_href_link(FILENAME_REVIEWS, 'page=' . $HTTP_GET_VARS['page'] . '&rID=' . $rInfo->reviews_id) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>'; ?></td>
169 | </form></tr> |  | 169 | </form></tr>
170 | <?php |  | 170 | <?php
171 | } else { |  | 171 | } else {

### [IMPROVEMENT] New Public Title for Payment Modules

Add a public title for the payment modules to show "Credit Card" instead of the name of the payment servicer provider.

Affected Files
catalog/includes/classes/order.php
catalog/checkout_process.php

File: catalog/includes/classes/order.php

160 | 'subtotal' => 0, | = | 160 | 'subtotal' => 0,
161 | 'tax' => 0, |  | 161 | 'tax' => 0,
162 | 'tax_groups' => array(), |  | 162 | 'tax_groups' => array(),
163 | 'comments' => (tep_session_is_registered('comments') && !empty($comments) ? $comments : '')); |  | 163 | 'comments' => (tep_session_is_registered('comments') && !empty($comments) ? $comments : ''));
164 |  |  | 164 |
165 | if (isset($GLOBALS[$payment]) && is_object($GLOBALS[$payment])) { |  | 165 | if (isset($GLOBALS[$payment]) && is_object($GLOBALS[$payment])) {
|  | <> | 166 | if (isset($GLOBALS[$payment]->public_title)) {
|  |  | 167 | $this->info['payment_method'] = $GLOBALS[$payment]->public_title;
|  |  | 168 | } else {
166 | $this->info['payment_method'] = $GLOBALS[$payment]->title; |  | 169 | $this->info['payment_method'] = $GLOBALS[$payment]->title;
|  |  | 170 | }
167 |  | = | 171 |
168 | if ( isset($GLOBALS[$payment]->order_status) && is_numeric($GLOBALS[$payment]->order_status) && ($GLOBALS[$payment]->order_status > 0) ) { |  | 172 | if ( isset($GLOBALS[$payment]->order_status) && is_numeric($GLOBALS[$payment]->order_status) && ($GLOBALS[$payment]->order_status > 0) ) {
169 | $this->info['order_status'] = $GLOBALS[$payment]->order_status; |  | 173 | $this->info['order_status'] = $GLOBALS[$payment]->order_status;
170 | } |  | 174 | }
171 | } |  | 175 | }
172 |  |  | 176 |

File: catalog/checkout_process.php

247 | EMAIL_SEPARATOR . "\n" . | = | 247 | EMAIL_SEPARATOR . "\n" .
248 | tep_address_label($customer_id, $billto, 0, '', "\n") . "\n\n"; |  | 248 | tep_address_label($customer_id, $billto, 0, '', "\n") . "\n\n";
249 | if (is_object($$payment)) { |  | 249 | if (is_object($$payment)) {
250 | $email_order .= EMAIL_TEXT_PAYMENT_METHOD . "\n" . |  | 250 | $email_order .= EMAIL_TEXT_PAYMENT_METHOD . "\n" .
251 | EMAIL_SEPARATOR . "\n"; |  | 251 | EMAIL_SEPARATOR . "\n";
252 | $payment_class = $$payment; |  | 252 | $payment_class = $$payment;
253 | $email_order .= $payment_clas s->title . "\n\n"; | <> | 253 | $email_order .= $order->info['payment_method'] . "\n\n";
254 | if ($payment_class->email_footer) { | = | 254 | if ($payment_class->email_footer) {
255 | $email_order .= $payment_class->email_footer . "\n\n"; |  | 255 | $email_order .= $payment_class->email_footer . "\n\n";
256 | } |  | 256 | }
257 | } |  | 257 | }
258 | tep_mail($order->customer['firstname'] . ' ' . $order->customer['lastname'], $order->customer['email_address'], EMAIL_TEXT_SUBJECT, $email_order, STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS); |  | 258 | tep_mail($order->customer['firstname'] . ' ' . $order->customer['lastname'], $order->customer['email_address'], EMAIL_TEXT_SUBJECT, $email_order, STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);
259 |  |  | 259 |

### [IMPROVEMENT] Navigation History Parameter Filter

Filter parameter names containing "_nh_dns" out of the navigation history session data.

Affected Files
catalog/includes/classes/navigation_history.php

File: catalog/includes/classes/navigation_history.php

57 | } | = | 57 | }
58 | } |  | 58 | }
59 |  |  | 59 |
60 | if ($set == 'true') { |  | 60 | if ($set == 'true') {
61 | $this->path[] = array('page' => basename($PHP_SELF), |  | 61 | $this->path[] = array('page' => basename($PHP_SELF),
62 | 'mode' => $request_type, |  | 62 | 'mode' => $request_type,
63 | 'get' => $HTTP_GET_VARS, | <> | 63 | 'get' => $this->filter_parameters($HTTP_GET_VARS),
64 | 'post' => $HTTP_POST_VARS); |  | 64 | 'post' => $this->filter_parameters($HTTP_POST_VARS));
65 | } | = | 65 | }
66 | } |  | 66 | }
67 |  |  | 67 |
68 | function remove_current_page() { |  | 68 | function remove_current_page() {
69 | global $PHP_SELF; |  | 69 | global $PHP_SELF;
70 |  |  | 70 |
77 | function set_snapshot($page = '') { | = | 77 | function set_snapshot($page = '') {
78 | global $PHP_SELF, $HTTP_GET_VARS, $HTTP_POST_VARS, $request_type; |  | 78 | global $PHP_SELF, $HTTP_GET_VARS, $HTTP_POST_VARS, $request_type;
79 |  |  | 79 |
80 | if (is_array($page)) { |  | 80 | if (is_array($page)) {
81 | $this->snapshot = array('page' => $page['page'], |  | 81 | $this->snapshot = array('page' => $page['page'],
82 | 'mode' => $page['mode'], |  | 82 | 'mode' => $page['mode'],
83 | 'get' => $page['get'], | <> | 83 | 'get' => $this->filter_parameters($page['get']),
84 | 'post' => $page['post']); |  | 84 | 'post' => $this->filter_parameters($page['post']));
85 | } else { | = | 85 | } else {
86 | $this->snapshot = array('page' => basename($PHP_SELF), |  | 86 | $this->snapshot = array('page' => basename($PHP_SELF),
87 | 'mode' => $request_type, |  | 87 | 'mode' => $request_type,
88 | 'get' => $HTTP_GET_VARS, | <> | 88 | 'get' => $this->filter_parameters($HTTP_GET_VARS),
89 | 'post' => $HTTP_POST_VARS); |  | 89 | 'post' => $this->filter_parameters($HTTP_POST_VARS));
90 | } | = | 90 | }
91 | } |  | 91 | }
92 |  |  | 92 |
93 | function clear_snapshot() { |  | 93 | function clear_snapshot() {
94 | $this->snapshot = array(); |  | 94 | $this->snapshot = array();
95 | } |  | 95 | }
121 | echo '<br><br>'; | = | 121 | echo '<br><br>';
122 |  |  | 122 |
123 | echo $this->snapshot['mode'] . ' ' . $this->snapshot['page'] . '?' . tep_array_to_string($this->snapshot['get'], array(tep_session_name())) . '<br>'; |  | 123 | echo $this->snapshot['mode'] . ' ' . $this->snapshot['page'] . '?' . tep_array_to_string($this->snapshot['get'], array(tep_session_name())) . '<br>';
124 | } |  | 124 | }
125 | } |  | 125 | }
126 |  |  | 126 |
|  | -+ | 127 | function filter_parameters($parameters) {
|  |  | 128 | $clean = array();
|  |  | 129 |
|  |  | 130 | reset($parameters);
|  |  | 131 | while (list($key, $value) = each($parameters)) {
|  |  | 132 | if (strpos($key, '_nh-dns') < 1) {
|  |  | 133 | $clean[$key] = $value;
|  |  | 134 | }
|  |  | 135 | }
|  |  | 136 |
|  |  | 137 | return $clean;
|  |  | 138 | }
|  |  | 139 |
127 | function unserialize($broken) { | = | 140 | function unserialize($broken) {
128 | for(reset($broken);$kv=each($broken);) { |  | 141 | for(reset($broken);$kv=each($broken);) {
129 | $key=$kv['key']; |  | 142 | $key=$kv['key'];
130 | if (gettype($this->$key)!="user function") |  | 143 | if (gettype($this->$key)!="user function")
131 | $this->$key=$kv['value']; |  | 144 | $this->$key=$kv['value'];
132 | } |  | 145 | }
133 | } |  | 146 | }
134 | } |  | 147 | }
135 | ?> |  | 148 | ?>

### [IMPROVEMENT] Increase Configuration Key and Title Database Field Sizes [SQL]

Increase the sizes of the configuration key and configuration title database fields.

Database Changes to Perform:
alter table configuration modify configuration_title varchar(255) NOT NULL;
alter table configuration modify configuration_key varchar(255) NOT NULL;

### [BUGFIX] Strip Additional Slashes When Editing Files Through the File Manager

Strip additional slashes when editing files through the Administration Tool -> Tools -> File Manager section.

Affected Files
catalog/admin/file_manager.php

File: catalog/admin/file_manager.php

142 | if (!isset($file_writeable)) $file_writeable = true; | = | 142 | if (!isset($file_writeable)) $file_writeable = true;
143 | $file_contents = ''; |  | 143 | $file_contents = '';
144 | if ($action == 'new_file') { |  | 144 | if ($action == 'new_file') {
145 | $filename_input_field = tep_draw_input_field('filename'); |  | 145 | $filename_input_field = tep_draw_input_field('filename');
146 | } elseif ($action == 'edit') { |  | 146 | } elseif ($action == 'edit') {
147 | if ($file_array = file($current_path . '/' . $HTTP_GET_VARS['info'])) { |  | 147 | if ($file_array = file($current_path . '/' . $HTTP_GET_VARS['info'])) {
148 | $file_contents = addslashes(implode('', $file_array)); | <> | 148 | $file_contents = implode('', $file_array);
149 | } | = | 149 | }
150 | $filename_input_field = $HTTP_GET_VARS['info'] . tep_draw_hidden_field('filename', $HTTP_GET_VARS['info']); |  | 150 | $filename_input_field = $HTTP_GET_VARS['info'] . tep_draw_hidden_field('filename', $HTTP_GET_VARS['info']);
151 | } |  | 151 | }
152 | ?> |  | 152 | ?>
153 | <tr> |  | 153 | <tr>
154 | <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td> |  | 154 | <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>