summaryrefslogtreecommitdiffstats
path: root/wp-includes/ms-files.php
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 07:56:49 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 07:56:49 +0000
commita415c29efee45520ae252d2aa28f1083a521cd7b (patch)
treef4ade4b6668ecc0765de7e1424f7c1427ad433ff /wp-includes/ms-files.php
parentInitial commit. (diff)
downloadwordpress-a415c29efee45520ae252d2aa28f1083a521cd7b.tar.xz
wordpress-a415c29efee45520ae252d2aa28f1083a521cd7b.zip
Adding upstream version 6.4.3+dfsg1.upstream/6.4.3+dfsg1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'wp-includes/ms-files.php')
-rw-r--r--wp-includes/ms-files.php93
1 files changed, 93 insertions, 0 deletions
diff --git a/wp-includes/ms-files.php b/wp-includes/ms-files.php
new file mode 100644
index 0000000..2efe452
--- /dev/null
+++ b/wp-includes/ms-files.php
@@ -0,0 +1,93 @@
+<?php
+/**
+ * Multisite upload handler.
+ *
+ * @since 3.0.0
+ *
+ * @package WordPress
+ * @subpackage Multisite
+ */
+
+define( 'MS_FILES_REQUEST', true );
+define( 'SHORTINIT', true );
+require_once dirname( __DIR__ ) . '/wp-load.php';
+
+if ( ! is_multisite() ) {
+ die( 'Multisite support not enabled' );
+}
+
+ms_file_constants();
+
+if ( '1' === $current_blog->archived || '1' === $current_blog->spam || '1' === $current_blog->deleted ) {
+ status_header( 404 );
+ die( '404 &#8212; File not found.' );
+}
+
+$file = rtrim( BLOGUPLOADDIR, '/' ) . '/' . str_replace( '..', '', $_GET['file'] );
+if ( ! is_file( $file ) ) {
+ status_header( 404 );
+ die( '404 &#8212; File not found.' );
+}
+
+$mime = wp_check_filetype( $file );
+if ( false === $mime['type'] && function_exists( 'mime_content_type' ) ) {
+ $mime['type'] = mime_content_type( $file );
+}
+
+if ( $mime['type'] ) {
+ $mimetype = $mime['type'];
+} else {
+ $mimetype = 'image/' . substr( $file, strrpos( $file, '.' ) + 1 );
+}
+
+header( 'Content-Type: ' . $mimetype ); // Always send this.
+if ( ! str_contains( $_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS' ) ) {
+ header( 'Content-Length: ' . filesize( $file ) );
+}
+
+// Optional support for X-Sendfile and X-Accel-Redirect.
+if ( WPMU_ACCEL_REDIRECT ) {
+ header( 'X-Accel-Redirect: ' . str_replace( WP_CONTENT_DIR, '', $file ) );
+ exit;
+} elseif ( WPMU_SENDFILE ) {
+ header( 'X-Sendfile: ' . $file );
+ exit;
+}
+
+$wp_last_modified = gmdate( 'D, d M Y H:i:s', filemtime( $file ) );
+$wp_etag = '"' . md5( $wp_last_modified ) . '"';
+
+header( "Last-Modified: $wp_last_modified GMT" );
+header( 'ETag: ' . $wp_etag );
+header( 'Expires: ' . gmdate( 'D, d M Y H:i:s', time() + 100000000 ) . ' GMT' );
+
+// Support for conditional GET - use stripslashes() to avoid formatting.php dependency.
+if ( isset( $_SERVER['HTTP_IF_NONE_MATCH'] ) ) {
+ $client_etag = stripslashes( $_SERVER['HTTP_IF_NONE_MATCH'] );
+} else {
+ $client_etag = '';
+}
+
+if ( isset( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ) ) {
+ $client_last_modified = trim( $_SERVER['HTTP_IF_MODIFIED_SINCE'] );
+} else {
+ $client_last_modified = '';
+}
+
+// If string is empty, return 0. If not, attempt to parse into a timestamp.
+$client_modified_timestamp = $client_last_modified ? strtotime( $client_last_modified ) : 0;
+
+// Make a timestamp for our most recent modification.
+$wp_modified_timestamp = strtotime( $wp_last_modified );
+
+if ( ( $client_last_modified && $client_etag )
+ ? ( ( $client_modified_timestamp >= $wp_modified_timestamp ) && ( $client_etag === $wp_etag ) )
+ : ( ( $client_modified_timestamp >= $wp_modified_timestamp ) || ( $client_etag === $wp_etag ) )
+) {
+ status_header( 304 );
+ exit;
+}
+
+// If we made it this far, just serve the file.
+readfile( $file );
+flush();