[wp-trac] [WordPress Trac] #14286: Admin attempt to create user using an existing email yields PHP notice

WordPress Trac wp-trac at lists.automattic.com
Mon Jul 12 19:48:40 UTC 2010


#14286: Admin attempt to create user using an existing email yields PHP notice
----------------------------+-----------------------------------------------
 Reporter:  coffee2code     |       Owner:                 
     Type:  defect (bug)    |      Status:  new            
 Priority:  normal          |   Milestone:  Awaiting Review
Component:  Administration  |     Version:  3.0            
 Severity:  minor           |    Keywords:  has-patch      
----------------------------+-----------------------------------------------
 When the admin interface is used to create a new user, a PHP notice is
 generated due to an attempt to access an undefined property of an object.

 In edit_user() in wp-admin/includes/user.php, there exists this check for
 uniqueness of the user email:

 `elseif ( ( $owner_id = email_exists($user->user_email) ) && $owner_id !=
 $user->ID ) {`

 When a new user is created, this function is also used but the `$user`
 object is not assigned an ID variable.  So when the email_exists() check
 is true, the second half of the conditional generates a PHP notice because
 `$user->ID` is not defined.  Specifically, here's the output with WP_DEBUG
 set to true:

 `Notice: Undefined property: stdClass::$ID in /Users/scott/Sites/wp30.dev
 /wp-admin/includes/user.php on line 172`

 In order to see this transitional message and to verify the contents of
 `$user`, I hooked the 'user_profile_update_errors' action:

 {{{
 add_action ( 'user_profile_update_errors', 'var_dump_user', 1, 3 );
 function var_dump_user( $errors, $update, $user ) {
         var_dump( $user );
         exit();
 }
 }}}

 Which yields:

 `object(stdClass)#105 (9) { ["user_login"]=> string(8) "testuser"
 ["role"]=> string(10) "subscriber" ["user_email"]=> string(16)
 "xxxxxx at gmail.com" ["user_url"]=> string(0) "" ["first_name"]=> string(0)
 "" ["last_name"]=> string(0) "" ["comment_shortcuts"]=> string(0) ""
 ["use_ssl"]=> int(0) ["user_pass"]=> string(6) "mypass" }`

 (Note no 'ID' is defined.)

 My proposed fix (in the first attached diff) is to change the elseif
 conditional to be:

 `elseif ( ( $owner_id = email_exists($user->user_email) ) && ( !$update ||
 ( $owner_id != $user->ID ) ) ) {`

 In this case, if the email exists and either a user is being created
 (`!$update`) or a user is being updated but is not the account associated
 with the email `( $owner_id != $user->ID )`, then the WP error we want
 gets generated, while no PHP notices get generated.

 FYI: The code in user.php was introduced in [10990] in response to #9563.

-- 
Ticket URL: <http://core.trac.wordpress.org/ticket/14286>
WordPress Trac <http://core.trac.wordpress.org/>
WordPress blogging software


More information about the wp-trac mailing list