From 0f75541caa206c9d2c71ac840984159790008f42 Mon Sep 17 00:00:00 2001 From: Thor Harald Johansen Date: Sat, 6 Jun 2020 05:16:08 +0200 Subject: [PATCH] Added required filter responses --- src/bogofilter-smtpd.cpp | 69 ++++++++++++++++++++++++++++------------ 1 file changed, 48 insertions(+), 21 deletions(-) diff --git a/src/bogofilter-smtpd.cpp b/src/bogofilter-smtpd.cpp index 4ed232e..7eafd09 100644 --- a/src/bogofilter-smtpd.cpp +++ b/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;