Current Path : /var/test/www/alh/admin/controller/extension/module/ |
Current File : /var/test/www/alh/admin/controller/extension/module/geo_ip_tools.php |
<?php //============================================================================== // Geo IP Tools v303.2 // // Author: Clear Thinking, LLC // E-mail: johnathan@getclearthinking.com // Website: http://www.getclearthinking.com // // All code within this file is copyright Clear Thinking, LLC. // You may not copy or reuse code within this file without written permission. //============================================================================== class ControllerExtensionModuleGeoIpTools extends Controller { private $type = 'module'; private $name = 'geo_ip_tools'; public function index() { $data = array( 'type' => $this->type, 'name' => $this->name, 'autobackup' => true, 'save_type' => 'keepediting', 'permission' => $this->hasPermission('modify'), ); $this->loadSettings($data); //------------------------------------------------------------------------------ // Data Arrays //------------------------------------------------------------------------------ $stores = array('default' => $this->config->get('config_name')); $store_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "store ORDER BY name"); foreach ($store_query->rows as $store) { $stores[$store['store_id']] = $store['name']; } $this->load->model('localisation/geo_zone'); $geo_zones = array(0 => $data['text_any_geo_zone'], 'everywhere_else' => $data['text_everywhere_else']); foreach ($this->model_localisation_geo_zone->getGeoZones() as $geo_zone) { $geo_zones[$geo_zone['geo_zone_id']] = $geo_zone['name']; } $this->load->model('localisation/currency'); $currencies = array($this->config->get('config_currency') => ''); foreach ($this->model_localisation_currency->getCurrencies() as $currency) { $currencies[$currency['code']] = $currency['title']; } $data['language_array'] = array($this->config->get('config_language') => ''); $data['language_flags'] = array(); $this->load->model('localisation/language'); foreach ($this->model_localisation_language->getLanguages() as $language) { $data['language_array'][$language['code']] = $language['name']; $data['language_flags'][$language['code']] = (version_compare(VERSION, '2.2', '<')) ? 'view/image/flags/' . $language['image'] : 'language/' . $language['code'] . '/' . $language['code'] . '.png'; } //------------------------------------------------------------------------------ // Extensions Settings //------------------------------------------------------------------------------ $data['settings'] = array(); $data['settings'][] = array( 'type' => 'tabs', 'tabs' => array('extension_settings', 'geo_ip_rules', 'popup', 'testing_mode'), ); $data['settings'][] = array( 'type' => 'html', 'content' => '<div class="text-info text-center pad-bottom">' . $data['help_reload_admin_page'] . '</div>', ); $data['settings'][] = array( 'key' => 'extension_settings', 'type' => 'heading', 'buttons' => 'backup_restore', ); $data['settings'][] = array( 'key' => 'status', 'type' => 'select', 'options' => array(1 => $data['text_enabled'], 0 => $data['text_disabled']), 'default' => 1, ); $data['settings'][] = array( 'key' => 'browser', 'type' => 'select', 'options' => array(1 => $data['text_yes'], 0 => $data['text_no']), 'default' => 0, ); $data['settings'][] = array( 'key' => 'google_apikey', 'type' => 'text', ); $data['settings'][] = array( 'key' => 'set_session_data', 'type' => 'select', 'options' => array(1 => $data['text_yes'], 0 => $data['text_no']), 'default' => 1, ); $data['settings'][] = array( 'key' => 'local_geo_ip_database', 'type' => 'html', 'content' => ((file_exists(DIR_SYSTEM . 'library/geo_ip_tools/GeoLite2-Country.mmdb') || file_exists(DIR_SYSTEM . 'library/geo_ip_tools/GeoLite2-City.mmdb')) ? $data['text_present'] : $data['text_not_present']) . $data['text_database_links'], ); $data['settings'][] = array( 'key' => 'ignore_user_agents', 'type' => 'textarea', 'attributes'=> array('style' => 'width: 100% !important'), 'default' => "AdsBot-Google\nAdIdxBot\nBingbot\nfacebookexternalhit\nGooglebot\nGoogle-Structured-Data-Testing-Tool", ); $data['settings'][] = array( 'key' => 'ignore_ips', 'type' => 'textarea', ); // Admin Panel Settings $data['settings'][] = array( 'key' => 'admin_panel_settings', 'type' => 'heading', ); $data['settings'][] = array( 'key' => 'autosave', 'type' => 'select', 'options' => array(1 => $data['text_enabled'], 0 => $data['text_disabled']), ); $data['settings'][] = array( 'key' => 'display', 'type' => 'select', 'options' => array('expanded' => $data['text_expanded'], 'collapsed' => $data['text_collapsed']), ); $data['settings'][] = array( 'key' => 'tooltips', 'type' => 'select', 'options' => array(1 => $data['text_enabled'], 0 => $data['text_disabled']), 'default' => 1, ); //------------------------------------------------------------------------------ // Geo IP Rules //------------------------------------------------------------------------------ $data['settings'][] = array( 'key' => 'geo_ip_rules', 'type' => 'tab', ); $data['settings'][] = array( 'key' => 'geo_ip_rules', 'type' => 'heading', 'buttons' => 'expand_collapse', ); $data['settings'][] = array( 'key' => 'geoiprule', 'type' => 'table_start', 'columns' => array('action', 'name', 'if', 'then'), ); $table = 'geoiprule'; $sortby = 'name'; foreach ($this->getTableRowNumbers($data, $table, $sortby) as $num => $rules) { $prefix = $table . '_' . $num . '_'; $data['settings'][] = array( 'type' => 'row_start', ); $data['settings'][] = array( 'key' => 'expand_collapse', 'type' => 'button', ); $data['settings'][] = array( 'key' => 'copy', 'type' => 'button', ); $data['settings'][] = array( 'key' => 'delete', 'type' => 'button', ); $data['settings'][] = array( 'type' => 'column', ); $data['settings'][] = array( 'key' => $prefix . 'name', 'type' => 'text', ); $data['settings'][] = array( 'type' => 'column', ); $data['settings'][] = array( 'key' => $prefix . 'store', 'type' => 'select', 'options' => array(0 => $data['text_any_store']) + $stores, 'default' => 'any', 'before' => $data['text_store_is'], ); $data['settings'][] = array( 'key' => $prefix . 'geo_zone', 'type' => 'select', 'options' => $geo_zones, 'before' => $data['text_geo_ip_location_is_within'], ); $data['settings'][] = array( 'key' => $prefix . 'ips', 'type' => 'textarea', 'before' => $data['text_ip_is_within_these_ranges'], ); $data['settings'][] = array( 'type' => 'column', ); $data['settings'][] = array( 'key' => $prefix . 'store_redirect', 'type' => 'select', 'options' => array(0 => $data['text_current_store']) + $stores, 'default' => 'current', 'before' => $data['text_set_the_store_to'], ); $data['settings'][] = array( 'key' => $prefix . 'currency', 'type' => 'select', 'options' => $currencies, 'default' => $this->config->get('config_currency'), 'before' => $data['text_set_the_currency_to'], ); $data['settings'][] = array( 'key' => $prefix . 'language', 'type' => 'select', 'options' => $data['language_array'], 'before' => $data['text_set_the_language_to'], ); $data['settings'][] = array( 'key' => $prefix . 'redirect', 'type' => 'text', 'attributes'=> array('style' => 'width: 100% !important', 'placeholder' => 'http://'), 'before' => $data['text_redirect_to_this_url'], ); $data['settings'][] = array( 'key' => $prefix . 'block', 'type' => 'textarea', 'attributes'=> array('style' => 'width: 100% !important'), 'before' => $data['text_block_these_urls'], ); $data['settings'][] = array( 'type' => 'row_end', ); } $data['settings'][] = array( 'type' => 'table_end', 'buttons' => 'add_row', 'text' => 'button_add_rule', ); //------------------------------------------------------------------------------ // Pop-up Box Settings //------------------------------------------------------------------------------ $data['settings'][] = array( 'key' => 'popup', 'type' => 'tab', ); $data['settings'][] = array( 'key' => 'popup', 'type' => 'heading', ); $data['settings'][] = array( 'key' => 'popup', 'type' => 'select', 'options' => array(1 => $data['text_enabled'], 0 => $data['text_disabled']), ); $data['settings'][] = array( 'key' => 'popup_text', 'type' => 'multilingual_text', 'default' => '<h3>Please Set Your Location</h3>Based on your IP address ([ip]), your location is:', 'attributes'=> array('style' => 'width: 500px !important'), ); foreach (array('country', 'zone', 'city', 'postcode', 'currency', 'language') as $field) { $data['settings'][] = array( 'key' => $field . '_field', 'type' => 'multilingual_text', 'default' => ($field == 'zone') ? 'Region / State:' : ucwords($field) . ':', ); } //------------------------------------------------------------------------------ // Testing Mode //------------------------------------------------------------------------------ $data['settings'][] = array( 'key' => 'testing_mode', 'type' => 'tab', ); $data['settings'][] = array( 'type' => 'html', 'content' => '<div class="text-info text-center pad-bottom">' . $data['testing_mode_help'] . '</div>', ); $filepath = DIR_LOGS . $this->name . '.messages'; $testing_mode_log = ''; $refresh_or_download_button = '<a class="btn btn-info" onclick="refreshLog()"><i class="fa fa-refresh pad-right-sm"></i> ' . $data['button_refresh_log'] . '</a>'; if (file_exists($filepath)) { $filesize = filesize($filepath); if ($filesize > 50000000) { file_put_contents($filepath, ''); $filesize = 0; } if ($filesize > 999999) { $testing_mode_log = $data['standard_testing_mode']; $refresh_or_download_button = '<a class="btn btn-info" href="index.php?route=extension/' . $this->type . '/' . $this->name . '/downloadLog&token=' . $data['token'] . '"><i class="fa fa-download pad-right-sm"></i> ' . $data['button_download_log'] . ' (' . round($filesize / 1000000, 1) . ' MB)</a>'; } else { $testing_mode_log = html_entity_decode(file_get_contents($filepath), ENT_QUOTES, 'UTF-8'); } } $data['settings'][] = array( 'key' => 'testing_mode', 'type' => 'heading', 'buttons' => $refresh_or_download_button . ' <a class="btn btn-danger" onclick="clearLog()"><i class="fa fa-trash-o pad-right-sm"></i> ' . $data['button_clear_log'] . '</a>', ); $data['settings'][] = array( 'key' => 'testing_mode', 'type' => 'select', 'options' => array(1 => $data['text_enabled'], 0 => $data['text_disabled']), 'default' => 0, ); $data['settings'][] = array( 'key' => 'testing_messages', 'type' => 'textarea', 'class' => 'nosave', 'attributes'=> array('style' => 'width: 100% !important; height: 400px; font-size: 12px !important'), 'default' => htmlentities($testing_mode_log), ); //------------------------------------------------------------------------------ // end settings //------------------------------------------------------------------------------ $this->document->setTitle($data['heading_title']); $data['header'] = $this->load->controller('common/header'); $data['column_left'] = $this->load->controller('common/column_left'); $data['footer'] = $this->load->controller('common/footer'); $template_file = DIR_TEMPLATE . 'extension/' . $this->type . '/' . $this->name . '.twig'; if (is_file($template_file)) { extract($data); ob_start(); require(class_exists('VQMod') ? VQMod::modCheck(modification($template_file)) : modification($template_file)); $output = ob_get_clean(); if (version_compare(VERSION, '3.0', '>=')) { $output = str_replace(array('&token=', '&token='), '&user_token=', $output); } echo $output; } else { echo 'Error loading template file'; } } //============================================================================== // Helper functions //============================================================================== private function hasPermission($permission) { return ($this->user->hasPermission($permission, $this->type . '/' . $this->name) || $this->user->hasPermission($permission, 'extension/' . $this->type . '/' . $this->name)); } private function loadLanguage($path) { $_ = array(); $language = array(); $admin_language = (version_compare(VERSION, '2.2', '<')) ? $this->db->query("SELECT * FROM " . DB_PREFIX . "language WHERE `code` = '" . $this->db->escape($this->config->get('config_admin_language')) . "'")->row['directory'] : $this->config->get('config_admin_language'); foreach (array('english', 'en-gb', $admin_language) as $directory) { $file = DIR_LANGUAGE . $directory . '/' . $directory . '.php'; if (file_exists($file)) require($file); $file = DIR_LANGUAGE . $directory . '/default.php'; if (file_exists($file)) require($file); $file = DIR_LANGUAGE . $directory . '/' . $path . '.php'; if (file_exists($file)) require($file); $file = DIR_LANGUAGE . $directory . '/extension/' . $path . '.php'; if (file_exists($file)) require($file); $language = array_merge($language, $_); } return $language; } private function getTableRowNumbers(&$data, $table, $sorting) { $groups = array(); $rules = array(); foreach ($data['saved'] as $key => $setting) { if (preg_match('/' . $table . '_(\d+)_' . $sorting . '/', $key, $matches)) { $groups[$setting][] = $matches[1]; } if (preg_match('/' . $table . '_(\d+)_rule_(\d+)_type/', $key, $matches)) { $rules[$matches[1]][] = $matches[2]; } } if (empty($groups)) $groups = array('' => array('1')); ksort($groups, defined('SORT_NATURAL') ? SORT_NATURAL : SORT_REGULAR); foreach ($rules as $key => $rule) { ksort($rules[$key], defined('SORT_NATURAL') ? SORT_NATURAL : SORT_REGULAR); } $data['used_rows'][$table] = array(); $rows = array(); foreach ($groups as $group) { foreach ($group as $num) { $data['used_rows'][preg_replace('/module_(\d+)_/', '', $table)][] = $num; $rows[$num] = (empty($rules[$num])) ? array() : $rules[$num]; } } sort($data['used_rows'][$table]); return $rows; } //============================================================================== // Setting functions //============================================================================== private $encryption_key = ''; public function loadSettings(&$data) { $backup_type = (empty($data)) ? 'manual' : 'auto'; if ($backup_type == 'manual' && !$this->hasPermission('modify')) { return; } $this->cache->delete($this->name); unset($this->session->data[$this->name]); $code = (version_compare(VERSION, '3.0', '<') ? '' : $this->type . '_') . $this->name; // Set exit URL $data['token'] = $this->session->data[version_compare(VERSION, '3.0', '<') ? 'token' : 'user_token']; $data['exit'] = $this->url->link((version_compare(VERSION, '3.0', '<') ? 'extension' : 'marketplace') . '/' . (version_compare(VERSION, '2.3', '<') ? '' : 'extension&type=') . $this->type . '&token=' . $data['token'], '', 'SSL'); // Load saved settings $data['saved'] = array(); $settings_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "setting WHERE `code` = '" . $this->db->escape($code) . "' ORDER BY `key` ASC"); foreach ($settings_query->rows as $setting) { $key = str_replace($code . '_', '', $setting['key']); $value = $setting['value']; if ($setting['serialized']) { $value = (version_compare(VERSION, '2.1', '<')) ? unserialize($setting['value']) : json_decode($setting['value'], true); } $data['saved'][$key] = $value; if (is_array($value)) { foreach ($value as $num => $value_array) { foreach ($value_array as $k => $v) { $data['saved'][$key . '_' . $num . '_' . $k] = $v; } } } } // Load language and run standard checks $data = array_merge($data, $this->loadLanguage($this->type . '/' . $this->name)); if (ini_get('max_input_vars') && ((ini_get('max_input_vars') - count($data['saved'])) < 50)) { $data['warning'] = $data['standard_max_input_vars']; } // Modify files according to OpenCart version if ($this->type == 'total' && version_compare(VERSION, '2.2', '<')) { file_put_contents(DIR_CATALOG . 'model/' . $this->type . '/' . $this->name . '.php', str_replace('public function getTotal($total) {', 'public function getTotal(&$total_data, &$order_total, &$taxes) {' . "\n\t\t" . '$total = array("totals" => &$total_data, "total" => &$order_total, "taxes" => &$taxes);', file_get_contents(DIR_CATALOG . 'model/' . $this->type . '/' . $this->name . '.php'))); } if (version_compare(VERSION, '2.3', '>=')) { $filepaths = array( DIR_APPLICATION . 'controller/' . $this->type . '/' . $this->name . '.php', DIR_CATALOG . 'controller/' . $this->type . '/' . $this->name . '.php', DIR_CATALOG . 'model/' . $this->type . '/' . $this->name . '.php', ); foreach ($filepaths as $filepath) { if (file_exists($filepath)) { rename($filepath, str_replace('.php', '.php-OLD', $filepath)); } } } // Set save type and skip auto-backup if not needed if (!empty($data['saved']['autosave'])) { $data['save_type'] = 'auto'; } if ($backup_type == 'auto' && empty($data['autobackup'])) { return; } // Create settings auto-backup file $manual_filepath = DIR_LOGS . $this->name . $this->encryption_key . '.backup'; $auto_filepath = DIR_LOGS . $this->name . $this->encryption_key . '.autobackup'; $filepath = ($backup_type == 'auto') ? $auto_filepath : $manual_filepath; if (file_exists($filepath)) unlink($filepath); file_put_contents($filepath, 'SETTING NUMBER SUB-SETTING SUB-NUMBER SUB-SUB-SETTING VALUE' . "\n", FILE_APPEND|LOCK_EX); foreach ($data['saved'] as $key => $value) { if (is_array($value)) continue; $parts = explode('|', preg_replace(array('/_(\d+)_/', '/_(\d+)/'), array('|$1|', '|$1'), $key)); $line = ''; for ($i = 0; $i < 5; $i++) { $line .= (isset($parts[$i]) ? $parts[$i] : '') . "\t"; } $line .= str_replace(array("\t", "\n"), array(' ', '\n'), $value) . "\n"; file_put_contents($filepath, $line, FILE_APPEND|LOCK_EX); } $data['autobackup_time'] = date('Y-M-d @ g:i a'); $data['backup_time'] = (file_exists($manual_filepath)) ? date('Y-M-d @ g:i a', filemtime($manual_filepath)) : ''; if ($backup_type == 'manual') { echo $data['autobackup_time']; } } public function saveSettings() { if (!$this->hasPermission('modify')) { echo 'PermissionError'; return; } $this->cache->delete($this->name); unset($this->session->data[$this->name]); $code = (version_compare(VERSION, '3.0', '<') ? '' : $this->type . '_') . $this->name; if ($this->request->get['saving'] == 'manual') { $this->db->query("DELETE FROM " . DB_PREFIX . "setting WHERE `code` = '" . $this->db->escape($code) . "' AND `key` != '" . $this->db->escape($this->name . '_module') . "'"); } $module_id = 0; $modules = array(); $module_instance = false; foreach ($this->request->post as $key => $value) { if (strpos($key, 'module_') === 0) { $parts = explode('_', $key, 3); $module_id = $parts[1]; $modules[$parts[1]][$parts[2]] = $value; if ($parts[2] == 'module_id') $module_instance = true; } else { $key = (version_compare(VERSION, '3.0', '<') ? '' : $this->type . '_') . $this->name . '_' . $key; if ($this->request->get['saving'] == 'auto') { $this->db->query("DELETE FROM " . DB_PREFIX . "setting WHERE `code` = '" . $this->db->escape($code) . "' AND `key` = '" . $this->db->escape($key) . "'"); } $this->db->query(" INSERT INTO " . DB_PREFIX . "setting SET `store_id` = 0, `code` = '" . $this->db->escape($code) . "', `key` = '" . $this->db->escape($key) . "', `value` = '" . $this->db->escape(stripslashes(is_array($value) ? implode(';', $value) : $value)) . "', `serialized` = 0 "); } } foreach ($modules as $module_id => $module) { if (!$module_id) { $this->db->query(" INSERT INTO " . DB_PREFIX . "module SET `name` = '" . $this->db->escape($module['name']) . "', `code` = '" . $this->db->escape($this->name) . "', `setting` = '' "); $module_id = $this->db->getLastId(); $module['module_id'] = $module_id; } $module_settings = (version_compare(VERSION, '2.1', '<')) ? serialize($module) : json_encode($module); $this->db->query(" UPDATE " . DB_PREFIX . "module SET `name` = '" . $this->db->escape($module['name']) . "', `code` = '" . $this->db->escape($this->name) . "', `setting` = '" . $this->db->escape($module_settings) . "' WHERE module_id = " . (int)$module_id . " "); } } public function deleteSetting() { if (!$this->hasPermission('modify')) { echo 'PermissionError'; return; } $prefix = (version_compare(VERSION, '3.0', '<')) ? '' : $this->type . '_'; $this->db->query("DELETE FROM " . DB_PREFIX . "setting WHERE `code` = '" . $this->db->escape($prefix . $this->name) . "' AND `key` = '" . $this->db->escape($prefix . $this->name . '_' . str_replace('[]', '', $this->request->get['setting'])) . "'"); } //============================================================================== // Backup functions //============================================================================== public function backupSettings() { $data = array(); $this->loadSettings($data); } public function viewBackup() { if (!$this->hasPermission('access')) { echo 'You do not have permission to view this file.'; return; } if (!file_exists(DIR_LOGS . $this->name . $this->encryption_key . '.backup')) { echo 'Backup file does not exist'; return; } $contents = trim(file_get_contents(DIR_LOGS . $this->name . $this->encryption_key . '.backup')); $lines = explode("\n", $contents); $html = '<table border="1" style="font-family: monospace" cellspacing="0" cellpadding="5">'; foreach ($lines as $line) { $html .= '<tr><td>' . implode('</td><td>', explode("\t", $line)) . '</td></tr>'; } echo str_replace('<td></td>', '<td style="background: #DDD"></td>', $html) . '</table>'; } public function downloadBackup() { $file = DIR_LOGS . $this->name . $this->encryption_key . '.backup'; if (!file_exists($file) || !$this->hasPermission('access')) { return; } header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Content-Description: File Transfer'); header('Content-Disposition: attachment; filename=' . $this->name . '.' . date('Y-n-d') . '.txt'); header('Content-Length: ' . filesize($file)); header('Content-Transfer-Encoding: binary'); header('Content-Type: text/plain'); header('Expires: 0'); header('Pragma: public'); readfile($file); } public function restoreSettings() { $data = $this->loadLanguage($this->type . '/' . $this->name); $token = (version_compare(VERSION, '3.0', '<')) ? 'token' : 'user_token'; if (!$this->hasPermission('modify')) { $this->session->data['error'] = $data['standard_error']; $this->response->redirect(str_replace(array('&', "\n", "\r"), array('&', '', ''), $this->url->link('extension/' . $this->type . '/' . $this->name, $token . '=' . $this->session->data[$token], 'SSL'))); } if ($this->request->post['from'] == 'auto') { $filepath = DIR_LOGS . $this->name . $this->encryption_key . '.autobackup'; } elseif ($this->request->post['from'] == 'manual') { $filepath = DIR_LOGS . $this->name . $this->encryption_key . '.backup'; } elseif ($this->request->post['from'] == 'file') { $filepath = $this->request->files['backup_file']['tmp_name']; if (empty($filepath)) { $this->response->redirect(str_replace(array('&', "\n", "\r"), array('&', '', ''), $this->url->link('extension/' . $this->type . '/' . $this->name, $token . '=' . $this->session->data[$token], 'SSL'))); } } $contents = str_replace("\r\n", "\n", trim(file_get_contents($filepath))); if (strpos($contents, 'SETTING') !== 0) { $this->session->data['error'] = $data['error_invalid_file_data']; $this->response->redirect(str_replace(array('&', "\n", "\r"), array('&', '', ''), $this->url->link('extension/' . $this->type . '/' . $this->name, $token . '=' . $this->session->data[$token], 'SSL'))); } $code = (version_compare(VERSION, '3.0', '<') ? '' : $this->type . '_') . $this->name; $this->db->query("DELETE FROM " . DB_PREFIX . "setting WHERE `code` = '" . $this->db->escape($code) . "'"); foreach (explode("\n", $contents) as $row) { if (empty($row) || strpos($row, 'SETTING') === 0) continue; $col = explode("\t", $row); $value = str_replace('\n', "\n", array_pop($col)); $key = implode('_', array_diff($col, array(''))); $this->db->query("INSERT INTO " . DB_PREFIX . "setting SET `store_id` = 0, `code` = '" . $this->db->escape($code) . "', `key` = '" . $this->db->escape($code . '_' . $key) . "', `value` = '" . $this->db->escape($value) . "', `serialized` = 0"); } $this->session->data['success'] = $data['text_settings_restored']; $this->response->redirect(str_replace(array('&', "\n", "\r"), array('&', '', ''), $this->url->link('extension/' . $this->type . '/' . $this->name, $token . '=' . $this->session->data[$token], 'SSL'))); } //============================================================================== // Ajax functions //============================================================================== public function refreshLog() { $data = $this->loadLanguage($this->type . '/' . $this->name); if (!$this->hasPermission('modify')) { echo $data['standard_error']; return; } $filepath = DIR_LOGS . $this->name . '.messages'; if (file_exists($filepath)) { if (filesize($filepath) > 999999) { echo $data['standard_testing_mode']; } else { echo html_entity_decode(file_get_contents($filepath), ENT_QUOTES, 'UTF-8'); } } } public function downloadLog() { $file = DIR_LOGS . $this->name . '.messages'; if (!file_exists($file) || !$this->hasPermission('access')) { return; } header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Content-Description: File Transfer'); header('Content-Disposition: attachment; filename=' . $this->name . '.' . date('Y-n-d') . '.log'); header('Content-Length: ' . filesize($file)); header('Content-Transfer-Encoding: binary'); header('Content-Type: text/plain'); header('Expires: 0'); header('Pragma: public'); readfile($file); } public function clearLog() { $data = $this->loadLanguage($this->type . '/' . $this->name); if (!$this->hasPermission('modify')) { echo $data['standard_error']; return; } file_put_contents(DIR_LOGS . $this->name . '.messages', ''); } } ?>