Page MenuHomePhorge

D5490.1775282797.diff
No OneTemporary

Authored By
Unknown
Size
7 KB
Referenced Files
None
Subscribers
None

D5490.1775282797.diff

diff --git a/docker/postfix/rootfs/usr/libexec/postfix/kolab_contentfilter_cli b/docker/postfix/rootfs/usr/libexec/postfix/kolab_contentfilter_cli
--- a/docker/postfix/rootfs/usr/libexec/postfix/kolab_contentfilter_cli
+++ b/docker/postfix/rootfs/usr/libexec/postfix/kolab_contentfilter_cli
@@ -79,24 +79,31 @@
verify=True
)
- if response.status_code == 204:
+ if response.status_code != 200:
+ logging.warning(f"Invalid status code {response.status_code}.")
+ print(f"Invalid status code {response.status_code}")
+ sys.exit(EX_TEMPFAIL)
+
+ result = response.headers['X-Kolab-Mailfilter-Action']
+
+ if result == 'ACCEPT_EMPTY':
logging.debug("No changes requested, reinjecting original content.")
print("Unmodified email")
- elif response.status_code == 200:
+ elif result == 'ACCEPT':
logging.debug("Updating content.")
print("Modified email")
content = response.text
- elif response.status_code == 460:
+ elif result == 'REJECT':
logging.debug("Rejecting email.")
print("Rejecting email")
sys.exit(EX_UNAVAILABLE)
- elif response.status_code == 461:
+ elif result == 'DISCARD':
logging.debug("Ignoring email.")
print("Dropping email")
sys.exit(EX_SUCCESS)
else:
- logging.warning(f"Unknown status code {response.status_code}.")
- print(f"Unknown status code {response.status_code}")
+ logging.warning(f"Unknown X-Kolab-Mailfilter status {result}.")
+ print(f"Unknown X-Kolab-Mailfilter status {result}")
sys.exit(EX_TEMPFAIL)
# pylint: disable=broad-except
diff --git a/src/app/Policy/Mailfilter.php b/src/app/Policy/Mailfilter.php
--- a/src/app/Policy/Mailfilter.php
+++ b/src/app/Policy/Mailfilter.php
@@ -12,11 +12,11 @@
class Mailfilter
{
- public const CODE_ACCEPT = 200;
- public const CODE_ACCEPT_EMPTY = 204;
- public const CODE_DISCARD = 461;
- public const CODE_REJECT = 460;
- public const CODE_ERROR = 500;
+ public const HEADER = 'X-Kolab-Mailfilter-Action';
+ public const HEADER_ACCEPT = 'ACCEPT';
+ public const HEADER_ACCEPT_EMPTY = 'ACCEPT_EMPTY';
+ public const HEADER_DISCARD = 'DISCARD';
+ public const HEADER_REJECT = 'REJECT';
protected static $debugid = '';
@@ -55,8 +55,9 @@
// Email with multiple recipients, which we don't handle at the moment.
// Likely an outgoing email, so we just accept.
if (str_contains($request->recipient, ",")) {
- self::debug('Multiple recipients', self::CODE_ACCEPT_EMPTY);
- return response('', self::CODE_ACCEPT_EMPTY);
+ self::debug('Multiple recipients', self::HEADER_ACCEPT_EMPTY);
+ return response('', 200)
+ ->header(self::HEADER, self::HEADER_ACCEPT_EMPTY);
}
// Find the recipient user
@@ -64,16 +65,18 @@
// Not a local recipient, so e.g. an outgoing email
if (empty($user)) {
- self::debug('Unknown recipient', self::CODE_ACCEPT_EMPTY);
- return response('', self::CODE_ACCEPT_EMPTY);
+ self::debug('Unknown recipient', self::HEADER_ACCEPT_EMPTY);
+ return response('', 200)
+ ->header(self::HEADER, self::HEADER_ACCEPT_EMPTY);
}
// Get list of enabled modules for the recipient user
$modules = self::getModulesConfig($user);
if (empty($modules)) {
- self::debug('All modules disabled', self::CODE_ACCEPT_EMPTY);
- return response('', self::CODE_ACCEPT_EMPTY);
+ self::debug('All modules disabled', self::HEADER_ACCEPT_EMPTY);
+ return response('', 200)
+ ->header(self::HEADER, self::HEADER_ACCEPT_EMPTY);
}
// Handle the mail content from the input
@@ -82,8 +85,8 @@
if (count($files) == 1) {
$file = $files[array_key_first($files)];
if (!$file->isValid()) {
- self::debug('Invalid file upload', self::CODE_ERROR);
- return response('Invalid file upload', self::CODE_ERROR);
+ self::debug('Invalid file upload', 500);
+ return response('Invalid file upload', 500);
}
$stream = fopen($file->path(), 'r');
@@ -113,14 +116,14 @@
if ($result) {
if ($result->getStatus() == Result::STATUS_REJECT) {
- self::debug("Rejected by {$module_name}", self::CODE_REJECT);
- // FIXME: Better code? Should we use custom header instead?
- return response('', self::CODE_REJECT);
+ self::debug("Rejected by {$module_name}", self::HEADER_REJECT);
+ return response('', 200)
+ ->header(self::HEADER, self::HEADER_REJECT);
}
if ($result->getStatus() == Result::STATUS_DISCARD) {
- self::debug("Discarded by {$module_name}", self::CODE_DISCARD);
- // FIXME: Better code? Should we use custom header instead?
- return response('', self::CODE_DISCARD);
+ self::debug("Rejected by {$module_name}", self::HEADER_DISCARD);
+ return response('', 200)
+ ->header(self::HEADER, self::HEADER_DISCARD);
}
}
}
@@ -132,6 +135,7 @@
$response->headers->replace([
'Content-Type' => 'message/rfc822',
'Content-Disposition' => 'attachment',
+ self::HEADER => self::HEADER_ACCEPT,
]);
$stream = $parser->getStream();
@@ -141,14 +145,13 @@
fclose($stream);
});
- self::debug('Message modified', self::CODE_ACCEPT);
-
+ self::debug('Message modified', self::HEADER_ACCEPT);
return $response;
}
- self::debug('Message intact', self::CODE_ACCEPT_EMPTY);
-
- return response('', self::CODE_ACCEPT_EMPTY);
+ self::debug('Message intact', self::HEADER_ACCEPT_EMPTY);
+ return response('', 200)
+ ->header(self::HEADER, self::HEADER_ACCEPT_EMPTY);
}
/**
diff --git a/src/tests/Feature/Policy/MailfilterTest.php b/src/tests/Feature/Policy/MailfilterTest.php
--- a/src/tests/Feature/Policy/MailfilterTest.php
+++ b/src/tests/Feature/Policy/MailfilterTest.php
@@ -53,7 +53,8 @@
$request = new Request($get, [], [], [], [], [], $mail);
$response = Mailfilter::handle($request);
- $this->assertSame(Mailfilter::CODE_ACCEPT_EMPTY, $response->status());
+ $this->assertSame(200, $response->status());
+ $this->assertSame(Mailfilter::HEADER_ACCEPT_EMPTY, $response->headers->get(Mailfilter::HEADER));
$this->assertSame('', $response->content());
$john = $this->getTestUser('john@kolab.org');
@@ -63,7 +64,8 @@
$request = new Request($get, [], [], [], [], [], $mail);
$response = Mailfilter::handle($request);
- $this->assertSame(Mailfilter::CODE_ACCEPT_EMPTY, $response->status());
+ $this->assertSame(200, $response->status());
+ $this->assertSame(Mailfilter::HEADER_ACCEPT_EMPTY, $response->headers->get(Mailfilter::HEADER));
$this->assertSame('', $response->content());
// Note: We using HTTP controller here for easier use of Laravel request/response

File Metadata

Mime Type
text/plain
Expires
Sat, Apr 4, 6:06 AM (9 h, 27 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
18828319
Default Alt Text
D5490.1775282797.diff (7 KB)

Event Timeline