Add kopete-otr plugin to kopete.

Signed-off-by: gregory guy <gregory-tde@laposte.net>
feat/add_kopete-otr_plugin
gregory guy 3 years ago
parent 7a3a7896b3
commit d0e4d47cae
No known key found for this signature in database
GPG Key ID: 2CC84A1CC6823AF8

@ -108,6 +108,7 @@ option( BUILD_KOPETE_PLUGIN_NETMEETING "Build netmeeting kopete plugin" ${BUILD_
option( BUILD_KOPETE_PLUGIN_ADDBOOKMARKS "Build addbookmarks kopete plugin" ${BUILD_KOPETE_PLUGIN_ALL} )
option( BUILD_KOPETE_PLUGIN_STATISTICS "Build statistics kopete plugin" ${BUILD_KOPETE_PLUGIN_ALL} )
option( BUILD_KOPETE_PLUGIN_SMPPPDCS "Build smpppdcs kopete plugin" ${BUILD_KOPETE_PLUGIN_ALL} )
option( BUILD_KOPETE_PLUGIN_OTR "Build otr kopete plugin" ${BUILD_KOPETE_PLUGIN_ALL} )
##### user requested modules ####################

@ -22,3 +22,8 @@ add_subdirectory( plugins )
add_subdirectory( icons )
add_subdirectory( sounds )
add_subdirectory( styles )
##### write configure files #####################
configure_file( config-kopete.h.cmake config-kopete.h @ONLY )

@ -64,3 +64,18 @@ endif( )
### Check for tm_gmtoff in tm struct
check_struct_has_member( "struct tm" tm_gmtoff time.h HAVE_TM_GMTOFF )
#### check for libotr
if( BUILD_KOPETE_PLUGIN_OTR )
pkg_search_module( LIBOTR libotr )
if( LIBOTR_FOUND )
if( NOT LIBOTR_VERSION VERSION_LESS 4.0.0 )
set( HAVE_LIBOTR_0400 1 )
endif()
else()
tde_message_fatal( "Libotr is required but was not found on your system" )
endif()
endif( BUILD_KOPETE_PLUGIN_OTR )

@ -0,0 +1,2 @@
/* Defined if libotr >= 4.0.0 */
#cmakedefine HAVE_LIBOTR_0400 1

@ -26,3 +26,4 @@ tde_conditional_add_subdirectory( BUILD_KOPETE_PLUGIN_NETMEETING netmeeting )
tde_conditional_add_subdirectory( BUILD_KOPETE_PLUGIN_ADDBOOKMARKS addbookmarks )
tde_conditional_add_subdirectory( BUILD_KOPETE_PLUGIN_STATISTICS statistics )
tde_conditional_add_subdirectory( BUILD_KOPETE_PLUGIN_SMPPPDCS smpppdcs )
tde_conditional_add_subdirectory( BUILD_KOPETE_PLUGIN_OTR otr )

@ -0,0 +1,3 @@
##### create translation templates ##############
tde_l10n_create_template( "messages/kopete_otr" )

@ -0,0 +1,125 @@
add_subdirectory( pics )
include_directories(
${CMAKE_BINARY_DIR}
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_BINARY_DIR}/src
${CMAKE_CURRENT_SOURCE_DIR}
${TDE_INCLUDE_DIR}
${TQT_INCLUDE_DIRS}
${LIBOTR_INCLUDE_DIRS}
${CMAKE_BINARY_DIR}/kopete
${CMAKE_SOURCE_DIR}/kopete/libkopete
${CMAKE_SOURCE_DIR}/kopete/libkopete/ui
)
link_directories(
${TQT_LIBRARY_DIRS}
${TDE_LIB_DIR}
)
##### kotr_kcfgc (static)
tde_add_library( kotr_kcfgc STATIC_PIC AUTOMOC
SOURCES
kopete_otr.kcfgc
)
##### kotr (shared)
tde_add_library( kotr SHARED AUTOMOC
SOURCES
otrplugin.cpp
otrguiclient.cpp
otrlchatinterface.cpp
otrlconfinterface.cpp
privkeypopup.cpp
privkeypopupui.ui
smppopup.cpp
smppopupui.ui
verifypopup.cpp
verifypopupui.ui
LINK
kotr_kcfgc-static
tdecore-shared
tdeui-shared
tdeio-shared
kopete-shared
${LIBOTR_LIBRARIES}
VERSION 0.0.0
DESTINATION ${LIB_INSTALL_DIR}
)
##### kcm_kopete_otr (kpart)
tde_add_kpart( kcm_kopete_otr AUTOMOC
SOURCES
otrpreferences.cpp
otrprefs.ui
LINK
kotr_kcfgc-static
kotr-shared
tdecore-shared
tdeui-shared
tdehtml-shared
kopete-shared
${LIBOTR_LIBRARIES}
DESTINATION ${PLUGIN_INSTALL_DIR}
)
##### kopete_otr (kpart)
tde_add_kpart( kopete_otr AUTOMOC
SOURCES
otrplugin-factory.cpp
LINK
kotr-shared
tdecore-shared
tdeui-shared
tdehtml-shared
kopete-shared
${LIBOTR_LIBRARIES}
DESTINATION ${PLUGIN_INSTALL_DIR}
)
##### other data
install(
FILES otrchatui.rc otrui.rc
DESTINATION ${DATA_INSTALL_DIR}/kopete_otr
)
install(
FILES kopete_otr.kcfg
DESTINATION ${KCFG_INSTALL_DIR}
)
#### desktop files
tde_create_translated_desktop(
SOURCE kopete_otr.desktop
DESTINATION ${SERVICES_INSTALL_DIR}
PO_DIR kopete_otr-desktops
)
tde_create_translated_desktop(
SOURCE kopete_otr_config.desktop
DESTINATION ${SERVICES_INSTALL_DIR}/tdeconfiguredialog
PO_DIR kopete_otr-desktops
)

@ -0,0 +1,20 @@
[Desktop Entry]
Encoding=UTF-8
Type=Service
X-Kopete-Version=1000900
Icon=kopete_otr
X-TDE-ServiceTypes=Kopete/Plugin
X-TDE-Library=kopete_otr
X-TDE-PluginInfo-Author=Michael Zanetti
X-TDE-PluginInfo-Email=michael_zanetti@gmx.net
X-TDE-PluginInfo-Name=kopete_otr
X-TDE-PluginInfo-Version=0.7
X-TDE-PluginInfo-Website=http://kopete-otr.follefuder.org
X-TDE-PluginInfo-Category=Plugins
X-TDE-PluginInfo-Depends=
X-TDE-PluginInfo-License=GPL
X-TDE-PluginInfo-EnabledByDefault=false
Comment=Encrypt chat sessions with Off-The-Record encryption
Comment[de]=Verschlüsselt Chat-Sitzungen mit Off-The-Record Verschlüsselung
Name=OTR
Name[de]=OTR

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE kcfg SYSTEM "http://www.kde.org/standards/kcfg/1.0/kcfg.dtd">
<kcfg>
<kcfgfile name="kopete_otr"/>
<group name="Policy">
<entry name="rbAlways" type="Bool">
<label>Always encrypt outgoing messages</label>
<default>false</default>
</entry>
<entry name="rbOpportunistic" type="Bool">
<label>Automatically encrypt mesages if the other side supports OTR</label>
<default>true</default>
</entry>
<entry name="rbManual" type="Bool">
<label>Encrypt mesages if the other side requests an OTR connection</label>
<default>false</default>
</entry>
<entry name="rbNever" type="Bool">
<label>Never encrypt outgoing messages</label>
<default>false</default>
</entry>
</group>
</kcfg>

@ -0,0 +1,7 @@
File=kopete_otr.kcfg
ClassName=KopeteOtrKcfg
Singleton=true
Mutators=true
MemberVariables=private
ItemAccessors=true
GlobalEnums=true

@ -0,0 +1,16 @@
[Desktop Entry]
Encoding=UTF-8
Type=Service
Icon=kopete_otr
X-TDE-ServiceTypes=TDECModule
X-TDE-ModuleType=Library
X-TDE-Library=kopete_otr
X-TDE-FactoryName=OTRPreferencesFactory
X-TDE-ParentApp=kopete_otr
X-TDE-ParentComponents=kopete_otr
Comment=Encrypt chat sessions with Off-The-Record encryption
Comment[de]=Verschlüsselt Chat-Sitzungen mit Off-The-Record Verschlüsselung
Name=OTR
Name[de]=OTR

@ -0,0 +1,19 @@
<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
<kpartgui name="kopete_otr" version="1">
<MenuBar>
<Menu name="tools"><text>&amp;Tools</text>
<Menu name="otr_menu"><text>OTR Encryption</text>
<Action name="enable_otr" />
<Action name="disable_otr" />
<Action name="verify_fingerprint"/>
</Menu>
</Menu>
</MenuBar>
<ToolBar name="mainToolBar">
<text>OTR Encryption</text>
<Separator name="separator_0" />
<Action name="otr_settings" />
<Separator name="separator_0" />
</ToolBar>
</kpartgui>

@ -0,0 +1,129 @@
/***************************************************************************
* 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. *
***************************************************************************/
#if defined(HAVE_CONFIG_H)
#include "config.h"
#endif
#include <tdeaction.h>
#include <tdelocale.h>
#include <tdeactionclasses.h>
#include <kopetechatsession.h>
#include <kopeteview.h>
#include <kopetemessage.h>
#include <kdebug.h>
#include <kstandarddirs.h>
#include <tdemessagebox.h>
#include "otrguiclient.h"
#include "otrplugin.h"
/**
* @author Frank Scheffold
* @author Michael Zanetti
*/
OtrGUIClient::OtrGUIClient( Kopete::ChatSession *parent, const char *name )
: TQObject( parent, name ), KXMLGUIClient( parent )
{
setInstance( OTRPlugin::plugin()->instance() );
connect( OTRPlugin::plugin(),
TQT_SIGNAL( destroyed( TQObject * ) ), this,
TQT_SLOT( deleteLater() )
);
connect(this, TQT_SIGNAL( signalOtrChatsession(Kopete::ChatSession*, bool) ), OTRPlugin::plugin(), TQT_SLOT(slotEnableOtr(Kopete::ChatSession*, bool)));
connect( OTRPlugin::plugin(), TQT_SIGNAL( goneSecure( Kopete::ChatSession *, int ) ),
this, TQT_SLOT( encryptionEnabled( Kopete::ChatSession *, int ) ) );
connect( this, TQT_SIGNAL( signalVerifyFingerprint( Kopete::ChatSession * ) ), OTRPlugin::plugin(), TQT_SLOT(slotVerifyFingerprint( Kopete::ChatSession * )) );
m_manager = parent;
otrActionMenu = new TDEActionMenu(i18n("OTR Settings"),"otr_disabled", actionCollection(), "otr_settings");
otrActionMenu->setDelayed( false );
actionEnableOtr = new TDEAction(i18n( "Start OTR session" ), "otr_private", 0,this,TQT_SLOT(slotEnableOtr()),actionCollection(), "enable_otr");
actionDisableOtr = new TDEAction(i18n("End OTR session"), "otr_disabled",0, this,TQT_SLOT(slotDisableOtr()), actionCollection(), "disable_otr");
actionVerifyFingerprint = new TDEAction(i18n("Authenticate Contact"), "signature",0, this,TQT_SLOT(slotVerifyFingerprint()), actionCollection(), "verify_fingerprint");
otrActionMenu->insert(actionEnableOtr);
otrActionMenu->insert(actionDisableOtr);
otrActionMenu->insert(actionVerifyFingerprint);
setXMLFile("otrchatui.rc");
encryptionEnabled( parent, OtrlChatInterface::self()->privState(parent) );
}
OtrGUIClient::~OtrGUIClient()
{
}
void OtrGUIClient::slotEnableOtr()
{
emit signalOtrChatsession( m_manager, true );
}
void OtrGUIClient::slotDisableOtr()
{
emit signalOtrChatsession( m_manager, false );
}
void OtrGUIClient::slotVerifyFingerprint(){
emit signalVerifyFingerprint( m_manager );
}
void OtrGUIClient::encryptionEnabled(Kopete::ChatSession *session, int state){
if( session == m_manager ){
switch(state){
case 0:
otrActionMenu->setIcon("otr_disabled");
actionEnableOtr->setText( i18n("Start OTR session") );
actionDisableOtr->setEnabled(false);
actionVerifyFingerprint->setEnabled(false);
break;
case 1:
otrActionMenu->setIcon("otr_unverified");
actionEnableOtr->setText( i18n("Refresh OTR session") );
actionDisableOtr->setEnabled(true);
actionVerifyFingerprint->setEnabled(true);
break;
case 2:
otrActionMenu->setIcon("otr_private");
actionEnableOtr->setText( i18n("Refresh OTR session") );
actionDisableOtr->setEnabled(true);
actionVerifyFingerprint->setEnabled(true);
break;
case 3:
otrActionMenu->setIcon("otr_finished");
actionEnableOtr->setText( i18n("Start OTR session") );
actionDisableOtr->setEnabled(true);
actionVerifyFingerprint->setEnabled(false);
break;
}
}
}
#include "otrguiclient.moc"

@ -0,0 +1,78 @@
/***************************************************************************
* 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. *
***************************************************************************/
#ifndef OTRGUICLIENT_H
#define OTRGUICLIENT_H
#include <tqobject.h>
#include <kxmlguiclient.h>
//#include <tdeio/job.h>
#include <tdeglobal.h>
#include <kstandarddirs.h>
#include <kiconloader.h>
#include <kopetemessage.h>
#include <kopeteplugin.h>
class TDEActionMenu;
class TDEAction;
namespace Kopete { class ChatSession; }
/**
* @author Frank Scheffold
*/
class OtrGUIClient : public TQObject, public KXMLGUIClient
{
Q_OBJECT
public:
OtrGUIClient( Kopete::ChatSession *parent, const char *name=0L );
~OtrGUIClient();
private:
Kopete::ChatSession *m_manager;
TDEActionMenu *otrActionMenu;
TDEAction *actionEnableOtr;
TDEAction *actionDisableOtr;
TDEAction *actionVerifyFingerprint;
private slots:
void slotEnableOtr();
void slotDisableOtr();
void encryptionEnabled( Kopete::ChatSession* session, int state );
void slotVerifyFingerprint();
signals:
void signalOtrChatsession( Kopete::ChatSession* session, bool enable );
void signalVerifyFingerprint( Kopete::ChatSession *session );
};
#endif

File diff suppressed because it is too large Load Diff

@ -0,0 +1,96 @@
/***************************************************************************
* 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. *
***************************************************************************/
#ifndef OTRLCHATINTERFACE_H
#define OTRLCHATINTERFACE_H
/**
* @author Michael Zanetti
*/
#include <tqstring.h>
#include <tqptrlist.h>
#include <tqvaluelist.h>
#include <tqthread.h>
#include <tqmutex.h>
#include <tqtimer.h>
#include <kopetechatsession.h>
extern "C" {
#include <libotr/privkey.h>
#include <libotr/proto.h>
#include <libotr/message.h>
#include <libotr/userstate.h>
}
class KDE_EXPORT OtrlChatInterface: public TQObject
{
Q_OBJECT
public:
~OtrlChatInterface();
static OtrlChatInterface *self();
int decryptMessage( TQString *msg, TQString accountId, TQString protocol, TQString contactId, Kopete::ChatSession *chatSession );
TQString encryptMessage( TQString msg, TQString accountId,
TQString protocol, TQString contactId , Kopete::ChatSession *chatSession );
TQString getDefaultQuery( TQString accountId );
void disconnectSession( Kopete::ChatSession *chatSession );
void setPolicy( OtrlPolicy policy );
bool shouldDiscard( TQString message );
OtrlUserState getUserstate();
int privState( Kopete::ChatSession *session );
TQString formatContact(TQString contactId);
bool isVerified( Kopete::ChatSession *session );
void updateKeyfile( Kopete::Account *account );
void checkFilePermissions( TQString file );
// bool verifyQuestion( Kopete::ChatSession *session, TQString fingerprint );
TQString findActiveFingerprint( Kopete::ChatSession *session );
void verifyFingerprint( Kopete::ChatSession *session );
void abortSMP( ConnContext *context, Kopete::ChatSession *session );
void respondSMP( ConnContext *context, Kopete::ChatSession *session, TQString secret, bool initiate );
void respondSMPQ( ConnContext *context, Kopete::ChatSession *session, TQString question, TQString secret, bool initiate );
void setTrust( Kopete::ChatSession *session, bool trust );
void forwardSecrecyTimerStart(int interval);
void forwardSecrecyTimerStop();
private slots:
void otrlMessagePoll();
private:
OtrlChatInterface();
static OtrlChatInterface *mSelf;
Fingerprint *findFingerprint( TQString username );
TQTimer m_forwardSecrecyTimer;
};
class KeyGenThread : public TQThread {
private:
TQString accountname;
TQString protocol;
public:
KeyGenThread( TQString accountname, TQString protocol );
virtual void run();
};
#endif

@ -0,0 +1,236 @@
/***************************************************************************
* 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
*/
#if defined(HAVE_CONFIG_H)
#include "config.h"
#endif
#include <tqapplication.h>
#include <tqeventloop.h>
#include <kopetechatsession.h>
#include <kopeteaccount.h>
#include <kdebug.h>
#include <tdemessagebox.h>
#include <kstandarddirs.h>
#include <tdelocale.h>
#include <kanimwidget.h>
#include "otrlconfinterface.h"
#include "otrlchatinterface.h"
#include "otrplugin.h"
#include "privkeypopup.h"
/*********************** Konstruktor/Destruktor **********************/
OtrlConfInterface::OtrlConfInterface( TQWidget *preferencesDialog ){
this->preferencesDialog = preferencesDialog;
OTRL_INIT;
userstate = OtrlChatInterface::self()->getUserstate();
kdDebug() << "OtrlConfInterface created" << endl;
}
OtrlConfInterface::~ OtrlConfInterface(){
otrl_userstate_free(userstate);
}
/*********************** Functions for kcm module ************************/
TQString OtrlConfInterface::getPrivFingerprint( TQString accountId, TQString protocol){
// if (otrl_privkey_read(userstate, TQString(TDEGlobal::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( TQString accountId, TQString protocol ){
char fingerprint[45];
if( otrl_privkey_fingerprint( userstate, fingerprint, accountId.latin1(), protocol.latin1() ) != 0 ){
return true;
}
return false;
}
void OtrlConfInterface::generateNewPrivKey( TQString accountId, TQString protocol ){
PrivKeyPopup *popup = new PrivKeyPopup( preferencesDialog, i18n("Generating private key").utf8(), TQt::WType_Dialog | TQt::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) ){
tqApp->eventLoop()->processEvents(TQEventLoop::ExcludeUserInput | TQEventLoop::ExcludeSocketNotifiers, 100);
}
popup->setCloseLock( false );
popup->close();
}
TQValueList<TQStringList> OtrlConfInterface::readAllFingerprints(){
ConnContext *context;
Fingerprint *fingerprint;
TQStringList entry;
char hash[45];
TQValueList<TQStringList> list;
for( context = userstate->context_root; context != NULL; context = context->next ){
fingerprint = context->fingerprint_root.next;
while( fingerprint ){
entry.clear();
entry << context->username;
if( ( context->msgstate == OTRL_MSGSTATE_ENCRYPTED ) && ( context->active_fingerprint != fingerprint ) ){
entry << i18n("Unused");
} else {
if (context && context->msgstate == OTRL_MSGSTATE_ENCRYPTED) {
if (context->active_fingerprint->trust && context->active_fingerprint->trust[0] != 0) {
entry << i18n("Private");
} else {
entry << i18n("Unverified");
}
} else if (context && context->msgstate == OTRL_MSGSTATE_FINISHED) {
entry << i18n("Finished");
} else {
entry << i18n("Not Private");
}
}
entry << ((fingerprint->trust && fingerprint->trust[0]) ? i18n("Yes") : i18n("No"));
otrl_privkey_hash_to_human( hash, fingerprint->fingerprint );
entry << hash;
entry << context->protocol;
list << entry;
fingerprint = fingerprint->next;
}
}
return list;
}
void OtrlConfInterface::verifyFingerprint( TQString 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, TQString("%1%2").arg(TDEGlobal::dirs()->saveLocation("data", "kopete_otr/", true )).arg("fingerprints").local8Bit() );
} else {
kdDebug() << "could not find fingerprint" << endl;
}
}
bool OtrlConfInterface::isVerified( TQString strFingerprint ){
Fingerprint *fingerprint;
fingerprint = findFingerprint( strFingerprint.latin1() );
if( fingerprint->trust && fingerprint->trust[0] ){
kdDebug() << "found trust" << endl;
return true;
} else {
kdDebug() << "not trusted" << endl;
return false;
}
}
void OtrlConfInterface::forgetFingerprint( TQString strFingerprint ){
Fingerprint *fingerprint;
fingerprint = findFingerprint( strFingerprint );
otrl_context_forget_fingerprint( fingerprint, 1 );
otrl_privkey_write_fingerprints( userstate, TQString("%1%2").arg(TDEGlobal::dirs()->saveLocation("data", "kopete_otr/", true )).arg("fingerprints").local8Bit() );
}
Fingerprint *OtrlConfInterface::findFingerprint( TQString 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( TQString 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;
}
}

@ -0,0 +1,66 @@
/***************************************************************************
* 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. *
***************************************************************************/
#ifndef OTRLCONFINTERFACE_H
#define OTRLCONFINTERFACE_H
/**
* @author Michael Zanetti
*/
#include <tqstring.h>
#include <tqptrlist.h>
#include <tqvaluelist.h>
#include <tqthread.h>
#include <kopetechatsession.h>
extern "C" {
#include <libotr/privkey.h>
#include <libotr/proto.h>
#include <libotr/message.h>
#include <libotr/userstate.h>
#include <libotr/context.h>
}
class KDE_EXPORT OtrlConfInterface
{
public:
~OtrlConfInterface();
OtrlConfInterface( TQWidget *preferencesDialog );
TQString getPrivFingerprint( TQString accountId, TQString protocol );
void generateNewPrivKey( TQString accountId, TQString protocol );
TQValueList<TQStringList> readAllFingerprints();
bool hasPrivFingerprint( TQString accountId, TQString protocol);
void forgetFingerprint( TQString strFingerprint );
void verifyFingerprint( TQString strFingerprint, bool trust );
bool isVerified( TQString strFingerprint );
bool isEncrypted( TQString strFingerprint );
private:
OtrlUserState userstate;
TQWidget *preferencesDialog;
Fingerprint *findFingerprint( TQString strFingerprint );
};
#endif

@ -0,0 +1,58 @@
/***************************************************************************
* Copyright (C) 2021 by Slávek Banko *
* *
* *
* 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. *
***************************************************************************/
#if defined(HAVE_CONFIG_H)
#include "config.h"
#endif
#include <kgenericfactory.h>
#include <tdeaboutdata.h>
#include "otrplugin-factory.h"
#include "otrplugin.h"
// typedef KGenericFactory<OTRPlugin> OTRPluginFactory;
static const TDEAboutData aboutdata("kopete_otr", I18N_NOOP("OTR") , "0.7" );
K_EXPORT_COMPONENT_FACTORY( kopete_otr, OTRPluginFactory( &aboutdata ) )
TDEInstance *OTRPluginFactory::s_instance = 0;
OTRPluginFactory::OTRPluginFactory( const TDEAboutData *aboutdata )
{
s_instance = new TDEInstance( aboutdata );
}
OTRPluginFactory::~OTRPluginFactory()
{
delete s_instance;
}
KParts::Part *OTRPluginFactory::createPartObject( TQWidget * /*parentWidget*/,
const char * /*widgetName*/,
TQObject *parent,
const char *name,
const char * /*className*/,
const TQStringList & args )
{
return (KParts::Part*) new OTRPlugin( instance(), parent, name, args);
}
#include "otrplugin-factory.moc"

@ -0,0 +1,45 @@
/***************************************************************************
* Copyright (C) 2021 by Slávek Banko *
* *
* *
* 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. *
***************************************************************************/
#if !defined(OTRPLUGIN_FACTORY_H)
#define OTRPLUGIN_FACTORY_H
#include <tdeparts/factory.h>
class OTRPluginFactory : public KParts::Factory
{
Q_OBJECT
public:
OTRPluginFactory( const TDEAboutData* );
virtual ~OTRPluginFactory();
virtual KParts::Part *createPartObject( TQWidget *parentWidget, const char *widgetName,
TQObject *parent, const char *name,
const char *className, const TQStringList &args );
static TDEInstance *instance() { return s_instance; }
private:
static TDEInstance *s_instance;
};
#endif /* OTRPLUGIN_FACTORY_H */

@ -0,0 +1,339 @@
/***************************************************************************
* 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. *
***************************************************************************/
#if defined(HAVE_CONFIG_H)
#include "config.h"
#endif
#include <tqstylesheet.h>
#include <tqtimer.h>
#include <tqregexp.h>
#include <tqfile.h>
#include <tqcolor.h>
#include <kdebug.h>
#include <tdeaction.h>
#include <tdeactionclasses.h>
#include <tdepopupmenu.h>
#include <tdeconfig.h>
#include <kgenericfactory.h>
#include <tdeversion.h>
#include <kstandarddirs.h>
#include <tdemessagebox.h>
#include <kopetemetacontact.h>
#include <kopetecontactlist.h>
#include <kopetechatsessionmanager.h>
#include <kopetesimplemessagehandler.h>
#include <kopeteuiglobal.h>
#include <kopetecontact.h>
#include <kopetemessage.h>
#include <kopeteaccount.h>
#include <kopeteaccountmanager.h>
#include <kopetemessageevent.h>
#include <kopeteprotocol.h>
#include "otrplugin.h"
#include "otrguiclient.h"
#include "otrlchatinterface.h"
#include "kopete_otr.h"
/**
* @author Michael Zanetti
*/
OTRPlugin::OTRPlugin( TDEInstance *instance, TQObject *parent, const char *name, const TQStringList & /* args */ )
: Kopete::Plugin( instance, parent, name )
{
if( !pluginStatic_ )
pluginStatic_=this;
m_inboundHandler = new OtrMessageHandlerFactory(this);
connect( Kopete::ChatSessionManager::self(), TQT_SIGNAL( aboutToSend( Kopete::Message & ) ),
TQT_SLOT( slotOutgoingMessage( Kopete::Message & ) ) );
// connect( Kopete::ChatSessionManager::self(), TQT_SIGNAL( aboutToDisplay( Kopete::Message & ) ),
// this, TQT_SLOT( slotIncomingMessage( Kopete::Message & ) ) );
connect( Kopete::ChatSessionManager::self(), TQT_SIGNAL( chatSessionCreated( Kopete::ChatSession * ) ),
this, TQT_SLOT( slotNewChatSessionWindow( Kopete::ChatSession * ) ) );
TQObject::connect( this, TQT_SIGNAL( settingsChanged() ), this, TQT_SLOT( slotSettingsChanged() ) );
//initialize the otrlib and create the interface object
otrlChatInterface = OtrlChatInterface::self();
//update key files when an account is ready to use
if( TQFile::exists( TQString( TDEGlobal::dirs()->saveLocation( "data", "kopete_otr/", true ) ) + "privkey" ) &&
!TQFile::exists( TQString( TDEGlobal::dirs()->saveLocation( "data", "kopete_otr/", true ) ) + "privkeys" ) ){
kdDebug() << "Detected old format keyfile. Doing updates!" << endl;
kdDebug() << "Reading old keyfile..." << endl;
TQFile fpold( TQString(TDEGlobal::dirs()->saveLocation("data", "kopete_otr/", true )) + "privkey" );
TQString line;
TQString file;
if( fpold.open( IO_ReadWrite ) ){
while( fpold.readLine( line, 100 ) != -1){
file.append( line );
}
}
kdDebug() << "Writing new keyfile" << endl;
TQFile fpnew( TQString(TDEGlobal::dirs()->saveLocation("data", "kopete_otr/", true )) + "privkeys" );
fpnew.open( IO_ReadWrite );
fpnew.writeBlock( file.latin1(), file.length() );
fpnew.close();
kdDebug() << "Writing backup for old keyfile" << endl;
TQFile fpbup( TQString(TDEGlobal::dirs()->saveLocation("data", "kopete_otr/", true )) + "privkey.old" );
fpbup.open( IO_ReadWrite );
fpbup.writeBlock( file.latin1(), file.length() );
fpbup.close();
kdDebug() << "Deleting old keyfile" << endl;
fpold.remove();
kdDebug() << "Reading old fingerprintsfile..." << endl;
TQFile fpfingerprintsold( TQString(TDEGlobal::dirs()->saveLocation("data", "kopete_otr/", true )) + "fingerprints" );
line = "";
file = "";
if( fpfingerprintsold.open( IO_ReadWrite ) ){
while( fpfingerprintsold.readLine( line, 100 ) != -1){
file.append( line );
}
}
kdDebug() << "Writing backup for old fingerprintsfile" << endl;
TQFile fpfingerprintsbup( TQString(TDEGlobal::dirs()->saveLocation("data", "kopete_otr/", true )) + "fingerprints.old" );
fpfingerprintsbup.open( IO_ReadWrite );
fpfingerprintsbup.writeBlock( file.latin1(), file.length() );
fpfingerprintsbup.close();
kdDebug() << "Waiting for accounts to update keyfile format" << endl;
connect( Kopete::AccountManager::self(), TQT_SIGNAL( accountRegistered( Kopete::Account * ) ),
this, TQT_SLOT( accountReady( Kopete::Account * ) ) );
}
// Checking file Permissions
OtrlChatInterface::self()->checkFilePermissions( TQString( TDEGlobal::dirs()->saveLocation( "data", "kopete_otr/", true ) ) + "privkeys" );
OtrlChatInterface::self()->checkFilePermissions( TQString( TDEGlobal::dirs()->saveLocation( "data", "kopete_otr/", true ) ) + "fingerprints" );
// Check also file permissions for eventuallly old beckup files
OtrlChatInterface::self()->checkFilePermissions( TQString( TDEGlobal::dirs()->saveLocation( "data", "kopete_otr/", true ) ) + "privkey.old" );
OtrlChatInterface::self()->checkFilePermissions( TQString( TDEGlobal::dirs()->saveLocation( "data", "kopete_otr/", true ) ) + "fingerprints.old" );
//setting the policy
slotSettingsChanged();
//adding menu to contaclists menubar and contacts popup menu
TQStringList policies;
policies << i18n("&Default") << i18n("Al&ways") << i18n("&Opportunistic") << i18n("&Manual") << i18n("Ne&ver");
otrPolicyMenu = new TDESelectAction( i18n( "&OTR Policy" ), TQString::fromLatin1("kopete_otr"), 0, actionCollection(), "otr_policy" );
otrPolicyMenu->setItems( policies );
otrPolicyMenu->popupMenu()->insertSeparator( 1 );
otrPolicyMenu->setEnabled( false );
connect( otrPolicyMenu, TQT_SIGNAL( activated() ), this, TQT_SLOT( slotSetPolicy() ) );
connect( Kopete::ContactList::self(), TQT_SIGNAL( metaContactSelected( bool ) ), this, TQT_SLOT( slotSelectionChanged( bool ) ) );
setXMLFile( "otrui.rc" );
//Add GUI action to all already existing kmm
// (if the plugin is launched when kopete already runing)
TQValueList<Kopete::ChatSession*> sessions =
Kopete::ChatSessionManager::self()->sessions();
TQValueListIterator<Kopete::ChatSession*> it;
for (it= sessions.begin(); it!=sessions.end() ; ++it){
slotNewChatSessionWindow( *it );
}
}
OTRPlugin::~OTRPlugin()
{
delete m_inboundHandler;
pluginStatic_ = 0L;
kdDebug() << "Exiting plugin" << endl;
}
OTRPlugin* OTRPlugin::plugin()
{
return pluginStatic_ ;
}
OTRPlugin* OTRPlugin::pluginStatic_ = 0L;
void OTRPlugin::slotNewChatSessionWindow( Kopete::ChatSession *KMM )
{
//Check if there is another user in the session.
//If not it could be a Jabber-MUC
//If there are more then one members it is a MUC
// Also don't add the Button on an IRC window!
if( KMM->members().count() == 1 && (KMM->protocol()) && ( KMM->protocol()->pluginId() != "IRCProtocol" ) ){
new OtrGUIClient( KMM );
}
}
void OTRPlugin::slotOutgoingMessage( Kopete::Message& msg )
{
if( msg.direction() == Kopete::Message::Outbound ){
TQString plainBody = msg.plainBody();
TQString accountId = msg.manager()->account()->accountId();
Kopete::Contact *contact = msg.to().first();
TQString encBody = otrlChatInterface->encryptMessage( plainBody, accountId, msg.manager()->account()->protocol()->displayName(), contact->contactId(), msg.manager() );
msg.setBody( encBody, Kopete::Message::Crypted );
if( !msg.plainBody().isEmpty() ){
messageCache.insert( encBody, plainBody );
}
}
}
void OTRPlugin::slotEnableOtr( Kopete::ChatSession *session, bool enable ){
if( enable ){
TQString policy = session->members().getFirst()->metaContact()->pluginData( OTRPlugin::plugin(), "otr_policy" );
bool noerr;
KopeteOtrKcfg::self()->readConfig();
if( policy.toInt( &noerr, 10 ) == 4 || ( policy.toInt( &noerr, 10 ) == 0 && KopeteOtrKcfg::self()->rbNever() ) ){
Kopete::Message msg( session->account()->myself(), session->members(), i18n( "Your policy settings do not allow encrypted sessions to this contact." ), Kopete::Message::Internal, Kopete::Message::RichText );
session->appendMessage( msg );
} else {
TQString body = otrlChatInterface->getDefaultQuery( session->account()->accountId() );
Kopete::Message msg1( session->account()->myself(), session->members().getFirst(), TQString( body ), Kopete::Message::Outbound );
if( otrlChatInterface->privState( session ) > 0 ){
body = i18n("Attempting to refresh the OTR session with <b>%1</b>...").arg( otrlChatInterface->formatContact( session->members().getFirst()->contactId() ) );
} else {
body = i18n("Attempting to start a private OTR session with <b>%1</b>...").arg( otrlChatInterface->formatContact( session->members().getFirst()->contactId() ) );
}
Kopete::Message msg2( session->account()->myself(), session->members().getFirst(), body, Kopete::Message::Internal, Kopete::Message::RichText );
session->sendMessage( msg1 );
session->appendMessage( msg2 );
}
} else {
otrlChatInterface->disconnectSession( session );
}
}
void OTRPlugin::slotVerifyFingerprint( Kopete::ChatSession *session ){
otrlChatInterface->verifyFingerprint( session );
}
void OTRPlugin::slotSettingsChanged(){
KopeteOtrKcfg::self()->readConfig();
if( KopeteOtrKcfg::self()->rbAlways() ){
otrlChatInterface->setPolicy( OTRL_POLICY_ALWAYS );
} else if( KopeteOtrKcfg::self()->rbOpportunistic() ){
otrlChatInterface->setPolicy( OTRL_POLICY_OPPORTUNISTIC );
} else if( KopeteOtrKcfg::self()->rbManual() ){
otrlChatInterface->setPolicy( OTRL_POLICY_MANUAL );
} else if( KopeteOtrKcfg::self()->rbNever() ){
otrlChatInterface->setPolicy( OTRL_POLICY_NEVER );
} else {
otrlChatInterface->setPolicy( OTRL_POLICY_DEFAULT );
}
}
void OTRPlugin::emitGoneSecure( Kopete::ChatSession *session, int status){
emit goneSecure( session, status );
}
TQMap<TQString, TQString> OTRPlugin::getMessageCache(){
return messageCache;
}
void OtrMessageHandler::handleMessage( Kopete::MessageEvent *event ){
Kopete::Message msg = event->message();
Kopete::ChatSession *session = msg.manager();
TQMap<TQString, TQString> messageCache = OTRPlugin::plugin()->getMessageCache();
if( msg.direction() == Kopete::Message::Inbound ){
TQString body = msg.parsedBody();
kdDebug() << "Received Message: " << msg.parsedBody() << endl;
TQString accountId = msg.manager()->account()->accountId();
TQString contactId = msg.from()->contactId();
int ignoremessage = OtrlChatInterface::self()->decryptMessage( &body, accountId, msg.manager()->account()->protocol()->displayName(), contactId, msg.manager() );
msg.setBody( body, Kopete::Message::RichText );
if( ignoremessage | OtrlChatInterface::self()->shouldDiscard( msg.plainBody() ) ){
event->discard();
return;
}
} else if( msg.direction() == Kopete::Message::Outbound ){
if( messageCache.contains( msg.plainBody() ) ){
msg.setBody( messageCache[msg.plainBody()] );
messageCache.remove( messageCache[msg.plainBody()] );
if(messageCache.count() > 5) messageCache.clear();
}
// Check if Message is an OTR message. Should it be discarded or shown?
if( OtrlChatInterface::self()->shouldDiscard( msg.plainBody() ) ){
event->discard();
kdDebug() << "discarding" << endl;
return;
}
// If the message is sent while a Finished state libotr deletes the messagetext.
// This prevents the empty message from beeing shown in out chatwindow
if( msg.plainBody().isEmpty() ){
event->discard();
return;
}
}
event->setMessage( msg );
MessageHandler::handleMessage( event );
}
void OTRPlugin::slotSelectionChanged( bool single){
otrPolicyMenu->setEnabled( single );
if ( !single )
return;
Kopete::MetaContact *metaContact = Kopete::ContactList::self()->selectedMetaContacts().first();
TQString policy = metaContact->pluginData( this, "otr_policy" );
bool noerr;
if ( !policy.isEmpty() && policy != "null" )
otrPolicyMenu->setCurrentItem( policy.toInt( &noerr, 10 ));
else
otrPolicyMenu->setCurrentItem( 0 );
}
void OTRPlugin::slotSetPolicy(){
kdDebug() << "Setting contact policy" << endl;
Kopete::MetaContact *metaContact = Kopete::ContactList::self()->selectedMetaContacts().first();
if( metaContact ){
metaContact->setPluginData( this, "otr_policy", TQString::number( otrPolicyMenu->currentItem() ) );
}
}
void OTRPlugin::accountReady( Kopete::Account *account ){
kdDebug() << "Account " << account->accountId() << " ready. Calling update function."<< endl;
otrlChatInterface->updateKeyfile( account );
}
#include "otrplugin.moc"

@ -0,0 +1,117 @@
/***************************************************************************
otrplugin.h - description
-------------------
begin : 11 03 2007
copyright : (C) 2007-2007 by Michael Zanetti
email : michael_zanetti@gmx.net
***************************************************************************/
/***************************************************************************
* *
* 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. *
* *
***************************************************************************/
#ifndef OTRPLUGIN_H
#define OTRPLUGIN_H
#include <kdebug.h>
#include <kopeteplugin.h>
#include <kopetemessagehandler.h>
#include "otrlchatinterface.h"
/**
* @author Michael Zanetti
*/
class OTRPlugin;
class TDESelectAction;
class OtrMessageHandler : public Kopete::MessageHandler
{
private:
OTRPlugin *plugin;
public:
OtrMessageHandler( OTRPlugin *plugin ) : plugin(plugin) {
kdDebug() << "MessageHandler created" << endl;
}
~OtrMessageHandler(){
kdDebug() << "MessageHandler destroyed" << endl;
}
void handleMessage( Kopete::MessageEvent *event );
};
class OtrMessageHandlerFactory : public Kopete::MessageHandlerFactory
{
private:
OTRPlugin *plugin;
OtrMessageHandler *messageHandler;
public:
OtrMessageHandlerFactory( OTRPlugin *plugin ) : plugin(plugin) {}
Kopete::MessageHandler *create( Kopete::ChatSession *, Kopete::Message::MessageDirection direction )
{
return new OtrMessageHandler(plugin);
}
int filterPosition( Kopete::ChatSession *, Kopete::Message::MessageDirection )
{
return Kopete::MessageHandlerFactory::InStageToSent+1;
}
};
class KDE_EXPORT OTRPlugin : public Kopete::Plugin
{
Q_OBJECT
public:
static OTRPlugin *plugin();
OTRPlugin( TDEInstance *instance, TQObject *parent, const char *name, const TQStringList &args );
~OTRPlugin();
void emitGoneSecure( Kopete::ChatSession *session, int status );
TQMap<TQString, TQString> getMessageCache();
public slots:
void slotOutgoingMessage( Kopete::Message& msg );
void slotEnableOtr( Kopete::ChatSession *session, bool enable );
void slotSettingsChanged();
void slotVerifyFingerprint( Kopete::ChatSession *session );
private slots:
void slotNewChatSessionWindow(Kopete::ChatSession * );
void slotSelectionChanged( bool single );
void slotSetPolicy();
void accountReady( Kopete::Account *account );
private:
static OTRPlugin* pluginStatic_;
OtrMessageHandlerFactory *m_inboundHandler;
OtrlChatInterface *otrlChatInterface;
TQMap<TQString, TQString> messageCache;
TDESelectAction* otrPolicyMenu;
/* TDEActionMenu *otrPolicyMenuBar;
TDEActionMenu *otrPolicyPopup;
TDEAction *otrPolicyDefault;
TDEAction *otrPolicyAlways;
TDEAction *otrPolicyOpportunistic;
TDEAction *otrPolicyManual;
TDEAction *otrPolicyNever;
// SessionManager manager
*/
signals:
void goneSecure( Kopete::ChatSession *session, int state );
};
#endif

@ -0,0 +1,202 @@
/***************************************************************************
* 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. *
***************************************************************************/
#if defined(HAVE_CONFIG_H)
#include "config.h"
#endif
#include <tqlayout.h>
#include <tqlabel.h>
#include <tqmap.h>
#include <tqptrlist.h>
#include <tqcombobox.h>
#include <tqstringlist.h>
#include <tqtable.h>
#include <tqpaintdevicemetrics.h>
#include <tqvbox.h>
#include <tqradiobutton.h>
#include <tqtabwidget.h>
#include <kgenericfactory.h>
#include <kurlrequester.h>
#include <tdemessagebox.h>
#include <tdeconfig.h>
#include <tdeapplication.h>
#include <kanimwidget.h>
#include <kpassivepopup.h>
#include <kiconloader.h>
#include <kstandarddirs.h>
#include <kactivelabel.h>
#include <kopeteaccountmanager.h>
#include <kopeteaccount.h>
#include <kopeteprotocol.h>
#include "otrprefs.h"
#include "otrpreferences.h"
#include "otrplugin.h"
#include "kopete_otr.h"
/**
* @author Michael Zanetti
*/
typedef KGenericFactory<OTRPreferences> OTRPreferencesFactory;
K_EXPORT_COMPONENT_FACTORY( kcm_kopete_otr, OTRPreferencesFactory("kcm_kopete_otr"))
OTRPreferences::OTRPreferences(TQWidget *parent, const char* /*name*/, const TQStringList &args)
: TDECModule(OTRPreferencesFactory::instance(), parent, args)
{
( new TQVBoxLayout( this ) )->setAutoAdd( true );
preferencesDialog = new OTRPrefsUI(this);
this->addConfig( KopeteOtrKcfg::self(), preferencesDialog );
KopeteOtrKcfg::self()->readConfig();
load();
otrlConfInterface = new OtrlConfInterface( preferencesDialog );
connect( preferencesDialog->btGenFingerprint, TQT_SIGNAL(clicked()), TQT_SLOT(generateFingerprint()));
connect( preferencesDialog->cbKeys, TQT_SIGNAL(activated(int)), TQT_SLOT(showPrivFingerprint(int)));
connect( preferencesDialog->btVerify, TQT_SIGNAL(clicked()), TQT_SLOT(verifyFingerprint()));
connect( preferencesDialog->twSettings, TQT_SIGNAL(currentChanged(TQWidget *)), TQT_SLOT(fillFingerprints()));
connect( preferencesDialog->tbFingerprints, TQT_SIGNAL(currentChanged(int, int)), TQT_SLOT(updateButtons(int, int)));
connect( preferencesDialog->btForget, TQT_SIGNAL( clicked() ), TQT_SLOT( forgetFingerprint() ) );
int index = 0;
int accountnr = 0;
TQPtrList<Kopete::Account> accounts = Kopete::AccountManager::self()->accounts();
if( !accounts.isEmpty() ){
for ( TQPtrListIterator<Kopete::Account> it( accounts );
Kopete::Account *account = it.current();
++it ){
if ( account->protocol()->pluginId() != "IRCProtocol" ){
preferencesDialog->cbKeys->insertItem(account->accountId() + " (" + account->protocol()->displayName() + ")");
privKeys.insert(index++, accountnr);
}
accountnr++;
}
}
showPrivFingerprint( preferencesDialog->cbKeys->currentItem() );
preferencesDialog->tbFingerprints->setColumnWidth( 0, 200 );
preferencesDialog->tbFingerprints->setColumnWidth( 1, 80 );
preferencesDialog->tbFingerprints->setColumnWidth( 2, 60 );
preferencesDialog->tbFingerprints->setColumnWidth( 3, 400 );
preferencesDialog->tbFingerprints->setColumnWidth( 4, 200 );
}
OTRPreferences::~OTRPreferences(){
}
void OTRPreferences::generateFingerprint()
{
TQPtrList<Kopete::Account> accounts = Kopete::AccountManager::self()->accounts();
if( (accounts.isEmpty())){
return;
}
Kopete::Account *account = accounts.at( privKeys[preferencesDialog->cbKeys->currentItem()] );
if ((otrlConfInterface->hasPrivFingerprint( account->accountId(), account->protocol()->displayName() ) ) && (KMessageBox::questionYesNo(this, i18n("Selected account already has a key. Do you want to create a new one?"), i18n("Overwrite key?")) !=3)) return;
otrlConfInterface->generateNewPrivKey( account->accountId(), account->protocol()->displayName() );
showPrivFingerprint( preferencesDialog->cbKeys->currentItem() );
}
void OTRPreferences::showPrivFingerprint( int accountnr )
{
TQPtrList<Kopete::Account> accounts = Kopete::AccountManager::self()->accounts();
if( !accounts.isEmpty() ){
Kopete::Account *account = accounts.at(privKeys[accountnr]);
preferencesDialog->tlFingerprint->setText( otrlConfInterface->getPrivFingerprint( account->accountId(), account->protocol()->displayName() ) );
}
}
void OTRPreferences::fillFingerprints(){
TQTable *fingerprintsTable = preferencesDialog->tbFingerprints;
preferencesDialog->tbFingerprints->setNumRows(0);
TQValueList<TQStringList> list = otrlConfInterface->readAllFingerprints();
TQValueList<TQStringList>::iterator it;
int j = 0;
for( it = list.begin(); it != list.end(); ++it ){
preferencesDialog->tbFingerprints->setNumRows( preferencesDialog->tbFingerprints->numRows() +1 );
fingerprintsTable->setItem(j, 0, new TQAlignTableItem(fingerprintsTable, TQTableItem::Never,
OtrlChatInterface::self()->formatContact((*it)[0]), TQt::AlignLeft));
for( int i = 1; i < 5; i++ ){
//preferencesDialog->tbFingerprints->setText(j, i, (*it)[i] );
fingerprintsTable->setItem(j,i, new TQAlignTableItem(fingerprintsTable, TQTableItem::Never,(*it)[i],TQt::AlignLeft));
}
j++;
}
updateButtons( preferencesDialog->tbFingerprints->currentRow(), preferencesDialog->tbFingerprints->currentColumn() );
}
void OTRPreferences::verifyFingerprint(){
int doVerify = KMessageBox::questionYesNo(
this,
i18n("Please contact %1 via another secure way and verify that the following Fingerprint is correct:").arg(preferencesDialog->tbFingerprints->text( preferencesDialog->tbFingerprints->currentRow(), 0 )) + "\n\n" + preferencesDialog->tbFingerprints->text( preferencesDialog->tbFingerprints->currentRow(), 3 ) + "\n\n" + i18n("Are you sure you want to trust this fingerprint?"), i18n("Verify fingerprint") );
if( doVerify == KMessageBox::Yes ){
otrlConfInterface->verifyFingerprint( preferencesDialog->tbFingerprints->text( preferencesDialog->tbFingerprints->currentRow(), 3 ), true );
} else {
otrlConfInterface->verifyFingerprint( preferencesDialog->tbFingerprints->text( preferencesDialog->tbFingerprints->currentRow(), 3 ), false );
}
fillFingerprints();
}
void OTRPreferences::updateButtons( int row, int col ){
if( row != -1 ){
if( !otrlConfInterface->isEncrypted( preferencesDialog->tbFingerprints->text( row, 3 ) ) ){
preferencesDialog->btForget->setEnabled( true );
} else {
preferencesDialog->btForget->setEnabled( false );
}
preferencesDialog->btVerify->setEnabled( true );
} else {
preferencesDialog->btVerify->setEnabled( false );
preferencesDialog->btForget->setEnabled( false );
}
}
void OTRPreferences::forgetFingerprint(){
if( !otrlConfInterface->isEncrypted( preferencesDialog->tbFingerprints->text( preferencesDialog->tbFingerprints->currentRow(), 3 ) ) ){
otrlConfInterface->forgetFingerprint( preferencesDialog->tbFingerprints->text( preferencesDialog->tbFingerprints->currentRow(), 3 ) );
fillFingerprints();
} else {
updateButtons( preferencesDialog->tbFingerprints->currentRow(), preferencesDialog->tbFingerprints->currentColumn() );
}
}
TQAlignTableItem :: TQAlignTableItem( TQTable *table, EditType editType, const TQString& text, int alignment )
: TQTableItem( table, editType, text ) {
align = alignment;
}
#include "otrpreferences.moc"

@ -0,0 +1,64 @@
/***************************************************************************
* 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. *
***************************************************************************/
#ifndef OTRPREFERECES_H
#define OTRPREFERECES_H
#include <tdecmodule.h>
#include "otrlconfinterface.h"
/**
* Preference widget for the OTR plugin
* @author Michael Zanetti
*/
class OTRPreferences : public TDECModule {
Q_OBJECT
public:
OTRPreferences(TQWidget *parent = 0, const char *name = 0, const TQStringList &args = TQStringList());
~OTRPreferences();
private:
OTRPrefsUI *preferencesDialog;
OtrlConfInterface *otrlConfInterface;
TQMap<int, int> privKeys;
private slots: // Public slots
void generateFingerprint();
void showPrivFingerprint(int accountnr);
void verifyFingerprint();
void fillFingerprints();
void updateButtons(int row, int col);
void forgetFingerprint();
};
class TQAlignTableItem : public TQTableItem {
public :
TQAlignTableItem(TQTable *table, EditType editType, const TQString& text, int alignment);
private :
int align;
};
#endif

@ -0,0 +1,295 @@
<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
<class>OTRPrefsUI</class>
<widget class="TQWidget">
<property name="name">
<cstring>OTRPrefsUI</cstring>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>480</width>
<height>358</height>
</rect>
</property>
<property name="caption">
<string>Form1</string>
</property>
<grid>
<property name="name">
<cstring>unnamed</cstring>
</property>
<widget class="TQTabWidget" row="0" column="0">
<property name="name">
<cstring>twSettings</cstring>
</property>
<widget class="TQWidget">
<property name="name">
<cstring>settings</cstring>
</property>
<attribute name="title">
<string>&amp;Settings</string>
</attribute>
<grid>
<property name="name">
<cstring>unnamed</cstring>
</property>
<widget class="TQGroupBox" row="0" column="0">
<property name="name">
<cstring>groupBox1</cstring>
</property>
<property name="title">
<string>Private Keys</string>
</property>
<grid>
<property name="name">
<cstring>unnamed</cstring>
</property>
<widget class="TQPushButton" row="0" column="2">
<property name="name">
<cstring>btGenFingerprint</cstring>
</property>
<property name="text">
<string>&amp;Generate</string>
</property>
<property name="accel">
<string>Alt+G</string>
</property>
</widget>
<widget class="TQComboBox" row="0" column="1">
<property name="name">
<cstring>cbKeys</cstring>
</property>
<property name="maximumSize">
<size>
<width>400</width>
<height>32767</height>
</size>
</property>
</widget>
<widget class="TQLabel" row="0" column="0">
<property name="name">
<cstring>textLabel2</cstring>
</property>
<property name="text">
<string>Account:</string>
</property>
</widget>
<widget class="KActiveLabel" row="1" column="0" rowspan="1" colspan="3">
<property name="name">
<cstring>tlFingerprint</cstring>
</property>
<property name="sizePolicy">
<sizepolicy>
<hsizetype>7</hsizetype>
<vsizetype>5</vsizetype>
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>No Fingerprint</string>
</property>
</widget>
</grid>
</widget>
<widget class="TQButtonGroup" row="1" column="0">
<property name="name">
<cstring>bgPolicy</cstring>
</property>
<property name="title">
<string>Default Policy</string>
</property>
<grid>
<property name="name">
<cstring>unnamed</cstring>
</property>
<widget class="TQRadioButton" row="1" column="0">
<property name="name">
<cstring>kcfg_rbOpportunistic</cstring>
</property>
<property name="text">
<string>&amp;Opportunistic</string>
</property>
<property name="accel">
<string>Alt+O</string>
</property>
<property name="toolTip" stdset="0">
<string>Encrypt messages automatically if the other side supports OTR</string>
</property>
</widget>
<widget class="TQRadioButton" row="1" column="1">
<property name="name">
<cstring>kcfg_rbNever</cstring>
</property>
<property name="text">
<string>Ne&amp;ver</string>
</property>
<property name="accel">
<string>Alt+V</string>
</property>
<property name="toolTip" stdset="0">
<string>Never encrypt messages</string>
</property>
</widget>
<widget class="TQRadioButton" row="0" column="1">
<property name="name">
<cstring>kcfg_rbManual</cstring>
</property>
<property name="text">
<string>&amp;Manual</string>
</property>
<property name="accel">
<string>Alt+M</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
<property name="toolTip" stdset="0">
<string>Encrypt messages if the other side requests an OTR connection</string>
</property>
</widget>
<widget class="TQRadioButton" row="0" column="0">
<property name="name">
<cstring>kcfg_rbAlways</cstring>
</property>
<property name="autoMask">
<bool>false</bool>
</property>
<property name="text">
<string>Al&amp;ways</string>
</property>
<property name="accel">
<string>Alt+W</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
<property name="toolTip" stdset="0">
<string>Always encrypt messages</string>
</property>
</widget>
</grid>
</widget>
<spacer row="2" column="0">
<property name="name">
<cstring>spacer2</cstring>
</property>
<property name="orientation">
<enum>Vertical</enum>
</property>
<property name="sizeType">
<enum>Expanding</enum>
</property>
<property name="sizeHint">
<size>
<width>20</width>
<height>161</height>
</size>
</property>
</spacer>
</grid>
</widget>
<widget class="TQWidget">
<property name="name">
<cstring>fingerprints</cstring>
</property>
<attribute name="title">
<string>K&amp;nown Fingerprints</string>
</attribute>
<grid>
<property name="name">
<cstring>unnamed</cstring>
</property>
<widget class="TQTable" row="0" column="0" rowspan="1" colspan="2">
<column>
<property name="text">
<string>User</string>
</property>
</column>
<column>
<property name="text">
<string>Status</string>
</property>
</column>
<column>
<property name="text">
<string>Verified</string>
</property>
</column>
<column>
<property name="text">
<string>Fingerprint</string>
</property>
</column>
<column>
<property name="text">
<string>Protocol</string>
</property>
</column>
<property name="name">
<cstring>tbFingerprints</cstring>
</property>
<property name="numRows">
<number>1</number>
</property>
<property name="numCols">
<number>5</number>
</property>
<property name="showGrid">
<bool>true</bool>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
<property name="sorting">
<bool>false</bool>
</property>
<property name="selectionMode">
<enum>SingleRow</enum>
</property>
<property name="focusStyle">
<enum>FollowStyle</enum>
</property>
</widget>
<widget class="TQPushButton" row="1" column="0">
<property name="name">
<cstring>btVerify</cstring>
</property>
<property name="enabled">
<bool>true</bool>
</property>
<property name="text">
<string>&amp;Verify Fingerprint</string>
</property>
<property name="accel">
<string>Alt+V</string>
</property>
</widget>
<widget class="TQPushButton" row="1" column="1">
<property name="name">
<cstring>btForget</cstring>
</property>
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>F&amp;orget Fingerprint</string>
</property>
<property name="accel">
<string>Alt+O</string>
</property>
</widget>
</grid>
</widget>
</widget>
</grid>
</widget>
<Q_SLOTS>
<slot access="private">generateFingerprint()</slot>
</Q_SLOTS>
<layoutdefaults spacing="6" margin="11"/>
<includehints>
<includehint>kactivelabel.h</includehint>
</includehints>
</UI>

@ -0,0 +1,12 @@
<!DOCTYPE kpartgui>
<kpartgui name="kopete_otr" version="1">
<MenuBar>
<Menu name="edit">
<text>&amp;Edit</text>
<Action name="otr_policy" />
</Menu>
</MenuBar>
<Menu name="contact_popup">
<Action name="otr_policy" />
</Menu>
</kpartgui>

@ -0,0 +1,5 @@
##### icons
tde_install_icons( DESTINATION ${DATA_INSTALL_DIR}/kopete_otr/icons )
tde_install_icons( kopete_otr )

Binary file not shown.

After

Width:  |  Height:  |  Size: 815 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 956 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 750 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 687 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 758 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 750 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 812 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 873 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 853 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

@ -0,0 +1,57 @@
/***************************************************************************
* 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
*/
#if defined(HAVE_CONFIG_H)
#include "config.h"
#endif
#include <kdemacros.h>
#include "privkeypopup.h"
PrivKeyPopup::PrivKeyPopup(TQWidget* parent, const char* name, WFlags fl)
: PrivKeyPopupUI(parent,name,fl)
{
}
PrivKeyPopup::~PrivKeyPopup()
{
}
void PrivKeyPopup::setCloseLock( bool locked ){
closeLock = locked;
}
void PrivKeyPopup::closeEvent( TQCloseEvent *e ){
if( closeLock ){
e->ignore();
} else {
e->accept();
}
}
/*$SPECIALIZATION$*/
#include "privkeypopup.moc"

@ -0,0 +1,54 @@
/***************************************************************************
* Copyright (C) 2007 by Michael Zanetti *
* michael_zanetti@gmx.net *
* *
* 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. *
***************************************************************************/
#ifndef PRIVKEYPOPUP_H
#define PRIVKEYPOPUP_H
#include "privkeypopupui.h"
/**
* @author Michael Zanetti
*/
class PrivKeyPopup : public PrivKeyPopupUI
{
Q_OBJECT
public:
PrivKeyPopup(TQWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
~PrivKeyPopup();
void setCloseLock( bool locked );
/*$PUBLIC_FUNCTIONS$*/
public slots:
/*$PUBLIC_SLOTS$*/
protected:
/*$PROTECTED_FUNCTIONS$*/
bool closeLock;
void closeEvent( TQCloseEvent *e );
protected slots:
/*$PROTECTED_SLOTS$*/
};
#endif

@ -0,0 +1,64 @@
<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
<class>PrivKeyPopupUI</class>
<widget class="TQWidget">
<property name="name">
<cstring>PrivKeyPopupUI</cstring>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>507</width>
<height>111</height>
</rect>
</property>
<property name="caption">
<string>Generating private key</string>
</property>
<grid>
<property name="name">
<cstring>unnamed</cstring>
</property>
<widget class="TQLabel" row="0" column="0">
<property name="name">
<cstring>tlWait</cstring>
</property>
<property name="font">
<font>
<bold>1</bold>
<italic>1</italic>
</font>
</property>
<property name="text">
<string>Please wait while generating the private key</string>
</property>
</widget>
<widget class="TQFrame" row="0" column="1">
<property name="name">
<cstring>animFrame</cstring>
</property>
<property name="sizePolicy">
<sizepolicy>
<hsizetype>0</hsizetype>
<vsizetype>0</vsizetype>
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>72</width>
<height>72</height>
</size>
</property>
<property name="frameShape">
<enum>StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>Raised</enum>
</property>
</widget>
</grid>
</widget>
<layoutdefaults spacing="6" margin="11"/>
</UI>

@ -0,0 +1,87 @@
/***************************************************************************
* Copyright (C) 2007 by Michael Zanetti *
* michael_zanetti@gmx.net *
* *
* 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. *
***************************************************************************/
#if defined(HAVE_CONFIG_H)
#include "config.h"
#endif
#include <tqlabel.h>
#include <kdebug.h>
#include <tdelocale.h>
#include <klineedit.h>
#include <kurl.h>
#include <krun.h>
#include "smppopup.h"
#include "verifypopup.h"
SMPPopup::SMPPopup(TQWidget* parent, const char* name, TQString title, WFlags fl, ConnContext *context, Kopete::ChatSession *session, bool initiate )
: SMPPopupUI(parent,name,fl)
{
this->context = context;
this->session = session;
this->initiate = initiate;
if (title.isNull()) {
question = false;
tlText->setText( i18n("Please enter the secret passphrase to authenticate %1:").arg(OtrlChatInterface::self()->formatContact(session->members().getFirst()->contactId())));
}
else {
question = true;
tlText->setText( title );
}
}
SMPPopup::~SMPPopup()
{
}
/*$SPECIALIZATION$*/
void SMPPopup::cancelSMP()
{
OtrlChatInterface::self()->abortSMP( context, session );
this->close();
}
void SMPPopup::respondSMP()
{
if (question) {
OtrlChatInterface::self()->respondSMPQ( context, session, tlText->text(), leSecret->text(), initiate );
}
else {
OtrlChatInterface::self()->respondSMP( context, session, leSecret->text(), initiate );
}
this->close();
}
void SMPPopup::openHelp()
{
KURL *url = new KURL("http://www.cypherpunks.ca/otr/help/authenticate.php?lang=en");
new KRun(*url, 0, false, true);
}
void SMPPopup::manualAuth(){
VerifyPopup *vfPopup = new VerifyPopup(this, i18n("Verify Fingerprint").utf8(), session);
vfPopup->show();
this->close();
}
#include "smppopup.moc"

@ -0,0 +1,62 @@
/***************************************************************************
* Copyright (C) 2007 by Michael Zanetti *
* michael_zanetti@gmx.net *
* *
* 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. *
***************************************************************************/
#ifndef SMPPOPUP_H
#define SMPPOPUP_H
#include "kopetechatsession.h"
#include "smppopupui.h"
#include "otrlchatinterface.h"
extern "C"{
#include "libotr/proto.h"
}
class SMPPopup : public SMPPopupUI
{
Q_OBJECT
public:
SMPPopup(TQWidget* parent = 0, const char* name = 0, TQString title = TQString::null, WFlags fl = 0, ConnContext *context = 0, Kopete::ChatSession *session = 0, bool initiate = true );
~SMPPopup();
/*$PUBLIC_FUNCTIONS$*/
public slots:
/*$PUBLIC_SLOTS$*/
virtual void cancelSMP();
virtual void respondSMP();
virtual void openHelp();
virtual void manualAuth();
protected:
/*$PROTECTED_FUNCTIONS$*/
ConnContext *context;
Kopete::ChatSession *session;
bool initiate;
bool question;
protected slots:
/*$PROTECTED_SLOTS$*/
};
#endif

@ -0,0 +1,191 @@
<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
<class>SMPPopupUI</class>
<widget class="TQWidget">
<property name="name">
<cstring>SMPPopupUI</cstring>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>536</width>
<height>158</height>
</rect>
</property>
<property name="caption">
<string>Enter authentication secret</string>
</property>
<widget class="KPushButton">
<property name="name">
<cstring>pbOK</cstring>
</property>
<property name="geometry">
<rect>
<x>430</x>
<y>110</y>
<width>90</width>
<height>30</height>
</rect>
</property>
<property name="text">
<string>&amp;OK</string>
</property>
<property name="accel">
<string>Alt+O</string>
</property>
</widget>
<widget class="KPushButton">
<property name="name">
<cstring>pbCancel</cstring>
</property>
<property name="geometry">
<rect>
<x>330</x>
<y>110</y>
<width>91</width>
<height>31</height>
</rect>
</property>
<property name="text">
<string>&amp;Cancel</string>
</property>
<property name="accel">
<string>Alt+C</string>
</property>
</widget>
<widget class="KLineEdit">
<property name="name">
<cstring>leSecret</cstring>
</property>
<property name="geometry">
<rect>
<x>120</x>
<y>70</y>
<width>400</width>
<height>23</height>
</rect>
</property>
</widget>
<widget class="TQLabel">
<property name="name">
<cstring>tlText</cstring>
</property>
<property name="geometry">
<rect>
<x>124</x>
<y>10</y>
<width>390</width>
<height>50</height>
</rect>
</property>
<property name="text">
<string>Please enter the secret passphrase to authenticate this contact.</string>
</property>
<property name="alignment">
<set>WordBreak|AlignVCenter</set>
</property>
</widget>
<widget class="TQLabel">
<property name="name">
<cstring>pLIcon</cstring>
</property>
<property name="geometry">
<rect>
<x>30</x>
<y>30</y>
<width>50</width>
<height>50</height>
</rect>
</property>
<property name="pixmap">
<pixmap>image0</pixmap>
</property>
<property name="scaledContents">
<bool>true</bool>
</property>
</widget>
<widget class="KPushButton">
<property name="name">
<cstring>pbManual</cstring>
</property>
<property name="geometry">
<rect>
<x>110</x>
<y>110</y>
<width>160</width>
<height>30</height>
</rect>
</property>
<property name="text">
<string>&amp;Manual Authentication</string>
</property>
<property name="accel">
<string>Alt+M</string>
</property>
</widget>
<widget class="KPushButton">
<property name="name">
<cstring>pbHelp</cstring>
</property>
<property name="geometry">
<rect>
<x>10</x>
<y>110</y>
<width>90</width>
<height>30</height>
</rect>
</property>
<property name="text">
<string>&amp;Help</string>
</property>
<property name="accel">
<string>Alt+H</string>
</property>
</widget>
</widget>
<images>
<image name="image0">
<data format="PNG" length="1360">89504e470d0a1a0a0000000d4948445200000020000000200806000000737a7af400000517494441545885c5975d68544714c77f7b5db39b98adf95851a34913158dd1b452db2a488badb5155bfba22f3e54a4da421ffa609fa42fea83a0f8509fc5071529a894422988156cc552d4b40113129ae826249b8fc664f3b17befeede3b7766fa70633edc9bcdfa517ae0b2c3ec9df9ffce393367e6c2ff6c81671d70f6ecb5b052aa1ea80b0428d39acf95523d528a96870fdb2e9e3f7f7a0490ff09c09933df6f0f04025b57adaa0aad5cb98468743152cae3c9a4c5a347fdf4f58d904e9be75a5bef9fb87af5dc502120c142844f9ebc180e040207972faf5cba7bf756caca220402b3d9376d5acbe0e030376ffef9a5d65bde1d1a1af8f8f6ed9fe380c837f782f9c48f1d3b1f564a1f6c6c5cbd74dfbef7282e0e23a5249d4e639a2696656dcf64321886414545191b36d4313c3c1e0d85a2bb1c277bbdbfbf3b05a8e706d8b66df70735354bd7eddfbf13e089287d7d8f696fefa1ab6b60bb942eb69dc6b66d2291080d0d75c462f16830f84a4553d3ad5f0107d0cf0c70e4c877658661ec3d74e8138a8bc32493499249936bd76e73e7ce03f1e0415b4f2cd65bdad939581a8f274a4b4a0c5cd7211a8d5255554e6b6bfc3521c42f7d7db17f00d74f23ef1a504a6fddb8b18ecaca322ccbc2b66d2e5fbe4947c7c3aeebd72f350d0dc54da005d0070e1cfd7a74347978cf9e370887c3545757b3624505f5f56f7e71f7ee8d76c0f68330f2010821963534d4a1b5c6344d9a9b3be9ea8a8f5db870f2f7a1a1f828300e7403dd972e9dfa369148fc78efde437a7b7b0158bffe550c63613d100116fa69e405705df9eaaa55556432198410343777d2d3d3f13790054cc00292400a48f4f5751defee7e4c369b656c6c8cdada65048345af038b9e0bc0715c8a8b4308211042e03882f1f144122f9c4f2f2c75e3c6a576cbca2284606464844864118ee302143147bae74b018ee3e0380eaeeb22844029adf10a8cdfd6924208b4d64829a7c0f116bb6fd19b270202dbb6b16d7b7232172925ccb1a500ed385edd715d77123e6f1dca0fa0b5c6b66d1cc799f45ea1e7929e316626809e67806f5edace36d41b06cb7febed24db761129250b1c87cd65dd6cfe30b1a66aefdaf2c5c50b8461a0811d33c7fe31d049c59843d029412e2c62476d279f1d5d7d3800773e3d15bbcc53e9cbc94bd3e9865d0b17b025525343a4ba26bfbb9e1d9fef8554bc97546f2f89943cbfe344c73778bb47f946209d61cb9a8fdea7eaed46d08ff016fb8bd992b7d631d0b48c891bf70f03a7810120ed0b30616942e551b0aebc1471004c9b506c88096b11403990981320696adc4c3f64ad9723ee2a6819c44d2b92a606af204d2d7e9f0880b415647dcf8e6733a9a0fd31a46ca41364c2c7a7dc08581ad75690cdbf7fe7354742f728980e488deb289256ee96cc8d80a9716d099917888069c3401284f2a2a03c8009b300005782769f330552c1681a5236280d524f0168a9717d6e88fef7019127056ad20bada70bb2ab4048b09c59a2d3bf936d1ff30770d5740a828657aeb49e9e4ca9c94967b4fdfa6601f897e4390024d8024a439eb8d4d31ecd122db0efb922505234dd7e2a9fd30279fa72009e2502a1a0e7b9abc8c9a35f6e0b85f231dfe37860d800a3d203987aa43749bebe9cffa79f8154a8b00848a5e33ffdf05775ac71392b226970b39e074f56fdccf6938539ab9dfb5e7faa88b69152d28e6cc53b8ea7f291731cefac5f1aa9ad2c79a72868546b5dd0b7e35705bcc34446b4dcea787c6530998d0171bc4badaf8001848030de65723e88658500e09dff16308677937601fe058d04715d6cb9690e0000000049454e44ae426082</data>
</image>
</images>
<connections>
<connection>
<sender>pbCancel</sender>
<signal>clicked()</signal>
<receiver>SMPPopupUI</receiver>
<slot>cancelSMP()</slot>
</connection>
<connection>
<sender>pbOK</sender>
<signal>clicked()</signal>
<receiver>SMPPopupUI</receiver>
<slot>respondSMP()</slot>
</connection>
<connection>
<sender>pbHelp</sender>
<signal>clicked()</signal>
<receiver>SMPPopupUI</receiver>
<slot>openHelp()</slot>
</connection>
<connection>
<sender>pbManual</sender>
<signal>clicked()</signal>
<receiver>SMPPopupUI</receiver>
<slot>manualAuth()</slot>
</connection>
</connections>
<Q_SLOTS>
<slot>manualAuth()</slot>
<slot>respondSMP()</slot>
<slot>openHelp()</slot>
<slot>cancelSMP()</slot>
</Q_SLOTS>
<layoutdefaults spacing="6" margin="11"/>
<includehints>
<includehint>kpushbutton.h</includehint>
<includehint>kpushbutton.h</includehint>
<includehint>klineedit.h</includehint>
<includehint>kpushbutton.h</includehint>
<includehint>kpushbutton.h</includehint>
</includehints>
</UI>

@ -0,0 +1,72 @@
/***************************************************************************
* Copyright (C) 2007 by Michael Zanetti *
* michael_zanetti@gmx.net *
* *
* 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. *
***************************************************************************/
#if defined(HAVE_CONFIG_H)
#include "config.h"
#endif
#include "verifypopup.h"
#include "otrlchatinterface.h"
#include "otrplugin.h"
#include "tqlabel.h"
#include "tdelocale.h"
#include "kactivelabel.h"
#include "kcombobox.h"
#include "kopetechatsession.h"
#include "kopetecontact.h"
VerifyPopup::VerifyPopup(TQWidget* parent, const char* name, Kopete::ChatSession *session, bool modal, WFlags fl)
: VerifyPopupUI(parent,name, modal,fl)
{
this->session = session;
alContact->setText(i18n("Verify fingerprint for %1.").arg(OtrlChatInterface::self()->formatContact(session->members().getFirst()->contactId())));
alFingerprint->setText(i18n("The received fingerprint is:\n\n%1\n\nContact %2 via another secure channel and verify that this fingerprint is correct.").arg(OtrlChatInterface::self()->findActiveFingerprint(session)).arg(OtrlChatInterface::self()->formatContact(session->members().getFirst()->contactId())));
alVerified->setText(i18n("verified that this is in fact the correct fingerprint for %1").arg(OtrlChatInterface::self()->formatContact(session->members().getFirst()->contactId())));
cbVerify->insertItem(i18n("I have not"));
cbVerify->insertItem(i18n("I have"));
if( OtrlChatInterface::self()->isVerified(session)){
cbVerify->setCurrentItem(1);
} else {
cbVerify->setCurrentItem(0);
}
}
VerifyPopup::~VerifyPopup()
{
}
void VerifyPopup::cbChanged(){
kdDebug() << "combobox changed" << endl;
if( cbVerify->currentItem() == 0 ){
OtrlChatInterface::self()->setTrust(session, false);
} else {
OtrlChatInterface::self()->setTrust(session, true);
}
OTRPlugin::plugin()->emitGoneSecure( session, OtrlChatInterface::self()->privState( session ) );
}
/*$SPECIALIZATION$*/
#include "verifypopup.moc"

@ -0,0 +1,49 @@
/***************************************************************************
* Copyright (C) 2007 by Michael Zanetti *
* michael_zanetti@gmx.net *
* *
* 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. *
***************************************************************************/
#ifndef VERIFYPOPUP_H
#define VERIFYPOPUP_H
#include "verifypopupui.h"
#include "kopetechatsession.h"
class VerifyPopup : public VerifyPopupUI
{
Q_OBJECT
public:
VerifyPopup(TQWidget* parent = 0, const char* name = 0, Kopete::ChatSession *session = NULL, bool modal = FALSE, WFlags fl = 0 );
~VerifyPopup();
/*$PUBLIC_FUNCTIONS$*/
public slots:
/*$PUBLIC_SLOTS$*/
virtual void cbChanged();
protected:
/*$PROTECTED_FUNCTIONS$*/
Kopete::ChatSession *session;
protected slots:
/*$PROTECTED_SLOTS$*/
};
#endif

@ -0,0 +1,113 @@
<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
<class>VerifyPopupUI</class>
<widget class="TQDialog">
<property name="name">
<cstring>VerifyPopupUI</cstring>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>605</width>
<height>250</height>
</rect>
</property>
<property name="caption">
<string>Verify Fingerprint</string>
</property>
<grid>
<property name="name">
<cstring>unnamed</cstring>
</property>
<widget class="KPushButton" row="3" column="2">
<property name="name">
<cstring>pbOK</cstring>
</property>
<property name="text">
<string>&amp;OK</string>
</property>
<property name="accel">
<string>Alt+O</string>
</property>
</widget>
<spacer row="3" column="0" rowspan="1" colspan="2">
<property name="name">
<cstring>spacer1</cstring>
</property>
<property name="orientation">
<enum>Horizontal</enum>
</property>
<property name="sizeType">
<enum>Expanding</enum>
</property>
<property name="sizeHint">
<size>
<width>461</width>
<height>20</height>
</size>
</property>
</spacer>
<widget class="KActiveLabel" row="2" column="1" rowspan="1" colspan="2">
<property name="name">
<cstring>alVerified</cstring>
</property>
</widget>
<widget class="KComboBox" row="2" column="0">
<property name="name">
<cstring>cbVerify</cstring>
</property>
<property name="maximumSize">
<size>
<width>130</width>
<height>32767</height>
</size>
</property>
</widget>
<widget class="KActiveLabel" row="0" column="0" rowspan="1" colspan="3">
<property name="name">
<cstring>alContact</cstring>
</property>
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
</widget>
<widget class="TQLabel" row="1" column="0" rowspan="1" colspan="3">
<property name="name">
<cstring>alFingerprint</cstring>
</property>
<property name="text">
<string></string>
</property>
<property name="alignment">
<set>WordBreak|AlignVCenter</set>
</property>
</widget>
</grid>
</widget>
<connections>
<connection>
<sender>cbVerify</sender>
<signal>activated(int)</signal>
<receiver>VerifyPopupUI</receiver>
<slot>cbChanged()</slot>
</connection>
<connection>
<sender>pbOK</sender>
<signal>clicked()</signal>
<receiver>VerifyPopupUI</receiver>
<slot>close()</slot>
</connection>
</connections>
<Q_SLOTS>
<slot>cbChanged()</slot>
</Q_SLOTS>
<layoutdefaults spacing="6" margin="11"/>
<includehints>
<includehint>kpushbutton.h</includehint>
<includehint>kactivelabel.h</includehint>
<includehint>kcombobox.h</includehint>
<includehint>kactivelabel.h</includehint>
</includehints>
</UI>
Loading…
Cancel
Save