Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F117761563
D5490.1775214740.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Authored By
Unknown
Size
7 KB
Referenced Files
None
Subscribers
None
D5490.1775214740.diff
View Options
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-Action {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_ACTION_ACCEPT = 'ACCEPT';
+ public const HEADER_ACTION_ACCEPT_EMPTY = 'ACCEPT_EMPTY';
+ public const HEADER_ACTION_DISCARD = 'DISCARD';
+ public const HEADER_ACTION_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_ACTION_ACCEPT_EMPTY);
+ return response('', 200)
+ ->header(self::HEADER, self::HEADER_ACTION_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_ACTION_ACCEPT_EMPTY);
+ return response('', 200)
+ ->header(self::HEADER, self::HEADER_ACTION_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_ACTION_ACCEPT_EMPTY);
+ return response('', 200)
+ ->header(self::HEADER, self::HEADER_ACTION_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_ACTION_REJECT);
+ return response('', 200)
+ ->header(self::HEADER, self::HEADER_ACTION_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_ACTION_DISCARD);
+ return response('', 200)
+ ->header(self::HEADER, self::HEADER_ACTION_DISCARD);
}
}
}
@@ -132,6 +135,7 @@
$response->headers->replace([
'Content-Type' => 'message/rfc822',
'Content-Disposition' => 'attachment',
+ self::HEADER => self::HEADER_ACTION_ACCEPT,
]);
$stream = $parser->getStream();
@@ -141,14 +145,13 @@
fclose($stream);
});
- self::debug('Message modified', self::CODE_ACCEPT);
-
+ self::debug('Message modified', self::HEADER_ACTION_ACCEPT);
return $response;
}
- self::debug('Message intact', self::CODE_ACCEPT_EMPTY);
-
- return response('', self::CODE_ACCEPT_EMPTY);
+ self::debug('Message intact', self::HEADER_ACTION_ACCEPT_EMPTY);
+ return response('', 200)
+ ->header(self::HEADER, self::HEADER_ACTION_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_ACTION_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_ACTION_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
Details
Attached
Mime Type
text/plain
Expires
Fri, Apr 3, 11:12 AM (7 h, 42 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
18823782
Default Alt Text
D5490.1775214740.diff (7 KB)
Attached To
Mode
D5490: Use a header instead of http status codes for the mailfilter
Attached
Detach File
Event Timeline