Skip to content

Commit

Permalink
Fix: Attachment::decodeName remove .. from file name
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 committed Jun 14, 2024
1 parent 6d99943 commit a3be803
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 @@ -314,7 +314,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 a3be803

Please sign in to comment.