<!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>[13462] sites/trunk/wordpress.org/public_html/wp-content/plugins/plugin-directory: Plugin Directory: Expand the trademark checks to match multiple trademarks in the field checked.</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/13462">13462</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/13462","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>2024-04-05 04:55:33 +0000 (Fri, 05 Apr 2024)</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: Expand the trademark checks to match multiple trademarks in the field checked.

Simplifies the error message and centralises the 3 uses of it.

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

<h3>Modified Paths</h3>
<ul>
<li><a href="#sitestrunkwordpressorgpublic_htmlwpcontentpluginsplugindirectoryapiroutesclasspluginuploadphp">sites/trunk/wordpress.org/public_html/wp-content/plugins/plugin-directory/api/routes/class-plugin-upload.php</a></li>
<li><a href="#sitestrunkwordpressorgpublic_htmlwpcontentpluginsplugindirectoryclasstrademarksphp">sites/trunk/wordpress.org/public_html/wp-content/plugins/plugin-directory/class-trademarks.php</a></li>
<li><a href="#sitestrunkwordpressorgpublic_htmlwpcontentpluginsplugindirectoryreadmeclassvalidatorphp">sites/trunk/wordpress.org/public_html/wp-content/plugins/plugin-directory/readme/class-validator.php</a></li>
<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_htmlwpcontentpluginsplugindirectoryapiroutesclasspluginuploadphp"></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/api/routes/class-plugin-upload.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/api/routes/class-plugin-upload.php      2024-04-05 04:19:49 UTC (rev 13461)
+++ sites/trunk/wordpress.org/public_html/wp-content/plugins/plugin-directory/api/routes/class-plugin-upload.php        2024-04-05 04:55:33 UTC (rev 13462)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -5,6 +5,8 @@
</span><span class="cx" style="display: block; padding: 0 10px"> use WordPressdotorg\Plugin_Directory\Tools;
</span><span class="cx" style="display: block; padding: 0 10px"> use WordPressdotorg\Plugin_Directory\API\Base;
</span><span class="cx" style="display: block; padding: 0 10px"> use WordPressdotorg\Plugin_Directory\Shortcodes\Upload_Handler;
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+use WordPressdotorg\Plugin_Directory\Readme\Validator as Readme_Validator;
+use WordPressdotorg\Plugin_Directory\Trademarks;
</ins><span class="cx" style="display: block; padding: 0 10px"> use WP_REST_Server;
</span><span class="cx" style="display: block; padding: 0 10px"> use WP_Error;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -140,31 +142,19 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        return new WP_Error( 'reserved_slug', __( 'That slug is already in use.', 'wporg-plugins' ) );
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                // Duplicated from Upload handler.
</del><span class="cx" style="display: block; padding: 0 10px">                 // Make sure it doesn't use a TRADEMARK protected slug.
</span><span class="cx" style="display: block; padding: 0 10px">                $has_trademarked_slug = Trademarks::check_slug( $slug, wp_get_current_user() );
</span><span class="cx" style="display: block; padding: 0 10px">                if ( $has_trademarked_slug ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        $error = __( 'That plugin slug includes a restricted term.', 'wporg-plugins' );
-
-                       if ( $has_trademarked_slug === trim( $has_trademarked_slug, '-' ) ) {
-                               // Trademarks that do NOT end in "-" indicate slug cannot contain term at all.
-                               $message = sprintf(
-                                       /* translators: 1: plugin slug, 2: trademarked term, 3: 'Plugin Name:', 4: plugin email address */
-                                       __( 'Your chosen plugin slug - %1$s - contains the restricted term "%2$s", which cannot be used at all in your plugin permalink nor the display name.', 'wporg-plugins' ),
-                                       '<code>' . $slug . '</code>',
-                                       '<code>' . trim( $has_trademarked_slug, '-' ) . '</code>'
-                               );
-                       } else {
-                               // Trademarks ending in "-" indicate slug cannot BEGIN with that term.
-                               $message = sprintf(
-                                       /* translators: 1: plugin slug, 2: trademarked term, 3: 'Plugin Name:', 4: plugin email address */
-                                       __( 'Your chosen plugin slug - %1$s - contains the restricted term "%2$s" and cannot be used to begin your permalink or display name. We disallow the use of certain terms in ways that are abused, or potentially infringe on and/or are misleading with regards to trademarks.', 'wporg-plugins' ),
-                                       '<code>' . $slug . '</code>',
-                                       '<code>' . trim( $has_trademarked_slug, '-' ) . '</code>'
-                               );
-                       }
-
-                       return new WP_Error( 'trademarked_slug', $error . ' ' . $message );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 return new WP_Error(
+                               'trademarked_slug',
+                               Readme_Validator::instance()->translate_code_to_message(
+                                       'trademarked_slug',
+                                       [
+                                               'trademark' => $has_trademarked_slug,
+                                               'context'   => $slug
+                                       ]
+                               )
+                       );
</ins><span class="cx" style="display: block; padding: 0 10px">                 }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                // Not ideal, but it's better than nothing.
</span></span></pre></div>
<a id="sitestrunkwordpressorgpublic_htmlwpcontentpluginsplugindirectoryclasstrademarksphp"></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/class-trademarks.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/class-trademarks.php    2024-04-05 04:19:49 UTC (rev 13461)
+++ sites/trunk/wordpress.org/public_html/wp-content/plugins/plugin-directory/class-trademarks.php      2024-04-05 04:55:33 UTC (rev 13462)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -170,7 +170,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @param string $check                     The plugin name to check.
</span><span class="cx" style="display: block; padding: 0 10px">         * @param array|WP_User|WP_Post $exceptions An array of exceptions to the trademark checks, or a WP_User or WP_Post object to fetch their exceptions.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         * @return string|false The trademarked slug if found, false otherwise.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+  * @return array|false The trademarked slug if found, false otherwise.
</ins><span class="cx" style="display: block; padding: 0 10px">          */
</span><span class="cx" style="display: block; padding: 0 10px">        public static function check( $check, $exceptions = [] ) {
</span><span class="cx" style="display: block; padding: 0 10px">                // This logic is from Upload_Handler::generate_plugin_slug()
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -187,7 +187,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @param string                $plugin_slug The slug-like-text to check.
</span><span class="cx" style="display: block; padding: 0 10px">         * @param array|WP_User|WP_Post $exceptions  An array of exceptions to the trademark checks, or a WP_User or WP_Post object to fetch their exceptions.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         * @return string|false The trademarked slug if found, false otherwise.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+  * @return array|false The trademarked slug if found, false otherwise.
</ins><span class="cx" style="display: block; padding: 0 10px">          */
</span><span class="cx" style="display: block; padding: 0 10px">        public static function check_slug( $plugin_slug, $exceptions = [] ) {
</span><span class="cx" style="display: block; padding: 0 10px">                if ( $exceptions instanceof WP_User ) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -219,14 +219,13 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        $portmanteaus      = array_diff( $portmanteaus, $trademark_exceptions[ $exception ] );
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $has_trademarked_slug = false;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $has_trademarked_slug = [];
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                foreach ( $trademarked_slugs as $trademark ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        if ( str_ends_with( $trademark, '-' ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                // Trademarks ending in "-" indicate slug cannot begin with that term.
</span><span class="cx" style="display: block; padding: 0 10px">                                if ( str_starts_with( $plugin_slug, $trademark ) ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                        $has_trademarked_slug = $trademark;
-                                       break;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                 $has_trademarked_slug[] = $trademark;
</ins><span class="cx" style="display: block; padding: 0 10px">                                 }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                        } elseif (
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -245,8 +244,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                                // The term cannot exist anywhere in the plugin slug, and it's not a for-use exception.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                $has_trademarked_slug = $trademark;
-                               break;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         $has_trademarked_slug[] = $trademark;
</ins><span class="cx" style="display: block; padding: 0 10px">                         }
</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">@@ -253,12 +251,11 @@
</span><span class="cx" style="display: block; padding: 0 10px">                // Check portmanteaus.
</span><span class="cx" style="display: block; padding: 0 10px">                foreach ( $portmanteaus as $portmanteau ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        if ( str_starts_with( $plugin_slug, $portmanteau ) ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                $has_trademarked_slug = $portmanteau;
-                               break;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         $has_trademarked_slug[] = $portmanteau . '-'; // State that the portmanteau cannnot start the text.
</ins><span class="cx" style="display: block; padding: 0 10px">                         }
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                return $has_trademarked_slug;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         return array_unique( $has_trademarked_slug ) ?: false;
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span></span></pre></div>
<a id="sitestrunkwordpressorgpublic_htmlwpcontentpluginsplugindirectoryreadmeclassvalidatorphp"></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/readme/class-validator.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/readme/class-validator.php      2024-04-05 04:19:49 UTC (rev 13461)
+++ sites/trunk/wordpress.org/public_html/wp-content/plugins/plugin-directory/readme/class-validator.php        2024-04-05 04:55:33 UTC (rev 13462)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -395,29 +395,46 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                        case 'trademarked_name':
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                $trademark = $data['trademark'];
-                               $context   = $data['context'];
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 case 'trademarked_slug':
+                       case 'trademarked':
+                               $trademarks = (array) $data['trademark'];
+                               $context    = $data['context'];
+                               $messages   = [];
+       
+                               $cannot_start_with = array_filter( $trademarks, function( $slug ) {
+                                       return str_ends_with( $slug, '-' );
+                               } );
+                               $cannot_contain    = array_diff( $trademarks, $cannot_start_with );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                if ( str_ends_with( $trademark, '-' ) ) {
-                                       // Trademarks ending in "-" indicate slug cannot BEGIN with that term.
-                                       return sprintf(
-                                               /* translators: 1: plugin name/slug, 2: trademarked term, 3: plugin email address */
-                                               __( 'The plugin name includes a restricted term. Your chosen plugin name - %1$s - contains the restricted term "%2$s" and cannot be used to begin your slug, permalink, display name, or plugin name. We disallow the use of certain terms in ways that are abused, or potentially infringe on and/or are misleading with regards to trademarks. If you feel this is in error, such as you legally own the trademark for the term, please email us at %4$s and explain your situation.', 'wporg-plugins' ),
-                                               '<code>' . esc_html( $context ) . '</code>',
-                                               '<code>' . esc_html( trim( $trademark, '-' ) ) . '</code>',
-                                               '<code>plugins@wordpress.org</code>'
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         if ( $cannot_start_with ) {
+                                       $messages[] = sprintf(
+                                               /* translators: 1: plugin slug, 2: trademarked term, 3: 'Plugin Name:', 4: plugin email address */
+                                               _n(
+                                                       'Your chosen plugin name - %1$s - contains the restricted term "%2$s" which cannot be used to begin your permalink or display name. We disallow the use of certain terms in ways that are abused, or potentially infringe on and/or are misleading with regards to trademarks.',
+                                                       'Your chosen plugin name - %1$s - contains the restricted terms "%2$s" which cannot be used to begin your permalink or display name. We disallow the use of certain terms in ways that are abused, or potentially infringe on and/or are misleading with regards to trademarks.',
+                                                       count( $cannot_start_with ),
+                                                       'wporg-plugins'
+                                               ),
+                                               '<code>' . $context . '</code>',
+                                               '<code>' . implode( '</code>", "<code>', $cannot_start_with ) . '</code>'
</ins><span class="cx" style="display: block; padding: 0 10px">                                         );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                } else {
-                                       // Trademarks that do NOT end in "-" indicate slug cannot contain term at all.
-                                       return sprintf(
-                                               /* translators: 1: plugin name/slug, 2: trademarked term, 3: plugin email address */
-                                               __( 'The plugin name includes a restricted term. Your chosen plugin name - %1$s - contains the restricted term "%2$s" and cannot be used at all in your plugin permalink nor the display name. If you feel this is in error, such as you legally own the trademark for a term, please email us at %3$s and explain your situation.', 'wporg-plugins' ),
-                                               '<code>' . esc_html( $context ) . '</code>',
-                                               '<code>' . esc_html( trim( $trademark, '-' ) ) . '</code>',
-                                               '<code>plugins@wordpress.org</code>'
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         }
+                               if ( $cannot_contain ) {
+                                       $messages[] = sprintf(
+                                               /* translators: 1: plugin slug, 2: trademarked term, 3: 'Plugin Name:', 4: plugin email address */
+                                               _n(
+                                                       'Your chosen plugin name - %1$s - contains the restricted term "%2$s", which cannot be used at all in your plugin permalink nor the display name.',
+                                                       'Your chosen plugin name - %1$s - contains the restricted terms "%2$s", which cannot be used at all in your plugin permalink nor the display name.',
+                                                       count( $cannot_contain ),
+                                                       'wporg-plugins'
+                                               ),
+                                               '<code>' . $context . '</code>',
+                                               '<code>' . implode( '</code>", "<code>', $cannot_contain ) . '</code>'
</ins><span class="cx" style="display: block; padding: 0 10px">                                         );
</span><span class="cx" style="display: block; padding: 0 10px">                                }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                return implode( '<br>', $messages );
+
</ins><span class="cx" style="display: block; padding: 0 10px">                         /* The are not generated by the Readme Parser, but rather the import parser. */
</span><span class="cx" style="display: block; padding: 0 10px">                        case 'invalid_update_uri':
</span><span class="cx" style="display: block; padding: 0 10px">                                return sprintf(
</span></span></pre></div>
<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     2024-04-05 04:19:49 UTC (rev 13461)
+++ sites/trunk/wordpress.org/public_html/wp-content/plugins/plugin-directory/shortcodes/class-upload-handler.php       2024-04-05 04:55:33 UTC (rev 13462)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -5,6 +5,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> use WordPressdotorg\Plugin_Directory\CLI\Import;
</span><span class="cx" style="display: block; padding: 0 10px"> use WordPressdotorg\Plugin_Directory\Readme\Parser;
</span><span class="cx" style="display: block; padding: 0 10px"> use WordPressdotorg\Plugin_Directory\Plugin_Directory;
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+use WordPressdotorg\Plugin_Directory\Readme\Validator as Readme_Validator;
</ins><span class="cx" style="display: block; padding: 0 10px"> use WordPressdotorg\Plugin_Directory\Tools;
</span><span class="cx" style="display: block; padding: 0 10px"> use WordPressdotorg\Plugin_Directory\Tools\Filesystem;
</span><span class="cx" style="display: block; padding: 0 10px"> use WordPressdotorg\Plugin_Directory\Trademarks;
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -167,40 +168,37 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        ) );
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                // Make sure it doesn't use a TRADEMARK protected slug.
-               if ( ! $updating_existing ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         // Make sure it doesn't use a TRADEMARK. We check the name first, and then the slug.
+               $has_trademarked_slug = Trademarks::check( $this->plugin['Name'], wp_get_current_user() );
+               $trademark_context    = $this->plugin['Name'];
+
+               if ( ! $has_trademarked_slug && ! $updating_existing ) {
+                       // Check the slug on new submissions in addition to the name.
</ins><span class="cx" style="display: block; padding: 0 10px">                         $has_trademarked_slug = Trademarks::check_slug( $this->plugin_slug, wp_get_current_user() );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                } else {
-                       // If we're updating an existing plugin, we need to check the new name, but the slug may be different.
-                       $has_trademarked_slug = Trademarks::check( $this->plugin['Name'], wp_get_current_user() );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 $trademark_context    = $this->plugin_slug;
</ins><span class="cx" style="display: block; padding: 0 10px">                 }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                if ( false !== $has_trademarked_slug && ! $has_upload_token ) {
-                       $error = __( 'Error: The plugin name includes a restricted term.', 'wporg-plugins' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         if ( $has_trademarked_slug && ! $has_upload_token ) {
+                       $error = Readme_Validator::instance()->translate_code_to_message(
+                               'trademarked_slug',
+                               [
+                                       'trademark' => $has_trademarked_slug,
+                                       'context'   => $trademark_context,
+                               ]
+                       );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        if ( $has_trademarked_slug === trim( $has_trademarked_slug, '-' ) ) {
-                               // Trademarks that do NOT end in "-" indicate slug cannot contain term at all.
-                               $message = sprintf(
-                                       /* translators: 1: plugin slug, 2: trademarked term, 3: 'Plugin Name:', 4: plugin email address */
-                                       __( 'Your chosen plugin name - %1$s - contains the restricted term "%2$s" and cannot be used at all in your plugin permalink nor the display name. To proceed with this submission you must remove "%2$s" from the %3$s line in both your main plugin file and readme entirely. Once you\'ve finished, you may upload the plugin again. Do not attempt to work around this by removing letters (i.e. WordPess) or using numbers (4 instead of A). Those are seen as intentional actions to avoid our restrictions, and are not permitted. If you feel this is in error, such as you legally own the trademark for a term, please email us at %4$s and explain your situation.', 'wporg-plugins' ),
-                                       '<code>' . esc_html( $this->plugin['Name'] ) . '</code>',
-                                       trim( $has_trademarked_slug, '-' ),
-                                       '<code>Plugin Name:</code>',
-                                       '<code>plugins@wordpress.org</code>'
-                               );
-                       } else {
-                               // Trademarks ending in "-" indicate slug cannot BEGIN with that term.
-                               $message = sprintf(
-                                       /* translators: 1: plugin slug, 2: trademarked term, 3: 'Plugin Name:', 4: plugin email address */
-                                       __( 'Your chosen plugin name - %1$s - contains the restricted term "%2$s" and cannot be used to begin your permalink or display name. We disallow the use of certain terms in ways that are abused, or potentially infringe on and/or are misleading with regards to trademarks. In order to proceed with this submission, you must change the %3$s line in your main plugin file and readme to end with  "-%2$s" instead. Once you\'ve finished, you may upload the plugin again. If you feel this is in error, such as you legally own the trademark for the term, please email us at %4$s and explain your situation.', 'wporg-plugins' ),
-                                       '<code>' . esc_html( $this->plugin['Name'] ) . '</code>',
-                                       trim( $has_trademarked_slug, '-' ),
-                                       '<code>Plugin Name:</code>',
-                                       '<code>plugins@wordpress.org</code>'
-                               );
-                       }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 $to_proceed_text = sprintf(
+                               /* translators: 1: Plugin Name header */
+                               __( 'To proceed with this submission you must change your %1$s line in both your main plugin file and readme to abide by these requirements. Once you\'ve finished, you may upload the plugin again. Do not attempt to work around this by removing letters (i.e. WordPess) or using numbers (4 instead of A). Those are seen as intentional actions to avoid our restrictions, and are not permitted.', 'wporg-plugins' ),
+                               '<code>Plugin Name:</code>'
+                       );
+                       $in_error_text   = sprintf(
+                               /* translators: plugins@wordpress.org */
+                               __( 'If you feel this is in error, such as you legally own the trademark for the term, please email us at %1$s and explain your situation.', 'wporg-plugins' ),
+                               'plugins@wordpress.org'
+                       );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        return new WP_Error( 'trademarked_name', $error . ' ' . $message );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 return new WP_Error( 'trademarked_name', "{$error} {$to_proceed_text} {$in_error_text}" );
</ins><span class="cx" style="display: block; padding: 0 10px">                 }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                if ( ! $plugin_post ) {
</span></span></pre>
</div>
</div>

</body>
</html>