aboutsummaryrefslogtreecommitdiffstats
path: root/src/modules
diff options
context:
space:
mode:
authorGravatar Fabio Bas2010-08-06 12:57:55 +0000
committerGravatar Fabio Bas2010-08-06 12:57:55 +0000
commit3cec234bf423b81ef7caf8a2bcbe6dc96575be6b (patch)
treeb2bff1dac9b6205d9447d05a19a01d96602b2f38 /src/modules
parentimplemented support for dcc.send -s (ssl) (diff)
downloadKVIrc-3cec234bf423b81ef7caf8a2bcbe6dc96575be6b.tar.gz
KVIrc-3cec234bf423b81ef7caf8a2bcbe6dc96575be6b.tar.bz2
KVIrc-3cec234bf423b81ef7caf8a2bcbe6dc96575be6b.zip
implemented $dcc.getSSLInfo() as part of the request for ticket #866
git-svn-id: https://svn.kvirc.de/svn/trunk/kvirc@4793 17fca916-40b9-46aa-a4ea-0a15b648b75c
Diffstat (limited to 'src/modules')
-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
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_