Skip to content

Commit

Permalink
Fix: Attachment::decodeName remove .. from file name (#501)
Browse files Browse the repository at this point in the history
If attached file has name like test..xml, then dots remove and broke file extension.
  • Loading branch information
neolip authored Jan 17, 2025
1 parent 6bd8ba4 commit 1cabca6
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 1 deletion.
7 changes: 6 additions & 1 deletion src/Attachment.php
Original file line number Diff line number Diff line change
Expand Up @@ -325,7 +325,12 @@ public function decodeName(?string $name): string {

// sanitize $name
// order of '..' is important
return str_replace(['\\', '/', chr(0), ':', '..'], '', $name);
$replaces = [
'/\\\\/' => '',
'/[\/\0:]+/' => '',
'/\.+/' => '.',
];
return preg_replace(array_keys($replaces), array_values($replaces), $name);
}
return "";
}
Expand Down
37 changes: 37 additions & 0 deletions tests/AttachmentTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?php

declare(strict_types=1);

namespace Tests;

use Tests\fixtures\FixtureTestCase;
use Webklex\PHPIMAP\Attachment;

class AttachmentTest extends FixtureTestCase
{
protected Attachment $attachment;

public function setUp(): void
{
$message = $this->getFixture("attachment_encoded_filename.eml");
$this->attachment = $message->getAttachments()->first();
}
/**
* @dataProvider decodeNameDataProvider
*/
public function testDecodeName(string $input, string $output): void
{
$name = $this->attachment->decodeName($input);
$this->assertEquals($output, $name);
}

public function decodeNameDataProvider(): array
{
return [
['../../../../../../../../../../../var/www/shell.php', '.varwwwshell.php'],
['test..xml', 'test.xml'],
[chr(0), ''],
['C:\\file.txt', 'Cfile.txt'],
];
}
}

0 comments on commit 1cabca6

Please sign in to comment.