diff --git a/src/drive/driveservice.cpp b/src/drive/driveservice.cpp --- a/src/drive/driveservice.cpp +++ b/src/drive/driveservice.cpp @@ -228,7 +228,7 @@ QUrl fetchPermissionsUrl(const QString &fileId) { QUrl url(Private::GoogleApisUrl); - url.setPath(Private::FilesBasePath % QLatin1Char('/') % fileId % QLatin1String("/premissions")); + url.setPath(Private::FilesBasePath % QLatin1Char('/') % fileId % QLatin1String("/permissions")); return url; } diff --git a/src/drive/permission.h b/src/drive/permission.h --- a/src/drive/permission.h +++ b/src/drive/permission.h @@ -93,6 +93,11 @@ */ QString name() const; + /** + * @brief Returns the email address of this permission. + */ + QString emailAddress() const; + /** * @brief Returns the primary role for this user. */ diff --git a/src/drive/permission.cpp b/src/drive/permission.cpp --- a/src/drive/permission.cpp +++ b/src/drive/permission.cpp @@ -101,6 +101,7 @@ permission->d->id = map[QStringLiteral("id")].toString(); permission->d->selfLink = map[QStringLiteral("selfLink")].toUrl(); permission->d->name = map[QStringLiteral("name")].toString(); + permission->d->emailAddress = map[QStringLiteral("emailAddress")].toString(); permission->d->role = Private::roleFromName(map[QStringLiteral("role")].toString()); @@ -130,6 +131,7 @@ id(other.id), selfLink(other.selfLink), name(other.name), + emailAddress(other.emailAddress), role(other.role), additionalRoles(other.additionalRoles), type(other.type), @@ -164,6 +166,7 @@ GAPI_COMPARE(id) GAPI_COMPARE(selfLink) GAPI_COMPARE(name) + GAPI_COMPARE(emailAddress) GAPI_COMPARE(role) GAPI_COMPARE(additionalRoles) GAPI_COMPARE(type) @@ -194,6 +197,11 @@ return d->name; } +QString Permission::emailAddress() const +{ + return d->emailAddress; +} + Permission::Role Permission::role() const { return d->role; diff --git a/src/drive/permission_p.h b/src/drive/permission_p.h --- a/src/drive/permission_p.h +++ b/src/drive/permission_p.h @@ -38,6 +38,7 @@ QString id; QUrl selfLink; QString name; + QString emailAddress; Role role; QList additionalRoles; Type type; diff --git a/src/drive/permissioncreatejob.h b/src/drive/permissioncreatejob.h --- a/src/drive/permissioncreatejob.h +++ b/src/drive/permissioncreatejob.h @@ -45,6 +45,30 @@ const AccountPtr &account, QObject *parent = nullptr); ~PermissionCreateJob() override; + /** + * @brief The plain text custom message to include in notification emails. + */ + QString emailMessage() const; + + /** + * @brief Sets the plain text custom message to include in notification emails. + */ + void setEmailMessage(QString emailMessage); + + /** + * @brief Sets whether to send notification emails when sharing to users + * or groups. This parameter is ignored and an email is sent if the role + * is owner. (Default: true) + */ + bool sendNotificationEmails() const; + + /** + * @brief Whether to send notification emails when sharing to users or + * groups. This parameter is ignored and an email is sent if the role + * is owner. (Default: true) + */ + void setSendNotificationEmails(bool sendNotificationEmails); + /** * @brief Whether the request supports both My Drives and shared drives. * @@ -65,14 +89,30 @@ */ KGAPIDRIVE_DEPRECATED void setSupportsAllDrives(bool supportsAllDrives); + /** + * @brief Issue the request as a domain administrator; if set to true, + * then the requester will be granted access if the file ID parameter refers + * to a shared drive and the requester is an administrator of the domain to + * which the shared drive belongs. (Default: false) + */ + bool useDomainAdminAccess() const; + + /** + * @brief Sets to issue the request as a domain administrator; if set to true, + * then the requester will be granted access if the file ID parameter refers + * to a shared drive and the requester is an administrator of the domain to + * which the shared drive belongs. (Default: false) + */ + void setUseDomainAdminAccess(bool useDomainAdminAccess); + protected: void start() override; KGAPI2::ObjectsList handleReplyWithItems(const QNetworkReply *reply, const QByteArray &rawData) override; private: class Private; - Private *const d; + QScopedPointer d; friend class Private; }; diff --git a/src/drive/permissioncreatejob.cpp b/src/drive/permissioncreatejob.cpp --- a/src/drive/permissioncreatejob.cpp +++ b/src/drive/permissioncreatejob.cpp @@ -42,14 +42,19 @@ PermissionsList permissions; QString fileId; + QString emailMessage; + bool sendNotificationEmails; bool supportsAllDrives; + bool useDomainAdminAccess; private: PermissionCreateJob *const q; }; PermissionCreateJob::Private::Private(PermissionCreateJob *parent): + sendNotificationEmails(true), supportsAllDrives(true), + useDomainAdminAccess(false), q(parent) { } @@ -65,10 +70,22 @@ QUrl url = DriveService::createPermissionUrl(fileId); - QUrlQuery withDriveSupportQuery(url); - withDriveSupportQuery.addQueryItem(QStringLiteral("supportsAllDrives"), Utils::bool2Str(supportsAllDrives)); - url.setQuery(withDriveSupportQuery); + QUrlQuery query(url); + query.addQueryItem(QStringLiteral("supportsAllDrives"), Utils::bool2Str(supportsAllDrives)); + if (!sendNotificationEmails) { + query.addQueryItem(QStringLiteral("sendNotificationEmails"), Utils::bool2Str(sendNotificationEmails)); + } + + if (!emailMessage.isEmpty()) { + query.addQueryItem(QStringLiteral("emailMessage"), emailMessage); + } + + if (!useDomainAdminAccess) { + query.addQueryItem(QStringLiteral("useDomainAdminAccess"), Utils::bool2Str(useDomainAdminAccess)); + } + + url.setQuery(query); QNetworkRequest request(url); const QByteArray rawData = Permission::toJSON(permission); @@ -97,9 +114,26 @@ d->permissions = permissions; } -PermissionCreateJob::~PermissionCreateJob() +PermissionCreateJob::~PermissionCreateJob() = default; + +QString PermissionCreateJob::emailMessage() const +{ + return d->emailMessage; +} + +void PermissionCreateJob::setEmailMessage(QString emailMessage) +{ + d->emailMessage = emailMessage; +} + +bool PermissionCreateJob::sendNotificationEmails() const +{ + return d->sendNotificationEmails; +} + +void PermissionCreateJob::setSendNotificationEmails(bool sendNotificationEmails) { - delete d; + d->sendNotificationEmails = sendNotificationEmails; } bool PermissionCreateJob::supportsAllDrives() const @@ -112,6 +146,16 @@ d->supportsAllDrives = supportsAllDrives; } +bool PermissionCreateJob::useDomainAdminAccess() const +{ + return d->useDomainAdminAccess; +} + +void PermissionCreateJob::setUseDomainAdminAccess(bool useDomainAdminAccess) +{ + d->useDomainAdminAccess = useDomainAdminAccess; +} + void PermissionCreateJob::start() { d->processNext(); diff --git a/src/drive/permissiondeletejob.h b/src/drive/permissiondeletejob.h --- a/src/drive/permissiondeletejob.h +++ b/src/drive/permissiondeletejob.h @@ -35,7 +35,7 @@ namespace Drive { -class KGAPIDRIVE_EXPORT PermissionDeleteJob : KGAPI2::DeleteJob +class KGAPIDRIVE_EXPORT PermissionDeleteJob : public KGAPI2::DeleteJob { Q_OBJECT @@ -74,12 +74,28 @@ */ KGAPIDRIVE_DEPRECATED void setSupportsAllDrives(bool supportsAllDrives); + /** + * @brief Issue the request as a domain administrator; if set to true, + * then the requester will be granted access if the file ID parameter refers + * to a shared drive and the requester is an administrator of the domain to + * which the shared drive belongs. (Default: false) + */ + bool useDomainAdminAccess() const; + + /** + * @brief Sets to issue the request as a domain administrator; if set to true, + * then the requester will be granted access if the file ID parameter refers + * to a shared drive and the requester is an administrator of the domain to + * which the shared drive belongs. (Default: false) + */ + void setUseDomainAdminAccess(bool useDomainAdminAccess); + protected: void start() override; private: class Private; - Private *const d; + QScopedPointer d; friend class Private; }; diff --git a/src/drive/permissiondeletejob.cpp b/src/drive/permissiondeletejob.cpp --- a/src/drive/permissiondeletejob.cpp +++ b/src/drive/permissiondeletejob.cpp @@ -39,6 +39,7 @@ QString fileId; QStringList permissionsIds; bool supportsAllDrives; + bool useDomainAdminAccess; }; PermissionDeleteJob::PermissionDeleteJob(const QString &fileId, @@ -49,6 +50,7 @@ d(new Private) { d->supportsAllDrives = true; + d->useDomainAdminAccess = false; d->fileId = fileId; d->permissionsIds << permission->id(); } @@ -61,6 +63,7 @@ d(new Private) { d->supportsAllDrives = true; + d->useDomainAdminAccess = false; d->fileId = fileId; d->permissionsIds << permissionId; } @@ -73,6 +76,7 @@ d(new Private) { d->supportsAllDrives = true; + d->useDomainAdminAccess = false; d->fileId = fileId; for (const PermissionPtr & permission : qAsConst(permissions)) { d->permissionsIds << permission->id(); @@ -87,14 +91,12 @@ d(new Private) { d->supportsAllDrives = true; + d->useDomainAdminAccess = false; d->fileId = fileId; d->permissionsIds << permissionsIds; } -PermissionDeleteJob::~PermissionDeleteJob() -{ - delete d; -} +PermissionDeleteJob::~PermissionDeleteJob() = default; bool PermissionDeleteJob::supportsAllDrives() const { @@ -106,6 +108,16 @@ d->supportsAllDrives = supportsAllDrives; } +bool PermissionDeleteJob::useDomainAdminAccess() const +{ + return d->useDomainAdminAccess; +} + +void PermissionDeleteJob::setUseDomainAdminAccess(bool useDomainAdminAccess) +{ + d->useDomainAdminAccess = useDomainAdminAccess; +} + void PermissionDeleteJob::start() { if (d->permissionsIds.isEmpty()) { @@ -115,9 +127,12 @@ const QString permissionId = d->permissionsIds.takeFirst(); QUrl url = DriveService::deletePermissionUrl(d->fileId, permissionId); - QUrlQuery withDriveSupportQuery(url); - withDriveSupportQuery.addQueryItem(QStringLiteral("supportsAllDrives"), Utils::bool2Str(d->supportsAllDrives)); - url.setQuery(withDriveSupportQuery); + QUrlQuery query(url); + query.addQueryItem(QStringLiteral("supportsAllDrives"), Utils::bool2Str(d->supportsAllDrives)); + if (!d->useDomainAdminAccess) { + query.addQueryItem(QStringLiteral("useDomainAdminAccess"), Utils::bool2Str(d->useDomainAdminAccess)); + } + url.setQuery(query); QNetworkRequest request(url); enqueueRequest(request); diff --git a/src/drive/permissionfetchjob.h b/src/drive/permissionfetchjob.h --- a/src/drive/permissionfetchjob.h +++ b/src/drive/permissionfetchjob.h @@ -68,14 +68,30 @@ */ KGAPIDRIVE_DEPRECATED void setSupportsAllDrives(bool supportsAllDrives); + /** + * @brief Issue the request as a domain administrator; if set to true, + * then the requester will be granted access if the file ID parameter refers + * to a shared drive and the requester is an administrator of the domain to + * which the shared drive belongs. (Default: false) + */ + bool useDomainAdminAccess() const; + + /** + * @brief Sets to issue the request as a domain administrator; if set to true, + * then the requester will be granted access if the file ID parameter refers + * to a shared drive and the requester is an administrator of the domain to + * which the shared drive belongs. (Default: false) + */ + void setUseDomainAdminAccess(bool useDomainAdminAccess); + protected: void start() override; KGAPI2::ObjectsList handleReplyWithItems(const QNetworkReply *reply, const QByteArray &rawData) override; private: class Private; - Private *const d; + QScopedPointer d; friend class Private; }; diff --git a/src/drive/permissionfetchjob.cpp b/src/drive/permissionfetchjob.cpp --- a/src/drive/permissionfetchjob.cpp +++ b/src/drive/permissionfetchjob.cpp @@ -40,7 +40,7 @@ QString fileId; QString permissionId; bool supportsAllDrives; - + bool useDomainAdminAccess; }; PermissionFetchJob::PermissionFetchJob(const QString &fileId, @@ -50,6 +50,7 @@ d(new Private) { d->supportsAllDrives = true; + d->useDomainAdminAccess = false; d->fileId = fileId; } @@ -60,6 +61,7 @@ d(new Private) { d->supportsAllDrives = true; + d->useDomainAdminAccess = false; d->fileId = file->id(); } @@ -71,6 +73,7 @@ d(new Private) { d->supportsAllDrives = true; + d->useDomainAdminAccess = false; d->fileId = fileId; d->permissionId = permissionId; } @@ -83,14 +86,12 @@ d(new Private) { d->supportsAllDrives = true; + d->useDomainAdminAccess = false; d->fileId = file->id(); d->permissionId = permissionId; } -PermissionFetchJob::~PermissionFetchJob() -{ - delete d; -} +PermissionFetchJob::~PermissionFetchJob() = default; bool PermissionFetchJob::supportsAllDrives() const { @@ -102,6 +103,16 @@ d->supportsAllDrives = supportsAllDrives; } +bool PermissionFetchJob::useDomainAdminAccess() const +{ + return d->useDomainAdminAccess; +} + +void PermissionFetchJob::setUseDomainAdminAccess(bool useDomainAdminAccess) +{ + d->useDomainAdminAccess = useDomainAdminAccess; +} + void PermissionFetchJob::start() { QUrl url; @@ -111,10 +122,12 @@ url = DriveService::fetchPermissionUrl(d->fileId, d->permissionId); } - QUrlQuery withDriveSupportQuery(url); - withDriveSupportQuery.addQueryItem(QStringLiteral("supportsAllDrives"), Utils::bool2Str(d->supportsAllDrives)); - url.setQuery(withDriveSupportQuery); - + QUrlQuery query(url); + query.addQueryItem(QStringLiteral("supportsAllDrives"), Utils::bool2Str(d->supportsAllDrives)); + if (!d->useDomainAdminAccess) { + query.addQueryItem(QStringLiteral("useDomainAdminAccess"), Utils::bool2Str(d->useDomainAdminAccess)); + } + url.setQuery(query); QNetworkRequest request(url); enqueueRequest(request); } diff --git a/src/drive/permissionmodifyjob.h b/src/drive/permissionmodifyjob.h --- a/src/drive/permissionmodifyjob.h +++ b/src/drive/permissionmodifyjob.h @@ -46,6 +46,16 @@ const AccountPtr &account, QObject *parent = nullptr); ~PermissionModifyJob() override; + /** + * @brief Whether to remove the expiration date. (Default: false) + */ + bool removeExpiration() const; + + /** + * @brief Sets whether to remove the expiration date. (Default: false) + */ + void setRemoveExpiration(bool removeExpiration); + /** * @brief Whether the request supports both My Drives and shared drives. * @@ -66,14 +76,44 @@ */ KGAPIDRIVE_DEPRECATED void setSupportsAllDrives(bool supportsAllDrives); + /** + * @brief Whether changing a role to 'owner' downgrades the current owners + * to writers. Does nothing if the specified role is not 'owner'. + * (Default: false) + */ + bool transferOwnership() const; + + /** + * @brief Sets whether changing a role to 'owner' downgrades the current owners + * to writers. Does nothing if the specified role is not 'owner'. + * (Default: false) + */ + void setTransferOwnership(bool transferOwnership); + + /** + * @brief Issue the request as a domain administrator; if set to true, + * then the requester will be granted access if the file ID parameter refers + * to a shared drive and the requester is an administrator of the domain to + * which the shared drive belongs. (Default: false) + */ + bool useDomainAdminAccess() const; + + /** + * @brief Sets to issue the request as a domain administrator; if set to true, + * then the requester will be granted access if the file ID parameter refers + * to a shared drive and the requester is an administrator of the domain to + * which the shared drive belongs. (Default: false) + */ + void setUseDomainAdminAccess(bool useDomainAdminAccess); + protected: void start() override; KGAPI2::ObjectsList handleReplyWithItems(const QNetworkReply *reply, const QByteArray &rawData) override; private: class Private; - Private *const d; + QScopedPointer d; friend class Private; }; diff --git a/src/drive/permissionmodifyjob.cpp b/src/drive/permissionmodifyjob.cpp --- a/src/drive/permissionmodifyjob.cpp +++ b/src/drive/permissionmodifyjob.cpp @@ -44,13 +44,19 @@ QString fileId; PermissionsList permissions; bool supportsAllDrives; + bool removeExpiration; + bool transferOwnership; + bool useDomainAdminAccess; private: PermissionModifyJob *q; }; PermissionModifyJob::Private::Private(PermissionModifyJob *parent): supportsAllDrives(true), + removeExpiration(false), + transferOwnership(false), + useDomainAdminAccess(false), q(parent) { } @@ -65,10 +71,22 @@ const PermissionPtr permission = permissions.takeFirst(); QUrl url = DriveService::modifyPermissionUrl(fileId, permission->id()); - QUrlQuery withDriveSupportQuery(url); - withDriveSupportQuery.addQueryItem(QStringLiteral("supportsAllDrives"), Utils::bool2Str(supportsAllDrives)); - url.setQuery(withDriveSupportQuery); + QUrlQuery query(url); + query.addQueryItem(QStringLiteral("supportsAllDrives"), Utils::bool2Str(supportsAllDrives)); + if (!removeExpiration) { + query.addQueryItem(QStringLiteral("removeExpiration"), Utils::bool2Str(removeExpiration)); + } + + if (!transferOwnership) { + query.addQueryItem(QStringLiteral("transferOwnership"), Utils::bool2Str(transferOwnership)); + } + + if (!useDomainAdminAccess) { + query.addQueryItem(QStringLiteral("useDomainAdminAccess"), Utils::bool2Str(useDomainAdminAccess)); + } + + url.setQuery(query); QNetworkRequest request(url); const QByteArray rawData = Permission::toJSON(permission); @@ -97,9 +115,16 @@ d->permissions << permissions; } -PermissionModifyJob::~PermissionModifyJob() +PermissionModifyJob::~PermissionModifyJob() = default; + +bool PermissionModifyJob::removeExpiration() const { - delete d; + return d->removeExpiration; +} + +void PermissionModifyJob::setRemoveExpiration(bool removeExpiration) +{ + d->removeExpiration = removeExpiration; } bool PermissionModifyJob::supportsAllDrives() const @@ -112,6 +137,26 @@ d->supportsAllDrives = supportsAllDrives; } +bool PermissionModifyJob::transferOwnership() const +{ + return d->transferOwnership; +} + +void PermissionModifyJob::setTransferOwnership(bool transferOwnership) +{ + d->transferOwnership = transferOwnership; +} + +bool PermissionModifyJob::useDomainAdminAccess() const +{ + return d->useDomainAdminAccess; +} + +void PermissionModifyJob::setUseDomainAdminAccess(bool useDomainAdminAccess) +{ + d->useDomainAdminAccess = useDomainAdminAccess; +} + void PermissionModifyJob::start() { d->processNext();