#include #include #include #include "sepofra.h" #include "qq_exit_codes.h" // a bit of a kludge extern std::string progid; #define test_state_macro \ foo(untested) \ foo(pass) \ foo(neutral) \ foo(fail) // expand the codes to make some names: #define foo(name) name, typedef enum { test_state_macro } test_state; #undef foo class name_tester { public: std::string name; // typically a FQDN test_state spf; test_state map2ip; name_tester() : name(""), spf(untested), map2ip(untested) {} }; class xstr { public: int err; std::string str; xstr() : err(1), str("") {} xstr(const int foo, const std::string bar) : err(foo), str(bar) {} }; class skrewt{ public: std::string received_from; // envelope HELO among other things name_tester proximta_HELO; name_tester proximta_rDNS; int proximta_rDNS_flagged; std::string proximta_IP; std::string proximta_AuthUser; SPF_result_t spf_result; name_tester return_path; // envelope MAIL FROM std::string boundary; std::string to; std::string from; std::string subject; std::string date; std::string message_id; std::string content_type; std::list delivered_to; int msgsize; int saw_blank_line; int recno; int maxsize; int strictness; std::string note; int mid_required; std::vector headerbuf; std::vector bigbuf; xstr lookahead; std::map decode_test_state; skrewt(); // constructor xstr getRecord(std::istream& xin); xstr getLine(std::istream& xin); int headers(std::istream& xin); int dump_bigbuf(std::ostream& xout); int interstage(); int body(std::istream& xin, std::ostream& xout); int krunch_rfrom(); }; void parse_content(const std::string type_spec_line, std::string &maintype, std::string &boundary); void exeunt(const int sts); void maybe_exeunt(const int sts, const int really);