<?php /* * This file is part of Oveleon ContaoMemberExtension Bundle. * * (c) https://www.oveleon.de/ */ namespace Oveleon\ContaoMemberExtensionBundle; use Contao\Config; use Contao\Dbafs; use Contao\File; use Contao\FilesModel; use Contao\Frontend; use Contao\FrontendUser; use Contao\MemberModel; use Contao\StringUtil; use Contao\Validator; /** * Class Member * * @author Fabian Ekert <fabian@oveleon.de> * @author Daniele Sciannimanica <https://github.com/doishub> */ class Member extends Frontend { /** * Update avatar of member * * @param FrontendUser $objUser * @param array $arrData */ public function updateAvatar($objUser, $arrData) { $objMember = MemberModel::findByPk($objUser->id); if ($objMember === null) { return; } $file = $_SESSION['FILES']['avatar']; $maxlength_kb = $this->getMaximumUploadSize(); // Sanitize the filename try { $file['name'] = StringUtil::sanitizeFileName($file['name']); } catch (\InvalidArgumentException $e) { // ToDo: Fehler: Dateiname beinhaltet unzulässige Zeichen return; } // Invalid file name if (!Validator::isValidFileName($file['name'])) { // ToDo: Fehler: Dateiname beinhaltet unzulässige Zeichen return; } // File was not uploaded // ToDo // File is too big if ($file['size'] > $maxlength_kb) { // ToDo: Fehler: Datei zu groß unset($_SESSION['FILES']['avatar']); return; } $objFile = new File($file['name']); $uploadTypes = StringUtil::trimsplit(',', \Config::get('validImageTypes')); // File type is not allowed if (!\in_array($objFile->extension, $uploadTypes)) { // ToDo: Fehler: Dateityp nicht erlaubt unset($_SESSION['FILES']['avatar']); return; } if ($arrImageSize = @getimagesize($file['tmp_name'])) { $intImageWidth = Config::get('imageWidth'); // Image exceeds maximum image width if ($intImageWidth > 0 && $arrImageSize[0] > $intImageWidth) { // ToDo: Fehler: Bild ist zu groß in der breite unset($_SESSION['FILES']['avatar']); return; } $intImageHeight = Config::get('imageHeight'); // Image exceeds maximum image height if ($intImageHeight > 0 && $arrImageSize[1] > $intImageHeight) { // ToDo: Fehler: Bild ist zu groß in der höhe unset($_SESSION['FILES']['avatar']); return; } $_SESSION['FILES']['avatar'] = $_SESSION['FILES']['avatar']; // Overwrite the upload folder with user's home directory if (!$objMember->assignDir || !$objMember->homeDir) { return; } $intUploadFolder = $objMember->homeDir; $objUploadFolder = FilesModel::findByUuid($intUploadFolder); // The upload folder could not be found if ($objUploadFolder === null) { throw new \Exception("Invalid upload folder ID $intUploadFolder"); } $strUploadFolder = $objUploadFolder->path; // Store the file if the upload folder exists if ($strUploadFolder != '' && is_dir(TL_ROOT . '/' . $strUploadFolder)) { $this->import('Files'); // Move the file to its destination $this->Files->move_uploaded_file($file['tmp_name'], $strUploadFolder . '/' . $file['name']); $this->Files->chmod($strUploadFolder . '/' . $file['name'], Config::get('defaultFileChmod')); $strUuid = null; $strFile = $strUploadFolder . '/' . $file['name']; // Generate the DB entries if (Dbafs::shouldBeSynchronized($strFile)) { $objModel = FilesModel::findByPath($strFile); if ($objModel === null) { $objModel = Dbafs::addResource($strFile); } $strUuid = StringUtil::binToUuid($objModel->uuid); // Update the hash of the target folder Dbafs::updateFolderHashes($strUploadFolder); // Update member avatar $objMember->avatar = $objModel->uuid; $objMember->save(); } // Add the session entry (see #6986) $_SESSION['FILES']['avatar'] = array ( 'name' => $file['name'], 'type' => $file['type'], 'tmp_name' => TL_ROOT . '/' . $strFile, 'error' => $file['error'], 'size' => $file['size'], 'uploaded' => true, 'uuid' => $strUuid ); // Add a log entry $this->log('File "' . $strUploadFolder . '/' . $file['name'] . '" has been uploaded', __METHOD__, TL_FILES); } } unset($_SESSION['FILES']['avatar']); } /** * Return the maximum upload file size in bytes * * @return string */ protected function getMaximumUploadSize() { // Get the upload_max_filesize from the php.ini $upload_max_filesize = ini_get('upload_max_filesize'); // Convert the value to bytes if (stripos($upload_max_filesize, 'K') !== false) { $upload_max_filesize = round($upload_max_filesize * 1024); } elseif (stripos($upload_max_filesize, 'M') !== false) { $upload_max_filesize = round($upload_max_filesize * 1024 * 1024); } elseif (stripos($upload_max_filesize, 'G') !== false) { $upload_max_filesize = round($upload_max_filesize * 1024 * 1024 * 1024); } return min($upload_max_filesize, Config::get('maxFileSize')); } }