/** * @see \wcf\system\importer\IImporter::import() */ public function import($oldID, array $data, array $additionalData = array()) { // check file location if (!@file_exists($additionalData['fileLocation'])) { return 0; } // get image size $imageData = @getimagesize($additionalData['fileLocation']); if ($imageData === false) { return 0; } $data['width'] = $imageData[0]; $data['height'] = $imageData[1]; // check min size if ($data['width'] < 48 || $data['height'] < 48) { return 0; } // check image type if ($imageData[2] != IMAGETYPE_GIF && $imageData[2] != IMAGETYPE_JPEG && $imageData[2] != IMAGETYPE_PNG) { return 0; } // get file hash if (empty($data['fileHash'])) { $data['fileHash'] = sha1_file($additionalData['fileLocation']); } // get user id $data['userID'] = ImportHandler::getInstance()->getNewID('com.woltlab.wcf.user', $data['userID']); if (!$data['userID']) { return 0; } // save avatar $avatar = UserAvatarEditor::create($data); // check avatar directory // and create subdirectory if necessary $dir = dirname($avatar->getLocation()); if (!@file_exists($dir)) { FileUtil::makePath($dir, 0777); } // copy file try { if (!copy($additionalData['fileLocation'], $avatar->getLocation())) { throw new SystemException(); } // create thumbnails $action = new UserAvatarAction(array($avatar), 'generateThumbnails'); $action->executeAction(); // update owner $sql = "UPDATE\twcf" . WCF_N . "_user\n\t\t\t\tSET\tavatarID = ?\n\t\t\t\tWHERE\tuserID = ?"; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute(array($avatar->avatarID, $data['userID'])); return $avatar->avatarID; } catch (SystemException $e) { // copy failed; delete avatar $editor = new UserAvatarEditor($avatar); $editor->delete(); } return 0; }
/** * @see \wcf\data\IEditableObject::deleteAll() */ public static function deleteAll(array $objectIDs = array()) { $sql = "SELECT\t*\n\t\t\tFROM\twcf" . WCF_N . "_user_avatar\n\t\t\tWHERE\tavatarID IN (" . str_repeat('?,', count($objectIDs) - 1) . "?)"; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute($objectIDs); while ($avatar = $statement->fetchObject(self::$baseClass)) { $editor = new UserAvatarEditor($avatar); $editor->deleteFiles(); } return parent::deleteAll($objectIDs); }
/** * Craps an avatar. */ public function cropAvatar() { // created clipped avatar as base for new thumbnails $adapter = ImageHandler::getInstance()->getAdapter(); $adapter->loadFile($this->avatar->getLocation()); $adapter->clip($this->parameters['cropX'], $this->parameters['cropY'], UserAvatar::$maxThumbnailSize, UserAvatar::$maxThumbnailSize); // update thumbnails foreach (UserAvatar::$avatarThumbnailSizes as $size) { $thumbnail = $adapter->createThumbnail($size, $size); $adapter->writeImage($thumbnail, $this->avatar->getLocation($size)); } // update database entry $this->avatar->update(array('cropX' => $this->parameters['cropX'], 'cropY' => $this->parameters['cropY'])); return array('url' => $this->avatar->getURL(96)); }
/** * Fetches an avatar from a remote server and sets it for given user. */ public function fetchRemoteAvatar() { $avatarID = 0; $filename = ''; // fetch avatar from URL try { $request = new HTTPRequest($this->parameters['url']); $request->execute(); $reply = $request->getReply(); $filename = FileUtil::getTemporaryFilename('avatar_'); file_put_contents($filename, $reply['body']); $imageData = getimagesize($filename); if ($imageData === false) { throw new SystemException('Downloaded file is not an image'); } } catch (\Exception $e) { if (!empty($filename)) { @unlink($filename); } return; } // rescale avatar if required try { $newFilename = $this->enforceDimensions($filename); if ($newFilename !== $filename) { @unlink($filename); } $filename = $newFilename; $imageData = getimagesize($filename); if ($imageData === false) { throw new SystemException('Rescaled file is not an image'); } } catch (\Exception $e) { @unlink($filename); return; } $tmp = parse_url($this->parameters['url']); if (!isset($tmp['path'])) { @unlink($filename); return; } $tmp = pathinfo($tmp['path']); if (!isset($tmp['basename']) || !isset($tmp['extension'])) { @unlink($filename); return; } $data = array('avatarName' => $tmp['basename'], 'avatarExtension' => $tmp['extension'], 'width' => $imageData[0], 'height' => $imageData[1], 'userID' => $this->parameters['userEditor']->userID, 'fileHash' => sha1_file($filename)); // create avatar $avatar = UserAvatarEditor::create($data); // check avatar directory // and create subdirectory if necessary $dir = dirname($avatar->getLocation()); if (!@file_exists($dir)) { FileUtil::makePath($dir, 0777); } // move uploaded file if (@copy($filename, $avatar->getLocation())) { @unlink($filename); // create thumbnails $action = new UserAvatarAction(array($avatar), 'generateThumbnails'); $action->executeAction(); $avatarID = $avatar->avatarID; } else { @unlink($filename); // moving failed; delete avatar $editor = new UserAvatarEditor($avatar); $editor->delete(); } // update user if ($avatarID) { $this->parameters['userEditor']->update(array('avatarID' => $avatarID, 'enableGravatar' => 0)); // delete old avatar if ($this->parameters['userEditor']->avatarID) { $action = new UserAvatarAction(array($this->parameters['userEditor']->avatarID), 'delete'); $action->executeAction(); } } // reset user storage UserStorageHandler::getInstance()->reset(array($this->parameters['userEditor']->userID), 'avatar'); }