Fix account not found when doing local file editing.
authoralex-z <blackslayer4@gmail.com>
Thu, 13 Oct 2022 08:24:16 +0000 (11:24 +0300)
committerallexzander <allexzander@users.noreply.github.com>
Mon, 17 Oct 2022 11:56:30 +0000 (14:56 +0300)
Signed-off-by: alex-z <blackslayer4@gmail.com>
src/gui/application.cpp
src/gui/folderman.cpp
src/gui/folderman.h

index 6f891e022edfc1247d5f9f0b2d5d1ae185419a3b..a04ee2f135ec6f92bccba9ab09122d5e05a4b130 100644 (file)
@@ -763,7 +763,7 @@ void Application::handleEditLocally(const QUrl &url) const
     }
 
     // for a sample URL "nc://open/admin@nextcloud.lan:8080/Photos/lovely.jpg", QUrl::path would return "admin@nextcloud.lan:8080/Photos/lovely.jpg"
-    const auto accountDisplayName = pathSplit.takeFirst();
+    const auto userId = pathSplit.takeFirst();
     const auto fileRemotePath = pathSplit.join('/');
     const auto urlQuery = QUrlQuery{url};
 
@@ -774,7 +774,7 @@ void Application::handleEditLocally(const QUrl &url) const
         qCWarning(lcApplication) << "Invalid URL for file local editing: missing token";
     }
 
-    FolderMan::instance()->editFileLocally(accountDisplayName, fileRemotePath, token);
+    FolderMan::instance()->editFileLocally(userId, fileRemotePath, token);
 }
 
 QString substLang(const QString &lang)
index d76a4fccd0ce03cc5648dba20829f7cb27b4ad3a..cd4bac264b41d4445d449c443c626e2b49698bcc 100644 (file)
@@ -1422,7 +1422,7 @@ void FolderMan::setDirtyNetworkLimits()
     }
 }
 
-void FolderMan::editFileLocally(const QString &accountDisplayName, const QString &relPath, const QString &token)
+void FolderMan::editFileLocally(const QString &userId, const QString &relPath, const QString &token)
 {
     const auto showError = [this](const OCC::AccountStatePtr accountState, const QString &errorMessage, const QString &subject) {
         if (accountState && accountState->account()) {
@@ -1449,15 +1449,27 @@ void FolderMan::editFileLocally(const QString &accountDisplayName, const QString
 
     if (token.isEmpty()) {
         qCWarning(lcFolderMan) << "Edit locally request is missing a valid token. Impossible to open the file.";
-        showError({}, tr("Edit locally request is not valid. Opening the file is forbidden."), accountDisplayName);
+        showError({}, tr("Edit locally request is not valid. Opening the file is forbidden."), userId);
         return;
     }
 
-    const auto accountFound = AccountManager::instance()->account(accountDisplayName);
+    const auto accountFound = [&userId]() {
+        for (const auto &account : AccountManager::instance()->accounts()) {
+            const auto isUserIdWithPort = userId.split(QLatin1Char(':')).size() > 1;
+            const auto port = isUserIdWithPort ? account->account()->url().port() : -1;
+            const auto portString = (port > 0 && port != 80 && port != 443) ? QStringLiteral(":%1").arg(port) : QStringLiteral("");
+            const QString davUserId = QStringLiteral("%1@%2").arg(account->account()->davUser(), account->account()->url().host()) + portString;
+
+            if (davUserId == userId) {
+                return account;
+            }
+        }
+        return AccountStatePtr{};
+    }();
 
     if (!accountFound) {
-        qCWarning(lcFolderMan) << "Could not find an account " << accountDisplayName << " to edit file " << relPath << " locally.";
-        showError(accountFound, tr("Could not find an account for local editing"), accountDisplayName);
+        qCWarning(lcFolderMan) << "Could not find an account " << userId << " to edit file " << relPath << " locally.";
+        showError(accountFound, tr("Could not find an account for local editing"), userId);
         return;
     }
 
index 2c9b920e6db48ac76c9879ffb430f36179bfe417..444eedff869ae3be3eee9984644c2423f4845505 100644 (file)
@@ -214,7 +214,7 @@ public:
     void setDirtyNetworkLimits();
 
     /** opens a file with default app, if the file is present **/
-    void editFileLocally(const QString &accountDisplayName, const QString &relPath, const QString &token);
+    void editFileLocally(const QString &userId, const QString &relPath, const QString &token);
 
 signals:
     /**