path = untrailingslashit(ABSPATH).KDS.'wp-content'.KDS.'uploads'.KDS.'kc_extensions'.KDS; $this->scan_blacklist(); $this->scheme = is_ssl() ? 'https' : 'http'; $this->api_url = $this->scheme.'://extensions.kingcomposer.com/'; if (is_admin()) { add_action ('admin_menu', array( &$this, 'admin_menu' ), 1); if (isset($_GET['tab']) && !empty($_GET['tab'])) $this->tab = $_GET['tab']; if (isset($_GET['page']) && !empty($_GET['page'])) $this->page = $_GET['page']; add_action('kc_list_extensions_store', array(&$this, 'extensions_store')); add_action('kc_list_extensions_installed', array(&$this, 'extensions_installed')); add_action('kc_list_extensions_upload', array(&$this, 'extensions_upload')); add_action('init', array(&$this, 'process_bulk_action')); } $this->load_extensions(); } public function load_xml($url = '', $arg = array()) { $options = array( "http" => array( "header" => "Referer: ".$_SERVER['HTTP_HOST']."\r\n". "Scheme: ".$this->scheme."\r\n". "Cookie: PHPSESSID=".str_replace('=', '', base64_encode($_SERVER['HTTP_HOST']))."\r\n", "ignore_errors" => true, )); if (count($arg) > 0) { $options['http']['header'] .= implode("\r\n", $arg); } $context = @stream_context_create($options); if ($url === null) return $context; @libxml_set_streams_context($context); return @simplexml_load_file($url); } public function admin_menu() { $capability = apply_filters('access_kingcomposer_capability', 'access_kingcomposer'); add_submenu_page( 'kingcomposer', __('Extensions', 'kingcomposer'), __('Extensions', 'kingcomposer'), $capability, 'kc-extensions', array( &$this, 'screen_display' ) ); } public function screen_display() { include 'extensions/kc.screen.tmpl.php'; } public function extensions_store($page = 1) { global $kc; $pdk = $kc->get_pdk(); if (isset($pdk['pack']) && isset($pdk['key']) && $pdk['pack'] != 'trial' && !empty($pdk['key']) && $pdk['stt'] == 1) $key = $pdk['key']; else $key = ''; $response = @wp_remote_get( $this->api_url.'catalog/', array( "headers" => array( "license" => $key, "pack" => isset($pdk['pack']) ? $pdk['pack'] : '', "theme" => sanitize_title(basename(get_template_directory())), "domain" => site_url(), "time" => time()+604800, "q" => (isset($_GET['q']) ? $_GET['q'] : ''), "filter" => (isset($_GET['filter']) ? $_GET['filter'] : ''), "paged" => (isset($_GET['paged']) ? $_GET['paged'] : ''), ), 'timeout' => 1200, ) ); if (is_wp_error($response)) { echo '

'.__('Sorry, Can not connect to server at this time. Please check your internet connection and ', 'kingcomposer').'Try again

'; return; } $data = @json_decode($response['body'], true); if (!is_array($data)) { echo '

'.__('Sorry, An error has occurred, we will fix it soon.', 'kingcomposer').'

'.$response['body'].'
'; return; } $items = $data['items']; $total = $data['total']; $pages = $data['pages']; $installs = $this->load_installed('all'); $actives = (array) get_option( 'kc_active_extensions', array() ); include 'extensions/kc.store.tmpl.php'; } public function extensions_installed ($page = 1) { $items = $this->load_installed('all'); $actives = (array) get_option( 'kc_active_extensions', array() ); include 'extensions/kc.installed.tmpl.php'; } public function extensions_upload ($page = 1) { $upload = $this->upload_extension; $errors = $this->errors; include 'extensions/kc.upload.tmpl.php'; } public function load_installed ($mod = 'all') { if (!is_dir($this->path) && !mkdir($this->path, 0755)) { echo '

'.__('Error, could not create extensions folder '.$this->path, 'kingcomposer').'

'; return; } $items = array(); $files = scandir($this->path, 0); foreach ($files as $file) { if (is_dir($this->path.$file) && $file != '.' && $file != '..') { if (file_exists($this->path.$file.KDS.'index.php')) { $data = get_file_data($this->path.$file.KDS.'index.php', array( 'Extension Name', 'Extension Preview', 'Description', 'Version', 'Author', 'Author URI', )); $items[$file] = array( 'name' => !empty($data[0]) ? $data[0] : 'Unknow', 'Extension Preview' => !empty($data[1]) ? $data[1] : '', 'Description' => !empty($data[2]) ? $data[2] : '', 'Version' => !empty($data[3]) ? $data[3] : '1.0', 'Author' => !empty($data[4]) ? $data[4] : 'Unknow', 'Author URI' => !empty($data[5]) ? $data[5] : '#unknow', 'extension' => sanitize_title($file) ); } } } return $items; } public function load_extensions () { $actives = (array) get_option( 'kc_active_extensions', array() ); foreach ($actives as $name => $stt) { if ($stt == 1) { if (file_exists($this->path.$name.KDS.'index.php')) { require_once($this->path.$name.KDS.'index.php'); $ex_class = 'kc_extension_'.str_replace('-', '_', sanitize_title($name)); if (class_exists($ex_class)) { new $ex_class(); } else { $this->errors[] = 'Could not find the PHP classname "'.$ex_class.'" in the extenstion "/'.$name.KDS.'index.php"'; unset($actives[$name]); update_option('kc_active_extensions', $actives); } } else { $this->errors[] = 'Could not find the extension file /'.$name.KDS.'index.php'; unset($actives[$name]); update_option('kc_active_extensions', $actives); } } } return $this->errors; } public function list_table( $items, $actives ) { $KCExtTable = new KC_Extensions_List(); $KCExtTable->set_data( $items, $actives ); $KCExtTable->prepare_items(); ?>
display(); ?>
tab = 'upload'; if (!class_exists('ZipArchive')) { $this->errors[] = 'Server does not support ZipArchive'; } else if ( ( ($_FILES["extensionzip"]["type"] == "application/zip") || ($_FILES["extensionzip"]["type"] == "application/x-zip") || ($_FILES["extensionzip"]["type"] == "application/x-zip-compressed") ) && ($_FILES["extensionzip"]["size"] < 20000000) ) { if (move_uploaded_file($_FILES['extensionzip']['tmp_name'], $path.$_FILES['extensionzip']['name']) === true) { $zip = new ZipArchive; $res = $zip->open($path.$_FILES['extensionzip']['name']); if ($res === TRUE) { $ext = $zip->extractTo($path); if (is_dir($path.'__MACOSX')) kc_remove_dir($path.'__MACOSX'); if ($ext ===true) { $ext = trim($zip->getNameIndex(0), KDS); if (!file_exists($path.$ext.KDS.'index.php')) $this->errors[] = 'Missing index.php file of extension'; $this->upload_extension[0] = $_FILES['extensionzip']['name']; $this->upload_extension[1] = $ext; } else $this->errors[] = 'Could not extract file'; $zip->close(); } else { $this->errors[] = 'Could not unzip'; } } else { $this->errors[] = 'Error upload file'; } } else { $this->errors[] = 'Invalid file type'; } break; } } } public function scan_blacklist() { if (is_dir($this->path)) { if (!is_file($this->path.'index.html')) { @file_put_contents($this->path.'index.html', ''); } $blacklist_dirs = array('background-image-cropper', 'XAttacker', 'reup', 'visual'); $files = @scandir($this->path, 0); if (isset($files) && is_array($files) && count($files) > 0) { foreach ($files as $file) { if ($file != '.' && $file != '..') { if (is_dir($this->path.$file) && in_array($file, $blacklist_dirs)) { kc_remove_dir($this->path.$file); } if (is_file($this->path.$file) && strpos($file, '.zip') !== false) { @unlink($this->path.$file); } } } } } } } class kc_extension { public $path; public $url; public function init($file) { $this->path = dirname($file); $this->url = site_url('/wp-content/uploads/kc_extensions/'.basename(dirname($file))); } public function map($args) { global $kc; if (empty($args) || !is_array($args)) return; $kc->add_map($args); } public function output($name, $callback) { if (is_callable($callback)) { add_shortcode ($name, $callback); } } } new kc_extensions(); if ( ! class_exists( 'WP_List_Table' ) ) { require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' ); } class KC_Extensions_List extends WP_List_Table { private $table_data = array(); private $actives = array(); /** Class constructor */ public function __construct() { parent::__construct( array( 'singular' => __( 'Extension', 'kingcomposer' ), //singular name of the listed records 'plural' => __( 'Extensions', 'kingcomposer' ), //plural name of the listed records 'ajax' => true //should this table support ajax? ) ); } /** * @return array */ protected function get_table_classes() { return array( 'widefat', $this->_args['plural'] ); } /** * Prepare the items for the table to process * * @return Void */ public function prepare_items() { $columns = $this->get_columns(); $hidden = $this->get_hidden_columns(); $sortable = $this->get_sortable_columns(); $data = $this->table_data; usort( $data, array( &$this, 'sort_data' ) ); $perPage = 20; $currentPage = $this->get_pagenum(); $totalItems = count($data); $this->set_pagination_args( array( 'total_items' => $totalItems, 'per_page' => $perPage ) ); $data = array_slice($data,(($currentPage-1)*$perPage),$perPage); $this->_column_headers = array($columns, $hidden, $sortable); $this->items = $data; } /** * Override the parent columns method. Defines the columns to use in your listing table * * @return Array */ public function get_columns() { $columns = array( 'cb' => '', 'name' => 'Extension Name', 'description' => 'Description' ); return $columns; } /** * Define which columns are hidden * * @return Array */ public function get_hidden_columns() { return array(); } /** * Define the sortable columns * * @return Array */ public function get_sortable_columns() { return array('name' => array('name', false)); } /** * Get the table data * * @return Array */ public function set_data( $items, $actives ) { $this->table_data = $items; $this->actives = $actives; } /** * Define what data to show on each column of the table * * @param Array $item Data * @param String $column_name - Current column name * * @return Mixed */ public function column_default( $item, $column_name ) { switch( $column_name ) { case 'name': case 'description': return $item[ $column_name ]; default: return print_r( $item, true ) ; } } /** * Allows you to sort the data by the variables set in the $_GET * * @return Mixed */ private function sort_data( $a, $b ) { // Set defaults $orderby = 'name'; $order = 'asc'; // If orderby is set, use this as the sort column if(!empty($_GET['orderby'])) { $orderby = $_GET['orderby']; } // If order is set use this as the order if(!empty($_GET['order'])) { $order = $_GET['order']; } $result = strcmp( $a[$orderby], $b[$orderby] ); if($order === 'asc') { return $result; } return -$result; } /** Text displayed when no customer data is available */ public function no_items() { _e( 'No items found', 'kingcomposer' ); } /** * Returns an associative array containing the bulk action * * @return array */ public function get_bulk_actions() { $actions = array( 'bulk-activate' => 'Activate', 'bulk-deactivate' => 'Deactivate', 'bulk-update' => 'Update', 'bulk-delete' => 'Delete', ); return $actions; } /** * @global string $status * @global int $page * @global string $s * @global array $totals * * @param array $item */ public function single_row( $item ) { global $status, $page, $s, $totals; $idc = rand(334,4343); $name = esc_html($item['name']); $slug = esc_attr($item['extension']); ?>
| |

| |
_args['singular']; $this->display_tablenav( 'top' ); $this->screen->render_screen_reader_content( 'heading_list' ); ?> print_column_headers(); ?> > display_rows_or_placeholder(); ?> print_column_headers( false ); ?>
display_tablenav( 'bottom' ); } }