diff --git a/src/main/java/com/cflint/plugins/core/AbortChecker.java b/src/main/java/com/cflint/plugins/core/AbortChecker.java new file mode 100644 index 000000000..f5360ec90 --- /dev/null +++ b/src/main/java/com/cflint/plugins/core/AbortChecker.java @@ -0,0 +1,29 @@ +package com.cflint.plugins.core; + +import ro.fortsoft.pf4j.Extension; +import cfml.parsing.cfscript.CFFunctionExpression; +import cfml.parsing.cfscript.script.CFAbortStatement; +import cfml.parsing.cfscript.script.CFExpressionStatement; +import cfml.parsing.cfscript.script.CFScriptStatement; + +import com.cflint.BugInfo; +import com.cflint.BugList; +import com.cflint.plugins.CFLintScannerAdapter; +import com.cflint.plugins.Context; + +@Extension +public class AbortChecker extends CFLintScannerAdapter { + final String severity = "WARNING"; + + public void expression(final CFScriptStatement expression, final Context context, final BugList bugs) { + System.out.println(expression.getClass().getName()); + + if (expression instanceof CFAbortStatement) { + int lineNo = ((CFAbortStatement) expression).getLine(); + bugs.add(new BugInfo.BugInfoBuilder().setLine(lineNo).setMessageCode("AVOID_USING_ABORT") + .setSeverity(severity).setFilename(context.getFilename()) + .setMessage("Abort statement at " + lineNo + ". Avoid using abort in production code.") + .build()); + } + } +} \ No newline at end of file diff --git a/src/main/resources/cflint.definition.xml b/src/main/resources/cflint.definition.xml index f522dde99..f12e7ddc2 100644 --- a/src/main/resources/cflint.definition.xml +++ b/src/main/resources/cflint.definition.xml @@ -87,6 +87,11 @@ + + + INFO + + Avoid using <${tagName}> tags. Use cfquery and cfstoredproc instead. diff --git a/src/test/java/com/cflint/TestAbortChecker.java b/src/test/java/com/cflint/TestAbortChecker.java new file mode 100644 index 000000000..f3136d5d6 --- /dev/null +++ b/src/test/java/com/cflint/TestAbortChecker.java @@ -0,0 +1,56 @@ +package com.cflint; + +import static org.junit.Assert.assertEquals; + +import java.io.IOException; +import java.util.List; + +import org.junit.Before; +import org.junit.Test; + +import cfml.parsing.reporting.ParseException; + +import com.cflint.config.CFLintPluginInfo.PluginInfoRule; +import com.cflint.config.CFLintPluginInfo.PluginInfoRule.PluginMessage; +import com.cflint.config.ConfigRuntime; +import com.cflint.plugins.core.AbortChecker; + +public class TestAbortChecker { + + private CFLint cfBugs; + + @Before + public void setUp() { + final ConfigRuntime conf = new ConfigRuntime(); + final PluginInfoRule pluginRule = new PluginInfoRule(); + pluginRule.setName("AbortChecker"); + pluginRule.addParameter("tagName", "cfabort"); + conf.getRules().add(pluginRule); + final PluginMessage pluginMessage = new PluginMessage("AVOID_USING_ABORT"); + pluginMessage.setSeverity("WARNING"); + pluginRule.getMessages().add(pluginMessage); + cfBugs = new CFLint(conf, new AbortChecker()); + } + + @Test + public void test_no_abort() throws ParseException, IOException { + final String cfcSrc = "\r\n" + + "a = 23;\r\n" + + ""; + cfBugs.process(cfcSrc, "test"); + assertEquals(0, cfBugs.getBugs().getBugList().size()); + } + + @Test + public void test_abort() throws ParseException, IOException { + final String cfcSrc = "\r\n" + + "abort;\r\n" + + ""; + cfBugs.process(cfcSrc, "test"); + final List result = cfBugs.getBugs().getBugList().values().iterator().next(); + assertEquals(1, result.size()); + assertEquals("AVOID_USING_ABORT", result.get(0).getMessageCode()); + assertEquals(2, result.get(0).getLine()); + } + +}