Move some code.
[apps/pfixtools.git] / postlicyd / query.c
index e2511c1..01b7ca4 100644 (file)
@@ -42,7 +42,7 @@ bool query_parse(query_t *query, char *p)
 #define PARSE_CHECK(expr, error, ...)                                        \
     do {                                                                     \
         if (!(expr)) {                                                       \
-            syslog(LOG_ERR, error, ##__VA_ARGS__);                           \
+            err(error, ##__VA_ARGS__);                                       \
             return false;                                                    \
         }                                                                    \
     } while (0)
@@ -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);
@@ -124,7 +140,7 @@ bool query_parse(query_t *query, char *p)
             break;
 
           default:
-            syslog(LOG_WARNING, "unexpected key, skipped: %.*s", klen, k);
+            warn("unexpected key, skipped: %.*s", klen, k);
             continue;
         }
     }
@@ -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);
+}
+