diff --git a/agama/engine/src/main/java/io/jans/agama/engine/service/FlowService.java b/agama/engine/src/main/java/io/jans/agama/engine/service/FlowService.java index 507e0b9c24f..ee8d2de02ae 100644 --- a/agama/engine/src/main/java/io/jans/agama/engine/service/FlowService.java +++ b/agama/engine/src/main/java/io/jans/agama/engine/service/FlowService.java @@ -372,7 +372,7 @@ private void makeCrashException(Exception e) throws FlowCrashException { * @return * @throws JsonProcessingException */ - public FlowResult flowResultFrom(NativeObject result) throws JsonProcessingException { + private FlowResult flowResultFrom(NativeObject result) throws JsonProcessingException { return mapper.convertValue(result, FlowResult.class); } diff --git a/agama/engine/src/main/java/io/jans/agama/engine/servlet/ExecutionServlet.java b/agama/engine/src/main/java/io/jans/agama/engine/servlet/ExecutionServlet.java index d1a954e20a1..bbc51089e9f 100644 --- a/agama/engine/src/main/java/io/jans/agama/engine/servlet/ExecutionServlet.java +++ b/agama/engine/src/main/java/io/jans/agama/engine/servlet/ExecutionServlet.java @@ -40,8 +40,6 @@ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { FlowStatus fstatus = flowService.getRunningFlowStatus(); - String path = request.getServletPath(); - if (fstatus == null || fstatus.getStartedAt() == FlowStatus.FINISHED) { sendPageMismatch(response, NO_ACTIVE_FLOW, null); return; @@ -67,8 +65,9 @@ public void doGet(HttpServletRequest request, HttpServletResponse response) } } else { + String path = request.getServletPath(); if (processCallback(response, fstatus, path)) return; - + String expectedUrl = getExpectedUrl(fstatus); if (path.equals(expectedUrl)) { @@ -89,13 +88,12 @@ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { FlowStatus fstatus = flowService.getRunningFlowStatus(); - String path = request.getServletPath(); - if (fstatus == null || fstatus.getStartedAt() == FlowStatus.FINISHED) { sendPageMismatch(response, NO_ACTIVE_FLOW, null); return; } + String path = request.getServletPath(); if (processCallback(response, fstatus, path)) return; String expectedUrl = getExpectedUrl(fstatus); diff --git a/agama/transpiler/src/main/java/io/jans/agama/dsl/Transpiler.java b/agama/transpiler/src/main/java/io/jans/agama/dsl/Transpiler.java index 38ac814fa02..0ec40140e82 100644 --- a/agama/transpiler/src/main/java/io/jans/agama/dsl/Transpiler.java +++ b/agama/transpiler/src/main/java/io/jans/agama/dsl/Transpiler.java @@ -112,9 +112,7 @@ private void loadFreeMarkerTemplate() throws TranspilerException { Configuration fmConfig = new Configuration(Configuration.VERSION_2_3_31); fmConfig.setClassLoaderForTemplateLoading(CLS_LOADER, "/"); fmConfig.setDefaultEncoding(UTF_8.toString()); - //TODO: ? - //fmConfig.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); - fmConfig.setTemplateExceptionHandler(TemplateExceptionHandler.DEBUG_HANDLER); + fmConfig.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); fmConfig.setLogTemplateExceptions(false); fmConfig.setWrapUncheckedExceptions(true); fmConfig.setFallbackOnNullLoopVariable(false); @@ -179,7 +177,7 @@ public XdmNode asXML(String DSLCode) throws SyntaxException, TranspilerException public List getInputs(XdmNode node) throws SaxonApiException { - return xpathCompiler.evaluate("/flow/header/inputs/short_var/text()", node) + return xpathCompiler.evaluate(Visitor.INPUTS_XPATH_EXPR, node) .stream().map(XdmItem::getStringValue).collect(Collectors.toList()); } @@ -187,7 +185,7 @@ public List getInputs(XdmNode node) throws SaxonApiException { public Integer getTimeout(XdmNode node) throws SaxonApiException { return Optional.ofNullable( - xpathCompiler.evaluateSingle("/flow/header/timeout/UINT/text()", node)) + xpathCompiler.evaluateSingle(Visitor.TIMEOUT_XPATH_EXPR, node)) .map(XdmItem::getStringValue).map(Integer::valueOf).orElse(null); } @@ -212,19 +210,19 @@ private void applyValidations(SaplingDocument doc) throws TranspilerException { XdmNode node = doc.toXdmNode(processor); //Ensure only existing flows are referenced - checkUnknownInvocation(Visitor.FLOWCALL_XPATH_EXPR, flowNames, node); - + checkUnknownInvocation(flowNames, node); + checkInputsUniqueness(node); } catch (SaxonApiException se) { throw new TranspilerException("Validation failed", se); } - + } - private void checkUnknownInvocation(String xpathExpr, Set known, XdmNode node) + private void checkUnknownInvocation(Set known, XdmNode node) throws TranspilerException, SaxonApiException { if (known != null) { - List invocations = xpathCompiler.evaluate(xpathExpr, node) + List invocations = xpathCompiler.evaluate(Visitor.FLOWCALL_XPATH_EXPR, node) .stream().map(XdmItem::getStringValue).collect(Collectors.toList()); for (String t : invocations) { @@ -237,7 +235,24 @@ private void checkUnknownInvocation(String xpathExpr, Set known, XdmNode } } - + + private void checkInputsUniqueness(XdmNode node) throws TranspilerException, SaxonApiException { + + List inputs = getInputs(node); + Set inputsSet = inputs.stream().collect(Collectors.toSet()); + String configVar = Optional.ofNullable( + xpathCompiler.evaluateSingle(Visitor.CONFIG_XPATH_EXPR, node)) + .map(XdmItem::getStringValue).orElse(null); + + if (inputsSet.size() < inputs.size()) + throw new TranspilerException("One or more input variable names are duplicated"); + + if (configVar != null && inputsSet.contains(configVar)) + throw new TranspilerException("Configuration variable '" + configVar + + "' cannot be used as an input variable"); + + } + private void logXml(XdmNode node) { logger.debug("\n{}", node.toString()); //System.out.println("\n" + node.toString()); diff --git a/agama/transpiler/src/main/java/io/jans/agama/dsl/Visitor.java b/agama/transpiler/src/main/java/io/jans/agama/dsl/Visitor.java index e48de888a40..cbf0143e100 100644 --- a/agama/transpiler/src/main/java/io/jans/agama/dsl/Visitor.java +++ b/agama/transpiler/src/main/java/io/jans/agama/dsl/Visitor.java @@ -1,5 +1,7 @@ package io.jans.agama.dsl; +import io.jans.agama.antlr.AuthnFlowParser; + import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; @@ -15,14 +17,15 @@ import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.tree.ParseTree; import org.antlr.v4.runtime.tree.TerminalNode; -import io.jans.agama.antlr.AuthnFlowParser; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Visitor { - //public static final String FLOWNAME_XPATH_EXPR = "/flow/header/qname/text()"; public static final String FLOWCALL_XPATH_EXPR = "//flow_call/call/call_subject/qname/text()"; + public static final String INPUTS_XPATH_EXPR = "/flow/header/inputs/short_var/text()"; + public static final String CONFIG_XPATH_EXPR = "/flow/header/configs/short_var/text()"; + public static final String TIMEOUT_XPATH_EXPR = "/flow/header/timeout/UINT/text()"; private static final Logger logger = LoggerFactory.getLogger(Visitor.class); private static final Set INCLUDE_SYMBOLS; diff --git a/jans-linux-setup/jans_setup/schema/jans_schema.json b/jans-linux-setup/jans_setup/schema/jans_schema.json index 23a284c5d47..259be277536 100644 --- a/jans-linux-setup/jans_setup/schema/jans_schema.json +++ b/jans-linux-setup/jans_setup/schema/jans_schema.json @@ -4232,24 +4232,6 @@ "top" ], "x_origin": "Jans created objectclass" - }, - { - "kind": "STRUCTURAL", - "may": [ - "ou", - "jansScr" - ], - "must": [ - "objectclass" - ], - "names": [ - "agmBasics" - ], - "oid": "jansObjClass", - "sup": [ - "top" - ], - "x_origin": "Jans created objectclass" } ], "oidMacros": {