Skip to content
This repository has been archived by the owner on Dec 27, 2023. It is now read-only.

Commit

Permalink
fix(Felamimail/spam): copy tempfile error with invalid char
Browse files Browse the repository at this point in the history
  • Loading branch information
ccheng-dev committed Aug 23, 2021
1 parent c8f983d commit 8fcdc1f
Show file tree
Hide file tree
Showing 2 changed files with 87 additions and 27 deletions.
102 changes: 80 additions & 22 deletions tests/tine20/Felamimail/Model/MessagePipeTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,17 @@ public function testMessagePipeCreateDuplicatedFolder()
$pipe = 'spam';

// move to root
$this->_messagePipeTestHelper($config[$pipe]);
$this->_messagePipeTestHelper($config[$pipe]);
$message = $this->_messagePipeTestHelper();
$this->_executePipeLine($config[$pipe], $message);
$message = $this->_messagePipeTestHelper();
$this->_executePipeLine($config[$pipe], $message);

// move to sub folder
$config[$pipe]['config']['target']['folder'] = 'INBOX/SPAM';
$this->_messagePipeTestHelper($config[$pipe]);
$this->_messagePipeTestHelper($config[$pipe]);
$message = $this->_messagePipeTestHelper();
$this->_executePipeLine($config[$pipe], $message);
$message = $this->_messagePipeTestHelper();
$this->_executePipeLine($config[$pipe], $message);
}

/**
Expand Down Expand Up @@ -79,21 +83,25 @@ public function testMessagePipeCopyToInternalAccount()

$pipe = 'spam';

$message = $this->_messagePipeTestHelper($config[$pipe]);
$message = $this->_messagePipeTestHelper();
$this->_executePipeLine($config[$pipe], $message);
$this->_assertMessageInFolder('spam', $message['subject']);

// move to sub folder
$config[$pipe]['config']['target']['folder'] = 'INBOX/SPAM';
$message = $this->_messagePipeTestHelper($config[$pipe]);
$message = $this->_messagePipeTestHelper();
$this->_executePipeLine($config[$pipe], $message);
$this->_assertMessageInFolder('INBOX.SPAM', $message['subject'] );

$pipe = 'ham';

$message = $this->_messagePipeTestHelper($config[$pipe]);
$message = $this->_messagePipeTestHelper();
$this->_executePipeLine($config[$pipe], $message);
$this->_assertMessageInFolder('ham', $message['subject']);

$config[$pipe]['config']['target']['folder'] = 'INBOX/HAM';
$message = $this->_messagePipeTestHelper($config[$pipe]);
$message = $this->_messagePipeTestHelper();
$this->_executePipeLine($config[$pipe], $message);
$this->_assertMessageInFolder('INBOX.HAM', $message['subject'] );
}

Expand Down Expand Up @@ -134,21 +142,25 @@ public function testMessagePipeCopyToAnotherAccount()
// move to root
$pipe = 'spam';

$message = $this->_messagePipeTestHelper($config[$pipe], $account);
$message = $this->_messagePipeTestHelper($account);
$this->_executePipeLine($config[$pipe], $message);
$this->_assertMessageInFolder('spam', $message['subject'], $account);

// move to sub folder
$config[$pipe]['config']['target']['folder'] = 'INBOX/SPAM';
$message = $this->_messagePipeTestHelper($config[$pipe], $account);
$message = $this->_messagePipeTestHelper($account);
$this->_executePipeLine($config[$pipe], $message);
$this->_assertMessageInFolder('INBOX.SPAM', $message['subject'], $account);

$pipe = 'ham';

$message = $this->_messagePipeTestHelper($config[$pipe], $account);
$message = $this->_messagePipeTestHelper($account);
$this->_executePipeLine($config[$pipe], $message);
$this->_assertMessageInFolder('ham', $message['subject']);

$config[$pipe]['config']['target']['folder'] = 'INBOX/HAM';
$message = $this->_messagePipeTestHelper($config[$pipe], $account);
$message = $this->_messagePipeTestHelper($account);
$this->_executePipeLine($config[$pipe], $message);
$this->_assertMessageInFolder('INBOX.HAM', $message['subject'], $account);
}

Expand Down Expand Up @@ -183,19 +195,58 @@ public function testMessagePipeCopyToLocalDir()
];

// send message and copy to spam dir
$message = $this->_messagePipeTestHelper($config['spam']);
$message = $this->_messagePipeTestHelper();
$this->_executePipeLine($config['spam'], $message);
$this->_assertMessageInFolder('INBOX', $message['subject']);
// assert eml in $tmp . '/spam'
self::assertTrue(is_dir($tmp . '/spam'), 'no spam dir found');
$filename = $tmp . '/spam/' . $message->headers['message-id'] . '.eml';

$filename = preg_replace("/[^\w\d@._-]|\.\./", "", $message->headers['message-id']);
$filename = $tmp . '/spam/' . $filename . '.eml';
self::assertTrue(file_exists($filename), 'eml file not found: ' . $filename);

// send message and copy to ham dir
$message = $this->_messagePipeTestHelper($config['ham']);
$message = $this->_messagePipeTestHelper();
$this->_executePipeLine($config['ham'], $message);
$this->_assertMessageInFolder('INBOX', $message['subject']);
// assert eml in $tmp . '/ham'
self::assertTrue(is_dir($tmp . '/ham'), 'no ham dir found');
$filename = $tmp . '/ham/' . $message->headers['message-id'] . '.eml';

$filename = preg_replace("/[^\w\d@._-]|\.\./", "", $message->headers['message-id']);
$filename = $tmp . '/ham/' . $filename . '.eml';
self::assertTrue(file_exists($filename), 'eml file not found: ' . $filename);
}

/**
* test message pipe spam copy strategy with invalid char
*
* @throws Tinebase_Exception_Record_NotAllowed
* @throws Exception
*/
public function testMessagePipeCopyWithInvalidChar()
{
$this->_testNeedsTransaction();
$tmp = Tinebase_Core::getTempDir();

$config = [
'spam' => [
'strategy' => 'copy',
'config' => [
'target' => [
'local_directory' => $tmp . '/spam'
]
]
]
];

// char '/' is invalid
$message = $this->_messagePipeTestHelper();
$message->headers = [];
$message->message_id = '<123abcABC._-@/\!=+>..';

$this->_executePipeLine($config['spam'], $message);

$filename = $tmp . '/spam/' . '123abcABC._-@.eml';
self::assertTrue(file_exists($filename), 'eml file not found: ' . $filename);
}

Expand Down Expand Up @@ -225,7 +276,9 @@ public function testMessagePipeMove()
$inbox = $this->_getFolder('INBOX');
$inboxBefore = $this->_json->updateMessageCache($inbox['id'], 30);

$message = $this->_messagePipeTestHelper($config[$pipe]);
$message = $this->_messagePipeTestHelper();
$this->_executePipeLine($config[$pipe], $message);

$inboxAfter = $this->_getFolder('INBOX');

$this->assertEquals($inboxBefore['cache_unreadcount'], $inboxAfter['cache_unreadcount']);
Expand Down Expand Up @@ -253,7 +306,9 @@ public function testMessagePipeRewriteSubject()
]
];

$this->_messagePipeTestHelper($config[$pipe]);
$message = $this->_messagePipeTestHelper();
$this->_executePipeLine($config[$pipe], $message);

$this->_assertMessageInFolder('INBOX', 'test messagePipe');
}

Expand All @@ -276,7 +331,7 @@ public function testMessagePipeRewriteSubject()
* @throws Tinebase_Exception_Record_NotAllowed
* @throws Tinebase_Exception_Record_Validation
*/
public function _messagePipeTestHelper($_config, $_account = null)
public function _messagePipeTestHelper($_account = null)
{
// set spam strategy config
$this->_setFeatureForTest(Felamimail_Config::getInstance(), Felamimail_Config::FEATURE_SPAM_SUSPICION_STRATEGY);
Expand All @@ -297,7 +352,12 @@ public function _messagePipeTestHelper($_config, $_account = null)
$subject);

$message = Felamimail_Controller_Message::getInstance()->getCompleteMessage($message['id']);

return $message;
}

public function _executePipeLine($_config, $_message)
{
// create and execute pipeLine
$pipeLineRecord = Felamimail_Model_MessagePipeConfig::factory($_config);
$rs = new Tinebase_Record_RecordSet(Felamimail_Model_MessagePipeConfig::class);
Expand All @@ -306,8 +366,6 @@ public function _messagePipeTestHelper($_config, $_account = null)
Felamimail_Model_MessagePipeConfig::FLDS_CONFIG_RECORD => $pipeLineRecord]));

$pipeLine = new Tinebase_BL_Pipe($rs);
$pipeLine->execute($message);

return $message;
$pipeLine->execute($_message);
}
}
12 changes: 7 additions & 5 deletions tine20/Felamimail/Model/MessagePipeCopy.php
Original file line number Diff line number Diff line change
Expand Up @@ -42,17 +42,19 @@ public function execute(Tinebase_BL_PipeContext $_context, Tinebase_BL_DataInter

// create directory if it does not exist
$targetDir = $this->_config['target']['local_directory'];

if (! is_dir($targetDir)) {
mkdir($targetDir);
}

// put message as eml into local_directory (filename = MESSAGE-ID.eml)
$tempFile = Felamimail_Controller_Message::getInstance()->putRawMessageIntoTempfile($message);
if (isset($message->headers['message-id'])) {
$filename = $message->headers['message-id'] . '.eml';
} else {
$filename = $message->getId() . '.eml';
}
$filename = isset($message->headers['message-id']) ? $message->headers['message-id'] : $message->message_id;
$filename = preg_replace("/[^\w\d@._-]|\.\./", "", $filename) . '.eml';

Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Copy file to temp path: '
. $tempFile->path . ' -> ' . $targetDir . DIRECTORY_SEPARATOR . $filename);

copy($tempFile->path, $targetDir . DIRECTORY_SEPARATOR . $filename);
} else {
$accountId = isset($this->_config['target']['accountid']) ?
Expand Down

0 comments on commit 8fcdc1f

Please sign in to comment.