diff options
author | Bjoern Schiessle <bjoern@schiessle.org> | 2016-06-07 12:28:02 +0200 |
---|---|---|
committer | Lukas Reschke <lukas@owncloud.com> | 2016-06-09 15:15:17 +0200 |
commit | bb54ab0db8bfa1ea62bfa2404cb084a9a68d6e20 (patch) | |
tree | 8127443d4c554ebcd1401ce8227408038f8717e2 | |
parent | fc3ad7d5f7acb018329b22d5120c03cd07feecd6 (diff) | |
download | nextcloud-server-bb54ab0db8bfa1ea62bfa2404cb084a9a68d6e20.tar.gz nextcloud-server-bb54ab0db8bfa1ea62bfa2404cb084a9a68d6e20.zip |
add hide file list option
-rw-r--r-- | apps/files_sharing/js/public.js | 9 | ||||
-rw-r--r-- | apps/files_sharing/lib/API/Share20OCS.php | 1 | ||||
-rw-r--r-- | apps/files_sharing/lib/Controllers/ShareController.php | 6 | ||||
-rw-r--r-- | apps/files_sharing/templates/public.php | 50 | ||||
-rw-r--r-- | apps/files_sharing/tests/Controllers/ShareControllerTest.php | 2 | ||||
-rw-r--r-- | core/js/sharedialoglinkshareview.js | 45 | ||||
-rw-r--r-- | core/js/shareitemmodel.js | 20 | ||||
-rw-r--r-- | lib/private/Share20/Manager.php | 5 | ||||
-rw-r--r-- | tests/lib/Share20/ManagerTest.php | 1 |
9 files changed, 112 insertions, 27 deletions
diff --git a/apps/files_sharing/js/public.js b/apps/files_sharing/js/public.js index 572ccc47b71..7f780fd09e7 100644 --- a/apps/files_sharing/js/public.js +++ b/apps/files_sharing/js/public.js @@ -238,6 +238,11 @@ OCA.Sharing.PublicApp = { $(this).select(); }); + $(document).on('click', '.content-wrapper-upload', function (e) { + //e.preventDefault(); + $('#file_upload_start').focus().trigger('click'); + }); + $('.save-form').submit(function (event) { event.preventDefault(); @@ -302,7 +307,7 @@ OCA.Sharing.PublicApp = { $('#save-button-confirm') .removeClass("icon-loading-small") .addClass("icon-confirm"); - + } else { $('#save-button-confirm') @@ -314,7 +319,7 @@ OCA.Sharing.PublicApp = { toggleLoading(); var location = window.location.protocol + '//' + window.location.host + OC.webroot; - + if(remote.substr(-1) !== '/') { remote += '/' }; diff --git a/apps/files_sharing/lib/API/Share20OCS.php b/apps/files_sharing/lib/API/Share20OCS.php index 90e1f19130c..b10c51ce2c9 100644 --- a/apps/files_sharing/lib/API/Share20OCS.php +++ b/apps/files_sharing/lib/API/Share20OCS.php @@ -602,6 +602,7 @@ class Share20OCS { if ($newPermissions !== null && $newPermissions !== \OCP\Constants::PERMISSION_READ && + $newPermissions !== (\OCP\Constants::PERMISSION_CREATE | \OCP\Constants::PERMISSION_UPDATE) && $newPermissions !== (\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_CREATE | \OCP\Constants::PERMISSION_UPDATE)) { $share->getNode()->unlock(ILockingProvider::LOCK_SHARED); return new \OC_OCS_Result(null, 400, $this->l->t('Can\'t change permissions for public share links')); diff --git a/apps/files_sharing/lib/Controllers/ShareController.php b/apps/files_sharing/lib/Controllers/ShareController.php index 96c0a0ca556..baf2fc9ed11 100644 --- a/apps/files_sharing/lib/Controllers/ShareController.php +++ b/apps/files_sharing/lib/Controllers/ShareController.php @@ -49,7 +49,6 @@ use OCP\ILogger; use OCP\IUserManager; use OCP\ISession; use OCP\IPreview; -use OCA\Files_Sharing\Helper; use OCP\Util; use OCA\Files_Sharing\Activity; use \OCP\Files\NotFoundException; @@ -314,6 +313,7 @@ class ShareController extends Controller { $shareTmpl['fileSize'] = \OCP\Util::humanFileSize($share->getNode()->getSize()); // Show file list + $hideFileList = false; if ($share->getNode() instanceof \OCP\Files\Folder) { $shareTmpl['dir'] = $rootFolder->getRelativePath($path->getPath()); @@ -329,12 +329,14 @@ class ShareController extends Controller { $uploadLimit = Util::uploadLimit(); $maxUploadFilesize = min($freeSpace, $uploadLimit); + $hideFileList = $share->getPermissions() & \OCP\Constants::PERMISSION_READ ? false : true; $folder = new Template('files', 'list', ''); $folder->assign('dir', $rootFolder->getRelativePath($path->getPath())); $folder->assign('dirToken', $token); $folder->assign('permissions', \OCP\Constants::PERMISSION_READ); $folder->assign('isPublic', true); + $folder->assign('hideFileList', $hideFileList); $folder->assign('publicUploadEnabled', 'no'); $folder->assign('uploadMaxFilesize', $maxUploadFilesize); $folder->assign('uploadMaxHumanFilesize', OCP\Util::humanFileSize($maxUploadFilesize)); @@ -345,6 +347,8 @@ class ShareController extends Controller { $shareTmpl['folder'] = $folder->fetchPage(); } + $shareTmpl['hideFileList'] = $hideFileList; + $shareTmpl['shareOwner'] = $this->userManager->get($share->getShareOwner())->getDisplayName(); $shareTmpl['downloadURL'] = $this->urlGenerator->linkToRouteAbsolute('files_sharing.sharecontroller.downloadShare', array('token' => $token)); $shareTmpl['maxSizeAnimateGif'] = $this->config->getSystemValue('max_filesize_animated_gifs_public_sharing', 10); $shareTmpl['previewEnabled'] = $this->config->getSystemValue('enable_previews', true); diff --git a/apps/files_sharing/templates/public.php b/apps/files_sharing/templates/public.php index e39d1b08076..3707bad92f0 100644 --- a/apps/files_sharing/templates/public.php +++ b/apps/files_sharing/templates/public.php @@ -66,26 +66,28 @@ OCP\Util::addscript('files', 'keyboardshortcuts'); <div class="header-right"> <span id="details"> <?php - if ($_['server2serversharing']) { - ?> - <span id="save" data-protected="<?php p($_['protected']) ?>" - data-owner-display-name="<?php p($_['displayName']) ?>" data-owner="<?php p($_['owner']) ?>" data-name="<?php p($_['filename']) ?>"> - <button id="save-button"><?php p($l->t('Add to your ownCloud')) ?></button> - <form class="save-form hidden" action="#"> - <input type="text" id="remote_address" placeholder="example.com/owncloud"/> - <button id="save-button-confirm" class="icon-confirm svg" disabled></button> - </form> - </span> + if (!isset($_['hideFileList']) || (isset($_['hideFileList']) && $_['hideFileList'] === false)) { + if ($_['server2serversharing']) { + ?> + <span id="save" data-protected="<?php p($_['protected']) ?>" + data-owner-display-name="<?php p($_['displayName']) ?>" data-owner="<?php p($_['owner']) ?>" data-name="<?php p($_['filename']) ?>"> + <button id="save-button"><?php p($l->t('Add to your ownCloud')) ?></button> + <form class="save-form hidden" action="#"> + <input type="text" id="remote_address" placeholder="example.com/owncloud"/> + <button id="save-button-confirm" class="icon-confirm svg" disabled></button> + </form> + </span> + <?php } ?> + <a href="<?php p($_['downloadURL']); ?>" id="download" class="button"> + <img class="svg" alt="" src="<?php print_unescaped(image_path("core", "actions/download.svg")); ?>"/> + <span id="download-text"><?php p($l->t('Download'))?></span> + </a> <?php } ?> - <a href="<?php p($_['downloadURL']); ?>" id="download" class="button"> - <img class="svg" alt="" src="<?php print_unescaped(image_path("core", "actions/download.svg")); ?>"/> - <span id="download-text"><?php p($l->t('Download'))?></span> - </a> </span> </div> -</div></header> -<div id="content-wrapper"> - <div id="content"> + </div></header> +<div id="content-wrapper" <?php if(isset($_['hideFileList']) && $_['hideFileList'] === true){ print_unescaped(" class=\"content-wrapper-upload\"");} ?>> + <?php if (!isset($_['hideFileList']) || (isset($_['hideFileList']) && $_['hideFileList'] === false)) { ?> <div id="preview"> <?php if (isset($_['folder'])): ?> <?php print_unescaped($_['folder']); ?> @@ -112,7 +114,21 @@ OCP\Util::addscript('files', 'keyboardshortcuts'); </div> <?php endif; ?> </div> + <?php } else { ?> + <div id="emptycontent" class=""> + <div class="icon-upload"></div> + <h2>Upload files to <?php print_unescaped($_['shareOwner']); ?></h2> + <a href="#" class="inlineblock button">Select</a> + </div> + <?php } ?> +</div> +<?php if (!isset($_['hideFileList']) || (isset($_['hideFileList']) && $_['hideFileList'] === true)): ?> + <input type="hidden" name="dir" id="dir" value="" /> + <div class="hiddenuploadfield"> + <input type="file" id="file_upload_start" class="hiddenuploadfield" name="files[]" + data-url="<?php print_unescaped(OCP\Util::linkTo('files', 'ajax/upload.php')); ?>" /> </div> + <?php endif; ?> <footer> <p class="info"> <?php print_unescaped($theme->getLongFooter()); ?> diff --git a/apps/files_sharing/tests/Controllers/ShareControllerTest.php b/apps/files_sharing/tests/Controllers/ShareControllerTest.php index d97b3a14928..b1c6daaf64a 100644 --- a/apps/files_sharing/tests/Controllers/ShareControllerTest.php +++ b/apps/files_sharing/tests/Controllers/ShareControllerTest.php @@ -372,6 +372,8 @@ class ShareControllerTest extends \Test\TestCase { 'previewEnabled' => true, 'previewMaxX' => 1024, 'previewMaxY' => 1024, + 'hideFileList' => false, + 'shareOwner' => 'ownerDisplay' ); $csp = new \OCP\AppFramework\Http\ContentSecurityPolicy(); diff --git a/core/js/sharedialoglinkshareview.js b/core/js/sharedialoglinkshareview.js index 817c3408e7e..6ac71aedc95 100644 --- a/core/js/sharedialoglinkshareview.js +++ b/core/js/sharedialoglinkshareview.js @@ -30,7 +30,14 @@ ' <input type="checkbox" value="1" name="allowPublicUpload" id="sharingDialogAllowPublicUpload-{{cid}}" class="checkbox publicUploadCheckbox" {{{publicUploadChecked}}} />' + '<label for="sharingDialogAllowPublicUpload-{{cid}}">{{publicUploadLabel}}</label>' + '</div>' + - ' {{/if}}' + + '{{#if hideFileList}}' + + '<div id="hideFileListWrapper">' + + ' <span class="icon-loading-small hidden"></span>' + + ' <input type="checkbox" value="1" name="hideFileList" id="sharingDialogHideFileList-{{cid}}" class="checkbox hideFileListCheckbox" {{{hideFileListChecked}}} />' + + '<label for="sharingDialogHideFileList-{{cid}}">{{hideFileListLabel}}</label>' + + '</div>' + + '{{/if}}' + + ' {{/if}}' + ' {{#if showPasswordCheckBox}}' + '<input type="checkbox" name="showPassword" id="showPassword-{{cid}}" class="checkbox showPasswordCheckbox" {{#if isPasswordSet}}checked="checked"{{/if}} value="1" />' + '<label for="showPassword-{{cid}}">{{enablePasswordLabel}}</label>' + @@ -74,7 +81,8 @@ 'keyup input.linkPassText': 'onPasswordKeyUp', 'click .linkCheckbox': 'onLinkCheckBoxChange', 'click .linkText': 'onLinkTextClick', - 'change .publicUploadCheckbox': 'onAllowPublicUploadChange', + 'change .publicUploadCheckbox': 'onAllowPublicUploadChange', + 'change .hideFileListCheckbox': 'onHideFileListChange', 'click .showPasswordCheckbox': 'onShowPasswordClick' }, @@ -93,6 +101,10 @@ view.render(); }); + this.model.on('change:hideFileListStatus', function() { + view.render(); + }); + this.model.on('change:linkShare', function() { view.render(); }); @@ -110,6 +122,7 @@ 'onPasswordKeyUp', 'onLinkTextClick', 'onShowPasswordClick', + 'onHideFileListChange', 'onAllowPublicUploadChange' ); }, @@ -208,7 +221,21 @@ this.model.saveLinkShare({ permissions: permissions }); - }, + }, + + onHideFileListChange: function () { + var $checkbox = this.$('.hideFileListCheckbox'); + $checkbox.siblings('.icon-loading-small').removeClass('hidden').addClass('inlineblock'); + + var permissions = OC.PERMISSION_UPDATE | OC.PERMISSION_CREATE | OC.PERMISSION_READ; + if ($checkbox.is(':checked')) { + permissions = OC.PERMISSION_UPDATE | OC.PERMISSION_CREATE; + } + + this.model.saveLinkShare({ + permissions: permissions + }); + }, render: function() { var linkShareTemplate = this.template(); @@ -237,6 +264,13 @@ publicUploadChecked = 'checked="checked"'; } + var hideFileList = publicUploadChecked; + + var hideFileListChecked = ''; + if(this.model.isHideFileListSet()) { + hideFileListChecked = 'checked="checked"'; + } + var isLinkShare = this.model.get('linkShare').isLinkShare; var isPasswordSet = !!this.model.get('linkShare').password; var showPasswordCheckBox = isLinkShare @@ -246,6 +280,7 @@ this.$el.html(linkShareTemplate({ cid: this.cid, shareAllowed: true, + hideFileList: hideFileList, isLinkShare: isLinkShare, shareLinkURL: this.model.get('linkShare').link, linkShareLabel: t('core', 'Share link'), @@ -257,7 +292,9 @@ showPasswordCheckBox: showPasswordCheckBox, publicUpload: publicUpload && isLinkShare, publicUploadChecked: publicUploadChecked, - publicUploadLabel: t('core', 'Allow editing'), + hideFileListChecked: hideFileListChecked, + publicUploadLabel: t('core', 'Allow editing'), + hideFileListLabel: t('core', 'Hide file listing'), mailPublicNotificationEnabled: isLinkShare && this.configModel.isMailPublicNotificationEnabled(), mailPrivatePlaceholder: t('core', 'Email link to person'), mailButtonText: t('core', 'Send') diff --git a/core/js/shareitemmodel.js b/core/js/shareitemmodel.js index 3ced66a1a78..56ed3f0039b 100644 --- a/core/js/shareitemmodel.js +++ b/core/js/shareitemmodel.js @@ -275,6 +275,13 @@ /** * @returns {boolean} */ + isHideFileListSet: function() { + return this.get('hideFileListStatus'); + }, + + /** + * @returns {boolean} + */ isFolder: function() { return this.get('itemType') === 'folder'; }, @@ -685,6 +692,16 @@ }); } + var hideFileListStatus = false; + if(!_.isUndefined(data.shares)) { + $.each(data.shares, function (key, value) { + if (value.share_type === OC.Share.SHARE_TYPE_LINK) { + hideFileListStatus = (value.permissions & OC.PERMISSION_READ) ? false : true; + return true; + } + }); + } + /** @type {OC.Share.Types.ShareInfo[]} **/ var shares = _.map(data.shares, function(share) { // properly parse some values because sometimes the server @@ -757,7 +774,8 @@ shares: shares, linkShare: linkShare, permissions: permissions, - allowPublicUploadStatus: allowPublicUploadStatus + allowPublicUploadStatus: allowPublicUploadStatus, + hideFileListStatus: hideFileListStatus }; }, diff --git a/lib/private/Share20/Manager.php b/lib/private/Share20/Manager.php index ceaaa58cf6e..5921bbc44c8 100644 --- a/lib/private/Share20/Manager.php +++ b/lib/private/Share20/Manager.php @@ -239,8 +239,11 @@ class Manager implements IManager { throw new GenericShareException($message_t, $message_t, 404); } + // Check that read permissions are always set - if (($share->getPermissions() & \OCP\Constants::PERMISSION_READ) === 0) { + // Link shares are allowed to have no read permissions to allow upload to hidden folders + if ($share->getShareType() !== \OCP\Share::SHARE_TYPE_LINK && + ($share->getPermissions() & \OCP\Constants::PERMISSION_READ) === 0) { throw new \InvalidArgumentException('Shares need at least read permissions'); } diff --git a/tests/lib/Share20/ManagerTest.php b/tests/lib/Share20/ManagerTest.php index a50ea6c892a..4d4fcf1db73 100644 --- a/tests/lib/Share20/ManagerTest.php +++ b/tests/lib/Share20/ManagerTest.php @@ -670,7 +670,6 @@ class ManagerTest extends \Test\TestCase { $data[] = [$this->createShare(null, \OCP\Share::SHARE_TYPE_USER, $allPermssions, $user2, $user0, $user0, 30, null, null), 'Shares need at least read permissions', true]; $data[] = [$this->createShare(null, \OCP\Share::SHARE_TYPE_GROUP, $allPermssions, $group0, $user0, $user0, 2, null, null), 'Shares need at least read permissions', true]; - $data[] = [$this->createShare(null, \OCP\Share::SHARE_TYPE_LINK, $allPermssions, null, $user0, $user0, 16, null, null), 'Shares need at least read permissions', true]; $data[] = [$this->createShare(null, \OCP\Share::SHARE_TYPE_USER, $allPermssions, $user2, $user0, $user0, 31, null, null), null, false]; $data[] = [$this->createShare(null, \OCP\Share::SHARE_TYPE_GROUP, $allPermssions, $group0, $user0, $user0, 3, null, null), null, false]; |