# currently only email OR hostname fields are supported. You MUST choose only
# one of these types per strlist, and be carefull that the field you requested
# are available in the protocol state you want to use this filter for.
-# * hostname fields: helo_name, client_name, reverse_client_name
+# * hostname fields: helo_name, client_name, reverse_client_name, sender_domain,
+# recipient_domain
# * email fields: sender, recipient
# No space is allowed in this parameter.
# Return value:
# emitted by postfix. This list with description of each
# field is available at:
# http://www.postfix.org/SMTPD_POLICY_README.html
+# postlicyd also support fields sender_domain and recipient_domain
# * OP is an operator. Available operators are:
# == field_name is strictly equal to value
# =i field_name is case insensitively equal to value
CASE(HELO_NAME, helo_name)
CASE(QUEUE_ID, queue_id)
CASE(SENDER, sender)
+ CASE(SENDER_DOMAIN, sender_domain)
CASE(RECIPIENT, recipient)
+ CASE(RECIPIENT_DOMAIN, recipient_domain)
CASE(RECIPIENT_COUNT, recipient_count)
CASE(CLIENT_ADDRESS, client_address)
CASE(CLIENT_NAME, client_name)
## reverse_client_name
## instance
#
+# helpers
+## sender_domain
+## recipient_domain
+#
# postfix 2.2+
## sasl_method
## sasl_username
#define CASE(up, low) case PTK_##up: query->low = v; v[vlen] = '\0'; break;
CASE(HELO_NAME, helo_name);
CASE(QUEUE_ID, queue_id);
- CASE(SENDER, sender);
- CASE(RECIPIENT, recipient);
CASE(RECIPIENT_COUNT, recipient_count);
CASE(CLIENT_ADDRESS, client_address);
CASE(CLIENT_NAME, client_name);
CASE(STRESS, stress);
#undef CASE
+ case PTK_SENDER:
+ query->sender = v;
+ v[vlen] = '\0';
+ query->sender_domain = memchr(query->sender, '@', vlen);
+ if (query->sender_domain != NULL) {
+ ++query->sender_domain;
+ }
+ break;
+
+ case PTK_RECIPIENT:
+ query->recipient = v;
+ v[vlen] = '\0';
+ query->recipient_domain = memchr(query->recipient, '@', vlen);
+ if (query->recipient_domain != NULL) {
+ ++query->recipient_domain;
+ }
+ break;
+
case PTK_REQUEST:
PARSE_CHECK(vtk == PTK_SMTPD_ACCESS_POLICY,
"unexpected `request' value: %.*s", vlen, v);
const char *reverse_client_name;
const char *instance;
+ /* useful data extracted from previous ones */
+ const char *sender_domain;
+ const char *recipient_domain;
+
/* postfix 2.2+ */
const char *sasl_method;
const char *sasl_username;
int hard_threshold;
unsigned is_email :1;
+ unsigned is_hostname :1;
+
unsigned match_sender :1;
unsigned match_recipient :1;
- unsigned is_hostname :1;
unsigned match_helo :1;
unsigned match_client :1;
unsigned match_reverse :1;
CASE(HELO_NAME, helo, hostname);
CASE(CLIENT_NAME, client, hostname);
CASE(REVERSE_CLIENT_NAME, reverse, hostname);
+ CASE(SENDER_DOMAIN, sender, hostname);
+ CASE(RECIPIENT_DOMAIN, recipient, hostname);
CASE(SENDER, sender, email);
CASE(RECIPIENT, recipient, email);
#undef CASE
LOOKUP(helo, helo_name);
LOOKUP(client, client_name);
LOOKUP(reverse, reverse_client_name);
+ LOOKUP(recipient, recipient_domain);
+ LOOKUP(sender, sender_domain);
}
#undef LOOKUP
if (sum >= config->hard_threshold) {