diff options
Diffstat (limited to 'ZeroTierUI')
-rw-r--r-- | ZeroTierUI/ZeroTierUI.pro | 23 | ||||
-rw-r--r-- | ZeroTierUI/mainwindow.cpp | 40 | ||||
-rw-r--r-- | ZeroTierUI/mainwindow.h | 6 |
3 files changed, 57 insertions, 12 deletions
diff --git a/ZeroTierUI/ZeroTierUI.pro b/ZeroTierUI/ZeroTierUI.pro index 7c907c06..0b330d23 100644 --- a/ZeroTierUI/ZeroTierUI.pro +++ b/ZeroTierUI/ZeroTierUI.pro @@ -11,20 +11,25 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = ZeroTierUI TEMPLATE = app +# ZeroTier One must be built before building this, since it links in the +# client code and some stuff from Utils to talk to the running service. +LIBS += ../node/*.o SOURCES += main.cpp\ - mainwindow.cpp \ - network.cpp \ - aboutwindow.cpp + mainwindow.cpp \ + network.cpp \ + aboutwindow.cpp HEADERS += mainwindow.h \ - network.h \ - aboutwindow.h \ - ../node/Node.hpp + network.h \ + aboutwindow.h \ + ../node/Node.hpp \ + ../node/Utils.hpp \ + ../node/Defaults.hpp FORMS += mainwindow.ui \ - network.ui \ - aboutwindow.ui + network.ui \ + aboutwindow.ui RESOURCES += \ - resources.qrc + resources.qrc diff --git a/ZeroTierUI/mainwindow.cpp b/ZeroTierUI/mainwindow.cpp index d96ab207..5131b95f 100644 --- a/ZeroTierUI/mainwindow.cpp +++ b/ZeroTierUI/mainwindow.cpp @@ -5,9 +5,15 @@ #include <string> #include <map> #include <vector> +#include <stdexcept> #include <QClipboard> #include <QMutex> +#include <QCoreApplication> +#include <QDir> +#include <QFile> +#include <QMessageBox> +#include <QDebug> static std::map< unsigned long,std::vector<std::string> > ztReplies; static QMutex ztReplies_m; @@ -17,7 +23,7 @@ static void handleZTMessage(void *arg,unsigned long id,const char *line) if (*line) { ztReplies[id].push_back(std::string(line)); ztReplies_m.unlock(); - } else { + } else { // empty lines conclude transmissions std::vector<std::string> resp(ztReplies[id]); ztReplies.erase(id); ztReplies_m.unlock(); @@ -25,13 +31,15 @@ static void handleZTMessage(void *arg,unsigned long id,const char *line) } // Globally visible -ZeroTier::Node::LocalClient *zeroTierClient = (ZeroTier::Node::LocalClient *)0; +ZeroTier::Node::LocalClient *volatile zeroTierClient = (ZeroTier::Node::LocalClient *)0; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); + this->startTimer(500); + this->setEnabled(false); // first timer actually enables controls } MainWindow::~MainWindow() @@ -39,6 +47,34 @@ MainWindow::~MainWindow() delete ui; } +void MainWindow::timerEvent(QTimerEvent *event) +{ + QMainWindow::timerEvent(event); + + if (!this->isEnabled()) + this->setEnabled(true); + + if (!zeroTierClient) { + std::string dotAuthFile((QDir::homePath() + QDir::separator() + ".zeroTierOneAuthToken").toStdString()); + std::string authToken; + if (!ZeroTier::Utils::readFile(dotAuthFile.c_str(),authToken)) { +#ifdef __APPLE__ + QString authHelperPath(QCoreApplication::applicationDirPath() + "/../Applications/ZeroTier One (Authenticate).app"); + if (!QFile::exists(authHelperPath)) { + // Allow this to also work from the source tree if it's run from there. + // This is for debugging purposes but shouldn't harm the live release + // in any way. + //authHelperPath = QCoreApplication::applicationFilePath() + "/../ZeroTierUI/helpers/mac/ZeroTier One (Authenticate).app"; + if (!QFile::exists(authHelperPath)) { + QMessageBox::critical(this,"Unable to Locate Helper","Unable to locate authorization helper, cannot obtain authentication token.",QMessageBox::Ok,QMessageBox::NoButton); + QApplication::exit(1); + } + } +#endif + } + } +} + void MainWindow::on_joinNetworkButton_clicked() { } diff --git a/ZeroTierUI/mainwindow.h b/ZeroTierUI/mainwindow.h index f41e527b..c072a566 100644 --- a/ZeroTierUI/mainwindow.h +++ b/ZeroTierUI/mainwindow.h @@ -4,6 +4,7 @@ #include <QMainWindow> #include "../node/Node.hpp" +#include "../node/Utils.hpp" namespace Ui { class MainWindow; @@ -11,7 +12,7 @@ class MainWindow; // Globally visible instance of local client for communicating with ZT1 // Can be null if not connected, or will point to current -extern ZeroTier::Node::LocalClient *zeroTierClient; +extern ZeroTier::Node::LocalClient *volatile zeroTierClient; class MainWindow : public QMainWindow { @@ -21,6 +22,9 @@ public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); +protected: + virtual void timerEvent(QTimerEvent *event); + private slots: void on_joinNetworkButton_clicked(); void on_actionAbout_triggered(); |