vendor/pimcore/pimcore/models/User/AbstractUser.php line 71

Open in your IDE?
  1. <?php
  2. /**
  3.  * Pimcore
  4.  *
  5.  * This source file is available under two different licenses:
  6.  * - GNU General Public License version 3 (GPLv3)
  7.  * - Pimcore Commercial License (PCL)
  8.  * Full copyright and license information is available in
  9.  * LICENSE.md which is distributed with this source code.
  10.  *
  11.  *  @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  12.  *  @license    http://www.pimcore.org/license     GPLv3 and PCL
  13.  */
  14. namespace Pimcore\Model\User;
  15. use Pimcore\Event\Model\UserRoleEvent;
  16. use Pimcore\Event\Traits\RecursionBlockingEventDispatchHelperTrait;
  17. use Pimcore\Event\UserRoleEvents;
  18. use Pimcore\Model;
  19. /**
  20.  * @method \Pimcore\Model\User\AbstractUser\Dao getDao()
  21.  * @method void setLastLoginDate()
  22.  *
  23.  * @abstract Will be natively abstract in Pimcore 11
  24.  */
  25. class AbstractUser extends Model\AbstractModel
  26. {
  27.     use RecursionBlockingEventDispatchHelperTrait;
  28.     /**
  29.      * @var int|null
  30.      */
  31.     protected $id;
  32.     /**
  33.      * @var int|null
  34.      */
  35.     protected $parentId;
  36.     /**
  37.      * @var string|null
  38.      */
  39.     protected $name;
  40.     /**
  41.      * @var string
  42.      */
  43.     protected $type;
  44.     /**
  45.      * @param int $id
  46.      *
  47.      * @return static|null
  48.      */
  49.     public static function getById($id)
  50.     {
  51.         if (!is_numeric($id) || $id 0) {
  52.             return null;
  53.         }
  54.         $cacheKey 'user_' $id;
  55.         try {
  56.             if (\Pimcore\Cache\RuntimeCache::isRegistered($cacheKey)) {
  57.                 $user \Pimcore\Cache\RuntimeCache::get($cacheKey);
  58.             } else {
  59.                 $user = new static();
  60.                 $user->getDao()->getById($id);
  61.                 $className Service::getClassNameForType($user->getType());
  62.                 if (get_class($user) !== $className) {
  63.                     /** @var AbstractUser $user */
  64.                     $user $className::getById($user->getId());
  65.                 }
  66.                 \Pimcore\Cache\RuntimeCache::set($cacheKey$user);
  67.             }
  68.         } catch (Model\Exception\NotFoundException $e) {
  69.             return null;
  70.         }
  71.         if (!$user || !static::typeMatch($user)) {
  72.             return null;
  73.         }
  74.         return $user;
  75.     }
  76.     /**
  77.      * @param array $values
  78.      *
  79.      * @return static
  80.      */
  81.     public static function create($values = [])
  82.     {
  83.         $user = new static();
  84.         self::checkCreateData($values);
  85.         $user->setValues($values);
  86.         $user->save();
  87.         return $user;
  88.     }
  89.     /**
  90.      * @param string $name
  91.      *
  92.      * @return static|null
  93.      */
  94.     public static function getByName($name)
  95.     {
  96.         try {
  97.             $user = new static();
  98.             $user->getDao()->getByName($name);
  99.             return $user;
  100.         } catch (Model\Exception\NotFoundException $e) {
  101.             return null;
  102.         }
  103.     }
  104.     /**
  105.      * @return int|null
  106.      */
  107.     public function getId()
  108.     {
  109.         return $this->id;
  110.     }
  111.     /**
  112.      * @param int $id
  113.      *
  114.      * @return $this
  115.      */
  116.     public function setId($id)
  117.     {
  118.         $this->id = (int) $id;
  119.         return $this;
  120.     }
  121.     /**
  122.      * @return int|null
  123.      */
  124.     public function getParentId()
  125.     {
  126.         return $this->parentId;
  127.     }
  128.     /**
  129.      * @param int $parentId
  130.      *
  131.      * @return $this
  132.      */
  133.     public function setParentId($parentId)
  134.     {
  135.         $this->parentId = (int)$parentId;
  136.         return $this;
  137.     }
  138.     /**
  139.      * @return string|null
  140.      */
  141.     public function getName()
  142.     {
  143.         return $this->name;
  144.     }
  145.     /**
  146.      * @param string $name
  147.      *
  148.      * @return $this
  149.      */
  150.     public function setName($name)
  151.     {
  152.         $this->name $name;
  153.         return $this;
  154.     }
  155.     /**
  156.      * @return string
  157.      */
  158.     public function getType()
  159.     {
  160.         return $this->type;
  161.     }
  162.     /**
  163.      * @return $this
  164.      *
  165.      * @throws \Exception
  166.      */
  167.     public function save()
  168.     {
  169.         $isUpdate false;
  170.         if ($this->getId()) {
  171.             $isUpdate true;
  172.             $this->dispatchEvent(new UserRoleEvent($this), UserRoleEvents::PRE_UPDATE);
  173.         } else {
  174.             $this->dispatchEvent(new UserRoleEvent($this), UserRoleEvents::PRE_ADD);
  175.         }
  176.         if (!preg_match('/^[a-zA-Z0-9\-\.~_@]+$/'$this->getName())) {
  177.             throw new \Exception('Invalid name for user/role `' $this->getName() . '` (allowed characters: a-z A-Z 0-9 -.~_@)');
  178.         }
  179.         $this->beginTransaction();
  180.         try {
  181.             if (!$this->getId()) {
  182.                 $this->getDao()->create();
  183.             }
  184.             $this->update();
  185.             $this->commit();
  186.         } catch (\Exception $e) {
  187.             $this->rollBack();
  188.             throw $e;
  189.         }
  190.         if ($isUpdate) {
  191.             $this->dispatchEvent(new UserRoleEvent($this), UserRoleEvents::POST_UPDATE);
  192.         } else {
  193.             $this->dispatchEvent(new UserRoleEvent($this), UserRoleEvents::POST_ADD);
  194.         }
  195.         return $this;
  196.     }
  197.     /**
  198.      * @throws \Exception
  199.      */
  200.     public function delete()
  201.     {
  202.         if ($this->getId() < 1) {
  203.             throw new \Exception('Deleting the system user is not allowed!');
  204.         }
  205.         $this->dispatchEvent(new UserRoleEvent($this), UserRoleEvents::PRE_DELETE);
  206.         $type $this->getType();
  207.         // delete all children
  208.         $list = ($type === 'role' || $type === 'rolefolder') ? new Model\User\Role\Listing() : new Listing();
  209.         $list->setCondition('parentId = ?'$this->getId());
  210.         foreach ($list as $user) {
  211.             $user->delete();
  212.         }
  213.         // remove user-role relations
  214.         if ($type === 'role') {
  215.             $this->cleanupUserRoleRelations();
  216.         }
  217.         // now delete the current user
  218.         $this->getDao()->delete();
  219.         \Pimcore\Cache::clearAll();
  220.         $this->dispatchEvent(new UserRoleEvent($this), UserRoleEvents::POST_DELETE);
  221.     }
  222.     /**
  223.      * https://github.com/pimcore/pimcore/issues/7085
  224.      *
  225.      * @throws \Exception
  226.      */
  227.     private function cleanupUserRoleRelations()
  228.     {
  229.         $userRoleListing = new Listing();
  230.         $userRoleListing->setCondition('FIND_IN_SET(' $this->getId() . ',roles)');
  231.         $userRoleListing $userRoleListing->load();
  232.         if (count($userRoleListing)) {
  233.             foreach ($userRoleListing as $relatedUser) {
  234.                 $userRoles $relatedUser->getRoles();
  235.                 if (is_array($userRoles)) {
  236.                     $key array_search($this->getId(), $userRoles);
  237.                     if (false !== $key) {
  238.                         unset($userRoles[$key]);
  239.                         $relatedUser->setRoles($userRoles);
  240.                         $relatedUser->save();
  241.                     }
  242.                 }
  243.             }
  244.         }
  245.     }
  246.     /**
  247.      * @param string $type
  248.      *
  249.      * @return $this
  250.      */
  251.     public function setType($type)
  252.     {
  253.         $this->type $type;
  254.         return $this;
  255.     }
  256.     /**
  257.      * @throws \Exception
  258.      */
  259.     protected function update()
  260.     {
  261.         $this->getDao()->update();
  262.     }
  263.     /**
  264.      * @internal
  265.      *
  266.      * @param AbstractUser $user
  267.      *
  268.      * @return bool
  269.      */
  270.     protected static function typeMatch(AbstractUser $user): bool
  271.     {
  272.         $staticType = static::class;
  273.         if ($staticType !== AbstractUser::class && !$user instanceof $staticType) {
  274.             return false;
  275.         }
  276.         return true;
  277.     }
  278. }