TYPO3 v15 dev-main snapshot ()

This commit is contained in:
2026-08-10 22:31:00 +02:00
commit f9941541b7
1178 changed files with 135377 additions and 0 deletions
@@ -0,0 +1,83 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<div class="typo3-login">
<div class="typo3-login-inner">
<div class="typo3-login-container">
<div class="typo3-login-wrap">
<div class="card card-login card-mfa">
<header class="card-heading">
<h2 class="text-center">{provider.title -> f:translate(key: provider.title, default: provider.title)}</h2>
</header>
<main class="card-body">
<f:if condition="{isLocked} || {hasAuthError}">
<div id="t3-login-error" class="mb-2">
<div class="alert alert-danger">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:auth.{f:if(condition: isLocked, then: 'locked', else: 'authError')}"/>
</div>
</div>
</f:if>
<f:if condition="!{isLocked}">
<f:then>
<form action="{formUrl}" method="post" enctype="multipart/form-data" name="verify" id="mfaController">
<input type="hidden" name="identifier" value="{provider.identifier}" />
{providerContent -> f:format.raw()}
<div class="form-group d-grid mb-2" id="t3-login-submit-section">
<button class="btn d-block btn-login" type="submit" name="submit" autocomplete="off">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:auth.submit"/>
</button>
</div>
</form>
</f:then>
<f:else>
<f:comment>In case, the provider is temporarily locked, still allow to render provider specific content.</f:comment>
{providerContent -> f:format.raw()}
</f:else>
</f:if>
<div class="cancel-authentication">
<div class="text-end">
<f:be.link
route="auth_mfa"
parameters="{action: 'cancel', redirect: redirectRoute, redirectParams: redirectParams}"
title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:auth.cancel')}"
>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:auth.cancel"/>
</f:be.link>
</div>
</div>
</main>
<f:if condition="{alternativeProviders}">
<footer class="card-footer">
<h5><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:auth.alternativeProviders"/></h5>
<ul class="list-group px-lg-4">
<f:for each="{alternativeProviders}" as="alternativeProvider">
<li>
<f:be.link
route="auth_mfa"
parameters="{identifier: alternativeProvider.identifier, redirect: redirectRoute, redirectParams: redirectParams}"
title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:auth.alternativeProviders.use', arguments: {0: '{alternativeProvider.title -> f:translate(key: alternativeProvider.title, default: alternativeProvider.title)}'})}"
>
<f:translate
key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:auth.alternativeProviders.use"
arguments="{0: '{alternativeProvider.title -> f:translate(key: alternativeProvider.title, default: alternativeProvider.title)}'}"
/>
</f:be.link>
</li>
</f:for>
</ul>
</footer>
</f:if>
</div>
</div>
</div>
<f:if condition="{footerNote}">
<aside class="typo3-login-footnote" aria-label="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang.xlf:login.region.footnote')}">
<p>{footerNote}</p>
</aside>
</f:if>
</div>
</div>
</html>
@@ -0,0 +1,56 @@
<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"
>
<f:layout name="Module" />
<f:section name="Content">
<f:variable name="providerTitle" value="{provider.title -> f:translate(key: provider.title, default: provider.title)}"/>
<h1><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:edit.title" arguments="{0: providerTitle}"/></h1>
<p><f:format.nl2br>{provider.description -> f:translate(key: provider.description, default: provider.description)}</f:format.nl2br></p>
<form
action="{f:be.uri(route:'mfa', parameters:'{action: \'save\'}')}"
method="post"
enctype="multipart/form-data"
name="edit"
id="mfaConfigurationController">
<input type="hidden" name="identifier" value="{provider.identifier}" />
<div class="mb-3">
{providerContent -> f:format.raw()}
</div>
<div class="mfa-provider-settings">
<f:if condition="{provider.defaultProviderAllowed}">
<div class="row mb-3">
<div class="col-md-5">
<h4><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:edit.defaultProvider"/></h4>
<p><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:edit.defaultProvider.description"/></p>
<div class="form-check">
<input type="checkbox" name="defaultProvider" id="defaultProvider" class="form-check-input" value="1" {f:if(condition: isDefaultProvider, then: 'checked="checked"')} />
<label class="form-check-label" for="defaultProvider">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:edit.defaultProvider.inputLabel"/>
</label>
</div>
</div>
</div>
</f:if>
<div class="row">
<div class="col">
<h4><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:edit.deactivateProvider"/></h4>
<p><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:edit.deactivateProvider.description"/></p>
<f:be.link route="mfa" parameters="{action: 'deactivate', identifier: provider.identifier}" title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:edit.deactivateProvider.linkTitle', arguments: '{0: providerTitle}')}" class="btn btn-danger">
<core:icon identifier="actions-toggle-off" />
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:edit.deactivateProvider.linkText"/>
</f:be.link>
</div>
</div>
</div>
</form>
</f:section>
</html>
@@ -0,0 +1,105 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:be="http://typo3.org/ns/TYPO3/CMS/Backend/ViewHelpers"
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:layout name="Module" />
<f:section name="Content">
<h1><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:overview.title" /></h1>
<f:if condition="{setupRequired}">
<f:then>
<f:if condition="{providers}">
<f:then>
<f:be.infobox state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::WARNING')}" title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:overview.setupRequired.title')}">
<p><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:overview.setupRequired.message"/></p>
</f:be.infobox>
</f:then>
<f:else>
<f:be.infobox state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::ERROR')}" title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:overview.noProviders.title')}">
<p><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:noprovider_error_message"/></p>
</f:be.infobox>
</f:else>
</f:if>
</f:then>
<f:else if="!{providers}">
<f:be.infobox state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}" title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:overview.noProviders.title')}">
<p><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:overview.noProviders.message"/></p>
</f:be.infobox>
</f:else>
</f:if>
<f:if condition="{providers}">
<f:then>
<div class="card-container">
<f:for each="{providers}" as="provider">
<f:render section="Item" arguments="{provider: provider, defaultProvider: defaultProvider, recommendedProvider: recommendedProvider}"/>
</f:for>
</div>
</f:then>
</f:if>
</f:section>
<f:section name="Item">
<f:variable name="providerTitle" value="{provider.title -> f:translate(key: provider.title, default: provider.title)}"/>
<div class="card card-size-small {f:if(condition: '{recommendedProvider} == {provider.identifier}', then: 'card-success')}" id="{provider.identifier}-provider">
<div class="card-header">
<div class="card-icon">
<core:icon identifier="{provider.iconIdentifier}" size="large"/>
</div>
<div class="card-header-body">
<h2 class="card-title">
{providerTitle}
<be:mfa.ifHasState state="active" provider="{provider}">
<span class="badge badge-{be:mfa.ifHasState(state: 'locked', provider: provider, then: 'danger', else: 'success')}">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:overview.badge.{be:mfa.ifHasState(state: 'locked', provider: provider, then: 'locked', else: 'active')}"/>
</span>
</be:mfa.ifHasState>
<f:if condition="{defaultProvider} == {provider.identifier}">
<span title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:overview.defaultProvider')}">
<core:icon identifier="actions-star" />
</span>
</f:if>
</h2>
</div>
</div>
<div class="card-body">
<p class="card-text">{provider.description -> f:translate(key: provider.description, default: provider.description)}</p>
</div>
<div class="card-footer">
<be:mfa.ifHasState state="active" provider="{provider}">
<f:then>
<be:mfa.ifHasState state="locked" provider="{provider}">
<f:then>
<f:be.link route="mfa" parameters="{action: 'unlock', identifier: provider.identifier}" class="btn btn-success" title="{f:translate(key:'LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:overview.unlockLinkTitle', arguments: {0: providerTitle})}">
<core:icon identifier="actions-unlock" />
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:overview.unlockLinkLabel"/>
</f:be.link>
</f:then>
<f:else>
<f:be.link route="mfa" parameters="{action: 'edit', identifier: provider.identifier}" class="btn btn-default" title="{f:translate(key:'LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:overview.editLinkTitle', arguments: {0: providerTitle})}">
<core:icon identifier="actions-open" />
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:overview.editLinkLabel"/>
</f:be.link>
</f:else>
</be:mfa.ifHasState>
<f:be.link route="mfa" parameters="{action: 'deactivate', identifier: provider.identifier}" class="btn btn-danger" title="{f:translate(key:'LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:overview.deactivateLinkTitle', arguments: {0: providerTitle})}">
<core:icon identifier="actions-toggle-off" />
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:overview.deactivateLinkLabel"/>
</f:be.link>
</f:then>
<f:else>
<f:be.link route="mfa" parameters="{action: 'setup', identifier: provider.identifier}" class="btn btn-{f:if(condition: '{recommendedProvider} == {provider.identifier}', then: 'success', else: 'default')}" title="{f:translate(key:'LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:overview.setupLinkTitle', arguments: {0: providerTitle})}">
<core:icon identifier="actions-plus" />
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:overview.setupLinkLabel"/>
</f:be.link>
</f:else>
</be:mfa.ifHasState>
</div>
</div>
</f:section>
</html>
@@ -0,0 +1,33 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:layout name="Module" />
<f:section name="Content">
<h1><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:setup.title" arguments="{0: '{provider.title -> f:translate(key: provider.title, default: provider.title)}'}"/></h1>
<div class="row g-6">
<div class="col">
<form
action="{f:be.uri(route:'mfa', parameters:'{action: \'activate\'}')}"
method="post"
enctype="multipart/form-data"
name="setup"
id="mfaConfigurationController">
<input type="hidden" name="identifier" value="{provider.identifier}" />
{providerContent -> f:format.raw()}
</form>
</div>
<f:if condition="{provider.setupInstructions}">
<div class="col-md-4">
<f:render partial="Mfa/SetupInstructions" arguments="{provider: provider}" />
</div>
</f:if>
</div>
</f:section>
</html>
@@ -0,0 +1,79 @@
<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="typo3-login">
<div class="typo3-login-inner">
<div class="typo3-login-container">
<div class="typo3-login-wrap">
<div class="card card-login card-mfa">
<header class="card-heading text-center">
<h2>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:standalone.selection.title" />
</h2>
<p class="text-variant">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:standalone.selection.message" arguments="{0: siteName}" />
</p>
</header>
<main class="card-body">
<f:if condition="{recommendedProvider} || {providers}">
<f:then>
<div class="list-group mb-2">
<f:if condition="{recommendedProvider}">
<f:render section="providerLink" arguments="{provider: recommendedProvider, highlight: '{providers -> f:count()}', redirect: redirect, redirectParams: redirectParams}" />
</f:if>
<f:for each="{providers}" as="provider">
<f:render section="providerLink" arguments="{provider: provider, redirect: redirect, redirectParams: redirectParams}" />
</f:for>
</div>
</f:then>
<f:else>
<div class="alert alert-warning mb-2">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:noprovider_error_message" arguments="{0: siteName}" />
</div>
</f:else>
</f:if>
<div class="cancel-setup">
<div class="text-end">
<f:be.link
route="setup_mfa"
parameters="{action: 'cancel', redirect: redirect, redirectParams: redirectParams}"
title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:standalone.selection.goBack')}"
>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:standalone.selection.goBack"/>
</f:be.link>
</div>
</div>
</main>
</div>
</div>
</div>
<f:if condition="{footerNote}">
<aside class="typo3-login-footnote" aria-label="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang.xlf:login.region.footnote')}">
<p>{footerNote}</p>
</aside>
</f:if>
</div>
</div>
<f:section name="providerLink">
<f:be.link
route="setup_mfa"
class="list-group-item list-group-item-action {f:if(condition: highlight, then: 'border-success')}"
parameters="{action: 'setup', identifier: provider.identifier, redirect: redirect, redirectParams: redirectParams}"
title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:standalone.setupProvider', arguments: {0: '{provider.title -> f:translate(key: provider.title, default: provider.title)}'})}"
>
<div class="d-flex">
<div class="align-self-center pe-3">
<core:icon identifier="{provider.iconIdentifier}" size="medium" />
</div>
<div class="align-self-center">
<f:translate key="{provider.title}" default="{provider.title}" />
</div>
</div>
</f:be.link>
</f:section>
</html>
@@ -0,0 +1,68 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<div class="typo3-login">
<div class="typo3-login-inner">
<div class="typo3-login-container">
<div class="typo3-login-wrap typo3-login-wrap-large">
<div class="card card-login card-mfa">
<header class="card-heading text-center">
<h2>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:standalone.setupProvider" arguments="{0: '{provider.title -> f:translate(key: provider.title, default: provider.title)}'}"/>
</h2>
</header>
<main class="card-body">
<f:if condition="{hasErrors}">
<div id="t3-login-error">
<div class="alert alert-danger">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:activate.failure" arguments="{0: '{provider.title -> f:translate(key: provider.title, default: provider.title)}'}"/>
</div>
</div>
</f:if>
<div class="row">
<div class="col-12">
<form
action="{f:be.uri(route:'setup_mfa', parameters:'{action: \'activate\', redirect: redirect, redirectParams: redirectParams}')}"
method="post"
enctype="multipart/form-data"
name="setup"
id="mfaSetupController"
>
{providerContent -> f:format.raw()}
<input type="hidden" name="identifier" value="{provider.identifier}" />
<div class="text-end">
<f:be.link
route="setup_mfa"
class="btn btn-default fw-normal"
parameters="{redirect: redirect, redirectParams: redirectParams}"
title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:standalone.setup.cancel')}"
>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:standalone.setup.cancel"/>
</f:be.link>
<button type="submit" class="btn btn-info">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:standalone.setup" />
</button>
</div>
</form>
</div>
<f:if condition="{provider.setupInstructions}">
<div class="col-12 mt-3">
<f:render partial="Mfa/SetupInstructions" arguments="{provider: provider}" />
</div>
</f:if>
</div>
</main>
</div>
</div>
</div>
<f:if condition="{footerNote}">
<aside class="typo3-login-footnote" aria-label="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang.xlf:login.region.footnote')}">
<p>{footerNote}</p>
</aside>
</f:if>
</div>
</div>
</html>