diff options
Diffstat (limited to 'src/modules/dcc')
| -rw-r--r-- | src/modules/dcc/chat.h | 1 | ||||
| -rw-r--r-- | src/modules/dcc/descriptor.h | 3 | ||||
| -rw-r--r-- | src/modules/dcc/libkvidcc.cpp | 208 | ||||
| -rw-r--r-- | src/modules/dcc/send.cpp | 10 | ||||
| -rw-r--r-- | src/modules/dcc/send.h | 1 | ||||
| -rw-r--r-- | src/modules/dcc/thread.h | 1 | ||||
| -rw-r--r-- | src/modules/dcc/window.h | 11 |
7 files changed, 230 insertions, 5 deletions
diff --git a/src/modules/dcc/chat.h b/src/modules/dcc/chat.h index e4050e6cd..b0d569a51 100644 --- a/src/modules/dcc/chat.h +++ b/src/modules/dcc/chat.h @@ -92,6 +92,7 @@ protected: virtual void triggerCreationEvents(); virtual void triggerDestructionEvents(); void startConnection(); + virtual KviDccThread * getSlaveThread() { return m_pSlaveThread; }; protected slots: void handleMarshalError(int err); void connected(); diff --git a/src/modules/dcc/descriptor.h b/src/modules/dcc/descriptor.h index 21edede92..4d1ea6661 100644 --- a/src/modules/dcc/descriptor.h +++ b/src/modules/dcc/descriptor.h @@ -150,6 +150,9 @@ public: bool isFileDownload(); bool isDccChat(); bool isFileTransfer(){ return (isFileUpload() || isFileDownload()); }; +#ifdef COMPILE_SSL_SUPPORT + bool isSSL() const { return bIsSSL; }; +#endif }; #endif //_DESCRIPTOR_H_ diff --git a/src/modules/dcc/libkvidcc.cpp b/src/modules/dcc/libkvidcc.cpp index 9520c48dc..863b30690 100644 --- a/src/modules/dcc/libkvidcc.cpp +++ b/src/modules/dcc/libkvidcc.cpp @@ -2699,6 +2699,212 @@ static bool dcc_kvs_fnc_sessionList(KviKvsModuleFunctionCall * c) /* + @doc: dcc.getSSLInfo + @type: + function + @title: + $dcc.getSSLInfo + @short: + Returns the requested ssl information about a ssl-enabled dcc session + @syntax: + $dcc.getSSLInfo(<query:string>[,<dcc_id:integer>]) + @description: + Returns the requested ssl information about a ssl-enabled dcc session.[br] + If <dcc_id> is omitted then the DCC Session associated + to the current window is assumed.[br] + If <dcc_id> is not a valid DCC session identifier (or it is omitted + and the current window has no associated DCC session) then + this function prints a warning and returns an empty sting.[br] + If the DCC session is not using ssl then this function returns an empty string.[br] + Available query strings are:[br] + [ul] + [li]signatureType[/li] + [li]signatureContents[/li] + [li]subjectCountry[/li] + [li]subjectStateOrProvince[/li] + [li]subjectLocality[/li] + [li]subjectOrganization[/li] + [li]subjectOrganizationalUnit[/li] + [li]subjectCommonName[/li] + [li]issuerCountry[/li] + [li]issuerStateOrProvince[/li] + [li]issuerLocality[/li] + [li]issuerOrganization[/li] + [li]issuerOrganizationalUnit[/li] + [li]issuerCommonName[/li] + [li]publicKeyBits[/li] + [li]publicKeyType[/li] + [li]serialNumber[/li] + [li]pemBase64[/li] + [li]version[/li] + [/ul] + See the [module:dcc]dcc module[/module] documentation for more information.[br] +*/ + +static bool dcc_kvs_fnc_getSSLInfo(KviKvsModuleFunctionCall * c) +{ + kvs_uint_t uDccId; + QString szQuery; + KVSM_PARAMETERS_BEGIN(c) + KVSM_PARAMETER("query",KVS_PT_STRING,0,szQuery) + KVSM_PARAMETER("dcc_id",KVS_PT_UINT,KVS_PF_OPTIONAL,uDccId) + KVSM_PARAMETERS_END(c) + +#ifndef COMPILE_SSL_SUPPORT + c->warning(__tr2qs_ctx("This executable was built without SSL support","dcc")); + return true; +#else + + KviDccDescriptor * dcc = dcc_kvs_find_dcc_descriptor(uDccId,c); + + if(dcc) + { + if(!dcc->isSSL()) + { + c->warning(__tr2qs_ctx("Unable to get SSL informations: DCC session is not using SSL","dcc")); + c->returnValue()->setString(""); + return true; + } + + KviDccThread * pSlaveThread = 0; + if(dcc->window()) + pSlaveThread = dcc->window()->getSlaveThread(); + else if(dcc->transfer()) + pSlaveThread = dcc->transfer()->getSlaveThread(); + + if(!pSlaveThread) + { + c->warning(__tr2qs_ctx("Unable to get SSL informations: DCC session not initialized yet","dcc")); + c->returnValue()->setString(""); + return true; + } + + KviSSL * pSSL = pSlaveThread->getSSL(); + if(!pSSL) + { + c->warning(__tr2qs_ctx("Unable to get SSL informations: SSL non initialized yet in DCC session","dcc")); + c->returnValue()->setString(""); + return true; + } + + KviSSLCertificate * pCert = pSSL->getPeerCertificate(); + + if(!pCert) + { + c->warning(__tr2qs_ctx("Unable to get SSL informations: No peer certificate available","dcc")); + c->returnValue()->setString(""); + return true; + } + + if(szQuery.compare("signatureType")==0) + { + c->returnValue()->setString(pCert->signatureType()); + return true; + } + if(szQuery.compare("signatureContents")==0) + { + c->returnValue()->setString(pCert->signatureContents()); + return true; + } + if(szQuery.compare("subjectCountry")==0) + { + c->returnValue()->setString(pCert->subjectCountry()); + return true; + } + if(szQuery.compare("subjectStateOrProvince")==0) + { + c->returnValue()->setString(pCert->subjectStateOrProvince()); + return true; + } + if(szQuery.compare("subjectLocality")==0) + { + c->returnValue()->setString(pCert->subjectLocality()); + return true; + } + if(szQuery.compare("subjectOrganization")==0) + { + c->returnValue()->setString(pCert->subjectOrganization()); + return true; + } + if(szQuery.compare("subjectOrganizationalUnit")==0) + { + c->returnValue()->setString(pCert->subjectOrganizationalUnit()); + return true; + } + if(szQuery.compare("subjectCommonName")==0) + { + c->returnValue()->setString(pCert->subjectCommonName()); + return true; + } + if(szQuery.compare("issuerCountry")==0) + { + c->returnValue()->setString(pCert->issuerCountry()); + return true; + } + if(szQuery.compare("issuerStateOrProvince")==0) + { + c->returnValue()->setString(pCert->issuerStateOrProvince()); + return true; + } + if(szQuery.compare("issuerLocality")==0) + { + c->returnValue()->setString(pCert->issuerLocality()); + return true; + } + if(szQuery.compare("issuerOrganization")==0) + { + c->returnValue()->setString(pCert->issuerOrganization()); + return true; + } + if(szQuery.compare("issuerOrganizationalUnit")==0) + { + c->returnValue()->setString(pCert->issuerOrganizationalUnit()); + return true; + } + if(szQuery.compare("issuerCommonName")==0) + { + c->returnValue()->setString(pCert->issuerCommonName()); + return true; + } + if(szQuery.compare("publicKeyBits")==0) + { + c->returnValue()->setInteger(pCert->publicKeyBits()); + return true; + } + if(szQuery.compare("publicKeyType")==0) + { + c->returnValue()->setString(pCert->publicKeyType()); + return true; + } + if(szQuery.compare("serialNumber")==0) + { + c->returnValue()->setInteger(pCert->serialNumber()); + return true; + } + if(szQuery.compare("pemBase64")==0) + { + const char * szTmp=pCert->getX509Base64(); + QString szBase64(szTmp); + c->returnValue()->setString(szBase64); + delete szTmp; + return true; + } + if(szQuery.compare("version")==0) + { + c->returnValue()->setInteger(pCert->version()); + return true; + } + + c->warning(__tr2qs_ctx("Unable to get SSL informations: query not recognized","dcc")); + c->returnValue()->setString(""); + return true; + } + return true; +#endif +} + + +/* @doc: dcc @type: module @@ -2753,6 +2959,7 @@ static bool dcc_kvs_fnc_sessionList(KviKvsModuleFunctionCall * c) [fnc]$dcc.remoteFileSize[/fnc][br] [fnc]$dcc.ircContext[/fnc][br] [fnc]$dcc.session[/fnc][br] + [fnc]$dcc.getSSLInfo[/fnc][br] */ @@ -2798,6 +3005,7 @@ static bool dcc_module_init(KviModule * m) KVSM_REGISTER_FUNCTION(m,"ircContext",dcc_kvs_fnc_ircContext); KVSM_REGISTER_FUNCTION(m,"session",dcc_kvs_fnc_session); KVSM_REGISTER_FUNCTION(m,"sessionList",dcc_kvs_fnc_sessionList); + KVSM_REGISTER_FUNCTION(m,"getSSLInfo",dcc_kvs_fnc_getSSLInfo); return true; } diff --git a/src/modules/dcc/send.cpp b/src/modules/dcc/send.cpp index a90e14b62..20df1722d 100644 --- a/src/modules/dcc/send.cpp +++ b/src/modules/dcc/send.cpp @@ -2144,6 +2144,16 @@ bool KviDccFileTransfer::doResume(const char * filename,const char * port,quint6 return true; } +KviDccThread * KviDccFileTransfer::getSlaveThread() +{ + if(m_pDescriptor->bRecvFile) + { + return m_pSlaveRecvThread; + } else { + return m_pSlaveSendThread; + } +} + KviDccFileTransferBandwidthDialog::KviDccFileTransferBandwidthDialog(QWidget * pParent,KviDccFileTransfer * t) : QDialog(pParent) diff --git a/src/modules/dcc/send.h b/src/modules/dcc/send.h index 561aa9cf1..a05ea2d0b 100644 --- a/src/modules/dcc/send.h +++ b/src/modules/dcc/send.h @@ -229,6 +229,7 @@ public: int bandwidthLimit(); void setBandwidthLimit(int iVal); + virtual KviDccThread * getSlaveThread(); protected: void startConnection(); void listenOrConnect(); diff --git a/src/modules/dcc/thread.h b/src/modules/dcc/thread.h index 9b90003d5..83bb28bb4 100644 --- a/src/modules/dcc/thread.h +++ b/src/modules/dcc/thread.h @@ -74,6 +74,7 @@ public: #ifdef COMPILE_SSL_SUPPORT void raiseSSLError(); void setSSL(KviSSL * s); + KviSSL * getSSL() const { return m_pSSL; }; #endif }; diff --git a/src/modules/dcc/window.h b/src/modules/dcc/window.h index cfc5a1acc..2b51d8c3c 100644 --- a/src/modules/dcc/window.h +++ b/src/modules/dcc/window.h @@ -28,6 +28,7 @@ #include "marshal.h" #include "kvi_window.h" +class KviDccThread; class KviDccWindow : public KviWindow , public KviDccMarshalOutputContext { @@ -39,11 +40,11 @@ protected: KviDccDescriptor * m_pDescriptor; KviDccMarshal * m_pMarshal; public: - KviDccDescriptor * descriptor(){ return m_pDescriptor; }; - const KviDccMarshal * marshal(){ return m_pMarshal; }; - - virtual KviWindow * dccMarshalOutputWindow(); - virtual const char * dccMarshalOutputContextString(); + KviDccDescriptor * descriptor() { return m_pDescriptor; }; + const KviDccMarshal * marshal() { return m_pMarshal; }; + virtual KviDccThread * getSlaveThread() { return 0; }; + virtual KviWindow * dccMarshalOutputWindow(); + virtual const char * dccMarshalOutputContextString(); }; #endif //_WINDOW_H_ |
