diff options
Diffstat (limited to 'lib/libtdekrb/src/tdekrbclientsocket.cpp')
| -rw-r--r-- | lib/libtdekrb/src/tdekrbclientsocket.cpp | 60 |
1 files changed, 50 insertions, 10 deletions
diff --git a/lib/libtdekrb/src/tdekrbclientsocket.cpp b/lib/libtdekrb/src/tdekrbclientsocket.cpp index 24acb29..7e39fcf 100644 --- a/lib/libtdekrb/src/tdekrbclientsocket.cpp +++ b/lib/libtdekrb/src/tdekrbclientsocket.cpp @@ -30,6 +30,8 @@ #include <saslplug.h> #include <saslutil.h> +#include <klocale.h> + #include "tdekrbclientsocket.h" #define NET_SEC_BUF_SIZE (2048) @@ -95,7 +97,7 @@ static int logSASLMessages(void *context __attribute__((unused)), int priority, return SASL_OK; } -TDEKerberosClientSocket::TDEKerberosClientSocket(TQObject *parent, const char *name) : TQSocket(parent, name), m_kerberosRequested(false), m_criticalSection(0), m_bufferLength(0), m_krbInitRunning(false), m_krbInitState(-1), m_canary(NULL), m_negotiatedMaxBufferSize(NET_SEC_BUF_SIZE) { +TDEKerberosClientSocket::TDEKerberosClientSocket(TQObject *parent, const char *name) : TQSocket(parent, name), m_kerberosRequested(false), m_criticalSection(0), m_bufferLength(0), m_krbInitRunning(false), m_krbInitState(-1), m_dataTimeout(-1), m_canary(NULL), m_negotiatedMaxBufferSize(NET_SEC_BUF_SIZE) { saslData = new SASLDataPrivate; saslData->m_krbConnection = NULL; m_buffer = new TQBuffer(); @@ -111,7 +113,12 @@ TDEKerberosClientSocket::~TDEKerberosClientSocket() { delete saslData; } +void TDEKerberosClientSocket::setDataTimeout(int timeoutms) { + m_dataTimeout = timeoutms; +} + bool TDEKerberosClientSocket::open(int mode) { + setStatusMessage(i18n("Establishing initial connection to server")); bool ret = TQSocket::open(mode); if (m_kerberosRequested) { initializeKerberosInterface(); @@ -121,6 +128,7 @@ bool TDEKerberosClientSocket::open(int mode) { void TDEKerberosClientSocket::close() { TQSocket::close(); + setStatusMessage(i18n("Disconnected")); } void TDEKerberosClientSocket::flush() { @@ -453,8 +461,12 @@ int TDEKerberosClientSocket::getSASLDataFromNetwork(char *buf, int trunclen, boo } len = 0; - while (1) { - if (shouldblock) { + TQTimer dataTimeoutTimer; + if (m_dataTimeout > 0) { + dataTimeoutTimer.start(m_dataTimeout, TRUE); + } + while (dataTimeoutTimer.isActive() || (m_dataTimeout < 0)) { + if ((shouldblock) && (dataTimeoutTimer.isActive() || (m_dataTimeout < 0))) { SAFELY_PROCESS_EVENTS } if (state() != TQSocket::Connected) { @@ -469,10 +481,13 @@ int TDEKerberosClientSocket::getSASLDataFromNetwork(char *buf, int trunclen, boo if (ba.data()[len] != '\r') { len++; } + if (m_dataTimeout > 0) { + dataTimeoutTimer.stop(); + dataTimeoutTimer.start(m_dataTimeout, TRUE); + } } else { if (shouldblock) { - usleep(1000); } else { @@ -509,9 +524,14 @@ int TDEKerberosClientSocket::transmitEncryptedData(int fd, const char* readbuf, long data_remaining; long remnant_position; + TQTimer dataTimeoutTimer; + if (m_dataTimeout > 0) { + dataTimeoutTimer.start(m_dataTimeout, TRUE); + } + data_remaining = cc; remnant_position = 0; - while (data_remaining > 0) { + while ((data_remaining > 0) && (dataTimeoutTimer.isActive() || (m_dataTimeout < 0))) { int data_to_write_len; if (data_remaining > (m_negotiatedMaxBufferSize/2)) { data_to_write_len = m_negotiatedMaxBufferSize/2; @@ -527,7 +547,7 @@ int TDEKerberosClientSocket::transmitEncryptedData(int fd, const char* readbuf, sendSASLDataToNetwork(data, len, fd); data_remaining = data_remaining - data_to_write_len; remnant_position = remnant_position + data_to_write_len; - if (data_remaining > 0) { + if ((data_remaining > 0) && (dataTimeoutTimer.isActive() || (m_dataTimeout < 0))) { SAFELY_PROCESS_EVENTS } } @@ -576,6 +596,13 @@ TDEKerberosClientSocket::KerberosStatus TDEKerberosClientSocket::kerberosStatus( return KerberosInUse; } +void TDEKerberosClientSocket::setStatusMessage(TQString message) { + if (message != m_prevStatusMessage) { + emit(statusMessageUpdated(message)); + m_prevStatusMessage = message; + } +} + void TDEKerberosClientSocket::continueKerberosInitialization() { int slen; char buf[NET_SEC_BUF_SIZE]; @@ -588,27 +615,30 @@ void TDEKerberosClientSocket::continueKerberosInitialization() { switch (m_krbInitState) { case 0: if (state() == TQSocket::Connected) { + setStatusMessage(i18n("Waiting for mechanism list from server")); if (canReadLine()) { printf("[DEBUG] Waiting for mechanism list from server...\n\r"); slen = getSASLDataFromNetwork(buf, NET_SEC_BUF_SIZE); if (slen < 0) { m_krbInitState = -2; m_krbInitRunning = false; + setStatusMessage(i18n("Kerberos connection failed")); return; } len = slen; - + printf("Choosing best mechanism from: %s\n", buf); - + m_krbInitResult = sasl_client_start(saslData->m_krbConnection, buf, NULL, &data, &len, &chosenmech); if (m_krbInitResult != SASL_OK && m_krbInitResult != SASL_CONTINUE) { printf("[ERROR] Starting SASL negotiation returned %s (%d)\n\r", sasl_errstring(m_krbInitResult, NULL, NULL), m_krbInitResult); freeKerberosConnection(); m_krbInitState = -1; m_krbInitRunning = false; + setStatusMessage(i18n("Kerberos connection failed")); return; } - + printf("[DEBUG] Using mechanism %s\n\r", chosenmech); strcpy(buf, chosenmech); if (data) { @@ -617,6 +647,7 @@ void TDEKerberosClientSocket::continueKerberosInitialization() { freeKerberosConnection(); m_krbInitState = -1; m_krbInitRunning = false; + setStatusMessage(i18n("Kerberos connection failed")); return; } printf("[DEBUG] Preparing initial response...\n\r"); @@ -627,7 +658,7 @@ void TDEKerberosClientSocket::continueKerberosInitialization() { else { len = (unsigned) strlen(buf); } - + printf("[DEBUG] Sending initial response...\n\r"); sendSASLDataToNetwork(buf, len, socket()); @@ -642,12 +673,14 @@ void TDEKerberosClientSocket::continueKerberosInitialization() { case 1: if (state() == TQSocket::Connected) { if (m_krbInitResult == SASL_CONTINUE) { + setStatusMessage(i18n("Waiting for server reply")); if (canReadLine()) { printf("[DEBUG] Waiting for server reply...\n\r"); slen = getSASLDataFromNetwork(buf, NET_SEC_BUF_SIZE); if (slen < 0) { m_krbInitState = -2; m_krbInitRunning = false; + setStatusMessage(i18n("Kerberos connection failed")); return; } len = slen; @@ -657,6 +690,7 @@ void TDEKerberosClientSocket::continueKerberosInitialization() { freeKerberosConnection(); m_krbInitState = -1; m_krbInitRunning = false; + setStatusMessage(i18n("Kerberos connection failed")); return; } if (data && len) { @@ -676,6 +710,8 @@ void TDEKerberosClientSocket::continueKerberosInitialization() { else { m_krbInitState = -3; m_krbInitRunning = false; + setStatusMessage(i18n("Kerberos connection failed")); + return; } break; case 2: @@ -714,10 +750,14 @@ void TDEKerberosClientSocket::continueKerberosInitialization() { } m_krbInitState = 3; m_krbInitRunning = false; + setStatusMessage(i18n("Kerberos connection established")); + return; } else { m_krbInitState = -3; m_krbInitRunning = false; + setStatusMessage(i18n("Kerberos connection failed")); + return; } break; } |
