Fix #115: TAN-Anfrage – Startcode hervorheben
Nennt die Bank bei der TAN-Abfrage einen Startcode für den TAN-Generator, geht er im Fließtext leicht unter. StartcodeErkennung erkennt ihn über einen pro Bankverbindung konfigurierbaren Beispielsatz (Ziffernfolge = Platzhalter für den Code) und zeigt den Fund fett, zentriert und in eigener Zeile. BankFreitext löst dafür die bisherige Klartext-Aufbereitung aus FinTsUeberweisung::vopHinweis() heraus, damit TAN-Anfrage und VoP-Rückmeldung dieselbe HTML-zu-Klartext-Umwandlung nutzen. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
parent
17124d26c8
commit
1cdb59b68b
13 changed files with 280 additions and 31 deletions
|
|
@ -1,5 +1,12 @@
|
|||
# Änderungen
|
||||
|
||||
## TAN-Anfrage: Startcode hervorheben (04.10.2026)
|
||||
|
||||
- Nennt die Bank bei der TAN-Abfrage einen Startcode für den TAN-Generator, geht er im Fließtext leicht unter. Erkennt der Finanzmanager einen hinterlegten Beispielsatz (jede Ziffernfolge darin gilt als Platzhalter für den Startcode), zeigt er den gefundenen Code fett, zentriert und in eigener Zeile.
|
||||
- Der Beispielsatz steht pro Bankverbindung im Formular unter „Startcode-Satz“; bleibt er leer, gilt „Überprüfe den Startcode 80045248 und bestätige mit der Taste OK.“ als Vorgabe.
|
||||
- `Services/StartcodeErkennung` (neu), `Services/BankFreitext` (neu, aus `FinTsUeberweisung::vopHinweis()` ausgelagert und jetzt von beiden genutzt), Migration `024_startcode_muster.sql`.
|
||||
- Test: `tests/56_StartcodeErkennungTest.php`.
|
||||
|
||||
## Verwaltung: Backup und Restore (01.10.2026)
|
||||
|
||||
- Neue Kachel „Backup“: „Backup“ lädt den gesamten Datenbestand als `finanzmanager-sicherung-….json.gz` herunter, „Restore“ ersetzt den Bestand durch den Inhalt einer solchen Datei (mit Rückfrage).
|
||||
|
|
|
|||
|
|
@ -200,6 +200,13 @@ wenn dort etwas liegt. Ein einzelner Abruf löst einen liegengebliebenen Sammela
|
|||
fragt die Anwendung auf Knopfdruck nach (`checkDecoupledSubmission`) – steht die Freigabe
|
||||
noch aus, bleibt die Maske stehen.
|
||||
|
||||
Der Hinweistext ist laut FinTS-Spezifikation HTML (br, p, b, i, u, ul, ol, li);
|
||||
`Services\BankFreitext::klartext()` macht daraus Zeilenumbrüche statt Markup. Nennt die Bank
|
||||
darin einen Startcode für den TAN-Generator, hebt `Services\StartcodeErkennung` ihn hervor:
|
||||
Pro Bankzugang lässt sich ein Beispielsatz speichern (`startcode_muster`), dessen Ziffernfolge
|
||||
als Platzhalter für den jeweiligen Code gilt – ohne eigenen Satz greift
|
||||
`StartcodeErkennung::STANDARD_MUSTER`.
|
||||
|
||||
### Einrichtung in drei Schritten
|
||||
|
||||
Fast jede Bank bietet mehrere Verfahren an, und welche das sind, weiß nur sie. Fragen lässt
|
||||
|
|
|
|||
12
migrations/024_startcode_muster.sql
Normal file
12
migrations/024_startcode_muster.sql
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
-- Pro Bank konfigurierbarer Beispielsatz zur Erkennung des Startcodes.
|
||||
--
|
||||
-- Manche Banken nennen bei der TAN-Abfrage mitten im Fließtext einen Startcode
|
||||
-- für den TAN-Generator, etwa „Überprüfe den Startcode 80045248 und
|
||||
-- bestätige mit der Taste OK.“ – im Fließtext geht die Zahl leicht unter. Der
|
||||
-- Finanzmanager hebt sie hervor, sobald dieser Beispielsatz (mit einer
|
||||
-- beliebigen Zahl an der Stelle des Startcodes) im Text der Bank vorkommt.
|
||||
-- Bleibt das Feld leer, gilt der Beispielsatz oben als Vorgabe
|
||||
-- (Services\StartcodeErkennung::STANDARD_MUSTER).
|
||||
|
||||
ALTER TABLE bank_zugaenge
|
||||
ADD COLUMN IF NOT EXISTS startcode_muster TEXT NULL AFTER tan_medium;
|
||||
|
|
@ -1588,7 +1588,8 @@ table.liste th.bargeldspalte {
|
|||
.formular input[type="text"],
|
||||
.formular input[type="password"],
|
||||
.formular input[type="number"],
|
||||
.formular select {
|
||||
.formular select,
|
||||
.formular textarea {
|
||||
font: inherit;
|
||||
padding: .5rem .6rem;
|
||||
border: 1px solid var(--rand-kraeftig);
|
||||
|
|
@ -1598,8 +1599,11 @@ table.liste th.bargeldspalte {
|
|||
width: 100%;
|
||||
}
|
||||
|
||||
.formular textarea { resize: vertical; }
|
||||
|
||||
.formular input:focus-visible,
|
||||
.formular select:focus-visible,
|
||||
.formular textarea:focus-visible,
|
||||
.knopf:focus-visible {
|
||||
outline: 2px solid var(--akzent);
|
||||
outline-offset: 1px;
|
||||
|
|
@ -2120,6 +2124,16 @@ table.bericht .wertlink:hover {
|
|||
font-size: .93rem;
|
||||
}
|
||||
|
||||
/* Der von StartcodeErkennung erkannte Startcode – in eigener Zeile und groß
|
||||
genug, dass das Auge ihn beim Umschauen zuerst findet. */
|
||||
.startcode {
|
||||
display: block;
|
||||
text-align: center;
|
||||
margin: .4rem 0;
|
||||
font-size: 1.4rem;
|
||||
letter-spacing: .05em;
|
||||
}
|
||||
|
||||
/* photoTAN-Grafiken liefern die Banken klein; unskaliert wären sie kaum zu
|
||||
scannen, größer als die Kachel dürfen sie aber auch nicht werden. */
|
||||
.tanbild {
|
||||
|
|
|
|||
|
|
@ -1037,6 +1037,7 @@ class BankingController extends BaseController
|
|||
'pin' => $this->post('pin'),
|
||||
'abrufzeitraum' => $this->post('abrufzeitraum'),
|
||||
'abruf_stichtag' => $this->post('abruf_stichtag'),
|
||||
'startcode_muster' => $this->post('startcode_muster'),
|
||||
'aktiv' => isset($_POST['aktiv']) ? 1 : 0,
|
||||
];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -94,15 +94,16 @@ class Bankzugang
|
|||
'INSERT INTO bank_zugaenge
|
||||
(benutzer_id, typ, name, bankname, blz, fints_url, benutzerkennung, pin,
|
||||
api_benutzer, api_kennwort, api_signatur, sandbox,
|
||||
tan_verfahren_id, tan_verfahren_name, tan_medium, abrufzeitraum,
|
||||
tan_verfahren_id, tan_verfahren_name, tan_medium, startcode_muster, abrufzeitraum,
|
||||
abruf_stichtag, aktiv)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)',
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)',
|
||||
[
|
||||
Mandant::id(), $felder['typ'], $felder['name'], $felder['bankname'], $felder['blz'],
|
||||
$felder['fints_url'], $felder['benutzerkennung'], $felder['pin'],
|
||||
$felder['api_benutzer'], $felder['api_kennwort'], $felder['api_signatur'],
|
||||
$felder['sandbox'],
|
||||
$felder['tan_verfahren_id'], $felder['tan_verfahren_name'], $felder['tan_medium'],
|
||||
$felder['startcode_muster'],
|
||||
$felder['abrufzeitraum'], $felder['abruf_stichtag'], $felder['aktiv'],
|
||||
]
|
||||
);
|
||||
|
|
@ -150,14 +151,14 @@ class Bankzugang
|
|||
'UPDATE bank_zugaenge SET name = ?, bankname = ?, blz = ?, fints_url = ?,
|
||||
benutzerkennung = ?, pin = ?, api_benutzer = ?, api_kennwort = ?,
|
||||
api_signatur = ?, sandbox = ?, tan_verfahren_id = ?, tan_verfahren_name = ?,
|
||||
tan_medium = ?, abrufzeitraum = ?, abruf_stichtag = ?, aktiv = ?
|
||||
tan_medium = ?, startcode_muster = ?, abrufzeitraum = ?, abruf_stichtag = ?, aktiv = ?
|
||||
WHERE id = ? AND benutzer_id = ?',
|
||||
[
|
||||
$felder['name'], $felder['bankname'], $felder['blz'], $felder['fints_url'],
|
||||
$felder['benutzerkennung'], $felder['pin'], $felder['api_benutzer'],
|
||||
$felder['api_kennwort'], $felder['api_signatur'], $felder['sandbox'],
|
||||
$felder['tan_verfahren_id'],
|
||||
$felder['tan_verfahren_name'], $felder['tan_medium'],
|
||||
$felder['tan_verfahren_name'], $felder['tan_medium'], $felder['startcode_muster'],
|
||||
$felder['abrufzeitraum'], $felder['abruf_stichtag'], $felder['aktiv'],
|
||||
$id, Mandant::id(),
|
||||
]
|
||||
|
|
@ -397,6 +398,11 @@ class Bankzugang
|
|||
'tan_verfahren_id' => $verfahren,
|
||||
'tan_verfahren_name' => mb_substr(trim((string)($daten['tan_verfahren_name'] ?? '')), 0, 128),
|
||||
'tan_medium' => Crypto::verschluessle(trim((string)($daten['tan_medium'] ?? ''))),
|
||||
// Leer heißt: StartcodeErkennung::STANDARD_MUSTER gilt – dafür
|
||||
// steht hier null statt eines leeren Strings.
|
||||
'startcode_muster' => trim((string)($daten['startcode_muster'] ?? '')) === ''
|
||||
? null
|
||||
: mb_substr(trim((string)$daten['startcode_muster']), 0, 500),
|
||||
'abrufzeitraum' => $zeitraum,
|
||||
'abruf_stichtag' => $stichtag?->format('Y-m-d'),
|
||||
'aktiv' => !empty($daten['aktiv']) ? 1 : 0,
|
||||
|
|
|
|||
31
src/Services/BankFreitext.php
Normal file
31
src/Services/BankFreitext.php
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Finanzmanager\Services;
|
||||
|
||||
/**
|
||||
* Freitext der Bank – etwa aus VoP-Rückmeldung oder TAN-Anfrage – als
|
||||
* Klartext.
|
||||
*
|
||||
* Banken liefern hier HTML (laut FinTS-Spezifikation nur br, p, b, i, u, ul,
|
||||
* ol und li). Übernommen werden nur die Absätze als Zeilenumbrüche; die
|
||||
* Auszeichnung fliegt weg – fremdes Markup gehört nicht ungeprüft in die
|
||||
* eigene Seite.
|
||||
*/
|
||||
final class BankFreitext
|
||||
{
|
||||
public static function klartext(string $html): string
|
||||
{
|
||||
if (trim($html) === '') {
|
||||
return '';
|
||||
}
|
||||
|
||||
$text = preg_replace('#<(br|/p|/div|/li|/h[1-6])[^>]*>#i', "\n", $html) ?? $html;
|
||||
$text = html_entity_decode(strip_tags($text), ENT_QUOTES | ENT_HTML5, 'UTF-8');
|
||||
$text = preg_replace('/[ \t]+/', ' ', $text) ?? $text;
|
||||
$text = preg_replace("/\n{3,}/", "\n\n", $text) ?? $text;
|
||||
|
||||
return trim(implode("\n", array_map('trim', explode("\n", $text))));
|
||||
}
|
||||
}
|
||||
|
|
@ -672,7 +672,10 @@ class FinTsAbruf
|
|||
|
||||
$tan = [
|
||||
'bezeichnung' => $bezeichnung,
|
||||
'hinweis' => $anfrage?->getChallenge() ?? '',
|
||||
'hinweis' => StartcodeErkennung::hervorheben(
|
||||
$anfrage?->getChallenge() ?? '',
|
||||
(string)($this->zugang['startcode_muster'] ?? '')
|
||||
),
|
||||
'medium' => $anfrage?->getTanMediumName() ?? '',
|
||||
'entkoppelt' => $entkoppelt,
|
||||
'bild_typ' => null,
|
||||
|
|
|
|||
|
|
@ -659,23 +659,10 @@ class FinTsUeberweisung
|
|||
|
||||
/**
|
||||
* Der Hinweistext der Bank als Klartext.
|
||||
*
|
||||
* Die Banken liefern hier HTML. Übernommen werden nur die Absätze als
|
||||
* Zeilenumbrüche; die Auszeichnung fliegt weg – fremdes Markup gehört nicht
|
||||
* ungeprüft in die eigene Seite.
|
||||
*/
|
||||
public static function vopHinweis(string $html): string
|
||||
{
|
||||
if (trim($html) === '') {
|
||||
return '';
|
||||
}
|
||||
|
||||
$text = preg_replace('#<(br|/p|/div|/li|/h[1-6])[^>]*>#i', "\n", $html) ?? $html;
|
||||
$text = html_entity_decode(strip_tags($text), ENT_QUOTES | ENT_HTML5, 'UTF-8');
|
||||
$text = preg_replace('/[ \t]+/', ' ', $text) ?? $text;
|
||||
$text = preg_replace("/\n{3,}/", "\n\n", $text) ?? $text;
|
||||
|
||||
return trim(implode("\n", array_map('trim', explode("\n", $text))));
|
||||
return BankFreitext::klartext($html);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -708,7 +695,10 @@ class FinTsUeberweisung
|
|||
|
||||
$tan = [
|
||||
'bezeichnung' => $bezeichnung,
|
||||
'hinweis' => $anfrage?->getChallenge() ?? '',
|
||||
'hinweis' => StartcodeErkennung::hervorheben(
|
||||
$anfrage?->getChallenge() ?? '',
|
||||
(string)($this->zugang['startcode_muster'] ?? '')
|
||||
),
|
||||
'medium' => $anfrage?->getTanMediumName() ?? '',
|
||||
'entkoppelt' => $verfahren !== null && $verfahren->isDecoupled(),
|
||||
'bild_typ' => null,
|
||||
|
|
|
|||
69
src/Services/StartcodeErkennung.php
Normal file
69
src/Services/StartcodeErkennung.php
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Finanzmanager\Services;
|
||||
|
||||
use Finanzmanager\View;
|
||||
|
||||
/**
|
||||
* Hebt den Startcode im Fließtext einer TAN-Anfrage hervor.
|
||||
*
|
||||
* Manche Banken nennen bei der TAN-Abfrage mitten im Fließtext einen
|
||||
* Startcode für den TAN-Generator, etwa „Überprüfe den Startcode 80045248 und
|
||||
* bestätige mit der Taste OK.“ – im Fließtext geht die Zahl leicht unter.
|
||||
*
|
||||
* Erkannt wird sie über einen pro Bank hinterlegbaren Beispielsatz (das
|
||||
* „Muster“): Jede Ziffernfolge darin gilt als der variable Startcode, der
|
||||
* restliche Wortlaut muss unverändert vorkommen. Ohne eigenes Muster gilt
|
||||
* {@see STANDARD_MUSTER}.
|
||||
*/
|
||||
final class StartcodeErkennung
|
||||
{
|
||||
public const STANDARD_MUSTER = 'Überprüfe den Startcode 80045248 und bestätige mit der Taste OK.';
|
||||
|
||||
/**
|
||||
* Der Hinweistext als sicheres HTML: Fließtext escaped, Zeilenumbrüche
|
||||
* übernommen, der erkannte Startcode fett, zentriert und in eigener
|
||||
* Zeile (siehe `.startcode` in app.css).
|
||||
*/
|
||||
public static function hervorheben(string $html, ?string $muster = null): string
|
||||
{
|
||||
$klartext = BankFreitext::klartext($html);
|
||||
if ($klartext === '') {
|
||||
return '';
|
||||
}
|
||||
|
||||
$regex = self::musterZuRegex(trim($muster ?? '') !== '' ? (string)$muster : self::STANDARD_MUSTER);
|
||||
|
||||
if ($regex === null || !preg_match($regex, $klartext, $treffer, PREG_OFFSET_CAPTURE)) {
|
||||
return nl2br(View::h($klartext));
|
||||
}
|
||||
|
||||
[$code, $start] = $treffer[1];
|
||||
|
||||
$davor = substr($klartext, 0, $start);
|
||||
$danach = substr($klartext, $start + strlen($code));
|
||||
|
||||
return nl2br(View::h($davor))
|
||||
. '<strong class="startcode">' . View::h($code) . '</strong>'
|
||||
. nl2br(View::h($danach));
|
||||
}
|
||||
|
||||
/**
|
||||
* Baut aus dem Beispielsatz ein Suchmuster: Die erste Ziffernfolge wird
|
||||
* zur Lücke, der Rest muss wortgleich (nur Leerraum flexibel) vorkommen.
|
||||
* Enthält der Satz keine Zahl, lässt sich daraus kein Startcode erkennen.
|
||||
*/
|
||||
private static function musterZuRegex(string $muster): ?string
|
||||
{
|
||||
$teile = preg_split('/\d+/u', trim($muster), 2);
|
||||
if ($teile === false || count($teile) !== 2 || trim($teile[0]) === '' && trim($teile[1]) === '') {
|
||||
return null;
|
||||
}
|
||||
|
||||
$weich = static fn(string $teil): string => preg_replace('/\s+/u', '\s+', preg_quote(trim($teil), '#')) ?? '';
|
||||
|
||||
return '#' . $weich($teile[0]) . '\s*(\d+)\s*' . $weich($teile[1]) . '#u';
|
||||
}
|
||||
}
|
||||
|
|
@ -1,6 +1,7 @@
|
|||
<?php
|
||||
|
||||
use Finanzmanager\Models\Bankzugang;
|
||||
use Finanzmanager\Services\StartcodeErkennung;
|
||||
use Finanzmanager\View;
|
||||
|
||||
/** @var array<string,mixed>|null $zugang */
|
||||
|
|
@ -98,6 +99,19 @@ include __DIR__ . '/../layout/kopf.php';
|
|||
ein abweichender Stichtag angeben, ohne diese Einstellung zu ändern.
|
||||
</p>
|
||||
|
||||
<label for="startcode_muster">Startcode-Satz</label>
|
||||
<textarea id="startcode_muster" name="startcode_muster" rows="2"
|
||||
placeholder="<?= View::h(StartcodeErkennung::STANDARD_MUSTER) ?>"
|
||||
><?= View::h($wert('startcode_muster')) ?></textarea>
|
||||
<p class="feldhinweis">
|
||||
Nennt die Bank bei der TAN-Abfrage einen Startcode für den TAN-Generator, steht er
|
||||
mitten im Fließtext und geht leicht unter. Trage hier den Beispielsatz der Bank ein,
|
||||
etwa „<?= View::h(StartcodeErkennung::STANDARD_MUSTER) ?>“ – die Zahl darin gilt als
|
||||
Platzhalter für den jeweiligen Startcode, der Rest muss wortgleich vorkommen. Bei der
|
||||
nächsten TAN-Abfrage erscheint der erkannte Code dann fett und zentriert in eigener
|
||||
Zeile. Leer lassen heißt: Dieser Beispielsatz gilt als Vorgabe.
|
||||
</p>
|
||||
|
||||
<label class="ankreuzfeld">
|
||||
<input type="checkbox" name="aktiv" value="1" <?= $neu || (int)$zugang['aktiv'] === 1 ? 'checked' : '' ?>>
|
||||
aktiv
|
||||
|
|
|
|||
|
|
@ -36,7 +36,9 @@ include __DIR__ . '/../layout/kopf.php';
|
|||
<p class="hinweis"><?= View::h($meldung) ?></p>
|
||||
|
||||
<?php if (($tan['hinweis'] ?? '') !== ''): ?>
|
||||
<p class="tanhinweis"><?= View::h($tan['hinweis']) ?></p>
|
||||
<?php /* Bereits sicheres HTML aus StartcodeErkennung::hervorheben() –
|
||||
der erkannte Startcode steht darin fett und zentriert. */ ?>
|
||||
<p class="tanhinweis"><?= $tan['hinweis'] ?></p>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (($tan['medium'] ?? '') !== ''): ?>
|
||||
|
|
|
|||
93
tests/56_StartcodeErkennungTest.php
Normal file
93
tests/56_StartcodeErkennungTest.php
Normal file
|
|
@ -0,0 +1,93 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use Finanzmanager\Services\StartcodeErkennung;
|
||||
|
||||
/**
|
||||
* Erkennung und Hervorhebung des Startcodes in der TAN-Anfrage.
|
||||
*
|
||||
* Issue #115: Manche Banken nennen bei der TAN-Abfrage mitten im Fließtext
|
||||
* einen Startcode für den TAN-Generator – das Auge überliest ihn leicht.
|
||||
* Geprüft wird hier die reine Texterkennung ohne Bankverbindung; die
|
||||
* Anbindung an die TAN-Anfrage (FinTsAbruf, FinTsUeberweisung) lässt sich
|
||||
* ohne lebendige FinTS-Session nicht isoliert testen.
|
||||
*/
|
||||
class StartcodeErkennungTest extends TestCase
|
||||
{
|
||||
protected string $testName = 'Test 56: Startcode-Erkennung in der TAN-Anfrage';
|
||||
|
||||
private const BEISPIEL = 'Stecke die Karte (eeeeee 5570) in den TAN-Generator.<br>'
|
||||
. 'Drücke ggf. die SCAN-Taste und scanne den QR-Code mit der Kamera an deinem '
|
||||
. 'TAN-Generator.<br>Überprüfe den Startcode 80045248 und bestätige mit der Taste OK.<br>'
|
||||
. 'Bitte bestätige den Auftrag mit der TAN deines TAN-Generators.';
|
||||
|
||||
public function run(): void
|
||||
{
|
||||
$this->derStandardsatzErkenntDenStartcode();
|
||||
$this->einEigenesMusterErkenntEinenAnderenStartcode();
|
||||
$this->ohneTreffendesMusterBleibtDerTextUnveraendertAberSicher();
|
||||
$this->ohneTextKommtNichtsZurueck();
|
||||
$this->fremdesMarkupWirdNichtUebernommen();
|
||||
}
|
||||
|
||||
private function derStandardsatzErkenntDenStartcode(): void
|
||||
{
|
||||
$html = StartcodeErkennung::hervorheben(self::BEISPIEL, null);
|
||||
|
||||
$this->assert(
|
||||
str_contains($html, '<strong class="startcode">80045248</strong>'),
|
||||
'Der Startcode aus dem Standardsatz steht fett ausgezeichnet da'
|
||||
);
|
||||
$this->assert(
|
||||
str_contains($html, 'Überprüfe den Startcode <strong'),
|
||||
'Der Satz davor bleibt als Fließtext erhalten'
|
||||
);
|
||||
$this->assert(
|
||||
str_contains($html, 'und bestätige mit der Taste OK.'),
|
||||
'Der Satz danach bleibt als Fließtext erhalten'
|
||||
);
|
||||
}
|
||||
|
||||
private function einEigenesMusterErkenntEinenAnderenStartcode(): void
|
||||
{
|
||||
$html = StartcodeErkennung::hervorheben(
|
||||
'Bitte gib den Code 554433 in dein Gerät ein.',
|
||||
'Bitte gib den Code 999999 in dein Gerät ein.'
|
||||
);
|
||||
|
||||
$this->assert(
|
||||
str_contains($html, '<strong class="startcode">554433</strong>'),
|
||||
'Ein eigenes, pro Bank gespeichertes Muster erkennt dessen tatsächlichen Code'
|
||||
);
|
||||
}
|
||||
|
||||
private function ohneTreffendesMusterBleibtDerTextUnveraendertAberSicher(): void
|
||||
{
|
||||
$html = StartcodeErkennung::hervorheben(
|
||||
self::BEISPIEL,
|
||||
'Dieser Satz kommt in der Antwort der Bank nirgends vor 42.'
|
||||
);
|
||||
|
||||
$this->assert(!str_contains($html, 'startcode'), 'Ohne Treffer gibt es keine Hervorhebung');
|
||||
$this->assert(
|
||||
str_contains($html, 'Überprüfe den Startcode 80045248 und bestätige'),
|
||||
'Der Text bleibt trotzdem vollständig lesbar'
|
||||
);
|
||||
}
|
||||
|
||||
private function ohneTextKommtNichtsZurueck(): void
|
||||
{
|
||||
$this->assertEquals('', StartcodeErkennung::hervorheben('', null), 'Ohne Text bleibt es leer');
|
||||
}
|
||||
|
||||
private function fremdesMarkupWirdNichtUebernommen(): void
|
||||
{
|
||||
$html = StartcodeErkennung::hervorheben(
|
||||
'Überprüfe den Startcode <script>alert(1)</script>80045248 und bestätige mit der Taste OK.',
|
||||
null
|
||||
);
|
||||
|
||||
$this->assert(!str_contains($html, '<script>'), 'Fremdes Markup aus der Bankantwort wird nicht übernommen');
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue