initialize_parameters( $request ); } /** * Initialize the class properties based on the request parameters. * * @param WP_REST_Request $request The WordPress REST request object. */ private function initialize_parameters( WP_REST_Request $request ): void { $allowed_providers = array( 'passkey', 'email', 'totp', 'passkey_register' ); $this->nonce = sanitize_text_field( $request->get_header( 'X-WP-Nonce' ) ); $this->redirect_to = $request->get_param( 'redirect_to' ) ? wp_validate_redirect( $request->get_param( 'redirect_to' ), admin_url() ) : admin_url(); $this->login_nonce = sanitize_text_field( $request->get_param( 'login_nonce' ) ); $provider = $request->get_param( 'provider' ); $this->forced_roles = rsssl_get_option( 'two_fa_forced_role' , [] ); $this->days_threshold = rsssl_get_option( 'two_fa_days_threshold', 0 ); if ( ! in_array( $provider, $allowed_providers, true ) ) { $provider = null; } if ( $request->has_param( 'credential' ) || $request->has_param( 'credentials' ) ) { $this->initialize_passkey_parameters( $request ); } else { $this->user_id = $request->get_param( 'user_id' )?? 0; $this->provider = $provider?? 'none'; $user = get_user_by( 'id', $this->user_id ); if ($user) { $this->user = $user; } if ($request->has_param('entry_id')) { $this->entry_id = (int) $request->get_param('entry_id'); } } if ( $provider === 'totp' ) { $this->code = sanitize_text_field( wp_unslash( $request->get_param( 'two-factor-totp-authcode' ) ) ); $this->key = sanitize_text_field( wp_unslash( $request->get_param( 'key' ) ) ); } if ( $provider === 'email' ) { $this->token = sanitize_text_field( wp_unslash( $request->get_param( 'token' ) ) ); $this->profile = wp_unslash( $request->get_param( 'profile' ) ?? false ); } $this->unique_browser_identifier = sanitize_text_field( $request->get_param( 'unique_browser_identifier' ) ); $this->user_login = sanitize_user( wp_unslash( $request->get_param( 'user_login' ) ) ); $this->user_handle = sanitize_text_field( $request->get_param( 'userHandle' ) ); $this->onboarding = (bool) $request->get_param( 'onboarding' ); $this->auth_device_id = sanitize_text_field( $request->get_param( 'device_name' ) ?? 'unknown' ); // If user_id is set, we try to get the user object. if ( $this->user_id ) { $user = get_user_by( 'id', $this->user_id ); if ($user) { $this->user = $user; } return; } // If user_login is set, we try to get the user object by login. Since we probably are in the login flow, // we want to get the user by login. if ( $this->user_login ) { $user = get_user_by( 'login', $this->user_login ); if ( $user ) { $this->user_id = $user->ID; $this->user = $user; } } } /** * Initialize passkey-specific parameters. * * @param WP_REST_Request $request The WordPress REST request object. */ private function initialize_passkey_parameters( WP_REST_Request $request ): void { $this->user_id = $request->get_param( 'user_id' ) ? absint( $request->get_param( 'user_id' ) ) : get_current_user_id(); $this->provider = Rsssl_Two_Factor_Passkey::class; $this->id = sanitize_text_field( $request->get_param( 'id' ) ); $this->rawId = sanitize_text_field( $request->get_param( 'rawId' ) ); if( !$request->has_param( 'credentials' ) ) { //To do regex sanitation $this->response = $request->get_param( 'credential' ); } $this->type = sanitize_text_field( $request->get_param( 'type' ) ); $this->entry_id = (int) $request->get_param( 'entry_id' ); } }