get_col( $wpdb->prepare( "SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE %s OR option_name LIKE %s", $wpdb->esc_like( '_transient_brverify_' ) . '%', $wpdb->esc_like( '_transient_restoreproof_' ) . '%' ) ); foreach ( is_array( $brverify_transients ) ? $brverify_transients : array() as $brverify_name ) { delete_transient( substr( (string) $brverify_name, strlen( '_transient_' ) ) ); } if ( is_multisite() ) { // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $brverify_site_transients = $wpdb->get_col( $wpdb->prepare( "SELECT meta_key FROM {$wpdb->sitemeta} WHERE meta_key LIKE %s", $wpdb->esc_like( '_site_transient_brverify_' ) . '%' ) ); foreach ( is_array( $brverify_site_transients ) ? $brverify_site_transients : array() as $brverify_name ) { delete_site_transient( substr( (string) $brverify_name, strlen( '_site_transient_' ) ) ); } } // Candidate working directories, found with WordPress functions (no plugin classes are loaded here): // uploads/brverify-working (0.6.5+) and, for older installs, the folder next to the plugins directory. $brverify_upload = wp_upload_dir( null, false ); $brverify_content = dirname( untrailingslashit( dirname( untrailingslashit( plugin_dir_path( __FILE__ ) ) ) ) ); $brverify_parents = array(); if ( ! empty( $brverify_upload['basedir'] ) ) { $brverify_parents[] = (string) $brverify_upload['basedir']; } $brverify_parents[] = $brverify_content; /** * Resolve / only when it really is that directory (no symlink escapes). * * @param string $parent Parent directory. * @param string $name Relative name. * @return string Normalised path or '' when it does not exist or fails the check. */ if ( ! function_exists( 'brverify_uninstall_jail' ) ) { function brverify_uninstall_jail( string $parent, string $name ): string { $root = realpath( $parent ); $real = realpath( trailingslashit( $parent ) . $name ); if ( false === $root || false === $real ) { return ''; } $root_n = rtrim( str_replace( '\\', '/', $root ), '/' ); $real_n = rtrim( str_replace( '\\', '/', $real ), '/' ); return $real_n === $root_n . '/' . $name ? $real_n : ''; } } // Migration scratch (prepared dumps, exported packages, incoming uploads) is always removed. foreach ( $brverify_parents as $brverify_parent ) { $brverify_scratch = brverify_uninstall_jail( $brverify_parent, 'brverify-working/migrate' ); if ( '' !== $brverify_scratch ) { brverify_uninstall_rrmdir( $brverify_scratch ); } } if ( ! $brverify_wipe ) { return; } // 2. Opt-in full wipe: options (+ any pre-release leftovers), user meta, capability, tables. // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $brverify_options = $wpdb->get_col( $wpdb->prepare( "SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE %s OR option_name LIKE %s", $wpdb->esc_like( 'brverify_' ) . '%', $wpdb->esc_like( 'restoreproof_' ) . '%' ) ); foreach ( is_array( $brverify_options ) ? $brverify_options : array() as $brverify_name ) { delete_option( (string) $brverify_name ); delete_site_option( (string) $brverify_name ); } delete_metadata( 'user', 0, 'brverify_note_dismissed', '', true ); delete_metadata( 'user', 0, 'brverify_pro_dismissed', '', true ); $brverify_role = get_role( 'administrator' ); if ( $brverify_role ) { $brverify_role->remove_cap( 'manage_brverify' ); $brverify_role->remove_cap( 'manage_restoreproof' ); } foreach ( array( 'brverify_jobs', 'brverify_logs', 'brverify_artifacts', 'restoreproof_jobs', 'restoreproof_logs', 'restoreproof_artifacts' ) as $brverify_table ) { $brverify_full = $wpdb->prefix . $brverify_table; // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange, WordPress.DB.PreparedSQL.InterpolatedNotPrepared $wpdb->query( "DROP TABLE IF EXISTS `{$brverify_full}`" ); } // 3. Working directory (backup zips + job scratch). Path-jailed to the uploads / content directory. foreach ( $brverify_parents as $brverify_parent ) { foreach ( array( 'brverify-working', 'restoreproof-working' ) as $brverify_dirname ) { $brverify_real_n = brverify_uninstall_jail( $brverify_parent, $brverify_dirname ); if ( '' !== $brverify_real_n ) { brverify_uninstall_rrmdir( $brverify_real_n ); } } }