Edit File by line

Deprecated: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in /home/sportsfever/public_html/filemanger/function.php on line 93
/home/sportsfe.../httpdocs/clone/wp-conte.../plugins/string-l.../includes
File: class-search.php
<?php
[0] Fix | Delete
[1] Fix | Delete
namespace StringLocator;
[2] Fix | Delete
[3] Fix | Delete
class Search extends Base\Search {
[4] Fix | Delete
[5] Fix | Delete
/**
[6] Fix | Delete
* An array of file extensions that will be ignored by the scanner.
[7] Fix | Delete
*
[8] Fix | Delete
* @var string[]
[9] Fix | Delete
*/
[10] Fix | Delete
private $bad_file_types = array(
[11] Fix | Delete
'rar',
[12] Fix | Delete
'7z',
[13] Fix | Delete
'zip',
[14] Fix | Delete
'tar',
[15] Fix | Delete
'gz',
[16] Fix | Delete
'jpg',
[17] Fix | Delete
'jpeg',
[18] Fix | Delete
'png',
[19] Fix | Delete
'gif',
[20] Fix | Delete
'mp3',
[21] Fix | Delete
'mp4',
[22] Fix | Delete
'avi',
[23] Fix | Delete
'wmv',
[24] Fix | Delete
);
[25] Fix | Delete
[26] Fix | Delete
public function __construct() {
[27] Fix | Delete
parent::__construct();
[28] Fix | Delete
}
[29] Fix | Delete
[30] Fix | Delete
public function run( $filenum ) {
[31] Fix | Delete
$_POST['filenum'] = $filenum;
[32] Fix | Delete
[33] Fix | Delete
$files_per_chunk = apply_filters( 'string_locator_files_per_array', 500 );
[34] Fix | Delete
$response = array(
[35] Fix | Delete
'search' => array(),
[36] Fix | Delete
'filenum' => absint( $_POST['filenum'] ),
[37] Fix | Delete
);
[38] Fix | Delete
[39] Fix | Delete
$filenum = absint( $_POST['filenum'] );
[40] Fix | Delete
[41] Fix | Delete
$chunk = ( ceil( $filenum / $files_per_chunk ) - 1 );
[42] Fix | Delete
if ( $chunk < 0 ) {
[43] Fix | Delete
$chunk = 0;
[44] Fix | Delete
}
[45] Fix | Delete
[46] Fix | Delete
$scan_data = get_transient( 'string-locator-search-overview' );
[47] Fix | Delete
$file_data = get_transient( 'string-locator-search-files-' . $chunk );
[48] Fix | Delete
[49] Fix | Delete
if ( ! isset( $file_data[ $filenum ] ) ) {
[50] Fix | Delete
wp_send_json_error(
[51] Fix | Delete
array(
[52] Fix | Delete
'continue' => false,
[53] Fix | Delete
'message' => sprintf(
[54] Fix | Delete
/* translators: %d: The numbered reference to a file being searched. */
[55] Fix | Delete
esc_html__( 'The file-number, %d, that was sent could not be found.', 'string-locator' ),
[56] Fix | Delete
$filenum
[57] Fix | Delete
),
[58] Fix | Delete
)
[59] Fix | Delete
);
[60] Fix | Delete
}
[61] Fix | Delete
[62] Fix | Delete
if ( $this->nearing_execution_limit() ) {
[63] Fix | Delete
wp_send_json_error(
[64] Fix | Delete
array(
[65] Fix | Delete
'continue' => false,
[66] Fix | Delete
'message' => sprintf(
[67] Fix | Delete
/* translators: %1$d: The time a PHP file can run, as defined by the server configuration. %2$d: The amount of time used by the PHP file so far. */
[68] Fix | Delete
esc_html__( 'The maximum time your server allows a script to run (%1$d) is too low for the plugin to run as intended, at startup %2$d seconds have passed', 'string-locator' ),
[69] Fix | Delete
$this->max_execution_time,
[70] Fix | Delete
$this->nearing_execution_limit()
[71] Fix | Delete
),
[72] Fix | Delete
)
[73] Fix | Delete
);
[74] Fix | Delete
}
[75] Fix | Delete
if ( $this->nearing_memory_limit() ) {
[76] Fix | Delete
wp_send_json_error(
[77] Fix | Delete
array(
[78] Fix | Delete
'continue' => false,
[79] Fix | Delete
'message' => sprintf(
[80] Fix | Delete
/* translators: %1$d: Current amount of used system memory resources. %2$d: The maximum available system memory. */
[81] Fix | Delete
esc_html__( 'The memory limit is about to be exceeded before the search has started, this could be an early indicator that your site may soon struggle as well, unfortunately this means the plugin is unable to perform any searches. Current memory consumption: %1$d of %2$d bytes', 'string-locator' ),
[82] Fix | Delete
$this->nearing_memory_limit(),
[83] Fix | Delete
$this->max_memory_consumption
[84] Fix | Delete
),
[85] Fix | Delete
)
[86] Fix | Delete
);
[87] Fix | Delete
}
[88] Fix | Delete
[89] Fix | Delete
$is_regex = false;
[90] Fix | Delete
if ( isset( $scan_data->regex ) ) {
[91] Fix | Delete
$is_regex = String_Locator::absbool( $scan_data->regex );
[92] Fix | Delete
}
[93] Fix | Delete
[94] Fix | Delete
if ( $is_regex ) {
[95] Fix | Delete
if ( false === @preg_match( $scan_data->search, '' ) ) { // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
[96] Fix | Delete
wp_send_json_error(
[97] Fix | Delete
array(
[98] Fix | Delete
'continue' => false,
[99] Fix | Delete
'message' => sprintf(
[100] Fix | Delete
/* translators: %s: The search string used. */
[101] Fix | Delete
__( 'Your search string, <strong>%s</strong>, is not a valid pattern, and the search has been aborted.', 'string-locator' ),
[102] Fix | Delete
esc_html( $scan_data->search )
[103] Fix | Delete
),
[104] Fix | Delete
)
[105] Fix | Delete
);
[106] Fix | Delete
}
[107] Fix | Delete
}
[108] Fix | Delete
[109] Fix | Delete
while ( ! $this->nearing_execution_limit() && ! $this->nearing_memory_limit() && isset( $file_data[ $filenum ] ) ) {
[110] Fix | Delete
$filenum = absint( $_POST['filenum'] );
[111] Fix | Delete
$search_results = null;
[112] Fix | Delete
$next_file = $filenum + 1;
[113] Fix | Delete
[114] Fix | Delete
$next_chunk = ( ceil( ( $next_file ) / $files_per_chunk ) - 1 );
[115] Fix | Delete
$chunk = ( ceil( $filenum / $files_per_chunk ) - 1 );
[116] Fix | Delete
if ( $chunk < 0 ) {
[117] Fix | Delete
$chunk = 0;
[118] Fix | Delete
}
[119] Fix | Delete
if ( $next_chunk < 0 ) {
[120] Fix | Delete
$next_chunk = 0;
[121] Fix | Delete
}
[122] Fix | Delete
[123] Fix | Delete
if ( ! isset( $file_data[ $filenum ] ) ) {
[124] Fix | Delete
$chunk ++;
[125] Fix | Delete
$file_data = get_transient( 'string-locator-search-files-' . $chunk );
[126] Fix | Delete
continue;
[127] Fix | Delete
}
[128] Fix | Delete
[129] Fix | Delete
$file_name = explode( '/', $file_data[ $filenum ] );
[130] Fix | Delete
$file_name = end( $file_name );
[131] Fix | Delete
[132] Fix | Delete
/*
[133] Fix | Delete
* Check the file type, if it's an unsupported type, we skip it
[134] Fix | Delete
*/
[135] Fix | Delete
$file_type = explode( '.', $file_name );
[136] Fix | Delete
$file_type = strtolower( end( $file_type ) );
[137] Fix | Delete
[138] Fix | Delete
/*
[139] Fix | Delete
* Scan the file and look for our string, but only if it's an approved file extension
[140] Fix | Delete
*/
[141] Fix | Delete
$bad_file_types = apply_filters( 'string_locator_bad_file_types', $this->bad_file_types );
[142] Fix | Delete
if ( ! in_array( $file_type, $bad_file_types, true ) ) {
[143] Fix | Delete
$search_results = $this->scan_file( $file_data[ $filenum ], $scan_data->search, $file_data[ $filenum ], $scan_data->scan_path->type, '', $is_regex );
[144] Fix | Delete
}
[145] Fix | Delete
[146] Fix | Delete
$response['last_file'] = $file_data[ $filenum ];
[147] Fix | Delete
$response['filenum'] = $filenum;
[148] Fix | Delete
$response['filename'] = $file_name;
[149] Fix | Delete
if ( $search_results ) {
[150] Fix | Delete
$response['search'][] = $search_results;
[151] Fix | Delete
}
[152] Fix | Delete
[153] Fix | Delete
if ( $next_chunk !== $chunk ) {
[154] Fix | Delete
$file_data = get_transient( 'string-locator-search-files-' . $next_chunk );
[155] Fix | Delete
}
[156] Fix | Delete
[157] Fix | Delete
$response['next_file'] = ( isset( $file_data[ $next_file ] ) ? $file_data[ $next_file ] : '' );
[158] Fix | Delete
[159] Fix | Delete
if ( ! empty( $search_results ) ) {
[160] Fix | Delete
$history = get_option( 'string-locator-search-history', array() );
[161] Fix | Delete
$history = array_merge( $history, $search_results );
[162] Fix | Delete
update_option( 'string-locator-search-history', $history, false );
[163] Fix | Delete
}
[164] Fix | Delete
[165] Fix | Delete
$_POST['filenum'] ++;
[166] Fix | Delete
}
[167] Fix | Delete
[168] Fix | Delete
return $response;
[169] Fix | Delete
}
[170] Fix | Delete
[171] Fix | Delete
/**
[172] Fix | Delete
* Scan through an individual file to look for occurrences of £string.
[173] Fix | Delete
*
[174] Fix | Delete
* @param string $filename The path to the file.
[175] Fix | Delete
* @param string $string The search string.
[176] Fix | Delete
* @param mixed $location The file location object/string.
[177] Fix | Delete
* @param string $type File type.
[178] Fix | Delete
* @param string $slug The plugin/theme slug of the file.
[179] Fix | Delete
* @param boolean $regex Should a regex search be performed.
[180] Fix | Delete
*
[181] Fix | Delete
* @return array
[182] Fix | Delete
*/
[183] Fix | Delete
function scan_file( $filename, $string, $location, $type, $slug, $regex = false ) {
[184] Fix | Delete
if ( empty( $string ) || ! is_file( $filename ) ) {
[185] Fix | Delete
return array();
[186] Fix | Delete
}
[187] Fix | Delete
$output = array();
[188] Fix | Delete
$linenum = 0;
[189] Fix | Delete
$match_count = 0;
[190] Fix | Delete
[191] Fix | Delete
if ( ! is_object( $location ) ) {
[192] Fix | Delete
$path = $location;
[193] Fix | Delete
$location = explode( DIRECTORY_SEPARATOR, $location );
[194] Fix | Delete
$file = end( $location );
[195] Fix | Delete
} else {
[196] Fix | Delete
$path = $location->getPathname();
[197] Fix | Delete
$file = $location->getFilename();
[198] Fix | Delete
}
[199] Fix | Delete
[200] Fix | Delete
/*
[201] Fix | Delete
* Check if the filename matches our search pattern
[202] Fix | Delete
*/
[203] Fix | Delete
if ( stristr( $file, $string ) || ( $regex && preg_match( $string, $file ) ) ) {
[204] Fix | Delete
$relativepath = str_replace(
[205] Fix | Delete
array(
[206] Fix | Delete
ABSPATH,
[207] Fix | Delete
'\\',
[208] Fix | Delete
'/',
[209] Fix | Delete
),
[210] Fix | Delete
array(
[211] Fix | Delete
'',
[212] Fix | Delete
DIRECTORY_SEPARATOR,
[213] Fix | Delete
DIRECTORY_SEPARATOR,
[214] Fix | Delete
),
[215] Fix | Delete
$path
[216] Fix | Delete
);
[217] Fix | Delete
$match_count ++;
[218] Fix | Delete
[219] Fix | Delete
$editurl = $this->create_edit_link( $path, $linenum );
[220] Fix | Delete
[221] Fix | Delete
$path_string = sprintf(
[222] Fix | Delete
'<a href="%s">%s</a>',
[223] Fix | Delete
esc_url( $editurl ),
[224] Fix | Delete
esc_html( $relativepath )
[225] Fix | Delete
);
[226] Fix | Delete
[227] Fix | Delete
$output[] = array(
[228] Fix | Delete
'ID' => $match_count,
[229] Fix | Delete
'linenum' => sprintf(
[230] Fix | Delete
'[%s]',
[231] Fix | Delete
esc_html__( 'Filename matches search', 'string-locator' )
[232] Fix | Delete
),
[233] Fix | Delete
'linepos' => '',
[234] Fix | Delete
'path' => $path,
[235] Fix | Delete
'filename' => $path_string,
[236] Fix | Delete
'filename_raw' => $relativepath,
[237] Fix | Delete
'editurl' => ( current_user_can( String_Locator::$default_capability ) ? $editurl : false ),
[238] Fix | Delete
'stringresult' => $file,
[239] Fix | Delete
);
[240] Fix | Delete
}
[241] Fix | Delete
[242] Fix | Delete
$readfile = @fopen( $filename, 'r' );
[243] Fix | Delete
if ( $readfile ) {
[244] Fix | Delete
while ( ( $readline = fgets( $readfile ) ) !== false ) { // phpcs:ignore WordPress.CodeAnalysis.AssignmentInCondition.FoundInWhileCondition
[245] Fix | Delete
$linenum ++;
[246] Fix | Delete
/**
[247] Fix | Delete
* If our string is found in this line, output the line number and other data
[248] Fix | Delete
*/
[249] Fix | Delete
if ( ( ! $regex && stristr( $readline, $string ) ) || ( $regex && preg_match( $string, $readline, $match, PREG_OFFSET_CAPTURE ) ) ) {
[250] Fix | Delete
/**
[251] Fix | Delete
* Prepare the visual path for the end user
[252] Fix | Delete
* Removes path leading up to WordPress root and ensures consistent directory separators
[253] Fix | Delete
*/
[254] Fix | Delete
$relativepath = str_replace(
[255] Fix | Delete
array(
[256] Fix | Delete
ABSPATH,
[257] Fix | Delete
'\\',
[258] Fix | Delete
'/',
[259] Fix | Delete
),
[260] Fix | Delete
array(
[261] Fix | Delete
'',
[262] Fix | Delete
DIRECTORY_SEPARATOR,
[263] Fix | Delete
DIRECTORY_SEPARATOR,
[264] Fix | Delete
),
[265] Fix | Delete
$path
[266] Fix | Delete
);
[267] Fix | Delete
$match_count ++;
[268] Fix | Delete
[269] Fix | Delete
if ( $regex ) {
[270] Fix | Delete
$str_pos = $match[0][1];
[271] Fix | Delete
} else {
[272] Fix | Delete
$str_pos = stripos( $readline, $string );
[273] Fix | Delete
}
[274] Fix | Delete
[275] Fix | Delete
/**
[276] Fix | Delete
* Create the URL to take the user to the editor
[277] Fix | Delete
*/
[278] Fix | Delete
$editurl = $this->create_edit_link( $path, $linenum, $str_pos );
[279] Fix | Delete
[280] Fix | Delete
$string_preview = String_Locator::create_preview( $readline, $string, $regex );
[281] Fix | Delete
[282] Fix | Delete
$path_string = sprintf(
[283] Fix | Delete
'<a href="%s">%s</a>',
[284] Fix | Delete
esc_url( $editurl ),
[285] Fix | Delete
esc_html( $relativepath )
[286] Fix | Delete
);
[287] Fix | Delete
[288] Fix | Delete
$output[] = array(
[289] Fix | Delete
'ID' => $match_count,
[290] Fix | Delete
'linenum' => $linenum,
[291] Fix | Delete
'linepos' => $str_pos,
[292] Fix | Delete
'path' => $path,
[293] Fix | Delete
'filename' => $path_string,
[294] Fix | Delete
'filename_raw' => $relativepath,
[295] Fix | Delete
'editurl' => ( current_user_can( String_Locator::$default_capability ) ? $editurl : false ),
[296] Fix | Delete
'stringresult' => $string_preview,
[297] Fix | Delete
);
[298] Fix | Delete
}
[299] Fix | Delete
}
[300] Fix | Delete
[301] Fix | Delete
fclose( $readfile );
[302] Fix | Delete
} else {
[303] Fix | Delete
/**
[304] Fix | Delete
* The file was unreadable, give the user a friendly notification
[305] Fix | Delete
*/
[306] Fix | Delete
$output[] = array(
[307] Fix | Delete
'linenum' => '#',
[308] Fix | Delete
// translators: 1: Filename.
[309] Fix | Delete
'filename' => esc_html( sprintf( __( 'Could not read file: %s', 'string-locator' ), $filename ) ),
[310] Fix | Delete
'stringresult' => '',
[311] Fix | Delete
);
[312] Fix | Delete
}
[313] Fix | Delete
[314] Fix | Delete
return $output;
[315] Fix | Delete
}
[316] Fix | Delete
[317] Fix | Delete
/**
[318] Fix | Delete
* Create an admin edit link for the supplied path.
[319] Fix | Delete
*
[320] Fix | Delete
* @param string $path Path to the file we'er adding a link for.
[321] Fix | Delete
* @param int $line The line in the file where our search result was found.
[322] Fix | Delete
* @param int $linepos The positin in the line where the search result was found.
[323] Fix | Delete
*
[324] Fix | Delete
* @return string
[325] Fix | Delete
*/
[326] Fix | Delete
function create_edit_link( $path, $line = 0, $linepos = 0 ) {
[327] Fix | Delete
$file_type = 'core';
[328] Fix | Delete
$file_slug = '';
[329] Fix | Delete
$content_path = str_replace( '\\', '/', WP_CONTENT_DIR );
[330] Fix | Delete
[331] Fix | Delete
$path = str_replace( '\\', '/', $path );
[332] Fix | Delete
$paths = explode( '/', $path );
[333] Fix | Delete
[334] Fix | Delete
$url_args = array(
[335] Fix | Delete
'page=string-locator',
[336] Fix | Delete
'edit-file=' . end( $paths ),
[337] Fix | Delete
);
[338] Fix | Delete
[339] Fix | Delete
switch ( true ) {
[340] Fix | Delete
case ( in_array( 'wp-content', $paths, true ) && in_array( 'plugins', $paths, true ) ):
[341] Fix | Delete
$file_type = 'plugin';
[342] Fix | Delete
$content_path .= '/plugins/';
[343] Fix | Delete
break;
[344] Fix | Delete
case ( in_array( 'wp-content', $paths, true ) && in_array( 'themes', $paths, true ) ):
[345] Fix | Delete
$file_type = 'theme';
[346] Fix | Delete
$content_path .= '/themes/';
[347] Fix | Delete
break;
[348] Fix | Delete
}
[349] Fix | Delete
[350] Fix | Delete
$rel_path = str_replace( $content_path, '', $path );
[351] Fix | Delete
$rel_paths = explode( '/', $rel_path );
[352] Fix | Delete
[353] Fix | Delete
if ( 'core' !== $file_type ) {
[354] Fix | Delete
$file_slug = $rel_paths[0];
[355] Fix | Delete
}
[356] Fix | Delete
[357] Fix | Delete
$url_args[] = 'file-reference=' . $file_slug;
[358] Fix | Delete
$url_args[] = 'file-type=' . $file_type;
[359] Fix | Delete
$url_args[] = 'string-locator-line=' . absint( $line );
[360] Fix | Delete
$url_args[] = 'string-locator-linepos=' . absint( $linepos );
[361] Fix | Delete
$url_args[] = 'string-locator-path=' . urlencode( str_replace( '/', DIRECTORY_SEPARATOR, $path ) );
[362] Fix | Delete
[363] Fix | Delete
$url = admin_url( $this->path_to_use . '?' . implode( '&', $url_args ) );
[364] Fix | Delete
[365] Fix | Delete
return $url;
[366] Fix | Delete
}
[367] Fix | Delete
[368] Fix | Delete
}
[369] Fix | Delete
[370] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function