aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGravatar Fabio Bas2010-08-13 09:38:23 +0000
committerGravatar Fabio Bas2010-08-13 09:38:23 +0000
commit12d2cb226c2d2ca319158192e8e1942482d19067 (patch)
tree26136ca95d18cff1ef5f24411e4e8d4996901a52 /src
parentDecrease the maximum OnJoinRequestDelay and so it's a bit harder for braindam... (diff)
downloadKVIrc-12d2cb226c2d2ca319158192e8e1942482d19067.tar.gz
KVIrc-12d2cb226c2d2ca319158192e8e1942482d19067.tar.bz2
KVIrc-12d2cb226c2d2ca319158192e8e1942482d19067.zip
implemented $certificate() to get info from local cert (ticket #866)
git-svn-id: https://svn.kvirc.de/svn/trunk/kvirc@4862 17fca916-40b9-46aa-a4ea-0a15b648b75c
Diffstat (limited to 'src')
-rw-r--r--src/kvirc/kvs/kvi_kvs_corefunctions.cpp1
-rw-r--r--src/kvirc/kvs/kvi_kvs_corefunctions.h1
-rw-r--r--src/kvirc/kvs/kvi_kvs_corefunctions_af.cpp222
-rw-r--r--src/modules/dcc/libkvidcc.cpp6
-rw-r--r--src/modules/str/libkvistr.cpp4
5 files changed, 233 insertions, 1 deletions
diff --git a/src/kvirc/kvs/kvi_kvs_corefunctions.cpp b/src/kvirc/kvs/kvi_kvs_corefunctions.cpp
index 5ce814210..a90131690 100644
--- a/src/kvirc/kvs/kvi_kvs_corefunctions.cpp
+++ b/src/kvirc/kvs/kvi_kvs_corefunctions.cpp
@@ -53,6 +53,7 @@ namespace KviKvsCoreFunctions
_REGFNC("base64ToAscii",base64ToAscii)
_REGFNC("bool",boolean)
_REGFNC("boolean",boolean)
+ _REGFNC("certificate",certificate)
_REGFNC("channel",channel)
_REGFNC("char",charCKEYWORDWORKAROUND)
_REGFNC("classDefined",classDefined)
diff --git a/src/kvirc/kvs/kvi_kvs_corefunctions.h b/src/kvirc/kvs/kvi_kvs_corefunctions.h
index 2e1e1ebe7..44e6e7ab3 100644
--- a/src/kvirc/kvs/kvi_kvs_corefunctions.h
+++ b/src/kvirc/kvs/kvi_kvs_corefunctions.h
@@ -59,6 +59,7 @@ namespace KviKvsCoreFunctions
KVSCF(b);
KVSCF(base64ToAscii);
KVSCF(boolean);
+ KVSCF(certificate);
KVSCF(channel);
KVSCF(charCKEYWORDWORKAROUND);
KVSCF(classDefined);
diff --git a/src/kvirc/kvs/kvi_kvs_corefunctions_af.cpp b/src/kvirc/kvs/kvi_kvs_corefunctions_af.cpp
index ab6c97542..fd53a61fd 100644
--- a/src/kvirc/kvs/kvi_kvs_corefunctions_af.cpp
+++ b/src/kvirc/kvs/kvi_kvs_corefunctions_af.cpp
@@ -40,6 +40,8 @@
#include "kvi_frame.h"
#include "kvi_statusbar.h"
#include "kvi_userinput.h"
+#include "kvi_ssl.h"
+#include "kvi_options.h"
// date includes
#include <QDateTime>
@@ -428,6 +430,226 @@ namespace KviKvsCoreFunctions
/////////////////////////////////////////////////////////////////////////////////////////////
/*
+ @doc: certificate
+ @type:
+ function
+ @title:
+ $certificate
+ @short:
+ Returns informations about the local certificate
+ @syntax:
+ <string> $certificate(<query:string>)
+ @description:
+ Returns the requested information about local certificate.[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]
+ [li]fingerprintIsValid[/li]
+ [li]fingerprintHashId[/li]
+ [li]fingerprintHashStr[/li]
+ [li]fingerprintContents[/li]
+ [/ul]
+ @seealso:
+ [fnc]$str.evpSign[/fnc]
+ [fnc]$str.evpVerify[/fnc]
+ [fnc]$dcc.getSSLCertInfo[/fnc]
+ */
+
+ KVSCF(certificate)
+ {
+ QString szQuery;
+ KVSCF_PARAMETERS_BEGIN
+ KVSCF_PARAMETER("query",KVS_PT_STRING,0,szQuery)
+ KVSCF_PARAMETERS_END
+
+#ifndef COMPILE_SSL_SUPPORT
+ KVSCF_pContext->warning(__tr2qs_ctx("This executable was built without SSL support","dcc"));
+ return true;
+#else
+
+ X509 *cert = 0;
+
+ if(!KVI_OPTION_BOOL(KviOption_boolUseSSLCertificate))
+ {
+ KVSCF_pContext->warning(__tr2qs("No public key certificate defined in KVIrc options."));
+ KVSCF_pRetBuffer->setString("");
+ return true;
+ }
+
+ FILE * f = fopen(KVI_OPTION_STRING(KviOption_stringSSLCertificatePath).toUtf8().data(),"r");
+ if(!f)
+ {
+ KVSCF_pContext->warning(__tr2qs("File I/O error while trying to use the public key file %s"),KVI_OPTION_STRING(KviOption_stringSSLCertificatePath).toUtf8().data());
+ KVSCF_pRetBuffer->setString("");
+ return true;
+ }
+
+ QString szPass = KVI_OPTION_STRING(KviOption_stringSSLCertificatePass).toUtf8();
+ PEM_read_X509(f, &cert, NULL, szPass.data());
+
+ fclose(f);
+
+ if(!cert)
+ {
+ KVSCF_pContext->warning(__tr2qs("Can't load certificate from public key file %s"),KVI_OPTION_STRING(KviOption_stringSSLCertificatePath).toUtf8().data());
+ KVSCF_pRetBuffer->setString("");
+ return true;
+ }
+
+ // KviSSLCertificate takes ownership of the X509 structure, no need to free it
+ KviSSLCertificate * pCert = new KviSSLCertificate(cert);
+
+ if(!pCert)
+ {
+ KVSCF_pContext->warning(__tr2qs_ctx("Error retrieving informations from the local certificate","dcc"));
+ KVSCF_pRetBuffer->setString("");
+ return true;
+ }
+
+ if(szQuery.compare("signatureType")==0)
+ {
+ KVSCF_pRetBuffer->setString(pCert->signatureType());
+ return true;
+ }
+ if(szQuery.compare("signatureContents")==0)
+ {
+ KVSCF_pRetBuffer->setString(pCert->signatureContents());
+ return true;
+ }
+ if(szQuery.compare("subjectCountry")==0)
+ {
+ KVSCF_pRetBuffer->setString(pCert->subjectCountry());
+ return true;
+ }
+ if(szQuery.compare("subjectStateOrProvince")==0)
+ {
+ KVSCF_pRetBuffer->setString(pCert->subjectStateOrProvince());
+ return true;
+ }
+ if(szQuery.compare("subjectLocality")==0)
+ {
+ KVSCF_pRetBuffer->setString(pCert->subjectLocality());
+ return true;
+ }
+ if(szQuery.compare("subjectOrganization")==0)
+ {
+ KVSCF_pRetBuffer->setString(pCert->subjectOrganization());
+ return true;
+ }
+ if(szQuery.compare("subjectOrganizationalUnit")==0)
+ {
+ KVSCF_pRetBuffer->setString(pCert->subjectOrganizationalUnit());
+ return true;
+ }
+ if(szQuery.compare("subjectCommonName")==0)
+ {
+ KVSCF_pRetBuffer->setString(pCert->subjectCommonName());
+ return true;
+ }
+ if(szQuery.compare("issuerCountry")==0)
+ {
+ KVSCF_pRetBuffer->setString(pCert->issuerCountry());
+ return true;
+ }
+ if(szQuery.compare("issuerStateOrProvince")==0)
+ {
+ KVSCF_pRetBuffer->setString(pCert->issuerStateOrProvince());
+ return true;
+ }
+ if(szQuery.compare("issuerLocality")==0)
+ {
+ KVSCF_pRetBuffer->setString(pCert->issuerLocality());
+ return true;
+ }
+ if(szQuery.compare("issuerOrganization")==0)
+ {
+ KVSCF_pRetBuffer->setString(pCert->issuerOrganization());
+ return true;
+ }
+ if(szQuery.compare("issuerOrganizationalUnit")==0)
+ {
+ KVSCF_pRetBuffer->setString(pCert->issuerOrganizationalUnit());
+ return true;
+ }
+ if(szQuery.compare("issuerCommonName")==0)
+ {
+ KVSCF_pRetBuffer->setString(pCert->issuerCommonName());
+ return true;
+ }
+ if(szQuery.compare("publicKeyBits")==0)
+ {
+ KVSCF_pRetBuffer->setInteger(pCert->publicKeyBits());
+ return true;
+ }
+ if(szQuery.compare("publicKeyType")==0)
+ {
+ KVSCF_pRetBuffer->setString(pCert->publicKeyType());
+ return true;
+ }
+ if(szQuery.compare("serialNumber")==0)
+ {
+ KVSCF_pRetBuffer->setInteger(pCert->serialNumber());
+ return true;
+ }
+ if(szQuery.compare("pemBase64")==0)
+ {
+ const char * szTmp=pCert->getX509Base64();
+ QString szBase64(szTmp);
+ KVSCF_pRetBuffer->setString(szBase64);
+ delete szTmp;
+ return true;
+ }
+ if(szQuery.compare("version")==0)
+ {
+ KVSCF_pRetBuffer->setInteger(pCert->version());
+ return true;
+ }
+ if(szQuery.compare("fingerprintIsValid")==0)
+ {
+ KVSCF_pRetBuffer->setBoolean(pCert->fingerprintIsValid());
+ return true;
+ }
+ if(szQuery.compare("fingerprintHashId")==0)
+ {
+ KVSCF_pRetBuffer->setInteger(pCert->fingerprintHashId());
+ return true;
+ }
+ if(szQuery.compare("fingerprintHashStr")==0)
+ {
+ KVSCF_pRetBuffer->setString(pCert->fingerprintHashStr());
+ return true;
+ }
+ if(szQuery.compare("fingerprintContents")==0)
+ {
+ KVSCF_pRetBuffer->setString(pCert->fingerprintContents());
+ return true;
+ }
+
+ KVSCF_pContext->warning(__tr2qs_ctx("Unable to get certificate informations: query not recognized","dcc"));
+ KVSCF_pRetBuffer->setString("");
+ return true;
+#endif
+ }
+
+ /*
@doc: channel
@type:
function
diff --git a/src/modules/dcc/libkvidcc.cpp b/src/modules/dcc/libkvidcc.cpp
index 4ea2dc831..2d798a3a9 100644
--- a/src/modules/dcc/libkvidcc.cpp
+++ b/src/modules/dcc/libkvidcc.cpp
@@ -2742,7 +2742,11 @@ static bool dcc_kvs_fnc_sessionList(KviKvsModuleFunctionCall * c)
[li]fingerprintHashStr[/li]
[li]fingerprintContents[/li]
[/ul]
- See the [module:dcc]dcc module[/module] documentation for more information.[br]
+ @seealso:
+ [fnc]$certificate[/fnc]
+ [fnc]$str.evpSign[/fnc]
+ [fnc]$str.evpVerify[/fnc]
+ [module:dcc]dcc module[/module]
*/
static bool dcc_kvs_fnc_getSSLCertInfo(KviKvsModuleFunctionCall * c)
diff --git a/src/modules/str/libkvistr.cpp b/src/modules/str/libkvistr.cpp
index 2f62c243d..84eaf7a0e 100644
--- a/src/modules/str/libkvistr.cpp
+++ b/src/modules/str/libkvistr.cpp
@@ -2212,6 +2212,8 @@ static bool str_kvs_fnc_printf(KviKvsModuleFunctionCall * c)
[/example]
@seealso:
[fnc]$str.evpVerify[/fnc]
+ [fnc]$certificate[/fnc]
+ [fnc]$dcc.getSSLCertInfo[/fnc]
*/
static bool str_kvs_fnc_evpSign(KviKvsModuleFunctionCall * c)
@@ -2341,6 +2343,8 @@ static bool str_kvs_fnc_evpSign(KviKvsModuleFunctionCall * c)
[/example]
@seealso:
[fnc]$str.evpSign[/fnc]
+ [fnc]$certificate[/fnc]
+ [fnc]$dcc.getSSLCertInfo[/fnc]
*/
static bool str_kvs_fnc_evpVerify(KviKvsModuleFunctionCall * c)