HEX
Server: Apache/2.4.63 (Unix)
System: Linux TOMS-220NAS 4.4.302+ #86009 SMP Wed Nov 26 18:19:17 CST 2025 x86_64
User: flavio87 (1026)
PHP: 8.3.27
Disabled: NONE
Upload Files
File: /volume1/web/qrcodesforeveryone/wp-content/plugins/login-lockdown/loginlockdown.php
<?php
/*
  Plugin Name: Login Lockdown PRO
  Plugin URI: https://wploginlockdown.com/
  Description: Protect login form by banning IP after multiple failed login attempts.
  Version: 5.63
  Author: WebFactory Ltd
  Author URI: https://www.webfactoryltd.com/
  License: GNU General Public License v3.0
  Text Domain: login-lockdown
  Requires at least: 6.0
  Tested up to: 6.9
  Requires PHP: 7.4

  Copyright 2022 - 2026  WebFactory Ltd  (email: support@webfactoryltd.com)
  Copyright 2007 - 2022  M. VanDeMar

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License, version 2, as
  published by the Free Software Foundation.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/


// include only file
if (!defined('ABSPATH')) {
    wp_die(__('Do not open this file directly.', 'login-lockdown'));
}

define('LOGINLOCKDOWN_PLUGIN_FILE', __FILE__);
define('LOGINLOCKDOWN_PLUGIN_DIR', plugin_dir_path(__FILE__));
define('LOGINLOCKDOWN_PLUGIN_URL', plugin_dir_url(__FILE__));
define('LOGINLOCKDOWN_OPTIONS_KEY', 'loginlockdown_options');
define('LOGINLOCKDOWN_META_KEY', 'loginlockdown_meta');
define('LOGINLOCKDOWN_POINTERS_KEY', 'loginlockdown_pointers');
define('LOGINLOCKDOWN_NOTICES_KEY', 'loginlockdown_notices');

if ( ! class_exists( 'WFMaxMind\\Db\\Reader', false ) ) {
    require_once LOGINLOCKDOWN_PLUGIN_DIR . 'libs/geoip/Reader/Decoder.php';
    require_once LOGINLOCKDOWN_PLUGIN_DIR . 'libs/geoip/Reader/InvalidDatabaseException.php';
    require_once LOGINLOCKDOWN_PLUGIN_DIR . 'libs/geoip/Reader/Metadata.php';
    require_once LOGINLOCKDOWN_PLUGIN_DIR . 'libs/geoip/Reader/Util.php';
    require_once LOGINLOCKDOWN_PLUGIN_DIR . 'libs/geoip/Reader.php';
}

require_once LOGINLOCKDOWN_PLUGIN_DIR . 'vendor/autoload.php';

require_once LOGINLOCKDOWN_PLUGIN_DIR . 'wf-licensing.php';

require_once LOGINLOCKDOWN_PLUGIN_DIR . 'libs/admin.php';
require_once LOGINLOCKDOWN_PLUGIN_DIR . 'libs/setup.php';
require_once LOGINLOCKDOWN_PLUGIN_DIR . 'libs/utility.php';
require_once LOGINLOCKDOWN_PLUGIN_DIR . 'libs/functions.php';
require_once LOGINLOCKDOWN_PLUGIN_DIR . 'libs/stats.php';
require_once LOGINLOCKDOWN_PLUGIN_DIR . 'libs/ajax.php';


require_once LOGINLOCKDOWN_PLUGIN_DIR . 'interface/tab_login_form.php';
require_once LOGINLOCKDOWN_PLUGIN_DIR . 'interface/tab_activity.php';
require_once LOGINLOCKDOWN_PLUGIN_DIR . 'interface/tab_temp_access.php';
require_once LOGINLOCKDOWN_PLUGIN_DIR . 'interface/tab_firewall.php';
require_once LOGINLOCKDOWN_PLUGIN_DIR . 'interface/tab_geoip.php';
require_once LOGINLOCKDOWN_PLUGIN_DIR . 'interface/tab_design.php';
require_once LOGINLOCKDOWN_PLUGIN_DIR . 'interface/tab_license.php';


// main plugin class
class LoginLockdown
{
    static $version = 0;
    static $pro = true;
    static $licensing_servers = array('https://dashboard.wploginlockdown.com/api/');

    static $type;

    /**
     * Setup Hooks
     *
     * @since 5.0
     *
     * @return null
     */
    static function init()
    {
        // check if minimal required WP version is present
        if (false === LoginLockdown_Setup::check_wp_version(4.6) || false === LoginLockdown_Setup::check_php_version('5.6.20')) {
            return false;
        }

        LoginLockdown_Setup::maybe_upgrade();

        LoginLockdown_Functions::handle_temporary_links();

        LoginLockdown_Functions::handle_unblock();
        LoginLockdown_Functions::handle_global_block();
        $options = LoginLockdown_Setup::get_options();

        if (is_admin()) {
            // add Login Lockdown menu to admin tools menu group
            add_action('admin_menu', array('LoginLockdown_Admin', 'admin_menu'));

            // aditional links in plugin description and footer
            add_filter('plugin_action_links_' . plugin_basename(__FILE__), array('LoginLockdown_Admin', 'plugin_action_links'));
            add_filter('plugin_row_meta', array('LoginLockdown_Admin', 'plugin_meta_links'), 10, 2);
            add_filter('admin_footer_text', array('LoginLockdown_Admin', 'admin_footer_text'));

            if ($options['show_admin_menu'] == true) {
                // add Login Lockdown menu to admin bar
                add_action('wp_before_admin_bar_render', array('LoginLockdown_Admin', 'admin_bar'));
            }

            // settings registration
            add_action('admin_init', array('LoginLockdown_Setup', 'register_settings'));
            add_action('admin_notices', array('LoginLockdown_Admin', 'admin_notices'));

            // enqueue admin scripts
            add_action('admin_enqueue_scripts', array('LoginLockdown_Admin', 'admin_enqueue_scripts'));

            // admin actions
            add_action('admin_action_loginlockdown_export_settings', array('LoginLockdown_Functions', 'generate_export_file'));
            add_action('admin_action_loginlockdown_install_template', array('LoginLockdown_Functions', 'install_template'));

            // AJAX endpoints
            add_action('wp_ajax_loginlockdown_run_tool', array('LoginLockdown_AJAX', 'ajax_run_tool'));
            add_action('wp_ajax_loginlockdown_unsplash_download', array('LoginLockdown_AJAX', 'unsplash_download'));
            add_action('wp_ajax_loginlockdown_unsplash_api', array('LoginLockdown_AJAX', 'unsplash_api'));
        } else {
            add_action('login_form', array('LoginLockdown_Functions', 'login_form_fields'));
            add_action('woocommerce_login_form', array('LoginLockdown_Functions', 'login_form_fields'));
            add_action('woocommerce_login_form', array('LoginLockdown_Functions', 'login_print_scripts'));

            add_action('wp_login_failed', array('LoginLockdown_Functions', 'loginFailed' ), 10, 2);
            add_filter('login_errors', array('LoginLockdown_Functions', 'login_error_message' ));

            add_filter('wp_logout', array('LoginLockdown_Functions', 'wp_logout'), 10, 1);
            add_filter('wp_login', array('LoginLockdown_Functions', 'wp_login'), 10, 2);

            add_action('login_enqueue_scripts', array('LoginLockdown_Functions', 'login_enqueue_scripts' ));
            add_action('login_head', array('LoginLockdown_Functions', 'login_head' ), 9999);

            remove_filter('authenticate', 'wp_authenticate_username_password', 20, 3);
            add_filter('authenticate', array('LoginLockdown_Functions', 'wp_authenticate_username_password'), 20, 3);
        } // if not admin

        if(!empty($options['login_url']) && LoginLockdown_Functions::login_compatibility_check() === true){
            add_action('wp_loaded', array('LoginLockdown_Functions', 'wp_loaded' ) );
            remove_action( 'template_redirect', 'wp_redirect_admin_locations', 1000 );
            add_filter('login_url', array('LoginLockdown_Functions', 'login_url' ), 10, 3 );
            add_filter('logout_url', array('LoginLockdown_Functions', 'logout_url' ), 10, 3 );
            add_filter('site_url', array('LoginLockdown_Functions', 'site_url' ), 10, 4 );
            add_filter('site_option_welcome_email', array('LoginLockdown_Functions', 'login_url_welcome_email' ) );
            add_filter('site_status_tests', array('LoginLockdown_Functions', 'site_status_tests' ) );
            add_filter('wp_redirect', array('LoginLockdown_Functions', 'wp_redirect' ), 10, 2 );
        }
        
        add_filter('auth_cookie_expiration', array('LoginLockdown_Functions', 'login_cookie_expiration' ));

        LoginLockdown_Functions::check_2fa();
    } // init

    /**
     * Get plugin version
     *
     * @since 5.0
     *
     * @return int plugin version
     *
     */
    static function get_plugin_version()
    {
        $plugin_data = get_file_data(__FILE__, array('version' => 'Version'), 'plugin');
        self::$version = $plugin_data['version'];

        return $plugin_data['version'];
    } // get_plugin_version

    /**
     * Set plugin version and texdomain
     *
     * @since 5.0
     *
     * @return null
     */
    static function plugins_loaded()
    {
        self::get_plugin_version();
        load_plugin_textdomain('login-lockdown');
        LoginLockdown_Functions::override_login_urls();
    } // plugins_loaded

    static function run()
    {
        self::plugins_loaded();
        LoginLockdown_Setup::load_actions();
    }
} // class LoginLockdown


/**
 * Setup Hooks
 */
register_activation_hook(__FILE__, array('LoginLockdown_Setup', 'activate'));
register_deactivation_hook(__FILE__, array('LoginLockdown_Setup', 'deactivate'));
register_uninstall_hook(__FILE__, array('LoginLockdown_Setup', 'uninstall'));
add_action('plugins_loaded', array('loginlockdown', 'run'), -9999);
add_action('init', array('loginlockdown', 'init'), -1);