From: Christian Kamm Date: Thu, 21 Jan 2016 13:10:37 +0000 (+0100) Subject: Sharing: Fix resharing items with limited permissions #4357 #4358 X-Git-Tag: archive/raspbian/3.16.7-1_deb13u1+rpi1~1^2~1382 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=3b60f6e23877d831f6d4f762edb45bb0c560150b;p=nextcloud-desktop.git Sharing: Fix resharing items with limited permissions #4357 #4358 --- diff --git a/src/gui/ocssharejob.cpp b/src/gui/ocssharejob.cpp index 256dfd784..66368aeb9 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 9f018aa12..36d505ac4 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 fcdf1b1ca..ec03c219b 100644 --- a/src/gui/share.cpp +++ b/src/gui/share.cpp @@ -17,6 +17,17 @@ #include +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(); + 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 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 0811e38ae..ea859337d 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 parseLinkShare(const QVariantMap &data); QSharedPointer parseShare(const QVariantMap &data); + QMap _jobContinuation; AccountPtr _account; }; diff --git a/src/gui/socketapi.cpp b/src/gui/socketapi.cpp index b9eb7cd5a..50bf69279 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 == "/") {