aboutsummaryrefslogtreecommitdiffstats
path: root/gpgwin.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gpgwin.cpp')
-rw-r--r--gpgwin.cpp404
1 files changed, 404 insertions, 0 deletions
diff --git a/gpgwin.cpp b/gpgwin.cpp
new file mode 100644
index 0000000..f321616
--- /dev/null
+++ b/gpgwin.cpp
@@ -0,0 +1,404 @@
+/*
+ * gpgwin.cpp
+ *
+ * Copyright 2008 gpg4usb-team <[email protected]>
+ *
+ * This program 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * 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 <QApplication>
+#include <QMainWindow>
+#include <QPlainTextEdit>
+#include <QWidget>
+#include <QVBoxLayout>
+#include <QGridLayout>
+#include <iostream>
+#include <QtGui>
+#include <QString>
+#include <QFileDialog>
+#include <QStringList>
+#include <QIcon>
+#include <QMessageBox>
+
+#include "context.h"
+#include "gpgwin.h"
+
+
+ GpgWin::GpgWin()
+ {
+ myCtx = new GpgME::Context();
+
+ edit = new QPlainTextEdit();
+ setCentralWidget(edit);
+
+ /* the list of Keys available*/
+ m_keyList = new KeyList();
+ m_keyList->setContext(myCtx);
+
+ createActions();
+ createMenus();
+ createToolBars();
+ createStatusBar();
+ createDockWindows();
+
+ setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
+ setIconSize(QSize(32, 32));
+ setCurrentFile("");
+
+}
+
+void GpgWin::createActions()
+ {
+ /** Main Menu
+ */
+ openAct = new QAction(tr("&Open..."), this);
+ openAct->setIcon(QIcon("icons/fileopen.png"));
+ openAct->setShortcut(tr("Ctrl+O"));
+ openAct->setStatusTip(tr("Open an existing file"));
+ connect(openAct, SIGNAL(triggered()), this, SLOT(open()));
+
+ saveAct = new QAction(tr("&Save"), this);
+ saveAct->setIcon(QIcon("icons/filesave.png"));
+ saveAct->setShortcut(tr("Ctrl+S"));
+ saveAct->setStatusTip(tr("Save the current File"));
+ connect(saveAct, SIGNAL(triggered()), this, SLOT(save()));
+
+ saveAsAct = new QAction(tr("Save &As"), this);
+ saveAsAct->setIcon(QIcon("icons/filesaveas.png"));
+ saveAsAct->setShortcut(tr("Ctrl+A"));
+ saveAsAct->setStatusTip(tr("Save the current File as..."));
+ connect(saveAsAct, SIGNAL(triggered()), this, SLOT(saveAs()));
+
+ printAct = new QAction(tr("&Print"), this);
+ printAct->setIcon(QIcon("icons/fileprint.png"));
+ printAct->setShortcut(tr("Ctrl+P"));
+ printAct->setStatusTip(tr("Print Document"));
+ connect(printAct, SIGNAL(triggered()), this, SLOT(print()));
+
+ quitAct = new QAction(tr("&Quit"), this);
+ quitAct->setShortcut(tr("Ctrl+Q"));
+ quitAct->setIcon(QIcon("icons/exit.png"));
+ quitAct->setStatusTip(tr("Quit Program"));
+ connect(quitAct, SIGNAL(triggered()), this, SLOT(quit()));
+
+ /** Edit Menu
+ */
+ pasteAct = new QAction(tr("&Paste"), this);
+ pasteAct->setIcon(QIcon("icons/button_paste.png"));
+ pasteAct->setShortcut(tr("Ctrl+V"));
+ pasteAct->setStatusTip(tr("Paste Text From Clipboard"));
+ connect(pasteAct, SIGNAL(triggered()), edit, SLOT(paste()));
+
+ cutAct = new QAction(tr("Cu&t"), this);
+ cutAct->setIcon(QIcon("icons/button_cut.png"));
+ cutAct->setShortcut(tr("Ctrl+X"));
+ cutAct->setStatusTip(tr("Cut the current selection's contents to the "
+ "clipboard"));
+ connect(cutAct, SIGNAL(triggered()), edit, SLOT(cut()));
+
+ copyAct = new QAction(tr("&Copy"), this);
+ copyAct->setIcon(QIcon("icons/button_copy.png"));
+ copyAct->setShortcut(tr("Ctrl+C"));
+ copyAct->setStatusTip(tr("Copy the current selection's contents to the "
+ "clipboard"));
+ connect(copyAct, SIGNAL(triggered()), edit, SLOT(copy()));
+
+ selectallAct = new QAction(tr("Select &All"), this);
+ selectallAct->setIcon(QIcon("icons/edit.png"));
+ selectallAct->setShortcut(tr("Ctrl+A"));
+ selectallAct->setStatusTip(tr("Select the whole text"));
+ connect(selectallAct, SIGNAL(triggered()), edit, SLOT(selectAll()));
+
+ /** Crypt Menu
+ */
+ encryptAct = new QAction(tr("&Encrypt"), this);
+ encryptAct->setIcon(QIcon("icons/encrypted.png"));
+ encryptAct->setShortcut(tr("Ctrl+E"));
+ encryptAct->setStatusTip(tr("Encrypt Message"));
+ connect(encryptAct, SIGNAL(triggered()), this, SLOT(encrypt()));
+
+ decryptAct = new QAction(tr("&Decrypt"), this);
+ decryptAct->setIcon(QIcon("icons/decrypted.png"));
+ decryptAct->setShortcut(tr("Ctrl+D"));
+ decryptAct->setStatusTip(tr("Decrypt Message"));
+ connect(decryptAct, SIGNAL(triggered()), this, SLOT(decrypt()));
+
+ importKeyFromFileAct = new QAction(tr("&Import Key From File"), this);
+ importKeyFromFileAct->setIcon(QIcon("icons/kgpg_import.png"));
+ importKeyFromFileAct->setShortcut(tr("Ctrl+I"));
+ importKeyFromFileAct->setStatusTip(tr("Import New Key From File"));
+ connect(importKeyFromFileAct, SIGNAL(triggered()), this, SLOT(importKeyFromFile()));
+
+ importKeyFromEditAct = new QAction(tr("Import Key From &Editor"), this);
+ importKeyFromEditAct->setIcon(QIcon("icons/importkey_editor.png"));
+ importKeyFromEditAct->setStatusTip(tr("Import New Key From Editor"));
+ connect(importKeyFromEditAct, SIGNAL(triggered()), this, SLOT(importKeyFromEdit()));
+
+ /** About Menu
+ */
+ aboutAct = new QAction(tr("&About"), this);
+ aboutAct->setIcon(QIcon("icons/help.png"));
+ aboutAct->setStatusTip(tr("Show the application's About box"));
+ connect(aboutAct, SIGNAL(triggered()), this, SLOT(about()));
+}
+
+void GpgWin::createMenus()
+ {
+ fileMenu = menuBar()->addMenu(tr("&File"));
+ fileMenu->addAction(openAct);
+ fileMenu->addAction(saveAct);
+ fileMenu->addAction(saveAsAct);
+ fileMenu->addAction(printAct);
+ fileMenu->addSeparator();
+ fileMenu->addAction(quitAct);
+
+ fileMenu = menuBar()->addMenu(tr("&Edit"));
+ fileMenu->addAction(copyAct);
+ fileMenu->addAction(cutAct);
+ fileMenu->addAction(pasteAct);
+ fileMenu->addAction(selectallAct);
+
+ fileMenu = menuBar()->addMenu(tr("&Crypt"));
+ fileMenu->addAction(encryptAct);
+ fileMenu->addAction(decryptAct);
+ fileMenu->addSeparator();
+ fileMenu->addAction(importKeyFromFileAct);
+ fileMenu->addAction(importKeyFromEditAct);
+
+ fileMenu = menuBar()->addMenu(tr("&Help"));
+ fileMenu->addAction(aboutAct);
+}
+
+void GpgWin::createToolBars()
+ {
+ fileToolBar = addToolBar(tr("File"));
+ fileToolBar->addAction(encryptAct);
+ fileToolBar->addAction(decryptAct);
+
+ editToolBar = addToolBar(tr("Edit"));
+ editToolBar->addAction(copyAct);
+ editToolBar->addAction(pasteAct);
+ editToolBar->addAction(selectallAct);
+}
+
+ void GpgWin::createStatusBar()
+ {
+ statusBar()->showMessage(tr("Ready"));
+ }
+
+void GpgWin::createDockWindows()
+{
+ QDockWidget *dock = new QDockWidget(tr("Encrypt for:"), this);
+ dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
+ addDockWidget(Qt::RightDockWidgetArea, dock);
+ dock->setWidget(m_keyList);
+}
+
+ void GpgWin::closeEvent(QCloseEvent *event)
+ {
+ if (maybeSave()) {
+ event->accept();
+ } else {
+ event->ignore();
+ }
+ }
+
+ void GpgWin::open()
+{
+ if (maybeSave()) {
+ QString fileName = QFileDialog::getOpenFileName(this);
+ if (!fileName.isEmpty())
+ loadFile(fileName);
+ }
+}
+
+void GpgWin::quit()
+{
+ if (maybeSave()) {
+ save();
+ }
+}
+
+
+ bool GpgWin::save()
+ {
+ if (curFile.isEmpty()) {
+ return saveAs();
+ } else {
+ return saveFile(curFile);
+ }
+ }
+
+ bool GpgWin::saveAs()
+ {
+ QString fileName = QFileDialog::getSaveFileName(this);
+ if (fileName.isEmpty())
+ return false;
+
+ return saveFile(fileName);
+ }
+
+ void GpgWin::loadFile(const QString &fileName)
+ {
+ QFile file(fileName);
+ if (!file.open(QFile::ReadOnly | QFile::Text)) {
+ QMessageBox::warning(this, tr("Application"),
+ tr("Cannot read file %1:\n%2.")
+ .arg(fileName)
+ .arg(file.errorString()));
+ return;
+ }
+
+ QTextStream in(&file);
+ QApplication::setOverrideCursor(Qt::WaitCursor);
+ edit->setPlainText(in.readAll());
+ QApplication::restoreOverrideCursor();
+
+ setCurrentFile(fileName);
+ statusBar()->showMessage(tr("File loaded"), 2000);
+ }
+
+ void GpgWin::setCurrentFile(const QString &fileName)
+ {
+ curFile = fileName;
+ edit->document()->setModified(false);
+ setWindowModified(false);
+
+ QString shownName;
+ if (curFile.isEmpty())
+ shownName = tr("untitled.txt");
+ else
+ shownName = strippedName(curFile);
+
+ setWindowTitle(tr("%1[*] - %2").arg(shownName).arg(tr("gpg4usb")));
+ }
+
+ QString GpgWin::strippedName(const QString &fullFileName)
+ {
+ return QFileInfo(fullFileName).fileName();
+ }
+
+ bool GpgWin::maybeSave()
+ {
+ if (edit->document()->isModified()) {
+ QMessageBox::StandardButton ret;
+ ret = QMessageBox::warning(this, tr("Application"),
+ tr("The document has been modified.\nDo you want to save your changes?"),
+ QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
+ if (ret == QMessageBox::Save)
+ return save();
+ else if (ret == QMessageBox::Cancel)
+ return false;
+ }
+ return true;
+ }
+
+bool GpgWin::saveFile(const QString &fileName)
+ {
+ /*QString fileName = QFileDialog::getSaveFileName(this,
+ tr("Choose a file name"), ".",
+ tr("Text (*.txt)","All (*)"));
+ if (fileName.isEmpty())
+ return false;*/
+ QFile file(fileName);
+ if (!file.open(QFile::WriteOnly | QFile::Text)) {
+ QMessageBox::warning(this, tr("File"),
+ tr("Cannot write file %1:\n%2.")
+ .arg(fileName)
+ .arg(file.errorString()));
+ return false;
+ }
+ QTextStream out(&file);
+ QApplication::setOverrideCursor(Qt::WaitCursor);
+ out << edit->toPlainText();
+ QApplication::restoreOverrideCursor();
+ statusBar()->showMessage(tr("Saved '%1'").arg(fileName), 2000);
+ return true;
+ }
+
+void GpgWin::print(){
+ #ifndef QT_NO_PRINTER
+ QTextDocument *document = edit->document();
+ QPrinter printer;
+
+ QPrintDialog *dlg = new QPrintDialog(&printer, this);
+ if (dlg->exec() != QDialog::Accepted)
+ return;
+
+ document->print(&printer);
+
+ statusBar()->showMessage(tr("Ready"), 2000);
+ #endif
+ }
+
+void GpgWin::about(){
+ QMessageBox::about(this, tr("About gpg4usb"),
+ tr("<center>This Application allows you to do simple<br>"
+ "encryption/decryption of your text-files.<br>"
+ "It's licensed under the GPL v2.0<br><br>"
+ "<b>Developer:</b><br>"
+ "Bene, Heimer, Juergen, Nils, Ubbo<br><br>"
+ "If you have any questions and/or<br>"
+ "suggestions, contact us at<br>"
+ "gpg4usb at cpunk.de</a><br><br>"
+ "or feel free to meet us in our channel at<br>"
+ "gpg4usb at conference.jabber.ccc.de<br><br>"
+ "and always remember:<br>"
+ "cpunk is NOT a bot...</center>"));
+ }
+
+ void GpgWin::encrypt(){
+ QList<QString> *uidList = m_keyList->getChecked();
+
+ QByteArray *tmp = new QByteArray();
+ if ( myCtx->encrypt(uidList, edit->toPlainText().toAscii(), tmp) ) {
+ QString *tmp2 = new QString(*tmp);
+ edit->setPlainText(*tmp2);
+ }
+
+ }
+
+ void GpgWin::decrypt(){
+ QByteArray *tmp = new QByteArray();
+ myCtx->decrypt(edit->toPlainText().toAscii(), tmp);
+ if(!tmp->isEmpty()){
+ QString *tmp2 = new QString(*tmp);
+ edit->setPlainText(*tmp2);
+ }
+ }
+
+ void GpgWin::importKeyFromEdit(){
+ myCtx->importKey(edit->toPlainText().toAscii());
+ m_keyList->refresh();
+ }
+
+
+ void GpgWin::importKeyFromFile(){
+ QString fileName = QFileDialog::getOpenFileName(this,tr("Open Key"),"", tr("Key Files")+" (*.asc *.txt);;All Files (*.*)");
+ if (! fileName.isNull()) {
+
+ QFile file;
+ file.setFileName(fileName);
+ if (!file.open(QIODevice::ReadOnly))
+ {
+ qDebug() << tr("couldn't open file: ")+fileName;
+ }
+ QByteArray inBuffer = file.readAll();
+
+ myCtx->importKey(inBuffer);
+ m_keyList->refresh();
+ }
+}
+