00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef KPGP_H
00020 #define KPGP_H
00021
00022 #include <stdio.h>
00023 #include <qstring.h>
00024 #include <qstrlist.h>
00025 #include <qdialog.h>
00026 #include <qwidget.h>
00027 #include <qcombobox.h>
00028 #include <qlayout.h>
00029 #include <qpushbutton.h>
00030 #include <qlistview.h>
00031 #include <qbuttongroup.h>
00032 #include <qradiobutton.h>
00033 #include <qmultilineedit.h>
00034 #include <qcheckbox.h>
00035
00036 #include <kdialogbase.h>
00037
00038 #include "kpgpkey.h"
00039
00040 class QLineEdit;
00041 class QCursor;
00042 class QCheckBox;
00043 class QGridLayout;
00044
00045 class KConfig;
00046
00047 namespace Kpgp {
00048
00059 enum { PublicKeys = 1,
00060 SecretKeys = 2,
00061 EncryptionKeys = 4,
00062 SigningKeys = 8,
00063 ValidKeys = 16,
00064 TrustedKeys = 32,
00065 AllKeys = PublicKeys | SecretKeys | EncryptionKeys | SigningKeys,
00066 PubSecKeys = PublicKeys | SecretKeys,
00067 EncrSignKeys = EncryptionKeys | SigningKeys
00068 };
00069
00070 enum Result
00071 {
00072 Failure = 0,
00073 Ok = 1,
00074 Canceled = 2
00075 };
00076
00077 class Base;
00078 class Block;
00079
00080 class Module
00081 {
00082 friend class Block;
00083
00084 private:
00085
00086 Base *pgp;
00087
00088 public:
00089 Module();
00090 virtual ~Module();
00091
00095 virtual void readConfig();
00096 virtual void writeConfig(bool sync);
00097 virtual void init();
00098
00101 bool decrypt( Block& block );
00102
00104 bool verify( Block& block );
00105
00113 Kpgp::Result clearsign( Block& block,
00114 const KeyID& keyId, const QCString& charset = 0 );
00115
00124 Kpgp::Result encrypt( Block& block,
00125 const QStringList& receivers, const KeyID& keyId,
00126 bool sign, const QCString& charset = 0 );
00127
00135 Kpgp::Result getEncryptionKeys( KeyIDList& encryptionKeyIds,
00136 const QStringList& recipients,
00137 const KeyID& keyId );
00138
00148 int encryptionPossible( const QStringList& recipients );
00149
00150 protected:
00151 int doEncSign( Block& block, const KeyIDList& recipientKeyIds, bool sign );
00152
00153 public:
00155 bool signKey( const KeyID& keyID );
00156
00158 const KeyList publicKeys();
00159
00161 const KeyList secretKeys();
00162
00165 void readPublicKeys( bool reread = false );
00166
00169 void readSecretKeys( bool reread = false );
00170
00172 QCString getAsciiPublicKey( const KeyID& keyID );
00173
00177 Key* publicKey( const KeyID& keyID );
00178
00182 Key* publicKey( const QString& userID );
00183
00187 Key* secretKey( const KeyID& keyID );
00188
00192 Validity keyTrust( const KeyID& keyID );
00193
00198 Validity keyTrust( const QString& userID );
00199
00203 bool isTrusted( const KeyID& keyID );
00204
00208 Key* rereadKey( const KeyID& keyID, const bool readTrust = true );
00209
00212 bool changePassPhrase();
00213
00216 void setUser(const KeyID& keyID);
00218 const KeyID user() const;
00219
00221 void setEncryptToSelf(bool flag);
00222 bool encryptToSelf(void) const;
00223
00229 void setStorePassPhrase(bool);
00230 bool storePassPhrase(void) const;
00231
00233 void clear(const bool erasePassPhrase = FALSE);
00234
00236 const QString lastErrorMsg(void) const;
00237
00238
00239 enum PGPType { tAuto, tGPG, tPGP2, tPGP5, tPGP6, tOff } pgpType;
00240
00241
00242 bool havePGP(void) const;
00243
00245 bool usePGP(void) const { return (havePGP() && (pgpType != tOff)); }
00246
00247
00248 void setShowCipherText(const bool flag);
00249 bool showCipherText(void) const;
00250
00251
00252 void setShowKeyApprovalDlg(const bool flag);
00253 bool showKeyApprovalDlg(void) const;
00254
00259 KeyID selectSecretKey( const QString& title,
00260 const QString& text = QString::null,
00261 const KeyID& keyId = KeyID() );
00262
00269 KeyID selectPublicKey( const QString& title,
00270 const QString& text = QString::null,
00271 const KeyID& oldKeyId = KeyID(),
00272 const QString& address = QString::null,
00273 const unsigned int allowedKeys = AllKeys );
00274
00281 KeyIDList selectPublicKeys( const QString& title,
00282 const QString& text = QString::null,
00283 const KeyIDList& oldKeyIds = KeyIDList(),
00284 const QString& address = QString::null,
00285 const unsigned int allowedKeys = AllKeys );
00286
00287
00288
00292 EncryptPref encryptionPreference( const QString& address );
00293
00297 void setEncryptionPreference( const QString& address,
00298 const EncryptPref pref );
00299
00300
00301
00303 static Kpgp::Module *getKpgp();
00304
00306 static KConfig *getConfig();
00307
00322 static bool prepareMessageForDecryption( const QCString& msg,
00323 QPtrList<Block>& pgpBlocks,
00324 QStrList& nonPgpBlocks );
00325
00326 private:
00328 bool haveTrustedEncryptionKey( const QString& person );
00329
00331 KeyIDList getEncryptionKeys( const QString& person );
00332
00334 bool setPassPhrase(const char* pass);
00335
00342 int prepare(bool needPassPhrase=FALSE, Block* block = 0 );
00343
00345 void cleanupPass() { if (!storePass) wipePassPhrase(); }
00346
00349 void wipePassPhrase(bool free=false);
00350
00351
00352 QString canonicalAddress( const QString& person );
00353
00356 KeyID selectKey( const KeyList& keys,
00357 const QString& title,
00358 const QString& text = QString::null,
00359 const KeyID& keyId = KeyID(),
00360 const unsigned int allowedKeys = AllKeys );
00361
00364 KeyIDList selectKeys( const KeyList& keys,
00365 const QString& title,
00366 const QString& text = QString::null,
00367 const KeyIDList& keyIds = KeyIDList(),
00368 const unsigned int allowedKeys = AllKeys );
00369
00374 KeyID selectKey( bool& rememberChoice,
00375 const KeyList& keys,
00376 const QString& title,
00377 const QString& text = QString::null,
00378 const KeyID& keyId = KeyID(),
00379 const unsigned int allowedKeys = AllKeys );
00380
00385 KeyIDList selectKeys( bool& rememberChoice,
00386 const KeyList& keys,
00387 const QString& title,
00388 const QString& text = QString::null,
00389 const KeyIDList& keyIds = KeyIDList(),
00390 const unsigned int allowedKeys = AllKeys );
00391
00395 KeyIDList keysForAddress( const QString& address );
00396
00399 void setKeysForAddress( const QString& address, const KeyIDList& keyIDs );
00400
00402 void removeKeyForAddress( const QString& address );
00403
00407 void readAddressData();
00408
00412 void writeAddressData();
00413
00414 bool checkForPGP(void);
00415 void assignPGPBase(void);
00416
00417 static Kpgp::Module *kpgpObject;
00418 KConfig *config;
00419
00420 struct AddressData {
00421 KeyIDList keyIds;
00422 EncryptPref encrPref;
00423 };
00424 typedef QMap<QString, AddressData> AddressDataDict;
00425 AddressDataDict addressDataDict;
00426
00427 KeyList mPublicKeys;
00428 bool mPublicKeysCached : 1;
00429 KeyList mSecretKeys;
00430 bool mSecretKeysCached : 1;
00431
00432 bool storePass : 1;
00433 char * passphrase;
00434 size_t passphrase_buffer_len;
00435
00436 QString errMsg;
00437
00438 KeyID pgpUser;
00439 bool flagEncryptToSelf : 1;
00440
00441 bool havePgp : 1;
00442 bool havePGP5 : 1;
00443 bool haveGpg : 1;
00444 bool havePassPhrase : 1;
00445 bool showEncryptionResult : 1;
00446 bool mShowKeyApprovalDlg : 1;
00447 };
00448
00449
00450
00451 inline void
00452 Module::setShowKeyApprovalDlg( const bool flag )
00453 {
00454 mShowKeyApprovalDlg = flag;
00455 }
00456
00457 inline bool
00458 Module::showKeyApprovalDlg( void ) const
00459 {
00460 return mShowKeyApprovalDlg;
00461 }
00462
00463
00464
00465 }
00466
00467 #endif
00468