~ubuntu-branches/ubuntu/hardy/exim4/hardy-proposed

« back to all changes in this revision

Viewing changes to src/spf.c

  • Committer: Bazaar Package Importer
  • Author(s): Marc Haber
  • Date: 2005-07-02 06:08:34 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20050702060834-qk17pd52kb9nt3bj
Tags: 4.52-1
* new upstream version 4.51. (mh)
  * adapt 70_remove_exim-users_references
  * remove 37_gnutlsparams
  * adapt 36_pcre
  * adapt 31_eximmanpage
* fix package priorities to have them in sync with override again. (mh)
* Fix error in nb (Norwegian) translation.
  Thanks to Helge Hafting. (mh). Closes: #315775
* Standards-Version: 3.6.2, no changes needed. (mh)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* $Cambridge: exim/exim-src/src/spf.c,v 1.6 2005/06/27 15:28:45 tom Exp $ */
 
2
 
 
3
/*************************************************
 
4
*     Exim - an Internet mail transport agent    *
 
5
*************************************************/
 
6
 
 
7
/* Experimental SPF support.
 
8
   Copyright (c) Tom Kistner <tom@duncanthrax.net> 2004
 
9
   License: GPL */
 
10
 
 
11
/* Code for calling spf checks via libspf-alt. Called from acl.c. */
 
12
 
 
13
#include "exim.h"
 
14
#ifdef EXPERIMENTAL_SPF
 
15
 
 
16
/* must be kept in numeric order */
 
17
static spf_result_id spf_result_id_list[] = {
 
18
  { US"invalid", 0},
 
19
  { US"neutral", 1 },
 
20
  { US"pass", 2 },
 
21
  { US"fail", 3 },
 
22
  { US"softfail", 4 },
 
23
  { US"none", 5 },
 
24
  { US"err_temp", 6 },
 
25
  { US"err_perm", 7 }
 
26
};
 
27
 
 
28
SPF_server_t    *spf_server = NULL;
 
29
SPF_request_t   *spf_request = NULL;
 
30
SPF_response_t  *spf_response = NULL;
 
31
SPF_response_t  *spf_response_2mx = NULL;
 
32
 
 
33
/* spf_init sets up a context that can be re-used for several
 
34
   messages on the same SMTP connection (that come from the
 
35
   same host with the same HELO string) */
 
36
 
 
37
int spf_init(uschar *spf_helo_domain, uschar *spf_remote_addr) {
 
38
 
 
39
  spf_server = SPF_server_new(SPF_DNS_CACHE, 0);
 
40
 
 
41
  if ( spf_server == NULL ) {
 
42
    debug_printf("spf: SPF_server_new() failed.\n");
 
43
    return 0;
 
44
  }
 
45
 
 
46
  spf_request = SPF_request_new(spf_server);
 
47
 
 
48
  if (SPF_request_set_ipv4_str(spf_request, spf_remote_addr)) {
 
49
    debug_printf("spf: SPF_request_set_ipv4_str() failed.\n");
 
50
    spf_server = NULL;
 
51
    spf_request = NULL;
 
52
    return 0;
 
53
  }
 
54
 
 
55
  if (SPF_request_set_helo_dom(spf_request, spf_helo_domain)) {
 
56
    debug_printf("spf: SPF_set_helo_dom() failed.\n");
 
57
    spf_server = NULL;
 
58
    spf_request = NULL;
 
59
    return 0;
 
60
  }
 
61
 
 
62
  return 1;
 
63
}
 
64
 
 
65
 
 
66
/* spf_process adds the envelope sender address to the existing
 
67
   context (if any), retrieves the result, sets up expansion
 
68
   strings and evaluates the condition outcome. */
 
69
 
 
70
int spf_process(uschar **listptr, uschar *spf_envelope_sender) {
 
71
  int sep = 0;
 
72
  uschar *list = *listptr;
 
73
  uschar *spf_result_id;
 
74
  uschar spf_result_id_buffer[128];
 
75
  int rc = SPF_RESULT_PERMERROR;
 
76
 
 
77
  if (!(spf_server && spf_request)) {
 
78
    /* no global context, assume temp error and skip to evaluation */
 
79
    rc = SPF_RESULT_PERMERROR;
 
80
    goto SPF_EVALUATE;
 
81
  };
 
82
 
 
83
  if (SPF_request_set_env_from(spf_request, spf_envelope_sender)) {
 
84
    /* Invalid sender address. This should be a real rare occurence */
 
85
    rc = SPF_RESULT_PERMERROR;
 
86
    goto SPF_EVALUATE;
 
87
  }
 
88
 
 
89
  /* get SPF result */
 
90
  SPF_request_query_mailfrom(spf_request, &spf_response);
 
91
 
 
92
  /* set up expansion items */
 
93
  spf_header_comment     = (uschar *)SPF_response_get_header_comment(spf_response);
 
94
  spf_received           = (uschar *)SPF_response_get_received_spf(spf_response);
 
95
  spf_result             = (uschar *)SPF_strresult(SPF_response_result(spf_response));
 
96
  spf_smtp_comment       = (uschar *)SPF_response_get_smtp_comment(spf_response);
 
97
 
 
98
  rc = SPF_response_result(spf_response);
 
99
 
 
100
  /* We got a result. Now see if we should return OK or FAIL for it */
 
101
  SPF_EVALUATE:
 
102
  debug_printf("SPF result is %s (%d)\n", SPF_strresult(rc), rc);
 
103
  while ((spf_result_id = string_nextinlist(&list, &sep,
 
104
                                     spf_result_id_buffer,
 
105
                                     sizeof(spf_result_id_buffer))) != NULL) {
 
106
    int negate = 0;
 
107
    int result = 0;
 
108
 
 
109
    /* Check for negation */
 
110
    if (spf_result_id[0] == '!') {
 
111
      negate = 1;
 
112
      spf_result_id++;
 
113
    };
 
114
 
 
115
    /* Check the result identifier */
 
116
    result = Ustrcmp(spf_result_id, spf_result_id_list[rc].name);
 
117
    if (!negate && result==0) return OK;
 
118
    if (negate && result!=0) return OK;
 
119
  };
 
120
 
 
121
  /* no match */
 
122
  return FAIL;
 
123
}
 
124
 
 
125
#endif