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,15 @@
# This file restricts access to the fileadmin/_temp_ directory. It is
# meant to protect temporary files which could contain sensible
# information. Please do not touch.
# Apache < 2.3
<IfModule !mod_authz_core.c>
Order allow,deny
Deny from all
Satisfy All
</IfModule>
# Apache ≥ 2.3
<IfModule mod_authz_core.c>
Require all denied
</IfModule>
@@ -0,0 +1,7 @@
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta http-equiv=Refresh Content="0; Url=/"/>
</head>
</html>
@@ -0,0 +1,15 @@
# This file restricts access to the fileadmin/user_upload/_import_export_ directory. It is
# meant to protect temporary files which could contain sensible
# information. Please do not touch.
# Apache < 2.3
<IfModule !mod_authz_core.c>
Order allow,deny
Deny from all
Satisfy All
</IfModule>
# Apache ≥ 2.3
<IfModule mod_authz_core.c>
Require all denied
</IfModule>
@@ -0,0 +1,37 @@
# This file applies Content-Security-Policy (CSP) HTTP headers
# to directories containing (user uploaded) resources like
# /fileadmin/ or /uploads/
<IfModule mod_headers.c>
# matching requested *.pdf files only (strict rules block Safari showing PDF documents)
<FilesMatch "\.pdf$">
Header set Content-Security-Policy "default-src 'self' 'unsafe-inline'; script-src 'none'; object-src 'self'; plugin-types application/pdf;"
</FilesMatch>
# matching requested *.svg files only (allows using inline styles when serving SVG files)
<FilesMatch "\.svg">
Header set Content-Security-Policy "default-src 'self'; script-src 'none'; style-src 'unsafe-inline'; object-src 'none'; sandbox;"
</FilesMatch>
# matching anything else, using negative lookbehind pattern
<FilesMatch "(?<!\.(?:pdf|svg))$">
Header set Content-Security-Policy "default-src 'self'; script-src 'none'; style-src 'none'; object-src 'none'; sandbox;"
</FilesMatch>
# =================================================================
# Variations to send CSP header only when it has not be set before.
# Adjust all `Header set` instructions above
# Header set Content-Security-Policy "<directives>"
# with substitutes shown below
#
# -----------------------------------------------------------------
# a) for Apache 2.4 (having `setifempty`)
# -----------------------------------------------------------------
# Header setifempty Content-Security-Policy "<directives>"
#
# -----------------------------------------------------------------
# b) for Apache 2.2 (using fallbacks)
# -----------------------------------------------------------------
# Header append Content-Security-Policy ""
# Header edit Content-Security-Policy "^$" "<directives>"
#
# =================================================================
</IfModule>
@@ -0,0 +1,394 @@
#####
#
# Example .htaccess file for TYPO3 CMS - for use with Apache Webserver
#
# This file includes settings for the following configuration options:
#
# - Compression
# - Caching
# - MIME types
# - Cross Origin requests
# - Rewriting and Access
# - Miscellaneous
# - PHP optimisation
#
# If you want to use it, you have to copy it to the root folder of your TYPO3 installation (if its
# not there already) and rename it to '.htaccess'. To make .htaccess files work, you might need to
# adjust the 'AllowOverride' directive in your Apache configuration file.
#
# IMPORTANT: You may need to change this file depending on your TYPO3 installation!
# Consider adding this file's content to your webserver's configuration directly for speed improvement
#
# Lots of the options are taken from https://github.com/h5bp/html5-boilerplate/blob/master/dist/.htaccess
#
####
### Begin: Compression ###
<IfModule mod_deflate.c>
# Force compression for mangled `Accept-Encoding` request headers
<IfModule mod_setenvif.c>
<IfModule mod_headers.c>
SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
</IfModule>
</IfModule>
# Compress all output labeled with one of the following media types.
#
# (!) For Apache versions below version 2.3.7 you don't need to
# enable `mod_filter` and can remove the `<IfModule mod_filter.c>`
# and `</IfModule>` lines as `AddOutputFilterByType` is still in
# the core directives.
#
# https://httpd.apache.org/docs/current/mod/mod_filter.html#addoutputfilterbytype
<IfModule mod_filter.c>
AddOutputFilterByType DEFLATE application/atom+xml \
application/javascript \
application/json \
application/ld+json \
application/manifest+json \
application/rdf+xml \
application/rss+xml \
application/schema+json \
application/vnd.geo+json \
application/geo+json \
application/vnd.ms-fontobject \
application/x-font-ttf \
application/x-javascript \
application/x-web-app-manifest+json \
application/xhtml+xml \
application/xml \
font/eot \
font/opentype \
font/otf \
font/ttf \
image/bmp \
image/svg+xml \
image/vnd.microsoft.icon \
image/x-icon \
text/cache-manifest \
text/css \
text/html \
text/javascript \
text/plain \
text/vcard \
text/vnd.rim.location.xloc \
text/vtt \
text/x-component \
text/x-cross-domain-policy \
text/xml
</IfModule>
<IfModule mod_mime.c>
AddEncoding gzip svgz
</IfModule>
</IfModule>
### End: Compression ###
### Begin: Browser caching of resource files ###
# This affects Frontend and Backend and increases performance.
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 1 month"
ExpiresByType text/css "access plus 1 year"
ExpiresByType application/json "access plus 0 seconds"
ExpiresByType application/ld+json "access plus 0 seconds"
ExpiresByType application/schema+json "access plus 0 seconds"
ExpiresByType application/vnd.geo+json "access plus 0 seconds"
ExpiresByType application/geo+json "access plus 0 seconds"
ExpiresByType application/xml "access plus 0 seconds"
ExpiresByType text/xml "access plus 0 seconds"
ExpiresByType image/vnd.microsoft.icon "access plus 1 week"
ExpiresByType image/x-icon "access plus 1 week"
ExpiresByType text/x-component "access plus 1 month"
ExpiresByType text/html "access plus 0 seconds"
ExpiresByType application/javascript "access plus 1 year"
ExpiresByType application/x-javascript "access plus 1 year"
ExpiresByType text/javascript "access plus 1 year"
ExpiresByType application/manifest+json "access plus 1 week"
ExpiresByType application/x-web-app-manifest+json "access plus 0 seconds"
ExpiresByType text/cache-manifest "access plus 0 seconds"
ExpiresByType audio/ogg "access plus 1 month"
ExpiresByType image/apng "access plus 1 month"
ExpiresByType image/avif "access plus 1 month"
ExpiresByType image/avif-sequence "access plus 1 month"
ExpiresByType image/bmp "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/jxl "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/svg+xml "access plus 1 month"
ExpiresByType image/webp "access plus 1 month"
ExpiresByType video/mp4 "access plus 1 month"
ExpiresByType video/ogg "access plus 1 month"
ExpiresByType video/webm "access plus 1 month"
ExpiresByType application/atom+xml "access plus 1 hour"
ExpiresByType application/rdf+xml "access plus 1 hour"
ExpiresByType application/rss+xml "access plus 1 hour"
ExpiresByType font/collection "access plus 1 month"
ExpiresByType application/vnd.ms-fontobject "access plus 1 month"
ExpiresByType font/eot "access plus 1 month"
ExpiresByType font/opentype "access plus 1 month"
ExpiresByType font/otf "access plus 1 month"
ExpiresByType application/x-font-ttf "access plus 1 month"
ExpiresByType font/ttf "access plus 1 month"
ExpiresByType application/font-woff "access plus 1 month"
ExpiresByType application/x-font-woff "access plus 1 month"
ExpiresByType font/woff "access plus 1 month"
ExpiresByType application/font-woff2 "access plus 1 month"
ExpiresByType font/woff2 "access plus 1 month"
ExpiresByType text/x-cross-domain-policy "access plus 1 week"
<FilesMatch "^index\.php$">
ExpiresActive Off
</FilesMatch>
</IfModule>
### End: Browser caching of resource files ###
### Begin: Caching of robots.txt ###
<IfModule mod_headers.c>
<Files "robots.txt">
Header unset Expires
Header set Cache-Control "public, max-age=3600, must-revalidate"
</Files>
</IfModule>
### End: Caching of robots.txt ###
### Begin: MIME types ###
# Proper MIME types for all files
<IfModule mod_mime.c>
# Security configuration
RemoveType .html .htm
<FilesMatch ".+\.html?$">
AddType text/html .html .htm
</FilesMatch>
RemoveType .svg .svgz
<FilesMatch ".+\.svgz?$">
AddType image/svg+xml .svg .svgz
</FilesMatch>
# Data interchange
AddType application/atom+xml atom
AddType application/json json map topojson
AddType application/ld+json jsonld
AddType application/rss+xml rss
AddType application/vnd.geo+json geojson
AddType application/xml rdf xml
# JavaScript
AddType application/javascript js mjs
# Manifest files
AddType application/manifest+json webmanifest
AddType application/x-web-app-manifest+json webapp
AddType text/cache-manifest appcache
# Media files
AddType audio/mp4 f4a f4b m4a
AddType audio/ogg oga ogg opus
AddType image/avif avif
AddType image/avif-sequence avifs
AddType image/bmp bmp
AddType image/jxl jxl
AddType image/webp webp
AddType video/mp4 f4v f4p m4v mp4
AddType video/ogg ogv
AddType video/webm webm
AddType video/x-flv flv
AddType image/x-icon cur ico
# Web fonts
AddType font/woff woff
AddType font/woff2 woff2
AddType application/vnd.ms-fontobject eot
AddType font/ttf ttc ttf
AddType font/otf otf
# Other
AddType application/octet-stream safariextz
AddType application/x-bb-appworld bbaw
AddType application/x-chrome-extension crx
AddType application/x-opera-extension oex
AddType application/x-xpinstall xpi
AddType text/vcard vcard vcf
AddType text/vnd.rim.location.xloc xloc
AddType text/vtt vtt
AddType text/x-component htc
</IfModule>
# UTF-8 encoding
AddDefaultCharset utf-8
<IfModule mod_mime.c>
AddCharset utf-8 .atom .css .js .json .manifest .rdf .rss .vtt .webapp .webmanifest .xml
</IfModule>
### End: MIME types ###
### Begin: Cross Origin ###
# Send the CORS header for images when browsers request it.
<IfModule mod_setenvif.c>
<IfModule mod_headers.c>
<FilesMatch "\.(avifs?|bmp|cur|gif|ico|jpe?g|png|svgz?|webp)$">
SetEnvIf Origin ":" IS_CORS
Header set Access-Control-Allow-Origin "*" env=IS_CORS
</FilesMatch>
</IfModule>
</IfModule>
# Allow cross-origin access to web fonts.
<IfModule mod_headers.c>
<FilesMatch "\.(eot|otf|tt[cf]|woff2?)$">
Header set Access-Control-Allow-Origin "*"
</FilesMatch>
</IfModule>
### End: Cross Origin ###
### Begin: Rewriting and Access ###
<IfModule mod_rewrite.c>
# Enable URL rewriting
RewriteEngine On
# Store the current location in an environment variable CWD to use
# mod_rewrite in .htaccess files without knowing the RewriteBase
RewriteCond $0#%{REQUEST_URI} ([^#]*)#(.*)\1$
RewriteRule ^.*$ - [E=CWD:%2]
# Rules to set ApplicationContext based on hostname
#RewriteCond %{HTTP_HOST} ^dev\.example\.com$
#RewriteRule .? - [E=TYPO3_CONTEXT:Development]
#RewriteCond %{HTTP_HOST} ^staging\.example\.com$
#RewriteRule .? - [E=TYPO3_CONTEXT:Production/Staging]
#RewriteCond %{HTTP_HOST} ^www\.example\.com$
#RewriteRule .? - [E=TYPO3_CONTEXT:Production]
# Rule for versioned static files, configured through:
# - $GLOBALS['TYPO3_CONF_VARS']['BE']['versionNumberInFilename']
# - $GLOBALS['TYPO3_CONF_VARS']['FE']['versionNumberInFilename']
# IMPORTANT: This rule has to be the very first RewriteCond in order to work!
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)\.(\d+)\.(php|js|mjs|css|png|jpg|gif|svg|avif|webp|gz|xsl)$ %{ENV:CWD}$1.$3 [L]
# Access block for folders
RewriteRule _(?:recycler|temp)_/ - [F]
RewriteRule fileadmin/templates/.*\.(?:txt|ts)$ - [F]
RewriteRule ^(?:vendor|typo3_src|typo3temp/var) - [F]
RewriteRule (?:typo3conf/ext|typo3/sysext|typo3/ext)/[^/]+/(?:Configuration|Resources/Private|Tests?|Documentation|docs?)/ - [F]
# Block access to all hidden files and directories with the exception of
# the visible content from within the `/.well-known/` hidden directory (RFC 5785).
RewriteCond %{REQUEST_URI} "!(^|/)\.well-known/([^./]+./?)+$" [NC]
RewriteCond %{SCRIPT_FILENAME} -d [OR]
RewriteCond %{SCRIPT_FILENAME} -f
RewriteRule (?:^|/)\. - [F]
# Stop rewrite processing, if we are in any known directory
# NOTE: Add your additional local storages here
RewriteRule ^(?:fileadmin/|typo3conf/|typo3temp/|_assets/) - [L]
# If the file/symlink/directory does not exist but is below /typo3/, redirect to the main TYPO3 entry point.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^typo3/(.*)$ %{ENV:CWD}index.php [QSA,L]
# If the file/symlink/directory does not exist => Redirect to index.php.
# For httpd.conf, you need to prefix each '%{REQUEST_FILENAME}' with '%{DOCUMENT_ROOT}'.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^.*$ %{ENV:CWD}index.php [QSA,L]
</IfModule>
# Access block for files
# Apache < 2.3
<IfModule !mod_authz_core.c>
<FilesMatch "(?i:^\.|^#.*#|^(?:ChangeLog|ToDo|Readme|License)(?:\.md|\.txt)?|^composer\.(?:json|lock)|^ext_conf_template\.txt|^ext_typoscript_constants\.txt|^ext_typoscript_setup\.txt|flexform[^.]*\.xml|locallang[^.]*\.(?:xml|xlf)|\.(?:bak|co?nf|cfg|neon|ya?ml|ts|typoscript|tsconfig|dist|fla|in[ci]|log|sh|sql(?:\..*)?|sqlite(?:\..*)?|sw[op]|git.*|rc)|.*~)$">
Order allow,deny
Deny from all
Satisfy All
</FilesMatch>
</IfModule>
# Apache ≥ 2.3
<IfModule mod_authz_core.c>
<If "%{REQUEST_URI} =~ m#(?i:/\.|/\x23.*\x23|/(?:ChangeLog|ToDo|Readme|License)(?:\.md|\.txt)?|/composer\.(?:json|lock)|/ext_conf_template\.txt|/ext_typoscript_constants\.txt|/ext_typoscript_setup\.txt|flexform[^.]*\.xml|locallang[^.]*\.(?:xml|xlf)|\.(?:bak|co?nf|cfg|neon|ya?ml|ts|typoscript|tsconfig|dist|fla|in[ci]|log|sh|sql(?:\..*)?|sqlite(?:\..*)?|sw[op]|git.*|rc)|.*~)$#">
Require all denied
</If>
</IfModule>
# Block access to vcs directories
<IfModule mod_alias.c>
RedirectMatch 404 /\.(?:git|svn|hg)/
</IfModule>
### End: Rewriting and Access ###
### Begin: Miscellaneous ###
# 404 error prevention for non-existing redirected folders
Options -MultiViews
# Make sure that directory listings are disabled.
<IfModule mod_autoindex.c>
Options -Indexes
</IfModule>
<IfModule mod_headers.c>
# Force IE to render pages in the highest available mode
Header set X-UA-Compatible "IE=edge"
<FilesMatch "\.(appcache|avifs?|crx|css|eot|gif|htc|ico|jpe?g|js|m4a|m4v|manifest|mp4|oex|oga|ogg|ogv|otf|pdf|png|safariextz|svgz?|ttf|vcf|webapp|webm|webp|woff2?|xml|xpi)$">
Header unset X-UA-Compatible
</FilesMatch>
# Reducing MIME type security risks
Header set X-Content-Type-Options "nosniff"
</IfModule>
# ETag removal
<IfModule mod_headers.c>
Header unset ETag
</IfModule>
FileETag None
### End: Miscellaneous ###
# Add your own rules here.
@@ -0,0 +1,85 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="X-UA-Compatible" value="IE=edge" />
<add name="Cache-Control" value="Public" />
</customHeaders>
</httpProtocol>
<rewrite>
<rules>
<clear />
<rule name="TYPO3 - Block access to composer files">
<match url="composer\.(?:json|lock)" ignoreCase="true" />
<action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" />
</rule>
<rule name="TYPO3 - Block access to flexform files">
<match url="flexform[^.]*\.xml" ignoreCase="true" />
<action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" />
</rule>
<rule name="TYPO3 - Block access to language files">
<match url="locallang[^.]*\.(?:xml|xlf)$" ignoreCase="true" />
<action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" />
</rule>
<rule name="TYPO3 - Block access to static typoscript files">
<match url="ext_conf_template\.txt|ext_typoscript_constants\.txt|ext_typoscript_setup\.txt" ignoreCase="true" />
<action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" />
</rule>
<rule name="TYPO3 - Block access to miscellaneous protected files">
<match url="/.*\.(?:bak|co?nf|cfg|neon|ya?ml|ts|typoscript|tsconfig|dist|fla|in[ci]|log|sh|sql|sqlite)$" ignoreCase="true" />
<action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" />
</rule>
<rule name="TYPO3 - Block access to recycler and temporary directories">
<match url="_(?:recycler|temp)_/" ignoreCase="false" />
<action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" />
</rule>
<rule name="TYPO3 - Block access to configuration files stored in fileadmin">
<match url="fileadmin/(?:templates)/.*\.(?:txt|ts)$" ignoreCase="false" />
<action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" />
</rule>
<rule name="TYPO3 - Block access to libraries, source and temporary compiled data">
<match url="^(?:vendor|typo3_src|typo3temp/var)" ignoreCase="false" />
<action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" />
</rule>
<rule name="TYPO3 - Block access to protected extension directories">
<match url="(?:typo3conf/ext|typo3/sysext|typo3/ext)/[^/]+/(?:Configuration|Resources/Private|Tests?|Documentation|docs?)/" ignoreCase="false" />
<action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" />
</rule>
<rule name="TYPO3 - Static File Directories" stopProcessing="true">
<match url="^/(typo3temp|typo3conf|t3lib|tslib|fileadmin|uploads|showpic\.php|favicon\.ico)$" />
<action type="None" />
</rule>
<rule name="TYPO3 - If the file/directory does not exist but is below /typo3/, redirect to the main TYPO3 entry point." stopProcessing="true">
<match url="^typo3/(.*)$" ignoreCase="false" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_URI}" matchType="Pattern" pattern="^/typo3/.*$" />
</conditions>
<action type="Rewrite" url="index.php" appendQueryString="true" />
</rule>
<rule name="TYPO3 - Version Number in File Name (if set)" stopProcessing="true">
<match url="^(.+)\.(\d+)\.(php|js|css|png|jpg|gif|svg|avif|webp|gz)$" ignoreCase="false" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
</conditions>
<action type="Rewrite" url="{R:1}.{R:3}" />
</rule>
<rule name="TYPO3 - If the file/directory does not exist => Redirect to index.php." stopProcessing="true">
<match url="^.*$" ignoreCase="false" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="index.php" appendQueryString="true" />
</rule>
</rules>
</rewrite>
<staticContent>
<clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="8.00:00:00" />
</staticContent>
</system.webServer>
</configuration>
@@ -0,0 +1,15 @@
# This file restricts access to the typo3temp/var/ directory. It is
# meant to protect temporary files which could contain sensible
# information. Please do not touch.
# Apache < 2.3
<IfModule !mod_authz_core.c>
Order allow,deny
Deny from all
Satisfy All
</IfModule>
# Apache ≥ 2.3
<IfModule mod_authz_core.c>
Require all denied
</IfModule>
+137
View File
@@ -0,0 +1,137 @@
*******************************************************************************
Bitstream Vera Sans
"vera.ttf" - A "verdana"-look-alike font. If you want to use the real Verdana
font you should upload the verdana-normal ttf file from your Windows system
(fonts/verdana.ttf).
*******************************************************************************
This file was downloaded from <http://ftp.gnome.org/pub/GNOME/sources/ttf-bitstream-vera/>.
Copyright Holder: Bitstream, Inc.
License (vera.ttf):
Bitstream Vera Fonts Copyright
The fonts have a generous copyright, allowing derivative works (as
long as "Bitstream" or "Vera" are not in the names), and full
redistribution (so long as they are not *sold* by themselves). They
can be be bundled, redistributed and sold with any software.
The fonts are distributed under the following copyright:
Copyright
=========
Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream
Vera is a trademark of Bitstream, Inc.
Permission is hereby granted, free of charge, to any person obtaining
a copy of the fonts accompanying this license ("Fonts") and associated
documentation files (the "Font Software"), to reproduce and distribute
the Font Software, including without limitation the rights to use,
copy, merge, publish, distribute, and/or sell copies of the Font
Software, and to permit persons to whom the Font Software is furnished
to do so, subject to the following conditions:
The above copyright and trademark notices and this permission notice
shall be included in all copies of one or more of the Font Software
typefaces.
The Font Software may be modified, altered, or added to, and in
particular the designs of glyphs or characters in the Fonts may be
modified and additional glyphs or characters may be added to the
Fonts, only if the fonts are renamed to names not containing either
the words "Bitstream" or the word "Vera".
This License becomes null and void to the extent applicable to Fonts
or Font Software that has been modified and is distributed under the
"Bitstream Vera" names.
The Font Software may be sold as part of a larger software package but
no copy of one or more of the Font Software typefaces may be sold by
itself.
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL
BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL,
OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT
SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
Except as contained in this notice, the names of Gnome, the Gnome
Foundation, and Bitstream Inc., shall not be used in advertising or
otherwise to promote the sale, use or other dealings in this Font
Software without prior written authorization from the Gnome Foundation
or Bitstream Inc., respectively. For further information, contact:
fonts at gnome dot org.
Copyright FAQ
=============
1. I don't understand the resale restriction... What gives?
Bitstream is giving away these fonts, but wishes to ensure its
competitors can't just drop the fonts as is into a font sale system
and sell them as is. It seems fair that if Bitstream can't make money
from the Bitstream Vera fonts, their competitors should not be able to
do so either. You can sell the fonts as part of any software package,
however.
2. I want to package these fonts separately for distribution and
sale as part of a larger software package or system. Can I do so?
Yes. A RPM or Debian package is a "larger software package" to begin
with, and you aren't selling them independently by themselves.
See 1. above.
3. Are derivative works allowed?
Yes!
4. Can I change or add to the font(s)?
Yes, but you must change the name(s) of the font(s).
5. Under what terms are derivative works allowed?
You must change the name(s) of the fonts. This is to ensure the
quality of the fonts, both to protect Bitstream and Gnome. We want to
ensure that if an application has opened a font specifically of these
names, it gets what it expects (though of course, using fontconfig,
substitutions could still could have occurred during font
opening). You must include the Bitstream copyright. Additional
copyrights can be added, as per copyright law. Happy Font Hacking!
6. If I have improvements for Bitstream Vera, is it possible they might get
adopted in future versions?
Yes. The contract between the Gnome Foundation and Bitstream has
provisions for working with Bitstream to ensure quality additions to
the Bitstream Vera font family. Please contact us if you have such
additions. Note, that in general, we will want such additions for the
entire family, not just a single font, and that you'll have to keep
both Gnome and Jim Lyles, Vera's designer, happy! To make sense to add
glyphs to the font, they must be stylistically in keeping with Vera's
design. Vera cannot become a "ransom note" font. Jim Lyles will be
providing a document describing the design elements used in Vera, as a
guide and aid for people interested in contributing to Vera.
7. I want to sell a software package that uses these fonts: Can I do so?
Sure. Bundle the fonts with your software and sell your software
with the fonts. That is the intent of the copyright.
8. If applications have built the names "Bitstream Vera" into them,
can I override this somehow to use fonts of my choosing?
This depends on exact details of the software. Most open source
systems and software (e.g., Gnome, KDE, etc.) are now converting to
use fontconfig (see www.fontconfig.org) to handle font configuration,
selection and substitution; it has provisions for overriding font
names and substituting alternatives. An example is provided by the
supplied local.conf file, which chooses the family Bitstream Vera for
"sans", "serif" and "monospace". Other software (e.g., the XFree86
core server) has other mechanisms for font substitution.
Binary file not shown.
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="en" datatype="plaintext" original="EXT:install/Resources/Private/Language/Modules/environment.xlf" date="2026-11-10T13:37:37Z" product-name="environment">
<header/>
<body>
<trans-unit id="short_description">
<source>Environment</source>
</trans-unit>
<trans-unit id="description">
<source>Provides a simple link to the Install Tool. Notice the Install Tool (in typo3/install/) must be enabled.</source>
</trans-unit>
<trans-unit id="title">
<source>Environment</source>
</trans-unit>
</body>
</file>
</xliff>
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="en" datatype="plaintext" original="EXT:install/Resources/Private/Language/Modules/maintenance.xlf" date="2026-11-10T13:37:37Z" product-name="maintenance">
<header/>
<body>
<trans-unit id="short_description">
<source>Maintenance</source>
</trans-unit>
<trans-unit id="description">
<source>Provides a simple link to the Install Tool. Notice the Install Tool (in typo3/install/) must be enabled.</source>
</trans-unit>
<trans-unit id="title">
<source>Maintenance</source>
</trans-unit>
</body>
</file>
</xliff>
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="en" datatype="plaintext" original="EXT:install/Resources/Private/Language/Modules/settings.xlf" date="2026-11-10T13:37:37Z" product-name="settings">
<header/>
<body>
<trans-unit id="short_description">
<source>Settings</source>
</trans-unit>
<trans-unit id="description">
<source>Provides a simple link to the Install Tool. Notice the Install Tool (in typo3/install/) must be enabled.</source>
</trans-unit>
<trans-unit id="title">
<source>Settings</source>
</trans-unit>
</body>
</file>
</xliff>
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="en" datatype="plaintext" original="EXT:install/Resources/Private/Language/Modules/upgrade.xlf" date="2026-11-10T13:37:37Z" product-name="upgrade">
<header/>
<body>
<trans-unit id="short_description">
<source>Upgrade</source>
</trans-unit>
<trans-unit id="description">
<source>Provides a simple link to the Install Tool. Notice the Install Tool (in typo3/install/) must be enabled.</source>
</trans-unit>
<trans-unit id="title">
<source>Upgrade</source>
</trans-unit>
</body>
</file>
</xliff>
@@ -0,0 +1,110 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="en" datatype="plaintext" original="EXT:install/Resources/Private/Language/Report/locallang.xlf" date="2011-10-17T20:22:33Z" product-name="install">
<header/>
<body>
<trans-unit id="environment.status.title">
<source>System environment check</source>
</trans-unit>
<trans-unit id="environment.status.value">
<source>%1$s Test(s)</source>
</trans-unit>
<trans-unit id="environment.status.message.error">
<source>The system environment check returned errors. Those errors will affect the functionality and stability of your TYPO3 CMS instance. Please check the install tool "System environment" for all details.</source>
</trans-unit>
<trans-unit id="environment.status.message.warning">
<source>The system environment check returned warnings. Those warnings might have a negative effect on the functionality and stability of your TYPO3 CMS instance. Please check the install tool "System environment" for all details.</source>
</trans-unit>
<trans-unit id="environment.status.message.notice">
<source>The system environment check returned notices. Those should not affect the functionality and stability of your TYPO3 CMS instance. Please check the install tool "System environment" for all details.</source>
</trans-unit>
<trans-unit id="environment.status.message.ok">
<source/>
</trans-unit>
<trans-unit id="environment.status.message.info">
<source/>
</trans-unit>
<trans-unit id="status_fileSystem">
<source>File System</source>
</trans-unit>
<trans-unit id="status_writable">
<source>Writable</source>
</trans-unit>
<trans-unit id="status_missingDirectory">
<source>Required directory missing</source>
</trans-unit>
<trans-unit id="status_nonExistingDirectory">
<source>Directory not existing</source>
</trans-unit>
<trans-unit id="status_recommendedWritableDirectory">
<source>Directory should be writable</source>
</trans-unit>
<trans-unit id="status_requiredWritableDirectory">
<source>Directory not writable</source>
</trans-unit>
<trans-unit id="status_directoryDoesNotExist">
<source>%s does not exist.</source>
</trans-unit>
<trans-unit id="status_directoryDoesNotExistCouldNotCreate">
<source>%s does not exist and could not be created.</source>
</trans-unit>
<trans-unit id="status_directoryShouldAlsoBeWritable">
<source>Also note that it should be writable, if it did exist.</source>
</trans-unit>
<trans-unit id="status_directoryShouldBeWritable">
<source>%s should be writable.</source>
</trans-unit>
<trans-unit id="status_directoryMustBeWritable">
<source>%s must be writable.</source>
</trans-unit>
<trans-unit id="status_remainingUpdates">
<source>Remaining updates</source>
</trans-unit>
<trans-unit id="status_remoteFetchException">
<source>Could not fetch version matrix of TYPO3. Maybe this instance is blocked by a firewall?</source>
</trans-unit>
<trans-unit id="status_isDevelopmentVersion">
<source>This version of TYPO3 seems to be a development version. Thus no update information exists.</source>
</trans-unit>
<trans-unit id="status_patchLevelNotFoundInReleaseMatrix">
<source>It seems that this TYPO3 version has never been released. Thus no update information exists.</source>
</trans-unit>
<trans-unit id="status_newVersionSecurityRelevant">
<source>There is a new version of TYPO3 available, updating is security relevant. Please update to version %s.</source>
</trans-unit>
<trans-unit id="status_newVersion">
<source>There is a new version of TYPO3 available. You can update to version %s.</source>
</trans-unit>
<trans-unit id="status_elts_information">
<source>The currently installed TYPO3 version %s doesn't receive any community-driven updates anymore, consider subscribing to Extended Long Term Support (ELTS) releases. Get more information at %s.</source>
</trans-unit>
<trans-unit id="status_elts_download">
<source>Please visit %s to download the release in your ELTS area.</source>
</trans-unit>
<trans-unit id="status_elts_subscribe">
<source>The currently installed TYPO3 version %s doesn't receive any community-driven updates anymore, consider subscribing to Extended Long Term Support (ELTS) releases. Get more information at %s.</source>
</trans-unit>
<trans-unit id="status_versionOutdated">
<source>The TYPO3 version you're using is not supported anymore. You should update to a supported version.</source>
</trans-unit>
<trans-unit id="status_noAutomaticCheck">
<source>Automatic update checking failed, please check for updates manually.</source>
</trans-unit>
<trans-unit id="status_uptodate">
<source>Your TYPO3 version is up-to-date.</source>
</trans-unit>
<trans-unit id="status_installTool">
<source>Install Tool</source>
</trans-unit>
<trans-unit id="status_enabledPermanently">
<source>Enabled permanently</source>
</trans-unit>
<trans-unit id="status_enabledTemporarily">
<source>Enabled temporarily</source>
</trans-unit>
<trans-unit id="status_installEnabledTemporarily">
<source>The Install Tool is temporarily enabled. Delete the file "%s" when you have finished setting up TYPO3. If not used the Install Tool will be disabled automatically in %s minutes.</source>
</trans-unit>
</body>
</file>
</xliff>
@@ -0,0 +1,5 @@
<f:render section="headline"/>
<f:render section="header" optional="true"/>
<div class="card-container">
<f:render section="cards"/>
</div>
@@ -0,0 +1,17 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="card-header">
<f:if condition="{icon}">
<div class="card-icon">
<img src="{f:uri.resource(path: icon)}" width="64" height="64" class="card-header-icon-image" />
</div>
</f:if>
<div class="card-header-body">
<f:if condition="{title}">
<h2 class="card-title">{title}</h2>
</f:if>
<f:if condition="{subtitle}">
<span class="card-subtitle">{subtitle}</span>
</f:if>
</div>
</div>
</html>
@@ -0,0 +1,10 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:if condition="!{isWritable}">
<f:be.infobox state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::WARNING')}" disableIcon="true">
The configuration file system/settings.php is not writable by TYPO3. Changing any configuration is
therefore not possible.
</f:be.infobox>
</f:if>
</html>
@@ -0,0 +1,195 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:i="http://typo3.org/ns/TYPO3/CMS/Install/ViewHelpers"
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<div class="panel panel-default searchhit">
<h2 class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#collapse-{extensionKey}"
aria-controls="collapse-{extensionKey}"
aria-expanded="false"
id="heading-{extensionKey}"
>
<div class="panel-title">
<strong>{extensionKey}</strong>
</div>
<span class="caret"></span>
</button>
</div>
</h2>
<div id="collapse-{extensionKey}" class="panel-collapse collapse search-item" role="tabpanel" aria-labelledby="heading-{extensionKey}">
<div class="panel-body">
<div role="tabpanel">
<ul class="nav nav-tabs" role="tablist">
<f:for each="{extensionData}" as="category" key="categoryName" iteration="iteration">
<f:if condition="{categoryName}">
<li role="presentation" class="nav-item">
<button
type="button"
class="nav-link{f:if(condition:'{iteration.isFirst}', then:' active')}"
data-typo3-tab="#{i:format.noSpace(value:'category-{extensionKey}-{categoryName}')}"
aria-controls="category-{extensionKey}-{categoryName}"
role="tab"
>
{category.label ? category.label : categoryName}
</button>
</li>
</f:if>
</f:for>
</ul>
<form action="#" name="configurationform" autocomplete="off" class="t3js-extensionConfiguration-form extensionConfiguration-form" data-extension-key="{extensionKey}" spellcheck="false">
<div class="tab-content">
<f:for each="{extensionData}" as="subcategories" key="categoryName" iteration="iterator">
<div role="tabpanel" class="tab-pane {f:if(condition:'{iterator.isFirst}', then:'active')}" id="{i:format.noSpace(value:'category-{extensionKey}-{categoryName}')}">
<f:for each="{subcategories.items}" as="subcategory">
<div class="form-section">
<f:for each="{subcategory.items}" as="configurationItem" iteration="itemIterator">
<f:if condition="{itemIterator.isFirst}">
<h2 class="h4 form-section-headline">{configurationItem.subcat_label}</h2>
</f:if>
<div class="form-group form-group-dashed">
<label class="form-label" for="em-{extensionKey}-{configurationItem.name}">
<span>{configurationItem.label}</span> <code>({categoryName}.{configurationItem.name} [{configurationItem.type}])</code>
</label>
<f:if condition="{configurationItem.description}">
<div class="form-description">{configurationItem.description -> f:format.nl2br()}</div>
</f:if>
<f:if condition="{configurationItem.typeHint}">
<div class="form-description">{configurationItem.typeHint}</div>
</f:if>
<div class="form-control-wrap">
<f:switch expression="{configurationItem.type}">
<f:case value="int+">
<input
class="form-control"
id="em-{extensionKey}-{configurationItem.name}"
type="number"
name="{configurationItem.name}"
value="{configurationItem.value}"
{f:if(condition: '{configurationItem.typeIntPlusMin} || {configurationItem.typeIntPlusMin == 0}', then: 'min="{configurationItem.typeIntPlusMin}"')}
{f:if(condition: configurationItem.typeIntPlusMax, then: 'max="{configurationItem.typeIntPlusMax}"')}
{f:if(condition: '!{isWritable}', then: 'disabled')}
>
</f:case>
<f:case value="int">
<input
class="form-control"
id="em-{extensionKey}-{configurationItem.name}"
type="number"
name="{configurationItem.name}"
value="{configurationItem.value}"
{f:if(condition: '{configurationItem.typeIntMin} || {configurationItem.typeIntMin == 0}', then: 'min="{configurationItem.typeIntMin}"')}
{f:if(condition: '{configurationItem.typeIntMax} || {configurationItem.typeIntMax == 0}', then: 'max="{configurationItem.typeIntMax}"')}
{f:if(condition: '!{isWritable}', then: 'disabled')}
>
</f:case>
<f:case value="string">
<input
class="form-control"
id="em-{extensionKey}-{configurationItem.name}"
type="text"
name="{configurationItem.name}"
value="{configurationItem.value}"
{f:if(condition: '!{isWritable}', then: 'disabled')}
/>
</f:case>
<f:case value="color">
<typo3-backend-color-picker>
<input
class="form-control"
type="text"
id="em-{extensionKey}-{configurationItem.name}"
name="{configurationItem.name}"
value="{configurationItem.value}"
{f:if(condition: '!{isWritable}', then: 'disabled')}
/>
</typo3-backend-color-picker>
</f:case>
<f:case value="wrap">
<input
class="form-control t3js-emconf-wrap"
type="text"
id="em-{extensionKey}-{configurationItem.name}"
name="{configurationItem.name}"
value="{configurationItem.value}"
{f:if(condition: '!{isWritable}', then: 'disabled')}
/>
</f:case>
<f:case value="offset">
<input
type="text"
class="form-control t3js-emconf-offset"
id="em-{extensionKey}-{configurationItem.name}"
name="{configurationItem.name}"
value="{configurationItem.value}"
{f:if(condition: '!{isWritable}', then: 'disabled')}
/>
</f:case>
<f:case value="options">
<select
class="form-select"
id="em-{extensionKey}-{configurationItem.name}"
name="{configurationItem.name}"
{f:if(condition: '!{isWritable}', then: 'disabled')}
>
<f:for each="{configurationItem.labelValueArray}" as="labelAndValue">
<option value="{labelAndValue.value}" {f:if(condition: '{labelAndValue.value} == {configurationItem.value}', then: 'selected')}>
{labelAndValue.label}
</option>
</f:for>
</select>
</f:case>
<f:case value="boolean">
<div class="form-check">
<input
type="hidden"
name="{configurationItem.name}"
value="0"
/>
<input
type="checkbox"
name="{configurationItem.name}"
id="em-{extensionKey}-{configurationItem.name}"
class="form-check-input"
value="{configurationItem.trueValue}"
{f:if(condition: '{configurationItem.value} == {configurationItem.trueValue}', then: 'checked')}
{f:if(condition: '!{isWritable}', then: 'disabled')}
/>
</div>
</f:case>
<f:case value="user">
{configurationItem.html -> f:format.raw()}
</f:case>
</f:switch>
</div>
</div>
</f:for>
</div>
</f:for>
</div>
</f:for>
</div>
<f:if condition="{isWritable}">
<button type="submit" class="btn btn-primary" name="save">Save "{extensionKey}" configuration</button>
</f:if>
</form>
</div>
</div>
</div>
</div>
</html>
@@ -0,0 +1,259 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:i="http://typo3.org/ns/TYPO3/CMS/Install/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="#collapse-{sectionName}"
aria-controls="collapse-{sectionName}"
aria-expanded="false"
id="heading-{sectionName}"
>
<div class="panel-title">
<strong>{sectionData.description}</strong> [{sectionName}]
</div>
<span class="caret"></span>
</button>
</div>
</h2>
<div id="collapse-{sectionName}" class="panel-collapse collapse" role="tabpanel" aria-labelledby="heading-{sectionName}">
<div class="panel-body">
<div class="localconf-list">
<f:for each="{sectionData.items}" as="item">
<div class="localconf-item searchhit t3js-localConfiguration-item" id="{sectionName}-{item.key}">
<div class="localconf-item-heading">
<strong>[{sectionName}]{item.path} </strong>
<f:if condition="{item.type} == 'checkbox'">
<f:then>
=
<f:if condition="{item.value}">
<f:then>true</f:then>
<f:else>false</f:else>
</f:if>
</f:then>
<f:else>
<f:if condition="{item.value} && !{item.hideValue}">
= {item.value -> i:format.cropText(maxCharacters: 40)}
</f:if>
</f:else>
</f:if>
</div>
<div class="localconf-item-body">
<f:render partial="Settings/ReadonlyInfo" arguments="{configuration: item}" />
<f:if condition="{item.differentValueInCurrentConfiguration}">
<div class="t3js-infobox callout callout-warning">
<div class="callout-content">
<div class="callout-body">
Note that <code>$GLOBALS['TYPO3_CONF_VARS']</code> currently contains a different value.
This could mean that the value is overwritten in system/additional.php.
</div>
</div>
</div>
</f:if>
<!-- @see typo3-formengine-table-wizard -->
<f:if condition="{item.type} == 'map' || {item.type} == 'element-list'">
<f:variable name="configurationListNamespace" value="item-{item.type}-{sectionName}-{item.key}" />
<f:if condition="{item.description}">
<div class="form-description">{item.description -> f:sanitize.html()}</div>
</f:if>
<div class="configuration-map-container t3js-configuration-list" data-namespace="{configurationListNamespace}" data-type="{item.type}">
<div class="configuration-map-item-collection">
<div class="configuration-map-item">
<f:if condition="{item.type} == 'map'">
<div class="configuration-map-item-header">{item.arrayKey}</div>
</f:if>
<div class="configuration-map-item-header">{item.arrayValue}</div>
</div>
<f:for each="{item.values}" as="value" key="key">
<div class="configuration-map-item t3js-localConfiguration-configuration-item">
<div class="input-group">
<f:if condition="{item.type} == 'map'">
<input
type="text"
value="{key}"
placeholder="{item.arrayKey} [enumerated when empty]"
data-path="{sectionName}/{item.key}/key[]"
data-valuetype="{item.type}"
class="t3-install-form-input-text form-control t3js-localConfiguration-pathValue"
autocomplete="off"
{f:if(condition: '!{isWritable} || {item.readonly}', then: 'disabled')}
/>
</f:if>
<input
type="text"
value="{value}"
placeholder="{item.arrayValue} [required]"
data-path="{sectionName}/{item.key}/value[]"
data-valuetype="{item.type}"
class="t3-install-form-input-text form-control t3js-localConfiguration-pathValue"
autocomplete="off"
{f:if(condition: '!{isWritable} || {item.readonly}', then: 'disabled')}
/>
<f:if condition="{isWritable} && !{item.readonly}">
<button class="btn btn-default t3js-localConfiguration-removeRow"><core:icon identifier="actions-remove" /></button>
</f:if>
</div>
</div>
</f:for>
</div>
<f:if condition="{isWritable} && !{item.readonly}">
<template id="{configurationListNamespace}">
<div class="configuration-map-item t3js-localConfiguration-configuration-item">
<div class="input-group">
<f:if condition="{item.type} == 'map'">
<input
type="text"
value=""
placeholder="{item.arrayKey} [enumerated when empty]"
data-path="{sectionName}/{item.key}/key[]"
data-valuetype="{item.type}"
class="t3-install-form-input-text form-control t3js-localConfiguration-pathValue"
autocomplete="off"
{f:if(condition: '!{isWritable} || {item.readonly}', then: 'disabled')}
/>
</f:if>
<input
type="text"
value=""
placeholder="{item.arrayValue} [required]"
data-path="{sectionName}/{item.key}/value[]"
data-valuetype="{item.type}"
class="t3-install-form-input-text form-control t3js-localConfiguration-pathValue"
autocomplete="off"
{f:if(condition: '!{isWritable} || {item.readonly}', then: 'disabled')}
/>
<button class="btn btn-default t3js-localConfiguration-removeRow"><core:icon identifier="actions-remove" /></button>
</div>
</div>
</template>
<button type="button" class="btn btn-default btn-configuration-map-add t3js-localConfiguration-createRow"><core:icon identifier="actions-add" /> Add item</button>
</f:if>
</div>
</f:if>
<f:if condition="{f:count(subject: item.allowedValues)} || {item.dataType} == 'dropdown'">
<f:then>
<div class="form-group">
<div class="form-description">{item.description -> f:sanitize.html()}</div>
<select data-path="{sectionName}/{item.key}" class="t3-install-form-input-text form-select t3js-localConfiguration-pathValue"
{f:if(condition: '!{isWritable} || {item.readonly}', then: 'disabled')}
>
<f:for each="{item.allowedValues}" key="optionKey" as="optionLabel">
<option value="{optionKey}" {f:if(condition: '{item.value} == {optionKey}', then: 'selected="selected"')}>{optionLabel} ({optionKey})</option>
</f:for>
</select>
</div>
</f:then>
<f:else>
<f:if condition="{item.type} == 'checkbox'">
<div class="form-check">
<input
type="checkbox"
value="1"
class="form-check-input t3js-localConfiguration-pathValue"
id="{sectionName}_{item.key}"
data-path="{sectionName}/{item.key}"
{f:if(condition: item.checked, then:'checked="checked"')}
{f:if(condition: '!{isWritable} || {item.readonly}', then: 'disabled')}
/>
<label class="form-check-label" for="{sectionName}_{item.key}">
{item.description -> f:sanitize.html()}
</label>
</div>
</f:if>
<f:if condition="{item.type} == 'input'">
<div class="form-group">
<f:if condition="{item.description}">
<div class="form-description">{item.description -> f:sanitize.html()}</div>
</f:if>
<input
type="text"
value="{item.value}"
data-path="{sectionName}/{item.key}"
class="t3-install-form-input-text form-control t3js-localConfiguration-pathValue"
autocomplete="off"
{f:if(condition: '!{isWritable} || {item.readonly}', then: 'disabled')}
/>
</div>
</f:if>
<f:if condition="{item.type} == 'password'">
<div class="form-group">
<f:if condition="{item.description}">
<div class="form-description">{item.description -> f:sanitize.html()}</div>
</f:if>
<input
type="password"
value="{item.value}"
data-path="{sectionName}/{item.key}"
class="t3-install-form-input-text form-control t3js-localConfiguration-pathValue"
autocomplete="new-password"
{f:if(condition: '!{isWritable} || {item.readonly}', then: 'disabled')}
/>
</div>
</f:if>
<f:if condition="{item.type} == 'number'">
<div class="form-group">
<f:if condition="{item.description}">
<div class="form-description">{item.description -> f:sanitize.html()}</div>
</f:if>
<input
type="number"
value="{item.value}"
data-path="{sectionName}/{item.key}"
class="t3-
install-form-input-text form-control t3js-localConfiguration-pathValue"
autocomplete="off"
{f:if(condition: '!{isWritable} || {item.readonly}', then: 'disabled')}
/>
</div>
</f:if>
<f:if condition="{item.type} == 'textarea'">
<div class="form-group">
<f:if condition="{item.description}">
<div class="form-description">{item.description -> f:sanitize.html()}</div>
</f:if>
<textarea
rows="5"
cols="60"
data-path="{sectionName}/{item.key}"
class="form-control t3js-localConfiguration-pathValue"
{f:if(condition: '!{isWritable} || {item.readonly}', then: 'disabled')}
>{item.value}</textarea>
</div>
</f:if>
</f:else>
</f:if>
<f:if condition="{item.phpErrorCode}">
<div class="fieldNote">
Current PHP error code <strong>{item.value}</strong> represents:<br/>
<code>
<i:format.phpErrorCode phpErrorCode="{item.value}"/>
</code>
</div>
</f:if>
</div>
</div>
</f:for>
<div class="alert alert-warning m-0">
No settings have been found.
</div>
</div>
</div>
</div>
</div>
</html>
@@ -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>
@@ -0,0 +1,12 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:if condition="{configuration.readonly}">
<div class="t3js-infobox callout callout-info">
<div class="callout-content">
<div class="callout-body">
For security reasons, this option cannot be changed here.<br>
Please configure via <code>system/settings.php</code> or <code>system/additional.php</code>.
</div>
</div>
</div>
</f:if>
</html>
@@ -0,0 +1,54 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
data-namespace-typo3-fluid="true">
<div class="t3js-upgrade-doc panel panel-rst panel-{fileArray.class} risk-medium" data-item-tags="{fileArray.tagList}" data-item-version="{fileArray.version}" data-item-state="{state}" id="heading{id}">
<h2 class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button order-2 collapsed"
type="button"
data-bs-target="#collapse{id}"
data-bs-toggle="collapse"
aria-expanded="false"
aria-controls="collapse{id}"
>
<div class="panel-title"><strong>{fileArray.headline}</strong></div>
<span class="caret"></span>
</button>
<f:if condition="{read}">
<f:then>
<button type="button" class="btn btn-link t3js-upgradeDocs-unmarkRead" data-filepath="{fileArray.filepath}" title="Mark as not read">
<core:icon identifier="actions-ban" size="small" />
<span class="visually-hidden">restore this document</span>
</button>
</f:then>
<f:else>
<button type="button" class="btn btn-link t3js-upgradeDocs-markRead" data-filepath="{fileArray.filepath}" title="Mark as read">
<core:icon identifier="actions-check" size="small" />
<span class="visually-hidden">ignore this document</span>
</button>
</f:else>
</f:if>
</div>
</h2>
<div id="collapse{id}" class="panel-collapse collapse" role="tabpanel" aria-labelledby="heading{id}">
<div class="rst-tags">
<f:for each="{fileArray.tags}" as="tag">
<span class="badge">{tag}</span>
</f:for>
</div>
<div class="rst-links">
<f:if condition="{fileArray.url.issue}">
<a href="{fileArray.url.issue}" target="_blank" rel="noreferrer" class="nowrap"><core:icon identifier="actions-window-open" /> Open issue</a>
</f:if>
<f:if condition="{fileArray.url.documentation}">
<a href="{fileArray.url.documentation}" target="_blank" rel="noreferrer" class="nowrap"><core:icon identifier="actions-window-open" /> Open rendered version</a>
</f:if>
</div>
<pre class="panel-body"><f:format.raw>{fileArray.parsedContent}</f:format.raw></pre>
</div>
</div>
</html>
@@ -0,0 +1,6 @@
<f:layout name="SystemEmail" />
<f:section name="Title">{headline}</f:section>
<f:section name="Main">
<h4>{introduction}</h4>
<p>There has been a successful Install Tool login at TYPO3 site "{typo3.sitename}" from the IP address <strong>{normalizedParams.remoteAddress}</strong>.</p>
</f:section>
@@ -0,0 +1,5 @@
<f:layout name="SystemEmail" />
<f:section name="Title">{headline}</f:section>
<f:section name="Main">{introduction}
There has been a successful Install Tool login at TYPO3 site "{typo3.sitename}" from the IP address "{normalizedParams.remoteAddress}".
</f:section>
@@ -0,0 +1,6 @@
<f:layout name="SystemEmail" />
<f:section name="Title">{headline}</f:section>
<f:section name="Main">
<h4>{introduction}</h4>
<p>There has been an Install Tool login attempt at TYPO3 site "{typo3.sitename}" from the IP address <strong>{normalizedParams.remoteAddress}</strong>.</p>
</f:section>
@@ -0,0 +1,5 @@
<f:layout name="SystemEmail" />
<f:section name="Title">{headline}</f:section>
<f:section name="Main">{introduction}
There has been an Install Tool login attempt at TYPO3 site "{typo3.sitename}" from the IP address "{normalizedParams.remoteAddress}".
</f:section>
@@ -0,0 +1,62 @@
<f:layout name="Cards"/>
<f:section name="headline">
<h1>Environment</h1>
</f:section>
<f:section name="cards">
<div class="card card-size-small">
<f:render partial="Card/Header" arguments="{ title: 'Environment Overview', subtitle: 'Environment', icon: 'EXT:install/Resources/Public/Icons/modules/install-show-environment.svg'}" />
<div class="card-body">
<p class="card-text">Review details of the host environment, including web server, PHP version, selected database, and the application context.</p>
</div>
<div class="card-footer">
<button type="button" class="btn btn-default" data-modal-size="small" data-import="@typo3/install/module/environment/system-information.js">Show System Information&hellip;</button>
</div>
</div>
<div class="card card-size-small">
<f:render partial="Card/Header" arguments="{ title: 'Environment Status', subtitle: 'PHP', icon: 'EXT:install/Resources/Public/Icons/modules/install-test-environment.svg'}" />
<div class="card-body">
<p class="card-text">Analyze host environment for conditions that could prevent TYPO3 from operating correctly.</p>
</div>
<div class="card-footer">
<button type="button" class="btn btn-default" data-import="@typo3/install/module/environment/environment-check.js">Check Environment&hellip;</button>
</div>
</div>
<div class="card card-size-small">
<f:render partial="Card/Header" arguments="{ title: 'Directory Status', subtitle: 'Permissions', icon: 'EXT:install/Resources/Public/Icons/modules/install-check-directory.svg'}" />
<div class="card-body">
<p class="card-text">Analyze folder structure to verify file and directory permissions and detect missing items.</p>
</div>
<div class="card-footer">
<button type="button" class="btn btn-default" data-import="@typo3/install/module/environment/folder-structure.js">Check Directory Status&hellip;</button>
</div>
</div>
<div class="card card-size-small">
<f:render partial="Card/Header" arguments="{ title: 'PHP Info', subtitle: 'PHP', icon: 'EXT:install/Resources/Public/Icons/modules/install-php-info.svg'}" />
<div class="card-body">
<p class="card-text">View detailed information about the PHP installation, including version details and enabled extensions.</p>
</div>
<div class="card-footer">
<button type="button" class="btn btn-default" data-import="@typo3/install/module/environment/php-info.js">View PHP Info&hellip;</button>
</div>
</div>
<div class="card card-size-small">
<f:render partial="Card/Header" arguments="{ title: 'Test Mail Setup', subtitle: 'Mail', icon: 'EXT:install/Resources/Public/Icons/modules/install-test-mail.svg'}" />
<div class="card-body">
<p class="card-text">Test your mail configuration by sending out a dummy email via TYPO3.</p>
</div>
<div class="card-footer">
<button type="button" class="btn btn-default" data-modal-size="small" data-import="@typo3/install/module/environment/mail-test.js">Test Mail Setup&hellip;</button>
</div>
</div>
<div class="card card-size-small">
<f:render partial="Card/Header" arguments="{ title: 'Image Processing', subtitle: 'Image Processing', icon: 'EXT:install/Resources/Public/Icons/modules/install-test-image.svg'}" />
<div class="card-body">
<p class="card-text">Create test images and compare them with reference images to verify that image processing works correctly in your environment.</p>
</div>
<div class="card-footer">
<button type="button" class="btn btn-default" data-import="@typo3/install/module/environment/image-processing.js">Test Images&hellip;</button>
</div>
</div>
</f:section>
@@ -0,0 +1,5 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="t3js-environmentCheck-output"></div>
</html>
@@ -0,0 +1,20 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<p>Root Directory: <strong>{publicPath}</strong></p>
<div class="t3js-folderStructure-output mt-4" style="display:none"></div>
<div class="t3js-folderStructure-errors mt-4" style="display:none">
<h3>These files or folders have errors and may be fixed automatically:</h3>
<div class="t3js-folderStructure-errors-list"></div>
</div>
<h3 class="mt-4">Default File and Directory permissions</h3>
<div class="t3js-folderStructure-permissions"></div>
<div class="t3js-folderStructure-ok mt-4" style="display:none">
<h3>These structures don't need to be fixed:</h3>
<div class="t3js-folderStructure-ok-list"></div>
</div>
</html>
@@ -0,0 +1,380 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<h2>True type font tests</h2>
<f:be.infobox title="FreeType2 hint" state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}">
<p>If the two images below do not look the same, please check your FreeType 2 module.</p>
</f:be.infobox>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingTrueType"></div>
<h2>Convert image formats to jpg</h2>
<p>
This verifies that your ImageMagick / GraphicsMagick installation is able to read the default
formats <code>jpg</code>, <code>gif</code>, <code>png</code>, <code>tif</code>, <code>pdf</code> and
<code>ai</code>, <code>webp</code> and <code>avif</code>.
The tool <code>identify</code> is used to read the pixel dimensions of non-web formats and 'convert' is used to
read the image and convert it to <code>jpg</code>.
</p>
<f:be.infobox title="Dark images" state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}">
<p>
In case the images appear remarkably darker than the reference images,
try to set<br/> <code>$GLOBALS['TYPO3_CONF_VARS']['GFX']['processor_colorspace'] = 'sRGB';</code>.
</p>
</f:be.infobox>
<h3>Read jpg</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingReadJpg"></div>
<h3>Read gif</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingReadGif"></div>
<h3>Read png</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingReadPng"></div>
<h3>Read webp</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingReadWebp"></div>
<h3>Read avif</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingReadAvif"></div>
<h3>Read tif</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingReadTif"></div>
<h3>Read pdf</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingReadPdf"></div>
<h3>Read ai</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingReadAi"></div>
<h2>Writing gif, png, webp, avif</h2>
<p>
This verifies that ImageMagick / GraphicsMagick is able to write GIF, PNG, WEBP and AVIF files.
</p>
<h3>Write gif</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingWriteGif"></div>
<h3>Write png</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingWritePng"></div>
<h3>Write webp</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingWriteWebp"></div>
<h3>Write avif</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingWriteAvif"></div>
<h2>Scaling images</h2>
<p>
This shows how ImageMagick / GraphicsMagick reacts when scaling transparent GIF and PNG files.
</p>
<h3>gif to gif</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingGifToGif"></div>
<h3>png to png</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingPngToPng"></div>
<h3>gif to jpg</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingGifToJpg"></div>
<h3>transparent svg to webp</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingSvgToWebp"></div>
<h3>transparent svg to png</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingSvgToPng"></div>
<h2>Special image formats</h2>
<p>
This shows how ImageMagick /GraphicsMagicks reacts when converting to image formats like WEBP and AVIF.
</p>
<h3>jpg to webp</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingJpgToWebp"></div>
<h3>jpg to avif</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingJpgToAvif"></div>
<h3>png to webp</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingPngToWebp"></div>
<h3>png to avif</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingPngToAvif"></div>
<h2>Combining images</h2>
<p>
This verifies that the ImageMagick / GraphicsMagick tools, <code>combine</code>, <code>composite</code>, are able to
combine two images through a grayscale mask.
</p>
<h3>Combine using a GIF mask with only black and white</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingCombineGifMask"></div>
<h3>Combine using a JPG mask with graylevels</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingCombineJpgMask"></div>
<h2>GDlib</h2>
<p>
This verifies that the GDLib installation works properly.
</p>
<h3>Create simple image</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingGdlibSimple"></div>
<h3>Create image with box from file</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingGdlibFromFile"></div>
<h3>Create webp image with box from webp file</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingGdlibFromFileToWebp"></div>
<h3>Create avif image with box from file</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingGdlibFromFileToAvif"></div>
<h3>Render text with TrueType font</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingGdlibRenderText"></div>
<h3>Render text with TrueType font using 'niceText' option</h3>
<f:be.infobox title="Note on 'niceText'" state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}">
<p>
'niceText' is a concept that tries to improve the antialiasing of the rendered type by actually
rendering the textstring in double size on a black/white mask, downscaling the mask and masking
the text onto the image through this mask. This involves ImageMagick / GraphicsMagick 'combine'/'composite' and 'convert'.
</p>
</f:be.infobox>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingGdlibNiceText"></div>
<h3>Render 'niceText' with a shadow under</h3>
<f:be.infobox title="Note on 'shadow'" state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}">
<p>
This test makes sense only if the above test had a correct output. But if so, you may not see
a soft drop-shadow from the third text string as you should. In that case you are most likely using
ImageMagick 5 and should set the flag <code>$GLOBALS['TYPO3_CONF_VARS']['GFX']['processor_effects']</code>.
</p>
</f:be.infobox>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingGdlibNiceTextShadow"></div>
<div class="panel-group mb-0" id="accordion" role="tablist" aria-multiselectable="true">
<div class="panel panel-default">
<h2 class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
type="button"
class="panel-button collapsed"
data-bs-toggle="collapse"
data-bs-parent="#accordion"
data-bs-target="#collapseConfiguration"
aria-controls="collapseConfiguration"
aria-expanded="false"
id="headingConfiguration"
>
<div class="panel-title">
<strong>Current configuration</strong>
</div>
<span class="caret"></span>
</button>
</div>
</h2>
<div id="collapseConfiguration" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingConfiguration">
<div class="table-fit">
<table class="table table-striped">
<tr>
<td>{imageProcessingProcessor} enabled:</td>
<td>{f:if(condition:imageProcessingEnabled, then:'Yes', else:'No')}</td>
</tr>
<tr>
<td>ImageMagick or GraphicsMagick:</td>
<td>{imageProcessingProcessor}</td>
</tr>
<tr>
<td>{imageProcessingProcessor} path:</td>
<td>{imageProcessingPath}</td>
</tr>
<tr>
<td>{imageProcessingProcessor} version:</td>
<td>{imageProcessingVersion}</td>
</tr>
<tr>
<td>{imageProcessingProcessor} effects enabled:</td>
<td>{imageProcessingEffects} <span>(Blurring/Sharpening with {imageProcessingProcessor})</span></td>
</tr>
<tr>
<td>GDLib enabled:</td>
<td>{f:if(condition:imageProcessingGdlibEnabled, then:'Yes', else:'No')}</td>
</tr>
<tr>
<td>GDLib using PNG:</td>
<td>{f:if(condition:imageProcessingGdlibPng, then:'Yes', else:'No')}</td>
</tr>
<tr>
<td>File Formats:</td>
<td>{imageProcessingFileFormats}</td>
</tr>
</table>
</div>
</div>
</div>
<div class="panel panel-default">
<h2 class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
type="button"
class="panel-button collapsed"
data-bs-toggle="collapse"
data-bs-parent="#accordion"
data-bs-target="#collapseVerify"
aria-controls="collapseVerify"
aria-expanded="false"
id="headingVerify"
>
<div class="panel-title">
<strong>Verify test results</strong>
</div>
<span class="caret"></span>
</button>
</div>
</h2>
<div id="collapseVerify" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingVerify">
<div class="panel-body">
<h3>Verify test results</h3>
<p>
This page performs image processing and displays the result. It's a thorough check
that everything you've configured is working correctly.
</p>
<p>
It's quite simple to verify your installation; Just look down the page, the images
in pairs should look like each other. If some images are not alike, something is
wrong. You may also notice warnings and errors if this tool found signs of any problems.
</p>
<p>
The image to the left is the reference image (how it should be) and to the right
the image made by your server.
</p>
</div>
</div>
</div>
<div class="panel panel-default">
<h2 class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
type="button"
class="panel-button collapsed"
data-bs-toggle="collapse"
data-bs-parent="#accordion"
data-bs-target="#collapseAbout"
aria-controls="collapseAbout"
aria-expanded="false"
id="headingAbout"
>
<div class="panel-title">
<strong>About image handling</strong>
</div>
<span class="caret"></span>
</button>
</div>
</h2>
<div id="collapseAbout" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingAbout">
<div class="panel-body">
<p>
TYPO3 is known for its ability to process images on the server.
</p>
<p>
In the backend interface (TBE) thumbnails are automatically generated
as well as icons, menu items and pane tabs (by GDLib).
In the frontend all kinds of graphical elements are processed. Typically, images are
scaled down to fit the pages (by ImageMagick/GraphicsMagick) and menu items, graphical headers and
such are generated automatically (by GDLib + ImageMagick/GraphicsMagick). In addition, TYPO3 is able
to handle many file formats (thanks to ImageMagick/GraphicsMagick), for example TIF, BMP, PCX, TGA,
AI and PDF in addition to the standard web formats; JPG, GIF, PNG. Additional image formats like WEBP
and AVIF are available depending on installed codecs on the system.
</p>
<p>
In order to do this, TYPO3 uses two sets of tools:
</p>
<strong>
ImageMagick / GraphicsMagick:
</strong>
<p>
For conversion of non-web formats to web formats, combining images with alpha-masks,
performing image-effects like blurring and sharpening.
</p>
<p>
ImageMagick is a collection of external programs on the server called by the exec()
function in PHP. TYPO3 uses three of these, namely 'convert' (converting file formats,
scaling, effects), 'combine'/'composite' (combining images with masks) and 'identify'
(returns image information). GraphicsMagick is an alternative to ImageMagick and can
be enabled by setting [GFX][processor] to 'GraphicsMagick'. This is recommended and enabled
by default. Because ImageMagick and GraphicsMagick are external programs, a requirement
must be met: The programs must be installed on the server and working. ImageMagick is
available for both Windows and Unix. The current version is 6+. ImageMagick homepage is
at <a href="https://www.imagemagick.org/">https://www.imagemagick.org/</a>
</p>
<strong>GDLib:</strong>
<p>
For drawing boxes and rendering text on images with TrueType fonts. Also used for
icons, menuitems and generally the TypoScript GIFBUILDER object is based on GDlib,
but extensively utilizing ImageMagick to process intermediate results.
</p>
<p>
GDLib is accessed through internal functions in PHP, you'll need a version of PHP
with GDLib compiled in. Also in order to use TrueType fonts with GDLib you'll
need FreeType compiled in as well.
</p>
</div>
</div>
</div>
<div class="panel panel-default">
<h2 class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
type="button"
class="panel-button collapsed"
data-bs-toggle="collapse"
data-bs-parent="#accordion"
data-bs-target="#collapseTestImages"
aria-controls="collapseTestImages"
aria-expanded="false"
id="headingTestImages"
>
<div class="panel-title">
<strong>About test images</strong>
</div>
<span class="caret"></span>
</button>
</div>
</h2>
<div id="collapseTestImages" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingTestImages">
<div class="panel-body">
<p>
Test-Image by Rotkaeppchen68 (in de.wikipedia) [<a href="http://www.gnu.org/copyleft/fdl.html">GFDL</a> or
<a href="http://creativecommons.org/licenses/by-sa/3.0/">CC-BY-SA-3.0</a>],
<a href="https://commons.wikimedia.org/wiki/File%3AFuBK-Testbild.png">via Wikimedia Commons</a>
</p>
</div>
</div>
</div>
</div>
<template id="t3js-imageProcessing-twinImage-template">
<div class="t3-install-displaytwinimageimages t3js-imageProcessing-images" hidden>
<div class="row">
<div class="col-12 col-md-6">
<h3>Reference</h3>
<div class="bg-transparent-emulation">
<img class="reference"/>
</div>
</div>
<div class="col-12 col-md-6">
<h3>Your system</h3>
<div class="bg-transparent-emulation">
<img class="result"/>
</div>
</div>
</div>
</div>
<div class="t3-install-displaytwinimagetextarea t3js-imageProcessing-command" hidden>
<pre class="language-bash"><code class="language-bash t3js-imageProcessing-command-text"></code></pre>
</div>
</template>
</html>
@@ -0,0 +1,45 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<p>
Check the basic mail functionality by entering your email address here and clicking the button.
You should then receive a test email from "{mailTestSenderAddress}".
</p>
<p>
If no email is received, your setup might be broken. Check the following:
</p>
<ul>
<li>
If <code>$GLOBALS['TYPO3_CONF_VARS']['MAIL']['transport']</code> is set to mail or sendmail, TYPO3 tries to use
the operating systems' sendmail application. There might be no such program installed.
</li>
<li>
If <code>$GLOBALS['TYPO3_CONF_VARS']['MAIL']['transport']</code> is set to smtp, check if the data given in
<code>$GLOBALS['TYPO3_CONF_VARS']['MAIL']['transport_smtp_*']</code> is valid. Wrong data here results in faulty
requests to the mail server. You can find the resulting messages in the mail server log.
</li>
</ul>
<p>
Not receiving the test email could also be a consequence of it being intercepted by a spam filter or due to the
sending domain's email security settings, such as SPF record, which may prevent successful delivery.
</p>
<div class="t3js-module-content" data-mail-test-token="{mailTestToken}">
<div class="t3js-mailTest-output"></div>
<f:if condition="{isSendPossible}">
<form id="t3js-mailTest-form" spellcheck="false">
<div class="form-group">
<label class="form-label" for="t3-install-checkmail">Email address:</label>
<input
id="t3-install-checkmail"
type="email"
class="t3-install-form-input-text form-control t3js-mailTest-email"
required
/>
</div>
</form>
</f:if>
</div>
</html>
@@ -0,0 +1,7 @@
<html xmlns:i="http://typo3.org/ns/TYPO3/CMS/Install/ViewHelpers" data-namespace-typo3-fluid="true">
<div id="phpinfo">
<i:phpInfo/>
</div>
</html>
@@ -0,0 +1,62 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:i="http://typo3.org/ns/TYPO3/CMS/Install/ViewHelpers" data-namespace-typo3-fluid="true">
<table class="table table-striped table-bordered">
<tr>
<td>Operating system:</td>
<td><strong>{systemInformationOperatingSystem}</strong></td>
</tr>
<tr>
<td>PHP version:</td>
<td>
<strong>{phpVersion}</strong>
</td>
</tr>
<tr>
<td>PHP CGI detected:</td>
<td><strong>{f:if(condition:systemInformationCgiDetected, then:'Yes', else:'No')}</strong></td>
</tr>
<f:if condition="{systemInformationDatabaseConnections -> f:count()} > 1">
<tr>
<td>Number of database connections:</td>
<td><strong>{systemInformationDatabaseConnections -> f:count()}</strong></td>
</tr>
</f:if>
<f:for each="{systemInformationDatabaseConnections}" as="connection">
<tr>
<td>Database connection <strong>'{connection.connectionName}'</strong></td>
<td>
<ul>
<li><strong>Database name:</strong> {connection.databaseName}</li>
<li><strong>Username:</strong> {connection.username}</li>
<li><strong>Host:</strong> {connection.host}</li>
<f:if condition="{connection.port}">
<f:then>
<li><strong>Port:</strong> {connection.port}</li>
</f:then>
<f:else>
<li>
<strong>Socket:</strong>
{f:if(condition:connection.socket, then: '{connection.socket}', else:'<em>PHP default</em>')}
</li>
</f:else>
</f:if>
<li>
<strong>Version:</strong> {connection.version}
</li>
<li><strong>Tables:</strong> {connection.numberOfTables}</li>
<f:if condition="{connection.numberOfMappedTables}">
<f:then>
<li><strong>Mapped tables:</strong> {connection.numberOfMappedTables}</li>
</f:then>
</f:if>
</ul>
</td>
</tr>
</f:for>
<tr>
<td>Application Context:</td>
<td><strong class="text-{systemInformationApplicationContext.status}">{systemInformationApplicationContext.context}</strong></td>
</tr>
</table>
</html>
@@ -0,0 +1,17 @@
<!DOCTYPE html>
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-icon-cache-identifier="{iconCacheIdentifier}"
>
<head>
<title>Installing TYPO3 CMS</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" href="{f:uri.resource(path: 'EXT:backend/Resources/Public/Css/backend.css')}?{bust}" />
<link rel="stylesheet" href="{f:uri.resource(path: 'EXT:backend/Resources/Public/Css/webfonts.css')}?{bust}" />
<link rel="icon" type="image/vnd.microsoft.icon" href="{f:uri.resource(path: 'EXT:install/Resources/Public/Icons/favicon.ico')}?{bust}" />
{importmap->f:format.raw()}
</head>
<body class="t3js-body typo3-install">
<script type="module" src="{initModule}"></script>
</body>
</html>
@@ -0,0 +1,15 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="typo3-install-container">
<div class="typo3-install-content">
<div class="typo3-install-content-header">
<img src="{f:uri.resource(path: 'EXT:core/Resources/Public/Images/typo3_light_dark.svg')}" width="130" class="typo3-install-content-header-logo" />
<h1>Installing TYPO3 CMS</h1>
</div>
<div class="typo3-install-content-progress">
<typo3-backend-progress-bar class="t3js-installer-progress" value="0" max="5" label="Step 0 of 5 completed"></typo3-backend-progress-bar>
</div>
<div class="t3js-installer-content">
</div>
</div>
</div>
</html>
@@ -0,0 +1,403 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="t3js-module-content" data-installer-database-connect-execute-token="{executeDatabaseConnectToken}">
<div class="typo3-install-content-body">
<h2>Connect to database</h2>
<f:if condition="{hasAtLeastOneOption}">
<f:then>
<p>
You will need to create a database user with the appropriate privileges to access your database.
</p>
<div class="typo3-install-content-spacer"></div>
<div class="t3js-installer-databaseConnect-output"></div>
<div class="typo3-install-content-spacer"></div>
<form method="post" spellcheck="false">
<div class="form-group">
<label for="t3js-connect-database-driver" class="form-label">Connection</label>
<select id="t3js-connect-database-driver" class="form-select" name="install[values][availableSet]" placeholder="sqlite">
<f:if condition="{hasMysqliManualConfiguration}">
<option
value="mysqliManualConfiguration"
{f:if(condition:'{activeAvailableOption} == mysqliManualConfiguration', then: 'selected="selected"')}
>
[MySQLi] Manually configured MySQL TCP/IP connection
</option>
</f:if>
<f:if condition="{hasMysqliSocketManualConfiguration}">
<option
value="mysqliSocketManualConfiguration"
{f:if(condition:'{activeAvailableOption} == mysqliSocketManualConfiguration', then: 'selected="selected"')}
>
[MySQLi] Manually configured MySQL socket connection
</option>
</f:if>
<f:if condition="{hasPdoMysqlManualConfiguration}">
<option
value="pdoMysqlManualConfiguration"
{f:if(condition:'{activeAvailableOption} == pdoMysqlManualConfiguration', then: 'selected="selected"')}
>
[PDO] Manually configured MySQL TCP/IP connection
</option>
</f:if>
<f:if condition="{hasPdoMysqlSocketManualConfiguration}">
<option
value="pdoMysqlSocketManualConfiguration"
{f:if(condition:'{activeAvailableOption} == pdoMysqlSocketManualConfiguration', then: 'selected="selected"')}
>
[PDO] Manually configured MySQL socket connection
</option>
</f:if>
<f:if condition="{hasPostgresManualConfiguration}">
<option
value="postgresManualConfiguration"
{f:if(condition:'{activeAvailableOption} == postgresManualConfiguration', then: 'selected="selected"')}
>
Manually configured PostgreSQL connection
</option>
</f:if>
<f:if condition="{hasSqliteManualConfiguration}">
<option
value="sqliteManualConfiguration"
{f:if(condition:'{activeAvailableOption} == sqliteManualConfiguration', then: 'selected="selected"')}
>
Manually configured SQLite connection
</option>
</f:if>
<f:if condition="{hasConfigurationFromEnvironment}">
<option
value="configurationFromEnvironment"
{f:if(condition:'{activeAvailableOption} == configurationFromEnvironment', then: 'selected="selected"')}
>
Configuration from environment variables
</option>
</f:if>
</select>
</div>
<f:if condition="{hasMysqliManualConfiguration}">
<div id="mysqliManualConfiguration" class="t3-install-driver-data" hidden>
<input type="hidden" value="mysqli" name="install[values][driver]"/>
<div class="row">
<div class="form-group col-md-6">
<label for="t3-install-step-mysqliManualConfiguration-username" class="form-label">
Username
</label>
<input
id="t3-install-step-mysqliManualConfiguration-username"
class="form-control"
type="text"
value="{mysqliManualConfigurationOptions.username}"
name="install[values][username]"
autocomplete="off"
placeholder="db-user"
/>
</div>
<div class="form-group col-md-6">
<label for="t3-install-step-mysqliManualConfiguration-password" class="form-label">
Password
</label>
<input
id="t3-install-step-mysqliManualConfiguration-password"
class="form-control"
type="password"
value="{mysqliManualConfigurationOptions.password}"
name="install[values][password]"
autocomplete="off"
placeholder="password"
/>
</div>
<div class="form-group col-md-6">
<label for="t3-install-step-mysqliManualConfiguration-host" class="form-label">
Host
</label>
<input
id="t3-install-step-mysqliManualConfiguration-host"
class="t3-install-form-input-text form-control"
type="text"
value="{mysqliManualConfigurationOptions.host}"
name="install[values][host]"
placeholder="127.0.0.1"
/>
</div>
<div class="form-group col-md-6">
<label for="t3-install-step-mysqliManualConfiguration-port" class="form-label">
Port
</label>
<input
id="t3-install-step-mysqliManualConfiguration-port"
class="t3-install-form-input-text form-control"
type="text"
value="{mysqliManualConfigurationOptions.port}"
name="install[values][port]"
placeholder="3306"
/>
</div>
</div>
</div>
</f:if>
<f:if condition="{hasMysqliSocketManualConfiguration}">
<div id="mysqliSocketManualConfiguration" class="t3-install-driver-data" hidden>
<input type="hidden" value="mysqli" name="install[values][driver]"/>
<div class="row">
<div class="form-group col-md-6">
<label for="t3-install-step-mysqliSocketManualConfiguration-username" class="form-label">
Username
</label>
<input
id="t3-install-step-mysqliSocketManualConfiguration-username"
class="form-control"
type="text"
value="{mysqliSocketManualConfigurationOptions.username}"
name="install[values][username]"
autocomplete="off"
placeholder="db-user"
/>
</div>
<div class="form-group col-md-6">
<label for="t3-install-step-mysqliSocketManualConfiguration-password" class="form-label">
Password
</label>
<input
id="t3-install-step-mysqliSocketManualConfiguration-password"
class="form-control"
type="password"
value="{mysqliSocketManualConfigurationOptions.password}"
name="install[values][password]"
autocomplete="off"
placeholder="password"
/>
</div>
</div>
<input type="hidden" value="localhost" name="install[values][host]"/>
<div class="form-group">
<label for="t3-install-step-mysqliSocketManualConfiguration-socket" class="form-label">
Socket
</label>
<input
id="t3-install-step-mysqliSocketManualConfiguration-socket"
class="t3-install-form-input-text form-control"
type="text"
value="{mysqliSocketManualConfigurationOptions.socket}"
name="install[values][socket]"
placeholder="Default socket or enter name"
/>
</div>
</div>
</f:if>
<f:if condition="{hasPdoMysqlManualConfiguration}">
<div id="pdoMysqlManualConfiguration" class="t3-install-driver-data" hidden>
<input type="hidden" value="pdo_mysql" name="install[values][driver]"/>
<div class="row">
<div class="form-group col-md-6">
<label for="t3-install-step-pdoMysqlManualConfiguration-username" class="form-label">
Username
</label>
<input
id="t3-install-step-pdoMysqlManualConfiguration-username"
class="form-control"
type="text"
value="{mysqliManualConfigurationOptions.username}"
name="install[values][username]"
autocomplete="off"
placeholder="db-user"
/>
</div>
<div class="form-group col-md-6">
<label for="t3-install-step-pdoMysqlManualConfiguration-password" class="form-label">
Password
</label>
<input
id="t3-install-step-pdoMysqlManualConfiguration-password"
class="form-control"
type="password"
value="{pdoMysqlManualConfigurationOptions.password}"
name="install[values][password]"
autocomplete="off"
placeholder="password"
/>
</div>
<div class="form-group col-md-6">
<label for="t3-install-step-pdoMysqlManualConfiguration-host" class="form-label">
Host
</label>
<input
id="t3-install-step-pdoMysqlManualConfiguration-host"
class="t3-install-form-input-text form-control"
type="text"
value="{pdoMysqlManualConfigurationOptions.host}"
name="install[values][host]"
placeholder="127.0.0.1"
/>
</div>
<div class="form-group col-md-6">
<label for="t3-install-step-pdoMysqlManualConfiguration-port" class="form-label">
Port
</label>
<input
id="t3-install-step-pdoMysqlManualConfiguration-port"
class="t3-install-form-input-text form-control"
type="text"
value="{pdoMysqlManualConfigurationOptions.port}"
name="install[values][port]"
placeholder="port"
/>
</div>
</div>
</div>
</f:if>
<f:if condition="{hasPdoMysqlSocketManualConfiguration}">
<div id="pdoMysqlSocketManualConfiguration" class="t3-install-driver-data" hidden>
<input type="hidden" value="pdo_mysql" name="install[values][driver]"/>
<div class="row">
<div class="form-group col-md-6">
<label for="t3-install-step-pdoMysqlSocketManualConfiguration-username" class="form-label">
Username
</label>
<input
id="t3-install-step-pdoMysqlSocketManualConfiguration-username"
class="form-control"
type="text"
value="{pdoMysqlSocketManualConfigurationOptions.username}"
name="install[values][username]"
autocomplete="off"
placeholder="db-user"
/>
</div>
<div class="form-group col-md-6">
<label for="t3-install-step-pdoMysqlSocketManualConfiguration-password" class="form-label">
Password
</label>
<input
id="t3-install-step-pdoMysqlSocketManualConfiguration-password"
class="form-control"
type="password"
value="{pdoMysqlSocketManualConfigurationOptions.password}"
name="install[values][password]"
autocomplete="off"
placeholder="password"
/>
</div>
</div>
<input type="hidden" value="localhost" name="install[values][host]"/>
<div class="form-group">
<label for="t3-install-step-pdoMysqlSocketManualConfiguration-socket" class="form-label">
Socket
</label>
<input
id="t3-install-step-pdoMysqlSocketManualConfiguration-socket"
class="t3-install-form-input-text form-control"
type="text"
value="{pdoMysqlSocketManualConfigurationOptions.socket}"
name="install[values][socket]"
placeholder="Default socket or enter name"
/>
</div>
</div>
</f:if>
<f:if condition="{hasPostgresManualConfiguration}">
<div id="postgresManualConfiguration" class="t3-install-driver-data" hidden>
<input type="hidden" value="pdo_pgsql" name="install[values][driver]"/>
<div class="form-group">
<label for="t3-install-step-postgresManualConfiguration-database" class="form-label">
Database
</label>
<input
id="t3-install-step-postgresManualConfiguration-database"
class="t3-install-form-input-text form-control"
type="text"
value="{postgresManualConfigurationOptions.database}"
name="install[values][database]"
placeholder="database"
/>
</div>
<div class="row">
<div class="form-group col-md-6">
<label for="t3-install-step-postgresManualConfiguration-username" class="form-label">
Username
</label>
<input
id="t3-install-step-postgresManualConfiguration-username"
class="form-control"
type="text"
value="{postgresManualConfigurationOptions.username}"
name="install[values][username]"
autocomplete="off"
placeholder="db-user"
/>
</div>
<div class="form-group col-md-6">
<label for="t3-install-step-postgresManualConfiguration-password" class="form-label">
Password
</label>
<input
id="t3-install-step-postgresManualConfiguration-password"
class="form-control"
type="password"
value="{postgresManualConfigurationOptions.password}"
name="install[values][password]"
autocomplete="off"
placeholder="password"
/>
</div>
<div class="form-group col-md-6">
<label for="t3-install-step-postgresManualConfiguration-host" class="form-label">
Host
</label>
<input
id="t3-install-step-postgresManualConfiguration-host"
class="t3-install-form-input-text form-control"
type="text"
value="{postgresManualConfigurationOptions.host}"
name="install[values][host]"
placeholder="127.0.0.1"
/>
</div>
<div class="form-group col-md-6">
<label for="t3-install-step-postgresManualConfiguration-port" class="form-label">
Port
</label>
<input
id="t3-install-step-postgresManualConfiguration-port"
class="t3-install-form-input-text form-control"
type="text"
value="{postgresManualConfigurationOptions.port}"
name="install[values][port]"
placeholder=""
/>
</div>
</div>
</div>
</f:if>
<f:if condition="{hasSqliteManualConfiguration}">
<div id="sqliteManualConfiguration" class="t3-install-driver-data" hidden>
<input type="hidden" value="pdo_sqlite" name="install[values][driver]"/>
</div>
</f:if>
<f:if condition="{hasConfigurationFromEnvironment}">
<div id="configurationFromEnvironment" class="t3-install-driver-data" hidden>
</div>
</f:if>
<div class="text-end">
<button type="submit" class="btn btn-primary t3js-installer-databaseConnect-execute">
Continue
</button>
</div>
</form>
</f:then>
<f:else>
<div class="t3js-message alert alert-danger" role="alert">
<h4 class="alert-title">No database driver found</h4>
<p class="alert-message">You have no database driver installed or enabled. Please install a driver in order to complete the database connection.</p>
</div>
</f:else>
</f:if>
</div>
</div>
</html>
@@ -0,0 +1,91 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="t3js-module-content" data-installer-database-data-execute-token="{executeDatabaseDataToken}">
<div class="typo3-install-content-body">
<h2>Create administrative user and specify site name</h2>
<p>
Use this account to log into the backend of your site.<br>
The password you provide for this account is also used to access the <strong>Install Tool</strong>.
</p>
<p>On this page you can also set a name for your new website.</p>
<div class="typo3-install-content-spacer"></div>
<div class="t3js-installer-databaseData-output"></div>
<div class="typo3-install-content-spacer"></div>
<form method="post" id="stepInstaller-databaseData" class="t3-install-form-label-before" spellcheck="false">
<input type="hidden" value="execute" name="install[set]" />
<div class="form-group">
<label for="username" class="form-label">Username</label>
<input
class="t3-install-form-input-text form-control"
name="install[values][username]"
id="username"
placeholder="admin"
autocomplete="off"
/>
</div>
<div class="form-group" style="position:relative">
<label for="password" class="form-label">Password</label>
<input
class="t3-install-form-input-text t3-install-form-password-strength form-control"
name="install[values][password]"
id="password"
type="password"
autocomplete="off"
placeholder="random password"
/>
<f:comment><!-- @todo: Add API for input group addons in floating forms--></f:comment>
<button
type="button"
class="t3-install-form-password-toggle btn btn-link"
data-toggle-target="#password" data-toggle-state="invisible"
style="position:absolute;bottom:.65em;right:.8em;outline:none;box-shadow:none"
aria-label="Toggle password visibility"
>
<core:icon identifier="actions-lock" size="small" />
<core:icon identifier="actions-eye" size="small" />
</button>
</div>
<f:be.infobox
title="Password security"
state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}"
>
If compromised, this account will provide an attacker with complete access to your installation.<br>
A strong password is recommended. Include lower and upper case characters, special characters and numbers. Your password must be at least eight characters long.
</f:be.infobox>
<div class="form-group">
<label for="email" class="form-label">Email address</label>
<input
type="email"
class="t3-install-form-input-text form-control"
name="install[values][email]"
id="email"
placeholder="you@me.com"
/>
</div>
<div class="form-group">
<label for="sitename" class="form-label">Site name</label>
<input
class="t3-install-form-input-text form-control"
name="install[values][sitename]"
id="sitename"
type="text"
value="{siteName}"
placeholder="Your new website"
/>
</div>
<div class="text-end">
<button type="submit" class="btn btn-primary t3js-installer-databaseData-execute">
Continue
</button>
</div>
</form>
</div>
</div>
</html>
@@ -0,0 +1,97 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="t3js-module-content" data-installer-database-select-execute-token="{executeDatabaseSelectToken}" data-installer-database-check-requirements-execute-token="{executeCheckDatabaseRequirementsToken}">
<div class="typo3-install-content-body">
<h2>Select a database</h2>
<div class="typo3-install-content-spacer"></div>
<div class="t3js-installer-databaseSelect-output"></div>
<div class="typo3-install-content-spacer"></div>
<f:if condition="{errors -> f:count()}">
<f:for each="{errors}" as="error">
<f:be.infobox
title="Exception"
state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::ERROR')}"
>
{error}
</f:be.infobox>
</f:for>
</f:if>
<form method="post" id="stepInstaller-databaseSelect" spellcheck="false">
<div class="form-group">
<div class="form-check">
<input
id="t3-install-form-db-select-type-existing"
type="radio"
name="install[values][type]"
value="existing"
checked="checked"
class="form-check-input"
/>
<label class="form-check-label" for="t3-install-form-db-select-type-existing">
Use an existing empty database:
</label>
</div>
<div class="form-group">
<label class="form-label" for="t3-install-step-database-existing">
Select a database
</label>
<select
id="t3-install-step-database-existing"
name="install[values][existing]"
class="form-select"
onfocus="document.getElementById('t3-install-form-db-select-type-existing').checked=true;"
>
<option value="">-- Choose --</option>
<f:for each="{databaseList}" as="database">
<f:if condition="{database.tables} || {database.readonly}">
<f:then>
<option value="{database.name}" disabled="disabled">{database.name} ({f:if(condition: database.readonly, then: 'readonly', else: '{database.tables} Tables')})</option>
</f:then>
<f:else>
<option value="{database.name}">{database.name}</option>
</f:else>
</f:if>
</f:for>
</select>
</div>
</div>
<div class="form-group">
<div class="form-check">
<input
id="t3-install-form-db-select-type-new"
type="radio"
name="install[values][type]"
value="new"
class="form-check-input"
/>
<label class="form-check-label" for="t3-install-form-db-select-type-new">
Create a new database:
</label>
</div>
<div class="form-group">
<label class="form-label" for="t3-install-step-database-new">
Specify a name for your TYPO3 database
</label>
<input
id="t3-install-step-database-new"
class="t3-install-form-input-text form-control"
type="text"
name="install[values][new]"
checked="checked"
onfocus="document.getElementById('t3-install-form-db-select-type-new').checked=true;"
/>
</div>
</div>
<div class="text-end">
<button type="submit" class="btn btn-primary t3js-installer-databaseSelect-execute">
Continue
</button>
</div>
</form>
</div>
</div>
</html>
@@ -0,0 +1,116 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="t3js-module-content" data-installer-default-configuration-execute-token="{executeDefaultConfigurationToken}">
<div class="typo3-install-content-body">
<h2>Installation complete</h2>
<div class="typo3-install-content-spacer"></div>
<div class="t3js-installer-defaultConfiguration-output"></div>
<div class="typo3-install-content-spacer"></div>
<h3>Initial site setup</h3>
<p>
Your TYPO3 installation is ready. You can now set up your first website.
</p>
<form method="post" spellcheck="false">
<f:if condition="{distributions.active}">
<f:then>
<div class="panel panel-default">
<h3 class="panel-heading">Active distributions</h3>
<div class="panel-body">
<p>
These pre-configured distribution will have their demo content, pages, and site configuration being imported.
</p>
<ul>
<f:for each="{distributions.active}" as="distribution">
<li>
<strong>{distribution.title}</strong>
<f:if condition="{distribution.description}">
<br /><small>{distribution.description}</small>
</f:if>
</li>
</f:for>
</ul>
</div>
</div>
</f:then>
<f:else>
<f:if condition="{distributions.inactive}">
<div class="panel panel-default">
<h3 class="panel-heading">Available distributions</h3>
<div class="panel-body">
<p>
Import a pre-configured distribution with demo content, pages, and site configuration.
</p>
<f:for each="{distributions.inactive}" as="distribution" iteration="iterator">
<div class="form-check">
<input class="form-check-input" type="radio" id="create-site-{distribution.packageKey}" name="install[values][sitesetup]" value="createsite:{distribution.packageKey}"{f:if(condition: iterator.isFirst, then: ' checked="checked"')} />
<label class="form-check-label" for="create-site-{distribution.packageKey}">
<strong>{distribution.title}</strong>
<f:if condition="{distribution.description}">
<br /><small>{distribution.description}</small>
</f:if>
</label>
</div>
</f:for>
</div>
</div>
</f:if>
<div class="panel panel-default">
<h3 class="panel-heading">Other options</h3>
<div class="panel-body">
<f:if condition="!{composerMode}">
<div class="form-check">
<input class="form-check-input" type="radio" id="load-distributions" name="install[values][sitesetup]" value="loaddistribution" />
<label class="form-check-label" for="load-distributions">
<strong>Browse all distributions</strong>
<br /><small>View a list of available distributions after login</small>
</label>
</div>
</f:if>
<f:if condition="{offerToCreateBasicSite}">
<div class="form-check">
<input class="form-check-input" type="radio" id="create-site" name="install[values][sitesetup]" value="createsite"{f:if(condition: '{distributions.inactive -> f:count()} === 0', then: ' checked="checked"')} />
<label class="form-check-label" for="create-site">
<strong>Create a basic starter website</strong>
<br /><small>Set up a root page, site configuration and basic content rendering</small>
</label>
</div>
</f:if>
<div class="form-check">
<input class="form-check-input" type="radio" id="do-nothing" name="install[values][sitesetup]" value="donothing" />
<label class="form-check-label" for="do-nothing">
<strong>Skip setup</strong>
<br /><small>Do nothing, take me straight to the backend</small>
</label>
</div>
</div>
</div>
</f:else>
</f:if>
<div class="panel panel-default">
<h3 class="panel-heading">Pre-configured backend user groups</h3>
<div class="panel-body">
<div class="form-check form-check-type-toggle">
<input class="form-check-input" type="checkbox" id="create-groups" name="install[values][backendgroups]" value="creategroups" />
<label class="form-check-label" for="create-groups">
<strong>Create default backend user groups</strong>
<br /><small>Pre-configured "Editor" and "Advanced Editor" groups, ready to use</small>
</label>
</div>
</div>
</div>
<div class="text-end">
<button type="submit" class="btn btn-primary t3js-installer-defaultConfiguration-execute">
Finish installation
</button>
</div>
</form>
</div>
</div>
</html>
@@ -0,0 +1,36 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="typo3-install-content-body">
<h2>Environment Overview</h2>
<p>First the Install Wizard needs to inspect your web server and identify any issues that may prevent TYPO3 from running correctly.</p>
<div class="t3js-installer-environment-details" hidden>
<h3>Problems Detected</h3>
</div>
<div class="row justify-content-between">
<form class="col-auto t3js-installer-environmentFolders-bad" hidden>
<div class="typo3-install-content-spacer-small">
<button type="submit" class="btn btn-default t3js-installer-environmentFolders-retry">
Scan environment again
</button>
</div>
</form>
<form class="col-auto t3js-installer-environmentFolders-bad" hidden>
<div class="typo3-install-content-spacer-small">
<button type="submit" class="btn btn-danger t3js-installer-environmentFolders-execute float-end">
Continue with errors
</button>
</div>
</form>
<form class="col-auto t3js-installer-environmentFolders-good" hidden>
<div class="typo3-install-content-spacer-small">
<button type="submit" class="btn btn-success t3js-installer-environmentFolders-execute float-end">
No problems detected, continue with installation
</button>
</div>
</form>
</div>
</div>
</html>
@@ -0,0 +1,19 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="typo3-install-content-body">
<h2>Thank you for choosing TYPO3</h2>
<p>The Installation Wizard will guide you through the necessary steps required to install TYPO3 on your web server.</p>
<p>To begin the installation, create an empty file called
<code>FIRST_INSTALL</code> in the document root of your web server.</p>
<p class="text-variant">
<strong>Please note:</strong>
The filename is case-sensitive, and it will be deleted once the installation process is complete.
</p>
<f:be.infobox title="New to TYPO3?" state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}">
We recommend reading the
<a href="https://docs.typo3.org/Home/GettingStarted.html" target="_blank" rel="noreferrer"><u>Getting Started Documentation</u></a>.
</f:be.infobox>
</div>
</html>
@@ -0,0 +1,22 @@
<!DOCTYPE html>
<html lang="en"
{f:if(condition: colorScheme, then: ' data-color-scheme="{colorScheme}"')}{f:if(condition: theme, then: ' data-theme="{theme}"')}
data-icon-cache-identifier="{iconCacheIdentifier}"
>
<head>
<title>Install Tool on site {siteName}</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" href="{f:uri.resource(path: 'EXT:backend/Resources/Public/Css/backend.css')}?{bust}" />
<link rel="stylesheet" href="{f:uri.resource(path: 'EXT:backend/Resources/Public/Css/webfonts.css')}?{bust}" />
<link rel="icon" type="image/vnd.microsoft.icon" href="{f:uri.resource(path: 'EXT:install/Resources/Public/Icons/favicon.ico')}?{bust}" />
{importmap->f:format.raw()}
<script type="module" src="{initModule}"></script>
</head>
<body class="t3js-body" data-controller="{controller}" data-context="{context}">
<div id="t3js-ui-block" class="ui-block">
<core:icon identifier="spinner-circle" size="large" />
<h2 id="t3js-ui-block-detail">Initializing</h2>
</div>
</body>
</html>
@@ -0,0 +1,174 @@
<html
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:if condition="{context} == 'backend'">
<f:then>
<div class="module module-layout-normal" data-module-id="" data-module-name="{moduleName}">
<div class="module-docheader module-docheader-navigation t3js-module-docheader-navigation">
<div class="module-docheader-column module-docheader-column-breadcrumb"></div>
<div class="module-docheader-column"></div>
</div>
<div class="module-body t3js-module-body">
<div class="module-body-container t3js-module-body-container">
<div id="t3js-ui-block" class="ui-block">
<core:icon identifier="spinner-circle" size="large" />
<h2 id="t3js-ui-block-detail">Loading cards</h2>
</div>
</div>
</div>
</div>
</f:then>
<f:else>
<div class="scaffold t3js-scaffold">
<div class="scaffold-header t3js-scaffold-header">
<div class="scaffold-topbar t3js-scaffold-topbar">
<div class="topbar t3js-topbar">
<typo3-backend-sidebar-toggle
class="topbar-button topbar-button-modulemenu"
label-collapse="Collapse sidebar"
label-expand="Expand sidebar"
></typo3-backend-sidebar-toggle>
<a class="topbar-site" href="" target="_top" title="TYPO3.CMS">
<span class="topbar-site-logo">
<img src="{f:uri.resource(path: 'EXT:install/Resources/Public/Images/typo3_logo_orange.svg')}" width="22" height="22" title="TYPO3 Content Management System" alt="TYPO3 Content Management System">
</span>
<span class="topbar-site-title">
<span class="topbar-site-name">Install Tool<f:if condition="{siteName}"> on site: {siteName}</f:if></span>
<span class="topbar-site-version">TYPO3 CMS {currentTypo3Version}</span>
</span>
</a>
</div>
</div>
</div>
<div class="scaffold-sidebar t3js-scaffold-sidebar">
<div class="sidebar-container">
<div class="sidebar-component">
<div class="modulemenu t3js-modulemenu" role="menubar" data-role="modulemenu" id="modulemenu">
<ul class="modulemenu-group-container">
<li data-level="1">
<a
href="?__typo3_install&{f:format.urlencode(value: 'install[controller]')}=maintenance"
title="Maintenance"
class="modulemenu-action"
role="menuitem"
data-installroute-controller="maintenance"
>
<span class="modulemenu-icon" aria-hidden="true"><core:icon identifier="module-install-maintenance" size="medium" alternativeMarkupIdentifier="inline"/></span>
<span class="modulemenu-name">Maintenance</span>
<span class="modulemenu-indicator" aria-hidden="true"></span>
</a>
</li>
<li data-level="1">
<a
href="?__typo3_install&{f:format.urlencode(value: 'install[controller]')}=settings"
title="Settings"
class="modulemenu-action"
role="menuitem"
data-installroute-controller="settings"
>
<span class="modulemenu-icon" aria-hidden="true"><core:icon identifier="module-install-settings" size="medium" alternativeMarkupIdentifier="inline"/></span>
<span class="modulemenu-name">Settings</span>
<span class="modulemenu-indicator" aria-hidden="true"></span>
</a>
</li>
<li data-level="1">
<a
href="?__typo3_install&{f:format.urlencode(value: 'install[controller]')}=upgrade"
title="Upgrade"
class="modulemenu-action"
role="menuitem"
data-installroute-controller="upgrade"
>
<span class="modulemenu-icon" aria-hidden="true"><core:icon identifier="module-install-upgrade" size="medium" alternativeMarkupIdentifier="inline"/></span>
<span class="modulemenu-name">Upgrade</span>
<span class="modulemenu-indicator" aria-hidden="true"></span>
</a>
</li>
<li data-level="1">
<a
href="?__typo3_install&{f:format.urlencode(value: 'install[controller]')}=environment"
title="Environment"
class="modulemenu-action"
role="menuitem"
data-installroute-controller="environment"
>
<span class="modulemenu-icon" aria-hidden="true"><core:icon identifier="module-install-environment" size="medium" alternativeMarkupIdentifier="inline"/></span>
<span class="modulemenu-name">Environment</span>
<span class="modulemenu-indicator" aria-hidden="true"></span>
</a>
</li>
<li class="modulemenu-group-spacer"></li>
<li data-level="1">
<a
href="{backendUrl}"
title="Switch to Backend"
class="modulemenu-action"
role="menuitem"
>
<span class="modulemenu-icon" aria-hidden="true"><core:icon identifier="module-web" size="medium" alternativeMarkupIdentifier="inline"/></span>
<span class="modulemenu-name">Switch to Backend</span>
<span class="modulemenu-indicator" aria-hidden="true"></span>
</a>
</li>
<li data-level="1">
<a
href="{frontendUrl}"
title="Switch to Frontend"
class="modulemenu-action"
role="menuitem"
>
<span class="modulemenu-icon" aria-hidden="true"><core:icon identifier="module-site" size="medium" alternativeMarkupIdentifier="inline"/></span>
<span class="modulemenu-name">Switch to Frontend</span>
<span class="modulemenu-indicator" aria-hidden="true"></span>
</a>
</li>
<li class="modulemenu-group-spacer"></li>
<li data-level="1">
<a
title="Logout"
class="modulemenu-action t3js-login-lockInstallTool"
role="menuitem"
id="logout"
href=""
>
<span class="modulemenu-icon" aria-hidden="true"><core:icon identifier="actions-logout" alternativeMarkupIdentifier="inline"/></span>
<span class="modulemenu-name">Logout</span>
<span class="modulemenu-indicator" aria-hidden="true"></span>
</a>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="scaffold-content t3js-scaffold-content">
<div class="scaffold-content-module t3js-scaffold-content-module">
<div class="module">
<div class="module-body t3js-module-body">
<div class="module-body-container t3js-module-body-container">
<div id="t3js-ui-block" class="ui-block">
<core:icon identifier="spinner-circle" size="large" />
<h2 id="t3js-ui-block-detail">Loading cards</h2>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="scaffold-overlay"></div>
</div>
</f:else>
</f:if>
</html>
@@ -0,0 +1,43 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="typo3-install-container">
<div class="typo3-install-content">
<div class="typo3-install-content-header">
<img src="{f:uri.resource(path: 'EXT:core/Resources/Public/Images/typo3_light_dark.svg')}" width="130" class="logo" alt="TYPO3 logo" />
<h1>The Install Tool is locked</h1>
</div>
<div class="typo3-install-content-body">
<div class="callout callout-warning">
<div class="callout-content">
<div class="callout-title">The Install Tool is locked</div>
<div class="callout-body">
<ul>
<li>
<strong>If you are installing TYPO3</strong>, please create the file
<code>FIRST_INSTALL</code> in the document root of your web server.
New to TYPO3? We recommend reading the
<a href="https://docs.typo3.org/permalink/t3start:start" target="_blank" rel="noreferrer"><u>Getting Started Documentation</u></a>.
</li>
<li>
<strong>For an existing TYPO3 installation</strong>, please create the file
<code>ENABLE_INSTALL_TOOL</code> in the directory <code>{enableInstallToolPath}</code>.
</li>
</ul>
<p>
Either file must be writable by the web server user.
The filename is case-sensitive. The file can be empty.
</p>
<p>
<strong>Security note:</strong>
When you are finished with your task, you should rename or delete any <code>FIRST_INSTALL</code>
and <code>ENABLE_INSTALL_TOOL</code> files. They will automatically be deleted if you log out of
the Install Tool or if the file is older than one hour.
</p>
</div>
</div>
</div>
</div>
</div>
</div>
</html>
@@ -0,0 +1,73 @@
<html xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers" xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:i="http://typo3.org/ns/TYPO3/CMS/Install/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="typo3-install-container">
<div class="typo3-install-content">
<div class="typo3-install-content-header">
<img src="{f:uri.resource(path: 'EXT:core/Resources/Public/Images/typo3_light_dark.svg')}" width="130" class="logo" alt="TYPO3 logo" />
<h1>Login to TYPO3 Install Tool</h1>
<f:if condition="{siteName}"><p>Site: {siteName}</p></f:if>
</div>
<div class="typo3-install-content-body">
<form method="post" id="t3-install-form-login" data-login-token="{loginToken}" spellcheck="false">
<div class="form-group">
<label class="form-label" for="t3-install-form-password">Password</label>
<input class="form-control t3-install-form-input-text" id="t3-install-form-password" type="password" name="install[password]" autofocus="autofocus" />
</div>
<div class="form-group">
<button type="button" class="btn btn-primary t3js-login-login">
Login
</button>
<f:if condition="!{installToolEnableFilePermanent}">
<button type="button" class="btn btn-default t3js-login-lockInstallTool">
<core:icon identifier="actions-lock" size="small" /> Lock Install Tool again
</button>
</f:if>
</div>
</form>
<div class="t3js-login-output"></div>
<f:if condition="{installToolEnableFilePermanent}">
<div class="callout callout-danger">
<div class="callout-content">
<div class="callout-title">Install Tool is permanently enabled</div>
<div class="callout-body">
The Install Tool is permanently enabled because our <code>ENABLE_INSTALL_TOOL</code> file contains
the text <em>KEEP_FILE</em>. <strong>Never use this on production systems!</strong>
</div>
</div>
</div>
</f:if>
<div class="callout callout-info">
<div class="callout-content">
<div class="callout-title">Information</div>
<div class="callout-body">
By default the Install Tool password is the one specified during the installation.
</div>
</div>
</div>
<div class="callout callout-warning">
<div class="callout-content">
<div class="callout-title">Important</div>
<div class="callout-body">
If you don't know the current password, you can set a new one by setting the value of
<code>$GLOBALS['TYPO3_CONF_VARS']['BE']['installToolPassword']</code> in <code>{configFile}</code> to
the hash value of the password you desire, which will be shown if you enter the desired password
in this form and submit it.
<br /><br />
You can also use the <code>bin/typo3 install:password:set</code> command to set this password via
the command line interface (CLI).
<br /><br />
This password gives an attacker full control over your instance if cracked. It should be strong
(include lower and upper case characters, special characters and numbers) and at least eight characters long.
</div>
</div>
</div>
</div>
</div>
</div>
</html>
@@ -0,0 +1,99 @@
<f:layout name="Cards"/>
<f:section name="headline">
<h1>Maintenance</h1>
</f:section>
<f:section name="cards">
<div class="card card-size-small">
<f:render partial="Card/Header" arguments="{ title: 'Flush TYPO3 and PHP Cache', subtitle: 'Caching', icon: 'EXT:install/Resources/Public/Icons/modules/install-clear-cache.svg'}" />
<div class="card-body">
<p class="card-text">Clear all registered TYPO3 caches, including opcode and dependency injection cache.</p>
</div>
<div class="card-footer">
<button type="button" class="btn btn-default" data-inline="1" data-import="@typo3/install/module/maintenance/cache.js">Flush cache</button>
</div>
</div>
<div class="card card-size-small">
<f:render partial="Card/Header" arguments="{ title: 'Analyze Database Structure', subtitle: 'Database', icon: 'EXT:install/Resources/Public/Icons/modules/install-database-analyze.svg'}" />
<div class="card-body">
<p class="card-text">Compare and update the database table and field definitions of your installation against the specification defined for activated extension.</p>
</div>
<div class="card-footer">
<button type="button" class="btn btn-default" data-import="@typo3/install/module/maintenance/database-analyzer.js">Analyze database&hellip;</button>
</div>
</div>
<div class="card card-size-small">
<f:render partial="Card/Header" arguments="{ title: 'Remove Temporary Assets', subtitle: 'Caching', icon: 'EXT:install/Resources/Public/Icons/modules/install-clear-files.svg'}" />
<div class="card-body">
<p class="card-text">Clear temporary files including concatenated JS/CSS files and processed images.</p>
</div>
<div class="card-footer">
<button type="button" class="btn btn-default" data-import="@typo3/install/module/maintenance/clear-typo3temp-files.js">Scan temporary files&hellip;</button>
</div>
</div>
<div class="card card-size-small {f:if(condition:'{composerMode}', then: 'card-disabled')}">
<f:render partial="Card/Header" arguments="{ title: 'Rebuild PHP Autoload Information', subtitle: 'Caching', icon: 'EXT:install/Resources/Public/Icons/modules/install-clear-autoload.svg'}" />
<div class="card-body">
<p class="card-text">Reset autoload information for active third party extensions.</p>
</div>
<f:if condition="{composerMode}">
<f:then>
<div class="card-footer text-variant">
This feature is unavailable because the installation is running in Composer mode.
Guide: <a href="https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/Autoloading/Index.html#loading-classes-with-composer-mode" target="_blank" rel="noreferrer">Composer dumpautoload</a>.
</div>
</f:then>
<f:else>
<div class="card-footer">
<button type="button" class="btn btn-default" data-inline="1" data-import="@typo3/install/module/maintenance/dump-autoload.js">Dump autoload</button>
</div>
</f:else>
</f:if>
</div>
<div class="card card-size-small">
<f:render partial="Card/Header" arguments="{ title: 'Clear Persistent Database Tables', subtitle: 'Database', icon: 'EXT:install/Resources/Public/Icons/modules/install-clear-database.svg'}" />
<div class="card-body">
<p class="card-text">Truncate persistent database tables which are not related to caching.</p>
</div>
<div class="card-footer">
<button type="button" class="btn btn-default" data-import="@typo3/install/module/maintenance/clear-tables.js">Scan tables&hellip;</button>
</div>
</div>
<div class="card card-size-small">
<f:render partial="Card/Header" arguments="{ title: 'Check and Update Reference Index', subtitle: 'Database', icon: 'EXT:install/Resources/Public/Icons/modules/install-database-analyze.svg'}" />
<div class="card-body">
<p class="card-text">Verify the reference index for inconsistencies or rebuild it to update database relations.</p>
</div>
<div class="card-footer">
<button type="button" class="btn btn-default" data-import="@typo3/install/module/maintenance/reference-index.js">Manage reference index&hellip;</button>
</div>
</div>
<div class="card card-size-small">
<f:render partial="Card/Header" arguments="{ title: 'Create Administrative User', subtitle: 'Backend Users', icon: 'EXT:install/Resources/Public/Icons/modules/install-create-admin.svg'}" />
<div class="card-body">
<p class="card-text">Create new administrative users and grant them system maintainer privileges (optional).</p>
</div>
<div class="card-footer">
<button type="button" class="btn btn-default" data-modal-size="small" data-import="@typo3/install/module/maintenance/create-admin.js">Create Administrator&hellip;</button>
</div>
</div>
<div class="card card-size-small">
<f:render partial="Card/Header" arguments="{ title: 'Reset Backend User Preferences', subtitle: 'Backend Users', icon: 'EXT:install/Resources/Public/Icons/modules/install-reset-user.svg'}" />
<div class="card-body">
<p class="card-text">Clear preferences and settings for all backend users. This action permanently deletes all user-specific data in the database table <code>be_users</code>.</p>
</div>
<div class="card-footer">
<button type="button" class="btn btn-default" data-inline="1" data-import="@typo3/install/module/maintenance/reset-backend-user-uc.js">Reset backend user preferences</button>
</div>
</div>
<div class="card card-size-small">
<f:render partial="Card/Header" arguments="{ title: 'Manage Language Packs', subtitle: 'Language', icon: 'EXT:install/Resources/Public/Icons/modules/install-manage-language.svg'}" />
<div class="card-body">
<p class="card-text">Download and update language packs for installed extensions and the TYPO3 backend.</p>
</div>
<div class="card-footer">
<button type="button" class="btn btn-default" data-import="@typo3/install/module/maintenance/language-packs.js">Manage languages&hellip;</button>
</div>
</div>
</f:section>
@@ -0,0 +1,35 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<p>
Clear semi-temporary data stored in persistent database tables that are not affected by the
<strong>"Clear All Cache"</strong> action.
</p>
<p>
This removes all records from the selected tables and may be useful in specific maintenance scenarios.
</p>
<p>
<strong>Use with caution.</strong> Clearing these tables can affect site functionality, for example by logging out users,
removing session or basket data, and deleting log information.
</p>
<div class="t3js-module-content" data-clear-tables-clear-token="{clearTablesClearToken}">
<div class="module-action-list t3js-clearTables-stat-container"></div>
</div>
<template id="t3js-clearTables-stat-template">
<div class="module-action-item">
<div class="module-action-item-body">
<div class="module-action-item-title t3js-clearTables-stat-description">{clearTableStatistic.description}</div>
<div class="module-action-item-description">
<strong class="t3js-clearTables-stat-rows"></strong> row(s) found in table <code class="t3js-clearTables-stat-name"></code>
</div>
</div>
<div class="module-action-item-action">
<button type="button" class="btn btn-default btn-sm t3js-clearTables-clear">
<core:icon identifier="actions-delete" size="small" /> Delete rows
</button>
</div>
</div>
</template>
</html>
@@ -0,0 +1,36 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<p>
Remove processed files and cached images stored by TYPO3 to free up disk space.
</p>
<p>
TYPO3 stores processed files (such as image variants and thumbnails) in a dedicated directory
that can grow quickly over time.<br>
Use this action to delete these files. Afterward, clear the cache database tables to ensure consistency.
</p>
<p>
The File Abstraction Layer (FAL) also keeps database records for processed files. If image processing settings
have changed (see <strong>System → Settings → Configure Installation-Wide Options → [GFX]</strong>),
removing processed files forces them to be regenerated with the updated configuration.
</p>
<div class="t3js-module-content" data-clear-typo3temp-delete-token="{clearTypo3tempFilesToken}">
<div class="module-action-list t3js-clearTypo3temp-stat-container"></div>
</div>
<template id="t3js-clearTypo3temp-stat-template">
<div class="module-action-item">
<div class="module-action-item-body">
<div class="module-action-item-description">
<strong class="t3js-clearTypo3temp-stat-directory"></strong> contains <output class="t3js-clearTypo3temp-stat-numberOfFiles"></output> files
</div>
</div>
<div class="module-action-item-action">
<button type="button" class="btn btn-default btn-sm t3js-clearTypo3temp-delete">
<core:icon identifier="actions-delete" size="small" /> Delete files
</button>
</div>
</div>
</template>
</html>
@@ -0,0 +1,78 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="t3js-module-content" data-create-admin-token="{createAdminToken}">
<form action="" id="t3js-createAdmin-form" method="post" spellcheck="false">
<div class="form-group">
<label for="t3-install-admin-username" class="form-label">Username:</label>
<input
id="t3-install-admin-username"
class="t3-install-form-input-text t3js-createAdmin-user form-control"
type="text"
autocomplete="off"
required
/>
</div>
<div class="form-group">
<label for="t3-install-admin-password" class="form-label">Password:</label>
<input
id="t3-install-admin-password"
class="t3-install-form-input-text t3-install-form-password-strength t3js-createAdmin-password form-control"
type="password"
autocomplete="off"
required
/>
<f:if condition="{passwordPolicyRequirements}">
<p class="mt-2 mb-1 text-variant">Password must match the following requirements:</p>
<ul>
<f:for each="{passwordPolicyRequirements}" as="requirement">
<li class="text-variant">{requirement}</li>
</f:for>
</ul>
</f:if>
</div>
<div class="form-group">
<label for="t3-install-admin-password-repeat" class="form-label">Repeat password:</label>
<input
id="t3-install-admin-password-repeat"
class="t3-install-form-input-text t3js-createAdmin-password-check form-control"
type="password"
autocomplete="off"
required
/>
</div>
<div class="form-group">
<label for="t3-install-admin-realname" class="form-label">Name</label>
<input
type="text"
class="t3-install-form-input-text t3js-createAdmin-realname form-control"
name="realName"
id="t3-install-admin-realname"
/>
</div>
<div class="form-group">
<label for="t3-install-admin-email" class="form-label">Email address</label>
<input
type="email"
class="t3-install-form-input-text t3js-createAdmin-email form-control"
name="email"
id="t3-install-admin-email"
/>
</div>
<div class="form-group">
<div class="form-check">
<input
class="t3-install-form-input-checkbox t3js-createAdmin-system-maintainer form-check-input"
type="checkbox"
id="typo3-install-admin-add-as-system-maintainer"
/>
<label for="typo3-install-admin-add-as-system-maintainer" class="form-check-label">
Add as system maintainer
</label>
</div>
</div>
<div class="t3js-createAdmin-output"></div>
</form>
</div>
</html>
@@ -0,0 +1,55 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<p>
Compare the current database structure with the definitions provided by all loaded extensions
(<code>ext_tables.sql</code>).<br>
Apply suggested changes to update, modify, or remove tables and fields as needed.
</p>
<div class="t3js-databaseAnalyzer-notification"></div>
<div class="t3js-module-content" data-database-analyzer-execute-token="{databaseAnalyzerExecuteToken}">
<div class="t3js-databaseAnalyzer-output"></div>
</div>
<template id="t3js-databaseAnalyzer-suggestion-block">
<fieldset>
<h4 class="t3js-databaseAnalyzer-suggestion-block-legend"></h4>
<ol class="list-unstyled t3js-databaseAnalyzer-suggestion-list">
<li class="t3-install-form-label-after">
<div class="form-check">
<input
type="checkbox"
class="form-check-input t3js-databaseAnalyzer-suggestion-block-checkbox"
/>
<label class="form-check-label t3js-databaseAnalyzer-suggestion-block-label">select/deselect all</label>
</div>
</li>
</ol>
</fieldset>
</template>
<template id="t3js-databaseAnalyzer-suggestion-line-template">
<li class="t3js-databaseAnalyzer-suggestion-line t3-install-form-label-after">
<div class="form-check">
<input
type="checkbox"
class="form-check-input t3js-databaseAnalyzer-suggestion-line-checkbox"
value="1"
/>
<label class="form-check-label t3js-databaseAnalyzer-suggestion-line-label">
<span class="t3js-databaseAnalyzer-suggestion-line-statement"></span>
<span class="t3js-databaseAnalyzer-suggestion-line-current" style="display:none;">
<br>
Current value: <span class="t3js-databaseAnalyzer-suggestion-line-current-value"></span>
</span>
<span class="t3js-databaseAnalyzer-suggestion-line-count" style="display:none;">
<br>
Rows in table: <span class="t3js-databaseAnalyzer-suggestion-line-count-value"></span>
</span>
</label>
</div>
</li>
</template>
</html>
@@ -0,0 +1,33 @@
<html xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers" data-namespace-typo3-fluid="true">
<div
class="t3js-module-content"
data-language-packs-activate-language-token="{languagePacksActivateLanguageToken}"
data-language-packs-deactivate-language-token="{languagePacksDeactivateLanguageToken}"
data-language-packs-update-pack-token="{languagePacksUpdatePackToken}"
data-language-packs-update-iso-times-token="{languagePacksUpdateIsoTimesToken}"
data-configuration-is-writable="{f:if(condition: isWritable, then: 'true', else: 'false')}"
>
<p>
Manage available language packs for your TYPO3 installation.
</p>
<p>
View available languages (excluding the default English), enable or disable localizations, and update language packs
from the <a target="_blank" rel="noreferrer" href="https://localize.typo3.org/xliff/status.html">
<u>TYPO3 translation server</u></a>.
</p>
<p>
Missing or incorrect translations can be improved by contributing through
<a target="_blank" rel="noreferrer" href="https://crowdin.com/profile/TYPO3">
<u>Crowdin</u></a>. See the <a target="_blank" rel="noreferrer" href="https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/Localization/TranslationServer/Crowdin.html">
<u>TYPO3 documentation</u></a> for details.
</p>
<f:render partial="Generic/ConfigurationNotWritable" arguments="{_all}"/>
<div class="t3js-languagePacks-notifications"></div>
<div class="t3js-languagePacks-output"></div>
<div class="t3js-languagePacks-mainContent"></div>
</div>
</html>
@@ -0,0 +1,31 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<p>
Check and update the reference index, which tracks relations between database records in TYPO3.<br>
Use this tool to verify the integrity of existing references or to rebuild the index to ensure all relations are correctly recorded.
</p>
<p>
<strong>Check:</strong> Verifies the reference index and reports issues without making changes.<br>
<strong>Update:</strong> Rebuilds the entire reference index. This may take some time on large installations.
</p>
<div class="t3js-module-content mb-4" data-reference-index-token="{referenceIndexToken}">
<div class="t3js-referenceIndex-result"></div>
</div>
<f:be.infobox
title="Using the command line interface"
state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}"
>
<p>You can also run the check as a shell script using CLI if the processing takes longer than the PHP max_execution_time allows.</p>
<p>
To check the reference index use:<br>
<code>php {binaryPath} referenceindex:update -c</code>
</p>
<p>
To update the reference index use:<br>
<code>php {binaryPath} referenceindex:update</code>
</p>
</f:be.infobox>
</html>
@@ -0,0 +1,66 @@
<f:layout name="Cards"/>
<f:section name="headline">
<h1>Settings</h1>
</f:section>
<f:section name="header">
<f:render partial="Generic/ConfigurationNotWritable" arguments="{_all}"/>
</f:section>
<f:section name="cards">
<div class="card card-size-small">
<f:render partial="Card/Header" arguments="{ title: 'Extension Configuration', subtitle: 'Global Configuration', icon: 'EXT:install/Resources/Public/Icons/modules/install-extension-settings.svg'}" />
<div class="card-body">
<p class="card-text">Configure settings for enabled extensions.</p>
</div>
<div class="card-footer">
<button type="button" class="btn btn-default" data-import="@typo3/install/module/settings/extension-configuration.js">Configure extensions&hellip;</button>
</div>
</div>
<div class="card card-size-small">
<f:render partial="Card/Header" arguments="{ title: 'Change Install Tool Password', subtitle: 'Access', icon: 'EXT:install/Resources/Public/Icons/modules/install-password.svg'}" />
<div class="card-body">
<p class="card-text">Set a new password for the Install Tool when accessed in Standalone mode.</p>
</div>
<div class="card-footer">
<button type="button" class="btn btn-default" data-modal-size="small" data-import="@typo3/install/module/settings/change-install-tool-password.js">Change Install Tool Password&hellip;</button>
</div>
</div>
<div class="card card-size-small">
<f:render partial="Card/Header" arguments="{ title: 'Manage System Maintainers', subtitle: 'Access', icon: 'EXT:install/Resources/Public/Icons/modules/install-manage-maintainer.svg'}" />
<div class="card-body">
<p class="card-text">Specify which backend administrators can access System modules and the Install Tool in Standalone Mode.</p>
</div>
<div class="card-footer">
<button type="button" class="btn btn-default" data-modal-size="medium" data-import="@typo3/install/module/settings/system-maintainer.js">Manage System Maintainers&hellip;</button>
</div>
</div>
<div class="card card-size-small">
<f:render partial="Card/Header" arguments="{ title: 'Configuration Presets', subtitle: 'Global Configuration', icon: 'EXT:install/Resources/Public/Icons/modules/install-manage-presets.svg'}" />
<div class="card-body">
<p class="card-text">Configure image processing, debug/live mode and mail settings.</p>
</div>
<div class="card-footer">
<button type="button" class="btn btn-default" data-import="@typo3/install/module/settings/presets.js">Choose Preset&hellip;</button>
</div>
</div>
<div class="card card-size-small">
<f:render partial="Card/Header" arguments="{ title: 'Feature Toggles', subtitle: 'Global Configuration', icon: 'EXT:install/Resources/Public/Icons/modules/install-manage-features.svg'}" />
<div class="card-body">
<p class="card-text">Enable and disable core features.</p>
</div>
<div class="card-footer">
<button type="button" class="btn btn-default" data-modal-size="medium" data-import="@typo3/install/module/settings/features.js">Configure Features&hellip;</button>
</div>
</div>
<div class="card card-size-small">
<f:render partial="Card/Header" arguments="{ title: 'Configure Installation-Wide Options', subtitle: 'Global Configuration', icon: 'EXT:install/Resources/Public/Icons/modules/install-manage-settings.svg'}" />
<div class="card-body">
<p class="card-text">Modify settings written to <code>system/settings.php</code>.</p>
</div>
<div class="card-footer">
<button type="button" class="btn btn-default" data-import="@typo3/install/module/settings/local-configuration.js">Configure options&hellip;</button>
</div>
</div>
</f:section>
@@ -0,0 +1,39 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<p>
Set a new password for the Install Tool. The password hash is stored in <code>system/settings.php</code>,
and replaces the previously configured password.
</p>
<f:render partial="Generic/ConfigurationNotWritable" arguments="{_all}"/>
<div class="t3js-module-content" data-install-tool-token="{changeInstallToolPasswordToken}">
<form action="" id="t3js-changeInstallToolPassword-form" method="post" spellcheck="false">
<div class="form-group">
<label for="t3-install-tool-password" class="form-label">Enter new password:</label>
<input
id="t3-install-tool-password"
class="t3-install-form-input-text t3-install-form-password-strength t3js-changeInstallToolPassword-password form-control"
type="password"
autocomplete="off"
required
{f:if(condition: '!{isWritable}', then: 'disabled')}
/>
</div>
<div class="form-group">
<label for="t3-install-tool-password-repeat" class="form-label">Repeat password:</label>
<input
id="t3-install-tool-password-repeat"
class="t3-install-form-input-text t3js-changeInstallToolPassword-password-check form-control"
type="password"
autocomplete="off"
required
{f:if(condition: '!{isWritable}', then: 'disabled')}
/>
</div>
<div class="t3js-changeInstallToolPassword-output"></div>
</form>
</div>
</html>
@@ -0,0 +1,31 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="t3js-module-content" data-extension-configuration-write-token="{extensionConfigurationWriteToken}">
<f:render partial="Generic/ConfigurationNotWritable" arguments="{_all}"/>
<div class="t3js-extensionConfiguration-output"></div>
<div class="form-group">
<label
for="extension-configuration-search"
class="visually-hidden"
>
Filter by
</label>
<input
id="extension-configuration-search"
type="search"
autocomplete="off"
class="form-control t3js-extensionConfiguration-search"
placeholder="search setting"
>
</div>
<div class="panel-group" role="tablist" aria-multiselectable="true">
<f:for each="{extensionsWithConfigurations}" as="extensionData" key="extensionKey">
<f:render partial="Settings/ExtensionConfiguration/ExtensionForm" arguments="{_all}"/>
</f:for>
</div>
</div>
</html>
@@ -0,0 +1,41 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<p>
Feature toggles allow new TYPO3 Core functionalities to be activated for testing on upgraded installations,
while maintaining the previous behaviour. These features are enabled by default on new TYPO3 installations.
</p>
<f:render partial="Generic/ConfigurationNotWritable" arguments="{_all}"/>
<h2>Available features</h2>
<div class="t3js-module-content" data-features-save-token="{featuresSaveToken}">
<form method="post">
<div class="card-container">
<f:for each="{features}" as="feature" iteration="iterator">
<div class="card card-size-large">
<div class="card-header">
<h3>{feature.label}</h3>
</div>
<div class="card-body">
<div class="form-check form-switch">
<input
type="checkbox"
class="form-check-input"
value="1"
name="install[values][{feature.name}]"
id="t3-install-tool-features-{feature.name}"
{f:if(condition: '{feature.value} == 1', then: 'checked="checked"')}
{f:if(condition: '!{isWritable}', then: 'disabled')}
/>
<label class="form-check-label" for="t3-install-tool-features-{feature.name}">
<p>{feature.description -> f:sanitize.html()}</p>
<strong>Default setting: {f:if(condition: '{feature.default} == 1', then: 'Enabled', else: 'Disabled')}</strong>
</label>
</div>
</div>
</div>
</f:for>
</div>
</form>
</div>
</html>
@@ -0,0 +1,37 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<p>
TYPO3 writes modified values to the file system/settings.php.
You can manually override most configuration options by storing them in the optional file system/additional.php.
The TYPO3 Core does not change the content of this file.
</p>
<f:render partial="Generic/ConfigurationNotWritable" arguments="{_all}"/>
<div class="t3js-module-content" data-local-configuration-write-token="{localConfigurationWriteToken}">
<div class="form-group">
<label
for="localconfiguration-search"
class="visually-hidden"
>
Filter by
</label>
<input
id="localconfiguration-search"
type="search"
autocomplete="off"
class="form-control t3js-localConfiguration-search"
placeholder="search setting"
>
</div>
<div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true">
<f:for each="{localConfigurationData}" as="sectionData" key="sectionName">
<f:if condition="{sectionData.items}">
<f:render partial="Settings/LocalConfiguration/SubSection" arguments="{_all}"/>
</f:if>
</f:for>
</div>
</div>
</html>
@@ -0,0 +1,30 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<p>
Review and apply recommended configuration presets based on the detected environment setup.
</p>
<p>
TYPO3 can also run in a specific application context defined through an environment variable
in the web server configuration. This context can be accessed in <code>system/additional.php</code>
or in TypoScript to customize configuration accordingly.
</p>
<p>
Changed values are written to <code>system/settings.php</code>. The optional file
<code>system/additional.php</code> is not managed by the TYPO3 core and may override certain
settings. Administrators must maintain this file manually and should use it with caution.
</p>
<f:render partial="Generic/ConfigurationNotWritable" arguments="{_all}"/>
<div class="t3js-module-content" data-presets-activate-token="{presetsActivateToken}" data-presets-content-token="{presetsGetContentToken}">
<form method="post">
<div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true">
<f:for each="{presetFeatures}" as="feature">
<f:render partial="Settings/Presets/{feature.name}" arguments="{_all}"/>
</f:for>
</div>
</form>
</div>
<div class="t3js-presets-output"></div>
</html>
@@ -0,0 +1,40 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<p>
Define backend administrative users who will have full access to the System modules in the backend.
Note that all backend administrative users have access to this module when the system is running in <strong>Development mode</strong>.
</p>
<f:render partial="Generic/ConfigurationNotWritable" arguments="{_all}"/>
<f:if condition="{systemMaintainerIsDevelopmentContext}">
<div class="alert alert-info">
<div class="alert-message">
This TYPO3 instance is set to "Development" context, all backend admin users
can see the system maintenance related main module entries.
</div>
</div>
</f:if>
<div class="t3js-module-content" data-system-maintainer-write-token="{systemMaintainerWriteToken}">
<div class="form-group">
<div class="input-group flex-nowrap">
<span class="input-group-text">System Maintainer:</span>
<select-pure
multiple
default-label="Select system maintainers"
{f:if(condition: '!{isWritable}', then: 'disabled')}
class="t3js-systemMaintainer-select-pure">
<f:for each="{users}" as="user">
<option-pure value="{user.uid}" {f:if(condition: user.isSystemMaintainer, then: 'selected')}>
{f:if(condition: user.disable, then: '[DISABLED] ')} {user.username}
</option-pure>
</f:for>
</select-pure>
</div>
</div>
<div class="t3js-systemMaintainer-output"></div>
</div>
</html>
@@ -0,0 +1,81 @@
<f:layout name="Cards"/>
<f:section name="headline">
<h1>Upgrade</h1>
</f:section>
<f:section name="cards">
<div class="card card-size-small {f:if(condition:'{composerMode}', then: 'card-disabled')}">
<f:render partial="Card/Header" arguments="{ title: 'Update TYPO3 Core', subtitle: 'Core Upgrade', icon: 'EXT:install/Resources/Public/Icons/modules/install-update.svg'}"/>
<div class="card-body">
<p class="card-text">Update your TYPO3 installation (support for symbolic links required).</p>
</div>
<f:if condition="{composerMode}">
<f:then>
<div class="card-footer text-variant">
This function is not available as your installation is in composer mode. Please refer to the
<a href="https://docs.typo3.org/upgrade" target="_blank" rel="noreferrer">TYPO3 upgrade guide</a> for more information on how to upgrade your instance.
</div>
</f:then>
<f:else>
<div class="card-footer">
<button type="button" class="btn btn-default" data-import="@typo3/install/module/upgrade/core-update.js">Update Core&hellip;</button>
</div>
</f:else>
</f:if>
</div>
<div class="card card-size-small">
<f:render partial="Card/Header" arguments="{ title: 'Upgrade Wizard', subtitle: 'Core Upgrade', icon: 'EXT:install/Resources/Public/Icons/modules/install-wizards.svg'}" />
<div class="card-body">
<p class="card-text">Finalise the upgrade process when moving to a major release of TYPO3.</p>
</div>
<div class="card-footer">
<button type="button" class="btn btn-default" data-import="@typo3/install/module/upgrade/upgrade-wizards.js">Run Upgrade Wizard&hellip;</button>
</div>
</div>
<div class="card card-size-small">
<f:render partial="Card/Header" arguments="{ title: 'View Upgrade Documentation', subtitle: 'Core Upgrade', icon: 'EXT:install/Resources/Public/Icons/modules/install-documentation.svg'}" />
<div class="card-body">
<p class="card-text">View and search for important changes that have been made in major and minor releases of TYPO3.</p>
</div>
<div class="card-footer">
<button type="button" class="btn btn-default" data-import="@typo3/install/module/upgrade/upgrade-docs.js">View Upgrade Documentation&hellip;</button>
</div>
</div>
<div class="card card-size-small">
<f:render partial="Card/Header" arguments="{ title: 'Check for Broken Extensions', subtitle: 'Extensions', icon: 'EXT:install/Resources/Public/Icons/modules/install-check-brokenextension.svg'}" />
<div class="card-body">
<p class="card-text">Check compatibility of active extensions with the current TYPO3 installation.</p>
</div>
<div class="card-footer">
<button type="button" class="btn btn-default" data-modal-size="small" data-import="@typo3/install/module/upgrade/extension-compat-tester.js">Check Extension Compatibility&hellip;</button>
</div>
</div>
<div class="card card-size-small">
<f:render partial="Card/Header" arguments="{ title: 'Check TCA Migrations', subtitle: 'TCA', icon: 'EXT:install/Resources/Public/Icons/modules/install-check-tca.svg'}" />
<div class="card-body">
<p class="card-text">Identify any third-party extensions with an outdated TCA configuration which should be adapted for the installed version of TYPO3.</p>
</div>
<div class="card-footer">
<button type="button" class="btn btn-default" data-import="@typo3/install/module/upgrade/tca-migrations-check.js">Check TCA Migrations&hellip;</button>
</div>
</div>
<div class="card card-size-small {f:if(condition:'!{hasExtensions}', then: 'card-disabled')}">
<f:render partial="Card/Header" arguments="{ title: 'Scan Extension Files', subtitle: 'Extensions', icon: 'EXT:install/Resources/Public/Icons/modules/install-scan-extensions.svg'}" />
<div class="card-body">
<p class="card-text">Scan extensions for deprecated or outdated TYPO3 API calls.</p>
</div>
<f:if condition="{hasExtensions}">
<f:then>
<div class="card-footer">
<button type="button" class="btn btn-default" data-import="@typo3/install/module/upgrade/extension-scanner.js">Scan Extension Files&hellip;</button>
</div>
</f:then>
<f:else>
<div class="card-footer text-variant">
This feature is not available because no extension folders were found.
</div>
</f:else>
</f:if>
</div>
</f:section>
@@ -0,0 +1,26 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<p>Automatically updates the TYPO3 CMS core to its latest minor release if these criteria are met:</p>
<ul>
<li>It only works under Unix and MacOS (support of symbolic links is required).</li>
<li><code>typo3_src</code> must be a symbolic link to the extracted TYPO3 source directory.</li>
<li>The symbolic link needs to be writable (and deletable) by the web server user.</li>
<li>The document root directory needs to be writable.</li>
<li>One path above document root (<code>../</code>) needs to be writable (new directories will be created).</li>
<li>The <code>tar</code> command must be available for extracting the TYPO3 source package.</li>
</ul>
<div class="t3js-coreUpdate-output">
<f:if condition="!{coreIsUpdatable}">
<f:be.infobox title="This feature is disabled in this installation">
<p>
<f:if condition="{coreUpdateComposerMode}">Composer Mode is active. Please update using composer commands.<br></f:if>
<f:if condition="!{coreUpdateEnabled}">The environment variable was set <code>TYPO3_DISABLE_CORE_UPDATER=1</code>.<br></f:if>
<f:if condition="!{coreUpdateIsReleasedVersion}">This system uses an unreleased TYPO3 core version.<br></f:if>
<f:if condition="!{coreUpdateIsSymLinkedCore}">This action can only be used with a linked <code>typo3_src</code>.</f:if>
</p>
</f:be.infobox>
</f:if>
</div>
</html>
@@ -0,0 +1,16 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<p>
Checks whether the local extensions' ext_localconf files can be included without errors,
meaning they can be loaded without breaking the system.
</p>
<div
class="t3js-module-content"
data-extension-compat-tester-load-ext_localconf-token="{extensionCompatTesterLoadExtLocalconfToken}"
data-extension-compat-tester-uninstall-extension-token="{extensionCompatTesterUninstallToken}"
>
<div class="t3js-extensionCompatTester-output"></div>
</div>
</html>
@@ -0,0 +1,132 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<p>
This module scans extensions for usage of deprecated and removed TYPO3 API calls.
The module can be a great help for extension developers and site maintainers when
upgrading to new core versions. However, the detection approach - based on static
code analysis - is limited by concept: false positives/negatives are impossible to avoid.
Further details can be found at
<a style="text-decoration: underline;" target="_blank" rel="noreferrer" href="https://docs.typo3.org/typo3cms/CoreApiReference/ApiOverview/ExtensionScanner/Index.html">
the official docs.
</a>
</p>
<div style="display: none">
<div id="t3js-extensionScanner-file-hit-template">
<div class="panel t3js-extensionScanner-hit-panel risk-medium">
<h2 class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
type="button"
class="panel-button collapsed t3js-extensionScanner-hit-file-panel-head"
data-bs-toggle="collapse"
data-bs-target="#collapse"
aria-controls="collapse"
aria-expanded="false"
id="heading-not-affected"
>
<div class="panel-title">
<div><strong class="t3js-extensionScanner-hit-filename">aFile</strong></div>
<div class="t3js-extensionScanner-hit-message">aMessage</div>
</div>
<div class="panel-badge t3js-extensionScanner-hit-badges">
</div>
<span class="caret"></span>
</button>
</div>
</h2>
<div id="collapse" class="panel-collapse collapse t3js-extensionScanner-hit-file-panel-body">
<div class="panel-body">
<pre class="language-php"><strong class="t3js-extensionScanner-hit-file-line"></strong><span class="t3js-extensionScanner-hit-file-lineContent"></span></pre>
<div class="panel-group t3js-extensionScanner-hit-file-rest-container"></div>
</div>
</div>
</div>
</div>
<div id="t3js-extensionScanner-file-hit-rest-template">
<div class="panel t3js-extensionScanner-hit-rest-panel risk-medium">
<h2 class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
type="button"
class="panel-button collapsed t3js-extensionScanner-hit-rest-panel-head"
data-bs-toggle="collapse"
data-bs-target="#collapse-rest"
aria-controls="collapse-rest"
aria-expanded="false"
>
<div class="panel-title">
<strong class="t3js-extensionScanner-hit-rest-headline">restFileHeadline</strong>
</div>
<div class="panel-badge">
<span class="badge badge-default t3js-extensionScanner-hit-rest-badge">aBadge</span>
</div>
<span class="caret"></span>
</button>
</div>
</h2>
<div id="collapse-rest" class="panel-collapse collapse t3js-extensionScanner-hit-rest-panel-body">
<pre class="panel-body t3js-extensionScanner-hit-rest-body">restFileContent</pre>
</div>
</div>
</div>
</div>
<div
class="t3js-module-content"
data-extension-scanner-files-token="{extensionScannerFilesToken}"
data-extension-scanner-scan-file-token="{extensionScannerScanFileToken}"
data-extension-scanner-mark-fully-scanned-rest-files-token="{extensionScannerMarkFullyScannedRestFilesToken}"
>
<typo3-backend-progress-bar class="t3js-extensionScanner-progress-all-extension" value="0" hidden></typo3-backend-progress-bar>
<h2>Extensions</h2>
<div class="panel-group panel-group-scanner-extensions">
<f:for each="{extensionScannerExtensionList}" as="extension" iteration="iterator">
<div
class="panel panel-default t3js-extensionScanner-extension t3js-extensionScanner-extension-{extension}"
data-extension="{extension}">
<div class="panel-progress">
<div class="panel-progress-bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0;">
<span class="visually-hidden">0%</span>
</div>
</div>
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
type="button"
class="panel-button collapsed"
data-bs-toggle="collapse"
data-bs-target="#extension-{iterator.index}"
aria-controls="extension-{iterator.index}"
aria-expanded="false"
>
<div class="panel-title">
Extension: <strong>{extension}</strong>
</div>
<div class="panel-heading-text t3js-extensionScanner-number-of-files">
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div class="panel-collapse collapse" id="extension-{iterator.index}">
<div class="panel-body hide t3js-extensionScanner-extension-body"></div>
<div class="panel-footer">
<p>
<span>Effective lines of code: <span class="t3js-extensionScanner-extension-body-loc">0</span></span><br>
<span>Files ignored by scanner: <span class="t3js-extensionScanner-extension-body-ignored-files">0</span></span><br>
<span>Code lines ignored by scanner: <span class="t3js-extensionScanner-extension-body-ignored-lines">0</span></span>
</p>
<button type="submit" class="btn btn-default t3js-extensionScanner-scan-single">
Scanning…
</button>
</div>
</div>
</div>
</f:for>
</div>
</div>
</html>
@@ -0,0 +1,9 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<p>
Checks whether the current TCA needs migrations and displays the new migration paths which need to be adjusted
manually.
</p>
<div class="t3js-tcaMigrationsCheck-output"></div>
</html>
@@ -0,0 +1,15 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:for each="{upgradeDocsFiles}" key="fileId" as="fileArray">
<f:render partial="Upgrade/UpgradeDocs/PanelItem" arguments="{id: 'file-{fileId}', fileArray: fileArray, state: 'regular'}"/>
</f:for>
<f:for each="{upgradeDocsReadFiles}" key="fileId" as="fileArray">
<f:render partial="Upgrade/UpgradeDocs/PanelItem" arguments="{id: 'file-{fileId}', fileArray: fileArray, state: 'read', read: 'true'}"/>
</f:for>
<f:for each="{upgradeDocsNotAffectedFiles}" key="fileId" as="fileArray">
<f:render partial="Upgrade/UpgradeDocs/PanelItem" arguments="{id: 'file-{fileId}', fileArray: fileArray, state: 'notAffected', read: 'true'}"/>
</f:for>
</html>
@@ -0,0 +1,109 @@
<html xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers" xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="t3js-module-content" data-upgrade-docs-mark-read-token="{upgradeDocsMarkReadToken}" data-upgrade-docs-unmark-read-token="{upgradeDocsUnmarkReadToken}">
<div class="form-group">
<label for="upgrade-docs-search-field" class="visually-hidden">Search</label>
<input
type="search"
autocomplete="off"
id="upgrade-docs-search-field"
class="form-control t3js-upgradeDocs-fulltext-search"
placeholder="Enter searchword"
disabled
>
</div>
<div class="form-group">
<div class="input-group flex-nowrap">
<span class="input-group-text">Filter by:</span>
<select-pure
default-label="Select category"
class="t3js-upgradeDocs-select-pure"
multiple
tabindex=""
disabled
>
</select-pure>
</div>
</div>
<div class="panel-group" role="tablist" aria-multiselectable="true">
<f:for each="{upgradeDocsVersions}" as="version" iteration="iterator">
<div class="panel panel-default panel-version t3js-version-changes" data-version="{version}">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
type="button"
class="panel-button collapsed"
data-bs-toggle="collapse"
data-bs-target="#version-{iterator.index}"
aria-controls="version-{iterator.index}"
aria-expanded="false"
id="heading-{iterator.index}"
>
<div class="panel-title">
Version: <strong>{version}</strong>
<span class="t3js-panel-loading"><core:icon identifier="spinner-circle" size="small" /></span>
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div class="panel-collapse collapse"
id="version-{iterator.index}" role="tabpanel" data-group-version="{version}">
<div class="panel-body t3js-changelog-list" role="tablist" aria-multiselectable="false"></div>
</div>
</div>
</f:for>
<div class="panel panel-default panel-version">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
type="button"
class="panel-button collapsed"
data-bs-toggle="collapse"
data-bs-target="#collapseRead"
aria-controls="collapseRead"
aria-expanded="false"
id="heading-read"
>
<div class="panel-title">
Files marked as read
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div class="panel-collapse collapse" id="collapseRead" role="tabpanel" data-group-version="read">
<div class="panel-body panel-body-read t3js-changelog-list" role="tablist" aria-multiselectable="false"></div>
</div>
</div>
<div class="panel panel-default panel-version">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
type="button"
class="panel-button collapsed"
data-bs-toggle="collapse"
data-bs-target="#collapseNotAffected"
aria-controls="collapseNotAffected"
aria-expanded="false"
id="heading-not-affected"
>
<div class="panel-title">
Files marked as not affected by extension scanner
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div class="panel-collapse collapse" id="collapseNotAffected" role="tabpanel" data-group-version="notAffected">
<div class="panel-body panel-body-not-affected t3js-changelog-list" role="tablist" aria-multiselectable="false"></div>
</div>
</div>
</div>
</div>
</html>
@@ -0,0 +1,122 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<p>
If you upgrade your TYPO3 installation from one major version to another (e.g. {currentVersion - 1} LTS to {currentVersion} LTS),
then the Upgrade Wizards guide you through the necessary steps to upgrade your database
records or explicitly install extensions that ship with the latest TYPO3 version.
</p>
<div class="t3js-upgrade-status-section">
<div class="t3js-upgradeWizards-wizards-messages-output"></div>
<div class="upgradeWizards-wizards-output t3js-upgradeWizards-wizards-output"></div>
<h4 class="mt-4">Wizards marked as done</h4>
<p>
Some wizards fully automatically check whether they should be executed, while others just
set a flag in the system registry if they have been executed once. This "I have been executed"
flag can be reset by selecting specific wizards from the list below, so the according wizards
show up as possible upgrade wizards again.
</p>
<div
class="t3js-module-content"
data-upgrade-wizards-mark-undone-token="{upgradeWizardsMarkUndoneToken}"
data-upgrade-wizards-input-token="{upgradeWizardsInputToken}"
data-upgrade-wizards-execute-token="{upgradeWizardsExecuteToken}"
>
<div class="t3js-upgradeWizards-done-output"></div>
</div>
</div>
<template id="t3js-upgradeWizards-blocking-charset-template">
<p>
The default database charset of the main MySQL database is not utf-8.
<br />
You have to run this update wizard before you can run any other update
wizard to make sure new tables and fields are created with the correct
charset.
<br />
WARNING: This will NOT convert any existing data.
</p>
<button type="button" class="btn btn-default t3js-upgradeWizards-blocking-charset-fix">
Set default charset to utf8
</button>
</template>
<template id="t3js-upgradeWizards-blocking-adds-template">
<p class="mt-4">
There are tables or fields in the database which need to be created.
<br />
You have to run this update wizard before you can run any other update
wizard to make sure all needed tables and fields are present.
</p>
<p class="t3js-upgradeWizards-blocking-adds-rows"></p>
<button type="button" class="btn btn-default t3js-upgradeWizards-blocking-adds-execute">
Create missing tables and fields
</button>
</template>
<template id="t3js-upgradeWizards-list-template">
<f:comment><!--
@todo: this whole "partial" gets reloaded everytime the "Upgrade status" is re-calculated
this is an issue with the progress bar as it thus is re-rendered all the time
--></f:comment>
<h4 class="mt-4">Upgrade status</h4>
<typo3-backend-progress-bar value="0" max="100"></typo3-backend-progress-bar>
<div class="module-action-list t3js-upgradeWizards-list-rows mt-4"></div>
</template>
<template id="t3js-upgradeWizards-list-row-template">
<div class="module-action-item">
<div class="module-action-item-body">
<div class="module-action-item-title t3js-upgradeWizards-list-row-title"></div>
<div class="module-action-item-description t3js-upgradeWizards-list-row-explanation"></div>
</div>
<div class="module-action-item-action">
<button type="button" class="btn btn-default t3js-upgradeWizards-list-row-execute">
<core:icon identifier="actions-play" size="small" /> Execute
</button>
</div>
</div>
</template>
<template id="t3js-upgradeWizards-input">
<form class="card">
<div class="card-header">
<h4 class="t3js-upgradeWizards-input-title">{updateData.title}</h4>
</div>
<div class="card-body">
<p class="t3js-upgradeWizards-input-description">{updateData.description}</p>
<div class="t3js-upgradeWizards-input-html"></div>
</div>
<div class="card-footer">
<button type="button" class="btn btn-warning t3js-upgradeWizards-input-perform">
Perform updates
</button>
<button type="button" class="btn btn-default t3js-upgradeWizards-input-abort">
Abort
</button>
</div>
</form>
</template>
<template id="t3js-upgradeWizards-done-body-template">
<div class="table-fit mb-0">
<table class="table table-striped">
<tbody class="t3js-upgradeWizards-done-rows"></tbody>
</table>
</div>
</template>
<template id="t3js-upgradeWizards-done-row-template">
<tr>
<td>
<button type="button" class="btn btn-default t3js-upgradeWizards-done-markUndone">
Mark undone
</button>
</td>
<td class="t3js-upgradeWizards-done-title">
</td>
</tr>
</template>
</html>
+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><path fill="#FF8700" d="M0 0h64v64H0z"/><path fill="#FFF" d="M42.8 32.8c-3.6 0-8.1-10.1-8.1-15.1 0-2.3.9-2.7 3.2-2.7 5.5 0 11 .9 11 4-.1 6.2-4 13.8-6.1 13.8zM28.5 18.5c0 5 6.4 20.2 10.7 20.2.5 0 .9-.1 1.4-.2-3.8 6.1-8.4 10.6-11.2 10.6-5.9 0-14.3-17.9-14.3-25.7 0-1.2.3-2.2.7-2.8 2-2.5 8.4-4.4 13.7-5-.6.4-1 1-1 2.9z"/></svg>

After

Width:  |  Height:  |  Size: 384 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><path fill="var(--icon-color-accent, #ff8700)" d="M42 28h-2v-4h2c1.1 0 2 .9 2 2s-.9 2-2 2Z"/><g opacity=".4"><path fill="currentColor" d="M22 28h18v-4H22c-1.1 0-2 .9-2 2s.9 2 2 2Z"/></g><path fill="var(--icon-color-accent, #ff8700)" d="M48 16v16H16V16h32m2-4H14c-1.1 0-2 .9-2 2v20c0 1.1.9 2 2 2h36c1.1 0 2-.9 2-2V14c0-1.1-.9-2-2-2Z"/><path fill="currentColor" d="M50 46H38c0-1.1-.9-2-2-2h-2v-8h-4v8h-2c-1.1 0-2 .9-2 2H14c-1.1 0-2 .9-2 2s.9 2 2 2h12c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2h12c1.1 0 2-.9 2-2s-.9-2-2-2Z"/></svg>

After

Width:  |  Height:  |  Size: 577 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><path fill="var(--icon-color-accent, #ff8700)" d="m30.44 35.66 1.6-1.6-2.08-2.08-1.6 1.6c-.68.68-1.93.53-2.79-.33-.86-.86-2.11-1.01-2.79-.33l-1.23 1.23.22 1.86-.82.82s-1.24-.15-1.86-.22c-2.18 2.18-4.36 4.37-6.54 6.55-.9.9-.7 2.57.44 3.72l4.16 4.16c2.28 1.9 3.72.45 3.72.45s2.18-2.18 6.54-6.55c-.07-.62-.15-1.24-.22-1.86l.82-.82 1.86.22 1.23-1.23c.68-.68.53-1.93-.33-2.79s-1.01-2.11-.33-2.79ZM51.08 12.93c-.91-.91-2.19-1.19-3.07-.66l-3.94 2.34c-1.16.69-.16 3.42-.16 3.42l-11.9 11.89L34.09 32l11.9-11.89s2.72 1 3.41-.16l2.34-3.94c.52-.88.24-2.16-.66-3.07Z"/><path fill="currentColor" d="M40.2 36.2 27.8 23.8c-.52-.52-.69-1.28-.5-1.99.74-2.66.08-5.63-2.01-7.72-1.95-1.95-4.65-2.65-7.16-2.15-.78.16-1.06 1.13-.5 1.69l2.95 2.95c.39.39.39 1.02 0 1.41l-2.59 2.59a.996.996 0 0 1-1.41 0l-2.95-2.95c-.56-.56-1.54-.28-1.69.5-.51 2.51.2 5.21 2.15 7.16a7.876 7.876 0 0 0 7.72 2.01c.71-.2 1.47-.02 1.99.5l12.4 12.4c.52.52.69 1.28.5 1.99-.74 2.66-.08 5.63 2.01 7.72 1.95 1.95 4.65 2.65 7.16 2.15.78-.16 1.06-1.13.5-1.69l-2.95-2.95a.996.996 0 0 1 0-1.41l2.59-2.59a.996.996 0 0 1 1.41 0l2.95 2.95c.56.56 1.54.28 1.69-.5.51-2.51-.2-5.21-2.15-7.16a7.876 7.876 0 0 0-7.72-2.01c-.71.2-1.47.02-1.99-.5Z"/></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><path fill="var(--icon-color-accent, #ff8700)" d="M20.48 34.95c.08.6.6 1.05 1.22 1.05h1.98v-.54c0-.17.01-.35.04-.54l-3.07-2.27c-.66-.49-.85-1.38-.43-2.08l1.73-2.91c-.34-.19-.66-.41-.95-.69-.83-.82-1.25-1.81-1.25-2.97s.42-2.15 1.25-2.97c.83-.82 1.85-1.23 3.06-1.23s2.21.41 3.05 1.23c.84.82 1.26 1.81 1.26 2.97 0 .66-.15 1.26-.43 1.81l.95.39c.3-.21.62-.41.94-.6.33-.19.66-.35.99-.48l.48-3.72c.1-.8.8-1.4 1.63-1.4h2.93s-.01-.05-.02-.07l-2.3-3.87c-.31-.52-.97-.74-1.54-.51l-2.66 1.09c-.23-.16-.46-.31-.69-.45-.24-.14-.49-.26-.75-.36l-.36-2.79c-.08-.6-.6-1.05-1.22-1.05h-4.6c-.62 0-1.15.45-1.22 1.05l-.36 2.79c-.25.1-.49.22-.74.36-.25.14-.48.29-.71.45l-2.66-1.09c-.57-.23-1.23-.02-1.54.51l-2.3 3.87c-.31.52-.17 1.19.32 1.56l2.3 1.7c-.02.14-.03.28-.03.41v.81c0 .13.01.26.03.41l-2.3 1.7c-.5.37-.63 1.03-.32 1.56l2.3 3.87c.31.52.97.74 1.54.51l2.66-1.09c.23.16.46.31.69.45.24.14.49.26.75.36l.36 2.79Z"/><path fill="currentColor" d="M32.93 52c-.83 0-1.53-.6-1.63-1.4l-.48-3.72c-.36-.13-.69-.29-1.01-.48s-.62-.39-.92-.6l-3.55 1.45c-.76.31-1.64.02-2.06-.67l-3.06-5.16c-.42-.7-.23-1.59.43-2.08l3.07-2.27c-.03-.19-.04-.37-.04-.54v-1.08c0-.17.01-.35.04-.54l-3.07-2.27c-.66-.49-.85-1.38-.43-2.08l3.06-5.16c.41-.7 1.3-.99 2.06-.67l3.55 1.45c.3-.21.62-.41.94-.6.33-.19.66-.35.99-.48l.48-3.72c.1-.8.8-1.4 1.63-1.4h6.13c.83 0 1.53.6 1.63 1.4l.48 3.72c.36.13.69.29 1.01.48s.62.39.92.6l3.55-1.45c.76-.31 1.64-.02 2.06.67l3.06 5.16c.42.7.23 1.59-.43 2.08l-3.07 2.27c.03.19.04.37.04.54v1.08c0 .17-.03.35-.08.54l3.07 2.27c.66.49.85 1.38.43 2.08l-3.06 5.15c-.42.7-1.3.99-2.06.67l-3.51-1.45c-.3.21-.62.41-.94.6s-.66.35-.99.48l-.48 3.72c-.1.8-.8 1.4-1.63 1.4h-6.13Zm3.15-10.4c1.59 0 2.94-.55 4.06-1.64 1.12-1.09 1.68-2.41 1.68-3.96s-.56-2.87-1.68-3.96c-1.12-1.09-2.48-1.64-4.06-1.64s-2.98.55-4.09 1.64c-1.11 1.09-1.66 2.41-1.66 3.96s.55 2.87 1.66 3.96c1.11 1.09 2.47 1.64 4.09 1.64Z"/></svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect width="40.18" height="6" x="11.82" y="46" fill="var(--icon-color-accent, #ff8700)" rx="2" ry="2"/><path fill="currentColor" d="M38 42H26c-1.1 0-2-.9-2-2v-8h-4c-1.83 0-3.91 0-4.64-1.77-.71-1.71.75-3.17 1.23-3.65l13.9-14c.37-.38.88-.59 1.41-.59.53 0 1.04.21 1.41.58l14.09 14c.48.48 1.94 1.94 1.23 3.65-.73 1.77-2.81 1.77-4.64 1.77h-4v8c0 1.1-.9 2-2 2Zm-10-4h8v-8c0-1.1.9-2 2-2h5.16L31.92 16.83 20.82 28H26c1.1 0 2 .9 2 2v8Z"/></svg>

After

Width:  |  Height:  |  Size: 496 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><path fill="currentColor" d="M36 43c-.53 0-1.04-.21-1.41-.59l-4-4c-.78-.78-.78-2.05 0-2.83s2.05-.78 2.83 0l2.37 2.37 4.62-6.16c.66-.88 1.92-1.06 2.8-.4.88.66 1.06 1.92.4 2.8l-6 8c-.35.46-.88.75-1.46.79h-.14Z"/><path fill="var(--icon-color-accent, #ff8700)" d="M22 37c0-2.14.46-4.17 1.27-6.02-.1-.08-.19-.17-.29-.26-1.01-1.03-1.52-2.27-1.52-3.72s.51-2.69 1.52-3.72c1.01-1.03 2.26-1.54 3.74-1.54s2.69.51 3.72 1.54c.05.05.09.12.14.17 1.95-.93 4.12-1.46 6.42-1.46 1.48 0 2.91.22 4.26.62 0-.24-.05-.48-.18-.71l-2.8-4.84c-.38-.65-1.19-.93-1.88-.63l-3.25 1.37c-.28-.2-.56-.39-.84-.56-.29-.18-.59-.33-.92-.45l-.44-3.49c-.09-.75-.73-1.32-1.49-1.32h-5.61c-.76 0-1.4.56-1.49 1.32l-.44 3.49c-.3.12-.6.28-.9.45-.3.18-.59.36-.86.56l-3.25-1.37c-.7-.29-1.5-.02-1.88.63l-2.8 4.84c-.38.66-.21 1.49.39 1.95l2.81 2.13a3 3 0 0 0-.04.51v1.01c0 .16.01.33.04.51l-2.81 2.13c-.6.46-.77 1.29-.39 1.95l2.8 4.84c.38.65 1.19.93 1.88.63l3.25-1.37c.28.2.56.39.84.56.29.18.59.33.92.45l.44 3.49c.03.28.16.51.32.71-.43-1.4-.67-2.89-.67-4.43Z"/><path fill="currentColor" d="M37 26c6.07 0 11 4.93 11 11s-4.93 11-11 11-11-4.93-11-11 4.93-11 11-11m0-4c-8.28 0-15 6.72-15 15s6.72 15 15 15 15-6.72 15-15-6.72-15-15-15Z"/></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path fill="#C83C3C" d="M24.8 5H7.2c-.1 0-.2.1-.3.1L4 10.9V26.7c0 .2.1.3.3.3h23.5c.1 0 .3-.1.3-.3V11l-2.9-5.8c-.2-.1-.3-.2-.4-.2z"/><g fill="#212121" opacity=".15"><path d="M24.8 5H7.2c-.1 0-.2.1-.3.1l-1 2.2h20.3l-1.1-2.1c-.1-.1-.2-.2-.3-.2zM26.9 8.8H5.1L4 11h24z"/></g><g><path fill="#FFF" d="M19.9 16.5 17.4 19l2.5 2.5c.2.2.2.5 0 .7l-.7.7c-.2.2-.5.2-.7 0L16 20.4l-2.5 2.5c-.2.2-.5.2-.7 0l-.7-.7c-.2-.2-.2-.5 0-.7l2.5-2.5-2.5-2.5c-.2-.2-.2-.5 0-.7l.7-.7c.2-.2.5-.2.7 0l2.5 2.5 2.5-2.5c.2-.2.5-.2.7 0l.7.7c.2.2.2.5 0 .7z"/></g></svg>

After

Width:  |  Height:  |  Size: 593 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path fill="#FFC857" fill-rule="evenodd" d="M29 9H15l-4-2H3v18h26V9z" clip-rule="evenodd"/><path fill="#212121" fill-rule="evenodd" d="M29 9H3v16h26V9z" clip-rule="evenodd" opacity=".25"/><path fill="#FFC857" fill-rule="evenodd" d="M3 13h8l4.1-3H29v15H3V13z" clip-rule="evenodd"/></svg>

After

Width:  |  Height:  |  Size: 346 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><g><g><g><path fill="#C83C3C" d="M5 2v28h22V8l-6-6H5z"/></g></g></g><path fill="#FFF" d="M21 8V2l6 6h-6z" opacity=".65"/><path fill="#212121" d="M27 8v6l-6-6h6z" opacity=".15"/><g><path fill="#FFF" d="M19.9 15.5 17.4 18l2.5 2.5c.2.2.2.5 0 .7l-.7.7c-.2.2-.5.2-.7 0L16 19.4l-2.5 2.5c-.2.2-.5.2-.7 0l-.7-.7c-.2-.2-.2-.5 0-.7l2.5-2.5-2.5-2.5c-.2-.2-.2-.5 0-.7l.7-.7c.2-.2.5-.2.7 0l2.5 2.5 2.5-2.5c.2-.2.5-.2.7 0l.7.7c.2.2.2.5 0 .7z"/></g></svg>

After

Width:  |  Height:  |  Size: 500 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><g><path fill="#59F" d="M27 6H5V3c0-.6.4-1 1-1h20c.6 0 1 .4 1 1v3z"/><path fill="#515151" d="M26 30H6c-.6 0-1-.4-1-1V6h22v23c0 .6-.4 1-1 1z"/><path fill="#FFF" d="M22 20v2h-2v-1.5c0-.2-.2-.3-.4-.2l-3.3 2c-.2.1-.2.3 0 .4l3.3 2c.2.1.4 0 .4-.2V23h3v-3h-1zM14 23h1l-1.5-4h-1L11 23h1l.2-.5h1.6l.2.5zm-1.4-1.5.4-1.2.4 1.2h-.8zM21 15.8c0 .2 0 .4-.1.5-.1.2-.2.3-.4.4l-.6.3H17v-4h2.6c.2 0 .3.1.5.1.2.1.3.2.4.3.1.1.1.3.1.4 0 .2-.1.4-.2.5-.1.1-.3.3-.5.3.3.1.5.2.7.3.3.4.4.6.4.9zm-1.5-1.7c0-.1 0-.1-.1-.2 0-.1-.1-.1-.2-.1H18v.8h.9c.1 0 .2 0 .3-.1.1 0 .2-.1.2-.2 0 0 .1-.1.1-.2zm.2 1.7c0-.1 0-.2-.1-.3-.1-.1-.2-.1-.3-.2h-1.4v1h1c.1 0 .3 0 .4-.1s.2-.1.3-.2c.1-.1.1-.1.1-.2zM15.7 13.3l-3.3-2c-.2-.1-.4 0-.4.2V13H9v3h1v-2h2v1.5c0 .2.2.3.4.2l3.3-2c.1-.1.1-.3 0-.4z"/><path fill="#FFF" d="M22.5 11h-7c-.3 0-.5.2-.5.5v.2l1 .6V12h6v6h-5v-.5c0-.3-.2-.5-.5-.5H16v-2.3l-1 .6V17H9.5c-.3 0-.5.2-.5.5v7c0 .3.2.5.5.5h7c.3 0 .5-.2.5-.5v-.2l-1-.6v.3h-6v-6h6v3.3l1-.6V19h5.5c.3 0 .5-.2.5-.5v-7c0-.3-.2-.5-.5-.5z"/></g></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

Some files were not shown because too many files have changed in this diff Show More