00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef INC_SPF_RECORD
00020 #define INC_SPF_RECORD
00021
00022 typedef struct SPF_record_struct SPF_record_t;
00023 typedef struct SPF_macro_struct SPF_macro_t;
00024
00025 #include "spf_response.h"
00026 #include "spf_request.h"
00027 #include "spf_server.h"
00028
00073 #define SPF_MAX_STR_LEN 255
00074
00075
00076
00077 #define SPF_MAX_MECH_LEN 511
00078 #define SPF_MAX_MOD_LEN 511
00079
00080
00081
00082
00083
00084
00088 #define PARM_LP_FROM 0
00089 #define PARM_ENV_FROM 1
00090 #define PARM_DP_FROM 2
00091 #define PARM_CUR_DOM 3
00092 #define PARM_CLIENT_IP 4
00093 #define PARM_CLIENT_IP_P 5
00094 #define PARM_TIME 6
00095 #define PARM_CLIENT_DOM 7
00096 #define PARM_CLIENT_VER 8
00097 #define PARM_HELO_DOM 9
00098 #define PARM_REC_DOM 10
00099 #define PARM_CIDR 11
00100 #define PARM_STRING 12
00103 typedef
00104 struct SPF_data_str_struct
00105 {
00106 unsigned char parm_type;
00107 unsigned char len;
00108 unsigned char __unused0;
00109 unsigned char __unused1;
00110
00111 } SPF_data_str_t;
00112
00113
00114 typedef
00115 struct SPF_data_var_struct
00116 {
00117 unsigned char parm_type;
00118 unsigned char num_rhs;
00119 unsigned short rev: 1;
00120 unsigned short url_encode: 1;
00121 unsigned short delim_dot: 1;
00122 unsigned short delim_dash: 1;
00123 unsigned short delim_plus: 1;
00124 unsigned short delim_equal: 1;
00125 unsigned short delim_bar: 1;
00126 unsigned short delim_under: 1;
00127 } SPF_data_var_t;
00128
00129 typedef
00130 struct SPF_data_cidr_struct
00131 {
00132 unsigned char parm_type;
00133 unsigned char ipv4;
00134 unsigned char ipv6;
00135 unsigned char __unused0;
00138 } SPF_data_cidr_t;
00139
00140 typedef
00141 union SPF_data_union
00142 {
00143 SPF_data_var_t dv;
00144 SPF_data_str_t ds;
00145 SPF_data_cidr_t dc;
00146 } SPF_data_t;
00147
00148
00149
00153 #define PREFIX_PASS SPF_RESULT_PASS
00154 #define PREFIX_FAIL SPF_RESULT_FAIL
00155 #define PREFIX_SOFTFAIL SPF_RESULT_SOFTFAIL
00156 #define PREFIX_NEUTRAL SPF_RESULT_NEUTRAL
00157 #define PREFIX_UNKNOWN SPF_RESULT_PERMERROR
00158
00162 #define MECH_UNKNOWN 0
00163 #define MECH_A 1
00164 #define MECH_MX 2
00165 #define MECH_PTR 3
00166 #define MECH_INCLUDE 4
00167 #define MECH_IP4 5
00168 #define MECH_IP6 6
00169 #define MECH_EXISTS 7
00170 #define MECH_ALL 8
00171 #define MECH_REDIRECT 9
00172
00173 typedef
00174 struct SPF_mech_struct
00175 {
00176 unsigned char prefix_type;
00177 unsigned char mech_type;
00178 unsigned short mech_len;
00180 } SPF_mech_t;
00181
00182
00183
00184
00185
00186 typedef
00187 struct SPF_mod_struct
00188 {
00189 unsigned short name_len;
00190 unsigned short data_len;
00193 } SPF_mod_t;
00194
00195
00196
00200 struct SPF_record_struct
00201 {
00202 SPF_server_t *spf_server;
00203
00204
00205 unsigned char version;
00206 unsigned char num_mech;
00207 unsigned char num_mod;
00208 unsigned char num_dns_mech;
00210
00211 SPF_mech_t *mech_first;
00212 size_t mech_size;
00213 size_t mech_len;
00215 SPF_mod_t *mod_first;
00216 size_t mod_size;
00217 size_t mod_len;
00218 };
00219
00220 struct SPF_macro_struct
00221 {
00222 size_t macro_len;
00224 };
00225
00226
00228 SPF_record_t *SPF_record_new(SPF_server_t *spf_server,
00229 const char *text);
00230 void SPF_record_free(SPF_record_t *rp);
00231 void SPF_macro_free(SPF_macro_t *mac);
00232 #if 0
00233 SPF_errcode_t SPF_record_find_mod_data(SPF_server_t *spf_server,
00234 SPF_record_t *spf_record,
00235 const char *mod_name,
00236 SPF_data_t **datap, size_t *datalenp);
00237 #endif
00238 SPF_errcode_t SPF_record_find_mod_value(SPF_server_t *spf_server,
00239 SPF_request_t *spf_request,
00240 SPF_response_t *spf_response,
00241 SPF_record_t *spf_record,
00242 const char *mod_name,
00243 char **bufp, size_t *buflenp);
00244
00246 SPF_errcode_t SPF_record_compile(SPF_server_t *spf_server,
00247 SPF_response_t *spf_response,
00248 SPF_record_t **spf_recordp,
00249 const char *record);
00250 SPF_errcode_t SPF_record_compile_macro(SPF_server_t *spf_server,
00251 SPF_response_t *spf_response,
00252 SPF_macro_t **spf_macrop,
00253 const char *record);
00255 SPF_errcode_t SPF_record_interpret(
00256 SPF_record_t *spf_record,
00257 SPF_request_t *spf_request,
00258 SPF_response_t *spf_response,
00259 int depth);
00261 SPF_errcode_t SPF_record_expand_data(SPF_server_t *spf_server,
00262 SPF_request_t *spf_request,
00263 SPF_response_t *spf_response,
00264 SPF_data_t *data, size_t data_len,
00265 char **bufp, size_t *buflenp);
00267 SPF_errcode_t SPF_record_print(SPF_record_t *spf_record);
00268 SPF_errcode_t SPF_record_stringify(SPF_record_t *spf_record,
00269 char **bufp, size_t *buflenp);
00270
00271 #endif