From 37098c96f932babe1270d74a93e82e3916af4575 Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Sat, 31 Oct 2015 13:39:08 +0100 Subject: [PATCH] [Sharing] Add setpermission to sharing code For user/group/remote shares we were just missing the setPermissions functionality --- src/gui/ocssharejob.cpp | 36 ++++++++++++++++++++---- src/gui/ocssharejob.h | 26 ++++++++++++++++-- src/gui/share.cpp | 61 ++++++++++++++++++++++++++++++++++------- src/gui/share.h | 34 ++++++++++++++++++++--- 4 files changed, 134 insertions(+), 23 deletions(-) diff --git a/src/gui/ocssharejob.cpp b/src/gui/ocssharejob.cpp index fe6afa65f..37ca5aa39 100644 --- a/src/gui/ocssharejob.cpp +++ b/src/gui/ocssharejob.cpp @@ -83,26 +83,50 @@ void OcsShareJob::setPublicUpload(const QString &shareId, bool publicUpload) start(); } -void OcsShareJob::createShare(const QString &path, Share::ShareType shareType, const QString &password, const QDate &date) +void OcsShareJob::setPermissions(const QString &shareId, + const Share::Permissions permissions) +{ + appendPath(shareId); + setVerb("PUT"); + + addParam(QString::fromLatin1("permissions"), QString::number(permissions)); + _value = (int)permissions; + + start(); +} + +void OcsShareJob::createLinkShare(const QString &path, + const QString &password) { setVerb("POST"); addParam(QString::fromLatin1("path"), path); - addParam(QString::fromLatin1("shareType"), QString::number(static_cast(shareType))); + addParam(QString::fromLatin1("shareType"), QString::number(Share::TypeLink)); if (!password.isEmpty()) { addParam(QString::fromLatin1("password"), password); } - if (date.isValid()) { - addParam(QString::fromLatin1("expireDate"), date.toString("yyyy-MM-dd")); - } - addPassStatusCode(403); start(); } +void OcsShareJob::createShare(const QString& path, + const Share::ShareType shareType, + const QString& shareWith, + const Share::Permissions permissions) +{ + setVerb("POST"); + + addParam(QString::fromLatin1("path"), path); + addParam(QString::fromLatin1("shareType"), QString::number(shareType)); + addParam(QString::fromLatin1("shareWith"), shareWith); + addParam(QString::fromLatin1("permissions"), QString::number(permissions)); + + start(); +} + void OcsShareJob::jobDone(QVariantMap reply) { emit shareJobFinished(reply, _value); diff --git a/src/gui/ocssharejob.h b/src/gui/ocssharejob.h index c970df920..bc65b5317 100644 --- a/src/gui/ocssharejob.h +++ b/src/gui/ocssharejob.h @@ -73,15 +73,35 @@ public: */ void setPublicUpload(const QString &shareId, bool publicUpload); + /** + * Set the permissions + * + * @param permissions + */ + void setPermissions(const QString &shareId, + const Share::Permissions permissions); + + /** + * Create a new link share + * + * @param path The path of the file/folder to share + * @param password Optionally a password for the share + */ + void createLinkShare(const QString& path, + const QString& password = ""); + /** * Create a new share * * @param path The path of the file/folder to share * @param shareType The type of share (user/group/link/federated) - * @param password Optionally a password for the share - * @param date Optionally an expire date for the share + * @param shareWith The uid/gid/federated id to share with + * @param permissions The permissions the share will have */ - void createShare(const QString& path, Share::ShareType shareType, const QString& password = "", const QDate& date = QDate()); + void createShare(const QString& path, + const Share::ShareType shareType, + const QString& shareWith = "", + const Share::Permissions permissions = Share::PermissionRead); signals: /** diff --git a/src/gui/share.cpp b/src/gui/share.cpp index 7a62fe313..0af7425f0 100644 --- a/src/gui/share.cpp +++ b/src/gui/share.cpp @@ -22,13 +22,15 @@ namespace OCC { Share::Share(AccountPtr account, const QString& id, const QString& path, - ShareType shareType, - Permissions permissions) + const ShareType shareType, + const Permissions permissions, + const QString shareWith) : _account(account), _id(id), _path(path), _shareType(shareType), - _permissions(permissions) + _permissions(permissions), + _shareWith(shareWith) { } @@ -43,6 +45,20 @@ Share::ShareType Share::getShareType() const return _shareType; } +void Share::setPermissions(Permissions permissions) +{ + OcsShareJob *job = new OcsShareJob(_account, this); + connect(job, SIGNAL(shareJobFinished(QVariantMap, QVariant)), SLOT(slotPermissionsSet(QVariantMap, QVariant))); + connect(job, SIGNAL(ocsError(int, QString)), SLOT(slotOcsError(int, QString))); + job->setPermissions(getId(), permissions); +} + +void Share::slotPermissionsSet(const QVariantMap &, const QVariant &value) +{ + _permissions = (Permissions)value.toInt(); + emit permissionsSet(); +} + Share::Permissions Share::getPermissions() const { return _permissions; @@ -112,7 +128,6 @@ void LinkShare::setPublicUpload(bool publicUpload) void LinkShare::slotPublicUploadSet(const QVariantMap&, const QVariant &value) { - //TODO FIX permission with names if (value.toBool()) { _permissions = PermissionRead | PermissionUpdate | PermissionCreate; } else { @@ -163,7 +178,7 @@ void ShareManager::createLinkShare(const QString &path, OcsShareJob *job = new OcsShareJob(_account, this); connect(job, SIGNAL(shareJobFinished(QVariantMap, QVariant)), SLOT(slotLinkShareCreated(QVariantMap))); connect(job, SIGNAL(ocsError(int, QString)), SLOT(slotOcsError(int, QString))); - job->createShare(path, Share::TypeLink, password); + job->createLinkShare(path, password); } void ShareManager::slotLinkShareCreated(const QVariantMap &reply) @@ -187,6 +202,26 @@ 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) +{ + OcsShareJob *job = new OcsShareJob(_account, this); + 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); +} + +void ShareManager::slotShareCreated(const QVariantMap &reply) +{ + //Parse share + auto data = reply.value("ocs").toMap().value("data").toMap(); + QSharedPointer share(parseShare(data)); + + emit shareCreated(share); +} + void ShareManager::fetchShares(const QString &path) { OcsShareJob *job = new OcsShareJob(_account, this); @@ -213,11 +248,7 @@ void ShareManager::slotSharesFetched(const QVariantMap &reply) if (shareType == Share::TypeLink) { newShare = parseLinkShare(data); } else { - newShare = QSharedPointer(new Share(_account, - data.value("id").toString(), - data.value("path").toString(), - (Share::ShareType)shareType, - (Share::Permissions)data.value("permissions").toInt())); + newShare = parseShare(data); } shares.append(QSharedPointer(newShare)); @@ -257,6 +288,16 @@ QSharedPointer ShareManager::parseLinkShare(const QVariantMap &data) expireDate)); } +QSharedPointer ShareManager::parseShare(const QVariantMap &data) { + + return QSharedPointer(new Share(_account, + data.value("id").toString(), + data.value("path").toString(), + (Share::ShareType)data.value("share_type").toInt(), + (Share::Permissions)data.value("permissions").toInt(), + data.value("share_with").toString())); +} + void ShareManager::slotOcsError(int statusCode, const QString &message) { emit serverError(statusCode, message); diff --git a/src/gui/share.h b/src/gui/share.h index 41c710605..3962fca0d 100644 --- a/src/gui/share.h +++ b/src/gui/share.h @@ -59,8 +59,9 @@ public: explicit Share(AccountPtr account, const QString& id, const QString& path, - ShareType shareType, - Permissions permissions); + const ShareType shareType, + const Permissions permissions, + const QString shareWith = ""); /* * Get the id @@ -72,6 +73,11 @@ public: */ ShareType getShareType() const; + /* + * Get the shareWith + */ + QString getShareWith() const; + /* * Get permissions */ @@ -83,7 +89,7 @@ public: * On success the permissionsSet signal is emitted * In case of a server error the serverError signal is emitted. */ - void setPermissions(int permissions); + void setPermissions(Permissions permissions); /** * Deletes a share @@ -104,12 +110,14 @@ protected: QString _path; ShareType _shareType; Permissions _permissions; + QString _shareWith; protected slots: void slotOcsError(int statusCode, const QString &message); private slots: void slotDeleted(); + void slotPermissionsSet(const QVariantMap &, const QVariant &value); }; @@ -125,7 +133,7 @@ public: explicit LinkShare(AccountPtr account, const QString& id, const QString& path, - Permissions permissions, + const Permissions permissions, bool passwordSet, const QUrl& url, const QDate& expireDate); @@ -215,6 +223,21 @@ public: void createLinkShare(const QString& path, const QString& password=""); + /** + * Tell the manager to create a new share + * + * @param path The path of the share relative to the user folder on the server + * @param shareType The type of share (TypeUser, TypeGroup, TypeRemote) + * @param Permissions The share permissions + * + * On success the signal shareCreated is emitted + * In case of a server error the serverError signal is emitted + */ + void createShare(const QString& path, + const Share::ShareType shareType, + const QString shareWith, + const Share::Permissions permissions); + /** * Fetch all the shares for path * @@ -226,6 +249,7 @@ public: void fetchShares(const QString& path); signals: + void shareCreated(const QSharedPointer &share); void linkShareCreated(const QSharedPointer &share); void linkShareRequiresPassword(); void sharesFetched(const QList> &shares); @@ -234,10 +258,12 @@ signals: private slots: void slotSharesFetched(const QVariantMap &reply); void slotLinkShareCreated(const QVariantMap &reply); + void slotShareCreated(const QVariantMap &reply); void slotOcsError(int statusCode, const QString &message); private: QSharedPointer parseLinkShare(const QVariantMap &data); + QSharedPointer parseShare(const QVariantMap &data); AccountPtr _account; }; -- 2.30.2