[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