-<?xml version="1.0" encoding="UTF-8"?>\r
-<data xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/acpmenu.xsd">\r
- <import>\r
- <acpmenuitem name="wcf.acp.menu.link.system">\r
- <icon>icon/systemL.png</icon>\r
- <showorder>1</showorder>\r
- </acpmenuitem>\r
- \r
- <!-- options -->\r
- <acpmenuitem name="wcf.acp.menu.link.option">\r
- <parent>wcf.acp.menu.link.system</parent>\r
- <showorder>1</showorder>\r
- <permissions>admin.system.canEditOption</permissions>\r
- </acpmenuitem>\r
- \r
- <acpmenuitem name="wcf.acp.menu.link.option.category">\r
- <parent>wcf.acp.menu.link.option</parent>\r
- <showorder>1</showorder>\r
- </acpmenuitem>\r
- \r
- <acpmenuitem name="wcf.acp.menu.link.option.management">\r
- <parent>wcf.acp.menu.link.option</parent>\r
- <showorder>2</showorder>\r
- </acpmenuitem>\r
- \r
- <acpmenuitem name="wcf.acp.menu.link.option.importAndExport">\r
- <parent>wcf.acp.menu.link.option.management</parent>\r
- <showorder>1</showorder>\r
- <link>index.php?form=OptionImport</link>\r
- </acpmenuitem>\r
- <!-- /options -->\r
- \r
- <!-- packages -->\r
- <acpmenuitem name="wcf.acp.menu.link.package">\r
- <parent>wcf.acp.menu.link.system</parent>\r
- <showorder>2</showorder>\r
- <permissions>admin.system.package.canInstallPackage,admin.system.package.canUpdatePackage,admin.system.package.canUninstallPackage,admin.system.package.canEditServer</permissions>\r
- </acpmenuitem>\r
- \r
- <acpmenuitem name="wcf.acp.menu.link.package.management">\r
- <parent>wcf.acp.menu.link.package</parent>\r
- <showorder>1</showorder>\r
- </acpmenuitem>\r
- \r
- <acpmenuitem name="wcf.acp.menu.link.package.view">\r
- <icon>icon/packageM.png</icon>\r
- <link>index.php?page=PackageList</link>\r
- <parent>wcf.acp.menu.link.package.management</parent>\r
- <permissions>admin.system.package.canUpdatePackage,admin.system.package.canUninstallPackage</permissions>\r
- <showorder>1</showorder>\r
- </acpmenuitem>\r
- \r
- <acpmenuitem name="wcf.acp.menu.link.package.install">\r
- <link>index.php?form=PackageStartInstall&action=install</link>\r
- <parent>wcf.acp.menu.link.package.management</parent>\r
- <permissions>admin.system.package.canInstallPackage</permissions>\r
- <showorder>2</showorder>\r
- </acpmenuitem>\r
- \r
- <acpmenuitem name="wcf.acp.menu.link.package.update">\r
- <parent>wcf.acp.menu.link.package</parent>\r
- <showorder>2</showorder>\r
- </acpmenuitem>\r
- \r
- <acpmenuitem name="wcf.acp.menu.link.autoupdate">\r
- <icon>icon/updateM.png</icon>\r
- <link>index.php?page=PackageAutoUpdateList</link>\r
- <parent>wcf.acp.menu.link.package.update</parent>\r
- <permissions>admin.system.package.canUpdatePackage</permissions>\r
- <showorder>1</showorder>\r
- </acpmenuitem>\r
- \r
- <acpmenuitem name="wcf.acp.menu.link.package.database">\r
- <link>index.php?form=PackageUpdateSearch</link>\r
- <parent>wcf.acp.menu.link.package.update</parent>\r
- <permissions>admin.system.package.canInstallPackage,admin.system.package.canUpdatePackage</permissions>\r
- <showorder>2</showorder>\r
- </acpmenuitem>\r
- \r
- <acpmenuitem name="wcf.acp.menu.link.package.server">\r
- <parent>wcf.acp.menu.link.package</parent>\r
- <showorder>3</showorder>\r
- </acpmenuitem>\r
- \r
- <acpmenuitem name="wcf.acp.menu.link.package.server.view">\r
- <icon>icon/updateServerM.png</icon>\r
- <link>index.php?page=UpdateServerList</link>\r
- <parent>wcf.acp.menu.link.package.server</parent>\r
- <permissions>admin.system.package.canEditServer</permissions>\r
- <showorder>1</showorder>\r
- </acpmenuitem>\r
- \r
- <acpmenuitem name="wcf.acp.menu.link.package.server.add">\r
- <link>index.php?form=UpdateServerAdd</link>\r
- <parent>wcf.acp.menu.link.package.server</parent>\r
- <permissions>admin.system.package.canEditServer</permissions>\r
- <showorder>2</showorder>\r
- </acpmenuitem>\r
- <!-- /packages --> \r
- \r
- <!-- maintenance -->\r
- <acpmenuitem name="wcf.acp.menu.link.maintenance">\r
- <parent>wcf.acp.menu.link.system</parent>\r
- <showorder>3</showorder>\r
- </acpmenuitem>\r
- <!-- /maintenance -->\r
- \r
- <!-- log -->\r
- <acpmenuitem name="wcf.acp.menu.link.log">\r
- <parent>wcf.acp.menu.link.system</parent>\r
- <showorder>4</showorder>\r
- </acpmenuitem>\r
- \r
- <acpmenuitem name="wcf.acp.menu.link.log.system">\r
- <parent>wcf.acp.menu.link.log</parent>\r
- </acpmenuitem>\r
- \r
- <acpmenuitem name="wcf.acp.menu.link.log.additional">\r
- <parent>wcf.acp.menu.link.log</parent>\r
- </acpmenuitem>\r
- \r
- <acpmenuitem name="wcf.acp.menu.link.log.session">\r
- <icon>icon/sessionLogM.png</icon>\r
- <link>index.php?page=ACPSessionLogList</link>\r
- <parent>wcf.acp.menu.link.log.system</parent>\r
- <permissions>admin.system.canViewLog</permissions>\r
- </acpmenuitem>\r
- \r
- <acpmenuitem name="wcf.acp.menu.link.log.cache">\r
- <link>index.php?page=CacheList</link>\r
- <parent>wcf.acp.menu.link.log.system</parent>\r
- <permissions>admin.system.canViewLog</permissions>\r
- </acpmenuitem>\r
- <!-- /log -->\r
- \r
- <!-- cronjobs -->\r
- <acpmenuitem name="wcf.acp.menu.link.cronjobs">\r
- <parent>wcf.acp.menu.link.maintenance</parent>\r
- </acpmenuitem>\r
- \r
- <acpmenuitem name="wcf.acp.menu.link.cronjobs.view">\r
- <icon>icon/cronjobsM.png</icon>\r
- <link>index.php?page=CronjobList</link>\r
- <parent>wcf.acp.menu.link.cronjobs</parent>\r
- <permissions>admin.system.cronjobs.canEditCronjob,admin.system.cronjobs.canDeleteCronjob,admin.system.cronjobs.canEnableDisableCronjob</permissions>\r
- <showorder>1</showorder>\r
- </acpmenuitem>\r
- \r
- <acpmenuitem name="wcf.acp.menu.link.cronjobs.add">\r
- <link>index.php?form=CronjobAdd</link>\r
- <parent>wcf.acp.menu.link.cronjobs</parent>\r
- <permissions>admin.system.cronjobs.canAddCronjob</permissions>\r
- <showorder>2</showorder>\r
- </acpmenuitem>\r
- \r
- <acpmenuitem name="wcf.acp.menu.link.cronjobs.showLog">\r
- <link>index.php?page=CronjobLogList</link>\r
- <parent>wcf.acp.menu.link.log.system</parent>\r
- <permissions>admin.system.cronjobs.canEditCronjob,admin.system.cronjobs.canDeleteCronjob</permissions>\r
- </acpmenuitem>\r
- <!-- /cronjobs -->\r
- \r
- <acpmenuitem name="wcf.acp.menu.link.user">\r
- <icon>icon/usersL.png</icon>\r
- <showorder>2</showorder>\r
- </acpmenuitem>\r
- \r
- <!-- users -->\r
- <acpmenuitem name="wcf.acp.menu.link.user.management">\r
- <parent>wcf.acp.menu.link.user</parent>\r
- <showorder>1</showorder>\r
- </acpmenuitem>\r
- \r
- <acpmenuitem name="wcf.acp.menu.link.user.management.general">\r
- <parent>wcf.acp.menu.link.user.management</parent>\r
- <showorder>1</showorder>\r
- </acpmenuitem>\r
- \r
- <acpmenuitem name="wcf.acp.menu.link.user.list">\r
- <icon>icon/usersM.png</icon>\r
- <link>index.php?page=UserList</link>\r
- <parent>wcf.acp.menu.link.user.management.general</parent>\r
- <permissions>admin.user.canSearchUser</permissions>\r
- <showorder>1</showorder>\r
- </acpmenuitem>\r
- \r
- <acpmenuitem name="wcf.acp.menu.link.user.search">\r
- <icon>icon/searchM.png</icon>\r
- <link>index.php?form=UserSearch</link>\r
- <parent>wcf.acp.menu.link.user.management.general</parent>\r
- <permissions>admin.user.canSearchUser</permissions>\r
- <showorder>2</showorder>\r
- </acpmenuitem>\r
- \r
- <acpmenuitem name="wcf.acp.menu.link.user.add">\r
- <link>index.php?form=UserAdd</link>\r
- <parent>wcf.acp.menu.link.user.management.general</parent>\r
- <permissions>admin.user.canAddUser</permissions>\r
- <showorder>3</showorder>\r
- </acpmenuitem>\r
- \r
- <acpmenuitem name="wcf.acp.menu.link.user.management.additional">\r
- <parent>wcf.acp.menu.link.user.management</parent>\r
- <showorder>2</showorder>\r
- </acpmenuitem>\r
- \r
- <acpmenuitem name="wcf.acp.menu.link.user.massProcessing">\r
- <link>index.php?form=UsersMassProcessing</link>\r
- <parent>wcf.acp.menu.link.user.management.additional</parent>\r
- <permissions>admin.user.canEditUser,admin.user.canDeleteUser,admin.user.canMailUser</permissions>\r
- <showorder>1</showorder>\r
- </acpmenuitem>\r
- \r
- <acpmenuitem name="wcf.acp.menu.link.user.mail">\r
- <link>index.php?form=UserMail&action=all</link>\r
- <parent>wcf.acp.menu.link.user.management.additional</parent>\r
- <permissions>admin.user.canMailUser</permissions>\r
- <showorder>2</showorder>\r
- </acpmenuitem>\r
- <!-- /users -->\r
- \r
- <!-- user groups -->\r
- <acpmenuitem name="wcf.acp.menu.link.group">\r
- <parent>wcf.acp.menu.link.user</parent>\r
- <showorder>2</showorder>\r
- </acpmenuitem>\r
- \r
- <acpmenuitem name="wcf.acp.menu.link.group.general">\r
- <parent>wcf.acp.menu.link.group</parent>\r
- <showorder>1</showorder>\r
- </acpmenuitem>\r
- \r
- <acpmenuitem name="wcf.acp.menu.link.group.view">\r
- <icon>icon/userGroupM.png</icon>\r
- <link>index.php?page=UserGroupList</link>\r
- <parent>wcf.acp.menu.link.group.general</parent>\r
- <permissions>admin.user.canEditGroup,admin.user.canDeleteGroup</permissions>\r
- <showorder>1</showorder>\r
- </acpmenuitem> \r
- \r
- <acpmenuitem name="wcf.acp.menu.link.group.add">\r
- <link>index.php?form=UserGroupAdd</link>\r
- <parent>wcf.acp.menu.link.group.general</parent>\r
- <permissions>admin.user.canAddGroup</permissions>\r
- <showorder>2</showorder>\r
- </acpmenuitem>\r
- \r
- <acpmenuitem name="wcf.acp.menu.link.group.additional">\r
- <parent>wcf.acp.menu.link.group</parent>\r
- <showorder>2</showorder>\r
- </acpmenuitem>\r
- \r
- <acpmenuitem name="wcf.acp.menu.link.group.mail">\r
- <icon>icon/emailM.png</icon>\r
- <link>index.php?form=UserMail&action=group</link>\r
- <parent>wcf.acp.menu.link.group.additional</parent>\r
- <permissions>admin.user.canMailUser</permissions>\r
- <showorder>1</showorder>\r
- </acpmenuitem>\r
- <!-- user groups -->\r
- \r
- <acpmenuitem name="wcf.acp.menu.link.display">\r
- <icon>icon/displayL.png</icon>\r
- <showorder>3</showorder>\r
- </acpmenuitem>\r
- \r
- <!-- language -->\r
- <acpmenuitem name="wcf.acp.menu.link.language">\r
- <parent>wcf.acp.menu.link.display</parent>\r
- </acpmenuitem>\r
-\r
- <acpmenuitem name="wcf.acp.menu.link.language.server">\r
- <parent>wcf.acp.menu.link.language</parent>\r
- </acpmenuitem>\r
-\r
- <acpmenuitem name="wcf.acp.menu.link.language.server.list">\r
- <icon>icon/languageServerM.png</icon>\r
- <link>index.php?page=LanguageServerList</link>\r
- <parent>wcf.acp.menu.link.language.server</parent>\r
- <permissions>admin.language.canEditServer</permissions>\r
- <showorder>1</showorder>\r
- </acpmenuitem>\r
-\r
- <acpmenuitem name="wcf.acp.menu.link.language.server.add">\r
- <link>index.php?form=LanguageServerAdd</link>\r
- <parent>wcf.acp.menu.link.language.server</parent>\r
- <permissions>admin.language.canEditServer</permissions>\r
- <showorder>2</showorder>\r
- </acpmenuitem>\r
- <!-- /language -->\r
- \r
- <acpmenuitem name="wcf.acp.menu.link.content">\r
- <icon>icon/contentL.png</icon>\r
- <showorder>4</showorder>\r
- </acpmenuitem>\r
- </import>\r
-</data>\r
+<?xml version="1.0" encoding="UTF-8"?>
+<data xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/acpmenu.xsd">
+ <import>
+ <acpmenuitem name="wcf.acp.menu.link.system">
+ <icon>icon/systemL.png</icon>
+ <showorder>1</showorder>
+ </acpmenuitem>
+
+ <!-- options -->
+ <acpmenuitem name="wcf.acp.menu.link.option">
+ <parent>wcf.acp.menu.link.system</parent>
+ <showorder>1</showorder>
+ <permissions>admin.system.canEditOption</permissions>
+ </acpmenuitem>
+
+ <acpmenuitem name="wcf.acp.menu.link.option.category">
+ <parent>wcf.acp.menu.link.option</parent>
+ <showorder>1</showorder>
+ </acpmenuitem>
+
+ <acpmenuitem name="wcf.acp.menu.link.option.management">
+ <parent>wcf.acp.menu.link.option</parent>
+ <showorder>2</showorder>
+ </acpmenuitem>
+
+ <acpmenuitem name="wcf.acp.menu.link.option.importAndExport">
+ <parent>wcf.acp.menu.link.option.management</parent>
+ <showorder>1</showorder>
+ <link>index.php?form=OptionImport</link>
+ </acpmenuitem>
+ <!-- /options -->
+
+ <!-- packages -->
+ <acpmenuitem name="wcf.acp.menu.link.package">
+ <parent>wcf.acp.menu.link.system</parent>
+ <showorder>2</showorder>
+ <permissions>admin.system.package.canInstallPackage,admin.system.package.canUpdatePackage,admin.system.package.canUninstallPackage,admin.system.package.canEditServer</permissions>
+ </acpmenuitem>
+
+ <acpmenuitem name="wcf.acp.menu.link.package.management">
+ <parent>wcf.acp.menu.link.package</parent>
+ <showorder>1</showorder>
+ </acpmenuitem>
+
+ <acpmenuitem name="wcf.acp.menu.link.package.view">
+ <icon>icon/packageM.png</icon>
+ <link>index.php?page=PackageList</link>
+ <parent>wcf.acp.menu.link.package.management</parent>
+ <permissions>admin.system.package.canUpdatePackage,admin.system.package.canUninstallPackage</permissions>
+ <showorder>1</showorder>
+ </acpmenuitem>
+
+ <acpmenuitem name="wcf.acp.menu.link.package.install">
+ <link>index.php?form=PackageStartInstall&action=install</link>
+ <parent>wcf.acp.menu.link.package.management</parent>
+ <permissions>admin.system.package.canInstallPackage</permissions>
+ <showorder>2</showorder>
+ </acpmenuitem>
+
+ <acpmenuitem name="wcf.acp.menu.link.package.update">
+ <parent>wcf.acp.menu.link.package</parent>
+ <showorder>2</showorder>
+ </acpmenuitem>
+
+ <acpmenuitem name="wcf.acp.menu.link.autoupdate">
+ <icon>icon/updateM.png</icon>
+ <link>index.php?page=PackageAutoUpdateList</link>
+ <parent>wcf.acp.menu.link.package.update</parent>
+ <permissions>admin.system.package.canUpdatePackage</permissions>
+ <showorder>1</showorder>
+ </acpmenuitem>
+
+ <acpmenuitem name="wcf.acp.menu.link.package.database">
+ <link>index.php?form=PackageUpdateSearch</link>
+ <parent>wcf.acp.menu.link.package.update</parent>
+ <permissions>admin.system.package.canInstallPackage,admin.system.package.canUpdatePackage</permissions>
+ <showorder>2</showorder>
+ </acpmenuitem>
+
+ <acpmenuitem name="wcf.acp.menu.link.package.server">
+ <parent>wcf.acp.menu.link.package</parent>
+ <showorder>3</showorder>
+ </acpmenuitem>
+
+ <acpmenuitem name="wcf.acp.menu.link.package.server.view">
+ <icon>icon/updateServerM.png</icon>
+ <link>index.php?page=UpdateServerList</link>
+ <parent>wcf.acp.menu.link.package.server</parent>
+ <permissions>admin.system.package.canEditServer</permissions>
+ <showorder>1</showorder>
+ </acpmenuitem>
+
+ <acpmenuitem name="wcf.acp.menu.link.package.server.add">
+ <link>index.php?form=UpdateServerAdd</link>
+ <parent>wcf.acp.menu.link.package.server</parent>
+ <permissions>admin.system.package.canEditServer</permissions>
+ <showorder>2</showorder>
+ </acpmenuitem>
+ <!-- /packages -->
+
+ <!-- maintenance -->
+ <acpmenuitem name="wcf.acp.menu.link.maintenance">
+ <parent>wcf.acp.menu.link.system</parent>
+ <showorder>3</showorder>
+ </acpmenuitem>
+ <!-- /maintenance -->
+
+ <!-- log -->
+ <acpmenuitem name="wcf.acp.menu.link.log">
+ <parent>wcf.acp.menu.link.system</parent>
+ <showorder>4</showorder>
+ </acpmenuitem>
+
+ <acpmenuitem name="wcf.acp.menu.link.log.system">
+ <parent>wcf.acp.menu.link.log</parent>
+ </acpmenuitem>
+
+ <acpmenuitem name="wcf.acp.menu.link.log.additional">
+ <parent>wcf.acp.menu.link.log</parent>
+ </acpmenuitem>
+
+ <acpmenuitem name="wcf.acp.menu.link.log.session">
+ <icon>icon/sessionLogM.png</icon>
+ <link>index.php?page=ACPSessionLogList</link>
+ <parent>wcf.acp.menu.link.log.system</parent>
+ <permissions>admin.system.canViewLog</permissions>
+ </acpmenuitem>
+
+ <acpmenuitem name="wcf.acp.menu.link.log.cache">
+ <link>index.php?page=CacheList</link>
+ <parent>wcf.acp.menu.link.log.system</parent>
+ <permissions>admin.system.canViewLog</permissions>
+ </acpmenuitem>
+ <!-- /log -->
+
+ <!-- cronjobs -->
+ <acpmenuitem name="wcf.acp.menu.link.cronjobs">
+ <parent>wcf.acp.menu.link.maintenance</parent>
+ </acpmenuitem>
+
+ <acpmenuitem name="wcf.acp.menu.link.cronjobs.view">
+ <icon>icon/cronjobsM.png</icon>
+ <link>index.php?page=CronjobList</link>
+ <parent>wcf.acp.menu.link.cronjobs</parent>
+ <permissions>admin.system.cronjobs.canEditCronjob,admin.system.cronjobs.canDeleteCronjob,admin.system.cronjobs.canEnableDisableCronjob</permissions>
+ <showorder>1</showorder>
+ </acpmenuitem>
+
+ <acpmenuitem name="wcf.acp.menu.link.cronjobs.add">
+ <link>index.php?form=CronjobAdd</link>
+ <parent>wcf.acp.menu.link.cronjobs</parent>
+ <permissions>admin.system.cronjobs.canAddCronjob</permissions>
+ <showorder>2</showorder>
+ </acpmenuitem>
+
+ <acpmenuitem name="wcf.acp.menu.link.cronjobs.showLog">
+ <link>index.php?page=CronjobLogList</link>
+ <parent>wcf.acp.menu.link.log.system</parent>
+ <permissions>admin.system.cronjobs.canEditCronjob,admin.system.cronjobs.canDeleteCronjob</permissions>
+ </acpmenuitem>
+ <!-- /cronjobs -->
+
+ <acpmenuitem name="wcf.acp.menu.link.user">
+ <icon>icon/usersL.png</icon>
+ <showorder>2</showorder>
+ </acpmenuitem>
+
+ <!-- users -->
+ <acpmenuitem name="wcf.acp.menu.link.user.management">
+ <parent>wcf.acp.menu.link.user</parent>
+ <showorder>1</showorder>
+ </acpmenuitem>
+
+ <acpmenuitem name="wcf.acp.menu.link.user.management.general">
+ <parent>wcf.acp.menu.link.user.management</parent>
+ <showorder>1</showorder>
+ </acpmenuitem>
+
+ <acpmenuitem name="wcf.acp.menu.link.user.list">
+ <icon>icon/usersM.png</icon>
+ <link>index.php?page=UserList</link>
+ <parent>wcf.acp.menu.link.user.management.general</parent>
+ <permissions>admin.user.canSearchUser</permissions>
+ <showorder>1</showorder>
+ </acpmenuitem>
+
+ <acpmenuitem name="wcf.acp.menu.link.user.search">
+ <icon>icon/searchM.png</icon>
+ <link>index.php?form=UserSearch</link>
+ <parent>wcf.acp.menu.link.user.management.general</parent>
+ <permissions>admin.user.canSearchUser</permissions>
+ <showorder>2</showorder>
+ </acpmenuitem>
+
+ <acpmenuitem name="wcf.acp.menu.link.user.add">
+ <link>index.php?form=UserAdd</link>
+ <parent>wcf.acp.menu.link.user.management.general</parent>
+ <permissions>admin.user.canAddUser</permissions>
+ <showorder>3</showorder>
+ </acpmenuitem>
+
+ <acpmenuitem name="wcf.acp.menu.link.user.management.additional">
+ <parent>wcf.acp.menu.link.user.management</parent>
+ <showorder>2</showorder>
+ </acpmenuitem>
+
+ <acpmenuitem name="wcf.acp.menu.link.user.massProcessing">
+ <link>index.php?form=UsersMassProcessing</link>
+ <parent>wcf.acp.menu.link.user.management.additional</parent>
+ <permissions>admin.user.canEditUser,admin.user.canDeleteUser,admin.user.canMailUser</permissions>
+ <showorder>1</showorder>
+ </acpmenuitem>
+
+ <acpmenuitem name="wcf.acp.menu.link.user.mail">
+ <link>index.php?form=UserMail&action=all</link>
+ <parent>wcf.acp.menu.link.user.management.additional</parent>
+ <permissions>admin.user.canMailUser</permissions>
+ <showorder>2</showorder>
+ </acpmenuitem>
+ <!-- /users -->
+
+ <!-- user groups -->
+ <acpmenuitem name="wcf.acp.menu.link.group">
+ <parent>wcf.acp.menu.link.user</parent>
+ <showorder>2</showorder>
+ </acpmenuitem>
+
+ <acpmenuitem name="wcf.acp.menu.link.group.general">
+ <parent>wcf.acp.menu.link.group</parent>
+ <showorder>1</showorder>
+ </acpmenuitem>
+
+ <acpmenuitem name="wcf.acp.menu.link.group.view">
+ <icon>icon/userGroupM.png</icon>
+ <link>index.php?page=UserGroupList</link>
+ <parent>wcf.acp.menu.link.group.general</parent>
+ <permissions>admin.user.canEditGroup,admin.user.canDeleteGroup</permissions>
+ <showorder>1</showorder>
+ </acpmenuitem>
+
+ <acpmenuitem name="wcf.acp.menu.link.group.add">
+ <link>index.php?form=UserGroupAdd</link>
+ <parent>wcf.acp.menu.link.group.general</parent>
+ <permissions>admin.user.canAddGroup</permissions>
+ <showorder>2</showorder>
+ </acpmenuitem>
+
+ <acpmenuitem name="wcf.acp.menu.link.group.additional">
+ <parent>wcf.acp.menu.link.group</parent>
+ <showorder>2</showorder>
+ </acpmenuitem>
+
+ <acpmenuitem name="wcf.acp.menu.link.group.mail">
+ <icon>icon/emailM.png</icon>
+ <link>index.php?form=UserMail&action=group</link>
+ <parent>wcf.acp.menu.link.group.additional</parent>
+ <permissions>admin.user.canMailUser</permissions>
+ <showorder>1</showorder>
+ </acpmenuitem>
+ <!-- user groups -->
+
+ <acpmenuitem name="wcf.acp.menu.link.display">
+ <icon>icon/displayL.png</icon>
+ <showorder>3</showorder>
+ </acpmenuitem>
+
+ <acpmenuitem name="wcf.acp.menu.link.content">
+ <icon>icon/contentL.png</icon>
+ <showorder>4</showorder>
+ </acpmenuitem>
+ </import>
+</data>
-<?xml version="1.0" encoding="UTF-8"?>\r
-<data xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/groupoptions.xsd">\r
- <import>\r
- <categories>\r
- <category name="user"></category>\r
- <category name="mod"></category>\r
- <category name="admin"></category>\r
- <category name="admin.general">\r
- <parent>admin</parent>\r
- </category>\r
- <category name="admin.system">\r
- <parent>admin</parent>\r
- </category>\r
- <category name="admin.system.cronjobs">\r
- <parent>admin.system</parent>\r
- </category>\r
- <category name="admin.system.package">\r
- <parent>admin.system</parent>\r
- </category>\r
- <category name="admin.maintenance">\r
- <parent>admin.system</parent>\r
- </category>\r
- <category name="admin.user">\r
- <parent>admin</parent>\r
- </category>\r
- <category name="admin.user.user">\r
- <parent>admin.user</parent>\r
- </category>\r
- <category name="admin.user.group">\r
- <parent>admin.user</parent>\r
- </category>\r
- \r
- <category name="admin.display">\r
- <parent>admin</parent>\r
- </category>\r
- <category name="admin.content">\r
- <parent>admin</parent>\r
- </category>\r
- <category name="admin.style">\r
- <parent>admin.display</parent>\r
- </category>\r
- <category name="admin.language">\r
- <parent>admin.display</parent>\r
- </category>\r
- </categories>\r
- \r
- <options>\r
- <option name="admin.general.canViewPrivateUserOptions">\r
- <categoryname>admin.general</categoryname>\r
- <optiontype>boolean</optiontype>\r
- <defaultvalue>0</defaultvalue>\r
- <admindefaultvalue>1</admindefaultvalue>\r
- </option>\r
- <option name="admin.system.canEditOption">\r
- <categoryname>admin.system</categoryname>\r
- <optiontype>boolean</optiontype>\r
- <defaultvalue>0</defaultvalue>\r
- <admindefaultvalue>1</admindefaultvalue>\r
- </option>\r
- <option name="admin.system.canViewLog">\r
- <categoryname>admin.system</categoryname>\r
- <optiontype>boolean</optiontype>\r
- <defaultvalue>0</defaultvalue>\r
- <admindefaultvalue>1</admindefaultvalue>\r
- </option>\r
- <option name="admin.system.cronjobs.canAddCronjob">\r
- <categoryname>admin.system.cronjobs</categoryname>\r
- <optiontype>boolean</optiontype>\r
- <defaultvalue>0</defaultvalue>\r
- <admindefaultvalue>1</admindefaultvalue>\r
- </option>\r
- <option name="admin.system.cronjobs.canEditCronjob">\r
- <categoryname>admin.system.cronjobs</categoryname>\r
- <optiontype>boolean</optiontype>\r
- <defaultvalue>0</defaultvalue>\r
- <admindefaultvalue>1</admindefaultvalue>\r
- </option>\r
- <option name="admin.system.cronjobs.canDeleteCronjob">\r
- <categoryname>admin.system.cronjobs</categoryname>\r
- <optiontype>boolean</optiontype>\r
- <defaultvalue>0</defaultvalue>\r
- <admindefaultvalue>1</admindefaultvalue>\r
- </option>\r
- <option name="admin.system.cronjobs.canEnableDisableCronjob">\r
- <categoryname>admin.system.cronjobs</categoryname>\r
- <optiontype>boolean</optiontype>\r
- <defaultvalue>0</defaultvalue>\r
- <admindefaultvalue>1</admindefaultvalue>\r
- </option>\r
- <option name="admin.system.cronjobs.canDeleteCronjobsLog">\r
- <categoryname>admin.system.cronjobs</categoryname>\r
- <optiontype>boolean</optiontype>\r
- <defaultvalue>0</defaultvalue>\r
- <admindefaultvalue>1</admindefaultvalue>\r
- </option>\r
- <option name="admin.system.package.canUpdatePackage">\r
- <categoryname>admin.system.package</categoryname>\r
- <optiontype>boolean</optiontype>\r
- <defaultvalue>0</defaultvalue>\r
- <admindefaultvalue>1</admindefaultvalue>\r
- </option>\r
- <option name="admin.system.package.canUninstallPackage">\r
- <categoryname>admin.system.package</categoryname>\r
- <optiontype>boolean</optiontype>\r
- <defaultvalue>0</defaultvalue>\r
- <admindefaultvalue>1</admindefaultvalue>\r
- </option>\r
- <option name="admin.system.package.canEditServer">\r
- <categoryname>admin.system.package</categoryname>\r
- <optiontype>boolean</optiontype>\r
- <defaultvalue>0</defaultvalue>\r
- <admindefaultvalue>1</admindefaultvalue>\r
- </option>\r
- <option name="admin.user.accessibleGroups">\r
- <categoryname>admin.user.group</categoryname>\r
- <optiontype>groups</optiontype>\r
- <defaultvalue></defaultvalue>\r
- <admindefaultvalue>1,2,3,4,5,6</admindefaultvalue>\r
- </option>\r
- <option name="admin.user.canAddUser">\r
- <categoryname>admin.user.user</categoryname>\r
- <optiontype>boolean</optiontype>\r
- <defaultvalue>0</defaultvalue>\r
- <admindefaultvalue>1</admindefaultvalue>\r
- </option>\r
- <option name="admin.user.canSearchUser">\r
- <categoryname>admin.user.user</categoryname>\r
- <optiontype>boolean</optiontype>\r
- <defaultvalue>0</defaultvalue>\r
- <admindefaultvalue>1</admindefaultvalue>\r
- </option>\r
- <option name="admin.user.canEditUser">\r
- <categoryname>admin.user.user</categoryname>\r
- <optiontype>boolean</optiontype>\r
- <defaultvalue>0</defaultvalue>\r
- <admindefaultvalue>1</admindefaultvalue>\r
- </option>\r
- <option name="admin.user.canEditMailAddress">\r
- <categoryname>admin.user.user</categoryname>\r
- <optiontype>boolean</optiontype>\r
- <defaultvalue>0</defaultvalue>\r
- <admindefaultvalue>1</admindefaultvalue>\r
- </option>\r
- <option name="admin.user.canEditPassword">\r
- <categoryname>admin.user.user</categoryname>\r
- <optiontype>boolean</optiontype>\r
- <defaultvalue>0</defaultvalue>\r
- <admindefaultvalue>1</admindefaultvalue>\r
- </option>\r
- <option name="admin.user.canDeleteUser">\r
- <categoryname>admin.user.user</categoryname>\r
- <optiontype>boolean</optiontype>\r
- <defaultvalue>0</defaultvalue>\r
- <admindefaultvalue>1</admindefaultvalue>\r
- </option>\r
- <option name="admin.user.canMailUser">\r
- <categoryname>admin.user.user</categoryname>\r
- <optiontype>boolean</optiontype>\r
- <defaultvalue>0</defaultvalue>\r
- <admindefaultvalue>1</admindefaultvalue>\r
- </option>\r
- <option name="admin.user.canAddGroup">\r
- <categoryname>admin.user.group</categoryname>\r
- <optiontype>boolean</optiontype>\r
- <defaultvalue>0</defaultvalue>\r
- <admindefaultvalue>1</admindefaultvalue>\r
- </option>\r
- <option name="admin.user.canDeleteGroup">\r
- <categoryname>admin.user.group</categoryname>\r
- <optiontype>boolean</optiontype>\r
- <defaultvalue>0</defaultvalue>\r
- <admindefaultvalue>1</admindefaultvalue>\r
- </option>\r
- <option name="admin.style.canUseDisabledStyle">\r
- <categoryname>admin.style</categoryname>\r
- <optiontype>boolean</optiontype>\r
- <defaultvalue>0</defaultvalue>\r
- <admindefaultvalue>1</admindefaultvalue>\r
- </option>\r
- <option name="admin.language.canAddServer">\r
- <categoryname>admin.language</categoryname>\r
- <optiontype>boolean</optiontype>\r
- <defaultvalue>0</defaultvalue>\r
- <admindefaultvalue>1</admindefaultvalue>\r
- </option>\r
- <option name="admin.language.canDeleteServer">\r
- <categoryname>admin.language</categoryname>\r
- <optiontype>boolean</optiontype>\r
- <defaultvalue>0</defaultvalue>\r
- <admindefaultvalue>1</admindefaultvalue>\r
- </option>\r
- <option name="admin.language.canEditServer">\r
- <categoryname>admin.language</categoryname>\r
- <optiontype>boolean</optiontype>\r
- <defaultvalue>0</defaultvalue>\r
- <admindefaultvalue>1</admindefaultvalue>\r
- </option>\r
- </options>\r
- </import>\r
-</data>\r
+<?xml version="1.0" encoding="UTF-8"?>
+<data xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/groupoptions.xsd">
+ <import>
+ <categories>
+ <category name="user"></category>
+ <category name="mod"></category>
+ <category name="admin"></category>
+ <category name="admin.general">
+ <parent>admin</parent>
+ </category>
+ <category name="admin.system">
+ <parent>admin</parent>
+ </category>
+ <category name="admin.system.cronjobs">
+ <parent>admin.system</parent>
+ </category>
+ <category name="admin.system.package">
+ <parent>admin.system</parent>
+ </category>
+ <category name="admin.maintenance">
+ <parent>admin.system</parent>
+ </category>
+ <category name="admin.user">
+ <parent>admin</parent>
+ </category>
+ <category name="admin.user.user">
+ <parent>admin.user</parent>
+ </category>
+ <category name="admin.user.group">
+ <parent>admin.user</parent>
+ </category>
+
+ <category name="admin.display">
+ <parent>admin</parent>
+ </category>
+ <category name="admin.content">
+ <parent>admin</parent>
+ </category>
+ <category name="admin.style">
+ <parent>admin.display</parent>
+ </category>
+ <category name="admin.language">
+ <parent>admin.display</parent>
+ </category>
+ </categories>
+
+ <options>
+ <option name="admin.general.canViewPrivateUserOptions">
+ <categoryname>admin.general</categoryname>
+ <optiontype>boolean</optiontype>
+ <defaultvalue>0</defaultvalue>
+ <admindefaultvalue>1</admindefaultvalue>
+ </option>
+ <option name="admin.system.canEditOption">
+ <categoryname>admin.system</categoryname>
+ <optiontype>boolean</optiontype>
+ <defaultvalue>0</defaultvalue>
+ <admindefaultvalue>1</admindefaultvalue>
+ </option>
+ <option name="admin.system.canViewLog">
+ <categoryname>admin.system</categoryname>
+ <optiontype>boolean</optiontype>
+ <defaultvalue>0</defaultvalue>
+ <admindefaultvalue>1</admindefaultvalue>
+ </option>
+ <option name="admin.system.cronjobs.canAddCronjob">
+ <categoryname>admin.system.cronjobs</categoryname>
+ <optiontype>boolean</optiontype>
+ <defaultvalue>0</defaultvalue>
+ <admindefaultvalue>1</admindefaultvalue>
+ </option>
+ <option name="admin.system.cronjobs.canEditCronjob">
+ <categoryname>admin.system.cronjobs</categoryname>
+ <optiontype>boolean</optiontype>
+ <defaultvalue>0</defaultvalue>
+ <admindefaultvalue>1</admindefaultvalue>
+ </option>
+ <option name="admin.system.cronjobs.canDeleteCronjob">
+ <categoryname>admin.system.cronjobs</categoryname>
+ <optiontype>boolean</optiontype>
+ <defaultvalue>0</defaultvalue>
+ <admindefaultvalue>1</admindefaultvalue>
+ </option>
+ <option name="admin.system.cronjobs.canEnableDisableCronjob">
+ <categoryname>admin.system.cronjobs</categoryname>
+ <optiontype>boolean</optiontype>
+ <defaultvalue>0</defaultvalue>
+ <admindefaultvalue>1</admindefaultvalue>
+ </option>
+ <option name="admin.system.cronjobs.canDeleteCronjobsLog">
+ <categoryname>admin.system.cronjobs</categoryname>
+ <optiontype>boolean</optiontype>
+ <defaultvalue>0</defaultvalue>
+ <admindefaultvalue>1</admindefaultvalue>
+ </option>
+ <option name="admin.system.package.canUpdatePackage">
+ <categoryname>admin.system.package</categoryname>
+ <optiontype>boolean</optiontype>
+ <defaultvalue>0</defaultvalue>
+ <admindefaultvalue>1</admindefaultvalue>
+ </option>
+ <option name="admin.system.package.canUninstallPackage">
+ <categoryname>admin.system.package</categoryname>
+ <optiontype>boolean</optiontype>
+ <defaultvalue>0</defaultvalue>
+ <admindefaultvalue>1</admindefaultvalue>
+ </option>
+ <option name="admin.system.package.canEditServer">
+ <categoryname>admin.system.package</categoryname>
+ <optiontype>boolean</optiontype>
+ <defaultvalue>0</defaultvalue>
+ <admindefaultvalue>1</admindefaultvalue>
+ </option>
+ <option name="admin.user.accessibleGroups">
+ <categoryname>admin.user.group</categoryname>
+ <optiontype>groups</optiontype>
+ <defaultvalue></defaultvalue>
+ <admindefaultvalue>1,2,3,4,5,6</admindefaultvalue>
+ </option>
+ <option name="admin.user.canAddUser">
+ <categoryname>admin.user.user</categoryname>
+ <optiontype>boolean</optiontype>
+ <defaultvalue>0</defaultvalue>
+ <admindefaultvalue>1</admindefaultvalue>
+ </option>
+ <option name="admin.user.canSearchUser">
+ <categoryname>admin.user.user</categoryname>
+ <optiontype>boolean</optiontype>
+ <defaultvalue>0</defaultvalue>
+ <admindefaultvalue>1</admindefaultvalue>
+ </option>
+ <option name="admin.user.canEditUser">
+ <categoryname>admin.user.user</categoryname>
+ <optiontype>boolean</optiontype>
+ <defaultvalue>0</defaultvalue>
+ <admindefaultvalue>1</admindefaultvalue>
+ </option>
+ <option name="admin.user.canEditMailAddress">
+ <categoryname>admin.user.user</categoryname>
+ <optiontype>boolean</optiontype>
+ <defaultvalue>0</defaultvalue>
+ <admindefaultvalue>1</admindefaultvalue>
+ </option>
+ <option name="admin.user.canEditPassword">
+ <categoryname>admin.user.user</categoryname>
+ <optiontype>boolean</optiontype>
+ <defaultvalue>0</defaultvalue>
+ <admindefaultvalue>1</admindefaultvalue>
+ </option>
+ <option name="admin.user.canDeleteUser">
+ <categoryname>admin.user.user</categoryname>
+ <optiontype>boolean</optiontype>
+ <defaultvalue>0</defaultvalue>
+ <admindefaultvalue>1</admindefaultvalue>
+ </option>
+ <option name="admin.user.canMailUser">
+ <categoryname>admin.user.user</categoryname>
+ <optiontype>boolean</optiontype>
+ <defaultvalue>0</defaultvalue>
+ <admindefaultvalue>1</admindefaultvalue>
+ </option>
+ <option name="admin.user.canAddGroup">
+ <categoryname>admin.user.group</categoryname>
+ <optiontype>boolean</optiontype>
+ <defaultvalue>0</defaultvalue>
+ <admindefaultvalue>1</admindefaultvalue>
+ </option>
+ <option name="admin.user.canDeleteGroup">
+ <categoryname>admin.user.group</categoryname>
+ <optiontype>boolean</optiontype>
+ <defaultvalue>0</defaultvalue>
+ <admindefaultvalue>1</admindefaultvalue>
+ </option>
+ <option name="admin.style.canUseDisabledStyle">
+ <categoryname>admin.style</categoryname>
+ <optiontype>boolean</optiontype>
+ <defaultvalue>0</defaultvalue>
+ <admindefaultvalue>1</admindefaultvalue>
+ </option>
+ <option name="admin.language.canAddServer">
+ <categoryname>admin.language</categoryname>
+ <optiontype>boolean</optiontype>
+ <defaultvalue>0</defaultvalue>
+ <admindefaultvalue>1</admindefaultvalue>
+ </option>
+ <option name="admin.language.canDeleteServer">
+ <categoryname>admin.language</categoryname>
+ <optiontype>boolean</optiontype>
+ <defaultvalue>0</defaultvalue>
+ <admindefaultvalue>1</admindefaultvalue>
+ </option>
+ <option name="admin.language.canEditServer">
+ <categoryname>admin.language</categoryname>
+ <optiontype>boolean</optiontype>
+ <defaultvalue>0</defaultvalue>
+ <admindefaultvalue>1</admindefaultvalue>
+ </option>
+ </options>
+ </import>
+</data>
+++ /dev/null
-{include file='header'}
-
-<div class="mainHeadline">
- <img src="{@RELATIVE_WCF_DIR}icon/languageServer{@$action|ucfirst}L.png" alt="" />
- <div class="headlineContainer">
- <h2>{lang}wcf.acp.languageServer.{$action}{/lang}</h2>
- </div>
-</div>
-
-{if $errorField}
- <p class="error">{lang}wcf.global.form.error{/lang}</p>
-{/if}
-
-{if $success|isset}
- <p class="success">{lang}wcf.acp.languageServer.{$action}.success{/lang}</p>
-{/if}
-
-<div class="contentHeader">
- <div class="largeButtons">
- <ul><li><a href="index.php?page=LanguageServerList{@SID_ARG_2ND}" title="{lang}wcf.acp.menu.link.package.server.view{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/languageServerM.png" alt="" /> <span>{lang}wcf.acp.menu.link.package.server.view{/lang}</span></a></li></ul>
- </div>
-</div>
-<form method="post" action="index.php?form=LanguageServer{@$action|ucfirst}{if $languageServerID|isset}&languageServerID={@$languageServerID}{/if}">
- <div class="border content">
- <div class="container-1">
-
- <fieldset>
- <legend>{lang}wcf.acp.languageServer.data{/lang}</legend>
-
- <div class="formElement{if $errorField == 'server'} formError{/if}" id="serverDiv">
- <div class="formFieldLabel">
- <label for="server">{lang}wcf.acp.languageServer.server{/lang}</label>
- </div>
- <div class="formField">
- <input type="text" class="inputText" name="server" value="{$server}" id="server" />
- {if $errorField == 'server'}
- <p class="innerError">
- {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
- {if $errorType == 'notValid'}{lang}wcf.acp.languageServer.server.error.notValid{/lang}{/if}
- </p>
- {/if}
- </div>
- <div class="formFieldDesc hidden" id="serverHelpMessage">
- <p>{lang}wcf.acp.languageServer.server.description{/lang}</p>
- </div>
- </div>
- <script type="text/javascript">//<![CDATA[
- inlineHelp.register('server');
- //]]></script>
-
- {if $additionalFields|isset}{@$additionalFields}{/if}
- </fieldset>
- </div>
- </div>
-
- <div class="formSubmit">
- <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />
- <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />
- {@SID_INPUT_TAG}
- </div>
-</form>
-
-{include file='footer'}
+++ /dev/null
-{include file='header'}
-
-<script type="text/javascript">
- //<![CDATA[
- $(function() {
- new WCF.Action.Delete('wcf\\data\\language\\server\\LanguageServerAction', $('.languageServerRow'));
- new WCF.Action.Toggle('wcf\\data\\language\\server\\LanguageServerAction', $('.languageServerRow'));
- });
- //]]>
-</script>
-
-<div class="mainHeadline">
- <img src="{@RELATIVE_WCF_DIR}icon/languageServerL.png" alt="" />
- <div class="headlineContainer">
- <h2>{lang}wcf.acp.languageServer.view{/lang}</h2>
- </div>
-</div>
-
-<div class="contentHeader">
- <div class="largeButtons">
- <ul><li><a href="index.php?form=LanguageServerAdd{@SID_ARG_2ND}" title="{lang}wcf.acp.languageServer.add{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/languageServerAddM.png" alt="" /> <span>{lang}wcf.acp.languageServer.add{/lang}</span></a></li></ul>
- </div>
-</div>
-
-{if !$languageServers|count}
- <div class="border content">
- <div class="container-1">
- <p>{lang}wcf.acp.languageServer.view.noneAvailable{/lang}</p>
- </div>
- </div>
-{else}
- <div class="border titleBarPanel">
- <div class="containerHead"><h3>{lang}wcf.acp.languageServer.list.available{/lang}</h3></div>
- </div>
- <div class="border borderMarginRemove">
- <table class="tableList">
- <thead>
- <tr class="tableHead">
- <th class="columnLanguageServerID{if $sortField == 'languageServerID'} active{/if}" colspan="2"><div><a href="index.php?page=LanguageServerList&pageNo={@$pageNo}&sortField=languageServerID&sortOrder={if $sortField == 'languageServerID' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.languageServer.languageServerID{/lang}{if $sortField == 'languageServerID'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
- <th class="columnServer{if $sortField == 'server'} active{/if}"><div><a href="index.php?page=LanguageServerList&pageNo={@$pageNo}&sortField=server&sortOrder={if $sortField == 'server' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.languageServer.server{/lang}{if $sortField == 'server'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
-
- {if $additionalHeadColumns|isset}{@$additionalHeadColumns}{/if}
- </tr>
- </thead>
- <tbody>
- {foreach from=$languageServers item=languageServer}
- <tr class="languageServerRow {cycle values="container-1,container-2"}">
- <td class="columnIcon">
- <img src="{@RELATIVE_WCF_DIR}icon/{if !$languageServer->disabled}enabled{else}disabled{/if}S.png" alt="" class="toggleButton" title="{lang}wcf.acp.languageServer.{if !$languageServer->disabled}disable{else}enable{/if}{/lang}" data-objectID="{@$languageServer->languageServerID}" data-disableMessage="{lang}wcf.acp.languageServer.disable{/lang}" data-enableMessage="{lang}wcf.acp.languageServer.enable{/lang}" />
- <a href="index.php?form=LanguageServerEdit&languageServerID={@$languageServer->languageServerID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/editS.png" alt="" title="{lang}wcf.acp.languageServer.edit{/lang}" /></a>
- <img src="{@RELATIVE_WCF_DIR}icon/deleteS.png" alt="" title="{lang}wcf.acp.languageServer.delete{/lang}" class="deleteButton" data-objectID="{@$languageServer->languageServerID}" data-confirmMessage="{lang}wcf.acp.languageServer.delete.sure{/lang}" />
-
- {if $additionalButtons[$languageServer->languageServerID]|isset}{@$additionalButtons[$languageServer->languageServerID]}{/if}
- </td>
- <td class="columnID">{@$languageServer->languageServerID}</td>
- <td class="columnText">
- <a href="index.php?form=LanguageServerEdit&languageServerID={@$languageServer->languageServerID}{@SID_ARG_2ND}">
- {@$languageServer->serverURL}
- </a>
- </td>
- {if $additionalColumns[$languageServer->languageServerID]|isset}{@$additionalColumns[$languageServer->languageServerID]}{/if}
- </tr>
- {/foreach}
- </tbody>
- </table>
- </div>
- <div class="contentHeader">
- <div class="largeButtons">
- <ul><li><a href="index.php?form=LanguageServerAdd{@SID_ARG_2ND}" title="{lang}wcf.acp.languageServer.add{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/languageServerAddM.png" alt="" /> <span>{lang}wcf.acp.languageServer.add{/lang}</span></a></li></ul>
- </div>
- </div>
-{/if}
-
-{include file='footer'}
+++ /dev/null
-<?php
-namespace wcf\acp\form;
-use wcf\data\language\server\LanguageServerAction;
-use wcf\data\package\update\server\PackageUpdateServer;
-use wcf\system\WCF;
-use wcf\system\WCFACP;
-use wcf\system\exception\UserInputException;
-use wcf\util\StringUtil;
-
-/**
- * Shows the language server add form.
- *
- * @author Alexander Ebert
- * @copyright 2001-2011 WoltLab GmbH
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
- * @package com.woltlab.wcf
- * @subpackage acp.form
- * @category Community Framework
- */
-class LanguageServerAddForm extends ACPForm {
- /**
- * @see wcf\page\AbstractPage::$templateName
- */
- public $templateName = 'languageServerAdd';
-
- /**
- * @see wcf\acp\form\ACPForm::$activeMenuItem
- */
- public $activeMenuItem = 'wcf.acp.menu.link.language.server.add';
-
- /**
- * @see wcf\page\AbstractPage::$neededPermissions
- */
- public $neededPermissions = array('admin.language.canEditServer');
-
- /**
- * server url
- * @var string
- */
- public $server = '';
-
- /**
- * @see wcf\form\Form::readFormParameters()
- */
- public function readFormParameters() {
- parent::readFormParameters();
-
- if (isset($_POST['server'])) $this->server = StringUtil::trim($_POST['server']);
- }
-
- /**
- * @see wcf\form\Form::validate()
- */
- public function validate() {
- parent::validate();
-
- if (empty($this->server)) {
- throw new UserInputException('server');
- }
-
- if (!PackageUpdateServer::isValidServerURL($this->server)) {
- throw new UserInputException('server', 'notValid');
- }
- }
-
- /**
- * @see Form::save()
- */
- public function save() {
- parent::save();
-
- // save server
- $languageServerAction = new LanguageServerAction(array(), 'create', array('data' => array(
- 'serverURL' => $this->server
- )));
- $languageServerAction->executeAction();
- $this->saved();
-
- // reset values
- $this->server = '';
-
- // show success message
- WCF::getTPL()->assign('success', true);
- }
-
- /**
- * @see Page::assignVariables()
- */
- public function assignVariables() {
- parent::assignVariables();
-
- WCF::getTPL()->assign(array(
- 'server' => $this->server,
- 'action' => 'add'
- ));
- }
-
- /**
- * @see Page::assignVariables()
- */
- public function show() {
- // check master password
- WCFACP::checkMasterPassword();
-
- parent::show();
- }
-}
+++ /dev/null
-<?php
-namespace wcf\acp\form;
-use wcf\data\language\server\LanguageServer;
-use wcf\data\language\server\LanguageServerAction;
-use wcf\form\AbstractForm;
-use wcf\system\WCF;
-use wcf\system\exception\IllegalLinkException;
-
-/**
- * Shows the language server edit form.
- *
- * @author Alexander Ebert
- * @copyright 2001-2011 WoltLab GmbH
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
- * @package com.woltlab.wcf
- * @subpackage acp.form
- * @category Community Framework
- */
-class LanguageServerEditForm extends LanguageServerAddForm {
- /**
- * @see wcf\acp\form\ACPForm::$activeMenuItem
- */
- public $activeMenuItem = 'wcf.acp.menu.link.language.server';
-
- /**
- * language server id
- * @var integer
- */
- public $languageServerID = 0;
-
- /**
- * active language server
- * @var wcf\data\language\server\LanguageServer
- */
- public $languageServer = null;
-
- /**
- * @see wcf\page\Page::readParameters()
- */
- public function readParameters() {
- parent::readParameters();
-
- if (isset($_REQUEST['languageServerID'])) $this->languageServerID = intval($_REQUEST['languageServerID']);
- $this->languageServer = new LanguageServer($this->languageServerID);
- if (!$this->languageServer->languageServerID) {
- throw new IllegalLinkException();
- }
- }
-
- /**
- * @see wcf\form\Form::save()
- */
- public function save() {
- AbstractForm::save();
-
- // save server
- $languageServerAction = new LanguageServerAction(array($this->languageServerID), 'update', array('data' => array(
- 'serverURL' => $this->server
- )));
- $languageServerAction->executeAction();
- $this->saved();
-
- // show success message
- WCF::getTPL()->assign('success', true);
- }
-
- /**
- * @see Page::readData()
- */
- public function readData() {
- parent::readData();
-
- if (!count($_POST)) {
- $this->server = $this->languageServer->serverURL;
- }
- }
-
- /**
- * @see Page::assignVariables()
- */
- public function assignVariables() {
- parent::assignVariables();
-
- WCF::getTPL()->assign(array(
- 'languageServerID' => $this->languageServerID,
- 'languageServer' => $this->languageServer,
- 'action' => 'edit'
- ));
- }
-}
+++ /dev/null
-<?php
-namespace wcf\acp\page;
-use wcf\page\SortablePage;
-use wcf\system\menu\acp\ACPMenu;
-use wcf\system\WCF;
-
-/**
- * Shows information about available language servers.
- *
- * @author Alexander Ebert
- * @copyright 2001-2011 WoltLab GmbH
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
- * @package com.woltlab.wcf
- * @subpackage acp.page
- * @category Community Framework
- */
-class LanguageServerListPage extends SortablePage {
- // system
- public $templateName = 'languageServerList';
- public $neededPermissions = array('admin.language.canEditServer');
- public $defaultSortField = 'serverURL';
-
- /**
- * @see wcf\page\MultipleLinkPage::$objectListClassName
- */
- public $objectListClassName = 'wcf\data\language\server\LanguageServerList';
-
- /**
- * @see wcf\page\Page::assignVariables()
- */
- public function assignVariables() {
- parent::assignVariables();
-
- WCF::getTPL()->assign(array(
- 'languageServers' => $this->objectList->getObjects()
- ));
- }
-
- /**
- * @see wcf\page\Page::show()
- */
- public function show() {
- // enable menu item
- ACPMenu::getInstance()->setActiveMenuItem('wcf.acp.menu.link.language.server.list');
-
- parent::show();
- }
-
- /**
- * @see wcf\page\SortablePage::validateSortField()
- */
- public function validateSortField() {
- parent::validateSortField();
-
- switch ($this->sortField) {
- case 'languageServerID':
- case 'serverURL': break;
- default: $this->sortField = $this->defaultSortField;
- }
- }
-}
-<?php\r
-namespace wcf\util;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Contains string-related functions.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2009 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage util\r
- * @category Community Framework\r
- */\r
-class StringUtil {\r
- const HTML_PATTERN = '~</?[a-z]+[1-6]?\r
- (?:\s*[a-z]+\s*=\s*(?:\r
- "[^"\\\\]*(?:\\\\.[^"\\\\]*)*"|\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\'|[^\s>]\r
- ))*\s*/?>~ix';\r
- \r
- /**\r
- * Returns a salted hash of the given value.\r
- *\r
- * @param string $value\r
- * @param string $salt\r
- * @return string $hash\r
- */\r
- public static function getSaltedHash($value, $salt) {\r
- if (!defined('ENCRYPTION_ENABLE_SALTING') || ENCRYPTION_ENABLE_SALTING) {\r
- $hash = '';\r
- // salt\r
- if (!defined('ENCRYPTION_SALT_POSITION') || ENCRYPTION_SALT_POSITION == 'before') {\r
- $hash .= $salt;\r
- }\r
- \r
- // value\r
- if (!defined('ENCRYPTION_ENCRYPT_BEFORE_SALTING') || ENCRYPTION_ENCRYPT_BEFORE_SALTING) {\r
- $hash .= self::encrypt($value);\r
- }\r
- else {\r
- $hash .= $value;\r
- }\r
- \r
- // salt\r
- if (defined('ENCRYPTION_SALT_POSITION') && ENCRYPTION_SALT_POSITION == 'after') {\r
- $hash .= $salt;\r
- }\r
- \r
- return self::encrypt($hash);\r
- }\r
- else {\r
- return self::encrypt($value);\r
- }\r
- }\r
- \r
- /**\r
- * Returns a double salted hash of the given value.\r
- *\r
- * @param string $value\r
- * @param string $salt\r
- * @return string $hash\r
- */\r
- public static function getDoubleSaltedHash($value, $salt) {\r
- return self::encrypt($salt . self::getSaltedHash($value, $salt));\r
- }\r
- \r
- /**\r
- * encrypts the given value.\r
- *\r
- * @param string $value\r
- * @return string $hash\r
- */\r
- public static function encrypt($value) {\r
- if (defined('ENCRYPTION_METHOD')) {\r
- switch (ENCRYPTION_METHOD) {\r
- case 'sha1': return sha1($value);\r
- case 'md5': return md5($value);\r
- case 'crc32': return crc32($value);\r
- case 'crypt': return crypt($value);\r
- }\r
- }\r
- return sha1($value);\r
- }\r
- \r
- /**\r
- * alias to php sha1() function.\r
- *\r
- * @param string $value\r
- * @return string $hash\r
- */\r
- public static function getHash($value) {\r
- return sha1($value);\r
- }\r
-\r
- /**\r
- * Creates a random hash.\r
- * \r
- * @return string a random hash\r
- */\r
- public static function getRandomID() {\r
- return self::getHash(microtime() . uniqid(mt_rand(), true));\r
- }\r
-\r
- /**\r
- * Converts dos to unix newlines.\r
- *\r
- * @param string $string\r
- * @return string $string\r
- */\r
- public static function unifyNewlines($string) {\r
- return preg_replace("%(\r\n)|(\r)%", "\n", $string);\r
- }\r
-\r
- /**\r
- * alias to php trim() function\r
- * \r
- * @param string $string\r
- * @return string $string\r
- */\r
- public static function trim($text) {\r
- return trim($text);\r
- }\r
-\r
- /**\r
- * Converts html special characters.\r
- *\r
- * @param string $string\r
- * @return string $string\r
- */\r
- public static function encodeHTML($string) {\r
- if (is_object($string)) \r
- $string = $string->__toString();\r
- \r
- return @htmlspecialchars($string, ENT_COMPAT, 'UTF-8');\r
- }\r
- \r
- /**\r
- * Decodes html entities.\r
- *\r
- * @param string $string\r
- * @return string $string\r
- */\r
- public static function decodeHTML($string) {\r
- if (is_object($string)) \r
- $string = $string->__toString();\r
- \r
- $string = str_ireplace(' ', ' ', $string); // convert non-breaking spaces to ascii 32; not ascii 160\r
- return @html_entity_decode($string, ENT_COMPAT, 'UTF-8');\r
- }\r
-\r
- /**\r
- * Formats a numeric.\r
- *\r
- * @param numeric $numeric\r
- * @return string \r
- */\r
- public static function formatNumeric($numeric) {\r
- if (is_int($numeric)) \r
- return self::formatInteger($numeric);\r
- \r
- else if (is_float($numeric))\r
- return self::formatDouble($numeric);\r
- \r
- else {\r
- if (floatval($numeric) - (float) intval($numeric))\r
- return self::formatDouble($numeric);\r
- else \r
- return self::formatInteger(intval($numeric));\r
- }\r
- }\r
- \r
- /**\r
- * Formats an integer.\r
- * \r
- * @param integer $integer\r
- * @return string\r
- */\r
- public static function formatInteger($integer) {\r
- $integer = self::addThousandsSeparator($integer);\r
- \r
- return $integer;\r
- }\r
- \r
- /**\r
- * Formats a double.\r
- * \r
- * @param double $double\r
- * @param integer $minDecimals\r
- * @return string\r
- */\r
- public static function formatDouble($double, $minDecimals = 0) {\r
- // consider as integer, if no decimal places found\r
- if (!$minDecimals && preg_match('~^(-?\d+)(?:\.(?:0*|00[0-4]\d*))?$~', $double, $match)) {\r
- return self::formatInteger($match[1]);\r
- }\r
- \r
- // round\r
- $double = round($double, ($minDecimals > 2 ? $minDecimals : 2));\r
- \r
- // remove last 0\r
- if ($minDecimals < 2 && substr($double, -1) == '0') $double = substr($double, 0, -1);\r
- \r
- // replace decimal point\r
- $double = str_replace('.', WCF::getLanguage()->get('wcf.global.decimalPoint'), $double);\r
- \r
- // add thousands separator\r
- $double = self::addThousandsSeparator($double);\r
- \r
- return $double;\r
- }\r
- \r
- /**\r
- * Adds thousands separators to a given number.\r
- * \r
- * @param mixed $number\r
- * @return string\r
- */\r
- public static function addThousandsSeparator($number) {\r
- if ($number >= 1000 || $number <= -1000) {\r
- $number = preg_replace('~(?<=\d)(?=(\d{3})+(?!\d))~', WCF::getLanguage()->get('wcf.global.thousandsSeparator'), $number);\r
- }\r
- \r
- return $number;\r
- }\r
- \r
- /**\r
- * Sorts an array of strings and maintain index association.\r
- * \r
- * @param array $strings \r
- * @return boolean\r
- */\r
- public static function sort(&$strings) {\r
- return asort($strings, SORT_LOCALE_STRING);\r
- }\r
- \r
- /**\r
- * alias to php strlen() function.\r
- */\r
- public static function length($string) {\r
- return mb_strlen($string);\r
- }\r
- \r
- /**\r
- * alias to php strpos() function.\r
- */\r
- public static function indexOf($hayStack, $needle, $offset = 0) {\r
- return mb_strpos($hayStack, $needle, $offset);\r
- }\r
- \r
- /**\r
- * alias to php stripos() function.\r
- */\r
- public static function indexOfIgnoreCase($hayStack, $needle, $offset = 0) {\r
- return mb_strpos(self::toLowerCase($hayStack), self::toLowerCase($needle), $offset);\r
- }\r
- \r
- /**\r
- * alias to php strrpos() function.\r
- */\r
- public static function lastIndexOf($hayStack, $needle) {\r
- return mb_strrpos($hayStack, $needle);\r
- }\r
- \r
- /**\r
- * alias to php substr() function.\r
- */\r
- public static function substring($string, $start, $length = null) {\r
- if ($length !== null) return mb_substr($string, $start, $length);\r
- return mb_substr($string, $start);\r
- }\r
- \r
- /**\r
- * alias to php strtolower() function.\r
- */\r
- public static function toLowerCase($string) {\r
- return mb_strtolower($string);\r
- }\r
- \r
- /**\r
- * alias to php strtoupper() function.\r
- */\r
- public static function toUpperCase($string) {\r
- return mb_strtoupper($string);\r
- }\r
- \r
- /**\r
- * alias to php substr_count() function.\r
- */\r
- public static function countSubstring($hayStack, $needle) {\r
- return mb_substr_count($hayStack, $needle);\r
- }\r
- \r
- /**\r
- * alias to php ucfirst() function.\r
- */\r
- public static function firstCharToUpperCase($string) {\r
- return self::toUpperCase(self::substring($string, 0, 1)).self::substring($string, 1);\r
- }\r
- \r
- /**\r
- * alias to php lcfirst() function.\r
- */\r
- public static function firstCharToLowerCase($string) {\r
- return self::toLowerCase(self::substring($string, 0, 1)).self::substring($string, 1);\r
- }\r
- \r
- /**\r
- * alias to php ucwords() function.\r
- */\r
- public static function wordsToUpperCase($string) {\r
- return mb_convert_case($string, MB_CASE_TITLE);\r
- }\r
- \r
- /**\r
- * alias to php str_replace() function.\r
- */\r
- public static function replace($search, $replace, $subject, &$count = null) {\r
- return str_replace($search, $replace, $subject, $count);\r
- }\r
- \r
- /**\r
- * alias to php str_ireplace() function.\r
- */\r
- public static function replaceIgnoreCase($search, $replace, $subject, &$count = 0) {\r
- $startPos = self::indexOf(self::toLowerCase($subject), self::toLowerCase($search));\r
- if ($startPos === false) return $subject;\r
- else {\r
- $endPos = $startPos + self::length($search);\r
- $count++;\r
- return self::substring($subject, 0, $startPos) . $replace . self::replaceIgnoreCase($search, $replace, self::substring($subject, $endPos), $count);\r
- }\r
- }\r
- \r
- /**\r
- * Unescapes escaped characters in a string.\r
- * \r
- * @param string $string\r
- * @param string $chars\r
- * @return string\r
- */\r
- public static function unescape($string, $chars = '"') {\r
- for ($i = 0, $j = strlen($chars); $i < $j; $i++) {\r
- $string = self::replace('\\'.$chars[$i], $chars[$i], $string);\r
- }\r
- \r
- return $string;\r
- }\r
- \r
- /**\r
- * Takes a numeric HTML entity value and returns the appropriate UTF-8 bytes.\r
- * \r
- * @param integer $dec html entity value\r
- * @return string utf-8 bytes\r
- */\r
- public static function getCharacter($dec) {\r
- if ($dec < 128) {\r
- $utf = chr($dec);\r
- }\r
- else if ($dec < 2048) {\r
- $utf = chr(192 + (($dec - ($dec % 64)) / 64));\r
- $utf .= chr(128 + ($dec % 64));\r
- }\r
- else {\r
- $utf = chr(224 + (($dec - ($dec % 4096)) / 4096));\r
- $utf .= chr(128 + ((($dec % 4096) - ($dec % 64)) / 64));\r
- $utf .= chr(128 + ($dec % 64));\r
- }\r
- return $utf;\r
- }\r
- \r
- /**\r
- * Converts UTF-8 to Unicode\r
- * @see http://www1.tip.nl/~t876506/utf8tbl.html\r
- *\r
- * @param string $c\r
- * @return integer unicode value of $c\r
- */\r
- public static function getCharValue($c) {\r
- $ud = 0;\r
- if (ord($c{0}) >= 0 && ord($c{0}) <= 127) \r
- $ud = ord($c{0});\r
- if (ord($c{0}) >= 192 && ord($c{0}) <= 223) \r
- $ud = (ord($c{0}) - 192) * 64 + (ord($c{1}) - 128);\r
- if (ord($c{0}) >= 224 && ord($c{0}) <= 239) \r
- $ud = (ord($c{0}) - 224) * 4096 + (ord($c{1}) - 128) * 64 + (ord($c{2}) - 128);\r
- if (ord($c{0}) >= 240 && ord($c{0}) <= 247) \r
- $ud = (ord($c{0}) - 240) * 262144 + (ord($c{1}) - 128) * 4096 + (ord($c{2}) - 128) * 64 + (ord($c{3}) - 128);\r
- if (ord($c{0}) >= 248 && ord($c{0}) <= 251) \r
- $ud = (ord($c{0}) - 248) * 16777216 + (ord($c{1}) - 128) * 262144 + (ord($c{2}) - 128) * 4096 + (ord($c{3}) - 128) * 64 + (ord($c{4}) - 128);\r
- if (ord($c{0}) >= 252 && ord($c{0}) <= 253) \r
- $ud = (ord($c{0}) - 252) * 1073741824 + (ord($c{1}) - 128) * 16777216 + (ord($c{2}) - 128) * 262144 + (ord($c{3}) - 128) * 4096 + (ord($c{4}) - 128) * 64 + (ord($c{5}) - 128);\r
- if (ord($c{0}) >= 254 && ord($c{0}) <= 255) \r
- $ud = false; // error\r
- return $ud;\r
- }\r
- \r
- /**\r
- * Returns html entities of all characters in the given string.\r
- * \r
- * @param string $string\r
- * @return string\r
- */\r
- public static function encodeAllChars($string) {\r
- $result = '';\r
- for ($i = 0, $j = StringUtil::length($string); $i < $j; $i++) {\r
- $char = StringUtil::substring($string, $i, 1);\r
- $result .= '&#'.StringUtil::getCharValue($char).';';\r
- }\r
- \r
- return $result;\r
- }\r
- \r
- /**\r
- * Returns true, if the given string contains only ASCII characters.\r
- * \r
- * @param string $string\r
- * @return boolean\r
- */\r
- public static function isASCII($string) {\r
- return preg_match('/^[\x00-\x7F]*$/', $string);\r
- }\r
- \r
- /**\r
- * Returns true, if the given string is utf-8 encoded.\r
- * @see http://www.w3.org/International/questions/qa-forms-utf-8\r
- * \r
- * @param string $string\r
- * @return boolean\r
- */\r
- public static function isUTF8($string) {\r
- /*return preg_match('/^(\r
- [\x09\x0A\x0D\x20-\x7E]* # ASCII\r
- | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte\r
- | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs\r
- | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte\r
- | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates\r
- | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3\r
- | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15\r
- | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16\r
- )*$/x', $string);\r
- */ \r
- return preg_match('/(\r
- [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte\r
- | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs\r
- | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte\r
- | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates\r
- | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3\r
- | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15\r
- | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16\r
- )/x', $string);\r
- }\r
- \r
- /**\r
- * Extracts the class name from a standardised class path.\r
- * \r
- * @param string $classPath\r
- * @return string class name\r
- */\r
- public static function getClassName($classPath) {\r
- return preg_replace('~(?:.*/)?([^/]+).class.php~i', '\\1', $classPath);\r
- }\r
- \r
- /**\r
- * Escapes the closing cdata tag.\r
- * \r
- * @param string $string\r
- * @return string\r
- */\r
- public static function escapeCDATA($string) {\r
- return str_replace(']]>', ']]]]><![CDATA[>', $string);\r
- }\r
- \r
- /**\r
- * Converts a string to requested character encoding.\r
- * @see mb_convert_encoding()\r
- * \r
- * @param string $inCharset\r
- * @param string $outCharset\r
- * @param string $string\r
- * @return string converted string\r
- */\r
- public static function convertEncoding($inCharset, $outCharset, $string) {\r
- if ($inCharset == 'ISO-8859-1' && $outCharset == 'UTF-8') return utf8_encode($string);\r
- if ($inCharset == 'UTF-8' && $outCharset == 'ISO-8859-1') return utf8_decode($string);\r
- \r
- return mb_convert_encoding($string, $outCharset, $inCharset);\r
- }\r
- \r
- /**\r
- * Strips HTML tags from a string.\r
- * \r
- * @param string $string\r
- * @return string\r
- */\r
- public static function stripHTML($string) {\r
- return preg_replace(self::HTML_PATTERN, '', $string);\r
- }\r
- \r
- /**\r
- * Returns false, if the given word is forbidden by given word filter.\r
- * \r
- * @param string $word\r
- * @param string $filter\r
- * @return boolean\r
- */\r
- public static function executeWordFilter($word, $filter) {\r
- $word = self::toLowerCase($word);\r
- \r
- if ($filter != '') {\r
- $forbiddenNames = explode("\n", self::toLowerCase(self::unifyNewlines($filter)));\r
- foreach ($forbiddenNames as $forbiddenName) {\r
- if (self::indexOf($forbiddenName, '*') !== false) {\r
- $forbiddenName = self::replace('\*', '.*', preg_quote($forbiddenName, '/'));\r
- if (preg_match('/^'.$forbiddenName.'$/s', $word)) {\r
- return false;\r
- }\r
- }\r
- else {\r
- if ($word == $forbiddenName) {\r
- return false;\r
- }\r
- }\r
- }\r
- }\r
- \r
- return true;\r
- }\r
- \r
- /**\r
- * Splits given string into smaller chunks.\r
- * \r
- * @param string $string\r
- * @param integer $length\r
- * @param string $break\r
- * @return string\r
- */\r
- public static function splitIntoChunks($string, $length = 75, $break = "\r\n") {\r
- return mb_ereg_replace('.{'.$length.'}', "\\0".$break, $string);\r
- }\r
- \r
- /**\r
- * Generates a random user password with the given character length.\r
- *\r
- * @param integer $length\r
- * @return string new password\r
- */\r
- public static function getRandomPassword($length = 8) {\r
- $availableCharacters = array(\r
- 0 => 'abcdefghijklmnopqrstuvwxyz',\r
- 1 => 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',\r
- 2 => '0123456789',\r
- 3 => '+#-.,;:?!'\r
- );\r
- \r
- $password = '';\r
- $type = 0;\r
- for ($i = 0; $i < $length; $i++) {\r
- $type = ($i % 4 == 0) ? 0 : ($type + 1);\r
- $password .= substr($availableCharacters[$type], MathUtil::getRandomValue(0, strlen($availableCharacters[$type]) - 1), 1);\r
- }\r
- \r
- return str_shuffle($password);\r
- }\r
+<?php
+namespace wcf\util;
+use wcf\system\WCF;
+
+/**
+ * Contains string-related functions.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2009 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage util
+ * @category Community Framework
+ */
+class StringUtil {
+ const HTML_PATTERN = '~</?[a-z]+[1-6]?
+ (?:\s*[a-z]+\s*=\s*(?:
+ "[^"\\\\]*(?:\\\\.[^"\\\\]*)*"|\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\'|[^\s>]
+ ))*\s*/?>~ix';
+
+ /**
+ * Returns a salted hash of the given value.
+ *
+ * @param string $value
+ * @param string $salt
+ * @return string $hash
+ */
+ public static function getSaltedHash($value, $salt) {
+ if (!defined('ENCRYPTION_ENABLE_SALTING') || ENCRYPTION_ENABLE_SALTING) {
+ $hash = '';
+ // salt
+ if (!defined('ENCRYPTION_SALT_POSITION') || ENCRYPTION_SALT_POSITION == 'before') {
+ $hash .= $salt;
+ }
+
+ // value
+ if (!defined('ENCRYPTION_ENCRYPT_BEFORE_SALTING') || ENCRYPTION_ENCRYPT_BEFORE_SALTING) {
+ $hash .= self::encrypt($value);
+ }
+ else {
+ $hash .= $value;
+ }
+
+ // salt
+ if (defined('ENCRYPTION_SALT_POSITION') && ENCRYPTION_SALT_POSITION == 'after') {
+ $hash .= $salt;
+ }
+
+ return self::encrypt($hash);
+ }
+ else {
+ return self::encrypt($value);
+ }
+ }
+
+ /**
+ * Returns a double salted hash of the given value.
+ *
+ * @param string $value
+ * @param string $salt
+ * @return string $hash
+ */
+ public static function getDoubleSaltedHash($value, $salt) {
+ return self::encrypt($salt . self::getSaltedHash($value, $salt));
+ }
+
+ /**
+ * encrypts the given value.
+ *
+ * @param string $value
+ * @return string $hash
+ */
+ public static function encrypt($value) {
+ if (defined('ENCRYPTION_METHOD')) {
+ switch (ENCRYPTION_METHOD) {
+ case 'sha1': return sha1($value);
+ case 'md5': return md5($value);
+ case 'crc32': return crc32($value);
+ case 'crypt': return crypt($value);
+ }
+ }
+ return sha1($value);
+ }
+
+ /**
+ * alias to php sha1() function.
+ *
+ * @param string $value
+ * @return string $hash
+ */
+ public static function getHash($value) {
+ return sha1($value);
+ }
+
+ /**
+ * Creates a random hash.
+ *
+ * @return string a random hash
+ */
+ public static function getRandomID() {
+ return self::getHash(microtime() . uniqid(mt_rand(), true));
+ }
+
+ /**
+ * Converts dos to unix newlines.
+ *
+ * @param string $string
+ * @return string $string
+ */
+ public static function unifyNewlines($string) {
+ return preg_replace("%(\r\n)|(\r)%", "\n", $string);
+ }
+
+ /**
+ * alias to php trim() function
+ *
+ * @param string $string
+ * @return string $string
+ */
+ public static function trim($text) {
+ return trim($text);
+ }
+
+ /**
+ * Converts html special characters.
+ *
+ * @param string $string
+ * @return string $string
+ */
+ public static function encodeHTML($string) {
+ if (is_object($string))
+ $string = $string->__toString();
+
+ return @htmlspecialchars($string, ENT_COMPAT, 'UTF-8');
+ }
+
+ /**
+ * Decodes html entities.
+ *
+ * @param string $string
+ * @return string $string
+ */
+ public static function decodeHTML($string) {
+ if (is_object($string))
+ $string = $string->__toString();
+
+ $string = str_ireplace(' ', ' ', $string); // convert non-breaking spaces to ascii 32; not ascii 160
+ return @html_entity_decode($string, ENT_COMPAT, 'UTF-8');
+ }
+
+ /**
+ * Formats a numeric.
+ *
+ * @param numeric $numeric
+ * @return string
+ */
+ public static function formatNumeric($numeric) {
+ if (is_int($numeric))
+ return self::formatInteger($numeric);
+
+ else if (is_float($numeric))
+ return self::formatDouble($numeric);
+
+ else {
+ if (floatval($numeric) - (float) intval($numeric))
+ return self::formatDouble($numeric);
+ else
+ return self::formatInteger(intval($numeric));
+ }
+ }
+
+ /**
+ * Formats an integer.
+ *
+ * @param integer $integer
+ * @return string
+ */
+ public static function formatInteger($integer) {
+ $integer = self::addThousandsSeparator($integer);
+
+ return $integer;
+ }
+
+ /**
+ * Formats a double.
+ *
+ * @param double $double
+ * @param integer $minDecimals
+ * @return string
+ */
+ public static function formatDouble($double, $minDecimals = 0) {
+ // consider as integer, if no decimal places found
+ if (!$minDecimals && preg_match('~^(-?\d+)(?:\.(?:0*|00[0-4]\d*))?$~', $double, $match)) {
+ return self::formatInteger($match[1]);
+ }
+
+ // round
+ $double = round($double, ($minDecimals > 2 ? $minDecimals : 2));
+
+ // remove last 0
+ if ($minDecimals < 2 && substr($double, -1) == '0') $double = substr($double, 0, -1);
+
+ // replace decimal point
+ $double = str_replace('.', WCF::getLanguage()->get('wcf.global.decimalPoint'), $double);
+
+ // add thousands separator
+ $double = self::addThousandsSeparator($double);
+
+ return $double;
+ }
+
+ /**
+ * Adds thousands separators to a given number.
+ *
+ * @param mixed $number
+ * @return string
+ */
+ public static function addThousandsSeparator($number) {
+ if ($number >= 1000 || $number <= -1000) {
+ $number = preg_replace('~(?<=\d)(?=(\d{3})+(?!\d))~', WCF::getLanguage()->get('wcf.global.thousandsSeparator'), $number);
+ }
+
+ return $number;
+ }
+
+ /**
+ * Sorts an array of strings and maintain index association.
+ *
+ * @param array $strings
+ * @return boolean
+ */
+ public static function sort(&$strings) {
+ return asort($strings, SORT_LOCALE_STRING);
+ }
+
+ /**
+ * alias to php strlen() function.
+ */
+ public static function length($string) {
+ return mb_strlen($string);
+ }
+
+ /**
+ * alias to php strpos() function.
+ */
+ public static function indexOf($hayStack, $needle, $offset = 0) {
+ return mb_strpos($hayStack, $needle, $offset);
+ }
+
+ /**
+ * alias to php stripos() function.
+ */
+ public static function indexOfIgnoreCase($hayStack, $needle, $offset = 0) {
+ return mb_strpos(self::toLowerCase($hayStack), self::toLowerCase($needle), $offset);
+ }
+
+ /**
+ * alias to php strrpos() function.
+ */
+ public static function lastIndexOf($hayStack, $needle) {
+ return mb_strrpos($hayStack, $needle);
+ }
+
+ /**
+ * alias to php substr() function.
+ */
+ public static function substring($string, $start, $length = null) {
+ if ($length !== null) return mb_substr($string, $start, $length);
+ return mb_substr($string, $start);
+ }
+
+ /**
+ * alias to php strtolower() function.
+ */
+ public static function toLowerCase($string) {
+ return mb_strtolower($string);
+ }
+
+ /**
+ * alias to php strtoupper() function.
+ */
+ public static function toUpperCase($string) {
+ return mb_strtoupper($string);
+ }
+
+ /**
+ * alias to php substr_count() function.
+ */
+ public static function countSubstring($hayStack, $needle) {
+ return mb_substr_count($hayStack, $needle);
+ }
+
+ /**
+ * alias to php ucfirst() function.
+ */
+ public static function firstCharToUpperCase($string) {
+ return self::toUpperCase(self::substring($string, 0, 1)).self::substring($string, 1);
+ }
+
+ /**
+ * alias to php lcfirst() function.
+ */
+ public static function firstCharToLowerCase($string) {
+ return self::toLowerCase(self::substring($string, 0, 1)).self::substring($string, 1);
+ }
+
+ /**
+ * alias to php ucwords() function.
+ */
+ public static function wordsToUpperCase($string) {
+ return mb_convert_case($string, MB_CASE_TITLE);
+ }
+
+ /**
+ * alias to php str_replace() function.
+ */
+ public static function replace($search, $replace, $subject, &$count = null) {
+ return str_replace($search, $replace, $subject, $count);
+ }
+
+ /**
+ * alias to php str_ireplace() function.
+ */
+ public static function replaceIgnoreCase($search, $replace, $subject, &$count = 0) {
+ $startPos = self::indexOf(self::toLowerCase($subject), self::toLowerCase($search));
+ if ($startPos === false) return $subject;
+ else {
+ $endPos = $startPos + self::length($search);
+ $count++;
+ return self::substring($subject, 0, $startPos) . $replace . self::replaceIgnoreCase($search, $replace, self::substring($subject, $endPos), $count);
+ }
+ }
+
+ /**
+ * Unescapes escaped characters in a string.
+ *
+ * @param string $string
+ * @param string $chars
+ * @return string
+ */
+ public static function unescape($string, $chars = '"') {
+ for ($i = 0, $j = strlen($chars); $i < $j; $i++) {
+ $string = self::replace('\\'.$chars[$i], $chars[$i], $string);
+ }
+
+ return $string;
+ }
+
+ /**
+ * Takes a numeric HTML entity value and returns the appropriate UTF-8 bytes.
+ *
+ * @param integer $dec html entity value
+ * @return string utf-8 bytes
+ */
+ public static function getCharacter($dec) {
+ if ($dec < 128) {
+ $utf = chr($dec);
+ }
+ else if ($dec < 2048) {
+ $utf = chr(192 + (($dec - ($dec % 64)) / 64));
+ $utf .= chr(128 + ($dec % 64));
+ }
+ else {
+ $utf = chr(224 + (($dec - ($dec % 4096)) / 4096));
+ $utf .= chr(128 + ((($dec % 4096) - ($dec % 64)) / 64));
+ $utf .= chr(128 + ($dec % 64));
+ }
+ return $utf;
+ }
+
+ /**
+ * Converts UTF-8 to Unicode
+ * @see http://www1.tip.nl/~t876506/utf8tbl.html
+ *
+ * @param string $c
+ * @return integer unicode value of $c
+ */
+ public static function getCharValue($c) {
+ $ud = 0;
+ if (ord($c{0}) >= 0 && ord($c{0}) <= 127)
+ $ud = ord($c{0});
+ if (ord($c{0}) >= 192 && ord($c{0}) <= 223)
+ $ud = (ord($c{0}) - 192) * 64 + (ord($c{1}) - 128);
+ if (ord($c{0}) >= 224 && ord($c{0}) <= 239)
+ $ud = (ord($c{0}) - 224) * 4096 + (ord($c{1}) - 128) * 64 + (ord($c{2}) - 128);
+ if (ord($c{0}) >= 240 && ord($c{0}) <= 247)
+ $ud = (ord($c{0}) - 240) * 262144 + (ord($c{1}) - 128) * 4096 + (ord($c{2}) - 128) * 64 + (ord($c{3}) - 128);
+ if (ord($c{0}) >= 248 && ord($c{0}) <= 251)
+ $ud = (ord($c{0}) - 248) * 16777216 + (ord($c{1}) - 128) * 262144 + (ord($c{2}) - 128) * 4096 + (ord($c{3}) - 128) * 64 + (ord($c{4}) - 128);
+ if (ord($c{0}) >= 252 && ord($c{0}) <= 253)
+ $ud = (ord($c{0}) - 252) * 1073741824 + (ord($c{1}) - 128) * 16777216 + (ord($c{2}) - 128) * 262144 + (ord($c{3}) - 128) * 4096 + (ord($c{4}) - 128) * 64 + (ord($c{5}) - 128);
+ if (ord($c{0}) >= 254 && ord($c{0}) <= 255)
+ $ud = false; // error
+ return $ud;
+ }
+
+ /**
+ * Returns html entities of all characters in the given string.
+ *
+ * @param string $string
+ * @return string
+ */
+ public static function encodeAllChars($string) {
+ $result = '';
+ for ($i = 0, $j = StringUtil::length($string); $i < $j; $i++) {
+ $char = StringUtil::substring($string, $i, 1);
+ $result .= '&#'.StringUtil::getCharValue($char).';';
+ }
+
+ return $result;
+ }
+
+ /**
+ * Returns true, if the given string contains only ASCII characters.
+ *
+ * @param string $string
+ * @return boolean
+ */
+ public static function isASCII($string) {
+ return preg_match('/^[\x00-\x7F]*$/', $string);
+ }
+
+ /**
+ * Returns true, if the given string is utf-8 encoded.
+ * @see http://www.w3.org/International/questions/qa-forms-utf-8
+ *
+ * @param string $string
+ * @return boolean
+ */
+ public static function isUTF8($string) {
+ /*return preg_match('/^(
+ [\x09\x0A\x0D\x20-\x7E]* # ASCII
+ | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
+ | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
+ | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
+ | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
+ | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
+ | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
+ | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
+ )*$/x', $string);
+ */
+ return preg_match('/(
+ [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
+ | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
+ | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
+ | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
+ | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
+ | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
+ | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
+ )/x', $string);
+ }
+
+ /**
+ * Extracts the class name from a standardised class path.
+ *
+ * @param string $classPath
+ * @return string class name
+ */
+ public static function getClassName($classPath) {
+ return preg_replace('~(?:.*/)?([^/]+).class.php~i', '\\1', $classPath);
+ }
+
+ /**
+ * Escapes the closing cdata tag.
+ *
+ * @param string $string
+ * @return string
+ */
+ public static function escapeCDATA($string) {
+ return str_replace(']]>', ']]]]><![CDATA[>', $string);
+ }
+
+ /**
+ * Converts a string to requested character encoding.
+ * @see mb_convert_encoding()
+ *
+ * @param string $inCharset
+ * @param string $outCharset
+ * @param string $string
+ * @return string converted string
+ */
+ public static function convertEncoding($inCharset, $outCharset, $string) {
+ if ($inCharset == 'ISO-8859-1' && $outCharset == 'UTF-8') return utf8_encode($string);
+ if ($inCharset == 'UTF-8' && $outCharset == 'ISO-8859-1') return utf8_decode($string);
+
+ return mb_convert_encoding($string, $outCharset, $inCharset);
+ }
+
+ /**
+ * Strips HTML tags from a string.
+ *
+ * @param string $string
+ * @return string
+ */
+ public static function stripHTML($string) {
+ return preg_replace(self::HTML_PATTERN, '', $string);
+ }
+
+ /**
+ * Returns false, if the given word is forbidden by given word filter.
+ *
+ * @param string $word
+ * @param string $filter
+ * @return boolean
+ */
+ public static function executeWordFilter($word, $filter) {
+ $word = self::toLowerCase($word);
+
+ if ($filter != '') {
+ $forbiddenNames = explode("\n", self::toLowerCase(self::unifyNewlines($filter)));
+ foreach ($forbiddenNames as $forbiddenName) {
+ if (self::indexOf($forbiddenName, '*') !== false) {
+ $forbiddenName = self::replace('\*', '.*', preg_quote($forbiddenName, '/'));
+ if (preg_match('/^'.$forbiddenName.'$/s', $word)) {
+ return false;
+ }
+ }
+ else {
+ if ($word == $forbiddenName) {
+ return false;
+ }
+ }
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Splits given string into smaller chunks.
+ *
+ * @param string $string
+ * @param integer $length
+ * @param string $break
+ * @return string
+ */
+ public static function splitIntoChunks($string, $length = 75, $break = "\r\n") {
+ return mb_ereg_replace('.{'.$length.'}', "\\0".$break, $string);
+ }
+
+ /**
+ * Generates a random user password with the given character length.
+ *
+ * @param integer $length
+ * @return string new password
+ */
+ public static function getRandomPassword($length = 8) {
+ $availableCharacters = array(
+ 0 => 'abcdefghijklmnopqrstuvwxyz',
+ 1 => 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
+ 2 => '0123456789',
+ 3 => '+#-.,;:?!'
+ );
+
+ $password = '';
+ $type = 0;
+ for ($i = 0; $i < $length; $i++) {
+ $type = ($i % 4 == 0) ? 0 : ($type + 1);
+ $password .= substr($availableCharacters[$type], MathUtil::getRandomValue(0, strlen($availableCharacters[$type]) - 1), 1);
+ }
+
+ return str_shuffle($password);
+ }
}