#include "libskrewt.h" #include "utils.h" #include #include using namespace std; void parse_content(const string type_spec_line, string &maintype, string &boundary) { //xxx cerr << "parser called with: " << type_spec_line << endl; string get_type(type_spec_line); size_t where = get_type.find_first_of(" \t;\n"); string rest; if (where == string::npos) { // keep whole string } else { rest = get_type.substr(where+1); get_type = get_type.substr(0,where); } where = get_type.find("/"); if (where == string::npos){ maintype = ""; cerr << "could not find / in " << get_type << endl; } else { maintype = get_type.substr(0, where); } // now need to find boundary string srch = "boundary="; where = rest.find(srch); if (where != string::npos) { where += srch.length(); boundary = rest.substr(where); if (boundary[0] == '"') { boundary = boundary.substr(1); where = boundary.find_first_of("\""); } else { where = boundary.find_first_of(" \t;\n"); } if (where == string::npos) { /* do nothing, boundary=boundary as a whole */ } else { boundary = boundary.substr(0, where); } } else { //xxxxxxx cerr << "boundary= not found in " << type_spec_line << endl; } } int skrewt::krunch_rfrom(){ stringstream parse; parse.str(received_from); string word; parse >> word; if (word != "from") { cerr << progid << " bad 'Received: from' line ... '" << word << "'" << endl; return ex_syserr; } parse >> proximta_rDNS; parse >> word; if (word == "(HELO" /*)*/) { parse >> proximta_HELO; proximta_HELO = rtrim(proximta_HELO, "()"); parse >> word; } else { proximta_HELO = proximta_rDNS; } size_t len = word.length(); if (len<2 || word[0] != '(' || word[len-1] != ')') { cerr << progid << " bad 'Received: from' line ;;; '" << word << "'" << endl; return ex_syserr; } proximta_IP = word.substr(1, len-2); size_t where = proximta_IP.find("@"); if (where != string::npos){ proximta_AuthUser = proximta_IP.substr(0, where); proximta_IP = proximta_IP.substr(1+where); } return 0; }