/** * Loads the tag cloud cache. */ public function loadCache() { if ($this->tags !== null) { return; } // get cache WCF::getCache()->addResource($this->cacheName, WCF_DIR . 'cache/cache.tagCloud-' . PACKAGE_ID . '-' . StringUtil::getHash(implode(',', $this->languageIDArray)) . '.php', WCF_DIR . 'lib/system/cache/CacheBuilderTagCloud.class.php', 0, 86400); $this->tags = WCF::getCache()->get($this->cacheName); }
/** * Replaces a string with an unique hash value. * * @param string $string * @param string $type * @return string $hash */ public static function pushToStringStack($string, $type = 'default') { $hash = '@@' . StringUtil::getHash(uniqid(microtime()) . $string) . '@@'; if (!isset(self::$stringStack[$type])) { self::$stringStack[$type] = array(); } self::$stringStack[$type][$hash] = $string; return $hash; }
/** * Replaces a string with an unique hash value. * * @param string $string * @param string $type * @return string $hash */ public static function pushToStringStack($string, $type = 'default', $delimiter = '@@') { self::$i++; $hash = $delimiter . StringUtil::getHash(self::$i . uniqid(microtime()) . $string) . $delimiter; if (!isset(self::$stringStack[$type])) { self::$stringStack[$type] = array(); } self::$stringStack[$type][$hash] = $string; return $hash; }
/** * @see UserSession::getGroupData() */ protected function getGroupData() { parent::getGroupData(); // get group permissions from cache (board_to_group) $groups = implode(",", $this->groupIDs); $groupsFileName = StringUtil::getHash(implode("-", $this->groupIDs)); // register cache resource WCF::getCache()->addResource('boardPermissions-' . $groups, WBB_DIR . 'cache/cache.boardPermissions-' . $groupsFileName . '.php', WBB_DIR . 'lib/system/cache/CacheBuilderBoardPermissions.class.php'); // get group data from cache $this->boardPermissions = WCF::getCache()->get('boardPermissions-' . $groups); if (isset($this->boardPermissions['groupIDs']) && $this->boardPermissions['groupIDs'] != $groups) { $this->boardPermissions = array(); } // get board moderator permissions $sql = "SELECT\t\t*\n\t\t\tFROM\t\twbb" . WBB_N . "_board_moderator\n\t\t\tWHERE\t\tgroupID IN (" . implode(',', $this->groupIDs) . ")\n\t\t\t\t\t" . ($this->userID ? " OR userID = " . $this->userID : '') . "\n\t\t\tORDER BY \tuserID DESC"; $result = WCF::getDB()->sendQuery($sql); while ($row = WCF::getDB()->fetchArray($result)) { $boardID = $row['boardID']; unset($row['boardID'], $row['userID'], $row['groupID']); if (!isset($this->boardModeratorPermissions[$boardID])) { $this->boardModeratorPermissions[$boardID] = array(); } foreach ($row as $permission => $value) { if ($value == -1) { continue; } if (!isset($this->boardModeratorPermissions[$boardID][$permission])) { $this->boardModeratorPermissions[$boardID][$permission] = $value; } else { $this->boardModeratorPermissions[$boardID][$permission] = $value || $this->boardModeratorPermissions[$boardID][$permission]; } } } if (count($this->boardModeratorPermissions)) { require_once WBB_DIR . 'lib/data/board/Board.class.php'; Board::inheritPermissions(0, $this->boardModeratorPermissions); } }
/** * Generates a random field name. * * @param string $fieldName * @return string */ public static function getRandomFieldName($fieldName) { $hash = StringUtil::getHash($fieldName . StringUtil::getRandomID()); return substr($hash, 0, mt_rand(8, 16)); }
/** * Caches a code bbcode. * * @param string $content * @return string $hash */ private static function cacheCode($content) { // strip slashes $content = str_replace("\\\"", "\"", $content); // create hash $hash = '@@' . StringUtil::getHash(uniqid(microtime()) . $content) . '@@'; // save tag self::$cachedCodes[$hash] = $content; return $hash; }
/** * @see Form::validate() */ public function validate() { parent::validate(); // get search conditions $conditions = $this->getConditions(); // check query and author if (empty($this->query) && empty($this->username) && !$this->userID) { throw new UserInputException('q'); } // build search hash $this->searchHash = StringUtil::getHash(serialize(array($this->query, $this->types, !$this->subjectOnly, $conditions, $this->sortField . ' ' . $this->sortOrder, PACKAGE_ID))); // check search hash if (!empty($this->query)) { $sql = "SELECT\tsearchID\n\t\t\t\tFROM\twcf" . WCF_N . "_search\n\t\t\t\tWHERE\tsearchHash = '" . $this->searchHash . "'\n\t\t\t\t\tAND userID = " . WCF::getUser()->userID . "\n\t\t\t\t\tAND searchType = 'messages'\n\t\t\t\t\tAND searchDate > " . (TIME_NOW - 1800); $row = WCF::getDB()->getFirstRow($sql); if (isset($row['searchID'])) { HeaderUtil::redirect('index.php?form=Search&searchID=' . $row['searchID'] . '&highlight=' . urlencode($this->query) . SID_ARG_2ND_NOT_ENCODED); exit; } } // do search $this->result = $this->engine->search($this->query, $this->types, $conditions, $this->sortField . ' ' . $this->sortOrder); // result is empty if (count($this->result) == 0) { $this->throwNoMatchesException(); } }
/** * Calculates hash for a given package * * @param integer $sourceID * @param string $packageName * @param string $directory * @return string */ public static function getHash($sourceID, $packageName, $directory) { return StringUtil::getHash($sourceID . ':' . $packageName . ':' . $directory); }
/** * Checks whether a post with the given data already exists in the database. * * @param string $subject * @param string $message * @param integer $authorID * @param string $author * @param integer $threadID * * @return boolean true, if a post with the given data already exists in the database */ public static function test($subject, $message, $authorID, $author, $threadID = 0) { $hash = StringUtil::getHash(($threadID ? $threadID : '') . $subject . $message . $authorID . $author); $sql = "SELECT\t\tpostID\n\t\t\tFROM \t\twbb" . WBB_N . "_post_hash\n\t\t\tWHERE \t\tmessageHash = '" . $hash . "'"; $row = WCF::getDB()->getFirstRow($sql); if (!empty($row['postID'])) { return $row['postID']; } return false; }
/** * Caches a code bbcode. * * @param string $codeTag * @param string $content * @return string $hash */ protected function cacheCode($codeTag, $content) { // strip slashes $codeTag = str_replace("\\\"", "\"", $codeTag); $content = str_replace("\\\"", "\"", $content); // create hash $hash = '@@' . StringUtil::getHash(uniqid(microtime()) . $content) . '@@'; // build tag $tag = $this->buildTag($codeTag); $tag['content'] = $content; // save tag $this->cachedCodes[$hash] = $tag; return $hash; }
/** * loads the group option cache */ protected static function loadCache() { // cache already loaded if (count(self::$availablePermissions)) { return; } // build cache $groupIDs = array(Group::EVERYONE, Group::GUESTS, Group::OTHER, Group::USERS); $groupsFileName = StringUtil::getHash(implode("-", $groupIDs)); WCF::getCache()->addResource('groups-' . PACKAGE_ID . '-' . implode(',', $groupIDs), WCF_DIR . 'cache/cache.groups-' . PACKAGE_ID . '-' . $groupsFileName . '.php', WCF_DIR . 'lib/system/cache/CacheBuilderGroupPermissions.class.php'); // get cached options $groupOptions = WCF::getCache()->get('groups-' . PACKAGE_ID . '-' . implode(',', $groupIDs)); // filter options $options = array(); foreach ($groupOptions as $key => $value) { list($category, ) = explode('.', $key); // only boolean options are allowed if (!is_bool($value) || $key == 'mod.board.isSuperMod') { continue; } else { $categoryName = WCF::getLanguage()->get('wcf.acp.group.option.category.' . $category); $options[$categoryName][$key] = WCF::getLanguage()->get('wcf.acp.group.option.' . $key); } } self::$availablePermissions = $options; }
/** * Creates a new private message with the given parameters. */ public static function create($draft, $recipients, $blindCopies, $subject, $text, $userID, $username, $options = array(), $attachments = null, $parentPmID = 0) { $hash = StringUtil::getHash(serialize($recipients) . serialize($blindCopies) . $subject . $text . $userID . $username); // get number of attachments $attachmentsAmount = $attachments != null ? count($attachments->getAttachments()) : 0; // save message $pmID = self::insert($subject, $text, array('parentPmID' => $parentPmID, 'userID' => $userID, 'username' => $username, 'time' => TIME_NOW, 'enableSmilies' => isset($options['enableSmilies']) ? $options['enableSmilies'] : 1, 'enableHtml' => isset($options['enableHtml']) ? $options['enableHtml'] : 0, 'enableBBCodes' => isset($options['enableBBCodes']) ? $options['enableBBCodes'] : 1, 'showSignature' => isset($options['showSignature']) ? $options['showSignature'] : 1, 'saveInOutbox' => $draft ? 0 : 1, 'isDraft' => $draft ? 1 : 0, 'attachments' => $attachmentsAmount)); // save hash $sql = "REPLACE INTO\twcf" . WCF_N . "_pm_hash\n\t\t\t\t\t(pmID, messageHash, time)\n\t\t\tVALUES\t\t(" . $pmID . ", '" . $hash . "', " . TIME_NOW . ")"; WCF::getDB()->registerShutdownUpdate($sql); // update parent pm id if ($parentPmID == 0) { $sql = "UPDATE\twcf" . WCF_N . "_pm\n\t\t\t\tSET\tparentPmID = pmID\n\t\t\t\tWHERE\tpmID = " . $pmID; WCF::getDB()->sendQuery($sql); } // save recipients $recipientIDs = ''; $inserts = ''; foreach ($recipients as $recipient) { if (!empty($inserts)) { $inserts .= ','; } $inserts .= "(" . $pmID . ", " . $recipient['userID'] . ", '" . escapeString($recipient['username']) . "'" . ($draft ? ', 2' : ', 0') . ", 0)"; if (!empty($recipientIDs)) { $recipientIDs .= ','; } $recipientIDs .= $recipient['userID']; } // save blind copy recipients foreach ($blindCopies as $recipient) { if (!empty($inserts)) { $inserts .= ','; } $inserts .= "(" . $pmID . ", " . $recipient['userID'] . ", '" . escapeString($recipient['username']) . "'" . ($draft ? ', 2' : ', 0') . ", 1)"; if (!empty($recipientIDs)) { $recipientIDs .= ','; } $recipientIDs .= $recipient['userID']; } if (!empty($inserts)) { $sql = "INSERT IGNORE INTO \twcf" . WCF_N . "_pm_to_user\n\t\t\t\t\t\t\t(pmID, recipientID, recipient, isDeleted, isBlindCopy)\n\t\t\t\tVALUES\t\t\t" . $inserts; WCF::getDB()->sendQuery($sql); } // update attachments if ($attachments != null) { $attachments->updateContainerID($pmID); $attachments->findEmbeddedAttachments($text); } // update message count if (!empty($recipientIDs)) { self::updateUnreadMessageCount($recipientIDs); } self::updateTotalMessageCount((!empty($recipientIDs) ? $recipientIDs . ',' : '') . $userID); // reset session data $userIDArray = !empty($recipientIDs) ? explode(',', $recipientIDs) : array(); $userIDArray[] = $userID; Session::resetSessions($userIDArray, true, false); return new PMEditor($pmID); }
/** * @see EventListener::execute() */ public function execute($eventObj, $className, $eventName) { if ($eventName == 'readParameters') { // handle special search options here $action = ''; if (isset($_REQUEST['action'])) { $action = $_REQUEST['action']; } if (empty($action)) { return; } // get accessible board ids require_once WBB_DIR . 'lib/data/board/Board.class.php'; $boardIDArray = Board::getAccessibleBoardIDArray(array('canViewBoard', 'canEnterBoard', 'canReadThread')); foreach ($boardIDArray as $key => $boardID) { if (WCF::getUser()->isIgnoredBoard($boardID)) { unset($boardIDArray[$key]); } else { if (!Board::getBoard($boardID)->searchable) { unset($boardIDArray[$key]); } } } if (!count($boardIDArray)) { return; } switch ($action) { case 'unread': $sql = "SELECT\t\tthread.threadID\n\t\t\t\t\t\tFROM\t\twbb" . WBB_N . "_thread thread\n\t\t\t\t\t\tWHERE\t\tthread.boardID IN (" . implode(',', $boardIDArray) . ")\n\t\t\t\t\t\t\t\tAND thread.lastPostTime > " . WCF::getUser()->getLastMarkAllAsReadTime() . "\n\t\t\t\t\t\t\t\t" . (WCF::getUser()->userID ? "\n\t\t\t\t\t\t\t\tAND thread.lastPostTime > IFNULL((\n\t\t\t\t\t\t\t\t\tSELECT\tlastVisitTime\n\t\t\t\t\t\t\t\t\tFROM \twbb" . WBB_N . "_thread_visit\n\t\t\t\t\t\t\t\t\tWHERE \tthreadID = thread.threadID\n\t\t\t\t\t\t\t\t\t\tAND userID = " . WCF::getUser()->userID . "\n\t\t\t\t\t\t\t\t), 0)\n\t\t\t\t\t\t\t\tAND thread.lastPostTime > IFNULL((\n\t\t\t\t\t\t\t\t\tSELECT\tlastVisitTime\n\t\t\t\t\t\t\t\t\tFROM \twbb" . WBB_N . "_board_visit\n\t\t\t\t\t\t\t\t\tWHERE \tboardID = thread.boardID\n\t\t\t\t\t\t\t\t\t\tAND userID = " . WCF::getUser()->userID . "\n\t\t\t\t\t\t\t\t), 0)\n\t\t\t\t\t\t\t\t" : '') . "\n\t\t\t\t\t\t\t\tAND thread.isDeleted = 0\n\t\t\t\t\t\t\t\tAND thread.isDisabled = 0\n\t\t\t\t\t\t\t\t" . (count(WCF::getSession()->getVisibleLanguageIDArray()) ? " AND languageID IN (" . implode(',', WCF::getSession()->getVisibleLanguageIDArray()) . ")" : "") . "\n\t\t\t\t\t\t\t\tAND thread.movedThreadID = 0\n\t\t\t\t\t\tORDER BY\tthread.lastPostTime DESC"; break; case 'newPostsSince': $since = TIME_NOW; if (isset($_REQUEST['since'])) { $since = intval($_REQUEST['since']); } $sql = "SELECT\t\tthread.threadID\n\t\t\t\t\t\tFROM\t\twbb" . WBB_N . "_thread thread\n\t\t\t\t\t\tWHERE\t\tthread.boardID IN (" . implode(',', $boardIDArray) . ")\n\t\t\t\t\t\t\t\tAND thread.lastPostTime > " . $since . "\n\t\t\t\t\t\t\t\tAND thread.isDeleted = 0\n\t\t\t\t\t\t\t\tAND thread.isDisabled = 0\n\t\t\t\t\t\t\t\t" . (count(WCF::getSession()->getVisibleLanguageIDArray()) ? " AND languageID IN (" . implode(',', WCF::getSession()->getVisibleLanguageIDArray()) . ")" : "") . "\n\t\t\t\t\t\t\t\tAND thread.movedThreadID = 0\n\t\t\t\t\t\tORDER BY\tthread.lastPostTime DESC"; break; case 'unreplied': $sql = "SELECT\t\tthreadID\n\t\t\t\t\t\tFROM\t\twbb" . WBB_N . "_thread\n\t\t\t\t\t\tWHERE\t\tboardID IN (" . implode(',', $boardIDArray) . ")\n\t\t\t\t\t\t\t\tAND isDeleted = 0\n\t\t\t\t\t\t\t\tAND isDisabled = 0\n\t\t\t\t\t\t\t\tAND movedThreadID = 0\n\t\t\t\t\t\t\t\t" . (count(WCF::getSession()->getVisibleLanguageIDArray()) ? " AND languageID IN (" . implode(',', WCF::getSession()->getVisibleLanguageIDArray()) . ")" : "") . "\n\t\t\t\t\t\t\t\tAND replies = 0\n\t\t\t\t\t\tORDER BY\tlastPostTime DESC"; break; case '24h': $sql = "SELECT\t\tthreadID\n\t\t\t\t\t\tFROM\t\twbb" . WBB_N . "_thread\n\t\t\t\t\t\tWHERE\t\tboardID IN (" . implode(',', $boardIDArray) . ")\n\t\t\t\t\t\t\t\tAND lastPostTime > " . (TIME_NOW - 86400) . "\n\t\t\t\t\t\t\t\tAND isDeleted = 0\n\t\t\t\t\t\t\t\tAND isDisabled = 0\n\t\t\t\t\t\t\t\t" . (count(WCF::getSession()->getVisibleLanguageIDArray()) ? " AND languageID IN (" . implode(',', WCF::getSession()->getVisibleLanguageIDArray()) . ")" : "") . "\n\t\t\t\t\t\t\t\tAND movedThreadID = 0\n\t\t\t\t\t\tORDER BY\tlastPostTime DESC"; break; default: return; } // build search hash $searchHash = StringUtil::getHash($sql); // execute query $matches = array(); $result = WCF::getDB()->sendQuery($sql, 1000); while ($row = WCF::getDB()->fetchArray($result)) { $matches[] = array('messageID' => $row['threadID'], 'messageType' => 'post'); } // result is empty if (count($matches) == 0) { throw new NamedUserException(WCF::getLanguage()->get('wbb.search.error.noMatches')); } // save result in database $searchData = array('packageID' => PACKAGE_ID, 'query' => '', 'result' => $matches, 'additionalData' => array('post' => array('findThreads' => 1)), 'sortOrder' => 'DESC', 'sortField' => 'time', 'types' => array('post')); $searchData = serialize($searchData); $sql = "INSERT INTO\twcf" . WCF_N . "_search\n\t\t\t\t\t\t(userID, searchData, searchDate, searchType, searchHash)\n\t\t\t\tVALUES\t\t(" . WCF::getUser()->userID . ",\n\t\t\t\t\t\t'" . escapeString($searchData) . "',\n\t\t\t\t\t\t" . TIME_NOW . ",\n\t\t\t\t\t\t'messages',\n\t\t\t\t\t\t'" . $searchHash . "')"; WCF::getDB()->sendQuery($sql); $searchID = WCF::getDB()->getInsertID(); // forward to result page HeaderUtil::redirect('index.php?form=Search&searchID=' . $searchID . SID_ARG_2ND_NOT_ENCODED); exit; } else { if ($eventName == 'readFormParameters') { if (isset($_POST['findThreads'])) { $this->findThreads = intval($_POST['findThreads']); } if (isset($_REQUEST['findUserThreads'])) { $this->findUserThreads = intval($_REQUEST['findUserThreads']); } if ($this->findUserThreads == 1) { $this->findThreads = 1; } // handle findThreads option if ($this->findThreads == 1 && (!count($eventObj->types) || in_array('post', $eventObj->types))) { // remove all other searchable message types // findThreads only supports post search $eventObj->types = array('post'); } else { $this->findThreads = 0; } } else { if ($eventName == 'assignVariables') { if ($eventObj instanceof SearchResultPage) { $html = '<div class="floatedElement"> <label for="findThreads">' . WCF::getLanguage()->get('wbb.search.results.display') . '</label> <select name="findThreads" id="findThreads"> <option value="0">' . WCF::getLanguage()->get('wbb.search.results.display.post') . '</option> <option value="1"' . ($eventObj->additionalData['post']['findThreads'] == 1 ? ' selected="selected"' : '') . '>' . WCF::getLanguage()->get('wbb.search.results.display.thread') . '</option> </select> </div>'; WCF::getTPL()->append('additionalDisplayOptions', $html); } else { $html = '<div class="floatedElement"> <label for="findThreads">' . WCF::getLanguage()->get('wbb.search.results.display') . '</label> <select name="findThreads" id="findThreads"> <option value="0"' . ($this->findThreads == 0 ? ' selected="selected"' : '') . '>' . WCF::getLanguage()->get('wbb.search.results.display.post') . '</option> <option value="1"' . ($this->findThreads == 1 ? ' selected="selected"' : '') . '>' . WCF::getLanguage()->get('wbb.search.results.display.thread') . '</option> </select> </div>'; WCF::getTPL()->append('additionalDisplayOptions', $html); WCF::getTPL()->append('additionalAuthorOptions', '<label><input type="checkbox" name="findUserThreads" value="1"' . ($this->findUserThreads == 1 ? ' checked="checked"' : '') . '/> ' . WCF::getLanguage()->get('wbb.search.findUserThreads') . '</label>'); } } } } }