summaryrefslogtreecommitdiffstats
path: root/src/otrlconfinterface.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/otrlconfinterface.cpp')
-rw-r--r--src/otrlconfinterface.cpp231
1 files changed, 231 insertions, 0 deletions
diff --git a/src/otrlconfinterface.cpp b/src/otrlconfinterface.cpp
new file mode 100644
index 0000000..5d95d06
--- /dev/null
+++ b/src/otrlconfinterface.cpp
@@ -0,0 +1,231 @@
+/***************************************************************************
+ * Copyright (C) 2007 by Michael Zanetti
+ *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+
+/**
+ * @author Michael Zanetti
+ */
+
+#include <qapplication.h>
+#include <qeventloop.h>
+
+#include <kopetechatsession.h>
+#include <kopeteaccount.h>
+
+#include <kdebug.h>
+#include <kmessagebox.h>
+#include <kstandarddirs.h>
+#include <klocale.h>
+#include <kanimwidget.h>
+
+
+#include "otrlconfinterface.h"
+#include "otrlchatinterface.h"
+#include "otrplugin.h"
+#include "privkeypopup.h"
+
+
+
+/*********************** Konstruktor/Destruktor **********************/
+
+OtrlConfInterface::OtrlConfInterface( QWidget *preferencesDialog ){
+
+ this->preferencesDialog = preferencesDialog;
+
+ OTRL_INIT;
+
+ userstate = OtrlChatInterface::self()->getUserstate();
+
+ kdDebug() << "OtrlConfInterface created" << endl;
+}
+
+OtrlConfInterface::~ OtrlConfInterface(){
+ otrl_userstate_free(userstate);
+}
+
+/*********************** Functions for kcm module ************************/
+
+QString OtrlConfInterface::getPrivFingerprint( QString accountId, QString protocol){
+// if (otrl_privkey_read(userstate, QString(KGlobal::dirs()->saveLocation("data", "kopete_otr/", true )) + "privkey" ) == 0){
+ char fingerprint[45];
+ if( otrl_privkey_fingerprint( userstate, fingerprint, accountId.latin1(), protocol.latin1()) != 0 ){
+ return fingerprint;
+ }
+// }
+ return i18n("No fingerprint present.");
+}
+
+
+bool OtrlConfInterface::hasPrivFingerprint( QString accountId, QString protocol ){
+ char fingerprint[45];
+ if( otrl_privkey_fingerprint( userstate, fingerprint, accountId.latin1(), protocol.latin1() ) != 0 ){
+ return true;
+ }
+ return false;
+}
+
+
+void OtrlConfInterface::generateNewPrivKey( QString accountId, QString protocol ){
+ PrivKeyPopup *popup = new PrivKeyPopup( preferencesDialog, i18n("Generating private key"), Qt::WStyle_Dialog | Qt::WStyle_StaysOnTop );
+ KAnimWidget *anim = new KAnimWidget( "kde", 72, popup->animFrame, "kopete" );
+ anim->start();
+ anim->show();
+
+ popup->setCloseLock( true );
+ popup->show();
+ KeyGenThread *keyGenThread = new KeyGenThread ( accountId, protocol );
+ keyGenThread->start();
+ while( !keyGenThread->wait(100) ){
+ qApp->eventLoop()->processEvents(QEventLoop::ExcludeUserInput | QEventLoop::ExcludeSocketNotifiers, 100);
+ }
+ popup->setCloseLock( false );
+ popup->close();
+}
+
+QValueList<QString[5]> OtrlConfInterface::readAllFingerprints(){
+ ConnContext *context;
+ Fingerprint *fingerprint;
+ QString entry[5];
+ char hash[45];
+ QValueList<QString[5]> list;
+
+ for( context = userstate->context_root; context != NULL; context = context->next ){
+ fingerprint = context->fingerprint_root.next;
+ while( fingerprint ){
+ entry[0] = context->username;
+
+ if( ( context->msgstate == OTRL_MSGSTATE_ENCRYPTED ) && ( context->active_fingerprint != fingerprint ) ){
+ entry[1] = i18n("Unused");
+ } else {
+ if (context && context->msgstate == OTRL_MSGSTATE_ENCRYPTED) {
+ if (context->active_fingerprint->trust && context->active_fingerprint->trust[0] != NULL) {
+ entry[1] = i18n("Private");
+ } else {
+ entry[1] = i18n("Unverified");
+ }
+ } else if (context && context->msgstate == OTRL_MSGSTATE_FINISHED) {
+ entry[1] = i18n("Finished");
+ } else {
+ entry[1] = i18n("Not Private");
+ }
+ }
+ entry[2] = ( fingerprint->trust && fingerprint->trust[0] ) ? i18n("Yes") : i18n("No") ;
+ otrl_privkey_hash_to_human( hash, fingerprint->fingerprint );
+ entry[3] = hash;
+ entry[4] = context->protocol;
+ list << entry;
+ fingerprint = fingerprint->next;
+ }
+ }
+ return list;
+}
+
+void OtrlConfInterface::verifyFingerprint( QString strFingerprint, bool trust ){
+ Fingerprint *fingerprint;
+
+ fingerprint = findFingerprint( strFingerprint );
+
+ if( fingerprint != 0 ){
+ if( trust ){
+ otrl_context_set_trust( fingerprint, "verified" );
+ } else {
+ otrl_context_set_trust( fingerprint, NULL );
+ }
+ kdDebug() << "Writing fingerprints" << endl;
+ otrl_privkey_write_fingerprints( userstate, QString(KGlobal::dirs()->saveLocation("data", "kopete_otr/", true )) + "fingerprints" );
+ } else {
+ kdDebug() << "could not find fingerprint" << endl;
+ }
+}
+
+bool OtrlConfInterface::isVerified( QString strFingerprint ){
+ Fingerprint *fingerprint;
+
+ fingerprint = findFingerprint( strFingerprint );
+
+ if( fingerprint->trust && fingerprint->trust[0] ){
+ kdDebug() << "found trust" << endl;
+ return true;
+ } else {
+ kdDebug() << "not trusted" << endl;
+ return false;
+ }
+}
+
+
+void OtrlConfInterface::forgetFingerprint( QString strFingerprint ){
+ Fingerprint *fingerprint;
+
+ fingerprint = findFingerprint( strFingerprint );
+ otrl_context_forget_fingerprint( fingerprint, 1 );
+ otrl_privkey_write_fingerprints( userstate, QString(KGlobal::dirs()->saveLocation("data", "kopete_otr/", true )) + "fingerprints" );
+}
+
+Fingerprint *OtrlConfInterface::findFingerprint( QString strFingerprint ){
+// const char *cFingerprint = ;
+// Fingerprint *fingerprintRoot = &userstate->context_root->fingerprint_root;
+ ConnContext *context;
+ Fingerprint *fingerprint;
+ Fingerprint *foundFingerprint = NULL;
+ char hash[45];
+
+ for( context = userstate->context_root; context != NULL; context = context->next ){
+ fingerprint = context->fingerprint_root.next;
+ while( fingerprint ){
+ otrl_privkey_hash_to_human(hash, fingerprint->fingerprint);
+ if( strcmp( hash, strFingerprint.latin1()) == 0 ){
+ foundFingerprint = fingerprint;
+ }
+ fingerprint = fingerprint->next;
+ }
+ }
+ return foundFingerprint;
+}
+
+bool OtrlConfInterface::isEncrypted( QString strFingerprint ){
+ Fingerprint *fingerprint;
+ Fingerprint *tmpFingerprint;
+ Fingerprint *foundFingerprint;
+ ConnContext *context;
+ ConnContext *foundContext = NULL;
+
+ context = userstate->context_root;
+
+ fingerprint = findFingerprint( strFingerprint );
+ for( context = userstate->context_root; context != NULL; context = context->next ){
+ tmpFingerprint = context->fingerprint_root.next;
+ while( tmpFingerprint ){
+ if( tmpFingerprint == fingerprint ){
+ kdDebug() << "Found context" << endl;
+ foundContext = context;
+ foundFingerprint = tmpFingerprint;
+ }
+ tmpFingerprint = tmpFingerprint->next;
+ }
+ }
+
+ if( foundContext && foundContext->msgstate != OTRL_MSGSTATE_ENCRYPTED ){
+ return false;
+ } else if( foundContext && foundFingerprint && foundContext->active_fingerprint == foundFingerprint ){
+ return true;
+ } else {
+ return false;
+ }
+}