Seditio Source
Root |
./othercms/b2evolution_7.2.3/inc/cron/jobs/_activate_account_reminder.job.php
<?php
/**
 * This file implements the account activation email reminder cron job
 *
 * @author attila: Attila Simo
 */
if( !defined('EVO_MAIN_INIT') ) die( 'Please, do not access this page directly.' );

global
$DB, $UserSettings, $Settings;

global
$servertimenow, $baseurl;

if(
$Settings->get( 'validation_process' ) != 'easy' )
{
   
cron_log_append( 'With secure activation process sending reminder emails is not permitted!', 'error' );
    return
2; /* error */
}

if( empty(
$UserSettings ) )
{
// initialize UserSettings, because in CLI mode is not initialized yet
   
load_class( 'users/model/_usersettings.class.php', 'UserSettings' );
   
$UserSettings = new UserSettings();
}

// Only users with "New", "Email changed", "Deactivated", "Failed activation" or "Pending delete" statuses may receive activation reminders
// This will be a precondition to get less users from db, but this will be checked again with check_status() in the send_easy_validate_emails() function
$status_condition = 'user_status IN ( "new", "emailchanged", "deactivated", "failedactivation", "pendingdelete" )';

// Get array of account activation reminder settings:
$activate_account_reminder_config = $Settings->get( 'activate_account_reminder_config' );

// Set configuration details from $activate_account_reminder_config array
$number_of_max_reminders = ( count( $activate_account_reminder_config ) - 1 );
if(
$number_of_max_reminders < 3 )
{
// The config array is wrong, it must have at least 4 elements (Reminder #1, Mark as failed, Delete warning, Delete account)
   
cron_log_append( 'The job advanced configuration is wrong, can\'t send reminders!', 'error' );
    return
3; /* error */
}

$reminder_delay_conditions = array();
for(
$i = 0; $i <= $number_of_max_reminders; $i++ )
{
   
$reminder_date = date2mysql( $servertimenow - $activate_account_reminder_config[$i] );
   
$reminder_delay_conditions[] = ( $i == 0
       
? '( ( last_sent.uset_value IS NULL OR last_sent.uset_value < '.$DB->quote( $reminder_date ).' ) AND ( reminder_sent.uset_value IS NULL OR reminder_sent.uset_value = "'.$i.'" ) )'
       
: '( last_sent.uset_value < '.$DB->quote( $reminder_date ).' AND reminder_sent.uset_value = "'.$i.'" )' );
}

$SQL = new SQL( 'Get users which should be reminded or deleted because of they are not activated' );
$SQL->SELECT( 'T_users.user_ID, T_users.user_status, reminder_sent.uset_value' );
$SQL->FROM( 'T_users' );
// join UserSettings
$SQL->FROM_add( 'LEFT JOIN T_users__usersettings last_sent ON last_sent.uset_user_ID = user_ID AND last_sent.uset_name = "last_activation_email"' );
$SQL->FROM_add( 'LEFT JOIN T_users__usersettings notif_setting ON notif_setting.uset_user_ID = user_ID AND notif_setting.uset_name = "send_activation_reminder"' );
$SQL->FROM_add( 'LEFT JOIN T_users__usersettings reminder_sent ON reminder_sent.uset_user_ID = user_ID AND reminder_sent.uset_name = "activation_reminder_count"' );
// check that user status is 'new' or 'emailchanged' or 'deactivated', and send reminders only for these users.
$SQL->WHERE( $status_condition );
// check if user has an email address
$SQL->WHERE_and( 'LENGTH(TRIM(user_email)) > 0' );
// check that user email is not blocked
$SQL->WHERE_and( 'user_email NOT IN ( SELECT emadr_address FROM T_email__address WHERE '.get_mail_blocked_condition().' )' );
// check that user was created more than x ( = confugred activate account reminder threshold ) seconds ago!
$threshold_date = date2mysql( $servertimenow - $Settings->get( 'activate_account_reminder_threshold' ) );
$SQL->WHERE_and( 'user_created_datetime < '.$DB->quote( $threshold_date ) );
// check how many reminders was sent to the user and when => send reminders only if required
$SQL->WHERE_and( implode( ' OR ', $reminder_delay_conditions ) );
// check if user wants to recevice activation reminder or not
$SQL->WHERE_and( 'notif_setting.uset_value IS NULL OR notif_setting.uset_value <> '.$DB->quote( '0' ) );
$reminder_users = $DB->get_results( $SQL );

$all_reminder_users = array();
$send_activation_users = array(); // Users for cron settings "Reminder #X"
$mark_failed_users = array(); // Users for cron setting "Mark as Failed / Pending delete"
$send_delete_warning_users = array(); // Users for cron setting "Delete warning"
$delete_account_users = array(); // Users for cron setting "Delete account"
foreach( $reminder_users as $reminder_user )
{
   
$all_reminder_users[] = $reminder_user->user_ID;
   
$activation_reminder_count = $reminder_user->uset_value;
    if(
$reminder_user->user_status == 'pendingdelete' &&
        (
// If this is the last reminder number and the option "Delete account" is enabled
         
( $activation_reminder_count == $number_of_max_reminders && ! empty( $activate_account_reminder_config[ $activation_reminder_count ] ) ) ||
         
// Case when "Delete warning" is not enabled(=="Don't send") but "Delete account" is enabled, so we should use penultimate reminder number as last("Delete account") in order to skip the reminder of "Delete warning":
         
( $activation_reminder_count == $number_of_max_reminders - 1 && empty( $activate_account_reminder_config[ $number_of_max_reminders - 1 ] ) && ! empty( $activate_account_reminder_config[ $number_of_max_reminders ] ) )
        ) )
    {    
// This user must be deleted completely ONLY if it is in "Pending delete" status:
       
$delete_account_users[] = $reminder_user->user_ID;
    }
    elseif(
$reminder_user->user_status == 'pendingdelete' &&
           
$activation_reminder_count == $number_of_max_reminders - 1 && // If this is the penultimate reminder number
           
! empty( $activate_account_reminder_config[ $activation_reminder_count ] ) ) // If the option "Delete warning" is enabled
   
{    // This user must receive a delete warning email ONLY if it is in "Pending delete" status:
       
$send_delete_warning_users[] = $reminder_user->user_ID;
    }
    elseif(
$activation_reminder_count == $number_of_max_reminders - 2 )
    {    
// This user must be marked with status "Failed activation" or "Pending delete":
       
$mark_failed_users[] = $reminder_user->user_ID;
    }
    elseif(
$activation_reminder_count <= $number_of_max_reminders - 3 )
    {    
// This user must receive an activation email:
       
$send_activation_users[] = $reminder_user->user_ID;
    }
}

$UserCache = & get_UserCache();
$UserCache->clear();
// load all users to reminded into the UserCache:
$UserCache->load_list( $all_reminder_users );

// ---- #1 Send activation reminder:
$send_activation_users_num = count( $send_activation_users );
$success_sent_activation_users_num = send_easy_validate_emails( $send_activation_users, true, false, NULL, 'cron_job' );
cron_log_append( sprintf( T_('%d of %d account activation reminder emails were sent!'), $success_sent_activation_users_num, $send_activation_users_num ),
    (
$send_activation_users_num ? ( $send_activation_users_num == $success_sent_activation_users_num ? 'success' : 'warning' ) : NULL ) );

// ---- #2 Mark users as failed:
$mark_failed_users_num = count( $mark_failed_users );
if(
$mark_failed_users_num )
{    
// Change account status for all users who didn't receive activation reminder or account validation email in the last days of the setting "Mark as Failed / Pending delete",
    // If status was "New" - change status to "Pending delete" otherwise "Failed activation":
   
$success_mark_failed_users_num = $DB->query( 'UPDATE T_users
          SET user_status = CASE
            WHEN user_status = "new" THEN "pendingdelete"
            ELSE "failedactivation"
          END
        WHERE user_ID IN ( '
.$DB->quote( $mark_failed_users ).' )
          AND '
.$status_condition );
   
// Increase counter and date in order to run next reminder:
   
$DB->query( 'UPDATE T_users__usersettings
        INNER JOIN T_users ON uset_user_ID = user_ID
          SET uset_value = CASE
            WHEN uset_name = "activation_reminder_count" THEN uset_value + 1
            WHEN uset_name = "last_activation_email" THEN '
.$DB->quote( date2mysql( $servertimenow ) ).'
            ELSE uset_value
          END
        WHERE user_ID IN ( '
.$DB->quote( $mark_failed_users ).' )
          AND user_status IN ( "failedactivation", "pendingdelete" )
          AND uset_name IN ( "activation_reminder_count", "last_activation_email" ) '
);
   
// Display this as action because here some users may be updated:
   
cron_log_action_end( "\n".sprintf( '%d of %d users(with IDs: %s) were marked with status "Failed activation" or "Pending delete"!',
           
$success_mark_failed_users_num, $mark_failed_users_num, implode( ', ', $mark_failed_users ) )."\n",
        (
$mark_failed_users_num ? ( $mark_failed_users_num == $success_mark_failed_users_num ? 'success' : 'warning' ) : NULL ) );
}
else
{    
// Don't display this as action because no users to update a status:
   
cron_log_append( "\n".sprintf( '%d users were marked with status "Failed activation" or "Pending delete"!', 0 )."\n" );
}

// ---- #3 Send a delete warning reminder:
$send_delete_warning_users_num = count( $send_delete_warning_users );
$succes_sent_delete_warning_users_num = check_cron_job_emails_limit() // Run email sending only when max emails number was not reached in the same function above
   
? send_easy_validate_emails( $send_delete_warning_users, true, false, NULL, 'cron_job', 'account_delete_warning' )
    :
0;
cron_log_append( sprintf( '%d of %d delete warning reminder emails were sent!', $succes_sent_delete_warning_users_num, $send_delete_warning_users_num )."\n",
    (
$send_delete_warning_users_num ? ( $send_delete_warning_users_num == $succes_sent_delete_warning_users_num ? 'success' : 'warning' ) : NULL ) );

// ---- #4 Delete users:
$succes_deleted_users_num = 0;
$delete_users_num = count( $delete_account_users );
if(
$delete_users_num )
{
   
// Delete private messages, comments and files, but don't mark the deleted users as spammers:
   
set_param( 'force_delete_messages', 1 );
   
set_param( 'force_delete_comments', 1 );
   
set_param( 'force_delete_files', 1 );

    foreach(
$delete_account_users as $delete_account_user_ID )
    {
        if( ! (
$deleted_User = & $UserCache->get_by_ID( $delete_account_user_ID, false, false ) ) )
        {    
// Wrong user:
           
cron_log_action_end( 'User #'.$delete_account_user_ID.' is not found.', 'error' );
            continue;
        }

       
$deleted_user_login = $deleted_User->get_identity_link();
        if(
$deleted_User->dbdelete() )
        {
           
cron_log_action_end( 'User #'.$delete_account_user_ID.' '.$deleted_user_login.' was deleted.' );
           
$succes_deleted_users_num++;
        }
        else
        {
           
cron_log_action_end( 'User #'.$delete_account_user_ID.' '.$deleted_user_login.' cannot be deleted.', 'error' );
        }
    }
}
cron_log_append( sprintf( '%d users were deleted!', $succes_deleted_users_num ),
    (
$delete_users_num ? ( $delete_users_num == $succes_deleted_users_num ? 'success' : 'warning' ) : NULL ) );

return
1; /* ok */
?>