//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 #include #include #include #include #include #include #include #include #include #include "kgpgselkey.h" //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////// Secret key selection dialog, used when user wants to sign a key KgpgSelKey::KgpgSelKey(TQWidget *parent, const char *name,bool showlocal):KDialogBase( parent, name, true,i18n("Private Key List"),Ok | Cancel) { TQString keyname; TQWidget *page = new TQWidget(this); TQLabel *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 TQLabel(i18n("Choose secret key:"),page); TQVBoxLayout *vbox=new TQVBoxLayout(page,3); vbox->addWidget(labeltxt); vbox->addWidget(keysListpr); if (showlocal==true) { local = new TQCheckBox(i18n("Local signature (cannot be exported)"),page); vbox->addWidget(local); } FILE *fp,*fp2; TQString tst,tst2; char line[130]; // FIXME: Why use popen instead of KProcess, TQProcess 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 TQString trust=tst.section(':',1,1); TQString val=tst.section(':',6,6); TQString id=TQString("0x"+tst.section(':',4,4).right(8)); if (val.isEmpty()) val=i18n("Unlimited"); TQString 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( TQString( "gpg --no-tty --with-colon --list-key %1" ).tqarg( KShellProcess::quote( id ) ).latin1(), "r" ); bool dead=true; while ( fgets( line, sizeof(line), fp2)) { tst2=line; if (tst2.startsWith("pub")) { const TQString 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").tqarg(id).tqarg(tr).tqarg(val)); sub->setSelectable(false); item->setPixmap(0,keyPair); } } } pclose(fp); TQObject::connect(keysListpr,TQT_SIGNAL(doubleClicked(TQListViewItem *,const TQPoint &,int)),this,TQT_SLOT(slotpreOk())); TQObject::connect(keysListpr,TQT_SIGNAL(clicked(TQListViewItem *)),this,TQT_SLOT(slotSelect(TQListViewItem *))); keysListpr->setSelected(keysListpr->firstChild(),true); page->show(); resize(this->tqminimumSize()); setMainWidget(page); } TQString KgpgSelKey::extractKeyName(TQString fullName) { TQString kMail; if (fullName.find("<")!=-1) { kMail=fullName.section('<',-1,-1); kMail.truncate(kMail.length()-1); } TQString kName=fullName.section('<',0,0); if (kName.find("(")!=-1) kName=kName.section('(',0,0); return TQString(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(TQListViewItem *item) { if (item==NULL) return; if (item->depth()!=0) { keysListpr->setSelected(item->parent(),true); keysListpr->setCurrentItem(item->parent()); } } TQString KgpgSelKey::getkeyID() { TQString 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); } } TQString KgpgSelKey::getkeyMail() { TQString 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"