query( $wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s", $wpdb->esc_like( 'operanse_agent' ) . '%' ) ); // phpcs:ignore WordPress.DB $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s OR option_name LIKE %s", $wpdb->esc_like( '_transient_operanse_' ) . '%', $wpdb->esc_like( '_transient_timeout_operanse_' ) . '%' ) ); // phpcs:ignore WordPress.DB $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s OR option_name LIKE %s", $wpdb->esc_like( '_site_transient_operanse_' ) . '%', $wpdb->esc_like( '_site_transient_timeout_operanse_' ) . '%' ) ); // phpcs:ignore WordPress.DB wp_cache_delete( 'alloptions', 'options' ); foreach ( array( 'operanse_agent_update_check', 'operanse_inbound_denied' ) as $operanse_transient ) { delete_transient( $operanse_transient ); // the object-cache copy, on a site with a persistent cache } // The agent's own tables. $wpdb->query( "DROP TABLE IF EXISTS `{$wpdb->prefix}operanse_spool`" ); // phpcs:ignore WordPress.DB $wpdb->query( "DROP TABLE IF EXISTS `{$wpdb->prefix}operanse_nonces`" ); // phpcs:ignore WordPress.DB // The file spool: only the directories the option named, only if they hold nothing but what the agent wrote. foreach ( $operanse_spool_dirs as $operanse_spool_dir ) { if ( $operanse_spool_dir === '' || ! is_dir( $operanse_spool_dir ) ) { continue; } $operanse_entries = scandir( $operanse_spool_dir ); $operanse_only_ours = is_array( $operanse_entries ); if ( is_array( $operanse_entries ) ) { foreach ( $operanse_entries as $operanse_name ) { if ( $operanse_name === '.' || $operanse_name === '..' ) { continue; } $operanse_is_ours = in_array( $operanse_name, array( '.htaccess', 'index.html', 'web.config', 'dropped.json' ), true ) || (bool) preg_match( '/^(critical|normal|sampled)(\.active|-\d{14}-[0-9a-f]{6}\.ndjson)(\.moving)?$/', $operanse_name ) || (bool) preg_match( '/^probe-[0-9a-f]{16}\.ndjson$/', $operanse_name ); if ( ! $operanse_is_ours || is_dir( $operanse_spool_dir . '/' . $operanse_name ) ) { $operanse_only_ours = false; break; } } } if ( $operanse_only_ours ) { foreach ( (array) $operanse_entries as $operanse_name ) { if ( $operanse_name !== '.' && $operanse_name !== '..' ) { @unlink( $operanse_spool_dir . '/' . $operanse_name ); // phpcs:ignore WordPress.PHP.NoSilencedErrors, WordPress.WP.AlternativeFunctions } } @rmdir( $operanse_spool_dir ); // phpcs:ignore WordPress.PHP.NoSilencedErrors, WordPress.WP.AlternativeFunctions // And the parent the agent made for it, if that is now empty: the plugin's uploads folder or its older names. if ( in_array( basename( dirname( $operanse_spool_dir ) ), array( 'operanse-agent', 'operanse-private', 'operanse-data' ), true ) ) { @rmdir( dirname( $operanse_spool_dir ) ); // phpcs:ignore WordPress.PHP.NoSilencedErrors, WordPress.WP.AlternativeFunctions } } }