summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmanoil Kotsev <deloptes@gmail.com>2017-12-09 15:54:36 +0100
committerSlávek Banko <slavek.banko@axis.cz>2017-12-09 16:02:55 +0100
commite2bee02e9917c7407de600d7d577cd536e281b4a (patch)
tree88fcf0746895aa267bd4268d66abc584267f1965
parente2a62bdbfbe2ddfb9a3ffc37a9bfba158767480e (diff)
downloadtdeutils-e2bee02e9917c7407de600d7d577cd536e281b4a.tar.gz
tdeutils-e2bee02e9917c7407de600d7d577cd536e281b4a.zip
Add support for GnuPG 2.1
This resolves Bug 2791 Sort keys by name on export Fix the twice display of the default key server Signed-off-by: Emanoil Kotsev <deloptes@gmail.com> Additional formatting adjustments Signed-off-by: Slávek Banko <slavek.banko@axis.cz> (cherry picked from commit 9125ead96055376ab2b48f8b5780524c0ee244ac)
-rw-r--r--kgpg/keyinfowidget.cpp292
-rw-r--r--kgpg/keyservers.cpp601
-rw-r--r--kgpg/keyservers.h7
-rw-r--r--kgpg/kgpg.cpp129
-rw-r--r--kgpg/kgpginterface.cpp343
-rw-r--r--kgpg/kgpgoptions.cpp259
-rw-r--r--kgpg/kgpgoptions.h2
-rw-r--r--kgpg/listkeys.cpp1015
-rw-r--r--kgpg/main.cpp4
-rw-r--r--kgpg/popuppublic.cpp184
-rw-r--r--kgpg/popuppublic.h3
11 files changed, 1988 insertions, 851 deletions
diff --git a/kgpg/keyinfowidget.cpp b/kgpg/keyinfowidget.cpp
index 1de61af..1b833ac 100644
--- a/kgpg/keyinfowidget.cpp
+++ b/kgpg/keyinfowidget.cpp
@@ -4,6 +4,10 @@
begin : Mon Nov 18 2002
copyright : (C) 2002 by Jean-Baptiste Mardelle
email : bj@altern.org
+
+ updated to handle gpg21 : Sun Jul 30 10:18:29 CEST 2017
+ copyright : (C) 2017 by Emanoil Kotsev
+ email : deloptes@yahoo.com
***************************************************************************/
/***************************************************************************
@@ -90,36 +94,56 @@ KgpgKeyInfo::KgpgKeyInfo(TQWidget *parent, const char *name,TQString sigkey):KDi
void KgpgKeyInfo::slotDisableKey(bool isOn)
{
-TDEProcess kp;
-
- kp<<"gpg"
- <<"--no-tty"
- <<"--edit-key"
- <<displayedKeyID;
-if (isOn) kp<<"disable";
-else kp<<"enable";
+// kdDebug(2100) << k_funcinfo << endl;
+ TDEProcess kp;
+
+ kp<<"gpg" <<"--no-tty" <<"--edit-key" <<displayedKeyID;
+ if (isOn) kp<<"disable";
+ else kp<<"enable";
kp<<"save";
- kp.start(TDEProcess::Block);
-loadKey(displayedKeyID);
-keyWasChanged=true;
+ kp.start(TDEProcess::Block);
+ loadKey(displayedKeyID);
+ keyWasChanged=true;
}
void KgpgKeyInfo::loadKey(TQString Keyid)
{
-TQColor trustColor;
-TQString fingervalue=TQString();
-FILE *pass;
-char line[200]="";
-TQString gpgOutput,fullID;
-
-TQString gpgcmd="gpg --no-tty --no-secmem-warning --with-colon --with-fingerprint --list-key "+KShellProcess::quote(Keyid);
-
- pass=popen(TQFile::encodeName(gpgcmd),"r");
- while ( fgets( line, sizeof(line), pass)) {
- gpgOutput=TQString::fromUtf8(line);
- if (gpgOutput.startsWith("uat"))
- hasPhoto=true;
- if (gpgOutput.startsWith("pub")) {
+// kdDebug(2100) << k_funcinfo << endl;
+ FILE *pass;
+ char line[200]="";
+ TQString currentKey;
+ TQMap<TQString,TQStringList> hashMap;
+
+ TQString gpgcmd="gpg --no-tty --no-secmem-warning --with-colon --with-fingerprint --list-key "+KShellProcess::quote(Keyid);
+
+ pass=popen(TQFile::encodeName(gpgcmd),"r");
+ while ( fgets( line, sizeof(line), pass) ) {
+ TQString tst=TQString::fromUtf8(line);
+ if ( tst.startsWith("pub") ) {
+ currentKey = tst.section(':',4,4);
+ TQStringList lst; lst << tst;
+ hashMap.insert(currentKey,lst);
+ }
+ else {
+ hashMap.find(currentKey).data().append(tst);
+ }
+ }
+ pclose(pass);
+
+ TQMap<TQString,TQStringList>::Iterator ite;
+ for (ite = hashMap.begin(); ite != hashMap.end(); ite++) {
+ TQStringList::Iterator it;
+ TQString fullname,gpgOutput;
+ TQColor trustColor;
+ TQString fingervalue=TQString();
+
+ for (it = ite.data().begin(); it != ite.data().end(); it++) {
+ TQString gpgOutput = (*it);
+
+ if (gpgOutput.startsWith("uat")) {
+ hasPhoto=true;
+ }
+ if ( gpgOutput.startsWith("pub") ) {
TQString algo=gpgOutput.section(':',3,3);
switch( algo.toInt() ) {
case 1:
@@ -198,21 +222,39 @@ TQString gpgcmd="gpg --no-tty --no-secmem-warning --with-colon --with-fingerprin
prop->kLTrust->setText(tr);
prop->pixmapTrust->setPaletteBackgroundColor(trustColor);
- fullID=gpgOutput.section(':',4,4);
- displayedKeyID=fullID.right(8);
- prop->tLID->setText(fullID);
+ TQString fullID=gpgOutput.section(':',4,4);
+ displayedKeyID=fullID.right(8);
+ prop->tLID->setText(fullID);
- TQString fullname=gpgOutput.section(':',9,9);
+ fullname=gpgOutput.section(':',9,9);
- TQDate date = TQDate::fromString(gpgOutput.section(':',5,5), Qt::ISODate);
- prop->tLCreation->setText(TDEGlobal::locale()->formatDate(date));
+ TQDate date;
+ if (KgpgInterface::getGpgVersion() >= 210 ) {
+ TQDateTime timestamp;
+ timestamp.setTime_t(gpgOutput.section(':',5,5).toInt());
+ date = timestamp.date();
+ }
+ else {
+ date = TQDate::fromString(gpgOutput.section(':',5,5), Qt::ISODate);
+ }
+ Q_ASSERT ( date.isValid())/* tqWarning("create date is not valid")*/;
- if (gpgOutput.section(':',6,6).isEmpty()) expirationDate=i18n("Unlimited");
- else
- {
- date = TQDate::fromString(gpgOutput.section(':',6,6), Qt::ISODate);
- expirationDate=TDEGlobal::locale()->formatDate(date);
- }
+ prop->tLCreation->setText(TDEGlobal::locale()->formatDate(date));
+ if (gpgOutput.section(':',6,6).isEmpty()) {
+ expirationDate=i18n("Unlimited");
+ }
+ else {
+ if (KgpgInterface::getGpgVersion() >= 210 ) {
+ TQDateTime timestamp;
+ timestamp.setTime_t(gpgOutput.section(':',6,6).toInt());
+ date = timestamp.date();
+ }
+ else {
+ date = TQDate::fromString(gpgOutput.section(':',6,6), Qt::ISODate);
+ }
+ Q_ASSERT (date.isValid()) /* tqWarning("Expirationdate date is not valid")*/;
+ expirationDate=TDEGlobal::locale()->formatDate(date);
+ }
prop->tLExpiration->setText(expirationDate);
prop->tLLength->setText(gpgOutput.section(':',2,2));
@@ -240,7 +282,25 @@ TQString gpgcmd="gpg --no-tty --no-secmem-warning --with-colon --with-fingerprin
break;
}
prop->kCOwnerTrust->setCurrentItem(ownerTrust);
+ }
+
+ if ( gpgOutput.startsWith("uid") && fullname.isEmpty() ) {
+ fullname = gpgOutput.section(':',9,9);
+ }
+ if (gpgOutput.startsWith("fpr") && (fingervalue.isNull())) {
+ fingervalue=gpgOutput.section(':',9,9);
+ // format fingervalue in 4-digit groups
+ uint len = fingervalue.length();
+ if ((len > 0) && (len % 4 == 0)) {
+ for (uint n = 0; 4*(n+1) < len; n++) {
+ fingervalue.insert(5*n+4, ' ');
+ }
+ }
+ prop->lEFinger->setText(fingervalue);
+ }
+ }
+ if (!fullname.isEmpty()) {
if (fullname.find("<")!=-1) {
TQString kmail=fullname;
if (fullname.find(")")!=-1)
@@ -266,29 +326,20 @@ TQString gpgcmd="gpg --no-tty --no-secmem-warning --with-colon --with-fingerprin
prop->tLComment->setText(i18n("none"));
prop->tLName->setText("<qt><b>"+KgpgInterface::checkForUtf8(kname).replace(TQRegExp("<"),"&lt;")+"</b></qt>");
-
- }
- if (gpgOutput.startsWith("fpr") && (fingervalue.isNull())) {
- fingervalue=gpgOutput.section(':',9,9);
- // format fingervalue in 4-digit groups
- uint len = fingervalue.length();
- if ((len > 0) && (len % 4 == 0))
- for (uint n = 0; 4*(n+1) < len; n++)
- fingervalue.insert(5*n+4, ' ');
- prop->lEFinger->setText(fingervalue);
}
}
- pclose(pass);
}
void KgpgKeyInfo::slotSetMainPhoto(TQStringList list)
{
+// kdDebug(2100) << k_funcinfo << endl;
prop->comboId->insertStringList(list);
reloadMainPhoto(prop->comboId->currentText());
}
void KgpgKeyInfo::reloadMainPhoto(const TQString &uid)
{
+// kdDebug(2100) << k_funcinfo << endl;
kgpginfotmp=new KTempFile();
kgpginfotmp->setAutoDelete(true);
@@ -305,6 +356,7 @@ void KgpgKeyInfo::reloadMainPhoto(const TQString &uid)
void KgpgKeyInfo::slotMainImageRead(TDEProcess *p)
{
+// kdDebug(2100) << k_funcinfo << endl;
p->deleteLater();
TQPixmap pixmap;
pixmap.load(kgpginfotmp->name());
@@ -319,10 +371,11 @@ KgpgKeyInfo::~KgpgKeyInfo()
void KgpgKeyInfo::slotSetPhoto(const TQPixmap &pix)
{
-TQImage dup=pix.convertToImage();
-TQPixmap dup2;
-dup2.convertFromImage(dup.scale(prop->pLPhoto->width(),prop->pLPhoto->height(),TQ_ScaleMin));
-prop->pLPhoto->setPixmap(dup2);
+// kdDebug(2100) << k_funcinfo << endl;
+ TQImage dup=pix.convertToImage();
+ TQPixmap dup2;
+ dup2.convertFromImage(dup.scale(prop->pLPhoto->width(),prop->pLPhoto->height(),TQ_ScaleMin));
+ prop->pLPhoto->setPixmap(dup2);
}
@@ -330,6 +383,7 @@ prop->pLPhoto->setPixmap(dup2);
void KgpgKeyInfo::finishphotoreadprocess(KProcIO *p)
{
+// kdDebug(2100) << k_funcinfo << endl;
TQString required=TQString();
while (p->readln(required,true)!=-1)
if (required.find("keyedit.prompt")!=-1) {
@@ -342,6 +396,7 @@ void KgpgKeyInfo::finishphotoreadprocess(KProcIO *p)
void KgpgKeyInfo::openPhoto()
{
+// kdDebug(2100) << k_funcinfo << endl;
TDETrader::OfferList offers = TDETrader::self()->query("image/jpeg", "Type == 'Application'");
KService::Ptr ptr = offers.first();
//KMessageBox::sorry(0,ptr->desktopEntryName());
@@ -352,61 +407,69 @@ void KgpgKeyInfo::openPhoto()
void KgpgKeyInfo::slotChangeExp()
{
-chdate=new KDialogBase( this, "choose_date", true,i18n("Choose New Expiration"),KDialogBase::Ok | KDialogBase::Cancel);
-TQWidget *page = new TQWidget(chdate);
-kb= new TQCheckBox(i18n("Unlimited"),page );
-
-if (prop->tLExpiration->text()==i18n("Unlimited"))
-{
-kdt= new KDatePicker( page );
-kb->setChecked(true);
-kdt->setEnabled(false);
-}
-else
-kdt= new KDatePicker(page,TDEGlobal::locale()->readDate(prop->tLExpiration->text()));
-TQVBoxLayout *vbox=new TQVBoxLayout(page,3);
-vbox->addWidget(kdt);
-vbox->addWidget(kb);
-connect(kb,TQT_SIGNAL(toggled(bool)),this,TQT_SLOT(slotEnableDate(bool)));
-connect(chdate,TQT_SIGNAL(okClicked()),this,TQT_SLOT(slotChangeDate()));
-connect(kdt,TQT_SIGNAL(dateChanged(TQDate)),this,TQT_SLOT(slotCheckDate(TQDate)));
-connect(kdt,TQT_SIGNAL(dateEntered(TQDate)),this,TQT_SLOT(slotCheckDate(TQDate)));
-
-chdate->setMainWidget(page);
-chdate->show();
+// kdDebug(2100) << k_funcinfo << endl;
+ chdate=new KDialogBase( this, "choose_date", true,i18n("Choose New Expiration"),KDialogBase::Ok | KDialogBase::Cancel);
+ TQWidget *page = new TQWidget(chdate);
+ kb= new TQCheckBox(i18n("Unlimited"),page );
+
+ if (prop->tLExpiration->text()==i18n("Unlimited")) {
+ kdt= new KDatePicker( page );
+ kb->setChecked(true);
+ kdt->setEnabled(false);
+ }
+ else {
+ kdt= new KDatePicker(page,TDEGlobal::locale()->readDate(prop->tLExpiration->text()));
+ }
+ TQVBoxLayout *vbox=new TQVBoxLayout(page,3);
+ vbox->addWidget(kdt);
+ vbox->addWidget(kb);
+ connect(kb,TQT_SIGNAL(toggled(bool)),this,TQT_SLOT(slotEnableDate(bool)));
+ connect(chdate,TQT_SIGNAL(okClicked()),this,TQT_SLOT(slotChangeDate()));
+ connect(kdt,TQT_SIGNAL(dateChanged(TQDate)),this,TQT_SLOT(slotCheckDate(TQDate)));
+ connect(kdt,TQT_SIGNAL(dateEntered(TQDate)),this,TQT_SLOT(slotCheckDate(TQDate)));
+
+ chdate->setMainWidget(page);
+ chdate->show();
}
void KgpgKeyInfo::slotCheckDate(TQDate date)
{
-chdate->enableButtonOK(date>=TQDate::currentDate ());
+// kdDebug(2100) << k_funcinfo << endl;
+// kdDebug(2100) << "slotCheckDate" << date<<endl;
+ chdate->enableButtonOK(date>=TQDate::currentDate ());
}
void KgpgKeyInfo::slotChangeDate()
{
-KgpgInterface *KeyExpirationProcess=new KgpgInterface();
- if (kb->isChecked())
- KeyExpirationProcess->KgpgKeyExpire(displayedKeyID,TQDate::currentDate(),true);
- else
+// kdDebug(2100) << k_funcinfo << endl;
+ KgpgInterface *KeyExpirationProcess=new KgpgInterface();
+// kdDebug(2100) << "slotChangeDate" << kdt->date()<<endl;
+ if (kb->isChecked()) {
+ KeyExpirationProcess->KgpgKeyExpire(displayedKeyID,TQDate::currentDate(),true);
+ }
+ else {
KeyExpirationProcess->KgpgKeyExpire(displayedKeyID,kdt->date(),false);
- connect(KeyExpirationProcess,TQT_SIGNAL(expirationFinished(int)),this,TQT_SLOT(slotInfoExpirationChanged(int)));
+ }
+ connect(KeyExpirationProcess,TQT_SIGNAL(expirationFinished(int)),this,TQT_SLOT(slotInfoExpirationChanged(int)));
}
void KgpgKeyInfo::slotEnableDate(bool isOn)
{
-if (isOn)
-{
-kdt->setEnabled(false);
-chdate->enableButtonOK(true);
-}
-else
-{
-kdt->setEnabled(true);
-chdate->enableButtonOK(kdt->date()>=TQDate::currentDate ());
-}
+// kdDebug(2100) << k_funcinfo << endl;
+ if (isOn) {
+ kdt->setEnabled(false);
+ chdate->enableButtonOK(true);
+ }
+ else {
+ kdt->setEnabled(true);
+ //kdDebug(2100) << "slotEnableDate" << kdt->date()<<endl;
+ chdate->enableButtonOK(kdt->date()>=TQDate::currentDate ());
+ }
}
void KgpgKeyInfo::slotinfoimgread(TDEProcess *)
{
+// kdDebug(2100) << k_funcinfo << endl;
TQPixmap pixmap;
pixmap.load(kgpginfotmp->name());
emit signalPhotoId(pixmap);
@@ -415,13 +478,15 @@ void KgpgKeyInfo::slotinfoimgread(TDEProcess *)
void KgpgKeyInfo::slotChangePass()
{
- KgpgInterface *ChangeKeyPassProcess=new KgpgInterface();
- ChangeKeyPassProcess->KgpgChangePass(displayedKeyID);
+// kdDebug(2100) << k_funcinfo << endl;
+ KgpgInterface *ChangeKeyPassProcess=new KgpgInterface();
+ ChangeKeyPassProcess->KgpgChangePass(displayedKeyID);
connect(ChangeKeyPassProcess,TQT_SIGNAL(passwordChanged()),this,TQT_SLOT(slotInfoPasswordChanged()));
}
void KgpgKeyInfo::slotChangeTrust(int newTrust)
{
+// kdDebug(2100) << k_funcinfo << endl;
KgpgInterface *KeyTrustProcess=new KgpgInterface();
KeyTrustProcess->KgpgTrustExpire(displayedKeyID,newTrust);
connect(KeyTrustProcess,TQT_SIGNAL(trustfinished()),this,TQT_SLOT(slotInfoTrustChanged()));
@@ -430,36 +495,45 @@ void KgpgKeyInfo::slotChangeTrust(int newTrust)
void KgpgKeyInfo::slotInfoPasswordChanged()
{
-KPassivePopup::message(i18n("Passphrase for the key was changed"),TQString(),TDEGlobal::iconLoader()->loadIcon("kgpg",TDEIcon::Desktop),this);
+// kdDebug(2100) << k_funcinfo << endl;
+ KPassivePopup::message(i18n("Passphrase for the key was changed"),TQString(),TDEGlobal::iconLoader()->loadIcon("kgpg",TDEIcon::Desktop),this);
}
void KgpgKeyInfo::slotInfoTrustChanged()
{
-keyWasChanged=true;
-loadKey(displayedKeyID);
-//KPassivePopup::message(i18n("Owner trust of the key was changed"),TQString(),TDEGlobal::iconLoader()->loadIcon("kgpg",TDEIcon::Desktop),this,0,600);
+ keyWasChanged=true;
+ loadKey(displayedKeyID);
+ //KPassivePopup::message(i18n("Owner trust of the key was changed"),TQString(),TDEGlobal::iconLoader()->loadIcon("kgpg",TDEIcon::Desktop),this,0,600);
}
void KgpgKeyInfo::slotInfoExpirationChanged(int res)
{
-TQString infoMessage,infoText;
-if (res==3)
-{
-keyWasChanged=true;
-if (kb->isChecked()) prop->tLExpiration->setText(i18n("Unlimited"));
-else prop->tLExpiration->setText(TDEGlobal::locale()->formatDate(kdt->date()));
-}
-if (res==2) {
-infoMessage=i18n("Could not change expiration");infoText=i18n("Bad passphrase");
-KPassivePopup::message(infoMessage,infoText,TDEGlobal::iconLoader()->loadIcon("kgpg",TDEIcon::Desktop),this);
-}
+// kdDebug(2100) << k_funcinfo << endl;
+ TQString infoMessage,infoText;
+ if (res==3) {
+ keyWasChanged=true;
+ if (kb->isChecked()) {
+ prop->tLExpiration->setText(i18n("Unlimited"));
+ }
+ else {
+ prop->tLExpiration->setText(TDEGlobal::locale()->formatDate(kdt->date()));
+ }
+ }
+ if (res==2) {
+ infoMessage=i18n("Could not change expiration");
+ infoText=i18n("Bad passphrase");
+ KPassivePopup::message(infoMessage,infoText,TDEGlobal::iconLoader()->loadIcon("kgpg",TDEIcon::Desktop),this);
+ }
}
void KgpgKeyInfo::slotPreOk()
{
-if (keyWasChanged) emit keyNeedsRefresh();
-accept();
+// kdDebug(2100) << k_funcinfo << endl;
+ if (keyWasChanged) {
+ emit keyNeedsRefresh();
+ }
+ accept();
}
#include "keyinfowidget.moc"
diff --git a/kgpg/keyservers.cpp b/kgpg/keyservers.cpp
index 364de3a..9442653 100644
--- a/kgpg/keyservers.cpp
+++ b/kgpg/keyservers.cpp
@@ -4,6 +4,10 @@
begin : Tue Nov 26 2002
copyright : (C) 2002 by Jean-Baptiste Mardelle
email : bj@altern.org
+
+ updated to handle gpg21 : Sun Jul 30 10:18:29 CEST 2017
+ copyright : (C) 2017 by Emanoil Kotsev
+ email : deloptes@yahoo.com
***************************************************************************/
/***************************************************************************
@@ -61,34 +65,40 @@ keyServer::keyServer(TQWidget *parent, const char *name,bool modal,bool autoClos
syncCombobox();
page->kLEimportid->setFocus();
+ currentKey = TQString();
+ hashMap.clear();
connect(page->Buttonimport,TQT_SIGNAL(clicked()),this,TQT_SLOT(slotImport()));
connect(page->Buttonsearch,TQT_SIGNAL(clicked()),this,TQT_SLOT(slotSearch()));
connect(page->Buttonexport,TQT_SIGNAL(clicked()),this,TQT_SLOT(slotPreExport()));
connect(this,TQT_SIGNAL(okClicked()),this,TQT_SLOT(slotOk()));
- connect(page->cBproxyI,TQT_SIGNAL(toggled(bool)),this,TQT_SLOT(slotEnableProxyI(bool)));
- connect(page->cBproxyE,TQT_SIGNAL(toggled(bool)),this,TQT_SLOT(slotEnableProxyE(bool)));
-
- connect(page->kLEimportid, TQT_SIGNAL( textChanged ( const TQString & )), this, TQT_SLOT( slotTextChanged( const TQString &)));
- page->cBproxyI->setChecked(KGpgSettings::useProxy());
- page->cBproxyE->setChecked(KGpgSettings::useProxy());
- const char *httpproxy = getenv("http_proxy");
- if (httpproxy) {
- page->cBproxyI->setEnabled(true);
- page->cBproxyE->setEnabled(true);
- page->kLEproxyI->setText(httpproxy);
- page->kLEproxyE->setText(httpproxy);
- }
+ if (KgpgInterface::getGpgVersion() < 210 ) { // was removed in 2.1
+ connect(page->cBproxyI,TQT_SIGNAL(toggled(bool)),this,TQT_SLOT(slotEnableProxyI(bool)));
+ connect(page->cBproxyE,TQT_SIGNAL(toggled(bool)),this,TQT_SLOT(slotEnableProxyE(bool)));
+ }
+ connect(page->kLEimportid, TQT_SIGNAL( textChanged ( const TQString & )), this, TQT_SLOT( slotTextChanged( const TQString &)));
+ if (KgpgInterface::getGpgVersion() < 210 ) { // was removed in 2.1
+ page->cBproxyI->setChecked(KGpgSettings::useProxy());
+ page->cBproxyE->setChecked(KGpgSettings::useProxy());
+ const char *httpproxy = getenv("http_proxy");
+ if (httpproxy) {
+ page->cBproxyI->setEnabled(true);
+ page->cBproxyE->setEnabled(true);
+ page->kLEproxyI->setText(httpproxy);
+ page->kLEproxyE->setText(httpproxy);
+ }
+ }
KProcIO *encid=new KProcIO(TQTextCodec::codecForLocale());
*encid << "gpg"<<"--no-secmem-warning"<<"--no-tty"<<"--with-colon"<<"--list-keys";
+ TQObject::connect(encid, TQT_SIGNAL(processExited(TDEProcess *)),this, TQT_SLOT(slotprocresult(TDEProcess *)));
TQObject::connect(encid, TQT_SIGNAL(readReady(KProcIO *)),this, TQT_SLOT(slotprocread(KProcIO *)));
encid->start(TDEProcess::NotifyOnExit,true);
page->Buttonimport->setEnabled( !page->kLEimportid->text().isEmpty());
page->Buttonsearch->setEnabled( !page->kLEimportid->text().isEmpty());
-setMinimumSize(sizeHint());
+ setMinimumSize(sizeHint());
}
@@ -98,6 +108,7 @@ keyServer::~keyServer()
void keyServer::slotTextChanged( const TQString &text)
{
+// kdDebug(2100) << k_funcinfo << endl;
page->Buttonimport->setEnabled( !text.isEmpty());
page->Buttonsearch->setEnabled( !text.isEmpty());
@@ -112,19 +123,39 @@ void keyServer::slotEnableProxyE(bool on)
page->kLEproxyE->setEnabled(on);
}
-
-
void keyServer::slotprocread(KProcIO *p)
{
+// kdDebug(2100) << k_funcinfo << endl;
///////////////////////////////////////////////////////////////// extract encryption keys
- bool dead;
TQString tst;
//TQPixmap pixkeySingle(TDEGlobal::iconLoader()->loadIcon("kgpg_key1",TDEIcon::Small,20));
while (p->readln(tst)!=-1) {
- //tst=tst.stripWhiteSpace();
- if (tst.startsWith("pub")) {
- const TQString trust=tst.section(':',1,1);
- TQString id=TQString("0x"+tst.section(':',4,4).right(8));
+// kdDebug(2100) << k_funcinfo << "Read one public key line: " << tst << endl;
+ if ( tst.startsWith("pub") ) {
+ currentKey = tst.section(':',4,4).right(8);
+ TQStringList lst; lst << tst;
+ hashMap.insert(currentKey,tst);
+ }
+ else {
+ hashMap.find(currentKey).data().append(tst);
+ }
+ }
+}
+
+void keyServer::slotprocresult(TDEProcess *) {
+
+ TQMap<TQString,TQString> hashImportList;
+
+ TQMap<TQString,TQStringList>::Iterator ite;
+ for (ite = hashMap.begin(); ite != hashMap.end(); ite++) {
+ TQString fullname,id;
+ bool dead;
+
+ for (TQStringList::Iterator it = ite.data().begin(); it != ite.data().end(); it++) {
+ TQString line = (*it);
+// kdDebug(2100) << k_funcinfo << "Export line: " <<line<< endl;
+ if (line.startsWith("pub")) {
+ const TQString trust=line.section(':',1,1);
switch( trust[0] ) {
case 'i':
dead=true;
@@ -142,20 +173,44 @@ void keyServer::slotprocread(KProcIO *p)
dead=false;
break;
}
- tst=tst.section(':',9,9);
- if (tst.length()>35) {
- tst.remove(35,tst.length());
- tst+="...";
- }
- if ((!dead) && (!tst.isEmpty()))
-// page->kCBexportkey->insertItem(pixkeySingle,id+": "+tst);
- page->kCBexportkey->insertItem(id+": "+tst);
- }
- }
+ fullname = line.section(':',9,9);
+ id = "0x"+line.section(':',4,4).right(8);
+ }
+ if ( line.startsWith("uid") && fullname.isEmpty() ) {
+ fullname = line.section(':',9,9);
+ }
+ }
+// if (fullname.length()>35) {
+// fullname.remove(35,fullname.length());
+// fullname+="...";
+// }
+
+ TQString tst;
+ if (fullname.find("<",0)!=-1) {
+ tst=fullname.section('<',0,0);
+ }
+
+ if (!tst.isEmpty()) {
+ fullname = tst;
+ }
+
+ if ((!dead) && (!fullname.isEmpty())) {
+ if ( hashImportList.find(id) == hashImportList.end() ) {
+ hashImportList.insert(fullname,id);
+ }
+ }
+ }
+
+ for (TQMap<TQString,TQString>::Iterator ite = hashImportList.begin(); ite != hashImportList.end() ; ite++) {
+ // page->kCBexportkey->insertItem(pixkeySingle,id+": "+tst);
+ page->kCBexportkey->insertItem(ite.data()+": "+ite.key());
+ }
+
}
void keyServer::slotSearch()
{
+// kdDebug(2100) << k_funcinfo << endl;
if (page->kCBimportks->currentText().isEmpty())
return;
@@ -164,7 +219,13 @@ void keyServer::slotSearch()
return;
}
- //listpop = new KeyServer( this,"result",WType_Dialog | WShowModal);
+ currentKey = TQString();
+ //listpop = new KeyServer( this,"result",WType_Dialog | WShowModal);
+ hashMap.clear();
+ invalidKeys.clear();
+ keyNumbers=0;
+ count=0;
+ readmessage=TQString();
dialogServer=new KDialogBase(KDialogBase::Swallow, i18n("Import Key From Keyserver"), KDialogBase::Ok | KDialogBase::Close,KDialogBase::Ok,this,0,true);
@@ -182,24 +243,30 @@ void keyServer::slotSearch()
connect(dialogServer,TQT_SIGNAL(closeClicked()),this,TQT_SLOT(handleQuit()));
connect( listpop , TQT_SIGNAL( destroyed() ) , this, TQT_SLOT( abortSearch()));
- count=0;
- cycle=false;
- readmessage=TQString();
+
searchproc=new KProcIO(TQTextCodec::codecForLocale());
TQString keyserv=page->kCBimportks->currentText();
- *searchproc<<"gpg"<<"--utf8-strings";
- if (page->cBproxyI->isChecked()) {
- searchproc->setEnvironment("http_proxy",page->kLEproxyI->text());
- *searchproc<< "--keyserver-options"<<"honor-http-proxy";
- } else
- *searchproc<< "--keyserver-options"<<"no-honor-http-proxy";
- *searchproc<<"--keyserver"<<keyserv<<"--command-fd=0"<<"--status-fd=2"<<"--search-keys"<<page->kLEimportid->text().stripWhiteSpace();
+
+ *searchproc<<"gpg"<<"--utf8-strings"/*<<"--no-tty"*/;
+ if (KgpgInterface::getGpgVersion() < 210 ) { // was removed in 2.1
+ if (page->cBproxyI->isChecked()) {
+ searchproc->setEnvironment("http_proxy",page->kLEproxyI->text());
+ *searchproc<< "--keyserver-options"<<"honor-http-proxy";
+ }
+ else {
+ *searchproc<< "--keyserver-options"<<"no-honor-http-proxy";
+ }
+ }
+ *searchproc<<"--keyserver"<<keyserv<<"--command-fd=0"<<"--with-colon";
+ *searchproc<<"--status-fd=2"<<"--search-keys"<<page->kLEimportid->text().stripWhiteSpace();
keyNumbers=0;
+ TQApplication::setOverrideCursor(TQCursor(TQt::BusyCursor));
TQObject::connect(searchproc, TQT_SIGNAL(processExited(TDEProcess *)),this, TQT_SLOT(slotsearchresult(TDEProcess *)));
TQObject::connect(searchproc, TQT_SIGNAL(readReady(KProcIO *)),this, TQT_SLOT(slotsearchread(KProcIO *)));
+ searchproc->setUsePty(TDEProcess::Stdout,false); // EKO: very important line - it took me a day to find out why I should use it
searchproc->start(TDEProcess::NotifyOnExit,true);
- TQApplication::setOverrideCursor(TQCursor(TQt::BusyCursor));
+
dialogServer->setMainWidget(listpop);
listpop->setMinimumSize(listpop->sizeHint());
listpop->setMinimumWidth(550);
@@ -208,9 +275,11 @@ void keyServer::slotSearch()
void keyServer::handleQuit()
{
+// kdDebug(2100) << k_funcinfo << endl;
if (searchproc->isRunning())
{
TQApplication::restoreOverrideCursor();
+ searchproc->closePty();
disconnect(searchproc,0,0,0);
searchproc->kill();
}
@@ -220,6 +289,7 @@ void keyServer::handleQuit()
void keyServer::abortSearch()
{
+// kdDebug(2100) << k_funcinfo << endl;
if (dialogServer) {
delete dialogServer;
dialogServer=0L;
@@ -228,6 +298,7 @@ void keyServer::abortSearch()
void keyServer::preimport()
{
+// kdDebug(2100) << k_funcinfo << endl;
transferKeyID();
if (listpop->kLEID->text().isEmpty()) {
KMessageBox::sorry(this,i18n("You must choose a key."));
@@ -240,6 +311,7 @@ void keyServer::preimport()
void keyServer::transferKeyID()
{
+// kdDebug(2100) << k_funcinfo << endl;
if (!listpop->kLVsearch->firstChild())
return;
TQString kid,keysToSearch;
@@ -255,9 +327,167 @@ void keyServer::transferKeyID()
listpop->kLEID->setText(keysToSearch.stripWhiteSpace());
}
+void keyServer::slotsearchread(KProcIO *p)
+{
+// kdDebug(2100) << k_funcinfo << endl;
+ TQString required = TQString();
+
+ while (p->readln(required,true)!=-1) {
+ // kdDebug(2100) << "\tRead one search key line: " << required << endl;
+ if (required.find("keysearch.prompt")!=-1) {
+ p->setComm(TDEProcess::Stdin);
+ if (KgpgInterface::getGpgVersion() < 210) {
+ if (count != 1) {
+ p->writeStdin(TQString("N"));
+ }
+ else {
+ p->writeStdin(TQString("Q"));
+ p->closeWhenDone();
+ }
+ }
+ else {
+ p->writeStdin(TQString("N")); // in 2.1 pressing N ends the session if output is empty
+// if (count == 1)
+// p->closeWhenDone();
+ }
+ p->setComm(TDEProcess::Stdout);
+ required = TQString();
+ continue;
+ }
+ if ( required.isEmpty() ) {
+ continue;
+ }
+ if ( required.find("GOT_IT")!=-1 ) {
+ required = TQString();
+ continue;
+ }
+
+ if ( required.startsWith("info") ) {
+ count = required.section(':',2,2).toInt();
+ required = TQString();
+ continue;
+ }
+ if ( required.startsWith("pub") ) {
+ currentKey = required.section(':',1,1).right(8);
+ if ( hashMap.find(currentKey) == hashMap.end() ) {
+ TQStringList lst; lst.append(required.simplifyWhiteSpace());
+ hashMap.insert(currentKey,lst);
+ count--;
+ }
+ else {
+ hashMap.find(currentKey).data().append(required.simplifyWhiteSpace());
+ }
+ required = TQString();
+ }
+ else {
+ hashMap.find(currentKey).data().append(required.simplifyWhiteSpace());
+ required = TQString();
+ }
+ }
+}
+
void keyServer::slotsearchresult(TDEProcess *)
{
- TQString nb;
+// kdDebug(2100) << k_funcinfo << endl;
+ TQString nb;
+
+ // check if key is valid
+ for (TQMap<TQString,TQStringList>::Iterator ite = hashMap.begin(); ite != hashMap.end() ; ite++) {
+ TQStringList::Iterator it;
+ bool skip=false;
+ // this is to prevent offering to import expired or revoked keys
+ // first find out if key is revoked or expired
+ for (it = ite.data().begin(); it != ite.data().end(); it++ ) {
+ TQStringList keyString=TQStringList::split(":",(*it),true);
+ // kdDebug(2100) << k_funcinfo << "Key line: " << (*it) << endl;
+ if (keyString[0] == "pub") {
+ if (! keyString[6].isEmpty() ) {
+ if (keyString[6] == "r") {
+ skip = true;
+ }
+ }
+ if (! keyString[5].isEmpty() ) { // expiration date
+ TQDate date;
+ if (KgpgInterface::getGpgVersion() >= 210 ) {
+ TQDateTime timestamp;
+ timestamp.setTime_t( keyString[5].toInt() );
+ date = timestamp.date();
+ }
+ else {
+ date = TQDate::fromString(keyString[5], Qt::ISODate);
+ }
+ Q_ASSERT (date.isValid()) /*tqWarning("create date is not valid")*/;
+ if (date < TQDate::currentDate() ) {
+ skip = true;
+ }
+ }
+ }
+ }
+ if (skip) {
+ invalidKeys<<ite.key();
+ }
+ }
+
+ for (TQMap<TQString,TQStringList>::Iterator ite = hashMap.begin(); ite != hashMap.end() ; ite++) {
+ if (invalidKeys.find(ite.key()) != invalidKeys.end() ) {
+ continue;
+ }
+ // very good our keys is neither revoken nor expired - we can offer it for download
+ for (TQStringList::Iterator it = ite.data().begin(); it != ite.data().end(); it++ ) {
+ TQStringList keyString=TQStringList::split(":",(*it),true);
+ // kdDebug(2100) << k_funcinfo << "Processing key line: " << (*it) << endl;
+ TQString created;
+ if (keyString[0] == "pub") {
+ if (! keyString[4].isEmpty() ) {
+ TQDate date;
+ if (KgpgInterface::getGpgVersion() >= 210 ) {
+ TQDateTime timestamp;
+ timestamp.setTime_t( keyString[4].toInt() );
+ date = timestamp.date();
+ }
+ else {
+ date = TQDate::fromString(keyString[4], Qt::ISODate);
+ }
+ created=TDEGlobal::locale()->formatDate(date, true);
+ }
+ kitem=new TDEListViewItem(listpop->kLVsearch,TQString(),TQString(), created, keyString[1]);
+ keyNumbers++;
+ }
+ if (keyString[0] == "uid") {
+ TQString keymail,keyname;
+ if (! keyString[2].isEmpty() ) {
+ TQDate date;
+ if (KgpgInterface::getGpgVersion() >= 210 ) {
+ TQDateTime timestamp;
+ timestamp.setTime_t( keyString[2].toInt() );
+ date = timestamp.date();
+ }
+ else {
+ date = TQDate::fromString(keyString[2], Qt::ISODate);
+ }
+ created=TDEGlobal::locale()->formatDate(date, true);
+ }
+ if (keyString[1].find("<")!=-1) {
+ keymail=keyString[1].section('<',-1,-1);
+ if (keymail.endsWith(">")) {
+ keymail.truncate(keymail.length()-1);
+ }
+ keyname=keyString[1].section('<',0,0);
+ }
+ else {
+ keymail=TQString();
+ keyname=keyString[1];
+ }
+ if (kitem != 0 ) {
+ kitem->setText(0,keyname);
+ //if ( kitem->getText(1).isEmpty() ) kitem->setText(1,keymail);
+ TDEListViewItem *subk = new TDEListViewItem(kitem,keyname,keymail,created,TQString());
+ subk->setSelectable(false);
+ }
+ }
+ }
+ }
+
dialogServer->enableButtonOK(true);
TQApplication::restoreOverrideCursor();
nb=nb.setNum(keyNumbers);
@@ -271,98 +501,36 @@ void keyServer::slotsearchresult(TDEProcess *)
}
}
-void keyServer::slotsearchread(KProcIO *p)
-{
- TQString required;
- TQString keymail,keyname;
- while (p->readln(required,true)!=-1) {
- //required=TQString::fromUtf8(required);
-
- if (required.find("keysearch.prompt")!=-1) {
- if (count<4)
- p->writeStdin(TQString("N"));
- else {
- p->writeStdin(TQString("Q"));
- p->closeWhenDone();
- }
- required=TQString();
- }
-
- if (required.find("GOT_IT")!=-1) {
- count++;
- required=TQString();
- }
-
- if (required.find("(")==0) {
- cycle=true;
- TQString fullname=required.remove(0,required.find(")")+1).stripWhiteSpace();
- if (fullname.find("<")!=-1) {
- keymail=fullname.section('<',-1,-1);
- if (keymail.endsWith(">")) keymail.truncate(keymail.length()-1);
- keyname=fullname.section('<',0,0);
- } else {
- keymail=TQString();
- keyname=fullname;
- }
- kitem=new TDEListViewItem(listpop->kLVsearch,keyname,keymail,TQString(),TQString());
- keyNumbers++;
- count=0;
- required=TQString();
- }
-
- if ((cycle) && (!required.isEmpty())) {
- TQString subkey=required.stripWhiteSpace();
- if (subkey.find(" key ")!=-1 && subkey.at(0).isDigit ())
- {
- TQString kid=subkey.section(",",0,0).stripWhiteSpace();
- kid=kid.right(8);
- kitem->setText(3,kid);
- TQString creation=subkey.section("created",1,1);
- if (creation.startsWith(":")) creation=creation.right(creation.length()-1);
- kitem->setText(2,creation);
- cycle=false;
- }
- else
- {
- if (subkey.find("<")!=-1) {
- keymail=subkey.section('<',-1,-1);
- if (keymail.endsWith(">")) keymail.truncate(keymail.length()-1);
- keyname=subkey.section('<',0,0);
- } else {
- keymail=TQString();
- keyname=subkey;
- }
- TDEListViewItem *subk = new TDEListViewItem(kitem,keyname,keymail,TQString(),TQString());
- subk->setSelectable(false);
- }
- required=TQString();
- }
- }
-}
-
void keyServer::slotPreExport()
{
+// kdDebug(2100) << k_funcinfo << endl;
slotExport(TQStringList(page->kCBexportkey->currentText().section(':', 0, 0)));
}
void keyServer::slotExport(TQStringList keyIds)
{
+// kdDebug(2100) << k_funcinfo << endl;
if (page->kCBexportks->currentText().isEmpty())
return;
readmessage=TQString();
+ hashMap.clear();
exportproc=new KProcIO(TQTextCodec::codecForLocale());
TQString keyserv=page->kCBexportks->currentText();
- *exportproc<<"gpg"<<"--utf8-strings";
- if (!page->exportAttributes->isChecked())
- *exportproc<<"--export-options"<<"no-include-attributes";
-
- if (page->cBproxyE->isChecked()) {
- exportproc->setEnvironment("http_proxy",page->kLEproxyE->text());
- *exportproc<< "--keyserver-options"<<"honor-http-proxy";
- } else
- *exportproc<< "--keyserver-options"<<"no-honor-http-proxy";
- *exportproc << "--status-fd=2" << "--keyserver" << keyserv << "--send-keys" << keyIds;
+ *exportproc<<"gpg"<<"--utf8-strings";
+ if (!page->exportAttributes->isChecked()) {
+ *exportproc<<"--export-options"<<"no-include-attributes";
+ }
+ if (KgpgInterface::getGpgVersion() < 210 ) { // was removed in 2.1
+ if (page->cBproxyE->isChecked()) {
+ exportproc->setEnvironment("http_proxy",page->kLEproxyE->text());
+ *exportproc<< "--keyserver-options"<<"honor-http-proxy";
+ }
+ else {
+ *exportproc<< "--keyserver-options"<<"no-honor-http-proxy";
+ }
+ }
+ *exportproc << "--status-fd=2" << "--keyserver" << keyserv << "--send-keys" << keyIds;
TQObject::connect(exportproc, TQT_SIGNAL(processExited(TDEProcess *)),this, TQT_SLOT(slotexportresult(TDEProcess *)));
TQObject::connect(exportproc, TQT_SIGNAL(readReady(KProcIO *)),this, TQT_SLOT(slotimportread(KProcIO *)));
@@ -384,6 +552,7 @@ void keyServer::slotExport(TQStringList keyIds)
void keyServer::abortExport()
{
+// kdDebug(2100) << k_funcinfo << endl;
TQApplication::restoreOverrideCursor();
if (exportproc->isRunning())
{
@@ -394,48 +563,112 @@ void keyServer::abortExport()
void keyServer::slotexportresult(TDEProcess*)
{
+// kdDebug(2100) << k_funcinfo << endl;
TQApplication::restoreOverrideCursor();
KMessageBox::information(0,readmessage);
if (importpop)
delete importpop;
}
-
void keyServer::slotImport()
{
+// kdDebug(2100) << k_funcinfo << endl;
if (page->kCBimportks->currentText().isEmpty())
return;
if (page->kLEimportid->text().isEmpty()) {
- KMessageBox::sorry(this,i18n("You must enter a search string."));
+ KMessageBox::sorry(this,i18n("You must select a valid key for import"));
return;
}
- readmessage=TQString();
- importproc=new KProcIO(TQTextCodec::codecForLocale());
- TQString keyserv=page->kCBimportks->currentText();
- *importproc<<"gpg"<<"--utf8-strings";
- if (page->cBproxyI->isChecked()) {
- importproc->setEnvironment("http_proxy",page->kLEproxyI->text());
- *importproc<< "--keyserver-options"<<"honor-http-proxy";
- } else
- *importproc<< "--keyserver-options"<<"no-honor-http-proxy";
+// kdDebug(2100) << k_funcinfo << "Asked for import: " <<page->kLEimportid->text() <<endl;
+
+ readmessage=TQString();
+ count=0;
+ hashMap.clear();
+ invalidKeys.clear();
+ keysToImport.clear();
+ TQString keyserv=page->kCBimportks->currentText();
+/*
+ *
+ * This function is called from search and from signature import
+ * so we need to make sure we have a valid keys for import
+ * When import is triggered from the search key dialog, we alread have the full ids
+ * When import is triggered from the signature import popup, we have names, but only
+ * if single signature is select we can import from the server
+ *
+ * search the keys first and pass the full pub key ids to the importproc
+ * to prevent importing pub keys for revocation and normal pub keys together
+ * we check to see if key is marked as revoc and look for another key that would
+ * be associated with the revoking one, so we skip both key and everything that
+ * belongs to this public key
+ *
+ * we also check the expiration date and refuse to import expired keys
+ *
+ */
- *importproc<<"--status-fd=2"<<"--keyserver"<<keyserv<<"--recv-keys";
TQString keyNames=page->kLEimportid->text();
keyNames=keyNames.stripWhiteSpace();
keyNames=keyNames.simplifyWhiteSpace();
- while (!keyNames.isEmpty()) {
- TQString fkeyNames=keyNames.section(' ',0,0);
- keyNames.remove(0,fkeyNames.length());
- keyNames=keyNames.stripWhiteSpace();
- *importproc<<TQString(TQFile::encodeName(fkeyNames));
- }
- TQObject::connect(importproc, TQT_SIGNAL(processExited(TDEProcess *)),this, TQT_SLOT(slotimportresult(TDEProcess *)));
- TQObject::connect(importproc, TQT_SIGNAL(readReady(KProcIO *)),this, TQT_SLOT(slotimportread(KProcIO *)));
+ if ( keyNames.startsWith("0x") ) {
+ searchproc=new KProcIO(TQTextCodec::codecForLocale());
+ *searchproc << "gpg"<<"--utf8-strings"<<"--no-secmem-warning";
+ if (KgpgInterface::getGpgVersion() < 210 ) { // was removed in 2.1
+ if (page->cBproxyI->isChecked()) {
+ searchproc->setEnvironment("http_proxy",page->kLEproxyI->text());
+ *searchproc << "--keyserver-options"<<"honor-http-proxy";
+ }
+ else {
+ *searchproc << "--keyserver-options"<<"no-honor-http-proxy";
+ }
+ }
+ *searchproc << "--keyserver" << keyserv << "--status-fd=2" /*<<"--debug-level"<<"guru"*/;
+ *searchproc << "--command-fd=0" << "--with-colon" << "--search-keys";
+
+ while (!keyNames.isEmpty()) {
+ TQString fkeyNames=keyNames.section(' ',0,0);
+ keyNames.remove(0,fkeyNames.length());
+ keyNames=keyNames.stripWhiteSpace();
+ *searchproc<< TQString(TQFile::encodeName(fkeyNames));
+ }
+ TQObject::connect(searchproc, TQT_SIGNAL(processExited(TDEProcess *)),TQT_TQOBJECT(this), TQT_SLOT(slotksearchprocresult(TDEProcess *)));
+ TQObject::connect(searchproc, TQT_SIGNAL(readReady(KProcIO *)),TQT_TQOBJECT(this), TQT_SLOT(slotsearchread(KProcIO *)));
+ TQApplication::setOverrideCursor(TQCursor(TQt::BusyCursor));
+ searchproc->setUsePty(TDEProcess::Stdout,false); // EKO: very important line - it took me a day to find out why I should use it
+ searchproc->start(TDEProcess::Block,true);
+ if (searchproc->isRunning()) {
+ searchproc->closePty();
+ disconnect(searchproc,0,0,0);
+ searchproc->kill();
+ }
+ }
+ else {
+ keysToImport = TQStringList::split(" ",keyNames,true);
+ }
+
+ importproc=new KProcIO(TQTextCodec::codecForLocale());
+ *importproc<<"gpg"<<"--utf8-strings";
+ if (KgpgInterface::getGpgVersion() < 210 ) { // was removed in 2.1
+ if (page->cBproxyI->isChecked()) {
+ importproc->setEnvironment("http_proxy",page->kLEproxyI->text());
+ *importproc<< "--keyserver-options"<<"honor-http-proxy";
+ }
+ else {
+ *importproc<< "--keyserver-options"<<"no-honor-http-proxy";
+ }
+ }
+ *importproc<<"--status-fd=2"<<"--keyserver"<<keyserv<<"--recv-keys";
+
+ for (TQStringList::Iterator it = keysToImport.begin(); it != keysToImport.end(); it++ ) {
+ *importproc<< (*it) ;
+ }
+
+ TQObject::connect(importproc, TQT_SIGNAL(processExited(TDEProcess *)),TQT_TQOBJECT(this), TQT_SLOT(slotimportresult(TDEProcess *)));
+ TQObject::connect(importproc, TQT_SIGNAL(readReady(KProcIO *)),TQT_TQOBJECT(this), TQT_SLOT(slotimportread(KProcIO *)));
+
importproc->start(TDEProcess::NotifyOnExit,true);
importproc->closeWhenDone();
- TQApplication::setOverrideCursor(TQCursor(TQt::BusyCursor));
+
importpop = new TQDialog( this,0,true,TQt::WDestructiveClose);
TQVBoxLayout *vbox=new TQVBoxLayout(importpop,3);
TQLabel *tex=new TQLabel(importpop);
@@ -452,6 +685,7 @@ void keyServer::slotImport()
void keyServer::abortImport()
{
+// kdDebug(2100) << k_funcinfo << endl;
TQApplication::restoreOverrideCursor();
if (importproc->isRunning())
{
@@ -462,8 +696,66 @@ void keyServer::abortImport()
if (autoCloseWindow) close();
}
+void keyServer::slotksearchprocresult(TDEProcess *) {
+// kdDebug(2100) << k_funcinfo << k_funcinfo << endl;
+ // leave only valid keys in the list
+ for (TQMap<TQString,TQStringList>::Iterator ite = hashMap.begin(); ite != hashMap.end() ; ite++) {
+ bool exp=false;
+ bool rev=false;
+ for (TQStringList::Iterator it = ite.data().begin(); it != ite.data().end(); it++ ) {
+ TQStringList keyString=TQStringList::split(":",(*it),true);
+ // kdDebug(2100) << k_funcinfo << "Read one key line: " << (*it) << endl;
+ if (keyString[0] == "pub") {
+ if (! keyString[6].isEmpty() ) {
+ if (keyString[6] == "r") {
+ rev = true;
+ }
+ }
+ if (! keyString[5].isEmpty() ) { // expiration date
+ TQDate date;
+ if (KgpgInterface::getGpgVersion() >= 210 ) {
+ TQDateTime timestamp;
+ timestamp.setTime_t( keyString[5].toInt() );
+ date = timestamp.date();
+ }
+ else {
+ date = TQDate::fromString(keyString[5], Qt::ISODate);
+ }
+ Q_ASSERT (date.isValid()) /*tqWarning("create date is not valid")*/;
+ if (date < TQDate::currentDate() ) {
+ exp = true;
+ }
+ }
+ }
+ }
+ if (exp || rev) {
+ invalidKeys<<ite.key();
+ readmessage += "<qt>"+i18n("Public Key")+": <i>0x";
+ if (rev) {
+ readmessage += ite.key() + " (" + i18n("Revoked");
+ }
+ if (exp) {
+ readmessage += ", "+i18n("Expired");
+ }
+ readmessage += ")</i><br></qt>\n";
+ }
+ }
+
+ for (TQMap<TQString,TQStringList>::Iterator ite = hashMap.begin(); ite != hashMap.end() ; ite++) {
+ if (invalidKeys.find(ite.key()) == invalidKeys.end() ) {
+ // keys are neither revoked nor expired
+ for (TQStringList::Iterator it = ite.data().begin(); it != ite.data().end(); it++ ) {
+ if ( (*it).startsWith("pub") ) {
+ keysToImport << (*it).section(":",1,1);
+ }
+ }
+ }
+ }
+}
+
void keyServer::slotimportresult(TDEProcess*)
{
+// kdDebug(2100) << k_funcinfo << endl;
TQApplication::restoreOverrideCursor();
TQString importedNb,importedNbSucess,importedNbProcess,resultMessage, parsedOutput,importedNbUnchanged,importedNbSig;
TQString notImportesNbSec,importedNbMissing,importedNbRSA,importedNbUid,importedNbSub,importedNbRev,readNbSec;
@@ -471,6 +763,7 @@ void keyServer::slotimportresult(TDEProcess*)
parsedOutput=readmessage;
TQStringList importedKeys;
+ TQApplication::restoreOverrideCursor();
while (parsedOutput.find("IMPORTED")!=-1) {
parsedOutput.remove(0,parsedOutput.find("IMPORTED")+8);
@@ -518,14 +811,15 @@ void keyServer::slotimportresult(TDEProcess*)
resultMessage+=i18n("<qt>One secret key not imported.<br></qt>","<qt>%n secret keys not imported.<br></qt>",notImportesNbSec.toULong());
if (importedNbSucess!="0")
resultMessage+=i18n("<qt><b>One key imported:</b><br></qt>","<qt><b>%n keys imported:</b><br></qt>",importedNbSucess.toULong());
- } else
- resultMessage=i18n("No key imported... \nCheck detailed log for more infos");
+ }
+ else {
+ resultMessage=i18n("No key imported... \nCheck detailed log for more infos");
+ }
- TQString lastID=TQString("0x"+importedKeys.last().section(" ",0,0).right(8));
- if (!lastID.isEmpty())
- {
- //kdDebug(2100)<<"++++++++++imported key"<<lastID<<endl;
- emit importFinished(lastID);
+ TQString lastID=TQString( importedKeys.last().section(" ",0,0).right(8));
+ if ( !lastID.isEmpty() ) {
+ //kdDebug(2100)<<"++++++++++imported key"<<lastID<<endl;
+ emit importFinished(lastID);
}
if (importpop)
@@ -546,6 +840,7 @@ void keyServer::slotimportread(KProcIO *p)
void keyServer::syncCombobox()
{
+// kdDebug(2100) << k_funcinfo << endl;
config->setGroup("Servers");
TQString serverList=config->readEntry("Server_List");
@@ -555,8 +850,8 @@ void keyServer::syncCombobox()
page->kCBimportks->clear();
if (!optionsServer.isEmpty()) {
- page->kCBexportks->insertItem(optionsServer);
- page->kCBimportks->insertItem(optionsServer);
+ page->kCBexportks->insertItem(optionsServer + " " + i18n("(Default)"));
+ page->kCBimportks->insertItem(optionsServer + " " + i18n("(Default)"));
}
else if ( serverList.isEmpty() )
serverList = "hkp://wwwkeys.eu.pgp.net,hkp://search.keyserver.net,hkp://wwwkeys.pgp.net,hkp://pgp.dtype.org,hkp://wwwkeys.us.pgp.net"; // same as ini kgpgoptions.cpp
diff --git a/kgpg/keyservers.h b/kgpg/keyservers.h
index 4a089f8..51e98a8 100644
--- a/kgpg/keyservers.h
+++ b/kgpg/keyservers.h
@@ -51,6 +51,7 @@ public slots:
void slotexportresult(TDEProcess*);
void slotimportread(KProcIO *p);
void slotprocread(KProcIO *p);
+ void slotprocresult(TDEProcess *);
void slotPreExport();
void slotExport(TQStringList keyIds);
void preimport();
@@ -59,13 +60,17 @@ public slots:
void slotEnableProxyE(bool on);
void handleQuit();
void slotTextChanged( const TQString &text);
+// void slotksearchprocread(KProcIO *p);
+ void slotksearchprocresult(TDEProcess *);
private:
TQDialog *importpop;
KSimpleConfig *config;
uint keyNumbers;
- TQString readmessage;
+ TQString readmessage, currentKey;;
+ TQStringList keysToImport, invalidKeys;
+ TQMap<TQString,TQStringList> hashMap;
KProcIO *importproc,*exportproc;
KProcIO *searchproc;
searchRes *listpop;
diff --git a/kgpg/kgpg.cpp b/kgpg/kgpg.cpp
index c711e3a..0d7acd2 100644
--- a/kgpg/kgpg.cpp
+++ b/kgpg/kgpg.cpp
@@ -4,6 +4,10 @@
begin : Mon Nov 18 2002
copyright : (C) 2002 by Jean-Baptiste Mardelle
email : bj@altern.org
+
+ updated to handle gpg21 : Sun Jul 30 10:18:29 CEST 2017
+ copyright : (C) 2017 by Emanoil Kotsev
+ email : deloptes@yahoo.com
***************************************************************************/
/***************************************************************************
@@ -174,7 +178,7 @@ compressionScheme=cp;
void MyView::startFolderEncode(TQStringList selec,TQStringList encryptOptions,bool ,bool symetric)
{
-TQString extension;
+TQString extension="";
if (compressionScheme==0)
extension=".zip";
@@ -646,33 +650,65 @@ void MyView::startWizard()
wiz->kURLRequester2->setMode(2);*/
FILE *fp,*fp2;
- TQString tst,tst2,name,trustedvals="idre-";
+ TQString trustedvals="idre-";
TQString firstKey=TQString();
char line[300];
bool counter=false;
+ TQString currentKey;
+ TQMap<TQString,TQStringList> hashMap;
fp = popen("gpg --display-charset=utf-8 --no-tty --with-colon --list-secret-keys", "r");
while ( fgets( line, sizeof(line), fp)) {
- tst=TQString::fromUtf8(line);
- if (tst.startsWith("sec")) {
- name=KgpgInterface::checkForUtf8(tst.section(':',9,9));
- if (!name.isEmpty()) {
- fp2 = popen("gpg --display-charset=utf-8 --no-tty --with-colon --list-keys "+TQFile::encodeName(tst.section(':',4,4)), "r");
- while ( fgets( line, sizeof(line), fp2)) {
- tst2=TQString::fromUtf8(line);
- if (tst2.startsWith("pub") && (trustedvals.find(tst2.section(':',1,1))==-1)) {
- counter=true;
- wiz->CBdefault->insertItem(tst.section(':',4,4).right(8)+": "+name);
- if (firstKey.isEmpty())
- firstKey=tst.section(':',4,4).right(8)+": "+name;
- break;
- }
- }
- pclose(fp2);
- }
- }
- }
- pclose(fp);
+ TQString tst=TQString::fromUtf8(line);
+ kdDebug(2100) << k_funcinfo << "Read one secret key line: " << tst << endl;
+ if ( tst.startsWith("sec") ) {
+ currentKey = tst.section(':',4,4);
+ TQStringList lst; lst << tst;
+ hashMap.insert(currentKey,lst);
+ }
+ else {
+ hashMap.find(currentKey).data().append(tst);
+ }
+ }
+ pclose(fp);
+
+ TQMap<TQString,TQStringList>::Iterator ite;
+ for (ite = hashMap.begin(); ite != hashMap.end(); ite++) {
+ TDEListViewItem *item;
+ TQStringList::Iterator it;
+
+ TQString name,id;
+
+ for (it = ite.data().begin(); it != ite.data().end(); it++) {
+ TQString tst = (*it);
+ if (tst.startsWith("sec") ) {
+ if ( KgpgInterface::getGpgVersion() < 210) {
+ name=KgpgInterface::checkForUtf8(tst.section(':',9,9));
+ }
+ id = tst.section(':',4,4);
+ }
+ if ( tst.startsWith("uid") && KgpgInterface::getGpgVersion() >= 210 ) {
+ name=KgpgInterface::checkForUtf8(tst.section(':',9,9));
+ }
+ }
+
+ if (!name.isEmpty()) {
+ fp2 = popen("gpg --display-charset=utf-8 --no-tty --with-colon --list-keys "+TQFile::encodeName(id), "r");
+ while ( fgets( line, sizeof(line), fp2)) {
+ TQString tst2=TQString::fromUtf8(line);
+ if (tst2.startsWith("pub") && (trustedvals.find(tst2.section(':',1,1))==-1)) {
+ counter=true;
+ wiz->CBdefault->insertItem(id.right(8)+": "+name);
+ if (firstKey.isEmpty()) {
+ firstKey=id.right(8)+": "+name;
+ }
+ break;
+ }
+ }
+ pclose(fp2);
+ }
+ }
+
wiz->CBdefault->setCurrentItem(firstKey);
//connect(wiz->pushButton4,TQT_SIGNAL(clicked()),TQT_TQOBJECT(this),TQT_SLOT(slotGenKey()));
if (!counter)
@@ -692,23 +728,48 @@ void MyView::startWizard()
void MyView::slotWizardChange()
{
- TQString tst,name;
- char line[300];
- FILE *fp;
if (wiz->indexOf(wiz->currentPage())==2) {
TQString defaultID=KgpgInterface::getGpgSetting("default-key",wiz->kURLRequester1->url());
if (defaultID.isEmpty())
return;
- fp = popen("gpg --display-charset=utf-8 --no-tty --with-colon --list-secret-keys "+TQFile::encodeName(defaultID), "r");
- while ( fgets( line, sizeof(line), fp)) {
- tst=TQString::fromUtf8(line);
- if (tst.startsWith("sec")) {
- name=KgpgInterface::checkForUtf8(tst.section(':',9,9));
- wiz->CBdefault->setCurrentItem(tst.section(':',4,4).right(8)+": "+name);
- }
- }
- pclose(fp);
+
+ char line[300];
+ FILE *fp;
+ TQString id, name, currentKey;
+ TQMap<TQString,TQStringList> hashMap;
+ fp = popen("gpg --display-charset=utf-8 --no-tty --with-colon --list-secret-keys "+TQFile::encodeName(defaultID), "r");
+ while ( fgets( line, sizeof(line), fp)) {
+ TQString tst=TQString::fromUtf8(line);
+ kdDebug(2100) << k_funcinfo << "Read one secret key line: " << tst << endl;
+ if ( tst.startsWith("sec") ) {
+ currentKey = tst.section(':',4,4);
+ TQStringList lst; lst << tst;
+ hashMap.insert(currentKey,lst);
+ }
+ else {
+ hashMap.find(currentKey).data().append(tst);
+ }
+ }
+ pclose(fp);
+
+ TQMap<TQString,TQStringList>::Iterator ite;
+ for (ite = hashMap.begin(); ite != hashMap.end(); ite++) {
+ for (TQStringList::Iterator it = ite.data().begin(); it != ite.data().end(); it++) {
+ TQString tst = (*it);
+ tst=TQString::fromUtf8(line);
+ if ( tst.startsWith("sec") ) {
+ if (KgpgInterface::getGpgVersion() < 210) {
+ name=KgpgInterface::checkForUtf8(tst.section(':',9,9));
+ }
+ id=tst.section(':',4,4).right(8);
+ }
+ if ( (tst.startsWith("uid") && KgpgInterface::getGpgVersion() >= 210) ) {
+ name=KgpgInterface::checkForUtf8(tst.section(':',9,9));
+ }
+ }
+ }
+ wiz->CBdefault->setCurrentItem(id+": "+name);
}
}
diff --git a/kgpg/kgpginterface.cpp b/kgpg/kgpginterface.cpp
index 637198b..0d15df2 100644
--- a/kgpg/kgpginterface.cpp
+++ b/kgpg/kgpginterface.cpp
@@ -4,6 +4,10 @@
begin : Mon Jul 8 2002
copyright : (C) 2002 by Jean-Baptiste Mardelle
email : bj@altern.org
+
+ updated to handle gpg21 : Sun Jul 30 10:18:29 CEST 2017
+ copyright : (C) 2017 by Emanoil Kotsev
+ email : deloptes@yahoo.com
***************************************************************************/
/***************************************************************************
@@ -44,6 +48,7 @@
#include <kled.h>
#include <kdebug.h>
#include <tdetempfile.h>
+#include <tqcursor.h>
#include "kgpginterface.h"
#include "listkeys.h"
@@ -76,6 +81,7 @@ FILE *fp;
void KgpgInterface::updateIDs(TQString txtString)
{
+// kdDebug(2100) << k_funcinfo << endl;
int cut=txtString.find(' ',22,false);
txtString.remove(0,cut);
if (txtString.find("(",0,false)!=-1)
@@ -91,6 +97,7 @@ void KgpgInterface::updateIDs(TQString txtString)
void KgpgInterface::KgpgEncryptFile(TQStringList encryptKeys,KURL srcUrl,KURL destUrl, TQStringList Options, bool symetrical)
{
+// kdDebug(2100) << k_funcinfo << endl;
sourceFile=srcUrl;
message=TQString();
@@ -123,6 +130,7 @@ KgpgInterface::~KgpgInterface()
void KgpgInterface::encryptfin(TDEProcess *)
{
+// kdDebug(2100) << k_funcinfo << endl;
if (message.find("END_ENCRYPTION")!=-1)
emit encryptionfinished(sourceFile);
else {
@@ -132,6 +140,7 @@ void KgpgInterface::encryptfin(TDEProcess *)
void KgpgInterface::readencprocess(KProcIO *p)
{
+// kdDebug(2100) << k_funcinfo << endl;
TQString required;
while (p->readln(required,true)!=-1) {
if (required.find("BEGIN_ENCRYPTION",0,false)!=-1)
@@ -162,6 +171,7 @@ void KgpgInterface::readencprocess(KProcIO *p)
void KgpgInterface::KgpgDecryptFile(KURL srcUrl,KURL destUrl,TQStringList Options)
{
+// kdDebug(2100) << k_funcinfo << endl;
message=TQString();
step=3;
decryptUrl=srcUrl.path();
@@ -187,6 +197,7 @@ void KgpgInterface::KgpgDecryptFile(KURL srcUrl,KURL destUrl,TQStringList Option
void KgpgInterface::decryptfin(TDEProcess *)
{
+// kdDebug(2100) << k_funcinfo << endl;
if ((message.find("DECRYPTION_OKAY")!=-1) && (message.find("END_DECRYPTION")!=-1)) //&& (message.find("GOODMDC")!=-1)
emit decryptionfinished();
else
@@ -196,6 +207,7 @@ void KgpgInterface::decryptfin(TDEProcess *)
void KgpgInterface::readdecprocess(KProcIO *p)
{
+// kdDebug(2100) << k_funcinfo << endl;
TQString required;
while (p->readln(required,true)!=-1) {
if (required.find("BEGIN_DECRYPTION",0,false)!=-1)
@@ -247,6 +259,7 @@ void KgpgInterface::readdecprocess(KProcIO *p)
void KgpgInterface::KgpgEncryptText(TQString text,TQStringList userIDs, TQStringList Options)
{
+// kdDebug(2100) << k_funcinfo << endl;
message=TQString();
//TQTextCodec *codec = TDEGlobal::charsets()->codecForName(TDEGlobal::locale()->encoding());
TQTextCodec *codec =TQTextCodec::codecForLocale ();
@@ -279,6 +292,7 @@ void KgpgInterface::KgpgEncryptText(TQString text,TQStringList userIDs, TQString
void KgpgInterface::txtencryptfin(TDEProcess *)
{
+// kdDebug(2100) << k_funcinfo << endl;
if (!message.isEmpty())
emit txtencryptionfinished(message);
else
@@ -287,6 +301,7 @@ void KgpgInterface::txtencryptfin(TDEProcess *)
void KgpgInterface::txtreadencprocess(KProcIO *p)
{
+// kdDebug(2100) << k_funcinfo << endl;
TQString required;
while (p->readln(required,true)!=-1) {
if (required.find("BEGIN_ENCRYPTION",0,false)!=-1)
@@ -318,6 +333,7 @@ void KgpgInterface::txtreadencprocess(KProcIO *p)
void KgpgInterface::KgpgDecryptText(TQString text,TQStringList Options)
{
+// kdDebug(2100) << k_funcinfo << endl;
gpgOutput=TQString();
log=TQString();
@@ -345,6 +361,7 @@ void KgpgInterface::KgpgDecryptText(TQString text,TQStringList Options)
void KgpgInterface::txtdecryptfin(TDEProcess *)
{
+// kdDebug(2100) << k_funcinfo << endl;
if ((decok) && (!badmdc))
emit txtdecryptionfinished(message);
@@ -360,12 +377,14 @@ emit txtdecryptionfailed(log);
void KgpgInterface::getOutput(TDEProcess *, char *data, int )
{
+// kdDebug(2100) << k_funcinfo << endl;
message.append(TQString::fromUtf8(data));
}
void KgpgInterface::getCmdOutput(TDEProcess *p, char *data, int )
{
+// kdDebug(2100) << k_funcinfo << endl;
gpgOutput.append(TQString::fromUtf8(data));
log.append(data);
@@ -434,6 +453,7 @@ void KgpgInterface::getCmdOutput(TDEProcess *p, char *data, int )
void KgpgInterface::KgpgSignText(TQString text,TQString userIDs, TQStringList Options)
{
+// kdDebug(2100) << k_funcinfo << endl;
message=TQString();
step=4;
TQString txtprocess;
@@ -458,7 +478,7 @@ void KgpgInterface::KgpgSignText(TQString text,TQString userIDs, TQStringList Op
proc->start(TDEProcess::NotifyOnExit,false);
/*if (useAgent)
{
- kdDebug(2100)<<"Using Agent+++++++++++++"<<endl;
+// kdDebug(2100)<<"Using Agent+++++++++++++"<<endl;
//KMessageBox::sorry(0,"using agent");
proc->writeStdin(txtprocess,true);
proc->closeWhenDone();
@@ -470,6 +490,7 @@ void KgpgInterface::KgpgSignText(TQString text,TQString userIDs, TQStringList Op
void KgpgInterface::txtsignfin(TDEProcess *)
{
+// kdDebug(2100) << k_funcinfo << "MSG: " << message<<endl;
if (!message.isEmpty())
emit txtSignOver(message);
else
@@ -478,7 +499,9 @@ void KgpgInterface::txtsignfin(TDEProcess *)
void KgpgInterface::txtsignprocess(KProcIO *p)
{
+// kdDebug(2100) << k_funcinfo << endl;
TQString required;
+
while (p->readln(required,true)!=-1) {
// kdDebug(2100)<<"SIGNING: "<<required<<endl;
@@ -492,6 +515,12 @@ void KgpgInterface::txtsignprocess(KProcIO *p)
p->closeWhenDone();
}
+ if (required.find("BEGIN_SIGNING")!=-1) {
+ p->writeStdin(message,true);
+ message=TQString();
+ p->closeWhenDone();
+ }
+
if ((required.find("passphrase.enter")!=-1))
{
if (step>1) step--;
@@ -513,6 +542,7 @@ void KgpgInterface::txtsignprocess(KProcIO *p)
}
else
if (!required.startsWith("[GNUPG:]")) message+=required+"\n";
+// kdDebug(2100)<<"SIGNING: "<<message<<endl;
}
}
@@ -521,14 +551,15 @@ void KgpgInterface::txtsignprocess(KProcIO *p)
void KgpgInterface::KgpgDecryptFileToText(KURL srcUrl,TQStringList Options)
{
+// kdDebug(2100) << k_funcinfo << endl;
message=TQString();
userIDs=TQString();
step=3;
anonymous=false;
-decfinished=false;
-decok=false;
-badmdc=false;
+ decfinished=false;
+ decok=false;
+ badmdc=false;
TDEProcess *proc=new TDEProcess();
*proc<<"gpg"<<"--no-tty"<<"--utf8-strings"<<"--no-secmem-warning"<<"--command-fd=0"<<"--status-fd=2"<<"--no-batch"<<"-o"<<"-";
@@ -551,6 +582,7 @@ badmdc=false;
void KgpgInterface::KgpgVerifyText(TQString text)
{
+// kdDebug(2100) << k_funcinfo << endl;
TQTextCodec *codec =TQTextCodec::codecForLocale ();
if (!codec->canEncode(text)) text=text.utf8();
@@ -569,6 +601,7 @@ void KgpgInterface::KgpgVerifyText(TQString text)
void KgpgInterface::slotverifyresult(TDEProcess*)
{
+// kdDebug(2100) << k_funcinfo << endl;
if (signmiss) emit missingSignature(signID);
else {
if (signID.isEmpty()) signID=i18n("No signature found.");
@@ -579,6 +612,7 @@ if (signmiss) emit missingSignature(signID);
void KgpgInterface::slotverifyread(KProcIO *p)
{
+// kdDebug(2100) << k_funcinfo << endl;
TQString required;
while (p->readln(required,true)!=-1)
{
@@ -613,6 +647,7 @@ TQString required;
Md5Widget::Md5Widget(TQWidget *parent, const char *name,KURL url):KDialogBase( parent, name, true,i18n("MD5 Checksum"),Apply | Close)
{
+// kdDebug(2100) << k_funcinfo << endl;
setButtonApply(i18n("Compare MD5 with Clipboard"));
mdSum=TQString();
TQFile f(url.path());
@@ -664,6 +699,7 @@ Md5Widget::~Md5Widget()
void Md5Widget::slotApply()
{
+// kdDebug(2100) << k_funcinfo << endl;
TQClipboard *cb = TQApplication::clipboard();
TQString text;
// Copy text from the clipboard (paste)
@@ -692,6 +728,7 @@ void Md5Widget::slotApply()
void KgpgInterface::KgpgSignFile(TQString keyID,KURL srcUrl,TQStringList Options)
{
+// kdDebug(2100) << k_funcinfo << endl;
////////////////////////////////////// create a detached signature for a chosen file
message=TQString();
step=3;
@@ -714,6 +751,7 @@ void KgpgInterface::KgpgSignFile(TQString keyID,KURL srcUrl,TQStringList Options
void KgpgInterface::signfin(TDEProcess *)
{
+// kdDebug(2100) << k_funcinfo << endl;
if (message.find("SIG_CREATED")!=-1)
KMessageBox::information(0,i18n("The signature file %1 was successfully created.").arg(file.fileName()));
else if (message.find("BAD_PASSPHRASE")!=-1)
@@ -726,6 +764,7 @@ void KgpgInterface::signfin(TDEProcess *)
void KgpgInterface::readsignprocess(KProcIO *p)
{
+// kdDebug(2100) << k_funcinfo << endl;
TQString required;
while (p->readln(required,true)!=-1) {
if (required.find("USERID_HINT",0,false)!=-1)
@@ -766,6 +805,7 @@ void KgpgInterface::readsignprocess(KProcIO *p)
void KgpgInterface::KgpgVerifyFile(KURL sigUrl,KURL srcUrl)
{
+// kdDebug(2100) << k_funcinfo << endl;
////////////////////////////////////// verify signature for a chosen file
message=TQString();
signID=TQString();
@@ -786,7 +826,8 @@ void KgpgInterface::KgpgVerifyFile(KURL sigUrl,KURL srcUrl)
void KgpgInterface::readprocess(KProcIO *p)
{
-TQString required;
+// kdDebug(2100) << k_funcinfo << endl;
+ TQString required;
while (p->readln(required,true)!=-1)
{
message+=required+"\n";
@@ -821,6 +862,7 @@ TQString required;
void KgpgInterface::verifyfin(TDEProcess *)
{
+// kdDebug(2100) << k_funcinfo << endl;
if (!signmiss) {
if (signID.isEmpty()) signID=i18n("No signature found.");
(void) new KDetailedInfo(0,"verify_result",signID,message);
@@ -839,6 +881,7 @@ void KgpgInterface::verifyfin(TDEProcess *)
void KgpgInterface::KgpgSignKey(TQString keyID,TQString signKeyID,TQString signKeyMail,bool local,int checking)
{
+// kdDebug(2100) << k_funcinfo << endl;
signKeyMail.replace(TQRegExp("<"),"&lt;");
konsChecked=checking;
konsLocal=local;
@@ -861,88 +904,186 @@ void KgpgInterface::KgpgSignKey(TQString keyID,TQString signKeyID,TQString signK
else *conprocess<<"sign";
TQObject::connect(conprocess,TQT_SIGNAL(readReady(KProcIO *)),this,TQT_SLOT(sigprocess(KProcIO *)));
TQObject::connect(conprocess, TQT_SIGNAL(processExited(TDEProcess *)),this, TQT_SLOT(signover(TDEProcess *)));
+ TQApplication::setOverrideCursor(TQCursor(TQt::BusyCursor));
conprocess->start(TDEProcess::NotifyOnExit,true);
}
void KgpgInterface::sigprocess(KProcIO *p)
{
+// kdDebug(2100) << k_funcinfo << endl;
TQString required=TQString();
- while (p->readln(required,true)!=-1)
- {
+ while (p->readln(required,true)!=-1) {
+ output+=required+"\n";
- output+=required+"\n";
- if (required.find("USERID_HINT",0,false)!=-1)
- updateIDs(required);
+ if ( KgpgInterface::getGpgVersion() >= 210 ) {
+ // kdDebug(2100) << k_funcinfo << " line " << required << endl;
+ if (required.find("USERID_HINT",0,false)!=-1) {
+ updateIDs(required);
+ }
- if (signSuccess==4) {
- if (required.find("GET_")!=-1)
- p->writeStdin(TQString("quit"));
- p->closeWhenDone();
- return;
- }
+ if (signSuccess==4 && required.find("GET_")!=-1) {
+ // kdDebug(2100) << k_funcinfo << " success quit" << endl;
+ p->writeStdin(TQString("quit"));
+ p->closeWhenDone();
+ return;
+ }
- if ((required.find("GOOD_PASSPHRASE")!=-1)) {
- signSuccess=3;
- step=2;
- }
+ if ((required.find("GOOD_PASSPHRASE")!=-1)) {
+ // kdDebug(2100) << k_funcinfo << " GOOD_PASSPHRASE" << endl;
+ signSuccess=3;
+ step=2;
+ }
- if (required.find("sign_uid.expire")!=-1) {
- p->writeStdin(TQString("Never"));
- required=TQString();
- }
- if (required.find("sign_uid.class")!=-1) {
- p->writeStdin(TQString::number(konsChecked));
- required=TQString();
- }
- if (required.find("sign_uid.okay")!=-1) {
- p->writeStdin(TQString("Y"));
- required=TQString();
- }
+ if (required.find("sign_uid.expire")!=-1) {
+ // kdDebug(2100) << k_funcinfo << " sign_uid.expire" << endl;
+ p->writeStdin(TQString("Never"));
+ required=TQString();
+ }
+ if (required.find("sign_uid.class")!=-1) {
+ // kdDebug(2100) << k_funcinfo << " sign_uid.class" << endl;
+ p->writeStdin(TQString::number(konsChecked));
+ required=TQString();
+ }
+ if (required.find("sign_all.okay")!=-1 || required.find("sign_uid.okay")!=-1 ) {
+ // kdDebug(2100) << k_funcinfo << " sign_uid.okay" << endl;
+ step=2;
+ p->writeStdin(TQString("Y"));
+ required=TQString();
+ }
+ if (required.find("PINENTRY_LAUNCHED")!=-1) {
+ // kdDebug(2100) << k_funcinfo << "PINENTRY_LAUNCHED" << endl;
+ // p->writeStdin(TQString::number(konsChecked));
+ required=TQString();
+ }
- if (required.find("sign_all.okay")!=-1) {
- p->writeStdin(TQString("Y"));
- required=TQString();
- }
+ if (required.find("passphrase.enter")!=-1) {
+ TQCString signpass;
+ // kdDebug(2100) << k_funcinfo << "passphrase.enter" << endl;
+ TQApplication::restoreOverrideCursor();
+ int code=KPasswordDialog::getPassword(signpass,i18n("<qt>%1 Enter passphrase for <b>%2</b>:</qt>")
+ .arg(errMessage).arg(userIDs));
+ TQApplication::setOverrideCursor(TQCursor(TQt::BusyCursor));
+ if (code!=TQDialog::Accepted) {
+ signSuccess=4; ///// aborted by user mode
+ required=TQString();
+ p->writeStdin(TQString("quit"));
+ p->closeWhenDone();
+ return;
+ }
+ p->writeStdin(signpass,true);
+ required=TQString();
+ // step=2;
+ }
+ if ((step==2) && (required.find("keyedit.prompt")!=-1) ) {
+ // kdDebug(2100) << k_funcinfo << "key sign" << endl;
+ p->writeStdin(TQString("save"));
+ p->closeWhenDone();
+ signSuccess=4;
+ required=TQString();
+ }
+ if (required.find("BAD_PASSPHRASE")!=-1) {
+ // kdDebug(2100) << k_funcinfo << "BAD_PASSPHRASE" << endl;
+ errMessage=i18n("<b>Bad passphrase</b>. Try again.</br>");
+ required=TQString();
+ signSuccess=2; ///// bad passphrase
+ }
+// if (required.find("GET_")!=-1) { /////// gpg asks for something unusal, turn to konsole mode
+// // kdDebug(2100) << k_funcinfo << "GET_ " << required << endl;
+// if (signSuccess!=2) {
+// signSuccess=1; ///// switching to console mode
+// }
+// }
+ }
- if (required.find("passphrase.enter")!=-1) {
- TQCString signpass;
- int code=KPasswordDialog::getPassword(signpass,i18n("<qt>%1 Enter passphrase for <b>%2</b>:</qt>")
- .arg(errMessage).arg(userIDs));
- if (code!=TQDialog::Accepted) {
- signSuccess=4; ///// aborted by user mode
- required=TQString();
- p->writeStdin(TQString("quit"));
- p->closeWhenDone();
- return;
- }
- p->writeStdin(signpass,true);
- required=TQString();
- // step=2;
- }
- if ((step==2) && (required.find("keyedit.prompt")!=-1)) {
- p->writeStdin(TQString("save"));
- required=TQString();
- }
- if (required.find("BAD_PASSPHRASE")!=-1) {
- errMessage=i18n("<b>Bad passphrase</b>. Try again.</br>");
- required=TQString();
- signSuccess=2; ///// bad passphrase
- }
- if (required.find("GET_")!=-1) /////// gpg asks for something unusal, turn to konsole mode
- {
- if (signSuccess!=2)
- signSuccess=1; ///// switching to console mode
- p->writeStdin(TQString("quit"));
- p->closeWhenDone();
+ else { // (KgpgInterface::getGpgVersion() < 210)
+ // kdDebug(2100) << k_funcinfo << " line " << required << endl;
+ if (required.find("USERID_HINT",0,false)!=-1) {
+ updateIDs(required);
+ }
- }
- }
+ if (signSuccess==4) {
+ // kdDebug(2100) << k_funcinfo << " success quit" << endl;
+ if (required.find("GET_")!=-1) {
+ p->writeStdin(TQString("quit"));
+ }
+ p->closeWhenDone();
+ return;
+ }
+
+ if ((required.find("GOOD_PASSPHRASE")!=-1)) {
+ // kdDebug(2100) << k_funcinfo << " GOOD_PASSPHRASE" << endl;
+ signSuccess=3;
+ step=2;
+ }
+
+ if (required.find("sign_uid.expire")!=-1) {
+ // kdDebug(2100) << k_funcinfo << " sign_uid.expire" << endl;
+ p->writeStdin(TQString("Never"));
+ required=TQString();
+ }
+ if (required.find("sign_uid.class")!=-1) {
+ // kdDebug(2100) << k_funcinfo << " sign_uid.class" << endl;
+ p->writeStdin(TQString::number(konsChecked));
+ required=TQString();
+ }
+ if (required.find("sign_all.okay")!=-1 || required.find("sign_uid.okay")!=-1 ) {
+ // kdDebug(2100) << k_funcinfo << " sign_uid.okay" << endl;
+ p->writeStdin(TQString("Y"));
+ required=TQString();
+ }
+ if (required.find("PINENTRY_LAUNCHED")!=-1) {
+ // kdDebug(2100) << k_funcinfo << "PINENTRY_LAUNCHED" << endl;
+ // p->writeStdin(TQString::number(konsChecked));
+ required=TQString();
+ }
+
+ if (required.find("passphrase.enter")!=-1) {
+ TQApplication::restoreOverrideCursor();
+ TQCString signpass;
+ // kdDebug(2100) << k_funcinfo << "passphrase.enter" << endl;
+ int code=KPasswordDialog::getPassword(signpass,i18n("<qt>%1 Enter passphrase for <b>%2</b>:</qt>")
+ .arg(errMessage).arg(userIDs));
+ TQApplication::setOverrideCursor(TQCursor(TQt::BusyCursor));
+ if (code!=TQDialog::Accepted) {
+ signSuccess=4; ///// aborted by user mode
+ required=TQString();
+ p->writeStdin(TQString("quit"));
+ p->closeWhenDone();
+ return;
+ }
+ p->writeStdin(signpass,true);
+ required=TQString();
+ // step=2;
+ }
+ if ((step==2) && (required.find("keyedit.prompt")!=-1) ) {
+ // kdDebug(2100) << k_funcinfo << "key save" << endl;
+ p->writeStdin(TQString("save"));
+ required=TQString();
+ }
+ if (required.find("BAD_PASSPHRASE")!=-1) {
+ // kdDebug(2100) << k_funcinfo << "BAD_PASSPHRASE" << endl;
+ errMessage=i18n("<b>Bad passphrase</b>. Try again.</br>");
+ required=TQString();
+ signSuccess=2; ///// bad passphrase
+ }
+ if (required.find("GET_")!=-1) { /////// gpg asks for something unusal, turn to konsole mode
+ // kdDebug(2100) << k_funcinfo << "GET_ " << required << endl;
+ if (signSuccess!=2) {
+ signSuccess=1; ///// switching to console mode
+ }
+ p->writeStdin(TQString("quit"));
+ p->closeWhenDone();
+ }
+ }
+ }
}
void KgpgInterface::signover(TDEProcess *)
{
+// kdDebug(2100) << k_funcinfo << endl;
+ TQApplication::restoreOverrideCursor();
if (signSuccess>1)
emit signatureFinished(signSuccess); //// signature successful or bad passphrase
else {
@@ -957,6 +1098,7 @@ void KgpgInterface::signover(TDEProcess *)
void KgpgInterface::openSignConsole()
{
+// kdDebug(2100) << k_funcinfo << endl;
TDEProcess conprocess;
TDEConfig *config = TDEGlobal::config();
config->setGroup("General");
@@ -977,6 +1119,7 @@ void KgpgInterface::openSignConsole()
void KgpgInterface::KgpgDelSignature(TQString keyID,TQString signKeyID)
{
+// kdDebug(2100) << k_funcinfo << endl;
if (checkuid(keyID)>0) {
KMessageBox::sorry(0,i18n("This key has more than one user ID.\nEdit the key manually to delete signature."));
return;
@@ -1009,12 +1152,14 @@ void KgpgInterface::KgpgDelSignature(TQString keyID,TQString signKeyID)
*conprocess<<"--edit-key"<<keyID<<"uid 1"<<"delsig";
TQObject::connect(conprocess,TQT_SIGNAL(readReady(KProcIO *)),this,TQT_SLOT(delsigprocess(KProcIO *)));
TQObject::connect(conprocess, TQT_SIGNAL(processExited(TDEProcess *)),this, TQT_SLOT(delsignover(TDEProcess *)));
+ TQApplication::setOverrideCursor(TQCursor(TQt::BusyCursor));
conprocess->start(TDEProcess::NotifyOnExit,true);
}
void KgpgInterface::delsigprocess(KProcIO *p)
{
+// kdDebug(2100) << k_funcinfo << endl;
TQString required=TQString();
while (p->readln(required,true)!=-1)
@@ -1044,6 +1189,8 @@ void KgpgInterface::delsigprocess(KProcIO *p)
void KgpgInterface::delsignover(TDEProcess *)
{
+// kdDebug(2100) << k_funcinfo << endl;
+ TQApplication::restoreOverrideCursor();
emit delsigfinished(deleteSuccess);
}
@@ -1051,10 +1198,14 @@ void KgpgInterface::delsignover(TDEProcess *)
int KgpgInterface::checkuid(TQString KeyID)
{
+// kdDebug(2100) << k_funcinfo << "KeyID: " << KeyID<< endl;
FILE *fp;
TQString encResult;
char buffer[200];
int uidcnt=0;
+ if (KgpgInterface::getGpgVersion() > 210 ) {
+ uidcnt=-1; // there is always one uid in the new version
+ }
TQString gpgcmd="gpg --no-tty --no-secmem-warning --with-colon --list-sigs "+KeyID;
////////// encode with untrusted keys or armor if checked by user
@@ -1064,6 +1215,7 @@ int KgpgInterface::checkuid(TQString KeyID)
if (encResult.startsWith("uid"))
uidcnt++;
}
+// kdDebug(2100) << k_funcinfo << "uid count: " << uidcnt<< endl;
pclose(fp);
return uidcnt;
}
@@ -1074,12 +1226,17 @@ int KgpgInterface::checkuid(TQString KeyID)
void KgpgInterface::KgpgKeyExpire(TQString keyID,TQDate date,bool unlimited)
{
+// kdDebug(2100) << k_funcinfo << endl;
+
+// kdDebug(2100) << "KgpgKeyExpire date: " << date;
+
expSuccess=0;
step=0;
if (unlimited)
expirationDelay=0;
else
expirationDelay=TQDate::currentDate().daysTo(date);
+// kdDebug(2100) << "KgpgKeyExpire date: " << TQDate::currentDate().daysTo(date) <<endl;
output=TQString();
KProcIO *conprocess=new KProcIO(TQTextCodec::codecForLocale());
*conprocess<<"gpg"<<"--no-secmem-warning"<<"--no-tty"<<"--command-fd=0"<<"--status-fd=2"<<"--utf8-strings";
@@ -1092,6 +1249,7 @@ void KgpgInterface::KgpgKeyExpire(TQString keyID,TQDate date,bool unlimited)
void KgpgInterface::expprocess(KProcIO *p)
{
+// kdDebug(2100) << k_funcinfo << endl;
TQString required=TQString();
while (p->readln(required,true)!=-1) {
@@ -1152,6 +1310,7 @@ void KgpgInterface::expprocess(KProcIO *p)
void KgpgInterface::expover(TDEProcess *)
{
+// kdDebug(2100) << k_funcinfo << endl;
if ((expSuccess==3) || (expSuccess==2))
emit expirationFinished(expSuccess); //// signature successful or bad passphrase
else {
@@ -1171,6 +1330,7 @@ void KgpgInterface::expover(TDEProcess *)
void KgpgInterface::KgpgTrustExpire(TQString keyID,int keyTrust)
{
+// kdDebug(2100) << k_funcinfo << endl;
trustValue=keyTrust+1;
/* Don't know=1; Do NOT trust=2; Marginally=3; Fully=4; Ultimately=5; */
@@ -1186,6 +1346,7 @@ void KgpgInterface::KgpgTrustExpire(TQString keyID,int keyTrust)
void KgpgInterface::trustprocess(KProcIO *p)
{
+// kdDebug(2100) << k_funcinfo << endl;
TQString required=TQString();
while (p->readln(required,true)!=-1) {
output+=required+"\n";
@@ -1219,6 +1380,7 @@ void KgpgInterface::trustprocess(KProcIO *p)
void KgpgInterface::trustover(TDEProcess *)
{
+// kdDebug(2100) << k_funcinfo << endl;
emit trustfinished();
}
@@ -1228,6 +1390,7 @@ void KgpgInterface::trustover(TDEProcess *)
void KgpgInterface::KgpgChangePass(TQString keyID)
{
+// kdDebug(2100) << k_funcinfo << endl;
step=1;
output=TQString();
message=TQString();
@@ -1242,6 +1405,7 @@ void KgpgInterface::KgpgChangePass(TQString keyID)
void KgpgInterface::passprocess(KProcIO *p)
{
+// kdDebug(2100) << k_funcinfo << endl;
TQString required=TQString();
while (p->readln(required,true)!=-1) {
@@ -1320,6 +1484,7 @@ void KgpgInterface::passprocess(KProcIO *p)
void KgpgInterface::passover(TDEProcess *)
{
+// kdDebug(2100) << k_funcinfo << endl;
//emit trustfinished();
}
@@ -1329,6 +1494,7 @@ void KgpgInterface::passover(TDEProcess *)
TQString KgpgInterface::getKey(TQStringList IDs, bool attributes)
{
+// kdDebug(2100) << k_funcinfo << endl;
keyString=TQString();
KProcIO *proc=new KProcIO(TQTextCodec::codecForLocale());
*proc<< "gpg"<<"--no-tty"<<"--no-secmem-warning"<<"--utf8-strings";
@@ -1346,6 +1512,7 @@ TQString KgpgInterface::getKey(TQStringList IDs, bool attributes)
void KgpgInterface::slotReadKey(KProcIO *p)
{
+// kdDebug(2100) << k_funcinfo << endl;
TQString outp;
while (p->readln(outp)!=-1)
if (!outp.startsWith("gpg:")) keyString+=outp+"\n";
@@ -1358,6 +1525,7 @@ void KgpgInterface::importKeyURL(KURL url)
{
///////////// import a key
+// kdDebug(2100) << k_funcinfo << endl;
if( TDEIO::NetAccess::download( url, tempKeyFile,0) ) {
message=TQString();
KProcIO *conprocess=new KProcIO(TQTextCodec::codecForLocale());
@@ -1386,6 +1554,7 @@ void KgpgInterface::importKey(TQString keystr)
void KgpgInterface::importover(TDEProcess *)
{
+// kdDebug(2100) << k_funcinfo << endl;
TQStringList importedKeysIds;
TQStringList messageList;
TQString resultMessage;
@@ -1450,6 +1619,7 @@ kdDebug(2100)<<"Importing is over"<<endl;
void KgpgInterface::importURLover(TDEProcess *p)
{
+// kdDebug(2100) << k_funcinfo << endl;
TDEIO::NetAccess::removeTempFile(tempKeyFile);
importover(p);
//KMessageBox::information(0,message);
@@ -1458,6 +1628,7 @@ void KgpgInterface::importURLover(TDEProcess *p)
void KgpgInterface::importprocess(KProcIO *p)
{
+// kdDebug(2100) << k_funcinfo << endl;
TQString outp;
while (p->readln(outp)!=-1) {
if (outp.find("http-proxy")==-1)
@@ -1471,6 +1642,7 @@ void KgpgInterface::importprocess(KProcIO *p)
void KgpgInterface::KgpgAddUid(TQString keyID,TQString name,TQString email,TQString comment)
{
+// kdDebug(2100) << k_funcinfo << endl;
uidName=name;
uidComment=comment;
uidEmail=email;
@@ -1487,12 +1659,14 @@ addSuccess=true;
void KgpgInterface::adduidover(TDEProcess *)
{
+// kdDebug(2100) << k_funcinfo << endl;
if (addSuccess) emit addUidFinished();
else emit addUidError(output);
}
void KgpgInterface::adduidprocess(KProcIO *p)
{
+// kdDebug(2100) << k_funcinfo << endl;
TQString required=TQString();
while (p->readln(required,true)!=-1) {
output+=required+"\n";
@@ -1556,6 +1730,7 @@ void KgpgInterface::adduidprocess(KProcIO *p)
void KgpgInterface::KgpgGetPhotoList(TQString keyID)
{
+// kdDebug(2100) << k_funcinfo << endl;
photoList.clear();
output=TQString();
photoCount=1;
@@ -1571,6 +1746,7 @@ userIDs=keyID;
void KgpgInterface::photoreadprocess(KProcIO *p)
{
+// kdDebug(2100) << k_funcinfo << endl;
TQString required=TQString();
while (p->readln(required,true)!=-1) {
output+=required+"\n";
@@ -1581,6 +1757,7 @@ void KgpgInterface::photoreadprocess(KProcIO *p)
void KgpgInterface::photoreadover(TDEProcess *)
{
+// kdDebug(2100) << k_funcinfo << endl;
for (int i=1;i<photoCount+1;i++)
if (isPhotoId(i)) photoList+=TQString::number(i);
@@ -1589,6 +1766,7 @@ emit signalPhotoList(photoList);
bool KgpgInterface::isPhotoId(int uid)
{
+// kdDebug(2100) << k_funcinfo << endl;
KTempFile *kgpginfotmp=new KTempFile();
kgpginfotmp->setAutoDelete(true);
TQString pgpgOutput="cp %i "+kgpginfotmp->name();
@@ -1608,6 +1786,7 @@ KProcIO *conprocess=new KProcIO(TQTextCodec::codecForLocale());
void KgpgInterface::KgpgDeletePhoto(TQString keyID,TQString uid)
{
+// kdDebug(2100) << k_funcinfo << endl;
delSuccess=true;
output=TQString();
KProcIO *conprocess=new KProcIO(TQTextCodec::codecForLocale());
@@ -1620,12 +1799,14 @@ void KgpgInterface::KgpgDeletePhoto(TQString keyID,TQString uid)
void KgpgInterface::delphotoover(TDEProcess *)
{
+// kdDebug(2100) << k_funcinfo << endl;
if (delSuccess) emit delPhotoFinished();
else emit delPhotoError(output);
}
void KgpgInterface::delphotoprocess(KProcIO *p)
{
+// kdDebug(2100) << k_funcinfo << endl;
TQString required=TQString();
while (p->readln(required,true)!=-1) {
output+=required+"\n";
@@ -1670,6 +1851,7 @@ void KgpgInterface::delphotoprocess(KProcIO *p)
void KgpgInterface::KgpgAddPhoto(TQString keyID,TQString imagePath)
{
+// kdDebug(2100) << k_funcinfo << endl;
photoUrl=imagePath;
output=TQString();
addSuccess=true;
@@ -1683,12 +1865,14 @@ addSuccess=true;
void KgpgInterface::addphotoover(TDEProcess *)
{
+// kdDebug(2100) << k_funcinfo << endl;
if (addSuccess) emit addPhotoFinished();
else emit addPhotoError(output);
}
void KgpgInterface::addphotoprocess(KProcIO *p)
{
+// kdDebug(2100) << k_funcinfo << endl;
TQString required=TQString();
while (p->readln(required,true)!=-1) {
output+=required+"\n";
@@ -1747,6 +1931,7 @@ void KgpgInterface::addphotoprocess(KProcIO *p)
void KgpgInterface::KgpgRevokeKey(TQString keyID,TQString revokeUrl,int reason,TQString description)
{
+// kdDebug(2100) << k_funcinfo << endl;
revokeReason=reason;
revokeSuccess=false;
revokeDescription=description;
@@ -1764,6 +1949,7 @@ void KgpgInterface::KgpgRevokeKey(TQString keyID,TQString revokeUrl,int reason,T
void KgpgInterface::revokeover(TDEProcess *)
{
+// kdDebug(2100) << k_funcinfo << endl;
if (!revokeSuccess)
KMessageBox::detailedSorry(0,i18n("Creation of the revocation certificate failed..."),output);
else {
@@ -1778,27 +1964,33 @@ void KgpgInterface::revokeover(TDEProcess *)
void KgpgInterface::revokeprocess(KProcIO *p)
{
+// kdDebug(2100) << k_funcinfo << endl;
TQString required=TQString();
while (p->readln(required,true)!=-1) {
output+=required+"\n";
+ // kdDebug(2100) << k_funcinfo << " line " << required << endl;
if (required.find("USERID_HINT",0,false)!=-1)
updateIDs(required);
if ((required.find("GOOD_PASSPHRASE")!=-1))
+ // kdDebug(2100) << k_funcinfo << " GOOD_PASSPHRASE " << endl;
revokeSuccess=true;
if ((required.find("gen_revoke.okay")!=-1) || (required.find("ask_revocation_reason.okay")!=-1) || (required.find("openfile.overwrite.okay")!=-1)) {
+ // kdDebug(2100) << k_funcinfo << " gen_revoke.okay " << endl;
p->writeStdin(TQString("YES"));
required=TQString();
}
if (required.find("ask_revocation_reason.code")!=-1) {
+ // kdDebug(2100) << k_funcinfo << " ask_revocation_reason.code " << endl;
p->writeStdin(TQString::number(revokeReason));
required=TQString();
}
if (required.find("passphrase.enter")!=-1) {
+ // kdDebug(2100) << k_funcinfo << " passphrase.enter " << endl;
TQCString signpass;
int code=KPasswordDialog::getPassword(signpass,i18n("<qt>Enter passphrase for <b>%1</b>:</qt>").arg(userIDs));
if (code!=TQDialog::Accepted) {
@@ -1812,6 +2004,7 @@ void KgpgInterface::revokeprocess(KProcIO *p)
}
if (required.find("ask_revocation_reason.text")!=-1) {
+ // kdDebug(2100) << k_funcinfo << " ask_revocation_reason.text " << endl;
// kdDebug(2100)<<"description"<<endl;
p->writeStdin(revokeDescription);
revokeDescription=TQString();
@@ -1833,6 +2026,7 @@ void KgpgInterface::revokeprocess(KProcIO *p)
TQString KgpgInterface::getGpgSetting(TQString name,TQString configFile)
{
+// kdDebug(2100) << k_funcinfo << endl;
name=name.stripWhiteSpace()+" ";
TQFile qfile(TQFile::encodeName(configFile));
if (qfile.open(IO_ReadOnly) && (qfile.exists())) {
@@ -1855,6 +2049,7 @@ TQString KgpgInterface::getGpgSetting(TQString name,TQString configFile)
TQString KgpgInterface::getGpgMultiSetting(TQString name,TQString configFile)
{
+// kdDebug(2100) << k_funcinfo << endl;
// get GnuPG setting for item that can have multiple entries (eg. encrypt-to)
TQString parsedResult=TQString();
@@ -1884,6 +2079,7 @@ TQString parsedResult=TQString();
void KgpgInterface::delGpgGroup(TQString name, TQString configFile)
{
+// kdDebug(2100) << k_funcinfo << endl;
TQString textToWrite;
TQFile qfile(TQFile::encodeName(configFile));
if (qfile.open(IO_ReadOnly) && (qfile.exists())) {
@@ -1912,6 +2108,7 @@ void KgpgInterface::delGpgGroup(TQString name, TQString configFile)
void KgpgInterface::setGpgGroupSetting(TQString name,TQStringList values, TQString configFile)
{
+// kdDebug(2100) << k_funcinfo << endl;
TQString textToWrite;
bool found=false;
TQFile qfile(TQFile::encodeName(configFile));
@@ -1951,6 +2148,7 @@ void KgpgInterface::setGpgGroupSetting(TQString name,TQStringList values, TQStri
TQStringList KgpgInterface::getGpgGroupSetting(TQString name,TQString configFile)
{
+// kdDebug(2100) << k_funcinfo << endl;
TQFile qfile(TQFile::encodeName(configFile));
if (qfile.open(IO_ReadOnly) && (qfile.exists())) {
@@ -1978,6 +2176,7 @@ TQStringList KgpgInterface::getGpgGroupSetting(TQString name,TQString configFile
TQStringList KgpgInterface::getGpgGroupNames(TQString configFile)
{
+// kdDebug(2100) << k_funcinfo << endl;
TQStringList groups;
TQFile qfile(TQFile::encodeName(configFile));
if (qfile.open(IO_ReadOnly) && (qfile.exists())) {
@@ -2000,6 +2199,7 @@ TQStringList KgpgInterface::getGpgGroupNames(TQString configFile)
bool KgpgInterface::getGpgBoolSetting(TQString name,TQString configFile)
{
+// kdDebug(2100) << k_funcinfo << endl;
name=name;
TQFile qfile(TQFile::encodeName(configFile));
if (qfile.open(IO_ReadOnly) && (qfile.exists())) {
@@ -2019,6 +2219,7 @@ bool KgpgInterface::getGpgBoolSetting(TQString name,TQString configFile)
void KgpgInterface::setGpgSetting(TQString name,TQString value,TQString url)
{
+// kdDebug(2100) << k_funcinfo << endl;
name=name+" ";
TQString textToWrite;
bool found=false;
@@ -2045,7 +2246,7 @@ void KgpgInterface::setGpgSetting(TQString name,TQString value,TQString url)
if (qfile.open(IO_WriteOnly)) {
TQTextStream t( &qfile);
- t << textToWrite;
+ t << textToWrite; // FIXME: this shouldn't write at the end of the gpg.conf file
qfile.close();
}
}
@@ -2054,6 +2255,7 @@ void KgpgInterface::setGpgSetting(TQString name,TQString value,TQString url)
void KgpgInterface::setGpgMultiSetting(TQString name,TQStringList values,TQString url)
{
+// kdDebug(2100) << k_funcinfo << endl;
name=name+" ";
TQString textToWrite;
bool found=false;
@@ -2086,6 +2288,7 @@ void KgpgInterface::setGpgMultiSetting(TQString name,TQStringList values,TQStrin
void KgpgInterface::setGpgBoolSetting(TQString name,bool enable,TQString url)
{
+// kdDebug(2100) << k_funcinfo << endl;
TQString textToWrite;
bool found=false;
TQFile qfile(TQFile::encodeName(url));
@@ -2119,6 +2322,7 @@ void KgpgInterface::setGpgBoolSetting(TQString name,bool enable,TQString url)
TQString KgpgInterface::checkForUtf8bis(TQString txt)
{
+// kdDebug(2100) << k_funcinfo << endl;
if (strchr (txt.ascii(), 0xc3) || (txt.find("\\x")!=-1))
txt=checkForUtf8(txt);
else {
@@ -2131,6 +2335,7 @@ TQString KgpgInterface::checkForUtf8bis(TQString txt)
TQString KgpgInterface::checkForUtf8(TQString txt)
{
+// kdDebug(2100) << k_funcinfo << endl;
// code borrowed from gpa
const char *s;
diff --git a/kgpg/kgpgoptions.cpp b/kgpg/kgpgoptions.cpp
index 9a07a83..d564167 100644
--- a/kgpg/kgpgoptions.cpp
+++ b/kgpg/kgpgoptions.cpp
@@ -65,15 +65,23 @@ class TQTabWidget;
kgpgOptions::kgpgOptions(TQWidget *parent, const char *name)
: TDEConfigDialog( parent, name, KGpgSettings::self())
{
- defaultServerList="hkp://wwwkeys.eu.pgp.net ";
- defaultServerList+=i18n("(Default)");
+ defaultKeyServer="hkp://wwwkeys.eu.pgp.net";
+ defaultServerList=defaultKeyServer;
+// defaultServerList+=i18n("(Default)");
defaultServerList+=",hkp://search.keyserver.net,hkp://wwwkeys.pgp.net,hkp://pgp.dtype.org,hkp://wwwkeys.us.pgp.net";
config = new TDEConfig ("kgpgrc");
config->setGroup("Servers");
+ defaultKeyServer=config->readEntry("Default_Server",defaultKeyServer);
+ TQString keyServer = KgpgInterface::getGpgSetting("keyserver", KGpgSettings::gpgConfigPath());
+
+ if (!keyServer.isEmpty() ) {
+ defaultKeyServer=keyServer;
+ }
+
serverList=TQStringList::split (",",config->readEntry("Server_List",defaultServerList));
- keyServer = KgpgInterface::getGpgSetting("keyserver", KGpgSettings::gpgConfigPath());
- if (!keyServer.isEmpty()) serverList.prepend(keyServer+" "+i18n("(Default)"));
+
+// kdDebug(2100)<<"Servers: "<< serverList.join(", ")<<endl;
defaultHomePath=TQDir::homeDirPath()+"/.gnupg/";
if (TQFile(defaultHomePath+"options").exists()) defaultConfigPath="options";
@@ -83,7 +91,7 @@ kgpgOptions::kgpgOptions(TQWidget *parent, const char *name)
else defaultConfigPath=TQString();
}
-kdDebug(2100)<<"Adding pages"<<endl;
+// kdDebug(2100)<<"Adding pages"<<endl;
page1=new Encryption();
page2=new Decryption();
page3=new UIConf();
@@ -185,42 +193,46 @@ void kgpgOptions::insertAlwaysKey()
void kgpgOptions::slotChangeHome()
{
-TQString gpgHome=KFileDialog::getExistingDirectory(page4->gpg_home_path->text(),this,i18n("New GnuPG Home Location"));
-if (gpgHome.isEmpty()) return;
-if (!gpgHome.endsWith("/")) gpgHome.append("/");
+ TQString gpgHome=KFileDialog::getExistingDirectory(page4->gpg_home_path->text(),this,i18n("New GnuPG Home Location"));
+ if (gpgHome.isEmpty()) {
+ return;
+ }
+ if (!gpgHome.endsWith("/")) {
+ gpgHome.append("/");
+ }
TQString confPath="options";
- if (!TQFile(gpgHome+confPath).exists()) {
- confPath="gpg.conf";
- if (!TQFile(gpgHome+confPath).exists())
- {
- if (KMessageBox::questionYesNo(this,i18n("No configuration file was found in the selected location.\nDo you want to create it now ?\n\nWithout configuration file, neither KGpg nor Gnupg will work properly."),i18n("No Configuration File Found"),i18n("Create"),i18n("Ignore"))==KMessageBox::Yes) ////////// Try to create config File by running gpg once
- {
- KProcIO *p=new KProcIO();
- *p<<"gpg"<<"--homedir"<<gpgHome<<"--no-tty"<<"--list-secret-keys";
- p->start(TDEProcess::Block); //// start gnupg so that it will create a config file
+ if (!TQFile(gpgHome+confPath).exists()) {
confPath="gpg.conf";
- TQFile confFile(gpgHome+confPath);
- if (!confFile.open(IO_WriteOnly))
- {KMessageBox::sorry(this,i18n("Cannot create configuration file. Please check if destination media is mounted and if you have write access"));
- return;
- }
- else
- {
- TQTextStream stream( &confFile );
- stream<<"# Config file created by KGpg\n\n";
- confFile.close();
- }
- }
- else confPath=TQString();
- }
+ if (!TQFile(gpgHome+confPath).exists()) {
+ if (KMessageBox::questionYesNo(this,i18n("No configuration file was found in the selected location.\nDo you want to create it now ?\n\nWithout configuration file, neither KGpg nor Gnupg will work properly."),i18n("No Configuration File Found"),i18n("Create"),i18n("Ignore"))
+ ==KMessageBox::Yes) {////////// Try to create config File by running gpg once
+ KProcIO *p=new KProcIO();
+ *p<<"gpg"<<"--homedir"<<gpgHome<<"--no-tty"<<"--list-secret-keys";
+ p->start(TDEProcess::Block); //// start gnupg so that it will create a config file
+ confPath="gpg.conf";
+ TQFile confFile(gpgHome+confPath);
+ if (!confFile.open(IO_WriteOnly)) {
+ KMessageBox::sorry(this,i18n("Cannot create configuration file. Please check if destination media is mounted and if you have write access"));
+ return;
+ }
+ else {
+ TQTextStream stream( &confFile );
+ stream<<"# Config file created by KGpg\n\n";
+ confFile.close();
+ }
+ }
+ else {
+ confPath=TQString();
+ }
}
- page4->gpg_conf_path->setText(confPath);
- page4->gpg_home_path->setText(gpgHome);
+ }
+ page4->gpg_conf_path->setText(confPath);
+ page4->gpg_home_path->setText(gpgHome);
}
void kgpgOptions::updateWidgets()
{
-TQString pubKeyring,privKeyring;
+ TQString pubKeyring,privKeyring;
gpgConfigPath = KGpgSettings::gpgConfigPath();
page4->gpg_conf_path->setText(KURL(gpgConfigPath).fileName());
@@ -254,17 +266,23 @@ TQString pubKeyring,privKeyring;
page4->use_agent->setChecked( useAgent );
- keyServer = KgpgInterface::getGpgSetting("keyserver", gpgConfigPath);
- defaultKeyServer = "hkp://wwwkeys.pgp.net";
+ TQString keyServer = KgpgInterface::getGpgSetting("keyserver", gpgConfigPath);
+// defaultKeyServer = "hkp://wwwkeys.pgp.net";
+
+ if (!keyServer.isEmpty()) {
+ defaultKeyServer = keyServer;
+ }
+ else {
+ defaultKeyServer = "hkp://wwwkeys.pgp.net";
+ }
- if (keyServer.isEmpty())
- keyServer = defaultKeyServer;
+ serverList.prepend(defaultKeyServer+" "+i18n("(Default)"));
page6->ServerBox->clear();
page6->ServerBox->insertStringList(serverList);
- kdDebug(2100)<<"Finishing options"<<endl;
+// kdDebug(2100)<<"Finishing options"<<endl;
}
void kgpgOptions::updateWidgetsDefault()
@@ -288,7 +306,7 @@ void kgpgOptions::updateWidgetsDefault()
page6->ServerBox->clear();
page6->ServerBox->insertStringList(TQStringList::split(",",defaultServerList));
- kdDebug(2100)<<"Finishing default options"<<endl;
+// kdDebug(2100)<<"Finishing default options"<<endl;
}
bool kgpgOptions::isDefault()
@@ -413,19 +431,18 @@ void kgpgOptions::updateSettings()
TQString currList;
serverList=TQStringList ();
- for (uint i=0;i<page6->ServerBox->count();i++)
- {
- TQString currItem=page6->ServerBox->text(i);
- if (currItem.find(" ")!=-1) // it is the default keyserver
- keyServer=currItem.section(" ",0,0);
- else
- {
- serverList.append(currItem);
- }
+ for (uint i=0;i<page6->ServerBox->count();i++) { // 0 is always the default
+ TQString currItem=page6->ServerBox->text(i);
+ if (currItem.find(" ")!=-1) {// it is the default keyserver
+ defaultKeyServer = currItem.section(" ",0,0);
+ }
+ else {
+ serverList.append(currItem);
+ }
}
- KgpgInterface::setGpgSetting("keyserver",keyServer, KGpgSettings::gpgConfigPath());
- serverList.prepend(keyServer+" "+i18n("(Default)"));
+ KgpgInterface::setGpgSetting("keyserver",defaultKeyServer, KGpgSettings::gpgConfigPath());
+ //serverList.prepend(keyServer+" "+i18n("(Default)"));
currList=serverList.join(",");
if (keyGood!=page3->kcfg_ColorGood->color())
@@ -437,6 +454,7 @@ void kgpgOptions::updateSettings()
// KGpgSettings::writeConfig();
config->setGroup("Servers");
+ config->writeEntry("Default_Server",defaultKeyServer);
config->writeEntry("Server_List",currList);
emit settingsUpdated();
if (emitReload) emit reloadKeyList();
@@ -483,13 +501,18 @@ void kgpgOptions::slotRemoveMenu(TQString menu)
TQString path=locateLocal("data","konqueror/servicemenus/"+menu);
TQFile qfile(path);
- if (qfile.exists())
- qfile.remove();
- {
- //if (!qfile.remove()) KMessageBox::sorry(this,i18n("Cannot remove service menu. Check permissions"));
- //else KMessageBox::information(this,i18n("Service menu 'Decrypt File' has been removed."));
- }
- //else KMessageBox::sorry(this,i18n("No service menu found"));
+ if (qfile.exists()) {
+ qfile.remove();
+ //if (!qfile.remove()) {
+ // KMessageBox::sorry(this,i18n("Cannot remove service menu. Check permissions"));
+ //}
+ //else {
+ // KMessageBox::information(this,i18n("Service menu 'Decrypt File' has been removed."));
+ //}
+ }
+ //else {
+ // KMessageBox::sorry(this,i18n("No service menu found"));
+ //}
}
@@ -518,9 +541,11 @@ void kgpgOptions::listkey()
//////// update display of keys in main management window
FILE *fp;
- TQString tst,name,trustedvals="idre-",issec;
+ TQString name,trustedvals="idre-",issec;
int counter=0;
char line[300];
+ TQString currentKey;
+ TQMap<TQString,TQStringList> hashMap;
FILE *fp2;
@@ -533,33 +558,64 @@ void kgpgOptions::listkey()
pclose(fp2);
- fp = popen("gpg --no-tty --with-colon --list-keys", "r");
- while ( fgets( line, sizeof(line), fp)) {
- tst=line;
- if (tst.startsWith("pub")) {
- name=KgpgInterface::checkForUtf8(tst.section(':',9,9));
- if ((!name.isEmpty()) && (trustedvals.find(tst.section(':',1,1))==-1)) {
- counter++;
- //name=name.section('<',-1,-1);
- // name=name.section('>',0,0);
- names+=name;
- ids+=tst.section(':',4,4);
- if (tst.section(':',4,4).right(8)==alwaysKeyID)
- alwaysKeyName=tst.section(':',4,4).right(8)+":"+name;
- if (issec.find(tst.section(':',4,4).right(8),0,FALSE)!=-1)
- {
+ fp = popen("gpg --no-tty --with-colon --list-keys", "r");
+ while ( fgets( line, sizeof(line), fp)) {
+ TQString tst=TQString::fromUtf8(line);
+ kdDebug(2100) << k_funcinfo << "Read one secret key line: " << tst << endl;
+ if ( tst.startsWith("pub") ) {
+ currentKey = tst.section(':',4,4);
+ TQStringList lst; lst << tst;
+ hashMap.insert(currentKey,lst);
+ }
+ else {
+ hashMap.find(currentKey).data().append(tst);
+ }
+ }
+ pclose(fp);
+
+// process the list
+
+ TQMap<TQString,TQStringList>::Iterator ite;
+ for (ite = hashMap.begin(); ite != hashMap.end(); ite++) {
+ TDEListViewItem *item;
+ TQStringList::Iterator it;
+ bool dead = true;
+ TQString name,id,val;
+
+ for (it = ite.data().begin(); it != ite.data().end(); it++) {
+ TQString tst = (*it);
+ if ( tst.startsWith("pub") ) {
+ if ( KgpgInterface::getGpgVersion() < 210 ) {
+ name=KgpgInterface::checkForUtf8(tst.section(':',9,9));
+ }
+ val = tst.section(':',1,1);
+ id = tst.section(':',4,4);
+ }
+ if ( tst.startsWith("uid") && KgpgInterface::getGpgVersion() >= 210 ) {
+ name=KgpgInterface::checkForUtf8(tst.section(':',9,9));
+ }
+ }
+
+ if ((!name.isEmpty()) && (trustedvals.find(val)==-1)) {
+ counter++;
+ //name=name.section('<',-1,-1);
+ // name=name.section('>',0,0);
+ names+=name;
+ ids+=id;
+ if (id.right(8)==alwaysKeyID) {
+ alwaysKeyName=id.right(8)+":"+name;
+ }
+ if (issec.find(id.right(8),0,FALSE)!=-1) {
//*** page1->file_key->insertItem(pixkeyDouble,tst.section(':',4,4).right(8)+":"+name);
//*** page1->always_key->insertItem(pixkeyDouble,tst.section(':',4,4).right(8)+":"+name);
- }
- else
- {
+ }
+ else {
//*** page1->file_key->insertItem(pixkeySingle,tst.section(':',4,4).right(8)+":"+name);
//*** page1->always_key->insertItem(pixkeySingle,tst.section(':',4,4).right(8)+":"+name);
- }
- }
- }
- }
- pclose(fp);
+ }
+ }
+ }
+
if (counter==0) {
ids+="0";
//*** page1->file_key->insertItem(i18n("none"));
@@ -569,32 +625,37 @@ void kgpgOptions::listkey()
void kgpgOptions::slotAddKeyServer()
{
-TQString newServer=KInputDialog::getText(i18n("Add New Key Server"),i18n("Server URL:"));
-if (!newServer.isEmpty())
-page6->ServerBox->insertItem(newServer.stripWhiteSpace());
-page6->ServerBox->setSelected(page6->ServerBox->findItem(newServer.stripWhiteSpace()),true);
+ TQString newServer=KInputDialog::getText(i18n("Add New Key Server"),i18n("Server URL:"));
+ if (!newServer.isEmpty()) {
+ page6->ServerBox->insertItem(newServer.stripWhiteSpace());
+ }
+ page6->ServerBox->setSelected(page6->ServerBox->findItem(newServer.stripWhiteSpace()),true);
}
void kgpgOptions::slotDelKeyServer()
{
-bool defaultDeleted=false;
-if (page6->ServerBox->currentText().find(" ")!=-1) defaultDeleted=true;
-page6->ServerBox->removeItem(page6->ServerBox->currentItem());
-page6->ServerBox->setSelected(0,true);
-if (defaultDeleted) page6->ServerBox->changeItem(page6->ServerBox->currentText().section(" ",0,0)+" "+i18n("(Default)"),0);
+ bool defaultDeleted=false;
+ if (page6->ServerBox->currentText().find(" ")!=-1) {
+ defaultDeleted=true;
+ }
+ page6->ServerBox->removeItem(page6->ServerBox->currentItem());
+ page6->ServerBox->setSelected(0,true);
+ if (defaultDeleted) {
+ page6->ServerBox->changeItem(page6->ServerBox->currentText().section(" ",0,0)+" "+i18n("(Default)"),0);
+ }
}
void kgpgOptions::slotDefaultKeyServer()
{
-uint curr=page6->ServerBox->currentItem();
-page6->ServerBox->changeItem(page6->ServerBox->currentText ().section(" ",0,0)+" "+i18n("(Default)"),curr);
+ uint curr=page6->ServerBox->currentItem();
+ page6->ServerBox->changeItem(page6->ServerBox->currentText ().section(" ",0,0)+" "+i18n("(Default)"),curr);
-for (uint i=0;i<page6->ServerBox->count();i++)
-{
-if (i!=curr)
-page6->ServerBox->changeItem(page6->ServerBox->text(i).section(" ",0,0),i);
-}
-page6->ServerBox->setSelected(curr,true);
+ for (uint i=0;i<page6->ServerBox->count();i++) {
+ if (i!=curr) {
+ page6->ServerBox->changeItem(page6->ServerBox->text(i).section(" ",0,0),i);
+ }
+ }
+ page6->ServerBox->setSelected(curr,true);
}
#include "kgpgoptions.moc"
diff --git a/kgpg/kgpgoptions.h b/kgpg/kgpgoptions.h
index 5b981de..272384e 100644
--- a/kgpg/kgpgoptions.h
+++ b/kgpg/kgpgoptions.h
@@ -60,7 +60,7 @@ private:
TQPixmap pixkeySingle,pixkeyDouble;
TQString fileEncryptionKey;
TQString gpgConfigPath;
- TQString keyServer,defaultServerList;
+ TQString defaultServerList;
TQString defaultKeyServer;
TQFont startFont;
bool useAgent;
diff --git a/kgpg/listkeys.cpp b/kgpg/listkeys.cpp
index 4b1f2ee..2c75853 100644
--- a/kgpg/listkeys.cpp
+++ b/kgpg/listkeys.cpp
@@ -4,6 +4,10 @@
begin : Thu Jul 4 2002
copyright : (C) 2002 by Jean-Baptiste Mardelle
email : bj@altern.org
+
+ updated to handle gpg21 : Sun Jul 30 10:18:29 CEST 2017
+ copyright : (C) 2017 by Emanoil Kotsev
+ email : deloptes@yahoo.com
***************************************************************************/
/***************************************************************************
@@ -47,6 +51,7 @@
#include <tqtoolbutton.h>
#include <tqradiobutton.h>
#include <tqpopupmenu.h>
+#include <tqcursor.h>
#include <kurlrequester.h>
#include <tdeio/netaccess.h>
@@ -216,7 +221,6 @@ TQString UpdateViewItem::key( int column, bool ) const
KgpgSelKey::KgpgSelKey(TQWidget *parent, const char *name,bool allowMultipleSelection, TQString preselected):
KDialogBase( parent, name, true,i18n("Private Key List"),Ok | Cancel)
{
- TQString keyname;
page = new TQWidget(this);
TQLabel *labeltxt;
TDEIconLoader *loader = TDEGlobal::iconLoader();
@@ -239,49 +243,82 @@ KDialogBase( parent, name, true,i18n("Private Key List"),Ok | Cancel)
if (preselected==TQString()) preselected = KGpgSettings::defaultKey();
FILE *fp,*fp2;
- TQString fullname,tst,tst2;
char line[300];
bool selectedok=false;
bool warn=false;
- TDEListViewItem *item;
+ TQString currentKey;
+ TQMap<TQString,TQStringList> hashMap;
+
+ fp = popen("gpg --no-tty --with-colons --list-secret-keys", "r");
+ while ( fgets( line, sizeof(line), fp)) {
+ TQString tst=TQString::fromUtf8(line);
+// kdDebug(2100) << k_funcinfo << "Read one secret key line: " << tst << endl;
+ if ( tst.startsWith("sec") ) {
+ currentKey = tst.section(':',4,4);
+ TQStringList lst; lst << tst;
+ hashMap.insert(currentKey,lst);
+ }
+ else {
+ hashMap.find(currentKey).data().append(tst);
+ }
+ }
+ pclose(fp);
+
+// process the list
+
+ TQMap<TQString,TQStringList>::Iterator ite;
+ for (ite = hashMap.begin(); ite != hashMap.end(); ite++) {
+ TDEListViewItem *item;
+ TQStringList::Iterator it;
+ bool dead = true;
+ TQString fullname,val,id;
+
+ for (it = ite.data().begin(); it != ite.data().end(); it++) {
+ TQString tst = (*it);
+ TQStringList keyString=TQStringList::split(":",tst,true);
+ if (tst.startsWith("sec")) {
+ val=keyString[6];
+ id=TQString("0x"+keyString[4].right(8));
+ if (val.isEmpty()) {
+ val=i18n("Unlimited");
+ }
+ fullname=keyString[9];
+
+ fp2 = popen(TQFile::encodeName(TQString("gpg --no-tty --with-colons --list-key %1").arg(KShellProcess::quote(id))), "r");
+ dead=true;
+ while ( fgets( line, sizeof(line), fp2)) {
+ TQString tst2=TQString::fromUtf8(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;
+ case '-':
+ if (tst2.section(':',11,11).find('D')==-1) {
+ warn=true;
+ }
+ break;
+ default:
+ break;
+ }
+ if (tst2.section(':',11,11).find('D')!=-1) {
+ dead=true;
+ }
+ break;
+ }
+ }
+ pclose(fp2);
+ }
+ if ( tst.startsWith("uid") && fullname.isEmpty() ) {
+ fullname = tst.section(':',9,9);
+ }
+ }
- fp = popen("gpg --no-tty --with-colons --list-secret-keys", "r");
- while ( fgets( line, sizeof(line), fp)) {
- tst=TQString::fromUtf8(line);
- if (tst.startsWith("sec")) {
- TQStringList keyString=TQStringList::split(":",tst,true);
- TQString val=keyString[6];
- TQString id=TQString("0x"+keyString[4].right(8));
- if (val.isEmpty())
- val=i18n("Unlimited");
- fullname=keyString[9];
-
- fp2 = popen(TQFile::encodeName(TQString("gpg --no-tty --with-colons --list-key %1").arg(KShellProcess::quote(id))), "r");
- bool dead=true;
- while ( fgets( line, sizeof(line), fp2)) {
- tst2=TQString::fromUtf8(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;
- case '-':
- if (tst2.section(':',11,11).find('D')==-1) warn=true;
- break;
- default:
- break;
- }
- if (tst2.section(':',11,11).find('D')!=-1)
- dead=true;
- break;
- }
- }
- pclose(fp2);
if (!fullname.isEmpty() && (!dead)) {
TQString keyMail,keyName;
if (fullname.find("<")!=-1) {
@@ -308,8 +345,6 @@ KDialogBase( parent, name, true,i18n("Private Key List"),Ok | Cancel)
}
}
}
- }
- pclose(fp);
if (warn)
{
@@ -395,6 +430,7 @@ TQString KgpgSelKey::getkeyMail()
KeyView::KeyView( TQWidget *parent, const char *name )
: TDEListView( parent, name )
{
+// kdDebug(2100) << k_funcinfo << endl;
TDEIconLoader *loader = TDEGlobal::iconLoader();
pixkeyOrphan=loader->loadIcon("kgpg_key4",TDEIcon::Small,20);
@@ -434,6 +470,7 @@ KeyView::KeyView( TQWidget *parent, const char *name )
void KeyView::droppedfile (KURL url)
{
+// kdDebug(2100) << k_funcinfo << endl;
if (KMessageBox::questionYesNo(this,i18n("<p>Do you want to import file <b>%1</b> into your key ring?</p>").arg(url.path()), TQString(), i18n("Import"), i18n("Do Not Import"))!=KMessageBox::Yes)
return;
@@ -479,8 +516,8 @@ void KeyView::startDrag()
mySearchLine::mySearchLine(TQWidget *parent, KeyView *listView, const char *name)
:TDEListViewSearchLine(parent,listView,name)
{
-searchListView=listView;
-setKeepParentsVisible(false);
+ searchListView=listView;
+ setKeepParentsVisible(false);
}
mySearchLine::~ mySearchLine()
@@ -497,6 +534,7 @@ else return TDEListViewSearchLine::itemMatches(item,s);
void mySearchLine::updateSearch(const TQString& s)
{
+// kdDebug(2100) << k_funcinfo << endl;
TDEListViewSearchLine::updateSearch(s);
if (searchListView->displayOnlySecret || !searchListView->displayDisabled)
{
@@ -521,8 +559,10 @@ void mySearchLine::updateSearch(const TQString& s)
listKeys::listKeys(TQWidget *parent, const char *name) : DCOPObject( "KeyInterface" ), TDEMainWindow(parent, name,0)
{
+// kdDebug(2100) << k_funcinfo << endl;
//KWin::setType(TQt::WDestructiveClose);
+
keysList2 = new KeyView(this);
keysList2->photoKeysList=TQString();
keysList2->groupNb=0;
@@ -725,6 +765,8 @@ listKeys::listKeys(TQWidget *parent, const char *name) : DCOPObject( "KeyInterfa
connect(s_kgpgEditor,TQT_SIGNAL(refreshImported(TQStringList)),keysList2,TQT_SLOT(slotReloadKeys(TQStringList)));
connect(this,TQT_SIGNAL(fontChanged(TQFont)),s_kgpgEditor,TQT_SLOT(slotSetFont(TQFont)));
connect(s_kgpgEditor->view->editor,TQT_SIGNAL(refreshImported(TQStringList)),keysList2,TQT_SLOT(slotReloadKeys(TQStringList)));
+
+// kdDebug(2100) << k_funcinfo << "getGpgversion" << KgpgInterface::getGpgVersion() <<endl;
}
@@ -849,6 +891,7 @@ void listKeys::slotGotoDefaultKey()
void listKeys::refreshKeyFromServer()
{
+// kdDebug(2100) << k_funcinfo << endl;
if (keysList2->currentItem()==NULL)
return;
TQString keyIDS;
@@ -874,6 +917,7 @@ void listKeys::refreshKeyFromServer()
void listKeys::refreshFinished()
{
+// kdDebug(2100) << k_funcinfo << endl;
if (kServer)
kServer=0L;
@@ -902,6 +946,7 @@ void listKeys::slotDelUid()
void listKeys::slotregenerate()
{
+// kdDebug(2100) << k_funcinfo << endl;
FILE *fp;
TQString tst;
char line[300];
@@ -1029,6 +1074,7 @@ void listKeys::slotSetPhotoSize(int size)
void listKeys::findKey()
{
+// kdDebug(2100) << k_funcinfo << endl;
KFindDialog fd(this,"find_dialog",0,"");
if ( fd.exec() != TQDialog::Accepted )
return;
@@ -1039,6 +1085,7 @@ void listKeys::findKey()
void listKeys::findFirstKey()
{
+// kdDebug(2100) << k_funcinfo << endl;
if (searchString.isEmpty())
return;
bool foundItem=true;
@@ -1075,6 +1122,7 @@ void listKeys::findFirstKey()
void listKeys::findNextKey()
{
+// kdDebug(2100) << k_funcinfo << endl;
//kdDebug(2100)<<"find next"<<endl;
if (searchString.isEmpty()) {
findKey();
@@ -1119,6 +1167,7 @@ void listKeys::findNextKey()
void listKeys::addToKAB()
{
+// kdDebug(2100) << k_funcinfo << endl;
TDEABC::Key key;
if (!keysList2->currentItem()) return;
//TQString email=extractKeyMail(keysList2->currentItem()).stripWhiteSpace();
@@ -1200,6 +1249,7 @@ void listKeys::closeEvent ( TQCloseEvent * e )
void listKeys::showKeyServer()
{
+// kdDebug(2100) << k_funcinfo << endl;
keyServer *ks=new keyServer(this);
connect(ks,TQT_SIGNAL( importFinished(TQString) ) , keysList2, TQT_SLOT(refreshcurrentkey(TQString)));
ks->exec();
@@ -1211,6 +1261,7 @@ void listKeys::showKeyServer()
void listKeys::checkList()
{
+// kdDebug(2100) << k_funcinfo << endl;
TQPtrList<TQListViewItem> exportList=keysList2->selectedItems();
if (exportList.count()>1)
{
@@ -1266,6 +1317,7 @@ void listKeys::quitApp()
void listKeys::readOptions()
{
+// kdDebug(2100) << k_funcinfo << endl;
clipboardMode=TQClipboard::Clipboard;
if (KGpgSettings::useMouseSelection() && (kapp->clipboard()->supportsSelection()))
clipboardMode=TQClipboard::Selection;
@@ -1488,6 +1540,7 @@ void listKeys::slotexportsec()
void listKeys::slotexport()
{
+// kdDebug(2100) << k_funcinfo << endl;
///////////////////// export key
if (keysList2->currentItem()==NULL)
return;
@@ -1599,6 +1652,7 @@ void listKeys::slotProcessExportClip(TQString keys)
void listKeys::showKeyInfo(TQString keyID)
{
+// kdDebug(2100) << k_funcinfo << endl;
KgpgKeyInfo *opts=new KgpgKeyInfo(this,"key_props",keyID);
opts->show();
}
@@ -1606,16 +1660,22 @@ void listKeys::showKeyInfo(TQString keyID)
void listKeys::slotShowPhoto()
{
+// kdDebug(2100) << k_funcinfo << endl;
TDETrader::OfferList offers = TDETrader::self()->query("image/jpeg", "Type == 'Application'");
KService::Ptr ptr = offers.first();
//KMessageBox::sorry(0,ptr->desktopEntryName());
KProcIO *p=new KProcIO(TQTextCodec::codecForLocale());
- *p<<"gpg"<<"--no-tty"<<"--photo-viewer"<<TQString(TQFile::encodeName(ptr->desktopEntryName()+" %i"))<<"--edit-key"<<keysList2->currentItem()->parent()->text(6)<<"uid"<<keysList2->currentItem()->text(6)<<"showphoto"<<"quit";
+ *p<<"gpg"<<"--no-tty"
+ <<"--photo-viewer"<<TQString(TQFile::encodeName(ptr->desktopEntryName()+" %i"))
+ <<"--edit-key"<<keysList2->currentItem()->parent()->text(6)
+ <<"uid"<<keysList2->currentItem()->text(6)
+ <<"showphoto"<<"quit";
p->start(TDEProcess::DontCare,true);
}
void listKeys::listsigns()
{
+// kdDebug(2100) << k_funcinfo << endl;
//kdDebug(2100)<<"Edit -------------------------------"<<endl;
if (keysList2->currentItem()==NULL)
return;
@@ -1646,6 +1706,7 @@ void listKeys::listsigns()
void listKeys::groupAdd()
{
+// kdDebug(2100) << k_funcinfo << endl;
TQPtrList<TQListViewItem> addList=gEdit->availableKeys->selectedItems();
for ( uint i = 0; i < addList.count(); ++i )
if ( addList.at(i) ) {
@@ -1655,6 +1716,7 @@ void listKeys::groupAdd()
void listKeys::groupRemove()
{
+// kdDebug(2100) << k_funcinfo << endl;
TQPtrList<TQListViewItem> remList=gEdit->groupKeys->selectedItems();
for ( uint i = 0; i < remList.count(); ++i )
if ( remList.at(i) ) {
@@ -1664,6 +1726,7 @@ void listKeys::groupRemove()
void listKeys::deleteGroup()
{
+// kdDebug(2100) << k_funcinfo << endl;
if (!keysList2->currentItem() || !keysList2->currentItem()->text(6).isEmpty())
return;
@@ -1686,6 +1749,7 @@ void listKeys::deleteGroup()
void listKeys::groupChange()
{
+// kdDebug(2100) << k_funcinfo << endl;
TQStringList selected;
TQListViewItem *item=gEdit->groupKeys->firstChild();
while (item) {
@@ -1697,6 +1761,7 @@ void listKeys::groupChange()
void listKeys::createNewGroup()
{
+// kdDebug(2100) << k_funcinfo << endl;
TQStringList badkeys,keysGroup;
if (keysList2->selectedItems().count()>0) {
@@ -1745,7 +1810,8 @@ void listKeys::createNewGroup()
void listKeys::groupInit(TQStringList keysGroup)
{
- kdDebug(2100)<<"preparing group"<<endl;
+// kdDebug(2100) << k_funcinfo << endl;
+// kdDebug(2100)<<"preparing group"<<endl;
TQStringList lostKeys;
bool foundId;
@@ -1754,7 +1820,7 @@ void listKeys::groupInit(TQStringList keysGroup)
TQListViewItem *item=gEdit->availableKeys->firstChild();
foundId=false;
while (item) {
- kdDebug(2100)<<"Searching in key: "<<item->text(0)<<endl;
+ // kdDebug(2100)<<"Searching in key: "<<item->text(0)<<endl;
if (TQString(*it).right(8).lower()==item->text(2).right(8).lower()) {
gEdit->groupKeys->insertItem(item);
foundId=true;
@@ -1771,6 +1837,7 @@ void listKeys::groupInit(TQStringList keysGroup)
void listKeys::editGroup()
{
+// kdDebug(2100) << k_funcinfo << endl;
if (!keysList2->currentItem() || !keysList2->currentItem()->text(6).isEmpty())
return;
TQStringList keysGroup;
@@ -1826,6 +1893,7 @@ void listKeys::editGroup()
void listKeys::signkey()
{
+// kdDebug(2100) << k_funcinfo << endl;
/////////////// sign a key
if (keysList2->currentItem()==NULL)
return;
@@ -1833,11 +1901,16 @@ void listKeys::signkey()
return;
signList=keysList2->selectedItems();
- bool keyDepth=true;
- for ( uint i = 0; i < signList.count(); ++i )
- if ( signList.at(i) )
- if (signList.at(i)->depth()!=0)
- keyDepth=false;
+
+ bool keyDepth=true;
+ for ( uint i = 0; i < signList.count(); ++i ) {
+ if ( signList.at(i) ) {
+ if (signList.at(i)->depth()!=0) {
+ keyDepth=false;
+ }
+ }
+ // kdDebug(2100) << k_funcinfo << "List at: " << signList.at(i)->text(6) << endl;
+ }
if (!keyDepth) {
KMessageBox::sorry(this,i18n("You can only sign primary keys. Please check your selection."));
return;
@@ -1859,6 +1932,7 @@ void listKeys::signkey()
if ((len > 0) && (len % 4 == 0))
for (uint n = 0; 4*(n+1) < len; n++)
fingervalue.insert(5*n+4, ' ');
+ break;
}
}
pclose(pass);
@@ -1916,6 +1990,11 @@ void listKeys::signkey()
keyCount=0;
delete opts;
globalCount=signList.count();
+
+// kdDebug(2100) << k_funcinfo << "Terminal sign checked: " << terminalSign->isChecked() << endl;
+// kdDebug(2100) << k_funcinfo << "globalCount : " << globalCount << endl;
+// kdDebug(2100) << k_funcinfo << "signList Count : " << globalCount << endl;
+
if (!terminalSign->isChecked())
signLoop();
else {
@@ -1924,26 +2003,25 @@ void listKeys::signkey()
TDEConfig *config = TDEGlobal::config();
config->setGroup("General");
kp<< config->readPathEntry("TerminalApplication","konsole");
- kp<<"-e"
- <<"gpg"
- <<"--no-secmem-warning"
- <<"-u"
- <<globalkeyID
- <<"--edit-key"
- <<signList.at(0)->text(6);
+ kp<<"-e" <<"gpg" <<"--no-secmem-warning"
+ <<"-u" <<globalkeyID <<"--edit-key" <<signList.at(0)->text(6);
if (globalisLocal)
kp<<"lsign";
else
kp<<"sign";
+
+ TQApplication::setOverrideCursor(TQCursor(TQt::BusyCursor));
kp.start(TDEProcess::Block);
keysList2->refreshcurrentkey(keysList2->currentItem());
+ TQApplication::restoreOverrideCursor();
}
}
void listKeys::signLoop()
{
+// kdDebug(2100) << k_funcinfo << endl;
if (keyCount<globalCount) {
- kdDebug(2100)<<"Sign process for key: "<<keyCount<<" on a total of "<<signList.count()<<endl;
+ // kdDebug(2100)<<"Sign process for key: "<<keyCount<<" on a total of "<<signList.count()<<endl;
if ( signList.at(keyCount) ) {
KgpgInterface *signKeyProcess=new KgpgInterface();
TQObject::connect(signKeyProcess,TQT_SIGNAL(signatureFinished(int)),TQT_TQOBJECT(this),TQT_SLOT(signatureResult(int)));
@@ -1954,12 +2032,16 @@ void listKeys::signLoop()
void listKeys::signatureResult(int success)
{
- if (success==3)
- keysList2->refreshcurrentkey(signList.at(keyCount));
-
- else if (success==2)
- KMessageBox::sorry(this,i18n("<qt>Bad passphrase, key <b>%1</b> not signed.</qt>").arg(signList.at(keyCount)->text(0)+i18n(" (")+signList.at(keyCount)->text(1)+i18n(")")));
-
+// kdDebug(2100) << k_funcinfo << endl;
+// kdDebug(2100) << k_funcinfo << "success" << success << endl;
+ if ( success>=3 ) {
+ keysList2->refreshcurrentkey(signList.at(keyCount));
+ }
+ else {
+ if (success==2) {
+ KMessageBox::sorry(this,i18n("<qt>Bad passphrase, key <b>%1</b> not signed.</qt>").arg(signList.at(keyCount)->text(0)+i18n(" (")+signList.at(keyCount)->text(1)+i18n(")")));
+ }
+ }
keyCount++;
signLoop();
}
@@ -1967,6 +2049,7 @@ void listKeys::signatureResult(int success)
void listKeys::importallsignkey()
{
+//// kdDebug(2100) << k_funcinfo << endl;
if (keysList2->currentItem()==NULL)
return;
if (! keysList2->currentItem()->firstChild()) {
@@ -1989,6 +2072,7 @@ void listKeys::importallsignkey()
void listKeys::preimportsignkey()
{
+// kdDebug(2100) << k_funcinfo << endl;
if (keysList2->currentItem()==NULL)
return;
else
@@ -1997,7 +2081,7 @@ void listKeys::preimportsignkey()
bool listKeys::importRemoteKey(TQString keyID)
{
-
+// kdDebug(2100) << k_funcinfo << endl;
kServer=new keyServer(0,"server_dialog",false,true);
kServer->page->kLEimportid->setText(keyID);
kServer->page->Buttonimport->setDefault(true);
@@ -2013,6 +2097,7 @@ bool listKeys::importRemoteKey(TQString keyID)
void listKeys::dcopImportFinished()
{
+// kdDebug(2100) << k_funcinfo << endl;
if (kServer)
kServer=0L;
TQByteArray params;
@@ -2024,11 +2109,13 @@ void listKeys::dcopImportFinished()
void listKeys::importsignkey(TQString importKeyId)
{
+// kdDebug(2100) << k_funcinfo << endl;
/////////////// sign a key
kServer=new keyServer(0,"server_dialog",false);
kServer->page->kLEimportid->setText(importKeyId);
//kServer->Buttonimport->setDefault(true);
kServer->slotImport();
+// kServer->slotSearch();
//kServer->show();
connect( kServer, TQT_SIGNAL( importFinished(TQString) ) , this, TQT_SLOT( importfinished()));
}
@@ -2036,6 +2123,7 @@ void listKeys::importsignkey(TQString importKeyId)
void listKeys::importfinished()
{
+// kdDebug(2100) << k_funcinfo << endl;
if (kServer)
kServer=0L;
refreshkey();
@@ -2044,10 +2132,12 @@ void listKeys::importfinished()
void listKeys::delsignkey()
{
+// kdDebug(2100) << k_funcinfo << endl;
/////////////// sign a key
if (keysList2->currentItem()==NULL)
return;
- if (keysList2->currentItem()->depth()>1) {
+ if ( (keysList2->currentItem()->depth()>1 && KgpgInterface::getGpgVersion() < 210 )
+ || (keysList2->currentItem()->depth()>2 && KgpgInterface::getGpgVersion() >= 210 ) ) {
KMessageBox::sorry(this,i18n("Edit key manually to delete this signature."));
return;
}
@@ -2055,9 +2145,13 @@ void listKeys::delsignkey()
TQString signID,parentKey,signMail,parentMail;
////////////////// open a key selection dialog (KgpgSelKey, see begining of this file)
- parentKey=keysList2->currentItem()->parent()->text(6);
+ parentKey=(( KgpgInterface::getGpgVersion() < 210 )
+ ? keysList2->currentItem()->parent()->text(6)
+ : keysList2->currentItem()->parent()->parent()->text(6));
signID=keysList2->currentItem()->text(6);
- parentMail=keysList2->currentItem()->parent()->text(0)+" ("+keysList2->currentItem()->parent()->text(1)+")";
+ parentMail=(( KgpgInterface::getGpgVersion() < 210 )
+ ? keysList2->currentItem()->parent()->text(0)+" ("+keysList2->currentItem()->parent()->text(1)+")"
+ : keysList2->currentItem()->parent()->parent()->text(0)+" ("+keysList2->currentItem()->parent()->parent()->text(1)+")");
signMail=keysList2->currentItem()->text(0)+" ("+keysList2->currentItem()->text(1)+")";
if (parentKey==signID) {
@@ -2075,6 +2169,7 @@ void listKeys::delsignkey()
void listKeys::delsignatureResult(bool success)
{
+// kdDebug(2100) << k_funcinfo << endl;
if (success) {
TQListViewItem *top=keysList2->currentItem();
while (top->depth()!=0)
@@ -2088,6 +2183,7 @@ void listKeys::delsignatureResult(bool success)
void listKeys::slotedit()
{
+// kdDebug(2100) << k_funcinfo << endl;
if (!keysList2->currentItem())
return;
if (keysList2->currentItem()->depth()!=0)
@@ -2100,12 +2196,8 @@ void listKeys::slotedit()
TDEConfig *config = TDEGlobal::config();
config->setGroup("General");
kp<< config->readPathEntry("TerminalApplication","konsole");
- kp<<"-e"
- <<"gpg"
- <<"--no-secmem-warning"
- <<"--utf8-strings"
- <<"--edit-key"
- <<keysList2->currentItem()->text(6)
+ kp<<"-e" <<"gpg" <<"--no-secmem-warning" <<"--utf8-strings"
+ <<"--edit-key" <<keysList2->currentItem()->text(6)
<<"help";
kp.start(TDEProcess::Block);
keysList2->refreshcurrentkey(keysList2->currentItem());
@@ -2114,6 +2206,7 @@ void listKeys::slotedit()
void listKeys::slotgenkey()
{
+// kdDebug(2100) << k_funcinfo << endl;
////////// generate key
keyGenerate *genkey=new keyGenerate(this,0);
if (genkey->exec()==TQDialog::Accepted) {
@@ -2230,6 +2323,7 @@ void listKeys::slotgenkey()
void listKeys::readgenprocess(KProcIO *p)
{
+// kdDebug(2100) << k_funcinfo << endl;
TQString required;
while (p->readln(required,true)!=-1) {
if (required.find("KEY_CREATED")!=-1)
@@ -2242,11 +2336,16 @@ void listKeys::readgenprocess(KProcIO *p)
void listKeys::genover(TDEProcess *)
{
+// kdDebug(2100) << k_funcinfo << endl;
newkeyID=TQString();
continueSearch=true;
KProcIO *conprocess=new KProcIO(TQTextCodec::codecForLocale());
+ TQString fpropt = (KgpgInterface::getGpgVersion() < 210 ) ? "--fingerprint" : "--with-fingerprint";
*conprocess<< "gpg";
- *conprocess<<"--no-secmem-warning"<<"--with-colons"<<"--fingerprint"<<"--list-keys"<<newKeyName;
+ *conprocess<<"--no-secmem-warning"
+ <<"--with-colons"
+ << fpropt
+ <<"--list-keys"<<newKeyName;
TQObject::connect(conprocess,TQT_SIGNAL(readReady(KProcIO *)),TQT_TQOBJECT(this),TQT_SLOT(slotReadFingerProcess(KProcIO *)));
TQObject::connect(conprocess, TQT_SIGNAL(processExited(TDEProcess *)),TQT_TQOBJECT(this), TQT_SLOT(newKeyDone(TDEProcess *)));
conprocess->start(TDEProcess::NotifyOnExit,true);
@@ -2255,16 +2354,17 @@ void listKeys::genover(TDEProcess *)
void listKeys::slotReadFingerProcess(KProcIO *p)
{
+// kdDebug(2100) << k_funcinfo << endl;
TQString outp;
while (p->readln(outp)!=-1) {
- if (outp.startsWith("pub") && (continueSearch)) {
+ if ( outp.startsWith("pub") && (continueSearch)) {
newkeyID=outp.section(':',4,4).right(8).prepend("0x");
}
if (outp.startsWith("fpr")) {
if (newkeyFinger.lower()==outp.section(':',9,9).lower())
continueSearch=false;
- // kdDebug(2100)<<newkeyFinger<<" test:"<<outp.section(':',9,9)<<endl;
+ // kdDebug(2100)<<newkeyFinger<<" test:"<<outp.section(':',9,9)<<endl;
}
}
}
@@ -2272,6 +2372,7 @@ void listKeys::slotReadFingerProcess(KProcIO *p)
void listKeys::newKeyDone(TDEProcess *)
{
+// kdDebug(2100) << k_funcinfo << endl;
changeMessage(i18n("Ready"),0);
// refreshkey();
if (newkeyID.isEmpty()) {
@@ -2321,6 +2422,7 @@ void listKeys::newKeyDone(TDEProcess *)
void listKeys::doFilePrint(TQString url)
{
+// kdDebug(2100) << k_funcinfo << endl;
TQFile qfile(url);
if (qfile.open(IO_ReadOnly)) {
TQTextStream t( &qfile );
@@ -2331,6 +2433,7 @@ void listKeys::doFilePrint(TQString url)
void listKeys::doPrint(TQString txt)
{
+// kdDebug(2100) << k_funcinfo << endl;
KPrinter prt;
//kdDebug(2100)<<"Printing..."<<endl;
if (prt.setup(this)) {
@@ -2355,8 +2458,7 @@ void listKeys::deleteseckey()
TDEConfig *config = TDEGlobal::config();
config->setGroup("General");
*conprocess<< config->readPathEntry("TerminalApplication","konsole");
- *conprocess<<"-e"<<"gpg"
- <<"--no-secmem-warning"
+ *conprocess<<"-e"<<"gpg" <<"--no-secmem-warning"
<<"--delete-secret-key"<<keysList2->currentItem()->text(6);
TQObject::connect(conprocess, TQT_SIGNAL(processExited(TDEProcess *)),TQT_TQOBJECT(this), TQT_SLOT(reloadSecretKeys()));
conprocess->start(TDEProcess::NotifyOnExit,TDEProcess::AllOutput);
@@ -2364,6 +2466,7 @@ void listKeys::deleteseckey()
void listKeys::reloadSecretKeys()
{
+// kdDebug(2100) << k_funcinfo << endl;
FILE *fp;
char line[300];
keysList2->secretList=TQString();
@@ -2379,6 +2482,7 @@ void listKeys::reloadSecretKeys()
void listKeys::confirmdeletekey()
{
+// kdDebug(2100) << k_funcinfo << endl;
if (keysList2->currentItem()->depth()!=0) {
if ((keysList2->currentItem()->depth()==1) && (keysList2->currentItem()->text(4)=="-") && (keysList2->currentItem()->text(6).startsWith("0x")))
delsignkey();
@@ -2422,24 +2526,25 @@ void listKeys::confirmdeletekey()
void listKeys::deletekey()
{
+// kdDebug(2100) << k_funcinfo << endl;
TQPtrList<TQListViewItem> exportList=keysList2->selectedItems();
+// kdDebug(2100) << k_funcinfo << "Delete list count: " << exportList.count() << endl;
if (exportList.count()==0)
return;
TDEProcess gp;
- gp << "gpg"
- << "--no-tty"
- << "--no-secmem-warning"
- << "--batch"
- << "--yes"
- << "--delete-key";
+ gp << "gpg" << "--no-tty" << "--no-secmem-warning" << "--batch" << "--yes" << "--delete-key";
for ( uint i = 0; i < exportList.count(); ++i )
if ( exportList.at(i) )
gp<<(exportList.at(i)->text(6)).stripWhiteSpace();
gp.start(TDEProcess::Block);
- for ( uint i = 0; i < exportList.count(); ++i )
- if ( exportList.at(i) )
- keysList2->refreshcurrentkey(exportList.at(i));
+// FIXME: this produces an error when key was successfully removed
+// for ( uint i = 0; i < exportList.count(); ++i ) {
+// if ( exportList.at(i) ) {
+// keysList2->refreshcurrentkey(exportList.at(i));
+// }
+// }
+
if (keysList2->currentItem()) {
TQListViewItem * myChild = keysList2->currentItem();
while(!myChild->isVisible()) {
@@ -2460,13 +2565,18 @@ void listKeys::deletekey()
keysList2->setCurrentItem(myChild);
}
}
- else stateChanged("empty_list");
+ else {
+ stateChanged("empty_list");
+ }
+
+ keysList2->refreshkeylist(); // update the list to remove signitures from the deleted key
changeMessage(i18n("%1 Keys, %2 Groups").arg(keysList2->childCount()-keysList2->groupNb).arg(keysList2->groupNb),1);
}
void listKeys::slotPreImportKey()
{
+// kdDebug(2100) << k_funcinfo << endl;
KDialogBase *dial=new KDialogBase( KDialogBase::Swallow, i18n("Key Import"), KDialogBase::Ok | KDialogBase::Cancel, KDialogBase::Ok, this, "key_import",true);
SrcSelect *page=new SrcSelect();
@@ -2504,9 +2614,9 @@ void listKeys::slotPreImportKey()
void KeyView::expandGroup(TQListViewItem *item)
{
-
+// kdDebug(2100) << k_funcinfo << endl;
TQStringList keysGroup=KgpgInterface::getGpgGroupSetting(item->text(0),KGpgSettings::gpgConfigPath());
- kdDebug(2100)<<keysGroup<<endl;
+// kdDebug(2100)<<keysGroup<<endl;
for ( TQStringList::Iterator it = keysGroup.begin(); it != keysGroup.end(); ++it ) {
UpdateViewItem *item2=new UpdateViewItem(item,TQString(*it),TQString(),TQString(),TQString(),TQString(),TQString(),TQString());
item2->setPixmap(0,pixkeyGroup);
@@ -2516,10 +2626,13 @@ void KeyView::expandGroup(TQListViewItem *item)
TQPixmap KeyView::slotGetPhoto(TQString photoId,bool mini)
{
+// kdDebug(2100) << k_funcinfo << endl;
KTempFile *phototmp=new KTempFile();
TQString popt="cp %i "+phototmp->name();
KProcIO *p=new KProcIO(TQTextCodec::codecForLocale());
- *p<<"gpg"<<"--show-photos"<<"--photo-viewer"<<TQString(TQFile::encodeName(popt))<<"--list-keys"<<photoId;
+ *p<<"gpg"<<"--show-photos"
+ <<"--photo-viewer"<<TQString(TQFile::encodeName(popt))
+ <<"--list-keys"<<photoId;
p->start(TDEProcess::Block);
TQPixmap pixmap;
@@ -2538,48 +2651,71 @@ TQPixmap KeyView::slotGetPhoto(TQString photoId,bool mini)
void KeyView::expandKey(TQListViewItem *item)
{
-
+// kdDebug(2100) << k_funcinfo << endl;
if (item->childCount()!=0)
return; // key has already been expanded
FILE *fp;
- TQString cycle;
- TQStringList tst;
- char tmpline[300];
+
+
+ char line[300];
+ TQString currentKey;
+ TQMap<TQString,TQStringList> hashMap;
+// kdDebug(2100)<<"Expanding Key: "<<item->text(6)<<endl;
+
+ TQApplication::setOverrideCursor(TQCursor(TQt::BusyCursor));
+ fp = popen(TQFile::encodeName(TQString("gpg --no-secmem-warning --no-tty --with-colons --list-sigs "+item->text(6))), "r");
+
+ while ( fgets( line, sizeof(line), fp)) {
+ TQString tst=TQString::fromUtf8(line);
+// kdDebug(2100) << k_funcinfo << "Read one public sig line: " << tst;
+ if ( tst.startsWith("pub") ) {
+ currentKey = tst.section(':',4,4).right(8);
+ TQStringList lst; lst << tst;
+ hashMap.insert(currentKey,lst);
+ }
+ else {
+ hashMap.find(currentKey).data().append(tst);
+ }
+ }
+ pclose(fp);
+
+ TQMap<TQString,TQStringList>::Iterator ite;
+ for (ite = hashMap.begin(); ite != hashMap.end(); ite++) {
+ TQStringList::Iterator it;
+ TQString cycle="pub";
+ bool noID = (KgpgInterface::getGpgVersion() < 210 ) ? false : true;
+
UpdateViewItem *itemsub=NULL;
UpdateViewItem *itemuid=NULL;
UpdateViewItem *itemsig=NULL;
UpdateViewItem *itemrev=NULL;
TQPixmap keyPhotoId;
int uidNumber=2;
- bool dropFirstUid=false;
-
- kdDebug(2100)<<"Expanding Key: "<<item->text(6)<<endl;
-
- cycle="pub";
- bool noID=false;
- fp = popen(TQFile::encodeName(TQString("gpg --no-secmem-warning --no-tty --with-colons --list-sigs "+item->text(6))), "r");
-
- while ( fgets( tmpline, sizeof(tmpline), fp)) {
- TQString line = TQString::fromUtf8( tmpline );
- tst=TQStringList::split(":",line,true);
- if ((tst[0]=="pub") && (tst[9].isEmpty())) /// Primary User Id is separated from public key
- uidNumber=1;
- if (tst[0]=="uid" || tst[0]=="uat") {
- if (dropFirstUid) {
- dropFirstUid=false;
- } else {
+
+ for (it = ite.data().begin(); it != ite.data().end(); it++) {
+ TQString line = (*it);
+ TQStringList tst=TQStringList::split(":",line,true);
+// // kdDebug(2100)<<"Loop: "<< tst[0] << " : " << tst[9] <<endl;
+ if ((tst[0]=="pub") && (tst[9].isEmpty())) {/// Primary User Id is separated from public key
+ noID=true;
+ continue;
+ }
+ if (tst[0]=="uid" || tst[0]=="uat") {
gpgKey uidKey=extractKey(line);
if (tst[0]=="uat") {
- kdDebug(2100)<<"Found photo at uid "<<uidNumber<<endl;
+ // kdDebug(2100)<<"Found photo at uid "<<uidNumber<<endl;
itemuid= new UpdateViewItem(item,i18n("Photo id"),TQString(),TQString(),"-","-","-",TQString::number(uidNumber));
if (displayPhoto) {
kgpgphototmp=new KTempFile();
kgpgphototmp->setAutoDelete(true);
TQString pgpgOutput="cp %i "+kgpgphototmp->name();
KProcIO *p=new KProcIO(TQTextCodec::codecForLocale());
- *p<<"gpg"<<"--no-tty"<<"--photo-viewer"<<TQString(TQFile::encodeName(pgpgOutput));
- *p<<"--edit-key"<<item->text(6)<<"uid"<<TQString::number(uidNumber)<<"showphoto"<<"quit";
+ *p<<"gpg"<<"--no-tty"
+ <<"--photo-viewer"<<TQString(TQFile::encodeName(pgpgOutput))
+ <<"--edit-key"<<item->text(6)
+ <<"uid"<<TQString::number(uidNumber)
+ <<"showphoto"<<"quit";
p->start(TDEProcess::Block);
TQPixmap pixmap;
pixmap.load(kgpgphototmp->name());
@@ -2592,82 +2728,122 @@ void KeyView::expandKey(TQListViewItem *item)
} else
itemuid->setPixmap(0,pixuserphoto);
itemuid->setPixmap(2,uidKey.trustpic);
- cycle="uid";
} else {
- kdDebug(2100)<<"Found uid at "<<uidNumber<<endl;
- itemuid= new UpdateViewItem(item,uidKey.gpgkeyname,uidKey.gpgkeymail,TQString(),"-","-","-","-");
+ // kdDebug(2100)<<"Found uid at "<<uidNumber<<endl;
+ itemuid= new UpdateViewItem(item,uidKey.gpgkeyname,uidKey.gpgkeymail,TQString(),"-","-",uidKey.gpgkeycreation,uidKey.gpgkeyid);
itemuid->setPixmap(2,uidKey.trustpic);
+ // FIXME not sure if first item is oldest item - the one set when key was generated
+ // but in my opinion the identity of the oldest item should be assigned to the pub/main entry
if (noID) {
item->setText(0,uidKey.gpgkeyname);
item->setText(1,uidKey.gpgkeymail);
noID=false;
}
itemuid->setPixmap(0,pixuserid);
- cycle="uid";
- }
- }
- uidNumber++;
- } else
+ }
+ cycle="uid";
+ uidNumber++;
+ }
if (tst[0]=="rev") {
gpgKey revKey=extractKey(line);
- if (cycle=="uid" || cycle=="uat")
+ if (cycle=="uid") {
itemrev= new UpdateViewItem(itemuid,revKey.gpgkeyname,revKey.gpgkeymail+i18n(" [Revocation signature]"),"-","-","-",revKey.gpgkeycreation,revKey.gpgkeyid);
- else if (cycle=="pub") { //////////////public key revoked
+ }
+ if (cycle=="pub") { //////////////public key revoked
itemrev= new UpdateViewItem(item,revKey.gpgkeyname,revKey.gpgkeymail+i18n(" [Revocation signature]"),"-","-","-",revKey.gpgkeycreation,revKey.gpgkeyid);
- dropFirstUid=true;
- } else if (cycle=="sub")
+ //dropFirstUid=true;
+ }
+ if (cycle=="sub") {
itemrev= new UpdateViewItem(itemsub,revKey.gpgkeyname,revKey.gpgkeymail+i18n(" [Revocation signature]"),"-","-","-",revKey.gpgkeycreation,revKey.gpgkeyid);
+ }
itemrev->setPixmap(0,pixRevoke);
- } else
-
-
- if (tst[0]=="sig") {
- gpgKey sigKey=extractKey(line);
-
- if (tst[10].endsWith("l"))
- sigKey.gpgkeymail+=i18n(" [local]");
-
- if (cycle=="pub")
- itemsig= new UpdateViewItem(item,sigKey.gpgkeyname,sigKey.gpgkeymail,"-",sigKey.gpgkeyexpiration,"-",sigKey.gpgkeycreation,sigKey.gpgkeyid);
- if (cycle=="sub")
- itemsig= new UpdateViewItem(itemsub,sigKey.gpgkeyname,sigKey.gpgkeymail,"-",sigKey.gpgkeyexpiration,"-",sigKey.gpgkeycreation,sigKey.gpgkeyid);
- if (cycle=="uid")
- itemsig= new UpdateViewItem(itemuid,sigKey.gpgkeyname,sigKey.gpgkeymail,"-",sigKey.gpgkeyexpiration,"-",sigKey.gpgkeycreation,sigKey.gpgkeyid);
-
- itemsig->setPixmap(0,pixsignature);
- } else
- if (tst[0]=="sub") {
- gpgKey subKey=extractKey(line);
- itemsub= new UpdateViewItem(item,i18n("%1 subkey").arg(subKey.gpgkeyalgo),TQString(),TQString(),subKey.gpgkeyexpiration,subKey.gpgkeysize,subKey.gpgkeycreation,subKey.gpgkeyid);
- itemsub->setPixmap(0,pixkeySingle);
- itemsub->setPixmap(2,subKey.trustpic);
- cycle="sub";
-
- }
- }
- pclose(fp);
+ }
+ if (tst[0]=="sig") {
+ gpgKey sigKey=extractKey(line);
+
+ if (tst[10].endsWith("l")) {
+ sigKey.gpgkeymail+=i18n(" [local]");
+ }
+
+ if (cycle=="pub") {
+ itemsig= new UpdateViewItem(
+ item,
+ sigKey.gpgkeyname,
+ sigKey.gpgkeymail,
+ "-",
+ sigKey.gpgkeyexpiration,
+ "-",
+ sigKey.gpgkeycreation,
+ sigKey.gpgkeyid);
+ }
+ if (cycle=="sub") {
+ itemsig= new UpdateViewItem(
+ itemsub,
+ sigKey.gpgkeyname,
+ sigKey.gpgkeymail,
+ "-",
+ sigKey.gpgkeyexpiration,
+ "-",
+ sigKey.gpgkeycreation,
+ sigKey.gpgkeyid);
+ }
+ if (cycle=="uid") {
+ itemsig= new UpdateViewItem(
+ itemuid,
+ sigKey.gpgkeyname,
+ sigKey.gpgkeymail,
+ "-",
+ sigKey.gpgkeyexpiration,
+ "-",
+ sigKey.gpgkeycreation,
+ sigKey.gpgkeyid);
+ }
+ itemsig->setPixmap(0,pixsignature);
+ }
+ if (tst[0]=="sub") {
+ gpgKey subKey=extractKey(line);
+ itemsub= new UpdateViewItem(
+ item,
+ i18n("%1 subkey").arg(subKey.gpgkeyalgo),
+ TQString(),
+ TQString(),
+ subKey.gpgkeyexpiration,
+ subKey.gpgkeysize,
+ subKey.gpgkeycreation,
+ subKey.gpgkeyid
+ );
+ itemsub->setPixmap(0,pixkeySingle);
+ itemsub->setPixmap(2,subKey.trustpic);
+ cycle="sub";
+ }
+ }
+ }
+ TQApplication::restoreOverrideCursor();
}
void listKeys::refreshkey()
{
+// kdDebug(2100) << k_funcinfo << endl;
keysList2->refreshkeylist();
listViewSearch->updateSearch(listViewSearch->text());
}
void KeyView::refreshkeylist()
{
+// kdDebug(2100) << k_funcinfo << endl;
emit statusMessage(i18n("Loading Keys..."),0,true);
kapp->processEvents();
//////// update display of keys in main management window
- kdDebug(2100)<<"Refreshing key list"<<endl;
- TQString tst;
+// kdDebug(2100)<<"Refreshing key list"<<endl;
+
char line[300];
UpdateViewItem *item=NULL;
- bool noID=false;
- bool emptyList=true;
TQString openKeys;
+ bool emptyList=true;
+ TQMap<TQString,TQStringList> hashMap;
+ TQApplication::setOverrideCursor(TQCursor(TQt::BusyCursor));
// get current position.
TQListViewItem *current = currentItem();
if(current != NULL) {
@@ -2686,32 +2862,67 @@ void KeyView::refreshkeylist()
fp2 = popen("gpg --no-secmem-warning --no-tty --with-colons --list-secret-keys", "r");
while ( fgets( line, sizeof(line), fp2)) {
TQString lineRead=TQString::fromUtf8(line);
- kdDebug(2100) << k_funcinfo << "Read one secret key line: " << lineRead << endl;
+// kdDebug(2100) << k_funcinfo << "Read one secret key line: " << lineRead << endl;
if (lineRead.startsWith("sec"))
issec<<lineRead.section(':',4,4).right(8);
}
pclose(fp2);
TQString defaultKey = KGpgSettings::defaultKey();
- fp = popen("gpg --no-secmem-warning --no-tty --with-colons --list-keys", "r");
- while ( fgets( line, sizeof(line), fp)) {
- tst=TQString::fromUtf8(line);
- kdDebug(2100) << k_funcinfo << "Read one public key line: " << tst << endl;
- if (tst.startsWith("pub")) {
- emptyList=false;
- noID=false;
- gpgKey pubKey=extractKey(tst);
+ TQString currentKey;
+
+ fp = popen("gpg --no-secmem-warning --no-tty --with-colons --list-keys", "r");
+ while ( fgets( line, sizeof(line), fp)) {
+ TQString tst=TQString::fromUtf8(line);
+// kdDebug(2100) << k_funcinfo << "Read one public key line: " << tst << endl;
+ if ( tst.startsWith("pub") ) {
+ currentKey = tst.section(':',4,4);
+ TQStringList lst; lst << tst;
+ hashMap.insert(currentKey,lst);
+ }
+ else {
+ hashMap.find(currentKey).data().append(tst);
+ }
+ }
+ pclose(fp);
+
+// process the list
+ TQMap<TQString,TQStringList>::Iterator ite;
+ for (ite = hashMap.begin(); ite != hashMap.end(); ite++) {
+ TQStringList::Iterator it;
+ gpgKey pubKey;
bool isbold=false;
bool isexpired=false;
+
+ for (it = ite.data().begin(); it != ite.data().end(); it++) {
+ TQString tst = (*it);
+ if ( tst.startsWith("pub") ){
+ emptyList=false;
+ pubKey=extractKey(tst);
if (pubKey.gpgkeyid==defaultKey)
isbold=true;
if (pubKey.gpgkeytrust==i18n("Expired"))
isexpired=true;
- if (pubKey.gpgkeyname.isEmpty())
- noID=true;
+ }
+ if ( tst.startsWith("uid") && pubKey.gpgkeyname.isEmpty() ){
+ gpgKey tmpKey=extractKey(tst);
+ pubKey.gpgkeyname = tmpKey.gpgkeyname;
+ pubKey.gpgkeymail = tmpKey.gpgkeymail;
+ }
+ }
- item=new UpdateViewItem(this,pubKey.gpgkeyname,pubKey.gpgkeymail,TQString(),pubKey.gpgkeyexpiration,pubKey.gpgkeysize,pubKey.gpgkeycreation,pubKey.gpgkeyid,isbold,isexpired);
+ item=new UpdateViewItem(
+ this,
+ pubKey.gpgkeyname,
+ pubKey.gpgkeymail,
+ TQString(),
+ pubKey.gpgkeyexpiration,
+ pubKey.gpgkeysize,
+ pubKey.gpgkeycreation,
+ pubKey.gpgkeyid,
+ isbold,
+ isexpired);
item->setPixmap(2,pubKey.trustpic);
item->setExpandable(true);
@@ -2727,27 +2938,36 @@ void KeyView::refreshkeylist()
if (openKeys.find(pubKey.gpgkeyid)!=-1)
item->setOpen(true);
- }
+ }
- }
- pclose(fp);
if (!issec.isEmpty())
insertOrphanedKeys(issec);
if (emptyList) {
- kdDebug(2100)<<"No key found"<<endl;
+ // kdDebug(2100)<<"No key found"<<endl;
emit statusMessage(i18n("Ready"),0);
return;
}
- kdDebug(2100)<<"Checking Groups"<<endl;
+// kdDebug(2100)<<"Checking Groups"<<endl;
TQStringList groups=KgpgInterface::getGpgGroupNames(KGpgSettings::gpgConfigPath());
groupNb=groups.count();
- for ( TQStringList::Iterator it = groups.begin(); it != groups.end(); ++it )
+ for ( TQStringList::Iterator it = groups.begin(); it != groups.end(); ++it ) {
if (!TQString(*it).isEmpty()) {
- item=new UpdateViewItem(this,TQString(*it),TQString(),TQString(),TQString(),TQString(),TQString(),TQString(),false,false);
+ item=new UpdateViewItem(
+ this,
+ TQString(*it),
+ TQString(),
+ TQString(),
+ TQString(),
+ TQString(),
+ TQString(),
+ TQString(),
+ false,
+ false);
item->setPixmap(0,pixkeyGroup);
item->setExpandable(false);
}
- kdDebug(2100)<<"Finished Groups"<<endl;
+ }
+// kdDebug(2100)<<"Finished Groups"<<endl;
TQListViewItem *newPos=0L;
if(current != NULL) {
@@ -2770,35 +2990,77 @@ void KeyView::refreshkeylist()
emit statusMessage(i18n("%1 Keys, %2 Groups").arg(childCount()-groupNb).arg(groupNb),1);
emit statusMessage(i18n("Ready"),0);
- kdDebug(2100)<<"Refresh Finished"<<endl;
+ TQApplication::restoreOverrideCursor();
+// kdDebug(2100)<<"Refresh Finished"<<endl;
}
void KeyView::insertOrphan(TQString currentID)
{
+// kdDebug(2100) << k_funcinfo << endl;
FILE *fp;
char line[300];
UpdateViewItem *item=NULL;
bool keyFound=false;
+ TQString currentKey;
+ TQMap<TQString,TQStringList> hashMap;
+
fp = popen("gpg --no-secmem-warning --no-tty --with-colons --list-secret-keys", "r");
while ( fgets( line, sizeof(line), fp)) {
- TQString lineRead=TQString::fromUtf8(line);
- if ((lineRead.startsWith("sec")) && (lineRead.section(':',4,4).right(8))==currentID.right(8)) {
- gpgKey orphanedKey=extractKey(lineRead);
- keyFound=true;
- bool isbold=false;
- bool isexpired=false;
+ TQString tst=TQString::fromUtf8(line);
+// kdDebug(2100) << k_funcinfo << "Read one public key line: " << tst << endl;
+ if ( tst.startsWith("sec") ) {
+ currentKey = tst.section(':',4,4);
+ TQStringList lst; lst << tst;
+ hashMap.insert(currentKey,lst);
+ }
+ else {
+ hashMap.find(currentKey).data().append(tst);
+ }
+ }
+ pclose(fp);
+// process the list
+
+ TQMap<TQString,TQStringList>::Iterator ite;
+ for (ite = hashMap.begin(); ite != hashMap.end(); ite++) {
+ TQStringList::Iterator it;
+ gpgKey orphanedKey;
+ keyFound=false;
+ bool isbold=false;
+ bool isexpired=false;
+
+ for (it = ite.data().begin(); it != ite.data().end(); it++) {
+ TQString tmp = (*it);
+ if ((tmp.startsWith("sec")) && (tmp.section(':',4,4).right(8))==currentID.right(8)) {
+ orphanedKey=extractKey(tmp);
+ keyFound=true;
// if (orphanedKey.gpgkeyid==defaultKey)
// isbold=true;
- if (orphanedKey.gpgkeytrust==i18n("Expired"))
- isexpired=true;
+ if (orphanedKey.gpgkeytrust==i18n("Expired")) {
+ isexpired=true;
+ }
// if (orphanedKey.gpgkeyname.isEmpty())
// noID=true;
+ }
+ if ( tmp.startsWith("uid") && orphanedKey.gpgkeyname.isEmpty() ){
+ gpgKey tmpKey=extractKey(tmp);
+ orphanedKey.gpgkeyname = tmpKey.gpgkeyname;
+ orphanedKey.gpgkeymail = tmpKey.gpgkeymail;
+ }
+ }
+ item=new UpdateViewItem(
+ this,
+ orphanedKey.gpgkeyname,
+ orphanedKey.gpgkeymail,
+ TQString(),
+ orphanedKey.gpgkeyexpiration,
+ orphanedKey.gpgkeysize,
+ orphanedKey.gpgkeycreation,
+ orphanedKey.gpgkeyid,
+ isbold,
+ isexpired);
+ item->setPixmap(0,pixkeyOrphan);
+ }
- item=new UpdateViewItem(this,orphanedKey.gpgkeyname,orphanedKey.gpgkeymail,TQString(),orphanedKey.gpgkeyexpiration,orphanedKey.gpgkeysize,orphanedKey.gpgkeycreation,orphanedKey.gpgkeyid,isbold,isexpired);
- item->setPixmap(0,pixkeyOrphan);
- }
- }
- pclose(fp);
if (!keyFound) {
orphanList.remove(currentID);
setSelected(currentItem(),true);
@@ -2811,32 +3073,70 @@ void KeyView::insertOrphan(TQString currentID)
void KeyView::insertOrphanedKeys(TQStringList orphans)
{
- FILE *fp;
- char line[300];
- fp = popen("gpg --no-secmem-warning --no-tty --with-colons --list-secret-keys", "r");
- while ( fgets( line, sizeof(line), fp)) {
- TQString lineRead=TQString::fromUtf8(line);
- if ((lineRead.startsWith("sec")) && (orphans.find(lineRead.section(':',4,4).right(8))!=orphans.end())) {
- gpgKey orphanedKey=extractKey(lineRead);
-
- bool isbold=false;
- bool isexpired=false;
- // if (orphanedKey.gpgkeyid==defaultKey)
- // isbold=true;
- if (orphanedKey.gpgkeytrust==i18n("Expired"))
- isexpired=true;
- // if (orphanedKey.gpgkeyname.isEmpty())
- // noID=true;
- orphanList+=orphanedKey.gpgkeyid+",";
- UpdateViewItem *item=new UpdateViewItem(this,orphanedKey.gpgkeyname,orphanedKey.gpgkeymail,TQString(),orphanedKey.gpgkeyexpiration,orphanedKey.gpgkeysize,orphanedKey.gpgkeycreation,orphanedKey.gpgkeyid,isbold,isexpired);
- item->setPixmap(0,pixkeyOrphan);
- }
- }
- pclose(fp);
+// kdDebug(2100) << k_funcinfo << endl;
+ FILE *fp;
+ char line[300];
+ TQString currentKey;
+ TQMap<TQString,TQStringList> hashMap;
+
+ fp = popen("gpg --no-secmem-warning --no-tty --with-colons --list-secret-keys", "r");
+ while ( fgets( line, sizeof(line), fp)) {
+ TQString tst=TQString::fromUtf8(line);
+// kdDebug(2100) << k_funcinfo << "Read one public key line: " << tst << endl;
+ if ( tst.startsWith("sec") ) {
+ currentKey = tst.section(':',4,4);
+ TQStringList lst; lst << tst;
+ hashMap.insert(currentKey,lst);
+ }
+ else {
+ hashMap.find(currentKey).data().append(tst);
+ }
+ }
+ pclose(fp);
+// process the list
+
+ TQMap<TQString,TQStringList>::Iterator ite;
+ for (ite = hashMap.begin(); ite != hashMap.end(); ite++) {
+ TQStringList::Iterator it;
+ gpgKey orphanedKey;
+ bool isbold=false;
+ bool isexpired=false;
+
+ for (it = ite.data().begin(); it != ite.data().end(); it++) {
+ TQString tmp = (*it);
+ if ((tmp.startsWith("sec")) && (orphans.find(tmp.section(':',4,4).right(8))!=orphans.end())) {
+ orphanedKey=extractKey(tmp);
+// if (orphanedKey.gpgkeyid==defaultKey)
+// isbold=true;
+ if (orphanedKey.gpgkeytrust==i18n("Expired")) {
+ isexpired=true;
+ }
+ orphanList+=orphanedKey.gpgkeyid+",";
+ }
+ if ( tmp.startsWith("uid") && orphanedKey.gpgkeyname.isEmpty() ){
+ gpgKey tmpKey=extractKey(tmp);
+ orphanedKey.gpgkeyname = tmpKey.gpgkeyname;
+ orphanedKey.gpgkeymail = tmpKey.gpgkeymail;
+ }
+ }
+ UpdateViewItem *item=new UpdateViewItem(
+ this,
+ orphanedKey.gpgkeyname,
+ orphanedKey.gpgkeymail,
+ TQString(),
+ orphanedKey.gpgkeyexpiration,
+ orphanedKey.gpgkeysize,
+ orphanedKey.gpgkeycreation,
+ orphanedKey.gpgkeyid,
+ isbold,
+ isexpired);
+ item->setPixmap(0,pixkeyOrphan);
+ }
}
void KeyView::refreshgroups()
{
+// kdDebug(2100) << k_funcinfo << endl;
TQListViewItem *item=firstChild();
while (item) {
if (item->text(6).isEmpty()) {
@@ -2849,19 +3149,31 @@ void KeyView::refreshgroups()
TQStringList groups=KgpgInterface::getGpgGroupNames(KGpgSettings::gpgConfigPath());
groupNb=groups.count();
- for ( TQStringList::Iterator it = groups.begin(); it != groups.end(); ++it )
- if (!TQString(*it).isEmpty()) {
- item=new UpdateViewItem(this,TQString(*it),TQString(),TQString(),TQString(),TQString(),TQString(),TQString(),false,false);
- item->setPixmap(0,pixkeyGroup);
- item->setExpandable(false);
- }
+ for ( TQStringList::Iterator it = groups.begin(); it != groups.end(); ++it ) {
+ if (!TQString(*it).isEmpty()) {
+ item=new UpdateViewItem(
+ this,
+ TQString(*it),
+ TQString(),
+ TQString(),
+ TQString(),
+ TQString(),
+ TQString(),
+ TQString(),
+ false,
+ false);
+ item->setPixmap(0,pixkeyGroup);
+ item->setExpandable(false);
+ }
+ }
emit statusMessage(i18n("%1 Keys, %2 Groups").arg(childCount()-groupNb).arg(groupNb),1);
emit statusMessage(i18n("Ready"),0);
}
void KeyView::refreshselfkey()
{
- kdDebug(2100)<<"Refreshing key"<<endl;
+// kdDebug(2100) << k_funcinfo << endl;
+// kdDebug(2100)<<"Refreshing key"<<endl;
if (currentItem()->depth()==0)
refreshcurrentkey(currentItem());
else
@@ -2870,6 +3182,7 @@ void KeyView::refreshselfkey()
void KeyView::slotReloadKeys(TQStringList keyIDs)
{
+// kdDebug(2100) << k_funcinfo << endl;
if (keyIDs.isEmpty())
return;
if (keyIDs.first()=="ALL")
@@ -2880,7 +3193,7 @@ void KeyView::slotReloadKeys(TQStringList keyIDs)
for ( TQStringList::Iterator it = keyIDs.begin(); it != keyIDs.end(); ++it ) {
refreshcurrentkey(*it);
}
- kdDebug(2100)<<"Refreshing key:--------"<<TQString((keyIDs.last()).right(8).prepend("0x"))<<endl;
+// kdDebug(2100)<<"Refreshing key:--------"<<TQString((keyIDs.last()).right(8).prepend("0x"))<<endl;
ensureItemVisible(this->findItem((keyIDs.last()).right(8).prepend("0x"),6));
emit statusMessage(i18n("%1 Keys, %2 Groups").arg(childCount()-groupNb).arg(groupNb),1);
emit statusMessage(i18n("Ready"),0);
@@ -2888,6 +3201,7 @@ void KeyView::slotReloadKeys(TQStringList keyIDs)
void KeyView::slotReloadOrphaned()
{
+// kdDebug(2100) << k_funcinfo << endl;
TQStringList issec;
FILE *fp,*fp2;
char line[300];
@@ -2923,12 +3237,17 @@ void KeyView::slotReloadOrphaned()
void KeyView::refreshcurrentkey(TQString currentID)
{
+// kdDebug(2100) << k_funcinfo << endl;
if (currentID.isNull()) return;
- UpdateViewItem *item=NULL;
- TQString issec=TQString();
FILE *fp,*fp2;
char line[300];
+ TQString issec=TQString();
+ TQString defaultKey = KGpgSettings::defaultKey();
+ TQString currentKey;
+ TQMap<TQString,TQStringList> hashMap;
+
+ TQApplication::setOverrideCursor(TQCursor(TQt::BusyCursor));
fp2 = popen("gpg --no-secmem-warning --no-tty --with-colons --list-secret-keys", "r");
while ( fgets( line, sizeof(line), fp2)) {
TQString lineRead=TQString::fromUtf8(line);
@@ -2937,53 +3256,99 @@ void KeyView::refreshcurrentkey(TQString currentID)
}
pclose(fp2);
- TQString defaultKey = KGpgSettings::defaultKey();
-
- TQString tst;
- bool keyFound=false;
+// kdDebug(2100) << "currentID: " << currentID <<endl;
TQString cmd="gpg --no-secmem-warning --no-tty --with-colons --list-keys "+currentID;
fp = popen(TQFile::encodeName(cmd), "r");
while ( fgets( line, sizeof(line), fp)) {
- tst=TQString::fromUtf8(line);
- if (tst.startsWith("pub")) {
- gpgKey pubKey=extractKey(tst);
- keyFound=true;
- bool isbold=false;
- bool isexpired=false;
- if (pubKey.gpgkeyid==defaultKey)
- isbold=true;
- if (pubKey.gpgkeytrust==i18n("Expired"))
- isexpired=true;
- item=new UpdateViewItem(this,pubKey.gpgkeyname,pubKey.gpgkeymail,TQString(),pubKey.gpgkeyexpiration,pubKey.gpgkeysize,pubKey.gpgkeycreation,pubKey.gpgkeyid,isbold,isexpired);
- item->setPixmap(2,pubKey.trustpic);
- item->setVisible(true);
- item->setExpandable(true);
- if (issec.find(pubKey.gpgkeyid.right(8),0,FALSE)!=-1) {
- item->setPixmap(0,pixkeyPair);
- secretList+=pubKey.gpgkeyid;
- } else {
- item->setPixmap(0,pixkeySingle);
- }
- }
- }
- pclose(fp);
+ TQString tst=TQString::fromUtf8(line);
+// kdDebug(2100) << k_funcinfo << "Read one public key line: " << tst << endl;
+ if ( tst.startsWith("pub") ) {
+ currentKey = tst.section(':',4,4);
+ TQStringList lst; lst << tst;
+ hashMap.insert(currentKey,lst);
+ }
+ else {
+ hashMap.find(currentKey).data().append(tst);
+ }
+ }
+ pclose(fp);
+ if (hashMap.isEmpty()) {
+ return; // deleted keys do not exist
+ }
- if (!keyFound) {
- if (orphanList.find(currentID)==-1)
- orphanList+=currentID+",";
- insertOrphan(currentID);
- return;
- }
- if (orphanList.find(currentID)!=-1)
- orphanList.remove(currentID);
+// process the list
+
+ TQMap<TQString,TQStringList>::Iterator ite;
+ for (ite = hashMap.begin(); ite != hashMap.end(); ite++) {
+ UpdateViewItem *item=NULL;
+ TQStringList::Iterator it;
+ gpgKey pubKey;
+ bool keyFound=false;
+ bool isbold=false;
+ bool isexpired=false;
+
+ for (it = ite.data().begin(); it != ite.data().end(); it++) {
+ TQString tst = (*it);
+ if ( tst.startsWith("pub") ) {
+ keyFound=true;
+ pubKey=extractKey(tst);
+ if (pubKey.gpgkeyid==defaultKey) {
+ isbold=true;
+ }
+ if (pubKey.gpgkeytrust==i18n("Expired")) {
+ isexpired=true;
+ }
+ }
+ if ( tst.startsWith("uid") && pubKey.gpgkeyname.isEmpty() ) {
+ gpgKey tmpKey=extractKey(tst);
+ pubKey.gpgkeyname = tmpKey.gpgkeyname;
+ pubKey.gpgkeymail = tmpKey.gpgkeymail;
+ }
+ }
- clearSelection();
- setCurrentItem(item);
+ item=new UpdateViewItem(
+ this,
+ pubKey.gpgkeyname,
+ pubKey.gpgkeymail,
+ TQString(),
+ pubKey.gpgkeyexpiration,
+ pubKey.gpgkeysize,
+ pubKey.gpgkeycreation,
+ pubKey.gpgkeyid,
+ isbold,
+ isexpired);
+ item->setPixmap(2,pubKey.trustpic);
+ item->setVisible(true);
+ item->setExpandable(true);
+ if (issec.find(pubKey.gpgkeyid.right(8),0,FALSE)!=-1) {
+ item->setPixmap(0,pixkeyPair);
+ secretList+=pubKey.gpgkeyid;
+ }
+ else {
+ item->setPixmap(0,pixkeySingle);
+ }
+
+ if (!keyFound) {
+ if (orphanList.find(currentID)==-1) {
+ orphanList+=currentID+",";
+ }
+ insertOrphan(currentID);
+ return;
+ }
+ if (orphanList.find(currentID)!=-1) {
+ orphanList.remove(currentID);
+ }
+
+ clearSelection();
+ setCurrentItem(item);
+ }
+ TQApplication::restoreOverrideCursor();
}
void KeyView::refreshcurrentkey(TQListViewItem *current)
{
+// kdDebug(2100) << k_funcinfo << endl;
if (!current)
return;
bool keyIsOpen=false;
@@ -3002,74 +3367,100 @@ void KeyView::refreshcurrentkey(TQListViewItem *current)
void KeyView::refreshTrust(int color,TQColor newColor)
{
-if (!newColor.isValid()) return;
-TQPixmap blankFrame,newtrust;
-int trustFinger=0;
-blankFrame.load(locate("appdata", "pics/kgpg_blank.png"));
-newtrust.load(locate("appdata", "pics/kgpg_fill.png"));
-newtrust.fill(newColor);
-bitBlt(&newtrust,0,0,&blankFrame,0,0,50,15);
-switch (color)
-{
-case GoodColor:
-trustFinger=trustgood.serialNumber();
-trustgood=newtrust;
-break;
-case BadColor:
-trustFinger=trustbad.serialNumber();
-trustbad=newtrust;
-break;
-case UnknownColor:
-trustFinger=trustunknown.serialNumber();
-trustunknown=newtrust;
-break;
-case RevColor:
-trustFinger=trustrevoked.serialNumber();
-trustrevoked=newtrust;
-break;
-}
-TQListViewItem *item=firstChild();
- while (item) {
- if (item->pixmap(2))
- {
- if (item->pixmap(2)->serialNumber()==trustFinger) item->setPixmap(2,newtrust);
+// kdDebug(2100) << k_funcinfo << endl;
+ if (!newColor.isValid()) return;
+ TQPixmap blankFrame,newtrust;
+ int trustFinger=0;
+ blankFrame.load(locate("appdata", "pics/kgpg_blank.png"));
+ newtrust.load(locate("appdata", "pics/kgpg_fill.png"));
+ newtrust.fill(newColor);
+ bitBlt(&newtrust,0,0,&blankFrame,0,0,50,15);
+ switch (color) {
+ case GoodColor:
+ trustFinger=trustgood.serialNumber();
+ trustgood=newtrust;
+ break;
+ case BadColor:
+ trustFinger=trustbad.serialNumber();
+ trustbad=newtrust;
+ break;
+ case UnknownColor:
+ trustFinger=trustunknown.serialNumber();
+ trustunknown=newtrust;
+ break;
+ case RevColor:
+ trustFinger=trustrevoked.serialNumber();
+ trustrevoked=newtrust;
+ break;
+ }
+ TQListViewItem *item=firstChild();
+ while (item) {
+ if (item->pixmap(2)) {
+ if (item->pixmap(2)->serialNumber()==trustFinger) {
+ item->setPixmap(2,newtrust);
}
- item=item->nextSibling();
- }
+ }
+ item=item->nextSibling();
+ }
}
gpgKey KeyView::extractKey(TQString keyColon)
{
+// kdDebug(2100) << k_funcinfo << "keyColon: " << keyColon<<endl;
TQStringList keyString=TQStringList::split(":",keyColon,true);
- gpgKey ret;
+ gpgKey ret;
ret.gpgkeysize=keyString[2];
ret.gpgkeycreation=keyString[5];
if(!ret.gpgkeycreation.isEmpty()) {
- TQDate date = TQDate::fromString(ret.gpgkeycreation, Qt::ISODate);
+ TQDate date;
+ if (KgpgInterface::getGpgVersion() >= 210 ) {
+ TQDateTime timestamp;
+ timestamp.setTime_t( ret.gpgkeycreation.toInt());
+ date = timestamp.date();
+ }
+ else {
+ date = TQDate::fromString(ret.gpgkeycreation, Qt::ISODate);
+ }
+ Q_ASSERT (date.isValid()) /*tqWarning("create date is not valid")*/;
ret.gpgkeycreation=TDEGlobal::locale()->formatDate(date, true);
}
- TQString tid=keyString[4];
+ TQString tid= (keyColon.startsWith("uid")) ? keyString[7] : keyString[4];
ret.gpgkeyid=TQString("0x"+tid.right(8));
+// ret.gpgkeyid=(keyColon.startsWith("uid")) ? keyString[7] : keyString[4];
ret.gpgkeyexpiration=keyString[6];
if (ret.gpgkeyexpiration.isEmpty())
ret.gpgkeyexpiration=i18n("Unlimited");
else {
- TQDate date = TQDate::fromString(ret.gpgkeyexpiration, Qt::ISODate);
+ TQDate date;
+ if (KgpgInterface::getGpgVersion() >= 210 ) {
+ TQDateTime timestamp;
+ timestamp.setTime_t(ret.gpgkeyexpiration.toInt());
+ date = timestamp.date();
+ }
+ else {
+ date = TQDate::fromString(ret.gpgkeyexpiration, Qt::ISODate);
+ }
+ Q_ASSERT (date.isValid()) /*tqWarning("expire date is not valid")*/;
ret.gpgkeyexpiration=TDEGlobal::locale()->formatDate(date, true);
}
- TQString fullname=keyString[9];
- if (fullname.find("<")!=-1) {
- ret.gpgkeymail=fullname.section('<',-1,-1);
- ret.gpgkeymail.truncate(ret.gpgkeymail.length()-1);
- ret.gpgkeyname=fullname.section('<',0,0);
- //ret.gpgkeyname=ret.gpgkeyname.section('(',0,0);
- } else {
- ret.gpgkeymail=TQString();
- ret.gpgkeyname=fullname;
- //ret.gpgkeyname=fullname.section('(',0,0);
- }
+ // search for Fullname
+ if ( ! keyString[9].isEmpty() ) {
+ TQString fullname=keyString[9];
+
+ if (fullname.find("<")!=-1) {
+ ret.gpgkeymail=fullname.section('<',-1,-1);
+ ret.gpgkeymail.truncate(ret.gpgkeymail.length()-1);
+ ret.gpgkeyname=fullname.section('<',0,0);
+ //ret.gpgkeyname=ret.gpgkeyname.section('(',0,0);
+ }
+ else {
+ ret.gpgkeymail=TQString();
+ ret.gpgkeyname=fullname;
+ //ret.gpgkeyname=fullname.section('(',0,0);
+ }
+ }
//ret.gpgkeyname=KgpgInterface::checkForUtf8(ret.gpgkeyname); // FIXME lukas
TQString algo=keyString[3];
diff --git a/kgpg/main.cpp b/kgpg/main.cpp
index 44f4b7e..73b99bf 100644
--- a/kgpg/main.cpp
+++ b/kgpg/main.cpp
@@ -4,6 +4,8 @@
begin : Mon Jul 8 2002
copyright : (C) 2002 by Jean-Baptiste Mardelle
email : bj@altern.org
+
+ updated main version : Sun Jul 30 10:18:29 CEST 2017
***************************************************************************/
/***************************************************************************
@@ -29,7 +31,7 @@
static const char description[] =
I18N_NOOP("Kgpg - simple gui for gpg\n\nKgpg was designed to make gpg very easy to use.\nI tried to make it as secure as possible.\nHope you enjoy it.");
-static const char version[] = "1.2.2";
+static const char version[] = "1.3.0";
static TDECmdLineOptions options[] =
{
diff --git a/kgpg/popuppublic.cpp b/kgpg/popuppublic.cpp
index 7ae2eb3..07eb33e 100644
--- a/kgpg/popuppublic.cpp
+++ b/kgpg/popuppublic.cpp
@@ -4,6 +4,10 @@
begin : Sat Jun 29 2002
copyright : (C) 2002 by Jean-Baptiste Mardelle
email : bj@altern.org
+
+ updated to handle gpg21 : Sun Jul 30 10:18:29 CEST 2017
+ copyright : (C) 2017 by Emanoil Kotsev
+ email : deloptes@yahoo.com
***************************************************************************/
/***************************************************************************
@@ -322,6 +326,8 @@ void popupPublic::refresh(bool state)
void popupPublic::refreshkeys()
{
keysList->clear();
+ currentKey = TQString();
+ hashMap.clear();
TQStringList groups= TQStringList::split(",", KGpgSettings::groups());
if (!groups.isEmpty())
{
@@ -366,80 +372,115 @@ void popupPublic::slotSetVisible()
void popupPublic::slotprocread(KProcIO *p)
{
+// kdDebug(2100) << k_funcinfo << endl;
///////////////////////////////////////////////////////////////// extract encryption keys
- bool dead;
- TQString tst,keyname,keymail;
+ TQString tst;
TQString defaultKey = KGpgSettings::defaultKey().right(8);
- while (p->readln(tst)!=-1) {
- if (tst.startsWith("pub")) {
- TQStringList keyString=TQStringList::split(":",tst,true);
- dead=false;
- const TQString trust=keyString[1];
- TQString val=keyString[6];
- TQString id=TQString("0x"+keyString[4].right(8));
- if (val.isEmpty())
- val=i18n("Unlimited");
- TQString tr;
- switch( trust[0] ) {
- case 'o':
- untrustedList<<id;
- break;
- case 'i':
- dead=true;
- break;
- case 'd':
- dead=true;
- break;
- case 'r':
- dead=true;
- break;
- case 'e':
- dead=true;
- break;
- case 'q':
- untrustedList<<id;
- break;
- case 'n':
- untrustedList<<id;
- break;
- case 'm':
- untrustedList<<id;
- break;
- case 'f':
- break;
- case 'u':
- break;
- default:
- untrustedList<<id;
- break;
- }
- if (keyString[11].find('D')!=-1) dead=true;
- tst=keyString[9];
- if (tst.find("<")!=-1) {
- keymail=tst.section('<',-1,-1);
- keymail.truncate(keymail.length()-1);
- keyname=tst.section('<',0,0);
- //if (keyname.find("(")!=-1)
- // keyname=keyname.section('(',0,0);
- } else {
- keymail=TQString();
- keyname=tst;//.section('(',0,0);
- }
- if ((!dead) && (!tst.isEmpty())) {
- bool isDefaultKey=false;
- if (id.right(8)==defaultKey) isDefaultKey=true;
- UpdateViewItem2 *item=new UpdateViewItem2(keysList,keyname,keymail,id,isDefaultKey);
- //TDEListViewItem *sub= new TDEListViewItem(item,i18n("ID: %1, trust: %2, validity: %3").arg(id).arg(tr).arg(val));
- //sub->setSelectable(false);
- if (seclist.find(tst,0,FALSE)!=-1)
- item->setPixmap(0,keyPair);
- else
- item->setPixmap(0,keySingle);
- }
- }
- }
+ while (p->readln(tst)!=-1) {
+// kdDebug(2100) << k_funcinfo << "Read one public key line: " << tst << endl;
+ if ( tst.startsWith("pub") ) {
+ currentKey = tst.section(':',4,4);
+ TQStringList lst; lst << tst;
+ hashMap.insert(currentKey,tst);
+ }
+ else {
+ hashMap.find(currentKey).data().append(tst);
+ }
+ }
+
+ TQMap<TQString,TQStringList>::Iterator ite;
+ for (ite = hashMap.begin(); ite != hashMap.end(); ite++) {
+ TQStringList::Iterator it;
+ TQString fullname,keyname,keymail,val,id;
+ bool dead;
+
+ for (it = ite.data().begin(); it != ite.data().end(); it++) {
+ TQString line = (*it);
+
+ if (line.startsWith("pub")) {
+ TQStringList keyString=TQStringList::split(":",line,true);
+ dead=false;
+ const TQString trust=keyString[1];
+ val=keyString[6];
+ id=TQString("0x"+keyString[4].right(8));
+ if (val.isEmpty()) {
+ val=i18n("Unlimited");
+ }
+ TQString tr;
+ switch( trust[0] ) {
+ case 'o':
+ untrustedList<<id;
+ break;
+ case 'i':
+ dead=true;
+ break;
+ case 'd':
+ dead=true;
+ break;
+ case 'r':
+ dead=true;
+ break;
+ case 'e':
+ dead=true;
+ break;
+ case 'q':
+ untrustedList<<id;
+ break;
+ case 'n':
+ untrustedList<<id;
+ break;
+ case 'm':
+ untrustedList<<id;
+ break;
+ case 'f':
+ break;
+ case 'u':
+ break;
+ default:
+ untrustedList<<id;
+ break;
+ }
+ if (keyString[11].find('D')!=-1) {
+ dead=true;
+ }
+ fullname=keyString[9];
+ }
+
+ if ( line.startsWith("uid") && fullname.isEmpty() ) {
+ fullname = line.section(':',9,9);
+ }
+ }
+
+ if (fullname.find("<")!=-1) {
+ keymail=fullname.section('<',-1,-1);
+ keymail.truncate(keymail.length()-1);
+ keyname=fullname.section('<',0,0);
+ //if (keyname.find("(")!=-1) {
+ // keyname=keyname.section('(',0,0);
+ //}
+ }
+ else {
+ keymail=TQString();
+ keyname=fullname;//.section('(',0,0);
+ }
+ if ((!dead) && (!fullname.isEmpty())) {
+ bool isDefaultKey=false;
+ if (id.right(8)==defaultKey) {
+ isDefaultKey=true;
+ }
+ UpdateViewItem2 *item=new UpdateViewItem2(keysList,keyname,keymail,id,isDefaultKey);
+ //TDEListViewItem *sub= new TDEListViewItem(item,i18n("ID: %1, trust: %2, validity: %3").arg(id).arg(tr).arg(val));
+ //sub->setSelectable(false);
+ if (seclist.find(fullname,0,FALSE)!=-1) {
+ item->setPixmap(0,keyPair);
+ }
+ else {
+ item->setPixmap(0,keySingle);
+ }
+ }
+ }
}
@@ -459,8 +500,9 @@ kdDebug(2100)<<"Ok pressed"<<endl;
if (selectedKeys.isEmpty() && !CBsymmetric->isChecked())
return;
if (CBsymmetric->isChecked()) selectedKeys=NULL;
-kdDebug(2100)<<"Selected Key:"<<selectedKeys<<endl;
+// kdDebug(2100)<<"Selected Key:"<<selectedKeys<<endl;
TQStringList returnOptions;
+
if (CBuntrusted->isChecked())
returnOptions<<"--always-trust";
if (CBarmor->isChecked())
diff --git a/kgpg/popuppublic.h b/kgpg/popuppublic.h
index 8f9e418..7f860f6 100644
--- a/kgpg/popuppublic.h
+++ b/kgpg/popuppublic.h
@@ -41,8 +41,9 @@ public:
TQCheckBox *CBarmor,*CBuntrusted,*CBshred,*CBsymmetric,*CBhideid;
bool fmode,trusted;
TQPixmap keyPair,keySingle,keyGroup;
- TQString seclist;
+ TQString seclist, currentKey;
TQStringList untrustedList;
+ TQMap<TQString,TQStringList> hashMap;
private:
TDEConfig *config;