|
|
|
@ -9,22 +9,22 @@ |
|
|
|
|
#include <iostream> |
|
|
|
|
#include <cstdio> |
|
|
|
|
|
|
|
|
|
const bool debug = true; |
|
|
|
|
const bool debug = false; |
|
|
|
|
|
|
|
|
|
using namespace std; |
|
|
|
|
|
|
|
|
|
mail::session_map_t sessions; |
|
|
|
|
|
|
|
|
|
void on_ready(protocol::protocol_t& protocol, protocol::message_t message) { |
|
|
|
|
debug && cerr << "Ready" << endl; |
|
|
|
|
protocol.send({"register", "filter", "smtp-in", "data"}); |
|
|
|
|
protocol.send({"register", "filter", "smtp-in", "data-line"}); |
|
|
|
|
protocol.send({"register", "filter", "smtp-in", "commit"}); |
|
|
|
|
protocol.send({"register", "ready"}); |
|
|
|
|
cerr << "Ready to accept messages from SMTPD" << endl; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void on_data(protocol::protocol_t& protocol, protocol::message_t message) { |
|
|
|
|
debug && cerr << "New message" << endl; |
|
|
|
|
cerr << "Accepting new message from SMTPD" << endl; |
|
|
|
|
auto session_key = protocol::session_key_from(message); |
|
|
|
|
auto session_token = protocol::session_token_from(message); |
|
|
|
|
sessions.emplace(session_key, mail::session_t{}); |
|
|
|
@ -32,7 +32,7 @@ void on_data(protocol::protocol_t& protocol, protocol::message_t message) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void on_data_line(protocol::protocol_t& protocol, protocol::message_t message) { |
|
|
|
|
debug && cerr << "Received data line" << endl; |
|
|
|
|
debug && cerr << "Received data line from SMTPD" << endl; |
|
|
|
|
|
|
|
|
|
auto tokens = protocol::token::decompose(message.input); |
|
|
|
|
auto session_key = protocol::session_key_from(tokens); |
|
|
|
@ -47,6 +47,11 @@ void on_data_line(protocol::protocol_t& protocol, protocol::message_t message) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(data_line.substr(0, 5) == "From:" || |
|
|
|
|
data_line.substr(0, 8) == "Subject:") { |
|
|
|
|
cerr << data_line << endl; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
session.message.header.push_back(data_line); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
@ -74,13 +79,13 @@ void on_data_line(protocol::protocol_t& protocol, protocol::message_t message) { |
|
|
|
|
|
|
|
|
|
session.message.body.push_back(data_line); |
|
|
|
|
} catch(out_of_range& e) { |
|
|
|
|
debug && cerr << "Unknown session key" << endl; |
|
|
|
|
cerr << "Unknown session key from SMTPD" << endl; |
|
|
|
|
protocol.fail(session_key, session_token); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void on_commit(protocol::protocol_t& protocol, protocol::message_t message) { |
|
|
|
|
debug && cerr << "Message committed" << endl; |
|
|
|
|
debug && cerr << "Commit request from SMTPD" << endl; |
|
|
|
|
auto session_key = protocol::session_key_from(message); |
|
|
|
|
auto session_token = protocol::session_token_from(message); |
|
|
|
|
try { |
|
|
|
@ -98,13 +103,13 @@ void on_commit(protocol::protocol_t& protocol, protocol::message_t message) { |
|
|
|
|
protocol.proceed(session_key, session_token); |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
default: |
|
|
|
|
debug && cerr << "Bogofilter error (" << session.status << ")" << endl; |
|
|
|
|
case mail::status::ERROR: |
|
|
|
|
debug && cerr << "Bogofilter error" << endl; |
|
|
|
|
protocol.fail(session_key, session_token); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} catch(out_of_range& e) { |
|
|
|
|
debug && cerr << "Unknown session key" << endl; |
|
|
|
|
cerr << "Unknown session key from SMTPD" << endl; |
|
|
|
|
protocol.fail(session_key, session_token); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -113,7 +118,6 @@ void on_commit(protocol::protocol_t& protocol, protocol::message_t message) { |
|
|
|
|
|
|
|
|
|
int main(int argc, char** argv) { |
|
|
|
|
protocol::ios_protocol_t protocol(cin, cout); |
|
|
|
|
|
|
|
|
|
protocol::handler_map_t handlers; |
|
|
|
|
|
|
|
|
|
handlers.emplace("config|ready", on_ready); |
|
|
|
@ -128,6 +132,8 @@ int main(int argc, char** argv) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
cerr << "Bogofilter-SMTPD started" << endl; |
|
|
|
|
|
|
|
|
|
protocol.set_handlers(handlers); |
|
|
|
|
protocol.run(); |
|
|
|
|
|
|
|
|
|