Sharing: Fix resharing items with limited permissions #4357 #4358
authorChristian Kamm <mail@ckamm.de>
Thu, 21 Jan 2016 13:10:37 +0000 (14:10 +0100)
committerChristian Kamm <mail@ckamm.de>
Thu, 21 Jan 2016 13:21:25 +0000 (14:21 +0100)
src/gui/ocssharejob.cpp
src/gui/ocssharejob.h
src/gui/share.cpp
src/gui/share.h
src/gui/socketapi.cpp

index 256dfd7845303bbb2b8c9f283849906dd9a8cc81..66368aeb9d1db8817f0bea0679fbdf6fc3ef793b 100644 (file)
@@ -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);
index 9f018aa1269ce676e4553e3c5492a662d277b9c1..36d505ac4ffc57f948ec8d40d403795d9baf4749 100644 (file)
@@ -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
index fcdf1b1ca88ce8f2c57f0739fa31616a70c5ccde..ec03c219bb29fe510391a25bb60579b3c28bfbea 100644 (file)
 
 #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);
 }
 
 }
index 0811e38aec470ba05a0fe0d3cad2e4dcea8d2d8a..ea859337df9109a6c1f32a05fc6fde5e6194a87f 100644 (file)
@@ -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;
 };
 
index b9eb7cd5a12b8438d36b4929d5736b92e3bbecbd..50bf692791a5c10f99e8146203a9ad606341508e 100644 (file)
@@ -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 == "/") {