Added required filter responses

master
Thor 4 years ago
parent ee9c32f8f3
commit 0f75541caa
  1. 69
      src/bogofilter-smtpd.cpp

@ -23,52 +23,79 @@ void on_ready(protocol::protocol_t& protocol, protocol::message_t message) {
}
void on_data(protocol::protocol_t& protocol, protocol::message_t message) {
sessions.emplace(protocol::session_key_from(message), mail::session_t{});
debug && cerr << "New message" << endl;
auto session_key = protocol::session_key_from(message);
sessions.emplace(session_key, mail::session_t{});
protocol.proceed(session_key);
}
void on_data_line(protocol::protocol_t& protocol, protocol::message_t message) {
auto tokens = protocol::token::decompose(message.input);
auto& session = sessions.at(protocol::session_key_from(tokens));
auto& data_line = tokens.at(7);
debug && cerr << "Received data line" << endl;
if(!session.has_header) {
if(data_line == "") {
session.has_header = true;
auto tokens = protocol::token::decompose(message.input);
auto session_key = protocol::session_key_from(tokens);
try {
auto& session = sessions.at(session_key);
auto& data_line = tokens.at(7);
if(!session.has_header) {
if(data_line == "") {
session.has_header = true;
return;
}
session.message.header.push_back(data_line);
return;
}
session.message.header.push_back(data_line);
return;
}
if(data_line == ".") {
return;
}
if(data_line == ".") {
return;
}
if(data_line == "..") {
session.message.body.push_back(".");
return;
}
if(data_line == "..") {
session.message.body.push_back(".");
return;
session.message.body.push_back(data_line);
} catch(out_of_range& e) {
debug && cerr << "Unknown session key" << endl;
protocol.fail(session_key);
}
session.message.body.push_back(data_line);
}
void on_commit(protocol::protocol_t& protocol, protocol::message_t message) {
debug && cerr << "Message committed" << endl;
auto session_key = protocol::session_key_from(message);
auto& session = sessions.at(session_key);
protocol.submit_message(session_key, session.message.header, session.message.body);
try {
auto& session = sessions.at(session_key);
protocol.submit_message(session_key, session.message.header, session.message.body);
sessions.erase(session_key);
protocol.proceed(session_key);
} catch(out_of_range& e) {
debug && cerr << "Unknown session key" << endl;
protocol.fail(session_key);
}
}
int main(int argc, char** argv) {
protocol::ios_protocol_t protocol(cin, cout);
protocol::handler_map_t handlers;
handlers.emplace("config|ready", on_ready);
handlers.emplace("filter|*|*|smtp-in|data", on_data);
handlers.emplace("filter|*|*|smtp-in|data-line", on_data_line);
handlers.emplace("filter|*|*|smtp-in|commit", on_commit);
protocol.set_handlers(handlers);
if(debug) {
cerr << "Handler patterns:" << endl;
for(auto&& [first, second] : handlers) {
cerr << "\t" << first << endl;
}
}
protocol.set_handlers(handlers);
protocol.run();
return 0;

Loading…
Cancel
Save