gent_Lockout::get_module_name(), ), ), $this->dump_routes_and_nonces() ); } /** * Adapt the given data array by adding additional fields if necessary. * * @param array $data The data array to adapt. * * @return array The adapted data array. */ private function adapt_data( array $data ): array { $adapted_data = array(); if ( isset( $data['ua_banning_enabled'] ) ) { $adapted_data['enabled'] = (bool) $data['ua_banning_enabled']; } if ( isset( $data['ua_banning_message'] ) ) { $adapted_data['message'] = $data['ua_banning_message']; } if ( isset( $data['ua_banning_blacklist'] ) ) { $adapted_data['blacklist'] = $data['ua_banning_blacklist']; } if ( isset( $data['ua_banning_whitelist'] ) ) { $adapted_data['whitelist'] = $data['ua_banning_whitelist']; } if ( isset( $data['ua_banning_empty_headers'] ) ) { $adapted_data['empty_headers'] = (bool) $data['ua_banning_empty_headers']; } return array_merge( $data, $adapted_data ); } /** * Imports data into the model. * * @param array $data Data to be imported into the model. * * @throws Exception If table is not defined. */ public function import_data( array $data ): void { $model = $this->get_model(); if ( ! empty( $data ) ) { $data = $this->adapt_data( $data ); $model->import( $data ); if ( $model->validate() ) { $model->save(); } } else { $default_ua_values = $model->get_default_values(); $model->enabled = false; $model->message = $default_ua_values['message']; $model->blacklist = $default_ua_values['blacklist']; $model->whitelist = $default_ua_values['whitelist']; $model->empty_headers = false; $model->save(); } } /** * Exports User Agents to a CSV file. * * @return void * @defender_route * @since 2.6.0 */ public function export_ua(): void { $data = array(); foreach ( $this->model->get_lockout_list( 'blocklist', false ) as $ua ) { $data[] = array( 'ua' => $ua, 'type' => 'blocklist', ); } foreach ( $this->model->get_lockout_list( 'allowlist', false ) as $ua ) { $data[] = array( 'ua' => $ua, 'type' => 'allowlist', ); } // WP_Filesystem class doesn’t directly provide a function for opening a stream to php://memory with the 'w' mode. $fp = fopen( 'php://memory', 'w' ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_fopen foreach ( $data as $fields ) { fputcsv( $fp, $fields ); } $filename = 'wdf-ua-export-' . wp_date( 'ymdHis' ) . '.csv'; fseek( $fp, 0 ); header( 'Content-Type: text/csv' ); header( 'Content-Disposition: attachment; filename="' . $filename . '";' ); // Make php send the generated csv lines to the browser. fpassthru( $fp ); exit(); } /** * Importing UAs from exporter. * * @param Request $request The request object. * * @defender_route * @return Response */ public function import_ua( Request $request ) { $data = $request->get_data( array( 'id' => array( 'type' => 'int', ), ) ); $attached_id = $data['id']; if ( ! is_object( get_post( $attached_id ) ) ) { return new Response( false, array( 'message' => esc_html__( 'Your file is invalid!', 'wpdef' ) ) ); } $file = get_attached_file( $attached_id ); if ( ! is_file( $file ) ) { return new Response( false, array( 'message' => esc_html__( 'Your file is invalid!', 'wpdef' ) ) ); } $data = $this->service->verify_import_file( $file ); if ( ! $data ) { return new Response( false, array( 'message' => esc_html__( 'Your file content is invalid! Please use a CSV file format and try again.', 'wpdef' ), ) ); } // All good, start to import. foreach ( $data as $line ) { $this->model->add_to_list( $line[0], $line[1] ); } return new Response( true, array( 'message' => esc_html__( 'Your blocklist and allowlist have been successfully imported.', 'wpdef' ), 'interval' => 1, ) ); } /** * Exports strings. * * @return array An array of strings. */ public function export_strings(): array { return array(); } }gent_Lockout::get_module_name(), ), ), $this->dump_routes_and_nonces() ); } /** * Adapt the given data array by adding additional fields if necessary. * * @param array $data The data array to adapt. * * @return array The adapted data array. */ private function adapt_data( array $data ): array { $adapted_data = array(); if ( isset( $data['ua_banning_enabled'] ) ) { $adapted_data['enabled'] = (bool) $data['ua_banning_enabled']; } if ( isset( $data['ua_banning_message'] ) ) { $adapted_data['message'] = $data['ua_banning_message']; } if ( isset( $data['ua_banning_blacklist'] ) ) { $adapted_data['blacklist'] = $data['ua_banning_blacklist']; } if ( isset( $data['ua_banning_whitelist'] ) ) { $adapted_data['whitelist'] = $data['ua_banning_whitelist']; } if ( isset( $data['ua_banning_empty_headers'] ) ) { $adapted_data['empty_headers'] = (bool) $data['ua_banning_empty_headers']; } return array_merge( $data, $adapted_data ); } /** * Imports data into the model. * * @param array $data Data to be imported into the model. * * @throws Exception If table is not defined. */ public function import_data( array $data ): void { $model = $this->get_model(); if ( ! empty( $data ) ) { $data = $this->adapt_data( $data ); $model->import( $data ); if ( $model->validate() ) { $model->save(); } } else { $default_ua_values = $model->get_default_values(); $model->enabled = false; $model->message = $default_ua_values['message']; $model->blacklist = $default_ua_values['blacklist']; $model->whitelist = $default_ua_values['whitelist']; $model->empty_headers = false; $model->save(); } } /** * Exports User Agents to a CSV file. * * @return void * @defender_route * @since 2.6.0 */ public function export_ua(): void { $data = array(); foreach ( $this->model->get_lockout_list( 'blocklist', false ) as $ua ) { $data[] = array( 'ua' => $ua, 'type' => 'blocklist', ); } foreach ( $this->model->get_lockout_list( 'allowlist', false ) as $ua ) { $data[] = array( 'ua' => $ua, 'type' => 'allowlist', ); } // WP_Filesystem class doesn’t directly provide a function for opening a stream to php://memory with the 'w' mode. $fp = fopen( 'php://memory', 'w' ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_fopen foreach ( $data as $fields ) { fputcsv( $fp, $fields ); } $filename = 'wdf-ua-export-' . wp_date( 'ymdHis' ) . '.csv'; fseek( $fp, 0 ); header( 'Content-Type: text/csv' ); header( 'Content-Disposition: attachment; filename="' . $filename . '";' ); // Make php send the generated csv lines to the browser. fpassthru( $fp ); exit(); } /** * Importing UAs from exporter. * * @param Request $request The request object. * * @defender_route * @return Response */ public function import_ua( Request $request ) { $data = $request->get_data( array( 'id' => array( 'type' => 'int', ), ) ); $attached_id = $data['id']; if ( ! is_object( get_post( $attached_id ) ) ) { return new Response( false, array( 'message' => esc_html__( 'Your file is invalid!', 'wpdef' ) ) ); } $file = get_attached_file( $attached_id ); if ( ! is_file( $file ) ) { return new Response( false, array( 'message' => esc_html__( 'Your file is invalid!', 'wpdef' ) ) ); } $data = $this->service->verify_import_file( $file ); if ( ! $data ) { return new Response( false, array( 'message' => esc_html__( 'Your file content is invalid! Please use a CSV file format and try again.', 'wpdef' ), ) ); } // All good, start to import. foreach ( $data as $line ) { $this->model->add_to_list( $line[0], $line[1] ); } return new Response( true, array( 'message' => esc_html__( 'Your blocklist and allowlist have been successfully imported.', 'wpdef' ), 'interval' => 1, ) ); } /** * Exports strings. * * @return array An array of strings. */ public function export_strings(): array { return array(); } }