/** * @see Action::execute() */ public function execute() { parent::execute(); // delete old user avatar if necessary if ($this->avatarType == 'user') { $this->avatar->delete(); $this->avatar = null; } // update user $sql = "UPDATE\twcf" . WCF_N . "_user\n\t\t\tSET\tavatarID = 0,\n\t\t\t\tgravatar = ''\n\t\t\tWHERE\tuserID = " . WCF::getUser()->userID; WCF::getDB()->sendQuery($sql); // reset session WCF::getSession()->resetUserData(); // forward if (empty($_REQUEST['ajax'])) { HeaderUtil::redirect('index.php?form=AvatarEdit' . SID_ARG_2ND_NOT_ENCODED); exit; } }
/** * @see Action::execute() */ public function execute() { parent::execute(); // check permission WCF::getUser()->checkPermission('admin.avatar.canDeleteAvatar'); // delete avatar require_once WCF_DIR . 'lib/data/user/avatar/AvatarEditor.class.php'; $avatar = new AvatarEditor($this->avatarID); if (!$avatar->avatarID) { throw new IllegalLinkException(); } $avatar->delete(); if (!$avatar->userID) { $sql = "UPDATE\twcf" . WCF_N . "_user\n\t\t\t\tSET\tavatarID = 0\n\t\t\t\tWHERE\tavatarID = " . $this->avatarID; WCF::getDB()->sendQuery($sql); } $this->executed(); // forward to list page HeaderUtil::redirect('index.php?page=AvatarList&deletedAvatarID=' . $this->avatarID . '&type=' . $this->type . '&pageNo=' . $this->pageNo . '&packageID=' . PACKAGE_ID . SID_ARG_2ND_NOT_ENCODED); exit; }
/** * @see Form::validate() */ public function validate() { parent::validate(); // validate group id $group = new Group($this->groupID); if (!$group->groupID) { throw new UserInputException('groupID'); } // category if ($this->avatarCategoryID != 0) { $avatarCategory = new AvatarCategory($this->avatarCategoryID); if (!$avatarCategory->avatarCategoryID) { throw new UserInputException('avatarCategoryID'); } } $savedAvatars = 0; WCF::getTPL()->assignByRef('savedAvatars', $savedAvatars); // upload avatar(s) if ($this->upload && $this->upload['error'] != 4) { if ($this->upload['error'] != 0) { throw new UserInputException('upload', 'uploadFailed'); } // try to open file as an archive if (preg_match('/(?:tar\\.gz|tgz|tar)$/i', $this->upload['name'])) { $errors = array(); $tar = new Tar($this->upload['tmp_name']); foreach ($tar->getContentList() as $file) { if ($file['type'] != 'folder') { // extract to tmp dir $tmpname = FileUtil::getTemporaryFilename('avatar_'); $tar->extract($file['index'], $tmpname); try { $this->avatarIDs[] = AvatarEditor::create($tmpname, $file['filename'], 'upload', 0, $this->groupID, $this->neededPoints, $this->avatarCategoryID); $savedAvatars++; } catch (UserInputException $e) { $errors[] = array('filename' => $file['filename'], 'errorType' => $e->getType()); } } } $tar->close(); @unlink($this->upload['tmp_name']); if (count($errors)) { throw new UserInputException('upload', $errors); } else { if ($savedAvatars == 0) { throw new UserInputException('upload', 'emptyArchive'); } } } else { // import as image file $this->avatarIDs[] = AvatarEditor::create($this->upload['tmp_name'], $this->upload['name'], 'upload', 0, $this->groupID, $this->neededPoints, $this->avatarCategoryID); $savedAvatars++; } } else { if (!empty($this->filename)) { if (!file_exists($this->filename)) { throw new UserInputException('filename', 'notFound'); } // copy avatars from a dir if (is_dir($this->filename)) { $errors = array(); $this->filename = FileUtil::addTrailingSlash($this->filename); $handle = opendir($this->filename); while (($file = readdir($handle)) !== false) { if ($file != '.' && $file != '..' && is_file($this->filename . $file)) { try { $this->avatarIDs[] = AvatarEditor::create($this->filename . $file, $this->filename . $file, 'filename', 0, $this->groupID, $this->neededPoints, $this->avatarCategoryID); $savedAvatars++; } catch (UserInputException $e) { $errors[] = array('filename' => $this->filename . $file, 'errorType' => $e->getType()); } } } if (count($errors)) { throw new UserInputException('filename', $errors); } else { if ($savedAvatars == 0) { throw new UserInputException('filename', 'emptyFolder'); } } } else { $this->avatarIDs[] = AvatarEditor::create($this->filename, $this->filename, 'filename', 0, $this->groupID, $this->neededPoints, $this->avatarCategoryID); $savedAvatars++; } } else { throw new UserInputException('upload'); } } }
/** * @see Form::validate() */ public function validate() { parent::validate(); if ($this->avatarID) { if ($this->avatarID == -1) { if (empty($this->gravatar)) { // check permission WCF::getUser()->checkPermission('user.profile.avatar.canUploadAvatar'); // upload or download avatar if ($this->avatarUpload && $this->avatarUpload['error'] != 4) { if ($this->avatarUpload['error'] != 0) { throw new UserInputException('avatarUpload', 'uploadFailed'); } $this->avatarID = AvatarEditor::create($this->avatarUpload['tmp_name'], $this->avatarUpload['name'], 'avatarUpload', WCF::getUser()->userID); } else { if ($this->avatarURL != 'http://') { if (StringUtil::indexOf($this->avatarURL, 'http://') !== 0) { throw new UserInputException('avatarURL', 'downloadFailed'); } try { $tmpName = FileUtil::downloadFileFromHttp($this->avatarURL, 'avatar'); } catch (SystemException $e) { throw new UserInputException('avatarURL', 'downloadFailed'); } $this->avatarID = AvatarEditor::create($tmpName, $this->avatarURL, 'avatarURL', WCF::getUser()->userID); } else { throw new UserInputException('avatarUpload'); } } } else { $this->avatarID = 0; } } else { // check permission WCF::getUser()->checkPermission('user.profile.avatar.canUseDefaultAvatar'); // use a default avatar $avatar = new AvatarEditor($this->avatarID); if (!$avatar->avatarID || $avatar->userID || $avatar->groupID && !in_array($avatar->groupID, WCF::getUser()->getGroupIDs()) || $avatar->neededPoints > WCF::getUser()->activityPoints) { throw new UserInputException('availableAvatars', 'invalid'); } // check category permissions if ($avatar->avatarCategoryID) { $category = new AvatarCategory($avatar->avatarCategoryID); if ($category->groupID && !in_array($category->groupID, WCF::getUser()->getGroupIDs()) || $category->neededPoints > WCF::getUser()->activityPoints) { throw new UserInputException('availableAvatars', 'invalid'); } } } } }
/** * @see AbstractLostAndFounDatabaseItem::delete() */ public function delete() { $editor = new AvatarEditor($this->objectID); $editor->delete(); }
/** * @see EventListener::execute() */ public function execute($eventObj, $className, $eventName) { if (MODULE_AVATAR == 1) { if ($eventName == 'readFormParameters') { if (isset($_POST['avatarID'])) { $this->avatarID = intval($_POST['avatarID']); } if (isset($_POST['disableAvatar'])) { $this->disableAvatar = intval($_POST['disableAvatar']); } if (isset($_POST['disableAvatarReason'])) { $this->disableAvatarReason = $_POST['disableAvatarReason']; } if (isset($_POST['useAvatar'])) { $this->useAvatar = intval($_POST['useAvatar']); } if (isset($_POST['avatarURL'])) { $this->avatarURL = StringUtil::trim($_POST['avatarURL']); } if (isset($_FILES['avatarUpload'])) { $this->avatarUpload = $_FILES['avatarUpload']; } if (MODULE_GRAVATAR == 1 && isset($_POST['gravatar'])) { $this->gravatar = StringUtil::trim($_POST['gravatar']); } } else { if ($eventName == 'validate') { try { if ($this->useAvatar == 1) { if (empty($this->gravatar)) { // upload or download avatar if ($this->avatarUpload && $this->avatarUpload['error'] != 4) { if ($this->avatarUpload['error'] != 0) { throw new UserInputException('avatarUpload', 'uploadFailed'); } $this->avatarID = AvatarEditor::create($this->avatarUpload['tmp_name'], $this->avatarUpload['name'], 'avatarUpload', $eventObj->userID); } else { if ($this->avatarURL != 'http://') { if (StringUtil::indexOf($this->avatarURL, 'http://') !== 0) { throw new UserInputException('avatarURL', 'downloadFailed'); } try { $tmpName = FileUtil::downloadFileFromHttp($this->avatarURL, 'avatar'); } catch (SystemException $e) { throw new UserInputException('avatarURL', 'downloadFailed'); } $this->avatarID = AvatarEditor::create($tmpName, $this->avatarURL, 'avatarURL', $eventObj->userID); } else { $this->avatarID = $eventObj->user->avatarID; } } } } else { if ($this->useAvatar == 2) { // use a default avatar $avatar = new AvatarEditor($this->avatarID); if (!$avatar->avatarID || $avatar->userID || $avatar->groupID && !in_array($avatar->groupID, $eventObj->user->getGroupIDs()) || $avatar->neededPoints > $eventObj->user->activityPoints) { throw new UserInputException('availableAvatars', 'invalid'); } } else { $this->avatarID = 0; } } } catch (UserInputException $e) { $eventObj->errorType[$e->getField()] = $e->getType(); } } else { if ($eventName == 'save') { // delete old avatar if necessary if ($eventObj->user->avatarID) { $currentAvatar = new AvatarEditor($eventObj->user->avatarID); if ($currentAvatar->userID && $this->avatarID != $currentAvatar->avatarID) { $currentAvatar->delete(); } } // update user $eventObj->additionalFields['avatarID'] = $this->avatarID; $eventObj->additionalFields['disableAvatar'] = $this->disableAvatar; $eventObj->additionalFields['disableAvatarReason'] = $this->disableAvatarReason; $eventObj->additionalFields['gravatar'] = $this->gravatar; } else { if ($eventName == 'show') { // get default values if (!count($_POST)) { $this->avatarID = $eventObj->user->avatarID; $this->disableAvatar = $eventObj->user->disableAvatar; $this->disableAvatarReason = $eventObj->user->disableAvatarReason; $this->gravatar = $eventObj->user->gravatar; } $currentAvatar = null; if ($this->avatarID) { $currentAvatar = new AvatarEditor($this->avatarID); $this->useAvatar = $currentAvatar->userID ? 1 : 2; } else { if ($this->gravatar) { require_once WCF_DIR . 'lib/data/user/avatar/Gravatar.class.php'; $currentAvatar = new Gravatar($this->gravatar); $this->useAvatar = 1; } } $availableAvatarCategories = $this->getAvailableAvatars(implode(',', $eventObj->user->getGroupIDs()), intval($eventObj->user->activityPoints)); $avatarCount = 0; foreach ($availableAvatarCategories as $availableAvatarCategory) { $avatarCount += count($availableAvatarCategory['avatars']); } WCF::getTPL()->assign(array('avatarID' => $this->avatarID, 'disableAvatar' => $this->disableAvatar, 'disableAvatarReason' => $this->disableAvatarReason, 'avatarURL' => $this->avatarURL, 'currentAvatar' => $currentAvatar, 'avatarCategories' => $availableAvatarCategories, 'items' => $avatarCount, 'useAvatar' => $this->useAvatar, 'gravatar' => $this->gravatar)); WCF::getTPL()->append(array('additionalTabs' => '<li id="avatar"><a onclick="tabMenu.showSubTabMenu(\'avatar\');"><span>' . WCF::getLanguage()->get('wcf.user.avatar') . '</span></a></li>', 'additionalTabContents' => WCF::getTPL()->fetch('userEditAvatar'))); } } } } } }
/** * Returns a list of allowed avatar file extensions. * * @return array<string> */ public static function getAllowedFileExtensions() { if (self::$allowedFileExtensions === null) { self::$allowedFileExtensions = array(); self::$allowedFileExtensions = array_unique(explode("\n", StringUtil::unifyNewlines(WCF::getUser()->getPermission('user.profile.avatar.allowedFileExtensions')))); self::$allowedFileExtensions = array_diff(self::$allowedFileExtensions, self::$illegalFileExtensions); } return self::$allowedFileExtensions; }