Edit File by line
/home/zeestwma/redstone.../wp-admin/includes
File: file.php
}
[1500] Fix | Delete
[1501] Fix | Delete
if ( sodium_crypto_sign_verify_detached( $signature_raw, $file_hash, $key_raw ) ) {
[1502] Fix | Delete
reset_mbstring_encoding();
[1503] Fix | Delete
return true;
[1504] Fix | Delete
}
[1505] Fix | Delete
}
[1506] Fix | Delete
}
[1507] Fix | Delete
[1508] Fix | Delete
reset_mbstring_encoding();
[1509] Fix | Delete
[1510] Fix | Delete
return new WP_Error(
[1511] Fix | Delete
'signature_verification_failed',
[1512] Fix | Delete
sprintf(
[1513] Fix | Delete
/* translators: %s: The filename of the package. */
[1514] Fix | Delete
__( 'The authenticity of %s could not be verified.' ),
[1515] Fix | Delete
'<span class="code">' . esc_html( $filename_for_errors ) . '</span>'
[1516] Fix | Delete
),
[1517] Fix | Delete
// Error data helpful for debugging:
[1518] Fix | Delete
array(
[1519] Fix | Delete
'filename' => $filename_for_errors,
[1520] Fix | Delete
'keys' => $trusted_keys,
[1521] Fix | Delete
'signatures' => $signatures,
[1522] Fix | Delete
'hash' => bin2hex( $file_hash ),
[1523] Fix | Delete
'skipped_key' => $skipped_key,
[1524] Fix | Delete
'skipped_sig' => $skipped_signature,
[1525] Fix | Delete
'php' => PHP_VERSION,
[1526] Fix | Delete
'sodium' => defined( 'SODIUM_LIBRARY_VERSION' ) ? SODIUM_LIBRARY_VERSION : ( defined( 'ParagonIE_Sodium_Compat::VERSION_STRING' ) ? ParagonIE_Sodium_Compat::VERSION_STRING : false ),
[1527] Fix | Delete
)
[1528] Fix | Delete
);
[1529] Fix | Delete
}
[1530] Fix | Delete
[1531] Fix | Delete
/**
[1532] Fix | Delete
* Retrieves the list of signing keys trusted by WordPress.
[1533] Fix | Delete
*
[1534] Fix | Delete
* @since 5.2.0
[1535] Fix | Delete
*
[1536] Fix | Delete
* @return string[] Array of base64-encoded signing keys.
[1537] Fix | Delete
*/
[1538] Fix | Delete
function wp_trusted_keys() {
[1539] Fix | Delete
$trusted_keys = array();
[1540] Fix | Delete
[1541] Fix | Delete
if ( time() < 1617235200 ) {
[1542] Fix | Delete
// WordPress.org Key #1 - This key is only valid before April 1st, 2021.
[1543] Fix | Delete
$trusted_keys[] = 'fRPyrxb/MvVLbdsYi+OOEv4xc+Eqpsj+kkAS6gNOkI0=';
[1544] Fix | Delete
}
[1545] Fix | Delete
[1546] Fix | Delete
// TODO: Add key #2 with longer expiration.
[1547] Fix | Delete
[1548] Fix | Delete
/**
[1549] Fix | Delete
* Filters the valid signing keys used to verify the contents of files.
[1550] Fix | Delete
*
[1551] Fix | Delete
* @since 5.2.0
[1552] Fix | Delete
*
[1553] Fix | Delete
* @param string[] $trusted_keys The trusted keys that may sign packages.
[1554] Fix | Delete
*/
[1555] Fix | Delete
return apply_filters( 'wp_trusted_keys', $trusted_keys );
[1556] Fix | Delete
}
[1557] Fix | Delete
[1558] Fix | Delete
/**
[1559] Fix | Delete
* Determines whether the given file is a valid ZIP file.
[1560] Fix | Delete
*
[1561] Fix | Delete
* This function does not test to ensure that a file exists. Non-existent files
[1562] Fix | Delete
* are not valid ZIPs, so those will also return false.
[1563] Fix | Delete
*
[1564] Fix | Delete
* @since 6.4.4
[1565] Fix | Delete
*
[1566] Fix | Delete
* @param string $file Full path to the ZIP file.
[1567] Fix | Delete
* @return bool Whether the file is a valid ZIP file.
[1568] Fix | Delete
*/
[1569] Fix | Delete
function wp_zip_file_is_valid( $file ) {
[1570] Fix | Delete
/** This filter is documented in wp-admin/includes/file.php */
[1571] Fix | Delete
if ( class_exists( 'ZipArchive', false ) && apply_filters( 'unzip_file_use_ziparchive', true ) ) {
[1572] Fix | Delete
$archive = new ZipArchive();
[1573] Fix | Delete
$archive_is_valid = $archive->open( $file, ZipArchive::CHECKCONS );
[1574] Fix | Delete
if ( true === $archive_is_valid ) {
[1575] Fix | Delete
$archive->close();
[1576] Fix | Delete
return true;
[1577] Fix | Delete
}
[1578] Fix | Delete
}
[1579] Fix | Delete
[1580] Fix | Delete
// Fall through to PclZip if ZipArchive is not available, or encountered an error opening the file.
[1581] Fix | Delete
require_once ABSPATH . 'wp-admin/includes/class-pclzip.php';
[1582] Fix | Delete
[1583] Fix | Delete
$archive = new PclZip( $file );
[1584] Fix | Delete
$archive_is_valid = is_array( $archive->properties() );
[1585] Fix | Delete
[1586] Fix | Delete
return $archive_is_valid;
[1587] Fix | Delete
}
[1588] Fix | Delete
[1589] Fix | Delete
/**
[1590] Fix | Delete
* Unzips a specified ZIP file to a location on the filesystem via the WordPress
[1591] Fix | Delete
* Filesystem Abstraction.
[1592] Fix | Delete
*
[1593] Fix | Delete
* Assumes that WP_Filesystem() has already been called and set up. Does not extract
[1594] Fix | Delete
* a root-level __MACOSX directory, if present.
[1595] Fix | Delete
*
[1596] Fix | Delete
* Attempts to increase the PHP memory limit to 256M before uncompressing. However,
[1597] Fix | Delete
* the most memory required shouldn't be much larger than the archive itself.
[1598] Fix | Delete
*
[1599] Fix | Delete
* @since 2.5.0
[1600] Fix | Delete
*
[1601] Fix | Delete
* @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
[1602] Fix | Delete
*
[1603] Fix | Delete
* @param string $file Full path and filename of ZIP archive.
[1604] Fix | Delete
* @param string $to Full path on the filesystem to extract archive to.
[1605] Fix | Delete
* @return true|WP_Error True on success, WP_Error on failure.
[1606] Fix | Delete
*/
[1607] Fix | Delete
function unzip_file( $file, $to ) {
[1608] Fix | Delete
global $wp_filesystem;
[1609] Fix | Delete
[1610] Fix | Delete
if ( ! $wp_filesystem || ! is_object( $wp_filesystem ) ) {
[1611] Fix | Delete
return new WP_Error( 'fs_unavailable', __( 'Could not access filesystem.' ) );
[1612] Fix | Delete
}
[1613] Fix | Delete
[1614] Fix | Delete
// Unzip can use a lot of memory, but not this much hopefully.
[1615] Fix | Delete
wp_raise_memory_limit( 'admin' );
[1616] Fix | Delete
[1617] Fix | Delete
$needed_dirs = array();
[1618] Fix | Delete
$to = trailingslashit( $to );
[1619] Fix | Delete
[1620] Fix | Delete
// Determine any parent directories needed (of the upgrade directory).
[1621] Fix | Delete
if ( ! $wp_filesystem->is_dir( $to ) ) { // Only do parents if no children exist.
[1622] Fix | Delete
$path = preg_split( '![/\\\]!', untrailingslashit( $to ) );
[1623] Fix | Delete
for ( $i = count( $path ); $i >= 0; $i-- ) {
[1624] Fix | Delete
if ( empty( $path[ $i ] ) ) {
[1625] Fix | Delete
continue;
[1626] Fix | Delete
}
[1627] Fix | Delete
[1628] Fix | Delete
$dir = implode( '/', array_slice( $path, 0, $i + 1 ) );
[1629] Fix | Delete
if ( preg_match( '!^[a-z]:$!i', $dir ) ) { // Skip it if it looks like a Windows Drive letter.
[1630] Fix | Delete
continue;
[1631] Fix | Delete
}
[1632] Fix | Delete
[1633] Fix | Delete
if ( ! $wp_filesystem->is_dir( $dir ) ) {
[1634] Fix | Delete
$needed_dirs[] = $dir;
[1635] Fix | Delete
} else {
[1636] Fix | Delete
break; // A folder exists, therefore we don't need to check the levels below this.
[1637] Fix | Delete
}
[1638] Fix | Delete
}
[1639] Fix | Delete
}
[1640] Fix | Delete
[1641] Fix | Delete
/**
[1642] Fix | Delete
* Filters whether to use ZipArchive to unzip archives.
[1643] Fix | Delete
*
[1644] Fix | Delete
* @since 3.0.0
[1645] Fix | Delete
*
[1646] Fix | Delete
* @param bool $ziparchive Whether to use ZipArchive. Default true.
[1647] Fix | Delete
*/
[1648] Fix | Delete
if ( class_exists( 'ZipArchive', false ) && apply_filters( 'unzip_file_use_ziparchive', true ) ) {
[1649] Fix | Delete
$result = _unzip_file_ziparchive( $file, $to, $needed_dirs );
[1650] Fix | Delete
if ( true === $result ) {
[1651] Fix | Delete
return $result;
[1652] Fix | Delete
} elseif ( is_wp_error( $result ) ) {
[1653] Fix | Delete
if ( 'incompatible_archive' !== $result->get_error_code() ) {
[1654] Fix | Delete
return $result;
[1655] Fix | Delete
}
[1656] Fix | Delete
}
[1657] Fix | Delete
}
[1658] Fix | Delete
// Fall through to PclZip if ZipArchive is not available, or encountered an error opening the file.
[1659] Fix | Delete
return _unzip_file_pclzip( $file, $to, $needed_dirs );
[1660] Fix | Delete
}
[1661] Fix | Delete
[1662] Fix | Delete
/**
[1663] Fix | Delete
* Attempts to unzip an archive using the ZipArchive class.
[1664] Fix | Delete
*
[1665] Fix | Delete
* This function should not be called directly, use `unzip_file()` instead.
[1666] Fix | Delete
*
[1667] Fix | Delete
* Assumes that WP_Filesystem() has already been called and set up.
[1668] Fix | Delete
*
[1669] Fix | Delete
* @since 3.0.0
[1670] Fix | Delete
* @access private
[1671] Fix | Delete
*
[1672] Fix | Delete
* @see unzip_file()
[1673] Fix | Delete
*
[1674] Fix | Delete
* @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
[1675] Fix | Delete
*
[1676] Fix | Delete
* @param string $file Full path and filename of ZIP archive.
[1677] Fix | Delete
* @param string $to Full path on the filesystem to extract archive to.
[1678] Fix | Delete
* @param string[] $needed_dirs A partial list of required folders needed to be created.
[1679] Fix | Delete
* @return true|WP_Error True on success, WP_Error on failure.
[1680] Fix | Delete
*/
[1681] Fix | Delete
function _unzip_file_ziparchive( $file, $to, $needed_dirs = array() ) {
[1682] Fix | Delete
global $wp_filesystem;
[1683] Fix | Delete
[1684] Fix | Delete
$z = new ZipArchive();
[1685] Fix | Delete
[1686] Fix | Delete
$zopen = $z->open( $file, ZIPARCHIVE::CHECKCONS );
[1687] Fix | Delete
[1688] Fix | Delete
if ( true !== $zopen ) {
[1689] Fix | Delete
return new WP_Error( 'incompatible_archive', __( 'Incompatible Archive.' ), array( 'ziparchive_error' => $zopen ) );
[1690] Fix | Delete
}
[1691] Fix | Delete
[1692] Fix | Delete
$uncompressed_size = 0;
[1693] Fix | Delete
[1694] Fix | Delete
for ( $i = 0; $i < $z->numFiles; $i++ ) {
[1695] Fix | Delete
$info = $z->statIndex( $i );
[1696] Fix | Delete
[1697] Fix | Delete
if ( ! $info ) {
[1698] Fix | Delete
$z->close();
[1699] Fix | Delete
return new WP_Error( 'stat_failed_ziparchive', __( 'Could not retrieve file from archive.' ) );
[1700] Fix | Delete
}
[1701] Fix | Delete
[1702] Fix | Delete
if ( str_starts_with( $info['name'], '__MACOSX/' ) ) { // Skip the OS X-created __MACOSX directory.
[1703] Fix | Delete
continue;
[1704] Fix | Delete
}
[1705] Fix | Delete
[1706] Fix | Delete
// Don't extract invalid files:
[1707] Fix | Delete
if ( 0 !== validate_file( $info['name'] ) ) {
[1708] Fix | Delete
continue;
[1709] Fix | Delete
}
[1710] Fix | Delete
[1711] Fix | Delete
$uncompressed_size += $info['size'];
[1712] Fix | Delete
[1713] Fix | Delete
$dirname = dirname( $info['name'] );
[1714] Fix | Delete
[1715] Fix | Delete
if ( str_ends_with( $info['name'], '/' ) ) {
[1716] Fix | Delete
// Directory.
[1717] Fix | Delete
$needed_dirs[] = $to . untrailingslashit( $info['name'] );
[1718] Fix | Delete
} elseif ( '.' !== $dirname ) {
[1719] Fix | Delete
// Path to a file.
[1720] Fix | Delete
$needed_dirs[] = $to . untrailingslashit( $dirname );
[1721] Fix | Delete
}
[1722] Fix | Delete
}
[1723] Fix | Delete
[1724] Fix | Delete
// Enough space to unzip the file and copy its contents, with a 10% buffer.
[1725] Fix | Delete
$required_space = $uncompressed_size * 2.1;
[1726] Fix | Delete
[1727] Fix | Delete
/*
[1728] Fix | Delete
* disk_free_space() could return false. Assume that any falsey value is an error.
[1729] Fix | Delete
* A disk that has zero free bytes has bigger problems.
[1730] Fix | Delete
* Require we have enough space to unzip the file and copy its contents, with a 10% buffer.
[1731] Fix | Delete
*/
[1732] Fix | Delete
if ( wp_doing_cron() ) {
[1733] Fix | Delete
$available_space = function_exists( 'disk_free_space' ) ? @disk_free_space( WP_CONTENT_DIR ) : false;
[1734] Fix | Delete
[1735] Fix | Delete
if ( $available_space && ( $required_space > $available_space ) ) {
[1736] Fix | Delete
$z->close();
[1737] Fix | Delete
return new WP_Error(
[1738] Fix | Delete
'disk_full_unzip_file',
[1739] Fix | Delete
__( 'Could not copy files. You may have run out of disk space.' ),
[1740] Fix | Delete
compact( 'uncompressed_size', 'available_space' )
[1741] Fix | Delete
);
[1742] Fix | Delete
}
[1743] Fix | Delete
}
[1744] Fix | Delete
[1745] Fix | Delete
$needed_dirs = array_unique( $needed_dirs );
[1746] Fix | Delete
[1747] Fix | Delete
foreach ( $needed_dirs as $dir ) {
[1748] Fix | Delete
// Check the parent folders of the folders all exist within the creation array.
[1749] Fix | Delete
if ( untrailingslashit( $to ) === $dir ) { // Skip over the working directory, we know this exists (or will exist).
[1750] Fix | Delete
continue;
[1751] Fix | Delete
}
[1752] Fix | Delete
[1753] Fix | Delete
if ( ! str_contains( $dir, $to ) ) { // If the directory is not within the working directory, skip it.
[1754] Fix | Delete
continue;
[1755] Fix | Delete
}
[1756] Fix | Delete
[1757] Fix | Delete
$parent_folder = dirname( $dir );
[1758] Fix | Delete
[1759] Fix | Delete
while ( ! empty( $parent_folder )
[1760] Fix | Delete
&& untrailingslashit( $to ) !== $parent_folder
[1761] Fix | Delete
&& ! in_array( $parent_folder, $needed_dirs, true )
[1762] Fix | Delete
) {
[1763] Fix | Delete
$needed_dirs[] = $parent_folder;
[1764] Fix | Delete
$parent_folder = dirname( $parent_folder );
[1765] Fix | Delete
}
[1766] Fix | Delete
}
[1767] Fix | Delete
[1768] Fix | Delete
asort( $needed_dirs );
[1769] Fix | Delete
[1770] Fix | Delete
// Create those directories if need be:
[1771] Fix | Delete
foreach ( $needed_dirs as $_dir ) {
[1772] Fix | Delete
// Only check to see if the Dir exists upon creation failure. Less I/O this way.
[1773] Fix | Delete
if ( ! $wp_filesystem->mkdir( $_dir, FS_CHMOD_DIR ) && ! $wp_filesystem->is_dir( $_dir ) ) {
[1774] Fix | Delete
$z->close();
[1775] Fix | Delete
return new WP_Error( 'mkdir_failed_ziparchive', __( 'Could not create directory.' ), $_dir );
[1776] Fix | Delete
}
[1777] Fix | Delete
}
[1778] Fix | Delete
[1779] Fix | Delete
/**
[1780] Fix | Delete
* Filters archive unzipping to override with a custom process.
[1781] Fix | Delete
*
[1782] Fix | Delete
* @since 6.4.0
[1783] Fix | Delete
*
[1784] Fix | Delete
* @param null|true|WP_Error $result The result of the override. True on success, otherwise WP Error. Default null.
[1785] Fix | Delete
* @param string $file Full path and filename of ZIP archive.
[1786] Fix | Delete
* @param string $to Full path on the filesystem to extract archive to.
[1787] Fix | Delete
* @param string[] $needed_dirs A full list of required folders that need to be created.
[1788] Fix | Delete
* @param float $required_space The space required to unzip the file and copy its contents, with a 10% buffer.
[1789] Fix | Delete
*/
[1790] Fix | Delete
$pre = apply_filters( 'pre_unzip_file', null, $file, $to, $needed_dirs, $required_space );
[1791] Fix | Delete
[1792] Fix | Delete
if ( null !== $pre ) {
[1793] Fix | Delete
// Ensure the ZIP file archive has been closed.
[1794] Fix | Delete
$z->close();
[1795] Fix | Delete
[1796] Fix | Delete
return $pre;
[1797] Fix | Delete
}
[1798] Fix | Delete
[1799] Fix | Delete
for ( $i = 0; $i < $z->numFiles; $i++ ) {
[1800] Fix | Delete
$info = $z->statIndex( $i );
[1801] Fix | Delete
[1802] Fix | Delete
if ( ! $info ) {
[1803] Fix | Delete
$z->close();
[1804] Fix | Delete
return new WP_Error( 'stat_failed_ziparchive', __( 'Could not retrieve file from archive.' ) );
[1805] Fix | Delete
}
[1806] Fix | Delete
[1807] Fix | Delete
if ( str_ends_with( $info['name'], '/' ) ) { // Directory.
[1808] Fix | Delete
continue;
[1809] Fix | Delete
}
[1810] Fix | Delete
[1811] Fix | Delete
if ( str_starts_with( $info['name'], '__MACOSX/' ) ) { // Don't extract the OS X-created __MACOSX directory files.
[1812] Fix | Delete
continue;
[1813] Fix | Delete
}
[1814] Fix | Delete
[1815] Fix | Delete
// Don't extract invalid files:
[1816] Fix | Delete
if ( 0 !== validate_file( $info['name'] ) ) {
[1817] Fix | Delete
continue;
[1818] Fix | Delete
}
[1819] Fix | Delete
[1820] Fix | Delete
$contents = $z->getFromIndex( $i );
[1821] Fix | Delete
[1822] Fix | Delete
if ( false === $contents ) {
[1823] Fix | Delete
$z->close();
[1824] Fix | Delete
return new WP_Error( 'extract_failed_ziparchive', __( 'Could not extract file from archive.' ), $info['name'] );
[1825] Fix | Delete
}
[1826] Fix | Delete
[1827] Fix | Delete
if ( ! $wp_filesystem->put_contents( $to . $info['name'], $contents, FS_CHMOD_FILE ) ) {
[1828] Fix | Delete
$z->close();
[1829] Fix | Delete
return new WP_Error( 'copy_failed_ziparchive', __( 'Could not copy file.' ), $info['name'] );
[1830] Fix | Delete
}
[1831] Fix | Delete
}
[1832] Fix | Delete
[1833] Fix | Delete
$z->close();
[1834] Fix | Delete
[1835] Fix | Delete
/**
[1836] Fix | Delete
* Filters the result of unzipping an archive.
[1837] Fix | Delete
*
[1838] Fix | Delete
* @since 6.4.0
[1839] Fix | Delete
*
[1840] Fix | Delete
* @param true|WP_Error $result The result of unzipping the archive. True on success, otherwise WP_Error. Default true.
[1841] Fix | Delete
* @param string $file Full path and filename of ZIP archive.
[1842] Fix | Delete
* @param string $to Full path on the filesystem the archive was extracted to.
[1843] Fix | Delete
* @param string[] $needed_dirs A full list of required folders that were created.
[1844] Fix | Delete
* @param float $required_space The space required to unzip the file and copy its contents, with a 10% buffer.
[1845] Fix | Delete
*/
[1846] Fix | Delete
$result = apply_filters( 'unzip_file', true, $file, $to, $needed_dirs, $required_space );
[1847] Fix | Delete
[1848] Fix | Delete
unset( $needed_dirs );
[1849] Fix | Delete
[1850] Fix | Delete
return $result;
[1851] Fix | Delete
}
[1852] Fix | Delete
[1853] Fix | Delete
/**
[1854] Fix | Delete
* Attempts to unzip an archive using the PclZip library.
[1855] Fix | Delete
*
[1856] Fix | Delete
* This function should not be called directly, use `unzip_file()` instead.
[1857] Fix | Delete
*
[1858] Fix | Delete
* Assumes that WP_Filesystem() has already been called and set up.
[1859] Fix | Delete
*
[1860] Fix | Delete
* @since 3.0.0
[1861] Fix | Delete
* @access private
[1862] Fix | Delete
*
[1863] Fix | Delete
* @see unzip_file()
[1864] Fix | Delete
*
[1865] Fix | Delete
* @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
[1866] Fix | Delete
*
[1867] Fix | Delete
* @param string $file Full path and filename of ZIP archive.
[1868] Fix | Delete
* @param string $to Full path on the filesystem to extract archive to.
[1869] Fix | Delete
* @param string[] $needed_dirs A partial list of required folders needed to be created.
[1870] Fix | Delete
* @return true|WP_Error True on success, WP_Error on failure.
[1871] Fix | Delete
*/
[1872] Fix | Delete
function _unzip_file_pclzip( $file, $to, $needed_dirs = array() ) {
[1873] Fix | Delete
global $wp_filesystem;
[1874] Fix | Delete
[1875] Fix | Delete
mbstring_binary_safe_encoding();
[1876] Fix | Delete
[1877] Fix | Delete
require_once ABSPATH . 'wp-admin/includes/class-pclzip.php';
[1878] Fix | Delete
[1879] Fix | Delete
$archive = new PclZip( $file );
[1880] Fix | Delete
[1881] Fix | Delete
$archive_files = $archive->extract( PCLZIP_OPT_EXTRACT_AS_STRING );
[1882] Fix | Delete
[1883] Fix | Delete
reset_mbstring_encoding();
[1884] Fix | Delete
[1885] Fix | Delete
// Is the archive valid?
[1886] Fix | Delete
if ( ! is_array( $archive_files ) ) {
[1887] Fix | Delete
return new WP_Error( 'incompatible_archive', __( 'Incompatible Archive.' ), $archive->errorInfo( true ) );
[1888] Fix | Delete
}
[1889] Fix | Delete
[1890] Fix | Delete
if ( 0 === count( $archive_files ) ) {
[1891] Fix | Delete
return new WP_Error( 'empty_archive_pclzip', __( 'Empty archive.' ) );
[1892] Fix | Delete
}
[1893] Fix | Delete
[1894] Fix | Delete
$uncompressed_size = 0;
[1895] Fix | Delete
[1896] Fix | Delete
// Determine any children directories needed (From within the archive).
[1897] Fix | Delete
foreach ( $archive_files as $file ) {
[1898] Fix | Delete
if ( str_starts_with( $file['filename'], '__MACOSX/' ) ) { // Skip the OS X-created __MACOSX directory.
[1899] Fix | Delete
continue;
[1900] Fix | Delete
}
[1901] Fix | Delete
[1902] Fix | Delete
$uncompressed_size += $file['size'];
[1903] Fix | Delete
[1904] Fix | Delete
$needed_dirs[] = $to . untrailingslashit( $file['folder'] ? $file['filename'] : dirname( $file['filename'] ) );
[1905] Fix | Delete
}
[1906] Fix | Delete
[1907] Fix | Delete
// Enough space to unzip the file and copy its contents, with a 10% buffer.
[1908] Fix | Delete
$required_space = $uncompressed_size * 2.1;
[1909] Fix | Delete
[1910] Fix | Delete
/*
[1911] Fix | Delete
* disk_free_space() could return false. Assume that any falsey value is an error.
[1912] Fix | Delete
* A disk that has zero free bytes has bigger problems.
[1913] Fix | Delete
* Require we have enough space to unzip the file and copy its contents, with a 10% buffer.
[1914] Fix | Delete
*/
[1915] Fix | Delete
if ( wp_doing_cron() ) {
[1916] Fix | Delete
$available_space = function_exists( 'disk_free_space' ) ? @disk_free_space( WP_CONTENT_DIR ) : false;
[1917] Fix | Delete
[1918] Fix | Delete
if ( $available_space && ( $required_space > $available_space ) ) {
[1919] Fix | Delete
return new WP_Error(
[1920] Fix | Delete
'disk_full_unzip_file',
[1921] Fix | Delete
__( 'Could not copy files. You may have run out of disk space.' ),
[1922] Fix | Delete
compact( 'uncompressed_size', 'available_space' )
[1923] Fix | Delete
);
[1924] Fix | Delete
}
[1925] Fix | Delete
}
[1926] Fix | Delete
[1927] Fix | Delete
$needed_dirs = array_unique( $needed_dirs );
[1928] Fix | Delete
[1929] Fix | Delete
foreach ( $needed_dirs as $dir ) {
[1930] Fix | Delete
// Check the parent folders of the folders all exist within the creation array.
[1931] Fix | Delete
if ( untrailingslashit( $to ) === $dir ) { // Skip over the working directory, we know this exists (or will exist).
[1932] Fix | Delete
continue;
[1933] Fix | Delete
}
[1934] Fix | Delete
[1935] Fix | Delete
if ( ! str_contains( $dir, $to ) ) { // If the directory is not within the working directory, skip it.
[1936] Fix | Delete
continue;
[1937] Fix | Delete
}
[1938] Fix | Delete
[1939] Fix | Delete
$parent_folder = dirname( $dir );
[1940] Fix | Delete
[1941] Fix | Delete
while ( ! empty( $parent_folder )
[1942] Fix | Delete
&& untrailingslashit( $to ) !== $parent_folder
[1943] Fix | Delete
&& ! in_array( $parent_folder, $needed_dirs, true )
[1944] Fix | Delete
) {
[1945] Fix | Delete
$needed_dirs[] = $parent_folder;
[1946] Fix | Delete
$parent_folder = dirname( $parent_folder );
[1947] Fix | Delete
}
[1948] Fix | Delete
}
[1949] Fix | Delete
[1950] Fix | Delete
asort( $needed_dirs );
[1951] Fix | Delete
[1952] Fix | Delete
// Create those directories if need be:
[1953] Fix | Delete
foreach ( $needed_dirs as $_dir ) {
[1954] Fix | Delete
// Only check to see if the dir exists upon creation failure. Less I/O this way.
[1955] Fix | Delete
if ( ! $wp_filesystem->mkdir( $_dir, FS_CHMOD_DIR ) && ! $wp_filesystem->is_dir( $_dir ) ) {
[1956] Fix | Delete
return new WP_Error( 'mkdir_failed_pclzip', __( 'Could not create directory.' ), $_dir );
[1957] Fix | Delete
}
[1958] Fix | Delete
}
[1959] Fix | Delete
[1960] Fix | Delete
/** This filter is documented in src/wp-admin/includes/file.php */
[1961] Fix | Delete
$pre = apply_filters( 'pre_unzip_file', null, $file, $to, $needed_dirs, $required_space );
[1962] Fix | Delete
[1963] Fix | Delete
if ( null !== $pre ) {
[1964] Fix | Delete
return $pre;
[1965] Fix | Delete
}
[1966] Fix | Delete
[1967] Fix | Delete
// Extract the files from the zip.
[1968] Fix | Delete
foreach ( $archive_files as $file ) {
[1969] Fix | Delete
if ( $file['folder'] ) {
[1970] Fix | Delete
continue;
[1971] Fix | Delete
}
[1972] Fix | Delete
[1973] Fix | Delete
if ( str_starts_with( $file['filename'], '__MACOSX/' ) ) { // Don't extract the OS X-created __MACOSX directory files.
[1974] Fix | Delete
continue;
[1975] Fix | Delete
}
[1976] Fix | Delete
[1977] Fix | Delete
// Don't extract invalid files:
[1978] Fix | Delete
if ( 0 !== validate_file( $file['filename'] ) ) {
[1979] Fix | Delete
continue;
[1980] Fix | Delete
}
[1981] Fix | Delete
[1982] Fix | Delete
if ( ! $wp_filesystem->put_contents( $to . $file['filename'], $file['content'], FS_CHMOD_FILE ) ) {
[1983] Fix | Delete
return new WP_Error( 'copy_failed_pclzip', __( 'Could not copy file.' ), $file['filename'] );
[1984] Fix | Delete
}
[1985] Fix | Delete
}
[1986] Fix | Delete
[1987] Fix | Delete
/** This action is documented in src/wp-admin/includes/file.php */
[1988] Fix | Delete
$result = apply_filters( 'unzip_file', true, $file, $to, $needed_dirs, $required_space );
[1989] Fix | Delete
[1990] Fix | Delete
unset( $needed_dirs );
[1991] Fix | Delete
[1992] Fix | Delete
return $result;
[1993] Fix | Delete
}
[1994] Fix | Delete
[1995] Fix | Delete
/**
[1996] Fix | Delete
* Copies a directory from one location to another via the WordPress Filesystem
[1997] Fix | Delete
* Abstraction.
[1998] Fix | Delete
*
[1999] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function