void SMTPConnection::authenticate() { if (!m_extendedSMTP) { internalDisconnect(); throw exceptions::command_error("AUTH", "ESMTP not supported."); } getAuthenticator()->setService(m_transport.lock()); #if VMIME_HAVE_SASL_SUPPORT // Try SASL authentication if (GET_PROPERTY(bool, PROPERTY_OPTIONS_SASL)) { try { authenticateSASL(); m_authenticated = true; return; } catch (const vmime::exception&) { internalDisconnect(); throw; } } #endif // VMIME_HAVE_SASL_SUPPORT // No other authentication method is possible throw exceptions::authentication_error("All authentication methods failed"); }
void sendmailTransport::disconnect() { if (!isConnected()) throw exceptions::not_connected(); internalDisconnect(); }
void IMAPConnection::disconnect() { if (!isConnected()) throw exceptions::not_connected(); internalDisconnect(); }
sendmailTransport::~sendmailTransport() { try { internalDisconnect(); } catch (...) {} }
void IMAPConnection::startTLS() { try { IMAPCommand::STARTTLS()->send(dynamicCast <IMAPConnection>(shared_from_this())); std::auto_ptr <IMAPParser::response> resp(m_parser->readResponse()); if (resp->isBad() || resp->response_done()->response_tagged()-> resp_cond_state()->status() != IMAPParser::resp_cond_state::OK) { throw exceptions::command_error ("STARTTLS", resp->getErrorLog(), "bad response"); } shared_ptr <tls::TLSSession> tlsSession = tls::TLSSession::create (m_store.lock()->getCertificateVerifier(), m_store.lock()->getSession()->getTLSProperties()); shared_ptr <tls::TLSSocket> tlsSocket = tlsSession->getSocket(m_socket); tlsSocket->handshake(); m_socket = tlsSocket; m_parser->setSocket(m_socket); m_secured = true; m_cntInfos = make_shared <tls::TLSSecuredConnectionInfos> (m_cntInfos->getHost(), m_cntInfos->getPort(), tlsSession, tlsSocket); // " Once TLS has been started, the client MUST discard cached // information about server capabilities and SHOULD re-issue the // CAPABILITY command. This is necessary to protect against // man-in-the-middle attacks which alter the capabilities list prior // to STARTTLS. " (RFC-2595) invalidateCapabilities(); } catch (exceptions::command_error&) { // Non-fatal error throw; } catch (exception&) { // Fatal error internalDisconnect(); throw; } }
void SMTPConnection::startTLS() { try { sendRequest(SMTPCommand::STARTTLS()); shared_ptr <SMTPResponse> resp = readResponse(); if (resp->getCode() != 220) { throw SMTPCommandError("STARTTLS", resp->getText(), resp->getCode(), resp->getEnhancedCode()); } shared_ptr <tls::TLSSession> tlsSession = tls::TLSSession::create (getTransport()->getCertificateVerifier(), getTransport()->getSession()->getTLSProperties()); shared_ptr <tls::TLSSocket> tlsSocket = tlsSession->getSocket(m_socket); tlsSocket->handshake(); m_socket = tlsSocket; m_secured = true; m_cntInfos = make_shared <tls::TLSSecuredConnectionInfos> (m_cntInfos->getHost(), m_cntInfos->getPort(), tlsSession, tlsSocket); } catch (const exceptions::command_error&) { // Non-fatal error throw; } catch (...) { // Fatal error internalDisconnect(); throw; } }
void IMAPConnection::initHierarchySeparator() { IMAPCommand::LIST("", "")->send(dynamicCast <IMAPConnection>(shared_from_this())); std::auto_ptr <IMAPParser::response> resp(m_parser->readResponse()); if (resp->isBad() || resp->response_done()->response_tagged()-> resp_cond_state()->status() != IMAPParser::resp_cond_state::OK) { internalDisconnect(); throw exceptions::command_error("LIST", resp->getErrorLog(), "bad response"); } const std::vector <IMAPParser::continue_req_or_response_data*>& respDataList = resp->continue_req_or_response_data(); bool found = false; for (unsigned int i = 0 ; !found && i < respDataList.size() ; ++i) { if (respDataList[i]->response_data() == NULL) continue; const IMAPParser::mailbox_data* mailboxData = static_cast <const IMAPParser::response_data*> (respDataList[i]->response_data())->mailbox_data(); if (mailboxData == NULL || mailboxData->type() != IMAPParser::mailbox_data::LIST) continue; if (mailboxData->mailbox_list()->quoted_char() != '\0') { m_hierarchySeparator = mailboxData->mailbox_list()->quoted_char(); found = true; } } if (!found) // default m_hierarchySeparator = '/'; }