summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorVincent Petry <pvince81@owncloud.com>2016-05-11 16:47:33 +0200
committerVincent Petry <pvince81@owncloud.com>2016-05-20 17:56:02 +0200
commit88740f035d733d170317d147e15dfceec0f3282f (patch)
treee89b41c948636038bdd009ea7f723aad358e6ee3 /apps
parent03d32bc39bc9baed4803e41192b40372b5167ec4 (diff)
downloadnextcloud-server-88740f035d733d170317d147e15dfceec0f3282f.tar.gz
nextcloud-server-88740f035d733d170317d147e15dfceec0f3282f.zip
Act on effective system tag canAssign permission
Whenever the server returns true for the can-assign Webdav property of a system tag, it means the current user is allowed to assign, regardless of the value of user-assignable. This commit brings the proper logic to the web UI to make it possible for users to assign when they have the permission.
Diffstat (limited to 'apps')
-rw-r--r--apps/dav/lib/SystemTag/SystemTagPlugin.php9
-rw-r--r--apps/systemtags/js/systemtagsinfoview.js2
-rw-r--r--apps/systemtags/tests/js/systemtagsinfoviewSpec.js43
3 files changed, 43 insertions, 11 deletions
diff --git a/apps/dav/lib/SystemTag/SystemTagPlugin.php b/apps/dav/lib/SystemTag/SystemTagPlugin.php
index 0b44287371b..3943d37af84 100644
--- a/apps/dav/lib/SystemTag/SystemTagPlugin.php
+++ b/apps/dav/lib/SystemTag/SystemTagPlugin.php
@@ -53,6 +53,7 @@ class SystemTagPlugin extends \Sabre\DAV\ServerPlugin {
const DISPLAYNAME_PROPERTYNAME = '{http://owncloud.org/ns}display-name';
const USERVISIBLE_PROPERTYNAME = '{http://owncloud.org/ns}user-visible';
const USERASSIGNABLE_PROPERTYNAME = '{http://owncloud.org/ns}user-assignable';
+ const CANASSIGN_PROPERTYNAME = '{http://owncloud.org/ns}can-assign';
/**
* @var \Sabre\DAV\Server $server
@@ -206,7 +207,7 @@ class SystemTagPlugin extends \Sabre\DAV\ServerPlugin {
PropFind $propFind,
\Sabre\DAV\INode $node
) {
- if (!($node instanceof SystemTagNode)) {
+ if (!($node instanceof SystemTagNode) && !($node instanceof SystemTagMappingNode)) {
return;
}
@@ -223,8 +224,14 @@ class SystemTagPlugin extends \Sabre\DAV\ServerPlugin {
});
$propFind->handle(self::USERASSIGNABLE_PROPERTYNAME, function() use ($node) {
+ // this is the tag's inherent property "is user assignable"
return $node->getSystemTag()->isUserAssignable() ? 'true' : 'false';
});
+
+ $propFind->handle(self::CANASSIGN_PROPERTYNAME, function() use ($node) {
+ // this is the effective permission for the current user
+ return $this->tagManager->canUserAssignTag($node->getSystemTag(), $this->userSession->getUser()) ? 'true' : 'false';
+ });
}
/**
diff --git a/apps/systemtags/js/systemtagsinfoview.js b/apps/systemtags/js/systemtagsinfoview.js
index 2f01ca7db34..a7320a3956f 100644
--- a/apps/systemtags/js/systemtagsinfoview.js
+++ b/apps/systemtags/js/systemtagsinfoview.js
@@ -12,7 +12,7 @@
function modelToSelection(model) {
var data = model.toJSON();
- if (!OC.isUserAdmin() && !data.userAssignable) {
+ if (!OC.isUserAdmin() && !data.canAssign) {
data.locked = true;
}
return data;
diff --git a/apps/systemtags/tests/js/systemtagsinfoviewSpec.js b/apps/systemtags/tests/js/systemtagsinfoviewSpec.js
index 27724822c2e..449dfd859d7 100644
--- a/apps/systemtags/tests/js/systemtagsinfoviewSpec.js
+++ b/apps/systemtags/tests/js/systemtagsinfoviewSpec.js
@@ -62,9 +62,9 @@ describe('OCA.SystemTags.SystemTagsInfoView tests', function() {
fetchStub.yieldTo('success', view.selectedTagsCollection);
expect(setDataStub.calledOnce).toEqual(true);
expect(setDataStub.getCall(0).args[0]).toEqual([{
- id: '1', name: 'test1', userVisible: true, userAssignable: true
+ id: '1', name: 'test1', userVisible: true, userAssignable: true, canAssign: true
}, {
- id: '3', name: 'test3', userVisible: true, userAssignable: true
+ id: '3', name: 'test3', userVisible: true, userAssignable: true, canAssign: true
}]);
expect(view.$el.hasClass('hidden')).toEqual(false);
@@ -79,7 +79,7 @@ describe('OCA.SystemTags.SystemTagsInfoView tests', function() {
view = new OCA.SystemTags.SystemTagsInfoView();
view.selectedTagsCollection.add([
{id: '1', name: 'test1'},
- {id: '3', name: 'test3', userVisible: false, userAssignable: false}
+ {id: '3', name: 'test3', userVisible: false, userAssignable: false, canAssign: false}
]);
var callback = sinon.stub();
@@ -87,9 +87,9 @@ describe('OCA.SystemTags.SystemTagsInfoView tests', function() {
expect(callback.calledOnce).toEqual(true);
expect(callback.getCall(0).args[0]).toEqual([{
- id: '1', name: 'test1', userVisible: true, userAssignable: true
+ id: '1', name: 'test1', userVisible: true, userAssignable: true, canAssign: true
}, {
- id: '3', name: 'test3', userVisible: false, userAssignable: false
+ id: '3', name: 'test3', userVisible: false, userAssignable: false, canAssign: false
}]);
inputViewSpy.restore();
@@ -103,7 +103,7 @@ describe('OCA.SystemTags.SystemTagsInfoView tests', function() {
view = new OCA.SystemTags.SystemTagsInfoView();
view.selectedTagsCollection.add([
{id: '1', name: 'test1'},
- {id: '3', name: 'test3', userAssignable: false}
+ {id: '3', name: 'test3', userAssignable: false, canAssign: false}
]);
var callback = sinon.stub();
@@ -111,9 +111,33 @@ describe('OCA.SystemTags.SystemTagsInfoView tests', function() {
expect(callback.calledOnce).toEqual(true);
expect(callback.getCall(0).args[0]).toEqual([{
- id: '1', name: 'test1', userVisible: true, userAssignable: true
+ id: '1', name: 'test1', userVisible: true, userAssignable: true, canAssign: true
}, {
- id: '3', name: 'test3', userVisible: true, userAssignable: false, locked: true
+ id: '3', name: 'test3', userVisible: true, userAssignable: false, canAssign: false, locked: true
+ }]);
+
+ inputViewSpy.restore();
+ });
+ it('does not set locked flag on non-assignable tags when canAssign overrides it with true', function() {
+ isAdminStub.returns(false);
+
+ var inputViewSpy = sinon.spy(OC.SystemTags, 'SystemTagsInputField');
+ var element = $('<input type="hidden" val="1,4"/>');
+ view.remove();
+ view = new OCA.SystemTags.SystemTagsInfoView();
+ view.selectedTagsCollection.add([
+ {id: '1', name: 'test1'},
+ {id: '4', name: 'test4', userAssignable: false, canAssign: true}
+ ]);
+
+ var callback = sinon.stub();
+ inputViewSpy.getCall(0).args[0].initSelection(element, callback);
+
+ expect(callback.calledOnce).toEqual(true);
+ expect(callback.getCall(0).args[0]).toEqual([{
+ id: '1', name: 'test1', userVisible: true, userAssignable: true, canAssign: true
+ }, {
+ id: '4', name: 'test4', userVisible: true, userAssignable: false, canAssign: true
}]);
inputViewSpy.restore();
@@ -152,7 +176,8 @@ describe('OCA.SystemTags.SystemTagsInfoView tests', function() {
id: '2',
name: 'test2',
userVisible: true,
- userAssignable: true
+ userAssignable: true,
+ canAssign: true
});
createStub.restore();