Вход Регистрация
Файл: library/XenForo/Model/UserConfirmation.php
Строк: 344
<?php

/**
 * Model for user confirmation.
 *
 * @package XenForo_UserConfirmation
 */
class XenForo_Model_UserConfirmation extends XenForo_Model
{
    
/**
     * Gets the specified user confirmation record.
     *
     * @param integer $userId
     * @param string $type
     *
     * @return array|false
     */
    
public function getUserConfirmationRecord($userId$type)
    {
        return 
$this->_getDb()->fetchRow('
            SELECT *
            FROM xf_user_confirmation
            WHERE user_id = ?
                AND confirmation_type = ?
        '
, array($userId$type));
    }

    
/**
     * Validates a user confirmation request. This works on the base components.
     * If you already have a record, use validateUserConfirmationRecord.
     *
     * @param integer $userId
     * @param string $type
     * @param string $key Confirmation key to validate against DB value
     *
     * @return boolean
     */
    
public function validateUserConfirmation($userId$type$key)
    {
        
$confirmation $this->getUserConfirmationRecord($userId$type);
        return (
$confirmation && $this->validateUserConfirmationRecord($key$confirmation));
    }

    
/**
     * Validates a user confirmation record against a specific key.
     *
     * @param string $key
     * @param array $confirmation Confirmation record from DB.
     *
     * @return boolean
     */
    
public function validateUserConfirmationRecord($key, array $confirmation)
    {
        return (
$confirmation['confirmation_key'] === $key);
    }

    
/**
     * Generate a new user confirmation record. Note that a user can only have
     * one confirmation record of a given type.
     *
     * @param integer $userId
     * @param string $type
     *
     * @return array Confirmation record details
     */
    
public function generateUserConfirmationRecord($userId$type)
    {
        
$confirmation = array(
            
'user_id' => $userId,
            
'confirmation_type' => $type,
            
'confirmation_key' => XenForo_Application::generateRandomString(16),
            
'confirmation_date' => XenForo_Application::$time
        
);

        
$this->_getDb()->query('
            INSERT INTO xf_user_confirmation
                (user_id, confirmation_type, confirmation_key, confirmation_date)
            VALUES
                (?, ?, ?, ?)
            ON DUPLICATE KEY UPDATE
                confirmation_key = VALUES(confirmation_key),
                confirmation_date = VALUES(confirmation_date)
        '
, array($userId$type$confirmation['confirmation_key'], $confirmation['confirmation_date']));

        return 
$confirmation;
    }

    
/**
     * Delete a user's confirmation record.
     *
     * @param integer $userId
     * @param string $type
     */
    
public function deleteUserConfirmationRecord($userId$type)
    {
        
$db $this->_getDb();
        
$db->delete('xf_user_confirmation',
            
'user_id = ' $db->quote($userId) . ' AND confirmation_type = ' $db->quote($type)
        );
    }

    public function 
cleanUpUserConfirmationRecords($cutOff null)
    {
        if (
$cutOff === null)
        {
            
$cutOff XenForo_Application::$time 86400;
        }

        
$this->_getDb()->delete('xf_user_confirmation',
            
'confirmation_date <= ' intval($cutOff)
        );
    }

    
/**
     * Send email confirmation to the specified user.
     *
     * @param array $user User to send to
     * @param array|null $confirmation Existing confirmation record; if null, generates a new record
     *
     * @return boolean True if the email was sent successfully
     */
    
public function sendEmailConfirmation(array $user, array $confirmation null)
    {
        if (!
$confirmation)
        {
            
$confirmation $this->generateUserConfirmationRecord($user['user_id'], 'email');
        }

        
$params = array(
            
'user' => $user,
            
'confirmation' => $confirmation,
            
'boardTitle' => XenForo_Application::get('options')->boardTitle
        
);
        
$mail XenForo_Mail::create('user_email_confirmation'$params$user['language_id']);

        return 
$mail->send($user['email'], $user['username']);
    }

    
/**
     * Takes an action on a user awaiting moderation.
     *
     * @param array $user User info
     * @param string $action Action to take (accept or reject)
     * @param boolean $notify True to email user about action
     * @param string $rejectionReason If rejecting, an optional rejection reason
     *
     * @return boolean True if the user was processed
     */
    
public function processUserModeration(array $user$action$notify true$rejectionReason '')
    {
        if (
$user['user_state'] != 'moderated')
        {
            return 
false;
        }

        if (
$action == 'approve')
        {
            
$dw XenForo_DataWriter::create('XenForo_DataWriter_User');
            
$dw->setExistingData($user);
            
$dw->advanceRegistrationUserState();
            
$dw->save();

            if (
$notify)
            {
                
$params = array(
                    
'user' => $user,
                    
'boardTitle' => XenForo_Application::get('options')->boardTitle
                
);
                
$mail XenForo_Mail::create('user_account_approved'$params$user['language_id']);
                
$mail->send($user['email'], $user['username']);
            }

            return 
true;
        }
        else if (
$action == 'reject')
        {
            
$dw XenForo_DataWriter::create('XenForo_DataWriter_User');
            
$dw->setExistingData($user);
            
$dw->delete();

            if (
$notify)
            {
                
$params = array(
                    
'user' => $user,
                    
'boardTitle' => XenForo_Application::get('options')->boardTitle,
                    
'rejectionReason' => $rejectionReason
                
);
                
$mail XenForo_Mail::create('user_account_rejected'$params$user['language_id']);
                
$mail->send($user['email'], $user['username']);
            }

            return 
true;
        }

        return 
false;
    }

    
/**
     * Sends a password reset request.
     *
     * @param array $user
     * @param array|null $confirmation If null, generates a new confirmation record
     *
     * @return boolean True if email sent successfully
     */
    
public function sendPasswordResetRequest(array $user, array $confirmation null)
    {
        if (!
$confirmation)
        {
            
$confirmation $this->generateUserConfirmationRecord($user['user_id'], 'password');
        }

        
$params = array(
            
'user' => $user,
            
'confirmation' => $confirmation,
            
'boardTitle' => XenForo_Application::get('options')->boardTitle
        
);
        
$mail XenForo_Mail::create('user_lost_password'$params$user['language_id']);

        return 
$mail->send($user['email'], $user['username']);
    }

    
/**
     * Resets the specified user's password and emails the password to them if requested.
     *
     * @param integer $userId
     * @param boolean $sendEmail
     *
     * @return string New password
     */
    
public function resetPassword($userId$sendEmail true)
    {
        
$dw XenForo_DataWriter::create('XenForo_DataWriter_User');
        
$dw->setExistingData($userId);

        
$password XenForo_Application::generateRandomString(8);

        
$auth XenForo_Authentication_Abstract::createDefault();
        
$dw->set('scheme_class'$auth->getClassName());
        
$dw->set('data'$auth->generate($password));
        
$dw->save();

        
$user $dw->getMergedData();

        if (
$sendEmail)
        {
            
$params = array(
                
'user' => $user,
                
'password' => $password,
                
'boardTitle' => XenForo_Application::get('options')->boardTitle,
                
'boardUrl' => XenForo_Application::get('options')->boardUrl,
            );
            
$mail XenForo_Mail::create('user_lost_password_reset'$params$user['language_id']);
            
$mail->send($user['email'], $user['username']);
        }

        return 
$password;
    }
}
Онлайн: 2
Реклама