bool KviMircryptionEngine::init(const char * encKey, int encKeyLen, const char * decKey, int decKeyLen) { if(encKey && (encKeyLen > 0)) { if(!(decKey && (decKeyLen > 0))) { decKey = encKey; decKeyLen = encKeyLen; } // else all } else { // no encrypt key specified... if(decKey && decKeyLen) { encKey = decKey; encKeyLen = decKeyLen; } else { // both keys missing setLastError(__tr2qs("Missing both encryption and decryption key: at least one is needed")); return false; } } m_szEncryptKey = KviCString(encKey, encKeyLen); m_szDecryptKey = KviCString(decKey, decKeyLen); m_bEncryptCBC = true; m_bDecryptCBC = true; if((kvi_strEqualCIN("ecb:", m_szEncryptKey.ptr(), 4) || kvi_strEqualCIN("old:", m_szEncryptKey.ptr(), 4)) && (m_szEncryptKey.len() > 4)) { m_bEncryptCBC = false; m_szEncryptKey.cutLeft(4); } else if(kvi_strEqualCIN("cbc:", m_szEncryptKey.ptr(), 4) && (m_szEncryptKey.len() > 4)) { m_szEncryptKey.cutLeft(4); } if((kvi_strEqualCIN("ecb:", m_szDecryptKey.ptr(), 4) || kvi_strEqualCIN("old:", m_szDecryptKey.ptr(), 4)) && (m_szDecryptKey.len() > 4)) { m_bDecryptCBC = false; m_szDecryptKey.cutLeft(4); } else if(kvi_strEqualCIN("cbc:", m_szDecryptKey.ptr(), 4) && (m_szDecryptKey.len() > 4)) { m_szDecryptKey.cutLeft(4); } return true; }
void KviMainWindow::restoreModuleExtensionToolBars() { for(auto szEntry : KVI_OPTION_STRINGLIST(KviOption_stringlistModuleExtensionToolbars)) { int idx = szEntry.indexOf(':'); if(idx != -1) { QString szMod = szEntry.left(idx); szEntry.remove(0, idx + 1); g_pModuleExtensionManager->allocateExtension("toolbar", KviCString(szEntry), firstConsole(), nullptr, nullptr, szMod); } } }
void KviWindow::output(int iMsgType, const QDateTime & datetime, const kvi_wchar_t * pwFormat, ...) { QString szFmt = QString::fromUtf8(KviCString(pwFormat).ptr()); kvi_va_list l; kvi_va_start(l, pwFormat); QString szBuf; KviQString::vsprintf(szBuf, szFmt, l); kvi_va_end(l); preprocessMessage(szBuf); const QChar * pC = szBuf.constData(); if(!pC) return; internalOutput(m_pIrcView, iMsgType, (kvi_wchar_t *)pC, 0, datetime); }
void KviMainWindow::restoreModuleExtensionToolBars() { for(QStringList::Iterator it = KVI_OPTION_STRINGLIST(KviOption_stringlistModuleExtensionToolbars).begin();it != KVI_OPTION_STRINGLIST(KviOption_stringlistModuleExtensionToolbars).end();++it) { QString szEntry = *it; int idx = szEntry.indexOf(':'); if(idx != -1) { QString szMod = szEntry.left(idx); szEntry.remove(0,idx + 1); g_pModuleExtensionManager->allocateExtension("toolbar",KviCString(szEntry),firstConsole(),0,0,szMod); } } }
bool DccChatWindow::event(QEvent * e) { if(e->type() == KVI_THREAD_EVENT) { switch(((KviThreadEvent *)e)->id()) { case KVI_DCC_THREAD_EVENT_ERROR: { KviError::Code * pError = ((KviThreadDataEvent<KviError::Code> *)e)->getData(); QString szErr = KviError::getDescription(*pError); if(!KVS_TRIGGER_EVENT_2_HALTED(KviEvent_OnDCCChatError, this, szErr, m_pDescriptor->idString())) output(KVI_OUT_DCCERROR, __tr2qs_ctx("ERROR: %Q", "dcc"), &szErr); KVS_TRIGGER_EVENT_1(KviEvent_OnDCCChatDisconnected, this, m_pDescriptor->idString()); delete pError; return true; } break; case KVI_DCC_THREAD_EVENT_DATA: { KviCString * encoded = ((KviThreadDataEvent<KviCString> *)e)->getData(); KviCString d = KviCString(decodeText(encoded->ptr())); if(d.firstCharIs(0x01)) { d.cutLeft(1); if(d.lastCharIs(0x01)) d.cutRight(1); if(kvi_strEqualCIN("ACTION", d.ptr(), 6)) d.cutLeft(6); d.stripLeftWhiteSpace(); output(KVI_OUT_ACTION, "%Q %s", &(m_pDescriptor->szNick), d.ptr()); if(!hasAttention(KviWindow::MainWindowIsVisible)) { if(KVI_OPTION_BOOL(KviOption_boolFlashDccChatWindowOnNewMessages)) { demandAttention(); } if(KVI_OPTION_BOOL(KviOption_boolPopupNotifierOnNewDccChatMessages)) { QString szMsg = "<b>"; szMsg += m_pDescriptor->szNick; szMsg += "</b> "; szMsg += KviQString::toHtmlEscaped(QString(d.ptr())); //qDebug("KviIrcServerParser_ctcp.cpp:975 debug: %s",szMsg.data()); g_pApp->notifierMessage(this, KVI_OPTION_MSGTYPE(KVI_OUT_ACTION).pixId(), szMsg, KVI_OPTION_UINT(KviOption_uintNotifierAutoHideTime)); } } } else { #ifdef COMPILE_CRYPT_SUPPORT if(KviCryptSessionInfo * cinf = cryptSessionInfo()) { if(cinf->m_bDoDecrypt) { KviCString decryptedStuff; switch(cinf->m_pEngine->decrypt(d.ptr(), decryptedStuff)) { case KviCryptEngine::DecryptOkWasEncrypted: case KviCryptEngine::DecryptOkWasEncoded: case KviCryptEngine::DecryptOkWasPlainText: if(!KVS_TRIGGER_EVENT_2_HALTED(KviEvent_OnDCCChatMessage, this, QString(decryptedStuff.ptr()), m_pDescriptor->idString())) { g_pMainWindow->firstConsole()->outputPrivmsg(this, KVI_OUT_DCCCHATMSG, m_pDescriptor->szNick.toUtf8().data(), m_pDescriptor->szUser.toUtf8().data(), m_pDescriptor->szHost.toUtf8().data(), decryptedStuff.ptr()); } delete encoded; return true; break; default: // also case KviCryptEngine::DecryptError { QString szErr = cinf->m_pEngine->lastError(); output(KVI_OUT_SYSTEMERROR, __tr2qs_ctx("The following message appears to be encrypted, but the encryption engine failed to decode it: %Q", "dcc"), &szErr); } break; } } } else { #endif // FIXME! if(!KVS_TRIGGER_EVENT_2_HALTED(KviEvent_OnDCCChatMessage, this, QString(d.ptr()), m_pDescriptor->idString())) { g_pMainWindow->firstConsole()->outputPrivmsg(this, KVI_OUT_DCCCHATMSG, m_pDescriptor->szNick.toUtf8().data(), m_pDescriptor->szUser.toUtf8().data(), m_pDescriptor->szHost.toUtf8().data(), d.ptr()); if(!hasAttention(KviWindow::MainWindowIsVisible)) { if(KVI_OPTION_BOOL(KviOption_boolFlashDccChatWindowOnNewMessages)) { demandAttention(); } if(KVI_OPTION_BOOL(KviOption_boolPopupNotifierOnNewDccChatMessages)) { QString szMsg = KviQString::toHtmlEscaped(QString(d.ptr())); g_pApp->notifierMessage(this, KviIconManager::DccChatMsg, szMsg, KVI_OPTION_UINT(KviOption_uintNotifierAutoHideTime)); } } } #ifdef COMPILE_CRYPT_SUPPORT } #endif } delete encoded; return true; } break; } } return KviWindow::event(e); }
KviIrcMessage::KviIrcMessage(const char * message, KviIrcConnection * pConnection) { m_pConnection = pConnection; m_pConsole = pConnection->console(); m_iFlags = 0; const char * aux; m_ptr = message; while(*m_ptr == ' ') ++m_ptr; const char * allParams = m_ptr; // just to be sure if(*m_ptr) { if(*m_ptr == '@') { aux = ++m_ptr; while(*m_ptr && (*m_ptr != ' ')) ++m_ptr; m_szMessageTags.extractFromString(aux, m_ptr); parseMessageTags(); while(*m_ptr == ' ') ++m_ptr; } if(*m_ptr == ':') { aux = ++m_ptr; while(*m_ptr && (*m_ptr != ' ')) ++m_ptr; m_szPrefix.extractFromString(aux, m_ptr); while(*m_ptr == ' ') ++m_ptr; } aux = m_ptr; while(*m_ptr && (*m_ptr != ' ')) ++m_ptr; m_szCommand.extractFromString(aux, m_ptr); while(*m_ptr == ' ') ++m_ptr; allParams = m_ptr; while(*m_ptr) { if(*m_ptr == ':') { ++m_ptr; m_pParams.push_back(KviCString(m_ptr)); break; // this was the last } else { aux = m_ptr; while(*m_ptr && (*m_ptr != ' ')) ++m_ptr; m_pParams.push_back(KviCString(aux, m_ptr)); while(*m_ptr == ' ') ++m_ptr; } } } m_ptr = allParams; m_iNumericCommand = (*m_szCommand.ptr() - '0') * 100; if((m_szCommand.len() == 3) && (m_iNumericCommand <= 900) && (m_iNumericCommand >= 0)) { aux = m_szCommand.ptr(); aux++; if((*aux >= '0') && (*aux <= '9')) { m_iNumericCommand += (*aux - '0') * 10; aux++; if((*aux >= '0') && (*aux <= '9')) { m_iNumericCommand += (*aux - '0'); } else { m_iNumericCommand = -1; m_szCommand.toUpper(); } } else { m_iNumericCommand = -1; m_szCommand.toUpper(); } } else { m_iNumericCommand = -1; m_szCommand.toUpper(); } }
bool KviRijndaelEngine::init(const char * encKey, int encKeyLen, const char * decKey, int decKeyLen) { if(m_pEncryptCipher) { delete m_pEncryptCipher; m_pEncryptCipher = nullptr; } if(m_pDecryptCipher) { delete m_pDecryptCipher; m_pDecryptCipher = nullptr; } if(encKey && (encKeyLen > 0)) { if(!(decKey && (decKeyLen > 0))) { decKey = encKey; decKeyLen = encKeyLen; } // else all } else { // no encrypt key specified... if(decKey && decKeyLen) { encKey = decKey; encKeyLen = decKeyLen; } else { // both keys missing setLastError(__tr2qs("Missing both encryption and decryption key: at least one is needed")); return false; } } KviCString szTmpEncryptKey = KviCString(encKey, encKeyLen); KviCString szTmpDecryptKey = KviCString(decKey, decKeyLen); m_bEncryptMode = CBC; // default mode m_bDecryptMode = CBC; // default mode if(kvi_strEqualCIN("ecb:", szTmpEncryptKey.ptr(), 4) && (szTmpEncryptKey.len() > 4)) { szTmpEncryptKey.cutLeft(4); m_bEncryptMode = ECB; } else if(kvi_strEqualCIN("old:", szTmpEncryptKey.ptr(), 4) && (szTmpEncryptKey.len() > 4)) { szTmpEncryptKey.cutLeft(4); m_bEncryptMode = OldCBC; } else if(kvi_strEqualCIN("cbc:", szTmpEncryptKey.ptr(), 4) && (szTmpEncryptKey.len() > 4)) { szTmpEncryptKey.cutLeft(4); } if(kvi_strEqualCIN("ecb:", szTmpDecryptKey.ptr(), 4) && (szTmpDecryptKey.len() > 4)) { szTmpDecryptKey.cutLeft(4); m_bDecryptMode = ECB; } else if(kvi_strEqualCIN("old:", szTmpDecryptKey.ptr(), 4) && (szTmpDecryptKey.len() > 4)) { szTmpDecryptKey.cutLeft(4); m_bDecryptMode = OldCBC; } else if(kvi_strEqualCIN("cbc:", szTmpDecryptKey.ptr(), 4) && (szTmpDecryptKey.len() > 4)) { szTmpDecryptKey.cutLeft(4); } int defLen = getKeyLen(); szTmpEncryptKey.padRight(defLen); szTmpDecryptKey.padRight(defLen); m_pEncryptCipher = new Rijndael(); int retVal = m_pEncryptCipher->init( (m_bEncryptMode == ECB) ? Rijndael::ECB : Rijndael::CBC, Rijndael::Encrypt, (unsigned char *)szTmpEncryptKey.ptr(), getKeyLenId()); if(retVal != RIJNDAEL_SUCCESS) { delete m_pEncryptCipher; m_pEncryptCipher = nullptr; setLastErrorFromRijndaelErrorCode(retVal); return false; } m_pDecryptCipher = new Rijndael(); retVal = m_pDecryptCipher->init( (m_bEncryptMode == ECB) ? Rijndael::ECB : Rijndael::CBC, Rijndael::Decrypt, (unsigned char *)szTmpDecryptKey.ptr(), getKeyLenId()); if(retVal != RIJNDAEL_SUCCESS) { delete m_pEncryptCipher; m_pEncryptCipher = nullptr; delete m_pDecryptCipher; m_pDecryptCipher = nullptr; setLastErrorFromRijndaelErrorCode(retVal); return false; } return true; }