geno/wp-content/plugins/cartflows/admin-core/inc/log-status.php
2024-02-01 11:54:18 +00:00

225 lines
5.3 KiB
PHP

<?php
/**
* CartFlows Log status.
*
* @package CartFlows
*/
namespace CartflowsAdmin\AdminCore\Inc;
// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Class LogStatus.
*/
class LogStatus {
/**
* Instance
*
* @access private
* @var object Class object.
* @since 1.0.0
*/
private static $instance;
/**
* Deleted
*
* @access private
* @var object Class object.
* @since 1.0.0
*/
private static $file_deleted = false;
/**
* Initiator
*
* @since 1.0.0
* @return object initialized object of class.
*/
public static function get_instance() {
if ( ! isset( self::$instance ) ) {
self::$instance = new self();
}
return self::$instance;
}
/**
* Instance
*
* @access private
* @var string Class object.
* @since 1.0.0
*/
private $menu_slug;
/**
* Constructor
*
* @since 1.0.0
*/
public function __construct() {
}
/**
* User action like download or delete log files.
*/
public function user_actions() {
// Ignoring nonce verification as using SuperGlobal variables on WordPress hooks.
if ( ! empty( $_REQUEST['handle'] ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Recommended
if ( ! current_user_can( 'cartflows_manage_settings' ) ) {
wp_die( esc_html__( 'You don\'t have permission to view this page.', 'cartflows' ) );
}
if ( isset( $_REQUEST['btn_action'] ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Recommended
$button_action = sanitize_text_field( wp_unslash( $_REQUEST['btn_action'] ) ); //phpcs:ignore WordPress.Security.NonceVerification.Recommended
switch ( $button_action ) {
case 'remove-log':
$this->delete_log_file();
break;
case 'download-log':
$this->download_log_file();
break;
default:
break;
}
}
}
}
/**
* Show the log page contents for file log handler.
*/
public function display_logs() {
if ( self::$file_deleted ) {
echo "<div class='wcf-notice updated inline wcf-delete-log--message'>" . esc_html__( 'Log deleted successfully!', 'cartflows' ) . ' </div>';
}
$logs = $this->get_log_files();
$form_url = esc_url(
add_query_arg(
array(
'page' => 'cartflows',
'action' => 'wcf-log',
),
admin_url( '/admin.php' )
)
);
$viewed_log = '';
$viewed_log_file = '';
// Calling this function on CartFlows action hook. Hence ignoring nonce.
if ( ! empty( $_REQUEST['log_file'] ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Recommended
$filename = sanitize_text_field( wp_unslash( $_REQUEST['log_file'] ) ); //phpcs:ignore WordPress.Security.NonceVerification.Recommended
if ( isset( $logs[ $filename ] ) ) {
$viewed_log = $filename;
$viewed_log_file = $viewed_log . '.log';
}
} elseif ( ! empty( $logs ) ) {
$viewed_log = current( $logs ) ? pathinfo( current( $logs ), PATHINFO_FILENAME ) : '';
$viewed_log_file = $viewed_log . '.log';
}
include_once CARTFLOWS_ADMIN_CORE_DIR . 'views/debugger.php';
}
/**
* Get all log files in the log directory.
*
* @return array
*/
public function get_log_files() {
$files = scandir( CARTFLOWS_LOG_DIR );
$result = array();
if ( ! empty( $files ) ) {
foreach ( $files as $key => $file ) {
if ( ! is_dir( $file ) && strstr( $file, '.log' ) ) {
$result[ pathinfo( $file, PATHINFO_FILENAME ) ] = $file;
}
}
}
return $result;
}
/**
* Delete Provided log file
*/
public function delete_log_file() {
if ( empty( $_REQUEST['_wpnonce'] ) ||
! wp_verify_nonce( sanitize_text_field( wp_unslash( $_REQUEST['_wpnonce'] ) ), 'remove_log' )
) {
wp_die( esc_html__( 'Nonce verification failed. Please refresh the page and retry.', 'cartflows' ) );
}
if ( empty( $_REQUEST['handle'] ) ) {
wp_die( esc_html__( 'Filename is empty. Please refresh the page and retry.', 'cartflows' ) );
}
$file_name = trim( sanitize_text_field( wp_unslash( $_REQUEST['handle'] ) ) );
$file_path = CARTFLOWS_LOG_DIR . $file_name;
if ( file_exists( $file_path ) ) {
wp_delete_file( $file_path );
self::$file_deleted = true;
}
}
/**
* Download the selected log file.
*/
public function download_log_file() {
if ( empty( $_REQUEST['_wpnonce'] ) ||
! wp_verify_nonce( sanitize_text_field( wp_unslash( $_REQUEST['_wpnonce'] ) ), 'download_log' )
) {
wp_die( esc_html__( 'Nonce verification failed. Please refresh the page and retry.', 'cartflows' ) );
}
$file_name = isset( $_REQUEST['handle'] ) ? trim( sanitize_text_field( wp_unslash( $_REQUEST['handle'] ) ) ) : '';
$file_path = CARTFLOWS_LOG_DIR . $file_name;
if ( ! file_exists( $file_path ) ) {
return;
}
$file_extension = pathinfo( $file_name, PATHINFO_EXTENSION );
$allowed_files = array( 'log' );
// Return if the desired file is not found for download.
if ( ! in_array( $file_extension, $allowed_files, true ) || strpos( $file_name, '.php' ) !== false ) {
wp_die( esc_html__( 'Invalid file.', 'cartflows' ) );
return;
}
header( 'Content-Type: text/log; charset=utf-8' );
header( 'Content-Disposition: attachment; filename=' . $file_name );
header( 'Pragma: no-cache' );
header( 'Expires: 0' );
echo file_get_contents( $file_path ); //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
exit;
}
}
LogStatus::get_instance();