prefix . 'user_id_login_history'; // Skip if table isn't there // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching if ( $wpdb->get_var( $wpdb->prepare( "SHOW TABLES LIKE %s", $table_name_login ) ) !== $table_name_login ) { return; } $ip_address = $this->get_client_ip(); $user_agent = isset( $_SERVER['HTTP_USER_AGENT'] ) ? sanitize_text_field( wp_unslash( $_SERVER['HTTP_USER_AGENT'] ) ) : ''; // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery $wpdb->insert( $table_name_login, array( 'user_id' => $user->ID, 'ip_address' => $ip_address, 'user_agent' => $user_agent, ), array( '%d', '%s', '%s' ) ); } /** * Deletes login history records older than 30 days. */ public function cleanup_old_logins() { global $wpdb; $table_name_login = $wpdb->prefix . 'user_id_login_history'; // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching if ( $wpdb->get_var( $wpdb->prepare( "SHOW TABLES LIKE %s", $table_name_login ) ) === $table_name_login ) { // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared, PluginCheck.Security.DirectDB.UnescapedDBParameter $wpdb->query( "DELETE FROM " . $table_name_login . " WHERE login_time < DATE_SUB(NOW(), INTERVAL 30 DAY)" ); } } /** * Retrieve most reliable client IP address. * * @return string IP Address. */ private function get_client_ip() { $ip = 'Unknown'; $server_headers = array( 'HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR' ); foreach ( $server_headers as $header ) { if ( ! empty( $_SERVER[ $header ] ) ) { $ip_list = explode( ',', sanitize_text_field( wp_unslash( $_SERVER[ $header ] ) ) ); $ip = trim( $ip_list[0] ); // Basic fallback sanitization if ( filter_var( $ip, FILTER_VALIDATE_IP ) ) { break; } else { $ip = 'Unknown'; } } } return sanitize_text_field( $ip ); } /** * Render login history pane for user. * * @param int $user_id The user ID. */ public function render_login_history_pane( $user_id ) { global $wpdb; $table_name_login = $wpdb->prefix . 'user_id_login_history'; // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching if ( $wpdb->get_var( $wpdb->prepare( "SHOW TABLES LIKE %s", $table_name_login ) ) !== $table_name_login ) { return; } // phpcs:disable WordPress.DB.PreparedSQL.NotPrepared // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, PluginCheck.Security.DirectDB.UnescapedDBParameter $logins = $wpdb->get_results( $wpdb->prepare( " SELECT * FROM " . $table_name_login . " WHERE user_id = %d ORDER BY login_time DESC LIMIT 10 ", $user_id ) ); // phpcs:enable ?>
| login_time ) ) ) ); ?> | ip_address ); ?> | user_agent ); ?> |