for. * * @return mixed * * @since 2.6.0 */ public static function set_backup_email_for_user( string $email, $user = null ) { self::set_proper_user( $user ); $email = \sanitize_email( \wp_unslash( $email ) ); if ( ! empty( $email ) ) { if ( self::get_user()->user_email !== $email ) { return self::set_meta( self::USER_BACKUP_EMAIL, $email ); } elseif ( self::get_user()->user_email === $email ) { return self::set_meta( self::USER_BACKUP_EMAIL, 'wp_mail' ); } else { self::remove_backup_email_for_user( $user ); } } return false; } /** * Removes the backup email for the user. * * @param int|\WP_User|null $user - The WP user we should extract the meta data for. * * @return void * * @since 2.6.0 */ public static function remove_backup_email_for_user( $user = null ) { self::set_proper_user( $user ); self::remove_meta( self::USER_BACKUP_EMAIL, self::$user ); } /** * Updates teh user metadata. Checks for changes in the global settings, and if it finds some, checks these against the given user metadata settings hash and updates the user metadata if necessary. * * @return void * * @since 2.4.1 */ private static function update_meta_if_necessary() { $global_settings_hash = Settings_Utils::get_option( WP_2FA_PREFIX . 'settings_hash' ); if ( ! empty( $global_settings_hash ) ) { $stored_hash = self::get_global_settings_hash_for_user( self::get_user() ); if ( $global_settings_hash !== $stored_hash ) { self::set_global_settings_hash_for_user( $global_settings_hash, self::get_user() ); // update necessary user attributes (user meta) based on changed settings; the enforcement check // needs to run first as function "set_user_policies_and_grace" relies on having the correct values. self::check_methods_and_set_user(); self::update_user_state( self::get_user() ); self::set_user_policies_and_grace(); self::remove_backup_methods( self::get_user() ); } self::lock_user_account_if_needed(); } } /** * Sets the proper user policies and grace. * * @return void * * @since 2.4.1 */ private static function set_user_policies_and_grace() { $enabled_methods_for_the_user = self::get_enabled_method_for_user( self::get_user() ); if ( ! empty( $enabled_methods_for_the_user ) ) { self::remove_user_enforced_instantly( self::get_user() ); self::remove_user_expiry_date( self::get_user() ); self::remove_meta( self::USER_LOCKED_STATUS, self::get_user() ); self::remove_user_needs_to_reconfigure_2fa( self::get_user() ); self::set_user_status( self::get_user() ); return; } if ( self::is_enforced( self::get_user()->ID ) ) { $grace_policy = Settings_Utils::get_setting_role( self::get_user_role(), 'grace-policy' ); // Check if want to apply the custom period, or instant expiry. if ( 'use-grace-period' === $grace_policy ) { $custom_grace_period_duration = Settings_Utils::get_setting_role( self::get_user_role(), 'grace-period' ) . ' ' . Settings_Utils::get_setting_role( self::get_user_role(), 'grace-period-denominator' ); $grace_expiry = strtotime( $custom_grace_period_duration ); self::remove_user_enforced_instantly( self::get_user() ); self::remove_meta( self::USER_LOCKED_STATUS, self::get_user() ); } else { $grace_expiry = time(); } self::set_user_expiry_date( (string) $grace_expiry, self::get_user() ); if ( 'no-grace-period' === $grace_policy ) { self::set_user_enforced_instantly( true, self::get_user() ); self::remove_meta( self::USER_LOCKED_STATUS, self::get_user() ); } } else { self::remove_user_enforced_instantly( self::get_user() ); self::remove_user_expiry_date( self::get_user() ); self::remove_meta( self::USER_LOCKED_STATUS, self::get_user() ); self::remove_user_needs_to_reconfigure_2fa( self::get_user() ); } // update the 2FA status meta field. self::set_user_status( self::get_user() ); } /** * Checks the user methods and sets the user status. * * @return void * * @since 2.4.1 */ private static function check_methods_and_set_user() { if ( ! self::get_user_needs_to_reconfigure_2fa( self::get_user() ) ) { $enabled_methods_for_the_user = self::get_enabled_method_for_user( self::get_user() ); if ( empty( $enabled_methods_for_the_user ) ) { return; } $global_methods = Methods::get_available_2fa_methods( self::get_user_role() ); if ( empty( \array_intersect( array( $enabled_methods_for_the_user ), $global_methods ) ) ) { self::remove_enabled_method_for_user( self::get_user() ); if ( self::is_enforced( self::get_user()->ID ) ) { self::set_user_needs_to_reconfigure_2fa( true, self::get_user() ); } } } } /** * Calls all the backup methods and gives them and option to remove their stored values. * * @param int|\WP_User|null $user - The WP user we should extract the meta data for. * * @return void * * @since 2.5.0 */ private static function remove_backup_methods( $user = null ) { self::set_proper_user( $user ); \do_action( WP_2FA_PREFIX . 'remove_backup_methods_for_user', self::get_user() ); } /** * Sets the local variable class based on the given parameter. * * @param int|\WP_User|null $user - The WP user we should extract the meta data for. * * @return void * * @since 2.2.0 */ private static function set_proper_user( $user = null ) { if ( null !== $user ) { self::set_user( $user ); } else { self::get_user(); } if ( false !== self::$user && 0 !== self::$user->ID && false === self::$update_started ) { self::$update_started = true; self::update_meta_if_necessary(); } } } }