openpilot is an open source driver assistance system. openpilot performs the functions of Automated Lane Centering and Adaptive Cruise Control for over 200 supported car makes and models.
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

#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;
}