diff options
Diffstat (limited to 'src/otrlconfinterface.cpp')
-rw-r--r-- | src/otrlconfinterface.cpp | 231 |
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; + } +} |