X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/b08b24c880b30c34f3ed5f4c59a286fdefb1c0f5..fb2274d4a2c4398a497fbec5cacebaab7d20a127:/src/src/expand.c diff --git a/src/src/expand.c b/src/src/expand.c index 49af95fd9..9c9dc22f4 100644 --- a/src/src/expand.c +++ b/src/src/expand.c @@ -1,4 +1,4 @@ -/* $Cambridge: exim/src/src/expand.c,v 1.12 2005/01/25 14:16:33 ph10 Exp $ */ +/* $Cambridge: exim/src/src/expand.c,v 1.14 2005/03/08 15:32:02 tom Exp $ */ /************************************************* * Exim - an Internet mail transport agent * @@ -285,7 +285,10 @@ enum { vtype_host_lookup, /* value not used; get host name */ vtype_load_avg, /* value not used; result is int from os_getloadavg */ vtype_pspace, /* partition space; value is T/F for spool/log */ - vtype_pinodes /* partition inodes; value is T/F for spool/log */ + vtype_pinodes /* partition inodes; value is T/F for spool/log */ +#ifdef EXPERIMENTAL_DOMAINKEYS + ,vtype_dk_verify /* Serve request out of DomainKeys verification structure */ +#endif }; /* This table must be kept in alphabetical order. */ @@ -335,6 +338,19 @@ static var_entry var_table[] = { #ifdef WITH_OLD_DEMIME { "demime_errorlevel", vtype_int, &demime_errorlevel }, { "demime_reason", vtype_stringptr, &demime_reason }, +#endif +#ifdef EXPERIMENTAL_DOMAINKEYS + { "dk_domain", vtype_stringptr, &dk_signing_domain }, + { "dk_is_signed", vtype_dk_verify, NULL }, + { "dk_result", vtype_dk_verify, NULL }, + { "dk_selector", vtype_stringptr, &dk_signing_selector }, + { "dk_sender", vtype_dk_verify, NULL }, + { "dk_sender_domain", vtype_dk_verify, NULL }, + { "dk_sender_local_part",vtype_dk_verify, NULL }, + { "dk_sender_source", vtype_dk_verify, NULL }, + { "dk_signsall", vtype_dk_verify, NULL }, + { "dk_status", vtype_dk_verify, NULL }, + { "dk_testing", vtype_dk_verify, NULL }, #endif { "dnslist_domain", vtype_stringptr, &dnslist_domain }, { "dnslist_text", vtype_stringptr, &dnslist_text }, @@ -346,7 +362,7 @@ static var_entry var_table[] = { { "exim_uid", vtype_uid, &exim_uid }, #ifdef WITH_OLD_DEMIME { "found_extension", vtype_stringptr, &found_extension }, -#endif +#endif { "home", vtype_stringptr, &deliver_home }, { "host", vtype_stringptr, &deliver_host }, { "host_address", vtype_stringptr, &deliver_host_address }, @@ -369,7 +385,7 @@ static var_entry var_table[] = { { "local_user_uid", vtype_uid, &local_user_uid }, { "localhost_number", vtype_int, &host_number }, { "log_inodes", vtype_pinodes, (void *)FALSE }, - { "log_space", vtype_pspace, (void *)FALSE }, + { "log_space", vtype_pspace, (void *)FALSE }, { "mailstore_basename", vtype_stringptr, &mailstore_basename }, #ifdef WITH_CONTENT_SCAN { "malware_name", vtype_stringptr, &malware_name }, @@ -426,7 +442,7 @@ static var_entry var_table[] = { { "received_for", vtype_stringptr, &received_for }, { "received_protocol", vtype_stringptr, &received_protocol }, { "recipient_data", vtype_stringptr, &recipient_data }, - { "recipient_verify_failure",vtype_stringptr,&recipient_verify_failure }, + { "recipient_verify_failure",vtype_stringptr,&recipient_verify_failure }, { "recipients", vtype_recipients, NULL }, { "recipients_count", vtype_int, &recipients_count }, #ifdef WITH_CONTENT_SCAN @@ -450,8 +466,8 @@ static var_entry var_table[] = { { "sender_host_port", vtype_int, &sender_host_port }, { "sender_ident", vtype_stringptr, &sender_ident }, { "sender_rcvhost", vtype_stringptr, &sender_rcvhost }, - { "sender_verify_failure",vtype_stringptr, &sender_verify_failure }, - { "smtp_active_hostname", vtype_stringptr, &smtp_active_hostname }, + { "sender_verify_failure",vtype_stringptr, &sender_verify_failure }, + { "smtp_active_hostname", vtype_stringptr, &smtp_active_hostname }, { "smtp_command_argument", vtype_stringptr, &smtp_command_argument }, { "sn0", vtype_filter_int, &filter_sn[0] }, { "sn1", vtype_filter_int, &filter_sn[1] }, @@ -477,7 +493,7 @@ static var_entry var_table[] = { #endif { "spool_directory", vtype_stringptr, &spool_directory }, { "spool_inodes", vtype_pinodes, (void *)TRUE }, - { "spool_space", vtype_pspace, (void *)TRUE }, + { "spool_space", vtype_pspace, (void *)TRUE }, #ifdef EXPERIMENTAL_SRS { "srs_db_address", vtype_stringptr, &srs_db_address }, { "srs_db_key", vtype_stringptr, &srs_db_key }, @@ -1238,6 +1254,50 @@ while (last > first) if (!filter_running) return NULL; /* Fall through */ +#ifdef EXPERIMENTAL_DOMAINKEYS + + case vtype_dk_verify: + s = NULL; + if (Ustrcmp(var_table[middle].name, "dk_result") == 0) + s = dk_verify_block->result_string; + if (Ustrcmp(var_table[middle].name, "dk_sender") == 0) + s = dk_verify_block->address; + if (Ustrcmp(var_table[middle].name, "dk_sender_domain") == 0) + s = dk_verify_block->domain; + if (Ustrcmp(var_table[middle].name, "dk_sender_local_part") == 0) + s = dk_verify_block->local_part; + + if (Ustrcmp(var_table[middle].name, "dk_sender_source") == 0) + switch(dk_verify_block->address_source) { + case DK_EXIM_ADDRESS_NONE: s = "0"; break; + case DK_EXIM_ADDRESS_FROM_FROM: s = "from"; break; + case DK_EXIM_ADDRESS_FROM_SENDER: s = "sender"; break; + } + + if (Ustrcmp(var_table[middle].name, "dk_status") == 0) + switch(dk_verify_block->result) { + case DK_EXIM_RESULT_ERR: s = "error"; break; + case DK_EXIM_RESULT_BAD_FORMAT: s = "bad format"; break; + case DK_EXIM_RESULT_NO_KEY: s = "no key"; break; + case DK_EXIM_RESULT_NO_SIGNATURE: s = "no signature"; break; + case DK_EXIM_RESULT_REVOKED: s = "revoked"; break; + case DK_EXIM_RESULT_NON_PARTICIPANT: s = "non-participant"; break; + case DK_EXIM_RESULT_GOOD: s = "good"; break; + case DK_EXIM_RESULT_BAD: s = "bad"; break; + } + + if (Ustrcmp(var_table[middle].name, "dk_signsall") == 0) + s = (dk_verify_block->signsall)? "1" : "0"; + + if (Ustrcmp(var_table[middle].name, "dk_testing") == 0) + s = (dk_verify_block->testing)? "1" : "0"; + + if (Ustrcmp(var_table[middle].name, "dk_is_signed") == 0) + s = (dk_verify_block->is_signed)? "1" : "0"; + + return (s == NULL)? US"" : s; +#endif + case vtype_int: sprintf(CS var_buffer, "%d", *(int *)(var_table[middle].value)); /* Integer */ return var_buffer; @@ -1375,19 +1435,19 @@ while (last > first) s[ptr] = 0; /* string_cat() leaves room */ } return s; - + case vtype_pspace: { int inodes; - sprintf(CS var_buffer, "%d", - receive_statvfs(var_table[middle].value == (void *)TRUE, &inodes)); + sprintf(CS var_buffer, "%d", + receive_statvfs(var_table[middle].value == (void *)TRUE, &inodes)); } return var_buffer; - + case vtype_pinodes: { int inodes; - (void) receive_statvfs(var_table[middle].value == (void *)TRUE, &inodes); + (void) receive_statvfs(var_table[middle].value == (void *)TRUE, &inodes); sprintf(CS var_buffer, "%d", inodes); } return var_buffer; @@ -2235,7 +2295,7 @@ uschar *sub1, *sub2; /* If there are no following strings, we substitute the contents of $value for lookups and for extractions in the success case. For the ${if item, the string -"true" is substituted. In the fail case, nothing is substituted for all three +"true" is substituted. In the fail case, nothing is substituted for all three items. */ while (isspace(*s)) s++; @@ -2243,10 +2303,10 @@ if (*s == '}') { if (type[0] == 'i') { - if (yes) *yieldptr = string_cat(*yieldptr, sizeptr, ptrptr, US"true", 4); + if (yes) *yieldptr = string_cat(*yieldptr, sizeptr, ptrptr, US"true", 4); } else - { + { if (yes && lookup_value != NULL) *yieldptr = string_cat(*yieldptr, sizeptr, ptrptr, lookup_value, Ustrlen(lookup_value));