X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=postlicyd%2Fquery.c;h=01b7ca422d0d570c9522ac21e625ceecd2001590;hb=e327d3786ba0371eaaff8e6ba0fe3fc39f095ae2;hp=26b590a878e0b3118fa0cf51803cf80c274d4895;hpb=520b2f3bb198bfbb88b90b058ef610f0a9b980c6;p=apps%2Fpfixtools.git diff --git a/postlicyd/query.c b/postlicyd/query.c index 26b590a..01b7ca4 100644 --- a/postlicyd/query.c +++ b/postlicyd/query.c @@ -72,8 +72,6 @@ bool query_parse(query_t *query, char *p) #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); @@ -93,6 +91,24 @@ bool query_parse(query_t *query, char *p) 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); @@ -133,3 +149,42 @@ bool query_parse(query_t *query, char *p) #undef PARSE_CHECK } +const char *query_field_for_id(const query_t *query, postlicyd_token id) +{ + switch (id) { +#define CASE(Up, Low) \ + case PTK_ ## Up: return query->Low; + 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) + CASE(REVERSE_CLIENT_NAME, reverse_client_name) + CASE(INSTANCE, instance) + CASE(SASL_METHOD, sasl_method) + CASE(SASL_USERNAME, sasl_username) + CASE(SASL_SENDER, sasl_sender) + CASE(SIZE, size) + CASE(CCERT_SUBJECT, ccert_subject) + CASE(CCERT_ISSUER, ccert_issuer) + CASE(CCERT_FINGERPRINT, ccert_fingerprint) + CASE(ENCRYPTION_PROTOCOL, encryption_protocol) + CASE(ENCRYPTION_CIPHER, encryption_cipher) + CASE(ENCRYPTION_KEYSIZE, encryption_keysize) + CASE(ETRN_DOMAIN, etrn_domain) + CASE(STRESS, stress) +#undef CASE + default: return NULL; + } +} + +const char *query_field_for_name(const query_t *query, const char *name) +{ + postlicyd_token id = policy_tokenize(name, strlen(name)); + return query_field_for_id(query, id); +} +