Hide revert button when no permission to revert

This commit is contained in:
Vincent Petry 2016-06-28 12:09:58 +02:00
parent 894b7d93f6
commit f22af90c09
4 changed files with 78 additions and 2 deletions

View File

@ -15,7 +15,9 @@
'<a href="{{downloadUrl}}" class="downloadVersion"><img src="{{downloadIconUrl}}" />' + '<a href="{{downloadUrl}}" class="downloadVersion"><img src="{{downloadIconUrl}}" />' +
'<span class="versiondate has-tooltip" title="{{formattedTimestamp}}">{{relativeTimestamp}}</span>' + '<span class="versiondate has-tooltip" title="{{formattedTimestamp}}">{{relativeTimestamp}}</span>' +
'</a>' + '</a>' +
'{{#canRevert}}' +
'<a href="#" class="revertVersion" title="{{revertLabel}}"><img src="{{revertIconUrl}}" /></a>' + '<a href="#" class="revertVersion" title="{{revertLabel}}"><img src="{{revertIconUrl}}" /></a>' +
'{{/canRevert}}' +
'</li>'; '</li>';
var TEMPLATE = var TEMPLATE =
@ -109,6 +111,9 @@
}, },
error: function() { error: function() {
fileInfoModel.trigger('busy', fileInfoModel, false);
self.$el.find('.versions').removeClass('hidden');
self._toggleLoading(false);
OC.Notification.showTemporary( OC.Notification.showTemporary(
t('files_version', 'Failed to revert {file} to revision {timestamp}.', { t('files_version', 'Failed to revert {file} to revision {timestamp}.', {
file: versionModel.getFullPath(), file: versionModel.getFullPath(),
@ -183,6 +188,7 @@
revertIconUrl: OC.imagePath('core', 'actions/history'), revertIconUrl: OC.imagePath('core', 'actions/history'),
previewUrl: version.getPreviewUrl(), previewUrl: version.getPreviewUrl(),
revertLabel: t('files_versions', 'Restore'), revertLabel: t('files_versions', 'Restore'),
canRevert: (this.collection.getFileInfo().get('permissions') & OC.PERMISSION_UPDATE) !== 0
}, version.attributes); }, version.attributes);
}, },

View File

@ -320,8 +320,16 @@ class Storage {
// add expected leading slash // add expected leading slash
$file = '/' . ltrim($file, '/'); $file = '/' . ltrim($file, '/');
list($uid, $filename) = self::getUidAndFilename($file); list($uid, $filename) = self::getUidAndFilename($file);
if ($uid === null || trim($filename, '/') === '') {
return false;
}
$users_view = new View('/'.$uid); $users_view = new View('/'.$uid);
$files_view = new View('/'. User::getUser().'/files'); $files_view = new View('/'. User::getUser().'/files');
if (!$files_view->isUpdatable($filename)) {
return false;
}
$versionCreated = false; $versionCreated = false;
//first create a new version //first create a new version

View File

@ -625,6 +625,40 @@ class VersioningTest extends \Test\TestCase {
$this->doTestRestore(); $this->doTestRestore();
} }
public function testRestoreNoPermission() {
$this->loginAsUser(self::TEST_VERSIONS_USER);
$userHome = \OC::$server->getUserFolder(self::TEST_VERSIONS_USER);
$node = $userHome->newFolder('folder');
$file = $node->newFile('test.txt');
$share = \OC::$server->getShareManager()->newShare();
$share->setNode($node)
->setShareType(\OCP\Share::SHARE_TYPE_USER)
->setSharedBy(self::TEST_VERSIONS_USER)
->setSharedWith(self::TEST_VERSIONS_USER2)
->setPermissions(\OCP\Constants::PERMISSION_READ);
$share = \OC::$server->getShareManager()->createShare($share);
$versions = $this->createAndCheckVersions(
\OC\Files\Filesystem::getView(),
'folder/test.txt'
);
$file->putContent('test file');
$this->loginAsUser(self::TEST_VERSIONS_USER2);
$firstVersion = current($versions);
$this->assertFalse(\OCA\Files_Versions\Storage::rollback('folder/test.txt', $firstVersion['version']), 'Revert did not happen');
$this->loginAsUser(self::TEST_VERSIONS_USER);
\OC::$server->getShareManager()->deleteShare($share);
$this->assertEquals('test file', $file->getContent(), 'File content has not changed');
}
/** /**
* @param string $hookName name of hook called * @param string $hookName name of hook called
* @param string $params variable to receive parameters provided by hook * @param string $params variable to receive parameters provided by hook
@ -685,7 +719,7 @@ class VersioningTest extends \Test\TestCase {
$params = array(); $params = array();
$this->connectMockHooks('rollback', $params); $this->connectMockHooks('rollback', $params);
\OCA\Files_Versions\Storage::rollback('sub/test.txt', $t2); $this->assertTrue(\OCA\Files_Versions\Storage::rollback('sub/test.txt', $t2));
$expectedParams = array( $expectedParams = array(
'path' => '/sub/test.txt', 'path' => '/sub/test.txt',
); );
@ -829,6 +863,8 @@ class VersioningTest extends \Test\TestCase {
// note: we cannot predict how many versions are created due to // note: we cannot predict how many versions are created due to
// test run timing // test run timing
$this->assertGreaterThan(0, count($versions)); $this->assertGreaterThan(0, count($versions));
return $versions;
} }
/** /**

View File

@ -39,7 +39,8 @@ describe('OCA.Versions.VersionsTabView', function() {
fetchStub = sinon.stub(VersionCollection.prototype, 'fetch'); fetchStub = sinon.stub(VersionCollection.prototype, 'fetch');
fileInfoModel = new OCA.Files.FileInfoModel({ fileInfoModel = new OCA.Files.FileInfoModel({
id: 123, id: 123,
name: 'test.txt' name: 'test.txt',
permissions: OC.PERMISSION_READ | OC.PERMISSION_UPDATE
}); });
tabView = new VersionsTabView(); tabView = new VersionsTabView();
tabView.render(); tabView.render();
@ -86,12 +87,37 @@ describe('OCA.Versions.VersionsTabView', function() {
expect($item.find('.revertVersion').length).toEqual(1); expect($item.find('.revertVersion').length).toEqual(1);
expect($item.find('.preview').attr('src')).toEqual(version2.getPreviewUrl()); expect($item.find('.preview').attr('src')).toEqual(version2.getPreviewUrl());
}); });
it('does not render revert button when no update permissions', function() {
fileInfoModel.set('permissions', OC.PERMISSION_READ);
tabView.setFileInfo(fileInfoModel);
tabView.collection.set(testVersions);
var version1 = testVersions[0];
var version2 = testVersions[1];
var $versions = tabView.$el.find('.versions>li');
expect($versions.length).toEqual(2);
var $item = $versions.eq(0);
expect($item.find('.downloadVersion').attr('href')).toEqual(version1.getDownloadUrl());
expect($item.find('.versiondate').text()).toEqual('seconds ago');
expect($item.find('.revertVersion').length).toEqual(0);
expect($item.find('.preview').attr('src')).toEqual(version1.getPreviewUrl());
$item = $versions.eq(1);
expect($item.find('.downloadVersion').attr('href')).toEqual(version2.getDownloadUrl());
expect($item.find('.versiondate').text()).toEqual('2 days ago');
expect($item.find('.revertVersion').length).toEqual(0);
expect($item.find('.preview').attr('src')).toEqual(version2.getPreviewUrl());
});
}); });
describe('More versions', function() { describe('More versions', function() {
var hasMoreResultsStub; var hasMoreResultsStub;
beforeEach(function() { beforeEach(function() {
tabView.setFileInfo(fileInfoModel);
fetchStub.reset();
tabView.collection.set(testVersions); tabView.collection.set(testVersions);
hasMoreResultsStub = sinon.stub(VersionCollection.prototype, 'hasMoreResults'); hasMoreResultsStub = sinon.stub(VersionCollection.prototype, 'hasMoreResults');
}); });