diff --git a/file/lib/data/chat/room/ChatRoom.class.php b/file/lib/data/chat/room/ChatRoom.class.php
index d167a49..565d8ba 100644
--- a/file/lib/data/chat/room/ChatRoom.class.php
+++ b/file/lib/data/chat/room/ChatRoom.class.php
@@ -69,4 +69,13 @@ public function getTitle() {
public function getID() {
return $this->roomID;
}
+
+ /**
+ * Returns whether the user is allowed to enter the room
+ *
+ * @return boolean
+ */
+ public function canEnter() {
+ return \wcf\system\chat\permissions\ChatPermissionHandler::getInstance()->getPermission($this, 'canEnter');
+ }
}
diff --git a/file/lib/page/ChatPage.class.php b/file/lib/page/ChatPage.class.php
index 622ccd7..b39d482 100644
--- a/file/lib/page/ChatPage.class.php
+++ b/file/lib/page/ChatPage.class.php
@@ -132,7 +132,7 @@ public function readRoom() {
// redirect to first chat-room
$this->rooms->seek(0);
\wcf\util\HeaderUtil::redirect(\wcf\system\request\LinkHandler::getInstance()->getLink('Chat', array(
- 'object' => $this->rooms->search($this->rooms->key())
+ 'object' => $this->rooms->current()
)));
exit;
}
diff --git a/file/lib/system/chat/permissions/ChatPermissionHandler.class.php b/file/lib/system/chat/permissions/ChatPermissionHandler.class.php
new file mode 100644
index 0000000..c8ef28e
--- /dev/null
+++ b/file/lib/system/chat/permissions/ChatPermissionHandler.class.php
@@ -0,0 +1,81 @@
+
+ * @package timwolla.wcf.chat
+ * @subpackage system.chat.permissions
+ */
+class ChatPermissionHandler extends \wcf\system\SingletonFactory {
+ protected $chatPermissions = array();
+
+ /**
+ * @see wcf\system\SingletonFactory::init()
+ */
+ protected function init() {
+ $packageID = PackageDependencyHandler::getPackageID('timwolla.wcf.chat');
+ $ush = \wcf\system\user\storage\UserStorageHandler::getInstance();
+ // TODO: get groups permissions
+
+ // get user permissions
+ if (WCF::getUser()->userID) {
+ // get data from storage
+ $ush->loadStorage(array(WCF::getUser()->userID), $packageID);
+
+ // get ids
+ $data = $ush->getStorage(array(WCF::getUser()->userID), 'chatUserPermissions', $packageID);
+
+ // cache does not exist or is outdated
+ if ($data[WCF::getUser()->userID] === null) {
+ $userPermissions = array();
+
+ $conditionBuilder = new \wcf\system\database\util\PreparedStatementConditionBuilder();
+ $conditionBuilder->add('acl_option.packageID IN (?)', array(PackageDependencyHandler::getDependencies()));
+ $conditionBuilder->add('acl_option.objectTypeID = ?', array(ACLHandler::getInstance()->getObjectTypeID('timwolla.wcf.chat.room')));
+ $conditionBuilder->add('option_to_user.optionID = acl_option.optionID');
+ $conditionBuilder->add('option_to_user.userID = ?', array(WCF::getUser()->userID));
+ $sql = "SELECT option_to_user.objectID AS roomID, option_to_user.optionValue,
+ acl_option.optionName AS permission
+ FROM wcf".WCF_N."_acl_option acl_option,
+ wcf".WCF_N."_acl_option_to_user option_to_user
+ ".$conditionBuilder;
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute($conditionBuilder->getParameters());
+ while ($row = $statement->fetchArray()) {
+ $userPermissions[$row['roomID']][$row['permission']] = $row['optionValue'];
+ }
+
+ // update cache
+ $ush->update(WCF::getUser()->userID, 'chatUserPermissions', serialize($userPermissions), $packageID);
+ }
+ else {
+ $userPermissions = unserialize($data[WCF::getUser()->userID]);
+ }
+
+ foreach ($userPermissions as $roomID => $permissions) {
+ foreach ($permissions as $name => $value) {
+ $this->chatPermissions[$roomID][$name] = $value;
+ }
+ }
+ }
+ }
+
+ /**
+ * Fetches the given permission for the given room
+ *
+ * @param \wcf\data\chat\room\ChatRoom $room
+ * @param string $permission
+ * @return boolean
+ */
+ public function getPermission(\wcf\data\chat\room\ChatRoom $room, $permission) {
+ if (!isset($this->chatPermissions[$room->roomID][$permission])) return true;
+ return (boolean) $this->chatPermissions[$room->roomID][$permission];
+ }
+}
\ No newline at end of file
diff --git a/file/lib/util/ChatUtil.class.php b/file/lib/util/ChatUtil.class.php
index 9f8c5b8..85cddc2 100644
--- a/file/lib/util/ChatUtil.class.php
+++ b/file/lib/util/ChatUtil.class.php
@@ -39,7 +39,7 @@ public static function gradient($string, $start, $end) {
$result = '';
for ($i = 0, $max = count($string); $i < $max; $i++) {
- $result .= ''.$string[$i].'';
+ $result .= ''.StringUtil::encodeHTML($string[$i]).'';
}
return $result;