From e54be1c4ee878dd4c318d70430cfba4907003e84 Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Thu, 15 Jun 2017 15:38:22 +0200 Subject: [PATCH] Link shares: Add "show file listing" option #5837 --- src/gui/sharelinkwidget.cpp | 33 +++++++++++++++++++++++---------- src/gui/sharelinkwidget.h | 4 ++-- src/gui/sharelinkwidget.ui | 13 ++++++++++--- src/gui/sharemanager.cpp | 22 ++++------------------ src/gui/sharemanager.h | 12 +++--------- src/libsync/capabilities.cpp | 5 +++++ src/libsync/capabilities.h | 1 + 7 files changed, 48 insertions(+), 42 deletions(-) diff --git a/src/gui/sharelinkwidget.cpp b/src/gui/sharelinkwidget.cpp index f3b8e33da..79973b8e4 100644 --- a/src/gui/sharelinkwidget.cpp +++ b/src/gui/sharelinkwidget.cpp @@ -68,7 +68,7 @@ ShareLinkWidget::ShareLinkWidget(AccountPtr account, _pi_editing = new QProgressIndicator(); _ui->horizontalLayout_create->addWidget(_pi_create); _ui->horizontalLayout_password->addWidget(_pi_password); - _ui->horizontalLayout_editing->addWidget(_pi_editing); + _ui->layout_editing->addWidget(_pi_editing, 0, 2); _ui->horizontalLayout_expire->insertWidget(_ui->horizontalLayout_expire->count() - 1, _pi_date); connect(_ui->nameLineEdit, SIGNAL(returnPressed()), SLOT(slotShareNameEntered())); @@ -81,7 +81,8 @@ ShareLinkWidget::ShareLinkWidget(AccountPtr account, connect(_ui->pushButton_setPassword, SIGNAL(clicked(bool)), SLOT(slotPasswordReturnPressed())); connect(_ui->checkBox_expire, SIGNAL(clicked()), this, SLOT(slotCheckBoxExpireClicked())); connect(_ui->calendar, SIGNAL(dateChanged(QDate)), SLOT(slotExpireDateChanged(QDate))); - connect(_ui->checkBox_editing, SIGNAL(clicked()), this, SLOT(slotCheckBoxEditingClicked())); + connect(_ui->checkBox_editing, SIGNAL(clicked()), this, SLOT(slotPermissionsCheckboxClicked())); + connect(_ui->checkBox_fileListing, SIGNAL(clicked(bool)), this, SLOT(slotPermissionsCheckboxClicked())); _ui->errorLabel->hide(); @@ -145,10 +146,11 @@ ShareLinkWidget::ShareLinkWidget(AccountPtr account, _expiryRequired = true; } - // File can't have public upload set. - _ui->widget_editing->setVisible(!_isFile); - _ui->checkBox_editing->setEnabled( - _account->capabilities().sharePublicLinkAllowUpload()); + // File can't have public upload set; we also hide it if the capability isn't there + _ui->widget_editing->setVisible( + !_isFile && _account->capabilities().sharePublicLinkAllowUpload()); + _ui->checkBox_fileListing->setVisible( + _account->capabilities().sharePublicLinkSupportsUploadOnly()); // Prepare sharing menu @@ -217,9 +219,10 @@ void ShareLinkWidget::slotSharesFetched(const QList> &shar connect(share.data(), SIGNAL(serverError(int, QString)), SLOT(slotServerError(int, QString))); connect(share.data(), SIGNAL(shareDeleted()), SLOT(slotDeleteShareFetched())); connect(share.data(), SIGNAL(expireDateSet()), SLOT(slotExpireSet())); - connect(share.data(), SIGNAL(publicUploadSet()), SLOT(slotPublicUploadSet())); + connect(share.data(), SIGNAL(publicUploadSet()), SLOT(slotPermissionsSet())); connect(share.data(), SIGNAL(passwordSet()), SLOT(slotPasswordSet())); connect(share.data(), SIGNAL(passwordSetError(int, QString)), SLOT(slotPasswordSetError(int, QString))); + connect(share.data(), SIGNAL(permissionsSet()), SLOT(slotPermissionsSet())); // Build the table row auto row = table->rowCount(); @@ -325,6 +328,8 @@ void ShareLinkWidget::slotShareSelectionChanged() // Public upload state (box is hidden for files) if (!_isFile) { _ui->checkBox_editing->setChecked(share->getPublicUpload()); + _ui->checkBox_fileListing->setChecked(share->getShowFileListing()); + _ui->checkBox_fileListing->setEnabled(share->getPublicUpload()); } } @@ -532,14 +537,22 @@ void ShareLinkWidget::slotDeleteShareClicked() share->deleteShare(); } -void ShareLinkWidget::slotCheckBoxEditingClicked() +void ShareLinkWidget::slotPermissionsCheckboxClicked() { if (auto current = selectedShare()) { _ui->checkBox_editing->setEnabled(false); + _ui->checkBox_fileListing->setEnabled(false); _pi_editing->startAnimation(); _ui->errorLabel->hide(); - current->setPublicUpload(_ui->checkBox_editing->isChecked()); + SharePermissions perm = SharePermissionRead; + if (_ui->checkBox_editing->isChecked() && _ui->checkBox_fileListing->isChecked()) { + perm = SharePermissionRead | SharePermissionCreate + | SharePermissionUpdate | SharePermissionDelete; + } else if (_ui->checkBox_editing->isChecked() && !_ui->checkBox_fileListing->isChecked()) { + perm = SharePermissionCreate; + } + current->setPermissions(perm); } } @@ -553,7 +566,7 @@ QSharedPointer ShareLinkWidget::selectedShare() const return items.first()->data(Qt::UserRole).value>(); } -void ShareLinkWidget::slotPublicUploadSet() +void ShareLinkWidget::slotPermissionsSet() { if (sender() == selectedShare().data()) { slotShareSelectionChanged(); diff --git a/src/gui/sharelinkwidget.h b/src/gui/sharelinkwidget.h index 78dcc596b..4dd5f1ec6 100644 --- a/src/gui/sharelinkwidget.h +++ b/src/gui/sharelinkwidget.h @@ -65,7 +65,7 @@ private slots: void slotCheckBoxPasswordClicked(); void slotCheckBoxExpireClicked(); void slotPasswordReturnPressed(); - void slotCheckBoxEditingClicked(); + void slotPermissionsCheckboxClicked(); void slotExpireDateChanged(const QDate &date); void slotPasswordChanged(const QString &newText); void slotNameEdited(QTableWidgetItem *item); @@ -77,7 +77,7 @@ private slots: void slotCreateShareRequiresPassword(const QString &message); void slotPasswordSet(); void slotExpireSet(); - void slotPublicUploadSet(); + void slotPermissionsSet(); void slotServerError(int code, const QString &message); void slotPasswordSetError(int code, const QString &message); diff --git a/src/gui/sharelinkwidget.ui b/src/gui/sharelinkwidget.ui index a04511c03..9d80573be 100644 --- a/src/gui/sharelinkwidget.ui +++ b/src/gui/sharelinkwidget.ui @@ -181,7 +181,7 @@ - + 0 @@ -194,14 +194,14 @@ 0 - + Allow editing - + Qt::Horizontal @@ -214,6 +214,13 @@ + + + + Show file listing + + + diff --git a/src/gui/sharemanager.cpp b/src/gui/sharemanager.cpp index 10d13a067..37c39839f 100644 --- a/src/gui/sharemanager.cpp +++ b/src/gui/sharemanager.cpp @@ -146,17 +146,14 @@ LinkShare::LinkShare(AccountPtr account, { } -bool LinkShare::getPublicUpload() +bool LinkShare::getPublicUpload() const { - return ((_permissions & SharePermissionUpdate) && (_permissions & SharePermissionCreate)); + return _permissions & SharePermissionCreate; } -void LinkShare::setPublicUpload(bool publicUpload) +bool LinkShare::getShowFileListing() const { - OcsShareJob *job = new OcsShareJob(_account); - connect(job, SIGNAL(shareJobFinished(QJsonDocument, QVariant)), SLOT(slotPublicUploadSet(QJsonDocument, QVariant))); - connect(job, SIGNAL(ocsError(int, QString)), SLOT(slotOcsError(int, QString))); - job->setPublicUpload(getId(), publicUpload); + return _permissions & SharePermissionRead; } QString LinkShare::getName() const @@ -177,17 +174,6 @@ QString LinkShare::getToken() const return _token; } -void LinkShare::slotPublicUploadSet(const QJsonDocument &, const QVariant &value) -{ - if (value.toBool()) { - _permissions = SharePermissionRead | SharePermissionUpdate | SharePermissionCreate; - } else { - _permissions = SharePermissionRead; - } - - emit publicUploadSet(); -} - void LinkShare::setPassword(const QString &password) { OcsShareJob *job = new OcsShareJob(_account); diff --git a/src/gui/sharemanager.h b/src/gui/sharemanager.h index 62ff6ee4c..8c361b732 100644 --- a/src/gui/sharemanager.h +++ b/src/gui/sharemanager.h @@ -153,16 +153,12 @@ public: /* * Get the publicUpload status of this share */ - bool getPublicUpload(); + bool getPublicUpload() const; /* - * Set a share to be public upload - * This function can only be called on link shares - * - * On success the publicUploadSet signal is emitted - * In case of a server error the serverError signal is emitted. + * Whether directory listings are available (READ permission) */ - void setPublicUpload(bool publicUpload); + bool getShowFileListing() const; /* * Returns the name of the link share. Can be empty. @@ -209,14 +205,12 @@ public: signals: void expireDateSet(); - void publicUploadSet(); void passwordSet(); void passwordSetError(int statusCode, const QString &message); void nameSet(); private slots: void slotPasswordSet(const QJsonDocument &, const QVariant &value); - void slotPublicUploadSet(const QJsonDocument &, const QVariant &value); void slotExpireDateSet(const QJsonDocument &reply, const QVariant &value); void slotSetPasswordError(int statusCode, const QString &message); void slotNameSet(const QJsonDocument &, const QVariant &value); diff --git a/src/libsync/capabilities.cpp b/src/libsync/capabilities.cpp index 651b1981d..4722c0b99 100644 --- a/src/libsync/capabilities.cpp +++ b/src/libsync/capabilities.cpp @@ -51,6 +51,11 @@ bool Capabilities::sharePublicLinkAllowUpload() const return _capabilities["files_sharing"].toMap()["public"].toMap()["upload"].toBool(); } +bool Capabilities::sharePublicLinkSupportsUploadOnly() const +{ + return _capabilities["files_sharing"].toMap()["public"].toMap()["supports_upload_only"].toBool(); +} + bool Capabilities::sharePublicLinkEnforcePassword() const { return _capabilities["files_sharing"].toMap()["public"].toMap()["password"].toMap()["enforced"].toBool(); diff --git a/src/libsync/capabilities.h b/src/libsync/capabilities.h index 4044d8584..6baaaa0ec 100644 --- a/src/libsync/capabilities.h +++ b/src/libsync/capabilities.h @@ -36,6 +36,7 @@ public: bool shareAPI() const; bool sharePublicLink() const; bool sharePublicLinkAllowUpload() const; + bool sharePublicLinkSupportsUploadOnly() const; bool sharePublicLinkEnforcePassword() const; bool sharePublicLinkEnforceExpireDate() const; int sharePublicLinkExpireDateDays() const;