Skip to content

Commit ebc75bd

Browse files
committed
Fix mailto handling
1 parent 096ba1d commit ebc75bd

2 files changed

Lines changed: 21 additions & 4 deletions

File tree

src/lib/Form/EventSubscriber/FixUrlProtocolListener.php

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,15 @@ public function onSubmit(FormEvent $event): void
5252
return;
5353
}
5454

55-
$schemaSeparator = $this->hasAuthority($this->defaultProtocol) ? '://' : ':';
56-
if (!preg_match('~^(?:[/.]|[\w+.-]+' . $schemaSeparator . '|[^:/?@#]++@)~', $dataLink)) {
55+
if ($this->hasAuthority($this->defaultProtocol)) {
56+
$schemaSeparator = '://';
57+
$regExp = '~^(?:[/.]|[\w+.-]+//|[^:/?@#]++@)~';
58+
} else {
59+
$schemaSeparator = ':';
60+
$regExp = '~^[\w+.-]+:~'; // allowing emails for non-http/https/file
61+
}
62+
63+
if (!preg_match($regExp, $dataLink)) {
5764
$data['link'] = $this->defaultProtocol . $schemaSeparator . $dataLink;
5865
$event->setData($data);
5966
}

tests/lib/Form/EventSubscriber/FixUrlProtocolListenerTest.php

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ public static function provideUrlCases(): iterable
5757
['link' => 'http://example.com'],
5858
];
5959

60+
yield 'keep relative url with leading / intact' => [
61+
['link' => '/foo/bar'],
62+
['link' => '/foo/bar'],
63+
];
64+
6065
yield 'keeps ftp intact' => [
6166
['link' => 'ftp://example.com'],
6267
['link' => 'ftp://example.com'],
@@ -73,9 +78,14 @@ public static function provideUrlCases(): iterable
7378
'tel',
7479
];
7580

81+
yield 'keeps mailto intact' => [
82+
['link' => 'mailto:me@home.com'],
83+
['link' => 'mailto:me@home.com'],
84+
];
85+
7686
yield 'adds default mailto' => [
77-
['link' => 'me@home.de'],
78-
['link' => 'mailto:me@home.de'],
87+
['link' => 'me@home'],
88+
['link' => 'mailto:me@home'],
7989
'mailto',
8090
];
8191

0 commit comments

Comments
 (0)