You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kopete-otr/src/otrlconfinterface.cpp

232 lines
7.4 KiB

/***************************************************************************
* 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;
}
}