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.

145 lines
4.8 KiB

#include <QLabel>
#include <QPushButton>
#include <QState>
#include <QStateMachine>
#include <QNetworkReply>
#include "common/params.h"
#include "widgets/ssh_keys.hpp"
#include "widgets/input_field.hpp"
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()));
// Layout on entering
QVBoxLayout* main_layout = new QVBoxLayout;
main_layout->setMargin(50);
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()));
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);
wallOfText->setWordWrap(true);
wallOfText->setStyleSheet(R"(font-size: 60px;)");
main_layout->addWidget(wallOfText, 0);
QPushButton* actionButton = new QPushButton;
actionButton->setFixedHeight(100);
main_layout->addWidget(actionButton, 0, Qt::AlignBottom);
setStyleSheet(R"(
QPushButton {
font-size: 60px;
margin: 0px;
padding: 15px;
border-radius: 25px;
color: #dddddd;
background-color: #444444;
}
)");
setLayout(main_layout);
// 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* removeSSH_State = new QState(); // State when user wants to remove the SSH keys
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();
});
initialState->addTransition(this, &SSH::NoSSHAdded, initialStateNoGithub);
initialState->addTransition(this, &SSH::SSHAdded, initialStateConnected);
state->addState(initialStateConnected);
connect(initialStateConnected, &QState::entered, [=](){
actionButton->setText("Clear SSH keys");
actionButton->setStyleSheet(R"(background-color: #750c0c;)");
});
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(actionButton, &QPushButton::released, 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);
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 username){
QString url = "https://github.com/" + username + ".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 {
emit failedResponse("Username doesn't exist");
}
} else {
emit failedResponse("Request timed out");
}
reply->deleteLater();
reply = NULL;
}