aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVincent Richard <[email protected]>2014-03-25 22:34:03 +0000
committerVincent Richard <[email protected]>2014-03-25 22:34:03 +0000
commitbbfdcc36a00bdae294c45baa2023f850efce7375 (patch)
treefc4c497490437282c78525a878b60ecb862a1674
parentFixed issue #71. (diff)
downloadvmime-bbfdcc36a00bdae294c45baa2023f850efce7375.tar.gz
vmime-bbfdcc36a00bdae294c45baa2023f850efce7375.zip
Trace socket/connection events.
-rw-r--r--src/vmime/net/imap/IMAPConnection.cpp1
-rw-r--r--src/vmime/net/pop3/POP3Connection.cpp1
-rw-r--r--src/vmime/net/smtp/SMTPConnection.cpp1
-rw-r--r--src/vmime/net/socket.hpp15
-rw-r--r--src/vmime/net/tls/TLSSocket.hpp2
-rw-r--r--src/vmime/net/tls/gnutls/TLSSocket_GnuTLS.cpp20
-rw-r--r--src/vmime/net/tls/gnutls/TLSSocket_GnuTLS.hpp5
-rw-r--r--src/vmime/net/tls/openssl/TLSSocket_OpenSSL.cpp20
-rw-r--r--src/vmime/net/tls/openssl/TLSSocket_OpenSSL.hpp5
-rw-r--r--src/vmime/platforms/posix/posixSocket.cpp23
-rw-r--r--src/vmime/platforms/posix/posixSocket.hpp4
-rw-r--r--src/vmime/platforms/windows/windowsSocket.cpp23
-rw-r--r--src/vmime/platforms/windows/windowsSocket.hpp3
-rw-r--r--src/vmime/security/sasl/SASLSocket.cpp12
-rw-r--r--src/vmime/security/sasl/SASLSocket.hpp3
-rw-r--r--tests/testUtils.cpp11
-rw-r--r--tests/testUtils.hpp3
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