Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/Service/User/PasswordChange.php
<?php

namespace XF\Service\User;

class
PasswordChange extends \XF\Service\AbstractService
{
   
/**
     * @var \XF\Entity\User
     */
   
protected $user;

   
/**
     * @var \XF\Entity\UserAuth
     */
   
protected $userAuth;

    protected
$logIp = true;

    protected
$notify = true;

    protected
$invalidateRememberKeys = true;

    public function
__construct(\XF\App $app, \XF\Entity\User $user, $newPassword)
    {
       
parent::__construct($app);

       
$this->user = $user;
       
$this->userAuth = $user->getRelationOrDefault('Auth', false);

       
$this->setPassword($newPassword);
    }

    public function
setPassword($newPassword)
    {
       
$this->userAuth->setPassword($newPassword);
    }

    public function
getUser()
    {
        return
$this->user;
    }

    public function
setLogIp($logIp)
    {
       
$this->logIp = $logIp;
    }

    public function
setNotify($notify)
    {
       
$this->notify = $notify;
    }

    public function
setInvalidateRememberKeys($invalidate)
    {
       
$this->invalidateRememberKeys = $invalidate;
    }

    public function
isAdminChange()
    {
       
$this->setLogIp(false);
       
$this->setNotify(false);
    }

    public function
isValid(&$error)
    {
       
$this->userAuth->preSave();

       
$errors = $this->userAuth->getErrors();
        if (empty(
$errors))
        {
            return
true;
        }
        else
        {
           
$error = reset($errors);
            return
false;
        }
    }

    public function
save()
    {
        if (!
$this->isValid($error))
        {
            throw new \
LogicException("Password change can't be saved, not valid: $error");
        }

       
$saved = $this->userAuth->save(false);

        if (
$saved)
        {
           
$this->onPasswordChange();
        }

        return
$saved;
    }

    protected function
onPasswordChange()
    {
        if (
$this->invalidateRememberKeys)
        {
           
$this->repository('XF:UserRemember')->clearUserRememberRecords($this->user->user_id);
        }

        if (
$this->notify)
        {
           
$this->sendPasswordChangedNotice();
        }

        if (
$this->logIp)
        {
           
$ip = ($this->logIp === true ? $this->app->request()->getIp() : $this->logIp);
           
$this->writeIpLog($ip);
        }
    }

    protected function
sendPasswordChangedNotice()
    {
       
$user = $this->user;
        if (!
$user->email)
        {
            return;
        }

       
$mail = $this->app->mailer()->newMail();
       
$mail->setToUser($user)
            ->
setTemplate('password_changed', [
               
'user' => $user,
               
'ip' => ($this->logIp === true ? $this->app->request()->getIp() : $this->logIp)
            ]);

       
$mail->send();
    }

    protected function
writeIpLog($ip)
    {
       
$user = $this->user;

       
/** @var \XF\Repository\Ip $ipRepo */
       
$ipRepo = $this->repository('XF:Ip');
       
$ipRepo->logIp($user->user_id, $ip, 'user', $user->user_id, 'password_change');
    }
}