From 3b4980ba2f3ef1a7d1169b569cde7cda376bcaf8 Mon Sep 17 00:00:00 2001 From: Tony Torralba Date: Wed, 15 Mar 2023 14:36:45 +0100 Subject: [PATCH] org.kohsuke.stapler.model tests --- java/ql/lib/ext/org.kohsuke.stapler.model.yml | 2 +- .../CWE-601/semmle/tests/UrlRedirect.expected | 6 + .../CWE-601/semmle/tests/mad/Test.java | 16 ++ .../security/CWE-601/semmle/tests/options | 2 +- .../security/CWE-918/mad/Test.java | 6 + .../test/query-tests/security/CWE-918/options | 3 +- .../org/kohsuke/stapler/ForwardToView.java | 21 ++ .../org/kohsuke/stapler/HttpRedirect.java | 18 ++ .../org/kohsuke/stapler/HttpResponses.java | 43 ++++ .../org/kohsuke/stapler/RequestImpl.java | 227 ++++++++++++++---- .../org/kohsuke/stapler/StaplerRequest.java | 3 +- 11 files changed, 292 insertions(+), 55 deletions(-) create mode 100644 java/ql/test/query-tests/security/CWE-601/semmle/tests/mad/Test.java create mode 100644 java/ql/test/stubs/stapler-1.263/org/kohsuke/stapler/ForwardToView.java create mode 100644 java/ql/test/stubs/stapler-1.263/org/kohsuke/stapler/HttpRedirect.java create mode 100644 java/ql/test/stubs/stapler-1.263/org/kohsuke/stapler/HttpResponses.java diff --git a/java/ql/lib/ext/org.kohsuke.stapler.model.yml b/java/ql/lib/ext/org.kohsuke.stapler.model.yml index 3425699b0ab..5b399f64ccd 100644 --- a/java/ql/lib/ext/org.kohsuke.stapler.model.yml +++ b/java/ql/lib/ext/org.kohsuke.stapler.model.yml @@ -3,5 +3,5 @@ extensions: pack: codeql/java-all extensible: sinkModel data: - - ["org.kohsuke.stapler", "HttpResponses", True, "redirectTo", "(String)", "", "Argument[0]", "open-url", "ai-generated"] + - ["org.kohsuke.stapler", "HttpResponses", True, "redirectTo", "(String)", "", "Argument[0]", "url-redirect", "ai-generated"] - ["org.kohsuke.stapler", "HttpResponses", True, "staticResource", "(URL)", "", "Argument[0]", "open-url", "ai-generated"] diff --git a/java/ql/test/query-tests/security/CWE-601/semmle/tests/UrlRedirect.expected b/java/ql/test/query-tests/security/CWE-601/semmle/tests/UrlRedirect.expected index 6fa4d4a50c6..974005e801b 100644 --- a/java/ql/test/query-tests/security/CWE-601/semmle/tests/UrlRedirect.expected +++ b/java/ql/test/query-tests/security/CWE-601/semmle/tests/UrlRedirect.expected @@ -4,6 +4,8 @@ edges | UrlRedirect.java:36:58:36:89 | getParameter(...) : String | UrlRedirect.java:36:25:36:89 | ... + ... | | UrlRedirect.java:45:28:45:39 | input : String | UrlRedirect.java:46:10:46:14 | input : String | | UrlRedirect.java:46:10:46:14 | input : String | UrlRedirect.java:46:10:46:40 | replaceAll(...) : String | +| mad/Test.java:9:16:9:41 | getParameter(...) : String | mad/Test.java:14:31:14:38 | source(...) : String | +| mad/Test.java:14:31:14:38 | source(...) : String | mad/Test.java:14:22:14:38 | (...)... | nodes | UrlRedirect.java:23:25:23:54 | getParameter(...) | semmle.label | getParameter(...) | | UrlRedirect.java:32:25:32:67 | weakCleanup(...) | semmle.label | weakCleanup(...) | @@ -15,6 +17,9 @@ nodes | UrlRedirect.java:45:28:45:39 | input : String | semmle.label | input : String | | UrlRedirect.java:46:10:46:14 | input : String | semmle.label | input : String | | UrlRedirect.java:46:10:46:40 | replaceAll(...) : String | semmle.label | replaceAll(...) : String | +| mad/Test.java:9:16:9:41 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| mad/Test.java:14:22:14:38 | (...)... | semmle.label | (...)... | +| mad/Test.java:14:31:14:38 | source(...) : String | semmle.label | source(...) : String | subpaths | UrlRedirect.java:32:37:32:66 | getParameter(...) : String | UrlRedirect.java:45:28:45:39 | input : String | UrlRedirect.java:46:10:46:40 | replaceAll(...) : String | UrlRedirect.java:32:25:32:67 | weakCleanup(...) | #select @@ -23,3 +28,4 @@ subpaths | UrlRedirect.java:36:25:36:89 | ... + ... | UrlRedirect.java:36:58:36:89 | getParameter(...) : String | UrlRedirect.java:36:25:36:89 | ... + ... | Untrusted URL redirection depends on a $@. | UrlRedirect.java:36:58:36:89 | getParameter(...) | user-provided value | | UrlRedirect.java:39:34:39:63 | getParameter(...) | UrlRedirect.java:39:34:39:63 | getParameter(...) | UrlRedirect.java:39:34:39:63 | getParameter(...) | Untrusted URL redirection depends on a $@. | UrlRedirect.java:39:34:39:63 | getParameter(...) | user-provided value | | UrlRedirect.java:42:43:42:72 | getParameter(...) | UrlRedirect.java:42:43:42:72 | getParameter(...) | UrlRedirect.java:42:43:42:72 | getParameter(...) | Untrusted URL redirection depends on a $@. | UrlRedirect.java:42:43:42:72 | getParameter(...) | user-provided value | +| mad/Test.java:14:22:14:38 | (...)... | mad/Test.java:9:16:9:41 | getParameter(...) : String | mad/Test.java:14:22:14:38 | (...)... | Untrusted URL redirection depends on a $@. | mad/Test.java:9:16:9:41 | getParameter(...) | user-provided value | diff --git a/java/ql/test/query-tests/security/CWE-601/semmle/tests/mad/Test.java b/java/ql/test/query-tests/security/CWE-601/semmle/tests/mad/Test.java new file mode 100644 index 00000000000..e222c3d9fbe --- /dev/null +++ b/java/ql/test/query-tests/security/CWE-601/semmle/tests/mad/Test.java @@ -0,0 +1,16 @@ +import javax.servlet.http.HttpServletRequest; +import org.kohsuke.stapler.HttpResponses; + +public class Test { + + private static HttpServletRequest request; + + public static Object source() { + return request.getParameter(null); + } + + public void test(HttpResponses r) { + // "org.kohsuke.stapler;HttpResponses;true;redirectTo;(String);;Argument[0];open-url;ai-generated" + r.redirectTo((String) source()); + } +} diff --git a/java/ql/test/query-tests/security/CWE-601/semmle/tests/options b/java/ql/test/query-tests/security/CWE-601/semmle/tests/options index 668a863ac60..637c329a914 100644 --- a/java/ql/test/query-tests/security/CWE-601/semmle/tests/options +++ b/java/ql/test/query-tests/security/CWE-601/semmle/tests/options @@ -1 +1 @@ -//semmle-extractor-options: --javac-args -cp ${testdir}/../../../../../stubs/servlet-api-2.4 +//semmle-extractor-options: --javac-args -cp ${testdir}/../../../../../stubs/servlet-api-2.4:${testdir}/../../../../../stubs/stapler-1.263:${testdir}/../../../../../stubs/javax-servlet-2.5:${testdir}/../../../../../stubs/apache-commons-jelly-1.0.1:${testdir}/../../../../../stubs/apache-commons-fileupload-1.4:${testdir}/../../../../../stubs/saxon-xqj-9.x:${testdir}/../../../../../stubs/apache-commons-beanutils:${testdir}/../../../../../stubs/dom4j-2.1.1:${testdir}/../../../../../stubs/apache-commons-lang:${testdir}/../../../../../stubs/jaxen-1.2.0 diff --git a/java/ql/test/query-tests/security/CWE-918/mad/Test.java b/java/ql/test/query-tests/security/CWE-918/mad/Test.java index 8bfbe9c10f9..64e81430c9c 100644 --- a/java/ql/test/query-tests/security/CWE-918/mad/Test.java +++ b/java/ql/test/query-tests/security/CWE-918/mad/Test.java @@ -8,6 +8,7 @@ import javax.servlet.http.HttpServletRequest; import javafx.scene.web.WebEngine; import org.apache.commons.jelly.JellyContext; import org.codehaus.cargo.container.installer.ZipURLInstaller; +import org.kohsuke.stapler.HttpResponses; public class Test { @@ -68,4 +69,9 @@ public class Test { new ZipURLInstaller((URL) source(), "", ""); // $ SSRF } + public void test(HttpResponses r) { + // "org.kohsuke.stapler;HttpResponses;true;staticResource;(URL);;Argument[0];open-url;ai-generated" + r.staticResource((URL) source()); // $ SSRF + } + } diff --git a/java/ql/test/query-tests/security/CWE-918/options b/java/ql/test/query-tests/security/CWE-918/options index 3b168db6f0d..7a4e3251ca1 100644 --- a/java/ql/test/query-tests/security/CWE-918/options +++ b/java/ql/test/query-tests/security/CWE-918/options @@ -1,2 +1 @@ -//semmle-extractor-options: --javac-args -source 11 -target 11 -cp ${testdir}/../../../stubs/springframework-5.3.8:${testdir}/../../../stubs/javax-ws-rs-api-2.1.1:${testdir}/../../../stubs/javax-ws-rs-api-3.0.0:${testdir}/../../../stubs/apache-http-4.4.13/:${testdir}/../../../stubs/servlet-api-2.4/:${testdir}/../../../stubs/projectreactor-3.4.3/:${testdir}/../../../stubs/postgresql-42.3.3/:${testdir}/../../../stubs/HikariCP-3.4.5/:${testdir}/../../../stubs/spring-jdbc-5.3.8/:${testdir}/../../../stubs/jdbi3-core-3.27.2/:${testdir}/../../../stubs/cargo:${testdir}/../../../stubs/javafx-web:${testdir}/../../../stubs/apache-commons-jelly-1.0.1:${testdir}/../../../stubs/dom4j-2.1.1:${testdir}/../../../stubs/jaxen-1.2.0 - +//semmle-extractor-options: --javac-args -source 11 -target 11 -cp ${testdir}/../../../stubs/springframework-5.3.8:${testdir}/../../../stubs/javax-ws-rs-api-2.1.1:${testdir}/../../../stubs/javax-ws-rs-api-3.0.0:${testdir}/../../../stubs/apache-http-4.4.13/:${testdir}/../../../stubs/projectreactor-3.4.3/:${testdir}/../../../stubs/postgresql-42.3.3/:${testdir}/../../../stubs/HikariCP-3.4.5/:${testdir}/../../../stubs/spring-jdbc-5.3.8/:${testdir}/../../../stubs/jdbi3-core-3.27.2/:${testdir}/../../../stubs/cargo:${testdir}/../../../stubs/javafx-web:${testdir}/../../../stubs/apache-commons-jelly-1.0.1:${testdir}/../../../stubs/dom4j-2.1.1:${testdir}/../../../stubs/jaxen-1.2.0:${testdir}/../../../stubs/stapler-1.263:${testdir}/../../../stubs/javax-servlet-2.5:${testdir}/../../../stubs/apache-commons-fileupload-1.4:${testdir}/../../../stubs/saxon-xqj-9.x:${testdir}/../../../stubs/apache-commons-beanutils:${testdir}/../../../stubs/apache-commons-lang diff --git a/java/ql/test/stubs/stapler-1.263/org/kohsuke/stapler/ForwardToView.java b/java/ql/test/stubs/stapler-1.263/org/kohsuke/stapler/ForwardToView.java new file mode 100644 index 00000000000..6b91e5383e5 --- /dev/null +++ b/java/ql/test/stubs/stapler-1.263/org/kohsuke/stapler/ForwardToView.java @@ -0,0 +1,21 @@ +// Generated automatically from org.kohsuke.stapler.ForwardToView for testing purposes + +package org.kohsuke.stapler; + +import java.util.Map; +import javax.servlet.RequestDispatcher; +import org.kohsuke.stapler.HttpResponse; +import org.kohsuke.stapler.StaplerRequest; +import org.kohsuke.stapler.StaplerResponse; + +public class ForwardToView extends RuntimeException implements HttpResponse +{ + protected ForwardToView() {} + public ForwardToView optional(){ return null; } + public ForwardToView with(Map p0){ return null; } + public ForwardToView with(String p0, Object p1){ return null; } + public ForwardToView(Class p0, String p1){} + public ForwardToView(Object p0, String p1){} + public ForwardToView(RequestDispatcher p0){} + public void generateResponse(StaplerRequest p0, StaplerResponse p1, Object p2){} +} diff --git a/java/ql/test/stubs/stapler-1.263/org/kohsuke/stapler/HttpRedirect.java b/java/ql/test/stubs/stapler-1.263/org/kohsuke/stapler/HttpRedirect.java new file mode 100644 index 00000000000..c1064e79aef --- /dev/null +++ b/java/ql/test/stubs/stapler-1.263/org/kohsuke/stapler/HttpRedirect.java @@ -0,0 +1,18 @@ +// Generated automatically from org.kohsuke.stapler.HttpRedirect for testing purposes + +package org.kohsuke.stapler; + +import org.kohsuke.stapler.HttpResponse; +import org.kohsuke.stapler.StaplerRequest; +import org.kohsuke.stapler.StaplerResponse; + +public class HttpRedirect extends RuntimeException implements HttpResponse +{ + protected HttpRedirect() {} + public HttpRedirect(String p0){} + public HttpRedirect(int p0, String p1){} + public static HttpRedirect DOT = null; + public static HttpResponse CONTEXT_ROOT = null; + public static HttpResponse fromContextPath(String p0){ return null; } + public void generateResponse(StaplerRequest p0, StaplerResponse p1, Object p2){} +} diff --git a/java/ql/test/stubs/stapler-1.263/org/kohsuke/stapler/HttpResponses.java b/java/ql/test/stubs/stapler-1.263/org/kohsuke/stapler/HttpResponses.java new file mode 100644 index 00000000000..81e517514a2 --- /dev/null +++ b/java/ql/test/stubs/stapler-1.263/org/kohsuke/stapler/HttpResponses.java @@ -0,0 +1,43 @@ +// Generated automatically from org.kohsuke.stapler.HttpResponses for testing purposes + +package org.kohsuke.stapler; + +import java.net.URL; +import org.kohsuke.stapler.ForwardToView; +import org.kohsuke.stapler.HttpRedirect; +import org.kohsuke.stapler.HttpResponse; + +public class HttpResponses +{ + abstract static public class HttpResponseException extends RuntimeException implements HttpResponse + { + public HttpResponseException(){} + public HttpResponseException(String p0){} + public HttpResponseException(String p0, Throwable p1){} + public HttpResponseException(Throwable p0){} + } + public HttpResponses(){} + public static ForwardToView forwardToView(Class p0, String p1){ return null; } + public static ForwardToView forwardToView(Object p0, String p1){ return null; } + public static HttpRedirect redirectTo(String p0){ return null; } + public static HttpRedirect redirectTo(int p0, String p1){ return null; } + public static HttpResponse html(String p0){ return null; } + public static HttpResponse literalHtml(String p0){ return null; } + public static HttpResponse plainText(String p0){ return null; } + public static HttpResponse redirectToDot(){ return null; } + public static HttpResponse staticResource(URL p0){ return null; } + public static HttpResponse staticResource(URL p0, long p1){ return null; } + public static HttpResponse text(String p0){ return null; } + public static HttpResponses.HttpResponseException error(Throwable p0){ return null; } + public static HttpResponses.HttpResponseException error(int p0, String p1){ return null; } + public static HttpResponses.HttpResponseException error(int p0, Throwable p1){ return null; } + public static HttpResponses.HttpResponseException errorWithoutStack(int p0, String p1){ return null; } + public static HttpResponses.HttpResponseException forbidden(){ return null; } + public static HttpResponses.HttpResponseException forwardToPreviousPage(){ return null; } + public static HttpResponses.HttpResponseException notFound(){ return null; } + public static HttpResponses.HttpResponseException ok(){ return null; } + public static HttpResponses.HttpResponseException redirectToContextRoot(){ return null; } + public static HttpResponses.HttpResponseException redirectViaContextPath(String p0){ return null; } + public static HttpResponses.HttpResponseException redirectViaContextPath(int p0, String p1){ return null; } + public static HttpResponses.HttpResponseException status(int p0){ return null; } +} diff --git a/java/ql/test/stubs/stapler-1.263/org/kohsuke/stapler/RequestImpl.java b/java/ql/test/stubs/stapler-1.263/org/kohsuke/stapler/RequestImpl.java index 35e8777e8bc..acfd4bc15ae 100644 --- a/java/ql/test/stubs/stapler-1.263/org/kohsuke/stapler/RequestImpl.java +++ b/java/ql/test/stubs/stapler-1.263/org/kohsuke/stapler/RequestImpl.java @@ -4,7 +4,6 @@ package org.kohsuke.stapler; import java.lang.reflect.Type; import java.util.Calendar; -import java.util.Date; import java.util.Enumeration; import java.util.List; import java.util.Map; @@ -25,56 +24,186 @@ import org.kohsuke.stapler.WebApp; import org.kohsuke.stapler.bind.BoundObjectTable; import org.kohsuke.stapler.lang.Klass; -public class RequestImpl extends HttpServletRequestWrapper implements StaplerRequest -{ +public class RequestImpl extends HttpServletRequestWrapper implements StaplerRequest { protected RequestImpl() {} - public T bindJSON(java.lang.Class p0, JSONObject p1){ return null; } - public T bindParameters(java.lang.Class p0, String p1){ return null; } - public T bindParameters(java.lang.Class p0, String p1, int p2){ return null; } - public T findAncestorObject(java.lang.Class p0){ return null; } - public java.util.List bindJSONToList(java.lang.Class p0, Object p1){ return null; } - public java.util.List bindParametersToList(java.lang.Class p0, String p1){ return null; } - public Ancestor findAncestor(Class p0){ return null; } - public Ancestor findAncestor(Object p0){ return null; } - public BindInterceptor getBindInterceptor(){ return null; } - public BindInterceptor setBindInterceptor(BindInterceptor p0){ return null; } - public BindInterceptor setBindInterceptpr(BindInterceptor p0){ return null; } - public BindInterceptor setBindListener(BindInterceptor p0){ return null; } - public BoundObjectTable getBoundObjectTable(){ return null; } - public Enumeration getParameterNames(){ return null; } - public FileItem getFileItem(String p0){ return null; } - public JSONObject getSubmittedForm(){ return null; } - public List getAncestors(){ return null; } - public Map getParameterMap(){ return null; } - public Object bindJSON(Type p0, Class p1, Object p2){ return null; } - public RequestDispatcher getView(Class p0, String p1){ return null; } - public RequestDispatcher getView(Klass p0, Object p1, String p2){ return null; } - public RequestDispatcher getView(Klass p0, String p1){ return null; } - public RequestDispatcher getView(Object p0, String p1){ return null; } - public RequestImpl(Stapler p0, HttpServletRequest p1, List p2, TokenList p3){} - public ServletContext getServletContext(){ return null; } - public Stapler getStapler(){ return null; } - public String createJavaScriptProxy(Object p0){ return null; } - public String getOriginalRequestURI(){ return null; } - public String getOriginalRestOfPath(){ return null; } - public String getParameter(String p0){ return null; } - public String getReferer(){ return null; } - public String getRequestURIWithQueryString(){ return null; } - public String getRestOfPath(){ return null; } - public String getRootPath(){ return null; } - public StringBuffer getRequestURLWithQueryString(){ return null; } - public String[] getParameterValues(String p0){ return null; } - public WebApp getWebApp(){ return null; } - public boolean checkIfModified(Calendar p0, StaplerResponse p1){ return false; } - public boolean checkIfModified(Date p0, StaplerResponse p1){ return false; } - public boolean checkIfModified(long p0, StaplerResponse p1){ return false; } - public boolean checkIfModified(long p0, StaplerResponse p1, long p2){ return false; } - public boolean hasParameter(String p0){ return false; } - public boolean isJavaScriptProxyCall(){ return false; } + + public T bindJSON(java.lang.Class p0, JSONObject p1) { + return null; + } + + public T bindParameters(java.lang.Class p0, String p1) { + return null; + } + + public T bindParameters(java.lang.Class p0, String p1, int p2) { + return null; + } + + public T findAncestorObject(java.lang.Class p0) { + return null; + } + + public java.util.List bindJSONToList(java.lang.Class p0, Object p1) { + return null; + } + + public java.util.List bindParametersToList(java.lang.Class p0, String p1) { + return null; + } + + public Ancestor findAncestor(Class p0) { + return null; + } + + public Ancestor findAncestor(Object p0) { + return null; + } + + public BindInterceptor getBindInterceptor() { + return null; + } + + public BindInterceptor setBindInterceptor(BindInterceptor p0) { + return null; + } + + public BindInterceptor setBindInterceptpr(BindInterceptor p0) { + return null; + } + + public BindInterceptor setBindListener(BindInterceptor p0) { + return null; + } + + public BoundObjectTable getBoundObjectTable() { + return null; + } + + public Enumeration getParameterNames() { + return null; + } + + public FileItem getFileItem(String p0) { + return null; + } + + public JSONObject getSubmittedForm() { + return null; + } + + public List getAncestors() { + return null; + } + + public Map getParameterMap() { + return null; + } + + public Object bindJSON(Type p0, Class p1, Object p2) { + return null; + } + + public RequestDispatcher getView(Class p0, String p1) { + return null; + } + + public RequestDispatcher getView(Klass p0, Object p1, String p2) { + return null; + } + + public RequestDispatcher getView(Klass p0, String p1) { + return null; + } + + public RequestDispatcher getView(Object p0, String p1) { + return null; + } + + public RequestImpl(Stapler p0, HttpServletRequest p1, List p2, TokenList p3) {} + + public ServletContext getServletContext() { + return null; + } + + public Stapler getStapler() { + return null; + } + + public String createJavaScriptProxy(Object p0) { + return null; + } + + public String getOriginalRequestURI() { + return null; + } + + public String getOriginalRestOfPath() { + return null; + } + + public String getParameter(String p0) { + return p0; + } + + public String getReferer() { + return null; + } + + public String getRequestURIWithQueryString() { + return null; + } + + public String getRestOfPath() { + return null; + } + + public String getRootPath() { + return null; + } + + public StringBuffer getRequestURLWithQueryString() { + return null; + } + + public String[] getParameterValues(String p0) { + return null; + } + + public WebApp getWebApp() { + return null; + } + + public boolean checkIfModified(Calendar p0, StaplerResponse p1) { + return false; + } + + public boolean checkIfModified(java.util.Date p0, StaplerResponse p1) { + return false; + } + + public boolean checkIfModified(long p0, StaplerResponse p1) { + return false; + } + + public boolean checkIfModified(long p0, StaplerResponse p1, long p2) { + return false; + } + + public boolean hasParameter(String p0) { + return false; + } + + public boolean isJavaScriptProxyCall() { + return false; + } + public final List ancestors = null; public final Stapler stapler = null; public final TokenList tokens = null; - public void bindJSON(Object p0, JSONObject p1){} - public void bindParameters(Object p0){} - public void bindParameters(Object p0, String p1){} + + public void bindJSON(Object p0, JSONObject p1) {} + + public void bindParameters(Object p0) {} + + public void bindParameters(Object p0, String p1) {} } diff --git a/java/ql/test/stubs/stapler-1.263/org/kohsuke/stapler/StaplerRequest.java b/java/ql/test/stubs/stapler-1.263/org/kohsuke/stapler/StaplerRequest.java index 10942452230..aebc9f6f43f 100644 --- a/java/ql/test/stubs/stapler-1.263/org/kohsuke/stapler/StaplerRequest.java +++ b/java/ql/test/stubs/stapler-1.263/org/kohsuke/stapler/StaplerRequest.java @@ -4,7 +4,6 @@ package org.kohsuke.stapler; import java.lang.reflect.Type; import java.util.Calendar; -import java.util.Date; import java.util.List; import javax.servlet.RequestDispatcher; import javax.servlet.ServletContext; @@ -53,7 +52,7 @@ public interface StaplerRequest extends HttpServletRequest StringBuffer getRequestURLWithQueryString(); WebApp getWebApp(); boolean checkIfModified(Calendar p0, StaplerResponse p1); - boolean checkIfModified(Date p0, StaplerResponse p1); + boolean checkIfModified(java.util.Date p0, StaplerResponse p1); boolean checkIfModified(long p0, StaplerResponse p1); boolean checkIfModified(long p0, StaplerResponse p1, long p2); boolean hasParameter(String p0);