From dda293ecc546b1ddba8713627589f8207afd9e8b Mon Sep 17 00:00:00 2001
From: Benni Mack <benni@typo3.org>
Date: Wed, 22 Feb 2017 08:38:47 +0100
Subject: [PATCH] [CLEANUP] Streamline EXT:about

Streamlined EXT:about extension as a first step to clean up the whole
TYPO3 Core base:

- Moved locallang file to EXT:about, as it is only used in this extension
- Removed usage of TYPO3_LOADED_EXT/ext_emconf.php in favor of PackageManager
(needed to add the authors into each Package)
- Fully added all external libraries in use (not including -dev requirements)
- Moved EqualHeight.js to EXT:about as it is only used in this extension
- Proper usage of Fluid layouts
- Streamlined code, variables, imports and comments
- Reviewed comments in PHP

Resolves: #79948
Releases: master
Change-Id: Ia6c2d6b519bc34847131f06908c2c441b9248a8b
Reviewed-on: https://review.typo3.org/51790
Tested-by: TYPO3com <no-reply@typo3.com>
Reviewed-by: Frans Saris <franssaris@gmail.com>
Tested-by: Mona Muzaffar <mona.muzaffar@gmx.de>
Reviewed-by: Mona Muzaffar <mona.muzaffar@gmx.de>
Tested-by: Josef Glatz <josef.glatz@typo3.org>
Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
---
 .../Classes/Controller/AboutController.php    |  21 ++--
 .../Classes/Controller/ModulesController.php  |   5 +-
 .../about/Classes/Domain/Model/Extension.php  |  41 ++-----
 .../Domain/Repository/ExtensionRepository.php |  25 ++--
 .../Private/Language/Modules/about.xlf}       |  20 +--
 .../Private/Language/Modules/aboutmodules.xlf |   2 +-
 .../Resources/Private/Layouts/Default.html    |   5 +-
 .../Resources/Private/Partials/About.html     |   6 +-
 .../Resources/Private/Partials/CoreTeam.html  |   4 +-
 .../Resources/Private/Partials/Credits.html   |   4 +-
 .../Resources/Private/Partials/Donation.html  |   8 +-
 .../Private/Partials/Extensions.html          |  30 +++--
 .../Private/Partials/ExternalLibraries.html   | 114 ++++++++++++++++--
 .../Resources/Private/Partials/Logo.html      |   4 +-
 .../Private/Templates/About/Index.html        |   5 +-
 .../Private/Templates/Modules/Index.html      |   5 -
 .../Public/JavaScript/EqualHeight.js          |   2 +-
 typo3/sysext/about/ext_tables.php             |   6 +-
 .../Localization/LocalizationFactory.php      |   2 +-
 .../core/Classes/Package/PackageManager.php   |   1 +
 20 files changed, 196 insertions(+), 114 deletions(-)
 rename typo3/sysext/{lang/Resources/Private/Language/locallang_mod_help_about.xlf => about/Resources/Private/Language/Modules/about.xlf} (99%)
 rename typo3/sysext/{backend => about}/Resources/Public/JavaScript/EqualHeight.js (93%)

diff --git a/typo3/sysext/about/Classes/Controller/AboutController.php b/typo3/sysext/about/Classes/Controller/AboutController.php
index 1732c6b51c84..8525af808b0e 100644
--- a/typo3/sysext/about/Classes/Controller/AboutController.php
+++ b/typo3/sysext/about/Classes/Controller/AboutController.php
@@ -14,28 +14,30 @@ namespace TYPO3\CMS\About\Controller;
  * The TYPO3 project - inspiring people to share!
  */
 
+use TYPO3\CMS\About\Domain\Repository\ExtensionRepository;
 use TYPO3\CMS\Backend\View\BackendTemplateView;
+use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;
 use TYPO3\CMS\Extbase\Mvc\View\ViewInterface;
 
 /**
  * Module 'about' shows some standard information for TYPO3 CMS: About-text, version number and so on.
  */
-class AboutController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController
+class AboutController extends ActionController
 {
     /**
-     * @var
+     * @var ViewInterface
      */
     protected $defaultViewObjectName = BackendTemplateView::class;
 
     /**
-     * @var \TYPO3\CMS\About\Domain\Repository\ExtensionRepository
+     * @var ExtensionRepository
      */
     protected $extensionRepository;
 
     /**
-     * @param \TYPO3\CMS\About\Domain\Repository\ExtensionRepository $extensionRepository
+     * @param ExtensionRepository $extensionRepository
      */
-    public function injectExtensionRepository(\TYPO3\CMS\About\Domain\Repository\ExtensionRepository $extensionRepository)
+    public function injectExtensionRepository(ExtensionRepository $extensionRepository)
     {
         $this->extensionRepository = $extensionRepository;
     }
@@ -60,11 +62,10 @@ class AboutController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController
      */
     public function indexAction()
     {
-        $extensions = $this->extensionRepository->findAllLoaded();
         $this->view
-            ->assign('TYPO3Version', TYPO3_version)
-            ->assign('TYPO3CopyrightYear', TYPO3_copyright_year)
-            ->assign('TYPO3UrlDonate', TYPO3_URL_DONATE)
-            ->assign('loadedExtensions', $extensions);
+            ->assign('currentVersion', TYPO3_version)
+            ->assign('copyrightYear', TYPO3_copyright_year)
+            ->assign('donationUrl', TYPO3_URL_DONATE)
+            ->assign('loadedExtensions', $this->extensionRepository->findAllLoaded());
     }
 }
diff --git a/typo3/sysext/about/Classes/Controller/ModulesController.php b/typo3/sysext/about/Classes/Controller/ModulesController.php
index 63fe527c657f..94853b5bfbfb 100644
--- a/typo3/sysext/about/Classes/Controller/ModulesController.php
+++ b/typo3/sysext/about/Classes/Controller/ModulesController.php
@@ -63,7 +63,7 @@ class ModulesController extends ActionController
         parent::initializeView($view);
         // Disable Path
         $view->getModuleTemplate()->getDocHeaderComponent()->setMetaInformation([]);
-        $view->getModuleTemplate()->getPageRenderer()->loadRequireJsModule('TYPO3/CMS/Backend/EqualHeight');
+        $view->getModuleTemplate()->getPageRenderer()->loadRequireJsModule('TYPO3/CMS/About/EqualHeight');
     }
 
     /**
@@ -90,12 +90,11 @@ class ModulesController extends ActionController
             } else {
                 $securityWarnings = '<p>' . implode('', $warnings) . '</p>';
             }
-            unset($warnings);
         }
 
         $this->view->assignMultiple(
             [
-                'TYPO3Version' => TYPO3_version,
+                'currentVersion' => TYPO3_version,
                 'copyRightNotice' => BackendUtility::TYPO3_copyRightNotice(),
                 'warningMessages' => $securityWarnings,
                 'warningTitle' => $this->languageService->sL('LLL:EXT:lang/Resources/Private/Language/locallang_core.xlf:warning.header'),
diff --git a/typo3/sysext/about/Classes/Domain/Model/Extension.php b/typo3/sysext/about/Classes/Domain/Model/Extension.php
index 7703bcb452e7..8ee86fad1655 100644
--- a/typo3/sysext/about/Classes/Domain/Model/Extension.php
+++ b/typo3/sysext/about/Classes/Domain/Model/Extension.php
@@ -14,22 +14,19 @@ namespace TYPO3\CMS\About\Domain\Model;
  * The TYPO3 project - inspiring people to share!
  */
 
+use TYPO3\CMS\Extbase\DomainObject\AbstractEntity;
+
 /**
  * An extension helper model to be used in ext:about context
  *
  * @entity
  */
-class Extension extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
+class Extension extends AbstractEntity
 {
     /**
-     * @var string
+     * @var array
      */
-    protected $author = '';
-
-    /**
-     * @var string
-     */
-    protected $authorEmail = '';
+    protected $authors = [];
 
     /**
      * @var string
@@ -42,35 +39,19 @@ class Extension extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
     protected $title = '';
 
     /**
-     * @param string $author
-     */
-    public function setAuthor($author)
-    {
-        $this->author = $author;
-    }
-
-    /**
-     * @return string
+     * @param array $authors
      */
-    public function getAuthor()
+    public function setAuthors($authors)
     {
-        return $this->author;
+        $this->authors = $authors;
     }
 
     /**
-     * @param string $authorEmail
-     */
-    public function setAuthorEmail($authorEmail)
-    {
-        $this->authorEmail = $authorEmail;
-    }
-
-    /**
-     * @return string
+     * @return array
      */
-    public function getAuthorEmail()
+    public function getAuthors()
     {
-        return $this->authorEmail;
+        return $this->authors;
     }
 
     /**
diff --git a/typo3/sysext/about/Classes/Domain/Repository/ExtensionRepository.php b/typo3/sysext/about/Classes/Domain/Repository/ExtensionRepository.php
index 8d7ee75b89b1..78f074fcbcc8 100644
--- a/typo3/sysext/about/Classes/Domain/Repository/ExtensionRepository.php
+++ b/typo3/sysext/about/Classes/Domain/Repository/ExtensionRepository.php
@@ -14,7 +14,7 @@ namespace TYPO3\CMS\About\Domain\Repository;
  * The TYPO3 project - inspiring people to share!
  */
 use TYPO3\CMS\About\Domain\Model\Extension;
-use TYPO3\CMS\Core\Utility\GeneralUtility;
+use TYPO3\CMS\Core\Package\PackageManager;
 use TYPO3\CMS\Extbase\Persistence\ObjectStorage;
 use TYPO3\CMS\Extbase\Persistence\Repository;
 
@@ -24,26 +24,21 @@ use TYPO3\CMS\Extbase\Persistence\Repository;
 class ExtensionRepository extends Repository
 {
     /**
-     * Finds all loaded extensions
+     * Finds all loaded third-party extensions (no system extensions)
      *
      * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\CMS\About\Domain\Model\Extension>
      */
     public function findAllLoaded()
     {
         $loadedExtensions = $this->objectManager->get(ObjectStorage::class);
-        $loadedExtensionsArray = $GLOBALS['TYPO3_LOADED_EXT'];
-        foreach ($loadedExtensionsArray as $extensionKey => $extension) {
-            if ((is_array($extension) || $extension instanceof \ArrayAccess) && $extension['type'] !== 'S') {
-                $emconfPath = GeneralUtility::getFileAbsFileName('EXT:' . $extensionKey . '/ext_emconf.php');
-                if (file_exists($emconfPath)) {
-                    include $emconfPath;
-                    $extension = $this->objectManager->get(Extension::class);
-                    $extension->setKey($extensionKey);
-                    $extension->setTitle($EM_CONF['']['title']);
-                    $extension->setAuthor($EM_CONF['']['author']);
-                    $extension->setAuthorEmail($EM_CONF['']['author_email']);
-                    $loadedExtensions->attach($extension);
-                }
+        $packageManager = $this->objectManager->get(PackageManager::class);
+        foreach ($packageManager->getActivePackages() as $package) {
+            if ($package->getValueFromComposerManifest('type') === 'typo3-cms-extension') {
+                $extension = $this->objectManager->get(Extension::class);
+                $extension->setKey($package->getPackageKey());
+                $extension->setTitle($package->getPackageMetaData()->getDescription());
+                $extension->setAuthors($package->getValueFromComposerManifest('authors'));
+                $loadedExtensions->attach($extension);
             }
         }
         return $loadedExtensions;
diff --git a/typo3/sysext/lang/Resources/Private/Language/locallang_mod_help_about.xlf b/typo3/sysext/about/Resources/Private/Language/Modules/about.xlf
similarity index 99%
rename from typo3/sysext/lang/Resources/Private/Language/locallang_mod_help_about.xlf
rename to typo3/sysext/about/Resources/Private/Language/Modules/about.xlf
index 48bdcd967510..d90418fc26c6 100644
--- a/typo3/sysext/lang/Resources/Private/Language/locallang_mod_help_about.xlf
+++ b/typo3/sysext/about/Resources/Private/Language/Modules/about.xlf
@@ -1,8 +1,17 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <xliff version="1.0" xmlns:t3="http://typo3.org/schemas/xliff">
-	<file t3:id="1415814871" source-language="en" datatype="plaintext" original="messages" date="2011-10-17T20:22:34Z" product-name="lang">
+	<file t3:id="1415814871" source-language="en" datatype="plaintext" original="messages" date="2011-10-17T20:22:34Z" product-name="typo3-cms-about">
 		<header/>
 		<body>
+			<trans-unit id="mlang_labels_tablabel">
+				<source>About TYPO3 CMS</source>
+			</trans-unit>
+			<trans-unit id="mlang_labels_tabdescr">
+				<source>Displays the basic facts about the TYPO3 application, version and licensing terms.</source>
+			</trans-unit>
+			<trans-unit id="mlang_tabs_tab">
+				<source>About TYPO3 CMS</source>
+			</trans-unit>
 			<trans-unit id="title">
 				<source>About TYPO3 CMS</source>
 			</trans-unit>
@@ -45,15 +54,6 @@
 			<trans-unit id="extension_author">
 				<source>Author</source>
 			</trans-unit>
-			<trans-unit id="mlang_labels_tablabel">
-				<source>About TYPO3 CMS</source>
-			</trans-unit>
-			<trans-unit id="mlang_labels_tabdescr">
-				<source>Displays the basic facts about the TYPO3 application, version and licensing terms.</source>
-			</trans-unit>
-			<trans-unit id="mlang_tabs_tab">
-				<source>About TYPO3 CMS</source>
-			</trans-unit>
 			<trans-unit id="donation_header">
 				<source>TYPO3 Donation</source>
 			</trans-unit>
diff --git a/typo3/sysext/about/Resources/Private/Language/Modules/aboutmodules.xlf b/typo3/sysext/about/Resources/Private/Language/Modules/aboutmodules.xlf
index 436125058b08..5381a6fbf44a 100644
--- a/typo3/sysext/about/Resources/Private/Language/Modules/aboutmodules.xlf
+++ b/typo3/sysext/about/Resources/Private/Language/Modules/aboutmodules.xlf
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <xliff version="1.0" xmlns:t3="http://typo3.org/schemas/xliff">
-	<file t3:id="1415814780" source-language="en" datatype="plaintext" original="messages" date="2011-10-17T20:22:32Z" product-name="aboutmodules">
+	<file t3:id="1415814780" source-language="en" datatype="plaintext" original="messages" date="2011-10-17T20:22:32Z" product-name="typo3-cms-about">
 		<header/>
 		<body>
 			<trans-unit id="mlang_labels_tablabel">
diff --git a/typo3/sysext/about/Resources/Private/Layouts/Default.html b/typo3/sysext/about/Resources/Private/Layouts/Default.html
index 24f730cfebcc..e7071e60d72c 100644
--- a/typo3/sysext/about/Resources/Private/Layouts/Default.html
+++ b/typo3/sysext/about/Resources/Private/Layouts/Default.html
@@ -1 +1,4 @@
-<f:render section="Content" />
+<div class="container-small">
+	<f:render partial="Logo" arguments="{_all}" />
+	<f:render section="Content" />
+</div>
diff --git a/typo3/sysext/about/Resources/Private/Partials/About.html b/typo3/sysext/about/Resources/Private/Partials/About.html
index f8b250ca3167..11eae02f9cef 100644
--- a/typo3/sysext/about/Resources/Private/Partials/About.html
+++ b/typo3/sysext/about/Resources/Private/Partials/About.html
@@ -1,8 +1,8 @@
 <p>
-	{f:translate(key: 'LLL:EXT:lang/Resources/Private/Language/locallang_mod_help_about.xlf:cms_description',
+	{f:translate(key: 'LLL:EXT:about/Resources/Private/Language/Modules/about.xlf:cms_description',
 		arguments: '{
-			0: TYPO3Version,
-			1: "&copy; {TYPO3CopyrightYear}",
+			0: currentVersion,
+			1: "&copy; {copyrightYear}",
 			2: "Kasper Sk&aring;rh&oslash;j"
 	}') -> f:format.raw()}
 </p>
diff --git a/typo3/sysext/about/Resources/Private/Partials/CoreTeam.html b/typo3/sysext/about/Resources/Private/Partials/CoreTeam.html
index da4ca7c1ebf0..5deef90482f3 100644
--- a/typo3/sysext/about/Resources/Private/Partials/CoreTeam.html
+++ b/typo3/sysext/about/Resources/Private/Partials/CoreTeam.html
@@ -1,10 +1,10 @@
 <div class="panel panel-default">
 	<div class="panel-body panel-body-highlightlinks">
 		<h2 class="h4">
-			<f:translate key="LLL:EXT:lang/Resources/Private/Language/locallang_mod_help_about.xlf:coredevs" />
+			<f:translate key="LLL:EXT:about/Resources/Private/Language/Modules/about.xlf:coredevs" />
 		</h2>
 		<p>
-			{f:translate(key: 'LLL:EXT:lang/Resources/Private/Language/locallang_mod_help_about.xlf:coredevs_detail') -> f:format.raw()}
+			{f:translate(key: 'LLL:EXT:about/Resources/Private/Language/Modules/about.xlf:coredevs_detail') -> f:format.raw()}
 		</p>
 	</div>
 </div>
diff --git a/typo3/sysext/about/Resources/Private/Partials/Credits.html b/typo3/sysext/about/Resources/Private/Partials/Credits.html
index 046720382a33..b10298b84053 100644
--- a/typo3/sysext/about/Resources/Private/Partials/Credits.html
+++ b/typo3/sysext/about/Resources/Private/Partials/Credits.html
@@ -1,10 +1,10 @@
 <div class="panel panel-default">
 	<div class="panel-body panel-body-highlightlinks">
 		<h2 class="h4">
-			{f:translate(key: 'LLL:EXT:lang/Resources/Private/Language/locallang_mod_help_about.xlf:community_credits') -> f:format.raw()}
+			{f:translate(key: 'LLL:EXT:about/Resources/Private/Language/Modules/about.xlf:community_credits') -> f:format.raw()}
 		</h2>
 		<p>
-			{f:translate(key: 'LLL:EXT:lang/Resources/Private/Language/locallang_mod_help_about.xlf:information_detail') -> f:format.raw()}
+			{f:translate(key: 'LLL:EXT:about/Resources/Private/Language/Modules/about.xlf:information_detail') -> f:format.raw()}
 		</p>
 	</div>
 </div>
diff --git a/typo3/sysext/about/Resources/Private/Partials/Donation.html b/typo3/sysext/about/Resources/Private/Partials/Donation.html
index 820dc66a91ed..27516ee2c099 100644
--- a/typo3/sysext/about/Resources/Private/Partials/Donation.html
+++ b/typo3/sysext/about/Resources/Private/Partials/Donation.html
@@ -1,13 +1,13 @@
 <div class="panel panel-default">
 	<div class="panel-body panel-body-highlightlinks">
 		<h2 class="h4">
-			<f:translate key="LLL:EXT:lang/Resources/Private/Language/locallang_mod_help_about.xlf:donation_header" />
+			<f:translate key="LLL:EXT:about/Resources/Private/Language/Modules/about.xlf:donation_header" />
 		</h2>
 		<p>
-			{f:translate(key: 'LLL:EXT:lang/Resources/Private/Language/locallang_mod_help_about.xlf:donation_message') -> f:format.raw()}
+			{f:translate(key: 'LLL:EXT:about/Resources/Private/Language/Modules/about.xlf:donation_message') -> f:format.raw()}
 		</p>
-		<a href="{TYPO3UrlDonate}" class="btn btn-default" title="{f:translate(key:'LLL:EXT:lang/Resources/Private/Language/locallang_mod_help_about.xlf:donation_button')}" target="_blank">
-			<f:translate key="LLL:EXT:lang/Resources/Private/Language/locallang_mod_help_about.xlf:donation_button" />
+		<a href="{donationUrl}" class="btn btn-default" title="{f:translate(key:'LLL:EXT:about/Resources/Private/Language/Modules/about.xlf:donation_button')}" target="_blank">
+			<f:translate key="LLL:EXT:about/Resources/Private/Language/Modules/about.xlf:donation_button" />
 		</a>
 	</div>
 </div>
diff --git a/typo3/sysext/about/Resources/Private/Partials/Extensions.html b/typo3/sysext/about/Resources/Private/Partials/Extensions.html
index 99368b660524..9282ffb35f72 100644
--- a/typo3/sysext/about/Resources/Private/Partials/Extensions.html
+++ b/typo3/sysext/about/Resources/Private/Partials/Extensions.html
@@ -2,17 +2,17 @@
 	<div class="panel panel-default">
 		<div class="panel-body panel-body-highlightlinks">
 			<h2 class="h3">
-				<f:translate key="LLL:EXT:lang/Resources/Private/Language/locallang_mod_help_about.xlf:extension_authors" />
+				<f:translate key="LLL:EXT:about/Resources/Private/Language/Modules/about.xlf:extension_authors" />
 			</h2>
 			<p>
-				<f:translate key="LLL:EXT:lang/Resources/Private/Language/locallang_mod_help_about.xlf:extension_list_info" />
+				<f:translate key="LLL:EXT:about/Resources/Private/Language/Modules/about.xlf:extension_list_info" />
 			</p>
 		</div>
 		<table class="table panel-table">
 			<thead>
 				<tr>
-					<th width="35%"><f:translate key="LLL:EXT:lang/Resources/Private/Language/locallang_mod_help_about.xlf:extension" /></th>
-					<th><f:translate key="LLL:EXT:lang/Resources/Private/Language/locallang_mod_help_about.xlf:extension_author" /></th>
+					<th width="60%"><f:translate key="LLL:EXT:about/Resources/Private/Language/Modules/about.xlf:extension" /></th>
+					<th><f:translate key="LLL:EXT:about/Resources/Private/Language/Modules/about.xlf:extension_author" /></th>
 				</tr>
 			</thead>
 			<tbody>
@@ -22,11 +22,23 @@
 							{loadedExtension.title} ({loadedExtension.key})
 						</td>
 						<td>
-							<f:link.email
-								email="{loadedExtension.authorEmail}?subject={f:format.urlencode(value:'Thanks for your {loadedExtension.title} extension')}"
-							>
-								{loadedExtension.author}
-							</f:link.email>
+							<f:for each="{loadedExtension.authors}" as="extensionAuthor" iteration="i">
+								<f:if condition="{extensionAuthor.email}">
+									<f:then>
+										<f:link.email
+											email="{extensionAuthor.email}?subject={f:format.urlencode(value:'Thanks for your {loadedExtension.title} extension')}"
+										>
+											{extensionAuthor.name}
+										</f:link.email>
+									</f:then>
+									<f:else>
+										{extensionAuthor.name}
+									</f:else>
+								</f:if>
+								<f:if condition="{i.isLast} == false">
+									<br>
+								</f:if>
+							</f:for>
 						</td>
 					</tr>
 				</f:for>
diff --git a/typo3/sysext/about/Resources/Private/Partials/ExternalLibraries.html b/typo3/sysext/about/Resources/Private/Partials/ExternalLibraries.html
index 65048bb761ac..c94950f9b104 100644
--- a/typo3/sysext/about/Resources/Private/Partials/ExternalLibraries.html
+++ b/typo3/sysext/about/Resources/Private/Partials/ExternalLibraries.html
@@ -1,28 +1,124 @@
 <div class="panel panel-default">
 	<div class="panel-body panel-body-highlightlinks">
 		<h2 class="h3">
-			<f:translate key="LLL:EXT:lang/Resources/Private/Language/locallang_mod_help_about.xlf:external_libraries" />
+			<f:translate key="LLL:EXT:about/Resources/Private/Language/Modules/about.xlf:external_libraries" />
 		</h2>
 		<p>
-			<f:translate key="LLL:EXT:lang/Resources/Private/Language/locallang_mod_help_about.xlf:external_thanks" />
+			<f:translate key="LLL:EXT:about/Resources/Private/Language/Modules/about.xlf:external_thanks" />
 		</p>
 	</div>
 	<table class="table panel-table">
 		<tr>
-			<td>CodeMirror</td>
-			<td><a href="http://codemirror.net/" target="_blank">codemirror.net</a></td>
+			<td>Composer</td>
+			<td><a href="https://getcomposer.org" target="_blank" rel="noopener noreferrer">getcomposer.org</a></td>
 		</tr>
 		<tr>
-			<td>ExtJS</td>
-			<td><a href="http://www.sencha.com/" target="_blank">www.sencha.com</a></td>
+			<td>jQuery</td>
+			<td><a href="https://jquery.com" target="_blank" rel="noopener noreferrer">jquery.com</a></td>
 		</tr>
 		<tr>
-			<td>jQuery</td>
-			<td><a href="http://jquery.com" target="_blank">jquery.com</a></td>
+			<td>Twitter Bootstrap</td>
+			<td><a href="http://getbootstrap.com" target="_blank" rel="noopener noreferrer">getbootstrap.com</a></td>
 		</tr>
 		<tr>
 			<td>Swift Mailer</td>
-			<td><a href="http://swiftmailer.org" target="_blank">swiftmailer.org</a></td>
+			<td><a href="http://swiftmailer.org" target="_blank" rel="noopener noreferrer">swiftmailer.org</a></td>
+		</tr>
+		<tr>
+			<td>Doctrine Project (DBAL Component and Instantiator)</td>
+			<td><a href="http://www.doctrine-project.org/projects/dbal.html" target="_blank" rel="noopener noreferrer">doctrine-project.org</a></td>
+		</tr>
+		<tr>
+			<td>Symfony Framework (YAML, Console and Finder Component)</td>
+			<td><a href="https://symfony.com" target="_blank" rel="noopener noreferrer">symfony.com</a></td>
+		</tr>
+		<tr>
+			<td>Guzzle PHP</td>
+			<td><a href="http://guzzlephp.org" target="_blank" rel="noopener noreferrer">guzzlephp.org</a></td>
+		</tr>
+		<tr>
+			<td>d3 Data Driven Documents</td>
+			<td><a href="https://d3js.org" target="_blank" rel="noopener noreferrer">d3js.org</a></td>
+		</tr>
+		<tr>
+			<td>CKEditor</td>
+			<td><a href="http://ckeditor.com" target="_blank" rel="noopener noreferrer">ckeditor.com</a></td>
+		</tr>
+		<tr>
+			<td>RequireJS</td>
+			<td><a href="http://requirejs.org" target="_blank" rel="noopener noreferrer">requirejs.org</a></td>
+		</tr>
+		<tr>
+			<td>moment.js</td>
+			<td><a href="https://momentjs.com" target="_blank" rel="noopener noreferrer">momentjs.com</a></td>
+		</tr>
+		<tr>
+			<td>NProgress</td>
+			<td><a href="http://ricostacruz.com/nprogress/" target="_blank" rel="noopener noreferrer">ricostacruz.com</a></td>
+		</tr>
+		<tr>
+			<td>jQuery UI</td>
+			<td><a href="https://jqueryui.com" target="_blank" rel="noopener noreferrer">jqueryui.com</a></td>
+		</tr>
+		<tr>
+			<td>Twitter Bootstrap Plugin: DateTimePicker</td>
+			<td><a href="https://eonasdan.github.io/bootstrap-datetimepicker/" target="_blank" rel="noopener noreferrer">eonasdan.github.io</a></td>
+		</tr>
+		<tr>
+			<td>Twitter Bootstrap Plugin: Slider</td>
+			<td><a href="http://seiyria.com/bootstrap-slider/" target="_blank" rel="noopener noreferrer">seiyria.com</a></td>
+		</tr>
+		<tr>
+			<td>jQuery Plugin: Ajax AutoComplete</td>
+			<td><a href="https://www.devbridge.com/sourcery/components/jquery-autocomplete/" target="_blank" rel="noopener noreferrer">devbridge.com</a></td>
+		</tr>
+		<tr>
+			<td>jQuery Plugin: Autosize</td>
+			<td><a href="http://www.jacklmoore.com/autosize/" target="_blank" rel="noopener noreferrer">jacklmoore.com</a></td>
+		</tr>
+		<tr>
+			<td>jQuery Plugin: Cropper</td>
+			<td><a href="https://fengyuanchen.github.io/cropper/" target="_blank" rel="noopener noreferrer">fengyuanchen.github.io</a></td>
+		</tr>
+		<tr>
+			<td>jQuery Plugin: DataTables</td>
+			<td><a href="https://datatables.net" target="_blank" rel="noopener noreferrer">datatables.net</a></td>
+		</tr>
+		<tr>
+			<td>jQuery Plugin: ImagesLoaded</td>
+			<td><a href="http://imagesloaded.desandro.com" target="_blank" rel="noopener noreferrer">imagesloaded.desandro.com</a></td>
+		</tr>
+		<tr>
+			<td>jQuery Plugin: MatchHeight</td>
+			<td><a href="http://brm.io/jquery-match-height/" target="_blank" rel="noopener noreferrer">brm.io</a></td>
+		</tr>
+		<tr>
+			<td>jQuery Plugin: MiniColors</td>
+			<td><a href="http://labs.abeautifulsite.net/jquery-minicolors/" target="_blank" rel="noopener noreferrer">labs.abeautifulsite.net</a></td>
+		</tr>
+		<tr>
+			<td>jQuery Plugin: Tab Override</td>
+			<td><a href="http://wjbryant.github.io/taboverride/" target="_blank" rel="noopener noreferrer">wjbryant.github.io</a></td>
+		</tr>
+		<tr>
+			<td>Neos (Form component)</td>
+			<td><a href="https://www.neos.io" target="_blank" rel="noopener noreferrer">neos.io</a></td>
+		</tr>
+		<tr>
+			<td>FineDiff</td>
+			<td><a href="https://github.com/cogpowered/FineDiff" target="_blank" rel="noopener noreferrer">github.com</a></td>
+		</tr>
+		<tr>
+			<td>IDNA Convert</td>
+			<td><a href="https://idnaconv.net" target="_blank" rel="noopener noreferrer">idnaconv.net</a></td>
+		</tr>
+		<tr>
+			<td>CodeMirror</td>
+			<td><a href="http://codemirror.net" target="_blank" rel="noopener noreferrer">codemirror.net</a></td>
+		</tr>
+		<tr>
+			<td>ExtJS</td>
+			<td><a href="http://www.sencha.com" target="_blank" rel="noopener noreferrer">www.sencha.com</a></td>
 		</tr>
 	</table>
 </div>
diff --git a/typo3/sysext/about/Resources/Private/Partials/Logo.html b/typo3/sysext/about/Resources/Private/Partials/Logo.html
index 619b44a0496b..e893bbe515c8 100644
--- a/typo3/sysext/about/Resources/Private/Partials/Logo.html
+++ b/typo3/sysext/about/Resources/Private/Partials/Logo.html
@@ -1,8 +1,8 @@
 <img src="{f:uri.resource(path: 'Images/typo3-transparent@2x.png', extensionName: 'backend')}" width="150"
-	alt="{f:translate(key:'LLL:EXT:lang/Resources/Private/Language/locallang_mod_help_about.xlf:typo3_logo')}" />
+	alt="{f:translate(key:'LLL:EXT:about/Resources/Private/Language/Modules/about.xlf:typo3_logo')}" />
 <br>
 <br>
 <h1>
-	TYPO3 CMS {TYPO3Version}<br>
+	TYPO3 CMS {currentVersion}<br>
 	<f:translate key="LLL:EXT:lang/Resources/Private/Language/locallang_alt_intro.xlf:introtext" />
 </h1>
diff --git a/typo3/sysext/about/Resources/Private/Templates/About/Index.html b/typo3/sysext/about/Resources/Private/Templates/About/Index.html
index 226e61ebd635..99db92990d67 100644
--- a/typo3/sysext/about/Resources/Private/Templates/About/Index.html
+++ b/typo3/sysext/about/Resources/Private/Templates/About/Index.html
@@ -1,13 +1,10 @@
 <f:layout name="Default" />
 
 <f:section name="Content">
-	<div class="container-small">
-		<f:render partial="Logo" arguments="{_all}" />
 		<f:render partial="About" arguments="{_all}" />
 		<f:render partial="Donation" arguments="{_all}" />
 		<f:render partial="Credits" arguments="{_all}" />
 		<f:render partial="CoreTeam" arguments="{_all}" />
 		<f:render partial="ExternalLibraries" arguments="{_all}" />
 		<f:render partial="Extensions" arguments="{_all}" />
-	</div>
-</f:section>
\ No newline at end of file
+</f:section>
diff --git a/typo3/sysext/about/Resources/Private/Templates/Modules/Index.html b/typo3/sysext/about/Resources/Private/Templates/Modules/Index.html
index 4e86b35383a3..68b19d8131cc 100644
--- a/typo3/sysext/about/Resources/Private/Templates/Modules/Index.html
+++ b/typo3/sysext/about/Resources/Private/Templates/Modules/Index.html
@@ -1,8 +1,5 @@
 <f:layout name="Default" />
 <f:section name="Content">
-
-	<div class="container-small">
-		<f:render partial="Logo" arguments="{_all}" />
 		<p>
 			<f:translate key="LLL:EXT:lang/Resources/Private/Language/locallang_alt_intro.xlf:introtext2" />
 		</p>
@@ -58,6 +55,4 @@
 		</f:for>
 		<p><em class="text-muted"><f:translate key="LLL:EXT:lang/Resources/Private/Language/locallang_alt_intro.xlf:endText" /></em></p>
 		<p>{copyRightNotice -> f:format.raw()}</p>
-	</div>
-
 </f:section>
diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/EqualHeight.js b/typo3/sysext/about/Resources/Public/JavaScript/EqualHeight.js
similarity index 93%
rename from typo3/sysext/backend/Resources/Public/JavaScript/EqualHeight.js
rename to typo3/sysext/about/Resources/Public/JavaScript/EqualHeight.js
index 039747e2e967..947da137e4e2 100644
--- a/typo3/sysext/backend/Resources/Public/JavaScript/EqualHeight.js
+++ b/typo3/sysext/about/Resources/Public/JavaScript/EqualHeight.js
@@ -12,7 +12,7 @@
  */
 
 /**
- * Module: TYPO3/CMS/Backend/EqualHeight
+ * Module: TYPO3/CMS/About/EqualHeight
  * matchHeight makes the height of all selected elements exactly equal.
  */
 define(['jquery', 'matchheight'], function($) {
diff --git a/typo3/sysext/about/ext_tables.php b/typo3/sysext/about/ext_tables.php
index 8db305f1c8f5..bc4c76f13ce9 100644
--- a/typo3/sysext/about/ext_tables.php
+++ b/typo3/sysext/about/ext_tables.php
@@ -8,11 +8,13 @@ if (TYPO3_MODE === 'BE' && !(TYPO3_REQUESTTYPE & TYPO3_REQUESTTYPE_INSTALL)) {
         'help',
         'about',
         'top',
-        ['About' => 'index'],
+        [
+            'About' => 'index'
+        ],
         [
             'access' => 'user,group',
             'icon' => 'EXT:about/Resources/Public/Icons/module-about.svg',
-            'labels' => 'LLL:EXT:lang/Resources/Private/Language/locallang_mod_help_about.xlf'
+            'labels' => 'LLL:EXT:about/Resources/Private/Language/Modules/about.xlf'
         ]
     );
 
diff --git a/typo3/sysext/core/Classes/Localization/LocalizationFactory.php b/typo3/sysext/core/Classes/Localization/LocalizationFactory.php
index 323c73ec7369..03b908f6183f 100644
--- a/typo3/sysext/core/Classes/Localization/LocalizationFactory.php
+++ b/typo3/sysext/core/Classes/Localization/LocalizationFactory.php
@@ -94,7 +94,7 @@ class LocalizationFactory implements \TYPO3\CMS\Core\SingletonInterface
                 'lang/locallang_mod_admintools.xlf' => 'lang/Resources/Private/Language/locallang_mod_admintools.xlf',
                 'lang/locallang_mod_file_list.xlf' => 'lang/Resources/Private/Language/locallang_mod_file_list.xlf',
                 'lang/locallang_mod_file.xlf' => 'lang/Resources/Private/Language/locallang_mod_file.xlf',
-                'lang/locallang_mod_help_about.xlf' => 'lang/Resources/Private/Language/locallang_mod_help_about.xlf',
+                'lang/locallang_mod_help_about.xlf' => 'about/Resources/Private/Language/Modules/about.xlf',
                 'lang/locallang_mod_help_cshmanual.xlf' => 'lang/Resources/Private/Language/locallang_mod_help_cshmanual.xlf',
                 'lang/locallang_mod_help.xlf' => 'lang/Resources/Private/Language/locallang_mod_help.xlf',
                 'lang/locallang_mod_system.xlf' => 'lang/Resources/Private/Language/locallang_mod_system.xlf',
diff --git a/typo3/sysext/core/Classes/Package/PackageManager.php b/typo3/sysext/core/Classes/Package/PackageManager.php
index 4bae3daeed1c..067d574d8a18 100644
--- a/typo3/sysext/core/Classes/Package/PackageManager.php
+++ b/typo3/sysext/core/Classes/Package/PackageManager.php
@@ -913,6 +913,7 @@ class PackageManager implements \TYPO3\CMS\Core\SingletonInterface
         $this->setComposerManifestValueIfEmpty($composerManifest, 'name', $packageKey);
         $this->setComposerManifestValueIfEmpty($composerManifest, 'type', 'typo3-cms-extension');
         $this->setComposerManifestValueIfEmpty($composerManifest, 'description', $extensionManagerConfiguration['title']);
+        $this->setComposerManifestValueIfEmpty($composerManifest, 'authors', [['name' => $extensionManagerConfiguration['author'], 'email' => $extensionManagerConfiguration['author_email']]]);
         $composerManifest->version = $extensionManagerConfiguration['version'];
         if (isset($extensionManagerConfiguration['constraints']['depends']) && is_array($extensionManagerConfiguration['constraints']['depends'])) {
             $composerManifest->require = new \stdClass();
-- 
GitLab