fixed detection of server version in cmd client similar to gui client:
authorPatrick Cernko <errror@errror.org>
Tue, 5 Sep 2023 04:11:54 +0000 (06:11 +0200)
committerbackportbot-nextcloud[bot] <backportbot-nextcloud[bot]@users.noreply.github.com>
Thu, 7 Sep 2023 02:32:33 +0000 (02:32 +0000)
first check status.php for version and then capabilities, only use version string if not empty

this also fixes 'File names containing the character ":" are not supported on this file system.' errors in nextcloudcmd (on Linux): The invalidFilenameRegex was set to a static default in case the server version was not set correctly. As newer versions of nextcloud do not return the version in capabilities but status.php, the server version was empty.

Signed-off-by: Patrick Cernko <errror@errror.org>
src/cmd/cmd.cpp

index 37c456dd1ae0fea997098b89495b7c2a283ceced..2764f7255d19fea9c27b309f9805de65513dfb63 100644 (file)
@@ -442,12 +442,40 @@ int main(int argc, char **argv)
     account->setTrustCertificates(options.trustSSL);
 
     QEventLoop loop;
+    auto *csjob = new CheckServerJob(account);
+    csjob->setIgnoreCredentialFailure(true);
+    QObject::connect(csjob, &CheckServerJob::instanceFound, [&](const QUrl &, const QJsonObject &info) {
+        // see ConnectionValidator::slotCapabilitiesRecieved: only set server version if not empty
+        QString serverVersion = CheckServerJob::version(info);
+        if (!serverVersion.isEmpty()) {
+            account->setServerVersion(serverVersion);
+        }
+        loop.quit();
+    });
+    QObject::connect(csjob, &CheckServerJob::instanceNotFound, [&]() {
+        loop.quit();
+    });
+    QObject::connect(csjob, &CheckServerJob::timeout, [&](const QUrl &) {
+        loop.quit();
+    });
+    csjob->start();
+    loop.exec();
+
+    if (csjob->reply()->error() != QNetworkReply::NoError){
+        std::cout<<"Error connecting to server for status\n";
+        return EXIT_FAILURE;
+    }
+
     auto *job = new JsonApiJob(account, QLatin1String("ocs/v1.php/cloud/capabilities"));
     QObject::connect(job, &JsonApiJob::jsonReceived, [&](const QJsonDocument &json) {
         auto caps = json.object().value("ocs").toObject().value("data").toObject().value("capabilities").toObject();
         qDebug() << "Server capabilities" << caps;
         account->setCapabilities(caps.toVariantMap());
-        account->setServerVersion(caps["core"].toObject()["status"].toObject()["version"].toString());
+        // see ConnectionValidator::slotCapabilitiesRecieved: only set server version if not empty
+        QString serverVersion = caps["core"].toObject()["status"].toObject()["version"].toString();
+        if (!serverVersion.isEmpty()) {
+            account->setServerVersion(serverVersion);
+        }
         loop.quit();
     });
     job->start();