TYPO3 v15 dev-main snapshot ()

This commit is contained in:
2026-08-10 22:31:31 +02:00
commit 3e43c11539
407 changed files with 51272 additions and 0 deletions
@@ -0,0 +1,70 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="panel panel-default">
<h2 class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-parent="#accordion"
data-bs-target="#collapseSeven"
aria-controls="collapseSeven"
aria-expanded="false"
id="headingSeven"
>
<div class="panel-title">
<strong>Cache settings</strong>
</div>
<span class="caret"></span>
</button>
</div>
</h2>
<div id="collapseSeven" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingSeven">
<div class="panel-body">
<p>
Configure how TYPO3 caches are stored to optimize performance for your hosting environment.
</p>
<p>
<strong>The default configuration</strong> works well for most installations. Depending on your setup,
performance can be improved by choosing a different cache storage type.<br>
<strong>Database storage</strong> is typically the best choice for standard environments and installations
using network file systems (NFS), where frequent file access may reduce performance.<br>
<strong>File-based caches</strong> can be more efficient in shared hosting environments or when using
distributed databases.<br>
For advanced installations, <strong>memory-based cache backends</strong> such as Redis
or Memcached can provide additional performance improvements. These require further
configuration in <code>system/settings.php.</code>
</p>
<p>
Select <strong>Custom settings</strong> to configure the storage backend for each
cache individually.
</p>
<p>Cache types:</p>
<dl>
<dt>Page</dt>
<dd>Stores the cached content of individual pages.</dd>
<dt>Page Section</dt>
<dd>Stores TypoScript instructions and data required to generate page content and the
handling of non-cacheable objects.</dd>
<dt>Hash</dt>
<dd>Stores internal data used during page generation, such as menu structures.</dd>
<dt>Rootline</dt>
<dd>Stores the full hierarchy of pages leading to the current page, including translation
and timing information. Used for menus and link generation.</dd>
<dt>Image Sizes</dt>
<dd>Stores calculated image dimensions separately to reduce file system access.</dd>
</dl>
<f:for each="{feature.presetsOrderedByPriority}" as="preset">
<f:render partial="Settings/Presets/{feature.name}/{preset.name}" arguments="{_all}" />
</f:for>
</div>
</div>
</div>
</html>
@@ -0,0 +1,38 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:be.infobox state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::WARNING')}" disableIcon="true">
<div class="form-check">
<input
type="radio"
class="form-check-input"
id="t3-install-tool-configuration-cache-custom"
name="install[values][{feature.name}][enable]"
value="{preset.name}"
{f:if(condition: preset.isActive, then:'checked="checked"')}
{f:if(condition: '!{isWritable}', then: 'disabled')}
/>
<label for="t3-install-tool-configuration-cache-custom" class="form-check-label">
<strong>Custom configuration</strong> {f:if(condition: preset.isActive, then:' [Active]')}
</label>
</div>
<p>Custom cache settings:</p>
<f:for each="{preset.configurationDescriptors}" as="configuration" key="configurationKey">
<div class="row mb-3">
<label class="col-sm-6 col-form-label" for="{feature.name}{preset.name}{configurationKey}">{configurationKey}</label>
<div class="col-sm-6">
<f:render partial="Settings/ReadonlyInfo" arguments="{configuration: configuration}" />
<input
id="{feature.name}{preset.name}{configurationKey}"
type="text"
name="install[values][{feature.name}][{preset.name}][{configurationKey}]"
value="{configuration.value}"
class="form-control t3js-custom-preset"
data-radio="t3-install-tool-configuration-cache-custom"
{f:if(condition: '!{isWritable} || {configuration.readonly}', then: 'disabled')}
/>
</div>
</div>
</f:for>
</f:be.infobox>
</html>
@@ -0,0 +1,20 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:be.infobox state="{f:if(condition:'{preset.isAvailable}', then:'0', else:'2')}" disableIcon="true">
<div class="form-check">
<input
type="radio"
class="form-check-input"
id="t3-install-tool-configuration-cache-database"
name="install[values][{feature.name}][enable]"
value="{preset.name}"
{f:if(condition: '{preset.isAvailable} && {isWritable}', then:'', else:'disabled="disabled"')}
{f:if(condition: preset.isActive, then:'checked="checked"')}
/>
<label for="t3-install-tool-configuration-cache-database" class="form-check-label">
<strong>Prefer database storage for caching</strong> {f:if(condition: preset.isActive, then:' [Active]')}
</label>
</div>
</f:be.infobox>
</html>
@@ -0,0 +1,20 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:be.infobox state="{f:if(condition:'{preset.isAvailable}', then:'0', else:'2')}" disableIcon="true">
<div class="form-check">
<input
type="radio"
class="form-check-input"
id="t3-install-tool-configuration-cache-file"
name="install[values][{feature.name}][enable]"
value="{preset.name}"
{f:if(condition: '{preset.isAvailable} && {isWritable}', then:'', else:'disabled="disabled"')}
{f:if(condition: preset.isActive, then:'checked="checked"')}
/>
<label for="t3-install-tool-configuration-cache-file" class="form-check-label">
<strong>Prefer File storage for caching</strong> {f:if(condition: preset.isActive, then:' [Active]')}
</label>
</div>
</f:be.infobox>
</html>
@@ -0,0 +1,46 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="panel panel-default">
<h2 class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-parent="#accordion"
data-bs-target="#collapseTwo"
aria-controls="collapseTwo"
aria-expanded="false"
id="headingTwo"
>
<div class="panel-title">
<strong>Debug settings</strong>
</div>
<span class="caret"></span>
</button>
</div>
</h2>
<div id="collapseTwo" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingTwo">
<div class="panel-body">
<p>
Choose a configuration preset optimized for development or production environments.
</p>
<p>
The <strong>Live</strong> preset prioritizes performance and hides debug and error
messages from website visitors.
</p>
<p>
The <strong>Debug</strong> preset enables detailed debug and error messages to support
development and troubleshooting.
</p>
<p>
Select <strong>Custom configuration</strong> to adjust each setting individually.
</p>
<f:for each="{feature.presetsOrderedByPriority}" as="preset">
<f:render partial="Settings/Presets/{feature.name}/{preset.name}" arguments="{_all}" />
</f:for>
</div>
</div>
</div>
</html>
@@ -0,0 +1,39 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:be.infobox state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::WARNING')}" disableIcon="true">
<div class="form-check">
<input
type="radio"
class="form-check-input"
id="t3-install-tool-configuration-context-custom"
name="install[values][{feature.name}][enable]"
value="{preset.name}"
{f:if(condition: preset.isActive, then:'checked="checked"')}
{f:if(condition: '!{isWritable}', then: 'disabled')}
/>
<label for="t3-install-tool-configuration-context-custom" class="form-check-label">
<strong>Custom configuration</strong> {f:if(condition: preset.isActive, then:' [Active]')}
</label>
</div>
<p>Custom configuration mixture if no other preset fits.</p>
<f:for each="{preset.configurationDescriptors}" as="configuration" key="configurationKey">
<div class="row mb-3">
<label class="col-sm-4 col-form-label" for="{feature.name}{preset.name}{configurationKey}">{configurationKey}</label>
<div class="col-sm-8">
<f:render partial="Settings/ReadonlyInfo" arguments="{configuration: configuration}" />
<input
id="{feature.name}{preset.name}{configurationKey}"
type="text"
name="install[values][{feature.name}][{preset.name}][{configurationKey}]"
value="{configuration.value}"
class="form-control t3js-custom-preset"
data-radio="t3-install-tool-configuration-context-custom"
{f:if(condition: '!{isWritable} || {configuration.readonly}', then: 'disabled')}
/>
</div>
</div>
</f:for>
</f:be.infobox>
</html>
@@ -0,0 +1,21 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:be.infobox state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::OK')}" disableIcon="true">
<div class="form-check">
<input
type="radio"
class="form-check-input"
id="t3-install-tool-configuration-context-debug"
name="install[values][{feature.name}][enable]"
value="{preset.name}"
{f:if(condition: preset.isActive, then:'checked="checked"')}
{f:if(condition: '!{isWritable}', then: 'disabled')}
/>
<label for="t3-install-tool-configuration-context-debug" class="form-check-label">
<strong>Debug</strong> {f:if(condition: preset.isActive, then:' [Active]')}
</label>
</div>
<p>Enable debug output and set logging to info level.</p>
</f:be.infobox>
</html>
@@ -0,0 +1,21 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:be.infobox state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::OK')}" disableIcon="true">
<div class="form-check">
<input
type="radio"
class="form-check-input"
id="t3-install-tool-configuration-context-live"
name="install[values][{feature.name}][enable]"
value="{preset.name}"
{f:if(condition: preset.isActive, then:'checked="checked"')}
{f:if(condition: '!{isWritable}', then: 'disabled')}
/>
<label for="t3-install-tool-configuration-context-live" class="form-check-label">
<strong>Live</strong> {f:if(condition: preset.isActive, then:' [Active]')}
</label>
</div>
<p>Turn off debug output and set logging to warnings and errors only.</p>
</f:be.infobox>
</html>
@@ -0,0 +1,68 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="panel panel-default">
<h2 class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-parent="#accordion"
data-bs-target="#collapseFour"
aria-controls="collapseFour"
aria-expanded="false"
id="headingFour"
>
<div class="panel-title">
<strong>Image handling settings</strong>
</div>
<span class="caret"></span>
</button>
</div>
</h2>
<div id="collapseFour" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingFour">
<div class="panel-body">
<p>
Configure the image processing tool used by TYPO3.
</p>
<p>
TYPO3 uses <strong>GraphicsMagick</strong> or <strong>ImageMagick</strong> for advanced
image processing. The correct configuration depends on the version available on your system.
Available image processing tools are detected automatically and appropriate settings are
recommended.<br>
When configured correctly, image processing tests in the
<strong>Install Tool → Test Setup</strong> section should pass.
</p>
<p>
If the <strong>ImageMagick</strong> or <strong>GraphicsMagick</strong> executables
are installed in a non-standard location, specify the absolute path to the directory here.
</p>
<div class="row mb-3">
<div class="col-sm-12">
<div class="input-group">
<input
type="text"
name="install[values][{feature.name}][additionalSearchPath]"
value="{feature.additionalSearchPath}"
class="form-control t3js-presets-image-executable"
{f:if(condition: '!{isWritable}', then: 'disabled')}
/>
<button
class="btn btn-default t3js-presets-image-executable-trigger"
type="button"
{f:if(condition: '!{isWritable}', then: 'disabled')}
>
Find executables in this directory
</button>
</div>
</div>
</div>
<f:for each="{feature.presetsOrderedByPriority}" as="preset">
<f:render partial="Settings/Presets/{feature.name}/{preset.name}" arguments="{_all}" />
</f:for>
</div>
</div>
</div>
</html>
@@ -0,0 +1,40 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:be.infobox state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::WARNING')}" disableIcon="true">
<div class="form-check">
<input
type="radio"
class="form-check-input"
id="t3-install-tool-configuration-image-custom"
name="install[values][{feature.name}][enable]"
value="{preset.name}"
{f:if(condition: preset.isActive, then:'checked="checked"')}
{f:if(condition: '!{isWritable}', then: 'disabled')}
/>
<label for="t3-install-tool-configuration-image-custom" class="form-check-label">
<strong>Custom configuration</strong> {f:if(condition: preset.isActive, then:' [Active]')}
</label>
</div>
<p>Custom configuration mixture if no other preset fits.</p>
<f:for each="{preset.configurationDescriptors}" as="configuration" key="configurationKey">
<div class="row mb-3">
<label class="col-sm-4 col-form-label" for="{feature.name}{preset.name}{configurationKey}">{configurationKey}</label>
<div class="col-sm-8">
<f:render partial="Settings/ReadonlyInfo" arguments="{configuration: configuration}" />
<input
id="{feature.name}{preset.name}{configurationKey}"
type="text"
name="install[values][{feature.name}][{preset.name}][{configurationKey}]"
value="{configuration.value}"
class="form-control t3js-custom-preset"
data-radio="t3-install-tool-configuration-image-custom"
{f:if(condition: '!{isWritable} || {configuration.readonly}', then: 'disabled')}
/>
</div>
</div>
</f:for>
</f:be.infobox>
</html>
@@ -0,0 +1,32 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:be.infobox state="{f:if(condition:'{preset.isAvailable}', then:'0', else:'2')}" disableIcon="true">
<div class="form-check">
<input
type="radio"
class="form-check-input"
id="t3-install-tool-configuration-image-graphicsmagick"
name="install[values][{feature.name}][enable]"
value="{preset.name}"
{f:if(condition: '{preset.isAvailable} && {isWritable}', then:'', else:'disabled="disabled"')}
{f:if(condition: preset.isActive, then:'checked="checked"')}
/>
<label for="t3-install-tool-configuration-image-graphicsmagick" class="form-check-label">
<strong>Graphics Magick</strong> {f:if(condition: preset.isActive, then:' [Active]')}
</label>
</div>
<p>
<f:if condition="{preset.isAvailable}">
<f:then>
GraphicsMagick was found in path <code>{preset.foundPath}</code>.
</f:then>
<f:else>
GraphicsMagick was not found in standard system paths. If it is
installed in an unusual location on your system, set the path in the
input box above and search again.
</f:else>
</f:if>
</p>
</f:be.infobox>
</html>
@@ -0,0 +1,32 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:be.infobox state="{f:if(condition:'{preset.isAvailable}', then:'0', else:'2')}" disableIcon="true">
<div class="form-check">
<input
type="radio"
class="form-check-input"
id="t3-install-tool-configuration-image-imagemagick6"
name="install[values][{feature.name}][enable]"
value="{preset.name}"
{f:if(condition: '{preset.isAvailable} && {isWritable}', then:'', else:'disabled="disabled"')}
{f:if(condition: preset.isActive, then:'checked="checked"')}
/>
<label for="t3-install-tool-configuration-image-imagemagick6" class="form-check-label">
<strong>Image Magick version 6 or higher</strong> {f:if(condition: preset.isActive, then:' [Active]')}
</label>
</div>
<p>
<f:if condition="{preset.isAvailable}">
<f:then>
An ImageMagick version 6 or higher was found in path <code>{preset.foundPath}</code>.
</f:then>
<f:else>
ImageMagick version 6 or higher was not found in standard system paths.
If it is installed in an unusual location on your system, set the path in the
input box above and search again.
</f:else>
</f:if>
</p>
</f:be.infobox>
</html>
@@ -0,0 +1,44 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="panel panel-default">
<h2 class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-parent="#accordion"
data-bs-target="#collapseFive"
aria-controls="collapseFive"
aria-expanded="false"
id="headingFive"
>
<div class="panel-title">
<strong>Mail handling settings</strong>
</div>
<span class="caret"></span>
</button>
</div>
</h2>
<div id="collapseFive" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingFive">
<div class="panel-body">
<p>
Configure how TYPO3 sends email messages.
</p>
<p>
TYPO3 can use the <strong>sendmail</strong> command line tool when the mail
transport is set to <code>sendmail</code>.
The correct executable path depends on the binary available on your system
</p>
<p>
The current sendmail path is detected from the PHP configuration and can be applied
to the TYPO3 settings.
</p>
<f:for each="{feature.presetsOrderedByPriority}" as="preset">
<f:render partial="Settings/Presets/{feature.name}/{preset.name}" arguments="{_all}" />
</f:for>
</div>
</div>
</div>
</html>
@@ -0,0 +1,40 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:be.infobox state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::WARNING')}" disableIcon="true">
<div class="form-check">
<input
type="radio"
class="form-check-input"
id="t3-install-tool-configuration-mail-custom"
name="install[values][{feature.name}][enable]"
value="{preset.name}"
{f:if(condition: preset.isActive, then:'checked="checked"')}
{f:if(condition: '!{isWritable}', then: 'disabled')}
/>
<label for="t3-install-tool-configuration-mail-custom" class="form-check-label">
<strong>Custom configuration</strong> {f:if(condition: preset.isActive, then:' [Active]')}
</label>
</div>
<p>Custom mail settings:</p>
<f:for each="{preset.configurationDescriptors}" as="configuration" key="configurationKey">
<div class="row mb-3">
<label class="col-sm-6 col-form-label" for="{feature.name}{preset.name}{configurationKey}">{configurationKey}</label>
<div class="col-sm-6">
<f:render partial="Settings/ReadonlyInfo" arguments="{configuration: configuration}" />
<input
id="{feature.name}{preset.name}{configurationKey}"
type="{f:if(condition: '{configurationKey} == "MAIL/transport_smtp_password"', then: 'password', else: 'text')}"
autocomplete="{f:if(condition: '{configurationKey} == "MAIL/transport_smtp_password"', then: 'new-password', else: 'off')}"
name="install[values][{feature.name}][{preset.name}][{configurationKey}]"
value="{configuration.value}"
class="form-control t3js-custom-preset"
data-radio="t3-install-tool-configuration-mail-custom"
{f:if(condition: '!{isWritable} || {configuration.readonly}', then: 'disabled')}
/>
</div>
</div>
</f:for>
</f:be.infobox>
</html>
@@ -0,0 +1,29 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:be.infobox state="{f:if(condition:'{preset.isAvailable}', then:'0', else:'2')}" disableIcon="true">
<div class="form-check">
<input
type="radio"
class="form-check-input"
id="t3-install-tool-configuration-mail-sendmail"
name="install[values][{feature.name}][enable]"
value="{preset.name}"
{f:if(condition: '{preset.isAvailable} && {isWritable}', then:'', else:'disabled="disabled"')}
{f:if(condition: preset.isActive, then:'checked="checked"')}
/>
<label for="t3-install-tool-configuration-mail-sendmail" class="form-check-label">
<strong>Import sendmail command from PHP settings</strong> {f:if(condition: preset.isActive, then:' [Active]')}
</label>
</div>
<f:if condition="{preset.isAvailable}">
<f:then>
<p>If you enable this setting the sendmail command will be set to:</p>
<p><pre>{preset.sendmailPath}</pre></p>
</f:then>
<f:else>
<p>Sendmail was not found in your PHP settings.</p>
</f:else>
</f:if>
</f:be.infobox>
</html>
@@ -0,0 +1,22 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:be.infobox state="{f:if(condition:'{preset.isAvailable}', then:'0', else:'2')}" disableIcon="true">
<div class="form-check">
<input
type="radio"
class="form-check-input"
id="t3-install-tool-configuration-mail-smtp"
name="install[values][{feature.name}][enable]"
value="{preset.name}"
{f:if(condition: '{preset.isAvailable} && {isWritable}', then:'', else:'disabled="disabled"')}
{f:if(condition: preset.isActive, then:'checked="checked"')}
/>
<label for="t3-install-tool-configuration-mail-smtp" class="form-check-label">
<strong>SMTP Settings</strong> {f:if(condition: preset.isActive, then:' [Active]')}
</label>
</div>
<p>To set up the mailer agent in TYPO3 CMS to use SMTP it's necessary to configure a SMTP server that will take care of the delivery of your emails.
Luckily, the configuration of a SMTP server is generally very easy. This option set some default values for you.</p>
</f:be.infobox>
</html>
@@ -0,0 +1,46 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="panel panel-default">
<h2 class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-parent="#accordion"
data-bs-target="#collapseSix"
aria-controls="collapseSix"
aria-expanded="false"
id="headingSix"
>
<div class="panel-title">
<strong>Password hashing settings</strong>
</div>
<span class="caret"></span>
</button>
</div>
</h2>
<div id="collapseSix" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingSix">
<div class="panel-body">
<p>
Configure the password hashing algorithm used for frontend and backend users.
</p>
<p>
TYPO3 never stores passwords in plain text. Instead, passwords are stored using
a salted one-way hash.
Available hashing algorithms are detected automatically.
</p>
<p>
<strong>If unsure, select the first available option, which represents the most secure algorithm
supported by the system.</strong><br>
The selected algorithm is used for new backend and frontend users. Existing users
are automatically upgraded to the new algorithm after their next successful login.
</p>
<f:for each="{feature.presetsOrderedByPriority}" as="preset">
<f:render partial="Settings/Presets/{feature.name}/{preset.name}" arguments="{_all}" />
</f:for>
</div>
</div>
</div>
</html>
@@ -0,0 +1,35 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:be.infobox state="{f:if(condition:'{preset.isAvailable}', then:'0', else:'2')}" disableIcon="true">
<div class="form-check">
<input
type="radio"
class="form-check-input"
id="t3-install-tool-configuration-passwordHashing-argon2i"
name="install[values][{feature.name}][enable]"
value="{preset.name}"
{f:if(condition: '{preset.isAvailable} && {isWritable}', then:'', else:'disabled="disabled"')}
{f:if(condition: preset.isActive, then:'checked="checked"')}
/>
<label for="t3-install-tool-configuration-passwordHashing-argon2i" class="form-check-label">
<strong>Argon2i</strong> {f:if(condition: preset.isActive, then:' [Active]')}
</label>
</div>
<p>
<f:if condition="{preset.isAvailable}">
<f:then>
Select this one if in doubt: Argon2i is a modern key derivation function that was selected as
the winner of the Password Hashing Competition in July 2015.
</f:then>
<f:else>
Argon2i is not available on this system. This is sad since it is a modern password hash
algorithm and the winner of the Password Hashing Competition in July 2015. It is easily
available on all platforms since PHP version 7.2. There is no sane reason to run PHP >7.2
without argon2i. Please reach out to your hoster to fix this and select this hash algorithm
as soon as it is available.
</f:else>
</f:if>
</p>
</f:be.infobox>
</html>
@@ -0,0 +1,33 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:be.infobox state="{f:if(condition:'{preset.isAvailable}', then:'0', else:'2')}" disableIcon="true">
<div class="form-check">
<input
type="radio"
class="form-check-input"
id="t3-install-tool-configuration-passwordHashing-argon2id"
name="install[values][{feature.name}][enable]"
value="{preset.name}"
{f:if(condition: '{preset.isAvailable} && {isWritable}', then:'', else:'disabled="disabled"')}
{f:if(condition: preset.isActive, then:'checked="checked"')}
/>
<label for="t3-install-tool-configuration-passwordHashing-argon2id" class="form-check-label">
<strong>Argon2id</strong> {f:if(condition: preset.isActive, then:' [Active]')}
</label>
</div>
<p>
<f:if condition="{preset.isAvailable}">
<f:then>
<strong>Use Argon2id if you are using PHP >= 7.3 on all instances (local, test, production, ...)!</strong><br />
Argon2id is a modern key derivation function. It provides better resistance
to some forms of attack compared to Argon2i.
</f:then>
<f:else>
Argon2id is not available on this system. If you want to use Argon2id make sure you are using PHP >= 7.3
with Argon support.
</f:else>
</f:if>
</p>
</f:be.infobox>
</html>
@@ -0,0 +1,34 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:be.infobox state="{f:if(condition:'{preset.isAvailable}', then:'0', else:'2')}" disableIcon="true">
<div class="form-check">
<input
type="radio"
class="form-check-input"
id="t3-install-tool-configuration-passwordHashing-bcrypt"
name="install[values][{feature.name}][enable]"
value="{preset.name}"
{f:if(condition: '{preset.isAvailable} && {isWritable}', then:'', else:'disabled="disabled"')}
{f:if(condition: preset.isActive, then:'checked="checked"')}
/>
<label for="t3-install-tool-configuration-passwordHashing-bcrypt" class="form-check-label">
<strong>bcrypt</strong> {f:if(condition: preset.isActive, then:' [Active]')}
</label>
</div>
<p>
<f:if condition="{preset.isAvailable}">
<f:then>
bcrypt is a good password hashing algorithm. It however needs some additional quirks
for long passwords in PHP and should only be used if Argon2id or Argon2i is not available.
</f:then>
<f:else>
bcrypt is not available on this system. TYPO3 password storage not only requires bcrypt itself,
but also sha384 to be available to use this algorithm. One of these or both are missing.
bcrypt is also used as a fallback if Argon2id or Argon2i are not available.
Reach out to your hoster to fix these issues and prefer installation of Argon2id or Argon2i.
</f:else>
</f:if>
</p>
</f:be.infobox>
</html>
@@ -0,0 +1,40 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:be="http://typo3.org/ns/TYPO3/CMS/Backend/ViewHelpers" data-namespace-typo3-fluid="true">
<f:be.infobox state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::WARNING')}" disableIcon="true">
<div class="form-check">
<input
type="radio"
class="form-check-input"
id="t3-install-tool-configuration-passwordHashing-custom"
name="install[values][{feature.name}][enable]"
value="{preset.name}"
disabled="disabled"
{f:if(condition: preset.isActive, then:'checked="checked"')}
/>
<label for="t3-install-tool-configuration-passwordHashing-custom" class="form-check-label">
<strong>Custom configuration</strong> {f:if(condition: preset.isActive, then:' [Active]')}
</label>
</div>
<p>Custom password hash settings. This interface does not allow modification of the values, they are just shown.
Configuring custom hash settings is for advanced users who know exactly what they are doing. Refer to the
core <be:link.documentation identifier="t3coreapi:password-hashing" class="text-decoration-underline">documentation</be:link.documentation> for details.</p>
<f:for each="{preset.configurationDescriptors}" as="configuration" key="configurationKey">
<div class="row mb-3">
<label class="col-sm-6 col-form-label" for="{feature.name}{preset.name}{configurationKey}">{configurationKey}</label>
<div class="col-sm-6">
<f:render partial="Settings/ReadonlyInfo" arguments="{configuration: configuration}" />
<input
id="{feature.name}{preset.name}{configurationKey}"
type="text"
name="install[values][{feature.name}][{preset.name}][{configurationKey}]"
value="{configuration.value}"
class="form-control t3js-custom-preset"
data-radio="t3-install-tool-configuration-passwordHashing-custom"
{f:if(condition: '!{isWritable} || {configuration.readonly}', then: 'disabled')}
/>
</div>
</div>
</f:for>
</f:be.infobox>
</html>
@@ -0,0 +1,34 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:be.infobox state="{f:if(condition:'{preset.isAvailable}', then:'0', else:'2')}" disableIcon="true">
<div class="form-check">
<input
type="radio"
class="form-check-input"
id="t3-install-tool-configuration-passwordHashing-pbkdf2"
name="install[values][{feature.name}][enable]"
value="{preset.name}"
{f:if(condition: '{preset.isAvailable} && {isWritable}', then:'', else:'disabled="disabled"')}
{f:if(condition: preset.isActive, then:'checked="checked"')}
/>
<label for="t3-install-tool-configuration-passwordHashing-pbkdf2" class="form-check-label">
<strong>PBKDF2</strong> {f:if(condition: preset.isActive, then:' [Active]')}
</label>
</div>
<p>
<f:if condition="{preset.isAvailable}">
<f:then>
PBKDF2 is a key derivation function recommended by IETF in RFC 8018 as part of the PKCS series, even
though newer password hashing functions such as Argon2id or Argon2i are designed to address weaknesses of PBKDF2.
It could be a preferred password hash algorithm if storing passwords in a FIPS compliant way is necessary.
Usually, selecting Argon2id or Argon2i if available as hash algorithm is ideal.
</f:then>
<f:else>
PBKDF2 is not available on this system. This is very uncommon. If Argon2id, Argon2i and bcrypt are also not available,
you should reach out to your hoster to fix this as soon as possible.
</f:else>
</f:if>
</p>
</f:be.infobox>
</html>
@@ -0,0 +1,34 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:be.infobox state="{f:if(condition:'{preset.isAvailable}', then:'0', else:'2')}" disableIcon="true">
<div class="form-check">
<input
type="radio"
class="form-check-input"
id="t3-install-tool-configuration-passwordHashing-phpass"
name="install[values][{feature.name}][enable]"
value="{preset.name}"
{f:if(condition: '{preset.isAvailable} && {isWritable}', then:'', else:'disabled="disabled"')}
{f:if(condition: preset.isActive, then:'checked="checked"')}
/>
<label for="t3-install-tool-configuration-passwordHashing-phpass" class="form-check-label">
<strong>phpass</strong> {f:if(condition: preset.isActive, then:' [Active]')}
</label>
</div>
<p>
<f:if condition="{preset.isAvailable}">
<f:then>
In almost all cases, a modern hash algorithm like Argon2id or Argon2i should be preferred.
phpass is a portable public domain password hashing framework for use in PHP applications since 2005.
The implementation should work on almost all PHP builds. It might be a suitable password storage hash
method in seldom cases if third party systems must use the same password hash on a low database level
and no sane different authentication service can be used for whatever reason.
</f:then>
<f:else>
That's funny: phpass is always available!
</f:else>
</f:if>
</p>
</f:be.infobox>
</html>