spf_record.h

Go to the documentation of this file.
00001 /* 
00002  * This program is free software; you can redistribute it and/or modify
00003  * it under the terms of either:
00004  * 
00005  *   a) The GNU Lesser General Public License as published by the Free
00006  *      Software Foundation; either version 2.1, or (at your option) any
00007  *      later version,
00008  * 
00009  *   OR
00010  * 
00011  *   b) The two-clause BSD license.
00012  *
00013  * These licenses can be found with the distribution in the file LICENSES
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 
00071 #define SPF_MAX_STR_LEN         255     /* limits on SPF_data_str_t.len, */
00072                                         /* SPF_mod_t.name_len and       */
00073                                         /* SPF_mod_t.data_len           */
00074 
00075 #define SPF_MAX_MECH_LEN        511
00076 #define SPF_MAX_MOD_LEN         511
00077 
00078 
00079 
00080 
00081 
00082 
00083 
00084 
00085 
00086 
00087 
00088 /*
00089  * Tokens and macros to be expanded in SPF_data_str_t in mech/mod
00090  */
00091 
00092 #define PARM_LP_FROM     0              /* l = local-part of envelope-sender */
00093 #define PARM_ENV_FROM    1              /* s = envelope-sender          */
00094 #define PARM_DP_FROM     2              /* o = envelope-domain          */
00095 #define PARM_CUR_DOM     3              /* d = current-domain           */
00096 #define PARM_CLIENT_IP   4              /* i = SMTP client IP           */
00097 #define PARM_CLIENT_IP_P 5              /* c = SMTP client IP (pretty)  */
00098 #define PARM_TIME        6              /* t = time in UTC epoch secs   */
00099 #define PARM_CLIENT_DOM  7              /* p = SMTP client domain name  */
00100 #define PARM_CLIENT_VER  8              /* v = IP ver str - in-addr/ip6 */
00101 #define PARM_HELO_DOM    9              /* h = HELO/EHLO domain         */
00102 #define PARM_REC_DOM    10              /* r = receiving domain         */
00103 #define PARM_CIDR       11              /* CIDR lengths (IPv4 and v6)   */
00104 #define PARM_STRING     12              /* literal string               */
00105 
00106 
00107 typedef
00108 struct SPF_data_str_struct
00109 {
00110     unsigned char       parm_type;
00111     unsigned char       len;    /* XXX Does this need to be size_t? */
00112     unsigned char       __unused0;
00113     unsigned char       __unused1;
00114     /* text: (char[len]) follows */
00115 } SPF_data_str_t;
00116 
00117 
00118 typedef
00119 struct SPF_data_var_struct
00120 {
00121     unsigned char       parm_type;
00122     unsigned char       num_rhs;        /* chop subdomain name          */
00123     unsigned short      rev:         1; /* reverse                      */
00124     unsigned short      url_encode:  1; /* do URL encoding              */
00125     unsigned short      delim_dot:   1; /* delimiter char: .            */
00126     unsigned short      delim_dash:  1; /* delimiter char: -            */
00127     unsigned short      delim_plus:  1; /* delimiter char: +            */
00128     unsigned short      delim_equal: 1; /* delimiter char: =            */
00129     unsigned short      delim_bar:   1; /* delimiter char: |            */
00130     unsigned short      delim_under: 1; /* delimiter char: _            */
00131 } SPF_data_var_t;
00132 
00133 typedef
00134 struct SPF_data_cidr_struct
00135 {
00136     unsigned char       parm_type;
00137     unsigned char       ipv4;
00138     unsigned char       ipv6;
00139     unsigned char       __unused0;
00140     /* If we are the first operand in an IP4 or IP6 instruction then
00141      * addr: (struct in[6]_addr) follows */
00142 } SPF_data_cidr_t;
00143 
00144 typedef
00145 union SPF_data_union
00146 {
00147     SPF_data_var_t      dv;
00148     SPF_data_str_t      ds;
00149     SPF_data_cidr_t     dc;
00150 } SPF_data_t;
00151 
00152 
00153 
00154 /*
00155  * Prefixes
00156  */
00157 #define PREFIX_PASS             SPF_RESULT_PASS
00158 #define PREFIX_FAIL             SPF_RESULT_FAIL
00159 #define PREFIX_SOFTFAIL SPF_RESULT_SOFTFAIL
00160 #define PREFIX_NEUTRAL  SPF_RESULT_NEUTRAL
00161 #define PREFIX_UNKNOWN  SPF_RESULT_PERMERROR
00162 
00163 /*
00164  * Mechanisms
00165  */
00166 #define MECH_UNKNOWN    0       /* Return PERMERROR */
00167 #define MECH_A          1
00168 #define MECH_MX         2
00169 #define MECH_PTR        3
00170 #define MECH_INCLUDE    4
00171 #define MECH_IP4        5
00172 #define MECH_IP6        6
00173 #define MECH_EXISTS     7
00174 #define MECH_ALL        8  
00175 #define MECH_REDIRECT   9
00176 
00177 typedef
00178 struct SPF_mech_struct
00179 {
00180     unsigned char       prefix_type;    /* PASS/FAIL/... */
00181     unsigned char       mech_type;      /* A/MX/PTR/... */
00182     unsigned short      mech_len;       /* bytes of data or cidr len */
00183     /* data: (SPF_data_t[] = char[mech_len]) follows */
00184 } SPF_mech_t;
00185 
00186 
00187 /*
00188  * Modifiers
00189  */
00190 typedef
00191 struct SPF_mod_struct
00192 {
00193     unsigned short      name_len;
00194     unsigned short      data_len;
00195     /* name: (char[name_len]) follows */
00196     /* data: (SPF_data_t[] = char[data_len]) follows */
00197 } SPF_mod_t;
00198 
00199 
00200 
00201 /*
00202  * Compiled SPF records as used internally by libspf2
00203  */
00204 
00205 struct SPF_record_struct
00206 {
00207         SPF_server_t    *spf_server;
00208 
00209     /* Header */
00210     unsigned char        version;               /* SPF spec version number      */
00211     unsigned char        num_mech;              /* number of mechanisms         */
00212     unsigned char        num_mod;               /* number of modifiers          */
00213     unsigned char        num_dns_mech;  /* number of DNS mechanisms     */
00214 
00215     /* Data */
00216     SPF_mech_t          *mech_first;    /* buffer for mechanisms        */
00217     size_t                       mech_size;             /* malloc'ed size                       */
00218     size_t                       mech_len;              /* used size (non-network format) */
00219 
00220     SPF_mod_t           *mod_first;             /* buffer for modifiers         */
00221     size_t                       mod_size;              /* malloc'ed size                       */
00222     size_t                       mod_len;               /* used size (non-network format) */
00223 };
00224 
00225 struct SPF_macro_struct
00226 {
00227     size_t                       macro_len;     /* bytes of data */
00228     /* data: (SPF_data_t[] = char[macro_len]) follows */
00229 };
00230 
00231 
00232 /* In spf_record.c */
00233 SPF_record_t    *SPF_record_new(SPF_server_t *spf_server,
00234                         const char *text);
00235 void                     SPF_record_free(SPF_record_t *rp);
00236 void                     SPF_macro_free(SPF_macro_t *mac);
00237 #if 0   /* static */
00238 SPF_errcode_t    SPF_record_find_mod_data(SPF_server_t *spf_server,
00239                         SPF_record_t *spf_record,
00240                         const char *mod_name,
00241                         SPF_data_t **datap, size_t *datalenp);
00242 #endif
00243 SPF_errcode_t    SPF_record_find_mod_value(SPF_server_t *spf_server,
00244                         SPF_request_t *spf_request,
00245                         SPF_response_t *spf_response,
00246                         SPF_record_t *spf_record,
00247                         const char *mod_name,
00248                         char **bufp, size_t *buflenp);
00249 
00250 /* In spf_compile.c */
00251 SPF_errcode_t    SPF_record_compile(SPF_server_t *spf_server,
00252                         SPF_response_t *spf_response,
00253                         SPF_record_t **spf_recordp,
00254                     const char *record);
00255 SPF_errcode_t    SPF_record_compile_macro(SPF_server_t *spf_server,
00256                         SPF_response_t *spf_response,
00257                         SPF_macro_t **spf_macrop,
00258                         const char *record);
00259 /* In spf_interpret.c */
00260 SPF_errcode_t    SPF_record_interpret(
00261                         SPF_record_t *spf_record,
00262                         SPF_request_t *spf_request,
00263                         SPF_response_t *spf_response,
00264                         int depth);
00265 /* In spf_expand.c */
00266 SPF_errcode_t    SPF_record_expand_data(SPF_server_t *spf_server,
00267                         SPF_request_t *spf_request,
00268                         SPF_response_t *spf_response,
00269                         SPF_data_t *data, size_t data_len,
00270                         char **bufp, size_t *buflenp);
00271 /* In spf_print.c */
00272 SPF_errcode_t    SPF_record_print(SPF_record_t *spf_record);
00273 SPF_errcode_t    SPF_record_stringify(SPF_record_t *spf_record,
00274                         char **bufp, size_t *buflenp);
00275 
00276 #endif

Generated on Tue Nov 4 13:27:38 2008 for libspf2 by  doxygen 1.5.4