almost finished

This commit is contained in:
Szybet 2022-08-18 21:47:08 +02:00
parent d2ba6dc80c
commit 2acd7adf1f
9 changed files with 328 additions and 21 deletions

View file

@ -32,6 +32,9 @@ SOURCES += \
src/apps/calendarapp.cpp \
src/widgets/dialogs/reader/highlightslistdialog.cpp \
src/widgets/dialogs/reader/textdialog.cpp \
src/widgets/dialogs/wifi/connectiondialog.cpp \
src/widgets/dialogs/wifi/network.cpp \
src/widgets/dialogs/wifi/wifilogger.cpp \
src/widgets/reader/dictionarywidget.cpp \
src/encfs/encryptionmanager.cpp \
src/widgets/dialogs/generaldialog.cpp \
@ -72,6 +75,9 @@ HEADERS += \
src/apps/calendarapp.h \
src/widgets/dialogs/reader/highlightslistdialog.h \
src/widgets/dialogs/reader/textdialog.h \
src/widgets/dialogs/wifi/connectiondialog.h \
src/widgets/dialogs/wifi/network.h \
src/widgets/dialogs/wifi/wifilogger.h \
src/widgets/reader/dictionarywidget.h \
src/encfs/encryptionmanager.h \
src/functions.h \
@ -112,6 +118,9 @@ FORMS += \
src/apps/calendarapp.ui \
src/widgets/dialogs/reader/highlightslistdialog.ui \
src/widgets/dialogs/reader/textdialog.ui \
src/widgets/dialogs/wifi/connectiondialog.ui \
src/widgets/dialogs/wifi/network.ui \
src/widgets/dialogs/wifi/wifilogger.ui \
src/widgets/reader/dictionarywidget.ui \
src/encfs/encryptionmanager.ui \
src/widgets/dialogs/generaldialog.ui \

View file

@ -1119,6 +1119,23 @@ namespace {
}
return exitCode;
}
bool checkProcessName(QString name) {
QDirIterator appsDir("/proc", QDirIterator::NoIteratorFlags);
while (appsDir.hasNext()) {
QDir dir(appsDir.next());
QFile process = QFile(dir.path() + "/cmdline");
if(process.exists() == true) {
process.open(QIODevice::ReadOnly);
QTextStream stream(&process);
if(stream.readLine().contains(name) == true) {
process.close();
return true;
}
process.close();
}
}
return false;
}
}
#endif // FUNCTIONS_H

View file

@ -499,6 +499,9 @@ void generalDialog::on_okBtn_clicked()
global::toast::delay = 3000;
showToast("Minimum password length is 8 characters");
}
else {
generalDialog::close();
}
}
else {
global::toast::delay = 3000;
@ -591,6 +594,7 @@ void generalDialog::restartSearchDialog() {
}
void generalDialog::setupKeyboardDialog() {
adjust_size();
ui->stackedWidget->setCurrentIndex(0);
keyboardDialog = true;
ui->stackedWidget->setVisible(true);
@ -607,7 +611,7 @@ void generalDialog::setupKeyboardDialog() {
}
else if(global::keyboard::wifiPassphraseDialog == true) {
ui->headerLabel->setText("Enter the network's passphrase");
ui->okBtn->setText("Connect");
ui->okBtn->setText("Enter");
ui->cancelBtn->setText("Cancel");
}
else if(global::keyboard::encfsDialog == true) {
@ -624,6 +628,7 @@ void generalDialog::setupKeyboardDialog() {
connect(keyboardWidget, SIGNAL(adjust_size()), SLOT(adjust_size()));
ui->mainStackedWidget->insertWidget(1, keyboardWidget);
ui->mainStackedWidget->setCurrentIndex(1);
adjust_size();
QTimer::singleShot(1000, this, SLOT(adjust_size()));
}

View file

@ -4,6 +4,7 @@
#include "connectiondialog.h"
#include "ui_connectiondialog.h"
#include "generaldialog.h"
#include "functions.h"
connectiondialog::connectiondialog(QWidget *parent) :
QDialog(parent),
@ -34,6 +35,7 @@ connectiondialog::~connectiondialog()
}
void connectiondialog::applyVariables() {
// Here for some devices it will be propably needed to limit the size. the nia is fine
ui->nameLabel->setText(connectedNetworkData.name);
ui->macLabel->setText(connectedNetworkData.mac);
ui->signalLabel->setText(QString::number(connectedNetworkData.signal) + "%");
@ -62,11 +64,16 @@ void connectiondialog::applyVariables() {
QString password = searchDatabase(connectedNetworkData.name);
if(password.isEmpty() == false) {
log("found password: " + password, className);
ui->passwordTextEdit->setText(password);
ui->showPasswordBtn->setIcon(QIcon("://resources/show.png"));
showedPasword = false;
savedPassword = password;
ui->passwordTextEdit->setText("********");
}
else {
log("No password found", className);
ui->passwordTextEdit->setText("No password found");
ui->passwordTextEdit->setText("No password was saved");
ui->showPasswordBtn->hide();
}
}
}
@ -97,6 +104,10 @@ QString connectiondialog::searchDatabase(QString key) {
}
void connectiondialog::writeToDatabase(QString name, QString password) {
if(searchDatabase(name).isEmpty() == false) {
removeFromDatabase(name);
}
passwordDatabase.open(QIODevice::ReadOnly | QIODevice::Text);
QString fileRead = passwordDatabase.readAll();
passwordDatabase.close();
@ -126,6 +137,45 @@ void connectiondialog::writeToDatabase(QString name, QString password) {
}
}
void connectiondialog::removeFromDatabase(QString name) {
passwordDatabase.open(QIODevice::ReadOnly | QIODevice::Text);
QString fileRead = passwordDatabase.readAll();
passwordDatabase.close();
QJsonDocument jsonDocument = QJsonDocument::fromJson(fileRead.toUtf8());
int counter = 0;
bool remove = false;
if(jsonDocument["list"].isArray() == true) {
QJsonArray jsonArray = jsonDocument["list"].toArray();
for(QJsonValueRef refJsonObject: jsonArray) {
QJsonObject jsonMainObject = refJsonObject.toObject();
QString searchedName = jsonMainObject.keys().first().toUtf8();
log("Found in database: " + searchedName, className);
if(searchedName == name) {
remove = true;
}
if(remove == false) {
counter = counter + 1;
}
}
if(remove == true) {
jsonArray.removeAt(counter);
QJsonDocument newJsonDocument;
QJsonObject root;
root["list"] = jsonArray;
newJsonDocument.setObject(root);
passwordDatabase.open(QFile::WriteOnly | QFile::Text | QFile::Truncate);
passwordDatabase.write(newJsonDocument.toJson());
passwordDatabase.flush();
passwordDatabase.close();
}
else {
log("ERROR: tryied to remove from database, but couldn't find key", className);
}
}
}
void connectiondialog::on_CancelBtn_clicked()
{
this->deleteLater();
@ -137,33 +187,125 @@ void connectiondialog::on_passwordTextEdit_selectionChanged()
ui->passwordTextEdit->setSelection(0, 0);
}
void connectiondialog::on_passwordTextEdit_cursorPositionChanged(int arg1, int arg2)
void connectiondialog::on_passwordTextEdit_cursorPositionChanged(int oldpos, int newpos)
{
log("detected click on textedit");
log("detected click on text edit", className);
if(cursorPositionIgnore == true) {
global::keyboard::keyboardDialog = true;
global::keyboard::wifiPassphraseDialog = true;
global::keyboard::keyboardText = "";
generalDialog* generalDialogWindow = new generalDialog();
generalDialogWindow->setAttribute(Qt::WA_DeleteOnClose);
generalDialogWindow->wifiEssid = connectedNetworkData.name;
connect(generalDialogWindow, &generalDialog::showToast, this, &connectiondialog::showToastSlot);
generalDialogWindow->exec();
if(newpos != 0) {
if(showedPasword == true) {
ui->passwordTextEdit->setCursorPosition(0);
global::keyboard::keyboardDialog = true;
global::keyboard::wifiPassphraseDialog = true;
global::keyboard::keyboardText = "";
generalDialog* generalDialogWindow = new generalDialog();
generalDialogWindow->setAttribute(Qt::WA_DeleteOnClose);
generalDialogWindow->wifiEssid = connectedNetworkData.name;
connect(generalDialogWindow, &generalDialog::showToast, this, &connectiondialog::showToastSlot);
connect(generalDialogWindow, &generalDialog::refreshScreen, this, &connectiondialog::refreshScreenSlot);
global::keyboard::keyboardDialog = false;
global::keyboard::wifiPassphraseDialog = false;
if(global::keyboard::keyboardText.isEmpty() == false) {
ui->passwordTextEdit->setText(global::keyboard::keyboardText);
generalDialogWindow->exec();
global::keyboard::keyboardDialog = false;
global::keyboard::wifiPassphraseDialog = false;
if(global::keyboard::keyboardText.isEmpty() == false) {
// A bit hacky: avoid summoning the keyboard back when the text is changing ( and the cursor too ) showedPasword shouldnt be used for this, but it works and adding another bool would start being messy
showedPasword = false;
ui->passwordTextEdit->setText(global::keyboard::keyboardText);
ui->showPasswordBtn->setIcon(QIcon("://resources/hide.png"));
ui->showPasswordBtn->show();
showedPasword = true;
savedPassword = global::keyboard::keyboardText;
}
global::keyboard::keyboardText = "";
}
}
global::keyboard::keyboardText = "";
}
else {
log("Ignoring click on text edit", className);
cursorPositionIgnore = true;
}
ui->passwordTextEdit->setCursorPosition(0);
}
void connectiondialog::showToastSlot(QString message) {
emit showToastSignal(message);
}
void connectiondialog::on_showPasswordBtn_clicked()
{
if(showedPasword == false) {
ui->showPasswordBtn->setIcon(QIcon("://resources/hide.png"));
ui->passwordTextEdit->setText(savedPassword);
showedPasword = true;
}
else {
showedPasword = false;
ui->showPasswordBtn->setIcon(QIcon("://resources/show.png"));
ui->passwordTextEdit->setText("********");
}
}
void connectiondialog::refreshScreenSlot() {
this->repaint();
emit refreshScreenSignal();
}
void connectiondialog::on_connectBtn_clicked()
{
QString finalPassword;
if(connectedNetworkData.encryption == false) {
finalPassword = "NONE";
}
else {
finalPassword = savedPassword;
writeToDatabase(connectedNetworkData.name, savedPassword);
}
ui->CancelBtn->setEnabled(false);
if(checkWifiState() == global::wifi::WifiState::Configured) {
string_writeconfig("/opt/ibxd", "stop_wifi_operations\n");
}
string_writeconfig("/run/wifi_network_essid", connectedNetworkData.name.toStdString());
string_writeconfig("/run/wifi_network_passphrase", finalPassword.toStdString());
setDefaultWorkDir();
// this will be deleited later in mainwindow icon updater if it failed
string_writeconfig(".config/17-wifi_connection_information/essid", connectedNetworkData.name.toStdString());
string_writeconfig(".config/17-wifi_connection_information/passphrase", finalPassword.toStdString());
finalConnectWait();
}
void connectiondialog::finalConnectWait() {
if(checkIfWifiBussy() == true) {
// To be sure
if(waitTry == 10) {
string_writeconfig("/opt/ibxd", "stop_wifi_operations\n");
}
// Max 10s to wait for everything to shut down
if(waitTry == 20) {
string_writeconfig("/opt/ibxd", "stop_wifi_operations\n");
emit showToastSignal("Failed to stop other wifi processes");
ui->CancelBtn->setEnabled(true);
}
else {
QTimer::singleShot(500, this, SLOT(finalConnectWait()));
waitTry = waitTry + 1;
}
}
else {
string_writeconfig("/opt/ibxd", "connect_to_wifi_network\n");
ui->CancelBtn->setEnabled(true);
this->deleteLater();
this->close();
}
}
bool connectiondialog::checkIfWifiBussy() {
if(checkProcessName("connect_to_network.sh") == true or
checkProcessName("connection_manager.sh") == true or
checkProcessName("only_connect_to_network.sh") == true) {
return true;
}
else {
return false;
}
}

View file

@ -22,24 +22,41 @@ public:
signals:
void showToastSignal(QString message);
void refreshScreenSignal();
public slots:
void applyVariables();
void showToastSlot(QString message);
void refreshScreenSlot();
private slots:
void on_CancelBtn_clicked();
// I know im opening / loading json many times, its maybe not efficient but:
// 1. its modular
// 2. those operations are rare
QString searchDatabase(QString key);
void writeToDatabase(QString name, QString password);
void removeFromDatabase(QString name);
void finalConnectWait();
bool checkIfWifiBussy();
void on_CancelBtn_clicked();
void on_passwordTextEdit_selectionChanged();
void on_passwordTextEdit_cursorPositionChanged(int arg1, int arg2);
void on_showPasswordBtn_clicked();
void on_connectBtn_clicked();
private:
Ui::connectiondialog *ui;
bool cursorPositionIgnore = false;
bool showedPasword;
QString savedPassword;
int waitTry = 0;
};
#endif // CONNECTIONDIALOG_H

View file

@ -71,6 +71,7 @@ void network::on_enterButton_clicked()
newConnectionDiallog->currentlyConnectedNetworkName = currentlyConnectedNetwork;
newConnectionDiallog->applyVariables();
connect(newConnectionDiallog, &connectiondialog::showToastSignal, this, &network::showToastSlot);
connect(newConnectionDiallog, &connectiondialog::refreshScreenSignal, this, &network::refreshScreenSlot);
newConnectionDiallog->exec();
}
@ -82,3 +83,7 @@ void network::closeWrapper() {
void network::showToastSlot(QString message) {
emit showToastSignal(message);
}
void network::refreshScreenSlot() {
emit refreshScreenSignal();
}

View file

@ -22,11 +22,13 @@ public:
signals:
void showToastSignal(QString message);
void refreshScreenSignal();
public slots:
void applyVariables();
void closeWrapper();
void showToastSlot(QString message);
void refreshScreenSlot();
private slots:
void on_enterButton_clicked();

View file

@ -65,6 +65,7 @@ wifiDialog::wifiDialog(QWidget *parent) :
wifiButtonEnabled = true;
}
QTimer::singleShot(relaunchMs, this, SLOT(theWatcher()));
}
wifiDialog::~wifiDialog()
@ -280,6 +281,7 @@ void wifiDialog::refreshNetworksList() {
connectedNetwork->applyVariables();
connect(this, &wifiDialog::killNetworkWidgets, connectedNetwork, &network::closeWrapper);
connect(connectedNetwork, &network::showToastSignal, this, &wifiDialog::showToastSlot);
connect(connectedNetwork, &network::refreshScreenSignal, this, &wifiDialog::refreshScreenSlot);
ui->scrollBarLayout->addWidget(connectedNetwork, Qt::AlignTop);
}
countVec = countVec + 1;
@ -330,6 +332,7 @@ void wifiDialog::refreshNetworksList() {
connectedNetwork->applyVariables();
connect(this, &wifiDialog::killNetworkWidgets, connectedNetwork, &network::closeWrapper);
connect(connectedNetwork, &network::showToastSignal, this, &wifiDialog::showToastSlot);
connect(connectedNetwork, &network::refreshScreenSignal, this, &wifiDialog::refreshScreenSlot);
ui->scrollBarLayout->addWidget(connectedNetwork, Qt::AlignTop);
}
scannedAtLeastOnce = true;
@ -381,3 +384,100 @@ void wifiDialog::on_logBtn_clicked()
void wifiDialog::showToastSlot(QString message) {
emit showToast(message);
}
void wifiDialog::refreshScreenSlot() {
this->repaint();
}
/*
Some documentation used by the watcher
connection_manager.sh - manages all things, launches other processes
connect_to_network.sh - all in one connection manager. manages everything, used by ipd, should be used for recconections after sleeping / booting
get_dhcp.sh - Gets dhcp addresses
prepare_changing_wifi.sh - Kills everything, prepares to changing network
smarter_time_sync.sh - synces time
toggle.sh - turns on / off
list_networks.bin - well lists networks
the watcher first watches at processes that could kill other ones
*/
void wifiDialog::theWatcher() {
bool killing = checkProcessName("toggle.sh");
bool changing = checkProcessName("prepare_changing_wifi.sh");
if(killing == true) {
setStatusText("Changing wifi state");
QTimer::singleShot(relaunchMs, this, SLOT(theWatcher()));
return void();
}
if(changing == true) {
setStatusText("Disconnecting from a network or cleaning");
forceRefresh = true;
QTimer::singleShot(relaunchMs, this, SLOT(theWatcher()));
return void();
}
bool recconection = checkProcessName("connect_to_network.sh");
if(recconection == true) {
forceRefresh = true;
QFile recName = QFile(".config/17-wifi_connection_information/essid");
if(recName.exists() == true) {
setStatusText("Recconecting after suspending to " + readFile(recName.fileName()).replace("\n", ""));
}
else {
// Shouldn't be possible
setStatusText("Recconecting after sleep, but no network found?");
}
QTimer::singleShot(relaunchMs, this, SLOT(theWatcher()));
return void();
}
bool listing = checkProcessName("list_networks.bin");
if(listing == true) {
setStatusText("Scanning networks...");
QTimer::singleShot(relaunchMs, this, SLOT(theWatcher()));
return void();
}
bool time = checkProcessName("smarter_time_sync.sh");
if(time == true) {
forceRefresh = true;
setStatusText("Syncing time");
QTimer::singleShot(relaunchMs, this, SLOT(theWatcher()));
return void();
}
bool dhcp = checkProcessName("get_dhcp.sh");
if(dhcp == true) {
forceRefresh = true;
setStatusText("Getting IP address");
QTimer::singleShot(relaunchMs, this, SLOT(theWatcher()));
return void();
}
bool connecting = checkProcessName("connect_to_network.sh");
if(connecting == true) {
forceRefresh = true;
setStatusText("Connecting to wifi...");
QTimer::singleShot(relaunchMs, this, SLOT(theWatcher()));
return void();
}
setStatusText("Idling");
if(forceRefresh == true) {
forceRefresh = false;
ui->refreshBtn->click();
}
QTimer::singleShot(relaunchMs, this, SLOT(theWatcher()));
}
void wifiDialog::setStatusText(QString message) {
ui->statusLabel->setText(message);
}
void wifiDialog::on_stopBtn_clicked()
{
// Maybe limit this, idk
string_writeconfig("/opt/ibxd", "stop_wifi_operations\n");
}

View file

@ -33,10 +33,18 @@ private:
QFile fullList = QFile("/external_root/run/wifi_list_full");
QFile formattedList = QFile("/external_root/run/wifi_list_format");
// Used by watcher
bool forceRefresh = false;
int relaunchMs = 300;
public slots:
void launchRefresh();
void refreshNetworksList();
void showToastSlot(QString message);
void refreshScreenSlot();
// Shows status of wifi processes, like recconection and others. Also manages refreshing the network list after connection
void theWatcher();
signals:
void refreshScreen();
@ -53,6 +61,8 @@ private slots:
void on_logBtn_clicked();
// This function is a more clever sleep(1), non blocking
void refreshWait();
void setStatusText(QString message);
void on_stopBtn_clicked();
};
#endif // WIFIDIALOG_H