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();
}
}