From 571da3d8a3c4f9211dc2facf979109d0b9c8a55d Mon Sep 17 00:00:00 2001 From: Daniel Tartavel Date: Mon, 14 Oct 2024 18:30:12 +0200 Subject: [PATCH] Corrected:\n- bug on ipv6\n- bug on saving settings --- downloadfile.cpp | 3 +- mainwindow.cpp | 272 ++++++++++++++++++++++++++--------------------- 2 files changed, 150 insertions(+), 125 deletions(-) diff --git a/downloadfile.cpp b/downloadfile.cpp index 9b9a06a..37a2e57 100644 --- a/downloadfile.cpp +++ b/downloadfile.cpp @@ -52,7 +52,7 @@ void MainWindow::download() { info(DEBUGMACRO, "Adding user to server (user@server"); this->downloading.user = this->connexion.user; - server = this->connexion.user + "@" + this->downloading.server; + server = this->connexion.user + "@" + "[" + this->downloading.server + "]"; env.insert("RSYNC_PASSWORD", this->downloading.password); // Add an environment variable this->downloading.process->setProcessEnvironment(env); } @@ -102,6 +102,7 @@ void MainWindow::readRsyncOutput() { list.clear(); line = QString::fromUtf8(this->downloading.process->readLine()); + info(DEBUGMACRO, "downloading progress : " + line); if (line.isEmpty()) { break; diff --git a/mainwindow.cpp b/mainwindow.cpp index b3129e7..cc48823 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -370,13 +370,14 @@ void MainWindow::populateList(QString server, uint port) QGuiApplication::setOverrideCursor(Qt::WaitCursor); // verify if server is in history - this->settings.beginGroup("connexion/server"); + this->settings.beginGroup("connexion/Servers"); if (this->settings.contains(server)) { + this->settings.beginGroup(server); info(DEBUGMACRO, "Server configuration exists in settings"); // server is in history => setting port value - port = this->settings.value(server).toUInt(); + port = this->settings.value("port").toUInt(); this->connexion.ipversion = this->settings.value("ipversion").toUInt(); ui->portEdit->setText(QString::number(port)); this->connexion.port = port; @@ -384,8 +385,10 @@ void MainWindow::populateList(QString server, uint port) ok = true; //display list of services //listServices(); // TODO clear in listServices + this->settings.endGroup(); } this->settings.endGroup(); + this->settings.endGroup(); } if (port != this->connexion.port) { @@ -401,7 +404,7 @@ void MainWindow::populateList(QString server, uint port) if (this->connexion.ipversion == 0) { this->connexion.ipversion = validateServer(server); - info(DEBUGMACRO, QString::number(this->connexion.ipversion)); + info(DEBUGMACRO, "IP version : " + QString::number(this->connexion.ipversion)); } if (this->connexion.ipversion != 0) @@ -411,17 +414,27 @@ void MainWindow::populateList(QString server, uint port) info(DEBUGMACRO,"Saving server configuration in settings"); // storing serverURL and port in settings - this->settings.setValue(server, port); - this->settings.setValue(server, this->connexion.ipversion); + this->settings.beginGroup("connnexion"); + this->settings.beginGroup("Servers"); + this->settings.beginGroup(server); + this->settings.setValue("port", port); + this->settings.setValue("ipversion", this->connexion.ipversion); + this->settings.endGroup(); + this->settings.endGroup(); + this->settings.endGroup(); + this->settings.sync(); this->downloading.server = server; + this->downloading.port = port; this->downloading.ipversion = this->connexion.ipversion; // storing in history of combobox ui->khistorycombobox->addToHistory(server); // load and display rsync services of the rsync server - + }else + { + info(DEBUGMACRO, "ERROR : Unknown IP version"); } }else { @@ -429,7 +442,8 @@ void MainWindow::populateList(QString server, uint port) } listServices(); - this->settings.beginGroup("Hidden/" + server); + this->settings.beginGroup("Hidden"); + this->settings.beginGroup(server); hidden = this->settings.allKeys(); if (hidden.count() > 0) { @@ -444,6 +458,7 @@ void MainWindow::populateList(QString server, uint port) } } this->settings.endGroup(); + this->settings.endGroup(); // clearing listview ui->treeWidget->clear(); QGuiApplication::restoreOverrideCursor(); //setting cursor to default @@ -509,7 +524,7 @@ bool MainWindow::testServerPresence(QString service, bool askPassword) //list services of the rsync server void MainWindow::listServices() { - QString cmd; + QString cmd = "/usr/bin/rsync"; QStringList param; QString line; QString errorRsync; @@ -524,7 +539,6 @@ void MainWindow::listServices() // clearing listwidget ui->listWidget->clear(); - cmd = "/usr/bin/rsync"; if (this->connexion.ipversion == 0) { this->connexion.ipversion = whatIpVersion(this->connexion.server); @@ -538,7 +552,12 @@ void MainWindow::listServices() { param << "-" + QString::number(this->connexion.ipversion).trimmed(); server = "[" + this->connexion.server + "]"; + }else + { + error(tr("Error : Unknown IP version")); + return; } + param << "--contimeout=20" << "--port=" + QString::number(this->connexion.port) << server + "::"; myProcess = new QProcess(this); @@ -583,7 +602,7 @@ void MainWindow::listServices() // connect to rsync server to get list of files bool MainWindow::scanDir(Connexion * connexion, QTreeWidgetItem *parent, QString path) { - QString cmd; + QString cmd = "rsync"; QStringList param; QStringList sizeA; QString line; @@ -593,6 +612,7 @@ bool MainWindow::scanDir(Connexion * connexion, QTreeWidgetItem *parent, QString QString fileType; QString date; QString dirName = ""; + QString user; QProcess * myProcess; QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); bool isDir = false; @@ -615,122 +635,124 @@ bool MainWindow::scanDir(Connexion * connexion, QTreeWidgetItem *parent, QString } if (nChild == 0) { - if (!connexion->user.isEmpty()) - { - server.prepend(connexion->user + "@"); - env.insert("RSYNC_PASSWORD", connexion->password); // Add an environment variable - }else - { - server.prepend("anonymous@"); - env.insert("RSYNC_PASSWORD", "anonymous"); // Add an environment variable - } - myProcess->setProcessEnvironment(env); - info(DEBUGMACRO, "ipversion => " + QString::number(connexion->ipversion)); - cmd = "rsync"; - if(this->connexion.ipversion == 4 || this->connexion.ipversion == 6) - { - param << "-" + QString::number(connexion->ipversion).trimmed(); - } - param << "--contimeout=20" << "--port=" + QString::number(connexion->port) << "[" + server + "]::" + path; + myProcess->setProcessEnvironment(env); - info(DEBUGMACRO, cmd + " " + param.join(" ")); - - myProcess->start(cmd, param); - this->rescan = true; - - info(DEBUGMACRO, "Waiting server response"); - // waiting for response of the server with a timeout of 10 seconds - do - { - readOk = myProcess->waitForReadyRead(10000); - if (readOk) + info(DEBUGMACRO, "ipversion => " + QString::number(connexion->ipversion)); + if(this->connexion.ipversion == 4 || this->connexion.ipversion == 6) { - while (!flag) - { - line = QString::fromUtf8(myProcess->readLine()); - // line empty then buffer is empty so returning to wait new datas - if (line.isEmpty()) - { - flag = true; - break; - } - if (line.contains("auth failed")) - { - myProcess->readAllStandardOutput(); - getUserPassword(connexion); - if (looping <= 1) - { - this->rescan = true; - looping++; - }else - { - this->rescan = false; - looping = 0; - warning(tr("Authentication failed" )); - } - return false; - } - - // extracting name, size and is dir/file - line = line.simplified(); - filename = line.section(" ", 4); - if (filename != '.') - { - size = line.section(" ", 1, 1); - fullsize = size; - fullsize.remove(","); - sizeA = size.split(','); - if (sizeA.count() <= 1) - { - size = sizeA.at(0) + " " + UnitText[0] + " "; - }else - { - myProcess->setProcessEnvironment(env); - size = sizeA.at(0) + "," + sizeA.at(1).left(2) + " " + UnitText[sizeA.count()-1] + " "; - } - - if (line[0] == "d") - { - isDir = true; - }else - { - isDir = false; - } - - date = line.section(' ', 2, 2); - fileType = getFileType(filename); - if (!path.isEmpty()) - { - if (path.endsWith('/')) - { - path.chop(1); - } - dirs = path.split('/'); - dirName = dirs[dirs.size()-1]; - } - addTreeItem(filename, size, fullsize, fileType, date, isDir, dirName, parent); - if (passwdOk == false and !connexion->password.isEmpty()) - { - this->settings.setValue("Passwords/" + connexion->server + "/" + connexion->service + "/" + connexion->user, true); - setPassword(connexion->user, connexion->password); - this->settings.sync(); - } - this->rescan = false; - } + param << "-" + QString::number(connexion->ipversion).trimmed(); } - flag = false; + + + if (!connexion->user.isEmpty()) + { + user = connexion->user + "@"; + env.insert("RSYNC_PASSWORD", connexion->password); // Add an environment variable }else { - if (myProcess->state() == QProcess::Running) + user = "anonymous@"; + env.insert("RSYNC_PASSWORD", "anonymous"); // Add an environment variable + } + param << "--contimeout=20" << "--port=" + QString::number(connexion->port) << user + "[" + server + "]::" + path; + + info(DEBUGMACRO, cmd + " " + param.join(" ")); + + myProcess->start(cmd, param); + this->rescan = true; + + info(DEBUGMACRO, "Waiting server response"); + // waiting for response of the server with a timeout of 10 seconds + do { - if (myProcess->waitForFinished(10000) == 0) + readOk = myProcess->waitForReadyRead(10000); + if (readOk) { - warning(tr("The processus does'nt respond: ") + myProcess->errorString()); + while (!flag) + { + line = QString::fromUtf8(myProcess->readLine()); + // line empty then buffer is empty so returning to wait new datas + if (line.isEmpty()) + { + flag = true; + break; + } + if (line.contains("auth failed")) + { + myProcess->readAllStandardOutput(); + getUserPassword(connexion); + if (looping <= 1) + { + this->rescan = true; + looping++; + }else + { + this->rescan = false; + looping = 0; + warning(tr("Authentication failed" )); + } + return false; + } + + // extracting name, size and is dir/file + line = line.simplified(); + filename = line.section(" ", 4); + if (filename != '.') + { + size = line.section(" ", 1, 1); + fullsize = size; + fullsize.remove(","); + sizeA = size.split(','); + if (sizeA.count() <= 1) + { + size = sizeA.at(0) + " " + UnitText[0] + " "; + }else + { + myProcess->setProcessEnvironment(env); + size = sizeA.at(0) + "," + sizeA.at(1).left(2) + " " + UnitText[sizeA.count()-1] + " "; + } + + if (line[0] == "d") + { + isDir = true; + }else + { + isDir = false; + } + + date = line.section(' ', 2, 2); + fileType = getFileType(filename); + if (!path.isEmpty()) + { + if (path.endsWith('/')) + { + path.chop(1); + } + dirs = path.split('/'); + dirName = dirs[dirs.size()-1]; + } + addTreeItem(filename, size, fullsize, fileType, date, isDir, dirName, parent); + if (passwdOk == false and !connexion->password.isEmpty()) + { + this->settings.setValue("Passwords/" + connexion->server + "/" + connexion->service + "/" + connexion->user, true); + setPassword(connexion->user, connexion->password); + this->settings.sync(); + } + this->rescan = false; + } + } + flag = false; + }else + { + if (myProcess->state() == QProcess::Running) + { + if (myProcess->waitForFinished(10000) == 0) + { + warning(tr("The processus does'nt respond: ") + myProcess->errorString()); + } + } } - } - } - }while(readOk); + }while(readOk); // buffer empty go to waiting new datas testRsyncReturn(this, myProcess); @@ -761,9 +783,10 @@ uint MainWindow::validateServer(QString server) info(DEBUGMACRO, "Digging server name"); cmd = "dig"; - param << "-t A"; // IP V4 query - param << "-t AAAA"; // IP V6 query param << server.trimmed() ; + param << "A"; // IP V4 query + param << server.trimmed() ; + param << "AAAA"; // IP V6 query info(DEBUGMACRO, cmd + " " + param.join(" ")); @@ -874,7 +897,8 @@ void MainWindow::addTreeItem(QString name, QString fileSize, QString fullsize, Q }else { // item is a file - this->settings.beginGroup("Downloaded/"); + this->settings.beginGroup("Downloaded"); +//TODO add to settings this->settings.endGroup(); treeItem->setText(1,type); } @@ -1040,7 +1064,7 @@ void MainWindow::on_treeWidget_itemClicked(QTreeWidgetItem *item, bool downloadD }else { this->downloading.savePath = this->settings.value(str).toString(); - info(DEBUGMACRO, "saving folder" + this->downloading.savePath); + info(DEBUGMACRO, "saving folder : " + this->downloading.savePath); } // Item is a file @@ -1237,7 +1261,7 @@ void MainWindow::downloadFinished(int exitCode, QProcess::ExitStatus exitStatus) pos = path.lastIndexOf(" => "); this->downloading.server = path.midRef(pos+4).toString(); path.resize(pos); - this->downloading.port = this->settings.value("connexion/server/" + this->downloading.server).toInt(); + this->downloading.port = this->settings.value("connexion/Servers/" + this->downloading.server + "/port").toInt(); this->downloading.path = path; //getUserPassword(true); @@ -1331,7 +1355,7 @@ void MainWindow::loadSettings() // loading connexion settings // loading servers history info(DEBUGMACRO, "Restoring server combobox history"); - this->settings.beginGroup("connexion/server"); + this->settings.beginGroup("connexion/Servers"); QStringList servers = this->settings.allKeys(); this->settings.endGroup(); ui->khistorycombobox->insertItems(1,this->settings.value("kHistoryComboBox").toStringList()); @@ -1498,7 +1522,7 @@ void MainWindow::loadDownloadList() path.resize(pos); pos = path.lastIndexOf(" => "); this->downloading.server = path.midRef(pos+4).toString(); - this->downloading.port = this->settings.value("connexion/server/" + this->downloading.server).toInt(); + this->downloading.port = this->settings.value("connexion/Servers/" + this->downloading.server+ "/port").toInt(); path.resize(pos); this->downloading.path = path; str = "Folder/" + this->downloading.server + "/" + this->downloading.service;