Link shares: Add "show file listing" option #5837
authorChristian Kamm <mail@ckamm.de>
Thu, 15 Jun 2017 13:38:22 +0000 (15:38 +0200)
committerckamm <mail@ckamm.de>
Fri, 7 Jul 2017 09:23:32 +0000 (11:23 +0200)
src/gui/sharelinkwidget.cpp
src/gui/sharelinkwidget.h
src/gui/sharelinkwidget.ui
src/gui/sharemanager.cpp
src/gui/sharemanager.h
src/libsync/capabilities.cpp
src/libsync/capabilities.h

index f3b8e33da52ed6a5c63c5a30a0a63428cecb94d9..79973b8e47aada89dc2883afe37f2a993072ddce 100644 (file)
@@ -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<QSharedPointer<Share>> &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<LinkShare> ShareLinkWidget::selectedShare() const
     return items.first()->data(Qt::UserRole).value<QSharedPointer<LinkShare>>();
 }
 
-void ShareLinkWidget::slotPublicUploadSet()
+void ShareLinkWidget::slotPermissionsSet()
 {
     if (sender() == selectedShare().data()) {
         slotShareSelectionChanged();
index 78dcc596b7147e1add3a6ccee2b1040982aff89e..4dd5f1ec695b2d12350dd0105e63a2043a4285ea 100644 (file)
@@ -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);
index a04511c03495a3ffacce4196cc4cb0f7ed2ed7b4..9d80573be96f5ab4e2431cf1ee7239ebaa197dda 100644 (file)
       </item>
       <item row="3" column="0">
        <widget class="QWidget" name="widget_editing" native="true">
-        <layout class="QHBoxLayout" name="horizontalLayout_editing">
+        <layout class="QGridLayout" name="layout_editing">
          <property name="leftMargin">
           <number>0</number>
          </property>
          <property name="bottomMargin">
           <number>0</number>
          </property>
-         <item>
+         <item row="0" column="0">
           <widget class="QCheckBox" name="checkBox_editing">
            <property name="text">
             <string>Allow editing</string>
            </property>
           </widget>
          </item>
-         <item>
+         <item row="0" column="1">
           <spacer name="horizontalSpacer">
            <property name="orientation">
             <enum>Qt::Horizontal</enum>
            </property>
           </spacer>
          </item>
+         <item row="1" column="0">
+          <widget class="QCheckBox" name="checkBox_fileListing">
+           <property name="text">
+            <string>Show file listing</string>
+           </property>
+          </widget>
+         </item>
         </layout>
        </widget>
       </item>
index 10d13a06772eabdcda04cfc4917cb97e5b1f852d..37c39839fa0771d6d24d08c0ff5e76ac261aa97c 100644 (file)
@@ -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);
index 62ff6ee4c60be0450160992b465de91b2935b6f0..8c361b73263c989ebf10021fe66c63f1f4565187 100644 (file)
@@ -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);
index 651b1981d512f2569392e7c740ba0bf78ceb729b..4722c0b99bf4ad5694adf323b935b579a3e97958 100644 (file)
@@ -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();
index 4044d85841307750fe3d368451edf7134e477e9e..6baaaa0ec7f339f7255ee00ae51eaa6d126baf02 100644 (file)
@@ -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;