<!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>[34116] trunk: Passwords: Deprecate second parameter of `wp_new_user_notification()`.</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 { 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="https://core.trac.wordpress.org/changeset/34116">34116</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"https://core.trac.wordpress.org/changeset/34116","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>ocean90</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2015-09-14 12:42:34 +0000 (Mon, 14 Sep 2015)</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'>Passwords: Deprecate second parameter of `wp_new_user_notification()`.

The second parameter `$plaintext_pass` was removed in <a href="https://core.trac.wordpress.org/changeset/33023">[33023]</a> and restored as `$notify` in <a href="https://core.trac.wordpress.org/changeset/33620">[33620]</a> with a different behavior. If you have a plugin overriding `wp_new_user_notification()` which hasn't been updated you would get a notification with your username and the password "both".
To prevent this the second parameter is now deprecated and reintroduced as the third parameter.

Adds unit tests.

Props kraftbj, adamsilverstein, welcher, ocean90.
Fixes <a href="https://core.trac.wordpress.org/ticket/33654">#33654</a>.

(Don't ask for new pluggables kthxbye)</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcwpadminincludesuserphp">trunk/src/wp-admin/includes/user.php</a></li>
<li><a href="#trunksrcwpadminnetworksitenewphp">trunk/src/wp-admin/network/site-new.php</a></li>
<li><a href="#trunksrcwpadminnetworksiteusersphp">trunk/src/wp-admin/network/site-users.php</a></li>
<li><a href="#trunksrcwpadminnetworkusernewphp">trunk/src/wp-admin/network/user-new.php</a></li>
<li><a href="#trunksrcwpincludespluggablephp">trunk/src/wp-includes/pluggable.php</a></li>
<li><a href="#trunksrcwpincludesuserfunctionsphp">trunk/src/wp-includes/user-functions.php</a></li>
<li><a href="#trunktestsphpunittestsuserphp">trunk/tests/phpunit/tests/user.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcwpadminincludesuserphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/includes/user.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/includes/user.php      2015-09-14 12:19:55 UTC (rev 34115)
+++ trunk/src/wp-admin/includes/user.php        2015-09-14 12:42:34 UTC (rev 34116)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -176,7 +176,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $user_id = wp_update_user( $user );
</span><span class="cx" style="display: block; padding: 0 10px">        } else {
</span><span class="cx" style="display: block; padding: 0 10px">                $user_id = wp_insert_user( $user );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                wp_new_user_notification( $user_id, 'both' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         wp_new_user_notification( $user_id, null, 'both' );
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px">        return $user_id;
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span></span></pre></div>
<a id="trunksrcwpadminnetworksitenewphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/network/site-new.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/network/site-new.php   2015-09-14 12:19:55 UTC (rev 34115)
+++ trunk/src/wp-admin/network/site-new.php     2015-09-14 12:42:34 UTC (rev 34116)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -94,7 +94,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                if ( false === $user_id )
</span><span class="cx" style="display: block; padding: 0 10px">                        wp_die( __( 'There was an error creating the user.' ) );
</span><span class="cx" style="display: block; padding: 0 10px">                else
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        wp_new_user_notification( $user_id, 'both' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 wp_new_user_notification( $user_id, null, 'both' );
</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">        $wpdb->hide_errors();
</span></span></pre></div>
<a id="trunksrcwpadminnetworksiteusersphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/network/site-users.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/network/site-users.php 2015-09-14 12:19:55 UTC (rev 34115)
+++ trunk/src/wp-admin/network/site-users.php   2015-09-14 12:42:34 UTC (rev 34116)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -77,7 +77,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                if ( false === $user_id ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                        $update = 'err_new_dup';
</span><span class="cx" style="display: block; padding: 0 10px">                                } else {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                        wp_new_user_notification( $user_id, 'both' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                 wp_new_user_notification( $user_id, null, 'both' );
</ins><span class="cx" style="display: block; padding: 0 10px">                                         add_user_to_blog( $id, $user_id, $_POST['new_role'] );
</span><span class="cx" style="display: block; padding: 0 10px">                                        $update = 'newuser';
</span><span class="cx" style="display: block; padding: 0 10px">                                }
</span></span></pre></div>
<a id="trunksrcwpadminnetworkusernewphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/network/user-new.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/network/user-new.php   2015-09-14 12:19:55 UTC (rev 34115)
+++ trunk/src/wp-admin/network/user-new.php     2015-09-14 12:42:34 UTC (rev 34116)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -51,7 +51,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                if ( ! $user_id ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        $add_user_errors = new WP_Error( 'add_user_fail', __( 'Cannot add user.' ) );
</span><span class="cx" style="display: block; padding: 0 10px">                } else {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        wp_new_user_notification( $user_id, 'both' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 wp_new_user_notification( $user_id, null, 'both' );
</ins><span class="cx" style="display: block; padding: 0 10px">                         wp_redirect( add_query_arg( array('update' => 'added'), 'user-new.php' ) );
</span><span class="cx" style="display: block; padding: 0 10px">                        exit;
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span></span></pre></div>
<a id="trunksrcwpincludespluggablephp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/pluggable.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/pluggable.php       2015-09-14 12:19:55 UTC (rev 34115)
+++ trunk/src/wp-includes/pluggable.php 2015-09-14 12:42:34 UTC (rev 34116)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1690,16 +1690,22 @@
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @since 2.0.0
</span><span class="cx" style="display: block; padding: 0 10px">  * @since 4.3.0 The `$plaintext_pass` parameter was changed to `$notify`.
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * @since 4.3.1 The `$plaintext_pass` parameter was deprecated. `$notify` added as a third parameter.
</ins><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @global wpdb         $wpdb      WordPress database object for queries.
</span><span class="cx" style="display: block; padding: 0 10px">  * @global PasswordHash $wp_hasher Portable PHP password hashing framework instance.
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- * @param int    $user_id User ID.
- * @param string $notify  Optional. Type of notification that should happen. Accepts 'admin' or an empty
- *                        string (admin only), or 'both' (admin and user). The empty string value was kept
- *                        for backward-compatibility purposes with the renamed parameter. Default empty.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * @param int    $user_id    User ID.
+ * @param null   $deprecated Not used (argument deprecated).
+ * @param string $notify     Optional. Type of notification that should happen. Accepts 'admin' or an empty
+ *                           string (admin only), or 'both' (admin and user). The empty string value was kept
+ *                           for backward-compatibility purposes with the renamed parameter. Default empty.
</ins><span class="cx" style="display: block; padding: 0 10px">  */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-function wp_new_user_notification( $user_id, $notify = '' ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+function wp_new_user_notification( $user_id, $deprecated = null, $notify = '' ) {
+       if ( $deprecated !== null ) {
+               _deprecated_argument( __FUNCTION__, '4.3.1' );
+       }
+
</ins><span class="cx" style="display: block; padding: 0 10px">         global $wpdb, $wp_hasher;
</span><span class="cx" style="display: block; padding: 0 10px">        $user = get_userdata( $user_id );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span></span></pre></div>
<a id="trunksrcwpincludesuserfunctionsphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/user-functions.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/user-functions.php  2015-09-14 12:19:55 UTC (rev 34115)
+++ trunk/src/wp-includes/user-functions.php    2015-09-14 12:42:34 UTC (rev 34116)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2012,7 +2012,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        update_user_option( $user_id, 'default_password_nag', true, true ); //Set up the Password change nag.
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        wp_new_user_notification( $user_id, 'both' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ wp_new_user_notification( $user_id, null, 'both' );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        return $user_id;
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span></span></pre></div>
<a id="trunktestsphpunittestsuserphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/tests/user.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/tests/user.php        2015-09-14 12:19:55 UTC (rev 34115)
+++ trunk/tests/phpunit/tests/user.php  2015-09-14 12:42:34 UTC (rev 34116)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -679,4 +679,86 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertEquals( $user->user_email, 'test2@test.com' );
</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">+        /**
+        * Testing wp_new_user_notification email statuses.
+        *
+        * @dataProvider data_wp_new_user_notifications
+        * @ticket 33654
+        */
+       function test_wp_new_user_notification( $notify, $admin_email_sent_expected, $user_email_sent_expected ) {
+               unset( $GLOBALS['phpmailer']->mock_sent );
+
+               $was_admin_email_sent = false;
+               $was_user_email_sent = false;
+
+               $user = $this->factory->user->create( $this->user_data );
+
+               wp_new_user_notification( $user, null, $notify );
+
+               /*
+                * Check to see if a notification email was sent to the
+                * post author `blackburn@battlefield3.com` and and site admin `admin@example.org`.
+                */
+               if ( ! empty( $GLOBALS['phpmailer']->mock_sent ) ) {
+                       $was_admin_email_sent = ( isset( $GLOBALS['phpmailer']->mock_sent[0] ) && WP_TESTS_EMAIL == $GLOBALS['phpmailer']->mock_sent[0]['to'][0][0] );
+                       $was_user_email_sent = ( isset( $GLOBALS['phpmailer']->mock_sent[1] ) && 'blackburn@battlefield3.com' == $GLOBALS['phpmailer']->mock_sent[1]['to'][0][0] );
+               }
+
+               $this->assertSame( $admin_email_sent_expected, $was_admin_email_sent, 'Admin email result was not as expected in test_wp_new_user_notification' );
+               $this->assertSame( $user_email_sent_expected , $was_user_email_sent, 'User email result was not as expected in test_wp_new_user_notification' );
+       }
+
+       /**
+        * Data provider for test_wp_new_user_notification().
+        *
+        * Passes the three available options for the $notify parameter and the expected email
+        * emails sent status as a bool.
+        *
+        * @return array {
+        *     @type array {
+        *         @type string $post_args               The arguments that will merged with the $_POST array.
+        *         @type bool $admin_email_sent_expected The expected result of whether an email was sent to the admin.
+        *         @type bool $user_email_sent_expected  The expected result of whether an email was sent to the user.
+        *     }
+        * }
+        */
+       function data_wp_new_user_notifications() {
+               return array(
+                       array(
+                               '',
+                               true,
+                               false,
+                       ),
+                       array(
+                               'admin',
+                               true,
+                               false,
+                       ),
+                       array(
+                               'both',
+                               true,
+                               true,
+                       ),
+               );
+       }
+
+       /**
+        * Set up a user and try sending a notification using the old, deprecated
+        * function signature `wp_new_user_notification( $user, 'plaintext_password' );`.
+        *
+        * @ticket 33654
+        * @expectedDeprecated wp_new_user_notification
+        */
+       function test_wp_new_user_notification_old_signature_throws_deprecated_warning() {
+               $user = $this->factory->user->create(
+                       array(
+                               'role'       => 'author',
+                               'user_login' => 'test_wp_new_user_notification',
+                               'user_pass'  => 'password',
+                               'user_email' => 'test@test.com',
+                       )
+               );
+
+               wp_new_user_notification( $user, 'this_is_deprecated' );
+       }
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span></span></pre>
</div>
</div>

</body>
</html>