tablename = 'filemeta'; $this->version = '2.1.3'; //create new file admin ajax add_action('wp_ajax_create_file', array($this,'ajax_create_file')); //delete file admin ajax add_action('wp_ajax_delete_file', array($this,'ajax_delete_file')); //create new directory admin ajax add_action('wp_ajax_create_directory', array($this,'ajax_create_directory')); //ajax settings save add_action('wp_ajax_ace_save_settings', array($this,'ajax_save_settings')); //ajax settings save add_action('wp_ajax_ace_settings_panel', array($this,'ajax_settings_panel')); //ajax commit file version add_action('wp_ajax_commit_file',array($this,'ajax_commit_file')); //ajax revert file version add_action('wp_ajax_revert_file',array($this,'ajax_revet_file')); //ajax delete file version add_action('wp_ajax_delete_version',array($this,'ajax_delete_file_version')); //ajax delete file version add_action('wp_ajax_delete_all_versions',array($this,'ajax_delete_all_file_version')); //ajax get file revisions add_action('wp_ajax_get_file_revisions',array($this,'ajax_get_file_revisions')); add_action('load-theme-editor.php', array($this,'add_scripts')); add_filter( 'admin_footer-theme-editor.php', array($this,'do_edit' )); add_action('load-plugin-editor.php', array($this,'add_scripts')); add_filter( 'admin_footer-plugin-editor.php', array($this,'do_edit' )); //Language Setup $locale = get_locale(); load_plugin_textdomain( $this->localization_domain, false, dirname( plugin_basename( __FILE__ ) ) . '/lang/' ); $options = get_option('ace_options',$this->get_defaults()); if (isset($options['use_file_tree'])){ add_action('admin_footer-plugin-editor.php',array($this,'plugin_file_tree')); add_action('admin_footer-theme-editor.php',array($this,'theme_file_tree')); } $this->update_wpdb($this->tablename); } add_filter('init', array($this,'add_query_var_vars')); add_action('template_redirect', array($this,'admin_redirect_download_files')); add_filter( 'plugin_row_meta', array($this,'_my_plugin_links'), 10, 2 ); } /** * get_defaults * @since 2.0 * @author Ohad Raz * @return array */ public function get_defaults(){ return array( 'use_file_tree' => true, 'matchBrackets' => true, 'lineWrapping' => false, 'tabSize' => 4, 'indentUnit' => 2 ); } /** * Show Settings Panel * @author Ohad Raz * @since 2.0 * @access public */ public function ajax_settings_panel(){ check_ajax_referer('ace_settings_panel'); $options = get_option('ace_options',$this->get_defaults()); ?>

get_defaults()); $def = $this->get_defaults(); $options = array_merge($def,$options); foreach ((array)$options as $key => $value) { if (isset($_POST[$key]) && $_POST[$key] != "null"){ if ($_POST[$key] == 'ckd') $options[$key] = true; else $options[$key] = intval($_POST[$key]); }else{ unset($options[$key]); } } update_option('ace_options', $options); _e('Settings saved, make sure you refresh your browser to see the changes.','ace'); die(); } /** * commit File version * @author Ohad Raz * @since 2.0 * @access public */ public function ajax_commit_file(){ check_ajax_referer('ace_commit_file'); $filename= esc_sql($_POST['filename']); $file_content = esc_sql($_POST['file_content']); $message = esc_sql($_POST['message']); $date = date("F j, Y, g:i a"); $value = array( 'date'=> $date, 'message' => $message, 'version' => $file_content ); $result = $this->add_file_meta(1,$filename,$value,false); if (!$result) _e('Error in commiting file','ace'); _e('File Version commited and Save!','ace'); die(); } /** * Delete all File Versions * @author Ohad Raz * @since 2.0 * @access public */ public function ajax_delete_all_file_version(){ check_ajax_referer('delete_all_versions'); $this->delete_file_meta(1,$_POST['filename'],'',true); $this->ajax_get_file_revisions($_POST['filename']); die(); } /** * delete File version * @author Ohad Raz * @since 2.0 * @access public */ public function ajax_delete_file_version(){ check_ajax_referer('delete_version'); $res = delete_metadata_by_mid('file', intval($_POST['mid'])); if (!$res) echo 'Error'; else _e('File revision deleted!','ace'); die(); } /** * revert File version * @author Ohad Raz * @since 2.0 * @access public */ public function ajax_revet_file(){ check_ajax_referer('revert_file'); $meta = get_metadata_by_mid('file', intval($_GET['mid'])); if (!$meta){ echo json_encode(array('error' => __('Error restoring file version','ace'))); die(); } $meta = $meta->meta_value; $m = __('Make sure to save changes if you want the restore to take place.','ace'); echo json_encode(array('version' => stripslashes($meta['version']),'m' => $m)); die(); } /** * get File versions * @author Ohad Raz * @since 2.0 * @access public */ public function ajax_get_file_revisions($filename = null){ if ($filename === null){ check_ajax_referer('get_file_revisions'); $filename= $_POST['filename']; } $versions = $this->get_file_meta(1,$filename,false); if (isset($versions[$_POST['filename']])){ $url = plugins_url()."/advanced-code-editor/"; echo ''; foreach ((array)$versions as $i => $vs ) { if ($i == $_POST['filename']){ foreach ((array)$vs as $v ) { $meta_id = $this->get_file_meta_id($i,$v); $v = maybe_unserialize($v); echo ''; } } } echo '
'.__('Date','ace').''.__('Message','ace').''.__('Actions','ace').'
'.$v['date'].' '.$v['message'].'
'; echo '
'; }else{ _e('No Revisions for this file found','ace'); } die(); } /** * add plugins entry points to query vars * @author Ohad Raz * @since 1.9 * @access public */ public function add_query_var_vars() { global $wp; $wp->add_query_var('theme_download'); //download theme $wp->add_query_var('dn_file'); //download file name $wp->add_query_var('plugin_download'); //download plugin $wp->add_query_var('dnf'); //download plugin $wp->add_query_var('ttd'); //theme to download } /** * admin_redirect_download_files handler * @author Ohad Raz * @since 1.9 * @access public * * @return void */ public function admin_redirect_download_files(){ global $wp; global $wp_query; //download theme if (array_key_exists('theme_download', $wp->query_vars) && $wp->query_vars['theme_download'] == 'theme_download'){ $this->download_theme(); die(); } if (array_key_exists('plugin_download', $wp->query_vars) && $wp->query_vars['plugin_download'] != ''){ $this->download_plugin(); die(); } if (array_key_exists('dn_file', $wp->query_vars) && $wp->query_vars['dn_file'] != ''){ $this->download_file(); die(); } } /** * zip and download plugin * * @author Ohad Raz * @since 1.9 * @access public * * @return zip file */ public function download_plugin(){ header('HTTP/1.1 200 OK'); if ( !current_user_can('edit_plugins') ) wp_die('

'.__('You do not have sufficient permissions to edit plugins for this site.').'

'); $plugin = get_query_var('plugin_download'); if(isset($plugin) && $plugin != ''){ //Get the directory to zip $directory = WP_PLUGIN_DIR .'/'.$plugin; $zipname = date('Ymdhis') . '.zip'; // create object $zip = $this->Zip($directory,$zipname,strtolower($plugin).'/'); if ($zip === false){ wp_die('

'.__('error ziping files.').'

'); } $file = $zipname; $fsize = filesize($file); header($_SERVER['SERVER_PROTOCOL'].' 200 OK'); header("Content-Disposition: attachment; filename=\"".$plugin . '.zip'."\""); header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header('Content-Length: ' . filesize($file)); ob_clean(); readfile($file); unlink($file); exit; } } /** * download_file current edited file * * @author ohad raz * @since 1.9 * @access public * * @return file */ public function download_file(){ header('HTTP/1.1 200 OK'); $from = get_query_var('dnf'); if (!isset ($from)) wp_die('

'.__('You do not have sufficient permissions to Download this file.').'

'); if ($from == 'theme'){ if ( !current_user_can('edit_themes') ) wp_die('

'.__('You do not have sufficient permissions to edit templates for this site.').'

'); }elseif ($from == 'plugin') { if ( !current_user_can('edit_plugins') ) wp_die('

'.__('You do not have sufficient permissions to edit Plugins for this site.').'

'); }else{ wp_die('

'.__('You do not have sufficient permissions to edit files.').'

'); } $file = get_query_var('dn_file'); if (!isset($file)){ wp_die('

'.__('Error Downloading file.').'

'); } if ($from == 'plugin'){ $file = WP_PLUGIN_DIR .'/'.$file; } if(file_exists($file)){ $content = file_get_contents($file); $filename = explode("/","/" . $file); $fsize = strlen($content); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header('Content-Description: File Transfer'); header("Content-Disposition: attachment; filename=" . $filename[count($filename)-1]); header("Content-Length: ".$fsize); header("Expires: 0"); header("Pragma: public"); echo $content; exit; } wp_die('

'.__('Error Downloading file.').'

'); } /** * Zip file maker * * @author Ohad Raz * @since 1.9 * @access public * * @param string $source file or directory to zip * @param string $destination zip file to create * @param string $container_folder if you want to put the files inside a directory in the zip then pass it here */ public function Zip($source, $destination,$container_folder = ''){ if (!extension_loaded('zip')){ wp_die('

'.__('error ziping files.').'

'); exit; } if ( !file_exists($source) ) { wp_die('

'.__('error ziping files.').'

'); exit; } if ( ! class_exists('ZipArchive')){ wp_die('

'.__('error ziping files.').'

'); exit; } $zip = new ZipArchive(); if (!$zip->open($destination, ZIPARCHIVE::CREATE)){ wp_die('

'.__('error ziping files.').'

'); exit; } $source = str_replace('\\', '/', realpath($source)); if (is_dir($source) === true){ $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST); foreach ((array)$files as $file){ $file = str_replace('\\', '/', realpath($file)); if (is_dir($file) === true){ $zip->addEmptyDir(str_replace($source . '/', $container_folder, $file . '/')); }else if (is_file($file) === true){ $zip->addFromString(str_replace($source . '/', $container_folder, $file), file_get_contents($file)); } // echo $file .'
'; } //die(); }else if (is_file($source) === true){ $zip->addFromString(basename($source), file_get_contents($source)); } return $zip->close(); } /** * zip and download theme * @author Ohad Raz * @since 1.9 * @access public * * @return zip file on success and string on faliure */ public function download_theme(){ header('HTTP/1.1 200 OK'); if ( !current_user_can('edit_themes') ) wp_die('

'.__('You do not have sufficient permissions to edit templates for this site.').'

'); if (!$this->is_version('3.4.1')) $themes = wp_get_themes();//wp_get_themes(); else $themes = get_themes(); $theme = ''; if(!isset($_GET['ttd'])){ $theme = get_current_theme(); }else{ $theme = $_GET['ttd']; } //Get the directory to zip $directory = $themes[$theme]->theme_root . '/'; $zipname = date('Ymdhis') . '.zip'; // create object $zip = $this->Zip($directory,$zipname,strtolower($theme).'/'); if ($zip === false){ wp_die('

'.__('error ziping files.').'

'); } $file = $zipname; $fsize = filesize($file); header($_SERVER['SERVER_PROTOCOL'].' 200 OK'); header("Content-Disposition: attachment; filename=\"".strtolower($theme) . '.zip'."\""); header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header('Content-Length: ' . filesize($file)); ob_clean(); readfile($file); unlink($file); exit; } /** * is_version * @author Ohad Raz * @since 2.1 * @param string $version * @return boolean */ public function is_version( $version = '3.1' ) { global $wp_version; return ($wp_version >= $version) ; } //ajax create directory /** * function to handle ajax new directory creation */ function ajax_create_directory(){ check_ajax_referer('create_directory'); global $current_user; get_currentuserinfo(); if (isset($_POST['di_name']) && isset($_POST['dir'])){ if (current_user_can('manage_options')){ $dir_name = ''; $new_dir_name = strtolower( str_replace(' ', '-', $_POST['di_name'])); if (isset($_POST['f_type'])){ if ($_POST['f_type'] == "plugin" ){ $dir_name = WP_PLUGIN_DIR . '/' . $_POST['dir'] . '/' . $new_dir_name; }elseif ($_POST['f_type'] == "theme" ){ $t = wp_get_theme($_POST['dir']); if ( $t->exists() ){ $dir_name = $t->get_stylesheet_directory(). '/' . $new_dir_name;; } } //if(!is_dir($dir_name)){ //echo __("Cannot create directory Error code 9
".$dir_name,"baace"); //}else{ $umask = umask(0); if (@mkdir($dir_name, 0777)){ echo __("New directory Created!!!","baace"); }else{ echo __("Cannot create directory Error code 8
".$dir_name,"baace"); } umask($umask); //} }else{ echo __('Error Code 7','baace'); } }else{ echo __('Error Code 5','baace'); } }else{ echo __('Error Code 6','baace'); } die(); } //ajax delete file /** * function to handle ajax delete file */ function ajax_delete_file(){ check_ajax_referer('delete_file'); global $current_user; get_currentuserinfo(); if(isset($_POST['F_T_D']) && $_POST['F_T_D'] != '' && isset($_POST['f_type'])){ $f_name = ''; if($_POST['f_type'] == "plugin" ){ $f_name = WP_PLUGIN_DIR . '/' .$_POST['F_T_D']; }else{ $f_name = $_POST['F_T_D']; } @unlink($f_name); echo __('File Deleted!!!','baace'); die(); }else{ echo __('Error Code 4','baace'); die(); } } //ajax create file /** * function to handle ajax file creation */ function ajax_create_file(){ check_ajax_referer('create_new_file'); global $current_user; get_currentuserinfo(); if(isset($_POST)){ $checks = false; $file_name = ''; if (isset($_POST['file_name']) && $_POST['file_name'] != ''){ if (isset($_POST['f_type']) && isset($_POST['dir'])){ $f_name = strtolower( str_replace(' ', '-', $_POST['file_name'])); if($_POST['f_type'] == "plugin" ){ if (current_user_can( 'edit_plugins' )){ $checks = true; $file_name = WP_PLUGIN_DIR . '/' . $_POST['dir'] . '/' . $f_name; } }elseif( $_POST['f_type'] == "theme" ){ if (current_user_can( 'edit_themes' )){ $checks = true; $t = wp_get_theme($_POST['dir']); if ( $t->exists() ){ $file_name = $t->get_stylesheet_directory(). '/' . $f_name;; } } }else{ echo __('Error Code 3','baace'); die(); } }else{ echo __('Error Code 2','baace'); die(); } if ($checks){ if(file_exists( $file_name)){ echo __("File already exists","baace"); die(); }else{ $handle = fopen($file_name, 'w') or wp_die('Cannot open file for editing'); $file_contents = ''; fwrite($handle, $file_contents); fclose($handle); echo __('New File Created!','baace'); die(); } } }else{ echo __('you must set a file name','baace'); } }else{ echo __('Error Code 1','baace'); die(); } die(); } /** * function to include jQuery form plugin for ajax save ... */ function add_scripts(){ $url = plugins_url()."/advanced-code-editor/"; $v = $this->version; wp_enqueue_script( 'jquery' ); wp_enqueue_script( 'jquery-form' ); wp_enqueue_script('codemirror',$url.'js/codemirror.js',array(),$v,true); wp_enqueue_script('codemirror-fold',$url.'js/foldcode.js',array(),$v,true); wp_enqueue_script('codemirror-format',$url.'js/formatting.js',array(),$v,true); wp_enqueue_script('codemirror-xml',$url.'js/xml.js',array(),$v,true); wp_enqueue_script('codemirror-js',$url.'js/javascript.js',array(),$v,true); wp_enqueue_script('codemirror-css',$url.'js/css.js',array(),$v,true); wp_enqueue_script('codemirror-php',$url.'js/php.js',array(),$v,true); wp_enqueue_script('codemirror-clike',$url.'js/clike.js',array(),$v,true); wp_enqueue_script('codemirror-search',$url.'js/searchcursor.js',array(),$v,true); wp_enqueue_script('codemirror-complete',$url.'js/complete.js',array(),$v,true); $def = $this->get_defaults(); $options = get_option('ace_options',array()); $options = array_merge((array)$def,(array)$options); wp_localize_script('codemirror-complete', 'ace_user', $options); //@todo: add tabbed editor //wp_enqueue_script('jquery-ui-tabs'); //stylesheets wp_enqueue_style('codemirror', $url.'css/codemirror.css', false, false); wp_enqueue_style('codemirror-def', $url.'themes/default.css', false, false); wp_enqueue_style('codemirror-night', $url.'themes/night.css', false, false); wp_enqueue_style('codemirror-elegant', $url.'themes/elegant.css', false, false); wp_enqueue_style('codemirror-neat', $url.'themes/neat.css', false, false); wp_enqueue_style('codemirror-raverStudio', $url.'themes/raverStudio.css', false, false); wp_enqueue_style('codemirror-cobalt', $url.'themes/cobalt.css', false, false); wp_enqueue_style('codemirror-eclipse', $url.'themes/eclipse.css', false, false); wp_enqueue_style('codemirror-monokai', $url.'themes/monokai.css', false, false); wp_enqueue_style('codemirror-rubyb', $url.'themes/rubyblue.css', false, false); wp_enqueue_style('codemirror-solarizedDark', $url.'themes/solarizedDark.css', false, false); wp_enqueue_style('codemirror-solarizedLight', $url.'themes/solarizedLight.css', false, false); } function do_edit(){ $url = plugins_url()."/advanced-code-editor/"; ?> tablename; $query = "SHOW TABLES LIKE '{$wpdb->prefix}{$table}';"; $indexes = $wpdb->get_var( $wpdb->prepare( $query ) ); if ( $indexes ) return true; return false; } /** * Create a table for file versions * @since 2.0 * * @return none * */ public function _create_meta_table($table=null) { $table = $this->tablename; if ( $this->_meta_table_exists($table) ) { return; } global $wpdb; require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); $query = $wpdb->prepare("CREATE TABLE `{$wpdb->prefix}{$table}` ( `meta_id` bigint(20) unsigned not null auto_increment, `file_id` bigint(20) unsigned not null default '0', `meta_key` varchar(255), `meta_value` longtext, PRIMARY KEY (`meta_id`), KEY `file_id` (`file_id`), KEY `meta_key` (`meta_key`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2;"); dbDelta($query); } /** * WordPress doesn't seem to support metadata out * of the box, we need to update $wpdb->table to the correct table * ourself. * @since 2.0 * @return none */ function update_wpdb($table=null) { global $wpdb; $table = $this->tablename; $wpdb->filemeta = $wpdb->prefix . $table; } /** * update_file_meta * @since 2.0 * @author Ohad Raz * @param integer $term_id=0 * @param [type] $meta_key * @param [type] $meta_value * @param string $prev_value * @return [type] */ function update_file_meta($term_id=0, $meta_key, $meta_value, $prev_value = ''){ $this->update_wpdb(); return update_metadata('file', $term_id, $meta_key, $meta_value, $prev_value); } /** * add_file_meta * @since 2.0 * @author Ohad Raz * @param integer $term_id=0 * @param [type] $meta_key * @param [type] $meta_value * @param boolean $unique */ function add_file_meta($term_id=0, $meta_key, $meta_value, $unique = false){ $this->update_wpdb(); return add_metadata('file', $term_id, $meta_key, $meta_value, $unique); } /** * delete_file_meta * @since 2.0 * @author Ohad Raz * @param integer $term_id=0 * @param [type] $meta_key * @param string $meta_value * @param boolean $delete_all * @return [type] */ function delete_file_meta($term_id=0, $meta_key, $meta_value = '', $delete_all = false){ $this->update_wpdb(); return delete_metadata('file', $term_id, $meta_key, $meta_value, $delete_all); } /** * get_file_meta * @since 2.0 * @author Ohad Raz * @param integer $term_id=0 * @param [type] $key * @param boolean $single * @return [type] */ function get_file_meta($term_id=0, $key, $single = true){ $this->update_wpdb(); return get_metadata('file', $term_id, $key, $single); } /** * get_file_meta_id * @since 2.0 * @author Ohad Raz * @param string $meta_key * @param mixed $meta_value * @return int if meta id found else returns false */ function get_file_meta_id($meta_key,$meta_val){ global $wpdb; $mid = $wpdb->get_var( $wpdb->prepare("SELECT meta_id FROM $wpdb->filemeta WHERE meta_key = %s AND meta_value = %s", $meta_key,$meta_val)); if( $mid != '' ) return (int)$mid; return false; } public function _my_plugin_links($links, $file) { $plugin = plugin_basename(__FILE__); if ($file == $plugin) // only for this plugin return array_merge( $links, array( '' . __('Other Plugins by this author' ) . '' ), array( '' . __('Plugin Support') . '' ), array( '' . __('Donate') . '' ) ); return $links; } public function uninstall(){ if ( !defined( 'WP_UNINSTALL_PLUGIN' ) ) exit (); global $wpdb; $wpdb->query( "DROP TABLE IF EXISTS `" . $wpdb->prefix . "filemeta`;" ); } }//END Class }//END IF $ace = new advanced_code_editor(); register_activation_hook( __FILE__, array( &$ace, '_create_meta_table'));