diff --git a/bin/app/user/ApplicationSettings_template.xml b/bin/app/user/ApplicationSettings_template.xml
index 8f647fd0..4fa8f482 100644
--- a/bin/app/user/ApplicationSettings_template.xml
+++ b/bin/app/user/ApplicationSettings_template.xml
@@ -75,6 +75,8 @@
+
+
diff --git a/src/lib/settings/ApplicationSettings.cpp b/src/lib/settings/ApplicationSettings.cpp
index dc3160df..d01a195b 100644
--- a/src/lib/settings/ApplicationSettings.cpp
+++ b/src/lib/settings/ApplicationSettings.cpp
@@ -380,6 +380,16 @@ bool ApplicationSettings::setRecentProjects(const std::vector &recentP
return setPathValues("user/recent_projects/recent_project", recentProjects);
}
+int ApplicationSettings::getAcceptedEulaVersion() const
+{
+ return getValue("user/accepted_eula_version", 0);
+}
+
+void ApplicationSettings::setAcceptedEulaVersion(int version)
+{
+ setValue("user/accepted_eula_version", version);
+}
+
int ApplicationSettings::getPluginPort() const
{
return getValue("network/plugin_port", 6666);
diff --git a/src/lib/settings/ApplicationSettings.h b/src/lib/settings/ApplicationSettings.h
index 3453cd59..9b5ef7f3 100644
--- a/src/lib/settings/ApplicationSettings.h
+++ b/src/lib/settings/ApplicationSettings.h
@@ -110,6 +110,9 @@ public:
std::vector getRecentProjects() const;
bool setRecentProjects(const std::vector& recentProjects);
+ int getAcceptedEulaVersion() const;
+ void setAcceptedEulaVersion(int version);
+
// network
int getPluginPort() const;
void setPluginPort(const int pluginPort);
diff --git a/src/lib_gui/CMakeLists.txt b/src/lib_gui/CMakeLists.txt
index 2ed2bded..72a2c89f 100644
--- a/src/lib_gui/CMakeLists.txt
+++ b/src/lib_gui/CMakeLists.txt
@@ -191,6 +191,8 @@ add_files(
qt/window/QtBookmarkBrowser.h
qt/window/QtBookmarkCreator.cpp
qt/window/QtBookmarkCreator.h
+ qt/window/QtEulaWindow.cpp
+ qt/window/QtEulaWindow.h
qt/window/QtIndexingDialog.cpp
qt/window/QtIndexingDialog.h
qt/window/QtKeyboardShortcuts.cpp
diff --git a/src/lib_gui/qt/window/QtAboutLicense.cpp b/src/lib_gui/qt/window/QtAboutLicense.cpp
index 6a460225..37b2f2f7 100644
--- a/src/lib_gui/qt/window/QtAboutLicense.cpp
+++ b/src/lib_gui/qt/window/QtAboutLicense.cpp
@@ -1,12 +1,7 @@
#include "qt/window/QtAboutLicense.h"
-#include
#include
-#include
#include
-#include
-#include
-#include
#include "licenses.h"
diff --git a/src/lib_gui/qt/window/QtEulaWindow.cpp b/src/lib_gui/qt/window/QtEulaWindow.cpp
new file mode 100644
index 00000000..87e3c40f
--- /dev/null
+++ b/src/lib_gui/qt/window/QtEulaWindow.cpp
@@ -0,0 +1,66 @@
+#include "qt/window/QtEulaWindow.h"
+
+#include
+#include
+#include
+
+#include "utility/ResourcePaths.h"
+#include "utility/text/TextAccess.h"
+
+QtEulaWindow::QtEulaWindow(QWidget *parent, bool forceAccept)
+ : QtWindow(parent)
+ , m_forceAccept(forceAccept)
+{
+ raise();
+}
+
+QSize QtEulaWindow::sizeHint() const
+{
+ return QSize(700, 600);
+}
+
+void QtEulaWindow::populateWindow(QWidget* widget)
+{
+ QVBoxLayout* layout = new QVBoxLayout(widget);
+ layout->setContentsMargins(0, 0, 0, 0);
+
+ if (m_forceAccept)
+ {
+ layout->addSpacing(5);
+
+ QLabel* label = new QLabel("Please read and agree to our End User License Agreement:");
+ QFont _font = label->font();
+ _font.setBold(true);
+ label->setFont(_font);
+ layout->addWidget(label);
+ }
+
+ std::shared_ptr text =
+ TextAccess::createFromFile(FilePath(ResourcePaths::getGuiPath().str() + "installer/EULA.txt"));
+
+ QTextEdit* licenseText = new QTextEdit();
+ licenseText->setObjectName("textField");
+ licenseText->setReadOnly(true);
+ licenseText->setText(QString::fromStdString(text->getText()));
+ layout->addWidget(licenseText);
+
+ widget->setLayout(layout);
+}
+
+void QtEulaWindow::windowReady()
+{
+ updateTitle("End User License Agreement");
+
+ if (m_forceAccept)
+ {
+ updateCloseButton("Quit");
+ updateNextButton("Agree");
+ }
+ else
+ {
+ updateCloseButton("Close");
+ setNextVisible(false);
+ }
+
+ setPreviousVisible(false);
+}
diff --git a/src/lib_gui/qt/window/QtEulaWindow.h b/src/lib_gui/qt/window/QtEulaWindow.h
new file mode 100644
index 00000000..f021da5c
--- /dev/null
+++ b/src/lib_gui/qt/window/QtEulaWindow.h
@@ -0,0 +1,24 @@
+#ifndef QT_EULA_LICENSE_H
+#define QT_EULA_LICENSE_H
+
+#include "qt/window/QtWindow.h"
+
+class QtEulaWindow
+ : public QtWindow
+{
+public:
+ static const int EULA_VERSION = 1;
+
+ QtEulaWindow(QWidget* parent, bool forceAccept);
+ QSize sizeHint() const override;
+
+protected:
+ // QtWindow implementation
+ virtual void populateWindow(QWidget* widget) override;
+ virtual void windowReady() override;
+
+private:
+ bool m_forceAccept;
+};
+
+#endif // QT_EULA_LICENSE_H
diff --git a/src/lib_gui/qt/window/QtMainWindow.cpp b/src/lib_gui/qt/window/QtMainWindow.cpp
index c6e70a9f..3a8bb0ce 100644
--- a/src/lib_gui/qt/window/QtMainWindow.cpp
+++ b/src/lib_gui/qt/window/QtMainWindow.cpp
@@ -22,6 +22,7 @@
#include "qt/window/project_wizzard/QtProjectWizzard.h"
#include "qt/window/QtAbout.h"
#include "qt/window/QtAboutLicense.h"
+#include "qt/window/QtEulaWindow.h"
#include "qt/window/QtKeyboardShortcuts.h"
#include "qt/window/QtLicense.h"
#include "qt/window/QtPreferencesWindow.h"
@@ -333,6 +334,31 @@ void QtMainWindow::showBugtracker()
QDesktopServices::openUrl(QUrl("https://github.com/CoatiSoftware/SourcetrailBugTracker/issues"));
}
+void QtMainWindow::showEula(bool forceAccept)
+{
+ QtEulaWindow* eulaWindow = new QtEulaWindow(this, forceAccept);
+ m_windowStack.pushWindow(eulaWindow);
+ eulaWindow->setup();
+
+ if (forceAccept)
+ {
+ setEnabled(false);
+ eulaWindow->setEnabled(true);
+
+ connect(eulaWindow, SIGNAL(finished()), this, SLOT(acceptedEula()));
+ connect(eulaWindow, SIGNAL(canceled()), dynamic_cast(QCoreApplication::instance()), SLOT(quit()));
+ }
+}
+
+void QtMainWindow::acceptedEula()
+{
+ ApplicationSettings::getInstance()->setAcceptedEulaVersion(QtEulaWindow::EULA_VERSION);
+ ApplicationSettings::getInstance()->save();
+
+ setEnabled(true);
+ m_windowStack.popWindow();
+}
+
void QtMainWindow::showLicenses()
{
QtAboutLicense* licenseWindow = createWindow();
@@ -404,11 +430,16 @@ void QtMainWindow::showStartScreen()
connect(startScreen, SIGNAL(openNewProjectDialog()), this, SLOT(newProject()));
connect(startScreen, SIGNAL(openEnterLicenseDialog()), this, SLOT(enterLicense()));
-
if (state != LicenseChecker::LICENSE_VALID && state != LicenseChecker::LICENSE_EMPTY)
{
forceEnterLicense(state == LicenseChecker::LICENSE_EXPIRED);
}
+
+ if (QSysInfo::macVersion() != QSysInfo::MV_None &&
+ ApplicationSettings::getInstance()->getAcceptedEulaVersion() < QtEulaWindow::EULA_VERSION)
+ {
+ showEula(true);
+ }
}
void QtMainWindow::hideStartScreen()
@@ -761,6 +792,7 @@ void QtMainWindow::setupHelpMenu()
menu->addSeparator();
+ menu->addAction(tr("End User License Agreement"), this, SLOT(showEula()));
menu->addAction(tr("3rd Party Licences"), this, SLOT(showLicenses()));
menu->addAction(tr("&About Sourcetrail"), this, SLOT(about()));
diff --git a/src/lib_gui/qt/window/QtMainWindow.h b/src/lib_gui/qt/window/QtMainWindow.h
index 442138e8..e58e9883 100644
--- a/src/lib_gui/qt/window/QtMainWindow.h
+++ b/src/lib_gui/qt/window/QtMainWindow.h
@@ -83,6 +83,8 @@ public slots:
void showBugtracker();
void showDocumentation();
void showKeyboardShortcuts();
+ void showEula(bool forceAccept = false);
+ void acceptedEula();
void showLicenses();
void enterLicense();
void enteredLicense();
diff --git a/src/lib_license/License.cpp b/src/lib_license/License.cpp
index 7a0ecec3..dda9634e 100644
--- a/src/lib_license/License.cpp
+++ b/src/lib_license/License.cpp
@@ -533,9 +533,9 @@ std::string License::hashLocation(const std::string& location)
bool License::checkLocation(const std::string& location, const std::string& hash)
{
- if (location.size() <= 0 || hash.size() <= 0)
+ if (!location.size() || !hash.size())
{
- return "";
+ return false;
}
return Botan::check_passhash9(location, hash);