diff --git a/libretroshare/src/pgp/pgphandler.cc b/libretroshare/src/pgp/pgphandler.cc index 3ed47202e..2814292e5 100644 --- a/libretroshare/src/pgp/pgphandler.cc +++ b/libretroshare/src/pgp/pgphandler.cc @@ -82,10 +82,7 @@ PGPHandler::PGPHandler(const std::string& pubring, const std::string& secring,co RsStackFileLock flck(_pgp_lock_filename) ; // lock access to PGP directory. if(_passphrase_callback == NULL) - { std::cerr << "WARNING: before created a PGPHandler, you need to init the passphrase callback using PGPHandler::setPassphraseCallback()" << std::endl; - exit(-1) ; - } // Allocate public and secret keyrings. // @@ -220,7 +217,7 @@ bool PGPHandler::validateAndUpdateSignatures(PGPCertificateInfo& cert,const ops_ ops_boolean_t res = ops_validate_key_signatures(result,keydata,_pubring,cb_get_passphrase) ; if(res == ops_false) - std::cerr << "(EE) Error in PGPHandler::validateAndUpdateSignatures(). Validation failed for at least some signatures." << std::endl; + std::cerr << "(WW) Error in PGPHandler::validateAndUpdateSignatures(). Validation failed for at least some signatures." << std::endl; bool ret = false ; @@ -627,16 +624,25 @@ bool PGPHandler::getGPGDetailsFromBinaryBlock(const unsigned char *mem_block,siz } if(res == ops_false) - std::cerr << "(EE) Error in PGPHandler::validateAndUpdateSignatures(). Validation failed for at least some signatures." << std::endl; + std::cerr << "(WW) Error in PGPHandler::validateAndUpdateSignatures(). Validation failed for at least some signatures." << std::endl; + + // also add self-signature if any (there should be!). + // + res = ops_validate_key_signatures(result,&tmp_keyring->keys[0],tmp_keyring,cb_get_passphrase) ; + + if(res == ops_false) + std::cerr << "(WW) Error in PGPHandler::validateAndUpdateSignatures(). Validation failed for at least some signatures." << std::endl; // Parse signers. // + std::set signers_set ; // Use a set to remove duplicates. + if(result != NULL) for(size_t i=0;ivalid_count;++i) { std::string signer_str = PGPIdType(result->valid_sigs[i].signer_id).toStdString() ; - signers.push_back(signer_str) ; + signers_set.insert(signer_str) ; } ops_validate_result_free(result) ; @@ -644,6 +650,13 @@ bool PGPHandler::getGPGDetailsFromBinaryBlock(const unsigned char *mem_block,siz ops_keyring_free(tmp_keyring) ; free(tmp_keyring) ; + // write to the output variable + + signers.clear() ; + + for(std::set::const_iterator it(signers_set.begin());it!=signers_set.end();++it) + signers.push_back(*it) ; + return true ; } diff --git a/libretroshare/src/tests/pgp/test_certificate.cc b/libretroshare/src/tests/pgp/test_certificate.cc index 6ce26ae08..c03b958a7 100644 --- a/libretroshare/src/tests/pgp/test_certificate.cc +++ b/libretroshare/src/tests/pgp/test_certificate.cc @@ -1,8 +1,11 @@ #include +#include #include "argstream.h" //#include +#include #include +#include int main(int argc,char *argv[]) { @@ -64,6 +67,21 @@ int main(int argc,char *argv[]) std::cerr << "Output from certificate (new format):" << std::endl; std::cerr << cert.toStdString() << std::endl ; + std::string key_id ; + std::string name ; + std::list signers ; + + PGPHandler handler("toto1","toto2","toto3","toto4") ; +handler.getGPGDetailsFromBinaryBlock(cert.pgp_key(),cert.pgp_key_size(),key_id,name,signers) ; + + std::cerr << "Details loaded from certificate:" << std::endl; + std::cerr << "PGP id\t: " << key_id << std::endl; + std::cerr << "Key name\t: " << name << std::endl; + std::cerr << "Signers\t:" << std::endl; + + for(std::list::const_iterator it(signers.begin());it!=signers.end();++it) + std::cerr << " " << *it << std::endl; + return 0; } catch(std::exception& e) diff --git a/retroshare-gui/src/gui/connect/ConnectFriendWizard.cpp b/retroshare-gui/src/gui/connect/ConnectFriendWizard.cpp index 372ab63c0..6b244d48b 100755 --- a/retroshare-gui/src/gui/connect/ConnectFriendWizard.cpp +++ b/retroshare-gui/src/gui/connect/ConnectFriendWizard.cpp @@ -260,7 +260,18 @@ void ConnectFriendWizard::initializePage(int id) QString ts; std::list::iterator it; for (it = peerDetails.gpgSigners.begin(); it != peerDetails.gpgSigners.end(); ++it) { - ts += QString("%1<%2>\n").arg(QString::fromUtf8(rsPeers->getPeerName(*it).c_str()), QString::fromStdString(*it)); + { + std::string peer_name = rsPeers->getPeerName(*it) ; + + // This is baaaad code. We should handle this kind of errors with proper exceptions. + // This happens because signers from a unknown key cannt be found in the keyring, including + // self-signatures. + // + if(peer_name == "[Unknown PGP Cert name]" && *it == peerDetails.gpg_id) + peer_name = peerDetails.name ; + + ts += QString("%1<%2>\n").arg(QString::fromUtf8(peer_name.c_str()), QString::fromStdString(*it)); + } } ui->nameEdit->setText(QString::fromUtf8(peerDetails.name.c_str()));