00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #ifdef HAVE_CONFIG_H
00038 #include <config.h>
00039 #endif
00040
00041 #include "keyapprovaldialog.h"
00042
00043 #include "keyrequester.h"
00044
00045 #include <cryptplugfactory.h>
00046 #include <kleo/cryptobackend.h>
00047
00048 #include <klocale.h>
00049 #include <kglobalsettings.h>
00050 #include <kseparator.h>
00051
00052 #include <qstringlist.h>
00053 #include <qframe.h>
00054 #include <qlayout.h>
00055 #include <qlabel.h>
00056 #include <qcombobox.h>
00057 #include <qscrollview.h>
00058 #include <qpushbutton.h>
00059
00060 #include <gpgmepp/key.h>
00061
00062 #include <assert.h>
00063
00064 static Kleo::EncryptionPreference cb2pref( int i ) {
00065 switch ( i ) {
00066 default:
00067 case 0: return Kleo::UnknownPreference;
00068 case 1: return Kleo::NeverEncrypt;
00069 case 2: return Kleo::AlwaysEncrypt;
00070 case 3: return Kleo::AlwaysEncryptIfPossible;
00071 case 4: return Kleo::AlwaysAskForEncryption;
00072 case 5: return Kleo::AskWheneverPossible;
00073 }
00074 }
00075
00076 static int pref2cb( Kleo::EncryptionPreference p ) {
00077 switch ( p ) {
00078 default: return 0;
00079 case Kleo::NeverEncrypt: return 1;
00080 case Kleo::AlwaysEncrypt: return 2;
00081 case Kleo::AlwaysEncryptIfPossible: return 3;
00082 case Kleo::AlwaysAskForEncryption: return 4;
00083 case Kleo::AskWheneverPossible: return 5;
00084 }
00085 }
00086
00087 static QStringList preferencesStrings() {
00088 return QStringList() << i18n("<none>")
00089 << i18n("Never Encrypt with This Key")
00090 << i18n("Always Encrypt with This Key")
00091 << i18n("Encrypt Whenever Encryption is Possible")
00092 << i18n("Always Ask")
00093 << i18n("Ask Whenever Encryption is Possible");
00094 }
00095
00096
00097 struct Kleo::KeyApprovalDialog::Private {
00098 Private() : selfRequester( 0 ), prefsChanged( false ) {}
00099
00100 Kleo::KeyRequester * selfRequester;
00101 QStringList addresses;
00102 std::vector<Kleo::KeyRequester*> requesters;
00103 std::vector<QComboBox*> preferences;
00104 bool prefsChanged;
00105 };
00106
00107 Kleo::KeyApprovalDialog::KeyApprovalDialog( const std::vector<Item> & recipients,
00108 const std::vector<GpgME::Key> & sender,
00109 QWidget * parent, const char * name,
00110 bool modal )
00111 : KDialogBase( parent, name, modal, i18n("Encryption Key Approval"), Ok|Cancel, Ok ),
00112 d( 0 )
00113 {
00114 assert( !recipients.empty() );
00115
00116 d = new Private();
00117
00118 QFrame *page = makeMainWidget();
00119 QVBoxLayout * vlay = new QVBoxLayout( page, 0, spacingHint() );
00120
00121 vlay->addWidget( new QLabel( i18n("The following keys will be used for encryption:"), page ) );
00122
00123 QScrollView * sv = new QScrollView( page );
00124 sv->setResizePolicy( QScrollView::AutoOneFit );
00125 vlay->addWidget( sv );
00126
00127 QWidget * view = new QWidget( sv->viewport() );
00128
00129 QGridLayout * glay = new QGridLayout( view, 3, 2, marginHint(), spacingHint() );
00130 glay->setColStretch( 1, 1 );
00131 sv->addChild( view );
00132
00133 int row = -1;
00134
00135 if ( !sender.empty() ) {
00136 ++row;
00137 glay->addWidget( new QLabel( i18n("Your keys:"), view ), row, 0 );
00138 d->selfRequester = new EncryptionKeyRequester( true, EncryptionKeyRequester::AllProtocols, view );
00139 d->selfRequester->setKeys( sender );
00140 glay->addWidget( d->selfRequester, row, 1 );
00141 ++row;
00142 glay->addMultiCellWidget( new KSeparator( Horizontal, view ), row, row, 0, 1 );
00143 }
00144
00145 const QStringList prefs = preferencesStrings();
00146
00147 for ( std::vector<Item>::const_iterator it = recipients.begin() ; it != recipients.end() ; ++it ) {
00148 ++row;
00149 glay->addWidget( new QLabel( i18n("Recipient:"), view ), row, 0 );
00150 glay->addWidget( new QLabel( it->address, view ), row, 1 );
00151 d->addresses.push_back( it->address );
00152
00153 ++row;
00154 glay->addWidget( new QLabel( i18n("Encryption keys:"), view ), row, 0 );
00155 KeyRequester * req = new EncryptionKeyRequester( true, EncryptionKeyRequester::AllProtocols, view );
00156 req->setKeys( it->keys );
00157 glay->addWidget( req, row, 1 );
00158 d->requesters.push_back( req );
00159
00160 ++row;
00161 glay->addWidget( new QLabel( i18n("Encryption preference:"), view ), row, 0 );
00162 QComboBox * cb = new QComboBox( false, view );
00163 cb->insertStringList( prefs );
00164 glay->addWidget( cb, row, 1 );
00165 cb->setCurrentItem( pref2cb( it->pref ) );
00166 connect( cb, SIGNAL(activated(int)), SLOT(slotPrefsChanged()) );
00167 d->preferences.push_back( cb );
00168 }
00169
00170
00171 const int dialogWidth = marginHint()
00172 + sv->frameWidth()
00173 + view->sizeHint().width()
00174 + sv->verticalScrollBar()->sizeHint().width()
00175 + sv->frameWidth()
00176 + marginHint()
00177 + 2;
00178
00179 const int dialogHeight = marginHint()
00180 + fontMetrics().height()
00181 + spacingHint()
00182 + sv->frameWidth()
00183 + view->sizeHint().height()
00184 + sv->horizontalScrollBar()->sizeHint().height()
00185 + sv->frameWidth()
00186 + spacingHint()
00187 + actionButton( KDialogBase::Cancel )->sizeHint().height()
00188 + marginHint()
00189 + 2;
00190
00191
00192 const QRect desk = KGlobalSettings::desktopGeometry( this );
00193 setInitialSize( QSize( kMin( dialogWidth, 3 * desk.width() / 4 ),
00194 kMin( dialogHeight, 7 * desk.height() / 8 ) ) );
00195 }
00196
00197 Kleo::KeyApprovalDialog::~KeyApprovalDialog() {
00198 delete d; d = 0;
00199 }
00200
00201 std::vector<GpgME::Key> Kleo::KeyApprovalDialog::senderKeys() const {
00202 return d->selfRequester ? d->selfRequester->keys() : std::vector<GpgME::Key>() ;
00203 }
00204
00205 std::vector<Kleo::KeyApprovalDialog::Item> Kleo::KeyApprovalDialog::items() const {
00206 assert( d->requesters.size() == d->addresses.size() );
00207 assert( d->requesters.size() == d->preferences.size() );
00208
00209 std::vector<Item> result;
00210 result.reserve( d->requesters.size() );
00211 QStringList::const_iterator ait = d->addresses.begin();
00212 std::vector<KeyRequester*>::const_iterator rit = d->requesters.begin();
00213 std::vector<QComboBox*>::const_iterator cit = d->preferences.begin();
00214 while ( ait != d->addresses.end() )
00215 result.push_back( Item( *ait++, (*rit++)->keys(), cb2pref( (*cit++)->currentItem() ) ) );
00216 return result;
00217 }
00218
00219 bool Kleo::KeyApprovalDialog::preferencesChanged() const {
00220 return d->prefsChanged;
00221 }
00222
00223 void Kleo::KeyApprovalDialog::slotPrefsChanged() {
00224 d->prefsChanged = true;
00225 }
00226
00227 #include "keyapprovaldialog.moc"