'itsec-log-entry',
'plural' => 'itsec-log-entries',
'ajax' => true
)
);
$this->types = ITSEC_Log::get_types_for_display();
}
public function column_default( $entry, $field ) {
return esc_html( $entry[$field] );
}
public function column_description( $entry ) {
return $entry['description'];
}
public function column_type( $entry ) {
return $this->types[$entry['type']];
}
public function column_timestamp( $entry ) {
$timestamp = strtotime( $entry['timestamp'] );
$datetime = date( 'Y-m-d H:i:s', $timestamp + ITSEC_Core::get_time_offset() );
/* translators: 1: date and time, 2: time difference */
return sprintf( __( '%1$s - %2$s ago', 'it-l10n-ithemes-security-pro' ), $datetime, human_time_diff( $timestamp, time() ) );
}
public function column_remote_ip( $entry ) {
if ( empty( $entry['remote_ip'] ) ) {
return '';
}
return '' . esc_html( $entry['remote_ip'] ) . '
';
}
/**
* Define username column
*
* @param array $item array of row data
*
* @return string formatted output
*
**/
public function column_user_id( $item ) {
if ( $item['user_id'] > 0 ) {
if ( ! isset( $this->user_cache[$item['user_id']] ) ) {
$this->user_cache[$item['user_id']] = get_userdata( $item['user_id'] );
}
if ( false === $this->user_cache[$item['user_id']] ) {
return '';
}
return '' . esc_html( $this->user_cache[$item['user_id']]->user_login ) . '';
}
return '';
}
public function column_details( $entry ) {
echo '' . esc_html__( 'View Details', 'it-l10n-ithemes-security-pro' ) . '';
}
/**
* Generates and display row actions links for the list table.
*
* @since 4.3.0
*
* @param object $item The item being acted upon.
* @param string $column_name Current column name.
* @param string $primary Primary column name.
* @return string The row actions HTML, or an empty string if the current column is the primary column.
*/
protected function handle_row_actions( $item, $column_name, $primary ) {
$columns = $this->get_columns();
$column_header = $columns[$column_name];
if ( 'module_display' === $column_name ) {
$column_name = 'module';
} else if ( 'description' === $column_name ) {
$column_name = 'code';
}
if ( 'details' === $column_name || 'id' === $column_name ) {
return;
} else if ( 'timestamp' === $column_name ) {
list( $date, $time ) = explode( ' ', $item[$column_name] );
$url = self::get_self_link( array( 'filters' => "$column_name|$date%" ) );
return ' ';
} else if ( empty( $item[$column_name] ) ) {
return;
}
if ( false === strpos( $item['code'], '::' ) ) {
$code = $item['code'];
$data = array();
} else {
list( $code, $data ) = explode( '::', $item['code'], 2 );
$data = explode( ',', $data );
}
$vars = apply_filters( "itsec_logs_prepare_{$item['module']}_filter_row_action_for_{$column_name}", array( 'filters' => "{$column_name}|{$item[ $column_name ]}"), $item, $code, $data );
$url = $this->get_self_link( $vars );
$out = ' ';
if ( 'module' === $column_name ) {
$out .= '';
}
return $out;
}
private function get_self_link( $vars = array(), $current_vars = false ) {
if ( ! is_array( $current_vars ) ) {
$current_vars = $_GET;
unset( $current_vars['id'] );
unset( $current_vars['paged'] );
}
$vars = array_merge_recursive( $current_vars, $vars );
if ( ! isset( $vars['page'] ) ) {
$vars = array_merge( array( 'page' => $_GET['page'] ), $vars );
}
return network_admin_url( 'admin.php?' . http_build_query( $vars, null, '&' ) );
}
/**
* Define Columns
*
* @return array array of column titles
*/
public function get_columns() {
return array(
'id' => esc_html__( 'ID', 'it-l10n-ithemes-security-pro' ),
'module_display' => esc_html__( 'Module', 'it-l10n-ithemes-security-pro' ),
'type' => esc_html__( 'Type', 'it-l10n-ithemes-security-pro' ),
'description' => esc_html__( 'Description', 'it-l10n-ithemes-security-pro' ),
'timestamp' => esc_html__( 'Time', 'it-l10n-ithemes-security-pro' ),
'remote_ip' => esc_html__( 'Host', 'it-l10n-ithemes-security-pro' ),
'user_id' => esc_html__( 'User', 'it-l10n-ithemes-security-pro' ),
'details' => esc_html__( 'Details', 'it-l10n-ithemes-security-pro' ),
);
}
/**
*
* @return array
*/
protected function get_sortable_columns() {
return array(
'timestamp' => array( 'timestamp', false ),
'remote_ip' => array( 'remote_ip', false ),
);
}
private function get_raw_filters() {
if ( ! empty( $this->raw_filters ) ) {
return $this->raw_filters;
}
if ( empty( $_GET['filters'] ) ) {
$raw_filters = array();
} else {
$raw_filters = $_GET['filters'];
}
$filters = array();
foreach ( (array) $raw_filters as $var ) {
list( $field, $value ) = explode( '|', $var, 2 );
$filters[$field] = $value;
}
if ( ! isset( $filters['type'] ) ) {
if ( ! isset( $filters['type_not'] ) ) {
$options = ITSEC_Log_Util::get_logs_page_screen_options();
$filters['type'] = $options['default_view'];
} else {
$filters['type'] = 'all';
}
}
$this->raw_filters = $filters;
return $this->raw_filters;
}
private function get_current_view() {
$raw_filters = $this->get_raw_filters();
return $raw_filters['type'];
}
private function get_current_filters( $options ) {
if ( ! empty( $this->current_filters ) ) {
return $this->current_filters;
}
$filters = $this->get_raw_filters();
if ( 'process' === $filters['type'] ) {
$filters['type'] = [ 'process-start', 'process-update', 'process-stop' ];
}
if ( 'all' === $filters['type'] ) {
$type_not = array();
if ( ! $options['show_debug'] ) {
$type_not[] = 'debug';
}
if ( ! $options['show_process'] ) {
$type_not[] = 'process-start';
$type_not[] = 'process-update';
$type_not[] = 'process-stop';
}
unset( $filters['type'] );
} else if ( 'important' === $filters['type'] ) {
$type_not = array( 'action', 'notice', 'debug', 'process-start', 'process-update', 'process-stop' );
unset( $filters['type'] );
}
if ( ! empty( $type_not ) ) {
if ( isset( $filters['type_not'] ) && is_array( $filters['type_not'] ) ) {
$filters['type_not'] = array_merge( $filters['type_not'], $type_not );
$filters['type_not'] = array_unique( $filters['type_not'] );
} else {
$filters['type_not'] = $type_not;
}
}
$this->current_filters = $filters;
return $this->current_filters;
}
/**
* Prepare data for table
*
* @return void
*/
public function prepare_items() {
global $wpdb;
require_once( ITSEC_Core::get_core_dir() . '/lib/log-util.php' );
$options = ITSEC_Log_Util::get_logs_page_screen_options();
$filters = $this->get_current_filters( $options );
$columns = $this->get_columns();
$hidden_fields = array( 'id' );
$sortable_columns = $this->get_sortable_columns();
if ( isset( $_GET['orderby'], $_GET['order'] ) && is_string( $_GET['orderby'] ) && is_string( $_GET['order'] ) ) {
if ( preg_match( '/^[a-z_]+$/', $_GET['orderby'] ) ) {
$sort_by_column = $_GET['orderby'];
} else {
$sort_by_column = 'timestamp';
}
if ( in_array( strtoupper( $_GET['order'] ), array( 'DESC', 'ASC' ) ) ) {
$sort_direction = strtoupper( $_GET['order'] );
} else {
$sort_direction = 'DESC';
}
} else {
$sort_by_column = 'timestamp';
$sort_direction = 'DESC';
}
if ( $options['last_seen'] > 0 ) {
$filters['__min_timestamp'] = $options['last_seen'];
}
$total_items = ITSEC_Log::get_number_of_entries( $filters );
$items = ITSEC_Log::get_entries( $filters, $options['per_page'], $this->get_pagenum(), $sort_by_column, $sort_direction );
ITSEC_Modules::load_module_file( 'logs.php' );
foreach ( $items as $item ) {
if ( false === strpos( $item['code'], '::' ) ) {
$code = $item['code'];
$data = array();
} else {
list( $code, $data ) = explode( '::', $item['code'], 2 );
$data = explode( ',', $data );
}
$item['description'] = $item['code'];
$item['module_display'] = $item['module'];
$item = apply_filters( "itsec_logs_prepare_{$item['module']}_entry_for_list_display", $item, $code, $data );
$this->items[$item['id']] = $item;
}
$this->_column_headers = array( $columns, $hidden_fields, $sortable_columns, 'module_display' );
$this->set_pagination_args(
array(
'total_items' => $total_items,
'per_page' => $options['per_page'],
)
);
}
protected function get_views() {
$options = ITSEC_Log_Util::get_logs_page_screen_options();
$counts = ITSEC_Log::get_type_counts( $options['last_seen'] );
$views = array(
'important' => esc_html__( 'Important Events (%s)', 'it-l10n-ithemes-security-pro' ),
'all' => esc_html__( 'All Events (%s)', 'it-l10n-ithemes-security-pro' ),
'critical-issue' => esc_html__( 'Critical Issues (%s)', 'it-l10n-ithemes-security-pro' ),
'fatal' => esc_html__( 'Fatal Errors (%s)', 'it-l10n-ithemes-security-pro' ),
'error' => esc_html__( 'Errors (%s)', 'it-l10n-ithemes-security-pro' ),
'warning' => esc_html__( 'Warnings (%s)', 'it-l10n-ithemes-security-pro' ),
'action' => esc_html__( 'Actions (%s)', 'it-l10n-ithemes-security-pro' ),
'notice' => esc_html__( 'Notices (%s)', 'it-l10n-ithemes-security-pro' ),
'debug' => esc_html__( 'Debug (%s)', 'it-l10n-ithemes-security-pro' ),
'process' => esc_html__( 'Process (%s)', 'it-l10n-ithemes-security-pro' ),
);
if ( ! $options['show_debug'] ) {
unset( $views['debug'] );
}
if ( ! $options['show_process'] ) {
unset( $views['process'] );
}
$important_count = 0;
$all_count = 0;
foreach ( $views as $type => $description ) {
if ( in_array( $type, array( 'important', 'all' ) ) ) {
continue;
}
if ( empty( $counts[$type] ) ) {
unset( $views[$type] );
continue;
}
$views[$type] = sprintf( $description, $counts[$type] );
if ( in_array( $type, array( 'critical-issue', 'fatal', 'error', 'warning' ) ) ) {
$important_count += $counts[$type];
}
$all_count += $counts[$type];
}
$views['important'] = sprintf( $views['important'], $important_count );
$views['all'] = sprintf( $views['all'], $all_count );
$formatted_views = array();
$current = $this->get_current_view();
foreach ( $views as $type => $description ) {
$url = $this->get_self_link( array( 'filters' => "type|$type" ), array() );
if ( $current === $type ) {
$description = '' . $description . '';
} else {
$description = '' . $description . '';
}
$formatted_views["itsec-$type"] = $description;
}
return $formatted_views;
}
public function single_row( $item ) {
echo "