key = base64_encode( $public_key_credential_source->getPublicKeyCredentialId() ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode if ( ! isset( $data[ $key ] ) ) { $data[ $key ] = array( 'label' => defender_get_data_from_request( 'name', 'p' ) ?? '', 'added' => time(), 'authenticator_type' => defender_get_data_from_request( 'type', 'p' ) ?? '', 'user' => $public_key_credential_source->getUserHandle(), 'credential_source' => $public_key_credential_source, ); } else { $data[ $key ]['credential_source'] = $public_key_credential_source; } $this->setCredentials( $user_id, $data ); } /** * Get userHandle mismatch list. * * @param int $user_id The user ID. * * @return array * @since 3.4.0 */ public function getUserHandleMatchFailed( int $user_id ): array { $meta_key = $this->option_prefix . self::USER_HANDLE_MISMATCH_KEY; $meta_val = get_user_meta( $user_id, $meta_key, true ); return is_array( $meta_val ) ? $meta_val : array(); } /** * Set userHandle mismatch list. * * @param int $user_id The user ID. * @param array $meta_val The mismatches to set. * * @return void * @since 3.4.0 */ public function setUserHandleMatchFailed( int $user_id, array $meta_val ): void { $meta_key = $this->option_prefix . self::USER_HANDLE_MISMATCH_KEY; update_user_meta( $user_id, $meta_key, $meta_val ); } /** * Add authenticators to userHandle mismatch list. * * @param WP_User $user The user object. * @param array $data The data to add. * * @return void * @since 3.4.0 */ public function addUserHandleMatchFailed( $user, $data ): void { if ( ! empty( $user->ID ) && ! empty( $data['rawId'] ) ) { $meta_val = $this->getUserHandleMatchFailed( $user->ID ); $meta_val['show_notice'] = $meta_val['show_notice'] ?? true; if ( empty( $meta_val['authenticators'] ) || ! in_array( $data['rawId'], $meta_val['authenticators'], true ) ) { $meta_val['authenticators'][] = $data['rawId']; } $this->setUserHandleMatchFailed( $user->ID, $meta_val ); } } /** * Remove authenticator from userHandle mismatch list. * * @param int $user_id The user ID. * @param string $auth_id The authenticator ID to remove. * * @return void * @since 3.4.0 */ public function removeUserHandleMatchFailed( int $user_id, string $auth_id ): void { if ( ! empty( $auth_id ) ) { $meta_val = $this->getUserHandleMatchFailed( $user_id ); if ( ! empty( $meta_val['authenticators'] ) && is_array( $meta_val['authenticators'] ) ) { $pos = array_search( $auth_id, $meta_val['authenticators'], true ); if ( false !== $pos ) { array_splice( $meta_val['authenticators'], $pos, 1 ); $this->setUserHandleMatchFailed( $user_id, $meta_val ); } } } } /** * Disable userHandle mismatch notice. * * @param int $user_id The user ID. * * @return void * @since 3.4.0 */ public function disableUserHandleMatchFailedNotice( int $user_id ): void { $meta_val = $this->getUserHandleMatchFailed( $user_id ); $meta_val['show_notice'] = false; $this->setUserHandleMatchFailed( $user_id, $meta_val ); } }