diff --git a/ZeroTierUI/ZeroTierUI.pro b/ZeroTierUI/ZeroTierUI.pro index dd31f27f..c43876ee 100644 --- a/ZeroTierUI/ZeroTierUI.pro +++ b/ZeroTierUI/ZeroTierUI.pro @@ -3,105 +3,107 @@ TARGET = "ZeroTier One" TEMPLATE = app win32:RC_FILE = ZeroTierUI.rc +win32:LIBS += winhttp.lib Iphlpapi.lib ws2_32.lib advapi32.lib Shell32.lib Rpcrt4.lib +win32:QMAKE_LFLAGS += /MANIFESTUAC:\"level=\'requireAdministrator\' uiAccess=\'false\'\" mac:ICON = zt1icon.icns mac:QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.6 mac:QMAKE_INFO_PLIST = Info.plist mac:LIBS += -framework Cocoa -SOURCES += main.cpp\ - mainwindow.cpp \ - aboutwindow.cpp \ - ../node/C25519.cpp \ - ../node/CertificateOfMembership.cpp \ - ../node/Defaults.cpp \ - ../node/Demarc.cpp \ - ../node/EthernetTap.cpp \ - ../node/HttpClient.cpp \ - ../node/Identity.cpp \ - ../node/InetAddress.cpp \ - ../node/Logger.cpp \ - ../node/Multicaster.cpp \ - ../node/Network.cpp \ - ../node/NetworkConfig.cpp \ - ../node/Node.cpp \ - ../node/NodeConfig.cpp \ - ../node/Packet.cpp \ - ../node/PacketDecoder.cpp \ - ../node/Peer.cpp \ - ../node/Poly1305.cpp \ - ../node/Salsa20.cpp \ - ../node/Service.cpp \ - ../node/SHA512.cpp \ - ../node/SoftwareUpdater.cpp \ - ../node/Switch.cpp \ - ../node/SysEnv.cpp \ - ../node/Topology.cpp \ - ../node/UdpSocket.cpp \ - ../node/Utils.cpp \ - ../ext/lz4/lz4.c \ - ../ext/lz4/lz4hc.c \ - networkwidget.cpp \ - installdialog.cpp \ +SOURCES += main.cpp \ + mainwindow.cpp \ + aboutwindow.cpp \ + ../node/C25519.cpp \ + ../node/CertificateOfMembership.cpp \ + ../node/Defaults.cpp \ + ../node/Demarc.cpp \ + ../node/EthernetTap.cpp \ + ../node/HttpClient.cpp \ + ../node/Identity.cpp \ + ../node/InetAddress.cpp \ + ../node/Logger.cpp \ + ../node/Multicaster.cpp \ + ../node/Network.cpp \ + ../node/NetworkConfig.cpp \ + ../node/Node.cpp \ + ../node/NodeConfig.cpp \ + ../node/Packet.cpp \ + ../node/PacketDecoder.cpp \ + ../node/Peer.cpp \ + ../node/Poly1305.cpp \ + ../node/Salsa20.cpp \ + ../node/Service.cpp \ + ../node/SHA512.cpp \ + ../node/SoftwareUpdater.cpp \ + ../node/Switch.cpp \ + ../node/SysEnv.cpp \ + ../node/Topology.cpp \ + ../node/UdpSocket.cpp \ + ../node/Utils.cpp \ + ../ext/lz4/lz4.c \ + ../ext/lz4/lz4hc.c \ + networkwidget.cpp \ + installdialog.cpp \ licensedialog.cpp HEADERS += mainwindow.h \ - aboutwindow.h \ - ../node/Node.hpp \ - ../node/Utils.hpp \ - ../node/Defaults.hpp \ - ../node/Address.hpp \ - ../node/Array.hpp \ - ../node/AtomicCounter.hpp \ - ../node/BandwidthAccount.hpp \ - ../node/Buffer.hpp \ - ../node/C25519.hpp \ - ../node/CertificateOfMembership.hpp \ - ../node/CMWC4096.hpp \ - ../node/Condition.hpp \ - ../node/Constants.hpp \ - ../node/Demarc.hpp \ - ../node/Dictionary.hpp \ - ../node/EthernetTap.hpp \ - ../node/HttpClient.hpp \ - ../node/Identity.hpp \ - ../node/InetAddress.hpp \ - ../node/Logger.hpp \ - ../node/MAC.hpp \ - ../node/Multicaster.hpp \ - ../node/MulticastGroup.hpp \ - ../node/Mutex.hpp \ - ../node/Network.hpp \ - ../node/NetworkConfig.hpp \ - ../node/NodeConfig.hpp \ - ../node/NonCopyable.hpp \ - ../node/Packet.hpp \ - ../node/PacketDecoder.hpp \ - ../node/Peer.hpp \ - ../node/Poly1305.hpp \ - ../node/RuntimeEnvironment.hpp \ - ../node/Salsa20.hpp \ - ../node/Service.hpp \ - ../node/SHA512.hpp \ - ../node/SharedPtr.hpp \ - ../node/SoftwareUpdater.hpp \ - ../node/Switch.hpp \ - ../node/SysEnv.hpp \ - ../node/Thread.hpp \ - ../node/Topology.hpp \ - ../node/UdpSocket.hpp \ - ../ext/lz4/lz4.h \ - ../ext/lz4/lz4hc.h \ - networkwidget.h \ - installdialog.h \ - mac_doprivileged.h \ + aboutwindow.h \ + ../node/Node.hpp \ + ../node/Utils.hpp \ + ../node/Defaults.hpp \ + ../node/Address.hpp \ + ../node/Array.hpp \ + ../node/AtomicCounter.hpp \ + ../node/BandwidthAccount.hpp \ + ../node/Buffer.hpp \ + ../node/C25519.hpp \ + ../node/CertificateOfMembership.hpp \ + ../node/CMWC4096.hpp \ + ../node/Condition.hpp \ + ../node/Constants.hpp \ + ../node/Demarc.hpp \ + ../node/Dictionary.hpp \ + ../node/EthernetTap.hpp \ + ../node/HttpClient.hpp \ + ../node/Identity.hpp \ + ../node/InetAddress.hpp \ + ../node/Logger.hpp \ + ../node/MAC.hpp \ + ../node/Multicaster.hpp \ + ../node/MulticastGroup.hpp \ + ../node/Mutex.hpp \ + ../node/Network.hpp \ + ../node/NetworkConfig.hpp \ + ../node/NodeConfig.hpp \ + ../node/NonCopyable.hpp \ + ../node/Packet.hpp \ + ../node/PacketDecoder.hpp \ + ../node/Peer.hpp \ + ../node/Poly1305.hpp \ + ../node/RuntimeEnvironment.hpp \ + ../node/Salsa20.hpp \ + ../node/Service.hpp \ + ../node/SHA512.hpp \ + ../node/SharedPtr.hpp \ + ../node/SoftwareUpdater.hpp \ + ../node/Switch.hpp \ + ../node/SysEnv.hpp \ + ../node/Thread.hpp \ + ../node/Topology.hpp \ + ../node/UdpSocket.hpp \ + ../ext/lz4/lz4.h \ + ../ext/lz4/lz4hc.h \ + networkwidget.h \ + installdialog.h \ + mac_doprivileged.h \ licensedialog.h \ main.h FORMS += mainwindow.ui \ - aboutwindow.ui \ - networkwidget.ui \ - installdialog.ui \ + aboutwindow.ui \ + networkwidget.ui \ + installdialog.ui \ licensedialog.ui RESOURCES += \ diff --git a/ZeroTierUI/aboutwindow.ui b/ZeroTierUI/aboutwindow.ui index e32dfca3..568082af 100644 --- a/ZeroTierUI/aboutwindow.ui +++ b/ZeroTierUI/aboutwindow.ui @@ -134,7 +134,7 @@ QFrame::StyledPanel - QFrame::Raised + QFrame::Sunken diff --git a/ZeroTierUI/main.cpp b/ZeroTierUI/main.cpp index 3255ec9f..5814849c 100644 --- a/ZeroTierUI/main.cpp +++ b/ZeroTierUI/main.cpp @@ -59,6 +59,8 @@ int main(int argc, char *argv[]) #ifdef __APPLE__ { + // Put QSettings here because this is one of the writable directories allowed + // in Apple's app store sandbox specs. We might end up in app store someday. QString zt1AppSupport(QDir::homePath() + "/Library/Application Support/ZeroTier/One"); QDir::root().mkpath(zt1AppSupport); settings = new QSettings(zt1AppSupport + "/ui.ini",QSettings::IniFormat); diff --git a/ZeroTierUI/mainwindow.cpp b/ZeroTierUI/mainwindow.cpp index 07df1964..3e4e96a0 100644 --- a/ZeroTierUI/mainwindow.cpp +++ b/ZeroTierUI/mainwindow.cpp @@ -99,13 +99,19 @@ MainWindow::MainWindow(QWidget *parent) : ui->setupUi(this); if (ui->networkListWidget->verticalScrollBar()) ui->networkListWidget->verticalScrollBar()->setSingleStep(8); + +#ifdef __APPLE__ QWidgetList widgets = this->findChildren(); foreach(QWidget *widget, widgets) widget->setAttribute(Qt::WA_MacShowFocusRect,false); - ui->noNetworksLabel->setText("Connecting to Service..."); // changed when result is received +#endif + + ui->noNetworksLabel->setVisible(true); + ui->noNetworksLabel->setText("Connecting to Service..."); + ui->bottomContainerWidget->setVisible(false); + ui->networkListWidget->setVisible(false); this->pollServiceTimerId = this->startTimer(1000); - this->setEnabled(false); // gets enabled when updates are received this->cyclesSinceResponseFromService = 0; } @@ -173,19 +179,25 @@ void MainWindow::timerEvent(QTimerEvent *event) #endif if (!ZeroTier::Utils::readFile(ZeroTier::Node::LocalClient::authTokenDefaultUserPath().c_str(),authToken)) { - QMessageBox::critical(this,"Cannot Authorize","Unable to authorize this user to administrate ZeroTier One. (Did you enter your password correctly?)",QMessageBox::Ok,QMessageBox::NoButton); - QApplication::exit(1); - return; + if (!ZeroTier::Utils::readFile(ZeroTier::Node::LocalClient::authTokenDefaultSystemPath().c_str(),authToken)) { + QMessageBox::critical(this,"Cannot Authorize","Unable to authorize this user to administrate ZeroTier One. (Did you enter your password correctly?)",QMessageBox::Ok,QMessageBox::NoButton); + QApplication::exit(1); + return; + } } } zeroTierClient = new ZeroTier::Node::LocalClient(authToken.c_str(),0,&handleZTMessage,this); } - // TODO: do something more user-friendly here... or maybe try to restart - // the service? - if (++this->cyclesSinceResponseFromService == 4) - QMessageBox::critical(this,"No Response from Service","The ZeroTier One service does not appear to be running.",QMessageBox::Ok,QMessageBox::NoButton); + if (++this->cyclesSinceResponseFromService >= 4) { + if (this->cyclesSinceResponseFromService == 4) + QMessageBox::warning(this,"Service Not Running","Can't Connect to the ZeroTier One service. Is it running?",QMessageBox::Ok); + ui->noNetworksLabel->setVisible(true); + ui->noNetworksLabel->setText("Connecting to Service..."); + ui->bottomContainerWidget->setVisible(false); + ui->networkListWidget->setVisible(false); + } zeroTierClient->send("info"); zeroTierClient->send("listnetworks"); @@ -281,6 +293,11 @@ void MainWindow::customEvent(QEvent *event) ui->noNetworksLabel->setVisible(true); } else ui->noNetworksLabel->setVisible(false); + if (!ui->bottomContainerWidget->isVisible()) + ui->bottomContainerWidget->setVisible(true); + if (!ui->networkListWidget->isVisible()) + ui->networkListWidget->setVisible(true); + if (this->myAddress.size()) ui->addressButton->setText(this->myAddress); else ui->addressButton->setText(" "); @@ -292,14 +309,6 @@ void MainWindow::customEvent(QEvent *event) st += QString::number(this->numPeers); st += " direct links to peers"; ui->statusLabel->setText(st); - - if (this->myStatus == "ONLINE") { - if (!this->isEnabled()) - this->setEnabled(true); - } else { - if (this->isEnabled()) - this->setEnabled(false); - } } void MainWindow::on_joinNetworkButton_clicked() diff --git a/ZeroTierUI/mainwindow.ui b/ZeroTierUI/mainwindow.ui index ad71f034..0f686b28 100644 --- a/ZeroTierUI/mainwindow.ui +++ b/ZeroTierUI/mainwindow.ui @@ -36,43 +36,6 @@ - - - - - - - 0 - 0 - 0 - - - - - - - - - 0 - 0 - 0 - - - - - - - - - 127 - 127 - 127 - - - - - - 16 @@ -267,7 +230,7 @@ 0 0 668 - 22 + 18 diff --git a/ZeroTierUI/stylesheet.css b/ZeroTierUI/stylesheet.css index 706da1fa..3a5795c5 100644 --- a/ZeroTierUI/stylesheet.css +++ b/ZeroTierUI/stylesheet.css @@ -80,6 +80,11 @@ QLabel.networkName { padding: 0; } +#noNetworksLabel { + background: transparent; + color: #ffffff; +} + #networkListWidget { background: palette(dark); margin: 0 0 2px 0;