<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[12165] sites/trunk/wordpress.org/public_html/wp-content/plugins/plugin-directory/shortcodes/class-upload-handler.php: Plugin Directory: Upload checks: Prevent an upload of a plugin with a matching title/name (both in the plugin.php and readme.txt files).</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { white-space: pre-line; overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="http://meta.trac.wordpress.org/changeset/12165">12165</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"http://meta.trac.wordpress.org/changeset/12165","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>dd32</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2022-10-31 04:46:26 +0000 (Mon, 31 Oct 2022)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>Plugin Directory: Upload checks: Prevent an upload of a plugin with a matching title/name (both in the plugin.php and readme.txt files).

Fixes <a href="http://meta.trac.wordpress.org/ticket/5880">#5880</a>.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#sitestrunkwordpressorgpublic_htmlwpcontentpluginsplugindirectoryshortcodesclassuploadhandlerphp">sites/trunk/wordpress.org/public_html/wp-content/plugins/plugin-directory/shortcodes/class-upload-handler.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="sitestrunkwordpressorgpublic_htmlwpcontentpluginsplugindirectoryshortcodesclassuploadhandlerphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: sites/trunk/wordpress.org/public_html/wp-content/plugins/plugin-directory/shortcodes/class-upload-handler.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/wordpress.org/public_html/wp-content/plugins/plugin-directory/shortcodes/class-upload-handler.php     2022-10-31 04:26:54 UTC (rev 12164)
+++ sites/trunk/wordpress.org/public_html/wp-content/plugins/plugin-directory/shortcodes/class-upload-handler.php       2022-10-31 04:46:26 UTC (rev 12165)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -144,6 +144,19 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $plugin_post = Plugin_Directory::get_plugin_post( $this->plugin_slug );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                // If no matching plugin by that slug, check to see if a plugin exists with that Title in the database.
+               if ( ! $plugin_post ) {
+                       $plugin_posts = get_posts( array(
+                               'post_type'   => 'plugin',
+                               'title'       => $this->plugin['Name'],
+                               'post_status' => array( 'publish', 'pending', 'disabled', 'closed', 'new', 'draft', 'approved' ),
+                       ) );
+
+                       if ( $plugin_posts ) {
+                               $plugin_post = array_shift( $plugin_posts );
+                       }
+               }
+
</ins><span class="cx" style="display: block; padding: 0 10px">                 // Is there already a plugin with the same slug by a different author?
</span><span class="cx" style="display: block; padding: 0 10px">                if ( $plugin_post && $plugin_post->post_author != get_current_user_id() ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        $error = __( 'Error: The plugin already exists.', 'wporg-plugins' );
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -151,7 +164,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        return new \WP_Error( 'already_exists', $error . ' ' . sprintf(
</span><span class="cx" style="display: block; padding: 0 10px">                                /* translators: 1: plugin slug, 2: 'Plugin Name:' */
</span><span class="cx" style="display: block; padding: 0 10px">                                __( 'There is already a plugin with the name %1$s in the directory. You must rename your plugin by changing the %2$s line in your main plugin file and in your readme. Once you have done so, you may upload it again.', 'wporg-plugins' ),
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                '<code>' . $this->plugin_slug . '</code>',
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         '<code>' . esc_html( $this->plugin['Name'] ) . '</code>',
</ins><span class="cx" style="display: block; padding: 0 10px">                                 '<code>Plugin Name:</code>'
</span><span class="cx" style="display: block; padding: 0 10px">                        ) );
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -163,7 +176,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        return new \WP_Error( 'already_submitted', $error . ' ' . sprintf(
</span><span class="cx" style="display: block; padding: 0 10px">                                /* translators: 1: plugin slug, 2: Documentation URL, 3: plugins@wordpress.org */
</span><span class="cx" style="display: block; padding: 0 10px">                                __( 'You have already submitted a plugin named %1$s. There is no need to resubmit existing plugins, even for new versions. Instead, please update your plugin within the directory via <a href="%2$s">SVN</a>. If you need assistance, email <a href="mailto:%3$s">%3$s</a> and let us know.', 'wporg-plugins' ),
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                '<code>' . $this->plugin_slug . '</code>',
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         '<code>' . esc_html( $this->plugin['Name'] ) . '</code>',
</ins><span class="cx" style="display: block; padding: 0 10px">                                 __( 'https://developer.wordpress.org/plugins/wordpress-org/how-to-use-subversion/', 'wporg-plugins' ),
</span><span class="cx" style="display: block; padding: 0 10px">                                'plugins@wordpress.org'
</span><span class="cx" style="display: block; padding: 0 10px">                        ) );
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -237,7 +250,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                return new \WP_Error( 'already_exists_in_the_wild', $error . ' ' . sprintf(
</span><span class="cx" style="display: block; padding: 0 10px">                                        /* translators: 1: plugin slug, 2: 'Plugin Name:' */
</span><span class="cx" style="display: block; padding: 0 10px">                                        __( 'There is already a plugin with the name %1$s known to exist, though it is not hosted on WordPress.org. This means the permalink %2$s is already in use, and has a significant user base. Were we to accept it as-is, our system would overwrite those other installs and potentially damage any existing users. This is especially true since WordPress 5.5 and up will automatically update plugins and themes. You must rename your plugin by changing the %3$s line in your main plugin file and in your readme. Once you have done so, you may upload it again. If you feel this is an incorrect assessment of the situation, please email <a href="mailto:%4$s">%4$s</a> and explain why so that we may help you.', 'wporg-plugins' ),
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                        '<code>' . $this->plugin['Name'] . '</code>',
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                 '<code>' . esc_html( $this->plugin['Name'] ) . '</code>',
</ins><span class="cx" style="display: block; padding: 0 10px">                                         '<code>' . $this->plugin_slug . '</code>',
</span><span class="cx" style="display: block; padding: 0 10px">                                        '<code>Plugin Name:</code>',
</span><span class="cx" style="display: block; padding: 0 10px">                                        'plugins@wordpress.org'
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -259,6 +272,41 @@
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px">                $readme = new Parser( $readme );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                // Double check no existing plugins clash with the readme title.
+               $readme_plugin_post = get_posts( array(
+                       'post_type'   => 'plugin',
+                       'title'       => $readme->name,
+                       'post_status' => array( 'publish', 'pending', 'disabled', 'closed', 'new', 'draft', 'approved' ),
+               ) );
+               if ( $readme_plugin_post ) {
+                       $error = __( 'README Error: The plugin has already been submitted.', 'wporg-plugins' );
+
+                       return new \WP_Error( 'already_submitted', $error . ' ' . sprintf(
+                               /* translators: 1: plugin slug, 2: Documentation URL, 3: plugins@wordpress.org */
+                               __( 'You have already submitted a plugin named %1$s. There is no need to resubmit existing plugins, even for new versions. Instead, please update your plugin within the directory via <a href="%2$s">SVN</a>. If you need assistance, email <a href="mailto:%3$s">%3$s</a> and let us know.', 'wporg-plugins' ),
+                               '<code>' . esc_html( $readme->name ) . '</code>',
+                               __( 'https://developer.wordpress.org/plugins/wordpress-org/how-to-use-subversion/', 'wporg-plugins' ),
+                               'plugins@wordpress.org'
+                       ) );
+               }
+
+               if ( function_exists( 'wporg_stats_get_plugin_name_install_count' ) ) {
+                       $installs = wporg_stats_get_plugin_name_install_count( $readme->name );
+
+                       if ( $installs && $installs->count >= 100 ) {
+                               $error = __( 'Error: That plugin name is already in use.', 'wporg-plugins' );
+
+                               return new \WP_Error( 'already_exists_in_the_wild', $error . ' ' . sprintf(
+                                       /* translators: 1: plugin slug, 2: 'Plugin Name:' */
+                                       __( 'There is already a plugin with the name %1$s known to exist, though it is not hosted on WordPress.org. This means the permalink %2$s is already in use, and has a significant user base. Were we to accept it as-is, our system would overwrite those other installs and potentially damage any existing users. This is especially true since WordPress 5.5 and up will automatically update plugins and themes. You must rename your plugin by changing the %3$s line in your main plugin file and in your readme. Once you have done so, you may upload it again. If you feel this is an incorrect assessment of the situation, please email <a href="mailto:%4$s">%4$s</a> and explain why so that we may help you.', 'wporg-plugins' ),
+                                       '<code>' . esc_html( $readme->name ) . '</code>',
+                                       '<code>' . $this->plugin_slug . '</code>',
+                                       '<code>Plugin Name:</code>',
+                                       'plugins@wordpress.org'
+                               ) );
+                       }
+               }
+
</ins><span class="cx" style="display: block; padding: 0 10px">                 // Check for a readme license.
</span><span class="cx" style="display: block; padding: 0 10px">                if ( empty( $readme->license ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        $error = __( 'Error: No license defined.', 'wporg-plugins' );
</span></span></pre>
</div>
</div>

</body>
</html>