|
|
|
@ -164,9 +164,10 @@ TQIODevice::Offset TDEKerberosServerSocket::at() const {
|
|
|
|
|
return TQSocket::at();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool TDEKerberosServerSocket::at(TQIODevice::Offset off) {
|
|
|
|
|
bool TDEKerberosServerSocket::at(TQIODevice::Offset off, int hidebasehack) {
|
|
|
|
|
long i;
|
|
|
|
|
bool ret;
|
|
|
|
|
Q_UNUSED(hidebasehack);
|
|
|
|
|
|
|
|
|
|
if (m_kerberosRequested) {
|
|
|
|
|
if (off > 0) {
|
|
|
|
@ -209,6 +210,61 @@ bool TDEKerberosServerSocket::atEnd() const {
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int TDEKerberosServerSocket::getch() {
|
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
|
|
if (kerberosStatus() == KerberosInUse) {
|
|
|
|
|
char data[1];
|
|
|
|
|
if (readBlock(data, 1) < 0) {
|
|
|
|
|
ret = -1;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
ret = data[0];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
ret = TQSocket::getch();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int TDEKerberosServerSocket::putch(int ch) {
|
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
|
|
if (kerberosStatus() == KerberosInUse) {
|
|
|
|
|
char data[1];
|
|
|
|
|
data[0] = ch;
|
|
|
|
|
if (writeBlock(data, 1) < 1) {
|
|
|
|
|
ret = -1;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
ret = ch;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
ret = TQSocket::putch(ch);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int TDEKerberosServerSocket::ungetch(int ch) {
|
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
|
|
if (kerberosStatus() == KerberosInUse) {
|
|
|
|
|
ret = m_buffer->ungetch(ch);
|
|
|
|
|
if (ret >= 0) {
|
|
|
|
|
m_bufferLength++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
ret = TQSocket::ungetch(ch);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TQ_ULONG TDEKerberosServerSocket::bytesAvailable() const {
|
|
|
|
|
bool ret;
|
|
|
|
|
|
|
|
|
@ -335,7 +391,7 @@ TQ_LONG TDEKerberosServerSocket::writeBlock(const char *data, TQ_ULONG len) {
|
|
|
|
|
TQ_LONG ret;
|
|
|
|
|
|
|
|
|
|
if (m_kerberosRequested) {
|
|
|
|
|
ret = transmitEncryptedData(socket(), data, len);
|
|
|
|
|
ret = transmitEncryptedData(data, len);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
ret = TQSocket::writeBlock(data, len);
|
|
|
|
@ -458,7 +514,7 @@ TQString TDEKerberosServerSocket::readLine() {
|
|
|
|
|
|
|
|
|
|
void TDEKerberosServerSocket::writeLine(TQString str) {
|
|
|
|
|
if (m_kerberosRequested) {
|
|
|
|
|
transmitEncryptedData(socket(), str.ascii(), str.length());
|
|
|
|
|
transmitEncryptedData(str.ascii(), str.length());
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
TQSocket::writeBlock(str.ascii(), str.length());
|
|
|
|
@ -472,7 +528,7 @@ void TDEKerberosServerSocket::freeKerberosConnection(void) {
|
|
|
|
|
saslData->m_krbConnection = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TDEKerberosServerSocket::sendSASLDataToNetwork(const char *buffer, unsigned length, int netfd) {
|
|
|
|
|
void TDEKerberosServerSocket::sendSASLDataToNetwork(const char *buffer, unsigned length) {
|
|
|
|
|
char *buf;
|
|
|
|
|
unsigned len, alloclen;
|
|
|
|
|
int result;
|
|
|
|
@ -493,8 +549,8 @@ void TDEKerberosServerSocket::sendSASLDataToNetwork(const char *buffer, unsigned
|
|
|
|
|
len = strlen(buf);
|
|
|
|
|
buf[len] = '\n';
|
|
|
|
|
buf[len+1] = 0;
|
|
|
|
|
if (write(netfd, buf, len+1) < 0) {
|
|
|
|
|
// ERROR
|
|
|
|
|
if (TQSocket::writeBlock(buf, len+1) < (len+1)) {
|
|
|
|
|
printf("[WARNING] Transmitting data in base64 failed due to short write\n\r");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
free(buf);
|
|
|
|
@ -506,7 +562,7 @@ int TDEKerberosServerSocket::getSASLDataFromNetwork(char *buf, int trunclen, boo
|
|
|
|
|
unsigned int len;
|
|
|
|
|
int result;
|
|
|
|
|
|
|
|
|
|
TQByteArray ba(2048);
|
|
|
|
|
TQCString ba;
|
|
|
|
|
|
|
|
|
|
if (!shouldblock) {
|
|
|
|
|
if ((!TQSocket::canReadLine()) || (state() != TQSocket::Connected)) {
|
|
|
|
@ -520,25 +576,20 @@ int TDEKerberosServerSocket::getSASLDataFromNetwork(char *buf, int trunclen, boo
|
|
|
|
|
dataTimeoutTimer.start(m_dataTimeout, TRUE);
|
|
|
|
|
}
|
|
|
|
|
while (dataTimeoutTimer.isActive() || (m_dataTimeout < 0)) {
|
|
|
|
|
if ((shouldblock) && (dataTimeoutTimer.isActive() || (m_dataTimeout < 0))) {
|
|
|
|
|
SAFELY_PROCESS_EVENTS
|
|
|
|
|
if (!TQSocket::canReadLine()) {
|
|
|
|
|
if ((shouldblock) && (dataTimeoutTimer.isActive() || (m_dataTimeout < 0))) {
|
|
|
|
|
SAFELY_PROCESS_EVENTS
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (state() != TQSocket::Connected) {
|
|
|
|
|
m_criticalSection--;
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
if (TQSocket::readBlock(ba.data()+len, 1) > 0) {
|
|
|
|
|
if (ba.data()[len] == '\n') {
|
|
|
|
|
ba.data()[len] = 0;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (ba.data()[len] != '\r') {
|
|
|
|
|
len++;
|
|
|
|
|
}
|
|
|
|
|
if (m_dataTimeout > 0) {
|
|
|
|
|
dataTimeoutTimer.stop();
|
|
|
|
|
dataTimeoutTimer.start(m_dataTimeout, TRUE);
|
|
|
|
|
}
|
|
|
|
|
if (TQSocket::canReadLine()) {
|
|
|
|
|
TQString base64string = TQSocket::readLine();
|
|
|
|
|
base64string.truncate(base64string.length()-1);
|
|
|
|
|
ba = base64string;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
if (shouldblock) {
|
|
|
|
@ -548,19 +599,21 @@ int TDEKerberosServerSocket::getSASLDataFromNetwork(char *buf, int trunclen, boo
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (len >= (ba.size()-1)) {
|
|
|
|
|
ba.resize(ba.size()+2048);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!ba.isNull()) {
|
|
|
|
|
len = strlen(ba.data());
|
|
|
|
|
result = sasl_decode64(ba.data(), len, buf, trunclen, &len);
|
|
|
|
|
if (result != SASL_OK) {
|
|
|
|
|
printf("[ERROR] Decoding data from base64 returned %s (%d)\n\r", sasl_errstring(result, NULL, NULL), result);
|
|
|
|
|
m_criticalSection--;
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
buf[len] = '\0';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
m_criticalSection--;
|
|
|
|
|
return -1;
|
|
|
|
|
else {
|
|
|
|
|
buf[0] = '\0';
|
|
|
|
|
}
|
|
|
|
|
buf[len] = '\0';
|
|
|
|
|
|
|
|
|
|
m_criticalSection--;
|
|
|
|
|
return len;
|
|
|
|
@ -571,7 +624,7 @@ int TDEKerberosServerSocket::getSASLDataFromNetwork(char *buf, int trunclen, boo
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int TDEKerberosServerSocket::transmitEncryptedData(int fd, const char* readbuf, int cc) {
|
|
|
|
|
int TDEKerberosServerSocket::transmitEncryptedData(const char* readbuf, int cc) {
|
|
|
|
|
int result = 0;
|
|
|
|
|
unsigned int len;
|
|
|
|
|
const char *data;
|
|
|
|
@ -598,7 +651,7 @@ int TDEKerberosServerSocket::transmitEncryptedData(int fd, const char* readbuf,
|
|
|
|
|
printf("[ERROR] Encrypting data returned %s (%d)\n\r", safe_sasl_errdetail(saslData->m_krbConnection), result);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
sendSASLDataToNetwork(data, len, fd);
|
|
|
|
|
sendSASLDataToNetwork(data, len);
|
|
|
|
|
data_remaining = data_remaining - data_to_write_len;
|
|
|
|
|
remnant_position = remnant_position + data_to_write_len;
|
|
|
|
|
if ((data_remaining > 0) && (dataTimeoutTimer.isActive() || (m_dataTimeout < 0))) {
|
|
|
|
@ -714,7 +767,7 @@ void TDEKerberosServerSocket::continueKerberosInitialization() {
|
|
|
|
|
if (m_krbInitResult == SASL_CONTINUE) {
|
|
|
|
|
if (m_krbInitData) {
|
|
|
|
|
printf("[DEBUG] Sending response...\n\r");
|
|
|
|
|
sendSASLDataToNetwork(m_krbInitData, len, socket());
|
|
|
|
|
sendSASLDataToNetwork(m_krbInitData, len);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
printf("[ERROR] No data to send!\n\r");
|
|
|
|
@ -775,7 +828,7 @@ void TDEKerberosServerSocket::continueKerberosInitialization() {
|
|
|
|
|
if (state() == TQSocket::Connected) {
|
|
|
|
|
if(m_krbInitServerLast && m_krbInitData) {
|
|
|
|
|
printf("[DEBUG] Additional information needed to be sent\n\r");
|
|
|
|
|
sendSASLDataToNetwork(m_krbInitData, len, socket());
|
|
|
|
|
sendSASLDataToNetwork(m_krbInitData, len);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_krbInitResult = sasl_getprop(saslData->m_krbConnection, SASL_USERNAME, (const void **)&m_krbInitData);
|
|
|
|
@ -903,7 +956,7 @@ int TDEKerberosServerSocket::initializeKerberosInterface() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
printf("[DEBUG] Sending list of %d mechanism(s)\n\r", count);
|
|
|
|
|
sendSASLDataToNetwork(m_krbInitData, len, socket());
|
|
|
|
|
sendSASLDataToNetwork(m_krbInitData, len);
|
|
|
|
|
|
|
|
|
|
m_krbInitRunning = true;
|
|
|
|
|
m_krbInitState = 0;
|
|
|
|
|