diff options
author | Vincent Richard <[email protected]> | 2014-03-25 22:34:03 +0000 |
---|---|---|
committer | Vincent Richard <[email protected]> | 2014-03-25 22:34:03 +0000 |
commit | bbfdcc36a00bdae294c45baa2023f850efce7375 (patch) | |
tree | fc4c497490437282c78525a878b60ecb862a1674 | |
parent | Fixed issue #71. (diff) | |
download | vmime-bbfdcc36a00bdae294c45baa2023f850efce7375.tar.gz vmime-bbfdcc36a00bdae294c45baa2023f850efce7375.zip |
Trace socket/connection events.
-rw-r--r-- | src/vmime/net/imap/IMAPConnection.cpp | 1 | ||||
-rw-r--r-- | src/vmime/net/pop3/POP3Connection.cpp | 1 | ||||
-rw-r--r-- | src/vmime/net/smtp/SMTPConnection.cpp | 1 | ||||
-rw-r--r-- | src/vmime/net/socket.hpp | 15 | ||||
-rw-r--r-- | src/vmime/net/tls/TLSSocket.hpp | 2 | ||||
-rw-r--r-- | src/vmime/net/tls/gnutls/TLSSocket_GnuTLS.cpp | 20 | ||||
-rw-r--r-- | src/vmime/net/tls/gnutls/TLSSocket_GnuTLS.hpp | 5 | ||||
-rw-r--r-- | src/vmime/net/tls/openssl/TLSSocket_OpenSSL.cpp | 20 | ||||
-rw-r--r-- | src/vmime/net/tls/openssl/TLSSocket_OpenSSL.hpp | 5 | ||||
-rw-r--r-- | src/vmime/platforms/posix/posixSocket.cpp | 23 | ||||
-rw-r--r-- | src/vmime/platforms/posix/posixSocket.hpp | 4 | ||||
-rw-r--r-- | src/vmime/platforms/windows/windowsSocket.cpp | 23 | ||||
-rw-r--r-- | src/vmime/platforms/windows/windowsSocket.hpp | 3 | ||||
-rw-r--r-- | src/vmime/security/sasl/SASLSocket.cpp | 12 | ||||
-rw-r--r-- | src/vmime/security/sasl/SASLSocket.hpp | 3 | ||||
-rw-r--r-- | tests/testUtils.cpp | 11 | ||||
-rw-r--r-- | tests/testUtils.hpp | 3 |
17 files changed, 147 insertions, 5 deletions
diff --git a/src/vmime/net/imap/IMAPConnection.cpp b/src/vmime/net/imap/IMAPConnection.cpp index 28a71662..71e409c3 100644 --- a/src/vmime/net/imap/IMAPConnection.cpp +++ b/src/vmime/net/imap/IMAPConnection.cpp @@ -119,6 +119,7 @@ void IMAPConnection::connect() // Create and connect the socket m_socket = store->getSocketFactory()->create(m_timeoutHandler); + m_socket->setTracer(m_tracer); #if VMIME_HAVE_TLS_SUPPORT if (store->isIMAPS()) // dedicated port/IMAPS diff --git a/src/vmime/net/pop3/POP3Connection.cpp b/src/vmime/net/pop3/POP3Connection.cpp index 0fd7e7ee..3f2cbe0b 100644 --- a/src/vmime/net/pop3/POP3Connection.cpp +++ b/src/vmime/net/pop3/POP3Connection.cpp @@ -106,6 +106,7 @@ void POP3Connection::connect() // Create and connect the socket m_socket = store->getSocketFactory()->create(m_timeoutHandler); + m_socket->setTracer(m_tracer); #if VMIME_HAVE_TLS_SUPPORT if (store->isPOP3S()) // dedicated port/POP3S diff --git a/src/vmime/net/smtp/SMTPConnection.cpp b/src/vmime/net/smtp/SMTPConnection.cpp index 99a8e8f5..60c8515d 100644 --- a/src/vmime/net/smtp/SMTPConnection.cpp +++ b/src/vmime/net/smtp/SMTPConnection.cpp @@ -107,6 +107,7 @@ void SMTPConnection::connect() // Create and connect the socket m_socket = transport->getSocketFactory()->create(m_timeoutHandler); + m_socket->setTracer(m_tracer); #if VMIME_HAVE_TLS_SUPPORT if (transport->isSMTPS()) // dedicated port/SMTPS diff --git a/src/vmime/net/socket.hpp b/src/vmime/net/socket.hpp index 72f0445f..2de83dd1 100644 --- a/src/vmime/net/socket.hpp +++ b/src/vmime/net/socket.hpp @@ -34,6 +34,7 @@ #include "vmime/base.hpp" #include "vmime/net/timeoutHandler.hpp" +#include "vmime/net/tracer.hpp" namespace vmime { @@ -168,6 +169,20 @@ public: */ virtual shared_ptr <timeoutHandler> getTimeoutHandler() = 0; + /** Set the tracer used by this socket. Tracer will only be used + * to report socket-specific events such as connection (not when + * sending/receiving data). + * + * @param tracer tracer to use + */ + virtual void setTracer(shared_ptr <tracer> tracer) = 0; + + /** Return the tracer used by this socket. + * + * @return tracer, or NULL if none is set + */ + virtual shared_ptr <tracer> getTracer() = 0; + protected: socket() { } diff --git a/src/vmime/net/tls/TLSSocket.hpp b/src/vmime/net/tls/TLSSocket.hpp index ec3a83ef..be27d1d0 100644 --- a/src/vmime/net/tls/TLSSocket.hpp +++ b/src/vmime/net/tls/TLSSocket.hpp @@ -74,7 +74,7 @@ public: * @return server certificate chain, or NULL if the handshake * has not been performed yet */ - virtual shared_ptr <security::cert::certificateChain> getPeerCertificates() const = 0; + virtual shared_ptr <security::cert::certificateChain> getPeerCertificates() = 0; }; diff --git a/src/vmime/net/tls/gnutls/TLSSocket_GnuTLS.cpp b/src/vmime/net/tls/gnutls/TLSSocket_GnuTLS.cpp index 33e25261..5bc8db84 100644 --- a/src/vmime/net/tls/gnutls/TLSSocket_GnuTLS.cpp +++ b/src/vmime/net/tls/gnutls/TLSSocket_GnuTLS.cpp @@ -147,6 +147,18 @@ shared_ptr <timeoutHandler> TLSSocket_GnuTLS::getTimeoutHandler() } +void TLSSocket_GnuTLS::setTracer(shared_ptr <net::tracer> tracer) +{ + m_wrapped->setTracer(tracer); +} + + +shared_ptr <net::tracer> TLSSocket_GnuTLS::getTracer() +{ + return m_wrapped->getTracer(); +} + + bool TLSSocket_GnuTLS::waitForRead(const int msecs) { return m_wrapped->waitForRead(msecs); @@ -287,6 +299,9 @@ void TLSSocket_GnuTLS::handshake() if (toHandler) toHandler->resetTimeOut(); + if (getTracer()) + getTracer()->traceSend("Beginning SSL/TLS handshake"); + // Start handshaking process try { @@ -406,8 +421,11 @@ ssize_t TLSSocket_GnuTLS::gnutlsPullFunc } -shared_ptr <security::cert::certificateChain> TLSSocket_GnuTLS::getPeerCertificates() const +shared_ptr <security::cert::certificateChain> TLSSocket_GnuTLS::getPeerCertificates() { + if (getTracer()) + getTracer()->traceSend("Getting peer certificates"); + unsigned int certCount = 0; const gnutls_datum* rawData = gnutls_certificate_get_peers (*m_session->m_gnutlsSession, &certCount); diff --git a/src/vmime/net/tls/gnutls/TLSSocket_GnuTLS.hpp b/src/vmime/net/tls/gnutls/TLSSocket_GnuTLS.hpp index 5c819caf..def45418 100644 --- a/src/vmime/net/tls/gnutls/TLSSocket_GnuTLS.hpp +++ b/src/vmime/net/tls/gnutls/TLSSocket_GnuTLS.hpp @@ -56,7 +56,7 @@ public: void handshake(); - shared_ptr <security::cert::certificateChain> getPeerCertificates() const; + shared_ptr <security::cert::certificateChain> getPeerCertificates(); // Implementation of 'socket' void connect(const string& address, const port_t port); @@ -83,6 +83,9 @@ public: shared_ptr <timeoutHandler> getTimeoutHandler(); + void setTracer(shared_ptr <net::tracer> tracer); + shared_ptr <net::tracer> getTracer(); + private: void internalThrow(); diff --git a/src/vmime/net/tls/openssl/TLSSocket_OpenSSL.cpp b/src/vmime/net/tls/openssl/TLSSocket_OpenSSL.cpp index bec41612..a716f5b2 100644 --- a/src/vmime/net/tls/openssl/TLSSocket_OpenSSL.cpp +++ b/src/vmime/net/tls/openssl/TLSSocket_OpenSSL.cpp @@ -193,6 +193,18 @@ shared_ptr <timeoutHandler> TLSSocket_OpenSSL::getTimeoutHandler() } +void TLSSocket_OpenSSL::setTracer(shared_ptr <net::tracer> tracer) +{ + m_wrapped->setTracer(tracer); +} + + +shared_ptr <net::tracer> TLSSocket_OpenSSL::getTracer() +{ + return m_wrapped->getTracer(); +} + + bool TLSSocket_OpenSSL::waitForRead(const int msecs) { return m_wrapped->waitForRead(msecs); @@ -343,6 +355,9 @@ void TLSSocket_OpenSSL::handshake() if (toHandler) toHandler->resetTimeOut(); + if (getTracer()) + getTracer()->traceSend("Beginning SSL/TLS handshake"); + // Start handshaking process if (!m_ssl) createSSLHandle(); @@ -389,8 +404,11 @@ void TLSSocket_OpenSSL::handshake() } -shared_ptr <security::cert::certificateChain> TLSSocket_OpenSSL::getPeerCertificates() const +shared_ptr <security::cert::certificateChain> TLSSocket_OpenSSL::getPeerCertificates() { + if (getTracer()) + getTracer()->traceSend("Getting peer certificates"); + STACK_OF(X509)* chain = SSL_get_peer_cert_chain(m_ssl); if (chain == NULL) diff --git a/src/vmime/net/tls/openssl/TLSSocket_OpenSSL.hpp b/src/vmime/net/tls/openssl/TLSSocket_OpenSSL.hpp index 20712263..913a02fe 100644 --- a/src/vmime/net/tls/openssl/TLSSocket_OpenSSL.hpp +++ b/src/vmime/net/tls/openssl/TLSSocket_OpenSSL.hpp @@ -60,7 +60,7 @@ public: void handshake(); - shared_ptr <security::cert::certificateChain> getPeerCertificates() const; + shared_ptr <security::cert::certificateChain> getPeerCertificates(); // Implementation of 'socket' void connect(const string& address, const port_t port); @@ -87,6 +87,9 @@ public: shared_ptr <timeoutHandler> getTimeoutHandler(); + void setTracer(shared_ptr <net::tracer> tracer); + shared_ptr <net::tracer> getTracer(); + private: static BIO_METHOD sm_customBIOMethod; diff --git a/src/vmime/platforms/posix/posixSocket.cpp b/src/vmime/platforms/posix/posixSocket.cpp index 4bb709e6..e13f6523 100644 --- a/src/vmime/platforms/posix/posixSocket.cpp +++ b/src/vmime/platforms/posix/posixSocket.cpp @@ -84,6 +84,14 @@ void posixSocket::connect(const vmime::string& address, const vmime::port_t port m_desc = -1; } + if (m_tracer) + { + std::ostringstream trace; + trace << "Connecting to " << address << ", port " << port; + + m_tracer->traceSend(trace.str()); + } + #if VMIME_HAVE_GETADDRINFO // use thread-safe and IPv6-aware getaddrinfo() if available // Resolve address, if needed @@ -370,6 +378,9 @@ void posixSocket::disconnect() { if (m_desc != -1) { + if (m_tracer) + m_tracer->traceSend("Disconnecting"); + ::shutdown(m_desc, SHUT_RDWR); ::close(m_desc); @@ -730,6 +741,18 @@ shared_ptr <net::timeoutHandler> posixSocket::getTimeoutHandler() } +void posixSocket::setTracer(shared_ptr <net::tracer> tracer) +{ + m_tracer = tracer; +} + + +shared_ptr <net::tracer> posixSocket::getTracer() +{ + return m_tracer; +} + + // // posixSocketFactory diff --git a/src/vmime/platforms/posix/posixSocket.hpp b/src/vmime/platforms/posix/posixSocket.hpp index b8009154..575a2a25 100644 --- a/src/vmime/platforms/posix/posixSocket.hpp +++ b/src/vmime/platforms/posix/posixSocket.hpp @@ -70,6 +70,9 @@ public: shared_ptr <net::timeoutHandler> getTimeoutHandler(); + void setTracer(shared_ptr <net::tracer> tracer); + shared_ptr <net::tracer> getTracer(); + protected: bool waitForData(const bool read, const bool write, const int msecs); @@ -79,6 +82,7 @@ protected: private: shared_ptr <vmime::net::timeoutHandler> m_timeoutHandler; + shared_ptr <net::tracer> m_tracer; byte_t m_buffer[65536]; int m_desc; diff --git a/src/vmime/platforms/windows/windowsSocket.cpp b/src/vmime/platforms/windows/windowsSocket.cpp index d65b4f09..cb731443 100644 --- a/src/vmime/platforms/windows/windowsSocket.cpp +++ b/src/vmime/platforms/windows/windowsSocket.cpp @@ -81,6 +81,14 @@ void windowsSocket::connect(const vmime::string& address, const vmime::port_t po addr.sin_port = htons(static_cast <unsigned short>(port)); addr.sin_addr.s_addr = ::inet_addr(address.c_str()); + if (m_tracer) + { + std::ostringstream trace; + trace << "Connecting to " << address << ", port " << port; + + m_tracer->traceSend(trace.str()); + } + if (addr.sin_addr.s_addr == static_cast <int>(-1)) { ::hostent* hostInfo = ::gethostbyname(address.c_str()); @@ -153,6 +161,9 @@ void windowsSocket::disconnect() { if (m_desc != INVALID_SOCKET) { + if (m_tracer) + m_tracer->traceSend("Disconnecting"); + ::shutdown(m_desc, SD_BOTH); ::closesocket(m_desc); @@ -491,6 +502,18 @@ shared_ptr <net::timeoutHandler> windowsSocket::getTimeoutHandler() } +void windowsSocket::setTracer(shared_ptr <net::tracer> tracer) +{ + m_tracer = tracer; +} + + +shared_ptr <net::tracer> windowsSocket::getTracer() +{ + return m_tracer; +} + + // // posixSocketFactory diff --git a/src/vmime/platforms/windows/windowsSocket.hpp b/src/vmime/platforms/windows/windowsSocket.hpp index 42ba3156..8e9df2a1 100644 --- a/src/vmime/platforms/windows/windowsSocket.hpp +++ b/src/vmime/platforms/windows/windowsSocket.hpp @@ -74,6 +74,9 @@ public: shared_ptr <net::timeoutHandler> getTimeoutHandler(); + void setTracer(shared_ptr <net::tracer> tracer); + shared_ptr <net::tracer> getTracer(); + protected: void throwSocketError(const int err); diff --git a/src/vmime/security/sasl/SASLSocket.cpp b/src/vmime/security/sasl/SASLSocket.cpp index de468fb3..ef7ed6da 100644 --- a/src/vmime/security/sasl/SASLSocket.cpp +++ b/src/vmime/security/sasl/SASLSocket.cpp @@ -102,6 +102,18 @@ shared_ptr <net::timeoutHandler> SASLSocket::getTimeoutHandler() } +void SASLSocket::setTracer(shared_ptr <net::tracer> tracer) +{ + m_wrapped->setTracer(tracer); +} + + +shared_ptr <net::tracer> SASLSocket::getTracer() +{ + return m_wrapped->getTracer(); +} + + bool SASLSocket::waitForRead(const int msecs) { return m_wrapped->waitForRead(msecs); diff --git a/src/vmime/security/sasl/SASLSocket.hpp b/src/vmime/security/sasl/SASLSocket.hpp index 474d5596..a280d8a8 100644 --- a/src/vmime/security/sasl/SASLSocket.hpp +++ b/src/vmime/security/sasl/SASLSocket.hpp @@ -78,6 +78,9 @@ public: shared_ptr <net::timeoutHandler> getTimeoutHandler(); + void setTracer(shared_ptr <net::tracer> tracer); + shared_ptr <net::tracer> getTracer(); + private: shared_ptr <SASLSession> m_session; diff --git a/tests/testUtils.cpp b/tests/testUtils.cpp index c4fce447..dcdb2a03 100644 --- a/tests/testUtils.cpp +++ b/tests/testUtils.cpp @@ -85,6 +85,17 @@ vmime::shared_ptr <vmime::net::timeoutHandler> testSocket::getTimeoutHandler() } +void testSocket::setTracer(vmime::shared_ptr <vmime::net::tracer> tracer) +{ +} + + +vmime::shared_ptr <vmime::net::tracer> testSocket::getTracer() +{ + return vmime::null; +} + + bool testSocket::waitForRead(const int msecs) { return true; diff --git a/tests/testUtils.hpp b/tests/testUtils.hpp index 20ebdf20..2476787b 100644 --- a/tests/testUtils.hpp +++ b/tests/testUtils.hpp @@ -268,6 +268,9 @@ public: vmime::shared_ptr <vmime::net::timeoutHandler> getTimeoutHandler(); + void setTracer(vmime::shared_ptr <vmime::net::tracer> tracer); + vmime::shared_ptr <vmime::net::tracer> getTracer(); + /** Send data to client. * * @param buffer data to send |