* @owner University of Latvia * @version 3.0 * @since 28.05.2018 * * @package Lu\LuAuth\Models */ class Users { /** * Extension configuration * * @array */ public $conf; /** * Table name * * @var string */ protected $table; /** * Set request type * * @var string */ protected $type = 'be'; /** * Username * * @var string */ private $username; /** * Users constructor. Set initial usage. * * @param string $type 'be' or 'fe' */ public function __construct(string $type) { // Set config value $this->conf = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Configuration\ExtensionConfiguration::class)->get('lu_auth'); // Set used group if ($type == 'fe') { $this->table = 'fe_users'; } else { $this->table = 'be_users'; } // Set used group $this->type = $type == 'fe' ? 'fe' : 'be'; } /** * Retrieve table name by type * * @param string $type * * @return string */ static public function getTable(string $type) { $self = new self($type); return $self->table; } /** * Retrieve valid username * * @param $username * * @return array */ public function getUserData($username, string $options = NULL): array { // Check if username given if (empty($username)) { return []; } else { $this->username = $username; } // Request user data from DB $queryBuilder = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Database\ConnectionPool::class)->getQueryBuilderForTable($this->table); $queryBuilder->select('*') ->from($this->table) ->where('disable = 0 AND deleted = 0') ->andWhere($queryBuilder->expr()->eq('username', $queryBuilder->createNamedParameter($this->username))); $user = $queryBuilder->execute()->fetch(); // Check if options if (empty($user) && $options == 'activate') { // Update user and refetch, if something updated $result = $this->activateUser(); if ($result) { $user = self::getUserData($username); } } // Return user return empty($user) ? [] : $user; } /** * Activate user * * @return array|bool */ public function activateUser() { // Check for where parameters and username if (empty($this->username)) { return []; } // Update user data in DB $queryBuilder = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Database\ConnectionPool::class)->getQueryBuilderForTable($this->table); $queryBuilder->update($this->table) ->where($queryBuilder->expr()->eq('username', $queryBuilder->createNamedParameter($this->username))) ->set('disable', '0') ->set('deleted', '0'); $result = $queryBuilder->execute(); // Return affected rows, if any return $result; } /** * Update user data * * @param $user * * @return array */ public function updateUser($user) { // Pre-set used models $GroupsModel = new Groups($this->type); // @TODO: Log event here //$this->writelog(255,3,3,2, "Importing user %s!", array($this->remoteUser)); // Get groups string $arrGroups = $GroupsModel->getGroupsData($user['username']); $user = [ 'tstamp' => time(), 'email' => $user['email'] ?? '', 'username' => $user['username'], 'name' => $user['name'] ?? '', 'first_name' => $user['first_name'] ?? '', 'last_name' => $user['last_name'] ?? '', 'telephone' => $user['telephone'] ?? '', 'address' => $user['address'] ?? '', 'usergroup' => $arrGroups, ]; // Update database $queryBuilder = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Database\ConnectionPool::class)->getQueryBuilderForTable($this->table); $queryBuilder->update($this->table); $queryBuilder->where($queryBuilder->expr()->eq('username', $queryBuilder->createNamedParameter($this->username))); // Set user fields. There's got to be a better way >.< foreach ($user as $key => $value) { $queryBuilder->set($key, $value); } $queryBuilder->execute(); // Request new user and return return $this->getUserData($user['username']); } /** * Create new user and return its data * * @param array $user * * @return array */ public function insertUser($user = []) { // Pre-set used models $ApiRand = new Randomizer(); $GroupsModel = new Groups($this->type); // @TODO: Log event here //$this->writelog(255,3,3,2, "Importing user %s!", array($this->remoteUser)); // Get password string $password = $ApiRand->getRandomString(32); $password = json_decode($password); // Get groups string $arrGroups = $GroupsModel->getGroupsData($user['username']); $user = [ 'crdate' => time(), 'tstamp' => time(), 'pid' => $this->conf['extraStoragePid'], 'password' => $password->data, 'email' => $user['email'], 'username' => $user['username'], 'name' => $user['name'], 'first_name' => $user['first_name'], 'last_name' => $user['last_name'], 'telephone' => $user['telephone'], 'address' => (string)$user['address'], 'usergroup' => $arrGroups, ]; // Remove empty values foreach($user as $k=>$item) { if (empty($item)) { unset($user[$k]); } } // Save to database $queryBuilder = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Database\ConnectionPool::class)->getQueryBuilderForTable($this->table); $queryBuilder->insert($this->table)->values($user)->execute(); // Request new user and return return $this->getUserData($user['username']); } }