You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							165 lines
						
					
					
						
							6.3 KiB
						
					
					
				
			
		
		
	
	
							165 lines
						
					
					
						
							6.3 KiB
						
					
					
				| #include <QHBoxLayout>
 | |
| #include <QLabel>
 | |
| #include <QPushButton>
 | |
| #include <QState>
 | |
| #include <QStateMachine>
 | |
| #include <QNetworkReply>
 | |
| 
 | |
| #include "widgets/ssh_keys.hpp"
 | |
| #include "widgets/input.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
 | |
|   manager = new QNetworkAccessManager(this);
 | |
|   networkTimer = new QTimer(this);
 | |
|   networkTimer->setSingleShot(true);
 | |
|   networkTimer->setInterval(5000);
 | |
|   connect(networkTimer, SIGNAL(timeout()), this, SLOT(timeout()));
 | |
| 
 | |
|   dialog = new InputDialog("");
 | |
|   // Construct the layouts to display
 | |
|   slayout = new QStackedLayout(this); // Initial screen, input, waiting for response
 | |
| 
 | |
|   //Layout on entering
 | |
|   QVBoxLayout* initialLayout = new QVBoxLayout;
 | |
|   initialLayout->setContentsMargins(80, 80, 80, 80);
 | |
| 
 | |
|   QHBoxLayout* header = new QHBoxLayout;
 | |
|   QPushButton* exitButton = new QPushButton("BACK", this);
 | |
|   exitButton->setFixedSize(500, 100);
 | |
|   header->addWidget(exitButton, 0, Qt::AlignLeft | Qt::AlignTop);
 | |
|   initialLayout->addWidget(layout_to_widget(header));
 | |
| 
 | |
|   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;)");
 | |
|   initialLayout->addWidget(wallOfText, 0);
 | |
| 
 | |
|   QPushButton* actionButton = new QPushButton;
 | |
|   actionButton->setFixedHeight(100);
 | |
|   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 {
 | |
|       font-size: 60px;
 | |
|       margin: 0px;
 | |
|       padding: 15px;
 | |
|       border-radius: 25px;
 | |
|       color: #dddddd;
 | |
|       background-color: #444444;
 | |
|     }
 | |
|   )");
 | |
|   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(); 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("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");});
 | |
|   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;)");});
 | |
|   initialStateNoGithub->addTransition(exitButton, &QPushButton::released, quitState);
 | |
|   initialStateNoGithub->addTransition(actionButton, &QPushButton::released, defaultInputFieldState);
 | |
|   connect(actionButton, &QPushButton::released, [=](){dialog->setMessage("Enter your GitHub username");});
 | |
| 
 | |
|   state->addState(defaultInputFieldState);
 | |
|   connect(defaultInputFieldState, &QState::entered, [=](){dialog->show();});
 | |
|   connect(dialog, &InputDialog::emitText, [=](QString a){usernameGitHub = a;});
 | |
|   defaultInputFieldState->addTransition(dialog, &InputDialog::cancel, initialState);
 | |
|   defaultInputFieldState->addTransition(dialog, &InputDialog::emitText, loadingState);
 | |
| 
 | |
| 
 | |
|   state->addState(loadingState);
 | |
|   connect(loadingState, &QState::entered, [=](){slayout->setCurrentIndex(1); getSSHKeys();});
 | |
|   connect(this, &SSH::failedResponse, [=](QString message){dialog->setMessage(message);});
 | |
|   loadingState->addTransition(this, &SSH::failedResponse, defaultInputFieldState);
 | |
|   loadingState->addTransition(this, &SSH::gotSSHKeys, initialState);
 | |
| 
 | |
| 
 | |
|   state->setInitialState(initialState);
 | |
|   state->start();
 | |
| }
 | |
| 
 | |
| void SSH::checkForSSHKey(){
 | |
|   QString SSHKey = QString::fromStdString(Params().get("GithubSshKeys"));
 | |
|   if (SSHKey.length()) {
 | |
|     emit SSHAdded();
 | |
|   } else {
 | |
|     emit NoSSHAdded();
 | |
|   }
 | |
| }
 | |
| 
 | |
| 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()));
 | |
|   networkTimer->start();
 | |
| }
 | |
| 
 | |
| void SSH::timeout(){
 | |
|   aborted = true;
 | |
|   reply->abort();
 | |
| }
 | |
| 
 | |
| void SSH::parseResponse(){
 | |
|   if (!aborted) {
 | |
|     networkTimer->stop();
 | |
|     QString response = reply->readAll();
 | |
|     if (reply->error() == QNetworkReply::NoError && response.length()) {
 | |
|       Params().write_db_value("GithubSshKeys", response.toStdString());
 | |
|       emit gotSSHKeys();
 | |
|     } else if(reply->error() == QNetworkReply::NoError){
 | |
|       emit failedResponse("Username " + usernameGitHub + " has no keys on GitHub");
 | |
|     } else {
 | |
|       emit failedResponse("Username " + usernameGitHub + " doesn't exist");
 | |
|     }
 | |
|   }else{
 | |
|     emit failedResponse("Request timed out");
 | |
|   }
 | |
|   reply->deleteLater();
 | |
|   reply = nullptr;
 | |
| }
 | |
| 
 |