Merge commit 'a39eb241b58c8cd3505a37acc76a327fbdb1c566' into next
authorTim Düsterhus <duesterhus@woltlab.com>
Thu, 28 Jul 2016 11:02:01 +0000 (13:02 +0200)
committerTim Düsterhus <duesterhus@woltlab.com>
Thu, 28 Jul 2016 11:02:01 +0000 (13:02 +0200)
27 files changed:
1  2 
com.woltlab.wcf/templates/__messageFormPoll.tpl
com.woltlab.wcf/templates/quoteBBCodeTag.tpl
com.woltlab.wcf/templates/userInformationButtons.tpl
com.woltlab.wcf/templates/userProfileLikes.tpl
com.woltlab.wcf/templates/usersOnlineList.tpl
wcfsetup/install/files/js/WCF.ImageViewer.js
wcfsetup/install/files/js/WCF.User.js
wcfsetup/install/files/lib/acp/form/ApplicationEditForm.class.php
wcfsetup/install/files/lib/data/language/LanguageEditor.class.php
wcfsetup/install/files/lib/system/WCF.class.php
wcfsetup/install/files/lib/system/database/editor/DatabaseEditor.class.php
wcfsetup/install/files/lib/system/database/editor/MySQLDatabaseEditor.class.php
wcfsetup/install/files/lib/system/database/util/SQLParser.class.php
wcfsetup/install/files/lib/system/log/modification/ModificationLogHandler.class.php
wcfsetup/install/files/lib/system/option/user/FacebookUserOptionOutput.class.php
wcfsetup/install/files/lib/system/option/user/GooglePlusUserOptionOutput.class.php
wcfsetup/install/files/lib/system/option/user/TwitterUserOptionOutput.class.php
wcfsetup/install/files/lib/system/option/user/URLUserOptionOutput.class.php
wcfsetup/install/files/lib/system/option/user/UserOptionHandler.class.php
wcfsetup/install/files/lib/system/package/PackageInstallationSQLParser.class.php
wcfsetup/install/files/lib/system/poll/PollManager.class.php
wcfsetup/install/files/lib/system/search/mysql/MysqlSearchEngine.class.php
wcfsetup/install/files/lib/util/PasswordUtil.class.php
wcfsetup/install/files/lib/util/StringUtil.class.php
wcfsetup/install/lang/de.xml
wcfsetup/install/lang/en.xml
wcfsetup/setup/db/install.sql

index eafe6c961b2ccc54503f83d323b13011d9bc5704,9a2f7f90a9d64fb4bf555baedecb6001b3fe37a3..d918e62e66290f1811bbca1957151a5f9ba4053a
                //]]>
        </script>
        
 -      <div id="poll" class="jsOnly tabMenuContent container containerPadding">
 -              <fieldset>
 -                      <dl{if $errorField == 'pollQuestion'} class="formError"{/if}>
 -                              <dt>
 -                                      <label for="pollQuestion">{lang}wcf.poll.question{/lang}</label>
 -                              </dt>
 -                              <dd>
 -                                      <input type="text" name="pollQuestion" id="pollQuestion" value="{$pollQuestion}" class="long" maxlength="255" />
 -                                      {if $errorField == 'pollQuestion'}
 -                                              <small class="innerError">
 -                                                      {lang}wcf.global.form.error.empty{/lang}
 -                                              </small>
 -                                      {/if}
 -                              </dd>
 -                      </dl>
 -                      <dl{if $errorField == 'pollOptions'} class="formError"{/if}>
 -                              <dt>
 -                                      <label>{lang}wcf.poll.options{/lang}</label>
 -                              </dt>
 -                              <dd id="pollOptionContainer" class="sortableListContainer">
 -                                      <ol class="sortableList"></ol>
 -                                      {if $errorField == 'pollOptions'}
 -                                              <small class="innerError">
 -                                                      {lang}wcf.global.form.error.empty{/lang}
 -                                              </small>
 -                                      {/if}
 -                                      <small>{lang}wcf.poll.options.description{/lang}</small>
 -                              </dd>
 -                      </dl>
 -                      <dl{if $errorField == 'pollEndTime'} class="formError"{/if}>
 -                              <dt>
 -                                      <label for="pollEndTime">{lang}wcf.poll.endTime{/lang}</label>
 -                              </dt>
 -                              <dd>
 -                                      <input type="datetime" name="pollEndTime" id="pollEndTime" value="{if $pollEndTime}{@$pollEndTime|date:'c'}{/if}" class="medium" data-ignore-timezone="true" />
 -                                      {if $errorField == 'pollEndTime'}
 -                                              <small class="innerError">
 -                                                      {lang}wcf.poll.endTime.error.{@$errorType}{/lang}
 -                                              </small>
 -                                      {/if}
 -                              </dd>
 -                      </dl>
 -                      <dl{if $errorField == 'pollMaxVotes'} class="formError"{/if}>
 -                              <dt>
 -                                      <label for="pollMaxVotes">{lang}wcf.poll.maxVotes{/lang}</label>
 -                              </dt>
 -                              <dd>
 -                                      <input type="number" name="pollMaxVotes" id="pollMaxVotes" value="{@$pollMaxVotes}" min="1" class="tiny" />
 -                                      {if $errorField == 'pollMaxVotes'}
 -                                              <small class="innerError">
 -                                                      {lang}wcf.poll.maxVotes.error.{@$errorType}{/lang}
 -                                              </small>
 -                                      {/if}
 -                              </dd>
 -                      </dl>
 -                      <dl>
 -                              <dt></dt>
 -                              <dd>
 -                                      <label><input type="checkbox" name="pollIsChangeable" value="1"{if $pollIsChangeable} checked="checked"{/if} /> {lang}wcf.poll.isChangeable{/lang}</label>
 -                              </dd>
 -                              {if !$pollID && $__wcf->getPollManager()->canStartPublicPoll()}
 -                                      <dd>
 -                                              <label><input type="checkbox" name="pollIsPublic" value="1"{if $pollIsPublic} checked="checked"{/if} /> {lang}wcf.poll.isPublic{/lang}</label>
 -                                      </dd>
 +      <div id="poll" class="jsOnly messageTabMenuContent">
 +              <dl{if $errorField == 'pollOptions'} class="formError"{/if}>
 +                      <dt>
 +                              <label for="pollQuestion">{lang}wcf.poll.question{/lang}</label>
 +                      </dt>
 +                      <dd>
 +                              <input type="text" name="pollQuestion" id="pollQuestion" value="{$pollQuestion}" class="long" maxlength="255">
 +                              {if $errorField == 'pollQuestion'}
 +                                      <small class="innerError">
 +                                              {lang}wcf.global.form.error.empty{/lang}
 +                                      </small>
                                {/if}
 +                      </dd>
 +                      <dt>
 +                              <label>{lang}wcf.poll.options{/lang}</label>
 +                      </dt>
 +                      <dd id="pollOptionContainer" class="pollOptionContainer sortableListContainer">
 +                              <ol class="sortableList"></ol>
 +                              {if $errorField == 'pollOptions'}
 +                                      <small class="innerError">
 +                                              {lang}wcf.global.form.error.empty{/lang}
 +                                      </small>
 +                              {/if}
 +                              <small>{lang}wcf.poll.options.description{/lang}</small>
 +                      </dd>
 +              </dl>
 +              <dl{if $errorField == 'pollEndTime'} class="formError"{/if}>
 +                      <dt>
 +                              <label for="pollEndTime">{lang}wcf.poll.endTime{/lang}</label>
 +                      </dt>
 +                      <dd>
 +                              <input type="datetime" name="pollEndTime" id="pollEndTime" value="{if $pollEndTime}{@$pollEndTime|date:'c'}{/if}" class="medium" data-ignore-timezone="true">
 +                              {if $errorField == 'pollEndTime'}
 +                                      <small class="innerError">
 +                                              {lang}wcf.poll.endTime.error.{@$errorType}{/lang}
 +                                      </small>
 +                              {/if}
 +                      </dd>
 +              </dl>
 +              <dl{if $errorField == 'pollMaxVotes'} class="formError"{/if}>
 +                      <dt>
 +                              <label for="pollMaxVotes">{lang}wcf.poll.maxVotes{/lang}</label>
 +                      </dt>
 +                      <dd>
 +                              <input type="number" name="pollMaxVotes" id="pollMaxVotes" value="{@$pollMaxVotes}" min="1" class="tiny">
 +                              {if $errorField == 'pollMaxVotes'}
 +                                      <small class="innerError">
 +                                              {lang}wcf.poll.maxVotes.error.{@$errorType}{/lang}
 +                                      </small>
 +                              {/if}
 +                      </dd>
 +              </dl>
 +              <dl>
 +                      <dt></dt>
 +                      <dd>
 +                              <label><input type="checkbox" name="pollIsChangeable" value="1"{if $pollIsChangeable} checked{/if}> {lang}wcf.poll.isChangeable{/lang}</label>
 +                      </dd>
 +                      {if !$pollID && $__wcf->getPollManager()->canStartPublicPoll()}
                                <dd>
 -                                      <label><input type="checkbox" name="pollResultsRequireVote" value="1"{if $pollResultsRequireVote} checked="checked"{/if} /> {lang}wcf.poll.resultsRequireVote{/lang}</label>
 -                                      <small>{lang}wcf.poll.resultsRequireVote.description{/lang}</small>
 -                              </dd>
 -                              <dd>
 -                                      <label><input type="checkbox" name="pollSortByVotes" value="1"{if $pollSortByVotes} checked="checked"{/if} /> {lang}wcf.poll.sortByVotes{/lang}</label>
 +                                      <label><input type="checkbox" name="pollIsPublic" value="1"{if $pollIsPublic} checked{/if}> {lang}wcf.poll.isPublic{/lang}</label>
                                </dd>
 -                      </dl>
 -                      
 -                      {event name='fields'}
 -              </fieldset>
 +                      {/if}
 +                      <dd>
 +                              <label><input type="checkbox" name="pollResultsRequireVote" value="1"{if $pollResultsRequireVote} checked{/if}> {lang}wcf.poll.resultsRequireVote{/lang}</label>
 +                              <small>{lang}wcf.poll.resultsRequireVote.description{/lang}</small>
 +                      </dd>
 +                      <dd>
 +                              <label><input type="checkbox" name="pollSortByVotes" value="1"{if $pollSortByVotes} checked{/if}> {lang}wcf.poll.sortByVotes{/lang}</label>
 +                      </dd>
 +              </dl>
 +              
 +              {event name='fields'}
        </div>
--{/if}
++{/if}
index faf1774149999b8e11b8d2d6ef452c80417df9ae,cfb85165ec121162c80aedf2c548a1e5284b45c1..dde8342c6eeb768df1d82f14b86b732274c8ca82
@@@ -1,26 -1,24 +1,26 @@@
 -{if $quoteAuthorObject}
 -<div class="quoteBoxAuthor">
 -      <div class="quoteAuthorAvatar"><a href="{link controller='User' object=$quoteAuthorObject}{/link}" class="userLink framed" data-user-id="{@$quoteAuthorObject->userID}">{@$quoteAuthorObject->getAvatar()->getImageTag(64)}</a></div>
 -{/if}
 -      <blockquote class="quoteBox container containerPadding{if !$quoteAuthorObject} quoteBoxSimple{/if}"{if $quoteLink} cite="{$quoteLink}"{/if}>
 -              {if $quoteAuthor}
 -                      <header>
 -                              <h3>
 -                                      {if $quoteLink}
 -                                              <a href="{@$quoteLink}"{if $isExternalQuoteLink} class="externalURL"{if EXTERNAL_LINK_REL_NOFOLLOW || EXTERNAL_LINK_TARGET_BLANK} rel="{if EXTERNAL_LINK_REL_NOFOLLOW}nofollow{/if}{if EXTERNAL_LINK_TARGET_BLANK}{if EXTERNAL_LINK_REL_NOFOLLOW} {/if}noopener noreferrer{/if}"{/if}{if EXTERNAL_LINK_TARGET_BLANK} target="_blank"{/if}{/if}>{lang}wcf.bbcode.quote.title{/lang}</a>
 -                                      {else}
 -                                              {lang}wcf.bbcode.quote.title{/lang}
 -                                      {/if}
 -                              </h3>
 -                      </header>
 -              {/if}
 -              
 -              <div>
 -                      {@$content}
 -              </div>
 -      </blockquote>
 -{if $quoteAuthorObject}
 -</div>
 -{/if}
 +<blockquote class="quoteBox{if !$quoteAuthorObject} quoteBoxSimple{/if}"{if $quoteLink} cite="{$quoteLink}"{/if}>
 +      <header class="quoteBoxHeader">
 +              <span class="quoteBoxIcon">
 +                      {if $quoteAuthorObject}
 +                              <a href="{link controller='User' object=$quoteAuthorObject}{/link}" class="userLink" data-user-id="{@$quoteAuthorObject->userID}">{@$quoteAuthorObject->getAvatar()->getImageTag(32)}</a>
 +                      {else}
 +                              <span class="icon icon24 fa-quote-left"></span>
 +                      {/if}
 +              </span>
 +              <span class="quoteBoxTitle">
 +                      {if $quoteAuthor}
 +                              {if $quoteLink}
-                                       <a href="{@$quoteLink}"{if $isExternalQuoteLink} class="externalURL"{if EXTERNAL_LINK_REL_NOFOLLOW} rel="nofollow"{/if}{if EXTERNAL_LINK_TARGET_BLANK} target="_blank"{/if}{/if}>{lang}wcf.bbcode.quote.title{/lang}</a>
++                                      <a href="{@$quoteLink}"{if $isExternalQuoteLink} class="externalURL"{if EXTERNAL_LINK_REL_NOFOLLOW || EXTERNAL_LINK_TARGET_BLANK} rel="{if EXTERNAL_LINK_REL_NOFOLLOW}nofollow{/if}{if EXTERNAL_LINK_TARGET_BLANK}{if EXTERNAL_LINK_REL_NOFOLLOW} {/if}noopener noreferrer{/if}"{/if}{if EXTERNAL_LINK_TARGET_BLANK} target="_blank"{/if}{/if}>{lang}wcf.bbcode.quote.title{/lang}</a>
 +                              {else}
 +                                      {lang}wcf.bbcode.quote.title{/lang}
 +                              {/if}
 +                      {else}
 +                              {lang}wcf.bbcode.quote{/lang}
 +                      {/if}
 +              </span>
 +      </header>
 +      
 +      <div>
 +              {@$content}
 +      </div>
 +</blockquote>
index b681b6660b2b355830e5c08c3f69778b1d7021b1,2c8a84c51e4e18066021d8bebe8c86e2a804a36b..6836711d1247affa8a246881de1e3009a292b393
@@@ -3,7 -3,7 +3,7 @@@
                <ul class="buttonList iconList">
                        {content}
                                {if $user->homepage && $user->homepage != 'http://'}
-                                       <li><a class="jsTooltip" href="{$user->homepage}" title="{lang}wcf.user.option.homepage{/lang}"{if EXTERNAL_LINK_REL_NOFOLLOW} rel="nofollow"{/if}{if EXTERNAL_LINK_TARGET_BLANK} target="_blank"{/if}><span class="icon icon16 fa-home"></span> <span class="invisible">{lang}wcf.user.option.homepage{/lang}</span></a></li>
 -                                      <li><a class="jsTooltip" href="{$user->homepage}" title="{lang}wcf.user.option.homepage{/lang}"{if EXTERNAL_LINK_REL_NOFOLLOW || EXTERNAL_LINK_TARGET_BLANK} rel="{if EXTERNAL_LINK_REL_NOFOLLOW}nofollow{/if}{if EXTERNAL_LINK_TARGET_BLANK}{if EXTERNAL_LINK_REL_NOFOLLOW} {/if}noopener noreferrer{/if}"{/if}{if EXTERNAL_LINK_TARGET_BLANK} target="_blank"{/if}><span class="icon icon16 icon-home"></span> <span class="invisible">{lang}wcf.user.option.homepage{/lang}</span></a></li>
++                                      <li><a class="jsTooltip" href="{$user->homepage}" title="{lang}wcf.user.option.homepage{/lang}"{if EXTERNAL_LINK_REL_NOFOLLOW || EXTERNAL_LINK_TARGET_BLANK} rel="{if EXTERNAL_LINK_REL_NOFOLLOW}nofollow{/if}{if EXTERNAL_LINK_TARGET_BLANK}{if EXTERNAL_LINK_REL_NOFOLLOW} {/if}noopener noreferrer{/if}"{/if}{if EXTERNAL_LINK_TARGET_BLANK} target="_blank"{/if}><span class="icon icon16 fa-home"></span> <span class="invisible">{lang}wcf.user.option.homepage{/lang}</span></a></li>
                                {/if}
                                
                                {if $user->userID != $__wcf->user->userID}
Simple merge
index 62b2fd682819b7181eb9ce3f764354b445dabbd0,013bfa15e628f4eb679c27a3d25ad8c426d8c29b..8754db26690f866697761a6a248022cf1075a968
@@@ -166,11 -168,11 +166,11 @@@ class ApplicationEditForm extends Abstr
                parent::save();
                
                // save application
 -              $this->objectAction = new ApplicationAction(array($this->application->getDecoratedObject()), 'update', array('data' => array_merge($this->additionalFields, array(
 +              $this->objectAction = new ApplicationAction([$this->application->getDecoratedObject()], 'update', ['data' => array_merge($this->additionalFields, [
-                       'cookieDomain' => $this->cookieDomain,
-                       'domainName' => $this->domainName,
+                       'cookieDomain' => mb_strtolower($this->cookieDomain),
+                       'domainName' => mb_strtolower($this->domainName),
                        'domainPath' => $this->domainPath
 -              ))));
 +              ])]);
                $this->objectAction->executeAction();
                
                $this->saved();
index 9d6988239db1c035695c2f5cd65720e7ed94f484,4861512bd2709ec967826b2f44f7810e2a1e4de7..e3d3968827c6f7f3bfb20d5a5e995b92f6ec6a4e
@@@ -89,9 -88,9 +89,9 @@@ class LanguageEditor extends DatabaseOb
                        $filename = WCF_DIR.'language/'.$this->languageID.'_'.$category->languageCategory.'.php';
                        $writer = new AtomicWriter($filename);
                        
 -                      $writer->write("<?php\n/**\n* WoltLab Community Framework\n* language: ".$this->languageCode."\n* encoding: UTF-8\n* category: ".$category->languageCategory."\n* generated at ".gmdate("r")."\n* \n* DO NOT EDIT THIS FILE\n*/\n");
 +                      $writer->write("<?php\n/**\n* WoltLab Suite\n* language: ".$this->languageCode."\n* encoding: UTF-8\n* category: ".$category->languageCategory."\n* generated at ".gmdate("r")."\n* \n* DO NOT EDIT THIS FILE\n*/\n");
                        foreach ($languageItems as $languageItem => $languageItemValue) {
-                               $writer->write("\$this->items['".$languageItem."'] = '".str_replace("'", "\'", $languageItemValue)."';\n");
+                               $writer->write("\$this->items['".$languageItem."'] = '".str_replace(array("\\", "'"), array("\\\\", "\'"), $languageItemValue)."';\n");
                                
                                // compile dynamic language variables
                                if ($category->languageCategory != 'wcf.global' && strpos($languageItemValue, '{') !== false) {
index fc6cc3ba8d091b054a13915b7c803e67c4be09b3,0f46cb70a163113b33da78959607fae86def7405..d76c23e2f37d5f47a135640ba7dd42f11125ec01
@@@ -243,37 -269,22 +243,37 @@@ class WCF 
         * @param       \Exception      $e
         */
        public static final function handleException($e) {
 +              if (ob_get_level()) {
 +                      // discard any output generated before the exception occured, prevents exception
 +                      // being hidden inside HTML elements and therefore not visible in browser output
 +                      ob_clean();
 +              }
 +              
 +              // backwards compatibility
 +              if ($e instanceof IPrintableException) {
 +                      $e->show();
 +                      exit;
 +              }
 +              
 +              @header('HTTP/1.1 503 Service Unavailable');
                try {
 -                      if (!($e instanceof \Exception)) throw $e;
 -                      
 -                      if ($e instanceof IPrintableException) {
 -                              $e->show();
 -                              exit;
 -                      }
 -                      
 -                      // repack Exception
 -                      self::handleException(new SystemException($e->getMessage(), $e->getCode(), '', $e));
 +                      \wcf\functions\exception\printThrowable($e);
                }
 -              catch (\Throwable $exception) {
 -                      die("<pre>WCF::handleException() Unhandled exception: ".$exception->getMessage()."\n\n".preg_replace('/Database->__construct\(.*\)/', 'Database->__construct(...)', $exception->getTraceAsString()));
 +              catch (\Throwable $e2) {
 +                      echo "<pre>An Exception was thrown while handling an Exception:\n\n";
-                       echo $e2;
++                      echo preg_replace('/Database->__construct\(.*\)/', 'Database->__construct(...)', $e2);
 +                      echo "\n\nwas thrown while:\n\n";
-                       echo $e;
++                      echo preg_replace('/Database->__construct\(.*\)/', 'Database->__construct(...)', $e);
 +                      echo "\n\nwas handled.</pre>";
 +                      exit;
                }
 -              catch (\Exception $exception) {
 -                      die("<pre>WCF::handleException() Unhandled exception: ".$exception->getMessage()."\n\n".preg_replace('/Database->__construct\(.*\)/', 'Database->__construct(...)', $exception->getTraceAsString()));
 +              catch (\Exception $e2) {
 +                      echo "<pre>An Exception was thrown while handling an Exception:\n\n";
-                       echo $e2;
++                      echo preg_replace('/Database->__construct\(.*\)/', 'Database->__construct(...)', $e2);
 +                      echo "\n\nwas thrown while:\n\n";
-                       echo $e;
++                      echo preg_replace('/Database->__construct\(.*\)/', 'Database->__construct(...)', $e);
 +                      echo "\n\nwas handled.</pre>";
 +                      exit;
                }
        }
        
index 04e331331f947203b783fbb00d83efe84aab1658,85337bfd3d8dfeafcde826d306476cabefc8c887..25336371a40a5b595d1814f4b755695a888ccacd
@@@ -178,8 -180,17 +178,17 @@@ class MySQLDatabaseEditor extends Datab
                $statement->execute();
        }
        
 -       * @see \wcf\system\database\editor\DatabaseEditor::dropPrimaryKey()
+       /**
++       * @inheritDoc
+        */
+       public function dropPrimaryKey($tableName) {
+               $sql = "ALTER TABLE ".$tableName." DROP PRIMARY KEY";
+               $statement = $this->dbObj->prepareStatement($sql);
+               $statement->execute();
+       }
+       
        /**
 -       * @see \wcf\system\database\editor\DatabaseEditor::dropForeignKey()
 +       * @inheritDoc
         */
        public function dropForeignKey($tableName, $indexName) {
                $sql = "ALTER TABLE `".$tableName."` DROP FOREIGN KEY `".$indexName."`";
index 0371485ee652cc66c12e78e864e78f491ed859f7,a41325fccd64bd47399c3f01cbfa25e6231a1c00..60efc65b1ef4bd717a8873c35771715db61fe27d
@@@ -1,8 -1,6 +1,8 @@@
  <?php
  namespace wcf\system\log\modification;
- use wcf\data\modification\log\ModificationLogEditor;
 +use wcf\data\modification\log\ModificationLog;
+ use wcf\data\modification\log\ModificationLogAction;
 +use wcf\data\object\type\ObjectType;
  use wcf\data\object\type\ObjectTypeCache;
  use wcf\system\database\util\PreparedStatementConditionBuilder;
  use wcf\system\exception\SystemException;
@@@ -36,7 -35,7 +36,7 @@@ class ModificationLogHandler extends Si
         * Returns object type by object type name.
         * 
         * @param       string          $objectType
--       * @return      \wcf\data\object\type\ObjectType
++       * @return      ObjectType
         */
        public function getObjectType($objectType) {
                foreach ($this->cache as $objectTypeObj) {
                        else $username = '';
                }
                
-               return ModificationLogEditor::create([
-                       'objectTypeID' => $objectTypeObj->objectTypeID,
-                       'objectID' => $objectID,
-                       'action' => $action,
-                       'userID' => $userID,
-                       'username' => $username,
-                       'time' => $time,
-                       'additionalData' => serialize($additionalData)
 -              $action = new ModificationLogAction(array(), 'create', array(
 -                      'data' => array(
++              $action = new ModificationLogAction([], 'create', [
++                      'data' => [
+                               'objectTypeID' => $objectTypeObj->objectTypeID,
+                               'objectID' => $objectID,
+                               'action' => $action,
+                               'userID' => $userID,
+                               'username' => $username,
+                               'time' => $time,
+                               'additionalData' => serialize($additionalData)
 -                      )
 -              ));
 -              $result = $action->executeAction();
 -              return $result['returnValues']; 
++                      ]
 +              ]);
++              
++              return $action->executeAction()['returnValues'];
        }
        
        /**
index 908d176304041e4d77bd3eb21a536298484f2aa7,9df2c4ec7f199fd5db441bac172eb88de0076146..28bdbdcb1d72aa4b0cc86848e64862fbfaf703f0
@@@ -120,7 -118,11 +120,11 @@@ class UserOptionHandler extends OptionH
         * Resets the option values.
         */
        public function resetOptionValues() {
 -              $this->optionValues = array();
 +              $this->optionValues = [];
+               
+               foreach ($this->options as $option) {
+                       $this->optionValues[$option->optionName] = $option->defaultValue;
+               }
        }
        
        /**
index 7397993940905eee0c75d812d9bbd10d017562ce,f0d990be0121611bc2245673f96a4e6d158475e6..d1c94aac9621f3127605741e6e4916fce5a6abba
@@@ -379,8 -383,28 +379,28 @@@ class PackageInstallationSQLParser exte
                }
        }
        
 -       * @see \wcf\system\database\util\SQLParser::executeDropPrimaryKeyStatement()
+       /**
++       * @inheritDoc
+        */
+       protected function executeDropPrimaryKeyStatement($tableName) {
+               if ($this->test) {
+                       if ($ownerPackageID = $this->getIndexOwnerID($tableName, '')) {
+                               if ($ownerPackageID != $this->package->packageID) {
+                                       throw new SystemException("Cannot drop primary key from '".$tableName."'. A package can only drop own indices.");
+                               }
+                       }
+               }
+               else {
+ //                    // log
+ //                    $this->indexLog[] = array('tableName' => $tableName, 'indexName' => '', 'packageID' => $this->package->packageID, 'action' => 'delete');
+                       
+                       // execute
+                       parent::executeDropPrimaryKeyStatement($tableName);
+               }
+       }
+       
        /**
 -       * @see \wcf\system\database\util\SQLParser::executeDropForeignKeyStatement()
 +       * @inheritDoc
         */
        protected function executeDropForeignKeyStatement($tableName, $indexName) {
                if ($this->test) {
index 25e4164d0602330c64af9301c8e9467d9469579b,b29b6d61d65cb7f2a1bf2d7fb83069a336df2807..4a553051630cddb973a8c4859d47eef554be7d1a
@@@ -47,9 -49,10 +47,10 @@@ final class PasswordUtil 
                'joomla1',      // Joomla 1.x
                'joomla2',      // Joomla 2.x
                'joomla3',      // Joomla 3.x
+               'phpfox3',      // phpFox 3.x
                'cryptMD5',
                'invalid',      // Never going to match anything
 -      );
 +      ];
        
        /**
         * blowfish cost factor
index 8079efc83e7db4138854b0b261e004d601b61c06,58757c83a32f3f6263d5a60d7fdf5b368f2ee6b5..94c29c12c0ba7415efb8b53db30ee9d4895f99a5
@@@ -2447,12 -2288,10 +2447,14 @@@ Fehler sind beispielsweise
                <item name="wcf.like.objectType.com.woltlab.wcf.comment.response"><![CDATA[Kommentar-Antwort]]></item>
                <item name="wcf.like.likes.more"><![CDATA[Weitere Likes]]></item>
                <item name="wcf.like.likes.noMoreEntries"><![CDATA[Keine weiteren Likes]]></item>
+               <item name="wcf.like.dislikes.more"><![CDATA[Weitere Dislikes]]></item>
+               <item name="wcf.like.dislikes.noMoreEntries"><![CDATA[Keine weiteren Dislikes]]></item>
                <item name="wcf.like.title.com.woltlab.wcf.user.profileComment"><![CDATA[Mag den Kommentar {if $commentAuthor}<a href="{link controller='User' object=$commentAuthor}{/link}">von {$commentAuthor->username}</a>{else}eines Gasts{/if} an der <a href="{link controller='User' object=$user}#wall{/link}">Pinnwand von {$user->username}</a>{if $like->isDislike()} nicht{/if}.]]></item>
                <item name="wcf.like.title.com.woltlab.wcf.user.profileComment.response"><![CDATA[Mag die Antwort {if $responseAuthor}<a href="{link controller='User' object=$responseAuthor}{/link}">von {$responseAuthor->username}</a>{else}eines Gasts{/if} zum Kommentar {if $commentAuthor}von <a href="{link controller='User' object=$commentAuthor}{/link}">{$commentAuthor->username}</a>{else}eines Gasts{/if} an der <a href="{link controller='User' object=$user}#wall{/link}">Pinnwand von {$user->username}</a>{if $like->isDislike()} nicht{/if}.]]></item>
 +              <item name="wcf.like.objectType.com.woltlab.wcf.likeableArticle"><![CDATA[Artikel]]></item>
 +              <item name="wcf.like.title.com.woltlab.wcf.likeableArticle"><![CDATA[Mag den Artikel <a href="{$article->getLink()}">{$article->getTitle()}</a>{if $like->isDislike()} nicht{/if}.]]></item>
 +              <item name="wcf.like.title.com.woltlab.wcf.articleComment"><![CDATA[Mag den Kommentar {if $commentAuthor}von <a href="{link controller='User' object=$commentAuthor}{/link}">{$commentAuthor->username}</a>{else}eines Gasts{/if} zum Artikel <a href="{$articleContent->getLink()}#comments">{$articleContent->getTitle()}</a>{if $like->isDislike()} nicht{/if}.]]></item>
 +              <item name="wcf.like.title.com.woltlab.wcf.articleComment.response"><![CDATA[Mag die Antwort {if $responseAuthor}von <a href="{link controller='User' object=$responseAuthor}{/link}">{$responseAuthor->username}</a>{else}eines Gasts{/if} zum Kommentar {if $commentAuthor}von <a href="{link controller='User' object=$commentAuthor}{/link}">{$commentAuthor->username}</a>{else}eines Gasts{/if} zum Artikel <a href="{$articleContent->getLink()}#comments">{$articleContent->getTitle()}</a>{if $like->isDislike()} nicht{/if}.]]></item>
        </category>
        
        <category name="wcf.map">
@@@ -3040,13 -2938,13 +3042,13 @@@ Die E-Mail-Adresse des neuen Benutzers 
  {link controller='User' object=$user isEmail=true}{/link} ]]></item>
                <item name="wcf.user.register.notification.mail.subject"><![CDATA[Neue Benutzeranmeldung auf der Website: {@PAGE_TITLE|language}]]></item>
                <item name="wcf.user.register.error.disabled"><![CDATA[Die Registrierung ist momentan deaktiviert.]]></item>
 -              <item name="wcf.user.register.success"><![CDATA[Vielen Dank für die Registrierung, {$user->username}. Ihre Registrierung ist hiermit vollständig abgeschlossen.]]></item>
 +              <item name="wcf.user.register.success"><![CDATA[Vielen Dank für die Registrierung, {$user->username}. {if LANGUAGE_USE_INFORMAL_VARIANT}Deine{else}Ihre{/if} Registrierung ist hiermit vollständig abgeschlossen.]]></item>
                <item name="wcf.user.register.needActivation.mail"><![CDATA[Hallo {@$user->username},
  
 -vielen Dank für Ihre Registrierung auf der Website: {@PAGE_TITLE|language}. 
 -Bevor wir Ihr Benutzerkonto aktivieren können, müssen Sie einmalig die Gültigkeit Ihrer E-Mail-Adresse bestätigen.
 +vielen Dank für {if LANGUAGE_USE_INFORMAL_VARIANT}deine{else}Ihre{/if} Registrierung auf der Website: {@PAGE_TITLE|language}. 
- Bevor wir {if LANGUAGE_USE_INFORMAL_VARIANT}deine{else}Ihre{/if} Registrierung aktivieren können, {if LANGUAGE_USE_INFORMAL_VARIANT}musst du{else}müssen Sie{/if} einmalig die Gültigkeit {if LANGUAGE_USE_INFORMAL_VARIANT}deiner{else}Ihrer{/if} E-Mail-Adresse bestätigen.
++Bevor wir {if LANGUAGE_USE_INFORMAL_VARIANT}dein{else}Ihr{/if} Benutzerkonto aktivieren können, {if LANGUAGE_USE_INFORMAL_VARIANT}musst du{else}müssen Sie{/if} einmalig die Gültigkeit {if LANGUAGE_USE_INFORMAL_VARIANT}deiner{else}Ihrer{/if} E-Mail-Adresse bestätigen.
  
 -Bitte bestätigen Sie die Gültigkeit Ihrer E-Mail-Adresse, indem Sie folgenden Link aufrufen:
 +Bitte {if LANGUAGE_USE_INFORMAL_VARIANT}bestätige{else}bestätigen Sie{/if} die Gültigkeit {if LANGUAGE_USE_INFORMAL_VARIANT}deiner{else}Ihrer{/if} E-Mail-Adresse, indem {if LANGUAGE_USE_INFORMAL_VARIANT}du folgenden Link aufrufst{else}Sie folgenden Link aufrufen{/if}:
  {link controller='RegisterActivation' isEmail=true}u={@$user->userID}&a={@$user->activationCode}{/link} 
  
  **** Funktioniert der Link oben nicht? ****
index 0b48a8fb944646fc538aed3f33c54c5c4521d3db,e993e236e2aeb7d0cb9db77a96e1df6f1bd68999..793d2b9276300986b73afef92dc306d1800695b7
@@@ -2423,12 -2303,10 +2423,14 @@@ Errors are
                <item name="wcf.like.objectType.com.woltlab.wcf.comment.response"><![CDATA[Comment Reply]]></item>
                <item name="wcf.like.likes.more"><![CDATA[More Likes]]></item>
                <item name="wcf.like.likes.noMoreEntries"><![CDATA[There are no more likes]]></item>
+               <item name="wcf.like.dislikes.more"><![CDATA[More Dislikes]]></item>
+               <item name="wcf.like.dislikes.noMoreEntries"><![CDATA[There are no more dislikes]]></item>
                <item name="wcf.like.title.com.woltlab.wcf.user.profileComment"><![CDATA[{if $like->isDislike()}Dislikes{else}Likes{/if} the comment by {if $commentAuthor}<a href="{link controller='User' object=$commentAuthor}{/link}">{$commentAuthor->username}</a>{else}a guest{/if} on <a href="{link controller='User' object=$user}#wall{/link}">{$user->username}’s wall</a>.]]></item>
                <item name="wcf.like.title.com.woltlab.wcf.user.profileComment.response"><![CDATA[{if $like->isDislike()}Dislikes{else}Likes{/if} the response by {if $responseAuthor}<a href="{link controller='User' object=$responseAuthor}{/link}">{$responseAuthor->username}</a>{else}a guest{/if} on the comment by {if $commentAuthor}<a href="{link controller='User' object=$commentAuthor}{/link}">{$commentAuthor->username}</a>{else}a guest{/if} on <a href="{link controller='User' object=$user}#wall{/link}">{$user->username}’s wall</a>.]]></item>
 +              <item name="wcf.like.objectType.com.woltlab.wcf.likeableArticle"><![CDATA[Article]]></item>
 +              <item name="wcf.like.title.com.woltlab.wcf.likeableArticle"><![CDATA[{if $like->isDislike()}Dislikes{else}Likes{/if} the article <a href="{$article->getLink()}">{$article->getTitle()}</a>.]]></item>
 +              <item name="wcf.like.title.com.woltlab.wcf.articleComment"><![CDATA[{if $like->isDislike()}Dislikes{else}Likes{/if} the comment by {if $commentAuthor}<a href="{link controller='User' object=$commentAuthor}{/link}">{$commentAuthor->username}</a>{else}a guest{/if} on the article <a href="{$articleContent->getLink()}#comments">{$articleContent->getTitle()}</a>.]]></item>
 +              <item name="wcf.like.title.com.woltlab.wcf.articleComment.response"><![CDATA[{if $like->isDislike()}Dislikes{else}Likes{/if} the response by {if $responseAuthor}<a href="{link controller='User' object=$responseAuthor}{/link}">{$responseAuthor->username}</a>{else}a guest{/if} on the comment by {if $commentAuthor}<a href="{link controller='User' object=$commentAuthor}{/link}">{$commentAuthor->username}</a>{else}a guest{/if} on the blog article <a href="{$articleContent->getLink()}#comments">{$articleContent->getTitle()}</a>.]]></item>
        </category>
        
        <category name="wcf.map">
index 9a2b8733a27c2439d4f0886070afaf674c6f0e10,7d11f051277dbd09379eeba9716f3a5eee7b5802..cf58e87b00409d50c339222690abaa0c256d0a8d
@@@ -1299,8 -1121,10 +1299,9 @@@ CREATE TABLE wcf1_user 
        notificationMailToken VARCHAR(20) NOT NULL DEFAULT '',
        authData VARCHAR(255) NOT NULL DEFAULT '',
        likesReceived MEDIUMINT(7) NOT NULL DEFAULT 0,
 -      socialNetworkPrivacySettings TEXT,
        
        KEY username (username),
+       KEY email (email),
        KEY registrationDate (registrationDate),
        KEY styleID (styleID),
        KEY activationCode (activationCode),