2013-11-13 16:50:49 -05:00
# include "mainwindow.h"
2013-11-15 17:04:32 -05:00
# include "aboutwindow.h"
2013-11-13 16:50:49 -05:00
# include "ui_mainwindow.h"
2013-11-18 15:06:05 -05:00
# include <string>
# include <map>
# include <vector>
2013-11-19 15:05:14 -05:00
# include <stdexcept>
2013-11-18 15:06:05 -05:00
2013-11-15 17:04:32 -05:00
# include <QClipboard>
2013-11-18 15:06:05 -05:00
# include <QMutex>
2013-11-19 15:05:14 -05:00
# include <QCoreApplication>
# include <QDir>
# include <QFile>
# include <QMessageBox>
# include <QDebug>
2013-11-20 12:19:37 -05:00
# include <QProcess>
# include <QStringList>
2013-11-18 15:06:05 -05:00
static std : : map < unsigned long , std : : vector < std : : string > > ztReplies ;
static QMutex ztReplies_m ;
static void handleZTMessage ( void * arg , unsigned long id , const char * line )
{
ztReplies_m . lock ( ) ;
if ( * line ) {
ztReplies [ id ] . push_back ( std : : string ( line ) ) ;
ztReplies_m . unlock ( ) ;
2013-11-19 15:05:14 -05:00
} else { // empty lines conclude transmissions
2013-11-18 15:06:05 -05:00
std : : vector < std : : string > resp ( ztReplies [ id ] ) ;
ztReplies . erase ( id ) ;
ztReplies_m . unlock ( ) ;
}
}
// Globally visible
2013-11-19 15:05:14 -05:00
ZeroTier : : Node : : LocalClient * volatile zeroTierClient = ( ZeroTier : : Node : : LocalClient * ) 0 ;
2013-11-15 17:04:32 -05:00
2013-11-13 16:50:49 -05:00
MainWindow : : MainWindow ( QWidget * parent ) :
QMainWindow ( parent ) ,
ui ( new Ui : : MainWindow )
{
ui - > setupUi ( this ) ;
2013-11-20 12:19:37 -05:00
this - > startTimer ( 1000 ) ;
this - > setEnabled ( false ) ; // gets enabled when updates are received
2013-11-13 16:50:49 -05:00
}
MainWindow : : ~ MainWindow ( )
{
delete ui ;
2013-11-20 12:19:37 -05:00
delete zeroTierClient ;
zeroTierClient = ( ZeroTier : : Node : : LocalClient * ) 0 ;
2013-11-13 16:50:49 -05:00
}
2013-11-15 17:04:32 -05:00
2013-11-19 15:05:14 -05:00
void MainWindow : : timerEvent ( QTimerEvent * event )
{
QMainWindow : : timerEvent ( event ) ;
if ( ! zeroTierClient ) {
std : : string dotAuthFile ( ( QDir : : homePath ( ) + QDir : : separator ( ) + " .zeroTierOneAuthToken " ) . toStdString ( ) ) ;
std : : string authToken ;
if ( ! ZeroTier : : Utils : : readFile ( dotAuthFile . c_str ( ) , authToken ) ) {
# ifdef __APPLE__
2013-11-20 12:19:37 -05:00
// Run the little AppleScript hack that asks for admin credentials and
// then installs the auth token file in the current user's home.
QString authHelperPath ( QCoreApplication : : applicationDirPath ( ) + " /../Resources/helpers/mac/ZeroTier One (Authenticate).app/Contents/MacOS/applet " ) ;
2013-11-19 15:05:14 -05:00
if ( ! QFile : : exists ( authHelperPath ) ) {
// Allow this to also work from the source tree if it's run from there.
2013-11-20 12:19:37 -05:00
// This is for debugging purposes and shouldn't harm the live release
2013-11-19 15:05:14 -05:00
// in any way.
2013-11-20 12:19:37 -05:00
authHelperPath = QCoreApplication : : applicationDirPath ( ) + " /../../../../ZeroTierUI/helpers/mac/ZeroTier One (Authenticate).app/Contents/MacOS/applet " ;
2013-11-19 15:05:14 -05:00
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 ) ;
2013-11-20 12:19:37 -05:00
return ;
2013-11-19 15:05:14 -05:00
}
}
2013-11-20 12:19:37 -05:00
QProcess : : execute ( authHelperPath , QStringList ( ) ) ;
2013-11-19 15:05:14 -05:00
# endif
2013-11-20 12:19:37 -05:00
if ( ! ZeroTier : : Utils : : readFile ( dotAuthFile . c_str ( ) , authToken ) ) {
QMessageBox : : critical ( this , " Cannot Authorize " , " Unable to authorize this user to administrate ZeroTier One. \n \n To do so manually, copy 'authtoken.secret' from the ZeroTier One home directory to '.zeroTierOneAuthToken' in your home directory and set file modes on this file to only be readable by you (e.g. 0600 on Mac or Linux systems). " , QMessageBox : : Ok , QMessageBox : : NoButton ) ;
QApplication : : exit ( 1 ) ;
return ;
}
2013-11-19 15:05:14 -05:00
}
2013-11-20 12:19:37 -05:00
zeroTierClient = new ZeroTier : : Node : : LocalClient ( authToken . c_str ( ) , 0 , & handleZTMessage , this ) ;
2013-11-19 15:05:14 -05:00
}
}
2013-11-15 17:04:32 -05:00
void MainWindow : : on_joinNetworkButton_clicked ( )
{
}
void MainWindow : : on_actionAbout_triggered ( )
{
AboutWindow * about = new AboutWindow ( this ) ;
about - > show ( ) ;
}
void MainWindow : : on_actionJoin_Network_triggered ( )
{
2013-11-18 12:01:33 -05:00
// Does the same thing as clicking join button on main UI
2013-11-15 17:04:32 -05:00
on_joinNetworkButton_clicked ( ) ;
}
void MainWindow : : on_actionShow_Detailed_Status_triggered ( )
{
}
void MainWindow : : on_networkIdLineEdit_textChanged ( const QString & text )
{
2013-11-18 12:01:33 -05:00
QString newText ;
for ( QString : : const_iterator i ( text . begin ( ) ) ; i ! = text . end ( ) ; + + i ) {
switch ( i - > toLatin1 ( ) ) {
case ' 0 ' : newText . append ( ' 0 ' ) ; break ;
case ' 1 ' : newText . append ( ' 1 ' ) ; break ;
case ' 2 ' : newText . append ( ' 2 ' ) ; break ;
case ' 3 ' : newText . append ( ' 3 ' ) ; break ;
case ' 4 ' : newText . append ( ' 4 ' ) ; break ;
case ' 5 ' : newText . append ( ' 5 ' ) ; break ;
case ' 6 ' : newText . append ( ' 6 ' ) ; break ;
case ' 7 ' : newText . append ( ' 7 ' ) ; break ;
case ' 8 ' : newText . append ( ' 8 ' ) ; break ;
case ' 9 ' : newText . append ( ' 9 ' ) ; break ;
case ' a ' : newText . append ( ' a ' ) ; break ;
case ' b ' : newText . append ( ' b ' ) ; break ;
case ' c ' : newText . append ( ' c ' ) ; break ;
case ' d ' : newText . append ( ' d ' ) ; break ;
case ' e ' : newText . append ( ' e ' ) ; break ;
case ' f ' : newText . append ( ' f ' ) ; break ;
case ' A ' : newText . append ( ' a ' ) ; break ;
case ' B ' : newText . append ( ' b ' ) ; break ;
case ' C ' : newText . append ( ' c ' ) ; break ;
case ' D ' : newText . append ( ' d ' ) ; break ;
case ' E ' : newText . append ( ' e ' ) ; break ;
case ' F ' : newText . append ( ' f ' ) ; break ;
default : break ;
}
}
ui - > networkIdLineEdit - > setText ( newText ) ;
2013-11-15 17:04:32 -05:00
}
void MainWindow : : on_statusAndAddressButton_clicked ( )
{
// QApplication::clipboard()->setText(ui->myAddressCopyButton->text());
}