URI: 
       ttomb.cpp - tomb - the crypto undertaker
  HTML git clone git://parazyd.org/tomb.git
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       ttomb.cpp (5513B)
       ---
            1 /*  Tomb - encrypted storage undertaker
            2  *
            3  *  (c) Copyright 2015 Gianluca Montecchi <gian@grys.it>
            4  *
            5  * This source code is free software; you can redistribute it and/or
            6  * modify it under the terms of the GNU Public License as published
            7  * by the Free Software Foundation; either version 3 of the License,
            8  * or (at your option) any later version.
            9  *
           10  * This source code is distributed in the hope that it will be useful,
           11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
           12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
           13  * Please refer to the GNU Public License for more details.
           14  *
           15  * You should have received a copy of the GNU Public License along with
           16  * this source code; if not, write to:
           17  * Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
           18  */
           19 
           20 
           21 #include "tomb.h"
           22 #include <QDir>
           23 #include <QStorageInfo>
           24 #include <QMessageBox>
           25 #include <QQuickView>
           26 
           27 #include <mntent.h>
           28 
           29 Tomb::Tomb(QWidget *parent)
           30     : QDialog(parent)
           31 {
           32     struct mntent *ent;
           33     FILE *aFile;
           34 
           35 
           36     if (QApplication::arguments().length() > 1) {
           37         this->info = QFileInfo(QApplication::arguments().takeAt(1));
           38         this->tombName = QString(info.baseName());
           39         this->tombPath = info.path();
           40     } else {
           41         QMessageBox::critical(this, tr("tomb-qt-tray"), tr("You need to specify a Tomb File.\nExiting"), QMessageBox::Ok);
           42         exit(EXIT_FAILURE);
           43     }
           44 
           45 
           46     // Build the menĂ¹
           47     this->icon = QIcon( QCoreApplication::applicationDirPath() + QDir::separator()+QString("pixmaps/tomb_icon.png"));
           48     this->trayIcon = new QSystemTrayIcon(this->icon);
           49     this->trayIconMenu = new QMenu();
           50 
           51     this->tombBuildMenu();
           52 
           53     this->trayIcon->setContextMenu(this->trayIconMenu);
           54 
           55     this->trayIcon->setToolTip(QString(info.baseName()));
           56     this->trayIcon->show();
           57     this->trayIcon->showMessage(tr("Tomb encrypted undertaker"),tr("We started digging out bones"), QSystemTrayIcon::Information);
           58     if (QT_VERSION >= 0x050400) {
           59         for (auto volume : QStorageInfo::mountedVolumes()) {
           60             if (QString(volume.device()).contains(this->tombName) == true) {
           61                 this->tombMountPoint = QString(volume.rootPath());
           62                 break;
           63             }
           64         }
           65     } else {
           66          aFile = setmntent("/proc/mounts", "r");
           67          if (aFile == NULL) {
           68            perror("setmntent");
           69            exit(1);
           70          }
           71          while (NULL != (ent = getmntent(aFile))) {
           72              if (QString( ent->mnt_fsname).contains(this->tombName) == true) {
           73                  this->tombMountPoint = QString(ent->mnt_dir);
           74                  break;
           75              }
           76          }
           77          endmntent(aFile);
           78     }
           79 }
           80 
           81 void Tomb::closeEvent(QCloseEvent *event) {
           82     event->accept();
           83 }
           84 
           85 void Tomb::tombBuildMenu() {
           86 
           87     // Create the menu items
           88 //    this->tombOpen = new QAction(tr("Open"), this);
           89     //this->trayIconMenu->addAction(tombOpen);
           90 
           91     this->menu_tombExplore = new QAction(tr("Explore"), this);
           92     this->trayIconMenu->addAction(menu_tombExplore);
           93 
           94     this->trayIconMenu->addSeparator();
           95 
           96     this->menu_tombClose = new QAction(tr("Close"), this);
           97     this->trayIconMenu->addAction(menu_tombClose);
           98 
           99     this->menu_tombSlam = new QAction(tr("Slam"), this);
          100     this->trayIconMenu->addAction(menu_tombSlam);
          101 
          102     connect(this->menu_tombExplore,  SIGNAL(triggered()), this, SLOT(tombExplore()));
          103     connect(this->menu_tombClose,  SIGNAL(triggered()), this, SLOT(tombClose()));
          104     connect(this->menu_tombSlam,  SIGNAL(triggered()), this, SLOT(tombSlam()));
          105 
          106 }
          107 
          108 void Tomb::tombExplore() {
          109 
          110     QDesktopServices::openUrl(QUrl(QUrl::fromLocalFile(this->tombMountPoint)));
          111 
          112 }
          113 
          114 void Tomb::tombClose() {
          115 
          116     QProcess *tomb;
          117     tomb = new QProcess(this);
          118     tomb->start("pkexec", QStringList() << "tomb" << "close");
          119     connect(tomb, SIGNAL(finished(int , QProcess::ExitStatus )), this, SLOT(tombCheckCmdRet(int , QProcess::ExitStatus )));
          120     connect(tomb, SIGNAL(error(QProcess::ProcessError)), this, SLOT(tombStartError(QProcess::ProcessError)));
          121     tomb->waitForFinished(30000);
          122 
          123 }
          124 
          125 void Tomb::tombSlam() {
          126 
          127     QProcess *tomb;
          128     tomb = new QProcess(this);
          129     tomb->start("pkexec", QStringList() << "tomb" << "slam");
          130     connect(tomb, SIGNAL(finished(int , QProcess::ExitStatus )), this, SLOT(tombCheckCmdRet(int , QProcess::ExitStatus )));
          131     connect(tomb, SIGNAL(error(QProcess::ProcessError)), this, SLOT(tombStartError(QProcess::ProcessError)));
          132     tomb->waitForFinished(30000);
          133 
          134 }
          135 
          136 void Tomb::tombCheckCmdRet(int exitCode, QProcess::ExitStatus exitStatus) {
          137 
          138     if (exitStatus == QProcess::CrashExit) {
          139         QMessageBox::critical(this, tr("tomb-qt-tray"), tr("polkit is not installed"),QMessageBox::Ok);
          140     } else {
          141         if (exitCode != QProcess::NormalExit) {
          142             QMessageBox::critical(this, tr("tomb-qt-tray"), tr("The program crashed\nTry to run 'tomb close' in a console"),QMessageBox::Ok);
          143         }
          144     }
          145 
          146 }
          147 
          148 void Tomb::tombStartError(QProcess::ProcessError err) {
          149 
          150     QString msg = QString();
          151 
          152     switch (err) {
          153         case QProcess::FailedToStart :
          154             msg = tr("The process failed to start. Either the invoked program is missing, or you may have insufficient permissions to invoke the program.");
          155         break;
          156         case QProcess::Crashed:
          157         case QProcess::Timedout:
          158         case QProcess::ReadError:
          159         case QProcess::WriteError:
          160         case QProcess::UnknownError:
          161             break;
          162     }
          163     QMessageBox::critical(this, tr("tomb-qt-tray"), msg, QMessageBox::Ok);
          164 
          165 }
          166 
          167 
          168 Tomb::~Tomb() {
          169 
          170 }
          171