certmanager/lib

messagebox.cpp

00001 /*
00002     messagebox.cpp
00003 
00004     This file is part of libkleopatra, the KDE keymanagement library
00005     Copyright (c) 2004 Klarälvdalens Datakonsult AB
00006 
00007     Libkleopatra is free software; you can redistribute it and/or
00008     modify it under the terms of the GNU General Public License as
00009     published by the Free Software Foundation; either version 2 of the
00010     License, or (at your option) any later version.
00011 
00012     Libkleopatra is distributed in the hope that it will be useful,
00013     but WITHOUT ANY WARRANTY; without even the implied warranty of
00014     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015     General Public License for more details.
00016 
00017     You should have received a copy of the GNU General Public License
00018     along with this program; if not, write to the Free Software
00019     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
00020 
00021     In addition, as a special exception, the copyright holders give
00022     permission to link the code of this program with any edition of
00023     the TQt library by Trolltech AS, Norway (or with modified versions
00024     of TQt that use the same license as TQt), and distribute linked
00025     combinations including the two.  You must obey the GNU General
00026     Public License in all respects for all of the code used other than
00027     TQt.  If you modify this file, you may extend this exception to
00028     your version of the file, but you are not obligated to do so.  If
00029     you do not wish to do so, delete this exception statement from
00030     your version.
00031 */
00032 
00033 #ifdef HAVE_CONFIG_H
00034 #include <config.h>
00035 #endif
00036 
00037 #include "messagebox.h"
00038 
00039 #include "kleo/job.h"
00040 
00041 #include <gpgmepp/signingresult.h>
00042 #include <gpgmepp/encryptionresult.h>
00043 
00044 #include <tdefiledialog.h>
00045 #include <kdialogbase.h>
00046 #include <tdelocale.h>
00047 #include <ksavefile.h>
00048 #include <kguiitem.h>
00049 #include <kdebug.h>
00050 
00051 #include <tqtextedit.h>
00052 #include <tqtextstream.h>
00053 #include <tqvbox.h>
00054 #include <tqapplication.h>
00055 #include <tqstylesheet.h>
00056 
00057 #include <gpg-error.h>
00058 
00059 using namespace Kleo;
00060 using namespace GpgME;
00061 
00062 namespace {
00063 
00064 static KGuiItem KGuiItem_save() {
00065     return KGuiItem( i18n("&Save to Disk..."), "document-save-as" );
00066 }
00067 
00068 static KGuiItem KGuiItem_copy() {
00069     return KGuiItem( i18n("&Copy to Clipboard"), "edit-copy", i18n("Copy Audit Log to Clipboard") );
00070 }
00071 
00072 static KGuiItem KGuiItem_showAuditLog() {
00073     return KGuiItem( i18n("&Show Audit Log") ); // "view_log"?
00074 }
00075 
00076 class AuditLogViewer : public KDialogBase {
00077     // Q_OBJECT
00078   
00079 public:
00080     explicit AuditLogViewer( const TQString & log, TQWidget * parent=0, const char * name=0, WFlags f=0 )
00081         : KDialogBase( parent, name, false, i18n("View GnuPG Audit Log"),
00082                        Close|User1|User2, Close, false, KGuiItem_save(), KGuiItem_copy() ),
00083           m_log( /* sic */ ),
00084           m_textEdit( new TQTextEdit( this, "m_textEdit" ) )
00085     {
00086         setWFlags( f );
00087         setMainWidget( m_textEdit );
00088         m_textEdit->setTextFormat( TQTextEdit::RichText );
00089         m_textEdit->setReadOnly( true );
00090         setAuditLog( log );
00091     }
00092     ~AuditLogViewer() {}
00093 
00094     void setAuditLog( const TQString & log ) {
00095         if ( log == m_log )
00096             return;
00097         m_log = log;
00098         m_textEdit->setText( "<qt>" + log + "</qt>" );
00099         const TQRect rect = m_textEdit->paragraphRect( 0 );
00100         kdDebug() << "setAuditLog: rect = " << rect << endl;
00101         if ( !rect.isValid() )
00102             return;
00103         TQSize maxSize = tqApp->desktop()->screenGeometry( this ).size() * 2 / 3 ;
00104         if ( !maxSize.isValid() )
00105             maxSize = TQSize( 640, 480 );
00106         m_textEdit->setMinimumSize( rect.size().boundedTo( maxSize ) );
00107     }
00108 
00109 private:
00110     void slotUser1() {
00111         const TQString fileName = KFileDialog::getSaveFileName( TQString(), TQString(),
00112                                                                this, i18n("Choose File to Save GnuPG Audit Log to") );
00113         if ( fileName.isEmpty() )
00114             return;
00115 
00116         KSaveFile file( fileName );
00117 
00118         if ( TQTextStream * const s = file.textStream() ) {
00119             *s << "<html><head>";
00120             if ( !caption().isEmpty() )
00121                 *s << "\n<title>" << /*TQt*/TQStyleSheet::escape( caption() ) << "</title>\n";
00122             *s << "</head><body>\n"
00123                << m_log
00124                << "\n</body></html>" << endl;
00125             file.close();
00126         }
00127 
00128         if ( const int err = file.status() )
00129             KMessageBox::error( this, i18n("Couldn't save to file \"%1\": %2")
00130                                 .arg( file.name(), TQString::fromLocal8Bit( strerror( err ) ) ),
00131                                 i18n("File Save Error") );
00132     }
00133     void slotUser2() {
00134         m_textEdit->selectAll();
00135         m_textEdit->copy();
00136         m_textEdit->selectAll( false );
00137     }
00138 
00139 private:
00140     TQString m_log;
00141     TQTextEdit * m_textEdit;
00142 };
00143 
00144 } // anon namespace
00145 
00146 // static
00147 void MessageBox::auditLog( TQWidget * parent, const Job * job, const TQString & caption ) {
00148 
00149     if ( !job )
00150         return;
00151 
00152     if ( !GpgME::hasFeature( AuditLogFeature ) || !job->isAuditLogSupported() ) {
00153         KMessageBox::information( parent, i18n("Your system does not have support for GnuPG Audit Logs"),
00154                                   i18n("System Error") );
00155         return;
00156     }
00157 
00158     const GpgME::Error err = job->auditLogError();
00159 
00160     if ( err.code() != GPG_ERR_NO_DATA ) {
00161         KMessageBox::information( parent, i18n("An error occurred while trying to retrieve the GnuPG Audit Log:\n%1")
00162                                   .arg( TQString::fromLocal8Bit( err.asString() ) ),
00163                                   i18n("GnuPG Audit Log Error") );
00164         return;
00165     }
00166 
00167     const TQString log = job->auditLogAsHtml();
00168 
00169     if ( log.isEmpty() ) {
00170         KMessageBox::information( parent, i18n("No GnuPG Audit Log available for this operation."),
00171                                   i18n("No GnuPG Audit Log") );
00172         return;
00173     }
00174 
00175     auditLog( parent, log, caption );
00176 }
00177 
00178 // static
00179 void MessageBox::auditLog( TQWidget * parent, const TQString & log, const TQString & caption ) {
00180     AuditLogViewer * const alv = new AuditLogViewer( log, parent, "alv", TQt::WDestructiveClose );
00181     alv->setCaption( caption );
00182     alv->show();
00183 }
00184 
00185 // static
00186 void MessageBox::auditLog( TQWidget * parent, const Job * job ) {
00187     auditLog( parent, job, i18n("GnuPG Audit Log Viewer") );
00188 }
00189 
00190 // static
00191 void MessageBox::auditLog( TQWidget * parent, const TQString & log ) {
00192     auditLog( parent, log, i18n("GnuPG Audit Log Viewer") );
00193 }
00194 
00195 static TQString to_information_string( const SigningResult & result ) {
00196     return result.error()
00197         ? i18n("Signing failed: %1").arg( TQString::fromLocal8Bit( result.error().asString() ) )
00198         : i18n("Signing successful") ;
00199 }
00200 
00201 static TQString to_error_string( const SigningResult & result ) {
00202     return to_information_string( result );
00203 }
00204 
00205 static TQString to_information_string( const EncryptionResult & result ) {
00206     return result.error()
00207         ? i18n("Encryption failed: %1").arg( TQString::fromLocal8Bit( result.error().asString() ) )
00208         : i18n("Encryption successful") ;
00209 }
00210 
00211 static TQString to_error_string( const EncryptionResult & result ) {
00212     return to_information_string( result );
00213 }
00214 
00215 static TQString to_information_string( const SigningResult & sresult, const EncryptionResult & eresult ) {
00216     return to_information_string( sresult ) + '\n' + to_information_string( eresult );
00217 }
00218 
00219 static TQString to_error_string( const SigningResult & sresult, const EncryptionResult & eresult ) {
00220     return to_information_string( sresult, eresult );
00221 }
00222 
00223 // static
00224 void MessageBox::information( TQWidget * parent, const SigningResult & result, const Job * job, int options ) {
00225     information( parent, result, job, i18n("Signing Result"), options );
00226 }
00227 
00228 // static
00229 void MessageBox::information( TQWidget * parent, const SigningResult & result, const Job * job, const TQString & caption, int options ) {
00230     make( parent, TQMessageBox::Information, to_information_string( result ), job, caption, options );
00231 }
00232 
00233 // static
00234 void MessageBox::error( TQWidget * parent, const SigningResult & result, const Job * job, int options ) {
00235     error( parent, result, job, i18n("Signing Error"), options );
00236 }
00237 
00238 // static
00239 void MessageBox::error( TQWidget * parent, const SigningResult & result, const Job * job, const TQString & caption, int options ) {
00240     make( parent, TQMessageBox::Critical, to_error_string( result ), job, caption, options );
00241 }
00242 
00243 // static
00244 void MessageBox::information( TQWidget * parent, const EncryptionResult & result, const Job * job, int options ) {
00245     information( parent, result, job, i18n("Encryption Result"), options );
00246 }
00247 
00248 // static
00249 void MessageBox::information( TQWidget * parent, const EncryptionResult & result, const Job * job, const TQString & caption, int options ) {
00250     make( parent, TQMessageBox::Information, to_information_string( result ), job, caption, options );
00251 }
00252 
00253 // static
00254 void MessageBox::error( TQWidget * parent, const EncryptionResult & result, const Job * job, int options ) {
00255     error( parent, result, job, i18n("Encryption Error"), options );
00256 }
00257 
00258 // static
00259 void MessageBox::error( TQWidget * parent, const EncryptionResult & result, const Job * job, const TQString & caption, int options ) {
00260     make( parent, TQMessageBox::Critical, to_error_string( result ), job, caption, options );
00261 }
00262 
00263 // static
00264 void MessageBox::information( TQWidget * parent, const SigningResult & sresult, const EncryptionResult & eresult, const Job * job, int options ) {
00265     information( parent, sresult, eresult, job, i18n("Encryption Result"), options );
00266 }
00267 
00268 // static
00269 void MessageBox::information( TQWidget * parent, const SigningResult & sresult, const EncryptionResult & eresult, const Job * job, const TQString & caption, int options ) {
00270     make( parent, TQMessageBox::Information, to_information_string( sresult, eresult ), job, caption, options );
00271 }
00272 
00273 // static
00274 void MessageBox::error( TQWidget * parent, const SigningResult & sresult, const EncryptionResult & eresult, const Job * job, int options ) {
00275     error( parent, sresult, eresult, job, i18n("Encryption Error"), options );
00276 }
00277 
00278 // static
00279 void MessageBox::error( TQWidget * parent, const SigningResult & sresult, const EncryptionResult & eresult, const Job * job, const TQString & caption, int options ) {
00280     make( parent, TQMessageBox::Critical, to_error_string( sresult, eresult ), job, caption, options );
00281 }
00282 
00283 // static
00284 bool MessageBox::showAuditLogButton( const Kleo::Job * job ) {
00285     if ( !job ) {
00286         kdDebug() << "not showing audit log button (no job instance)" << endl;
00287         return false;
00288     }
00289     if ( !GpgME::hasFeature( GpgME::AuditLogFeature ) ) {
00290         kdDebug() << "not showing audit log button (gpgme too old)" << endl;
00291         return false;
00292     }
00293     if ( !job->isAuditLogSupported() ) {
00294         kdDebug() << "not showing audit log button (not supported)" << endl;
00295         return false;
00296     }
00297     if ( job->auditLogError().code() == GPG_ERR_NO_DATA ) {
00298         kdDebug() << "not showing audit log button (GPG_ERR_NO_DATA)" << endl;
00299         return false;
00300     }
00301     if ( !job->auditLogError() && job->auditLogAsHtml().isEmpty() ) {
00302         kdDebug() << "not showing audit log button (success, but result empty)" << endl;
00303         return false;
00304     }
00305     return true;
00306 }
00307 
00308 
00309 // static
00310 void MessageBox::make( TQWidget * parent, TQMessageBox::Icon icon, const TQString & text, const Job * job, const TQString & caption, int options ) {
00311     KDialogBase * dialog = showAuditLogButton( job )
00312         ? new KDialogBase( caption, KDialogBase::Yes | KDialogBase::No,
00313                            KDialogBase::Yes, KDialogBase::Yes,
00314                            parent, "error", true, true,
00315                            KStdGuiItem::ok(), KGuiItem_showAuditLog() )
00316         : new KDialogBase( caption, KDialogBase::Yes,
00317                            KDialogBase::Yes, KDialogBase::Yes,
00318                            parent, "error", true, true,
00319                            KStdGuiItem::ok() ) ;
00320     if ( options & KMessageBox::PlainCaption )
00321         dialog->setPlainCaption( caption );
00322 
00323     if ( KDialogBase::No == KMessageBox::createKMessageBox( dialog, icon, text, TQStringList(), TQString(), 0, options ) )
00324         auditLog( 0, job );
00325 }