Skip to content
Snippets Groups Projects
Commit f07073f1 authored by Michael Hamann's avatar Michael Hamann
Browse files

XWIKI-22470: Add a required rights analyzer for XWiki.Notifications.Code.NotificationDisplayerClass

* Simplify the code by using ObjectPropertyRequiredRightAnalyzer.
* Add missing since-versions.
parent 3d96bf3c
No related branches found
No related tags found
No related merge requests found
......@@ -19,7 +19,6 @@
*/
package org.xwiki.notifications.notifiers.internal;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
......@@ -30,8 +29,8 @@
import org.xwiki.platform.security.requiredrights.RequiredRight;
import org.xwiki.platform.security.requiredrights.RequiredRightAnalysisResult;
import org.xwiki.platform.security.requiredrights.RequiredRightAnalyzer;
import org.xwiki.platform.security.requiredrights.display.BlockSupplierProvider;
import org.xwiki.velocity.internal.util.VelocityDetector;
import org.xwiki.platform.security.requiredrights.RequiredRightsException;
import org.xwiki.platform.security.requiredrights.internal.analyzer.ObjectPropertyRequiredRightAnalyzer;
import com.xpn.xwiki.objects.BaseObject;
......@@ -39,6 +38,9 @@
* {@link RequiredRightAnalyzer} for wiki notification displayers.
*
* @version $Id$
* @since 15.10.16
* @since 16.4.7
* @since 16.10.2
*/
@Component
@Named(WikiNotificationDisplayerDocumentInitializer.XCLASS_NAME)
......@@ -46,38 +48,12 @@
public class WikiNotificationDisplayerRequiredRightAnalyzer implements RequiredRightAnalyzer<BaseObject>
{
@Inject
@Named("translation")
private BlockSupplierProvider<String> translationMessageSupplierProvider;
@Inject
private BlockSupplierProvider<BaseObject> baseObjectBlockSupplierProvider;
@Inject
private VelocityDetector velocityDetector;
private ObjectPropertyRequiredRightAnalyzer objectPropertyRequiredRightAnalyzer;
@Override
public List<RequiredRightAnalysisResult> analyze(BaseObject object)
public List<RequiredRightAnalysisResult> analyze(BaseObject object) throws RequiredRightsException
{
List<RequiredRightAnalysisResult> result = new ArrayList<>();
if (object != null) {
String template =
object.getStringValue(WikiNotificationDisplayerDocumentInitializer.NOTIFICATION_TEMPLATE);
if (this.velocityDetector.containsVelocityScript(template)) {
result.add(new RequiredRightAnalysisResult(object.getReference(),
this.translationMessageSupplierProvider.get(
"notifications.notifiers.wikiNotificationDisplayerRequiredRightWithScript"),
this.baseObjectBlockSupplierProvider.get(object),
List.of(RequiredRight.WIKI_ADMIN, RequiredRight.MAYBE_PROGRAM)));
} else {
result.add(new RequiredRightAnalysisResult(object.getReference(),
this.translationMessageSupplierProvider.get(
"notifications.notifiers.wikiNotificationDisplayerRequiredRight"),
this.baseObjectBlockSupplierProvider.get(object),
List.of(RequiredRight.WIKI_ADMIN)));
}
}
return result;
return this.objectPropertyRequiredRightAnalyzer.analyzeAllPropertiesAndAddObjectResult(object,
RequiredRight.WIKI_ADMIN, "notifications.notifiers.wikiNotificationDisplayerRequiredRights");
}
}
......@@ -43,9 +43,7 @@
###############################################################################
notification.error.failedRender=Error while rendering notification
notifications.notifiers.wikiNotificationDisplayerRequiredRight=Wiki notification displayer objects require wiki \
notifications.notifiers.wikiNotificationDisplayerRequiredRights=Wiki notification displayer objects require wiki \
administration rights.
notifications.notifiers.wikiNotificationDisplayerRequiredRightWithScript=Wiki notification displayer objects require \
wiki administration rights, the Velocity code in the template script might additionally require programming right.
notifications.notifiers.emailNotificationRendererRequiredRights=Email notification renderer objects require wiki \
administration rights.
\ No newline at end of file
......@@ -19,32 +19,17 @@
*/
package org.xwiki.notifications.notifiers.internal;
import java.util.List;
import java.util.function.Supplier;
import javax.inject.Named;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import org.xwiki.platform.security.requiredrights.RequiredRight;
import org.xwiki.platform.security.requiredrights.RequiredRightAnalysisResult;
import org.xwiki.platform.security.requiredrights.display.BlockSupplierProvider;
import org.xwiki.rendering.block.Block;
import org.xwiki.rendering.block.WordBlock;
import org.xwiki.platform.security.requiredrights.internal.analyzer.ObjectPropertyRequiredRightAnalyzer;
import org.xwiki.test.junit5.mockito.ComponentTest;
import org.xwiki.test.junit5.mockito.InjectMockComponents;
import org.xwiki.test.junit5.mockito.MockComponent;
import org.xwiki.velocity.internal.util.VelocityDetector;
import com.xpn.xwiki.objects.BaseObject;
import com.xpn.xwiki.objects.BaseObjectReference;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.verify;
/**
* Component test for {@link WikiNotificationDisplayerRequiredRightAnalyzer}.
......@@ -54,80 +39,18 @@
@ComponentTest
class WikiNotificationDisplayerRequiredRightAnalyzerTest
{
protected static final String PRETTY_NAME = "Pretty Name";
protected static final BaseObjectReference OBJECT_REFERENCE = mock();
@InjectMockComponents
private WikiNotificationDisplayerRequiredRightAnalyzer analyzer;
@MockComponent
@Named("translation")
private BlockSupplierProvider<String> translationMessageSupplierProvider;
@MockComponent
private BlockSupplierProvider<BaseObject> baseObjectBlockSupplierProvider;
@MockComponent
private VelocityDetector velocityDetector;
@Mock
private BaseObject baseObject;
@BeforeEach
void setup()
{
when(this.translationMessageSupplierProvider.get(anyString())).then(invocation -> {
String message = invocation.getArgument(0);
return (Supplier<Block>) () -> new WordBlock(message);
});
when(this.baseObjectBlockSupplierProvider.get(this.baseObject)).then(invocation -> {
BaseObject object = invocation.getArgument(0);
return (Supplier<Block>) () -> new WordBlock(object.getPrettyName());
});
when(this.baseObject.getReference()).thenReturn(OBJECT_REFERENCE);
when(this.baseObject.getPrettyName()).thenReturn(PRETTY_NAME);
}
private ObjectPropertyRequiredRightAnalyzer objectPropertyRequiredRightAnalyzer;
@Test
void analyzeWithoutScript()
void analyze() throws Exception
{
List<RequiredRightAnalysisResult> results = this.analyzer.analyze(this.baseObject);
assertEquals(1, results.size());
RequiredRightAnalysisResult result = results.get(0);
assertEquals(OBJECT_REFERENCE, result.getEntityReference());
assertEquals(new WordBlock("notifications.notifiers.wikiNotificationDisplayerRequiredRight"),
result.getSummaryMessage());
assertEquals(new WordBlock(PRETTY_NAME), result.getDetailedMessage());
assertEquals(List.of(RequiredRight.WIKI_ADMIN), result.getRequiredRights());
}
@Test
void analyzeWithScript()
{
String template = "template";
when(this.baseObject.getStringValue(WikiNotificationDisplayerDocumentInitializer.NOTIFICATION_TEMPLATE))
.thenReturn(template);
when(this.velocityDetector.containsVelocityScript(template)).thenReturn(true);
List<RequiredRightAnalysisResult> results = this.analyzer.analyze(this.baseObject);
assertEquals(1, results.size());
RequiredRightAnalysisResult result = results.get(0);
assertEquals(OBJECT_REFERENCE, result.getEntityReference());
assertEquals(new WordBlock("notifications.notifiers.wikiNotificationDisplayerRequiredRightWithScript"),
result.getSummaryMessage());
assertEquals(new WordBlock(PRETTY_NAME), result.getDetailedMessage());
assertEquals(List.of(RequiredRight.WIKI_ADMIN, RequiredRight.MAYBE_PROGRAM), result.getRequiredRights());
}
@Test
void analyzeWithNullBaseObject()
{
List<RequiredRightAnalysisResult> results = this.analyzer.analyze(null);
assertTrue(results.isEmpty());
BaseObject object = mock();
this.analyzer.analyze(object);
verify(this.objectPropertyRequiredRightAnalyzer).analyzeAllPropertiesAndAddObjectResult(object,
RequiredRight.WIKI_ADMIN, "notifications.notifiers.wikiNotificationDisplayerRequiredRights");
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment