<!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>[BuddyPress][8170] trunk/bp-members/bp-members-functions.php: Display a "resend email" link when an unactivated user tries to log in.</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">
<dt>Revision</dt> <dd><a href="http://buddypress.trac.wordpress.org/changeset/8170">8170</a></dd>
<dt>Author</dt> <dd>r-a-y</dd>
<dt>Date</dt> <dd>2014-03-27 01:56:11 +0000 (Thu, 27 Mar 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Display a "resend email" link when an unactivated user tries to log in.

An unactivated user is a person who registers a new account, but has
not activated their account via email yet.

Previously, if an unactivated user tried to login, there was no option
for the user to resend the activation email.  This commit adds this
option.

Props r-a-y, imath

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

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkbpmembersbpmembersfunctionsphp">trunk/bp-members/bp-members-functions.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkbpmembersbpmembersfunctionsphp"></a>
<div class="modfile"><h4>Modified: trunk/bp-members/bp-members-functions.php (8169 => 8170)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/bp-members/bp-members-functions.php        2014-03-27 01:34:56 UTC (rev 8169)
+++ trunk/bp-members/bp-members-functions.php   2014-03-27 01:56:11 UTC (rev 8170)
</span><span class="lines">@@ -1711,34 +1711,100 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> /**
</span><del>- * Stop user accounts logging in that have not been activated yet (user_status = 2).
</del><ins>+ * Display a "resend email" link when an unregistered user attempts to log in.
</ins><span class="cx">  *
</span><del>- * Note: This is only applicable for single site WordPress installs.
- * Multisite has their own DB table - 'wp_signups' - dedicated for unactivated users.
- * See {@link wpmu_signup_user()} and {@link wpmu_validate_user_signup()}.
</del><ins>+ * @param WP_User|WP_Error $user Either the WP_User or the WP_Error object
+ * @param string $username The inputted, attempted username.
+ * @param string $password The inputted, attempted password.
+ * @return WP_User|WP_Error
</ins><span class="cx">  *
</span><del>- * @param WP_User|WP_Error $user Either the WP_User object or the WP_Error object
- * @return WP_User|WP_Error If the user is not a spammer, return the WP_User object. Otherwise a new WP_Error object.
- *
</del><span class="cx">  * @since BuddyPress (1.2.2)
</span><span class="cx">  */
</span><del>-function bp_core_signup_disable_inactive( $user ) {
-       // check to see if the $user has already failed logging in, if so return $user as-is
-       if ( is_wp_error( $user ) || empty( $user ) )
</del><ins>+function bp_core_signup_disable_inactive( $user = null, $username = '', $password ='' ) {
+       // login form not used
+       if ( empty( $username ) && empty( $password ) ) {
</ins><span class="cx">           return $user;
</span><ins>+       }
</ins><span class="cx"> 
</span><del>-       // the user exists; now do a check to see if the user has activated their account or not
-       // NOTE: this is only applicable for single site WordPress installs!
-       // if unactivated, stop the login now!
-       if ( is_a( $user, 'WP_User' ) && 2 == $user->user_status )
-               return new WP_Error( 'bp_account_not_activated', __( '<strong>ERROR</strong>: Your account has not been activated. Check your email for the activation link.', 'buddypress' ) );
</del><ins>+        // An existing WP_User with a user_status of 2 is either a legacy
+       // signup, or is a user created for backward compatibility. See
+       // {@link bp_core_signup_user()} for more details.
+       if ( is_a( $user, 'WP_User' ) && 2 == $user->user_status ) {
+               $user_login = $user->user_login;
</ins><span class="cx"> 
</span><del>-       // user has activated their account! all clear!
-       return $user;
</del><ins>+        // If no WP_User is found corresponding to the username, this
+       // is a potential signup
+       } elseif ( is_wp_error( $user ) && 'invalid_username' == $user->get_error_code() ) {
+               $user_login = $username;
+
+       // This is an activated user, so bail
+       } else {
+               return $user;
+       }
+
+       // Look for the unactivated signup corresponding to the login name
+       $signup = BP_Signup::get( array( 'user_login' => sanitize_user( $user_login ) ) );
+
+       // No signup or more than one, something is wrong. Let's bail.
+       if ( empty( $signup['signups'][0] ) || $signup['total'] > 1 ) {
+               return $user;
+       }
+
+       // Unactivated user account found!
+       // Set up the feedback message
+       $signup_id = $signup['signups'][0]->signup_id;
+
+       $resend_url_params = array(
+               'action' => 'bp-resend-activation',
+               'id'     => $signup_id,
+       );
+
+       $resend_url = wp_nonce_url(
+               add_query_arg( $resend_url_params, wp_login_url() ),
+               'bp-resend-activation'
+       );
+
+       $resend_string = '<br /><br />' . sprintf( __( 'If you have not received an email yet, <a href="%s">click here to resend it</a>.', 'buddypress' ), $resend_url );
+
+       return new WP_Error( 'bp_account_not_activated', __( '<strong>ERROR</strong>: Your account has not been activated. Check your email for the activation link.', 'buddypress' ) . $resend_string );
</ins><span class="cx"> }
</span><del>-add_filter( 'authenticate', 'bp_core_signup_disable_inactive', 30 );
</del><ins>+add_filter( 'authenticate', 'bp_core_signup_disable_inactive', 30, 3 );
</ins><span class="cx"> 
</span><span class="cx"> /**
</span><ins>+ * On the login screen, resends the activation email for a user.
+ *
+ * @since BuddyPress (2.0.0)
+ *
+ * @see bp_core_signup_disable_inactive()
+ */
+function bp_members_login_resend_activation_email() {
+       global $error;
+
+       if ( empty( $_GET['id'] ) || empty( $_GET['_wpnonce'] ) ) {
+               return;
+       }
+
+       // verify nonce
+       if ( ! wp_verify_nonce( $_GET['_wpnonce'], 'bp-resend-activation' ) ) {
+               die( 'Security check' );
+       }
+
+       $signup_id = (int) $_GET['id'];
+
+       // resend the activation email
+       // also updates the 'last sent' and '# of emails sent' values
+       $resend = BP_Signup::resend( array( $signup_id ) );
+
+       // add feedback message
+       if ( ! empty( $resend['errors'] ) ) {
+               $error = __( '<strong>ERROR</strong>: Your account has already been activated.', 'buddypress' );
+       } else {
+               $error = __( 'Activation email resent!  Please check your inbox or spam folder.', 'buddypress' );
+       }
+}
+add_action( 'login_form_bp-resend-activation', 'bp_members_login_resend_activation_email' );
+
+/**
</ins><span class="cx">  * Kill the wp-signup.php if custom registration signup templates are present
</span><span class="cx">  */
</span><span class="cx"> function bp_core_wpsignup_redirect() {
</span></span></pre>
</div>
</div>

</body>
</html>