|
|
|
@ -40,11 +40,11 @@ class SASLDataPrivate
|
|
|
|
|
|
|
|
|
|
static int logSASLMessages(void *context __attribute__((unused)), int priority, const char *message) {
|
|
|
|
|
const char *label;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!message) {
|
|
|
|
|
return SASL_BADPARAM;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
switch (priority) {
|
|
|
|
|
case SASL_LOG_ERR:
|
|
|
|
|
label = "Error";
|
|
|
|
@ -56,13 +56,13 @@ static int logSASLMessages(void *context __attribute__((unused)), int priority,
|
|
|
|
|
label = "Other";
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
printf("[SASL %s] %s\n\r", label, message);
|
|
|
|
|
|
|
|
|
|
return SASL_OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TDEKerberosClientSocket::TDEKerberosClientSocket(TQObject *parent, const char *name) : TQSocket(parent, name), m_kerberosRequested(false) {
|
|
|
|
|
TDEKerberosClientSocket::TDEKerberosClientSocket(TQObject *parent, const char *name) : TQSocket(parent, name), m_kerberosRequested(false), m_negotiatedMaxBufferSize(NET_SEC_BUF_SIZE) {
|
|
|
|
|
saslData = new SASLDataPrivate;
|
|
|
|
|
saslData->m_krbConnection = NULL;
|
|
|
|
|
}
|
|
|
|
@ -140,11 +140,13 @@ Q_LONG TDEKerberosClientSocket::readLine(char *data, Q_ULONG maxlen) {
|
|
|
|
|
|
|
|
|
|
TQString TDEKerberosClientSocket::readLine() {
|
|
|
|
|
TQString ret;
|
|
|
|
|
char buf[NET_SEC_BUF_SIZE];
|
|
|
|
|
char *buf;
|
|
|
|
|
|
|
|
|
|
if (m_kerberosRequested) {
|
|
|
|
|
receiveEncryptedData(buf, NET_SEC_BUF_SIZE);
|
|
|
|
|
buf = (char*)malloc(m_negotiatedMaxBufferSize);
|
|
|
|
|
receiveEncryptedData(buf, m_negotiatedMaxBufferSize);
|
|
|
|
|
ret = TQString(buf);
|
|
|
|
|
free(buf);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
ret = TQSocket::readLine();
|
|
|
|
@ -173,7 +175,6 @@ void TDEKerberosClientSocket::sendSASLDataToNetwork(const char *buffer, unsigned
|
|
|
|
|
char *buf;
|
|
|
|
|
unsigned len, alloclen;
|
|
|
|
|
int result;
|
|
|
|
|
char txbuf[NET_SEC_BUF_SIZE];
|
|
|
|
|
|
|
|
|
|
alloclen = ((length / 3) + 1) * 4 + 1;
|
|
|
|
|
buf = (char*)malloc(alloclen);
|
|
|
|
@ -188,8 +189,10 @@ void TDEKerberosClientSocket::sendSASLDataToNetwork(const char *buffer, unsigned
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sprintf(txbuf, "%s\n", buf);
|
|
|
|
|
write(netfd, txbuf, strlen(txbuf));
|
|
|
|
|
len = strlen(buf);
|
|
|
|
|
buf[len] = '\n';
|
|
|
|
|
buf[len+1] = 0;
|
|
|
|
|
write(netfd, buf, len+1);
|
|
|
|
|
|
|
|
|
|
free(buf);
|
|
|
|
|
}
|
|
|
|
@ -198,28 +201,31 @@ unsigned int TDEKerberosClientSocket::getSASLDataFromNetwork(char *buf, int trun
|
|
|
|
|
unsigned int len;
|
|
|
|
|
int result;
|
|
|
|
|
|
|
|
|
|
TQByteArray ba(2048);
|
|
|
|
|
|
|
|
|
|
len = 0;
|
|
|
|
|
while (1) {
|
|
|
|
|
tqApp->processEvents();
|
|
|
|
|
if (state() != TQSocket::Connected) {
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
if (TQSocket::readBlock(buf+len, 1) > 0) {
|
|
|
|
|
if (buf[len] == '\n') {
|
|
|
|
|
buf[len] = 0;
|
|
|
|
|
if (TQSocket::readBlock(ba.data()+len, 1) > 0) {
|
|
|
|
|
if (ba.data()[len] == '\n') {
|
|
|
|
|
ba.data()[len] = 0;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (buf[len] != '\r') {
|
|
|
|
|
if (ba.data()[len] != '\r') {
|
|
|
|
|
len++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (len >= trunclen) {
|
|
|
|
|
if (len >= (ba.size()-1)) {
|
|
|
|
|
ba.resize(ba.size()+2048);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
len = strlen(buf);
|
|
|
|
|
result = sasl_decode64(buf, (unsigned) strlen(buf), buf, trunclen, &len);
|
|
|
|
|
len = strlen(ba.data());
|
|
|
|
|
result = sasl_decode64(ba.data(), strlen(ba.data()), buf, trunclen, &len);
|
|
|
|
|
if (result != SASL_OK) {
|
|
|
|
|
printf("[ERROR] Decoding data from base64 returned %s (%d)\n\r", sasl_errstring(result, NULL, NULL), result);
|
|
|
|
|
return -1;
|
|
|
|
@ -400,5 +406,14 @@ int TDEKerberosClientSocket::initializeKerberosInterface() {
|
|
|
|
|
printf("[DEBUG] Authenticated SSF: %d\n", *ssf);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
result = sasl_getprop(saslData->m_krbConnection, SASL_MAXOUTBUF, (const void **)&m_negotiatedMaxBufferSize);
|
|
|
|
|
if (result != SASL_OK) {
|
|
|
|
|
printf("[WARNING] Unable to determine maximum buffer size!\n\r");
|
|
|
|
|
m_negotiatedMaxBufferSize = NET_SEC_BUF_SIZE;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
printf("[DEBUG] Maximum buffer size: %d\n", m_negotiatedMaxBufferSize);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|