aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/kvilib/net/kvi_ssl.cpp13
-rw-r--r--src/kvilib/net/kvi_ssl.h1
-rw-r--r--src/modules/dcc/chat.h1
-rw-r--r--src/modules/dcc/descriptor.h3
-rw-r--r--src/modules/dcc/libkvidcc.cpp208
-rw-r--r--src/modules/dcc/send.cpp10
-rw-r--r--src/modules/dcc/send.h1
-rw-r--r--src/modules/dcc/thread.h1
-rw-r--r--src/modules/dcc/window.h11
9 files changed, 244 insertions, 5 deletions
diff --git a/src/kvilib/net/kvi_ssl.cpp b/src/kvilib/net/kvi_ssl.cpp
index 3f98c898c..e52e262a1 100644
--- a/src/kvilib/net/kvi_ssl.cpp
+++ b/src/kvilib/net/kvi_ssl.cpp
@@ -540,6 +540,19 @@ KviSSLCertificate::~KviSSLCertificate()
delete m_pIssuer;
}
+const char * KviSSLCertificate::getX509Base64()
+{
+ BUF_MEM *bptr;
+ BIO* mem = BIO_new(BIO_s_mem());
+ PEM_write_bio_X509(mem, m_pX509);
+ int iLen = BIO_get_mem_data(mem, &bptr);
+ char * szTmp = (char *) kvi_malloc(iLen+1);
+ kvi_fastmove(szTmp, bptr, iLen);
+ *(szTmp+iLen) = '\0';
+ BIO_free_all(mem);
+ return szTmp;
+}
+
#ifdef COMPILE_ON_WINDOWS
// On windows we need to override new and delete operators
diff --git a/src/kvilib/net/kvi_ssl.h b/src/kvilib/net/kvi_ssl.h
index c8fd4e5c5..8f63860ae 100644
--- a/src/kvilib/net/kvi_ssl.h
+++ b/src/kvilib/net/kvi_ssl.h
@@ -62,6 +62,7 @@ private:
// void getPKeyType(int type,KviStr &buffer);
public:
void setX509(X509 * x509);
+ const char * getX509Base64(); //not owned, you'll need to delete this
const char * signatureType(){ return m_szSignatureType.ptr(); };
const char * signatureContents(){ return m_szSignatureContents.ptr(); };
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_