aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorluigi1111 <luigi1111w@gmail.com>2019-07-16 11:35:16 -0500
committerluigi1111 <luigi1111w@gmail.com>2019-07-16 11:35:16 -0500
commitbeb94783c6536e58f4dd9505cd5c7430d8ca278c (patch)
treee59e9bf4eaff9296b9c10a9d9a7207b565a2ae1c /src
parentcfec9dde968cb89f8fe5293958b82181348111ea (diff)
parent0b6132897101c4cd1618c79049d5685c5e9874fa (diff)
downloadmonzero-gui-beb94783c6536e58f4dd9505cd5c7430d8ca278c.tar.gz
monzero-gui-beb94783c6536e58f4dd9505cd5c7430d8ca278c.tar.xz
monzero-gui-beb94783c6536e58f4dd9505cd5c7430d8ca278c.zip
Merge pull request #2258
0b61328 Detect tails, support data persistence (xmrdsc)
Diffstat (limited to 'src')
-rw-r--r--src/qt/TailsOS.cpp100
-rw-r--r--src/qt/TailsOS.h23
-rw-r--r--src/qt/mime.cpp70
-rw-r--r--src/qt/mime.h36
-rw-r--r--src/qt/utils.cpp73
-rw-r--r--src/qt/utils.h5
6 files changed, 198 insertions, 109 deletions
diff --git a/src/qt/TailsOS.cpp b/src/qt/TailsOS.cpp
new file mode 100644
index 00000000..df2fa92b
--- /dev/null
+++ b/src/qt/TailsOS.cpp
@@ -0,0 +1,100 @@
+#include <QRegExp>
+#include <QMessageBox>
+#include <QPixmap>
+#include <QTranslator>
+
+#include "TailsOS.h"
+#include "utils.h"
+
+bool TailsOS::usePersistence = false;
+QString TailsOS::tailsPathData = QString("/live/persistence/TailsData_unlocked/");
+
+bool TailsOS::detect()
+{
+ if (!fileExists("/etc/os-release"))
+ return false;
+
+ QByteArray data = fileOpen("/etc/os-release");
+ QRegularExpression re("TAILS_PRODUCT_NAME=\"Tails\"");
+ QRegularExpressionMatch os_match = re.match(data);
+ bool matched = os_match.hasMatch();
+
+#ifdef QT_DEBUG
+ if (matched)
+ qDebug() << "Tails OS detected";
+#endif
+
+ return matched;
+}
+
+bool TailsOS::detectDataPersistence()
+{
+ return QDir(QDir::homePath() + "/Persistent").exists();
+}
+
+bool TailsOS::detectDotPersistence()
+{
+ return QDir(tailsPathData + "dotfiles").exists();
+}
+
+void TailsOS::showDataPersistenceDisabledWarning()
+{
+ QMessageBox msgBox;
+ msgBox.setText(QObject::tr("Warning: persistence disabled"));
+ msgBox.setWindowTitle(QObject::tr("Warning: persistence disabled"));
+ msgBox.setInformativeText(
+ QObject::tr("Monero GUI has detected that Tails persistence is "
+ "currently disabled. Any configurations you make inside "
+ "the Monero GUI will not be saved."
+ "\n\n"
+ "In addition, make sure to not save your wallet on the "
+ "filesystem, as it will be lost at shutdown."
+ "\n\n"
+ "To enable Tails persistence, setup an encrypted volume "
+ "and restart Tails. To gain a startup menu item, "
+ "enable the Tails \"dotfiles\" feature."));
+
+ msgBox.setStandardButtons(QMessageBox::Ok);
+ msgBox.setDefaultButton(QMessageBox::Ok);
+ msgBox.setIconPixmap(QPixmap(":/images/tails-grey.png"));
+ msgBox.exec();
+}
+
+void TailsOS::askPersistence()
+{
+ QMessageBox msgBox;
+ msgBox.setWindowTitle(QObject::tr("Monero GUI"));
+ msgBox.setText(QObject::tr("Use Tails persistence?"));
+ msgBox.setInformativeText(
+ QObject::tr("Persist wallet files and configuration on the encrypted volume?"
+ "\n\n"
+ "In addition, you can enable Tails dotfiles persistence "
+ "to gain a start menu entry.\n"));
+
+ msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
+ msgBox.setDefaultButton(QMessageBox::Yes);
+ msgBox.setIconPixmap(QPixmap(":/images/tails-grey.png"));
+ TailsOS::usePersistence = (msgBox.exec() == QMessageBox::Yes);
+}
+
+void TailsOS::persistXdgMime(QString filePath, QString data)
+{
+ QFileInfo file(filePath);
+ QString tailsPath = tailsPathData + "dotfiles/.local/share/applications/";
+
+ // write to persistent volume
+#ifdef QT_DEBUG
+ qDebug() << "Writing xdg mime: " << tailsPath + file.fileName();
+#endif
+
+ QDir().mkpath(tailsPath); // ensure directory exists
+ fileWrite(tailsPath + file.fileName(), data);
+
+ // write to current session
+#ifdef QT_DEBUG
+ qDebug() << "Writing xdg mime: " << file.filePath();
+#endif
+
+ QDir().mkpath(file.path()); // ensure directory exists
+ fileWrite(file.filePath(), data);
+}
diff --git a/src/qt/TailsOS.h b/src/qt/TailsOS.h
new file mode 100644
index 00000000..05d5ebd1
--- /dev/null
+++ b/src/qt/TailsOS.h
@@ -0,0 +1,23 @@
+#ifndef TAILSOS_H
+#define TAILSOS_H
+
+#include <QApplication>
+
+
+class TailsOS
+{
+public:
+ TailsOS();
+ static bool detect();
+ static bool detectDataPersistence();
+ static bool detectDotPersistence();
+
+ static void showDataPersistenceDisabledWarning();
+ static void askPersistence();
+ static void persistXdgMime(QString filePath, QString data);
+
+ static bool usePersistence;
+ static QString tailsPathData;
+};
+
+#endif // TAILSOS_H
diff --git a/src/qt/mime.cpp b/src/qt/mime.cpp
deleted file mode 100644
index 6daf4de6..00000000
--- a/src/qt/mime.cpp
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright (c) 2014-2019, The Monero Project
-//
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without modification, are
-// permitted provided that the following conditions are met:
-//
-// 1. Redistributions of source code must retain the above copyright notice, this list of
-// conditions and the following disclaimer.
-//
-// 2. Redistributions in binary form must reproduce the above copyright notice, this list
-// of conditions and the following disclaimer in the documentation and/or other
-// materials provided with the distribution.
-//
-// 3. Neither the name of the copyright holder nor the names of its contributors may be
-// used to endorse or promote products derived from this software without specific
-// prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
-// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
-// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
-// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
-// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#include <QtCore>
-#include <QApplication>
-#include <QFile>
-#include <QTextStream>
-
-#include "mime.h"
-#include "utils.h"
-
-void registerXdgMime(QApplication &app){
- // MacOS handled via Info.plist
- // Windows handled in the installer by rbrunner7
-
- QString xdg = QString(
- "[Desktop Entry]\n"
- "Name=Monero GUI\n"
- "GenericName=Monero-GUI\n"
- "X-GNOME-FullName=Monero-GUI\n"
- "Comment=Monero GUI\n"
- "Keywords=Monero;\n"
- "Exec=%1 %u\n"
- "Terminal=false\n"
- "Type=Application\n"
- "Icon=monero\n"
- "Categories=Network;GNOME;Qt;\n"
- "MimeType=x-scheme-handler/monero;x-scheme-handler/moneroseed\n"
- "StartupNotify=true\n"
- "X-GNOME-Bugzilla-Bugzilla=GNOME\n"
- "X-GNOME-UsesNotifications=true\n"
- ).arg(app.applicationFilePath());
-
- QString appPath = QStandardPaths::writableLocation(QStandardPaths::ApplicationsLocation);
- QString filePath = QString("%1/monero-gui.desktop").arg(appPath);
-
- qDebug() << QString("Writing %1").arg(filePath);
- QFile file(filePath);
- if(file.open(QIODevice::WriteOnly)){
- QTextStream out(&file); out << xdg << endl;
- file.close();
- }
- else
- file.close();
-}
diff --git a/src/qt/mime.h b/src/qt/mime.h
deleted file mode 100644
index b79d43a3..00000000
--- a/src/qt/mime.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (c) 2014-2019, The Monero Project
-//
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without modification, are
-// permitted provided that the following conditions are met:
-//
-// 1. Redistributions of source code must retain the above copyright notice, this list of
-// conditions and the following disclaimer.
-//
-// 2. Redistributions in binary form must reproduce the above copyright notice, this list
-// of conditions and the following disclaimer in the documentation and/or other
-// materials provided with the distribution.
-//
-// 3. Neither the name of the copyright holder nor the names of its contributors may be
-// used to endorse or promote products derived from this software without specific
-// prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
-// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
-// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
-// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
-// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#ifndef MIME_H
-#define MIME_H
-
-#include <QApplication>
-
-void registerXdgMime(QApplication &app);
-
-#endif // MIME_H
diff --git a/src/qt/utils.cpp b/src/qt/utils.cpp
index 2407a50e..4418a050 100644
--- a/src/qt/utils.cpp
+++ b/src/qt/utils.cpp
@@ -27,15 +27,35 @@
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <QtCore>
+#include <QApplication>
+#include "src/qt/TailsOS.h"
#include "utils.h"
bool fileExists(QString path) {
QFileInfo check_file(path);
- if (check_file.exists() && check_file.isFile())
+ return check_file.exists() && check_file.isFile();
+}
+
+QByteArray fileOpen(QString path) {
+ QFile file(path);
+ if(!file.open(QFile::ReadOnly | QFile::Text))
+ return QByteArray();
+
+ QByteArray data = file.readAll();
+ file.close();
+ return data;
+}
+
+bool fileWrite(QString path, QString data) {
+ QFile file(path);
+ if(file.open(QIODevice::WriteOnly)){
+ QTextStream out(&file); out << data << endl;
+ file.close();
return true;
- else
- return false;
+ }
+
+ return false;
}
QString getAccountName(){
@@ -47,6 +67,53 @@ QString getAccountName(){
return accountName;
}
+QString xdgMime(QApplication &app){
+ return QString(
+ "[Desktop Entry]\n"
+ "Name=Monero GUI\n"
+ "GenericName=Monero-GUI\n"
+ "X-GNOME-FullName=Monero-GUI\n"
+ "Comment=Monero GUI\n"
+ "Keywords=Monero;\n"
+ "Exec=%1 %u\n"
+ "Terminal=false\n"
+ "Type=Application\n"
+ "Icon=monero\n"
+ "Categories=Network;GNOME;Qt;\n"
+ "MimeType=x-scheme-handler/monero;x-scheme-handler/moneroseed\n"
+ "StartupNotify=true\n"
+ "X-GNOME-Bugzilla-Bugzilla=GNOME\n"
+ "X-GNOME-UsesNotifications=true\n"
+ ).arg(app.applicationFilePath());
+}
+
+void registerXdgMime(QApplication &app){
+#ifdef Q_OS_LINUX
+ // Register desktop entry
+ // - MacOS handled via Info.plist
+ // - Windows handled in the installer by rbrunner7
+ // - Linux written to `QStandardPaths::ApplicationsLocation`
+ // - Tails written to persistent dotfiles
+ QString mime = xdgMime(app);
+ QString appPath = QStandardPaths::writableLocation(QStandardPaths::ApplicationsLocation);
+ QString filePath = QString("%1/monero-gui.desktop").arg(appPath);
+
+ if (TailsOS::detect() && TailsOS::detectDotPersistence() && TailsOS::usePersistence) {
+ TailsOS::persistXdgMime(filePath, mime);
+ return;
+ }
+
+ QFileInfo file(filePath);
+ QDir().mkpath(file.path()); // ensure directory exists
+
+#ifdef QT_DEBUG
+ qDebug() << "Writing xdg mime: " << filePath;
+#endif
+
+ fileWrite(filePath, mime);
+#endif
+}
+
QString randomUserAgent(){
QStringList urand;
urand << "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1"
diff --git a/src/qt/utils.h b/src/qt/utils.h
index c18ffdc1..f48dff97 100644
--- a/src/qt/utils.h
+++ b/src/qt/utils.h
@@ -31,9 +31,14 @@
#include <QtCore>
#include <QRegExp>
+#include <QApplication>
bool fileExists(QString path);
+QByteArray fileOpen(QString path);
+bool fileWrite(QString path, QString data);
QString getAccountName();
+QString xdgMime(QApplication &app);
+void registerXdgMime(QApplication &app);
const static QRegExp reURI = QRegExp("^\\w+:\\/\\/([\\w+\\-?\\-_\\-=\\-&]+)");
QString randomUserAgent();