| <?php
if ( class_exists( "pareto_functions" ) ):
    class pareto_settings extends pareto_functions {
        function __construct() {
            if ( false === $this->is_wp() ) {
                header( 'Status: 403 Forbidden' );
                header( 'HTTP/1.1 403 Forbidden' );
                exit();
            }
            $this->time_zone = date_default_timezone_get() . get_option( 'gmt_offset' );
            define( 'PARETO_DIR', plugin_dir_path( __FILE__ ) );
            define( 'PARETO_URL', plugin_dir_url( __FILE__ ) );
            
            load_plugin_textdomain( $this->_textdomain );
            // Register style sheet
            add_action( "admin_enqueue_scripts", array( $this, 'enqueue_scripts' ) );
            $this->kickoff();
        }
        function get_ver( $file ) {
            return filemtime( PARETO_DIR );
        }
        /**
         * Register style sheet.
         */
        function enqueue_scripts( $hook ) {
            if ( $hook != 'toplevel_page_pareto_security_settings' ) {
                    return;
            }
            wp_register_style( 'pareto-security', plugins_url( 'css/pareto_style.css' ) );
            wp_enqueue_style( "{$this->prefix}_style", plugins_url( 'css/pareto_style.css', __FILE__ ), NULL, $this->get_ver( 'css/pareto_style.css' ) );
            wp_enqueue_script( "{$this->prefix}_js", plugins_url( 'js/hokioi.js', __FILE__ ), NULL, $this->get_ver( 'js/hokioi.js' ) );
        }
        function kickoff() {
            $this->settings_field = 'pareto_security_settings_options';
            $this->options = get_option( $this->settings_field );
            if ( empty( $this->options ) ) {
                update_option( $this->settings_field, array( // set defaults
                     'advanced_mode' => 0,
                     'hard_ban_mode' => 0,
                     'email_report' => 0,
                     'ban_mode' => 0,
                     'admin_ip' => '',
                     'tor_block' => 0
                ) );
                $this->options = get_option( $this->settings_field );
            }
            
            $this->options[ 'ban_mode' ]      = ( false !== $this->check_settings( 'ban_mode' ) ) ? ( int ) $this->options[ 'ban_mode' ] : 0;
            $this->options[ 'email_report' ]  = ( false !== $this->check_settings( 'email_report' ) ) ? ( int ) $this->options[ 'email_report' ] : 0;
            $this->options[ 'advanced_mode' ] = ( false !== $this->check_settings( 'advanced_mode' ) ) ? ( int ) $this->options[ 'advanced_mode' ] : 0;
            $this->options[ 'hard_ban_mode' ] = ( false !== $this->check_settings( 'hard_ban_mode' ) ) ? ( int ) $this->options[ 'hard_ban_mode' ] : 0;
            $this->options[ 'tor_block' ]     = ( false !== $this->check_settings( 'tor_block' ) ) ? ( int ) $this->options[ 'tor_block' ] : 0;
            
            $this->_hard_ban_mode = $this->options[ 'hard_ban_mode' ];
            if ( array_key_exists( 'safe_list', $this->options ) ) {
                $this->_domain_list = $this->get_field_value( $this->options, 'safe_list' );
                $this->_domain_list = preg_replace( '/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F]/', '', $this->_domain_list ); // strip out any control characters but not new lines and carriage returns
                $this->_domain_list = preg_replace( "/[^\r\na-zA-Z0-9_\.\-]/i", '', $this->_domain_list ); // allow only alphanumeric and -_.
                $this->options[ 'safe_list' ] = $this->_domain_list;
            }
            
            $this->logs = get_option( PARETO_LOG_LIST );
            # only available to logged in Admins
            if ( false !== ( bool ) $this->is_wp( true, true ) ) {
                $this->define_plugin_settings();
                $this->page_id        = $this->_textdomain;
                $this->lockdown_status = $this->lockdown_mode( $this->logs ); //( bool ) $this->get_field_value( $this->lockdown, 'lockdown_mode' );
                
                if ( $this->cmpstr( $_SERVER[ 'REQUEST_METHOD' ], 'POST' ) ) {
                    # localise POST
                    $this_post = $_POST;
                    if ( isset( $this_post[ 'save_options' ] ) && $this->cmpstr( strtolower( $this_post[ 'save_options' ] ), 'save options' ) ) {
                        if ( isset( $this_post[ $this->settings_field ][ "safe_list" ] ) ) {
                            $this_post[ $this->settings_field ][ "safe_list" ] = $this->host_check( $this_post[ $this->settings_field ][ "safe_list" ] );
                        }
                        if ( isset( $this_post[ $this->settings_field ][ "ban_mode" ] ) )
                            $this_post[ $this->settings_field ][ "ban_mode" ] = ( int ) $this_post[ $this->settings_field ][ "ban_mode" ];
                        if ( isset( $this_post[ $this->settings_field ][ "advanced_mode" ] ) ) {
                            $this_post[ $this->settings_field ][ "advanced_mode" ] = ( int ) $this_post[ $this->settings_field ][ "advanced_mode" ];
                            if ( !isset( $this_post[ $this->settings_field ][ "safe_list" ] ) || empty( $this_post[ $this->settings_field ][ "safe_list" ] ) ) $this_post[ $this->settings_field ][ "safe_list" ] = $this->get_http_host();
                        } else $this_post[ $this->settings_field ][ "advanced_mode" ] = 0;
                        if ( isset( $this_post[ $this->settings_field ][ "email_report" ] ) )
                            $this_post[ $this->settings_field ][ "email_report" ] = ( int ) $this_post[ $this->settings_field ][ "email_report" ];
                        if ( isset( $this_post[ $this->settings_field ][ "hard_ban_mode" ] ) ) {
                            $this_post[ $this->settings_field ][ "hard_ban_mode" ] = ( int ) $this_post[ $this->settings_field ][ "hard_ban_mode" ];
                        } 
                        if ( isset( $this_post[ $this->settings_field ][ "tor_block" ] ) ) {
                            $this_post[ $this->settings_field ][ "tor_block" ] = ( int ) $this_post[ $this->settings_field ][ "tor_block" ];
                        } else $this_post[ $this->settings_field ][ "tor_block" ] = 0;
                    }
                    if ( isset( $this_post[ 'save_options' ] ) && $this->cmpstr( strtolower( $this_post[ 'save_options' ] ), 'x' ) ) {
                        # Do logs
                        $ulid = array();
                        foreach( $this_post as $key => $val ) {
                            if ( false !== strpos( $key, 'ulid' ) && false === strpos( $key, 'ulid_check_' ) ) $ulid[] = ( strlen( $key ) <= 8 && $this->cmpstr( 'ulid_', substr( $key, 0, 5 ) ) ) ? trim( substr( $key, 0, 8 ) ) : '';
                        }
                        $ulid_shorthash = array();
                        foreach ( $ulid as $key => $val ) {
                            if ( !empty( $val ) ) {
                                $this_val = 'ulid_check_' . substr( $this_post[ $val ], 0, 6 );
                                if ( isset( $this_post[ $this_val ] ) && $this->cmpstr( 'on', $this_post[ $this_val ] ) ) {
                                    $shahash = preg_replace( "/[^a-f0-9]/i", '', $this_post[ $val ] );
                                    $shahashlen = strlen( $shahash );
                                    $ulid_shorthash[ $this_val ] = ( $this->cmpstr( 40, $shahashlen ) ) ? $shahash : '';
                                }
                            }
                        }
                        $this->log_pop( $ulid_shorthash );
                    }
                    $_POST = $this_post;
                } else {
                    # clean up failed login hashes
                    $this->iphash_db_cleanup();
                }
                add_action( 'admin_init', array(
                     $this,
                    'admin_init' 
                ), 20 );
                add_action( 'admin_menu', array(
                     $this,
                    'admin_menu' 
                ), 20 );
                $this->ip_count = $this->count_banned_ips();
            }
            $this->_adv_mode      = $this->get_field_value( $this->options, 'advanced_mode' );
            $this->_ban_mode      = $this->get_field_value( $this->options, 'ban_mode' );
            $this->_email_report  = $this->get_field_value( $this->options, 'email_report' );
            $this->_tor_block     = $this->get_field_value( $this->options, 'tor_block' );
            $this->update_logfile( $this->logs ); // set $this->logs
            # deal with dynamic IP addresses
            $this->update_admin_ip( $this->options[ 'admin_ip' ] );
        }
        function define_plugin_settings() {
            $basename = plugin_basename( __FILE__ );
            $prefix = is_network_admin() ? 'network_admin_' : '';
            add_filter( 'plugin_action_links', array( $this, 'add_plugin_action_links'), 10, 2);
            add_action( 'admin_menu', array( $this, 'add_to_admin_menu' ) );
            $this->options[ 'admin_ip' ] = $this->get_ip();
        }
        function add_plugin_action_links( $links, $file ) {
            if ( strstr( $file, 'pareto-security/pareto_security.php' ) ) {
                $settings[ 'settings' ] = '<a href="'. esc_url( admin_url( "options-general.php?page=" . $this->_textdomain ) ) . '">Settings</a>';
                array_unshift( $links, $settings[ 'settings' ] );
            }
            return $links;
        }
        function add_to_admin_menu(){
        
          $page_title = 'Pareto Security';
          $menu_title = 'Pareto Security';
          $capability = 'manage_options';
          $menu_slug  = $this->_textdomain;
          $function   = '';
          $icon_url   = plugins_url( 'pareto-security/img/icon16bw.png' );
          $position   = ( is_network_admin() ) ? 26 : 81;
        
          add_menu_page( $page_title,
                         $menu_title, 
                         $capability, 
                         $menu_slug, 
                         $function, 
                         $icon_url, 
                         $position );
        }
        function log_pop( $ulid ) {
            $get_logs = $this->logs;
            foreach ( $ulid as $ukey => $hash ) {
                foreach( $get_logs as $key => $val ) {
                    $this_log = explode( ' ', $val );
                    if ( isset( $this_log[ 6 ] ) && $this->cmpstr( sha1( $this_log[ 6 ] ), $hash ) ) {
                        $ip = $this_log[ 2 ];
                        if ( false !== $this->check_ip( $ip, true ) ) {
                            $this->htaccess_unbanip( false, $ip );
                            unset( $get_logs[ $key ] );
                            break 1;
                        }
                    }
                }
            }
            $final_logfile = array();
            foreach( $get_logs as $key => $val ) {
                $final_logfile[] = $val;
            }
            $this->logs = $final_logfile;
            update_option( PARETO_LOG_LIST, $final_logfile );
        } 
        function count_banned_ips() {
            if ( false === $this->htapath() ) return 0;
            $mybans     = file( $this->htapath() );
            if ( empty( $mybans ) ) return 0;
            $mybans_denyfrom = array();
            $mybans_denyfrom = $this->find_in_array( "deny from ", $mybans );
            return count( $mybans_denyfrom );         
        }
        function find_in_array( $string, $array = array(), $makebool = false ) {       
            foreach ( $array as $key => $value ) {
                unset ( $array[ $key ] );
                if ( false === strpos( $value, $string . 'all' ) && false !== strpos( $value, $string ) ) {
                    $array[ $key ] = $value;
                }
            }       
            if ( false !== $makebool ) return !empty( $array ); // return Boolean
            if ( false === $makebool ) return $array; // return instances of string
        }
        
        function update_logfile( $logfile = array() ) {
            $tmp_logfile = array();
            if ( empty( $this->logs ) ) {
                update_option( PARETO_LOG_LIST, array(
                     0 => SETTINGS_INSTALL_LOG ) );
                    $logfile = SETTINGS_INSTALL_LOG;
                    $this->logs = array();
                    $this->logs[ 0 ] = SETTINGS_INSTALL_LOG;
                    return;
            }
            $final_log = strtolower( substr( $this->logs[ count( $this->logs ) - 1 ], 0, 50 ) );
            # make sure install log remains
            if ( count( $this->logs ) < 100 && false === strpos( $final_log, 'safe' ) ) {
                array_push( $this->logs, SETTINGS_INSTALL_LOG );
            }
            return;
        }
        function check_settings( $val ) {
            if ( !isset( $this->options[ $val ] ) || $this->options[ $val ] > 1 || $this->options[ $val ] < 0 ) {
                return false;
            } else
                return true;
        }
        function admin_init() {
            register_setting( $this->settings_field, $this->settings_field );
            register_setting( PARETO_LOG_LIST, PARETO_LOG_LIST );
            add_option( $this->settings_field, pareto_settings::$default_settings );
        }
        function admin_menu() {
            if ( !current_user_can( 'update_plugins' ) )
                return;
            // Add a new submenu to the standard Settings panel
            $this->pagehook = $page = add_options_page( __( 'Pareto Security Settings', $this->_textdomain ), __( 'Pareto Security Dashboard', $this->_textdomain ), 'administrator', $this->page_id, array( $this,'render' ) );
            add_action( 'load-' . $this->pagehook, array(
                 $this,
                'metaboxes' 
            ) );
            add_action( "admin_print_scripts-$page", array(
                 $this,
                'js_includes' 
            ) );
            add_action( "admin_head-$page", array(
                 $this,
                'admin_head' 
            ) );
        }
        function admin_head() {
?>
       <style>
        .settings_page_pareto_security_settings label { display:inline-block; width: 400px; }
        code{
            direction: ltr;
            text-align: left;
        }
        code {font-size:1.0em;
              margin: 0px; 
              padding:3px;
              background-color:transparent;
              color: #3E3E3E}        
        </style>
<?php
        }
        function js_includes() {
            // Needed to allow metabox layout and close functionality.
            wp_enqueue_script( 'postbox' );
        }
        /*
        Sanitize our plugin settings array as needed.
        */
        function sanitize_theme_options( $options ) {
            
            if ( is_array( $options ) ) {
                foreach ( $options as $key => $val ) {
                    if ( $key != 'safe_list' && false === $this->integ_prop( $val ) || $val > 1 ) {
                        $options[ $key ] = 0;
                    } elseif ( $this->cmpstr( $val, 'safe_list' ) ) {
                        $options[ 'safe_list' ] = $this->cleanRequestInput( $val );
                    } else {
                        $options[ $key ] = ( int ) $val;
                    }
                }
                return $options;
            }
        }
 
         /*
        Settings access functions.
        
        */
        protected function get_field_name( $name ) {
            return sprintf( '%s[%s]', $this->settings_field, $name );
        }
        protected function get_field_id( $id ) {
            return sprintf( '%s[%s]', $this->settings_field, $id );
        }
        protected function get_field_value( $option, $key ) {
            return $option[ $key ];
        }
        function cleanRequestInput( $input ) {
            if ( function_exists( 'filter_var' ) && defined( 'FILTER_SANITIZE_STRING' ) ) {
                if ( false !== ( bool ) filter_var( $input, FILTER_SANITIZE_STRING ) ) {
                    return $input;
                } else
                    return false;
            }
        }
        /*
        Render settings page.
        
        */
        function render() {
            global $wp_meta_boxes;
            $title = esc_html( 'Pareto Security Dashboard', $this->_textdomain ); ?>
        <div class="wrap">
            <table style="text-align: left;">
                <tr>
                    <td><img src="<?php echo plugins_url( 'pareto-security/img/icon.png' ); ?>">
                    </td>
                    <td><h1><?php echo esc_html( $title ); ?></h1></td>
                </tr>
            </table>
            <form name="LogFile" method="post" action="options.php">
                <div class="metabox-holder">
                    <div class="postbox-container" style="width: 99%;">
 <?php
            // Render metaboxes
            settings_fields( $this->settings_field );
            do_meta_boxes( $this->pagehook, 'main', null );
            if ( isset( $wp_meta_boxes[ $this->pagehook ][ 'column2' ] ) ) do_meta_boxes( $this->pagehook, 'column2', null );
?>
                   </div>
                </div>
            </form>
        </div>
        <!-- Needed to allow metabox layout and close functionality. -->
        <script type="text/javascript">
            //<![CDATA[
            jQuery(document).ready( function ($) {
                // close postboxes that should be closed
                $('.if-js-closed').removeClass('if-js-closed').addClass('closed');
                // postboxes setup
                postboxes.add_postbox_toggles('<?php
            echo $this->pagehook;
?>');
            });
            //]]>
        </script>
<?php
        }
        function metaboxes() {
            add_meta_box( 'pareto-security-settings-version', esc_html( 'Information', $this->_textdomain ), array(
                 $this,
                'info_box' 
            ), $this->pagehook, 'main', 'high' );
            add_meta_box( 'pareto-security-settings-notes', esc_html( 'Notes:', $this->_textdomain ), array(
                 $this,
                'notes_box' 
            ), $this->pagehook, 'main' );
            add_meta_box( 'pareto-security-settings-conditions', esc_html( 'Custom Settings', $this->_textdomain ), array(
                 $this,
                'condition_box' 
            ), $this->pagehook, 'main' );
            if ( false !== ( bool ) $this->_adv_mode )
                add_meta_box( 'pareto-security-settings-domainlist', esc_html( 'Domain Name Safe List:', $this->_textdomain ), array(
                     $this,
                    'safelist_box' 
                ), $this->pagehook, 'main' );
            add_meta_box( 'pareto-security-settings-save', esc_html( 'Save All Settings', $this->_textdomain ), array(
                 $this,
                'save_settings' 
            ), $this->pagehook, 'main' );
            add_meta_box( 'pareto-security-settings-donations', esc_html( 'Donations', $this->_textdomain ), array(
                 $this,
                'donations_box' 
            ), $this->pagehook, 'main' );
            add_meta_box( 'pareto-security-settings-logs', esc_html( 'Last 100 Incidents', $this->_textdomain ), array(
                 $this,
                'logfile_box' 
            ), $this->pagehook, 'main' );
        }
        
        function safelist_box() {
            if ( false === $this->_adv_mode ) return;
            $is_https  = ( ( array_key_exists( 'HTTPS', $_SERVER ) && $this->cmpstr( "on", @$_SERVER[ "HTTPS" ] ) ) ||
                           ( false !== getenv( 'HTTPS' ) && array_key_exists( 'HTTPS', getenv() ) && $this->cmpstr( "on", getenv( "HTTPS" ) ) ) ) ? true : false;
            $http      = ( false !== $is_https ) ? 'https://' : 'http://';
            $url       = str_replace( 'www.', '', $this->get_http_host() );
            $hsts_url  = 'https://hstspreload.org/?domain=' . $url;
            $hsts_link = '<a target="_blank" href="' . $hsts_url . '">' . $hsts_url . '</a>';
?>
           <table style="text-align: left;">
                <tr>
                    <td><b>Status:</b> ( <?php echo ( ( false === ( bool ) $this->_adv_mode ) ? esc_html( 'To enable, set to Advanced Mode above', $this->_textdomain ) : esc_html( 'Enabled', $this->_textdomain ) ); ?> )
                    <ol>
                        <li><?php echo esc_html( 'List every domain name associated with your website here (including subdomains).', $this->_textdomain ); ?></li>
                        <li><?php echo _e( 'One domain name per line: (i.e ' . $this->get_http_host() . ' - without <code>' . $http . '</code> scheme/protocol and double forward slashes)', $this->_textdomain ) ?></li>
                           <textarea <?php echo ( false === ( bool ) $this->_adv_mode ) ? esc_html( 'disabled', $this->_textdomain ) : ''; ?> name="<?php echo $this->get_field_name( 'safe_list', $this->_textdomain ); ?>" id="<?php echo $this->get_field_name( 'safe_list' ); ?>" rows="3" cols="30"><?php echo $this->options[ 'safe_list' ]; ?></textarea>
                        <?php if ( false !== $is_https ) ?><li><?php echo _e( 'Register your domain with Google Chromes preload list ' . $hsts_link, $this->_textdomain ); ?></li>
                   </ol></td>
                </tr>
            </table>
<?php } function save_settings() { ?>
           <table style="text-align: left;">
                <tr>
                    <td><input type="submit" class="button button-primary" name="save_options" value="<?php esc_attr_e( 'Save Options', $this->_textdomain ); ?>" /></td>
                </tr>
            </table>
<?php
        }
        function info_box() {
?>
           <table style="text-align: left;">
                <tr>
                    <td><strong><?php echo esc_html( 'Version:', $this->_textdomain ); ?></strong> <?php echo self::PARETO_VERSION; ?> <?php echo '·'; ?> <strong><?php esc_html( 'Released:', $this->_textdomain ); ?></strong><?php echo PARETO_RELEASE_DATE; ?> ( <?php echo $this->time_zone; ?> )</td>
                    <td><strong><?php echo esc_html( 'Author:', $this->_textdomain ); ?></strong> <a target="_blank" href="https://twitter.com/te_taipo">@te_taipo</a></td>
                    <td><strong><?php echo esc_html( 'Web:', $this->_textdomain ); ?></strong> <a target="_blank" href="https://hokioisecurity.com">https://hokioisecurity.com</a></td>
                    <td><strong><?php echo esc_html( 'Email:', $this->_textdomain ); ?></strong> [email protected] </td>
                </tr>
                <tr>
                    <td colspan=3><strong><?php echo esc_html( 'Rate This Plugin:', $this->_textdomain ); ?></strong> <a href="https://wordpress.org/support/plugin/pareto-security/reviews/" target="_blank"><?php echo esc_html( 'Rate this plugin 5 stars on WordPress.org', $this->_textdomain ); ?></a>
                    </td>
                </tr>
            </table>
<?php
        }
        
        function donations_box() {
?>
        <p><strong>Go to</strong> <a href="https://hokioisecurity.com/donations/" target="_blank">https://hokioisecurity.com/donations/</a></p>
<?php
        }
        function condition_box() {
?>
<div class="divTopTable">
	<div class="divTableBody">
		<div class="divTopTableRow">
			<div class="divTopTableCell">
				<div class="divMainTable">
					<div class="divMainTableBody">
						<div class="divTableRow">
							<div class="divHeaders"><strong> <strong><?php echo esc_html( 'Standard Mode:', $this->_textdomain ); ?></strong></strong></div>
							<div class="divHeaders"><strong> <strong><?php echo esc_html( 'Advanced Mode:', $this->_textdomain ); ?></strong></strong></div>
						</div>
						<div class="divTableRow">
							<div class="divTableCell">
								<dl>
									<dt>  - <strong><?php echo _e( 'Standard Mode</strong> is the <strong>Recommended Setting!!!</strong>', $this->_textdomain ); ?></dt>
									<dt>  - <?php echo esc_html( 'Hard ban attempts to attack the webserver', $this->_textdomain ); ?></dt>
									<dt>  - <?php echo esc_html( 'Hard ban attempts to inject malicious code into the database', $this->_textdomain ); ?></dt>
									<dt>  - <?php echo esc_html( 'Hard ban injection attempts via browser user-agents', $this->_textdomain ); ?></dt>
                                    <dt>  - <?php echo esc_html( 'Lockdown Mode: Auto Detect Denial of Service Attack', $this->_textdomain ); ?></dt>
                                    <dt>  - <?php echo esc_html( 'Advanced POST Filtering', $this->_textdomain ); ?></dt>
                                    <dt>  - <?php echo esc_html( 'Filter login attempts :: detect and ban User/Password Cracking Attack', $this->_textdomain ); ?></dt>
                                    <dt>  - <?php echo esc_html( 'XML-RPC Flood Protection - detect and ban User/Password Cracking Attack', $this->_textdomain ); ?></dt>                                  
								</dl>
							</div>
							<div class="divTableCell">
								<div class="divTable">
									<div class="divTableBody">
										<div class="divTableRow">
											<div class="divAdvancedMode"><input type="hidden" name="<?php echo $this->get_field_name( 'ban_mode' ); ?>" id="<?php echo $this->get_field_id( 'ban_mode' ); ?>" value="1" />
                                            <label class="container"><input type="checkbox" name="<?php echo $this->get_field_name( 'advanced_mode' ); ?>" id="<?php echo $this->get_field_id( 'advanced_mode' ); ?>" value="1" <?php
                                              if ( ( isset( $this->options[ 'advanced_mode' ] ) &&
                                                      false !== ( bool ) $this->options[ 'advanced_mode' ] ) ||
                                                      false !== ( bool ) $this->_adv_mode ) { ?>checked<?php } ?> />
                                            <span class="checkmark"></span></label>
                                            </div>
											<div class="divAdvancedMode"><label for="<?php echo $this->get_field_id( 'advanced_mode' ); ?>"><?php _e( '<b>Set Advanced Mode</b>', $this->_textdomain ); ?></label></div>
										</div>
										<div class="divTableRow">
											<div class="divAdvancedMode"> </div>
											<div class="divAdvancedMode"><?php echo esc_html( '- Advanced filtering of the server host variable', $this->_textdomain ); ?>
                                                
                                                <br><?php echo esc_html( '- Domain Name Safe List', $this->_textdomain ); ?>
                                            </div>
										</div>
                                        <?php /* ?>
                                        <div class="divTableRow">
											<div class="divAdvancedMode">
                                                <label class="container"><input type="checkbox" name="<?php echo $this->get_field_name( 'tor_block' ); ?>" id="<?php echo $this->get_field_id( 'tor_block' ); ?>" value="1"
                                              <?php
                                              if ( isset( $this->options[ 'tor_block' ] ) &&
                                                   isset( $this->options[ 'advanced_mode' ] ) && $this->_tor_block == 1 ) { ?>checked<?php } ?> />
                                            <span class="checkmark"></span></label></div>
											<div class="divAdvancedMode"><label for="<?php echo $this->get_field_id( 'tor_block' ); ?>"><?php _e( '<strong>Block Tor Access</strong> WARNING: If you use Tor to access your admin, DO NOT ENABLE THIS!', $this->_textdomain ); ?></label></div>
										</div>
										
										<div class="divTableRow">
											<div class="divAdvancedMode"> </div>
                                            <div class="divAdvancedMode">
                                                <?php echo esc_html( 'Prevent Tor users from:', $this->_textdomain ); ?>
                                            <br><?php echo esc_html( '- making log-in attempts, accessing XMLRPC', $this->_textdomain ); ?>
                                            <br><?php echo esc_html( '- making comments or using contact forms, search functions', $this->_textdomain ); ?></div>
										</div>
										<?php */ ?>
										<div class="divTableRow">
											<div class="divAdvancedMode">
                                                <label class="container"><input type="checkbox" name="<?php echo $this->get_field_name( 'hard_ban_mode' ); ?>" id="<?php echo $this->get_field_id( 'hard_ban_mode' ); ?>" value="1"
                                              <?php if ( isset( $this->options[ 'hard_ban_mode' ] ) &&
                                                         false !== ( bool ) $this->_hard_ban_mode ) { ?>checked<?php } ?> />
                                            <span class="checkmark"></span></label></div>
											<div class="divAdvancedMode"><label for="<?php echo $this->get_field_id( 'hard_ban_mode' ); ?>"><?php _e( '<strong>Hard Ban Mode</strong>', $this->_textdomain ); ?></label></div>
										</div>
										<div class="divTableRow">
											<div class="divAdvancedMode"> </div>
                                            <div class="divAdvancedMode">- Ban irregular user-agent/crawlers</div>
										</div>
									</div>
								</div>
							</div>
						</div>
					</div>
				</div>
			</div>
		</div>
	</div>
</div>
<br>
<label for="<?php echo $this->get_field_id( 'email_report' ); ?>" class="container"><?php echo _e( '<b>Email Notification:</b> Receive periodic notifications (every 5 events) of high/medium severity attacks', $this->_textdomain ); ?>
<input type="checkbox" name="<?php echo $this->get_field_name( 'email_report' ); ?>" id="<?php echo $this->get_field_id( 'email_report' ); ?>" value="1" <?php if ( ( isset( $this->options[ 'email_report' ] ) && false !== ( bool ) $this->options[ 'email_report' ] ) ) { ?>checked<?php } ?> /><span class="checkmark"></span></label>
<?php
        }
        function notes_box() {
            $mode     = esc_html( 'Standard Mode', $this->_textdomain );
            $mode     = ( false === ( bool ) $this->_adv_mode ) ? esc_html( 'Standard Mode', $this->_textdomain ) : esc_html( 'Advanced Mode', $this->_textdomain );
            $mode     = ( false !== ( bool ) $this->_tor_block ) ? esc_html( 'Advanced Mode, Tor Block Mode', $this->_textdomain ) : esc_html( $mode, $this->_textdomain );
            $mode     = ( false !== ( bool ) $this->_hard_ban_mode ) ? $mode . ', ' . esc_html( 'Hard Ban Mode', $this->_textdomain ) : esc_html( $mode, $this->_textdomain );
            $mode     = ( false !== $this->lockdown_status ) ? esc_html( 'Lockdown', $this->_textdomain ) : $mode;
            $ban_type = ( false !== ( bool ) $this->_adv_mode && false !== ( bool ) $this->_hard_ban_mode ) ? esc_html( 'Low, Medium and High severity requests added to banned IP list', $this->_textdomain ) : esc_html( 'Medium and High severity requests added to banned IP list', $this->_textdomain );
            $is_nginx = ( false === strpos( strtolower( $_SERVER[ "SERVER_SOFTWARE" ] ), "nginx" ) ) ? false : true;
            ?>
    <ul>
        <li><?php echo esc_html( '+ Status:', $this->_textdomain ); ?> <i><?php echo $mode; ?></i></li>
        <li><?php echo esc_html( '+ Server:', $this->_textdomain ); ?> <?php echo ( strlen( $_SERVER[ "SERVER_SOFTWARE" ] ) > 14 ) ? trim( substr( $_SERVER[ "SERVER_SOFTWARE" ], 0, 14 ) ) . "..." : $_SERVER[ "SERVER_SOFTWARE" ]; ?></li>
        <?php
            if ( false !== $this->htapath() && false === $this->is_iis() ) {
        ?>
        <?php if ( false === $is_nginx ) { ?><li><?php echo _e( '+ Your <code>.htaccess</code> is configured correctly in <code>' . $this->get_dir() . '</code>', $this->_textdomain ); ?></li>
        <li><?php echo _e( '+ There ' . ( ( $this->cmpstr( $this->ip_count, 1 ) ) ? 'is' : 'are' ) . ' currently [ ' . ( empty( $this->ip_count ) ? 0 : $this->ip_count ) . ' ] unique IP addresses banned by Pareto Security', $this->_textdomain ); ?></li>
        <li>+ <?php echo ( $this->_adv_mode ) ? esc_html( 'Hard Ban', $this->_textdomain ) : esc_html( 'Soft Ban', $this->_textdomain ); ?>: <?php echo $ban_type; ?></li>
        <?php } else { ?>
        <?php if ( false === $is_nginx ) { ?><li><?php echo _e( '- Your <code>.htaccess</code> file cannot be written to in <code>' . $this->get_dir() . '</code> Pareto Security will still soft ban attack vectors.', $this->_textdomain ); ?></li><?php } ?>
        <?php if ( false !== $is_nginx ) { ?><li><?php echo _e( '+ NGINX does not use .htaccess to ban IP addresses. Pareto Security will still block all attack vectors.', $this->_textdomain ); ?></li><?php } ?>
        <?php if ( false === $is_nginx ) { ?><li><?php echo esc_html( '- Hard Ban:', $this->_textdomain ); ?> <?php echo $ban_type; ?></li><?php } ?>
        <?php } ?>
        <?php } ?>
        <li><?php echo ( ( version_compare( phpversion(), '7.0', '>=' ) ) ? _e( '+ ', $this->_textdomain ) : _e( '- ', $this->_textdomain ) ) . _e( 'Your server is running PHP version ' . substr( phpversion(), 0, 3 ), $this->_textdomain ); ?>
        <?php echo ( version_compare( phpversion(), '7.0', '>=' ) ) ? _e( ' ✓✓✓ ', $this->_textdomain ) : _e( ' <b>WARNING:</b> This version is insecure. Contact your webhost to upgrade to at least PHP 7.0', $this->_textdomain ); ?></li>
    </ul>
       <?php }
       function logfile_box() { ?>
       <table style="width: 100%; text-align: left; background-color: #C9C9C9;">
            <tr>
                <td>
                <table class="hoverTable" style="width: 100%; text-align: left;">
                    <tbody>
                      <tr style="background-color:#5F607B">
                        <td style="padding:0px 3px 3px 3px;width:100px;color:#FFFFFF"><b><?php echo esc_html( 'Date-Time:', $this->_textdomain ); ?></b></font></td>
                        <td style="padding:0px 3px 3px 3px;width:70px;color:#FFFFFF"><b><?php echo esc_html( 'Severity:', $this->_textdomain ); ?></b></font></td>
                        <td style="padding:0px 3px 3px 3px;width:120px;color:#FFFFFF"><b><?php echo esc_html( 'Source IP Address:', $this->_textdomain ); ?></b></font></td>
                        <td style="padding:0px 3px 3px 3px;width:50px;color:#FFFFFF"><b><?php echo esc_html( 'Req:', $this->_textdomain ); ?></b></font></td>
                        <td style="padding:0px 3px 3px 3px;width:100px;color:#FFFFFF"><b><?php echo esc_html( 'Filename:', $this->_textdomain ); ?></b></font></td>
                        <td style="padding:0px 3px 3px 3px;color:#FFFFFF"><b><?php echo esc_html( 'Vector:', $this->_textdomain ); ?></b></font></td>
                        <td style="padding:0px 3px 3px 3px;color:#FFFFFF;width:30px;"><input name="multiselect" type="checkbox"  onclick="javascript:checkAll('LogFile', true);" /></td>
                         
                      </tr>
<?php
        $mylogs     = array();
        $mylogs_fin = array();
        $mylogs     = $this->logs;
        $i          = 0;
        $text_color = "#e68735";       
        while ( $i <= 99 ) {
            if ( isset( $mylogs[ $i ] ) ) {
                $row_colour = ''; // = ( $i % 2 == 0 ) ? "#F3F3F3" : "#FFFFFF";
                $req_var    = explode( " ", $mylogs[ $i ] );
                if ( $this->cmpstr( strtolower( $req_var[ 1 ] ), "low" ) ) {
                    $text_color = "#517ecf";
                } elseif ( $this->cmpstr( $req_var[ 1 ], "Medium" ) ) {
                    $text_color = "#e68735";
                } elseif ( empty( $req_var[ 1 ] ) ) {
                    $req_var[ 1 ] = "Medium";
                    $text_color   = "#e68735";
                } else
                    $text_color = "#c72b2c";
                $mylogs_fin[ $i ] = $mylogs[ $i ];
                $ip_addr = ( false !== $this->check_ip( $req_var[ 2 ], true ) ) ? $req_var[ 2 ] : '';
                if ( false === $this->is_server( $req_var[ 2 ] ) ) {
                    $ip_addr = ( false !== ( bool ) $this->check_ip( $req_var[ 2 ], true ) ) ? ' <a target="_blank" href="https://mxtoolbox.com/SuperTool.aspx?action=blacklist%3a' . $req_var[ 2 ] . '&run=networktools">[Blacklist]</a><a target="_blank" href="https://www.whois.com/whois/' . $req_var[ 2 ] . '">' . $req_var[ 2 ] . '</a>' : 'Invalid IP';
                }
                if ( $this->cmpstr( $req_var[ 1 ], "Safe" ) ) {
                    $req_var[ 0 ] = str_replace( '%20', ' ', $req_var[ 0 ] );
                    $text_color   = "#517ecf";
                }
                $this_timestamp = ( false !== is_numeric( $req_var[ 0 ] ) ) ? $this->set_timestamp( $req_var[ 0 ] ): $req_var[ 0 ];
                $uuid = ( isset( $req_var[ 6 ] ) ) ? sha1( preg_replace( "/[\n]/i", "", $req_var[ 6 ] ) ) : '';
                $ulid = ( !empty( $uuid ) ) ? "<input type=\"hidden\" name=\"ulid_" . $i . "\" value=\"" . $uuid . "\" />
                         <input title=\"Select Entry to Delete\" id=\"row" . $i . "\" class =\"checkbox\" type=\"checkbox\" name=\"ulid_check_" . substr( $uuid, 0, 6 ) . "\"/>
                         <input title=\"Delete Entries\" type=\"submit\" class=\"del-button\" name=\"save_options\" value=\"" . esc_html( 'x', $this->_textdomain ) . "\" />" : 'N/A';
                if ( $req_var[ 1 ] != "Safe" ) {
                    $this_timestamp = ( false !== strpos( $this_timestamp, 'AM' ) || false !== strpos( $this_timestamp, 'PM' ) ) ?
                                      ( false !== strpos( $this_timestamp, 'AM' ) ? substr( $this_timestamp, 0, strpos( $this_timestamp, 'AM' ) ) . ' AM' : substr( $this_timestamp, 0, strpos( $this_timestamp, 'PM' ) ) . ' PM' ) : $this_timestamp ;
                }
                $attack_string = str_replace( '%20', " ", preg_replace( "/[\n]/i", "", stripslashes( $req_var[ 5 ] ) ) );
                $attack_string = ( strlen( $attack_string ) > $this->_trim_log_entry ) ? substr( $attack_string, 0, ( $this->_trim_log_entry - 1 ) ) . "..." : $attack_string;
                $t = strtolower( $this->url_decoder( $attack_string ) );
                preg_match_all( "/exec|svg|javascript|script|alert|prompt|onload|onerror|fromcharcode|img src|iframe|vbscript|msgbox/i", $t, $matches );
                if ( !empty( $matches ) && ( count( $matches ) > 0 || count( $matches[ 0 ] ) > 0 ) ) {
                    $matches = array_unique( $matches[ 0 ] );
                    foreach( $matches as $match ) {
                        $t = str_replace( $match, preg_replace( '/^.{2}/', "$0 ", $match ), $t );
                    }
                    $attack_string = $t;
                }
                        echo "<tr style=\"font-size:11px;font-family:Verdana,Tahoma,Arial,sans-serif;color:#3E3E3E;background-color:" . $row_colour . "\">" . "
                        <td title=\"Click Row to Select Log Entry\" onclick=\"checkRow(this, 'row" . $i . "');\" style=\"padding:3px 3px 3px 3px;vertical-align:top;width:100px; white-space: nowrap\">" . $this_timestamp . "</td>" . "
                        <td title=\"Click Row to Select Log Entry\" onclick=\"checkRow(this, 'row" . $i . "');\" style=\"padding:3px 3px 3px 3px; vertical-align:top;text-align:center; width:70px; white-space: nowrap; font-weight: bold; color:" . $text_color . "\">" . $req_var[ 1 ] . "</td>" . "
                        <td title=\"Click Row to Select Log Entry\" onclick=\"checkRow(this, 'row" . $i . "');\" style=\"padding:3px 3px 3px 3px; vertical-align:top; width:120px; white-space: nowrap\">" . $ip_addr . "</td>" . "
                        <td title=\"Click Row to Select Log Entry\" onclick=\"checkRow(this, 'row" . $i . "');\" style=\"padding:3px 3px 3px 3px; vertical-align:top; text-align:center; width:50px; white-space: nowrap\">" . $req_var[ 3 ] . "</td>" . "
                        <td title=\"Click Row to Select Log Entry\" onclick=\"checkRow(this, 'row" . $i . "');\" style=\"padding:3px 3px 3px 3px; vertical-align:top; width:100px; white-space: nowrap\">" . $req_var[ 4 ] . "</td>" . "
                        <td title=\"Click Row to Select Log Entry\" onclick=\"checkRow(this, 'row" . $i . "');\" style=\"padding:3px 3px 3px 3px; vertical-align:top;\">" . $attack_string . "</td>" . "
                        <td style=\"padding:3px 3px 3px 3px; vertical-align:top;width:30px;white-space: nowrap\">" . $ulid . "</td></tr>";
            } else
                break;
            $i++;
        }
?>
               </table>
                </td>
            </tr>
        </table>
<?php
        }
        function do_settings_box() {
            if ( ( false !== ( bool ) defined( 'WP_ADMIN' ) && false !== WP_ADMIN ) && ( false !== ( bool ) is_admin() ) ) {
                do_settings_sections( $this->_textdomain );
            }
        }        
    } // end class
else:
    // pareto_settings.php called directly
    require_once( 'pareto_functions.php' );
    $ParetoSecurity = new pareto_functions();
    $ParetoSecurity->send403();
endif;
 |