@ -1,12 +1,20 @@ 
			
		
	
		
			
				
					# include  <QDebug>  
			
		
	
		
			
				
					# include  <QHBoxLayout>  
			
		
	
		
			
				
					# include  <QLabel>  
			
		
	
		
			
				
					# include  <QPushButton>  
			
		
	
		
			
				
					# include  <QState>  
			
		
	
		
			
				
					# include  <QStateMachine>  
			
		
	
		
			
				
					# include  <QNetworkReply>  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					# include  "common/params.h"  
			
		
	
		
			
				
					# include  "widgets/ssh_keys.hpp"  
			
		
	
		
			
				
					# include  "widgets/input_field.hpp"  
			
		
	
		
			
				
					# include  "common/params.h"  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					QWidget *  layout_to_widget ( QLayout *  l ) {  
			
		
	
		
			
				
					  QWidget *  q  =  new  QWidget ;   
			
		
	
		
			
				
					  q - > setLayout ( l ) ;   
			
		
	
		
			
				
					  return  q ;   
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					SSH : : SSH ( QWidget *  parent )  :  QWidget ( parent ) {  
			
		
	
		
			
				
					  // init variables
   
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -16,24 +24,37 @@ SSH::SSH(QWidget* parent) : QWidget(parent){ 
			
		
	
		
			
				
					  networkTimer - > setInterval ( 5000 ) ;   
			
		
	
		
			
				
					  connect ( networkTimer ,  SIGNAL ( timeout ( ) ) ,  this ,  SLOT ( timeout ( ) ) ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  // Construct the layouts to display
   
			
		
	
		
			
				
					  slayout  =  new  QStackedLayout ( this ) ;  // Initial screen, input, waiting for response
   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  //Layout on entering
   
			
		
	
		
			
				
					  QVBoxLayout *  main_layout  =  new  QVBoxLayout ;   
			
		
	
		
			
				
					  main_layout - > setMargin ( 50 ) ;   
			
		
	
		
			
				
					  QVBoxLayout *  initialL ayout=  new  QVBoxLayout ;   
			
		
	
		
			
				
					  initialLayout - > setContentsMargins ( 80 ,  80 ,  80 ,  8 0) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  QHBoxLayout *  header  =  new  QHBoxLayout ;   
			
		
	
		
			
				
					  QPushButton *  exitButton  =  new  QPushButton ( " BACK " ,  this ) ;   
			
		
	
		
			
				
					  exitButton - > setFixedSize ( 500 ,  100 ) ;   
			
		
	
		
			
				
					  main_layout - > addWidget ( exitButton ,  0 ,  Qt : : AlignLeft  |  Qt : : AlignTop ) ;   
			
		
	
		
			
				
					  connect ( exitButton ,  SIGNAL ( released ( ) ) ,  this ,  SIGNAL ( closeSSHSettings ( ) ) ) ;   
			
		
	
		
			
				
					  header - > addWidget ( exitButton ,  0 ,  Qt : : AlignLeft  |  Qt : : AlignTop ) ;   
			
		
	
		
			
				
					  initialLayout - > addWidget ( layout_to_widget ( header ) ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  QLabel *  wallOfText  =  new  QLabel ( " Warning: This grants SSH access to all public keys in your GitHub settings. Never enter a GitHub username other than your own. " ) ;   
			
		
	
		
			
				
					  wallOfText - > setAlignment ( Qt : : AlignHCenter ) ;   
			
		
	
		
			
				
					  QLabel *  title  =  new  QLabel ( " Authorize SSH keys " ) ;   
			
		
	
		
			
				
					  title - > setStyleSheet ( R " (font-size: 75px;) " ) ;   
			
		
	
		
			
				
					  header - > addWidget ( title ,  0 ,  Qt : : AlignRight  |  Qt : : AlignTop ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  QLabel *  wallOfText  =  new  QLabel ( " Warning: This grants SSH access to all public keys in your GitHub settings. Never enter a GitHub username other than your own. A Comma employee will NEVER ask you to add their GitHub username. " ) ;   
			
		
	
		
			
				
					  wallOfText - > setWordWrap ( true ) ;   
			
		
	
		
			
				
					  wallOfText - > setStyleSheet ( R " (font-size: 60px;) " ) ;   
			
		
	
		
			
				
					  main_layout - > addWidget ( wallOfText ,  0 ) ;   
			
		
	
		
			
				
					  initialL ayout- > addWidget ( wallOfText ,  0 ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  QPushButton *  actionButton  =  new  QPushButton ;   
			
		
	
		
			
				
					  actionButton - > setFixedHeight ( 100 ) ;   
			
		
	
		
			
				
					  main_layout - > addWidget ( actionButton ,  0 ,  Qt : : AlignBottom ) ;   
			
		
	
		
			
				
					  initialLayout - > addWidget ( actionButton ,  0 ,  Qt : : AlignBottom ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  slayout - > addWidget ( layout_to_widget ( initialLayout ) ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  QLabel *  loading  =  new  QLabel ( " Loading SSH keys from GitHub. " ) ;   
			
		
	
		
			
				
					  slayout - > addWidget ( loading ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  setStyleSheet ( R " (   
			
		
	
		
			
				
					    QPushButton  {   
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -45,61 +66,66 @@ SSH::SSH(QWidget* parent) : QWidget(parent){ 
			
		
	
		
			
				
					      background - color :  # 444444 ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					  ) " );   
			
		
	
		
			
				
					  setLayout ( main_layout ) ;   
			
		
	
		
			
				
					  setLayout ( slayout ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  //Initialize the state machine and states
   
			
		
	
		
			
				
					  QStateMachine *  state  =  new  QStateMachine ( this ) ;   
			
		
	
		
			
				
					  QState *  initialState  =  new  QState ( ) ;  //State when entering the widget
   
			
		
	
		
			
				
					  QState *  initialStateNoGithub  =  new  QState ( ) ;  //Starting state, key not connected
   
			
		
	
		
			
				
					  QState *  initialStateConnected  =  new  QState ( ) ;  //Starting state, ssh connected
   
			
		
	
		
			
				
					  QState *  quitState  =  new  QState ( ) ;  // State when exiting the widget
   
			
		
	
		
			
				
					  QState *  removeSSH_State  =  new  QState ( ) ;  // State when user wants to remove the SSH keys 
   
			
		
	
		
			
				
					  QState *  defaultInputFieldState  =  new  QState ( ) ;  // State when we want the user to give us the username 
   
			
		
	
		
			
				
					  QState *  loadingState  =  new  QState ( ) ;  // State while waiting for the network response
   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  // Adding states to the state machine and adding the transitions
   
			
		
	
		
			
				
					  state - > addState ( initialState ) ;   
			
		
	
		
			
				
					  connect ( initialState ,  & QState : : entered ,  [ = ] ( ) {   
			
		
	
		
			
				
					    checkForSSHKey ( ) ;   
			
		
	
		
			
				
					  } ) ;   
			
		
	
		
			
				
					  connect ( initialState ,  & QState : : entered ,  [ = ] ( ) { checkForSSHKey ( ) ;  slayout - > setCurrentIndex ( 0 ) ; } ) ;   
			
		
	
		
			
				
					  initialState - > addTransition ( this ,  & SSH : : NoSSHAdded ,  initialStateNoGithub ) ;   
			
		
	
		
			
				
					  initialState - > addTransition ( this ,  & SSH : : SSHAdded ,  initialStateConnected ) ;   
			
		
	
		
			
				
					  
  
			
		
	
		
			
				
					  
  
			
		
	
		
			
				
					  state - > addState ( quitState ) ;   
			
		
	
		
			
				
					  connect ( quitState ,  & QState : : entered ,  [ = ] ( ) { emit  closeSSHSettings ( ) ; } ) ;   
			
		
	
		
			
				
					  quitState - > addTransition ( quitState ,  & QState : : entered ,  initialState ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  state - > addState ( initialStateConnected ) ;   
			
		
	
		
			
				
					  connect ( initialStateConnected ,  & QState : : entered ,  [ = ] ( ) {   
			
		
	
		
			
				
					    actionButton - > setText ( " Clear SSH keys " ) ;   
			
		
	
		
			
				
					    actionButton - > setStyleSheet ( R " (background-color: #750c0c;) " ) ;   
			
		
	
		
			
				
					  } ) ;   
			
		
	
		
			
				
					  connect ( initialStateConnected ,  & QState : : entered ,  [ = ] ( ) { actionButton - > setText ( " Remove GitHub SSH keys " ) ;  actionButton - > setStyleSheet ( R " (background-color: #750c0c;) " ) ; } ) ;   
			
		
	
		
			
				
					  initialStateConnected - > addTransition ( exitButton ,  & QPushButton : : released ,  quitState ) ;   
			
		
	
		
			
				
					  initialStateConnected - > addTransition ( actionButton ,  & QPushButton : : released ,  removeSSH_State ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  state - > addState ( removeSSH_State ) ;   
			
		
	
		
			
				
					  connect ( removeSSH_State ,  & QState : : entered ,  [ = ] ( ) {   
			
		
	
		
			
				
					    Params ( ) . delete_db_value ( " GithubSshKeys " ) ;   
			
		
	
		
			
				
					  } ) ;   
			
		
	
		
			
				
					  connect ( removeSSH_State ,  & QState : : entered ,  [ = ] ( ) { Params ( ) . delete_db_value ( " GithubSshKeys " ) ; } ) ;   
			
		
	
		
			
				
					  removeSSH_State - > addTransition ( removeSSH_State ,  & QState : : entered ,  initialState ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  state - > addState ( initialStateNoGithub ) ;   
			
		
	
		
			
				
					  connect ( initialStateNoGithub ,  & QState : : entered ,  [ = ] ( ) {   
			
		
	
		
			
				
					    actionButton - > setText ( " Link GitHub SSH keys " ) ;   
			
		
	
		
			
				
					    actionButton - > setStyleSheet ( R " (background-color: #444444;) " ) ;   
			
		
	
		
			
				
					  connect ( initialStateNoGithub ,  & QState : : entered ,  [ = ] ( ) { actionButton - > setText ( " Link GitHub SSH keys " ) ;  actionButton - > setStyleSheet ( R " (background-color: #444444;) " ) ; } ) ;   
			
		
	
		
			
				
					  initialStateNoGithub - > addTransition ( exitButton ,  & QPushButton : : released ,  quitState ) ;   
			
		
	
		
			
				
					  initialStateNoGithub - > addTransition ( actionButton ,  & QPushButton : : released ,  defaultInputFieldState ) ;   
			
		
	
		
			
				
					  connect ( actionButton ,  & QPushButton : : released ,  [ = ] ( ) { inputFieldMessage  =  " Enter your GitHub username " ; } ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  state - > addState ( defaultInputFieldState ) ;   
			
		
	
		
			
				
					  connect ( defaultInputFieldState ,  & QState : : entered ,  [ = ] ( ) {   
			
		
	
		
			
				
					    QString  user  =  InputDialog : : getText ( inputFieldMessage ) ;   
			
		
	
		
			
				
					    if  ( user . length ( ) )  {   
			
		
	
		
			
				
					      emit  inputFieldEmitText ( user ) ;   
			
		
	
		
			
				
					    }  else  {   
			
		
	
		
			
				
					      emit  inputFieldCancelled ( ) ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					  } ) ;   
			
		
	
		
			
				
					  initialStateNoGithub - > addTransition ( actionButton ,  & QPushButton : : released ,  loadingState ) ;   
			
		
	
		
			
				
					  connect ( this ,  & SSH : : inputFieldEmitText ,  [ = ] ( QString  a ) { usernameGitHub  =  a ; } ) ;  // Store the string the user provided
   
			
		
	
		
			
				
					  defaultInputFieldState - > addTransition ( this ,  & SSH : : inputFieldCancelled ,  initialState ) ;   
			
		
	
		
			
				
					  defaultInputFieldState - > addTransition ( this ,  & SSH : : inputFieldEmitText ,  loadingState ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  state - > addState ( loadingState ) ;   
			
		
	
		
			
				
					  connect ( loadingState ,  & QState : : entered ,  [ = ] ( ) {   
			
		
	
		
			
				
					    QString  user  =  InputDialog : : getText ( " Enter your GitHub username " ) ;   
			
		
	
		
			
				
					    if  ( user . size ( ) )  {   
			
		
	
		
			
				
					      getSSHKeys ( user ) ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					  } ) ;   
			
		
	
		
			
				
					  connect ( this ,  & SSH : : failedResponse ,  [ = ] ( QString  message ) {   
			
		
	
		
			
				
					    QString  user  =  InputDialog : : getText ( message ) ;   
			
		
	
		
			
				
					    if  ( user . size ( ) )  {   
			
		
	
		
			
				
					      getSSHKeys ( user ) ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					  } ) ;   
			
		
	
		
			
				
					  loadingState - > addTransition ( loadingState ,  & QState : : entered ,  initialState ) ;   
			
		
	
		
			
				
					  loadingState - > addTransition ( this ,  & SSH : : failedResponse ,  initialState ) ;   
			
		
	
		
			
				
					  connect ( loadingState ,  & QState : : entered ,  [ = ] ( ) { slayout - > setCurrentIndex ( 1 ) ;  getSSHKeys ( ) ; } ) ;   
			
		
	
		
			
				
					  connect ( this ,  & SSH : : failedResponse ,  [ = ] ( QString  message ) { inputFieldMessage  =  message ; } ) ;   
			
		
	
		
			
				
					  loadingState - > addTransition ( this ,  & SSH : : failedResponse ,  defaultInputFieldState ) ;   
			
		
	
		
			
				
					  loadingState - > addTransition ( this ,  & SSH : : gotSSHKeys ,  initialState ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  state - > setInitialState ( initialState ) ;   
			
		
	
		
			
				
					  state - > start ( ) ;   
			
		
	
		
			
				
					}  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -113,8 +139,8 @@ void SSH::checkForSSHKey(){ 
			
		
	
		
			
				
					  }   
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					void  SSH : : getSSHKeys ( QString  username ) {  
			
		
	
		
			
				
					  QString  url  =  " https://github.com/ "  +  username  +  " .keys " ;   
			
		
	
		
			
				
					void  SSH : : getSSHKeys ( ) {  
			
		
	
		
			
				
					  QString  url  =  " https://github.com/ "  +  usernameGitHub   +  " .keys " ;   
			
		
	
		
			
				
					  aborted  =  false ;   
			
		
	
		
			
				
					  reply  =  manager - > get ( QNetworkRequest ( QUrl ( url ) ) ) ;   
			
		
	
		
			
				
					  connect ( reply ,  SIGNAL ( finished ( ) ) ,  this ,  SLOT ( parseResponse ( ) ) ) ;   
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -134,7 +160,7 @@ void SSH::parseResponse(){ 
			
		
	
		
			
				
					      Params ( ) . write_db_value ( " GithubSshKeys " ,  response . toStdString ( ) ) ;   
			
		
	
		
			
				
					      emit  gotSSHKeys ( ) ;   
			
		
	
		
			
				
					    }  else  {   
			
		
	
		
			
				
					      emit  failedResponse ( " Username doesn't exist " ) ;   
			
		
	
		
			
				
					      emit  failedResponse ( " Username  " + usernameGitHub + "   doesn't exist" ) ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					  } else {   
			
		
	
		
			
				
					    emit  failedResponse ( " Request timed out " ) ;