diff options
Diffstat (limited to 'kopete/plugins/cryptography/kgpgselkey.cpp')
-rw-r--r-- | kopete/plugins/cryptography/kgpgselkey.cpp | 245 |
1 files changed, 245 insertions, 0 deletions
diff --git a/kopete/plugins/cryptography/kgpgselkey.cpp b/kopete/plugins/cryptography/kgpgselkey.cpp new file mode 100644 index 00000000..70f76598 --- /dev/null +++ b/kopete/plugins/cryptography/kgpgselkey.cpp @@ -0,0 +1,245 @@ +//Code from KGPG + +/*************************************************************************** + listkeys.cpp - description + ------------------- + begin : Thu Jul 4 2002 + copyright : (C) 2002 by y0k0 + email : bj@altern.org + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +////////////////////////////////////////////////////// code for the key management + +#include <stdlib.h> +#include <unistd.h> +#include <sys/wait.h> + +#include <qlayout.h> +#include <qlabel.h> + +#include <klistview.h> +#include <klocale.h> +#include <qcheckbox.h> +#include <kprocess.h> +#include <kiconloader.h> + +#include "kgpgselkey.h" + + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +//////////////// Secret key selection dialog, used when user wants to sign a key +KgpgSelKey::KgpgSelKey(QWidget *parent, const char *name,bool showlocal):KDialogBase( parent, name, true,i18n("Private Key List"),Ok | Cancel) +{ + QString keyname; + QWidget *page = new QWidget(this); + QLabel *labeltxt; + KIconLoader *loader = KGlobal::iconLoader(); + + keyPair=loader->loadIcon("kgpg_key2",KIcon::Small,20); + + setMinimumSize(300,200); + keysListpr = new KListView( page ); + keysListpr->setRootIsDecorated(true); + keysListpr->addColumn( i18n( "Name" ) ); + keysListpr->setShowSortIndicator(true); + keysListpr->setFullWidth(true); + + labeltxt=new QLabel(i18n("Choose secret key:"),page); + QVBoxLayout *vbox=new QVBoxLayout(page,3); + + vbox->addWidget(labeltxt); + vbox->addWidget(keysListpr); + if (showlocal==true) + { + local = new QCheckBox(i18n("Local signature (cannot be exported)"),page); + vbox->addWidget(local); + } + + FILE *fp,*fp2; + QString tst,tst2; + char line[130]; + + // FIXME: Why use popen instead of KProcess, QProcess or KProcIO?!? + // Are we interested in having buffer overflows now? - Martijn + fp = popen( "gpg --no-tty --with-colon --list-secret-keys", "r" ); + while ( fgets( line, sizeof(line), fp)) + { + tst=line; + if (tst.startsWith("sec")) + { + const QString trust=tst.section(':',1,1); + QString val=tst.section(':',6,6); + QString id=QString("0x"+tst.section(':',4,4).right(8)); + if (val.isEmpty()) + val=i18n("Unlimited"); + QString tr; + switch( trust[0] ) + { + case 'o': + tr= i18n("Unknown"); + break; + case 'i': + tr= i18n("Invalid"); + break; + case 'd': + tr=i18n("Disabled"); + break; + case 'r': + tr=i18n("Revoked"); + break; + case 'e': + tr=i18n("Expired"); + break; + case 'q': + tr=i18n("Undefined"); + break; + case 'n': + tr=i18n("None"); + break; + case 'm': + tr=i18n("Marginal"); + break; + case 'f': + tr=i18n("Full"); + break; + case 'u': + tr=i18n("Ultimate"); + break; + default: + tr=i18n("?"); + break; + } + tst=tst.section(":",9,9); + + // FIXME: Same here: don't use popen! - Martijn + fp2 = popen( QString( "gpg --no-tty --with-colon --list-key %1" ).arg( KShellProcess::quote( id ) ).latin1(), "r" ); + bool dead=true; + while ( fgets( line, sizeof(line), fp2)) + { + tst2=line; + if (tst2.startsWith("pub")) + { + const QString trust2=tst2.section(':',1,1); + switch( trust2[0] ) + { + case 'f': + dead=false; + break; + case 'u': + dead=false; + break; + default: + break; + } + } + } + pclose(fp2); + if (!tst.isEmpty() && (!dead)) + { + KListViewItem *item=new KListViewItem(keysListpr,extractKeyName(tst)); + KListViewItem *sub= new KListViewItem(item,i18n("ID: %1, trust: %2, expiration: %3").arg(id).arg(tr).arg(val)); + sub->setSelectable(false); + item->setPixmap(0,keyPair); + } + } + } + pclose(fp); + + + QObject::connect(keysListpr,SIGNAL(doubleClicked(QListViewItem *,const QPoint &,int)),this,SLOT(slotpreOk())); + QObject::connect(keysListpr,SIGNAL(clicked(QListViewItem *)),this,SLOT(slotSelect(QListViewItem *))); + + + keysListpr->setSelected(keysListpr->firstChild(),true); + + page->show(); + resize(this->minimumSize()); + setMainWidget(page); +} + +QString KgpgSelKey::extractKeyName(QString fullName) +{ + QString kMail; + if (fullName.find("<")!=-1) + { + kMail=fullName.section('<',-1,-1); + kMail.truncate(kMail.length()-1); + } + QString kName=fullName.section('<',0,0); + if (kName.find("(")!=-1) kName=kName.section('(',0,0); + return QString(kMail+" ("+kName+")").stripWhiteSpace(); +} + +void KgpgSelKey::slotpreOk() +{ + if (keysListpr->currentItem()->depth()!=0) + return; + else + slotOk(); +} + +void KgpgSelKey::slotOk() +{ + if (keysListpr->currentItem()==NULL) + reject(); + else + accept(); +} + +void KgpgSelKey::slotSelect(QListViewItem *item) +{ + if (item==NULL) return; + if (item->depth()!=0) + { + keysListpr->setSelected(item->parent(),true); + keysListpr->setCurrentItem(item->parent()); + } +} + + +QString KgpgSelKey::getkeyID() +{ + QString userid; + ///// emit selected key + if (keysListpr->currentItem()==NULL) return(""); + else + { + userid=keysListpr->currentItem()->firstChild()->text(0); + userid=userid.section(',',0,0); + userid=userid.section(':',1,1); + userid=userid.stripWhiteSpace(); + return(userid); + } +} + +QString KgpgSelKey::getkeyMail() +{ + QString username; + ///// emit selected key + if (keysListpr->currentItem()==NULL) return(""); + else + { + username=keysListpr->currentItem()->text(0); + //username=username.section(' ',0,0); + username=username.stripWhiteSpace(); + return(username); + } +} + +bool KgpgSelKey::getlocal() +{ + ///// emit exportation choice + return(local->isChecked()); +} + +#include "kgpgselkey.moc" |