[Pkg-owncloud-commits] [owncloud-client] 16/470: Sharing: Fix resharing items with limited permissions #4357 #4358

Sandro Knauß hefee-guest at moszumanska.debian.org
Thu May 12 16:24:39 UTC 2016


This is an automated email from the git hooks/post-receive script.

hefee-guest pushed a commit to branch master
in repository owncloud-client.

commit 3b60f6e23877d831f6d4f762edb45bb0c560150b
Author: Christian Kamm <mail at ckamm.de>
Date:   Thu Jan 21 14:10:37 2016 +0100

    Sharing: Fix resharing items with limited permissions #4357 #4358
---
 src/gui/ocssharejob.cpp |  7 ++++++
 src/gui/ocssharejob.h   |  5 +++++
 src/gui/share.cpp       | 57 +++++++++++++++++++++++++++++++++++++++++++++++--
 src/gui/share.h         |  2 ++
 src/gui/socketapi.cpp   |  2 +-
 5 files changed, 70 insertions(+), 3 deletions(-)

diff --git a/src/gui/ocssharejob.cpp b/src/gui/ocssharejob.cpp
index 256dfd7..66368ae 100644
--- a/src/gui/ocssharejob.cpp
+++ b/src/gui/ocssharejob.cpp
@@ -129,6 +129,13 @@ void OcsShareJob::createShare(const QString& path,
     start();
 }
 
+void OcsShareJob::getSharedWithMe()
+{
+    setVerb("GET");
+    addParam(QLatin1String("shared_with_me"), QLatin1String("true"));
+    start();
+}
+
 void OcsShareJob::jobDone(QVariantMap reply)
 {
     emit shareJobFinished(reply, _value);
diff --git a/src/gui/ocssharejob.h b/src/gui/ocssharejob.h
index 9f018aa..36d505a 100644
--- a/src/gui/ocssharejob.h
+++ b/src/gui/ocssharejob.h
@@ -103,6 +103,11 @@ public:
                      const QString& shareWith = "",
                      const Share::Permissions permissions = Share::PermissionRead);
 
+    /**
+     * Returns information on the items shared with the current user.
+     */
+    void getSharedWithMe();
+
 signals:
     /**
      * Result of the OCS request
diff --git a/src/gui/share.cpp b/src/gui/share.cpp
index fcdf1b1..ec03c21 100644
--- a/src/gui/share.cpp
+++ b/src/gui/share.cpp
@@ -17,6 +17,17 @@
 
 #include <QUrl>
 
+namespace {
+struct CreateShare
+{
+    QString path;
+    OCC::Share::ShareType shareType;
+    QString shareWith;
+    OCC::Share::Permissions permissions;
+};
+} // anonymous namespace
+Q_DECLARE_METATYPE(CreateShare)
+
 namespace OCC {
 
 Share::Share(AccountPtr account, 
@@ -212,15 +223,57 @@ void ShareManager::slotLinkShareCreated(const QVariantMap &reply)
     emit linkShareCreated(share);
 }
 
+
 void ShareManager::createShare(const QString& path,
                                const Share::ShareType shareType,
                                const QString shareWith,
                                const Share::Permissions permissions)
 {
+    auto job = new OcsShareJob(_account);
+
+    // Store values that we need for creating this share later.
+    CreateShare continuation;
+    continuation.path = path;
+    continuation.shareType = shareType;
+    continuation.shareWith = shareWith;
+    continuation.permissions = permissions;
+    _jobContinuation[job] = QVariant::fromValue(continuation);
+
+    connect(job, SIGNAL(shareJobFinished(QVariantMap,QVariant)), SLOT(slotCreateShare(QVariantMap)));
+    connect(job, SIGNAL(ocsError(int,QString)), SLOT(slotOcsError(int,QString)));
+    job->getSharedWithMe();
+}
+
+void ShareManager::slotCreateShare(const QVariantMap &reply)
+{
+    if (!_jobContinuation.contains(sender()))
+        return;
+
+    CreateShare cont = _jobContinuation[sender()].value<CreateShare>();
+    if (cont.path.isEmpty())
+        return;
+    _jobContinuation.remove(sender());
+
+    // Find existing share permissions (if this was shared with us)
+    Share::Permissions existingPermissions = Share::PermissionDefault;
+    foreach (const QVariant & element, reply["ocs"].toMap()["data"].toList()) {
+        QVariantMap map = element.toMap();
+        if (map["file_target"] == cont.path)
+            existingPermissions = Share::Permissions(map["permissions"].toInt());
+    }
+
+    // Limit the permissions we request for a share to the ones the item
+    // was shared with initially.
+    if (cont.permissions == Share::PermissionDefault) {
+        cont.permissions = existingPermissions;
+    } else if (existingPermissions != Share::PermissionDefault) {
+        cont.permissions &= existingPermissions;
+    }
+
     OcsShareJob *job = new OcsShareJob(_account);
     connect(job, SIGNAL(shareJobFinished(QVariantMap, QVariant)), SLOT(slotShareCreated(QVariantMap)));
     connect(job, SIGNAL(ocsError(int, QString)), SLOT(slotOcsError(int, QString)));
-    job->createShare(path, shareType, shareWith, permissions);
+    job->createShare(cont.path, cont.shareType, cont.shareWith, cont.permissions);
 }
 
 void ShareManager::slotShareCreated(const QVariantMap &reply)
@@ -314,7 +367,7 @@ QSharedPointer<Share> ShareManager::parseShare(const QVariantMap &data)
 
 void ShareManager::slotOcsError(int statusCode, const QString &message)
 {
-    emit serverError(statusCode, message);   
+    emit serverError(statusCode, message);
 }
 
 }
diff --git a/src/gui/share.h b/src/gui/share.h
index 0811e38..ea85933 100644
--- a/src/gui/share.h
+++ b/src/gui/share.h
@@ -268,11 +268,13 @@ private slots:
     void slotLinkShareCreated(const QVariantMap &reply);
     void slotShareCreated(const QVariantMap &reply);
     void slotOcsError(int statusCode, const QString &message);
+    void slotCreateShare(const QVariantMap &reply);
 
 private:
     QSharedPointer<LinkShare> parseLinkShare(const QVariantMap &data);
     QSharedPointer<Share> parseShare(const QVariantMap &data);
 
+    QMap<QObject*, QVariant> _jobContinuation;
     AccountPtr _account;
 };
 
diff --git a/src/gui/socketapi.cpp b/src/gui/socketapi.cpp
index b9eb7cd..50bf692 100644
--- a/src/gui/socketapi.cpp
+++ b/src/gui/socketapi.cpp
@@ -386,7 +386,7 @@ void SocketApi::command_SHARE(const QString& localFile, QIODevice* socket)
             return;
         }
 
-        const QString remotePath = shareFolder->remotePath() + QLatin1Char('/') + file;
+        const QString remotePath = QDir(shareFolder->remotePath()).filePath(file);
 
         // Can't share root folder
         if (remotePath == "/") {

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-owncloud/owncloud-client.git



More information about the Pkg-owncloud-commits mailing list