|
|
|
/*
|
|
|
|
kpgpkey.cpp
|
|
|
|
|
|
|
|
Copyright (C) 2001,2002 the KPGP authors
|
|
|
|
See file AUTHORS.kpgp for details
|
|
|
|
|
|
|
|
This file is part of KPGP, the KDE PGP/GnuPG support library.
|
|
|
|
|
|
|
|
KPGP is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program; if not, write to the Free Software Foundation,
|
|
|
|
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "kpgpkey.h"
|
|
|
|
#include "kdebug.h"
|
|
|
|
|
|
|
|
namespace Kpgp {
|
|
|
|
|
|
|
|
/* member functions of Kpgp::KeyIDList --------------------------------- */
|
|
|
|
|
|
|
|
/** Converts from a KeyIDList to a TQStringList.
|
|
|
|
*/
|
|
|
|
TQStringList KeyIDList::toStringList() const
|
|
|
|
{
|
|
|
|
TQStringList res;
|
|
|
|
for( KeyIDList::ConstIterator it = begin(); it != end(); ++it ) {
|
|
|
|
res << (*it).data();
|
|
|
|
}
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Converts from a TQStringList to a KeyIDList.
|
|
|
|
*/
|
|
|
|
KeyIDList KeyIDList::fromStringList( const TQStringList& l )
|
|
|
|
{
|
|
|
|
KeyIDList res;
|
|
|
|
for( TQStringList::ConstIterator it = l.begin(); it != l.end(); ++it ) {
|
|
|
|
res << (*it).local8Bit();
|
|
|
|
}
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* member functions of Kpgp::UserID ------------------------------------ */
|
|
|
|
|
|
|
|
UserID::UserID(const TQString& str, const Validity validity,
|
|
|
|
const bool revoked, const bool invalid)
|
|
|
|
{
|
|
|
|
mText = str;
|
|
|
|
mValidity = validity;
|
|
|
|
mRevoked = revoked;
|
|
|
|
mInvalid = invalid;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* member functions of Kpgp::Subkey ------------------------------------ */
|
|
|
|
|
|
|
|
Subkey::Subkey(const KeyID& keyID, const bool secret)
|
|
|
|
{
|
|
|
|
mSecret = secret;
|
|
|
|
mKeyID = keyID;
|
|
|
|
|
|
|
|
mRevoked = false;
|
|
|
|
mExpired = false;
|
|
|
|
mDisabled = false;
|
|
|
|
mInvalid = false;
|
|
|
|
mCanEncrypt = false;
|
|
|
|
mCanSign = false;
|
|
|
|
mCanCertify = false;
|
|
|
|
mKeyAlgo = 0;
|
|
|
|
mKeyLen = 0;
|
|
|
|
mFingerprint = 0;
|
|
|
|
mTimestamp = 0;
|
|
|
|
mExpiration = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* member functions of Kpgp::Key --------------------------------------- */
|
|
|
|
|
|
|
|
Key::Key(const KeyID& keyid, const TQString& uid, const bool secret) :
|
|
|
|
mSubkeys(), mUserIDs()
|
|
|
|
{
|
|
|
|
mSecret = secret;
|
|
|
|
if (!keyid.isEmpty())
|
|
|
|
addSubkey(keyid, secret);
|
|
|
|
if (!uid.isEmpty())
|
|
|
|
addUserID(uid);
|
|
|
|
|
|
|
|
mRevoked = false;
|
|
|
|
mExpired = false;
|
|
|
|
mDisabled = false;
|
|
|
|
mInvalid = false;
|
|
|
|
mCanEncrypt = false;
|
|
|
|
mCanSign = false;
|
|
|
|
mCanCertify = false;
|
|
|
|
|
|
|
|
mEncryptPref = UnknownEncryptPref;
|
|
|
|
}
|
|
|
|
|
|
|
|
Key::~Key()
|
|
|
|
{
|
|
|
|
//kdDebug(5100) << "Kpgp::Key: Deleting key " << primaryUserID() << endl;
|
|
|
|
mUserIDs.setAutoDelete(true);
|
|
|
|
mUserIDs.clear();
|
|
|
|
mSubkeys.setAutoDelete(true);
|
|
|
|
mSubkeys.clear();
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Key::clear()
|
|
|
|
{
|
|
|
|
mSecret = false;
|
|
|
|
mRevoked = false;
|
|
|
|
mExpired = false;
|
|
|
|
mDisabled = false;
|
|
|
|
mInvalid = false;
|
|
|
|
mCanEncrypt = false;
|
|
|
|
mCanSign = false;
|
|
|
|
mCanCertify = false;
|
|
|
|
|
|
|
|
mEncryptPref = UnknownEncryptPref;
|
|
|
|
|
|
|
|
mSubkeys.setAutoDelete(true);
|
|
|
|
mSubkeys.clear();
|
|
|
|
mUserIDs.setAutoDelete(true);
|
|
|
|
mUserIDs.clear();
|
|
|
|
}
|
|
|
|
|
|
|
|
Validity
|
|
|
|
Key::keyTrust() const
|
|
|
|
{
|
|
|
|
Validity trust = KPGP_VALIDITY_UNKNOWN;
|
|
|
|
|
|
|
|
for( UserIDListIterator it(mUserIDs); it.current(); ++it )
|
|
|
|
{
|
|
|
|
if( (*it)->validity() > trust )
|
|
|
|
trust = (*it)->validity();
|
|
|
|
}
|
|
|
|
|
|
|
|
return trust;
|
|
|
|
}
|
|
|
|
|
|
|
|
Validity
|
|
|
|
Key::keyTrust( const TQString& uid ) const
|
|
|
|
{
|
|
|
|
Validity trust = KPGP_VALIDITY_UNKNOWN;
|
|
|
|
|
|
|
|
if( uid.isEmpty() )
|
|
|
|
return trust;
|
|
|
|
|
|
|
|
for( UserIDListIterator it(mUserIDs); it.current(); ++it )
|
|
|
|
{
|
|
|
|
if( (*it)->text() == uid )
|
|
|
|
trust = (*it)->validity();
|
|
|
|
}
|
|
|
|
|
|
|
|
return trust;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Key::cloneKeyTrust( const Key* key )
|
|
|
|
{
|
|
|
|
if( !key )
|
|
|
|
return;
|
|
|
|
|
|
|
|
for( UserIDListIterator it(mUserIDs); it.current(); ++it )
|
|
|
|
{
|
|
|
|
(*it)->setValidity( key->keyTrust( (*it)->text() ) );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
Key::isValid() const
|
|
|
|
{
|
|
|
|
return ( !mRevoked && !mExpired && !mDisabled && !mInvalid );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
Key::isValidEncryptionKey() const
|
|
|
|
{
|
|
|
|
return ( !mRevoked && !mExpired && !mDisabled && !mInvalid && mCanEncrypt );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
Key::isValidSigningKey() const
|
|
|
|
{
|
|
|
|
return ( !mRevoked && !mExpired && !mDisabled && !mInvalid && mCanSign );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Key::addUserID(const TQString &uid, const Validity validity,
|
|
|
|
const bool revoked, const bool invalid)
|
|
|
|
{
|
|
|
|
if (!uid.isEmpty()) {
|
|
|
|
UserID *userID = new UserID(uid, validity, revoked, invalid);
|
|
|
|
mUserIDs.append(userID);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Key::matchesUserID(const TQString& str, bool cs)
|
|
|
|
{
|
|
|
|
if (str.isEmpty() || mUserIDs.isEmpty())
|
|
|
|
return false;
|
|
|
|
|
|
|
|
for (UserIDListIterator it(mUserIDs); it.current(); ++it) {
|
|
|
|
if (((*it)->text().tqfind(str, 0, cs)) != -1)
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Key::addSubkey(const KeyID& keyID, const bool secret)
|
|
|
|
{
|
|
|
|
if (!keyID.isEmpty()) {
|
|
|
|
Subkey *key = new Subkey(keyID, secret);
|
|
|
|
mSubkeys.append(key);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Subkey *Key::getSubkey(const KeyID& keyID)
|
|
|
|
{
|
|
|
|
if (keyID.isEmpty() || mSubkeys.isEmpty())
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
// is the given key ID a long (16 chars) or a short (8 chars) key ID?
|
|
|
|
bool longKeyID = (keyID.length() == 16);
|
|
|
|
|
|
|
|
for (SubkeyListIterator it(mSubkeys); it.current(); ++it) {
|
|
|
|
if (longKeyID) {
|
|
|
|
if ((*it)->longKeyID() == keyID)
|
|
|
|
return (*it);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
if ((*it)->keyID() == keyID)
|
|
|
|
return (*it);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Key::setFingerprint(const KeyID& keyID, const TQCString &fpr)
|
|
|
|
{
|
|
|
|
Subkey *key;
|
|
|
|
if ((key = getSubkey(keyID)) != 0) {
|
|
|
|
key->setFingerprint(fpr);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
kdDebug(5006) << "Error: Can't set fingerprint. A subkey with key ID 0x"
|
|
|
|
<< keyID << " doesn't exist." << endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace Kpgp
|