30 m_filter(std::move(filter))
32 m_filter->doneSignal().connect(
G::Slot::slot(*
this,&ProtocolMessageStore::filterDone) ) ;
37 m_filter->doneSignal().disconnect() ;
42 G_DEBUG(
"GSmtp::ProtocolMessageStore::reset" ) ;
48 G_DEBUG(
"GSmtp::ProtocolMessageStore::clear" ) ;
56 G_DEBUG(
"GSmtp::ProtocolMessageStore::setFrom: " << from ) ;
58 if( from.length() == 0U )
59 G_WARNING(
"GSmtp::ProtocolMessageStore: empty MAIL-FROM return path" ) ;
61 G_ASSERT( m_new_msg ==
nullptr ) ;
64 m_new_msg = m_store.newMessage( from , from_auth ,
"" ) ;
67 return m_new_msg->id() ;
72 G_DEBUG(
"GSmtp::ProtocolMessageStore::addTo: " << to_status.recipient ) ;
73 G_ASSERT( m_new_msg !=
nullptr ) ;
74 if( to_status.recipient.empty() )
78 else if( !to_status.is_valid )
80 G_WARNING(
"GSmtp::ProtocolMessage: rejecting recipient \"" << to_status.recipient <<
"\": "
81 << to_status.response << (to_status.reason.empty()?
"":
": ") << to_status.reason ) ;
86 m_new_msg->addTo( to_status.address , to_status.is_local ) ;
93 G_DEBUG(
"GSmtp::ProtocolMessageStore::addReceived" ) ;
94 if( m_new_msg !=
nullptr )
95 m_new_msg->addTextLine( received_line ) ;
100 G_ASSERT( m_new_msg !=
nullptr ) ;
101 if( m_new_msg ==
nullptr )
103 return m_new_msg->addText( line_data , line_size ) ;
108 return m_new_msg ? m_from : std::string() ;
112 const std::string & peer_socket_address ,
const std::string & peer_certificate )
116 G_DEBUG(
"GSmtp::ProtocolMessageStore::process: \""
117 << session_auth_id <<
"\", \"" << peer_socket_address <<
"\"" ) ;
118 G_ASSERT( m_new_msg !=
nullptr ) ;
119 if( m_new_msg ==
nullptr )
123 bool local_only = m_new_msg->prepare( session_auth_id , peer_socket_address , peer_certificate ) ;
127 m_done_signal.emit(
true ,
MessageId::none() , std::string() , std::string() ) ;
132 if( !m_filter->simple() )
133 G_LOG(
"GSmtp::ProtocolMessageStore::process: filter start: [" << m_filter->id() <<
"] "
134 <<
"[" << m_new_msg->location() <<
"]" ) ;
135 m_filter->start( m_new_msg->id() ) ;
138 catch( std::exception & e )
140 G_WARNING(
"GSmtp::ProtocolMessageStore::process: message processing exception: " << e.what() ) ;
142 m_done_signal.emit(
false ,
MessageId::none() ,
"failed" , e.what() ) ;
146void GSmtp::ProtocolMessageStore::filterDone(
int filter_result )
150 G_DEBUG(
"GSmtp::ProtocolMessageStore::filterDone: " << filter_result ) ;
151 G_ASSERT( m_new_msg !=
nullptr ) ;
152 if( m_new_msg ==
nullptr )
155 const bool ok = filter_result == 0 ;
156 const bool abandon = filter_result == 1 ;
157 const bool rescan = m_filter->special() ;
158 G_ASSERT( m_filter->reason().empty() == (ok || abandon) ) ;
160 if( !m_filter->simple() )
161 G_LOG(
"GSmtp::ProtocolMessageStore::filterDone: filter done: " << m_filter->str(
true) ) ;
167 m_new_msg->commit(
true ) ;
168 id = m_new_msg->id() ;
174 m_new_msg->commit(
false ) ;
178 G_LOG_S(
"GSmtp::ProtocolMessageStore::filterDone: rejected by filter: [" << m_filter->reason() <<
"]" ) ;
188 std::string filter_response = (ok||abandon) ? std::string() : m_filter->response() ;
189 std::string filter_reason = (ok||abandon) ? std::string() : m_filter->reason() ;
192 m_done_signal.emit( ok || abandon ,
id , filter_response , filter_reason ) ;
194 catch( std::exception & e )
196 G_WARNING(
"GSmtp::ProtocolMessageStore::filterDone: filter exception: " << e.what() ) ;
198 m_done_signal.emit(
false ,
MessageId::none() ,
"rejected" , e.what() ) ;
204 return m_done_signal ;
A somewhat opaque identifer for a MessageStore message.
static MessageId none()
Returns an in-valid() id.
A class which allows SMTP messages to be stored and retrieved.
void clear() override
Override from GSmtp::ProtocolMessage.
ProtocolMessage::DoneSignal & doneSignal() override
Override from GSmtp::ProtocolMessage.
void reset() override
Override from GSmtp::ProtocolMessage.
~ProtocolMessageStore() override
Destructor.
std::string from() const override
Override from GSmtp::ProtocolMessage.
ProtocolMessageStore(MessageStore &store, std::unique_ptr< Filter >)
Constructor.
void process(const std::string &auth_id, const std::string &peer_socket_address, const std::string &peer_certificate) override
Override from GSmtp::ProtocolMessage.
void addReceived(const std::string &) override
Override from GSmtp::ProtocolMessage.
bool addTo(VerifierStatus to_status) override
Override from GSmtp::ProtocolMessage.
MessageId setFrom(const std::string &from_user, const std::string &) override
Override from GSmtp::ProtocolMessage.
bool addText(const char *, std::size_t) override
Override from GSmtp::ProtocolMessage.
A structure returned by GSmtp::Verifier to describe the status of a 'rcpt-to' or 'vrfy' recipient.
A general-purpose exception class derived from std::exception and containing an error message.
Slot< Args... > slot(TSink &sink, void(TSink::*method)(Args...))
A factory function for Slot objects.