Skip to content

Commit 4ad10d2

Browse files
committed
Fix extract of namespaced itemtype from mail header
1 parent 2c2810c commit 4ad10d2

File tree

3 files changed

+28
-2
lines changed

3 files changed

+28
-2
lines changed

phpunit/imap/MailCollectorTest.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636

3737
use Config;
3838
use DbTestCase;
39+
use Glpi\Socket;
3940
use Glpi\Toolbox\Sanitizer;
4041
use ITILFollowup;
4142
use Laminas\Mail\Storage\Message;
@@ -393,6 +394,8 @@ public static function itemReferenceHeaderProvider()
393394
$soft_id = getItemByTypeName('SoftwareLicense', '_test_softlic_1', true);
394395
$soft_notif = new NotificationTargetSoftwareLicense($root_ent_id, 'test_event', getItemByTypeName('SoftwareLicense', '_test_softlic_1'));
395396

397+
$socket_id = getItemByTypeName(Socket::class, '_socket01', true);
398+
396399
$uuid = Config::getUuid('notification');
397400

398401
$time1 = time() - 548;
@@ -545,6 +548,15 @@ public static function itemReferenceHeaderProvider()
545548
'expected_items_id' => $ticket_id,
546549
'accepted' => true,
547550
],
551+
// References generated by GLPI 10.0.7+ - found item (with namespace), reference event
552+
[
553+
'headers' => [
554+
'references' => "GLPI_{$uuid}-Glpi-Socket-{$socket_id}/new@{$uname1}",
555+
],
556+
'expected_itemtype' => Socket::class,
557+
'expected_items_id' => $socket_id,
558+
'accepted' => true,
559+
],
548560
// References generated by GLPI 10.0.7+ - found item, other event
549561
[
550562
'headers' => [
@@ -554,6 +566,15 @@ public static function itemReferenceHeaderProvider()
554566
'expected_items_id' => $ticket_id,
555567
'accepted' => true,
556568
],
569+
// References generated by GLPI 10.0.7+ - found item (with namespace), other event
570+
[
571+
'headers' => [
572+
'references' => "GLPI_{$uuid}-Glpi-Socket-{$socket_id}/update.{$time1}.{$rand1}@{$uname1}",
573+
],
574+
'expected_itemtype' => Socket::class,
575+
'expected_items_id' => $socket_id,
576+
'accepted' => true,
577+
],
557578
// References generated by GLPI 10.0.7+ - invalid itemtype
558579
[
559580
'headers' => [

src/MailCollector.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2402,12 +2402,13 @@ private function extractValuesFromRefHeader(string $header): ?array
24022402
$pattern = '/'
24032403
. 'GLPI'
24042404
. '_(?<uuid>[a-z0-9]+)' // uuid
2405-
. '(-(?<itemtype>[a-z]+)-(?<items_id>[0-9]+))?' // optional itemtype + items_id (only when related to an item)
2405+
. '(-(?<itemtype>[a-z\-]+)-(?<items_id>[0-9]+))?' // optional itemtype + items_id (only when related to an item)
24062406
. '\/(?<event>[a-z_]+)' // event
24072407
. '(\.[0-9]+\.[0-9]+)?' // optional time + rand (only when NOT related to an item OR when event is not the reference one)
24082408
. '@.+' // uname
24092409
. '/i';
24102410
if (preg_match($pattern, $header, $values) === 1) {
2411+
$values['itemtype'] = str_replace('-', '\\', $values['itemtype']); // restore backslashes in namespaced classes
24112412
$values += $defaults;
24122413
return $values;
24132414
}

src/NotificationTarget.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,11 @@ final public static function getMessageIdForEvent(?string $itemtype, ?int $items
293293

294294
$reference_event = null;
295295
if ($is_item_related) {
296-
$message_id .= sprintf('-%s-%d', str_replace(['\\', '/'], '-', $itemtype), $items_id);
296+
$message_id .= sprintf(
297+
'-%s-%d',
298+
str_replace('\\', '-', $itemtype), // RFC 2822 does not allow backslashes (namespaced classes)
299+
$items_id
300+
);
297301
$reference_event = $itemtype::getMessageReferenceEvent($event);
298302
}
299303

0 commit comments

Comments
 (0)