<?php

class HMWP_Models_Rewrite {

    public $_replace;
    protected $_replaced;
    protected $paths;
    protected $_blogurl;
    protected $_pass;
    protected $_files = array();

    public function __construct() {
        $this->_files = array('jpg', 'jpeg', 'png', 'bmp', 'gif',
            'css', 'scss', 'js',
            'pdf', 'doc', 'docx', 'csv', 'xls', 'xslx',
            'mp4', 'mpeg',
            'zip', 'rar');

    }


    /**
     * Avoid loading the same buffer 2 times in a row
     * Used if a cache plugin is installed
     * @return bool
     */
    public function obLoaded($hook = false) {
        if ($hook && function_exists('ob_list_handlers')) {
            $buffers = @ob_list_handlers();

            if (!empty($buffers)) {
                if (in_array($hook, $buffers)) {
                    return true;
                }
            }
        }

        return false;
    }


    /**
     * Start the buffer listener
     */
    public function startBuffer() {
        ob_start(array($this, 'getBuffer'));

    }

    /**
     * Get the output buffer
     * @param $buffer
     * @return mixed
     */
    public function getBuffer($buffer) {
        //Debug
        //$buffer .= json_encode(ob_list_handlers());
        //Make sure is permalink set up
        if (HMWP_Classes_Tools::getIsset('hmwp_disable')) {
            if (HMWP_Classes_Tools::getValue('hmwp_disable') == HMWP_Classes_Tools::getOption('hmwp_disable')) {
                return $buffer;
            }
        }

        if (strlen($buffer) < 255 || HMWP_Classes_Tools::getOption('error') || HMWP_Classes_Tools::getOption('logout')) {
            return $buffer;
        }

        //update the wp-rocket hooks instead of buffer
        if ($this->obLoaded('do_rocket_callback')) {
            $rocket_cache_search = apply_filters('rocket_cache_search', false);
            $rocket_override_donotcachepage = apply_filters('rocket_override_donotcachepage', false);
            if ((function_exists('is_404') && !is_404()) // Don't cache 404
                && (function_exists('is_search') && !is_search() || $rocket_cache_search) // Don't cache search results
                && (!defined('DONOTCACHEPAGE') || !DONOTCACHEPAGE || $rocket_override_donotcachepage) // Don't cache template that use this constant
            ) {
                return $buffer;
            }
        }


        //If ninja mode
        if (HMWP_Classes_Tools::getOption('hmwp_mode') == 'ninja') {
            if (HMWP_Classes_Tools::isHtmlHeader()) {

                //if it's not in admin dashboar or is in admin dashboard but it's not the adminitrator
                if ((!is_admin() && !is_network_admin()) || (HMWP_Classes_Tools::getOption('hmwp_in_dashboard') && !current_user_can('manage_options'))) {

                    $buffer = $this->find_replace($buffer);
                }
            }
        }

        return apply_filters('hmwp_buffer', $buffer);
    }

    /**
     * Prepare redirect build
     * @return $this
     */
    public function clearRedirect() {
        HMWP_Classes_Tools::$options = HMWP_Classes_Tools::getOptions();
        $this->_replace = array();

        return $this;
    }

    /**
     * Build the array with find and replace
     * Decide what goes to htaccess and not
     * @return $this
     */
    public function buildRedirect() {

        if (HMWP_Classes_Tools::getOption('hmwp_mode') <> 'default') {
            if (HMWP_Classes_Tools::isMultisites()) {
                //get all blogs
                global $wpdb;
                $this->paths = array();

                $blogs = $wpdb->get_results("SELECT path FROM " . $wpdb->blogs . " where blog_id > 1");
                foreach ($blogs as $blog) {
                    $this->paths[] = HMWP_Classes_Tools::getRelativePath($blog->path);
                }
                //HMWP_Debug::dump($this->paths);
            }

            //Redirect the AJAX
            if (HMWP_Classes_Tools::$default['hmwp_admin-ajax_url'] <> HMWP_Classes_Tools::getOption('hmwp_admin-ajax_url')) {
                $this->_replace['from'][] = HMWP_Classes_Tools::$default['hmwp_admin_url'] . '/' . HMWP_Classes_Tools::$default['hmwp_admin-ajax_url'];
                $this->_replace['to'][] = HMWP_Classes_Tools::getOption('hmwp_admin_url') . '/' . HMWP_Classes_Tools::getOption('hmwp_admin-ajax_url');
                $this->_replace['rewrite'][] = true;

                $this->_replace['from'][] = HMWP_Classes_Tools::getOption('hmwp_admin_url') . '/' . HMWP_Classes_Tools::$default['hmwp_admin-ajax_url'];
                $this->_replace['to'][] = HMWP_Classes_Tools::getOption('hmwp_admin_url') . '/' . HMWP_Classes_Tools::getOption('hmwp_admin-ajax_url');
                $this->_replace['rewrite'][] = false;
            }

            //Redirect the ADMIN
            if (HMWP_Classes_Tools::$default['hmwp_admin_url'] <> HMWP_Classes_Tools::getOption('hmwp_admin_url')) {
                $safeoptions = HMWP_Classes_Tools::getOptions(true);
                if (HMWP_Classes_Tools::$default['hmwp_admin_url'] <> $safeoptions['hmwp_admin_url']) {
                    $this->_replace['from'][] = "wp-admin" . '/';
                    $this->_replace['to'][] = $safeoptions['hmwp_admin_url'] . '/';
                    $this->_replace['rewrite'][] = true;
                }
                if (HMWP_Classes_Tools::getOption('hmwp_admin_url') <> $safeoptions['hmwp_admin_url']) {
                    $this->_replace['from'][] = "wp-admin" . '/';
                    $this->_replace['to'][] = HMWP_Classes_Tools::getOption('hmwp_admin_url') . '/';
                    $this->_replace['rewrite'][] = true;
                }
            }


            //Redirect the LOGIN
            if (HMWP_Classes_Tools::$default['hmwp_login_url'] <> HMWP_Classes_Tools::getOption('hmwp_login_url')) {
                $this->_replace['from'][] = "wp-login.php";
                $this->_replace['to'][] = HMWP_Classes_Tools::getOption('hmwp_login_url');
                $this->_replace['rewrite'][] = true;

                $this->_replace['from'][] = "wp-login.php";
                $this->_replace['to'][] = HMWP_Classes_Tools::getOption('hmwp_login_url') . '/';
                $this->_replace['rewrite'][] = true;

            }

            if (HMWP_Classes_Tools::getOption('hmwp_lostpassword_url') <> '') {
                $this->_replace['from'][] = HMWP_Classes_Tools::getOption('hmwp_login_url') . "?action=lostpassword";
                $this->_replace['to'][] = HMWP_Classes_Tools::getOption('hmwp_lostpassword_url');
                $this->_replace['rewrite'][] = true;
            }


            if (HMWP_Classes_Tools::getOption('hmwp_register_url') <> '') {
                $this->_replace['from'][] = HMWP_Classes_Tools::getOption('hmwp_login_url') . "?action=register";
                $this->_replace['to'][] = HMWP_Classes_Tools::getOption('hmwp_register_url');
                $this->_replace['rewrite'][] = true;
            }

            //Modify plugins urls
            if (HMWP_Classes_Tools::getOption('hmwp_hide_plugins')) {
                $all_plugins = HMWP_Classes_Tools::getOption('hmwp_plugins');

                if (!empty($all_plugins['to']))
                    foreach ($all_plugins['to'] as $index => $plugin_path) {
                        if (HMWP_Classes_Tools::isMultisites()) {
                            foreach ($this->paths as $path) {
                                //HMWP_Debug::dump($path);
                                $this->_replace['from'][] = $path . HMWP_Classes_Tools::$default['hmwp_plugin_url'] . '/' . $all_plugins['from'][$index];
                                $this->_replace['to'][] = HMWP_Classes_Tools::getOption('hmwp_plugin_url') . '/' . $plugin_path . '/';
                                $this->_replace['rewrite'][] = false;
                            }
                        }

                        $this->_replace['from'][] = HMWP_Classes_Tools::$default['hmwp_plugin_url'] . '/' . $all_plugins['from'][$index];
                        $this->_replace['to'][] = HMWP_Classes_Tools::getOption('hmwp_plugin_url') . '/' . $plugin_path . '/';
                        $this->_replace['rewrite'][] = true;
                    }
            }

            //Modify plugins
            if (HMWP_Classes_Tools::$default['hmwp_plugin_url'] <> HMWP_Classes_Tools::getOption('hmwp_plugin_url')) {
                if (HMWP_Classes_Tools::isMultisites()) {
                    foreach ($this->paths as $path) {
                        $this->_replace['from'][] = $path . HMWP_Classes_Tools::$default['hmwp_wp-content_url'] . '/' . HMWP_Classes_Tools::$default['hmwp_plugin_url'] . '/';
                        $this->_replace['to'][] = HMWP_Classes_Tools::getOption('hmwp_plugin_url') . '/';
                        $this->_replace['rewrite'][] = false;
                    }
                }

                $this->_replace['from'][] = HMWP_Classes_Tools::$default['hmwp_wp-content_url'] . '/' . HMWP_Classes_Tools::$default['hmwp_plugin_url'] . '/';
                $this->_replace['to'][] = HMWP_Classes_Tools::getOption('hmwp_plugin_url') . '/';
                $this->_replace['rewrite'][] = true;

            }

            //Modify themes urls
            if (HMWP_Classes_Tools::getOption('hmwp_hide_themes')) {
                $all_themes = HMWP_Classes_Tools::getOption('hmwp_themes');

                if (!empty($all_themes['to'])) {
                    foreach ($all_themes['to'] as $index => $theme_path) {
                        if (HMWP_Classes_Tools::isMultisites()) {
                            foreach ($this->paths as $path) {
                                $this->_replace['from'][] = $path . HMWP_Classes_Tools::$default['hmwp_wp-content_url'] . '/' . HMWP_Classes_Tools::$default['hmwp_themes_url'] . '/' . $all_themes['from'][$index];
                                $this->_replace['to'][] = HMWP_Classes_Tools::getOption('hmwp_themes_url') . '/' . $theme_path . '/';
                                $this->_replace['rewrite'][] = false;

                                $this->_replace['from'][] = $path . HMWP_Classes_Tools::$default['hmwp_wp-content_url'] . '/' . HMWP_Classes_Tools::$default['hmwp_themes_url'] . '/' . $all_themes['from'][$index] . HMWP_Classes_Tools::$default['hmwp_themes_style'];
                                $this->_replace['to'][] = HMWP_Classes_Tools::getOption('hmwp_themes_url') . '/' . $theme_path . '/' . HMWP_Classes_Tools::getOption('hmwp_themes_style');
                                $this->_replace['rewrite'][] = false;
                            }
                        }

                        if (HMWP_Classes_Tools::$default['hmwp_themes_style'] <> HMWP_Classes_Tools::getOption('hmwp_themes_style')) {
                            $this->_replace['from'][] = HMWP_Classes_Tools::$default['hmwp_wp-content_url'] . '/' . HMWP_Classes_Tools::$default['hmwp_themes_url'] . '/' . $all_themes['from'][$index] . HMWP_Classes_Tools::$default['hmwp_themes_style'];
                            $this->_replace['to'][] = HMWP_Classes_Tools::getOption('hmwp_themes_url') . '/' . $theme_path . '/' . HMWP_Classes_Tools::getOption('hmwp_themes_style');
                            $this->_replace['rewrite'][] = false;

                            $this->_replace['from'][] = HMWP_Classes_Tools::getOption('hmwp_themes_url') . '/' . $theme_path . '/' . HMWP_Classes_Tools::$default['hmwp_themes_style'];
                            $this->_replace['to'][] = HMWP_Classes_Tools::getOption('hmwp_themes_url') . '/' . $theme_path . '/' . HMWP_Classes_Tools::getOption('hmwp_themes_style');
                            $this->_replace['rewrite'][] = true;
                        }

                        $this->_replace['from'][] = HMWP_Classes_Tools::$default['hmwp_wp-content_url'] . '/' . HMWP_Classes_Tools::$default['hmwp_themes_url'] . '/' . $all_themes['from'][$index];
                        $this->_replace['to'][] = HMWP_Classes_Tools::getOption('hmwp_themes_url') . '/' . $theme_path . '/';
                        $this->_replace['rewrite'][] = true;
                    }

                }
            }

            //Modify theme URL
            if (HMWP_Classes_Tools::$default['hmwp_themes_url'] <> HMWP_Classes_Tools::getOption('hmwp_themes_url')) {
                if (HMWP_Classes_Tools::isMultisites()) {
                    foreach ($this->paths as $path) {
                        $this->_replace['from'][] = $path . HMWP_Classes_Tools::$default['hmwp_wp-content_url'] . '/' . HMWP_Classes_Tools::$default['hmwp_themes_url'] . '/';
                        $this->_replace['to'][] = HMWP_Classes_Tools::getOption('hmwp_themes_url') . '/';
                        $this->_replace['rewrite'][] = false;
                    }
                }

                $this->_replace['from'][] = HMWP_Classes_Tools::$default['hmwp_wp-content_url'] . '/' . HMWP_Classes_Tools::$default['hmwp_themes_url'] . '/';
                $this->_replace['to'][] = HMWP_Classes_Tools::getOption('hmwp_themes_url') . '/';
                $this->_replace['rewrite'][] = true;

            }

            //Modify uploads
            if (HMWP_Classes_Tools::$default['hmwp_upload_url'] <> HMWP_Classes_Tools::getOption('hmwp_upload_url')) {
                if (HMWP_Classes_Tools::isMultisites()) {
                    foreach ($this->paths as $path) {
                        $this->_replace['from'][] = $path . HMWP_Classes_Tools::$default['hmwp_wp-content_url'] . '/' . HMWP_Classes_Tools::$default['hmwp_upload_url'] . '/';
                        $this->_replace['to'][] = HMWP_Classes_Tools::getOption('hmwp_upload_url') . '/';
                        $this->_replace['rewrite'][] = false;
                    }
                }

                $this->_replace['from'][] = HMWP_Classes_Tools::$default['hmwp_wp-content_url'] . '/' . HMWP_Classes_Tools::$default['hmwp_upload_url'] . '/';
                $this->_replace['to'][] = HMWP_Classes_Tools::getOption('hmwp_upload_url') . '/';
                $this->_replace['rewrite'][] = true;

            }

            //Modify wp-content
            if (HMWP_Classes_Tools::$default['hmwp_wp-content_url'] <> HMWP_Classes_Tools::getOption('hmwp_wp-content_url')) {
                if (HMWP_Classes_Tools::isMultisites()) {
                    foreach ($this->paths as $path) {
                        $this->_replace['from'][] = $path . HMWP_Classes_Tools::$default['hmwp_wp-content_url'] . '/';
                        $this->_replace['to'][] = HMWP_Classes_Tools::getOption('hmwp_wp-content_url') . '/';
                        $this->_replace['rewrite'][] = false;
                    }
                }

                $this->_replace['from'][] = HMWP_Classes_Tools::$default['hmwp_wp-content_url'] . '/';
                $this->_replace['to'][] = HMWP_Classes_Tools::getOption('hmwp_wp-content_url') . '/';
                $this->_replace['rewrite'][] = true;
            }

            //Modify wp-includes
            if (HMWP_Classes_Tools::$default['hmwp_wp-includes_url'] <> HMWP_Classes_Tools::getOption('hmwp_wp-includes_url')) {
                if (HMWP_Classes_Tools::isMultisites()) {
                    foreach ($this->paths as $path) {
                        $this->_replace['from'][] = $path . HMWP_Classes_Tools::$default['hmwp_wp-includes_url'] . '/';
                        $this->_replace['to'][] = HMWP_Classes_Tools::getOption('hmwp_wp-includes_url') . '/';
                        $this->_replace['rewrite'][] = false;
                    }
                }

                $this->_replace['from'][] = HMWP_Classes_Tools::$default['hmwp_wp-includes_url'] . '/';
                $this->_replace['to'][] = HMWP_Classes_Tools::getOption('hmwp_wp-includes_url') . '/';
                $this->_replace['rewrite'][] = true;

            }

            //Modify wp-comments-post
            if (HMWP_Classes_Tools::$default['hmwp_wp-comments-post'] <> HMWP_Classes_Tools::getOption('hmwp_wp-comments-post')) {
                $this->_replace['from'][] = HMWP_Classes_Tools::$default['hmwp_wp-comments-post'];
                $this->_replace['to'][] = HMWP_Classes_Tools::getOption('hmwp_wp-comments-post') . '/';
                $this->_replace['rewrite'][] = true;
            }

            //Modify the author link
            if (HMWP_Classes_Tools::$default['hmwp_author_url'] <> HMWP_Classes_Tools::getOption('hmwp_author_url')) {
                $this->_replace['from'][] = HMWP_Classes_Tools::$default['hmwp_author_url'] . '/';
                $this->_replace['to'][] = HMWP_Classes_Tools::getOption('hmwp_author_url') . '/';
                $this->_replace['rewrite'][] = true;
            }


            if (HMWP_Classes_Tools::getOption('hmwp_disable_rest_api') == 1 && HMWP_Classes_Tools::$default['hmwp_wp-json'] <> HMWP_Classes_Tools::getOption('hmwp_wp-json')
            ) {
                $this->_replace['from'][] = HMWP_Classes_Tools::$default['hmwp_wp-json'];
                $this->_replace['to'][] = HMWP_Classes_Tools::getOption('hmwp_wp-json');
                $this->_replace['rewrite'][] = true;
            }

        }

        return $this;

    }

    /**
     * Get all the plugin names
     *
     * @return array
     */
    public function getAllPlugins() {
        $all_plugins = array_keys(get_plugins());
        if (is_multisite()) {
            $all_plugins = array_merge($all_plugins, array_keys(get_mu_plugins()));
        }

        return $all_plugins;
    }

    /**
     * Rename all the plugin names with a hash
     */
    public function hidePluginNames() {
        $dbplugins = array();

        $all_plugins = $this->getAllPlugins();

        foreach ($all_plugins as $plugin) {
            if (is_plugin_active($plugin)) {
                $dbplugins['to'][] = substr(md5($plugin), 0, 10);
                $dbplugins['from'][] = plugin_dir_path($plugin);
            }
        }

        HMWP_Classes_Tools::saveOptions('hmwp_plugins', $dbplugins);
    }

    /**
     * Get all the themes names
     *
     * @return array
     */
    public function getAllThemes() {
        return search_theme_directories();
    }

    /**
     * Rename all the themes name with a hash
     */
    public function hideThemeNames() {
        $dbthemes = array();

        $all_themes = $this->getAllThemes();

        foreach ($all_themes as $theme => $value) {
            if (is_dir($value['theme_root'])) {
                $dbthemes['to'][] = substr(md5($theme), 0, 10);
                $dbthemes['from'][] = $theme . '/';
            }
        }

        HMWP_Classes_Tools::saveOptions('hmwp_themes', $dbthemes);
    }

    /**
     * ADMIN_PATH is the new path and set in /config.php
     * @return bool
     */
    public function setRewriteRules() {
        $rewrites = array();
        $rewritecode = '';
        require_once ABSPATH . 'wp-admin/includes/misc.php';
        require_once ABSPATH . 'wp-admin/includes/file.php';

        if (!empty($this->_replace)) {
            //form the IIS rewrite
            if (HMWP_Classes_Tools::isIIS()) {
                foreach ($this->_replace['to'] as $key => $row) {
                    if ($this->_replace['rewrite'][$key]) {
                        $rewrites[] = array(
                            'from' => '([_0-9a-zA-Z-]+/)?' . $this->_replace['to'][$key] . "(.*)",
                            'to' => $this->_replace['from'][$key] . "{R:" . (substr_count($this->_replace['to'][$key], '(') + 2) . '}',
                        );
                    }
                }
            } else {
                foreach ($this->_replace['to'] as $key => $row) {
                    if ($this->_replace['rewrite'][$key]) {
                        $rewrites[] = array(
                            'from' => '([_0-9a-zA-Z-]+/)?' . $this->_replace['to'][$key] . "(.*)",
                            'to' => $this->_replace['from'][$key] . "$" . (substr_count($this->_replace['to'][$key], '(') + 2),
                        );
                    }
                }
            }

            foreach ($rewrites as $rewrite) {
                add_rewrite_rule($rewrite['from'], $rewrite['to'], 'top');
            }
        }

        if (!save_mod_rewrite_rules()) {
            $home_root = parse_url(home_url());
            if (isset($home_root['path']))
                $home_root = trailingslashit($home_root['path']);
            else
                $home_root = '/';

            if (HMWP_Classes_Tools::isApache() || HMWP_Classes_Tools::isLitespeed()) {
                foreach ($rewrites as $rewrite) {
                    if (strpos($rewrite['to'], 'index.php') === false)
                        $rewritecode .= 'RewriteRule ^' . $rewrite['from'] . ' ' . $home_root . $rewrite['to'] . " [QSA,L]<br />";
                }
            } elseif (HMWP_Classes_Tools::isNginx()) {
                foreach ($rewrites as $rewrite) {
                    if (strpos($rewrite['to'], 'index.php') === false)
                        $rewritecode .= 'rewrite ^/' . $rewrite['from'] . ' ' . $home_root . $rewrite['to'] . " last;<br />";
                }
            } elseif (HMWP_Classes_Tools::isIIS()) {
                //hide old path for IIS servers
                if (HMWP_Classes_Tools::getOption('hmwp_hide_oldpaths') == 1) {
                    $rewritecode .= '&lt;rule name="block_oldpaths" stopProcessing="true"&gt;<br />
                            &lt;match url="^([_0-9a-zA-Z-]+/)?(wp-(content|includes)/.*)" ignoreCase="false" /&gt;<br />
                             &lt;conditions&gt;<br />
                                &lt;add input="{HTTP_COOKIE}" pattern="(wordpress_logged_in_|wp-postpass_|wptouch_switch_toggle|comment_author_|comment_author_email_)" negate="true" /&gt;<br />
                              &lt;/conditions&gt;<br />
                            &lt;action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" /&gt;<br />
                        &lt;/rule&gt;' . "<br />";
                }
                foreach ($rewrites as $rewrite) {
                    if (strpos($rewrite['to'], 'index.php') === false) {
                        $rewritecode .= '&lt;rule name="' . md5($home_root . $rewrite['from']) . '" stopProcessing="true"&gt;<br />
                            &lt;match url="^' . $rewrite['from'] . '" ignoreCase="false" /&gt;<br />
                            &lt;action type="Rewrite" url="' . $home_root . $rewrite['to'] . '"/&gt;<br />
                        &lt;/rule&gt;' . "<br />";
                    }
                    //   $rewritecode .= 'rewrite ^/' . $rewrite['from'] . ' ' . $home_root . $rewrite['to'] . " last;<br />";
                }
            }

            $form = '<br />
                    <form method="POST" style="margin: 8px 0;">
                        <input type="hidden" name="action" value="hmwp_manualrewrite" />
                        <input type="hidden" name="hmwp_nonce" value="' . wp_create_nonce(_HMWP_NONCE_ID_) . '" />
                        <input type="submit" class="btn btn-success save" value="Okay, I set it up" />
                    </form>
                    ';

            if ($rewritecode <> '') {
                if (HMWP_Classes_Tools::isApache() || HMWP_Classes_Tools::isLitespeed()) {
                    if (is_multisite()) {
                        HMWP_Classes_Error::setError('Multisite detected. You need to update your .htaccess file by adding following line before \'RewriteCond REQUEST_FILENAME} !-f\': <br /><br /><code>' . $rewritecode . '</code>' . $form);
                    } else {
                        HMWP_Classes_Error::setError('.htaccess file is not writable. You need to update your .htaccess file by adding following line before \'RewriteCond REQUEST_FILENAME} !-f\': <br /><br /><code>' . $rewritecode . '</code>' . $form);
                    }
                } elseif (HMWP_Classes_Tools::isNginx()) {
                    HMWP_Classes_Error::setError('Nginx detected. The config file is usually located in /etc/nginx/nginx.conf or /etc/nginx/conf/nginx.conf or C:\nginx\conf\nginx.conf. <strong><a href="http://hidemywp.co/article/how-to-setup-hide-my-wp-on-nginx-server/" target="_blank" style="color: red">Learn How To Add the Code</a></strong> <br /><br /><code><strong>' . $rewritecode . '</strong></code>' . $form);

                } elseif (HMWP_Classes_Tools::isIIS()) {
                    HMWP_Classes_Error::setError('IIS detected. You need to update your web.config file by adding following line after &lt;rules&gt; tag: <br /><br /><code>' . $rewritecode . '</code>' . $form);
                }
            } else {
                HMWP_Classes_Error::setError('.htaccess file is not writable. If you added a different admin path before, please remove it in order to work without errors. ' . $form);

            }

            return false;
        }

        return true;
    }

    /**
     * Not used yet
     * @param $wp_rewrite
     * @return mixed
     */
    public function setRewriteIndexRules($wp_rewrite) {
        return $wp_rewrite;
    }

    /**
     * Flush the changes in htaccess
     */
    public function flushChanges() {

        if (!did_action('wp_loaded')) {
            add_action('wp_loaded', array($this, 'flushChanges'));
        }

        $this->clearRedirect()
            ->buildRedirect();

        if (HMWP_Classes_Tools::getOption('hmwp_send_email')) {
            $lastsafeoptions = HMWP_Classes_Tools::getOptions(true);
            if ($lastsafeoptions['hmwp_admin_url'] <> HMWP_Classes_Tools::getOption('hmwp_admin_url') ||
                $lastsafeoptions['hmwp_login_url'] <> HMWP_Classes_Tools::getOption('hmwp_login_url')
            ) {
                HMWP_Classes_Tools::sendEmail();
            }
        }


        global $wp_rewrite;
        $wp_rewrite->flush_rules(true);
    }


    /**
     * Allow find and replace only for HTML
     * @param $url
     * @return bool
     */
    public function doReplace($url) {
        return ($this->isFile($url) == false);
    }

    /**
     * If the rewrite config is not set
     * If there is a new file path, change it back to real path and show the file
     * Prevents errors when the paths are chnged but the rewrite config is not set up correctly
     * @param $url
     * @return bool|string
     */
    public function isFile($url) {
        if ($url <> '') {
            if (strrpos($url, '.') !== false) {
                $ext = substr($url, strrpos($url, '.') + 1);
                if (in_array($ext, $this->_files)) {
                    return $ext;
                }
            }
        }

        return false;
    }

    /**
     * Get the current URL
     * @return string
     */
    public function getCurrentURL() {
        $url = '';
        if (isset($_SERVER['HTTP_HOST'])) {
            // build the URL in the address bar
            $url = is_ssl() ? 'https://' : 'http://';
            $url .= $_SERVER['HTTP_HOST'];
            $url .= $_SERVER['REQUEST_URI'];
        }

        return $url;
    }

    /**
     * Show the file when the server rewrite is not added
     */
    public function showFile() {
        if (!defined('ABSPATH')) {
            return;
        }

        $url = $this->getCurrentURL();

        $original = @parse_url($url);
        if (false === $original) {
            return;
        }

        if ($ext = $this->isFile($url)) {
            //Build the find_replace list
            $this->clearRedirect()
                ->buildRedirect();
            //make sure to include the blog
            $this->prepareFindReplace($url);

            $new_url = str_replace($this->_replace['to'], $this->_replace['from'], $url);

            if ($url <> $new_url) {
                $blog_url = str_replace(array('/' . HMWP_Classes_Tools::$default['hmwp_wp-content_url']), '', content_url());
                $new_path = str_replace($blog_url, ABSPATH, $new_url);

                if (file_exists($new_path)) {
                    switch ($ext) {
                        case "scss":
                        case "css":
                            $ctype = "text/css";
                            break;
                        case "js":
                            $ctype = "application/javascript";
                            break;
                        default:
                            $ctype = @mime_content_type($new_path);
                    }
                    header("HTTP/1.1 200 OK");
                    header('Content-Type: ' . $ctype);
                    $content = file_get_contents($new_path);
                    $content = preg_replace('/\*\*\*+/s', '', $content);
                    $content = preg_replace('/(\/\*[^\*]+\*\/)/s', '', $content);
                    echo $content;
                    exit();
                }
            }
        }
    }

    /**
     * Return to default in case of rewrite errors.
     * This might happen if the rewrite is not set in the htacees of for other servers
     * Prevents the path error
     */
    public function fixURI() {
        if (isset($_SERVER['REQUEST_URI'])) {
            if (HMWP_Classes_Tools::$default['hmwp_admin_url'] <> HMWP_Classes_Tools::getOption('hmwp_admin_url')) {
                if (strpos($_SERVER['REQUEST_URI'], '/' . HMWP_Classes_Tools::getOption('hmwp_admin_url')) !== false) {
                    HMWP_Classes_Tools::saveOptions('error', true);
                }
            }
            if (HMWP_Classes_Tools::$default['hmwp_login_url'] <> HMWP_Classes_Tools::getOption('hmwp_login_url')) {
                if (strpos($_SERVER['REQUEST_URI'], '/' . HMWP_Classes_Tools::getOption('hmwp_login_url')) !== false) {
                    HMWP_Classes_Tools::saveOptions('error', true);
                }
            }
        }
    }

    /**
     * Add the custom param vars for: disable hide my wp and admin tabs
     * @param $vars
     * @return array
     */
    public function addParams($vars) {
        $vars[] = 'hmwp_disable';
        $vars[] = 'tab';
        return $vars;
    }

    /**
     * Get the new admin URL
     * @param $url
     * @param $path
     * @param null $blog_id
     * @return mixed|string
     */
    public function admin_url($url, $path, $blog_id = null) {
        $find = $replace = array();

        if (HMWP_Classes_Tools::getOption('error') || HMWP_Classes_Tools::getOption('logout')) {
            return $url;
        }

        if (!defined('ADMIN_COOKIE_PATH')) {
            return $url;
        }


        if (HMWP_Classes_Tools::getIsset('hmwp_disable')) {
            if (HMWP_Classes_Tools::getValue('hmwp_disable') == HMWP_Classes_Tools::getOption('hmwp_disable')) {
                return add_query_arg(array('hmwp_disable' => HMWP_Classes_Tools::getOption('hmwp_disable')), $url);
            }
        }

        if (HMWP_Classes_Tools::$default['hmwp_admin-ajax_url'] <> HMWP_Classes_Tools::getOption('hmwp_admin-ajax_url')) {
            $find[] = '/' . HMWP_Classes_Tools::$default['hmwp_admin-ajax_url'];
            $replace[] = '/' . HMWP_Classes_Tools::getOption('hmwp_admin-ajax_url');
        }


        if (HMWP_Classes_Tools::$default['hmwp_admin_url'] <> HMWP_Classes_Tools::getOption('hmwp_admin_url')) {
            $find[] = '/' . HMWP_Classes_Tools::$default['hmwp_admin_url'] . '/';
            $replace[] = '/' . HMWP_Classes_Tools::getOption('hmwp_admin_url') . '/';
        }

        $url = str_replace($find, $replace, $url);

        return $url;
    }

    /**
     * Change the admin URL for multisites
     * @param $url
     * @param $path
     * @return mixed|string
     */
    public function network_admin_url($url, $path) {
        $find = $replace = array();
        if (HMWP_Classes_Tools::getOption('error') || HMWP_Classes_Tools::getOption('logout')) {
            return $url;
        }

        if (!defined('ADMIN_COOKIE_PATH')) {
            return $url;
        }


        if (HMWP_Classes_Tools::getOption('hmwp_admin_url') == 'wp-admin') {
            return $url;
        }

        if (HMWP_Classes_Tools::getIsset('hmwp_disable')) {
            if (HMWP_Classes_Tools::getValue('hmwp_disable') == HMWP_Classes_Tools::getOption('hmwp_disable')) {
                return add_query_arg(array('hmwp_disable' => HMWP_Classes_Tools::getOption('hmwp_disable')), $url);
            }
        }


        $from = HMWP_Classes_Tools::$default['hmwp_admin_url'];
        $to = HMWP_Classes_Tools::getOption('hmwp_admin_url');

        $find[] = network_site_url($from . '/', $to);
        $replace[] = network_site_url('/' . HMWP_Classes_Tools::getOption('hmwp_admin_url') . '/', $to);

        if (HMWP_Classes_Tools::$default['hmwp_admin-ajax_url'] <> HMWP_Classes_Tools::getOption('hmwp_admin-ajax_url')) {
            $find[] = '/' . HMWP_Classes_Tools::$default['hmwp_admin-ajax_url'];
            $replace[] = '/' . HMWP_Classes_Tools::getOption('hmwp_admin-ajax_url');
        }

        //HMWP_Debug::dump('$find', $find);
        //HMWP_Debug::dump('$replace', $replace);

        $url = str_replace($find, $replace, $url);

        return $url;
    }

    /**
     * Login Header Hook
     */
    public function login_head() {
        // remove_filter( 'login_headerurl', 'change_wp_login_url' );
        add_filter('login_headerurl', array($this, 'login_url'), 99, 1);
    }

    /**
     * Get the new Login URL
     * @param $url
     * @return string
     */
    public function login_url($url) {
        if (HMWP_Classes_Tools::getOption('error')) {
            return $url;
        }

        if (HMWP_Classes_Tools::$default['hmwp_login_url'] <> HMWP_Classes_Tools::getOption('hmwp_login_url')) {
            //check if disable and do not redirect to login
            if (HMWP_Classes_Tools::getIsset('hmwp_disable')) {
                if (HMWP_Classes_Tools::getValue('hmwp_disable') == HMWP_Classes_Tools::getOption('hmwp_disable')) {
                    //add the disabled param in order to work without issues
                    return add_query_arg(array('hmwp_disable' => HMWP_Classes_Tools::getOption('hmwp_disable')), $url);
                }
            }

            $url = site_url(HMWP_Classes_Tools::getOption('hmwp_login_url'));

            //exit($url);
        }
        return $url;
    }

    /**
     * Hook the Login Init from wp-login.php
     */
    public function login_init() {
        if (HMWP_Classes_Tools::getOption('error')) {
            return;
        }

        if (HMWP_Classes_Tools::$default['hmwp_login_url'] <> HMWP_Classes_Tools::getOption('hmwp_login_url')) {
            add_filter('lostpassword_redirect', array($this, 'lostpassword_redirect'), 1);
            add_filter('registration_redirect', array($this, 'registration_redirect'), 1);

            $this->setTestCookie();
        }

        //remove clasiera theme loop
        remove_action('login_init', 'classiera_cubiq_login_init');
        remove_filter( 'login_redirect', 'buddyboss_redirect_previous_page' );

        if (HMWP_Classes_Tools::getOption('hmwp_remove_third_hooks')) {
            remove_all_actions('login_init');
        }
    }

    /**
     * Change the password confirm URL with the new URL
     * @return string
     */
    public function lostpassword_redirect() {
        return site_url('wp-login.php?checkemail=confirm');
    }

    /**
     * Change the register confirmation URL with the new URL
     * @return string
     */
    public function registration_redirect() {
        return site_url('wp-login.php?checkemail=registered');
    }

    /**
     * Get the new Site URL
     * @param $url
     * @param string $path
     * @return string
     */
    public function site_url($url, $path = '') {
        if (HMWP_Classes_Tools::getOption('error') || HMWP_Classes_Tools::getOption('logout') || $url == '') {
            return $url;
        }

        if (HMWP_Classes_Tools::$default['hmwp_login_url'] <> HMWP_Classes_Tools::getOption('hmwp_login_url')) {

            if (strpos($url, 'wp-login') !== false) {
                //check if disable and do not redirect to login
                if (HMWP_Classes_Tools::getIsset('hmwp_disable')) {
                    if (HMWP_Classes_Tools::getValue('hmwp_disable') == HMWP_Classes_Tools::getOption('hmwp_disable')) {
                        //add the disabled param in order to work without issues
                        return add_query_arg(array('hmwp_disable' => HMWP_Classes_Tools::getOption('hmwp_disable')), $url);
                    }
                }

                $query = '';
                if ($path <> '') {
                    $parsed = @parse_url($path);
                    if (isset($parsed['query']) && $parsed['query'] <> '') {
                        $query = '?' . $parsed['query'];
                    }
                }

                if ($query == '?action=lostpassword' && HMWP_Classes_Tools::getOption('hmwp_lostpassword_url') <> '') {
                    $url = site_url(HMWP_Classes_Tools::getOption('hmwp_lostpassword_url'));
                } elseif ($query == '?action=register' && HMWP_Classes_Tools::getOption('hmwp_register_url') <> '') {
                    $url = site_url(HMWP_Classes_Tools::getOption('hmwp_register_url'));
                } else {
                    $url = site_url() . '/' . HMWP_Classes_Tools::getOption('hmwp_login_url') . $query;
                }
            }
        }

        return $url;
    }

    /**
     * Get the new Logout URL
     * @param $url
     * @return string
     */
    public function logout_url($url) {
        return add_query_arg(array('hmwp_disable' => HMWP_Classes_Tools::getOption('hmwp_disable')), $url);
    }

    /**
     * Get the new Author URL
     * @param $rewrite
     * @return mixed
     */
    public function author_url($rewrite) {
        if (HMWP_Classes_Tools::$default['hmwp_author_url'] <> HMWP_Classes_Tools::getOption('hmwp_author_url')) {
            foreach ($rewrite as $from => $to) {
                $newfrom = str_replace(HMWP_Classes_Tools::$default['hmwp_author_url'], HMWP_Classes_Tools::getOption('hmwp_author_url'), $from);
                $rewrite[$newfrom] = $to;
            }
        }
        return $rewrite;
    }

    /**
     * Hook the logout to flush the changes set in admin
     */
    public function wp_logout() {
        wp_destroy_current_session();
        wp_clear_auth_cookie();
        $_REQUEST['redirect_to'] = $redirect_to = site_url();
        wp_safe_redirect($redirect_to);
        die();
    }

    /**
     * In case of redirects, correct the redirect links
     * @param string $redirect
     * @param string $requested_redirect_to
     * @param string $user
     * @return string
     */
    public function sanitize_redirect($redirect, $requested_redirect_to, $user) {
        $parsed = parse_url($redirect);
        //Check if there is the safe parameter in the url
        if (isset($parsed['query']) && !empty($parsed['query'])) {
            parse_str($parsed['query']);
            if (isset($hmwp_disable)) {
                if ($hmwp_disable == HMWP_Classes_Tools::getOption('hmwp_disable')) {
                    $_GET['hmwp_disable'] = HMWP_Classes_Tools::getOption('hmwp_disable');
                }
            }
        }

        //check if disable and do not redirect to login
        if (HMWP_Classes_Tools::getIsset('hmwp_disable')) {
            if (HMWP_Classes_Tools::getValue('hmwp_disable') == HMWP_Classes_Tools::getOption('hmwp_disable')) {
                HMWP_Classes_Tools::$options = array_merge(HMWP_Classes_Tools::$options, HMWP_Classes_Tools::$default);
                HMWP_Classes_Tools::saveOptions();
                delete_option(HMWP_OPTION_SAFE);
                HMWP_Classes_ObjController::getClass('HMWP_Controllers_Brute')->clearBlockedIPs();
                $this->hmwp_remove_config_cache();
                $this->flushChanges();

                return site_url(HMWP_Classes_Tools::$default['hmwp_admin_url']);
            }
        }

        if (HMWP_Classes_Tools::$default['hmwp_login_url'] <> HMWP_Classes_Tools::getOption('hmwp_login_url')) {
            if (strpos($redirect, 'wp-login') !== false) {
                $redirect = site_url(HMWP_Classes_Tools::getOption('hmwp_login_url'));
            }
        }

        if (HMWP_Classes_Tools::$default['hmwp_admin_url'] <> HMWP_Classes_Tools::getOption('hmwp_admin_url')) {
            if (strpos($redirect, 'wp-admin') !== false) {
                $redirect = admin_url();
            }

            if (strrpos(strrev($redirect), strrev(HMWP_Classes_Tools::getOption('hmwp_admin_url'))) === 0) {
                $redirect = admin_url();
            }
        }

        if (HMWP_Classes_Tools::getOption('hmwp_remove_third_hooks')) {
            remove_all_actions('login_redirect');

            if (isset($user) && isset($user->ID)) {
                if (!is_wp_error($user) && empty($_REQUEST['reauth'])) {
                    //exit($redirect . ' ' . admin_url());
                    if ((empty($redirect) || $redirect == 'wp-admin/' || $redirect == admin_url())) {
                        // If the user doesn't belong to a blog, send them to user admin. If the user can't edit posts, send them to their profile.
                        if (is_multisite() && !get_active_blog_for_user($user->ID) && !is_super_admin($user->ID))
                            $redirect = user_admin_url();
                        elseif (method_exists($user, 'has_cap') && is_multisite() && !$user->has_cap('read'))
                            $redirect = get_dashboard_url($user->ID);
                        elseif (method_exists($user, 'has_cap') && !$user->has_cap('edit_posts'))
                            $redirect = $user->has_cap('read') ? admin_url('profile.php') : home_url();

                        wp_redirect($redirect);
                        exit();
                    }
                    wp_safe_redirect($redirect);
                    exit();
                }
            }
        }

        return $redirect;
    }

    /**
     * Check Hidden pages
     */
    public function hideUrls() {
        if (!HMWP_Classes_Tools::getOption('error')) {

            if (HMWP_Classes_Tools::getIsset('hmwp_disable')) {
                if (HMWP_Classes_Tools::getValue('hmwp_disable') == HMWP_Classes_Tools::getOption('hmwp_disable')) {
                    return;
                }
            }

            if (isset($_SERVER['SERVER_NAME'])) {
                $url = untrailingslashit(strtok($_SERVER["REQUEST_URI"], '?'));
                $http_post = ('POST' == $_SERVER['REQUEST_METHOD']);

                //if user is logged in and is not set to hide the admin urls
                if (is_user_logged_in() && !HMWP_Classes_Tools::getOption('hmwp_in_dashboard')) {
                    //redirect if no final slash is added
                    if ($_SERVER['REQUEST_URI'] == site_url(HMWP_Classes_Tools::getOption('hmwp_admin_url'), 'relative')) {
                        wp_safe_redirect($url . '/');
                        exit();
                    }
                } else {

                    //if is set to hide the urls or not logged in
                    if ($url <> '') {
                        if (HMWP_Classes_Tools::$default['hmwp_admin_url'] <> HMWP_Classes_Tools::getOption('hmwp_admin_url')) {

                            if (is_user_logged_in()) {
                                $paths = array(
                                    home_url('wp-admin', 'relative'),
                                );
                            } else {
                                if (strpos($url . '/', '/' . HMWP_Classes_Tools::getOption('hmwp_admin_url') . '/') !== false && HMWP_Classes_Tools::getOption('hmwp_hide_admin')) {
                                    if (strpos($url . '/', '/' . HMWP_Classes_Tools::getOption('hmwp_admin-ajax_url') . '/') === false) {
                                        $this->getNotFound($url);
                                    }
                                }

                                $paths = array(
                                    home_url('wp-admin', 'relative'),
                                    home_url('dashboard', 'relative'),
                                    home_url('admin', 'relative'),
                                    site_url('dashboard', 'relative'),
                                    site_url('admin', 'relative'),
                                );
                                $paths = array_unique($paths);
                            }
                            if ($this->searchInString($url, $paths)) {
                                if (site_url(HMWP_Classes_Tools::getOption('hmwp_admin_url'), 'relative') <> $url && HMWP_Classes_Tools::getOption('hmwp_hide_admin')) {
                                    $this->getNotFound($url);
                                }
                            }
                        } else {
                            if (strpos($url, '/wp-admin') !== false && strpos($url, admin_url('admin-ajax.php', 'relative')) === false && HMWP_Classes_Tools::getOption('hmwp_hide_admin')) {
                                $this->getNotFound($url);
                            }
                        }

                        if ($http_post) {
                            if (HMWP_Classes_Tools::getOption('hmwp_lostpassword_url') <> '') {
                                if (strpos($url, '/' . HMWP_Classes_Tools::getOption('hmwp_lostpassword_url')) !== false) {
                                    $_REQUEST['action'] = 'lostpassword';
                                }
                            }

                            if (HMWP_Classes_Tools::getOption('hmwp_register_url') <> '') {
                                if (strpos($url, '/' . HMWP_Classes_Tools::getOption('hmwp_register_url')) !== false) {
                                    $_REQUEST['action'] = 'register';
                                }
                            }
                        }

                        if (HMWP_Classes_Tools::$default['hmwp_login_url'] <> HMWP_Classes_Tools::getOption('hmwp_login_url')) {
                            if (is_user_logged_in()) {
                                $paths = array(
                                    site_url('wp-login.php', 'relative'),
                                    site_url('wp-login', 'relative'),
                                );
                            } else {
                                $paths = array(
                                    home_url('wp-login.php', 'relative'),
                                    home_url('wp-login', 'relative'),
                                    home_url('login', 'relative'),
                                    site_url('wp-login.php', 'relative'),
                                    site_url('wp-login', 'relative'),
                                    site_url('login', 'relative'),

                                );
                                $paths = array_unique($paths);
                            }

                            if ($this->searchInString($url, $paths)) {
                                if (site_url(HMWP_Classes_Tools::getOption('hmwp_login_url'), 'relative') <> $url && HMWP_Classes_Tools::getOption('hmwp_hide_login')) {
                                    $this->getNotFound($url);
                                }
                            }
                        }

                        if (HMWP_Classes_Tools::$default['hmwp_author_url'] <> HMWP_Classes_Tools::getOption('hmwp_author_url')) {
                            $paths = array(
                                home_url('author', 'relative'),
                            );
                            if ($this->searchInString($url, $paths)) {
                                $this->getNotFound($url);
                            }
                        }

                    }
                }
            }
        }


    }

    /**
     * Search part of string in array
     *
     * @param $needle
     * @param $haystack
     * @return bool
     */
    public function searchInString($needle, $haystack) {
        foreach ($haystack as $value) {
            if (stripos($needle . '/', $value . '/') !== false) {
                return true;
            }
        }
        return false;
    }

    /**
     * Return 404 page or redirect
     */
    public function getNotFound($url) {
        HMWP_Debug::dump($url);

        if (HMWP_Classes_Tools::getOption('hmwp_url_redirect') == '404') {
            global $wp_query;
            $wp_query->is_404 = true;

            wp_safe_redirect(site_url('404'));
        } elseif (HMWP_Classes_Tools::getOption('hmwp_url_redirect') == '.') {
            //redirect to front page
            wp_redirect(site_url());
        } else {
            //redirect to custom page
            wp_redirect(site_url(HMWP_Classes_Tools::getOption('hmwp_url_redirect')));
        }

        die();
    }


    /********************** COOKIES  ******************************/
    public function checkCookies() {
        if (HMWP_Classes_Tools::$default['hmwp_admin_url'] <> HMWP_Classes_Tools::getOption('hmwp_admin_url')) {
            HMWP_Classes_Tools::setCookieContants();
            add_filter('redirect_post_location', array($this, 'setPostCookie'), 11, 2);
            add_action('set_auth_cookie', array($this, 'setLoginCookie'), 11, 2);
            add_action('clear_auth_cookie', array($this, 'setCleanCookie'), 11, 0);
        }

    }

    public function setPostCookie($location, $post_id) {
        if (defined('HMWP_ADMIN_COOKIE_PATH')) {
            if ($post_id > 0) {
                if (isset($_COOKIE['wp-saving-post']) && $_COOKIE['wp-saving-post'] === $post_id . '-check') {
                    setcookie('wp-saving-post', $post_id . '-saved', time() + DAY_IN_SECONDS, HMWP_ADMIN_COOKIE_PATH, COOKIE_DOMAIN, is_ssl());
                }
            }
        }
        return $location;
    }

    public function setTestCookie() {
        $secure = is_ssl();
        setcookie(TEST_COOKIE, 'WP Cookie check', 0, COOKIEPATH, $this->getCookieDomain(), $secure);
    }

    public function setLoginCookie($auth_cookie, $expire) {
        if (defined('HMWP_ADMIN_COOKIE_PATH')) {

            $secure = is_ssl();
            if ($secure) {
                $auth_cookie_name = SECURE_AUTH_COOKIE;
            } else {
                $auth_cookie_name = AUTH_COOKIE;
            }

            if (defined('PLUGINS_COOKIE_PATH')) {
                setcookie($auth_cookie_name, $auth_cookie, $expire, HMWP_PLUGINS_COOKIE_PATH, $this->getCookieDomain(), $secure, true);
            }
            setcookie($auth_cookie_name, $auth_cookie, $expire, HMWP_ADMIN_COOKIE_PATH, $this->getCookieDomain(), $secure, true);

        }
    }

    /**
     * Clean the user cookies on logout
     */
    public function setCleanCookie() {
        if (defined('HMWP_ADMIN_COOKIE_PATH') && defined('PLUGINS_COOKIE_PATH')) {
            setcookie(AUTH_COOKIE, ' ', time() - YEAR_IN_SECONDS, HMWP_ADMIN_COOKIE_PATH, COOKIE_DOMAIN);
            setcookie(SECURE_AUTH_COOKIE, ' ', time() - YEAR_IN_SECONDS, HMWP_ADMIN_COOKIE_PATH, COOKIE_DOMAIN);
            setcookie(AUTH_COOKIE, ' ', time() - YEAR_IN_SECONDS, HMWP_PLUGINS_COOKIE_PATH, COOKIE_DOMAIN);
            setcookie(SECURE_AUTH_COOKIE, ' ', time() - YEAR_IN_SECONDS, HMWP_PLUGINS_COOKIE_PATH, COOKIE_DOMAIN);
        }
    }

    public function getCookieDomain() {
        $domain = COOKIE_DOMAIN;

        if (is_multisite()) {
            global $blog_id;
            switch_to_blog($blog_id);
            $current_network = get_network();
            if (!empty($current_network->cookie_domain)) {
                if (strpos($current_network->cookie_domain, parse_url(get_option('siteurl'), PHP_URL_HOST)) === false) {
                    $domain = '.' . parse_url(get_option('siteurl'), PHP_URL_HOST);
                }
            } else {
                if (strpos($current_network->domain, parse_url(get_option('siteurl'), PHP_URL_HOST)) === false) {
                    $domain = '.' . parse_url(get_option('siteurl'), PHP_URL_HOST);
                }
            }
        }

        return $domain;
    }
    /******************************************************************************/

    /**
     * Deprecated since 2.2.007
     * @return bool
     */
    public function hmwp_remove_config_cache() {
        if (file_exists(ABSPATH . 'wp-config.php')) {
            $global_config_file = ABSPATH . 'wp-config.php';
        } else {
            $global_config_file = dirname(ABSPATH) . '/wp-config.php';
        }

        if (!$this->is_writeable_ACLSafe($global_config_file) || !$this->wp_cache_replace_line('define *\( *\'ADMIN_COOKIE_PATH\'', '', $global_config_file)) {
            HMWP_Classes_Error::setError(sprintf(__('%s is not writable. <br/>Open the file and remove the line that starts with: <br/><em><strong>%s</strong></em><br/><br/>', _HMWP_PLUGIN_NAME_), $global_config_file, 'define(\'ADMIN_COOKIE_PATH\' ...'));
            return false;
        }
        return true;
    }

    /**
     * Deprecated since 2.2.007
     * @return bool
     */
    public function hmwp_create_config_cache($url) {
        if (HMWP_VERSION_ID > 22007) {
            return true;
        }

        //Remove the wp-config line if deafult url is set
        if ($url == HMWP_Classes_Tools::$default['hmwp_admin_url']) {
            return $this->hmwp_remove_config_cache();
        }

        if (file_exists(ABSPATH . 'wp-config.php')) {
            $global_config_file = ABSPATH . 'wp-config.php';
        } else {
            $global_config_file = dirname(ABSPATH) . '/wp-config.php';
        }

        $form = '    <br />
                    <form method="POST" style="margin: 8px 0;">
                        <input type="hidden" name="action" value="hmwp_manualrewrite" />
                        <input type="hidden" name="hmwp_nonce" value="' . wp_create_nonce(_HMWP_NONCE_ID_) . '" />
                        <input type="submit" class="btn btn-success save" value="Okay, I set it up" />
                    </form>
                    ';

        $line = null;
        if (is_multisite()) {
            if (HMWP_Classes_Tools::isMultisites()) {
                $line = ''; //remove the config
            } else {
                if (ADMIN_COOKIE_PATH <> rtrim(wp_make_link_relative(network_site_url($url)), '/')) {
                    $line = 'define( \'ADMIN_COOKIE_PATH\', \'' . rtrim(wp_make_link_relative(network_site_url($url)), '/') . '\' );';
                }
            }
        } else {
            if (ADMIN_COOKIE_PATH <> rtrim(wp_make_link_relative(site_url($url)), '/')) {
                $line = 'define( \'ADMIN_COOKIE_PATH\', \'' . rtrim(wp_make_link_relative(site_url($url)), '/') . '\' );';
            }
        }

        if (isset($line)) {
            if (!$this->is_writeable_ACLSafe($global_config_file) || !$this->wp_cache_replace_line('define *\( *\'ADMIN_COOKIE_PATH\'', $line, $global_config_file)) {
                HMWP_Classes_Error::setError(sprintf(__('%s is not writable. Open the file and write: <br/><em><strong>%s</strong></em> on line 2 ', _HMWP_PLUGIN_NAME_), $global_config_file, $line) . $form);
                return false;
            }
        }
        return true;
    }

    public function is_writeable_Htaccess() {
        if (is_multisite()) {
            return;
        }

        global $wp_rewrite;

        $home_path = get_home_path();
        $htaccess_file = $home_path . '.htaccess';

        /*
         * If the file doesn't already exist check for write access to the directory
         * and whether we have some rules. Else check for write access to the file.
         */
        if ((!file_exists($htaccess_file) && is_writable($home_path) && $wp_rewrite->using_mod_rewrite_permalinks()) || is_writable($htaccess_file)) {
            if (got_mod_rewrite()) {
                return true;
            }
        }

        return false;
    }

    public function is_writeable_ACLSafe($path) {
        // PHP's is_writable does not work with Win32 NTFS
        if ($path{strlen($path) - 1} == '/') {// recursively return a temporary file path
            return $this->is_writeable_ACLSafe($path . uniqid(mt_rand()) . '.tmp');
        } elseif (is_dir($path)) {
            return $this->is_writeable_ACLSafe($path . '/' . uniqid(mt_rand()) . '.tmp');
        }
        // check tmp file for read/write capabilities
        $rm = file_exists($path);
        $f = @fopen($path, 'a');

        if ($f === false) {
            return false;
        }
        fclose($f);

        if (!$rm) {
            unlink($path);
        }
        return true;
    }

    public function wp_cache_replace_line($old, $new, $my_file) {
        if (@is_file($my_file) == false) {
            return false;
        }
        if (!$this->is_writeable_ACLSafe($my_file)) {
            return false;
        }

        $found = false;
        $lines = file($my_file);
        foreach ((array)$lines as $line) {
            if (preg_match("/$old/", $line)) {
                $found = true;
                break;
            }
        }
        if ($found) {
            $fd = fopen($my_file, 'w');
            foreach ((array)$lines as $line) {
                if (!preg_match("/$old/", $line)) {
                    fputs($fd, $line);
                } elseif ($new <> '') {
                    fputs($fd, "$new //Added by Hide My Wordpress\n\r");
                }
            }
            fclose($fd);
            return true;
        }
        $fd = fopen($my_file, 'w');
        $done = false;
        foreach ((array)$lines as $line) {
            if ($done || !preg_match('/^(if\ \(\ \!\ )?define|\$|\?>/', $line)) {
                fputs($fd, $line);
            } else {
                if ($new <> '') {
                    fputs($fd, "$new //Added by Hide My Wordpress\n\r");
                }
                fputs($fd, $line);
                $done = true;
            }
        }
        fclose($fd);
        return true;
    }

    /**
     * Prepare the replace function
     * @param string $content
     */
    public function prepareFindReplace($content = '') {
        $findencoded = $findencodedfinal = $replaceencoded = $replaceencodedfinal = array();

        $this->_blogurl = str_replace(array('http:', 'https:', '/' . HMWP_Classes_Tools::$default['hmwp_wp-content_url']), '', content_url());

        //make sure the paths are without schema
        $find = array_map(array($this, 'removeSchema'), $this->_replace['from']);
        $replace = array_map(array($this, 'removeSchema'), $this->_replace['to']);


        //check if there is javascript with local paths
        if (strpos($content, str_replace('/', '\/', $this->_blogurl)) !== false) {
            //change the javascript urls
            $findencoded = array_map(array($this, 'removeSchemaEncoded'), $this->_replace['from']);
            $replaceencoded = array_map(array($this, 'removeSchemaEncoded'), $this->_replace['to']);
            //change the javascript urls
            $findencodedfinal = array_map(array($this, 'removeSchemaEncodedFinal'), $this->_replace['from']);
            $replaceencodedfinal = array_map(array($this, 'removeSchemaEncodedFinal'), $this->_replace['to']);
        }


        //merge the urls
        $this->_replace['from'] = array_merge($find, $findencoded, $findencodedfinal);
        $this->_replace['to'] = array_merge($replace, $replaceencoded, $replaceencodedfinal);

    }

    /**
     * Remove the Schema from url
     * @param $url
     * @return string
     */
    public function removeSchema($url) {
        return $this->_blogurl . '/' . $url;
    }

    public function removeSchemaFinal($url) {
        return rtrim($this->_blogurl . '/' . $url, '/');
    }

    /**
     * Remove the Schema from url
     * Return slashed urls for javascript urls
     * @param $url
     * @return string
     */
    public function removeSchemaEncoded($url) {
        return str_replace('/', '\/', $this->_blogurl . '/' . $url);
    }

    public function removeSchemaEncodedFinal($url) {
        return str_replace('/', '\/', rtrim($this->_blogurl . '/' . $url, '/'));
    }

    /**
     * Change content
     * @param string $content
     * @return mixed
     */
    public function find_replace($content) {

        if (HMWP_Classes_Tools::getOption('error')) {
            return $content;
        }

        if (is_string($content)) {
            //if the changes were made already, return
            if (strpos($content, content_url()) === false && $this->_replaced) {
                return $content;
            }

            $this->clearRedirect()
                ->buildRedirect();

            //make sure to include the blog
            $this->prepareFindReplace($content);

            //fix the absolut links before
            if (HMWP_Classes_Tools::getOption('hmwp_fix_relative')) {
                $content = $this->fixRelativeLinks($content);
            }

            $content = str_ireplace($this->_replace['from'], $this->_replace['to'], $content);

            //Remove custom classes
            if (HMWP_Classes_Tools::getOption('hmwp_hide_classes')) {
                $custom_classes = json_decode(HMWP_Classes_Tools::getOption('hmwp_hide_classes'), true);
                if (!empty($custom_classes) && count($custom_classes) > 0) {
                    //merge the urls
                    $content = str_replace($custom_classes, "", $content);
                }
            }


            $content = preg_replace('/<!--(.|s)*?-->/', '', $content);

            if (HMWP_Classes_Tools::getOption('hmwp_hide_version')) {
                $content = preg_replace('/[\?]?ver=[0-9a-zA-Z._-]+/', '', $content);
                $content = preg_replace('/<meta[^>]*name="generator"[^>]+>/i', '', $content);
            }

            if (HMWP_Classes_Tools::getOption('hmwp_hide_styleids')) {
                $content = preg_replace('/(<link[^>]*rel=[^>]+)[\s]id=[\'|"][0-9a-zA-Z._-]+[\'|"][\s]([^>]+>)/i', '$1$2', $content);
            }
        }

        $this->_replaced = true;
        return $content;
    }

    /**
     * Remove wp- from cache URLs
     * @param $content
     * @return mixed
     */
    public function find_replace_wp($content) {
        $content = str_replace('wp-', '', $content);

        //Remove custom classes
        if (HMWP_Classes_Tools::getOption('hmwp_hide_classes')) {
            $custom_classes = json_decode(HMWP_Classes_Tools::getOption('hmwp_hide_classes'), true);
            if (!empty($custom_classes) && count($custom_classes) > 0) {
                //merge the urls
                $content = str_replace($custom_classes, "", $content);
            }
        }

        return $content;
    }

    public function replace_rest_api($url) {
        //Modify rest-api wp-json
        if (HMWP_Classes_Tools::$default['hmwp_wp-json'] <> HMWP_Classes_Tools::getOption('hmwp_wp-json')) {
            $url = HMWP_Classes_Tools::getOption('hmwp_wp-json');
        }

        return $url;
    }

    public function replace_author_url($url) {
        //Modify rest-api wp-json
        if (HMWP_Classes_Tools::$default['hmwp_author_url'] <> HMWP_Classes_Tools::getOption('hmwp_author_url')) {
            return str_replace(HMWP_Classes_Tools::$default['hmwp_author_url'], HMWP_Classes_Tools::getOption('hmwp_author_url'), $url);
        }

        return $url;
    }


    /**
     * Change the image path to absolute when in feed
     *
     * @param string $content
     * @return string
     */
    public function fixRelativeLinks($content) {
        $content = preg_replace_callback(
            '~((href|src)?\s*[=|:]\s*[\"\'])([\\\]*/[^\"\']+)~i',
            array($this, 'replaceLinks'),
            $content);
        $content = preg_replace_callback(
            '~((url\s*\()\s*[\"\']*)([\\\]*/[^\)\"\']+)~i',
            array($this, 'replaceLinks'),
            $content);
        return $content;
    }

    /**
     * If relative links then transform them to absolute
     *
     * @param $found
     * @return string
     */
    public function replaceLinks($found) {
        $url = $found[3];
        if (strpos($found[0], '//') === false && strpos($found[0], '\/\/') === false) {
            if (strpos($url, '\/') === false) {
                $url = esc_url(home_url()) . $url;

            } else {
                $url = str_replace('/', '\/', home_url()) . $url;
            }

            return $found[1] . $url;
        } else {
            return $found[0];
        }

    }

}
