diff --git a/wordpress.org/public_html/wp-content/plugins/plugin-directory/shortcodes/class-upload.php b/wordpress.org/public_html/wp-content/plugins/plugin-directory/shortcodes/class-upload.php index ea5d8acb0e..c545fea943 100644 --- a/wordpress.org/public_html/wp-content/plugins/plugin-directory/shortcodes/class-upload.php +++ b/wordpress.org/public_html/wp-content/plugins/plugin-directory/shortcodes/class-upload.php @@ -97,8 +97,19 @@ public static function display() { wp_verify_nonce( $_POST['_wpnonce'], 'wporg-plugins-upload-' . $_POST['plugin_id'] ) ) ) { - $for_plugin = absint( $_POST['plugin_id'] ?? 0 ); - $upload_result = $uploader->process_upload( $for_plugin ); + $for_plugin = absint( $_POST['plugin_id'] ?? 0 ); + + // Lock to prevent duplicate submissions from double-clicks or page reloads + $lock_key = 'plugin_upload_lock_' . get_current_user_id() . '_' . $for_plugin; + if ( false === wp_cache_add( $lock_key, time(), 'wporg-plugins', 5 * MINUTE_IN_SECONDS ) ) { + $upload_result = new \WP_Error( + 'upload_in_progress', + __( 'Your previous upload is still being processed. Please wait a moment before trying again.', 'wporg-plugins' ) + ); + } else { + $upload_result = $uploader->process_upload( $for_plugin ); + wp_cache_delete( $lock_key, 'wporg-plugins' ); + } if ( is_wp_error( $upload_result ) ) { $type = 'error'; @@ -368,7 +379,7 @@ public static function display() { - + '; @@ -569,7 +580,7 @@ public static function display() {

- +